Commit 795b49059c4d4dfa5a941d86e87e48de31907a25

Authored by 廖磊
2 parents d63cf921 40d6caca

Merge branch 'minhang' of 192.168.168.201:panzhaov5/bsth_control into

minhang
Showing 103 changed files with 9925 additions and 615 deletions
@@ -220,11 +220,11 @@ @@ -220,11 +220,11 @@
220 <version>1.1</version> 220 <version>1.1</version>
221 </dependency> 221 </dependency>
222 222
223 - <dependency> 223 +<!-- <dependency>
224 <groupId>org.springframework.boot</groupId> 224 <groupId>org.springframework.boot</groupId>
225 <artifactId>spring-boot-devtools</artifactId> 225 <artifactId>spring-boot-devtools</artifactId>
226 <optional>true</optional> 226 <optional>true</optional>
227 - </dependency> 227 + </dependency>-->
228 </dependencies> 228 </dependencies>
229 229
230 <dependencyManagement> 230 <dependencyManagement>
src/main/java/com/bsth/common/Constants.java
@@ -24,8 +24,9 @@ public class Constants { @@ -24,8 +24,9 @@ public class Constants {
24 /** 24 /**
25 * 线调部分子页面不做拦截,便于浏览器缓存 25 * 线调部分子页面不做拦截,便于浏览器缓存
26 */ 26 */
27 - public static final String XD_CHILD_PAGES = "/real_control_v2/**";  
28 - public static final String XD_TEMPS = "/pages/control/line/temps/**"; 27 + public static final String XD_CHILD_PAGES = "/real_control_v2/**";
  28 + public static final String XD_REAL_GPS = "/gps/real/line";
  29 + //public static final String XD_TEMPS = "/pages/control/line/temps/**";
29 30
30 //车载网关上行接口 31 //车载网关上行接口
31 public static final String UPSTREAM_URL = "/control/upstream"; 32 public static final String UPSTREAM_URL = "/control/upstream";
src/main/java/com/bsth/controller/BaseController.java
@@ -9,6 +9,7 @@ import org.springframework.data.domain.Page; @@ -9,6 +9,7 @@ import org.springframework.data.domain.Page;
9 import org.springframework.data.domain.PageRequest; 9 import org.springframework.data.domain.PageRequest;
10 import org.springframework.data.domain.Sort; 10 import org.springframework.data.domain.Sort;
11 import org.springframework.data.domain.Sort.Direction; 11 import org.springframework.data.domain.Sort.Direction;
  12 +import org.springframework.util.CollectionUtils;
12 import org.springframework.web.bind.annotation.PathVariable; 13 import org.springframework.web.bind.annotation.PathVariable;
13 import org.springframework.web.bind.annotation.RequestMapping; 14 import org.springframework.web.bind.annotation.RequestMapping;
14 import org.springframework.web.bind.annotation.RequestMethod; 15 import org.springframework.web.bind.annotation.RequestMethod;
@@ -167,11 +168,24 @@ public class BaseController&lt;T, ID extends Serializable&gt; { @@ -167,11 +168,24 @@ public class BaseController&lt;T, ID extends Serializable&gt; {
167 */ 168 */
168 @RequestMapping(value = "/dataExport", method = RequestMethod.GET) 169 @RequestMapping(value = "/dataExport", method = RequestMethod.GET)
169 public void dataExport(HttpServletResponse response) throws Exception { 170 public void dataExport(HttpServletResponse response) throws Exception {
  171 + dataExport(response, null);
  172 + }
  173 +
  174 + @RequestMapping(value = "/dataExportExt", method = RequestMethod.GET)
  175 + public void dataExport(HttpServletResponse response, @RequestParam Map<String, Object> param) throws Exception {
170 // 1、使用ktr转换获取输出文件 176 // 1、使用ktr转换获取输出文件
171 File ktrfile = new File(this.getClass().getResource(getDataExportKtrClasspath()).toURI()); 177 File ktrfile = new File(this.getClass().getResource(getDataExportKtrClasspath()).toURI());
172 - File outputfile = dataImportExportService.fileDataOutput(  
173 - getDataExportFilename(),  
174 - ktrfile); 178 + File outputfile = null;
  179 + if (!CollectionUtils.isEmpty(param)) {
  180 + outputfile = dataImportExportService.fileDataOutput(
  181 + getDataExportFilename(),
  182 + ktrfile,
  183 + param);
  184 + } else {
  185 + outputfile = dataImportExportService.fileDataOutput(
  186 + getDataExportFilename(),
  187 + ktrfile);
  188 + }
175 189
176 System.out.println(outputfile.getName()); 190 System.out.println(outputfile.getName());
177 String filePath = outputfile.getAbsolutePath(); 191 String filePath = outputfile.getAbsolutePath();
src/main/java/com/bsth/controller/schedule/TTInfoDetailController.java
@@ -14,6 +14,7 @@ import com.bsth.service.StationRouteService; @@ -14,6 +14,7 @@ import com.bsth.service.StationRouteService;
14 import com.bsth.service.schedule.GuideboardInfoService; 14 import com.bsth.service.schedule.GuideboardInfoService;
15 import com.bsth.service.schedule.TTInfoDetailService; 15 import com.bsth.service.schedule.TTInfoDetailService;
16 import com.bsth.service.schedule.utils.DataImportExportService; 16 import com.bsth.service.schedule.utils.DataImportExportService;
  17 +import com.bsth.service.schedule.utils.DataToolsProperties;
17 import jxl.Cell; 18 import jxl.Cell;
18 import jxl.Sheet; 19 import jxl.Sheet;
19 import jxl.Workbook; 20 import jxl.Workbook;
@@ -26,6 +27,7 @@ import org.springframework.util.CollectionUtils; @@ -26,6 +27,7 @@ import org.springframework.util.CollectionUtils;
26 import org.springframework.web.bind.annotation.*; 27 import org.springframework.web.bind.annotation.*;
27 import org.springframework.web.multipart.MultipartFile; 28 import org.springframework.web.multipart.MultipartFile;
28 29
  30 +import javax.servlet.http.HttpServletResponse;
29 import java.io.File; 31 import java.io.File;
30 import java.util.*; 32 import java.util.*;
31 import java.util.regex.Matcher; 33 import java.util.regex.Matcher;
@@ -51,6 +53,8 @@ public class TTInfoDetailController extends BaseController&lt;TTInfoDetail, Long&gt; { @@ -51,6 +53,8 @@ public class TTInfoDetailController extends BaseController&lt;TTInfoDetail, Long&gt; {
51 private StationRouteService stationRouteService; 53 private StationRouteService stationRouteService;
52 @Autowired 54 @Autowired
53 private GuideboardInfoService guideboardInfoService; 55 private GuideboardInfoService guideboardInfoService;
  56 + @Autowired
  57 + private DataToolsProperties dataToolsProperties;
54 58
55 59
56 public static class ExcelFileOutput { 60 public static class ExcelFileOutput {
@@ -126,11 +130,15 @@ public class TTInfoDetailController extends BaseController&lt;TTInfoDetail, Long&gt; { @@ -126,11 +130,15 @@ public class TTInfoDetailController extends BaseController&lt;TTInfoDetail, Long&gt; {
126 Cell[] cells = sheet.getRow(0); // 获取第一行数据列 130 Cell[] cells = sheet.getRow(0); // 获取第一行数据列
127 for (int i = 0; i < cells.length; i++) { 131 for (int i = 0; i < cells.length; i++) {
128 String cell_con = cells[i].getContents(); 132 String cell_con = cells[i].getContents();
  133 +
129 if (StringUtils.isEmpty(cell_con)) { 134 if (StringUtils.isEmpty(cell_con)) {
130 rtn.put("status", ResponseCode.ERROR); 135 rtn.put("status", ResponseCode.ERROR);
131 rtn.put("msg", String.format("第1行,第%d列数据不能为空", i + 1)); 136 rtn.put("msg", String.format("第1行,第%d列数据不能为空", i + 1));
132 return rtn; 137 return rtn;
133 } else { 138 } else {
  139 + // 正则表达式去除数字
  140 + cell_con = cell_con.replaceAll("[\\d+]", "");
  141 +
134 if (i == 0) { // 第一列必须是路牌2个字 142 if (i == 0) { // 第一列必须是路牌2个字
135 if (!"路牌".equals(cell_con.trim())) { 143 if (!"路牌".equals(cell_con.trim())) {
136 rtn.put("status", ResponseCode.ERROR); 144 rtn.put("status", ResponseCode.ERROR);
@@ -457,4 +465,25 @@ public class TTInfoDetailController extends BaseController&lt;TTInfoDetail, Long&gt; { @@ -457,4 +465,25 @@ public class TTInfoDetailController extends BaseController&lt;TTInfoDetail, Long&gt; {
457 public List<TTInfoDetail> findBcdetails(Integer xlId, Long ttinfoId, Long lpId) { 465 public List<TTInfoDetail> findBcdetails(Integer xlId, Long ttinfoId, Long lpId) {
458 return ttInfoDetailRepository.findBcdetails(xlId, ttinfoId, lpId); 466 return ttInfoDetailRepository.findBcdetails(xlId, ttinfoId, lpId);
459 } 467 }
  468 +
  469 + @Override
  470 + public void dataExport(HttpServletResponse response, @RequestParam Map<String, Object> param) throws Exception {
  471 + // 获取injectktr
  472 + File ktrFile2 = new File(this.getClass().getResource(
  473 + dataToolsProperties.getTtinfodetailOutput()).toURI());
  474 + param.put("injectktrfile", ktrFile2.getAbsolutePath());
  475 + param.put("ttinfoid", param.get("ttinfoid"));
  476 +
  477 + super.dataExport(response, param);
  478 + }
  479 +
  480 + @Override
  481 + protected String getDataExportKtrClasspath() {
  482 + return dataToolsProperties.getTtinfodetailMetaoutput();
  483 + }
  484 +
  485 + @Override
  486 + protected String getDataExportFilename() {
  487 + return "时刻表";
  488 + }
460 } 489 }
src/main/java/com/bsth/data/BasicData.java
@@ -7,6 +7,7 @@ import java.util.List; @@ -7,6 +7,7 @@ import java.util.List;
7 import java.util.Map; 7 import java.util.Map;
8 import java.util.concurrent.TimeUnit; 8 import java.util.concurrent.TimeUnit;
9 9
  10 +import org.apache.commons.lang3.StringUtils;
10 import org.slf4j.Logger; 11 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory; 12 import org.slf4j.LoggerFactory;
12 import org.springframework.beans.factory.annotation.Autowired; 13 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,258 +34,275 @@ import com.google.common.collect.HashBiMap; @@ -33,258 +34,275 @@ import com.google.common.collect.HashBiMap;
33 import com.google.common.collect.TreeMultimap; 34 import com.google.common.collect.TreeMultimap;
34 35
35 /** 36 /**
36 - * 37 + * @author PanZhao
37 * @ClassName: BasicData 38 * @ClassName: BasicData
38 * @Description: TODO(基础的映射数据) 39 * @Description: TODO(基础的映射数据)
39 - * @author PanZhao  
40 * @date 2016年8月10日 下午3:27:45 40 * @date 2016年8月10日 下午3:27:45
41 - *  
42 */ 41 */
43 @Component 42 @Component
44 -public class BasicData implements CommandLineRunner{  
45 -  
46 - //设备号和车辆自编号 (K: 设备编码 ,V:车辆自编号)  
47 - public static BiMap<String, String> deviceId2NbbmMap;  
48 -  
49 - //车辆自编号和公司代码对照 (K: 车辆自编号 ,V:公司代码)  
50 - public static Map<String, String> nbbm2CompanyCodeMap;  
51 -  
52 - //站点编码和名称对照,包括停车场 (K: 站点编码 ,V:站点名称)  
53 - public static Map<String, String> stationCode2NameMap;  
54 -  
55 - //车辆和线路对照  
56 - public static Map<String, Line> nbbm2LineMap;  
57 -  
58 - //线路和用户对照 用于webSocket定向推送消息(用户进入线调时写入数据)  
59 - public static TreeMultimap<String, String> lineCode2SocketUserMap = TreeMultimap.create();  
60 -  
61 - //线路ID和code 对照  
62 - public static BiMap<Integer, String> lineId2CodeMap;  
63 -  
64 - //线路编码和名称对照  
65 - public static Map<String, String> lineCode2NameMap;  
66 -  
67 - //线路编码_站点编码 == 0|1 上下行  
68 - public static Map<String, Integer> lineStationUpDownMap;  
69 -  
70 - //停车场  
71 - public static List<String> parkCodeList;  
72 -  
73 - //线路ID和shangHaiLinecode 对照  
74 - public static Map<Integer, String> lineId2ShangHaiCodeMap;  
75 -  
76 - //线路Code和shangHaiLinecode 对照  
77 - public static Map<String, String> lineCode2ShangHaiCodeMap;  
78 -  
79 - //驾驶员工号 和 personnel 对象映射  
80 - public static Map<String, Personnel> jsyMap;  
81 - //售票员工号 和 personnel 对象映射  
82 - public static Map<String, Personnel> spyMap;  
83 - //全量员工 工号和姓名对照  
84 - public static Map<String, String> allPerson;  
85 -  
86 -  
87 - static Logger logger = LoggerFactory.getLogger(BasicData.class);  
88 -  
89 - @Autowired  
90 - BasicDataLoader dataLoader;  
91 -  
92 - @Override  
93 - public void run(String... arg0) throws Exception {  
94 - Application.mainServices.scheduleWithFixedDelay(dataLoader, 0, 1, TimeUnit.HOURS);  
95 - }  
96 -  
97 -  
98 - @Component  
99 - public static class BasicDataLoader extends Thread{  
100 -  
101 - @Autowired  
102 - CarsRepository carsRepository;  
103 -  
104 - @Autowired  
105 - StationRepository stationRepository;  
106 -  
107 - @Autowired  
108 - CarParkRepository carParkRepository;  
109 -  
110 - @Autowired  
111 - CarConfigInfoRepository carConfigInfoRepository;  
112 -  
113 - @Autowired  
114 - LineRepository lineRepository;  
115 -  
116 - @Autowired  
117 - StationRouteRepository stationRouteRepository;  
118 -  
119 - @Autowired  
120 - PersonnelRepository personnelRepository;  
121 -  
122 -  
123 - @Override  
124 - public void run() {  
125 - loadAllData();  
126 - }  
127 -  
128 - /**  
129 - * @Title: loadAllData  
130 - * @Description: TODO(加载所有数据)  
131 - */  
132 - public int loadAllData(){  
133 - try{  
134 - //设备信息  
135 - loadDeviceInfo();  
136 - //站点信息  
137 - loadStationInfo();  
138 - //线路信息  
139 - loadLineInfo();  
140 - //车辆和线路映射信息  
141 - loadNbbm2LineInfo();  
142 - //站点路由信息  
143 - loadStationRouteInfo();  
144 - //人员信息  
145 - loadPersonnelInfo();  
146 - logger.info("加载基础数据成功!," );  
147 - }catch(Exception e){  
148 - logger.error("加载基础数据时出现异常," , e);  
149 - }  
150 - return 0;  
151 - }  
152 -  
153 -  
154 - private void loadStationRouteInfo() {  
155 - Iterator<StationRoute> iterator = stationRouteRepository.findAllEffective().iterator();  
156 - Map<String, Integer> map = new HashMap<>();  
157 - StationRoute route;  
158 -  
159 - while(iterator.hasNext()){  
160 - route = iterator.next();  
161 - map.put(route.getLineCode() + "_" + route.getStationCode(), route.getDirections());  
162 - }  
163 - lineStationUpDownMap = map;  
164 - }  
165 -  
166 - /**  
167 - * @Title: loadDeviceInfo  
168 - * @Description: TODO(加载设备相关信息)  
169 - */  
170 - public void loadDeviceInfo(){  
171 - BiMap<String, String> deviceId2Nbbm = HashBiMap.create();  
172 - //车辆和公司代码对照  
173 - Map<String, String> nbbm2CompanyCode = new HashMap<>();  
174 - Iterator<Cars> carIterator = carsRepository.findAll().iterator();  
175 - Cars car;  
176 - while(carIterator.hasNext()){  
177 - car = carIterator.next();  
178 - deviceId2Nbbm.put(car.getEquipmentCode(), car.getInsideCode());  
179 - nbbm2CompanyCode.put(car.getInsideCode(), car.getBusinessCode());  
180 - }  
181 -  
182 - deviceId2NbbmMap = deviceId2Nbbm;  
183 - nbbm2CompanyCodeMap = nbbm2CompanyCode;  
184 - }  
185 -  
186 - /**  
187 - * @Title: loadStationInfo  
188 - * @Description: TODO(加载站点信息)  
189 - */  
190 - public void loadStationInfo(){  
191 - Map<String, String> stationCode2Name = new HashMap<>();  
192 - Iterator<Station> iterator = stationRepository.findAll().iterator();  
193 - //站点  
194 - Station station;  
195 - while(iterator.hasNext()){  
196 - station = iterator.next();  
197 - stationCode2Name.put(station.getStationCod(), station.getStationName());  
198 - }  
199 - //停车场  
200 - Iterator<CarPark> iterator2 = carParkRepository.findAll().iterator();  
201 -  
202 - List<String> parkCodes = new ArrayList<>();  
203 -  
204 - CarPark carPark;  
205 - while(iterator2.hasNext()){  
206 - carPark = iterator2.next();  
207 - stationCode2Name.put(carPark.getParkCode(), carPark.getParkName());  
208 -  
209 - parkCodes.add(carPark.getParkCode());  
210 - }  
211 - parkCodeList = parkCodes;  
212 - stationCode2NameMap = stationCode2Name;  
213 - }  
214 -  
215 - /**  
216 - * @Title: loadNbbm2LineInfo  
217 - * @Description: TODO(车辆和线路对照)  
218 - */  
219 - public void loadNbbm2LineInfo(){  
220 - Iterator<CarConfigInfo> allIterator = carConfigInfoRepository.findAll().iterator();  
221 - Map<String, Line> ccMap = new HashMap<>();  
222 -  
223 - CarConfigInfo cci;  
224 - while(allIterator.hasNext()){  
225 - cci = allIterator.next();  
226 - ccMap.put(cci.getCl().getInsideCode(), cci.getXl());  
227 - }  
228 - nbbm2LineMap = ccMap;  
229 - }  
230 -  
231 - /**  
232 - * @Title: loadLineInfo  
233 - * @Description: TODO(加载线路相关信息)  
234 - */  
235 - public void loadLineInfo(){  
236 - Iterator<Line> iterator = lineRepository.findAll().iterator();  
237 -  
238 - Line line;  
239 - BiMap<Integer, String> biMap = HashBiMap.create();  
240 - Map<String, String> code2name = new HashMap<>();  
241 - Map<Integer, String> id2SHcode = new HashMap<Integer, String>();  
242 - Map<String, String> code2SHcode = new HashMap<String, String>();  
243 -  
244 - while(iterator.hasNext()){  
245 - line = iterator.next();  
246 - biMap.put(line.getId(), line.getLineCode());  
247 - code2name.put(line.getLineCode(), line.getName());  
248 - id2SHcode.put(line.getId(),line.getShanghaiLinecode());  
249 - code2SHcode.put(line.getLineCode(), line.getShanghaiLinecode());  
250 - }  
251 -  
252 - lineId2CodeMap = biMap;  
253 - lineCode2NameMap = code2name;  
254 - lineId2ShangHaiCodeMap = id2SHcode;  
255 - lineCode2ShangHaiCodeMap = code2SHcode;  
256 - }  
257 -  
258 - /**  
259 - *  
260 - * @Title: loadPersonnelInfo  
261 - * @Description: TODO(加载人员信息)  
262 - */  
263 - public void loadPersonnelInfo() {  
264 - Iterator<Personnel> iterator = personnelRepository.findAll().iterator();  
265 -  
266 - Map<String, Personnel> jsyTempMap=new HashMap<>()  
267 - , spyTempMap=new HashMap<>();  
268 - Map<String, String> allPersonMap=new HashMap<>();  
269 -  
270 - Personnel p;  
271 -  
272 - while(iterator.hasNext()){  
273 - p = iterator.next();  
274 -  
275 - if(p.getPosts() != null){  
276 - if(p.getPosts().equals("1"))  
277 - jsyTempMap.put(p.getJobCode(), p);  
278 - else if(p.getPosts().equals("2"))  
279 - spyTempMap.put(p.getJobCode(), p);  
280 - }  
281 -  
282 - allPersonMap.put(p.getJobCode(), p.getPersonnelName());  
283 - }  
284 -  
285 - jsyMap=jsyTempMap;  
286 - spyMap=spyTempMap;  
287 - allPerson=allPersonMap;  
288 - }  
289 - } 43 +public class BasicData implements CommandLineRunner {
  44 +
  45 + //设备号和车辆自编号 (K: 设备编码 ,V:车辆自编号)
  46 + public static BiMap<String, String> deviceId2NbbmMap;
  47 +
  48 + //车辆自编号和公司代码对照 (K: 车辆自编号 ,V:公司代码)
  49 + public static Map<String, String> nbbm2CompanyCodeMap;
  50 +
  51 + //站点编码和名称对照,包括停车场 (K: 站点编码 ,V:站点名称)
  52 + public static Map<String, String> stationCode2NameMap;
  53 +
  54 + //线路起终点对照(线路编码_上下行_起终点) 1024_0_B (1024上行起点)
  55 + public static Map<String, String> lineSEPointMap;
  56 +
  57 + //车辆和线路对照
  58 + public static Map<String, Line> nbbm2LineMap;
  59 +
  60 + //线路和用户对照 用于webSocket定向推送消息(用户进入线调时写入数据)
  61 + //public static TreeMultimap<String, String> lineCode2SocketUserMap = TreeMultimap.create();
  62 +
  63 + //线路ID和code 对照
  64 + public static BiMap<Integer, String> lineId2CodeMap;
  65 +
  66 + //线路编码和名称对照
  67 + public static Map<String, String> lineCode2NameMap;
  68 +
  69 + //线路编码_站点编码 == 0|1 上下行
  70 + public static Map<String, Integer> lineStationUpDownMap;
  71 +
  72 + //停车场
  73 + public static List<String> parkCodeList;
  74 +
  75 + //线路ID和shangHaiLinecode 对照
  76 + public static Map<Integer, String> lineId2ShangHaiCodeMap;
  77 +
  78 + //线路Code和shangHaiLinecode 对照
  79 + public static Map<String, String> lineCode2ShangHaiCodeMap;
  80 +
  81 + //驾驶员工号 和 personnel 对象映射
  82 + public static Map<String, Personnel> jsyMap;
  83 + //售票员工号 和 personnel 对象映射
  84 + public static Map<String, Personnel> spyMap;
  85 + //全量员工 工号和姓名对照
  86 + public static Map<String, String> allPerson;
  87 +
  88 +
  89 + static Logger logger = LoggerFactory.getLogger(BasicData.class);
  90 +
  91 + @Autowired
  92 + BasicDataLoader dataLoader;
  93 +
  94 + @Override
  95 + public void run(String... arg0) throws Exception {
  96 + Application.mainServices.scheduleWithFixedDelay(dataLoader, 0, 1, TimeUnit.HOURS);
  97 + }
  98 +
  99 +
  100 + @Component
  101 + public static class BasicDataLoader extends Thread {
  102 +
  103 + @Autowired
  104 + CarsRepository carsRepository;
  105 +
  106 + @Autowired
  107 + StationRepository stationRepository;
  108 +
  109 + @Autowired
  110 + CarParkRepository carParkRepository;
  111 +
  112 + @Autowired
  113 + CarConfigInfoRepository carConfigInfoRepository;
  114 +
  115 + @Autowired
  116 + LineRepository lineRepository;
  117 +
  118 + @Autowired
  119 + StationRouteRepository stationRouteRepository;
  120 +
  121 + @Autowired
  122 + PersonnelRepository personnelRepository;
  123 +
  124 +
  125 + @Override
  126 + public void run() {
  127 + loadAllData();
  128 + }
  129 +
  130 + /**
  131 + * @Title: loadAllData
  132 + * @Description: TODO(加载所有数据)
  133 + */
  134 + public int loadAllData() {
  135 + try {
  136 + //设备信息
  137 + loadDeviceInfo();
  138 + //站点信息
  139 + loadStationInfo();
  140 + //线路信息
  141 + loadLineInfo();
  142 + //车辆和线路映射信息
  143 + loadNbbm2LineInfo();
  144 + //站点路由信息
  145 + loadStationRouteInfo();
  146 + //人员信息
  147 + loadPersonnelInfo();
  148 + logger.info("加载基础数据成功!,");
  149 + } catch (Exception e) {
  150 + logger.error("加载基础数据时出现异常,", e);
  151 + }
  152 + return 0;
  153 + }
  154 +
  155 +
  156 + private void loadStationRouteInfo() {
  157 + Iterator<StationRoute> iterator = stationRouteRepository.findAllEffective().iterator();
  158 +
  159 + Map<String, String> sePointMap = new HashMap<>();
  160 + //lineSEPointMap
  161 + Map<String, Integer> map = new HashMap<>();
  162 +
  163 + StationRoute route;
  164 + while (iterator.hasNext()) {
  165 + route = iterator.next();
  166 + map.put(route.getLineCode() + "_" + route.getStationCode(), route.getDirections());
  167 +
  168 + if (route.getStationMark() != null &&
  169 + (route.getStationMark().equals("B") || route.getStationMark().equals("E"))) {
  170 + sePointMap.put(route.getLineCode() + "_"
  171 + + route.getDirections()
  172 + + "_" + route.getStationMark(), route.getStationCode());
  173 + }
  174 + }
  175 + lineStationUpDownMap = map;
  176 + lineSEPointMap = sePointMap;
  177 + }
  178 +
  179 + /**
  180 + * @Title: loadDeviceInfo
  181 + * @Description: TODO(加载设备相关信息)
  182 + */
  183 + public void loadDeviceInfo() {
  184 + BiMap<String, String> deviceId2Nbbm = HashBiMap.create();
  185 + //车辆和公司代码对照
  186 + Map<String, String> nbbm2CompanyCode = new HashMap<>();
  187 + Iterator<Cars> carIterator = carsRepository.findAll().iterator();
  188 + Cars car;
  189 + while (carIterator.hasNext()) {
  190 + car = carIterator.next();
  191 + deviceId2Nbbm.put(car.getEquipmentCode(), car.getInsideCode());
  192 + nbbm2CompanyCode.put(car.getInsideCode(), car.getBusinessCode());
  193 + }
  194 +
  195 + deviceId2NbbmMap = deviceId2Nbbm;
  196 + nbbm2CompanyCodeMap = nbbm2CompanyCode;
  197 + }
  198 +
  199 + /**
  200 + * @Title: loadStationInfo
  201 + * @Description: TODO(加载站点信息)
  202 + */
  203 + public void loadStationInfo() {
  204 + Map<String, String> stationCode2Name = new HashMap<>();
  205 + Iterator<Station> iterator = stationRepository.findAll().iterator();
  206 + //站点
  207 + Station station;
  208 + while (iterator.hasNext()) {
  209 + station = iterator.next();
  210 + stationCode2Name.put(station.getStationCod(), station.getStationName());
  211 + }
  212 + //停车场
  213 + Iterator<CarPark> iterator2 = carParkRepository.findAll().iterator();
  214 +
  215 + List<String> parkCodes = new ArrayList<>();
  216 +
  217 + CarPark carPark;
  218 + while (iterator2.hasNext()) {
  219 + carPark = iterator2.next();
  220 + stationCode2Name.put(carPark.getParkCode(), carPark.getParkName());
  221 +
  222 + parkCodes.add(carPark.getParkCode());
  223 + }
  224 + parkCodeList = parkCodes;
  225 + stationCode2NameMap = stationCode2Name;
  226 + }
  227 +
  228 + /**
  229 + * @Title: loadNbbm2LineInfo
  230 + * @Description: TODO(车辆和线路对照)
  231 + */
  232 + public void loadNbbm2LineInfo() {
  233 + Iterator<CarConfigInfo> allIterator = carConfigInfoRepository.findAll().iterator();
  234 + Map<String, Line> ccMap = new HashMap<>();
  235 +
  236 + CarConfigInfo cci;
  237 + while (allIterator.hasNext()) {
  238 + cci = allIterator.next();
  239 + ccMap.put(cci.getCl().getInsideCode(), cci.getXl());
  240 + }
  241 + nbbm2LineMap = ccMap;
  242 + }
  243 +
  244 + /**
  245 + * @Title: loadLineInfo
  246 + * @Description: TODO(加载线路相关信息)
  247 + */
  248 + public void loadLineInfo() {
  249 + Iterator<Line> iterator = lineRepository.findAll().iterator();
  250 +
  251 + Line line;
  252 + BiMap<Integer, String> biMap = HashBiMap.create();
  253 + Map<String, String> code2name = new HashMap<>();
  254 + Map<Integer, String> id2SHcode = new HashMap<Integer, String>();
  255 + Map<String, String> code2SHcode = new HashMap<String, String>();
  256 +
  257 + while (iterator.hasNext()) {
  258 + line = iterator.next();
  259 + biMap.put(line.getId(), line.getLineCode());
  260 + code2name.put(line.getLineCode(), line.getName());
  261 + id2SHcode.put(line.getId(), line.getShanghaiLinecode());
  262 + code2SHcode.put(line.getLineCode(), line.getShanghaiLinecode());
  263 + }
  264 +
  265 + lineId2CodeMap = biMap;
  266 + lineCode2NameMap = code2name;
  267 + lineId2ShangHaiCodeMap = id2SHcode;
  268 + lineCode2ShangHaiCodeMap = code2SHcode;
  269 + }
  270 +
  271 + /**
  272 + * @Title: loadPersonnelInfo
  273 + * @Description: TODO(加载人员信息)
  274 + */
  275 + public void loadPersonnelInfo() {
  276 + Iterator<Personnel> iterator = personnelRepository.findAll().iterator();
  277 +
  278 + Map<String, Personnel> jsyTempMap = new HashMap<>(), spyTempMap = new HashMap<>();
  279 + Map<String, String> allPersonMap = new HashMap<>();
  280 +
  281 + Personnel p;
  282 + String jobCode;
  283 + while (iterator.hasNext()) {
  284 + p = iterator.next();
  285 +
  286 + jobCode = p.getJobCode();
  287 + if (StringUtils.isEmpty(jobCode))
  288 + continue;
  289 +
  290 + if (jobCode.indexOf("-") != -1) {
  291 + jobCode = jobCode.split("-")[1];
  292 + }
  293 + if (p.getPosts() != null) {
  294 + if (p.getPosts().equals("1"))
  295 + jsyTempMap.put(jobCode, p);
  296 + else if (p.getPosts().equals("2"))
  297 + spyTempMap.put(jobCode, p);
  298 + }
  299 +
  300 + allPersonMap.put(jobCode, p.getPersonnelName());
  301 + }
  302 +
  303 + jsyMap = jsyTempMap;
  304 + spyMap = spyTempMap;
  305 + allPerson = allPersonMap;
  306 + }
  307 + }
290 } 308 }
src/main/java/com/bsth/data/gpsdata/GpsEntity.java
@@ -71,6 +71,9 @@ public class GpsEntity { @@ -71,6 +71,9 @@ public class GpsEntity {
71 71
72 private int version; 72 private int version;
73 73
  74 + /** 是否起终点站 */
  75 + private boolean sEPoint;
  76 +
74 public Integer getCompanyCode() { 77 public Integer getCompanyCode() {
75 return companyCode; 78 return companyCode;
76 } 79 }
@@ -238,4 +241,12 @@ public class GpsEntity { @@ -238,4 +241,12 @@ public class GpsEntity {
238 public void setVersion(int version) { 241 public void setVersion(int version) {
239 this.version = version; 242 this.version = version;
240 } 243 }
  244 +
  245 + public boolean issEPoint() {
  246 + return sEPoint;
  247 + }
  248 +
  249 + public void setsEPoint(boolean sEPoint) {
  250 + this.sEPoint = sEPoint;
  251 + }
241 } 252 }
src/main/java/com/bsth/data/gpsdata/GpsRealData.java
@@ -28,7 +28,7 @@ import com.bsth.util.ConfigUtil; @@ -28,7 +28,7 @@ import com.bsth.util.ConfigUtil;
28 import com.google.common.collect.TreeMultimap; 28 import com.google.common.collect.TreeMultimap;
29 29
30 /** 30 /**
31 - * 31 + *
32 * @ClassName: GpsRealData 32 * @ClassName: GpsRealData
33 * @Description: TODO(实时GPS数据集合) 33 * @Description: TODO(实时GPS数据集合)
34 * @author PanZhao 34 * @author PanZhao
@@ -37,25 +37,25 @@ import com.google.common.collect.TreeMultimap; @@ -37,25 +37,25 @@ import com.google.common.collect.TreeMultimap;
37 */ 37 */
38 @Component 38 @Component
39 public class GpsRealData implements CommandLineRunner{ 39 public class GpsRealData implements CommandLineRunner{
40 - 40 +
41 static Logger logger = LoggerFactory.getLogger(GpsRealData.class); 41 static Logger logger = LoggerFactory.getLogger(GpsRealData.class);
42 - 42 +
43 private static Map<String, GpsEntity> gpsMap; 43 private static Map<String, GpsEntity> gpsMap;
44 - 44 +
45 //按线路分组设备号 45 //按线路分组设备号
46 private static TreeMultimap<String, String> lineCode2Devices; 46 private static TreeMultimap<String, String> lineCode2Devices;
47 47
48 // 网关数据接口地址 48 // 网关数据接口地址
49 private static String url; 49 private static String url;
50 - 50 +
51 @Autowired 51 @Autowired
52 GpsDataLoader gpsDataLoader; 52 GpsDataLoader gpsDataLoader;
53 - 53 +
54 @Autowired 54 @Autowired
55 DayOfSchedule dayOfSchedule; 55 DayOfSchedule dayOfSchedule;
56 - 56 +
57 @Autowired 57 @Autowired
58 - ForecastRealServer forecastRealServer; 58 + ForecastRealServer forecastRealServer;
59 /** 59 /**
60 * 构造函数 60 * 构造函数
61 */ 61 */
@@ -64,49 +64,52 @@ public class GpsRealData implements CommandLineRunner{ @@ -64,49 +64,52 @@ public class GpsRealData implements CommandLineRunner{
64 lineCode2Devices = TreeMultimap.create(); 64 lineCode2Devices = TreeMultimap.create();
65 url = ConfigUtil.get("http.gps.real.url"); 65 url = ConfigUtil.get("http.gps.real.url");
66 } 66 }
67 - 67 +
68 @Override 68 @Override
69 public void run(String... arg0) throws Exception { 69 public void run(String... arg0) throws Exception {
70 logger.info("gpsDataLoader,20,6"); 70 logger.info("gpsDataLoader,20,6");
71 - //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 6, TimeUnit.SECONDS); 71 + Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 5, TimeUnit.SECONDS);
72 } 72 }
73 73
74 public GpsEntity add(GpsEntity gps) { 74 public GpsEntity add(GpsEntity gps) {
75 String device = gps.getDeviceId(); 75 String device = gps.getDeviceId();
76 GpsEntity old = gpsMap.get(device); 76 GpsEntity old = gpsMap.get(device);
77 -  
78 - //定时定距数据附带站点编码改变  
79 - if(null == old || !old.getStopNo().equals(gps.getStopNo())){  
80 - gps.setArrTime(gps.getTimestamp());  
81 - //预测到达终点时间  
82 - forecastRealServer.forecast(gps.getNbbm(), gps);  
83 - }  
84 - else{  
85 - gps.setArrTime(old.getArrTime());  
86 - //不预测, 重新计算终点时间  
87 - gps.setExpectStopTime(forecastRealServer.expectStopTime(gps.getNbbm())); 77 +
  78 + if(!StringUtils.isEmpty(gps.getStopNo())){
  79 + //定时定距数据附带站点编码改变
  80 + if(null == old || !gps.getStopNo().equals(old.getStopNo())){
  81 + gps.setArrTime(gps.getTimestamp());
  82 + //预测到达终点时间
  83 + forecastRealServer.forecast(gps.getNbbm(), gps);
  84 + }
  85 + else{
  86 + gps.setArrTime(old.getArrTime());
  87 + //不预测, 重新计算终点时间
  88 + gps.setExpectStopTime(forecastRealServer.expectStopTime(gps.getNbbm()));
  89 + }
88 } 90 }
89 - 91 +
90 gpsMap.put(device, gps); 92 gpsMap.put(device, gps);
91 - lineCode2Devices.put(gps.getLineId(), device); 93 + if(StringUtils.isNotBlank(gps.getLineId()))
  94 + lineCode2Devices.put(gps.getLineId(), device);
92 return gps; 95 return gps;
93 } 96 }
94 97
95 /** 98 /**
96 - * 99 + *
97 * @Title: get @Description: TODO(设备号获取GPS) 100 * @Title: get @Description: TODO(设备号获取GPS)
98 */ 101 */
99 public GpsEntity get(String deviceId) { 102 public GpsEntity get(String deviceId) {
100 return gpsMap.get(deviceId); 103 return gpsMap.get(deviceId);
101 } 104 }
102 - 105 +
103 /** 106 /**
104 - * 107 + *
105 * @Title: get @Description: TODO(线路编码获取GPS集合) @throws 108 * @Title: get @Description: TODO(线路编码获取GPS集合) @throws
106 */ 109 */
107 public List<GpsEntity> getByLine(String lineCode) { 110 public List<GpsEntity> getByLine(String lineCode) {
108 NavigableSet<String> set = lineCode2Devices.get(lineCode); 111 NavigableSet<String> set = lineCode2Devices.get(lineCode);
109 - 112 +
110 List<GpsEntity> rs = new ArrayList<>(); 113 List<GpsEntity> rs = new ArrayList<>();
111 GpsEntity gps; 114 GpsEntity gps;
112 ScheduleRealInfo sch; 115 ScheduleRealInfo sch;
@@ -115,19 +118,19 @@ public class GpsRealData implements CommandLineRunner{ @@ -115,19 +118,19 @@ public class GpsRealData implements CommandLineRunner{
115 //过滤异常GPS数据 118 //过滤异常GPS数据
116 if(gps.isAbnormal()) 119 if(gps.isAbnormal())
117 continue; 120 continue;
118 - 121 +
119 sch = dayOfSchedule.execPlamMap().get(gps.getNbbm()); 122 sch = dayOfSchedule.execPlamMap().get(gps.getNbbm());
120 if(null != sch) 123 if(null != sch)
121 gps.setSchId(sch.getId()); 124 gps.setSchId(sch.getId());
122 rs.add(gps); 125 rs.add(gps);
123 } 126 }
124 - 127 +
125 return rs; 128 return rs;
126 } 129 }
127 - 130 +
128 public List<GpsEntity> get(List<String> pArray){ 131 public List<GpsEntity> get(List<String> pArray){
129 List<GpsEntity> list = new ArrayList<>(); 132 List<GpsEntity> list = new ArrayList<>();
130 - 133 +
131 for(String code : pArray) 134 for(String code : pArray)
132 list.addAll(getByLine(code)); 135 list.addAll(getByLine(code));
133 return list; 136 return list;
@@ -136,11 +139,11 @@ public class GpsRealData implements CommandLineRunner{ @@ -136,11 +139,11 @@ public class GpsRealData implements CommandLineRunner{
136 public Set<String> allDevices(){ 139 public Set<String> allDevices(){
137 return gpsMap.keySet(); 140 return gpsMap.keySet();
138 } 141 }
139 - 142 +
140 public GpsEntity findByDeviceId(String deviceId) { 143 public GpsEntity findByDeviceId(String deviceId) {
141 return gpsMap.get(deviceId); 144 return gpsMap.get(deviceId);
142 } 145 }
143 - 146 +
144 public Collection<GpsEntity> all(){ 147 public Collection<GpsEntity> all(){
145 return gpsMap.values(); 148 return gpsMap.values();
146 } 149 }
@@ -150,9 +153,9 @@ public class GpsRealData implements CommandLineRunner{ @@ -150,9 +153,9 @@ public class GpsRealData implements CommandLineRunner{
150 } 153 }
151 @Component 154 @Component
152 public static class GpsDataLoader extends Thread{ 155 public static class GpsDataLoader extends Thread{
153 - 156 +
154 Logger logger = LoggerFactory.getLogger(GpsDataLoader.class); 157 Logger logger = LoggerFactory.getLogger(GpsDataLoader.class);
155 - 158 +
156 @Autowired 159 @Autowired
157 GpsRealData gpsRealData; 160 GpsRealData gpsRealData;
158 161
@@ -164,7 +167,7 @@ public class GpsRealData implements CommandLineRunner{ @@ -164,7 +167,7 @@ public class GpsRealData implements CommandLineRunner{
164 logger.error("", e); 167 logger.error("", e);
165 } 168 }
166 } 169 }
167 - 170 +
168 public void load() throws Exception { 171 public void load() throws Exception {
169 List<GpsEntity> list = new ArrayList<>(); 172 List<GpsEntity> list = new ArrayList<>();
170 CloseableHttpClient httpClient = null; 173 CloseableHttpClient httpClient = null;
@@ -172,7 +175,7 @@ public class GpsRealData implements CommandLineRunner{ @@ -172,7 +175,7 @@ public class GpsRealData implements CommandLineRunner{
172 try { 175 try {
173 httpClient = HttpClients.createDefault(); 176 httpClient = HttpClients.createDefault();
174 HttpGet get = new HttpGet(url); 177 HttpGet get = new HttpGet(url);
175 - 178 +
176 response = httpClient.execute(get); 179 response = httpClient.execute(get);
177 180
178 HttpEntity entity = response.getEntity(); 181 HttpEntity entity = response.getEntity();
@@ -181,32 +184,45 @@ public class GpsRealData implements CommandLineRunner{ @@ -181,32 +184,45 @@ public class GpsRealData implements CommandLineRunner{
181 BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); 184 BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
182 StringBuffer stringBuffer = new StringBuffer(); 185 StringBuffer stringBuffer = new StringBuffer();
183 String str = ""; 186 String str = "";
184 - while ((str = br.readLine()) != null) 187 + while ((str = br.readLine()) != null)
185 stringBuffer.append(str); 188 stringBuffer.append(str);
186 189
187 JSONObject jsonObj = JSON.parseObject(stringBuffer.toString()); 190 JSONObject jsonObj = JSON.parseObject(stringBuffer.toString());
188 191
189 - if (jsonObj != null) 192 + if (jsonObj != null)
190 list = JSON.parseArray(jsonObj.getString("data"), GpsEntity.class); 193 list = JSON.parseArray(jsonObj.getString("data"), GpsEntity.class);
191 - 194 +
192 String nbbm; 195 String nbbm;
193 - //附加车辆内部编码  
194 - Integer updown;  
195 for(GpsEntity gps : list){ 196 for(GpsEntity gps : list){
  197 + //没有设备号
  198 + if(StringUtils.isBlank(gps.getDeviceId()))
  199 + continue;
  200 +
196 nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId()); 201 nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId());
197 if(StringUtils.isBlank(nbbm)) 202 if(StringUtils.isBlank(nbbm))
198 gps.setAbnormal(true);//标记为异常数据 203 gps.setAbnormal(true);//标记为异常数据
199 else 204 else
200 gps.setNbbm(nbbm); 205 gps.setNbbm(nbbm);
201 - 206 +
202 gps.setStationName(BasicData.stationCode2NameMap.get(gps.getStopNo())); 207 gps.setStationName(BasicData.stationCode2NameMap.get(gps.getStopNo()));
  208 + gpsRealData.add(gps);
  209 +
  210 + //纠正走向
  211 + correctUpdown(gps);
  212 + /*if(issEPoint(gps))
  213 + continue;
  214 +
  215 + //如果走向未知,尝试根据站点纠正走向
203 if(gps.getUpDown() == -1){ 216 if(gps.getUpDown() == -1){
204 - //如果走向未知,尝试根据站点纠正走向  
205 - updown=BasicData.lineStationUpDownMap.get(gps.getLineId()+"_"+gps.getStopNo()); 217 + updown=stationUpDownMap.get(gps.getLineId()+"_"+gps.getStopNo());
206 if(updown != null) 218 if(updown != null)
207 gps.setUpDown(updown); 219 gps.setUpDown(updown);
208 } 220 }
209 - gpsRealData.add(gps); 221 + //如果站点编码和走向相反(即上行站点ID,走向为下行),尝试根据站点纠正走向
  222 + updown=stationUpDownMap.get(gps.getLineId()+"_"+gps.getStopNo());
  223 + if(updown != null && !gps.getUpDown().equals(updown)){
  224 + gps.setUpDown(updown);
  225 + }*/
210 } 226 }
211 } else 227 } else
212 logger.error("result is null"); 228 logger.error("result is null");
@@ -220,5 +236,55 @@ public class GpsRealData implements CommandLineRunner{ @@ -220,5 +236,55 @@ public class GpsRealData implements CommandLineRunner{
220 response.close(); 236 response.close();
221 } 237 }
222 } 238 }
  239 +
  240 + /**
  241 + * 是否是起终点
  242 + * @param gps
  243 + * @return
  244 + */
  245 + public boolean isSEPoint(GpsEntity gps){
  246 + String key = gps.getLineId()+"_"+gps.getUpDown()+"_"
  247 + ,stationCode;
  248 +
  249 + if(BasicData.lineSEPointMap.containsKey(key+"B")){
  250 + stationCode = BasicData.lineSEPointMap.get(key+"B");
  251 + if(gps.getStopNo().equals(stationCode)){
  252 + gps.setsEPoint(true);
  253 + return true;
  254 + }
  255 + }
  256 +
  257 + if(BasicData.lineSEPointMap.containsKey(key+"E")){
  258 + stationCode = BasicData.lineSEPointMap.get(key+"E");
  259 + if(gps.getStopNo().equals(stationCode)){
  260 + gps.setsEPoint(true);
  261 + return true;
  262 + }
  263 + }
  264 + return false;
  265 + }
  266 +
  267 + /**
  268 + * 纠正上下行
  269 + * @param gps
  270 + */
  271 + public void correctUpdown(GpsEntity gps){
  272 + Integer updown=BasicData.lineStationUpDownMap.get(gps.getLineId()+"_"+gps.getStopNo());
  273 + if(updown != null && !updown.equals(gps.getUpDown()))
  274 + gps.setUpDown(updown);
  275 + /*//如果走向未知,尝试根据站点纠正走向
  276 + if(gps.getUpDown() == -1){
  277 +
  278 + }*/
  279 +
  280 + if(isSEPoint(gps))
  281 + return;
  282 +
  283 + /*//如果站点编码和走向相反(即上行站点ID,走向为下行),尝试根据站点纠正走向
  284 + updown=BasicData.lineStationUpDownMap.get(gps.getLineId()+"_"+gps.getStopNo());
  285 + if(updown != null && !gps.getUpDown().equals(updown)){
  286 + gps.setUpDown(updown);
  287 + }*/
  288 + }
223 } 289 }
224 } 290 }
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
@@ -130,11 +130,11 @@ public class DayOfSchedule implements CommandLineRunner { @@ -130,11 +130,11 @@ public class DayOfSchedule implements CommandLineRunner {
130 //翻班线程 130 //翻班线程
131 Application.mainServices.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS); 131 Application.mainServices.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS);
132 //入库 132 //入库
133 - //Application.mainServices.scheduleWithFixedDelay(schedulePstThread, 60, 60, TimeUnit.SECONDS); 133 + Application.mainServices.scheduleWithFixedDelay(schedulePstThread, 60, 60, TimeUnit.SECONDS);
134 //首班出场指令补发器 134 //首班出场指令补发器
135 - //Application.mainServices.scheduleWithFixedDelay(firstScheduleCheckThread, 30, 240, TimeUnit.SECONDS); 135 + Application.mainServices.scheduleWithFixedDelay(firstScheduleCheckThread, 30, 240, TimeUnit.SECONDS);
136 //班次误点扫描 136 //班次误点扫描
137 - //Application.mainServices.scheduleWithFixedDelay(scheduleLateThread, 60, 60, TimeUnit.SECONDS); 137 + Application.mainServices.scheduleWithFixedDelay(scheduleLateThread, 60, 60, TimeUnit.SECONDS);
138 138
139 //每天凌晨2点20提交数据到运管处 139 //每天凌晨2点20提交数据到运管处
140 long diff = (DateUtils.getTimestamp() + 1000*60*140) - System.currentTimeMillis(); 140 long diff = (DateUtils.getTimestamp() + 1000*60*140) - System.currentTimeMillis();
src/main/java/com/bsth/entity/Station.java
@@ -97,7 +97,16 @@ public class Station { @@ -97,7 +97,16 @@ public class Station {
97 97
98 // 版本号 98 // 版本号
99 private Integer versions; 99 private Integer versions;
100 - 100 +
  101 + /** 是否有电子站牌 这里是老调度系统的原始字段,暂时保留该字段。 */
  102 + private Integer isHaveLed;
  103 +
  104 + /** 是否有候车亭 这里是老调度系统的原始字段,暂时保留该字段。*/
  105 + private Integer isHaveShelter;
  106 +
  107 + /** 是否港湾式公交站 这里是老调度系统的原始字段,暂时保留该字段。*/
  108 + private Integer isHarbourStation;
  109 +
101 // 描述 110 // 描述
102 private String descriptions; 111 private String descriptions;
103 112
@@ -115,6 +124,30 @@ public class Station { @@ -115,6 +124,30 @@ public class Station {
115 @Column(name = "update_date", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") 124 @Column(name = "update_date", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
116 private Date updateDate; 125 private Date updateDate;
117 126
  127 + public Integer getIsHaveLed() {
  128 + return isHaveLed;
  129 + }
  130 +
  131 + public void setIsHaveLed(Integer isHaveLed) {
  132 + this.isHaveLed = isHaveLed;
  133 + }
  134 +
  135 + public Integer getIsHaveShelter() {
  136 + return isHaveShelter;
  137 + }
  138 +
  139 + public void setIsHaveShelter(Integer isHaveShelter) {
  140 + this.isHaveShelter = isHaveShelter;
  141 + }
  142 +
  143 + public Integer getIsHarbourStation() {
  144 + return isHarbourStation;
  145 + }
  146 +
  147 + public void setIsHarbourStation(Integer isHarbourStation) {
  148 + this.isHarbourStation = isHarbourStation;
  149 + }
  150 +
118 public String getAddr() { 151 public String getAddr() {
119 return addr; 152 return addr;
120 } 153 }
src/main/java/com/bsth/entity/schedule/SchedulePlanInfo.java
@@ -3,6 +3,7 @@ package com.bsth.entity.schedule; @@ -3,6 +3,7 @@ package com.bsth.entity.schedule;
3 import com.bsth.entity.Line; 3 import com.bsth.entity.Line;
4 import com.bsth.entity.sys.SysUser; 4 import com.bsth.entity.sys.SysUser;
5 import com.bsth.service.schedule.rules.shiftloop.ScheduleResult_output; 5 import com.bsth.service.schedule.rules.shiftloop.ScheduleResult_output;
  6 +import org.apache.commons.lang3.StringUtils;
6 7
7 import javax.persistence.*; 8 import javax.persistence.*;
8 import java.util.Date; 9 import java.util.Date;
@@ -199,12 +200,29 @@ public class SchedulePlanInfo { @@ -199,12 +200,29 @@ public class SchedulePlanInfo {
199 } 200 }
200 201
201 this.j = employeeConfigInfo.getJsy().getId(); 202 this.j = employeeConfigInfo.getJsy().getId();
202 - this.jGh = employeeConfigInfo.getJsy().getJobCode(); 203 +// this.jGh = employeeConfigInfo.getJsy().getJobCode();
  204 + if (StringUtils.isNotEmpty(employeeConfigInfo.getJsy().getJobCode())) {
  205 + String[] jsy_temp = employeeConfigInfo.getJsy().getJobCode().split("-");
  206 + if (jsy_temp.length > 1) {
  207 + this.jGh = jsy_temp[1];
  208 + } else {
  209 + this.jGh = jsy_temp[0];
  210 + }
  211 + }
203 this.jName = employeeConfigInfo.getJsy().getPersonnelName(); 212 this.jName = employeeConfigInfo.getJsy().getPersonnelName();
204 // 关联的售票员 213 // 关联的售票员
205 if (employeeConfigInfo.getSpy() != null) { 214 if (employeeConfigInfo.getSpy() != null) {
206 this.s = employeeConfigInfo.getSpy().getId(); 215 this.s = employeeConfigInfo.getSpy().getId();
207 - this.sGh = employeeConfigInfo.getSpy().getJobCode(); 216 +// this.sGh = employeeConfigInfo.getSpy().getJobCode();
  217 + if (StringUtils.isNotEmpty(employeeConfigInfo.getSpy().getJobCode())) {
  218 + String[] spy_temp = employeeConfigInfo.getSpy().getJobCode().split("-");
  219 + if (spy_temp.length > 1) {
  220 + this.sGh = spy_temp[1];
  221 + } else {
  222 + this.sGh = spy_temp[0];
  223 + }
  224 + }
  225 +
208 this.sName = employeeConfigInfo.getSpy().getPersonnelName(); 226 this.sName = employeeConfigInfo.getSpy().getPersonnelName();
209 } 227 }
210 228
src/main/java/com/bsth/filter/BaseFilter.java
@@ -24,7 +24,7 @@ public abstract class BaseFilter implements Filter { @@ -24,7 +24,7 @@ public abstract class BaseFilter implements Filter {
24 * 白名单 24 * 白名单
25 */ 25 */
26 private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, 26 private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA,
27 - Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_TEMPS }; 27 + Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_REAL_GPS };
28 28
29 @Override 29 @Override
30 public void destroy() { 30 public void destroy() {
src/main/java/com/bsth/oplog/http/HttpOpLogInterceptor.java
@@ -3,8 +3,8 @@ package com.bsth.oplog.http; @@ -3,8 +3,8 @@ package com.bsth.oplog.http;
3 import javax.servlet.http.HttpServletRequest; 3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse; 4 import javax.servlet.http.HttpServletResponse;
5 5
  6 +import com.bsth.common.Constants;
6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.beans.factory.annotation.Autowired;
7 -import org.springframework.stereotype.Component;  
8 import org.springframework.util.AntPathMatcher; 8 import org.springframework.util.AntPathMatcher;
9 import org.springframework.util.PathMatcher; 9 import org.springframework.util.PathMatcher;
10 import org.springframework.web.method.HandlerMethod; 10 import org.springframework.web.method.HandlerMethod;
@@ -25,7 +25,7 @@ public class HttpOpLogInterceptor implements HandlerInterceptor { @@ -25,7 +25,7 @@ public class HttpOpLogInterceptor implements HandlerInterceptor {
25 private final PathMatcher pathMatcher = new AntPathMatcher(); 25 private final PathMatcher pathMatcher = new AntPathMatcher();
26 26
27 // GET 白名单 27 // GET 白名单
28 - private String[] httpGetWhiteList = { "/user/login/**", "/user/currentUser","/dictionary/**", "/module/findByCurrentUser", "/gps/**", "/error/**" }; 28 + private String[] httpGetWhiteList = { "/user/login/**", "/user/currentUser","/dictionary/**", "/module/findByCurrentUser", "/gps/**", "/error/**", Constants.XD_CHILD_PAGES};
29 29
30 // POST 白名单 30 // POST 白名单
31 private String[] httpPostWhiteList = { 31 private String[] httpPostWhiteList = {
src/main/java/com/bsth/repository/CarParkRepository.java
@@ -33,9 +33,9 @@ public interface CarParkRepository extends BaseRepository&lt;CarPark, Integer&gt;{ @@ -33,9 +33,9 @@ public interface CarParkRepository extends BaseRepository&lt;CarPark, Integer&gt;{
33 33
34 "?6 , str_to_date(?7,'%Y-%m-%d %H:%i:%s') , ?8 , ?9 , ?10," + 34 "?6 , str_to_date(?7,'%Y-%m-%d %H:%i:%s') , ?8 , ?9 , ?10," +
35 35
36 - "str_to_date(?11,'%Y-%m-%d %H:%i:%s'), ?12 ,?13,GeomFromText(?14), ?15, " + 36 + "str_to_date(?11,'%Y-%m-%d %H:%i:%s'), ?12 ,?13,ST_GeomFromText(?14), ?15, " +
37 37
38 - "?16, GeomFromText(?17), ?18,?19)", nativeQuery=true) 38 + "?16, ST_GeomFromText(?17), ?18,?19)", nativeQuery=true)
39 public void carParkSave(Double area,String company,String parkCode,String parkName, 39 public void carParkSave(Double area,String company,String parkCode,String parkName,
40 40
41 String brancheCompany,Integer createBy,String createDate,String descriptions,Integer destroy, 41 String brancheCompany,Integer createBy,String createDate,String descriptions,Integer destroy,
@@ -91,8 +91,8 @@ public interface CarParkRepository extends BaseRepository&lt;CarPark, Integer&gt;{ @@ -91,8 +91,8 @@ public interface CarParkRepository extends BaseRepository&lt;CarPark, Integer&gt;{
91 "versions = ?12 , " + 91 "versions = ?12 , " +
92 "b_center_point = ?13 , " + 92 "b_center_point = ?13 , " +
93 "g_center_point = ?14 , " + 93 "g_center_point = ?14 , " +
94 - "b_park_point = GeomFromText(?15) , " +  
95 - "g_park_point = GeomFromText(?16) , " + 94 + "b_park_point = ST_GeomFromText(?15) , " +
  95 + "g_park_point = ST_GeomFromText(?16) , " +
96 "db_type = ?17 , " + 96 "db_type = ?17 , " +
97 "radius = ?18 , " + 97 "radius = ?18 , " +
98 "shapes_type = ?19 " + 98 "shapes_type = ?19 " +
src/main/java/com/bsth/repository/SectionRepository.java
@@ -83,33 +83,32 @@ public interface SectionRepository extends BaseRepository&lt;Section, Integer&gt; { @@ -83,33 +83,32 @@ public interface SectionRepository extends BaseRepository&lt;Section, Integer&gt; {
83 @Transactional 83 @Transactional
84 @Modifying 84 @Modifying
85 @Query(value="UPDATE bsth_c_section SET " + 85 @Query(value="UPDATE bsth_c_section SET " +
86 - "gsection_vector = ST_GeomFromText(?2) , " +  
87 - "bsection_vector = ST_GeomFromText(?3)," +  
88 - "section_code = ?4," +  
89 - "section_name = ?5," +  
90 - "croses_road = ?6," +  
91 - "end_node = ?7," +  
92 - "start_node = ?8," +  
93 - "middle_node = ?9," +  
94 - "section_type = ?10," +  
95 - "csection_vector = ?11," +  
96 - "road_coding = ?12," +  
97 - "section_distance = ?13," +  
98 - "section_time = ?14," +  
99 - "db_type = ?15," +  
100 - "speed_limit = ?16," +  
101 - "descriptions = ?17," +  
102 - "versions = ?18," +  
103 - "create_by = ?19," +  
104 - "create_date = str_to_date(?20,'%Y-%m-%d %H:%i:%s')," +  
105 - "update_by = ?21," +  
106 - "update_date = str_to_date(?22,'%Y-%m-%d %H:%i:%s')" + 86 + " gsection_vector = ST_GeomFromText(?2) , " +
  87 + " bsection_vector = ST_GeomFromText(?3)," +
  88 + " section_code = ?4," +
  89 + " section_name = ?5," +
  90 + " croses_road = ?6," +
  91 + " end_node = ?7," +
  92 + " start_node = ?8," +
  93 + " middle_node = ?9," +
  94 + " section_type = ?10," +
  95 + " road_coding = ?11," +
  96 + " section_distance = ?12," +
  97 + " section_time = ?13," +
  98 + " db_type = ?14," +
  99 + " speed_limit = ?15," +
  100 + " descriptions = ?16," +
  101 + " versions = ?17," +
  102 + " create_by = ?18," +
  103 + " create_date = str_to_date(?19,'%Y-%m-%d %H:%i:%s')," +
  104 + " update_by = ?20," +
  105 + " update_date = str_to_date(?21,'%Y-%m-%d %H:%i:%s')" +
107 " WHERE id = ?1", nativeQuery=true) 106 " WHERE id = ?1", nativeQuery=true)
108 public void sectionUpdate(Integer sectionId,String gsectionVector,String bsectionVector,String sectionCode,String sectionName, 107 public void sectionUpdate(Integer sectionId,String gsectionVector,String bsectionVector,String sectionCode,String sectionName,
109 108
110 String crosesRoad,String endNode,String startNode,String middleNode,String sectionType, 109 String crosesRoad,String endNode,String startNode,String middleNode,String sectionType,
111 110
112 - String csectionVector,String roadCoding,Double sectionDistance,Double sectionTime,String dbType, 111 + String roadCoding,Double sectionDistance,Double sectionTime,String dbType,
113 112
114 Double speedLimit,String descriptions,Integer version,Integer createBy,String createDate, 113 Double speedLimit,String descriptions,Integer version,Integer createBy,String createDate,
115 114
src/main/java/com/bsth/repository/SectionRouteRepository.java
@@ -69,7 +69,7 @@ public interface SectionRouteRepository extends BaseRepository&lt;SectionRoute, Int @@ -69,7 +69,7 @@ public interface SectionRouteRepository extends BaseRepository&lt;SectionRoute, Int
69 "r.versions AS versions," + 69 "r.versions AS versions," +
70 "r.descriptions AS descriptions" + 70 "r.descriptions AS descriptions" +
71 " FROM bsth_c_sectionroute r where r.line = ?1 and r.directions = ?2 and r.destroy=0 ) a " + 71 " FROM bsth_c_sectionroute r where r.line = ?1 and r.directions = ?2 and r.destroy=0 ) a " +
72 - " LEFT JOIN bsth_c_section b ON a.sectionrouteSection = b.id", nativeQuery=true) 72 + " LEFT JOIN bsth_c_section b ON a.sectionrouteSection = b.id order by a.sectionrouteCode asc", nativeQuery=true)
73 List<Object[]> getSectionRoute(int lineId, int directions); 73 List<Object[]> getSectionRoute(int lineId, int directions);
74 74
75 75
src/main/java/com/bsth/repository/StationRouteRepository.java
@@ -110,9 +110,12 @@ public interface StationRouteRepository extends BaseRepository&lt;StationRoute, Int @@ -110,9 +110,12 @@ public interface StationRouteRepository extends BaseRepository&lt;StationRoute, Int
110 * 110 *
111 * @return List<Object[]> 111 * @return List<Object[]>
112 */ 112 */
113 - @Query(value = "SELECT s.b_jwpoints,s.station_name FROM (" + 113 + /*@Query(value = "SELECT s.b_jwpoints,s.station_name FROM (" +
114 "SELECT b.station FROM bsth_c_stationroute b where b.line =?1 and b.directions = ?2 and b.destroy=0) r " + 114 "SELECT b.station FROM bsth_c_stationroute b where b.line =?1 and b.directions = ?2 and b.destroy=0) r " +
115 - "LEFT JOIN bsth_c_station s on r.station = s.id", nativeQuery=true) 115 + "LEFT JOIN bsth_c_station s on r.station = s.id", nativeQuery=true)*/
  116 + @Query(value = "SELECT s.b_jwpoints,s.station_name,r.station_route_code FROM (" +
  117 + "SELECT b.station,b.station_route_code FROM bsth_c_stationroute b where b.line =?1 and b.directions = ?2 and b.destroy=0) r " +
  118 + "LEFT JOIN bsth_c_station s on r.station = s.id order by r.station_route_code asc", nativeQuery=true)
116 List<Object[]> getSelectStationRouteCenterPoints(Integer lineId,Integer direction); 119 List<Object[]> getSelectStationRouteCenterPoints(Integer lineId,Integer direction);
117 120
118 /** 121 /**
src/main/java/com/bsth/security/WebSecurityConfig.java
@@ -36,7 +36,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @@ -36,7 +36,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
36 public void configure(WebSecurity web) throws Exception { 36 public void configure(WebSecurity web) throws Exception {
37 // 白名单 37 // 白名单
38 web.ignoring().antMatchers(Constants.LOGIN_PAGE, Constants.LOGIN, Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.CAPTCHA, 38 web.ignoring().antMatchers(Constants.LOGIN_PAGE, Constants.LOGIN, Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.CAPTCHA,
39 - Constants.METRONIC_URL, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_TEMPS); 39 + Constants.METRONIC_URL, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES);
40 } 40 }
41 41
42 @Override 42 @Override
src/main/java/com/bsth/service/impl/CarParkServiceImpl.java
@@ -75,9 +75,19 @@ public class CarParkServiceImpl extends BaseServiceImpl&lt;CarPark, Integer&gt; implem @@ -75,9 +75,19 @@ public class CarParkServiceImpl extends BaseServiceImpl&lt;CarPark, Integer&gt; implem
75 75
76 } 76 }
77 77
78 - bParkPoint = "POLYGON((" + bParkPoint +"))"; 78 + if(bParkPoint.equals(""))
  79 + bParkPoint = null;
  80 + else
  81 + bParkPoint = "POLYGON((" + bParkPoint +"))";
  82 +
  83 + if(gParkPoint.equals(""))
  84 + gParkPoint = null;
  85 + else
  86 + gParkPoint = "POLYGON((" + gParkPoint +"))";
79 87
80 - gParkPoint = "POLYGON((" + gParkPoint +"))"; 88 + /*bParkPoint = "POLYGON((" + bParkPoint +"))";
  89 +
  90 + gParkPoint = "POLYGON((" + gParkPoint +"))";*/
81 91
82 // 地理位置中心点(百度坐标) 92 // 地理位置中心点(百度坐标)
83 String bCenterPoint = map.get("bCenterPoint").equals("") ? "" : map.get("bCenterPoint").toString(); 93 String bCenterPoint = map.get("bCenterPoint").equals("") ? "" : map.get("bCenterPoint").toString();
@@ -93,7 +103,7 @@ public class CarParkServiceImpl extends BaseServiceImpl&lt;CarPark, Integer&gt; implem @@ -93,7 +103,7 @@ public class CarParkServiceImpl extends BaseServiceImpl&lt;CarPark, Integer&gt; implem
93 103
94 } 104 }
95 105
96 - String gCenterPoint = ""; 106 + String gCenterPoint = null;
97 107
98 if(bJwpointsArray.length>0) { 108 if(bJwpointsArray.length>0) {
99 109
@@ -147,6 +157,9 @@ public class CarParkServiceImpl extends BaseServiceImpl&lt;CarPark, Integer&gt; implem @@ -147,6 +157,9 @@ public class CarParkServiceImpl extends BaseServiceImpl&lt;CarPark, Integer&gt; implem
147 // 修改人 157 // 修改人
148 Integer updateBy = map.get("updateBy").equals("") ? null : Integer.parseInt(map.get("updateBy").toString()); 158 Integer updateBy = map.get("updateBy").equals("") ? null : Integer.parseInt(map.get("updateBy").toString());
149 159
  160 +
  161 +
  162 +
150 carParkRepository.carParkSave(area, company, parkCode, parkName, 163 carParkRepository.carParkSave(area, company, parkCode, parkName,
151 164
152 brancheCompany, createBy, createDate, descriptions, destroy, 165 brancheCompany, createBy, createDate, descriptions, destroy,
@@ -296,7 +309,7 @@ public class CarParkServiceImpl extends BaseServiceImpl&lt;CarPark, Integer&gt; implem @@ -296,7 +309,7 @@ public class CarParkServiceImpl extends BaseServiceImpl&lt;CarPark, Integer&gt; implem
296 309
297 } 310 }
298 311
299 - String gCenterPoint = ""; 312 + String gCenterPoint =null;
300 313
301 if(bJwpointsArray.length>0) { 314 if(bJwpointsArray.length>0) {
302 315
@@ -337,10 +350,18 @@ public class CarParkServiceImpl extends BaseServiceImpl&lt;CarPark, Integer&gt; implem @@ -337,10 +350,18 @@ public class CarParkServiceImpl extends BaseServiceImpl&lt;CarPark, Integer&gt; implem
337 } 350 }
338 351
339 } 352 }
  353 + if(bParkPoint.equals(""))
  354 + bParkPoint = null;
  355 + else
  356 + bParkPoint = "POLYGON((" + bParkPoint +"))";
  357 +
  358 + if(gParkPoint.equals(""))
  359 + gParkPoint = null;
  360 + else
  361 + gParkPoint = "POLYGON((" + gParkPoint +"))";
  362 + /*bParkPoint = "POLYGON((" + bParkPoint +"))";
340 363
341 - bParkPoint = "POLYGON((" + bParkPoint +"))";  
342 -  
343 - gParkPoint = "POLYGON((" + gParkPoint +"))"; 364 + gParkPoint = "POLYGON((" + gParkPoint +"))";*/
344 365
345 // 编码 366 // 编码
346 String parkCode = map.get("parkCode").equals("") ? "" : map.get("parkCode").toString(); 367 String parkCode = map.get("parkCode").equals("") ? "" : map.get("parkCode").toString();
src/main/java/com/bsth/service/impl/SectionServiceImpl.java
@@ -213,10 +213,11 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem @@ -213,10 +213,11 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem
213 213
214 String sectionType=""; 214 String sectionType="";
215 215
216 - String csectionVector=""; 216 + // String csectionVector="";
217 217
218 // 更新 218 // 更新
219 - repository.sectionUpdate(sectionId, gsectionVector, bsectionVectorS, sectionCode, sectionName, crosesRoad, endNode, startNode, middleNode, sectionType, csectionVector, roadCoding, sectionDistance, sectionTime, dbType, speedLimit, descriptions, version, createBy, createDate, updateBy, updateDate); 219 + /*repository.sectionUpdate(sectionId, gsectionVector, bsectionVectorS, sectionCode, sectionName, crosesRoad, endNode, startNode, middleNode, sectionType, csectionVector, roadCoding, sectionDistance, sectionTime, dbType, speedLimit, descriptions, version, createBy, createDate, updateBy, updateDate);*/
  220 + repository.sectionUpdate(sectionId, gsectionVector, bsectionVectorS, sectionCode, sectionName, crosesRoad, endNode, startNode, middleNode, sectionType, roadCoding, sectionDistance, sectionTime, dbType, speedLimit, descriptions, version, createBy, createDate, updateBy, updateDate);
220 221
221 SectionRoute route = new SectionRoute(); 222 SectionRoute route = new SectionRoute();
222 223
@@ -393,7 +394,7 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem @@ -393,7 +394,7 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem
393 394
394 String sectionType=""; 395 String sectionType="";
395 396
396 - String csectionVector=""; 397 + String csectionVector=null;
397 398
398 Integer id = Integer.valueOf(sectionCode); 399 Integer id = Integer.valueOf(sectionCode);
399 400
src/main/java/com/bsth/service/impl/StationServiceImpl.java
@@ -977,9 +977,9 @@ public class StationServiceImpl extends BaseServiceImpl&lt;Station, Integer&gt; implem @@ -977,9 +977,9 @@ public class StationServiceImpl extends BaseServiceImpl&lt;Station, Integer&gt; implem
977 977
978 } 978 }
979 979
980 - bPloygonGrid = "POLYGON((" + bPloygonGrid +"))"; 980 + /* bPloygonGrid = "POLYGON((" + bPloygonGrid +"))";
981 981
982 - gPloygonGrid = "POLYGON((" + gPloygonGrid +"))"; 982 + gPloygonGrid = "POLYGON((" + gPloygonGrid +"))";*/
983 983
984 // 是否撤销 984 // 是否撤销
985 Integer destroy = map.get("destroy").equals("") ? null : Integer.parseInt(map.get("destroy").toString()); 985 Integer destroy = map.get("destroy").equals("") ? null : Integer.parseInt(map.get("destroy").toString());
src/main/java/com/bsth/service/schedule/utils/DataImportExportService.java
@@ -3,6 +3,7 @@ package com.bsth.service.schedule.utils; @@ -3,6 +3,7 @@ package com.bsth.service.schedule.utils;
3 import org.springframework.web.multipart.MultipartFile; 3 import org.springframework.web.multipart.MultipartFile;
4 4
5 import java.io.File; 5 import java.io.File;
  6 +import java.util.Map;
6 7
7 /** 8 /**
8 * 数据导入导出服务。 9 * 数据导入导出服务。
@@ -32,4 +33,7 @@ public interface DataImportExportService { @@ -32,4 +33,7 @@ public interface DataImportExportService {
32 * @throws Exception 33 * @throws Exception
33 */ 34 */
34 File fileDataOutput(String fileName, File ktrFile) throws Exception; 35 File fileDataOutput(String fileName, File ktrFile) throws Exception;
  36 +
  37 +
  38 + File fileDataOutput(String fileName, File ktrFile, Map<String, Object> param) throws Exception;
35 } 39 }
src/main/java/com/bsth/service/schedule/utils/DataImportExportServiceImpl.java
@@ -10,6 +10,7 @@ import org.springframework.beans.factory.InitializingBean; @@ -10,6 +10,7 @@ import org.springframework.beans.factory.InitializingBean;
10 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.boot.context.properties.EnableConfigurationProperties; 11 import org.springframework.boot.context.properties.EnableConfigurationProperties;
12 import org.springframework.stereotype.Service; 12 import org.springframework.stereotype.Service;
  13 +import org.springframework.util.CollectionUtils;
13 import org.springframework.web.multipart.MultipartFile; 14 import org.springframework.web.multipart.MultipartFile;
14 15
15 import java.io.File; 16 import java.io.File;
@@ -111,6 +112,11 @@ public class DataImportExportServiceImpl implements DataImportExportService, Ini @@ -111,6 +112,11 @@ public class DataImportExportServiceImpl implements DataImportExportService, Ini
111 112
112 @Override 113 @Override
113 public File fileDataOutput(String fileName, File ktrFile) throws Exception { 114 public File fileDataOutput(String fileName, File ktrFile) throws Exception {
  115 + return fileDataOutput(fileName, ktrFile, null);
  116 + }
  117 +
  118 + @Override
  119 + public File fileDataOutput(String fileName, File ktrFile, Map<String, Object> param) throws Exception {
114 // 初始化转换,元数据,转换对象 120 // 初始化转换,元数据,转换对象
115 TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath()); 121 TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath());
116 Trans trans = new Trans(transMeta); 122 Trans trans = new Trans(transMeta);
@@ -120,6 +126,14 @@ public class DataImportExportServiceImpl implements DataImportExportService, Ini @@ -120,6 +126,14 @@ public class DataImportExportServiceImpl implements DataImportExportService, Ini
120 fileName + 126 fileName +
121 new DateTime().toString("yyyyMMddHHmmss") + ".xls"; 127 new DateTime().toString("yyyyMMddHHmmss") + ".xls";
122 trans.setParameterValue("filepath", filepath); 128 trans.setParameterValue("filepath", filepath);
  129 +
  130 + // 添加其他参数
  131 + if (!CollectionUtils.isEmpty(param)) {
  132 + for (String key : param.keySet()) {
  133 + trans.setParameterValue(key, String.valueOf(param.get(key)));
  134 + }
  135 + }
  136 +
123 // 执行转换 137 // 执行转换
124 trans.execute(null); 138 trans.execute(null);
125 // 等待转换结束 139 // 等待转换结束
src/main/java/com/bsth/service/schedule/utils/DataToolsProperties.java
@@ -83,6 +83,10 @@ public class DataToolsProperties { @@ -83,6 +83,10 @@ public class DataToolsProperties {
83 /** 人员信息导出ktr转换 */ 83 /** 人员信息导出ktr转换 */
84 @NotNull 84 @NotNull
85 private String employeesDataoutputktr; 85 private String employeesDataoutputktr;
  86 + /** 时刻表导出元数据ktr转换 */
  87 + private String ttinfodetailMetaoutput;
  88 + /** 时刻表导出数据ktr转换 */
  89 + private String ttinfodetailOutput;
86 90
87 // TODO: 91 // TODO:
88 92
@@ -253,4 +257,20 @@ public class DataToolsProperties { @@ -253,4 +257,20 @@ public class DataToolsProperties {
253 public void setKvarsDbdname(String kvarsDbdname) { 257 public void setKvarsDbdname(String kvarsDbdname) {
254 this.kvarsDbdname = kvarsDbdname; 258 this.kvarsDbdname = kvarsDbdname;
255 } 259 }
  260 +
  261 + public String getTtinfodetailMetaoutput() {
  262 + return ttinfodetailMetaoutput;
  263 + }
  264 +
  265 + public void setTtinfodetailMetaoutput(String ttinfodetailMetaoutput) {
  266 + this.ttinfodetailMetaoutput = ttinfodetailMetaoutput;
  267 + }
  268 +
  269 + public String getTtinfodetailOutput() {
  270 + return ttinfodetailOutput;
  271 + }
  272 +
  273 + public void setTtinfodetailOutput(String ttinfodetailOutput) {
  274 + this.ttinfodetailOutput = ttinfodetailOutput;
  275 + }
256 } 276 }
src/main/java/com/bsth/util/Geo/SHCJ2BDJW.java
@@ -25,9 +25,11 @@ public class SHCJ2BDJW { @@ -25,9 +25,11 @@ public class SHCJ2BDJW {
25 25
26 ResultSet rs = null; 26 ResultSet rs = null;
27 27
28 - String sqlSelect = "SELECT b.SHAPESTRING as SHAPE , b.id as ID FROM jjwgps_t_gjldb b where SHAPESTRING is not null order by b.ldbh asc "; 28 + /*String sqlSelect = "SELECT b.SHAPESTRING as SHAPE , b.id as ID FROM jjwgps_t_gjldb b where SHAPESTRING is not null order by b.ldbh asc ";*/
  29 + /*String sqlSelect = "select s.id,s.descriptions from bsth_c_station s order by s.id asc ";*/
  30 + String sqlSelect = "SELECT s.id,s.descriptions FROM bsth_c_section s order by s.id asc ";
29 31
30 - String sqlUpdate = "UPDATE jjwgps_t_gjldb SET bdjw = GeomFromText(?),SHAPE = GeomFromText(?) where id = ?"; 32 + String sqlUpdate = "UPDATE bsth_c_section SET csection_vector = ST_GeomFromText(?) , bsection_vector=ST_GeomFromText(?) , gsection_vector=ST_GeomFromText(?) where id = ?";
31 33
32 List<Map<String, Object>> list = new ArrayList<>(); 34 List<Map<String, Object>> list = new ArrayList<>();
33 35
@@ -42,9 +44,9 @@ public class SHCJ2BDJW { @@ -42,9 +44,9 @@ public class SHCJ2BDJW {
42 44
43 Map<String, Object> map = new HashMap<String, Object>(); 45 Map<String, Object> map = new HashMap<String, Object>();
44 46
45 - map.put("shape", rs.getString("SHAPE")); 47 + map.put("descriptions", rs.getString("descriptions"));
46 48
47 - map.put("id", rs.getInt("ID")); 49 + map.put("id", rs.getInt("id"));
48 50
49 list.add(map); 51 list.add(map);
50 } 52 }
@@ -52,15 +54,29 @@ public class SHCJ2BDJW { @@ -52,15 +54,29 @@ public class SHCJ2BDJW {
52 for(int i =0;i<list.size();i++) { 54 for(int i =0;i<list.size();i++) {
53 55
54 Map<String, Object> temp = list.get(i); 56 Map<String, Object> temp = list.get(i);
55 -  
56 - String lineString = temp.get("shape").toString();  
57 - /*String lineString = "LINESTRING (13532.5305161702 -3677.63275264995, 13433.22401617 -3881.74765264988)";*/  
58 - 57 + // POINT (8229.30921617 -933.16425265)
  58 + String lineString = temp.get("descriptions").toString();
  59 + int id = Integer.parseInt(temp.get("id").toString());
59 60
60 String arrayP[] = lineString.substring(lineString.indexOf("(")+1, lineString.length()-1).split(", "); 61 String arrayP[] = lineString.substring(lineString.indexOf("(")+1, lineString.length()-1).split(", ");
61 -  
62 - int id = Integer.parseInt(temp.get("id").toString());  
63 - String geometry = ""; 62 + /*String arrayP[] = lineString.substring(lineString.indexOf("(")+1, lineString.length()-1).split(" ");
  63 + String b_jwpoints = "";
  64 + Float g_lonx=0.0f,g_laty=0.0f,x=0.0f,y=0.0f;*/
  65 +
  66 + /*Double lng = Double.parseDouble(arrayP[0]);
  67 + Double lat = Double.parseDouble(arrayP[1]);
  68 + x = Float.parseFloat(arrayP[0]);
  69 + y = Float.parseFloat(arrayP[1]);
  70 + // WGS84
  71 + Map map_2 = JWDUtil.ConvertSHToJW(lng,lat);
  72 + g_lonx = Float.parseFloat(map_2.get("x").toString());
  73 + g_laty = Float.parseFloat(map_2.get("y").toString());
  74 + Location location = TransGPS.LocationMake(Float.parseFloat(map_2.get("x").toString()), Float.parseFloat(map_2.get("y").toString()));
  75 + location = TransGPS.bd_encrypt(TransGPS.transformFromWGSToGCJ(location));
  76 + b_jwpoints = (location.getLng()+0.000727) + " " + (location.getLat() - 0.0000624);*/
  77 + //b_jwpoints = (location.getLng()) + " " + (location.getLat());
  78 +
  79 + String csection_vector="",bsection_vector="",gsection_vector="";
64 80
65 for(int k =0;k<arrayP.length;k++) { 81 for(int k =0;k<arrayP.length;k++) {
66 82
@@ -76,28 +92,42 @@ public class SHCJ2BDJW { @@ -76,28 +92,42 @@ public class SHCJ2BDJW {
76 92
77 location = TransGPS.bd_encrypt(TransGPS.transformFromWGSToGCJ(location)); 93 location = TransGPS.bd_encrypt(TransGPS.transformFromWGSToGCJ(location));
78 94
79 - if(k==arrayP.length-1)  
80 - geometry = geometry + (location.getLng()+0.000727) + " " + (location.getLat() - 0.0000624);  
81 - else  
82 - geometry = geometry + (location.getLng()+0.000727) + " " + (location.getLat() - 0.0000624) + ","; 95 + if(k==arrayP.length-1) {
  96 + bsection_vector = bsection_vector + (location.getLng()+0.000727) + " " + (location.getLat() - 0.0000624);
  97 + csection_vector = csection_vector + arrayXY[0] + " " + arrayXY[1];
  98 + gsection_vector = gsection_vector + map_2.get("x").toString() + " " + map_2.get("y").toString();
  99 + }else {
  100 + bsection_vector = bsection_vector + (location.getLng()+0.000727) + " " + (location.getLat() - 0.0000624) + ",";
  101 + csection_vector = csection_vector + arrayXY[0] + " " + arrayXY[1] +",";
  102 + gsection_vector = gsection_vector + map_2.get("x").toString() + " " + map_2.get("y").toString()+",";
  103 + }
83 104
84 105
85 } 106 }
86 107
87 ps = null; 108 ps = null;
88 -  
89 - geometry = "LINESTRING(" + geometry +")"; 109 + bsection_vector = "LINESTRING(" + bsection_vector +")";
  110 + csection_vector = "LINESTRING(" + csection_vector +")";
  111 + gsection_vector = "LINESTRING(" + gsection_vector +")";
90 112
91 ps = conn.prepareStatement(sqlUpdate); 113 ps = conn.prepareStatement(sqlUpdate);
92 114
93 - ps.setString(1, geometry);  
94 -  
95 - ps.setString(2, lineString);  
96 -  
97 - ps.setInt(3, id);  
98 - 115 + // String sqlUpdate = "UPDATE bsth_c_section SET csection_vector = ? , bsection_vector=? , gsection_vector=? where id = ?";
  116 + ps.setString(1, csection_vector);
  117 + ps.setString(2, bsection_vector);
  118 + ps.setString(3, gsection_vector);
  119 + ps.setInt(4, id);
  120 +
  121 + //int stauts = ps.executeUpdate();
  122 + // String sqlUpdate = "UPDATE bsth_c_station SET b_jwpoints = ?1 , g_lonx=?2 , g_laty=?3 , x = ?4 , y = ?5 where id = ?6";
  123 + /*ps.setString(1, b_jwpoints);
  124 + ps.setFloat(2, g_lonx);
  125 + ps.setFloat(3, g_laty);
  126 + ps.setFloat(4, x);
  127 + ps.setFloat(5, y);
  128 + ps.setFloat(6, id);*/
99 int stauts = ps.executeUpdate(); 129 int stauts = ps.executeUpdate();
100 - 130 + System.out.println(stauts);
101 } 131 }
102 132
103 } catch (SQLException e) { 133 } catch (SQLException e) {
src/main/resources/datatools/config-dev.properties
@@ -48,13 +48,19 @@ datatools.employeesconfig_datainputktr=/datatools/ktrs/employeesConfigDataInput. @@ -48,13 +48,19 @@ datatools.employeesconfig_datainputktr=/datatools/ktrs/employeesConfigDataInput.
48 48
49 # 4、数据导出配置信息 49 # 4、数据导出配置信息
50 # 导出数据文件目录配置(根据不同的环境需要修正) 50 # 导出数据文件目录配置(根据不同的环境需要修正)
51 -datatools.fileoutput_dir=/Users/xu/resource/project/bsth_control_u_d_files 51 +datatools.fileoutput_dir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files
52 52
53 ##---------------------------- 导出数据ktr -----------------------------## 53 ##---------------------------- 导出数据ktr -----------------------------##
54 # 车辆信息导出ktr转换 54 # 车辆信息导出ktr转换
55 datatools.cars_dataoutputktr=/datatools/ktrs/carsDataOutput.ktr 55 datatools.cars_dataoutputktr=/datatools/ktrs/carsDataOutput.ktr
56 # 人员信息导出ktr转换 56 # 人员信息导出ktr转换
57 datatools.employees_dataoutputktr=/datatools/ktrs/employeesDataOutput.ktr 57 datatools.employees_dataoutputktr=/datatools/ktrs/employeesDataOutput.ktr
  58 +# 时刻表导出元数据ktr转换
  59 +datatools.ttinfodetail_metaoutput=/datatools/ktrs/ttinfodetailDataOutputMetaData.ktr
  60 +# 时刻表导出数据ktr转换
  61 +datatools.ttinfodetail_output=/datatools/ktrs/ttinfodetailDataOutput.ktr
  62 +
  63 +
58 64
59 # TODO: 65 # TODO:
60 66
src/main/resources/datatools/config-prod.properties
@@ -56,5 +56,9 @@ datatools.fileoutput_dir=/opt/bsth_control_u_d_files @@ -56,5 +56,9 @@ datatools.fileoutput_dir=/opt/bsth_control_u_d_files
56 datatools.cars_dataoutputktr=/datatools/ktrs/carsDataOutput.ktr 56 datatools.cars_dataoutputktr=/datatools/ktrs/carsDataOutput.ktr
57 # 人员信息导出ktr转换 57 # 人员信息导出ktr转换
58 datatools.employees_dataoutputktr=/datatools/ktrs/employeesDataOutput.ktr 58 datatools.employees_dataoutputktr=/datatools/ktrs/employeesDataOutput.ktr
  59 +# 时刻表导出元数据ktr转换
  60 +datatools.ttinfodetail_metaoutput=/datatools/ktrs/ttinfodetailDataOutputMetaData.ktr
  61 +# 时刻表导出数据ktr转换
  62 +datatools.ttinfodetail_output=/datatools/ktrs/ttinfodetailDataOutput.ktr
59 63
60 # TODO: 64 # TODO:
61 \ No newline at end of file 65 \ No newline at end of file
src/main/resources/datatools/ktrs/ttinfodetailDataOutput.ktr 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<transformation>
  3 + <info>
  4 + <name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x5bfc;&#x51fa;</name>
  5 + <description/>
  6 + <extended_description/>
  7 + <trans_version/>
  8 + <trans_type>Normal</trans_type>
  9 + <trans_status>0</trans_status>
  10 + <directory>&#x2f;</directory>
  11 + <parameters>
  12 + </parameters>
  13 + <log>
  14 +<trans-log-table><connection/>
  15 +<schema/>
  16 +<table/>
  17 +<size_limit_lines/>
  18 +<interval/>
  19 +<timeout_days/>
  20 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STATUS</id><enabled>Y</enabled><name>STATUS</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name><subject/></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name><subject/></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name><subject/></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name><subject/></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name><subject/></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name><subject/></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>STARTDATE</id><enabled>Y</enabled><name>STARTDATE</name></field><field><id>ENDDATE</id><enabled>Y</enabled><name>ENDDATE</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>DEPDATE</id><enabled>Y</enabled><name>DEPDATE</name></field><field><id>REPLAYDATE</id><enabled>Y</enabled><name>REPLAYDATE</name></field><field><id>LOG_FIELD</id><enabled>Y</enabled><name>LOG_FIELD</name></field><field><id>EXECUTING_SERVER</id><enabled>N</enabled><name>EXECUTING_SERVER</name></field><field><id>EXECUTING_USER</id><enabled>N</enabled><name>EXECUTING_USER</name></field><field><id>CLIENT</id><enabled>N</enabled><name>CLIENT</name></field></trans-log-table>
  21 +<perf-log-table><connection/>
  22 +<schema/>
  23 +<table/>
  24 +<interval/>
  25 +<timeout_days/>
  26 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>SEQ_NR</id><enabled>Y</enabled><name>SEQ_NR</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>INPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>INPUT_BUFFER_ROWS</name></field><field><id>OUTPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>OUTPUT_BUFFER_ROWS</name></field></perf-log-table>
  27 +<channel-log-table><connection/>
  28 +<schema/>
  29 +<table/>
  30 +<timeout_days/>
  31 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>LOGGING_OBJECT_TYPE</id><enabled>Y</enabled><name>LOGGING_OBJECT_TYPE</name></field><field><id>OBJECT_NAME</id><enabled>Y</enabled><name>OBJECT_NAME</name></field><field><id>OBJECT_COPY</id><enabled>Y</enabled><name>OBJECT_COPY</name></field><field><id>REPOSITORY_DIRECTORY</id><enabled>Y</enabled><name>REPOSITORY_DIRECTORY</name></field><field><id>FILENAME</id><enabled>Y</enabled><name>FILENAME</name></field><field><id>OBJECT_ID</id><enabled>Y</enabled><name>OBJECT_ID</name></field><field><id>OBJECT_REVISION</id><enabled>Y</enabled><name>OBJECT_REVISION</name></field><field><id>PARENT_CHANNEL_ID</id><enabled>Y</enabled><name>PARENT_CHANNEL_ID</name></field><field><id>ROOT_CHANNEL_ID</id><enabled>Y</enabled><name>ROOT_CHANNEL_ID</name></field></channel-log-table>
  32 +<step-log-table><connection/>
  33 +<schema/>
  34 +<table/>
  35 +<timeout_days/>
  36 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>LOG_FIELD</id><enabled>N</enabled><name>LOG_FIELD</name></field></step-log-table>
  37 +<metrics-log-table><connection/>
  38 +<schema/>
  39 +<table/>
  40 +<timeout_days/>
  41 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>METRICS_DATE</id><enabled>Y</enabled><name>METRICS_DATE</name></field><field><id>METRICS_CODE</id><enabled>Y</enabled><name>METRICS_CODE</name></field><field><id>METRICS_DESCRIPTION</id><enabled>Y</enabled><name>METRICS_DESCRIPTION</name></field><field><id>METRICS_SUBJECT</id><enabled>Y</enabled><name>METRICS_SUBJECT</name></field><field><id>METRICS_TYPE</id><enabled>Y</enabled><name>METRICS_TYPE</name></field><field><id>METRICS_VALUE</id><enabled>Y</enabled><name>METRICS_VALUE</name></field></metrics-log-table>
  42 + </log>
  43 + <maxdate>
  44 + <connection/>
  45 + <table/>
  46 + <field/>
  47 + <offset>0.0</offset>
  48 + <maxdiff>0.0</maxdiff>
  49 + </maxdate>
  50 + <size_rowset>10000</size_rowset>
  51 + <sleep_time_empty>50</sleep_time_empty>
  52 + <sleep_time_full>50</sleep_time_full>
  53 + <unique_connections>N</unique_connections>
  54 + <feedback_shown>Y</feedback_shown>
  55 + <feedback_size>50000</feedback_size>
  56 + <using_thread_priorities>Y</using_thread_priorities>
  57 + <shared_objects_file/>
  58 + <capture_step_performance>N</capture_step_performance>
  59 + <step_performance_capturing_delay>1000</step_performance_capturing_delay>
  60 + <step_performance_capturing_size_limit>100</step_performance_capturing_size_limit>
  61 + <dependencies>
  62 + </dependencies>
  63 + <partitionschemas>
  64 + </partitionschemas>
  65 + <slaveservers>
  66 + </slaveservers>
  67 + <clusterschemas>
  68 + </clusterschemas>
  69 + <created_user>-</created_user>
  70 + <created_date>2016&#x2f;11&#x2f;15 13&#x3a;00&#x3a;52.076</created_date>
  71 + <modified_user>-</modified_user>
  72 + <modified_date>2016&#x2f;11&#x2f;15 13&#x3a;00&#x3a;52.076</modified_date>
  73 + <key_for_session_key>H4sIAAAAAAAAAAMAAAAAAAAAAAA&#x3d;</key_for_session_key>
  74 + <is_key_private>N</is_key_private>
  75 + </info>
  76 + <notepads>
  77 + </notepads>
  78 + <connection>
  79 + <name>bus_control_variable</name>
  80 + <server>&#x24;&#x7b;v_db_ip&#x7d;</server>
  81 + <type>MYSQL</type>
  82 + <access>Native</access>
  83 + <database>&#x24;&#x7b;v_db_dname&#x7d;</database>
  84 + <port>3306</port>
  85 + <username>&#x24;&#x7b;v_db_uname&#x7d;</username>
  86 + <password>&#x24;&#x7b;v_db_pwd&#x7d;</password>
  87 + <servername/>
  88 + <data_tablespace/>
  89 + <index_tablespace/>
  90 + <attributes>
  91 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  92 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  93 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  94 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  95 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  96 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  97 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  98 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  99 + <attribute><code>STREAM_RESULTS</code><attribute>N</attribute></attribute>
  100 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  101 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  102 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  103 + </attributes>
  104 + </connection>
  105 + <connection>
  106 + <name>bus_control_&#x516c;&#x53f8;_201</name>
  107 + <server>localhost</server>
  108 + <type>MYSQL</type>
  109 + <access>Native</access>
  110 + <database>control</database>
  111 + <port>3306</port>
  112 + <username>root</username>
  113 + <password>Encrypted </password>
  114 + <servername/>
  115 + <data_tablespace/>
  116 + <index_tablespace/>
  117 + <attributes>
  118 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  119 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  120 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  121 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  122 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  123 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  124 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  125 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  126 + <attribute><code>STREAM_RESULTS</code><attribute>N</attribute></attribute>
  127 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  128 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  129 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  130 + </attributes>
  131 + </connection>
  132 + <connection>
  133 + <name>bus_control_&#x672c;&#x673a;</name>
  134 + <server>localhost</server>
  135 + <type>MYSQL</type>
  136 + <access>Native</access>
  137 + <database>control</database>
  138 + <port>3306</port>
  139 + <username>root</username>
  140 + <password>Encrypted </password>
  141 + <servername/>
  142 + <data_tablespace/>
  143 + <index_tablespace/>
  144 + <attributes>
  145 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  146 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  147 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  148 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  149 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  150 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  151 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  152 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  153 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  154 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  155 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  156 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  157 + </attributes>
  158 + </connection>
  159 + <connection>
  160 + <name>xlab_mysql_youle</name>
  161 + <server>101.231.124.8</server>
  162 + <type>MYSQL</type>
  163 + <access>Native</access>
  164 + <database>xlab_youle</database>
  165 + <port>45687</port>
  166 + <username>xlab-youle</username>
  167 + <password>Encrypted 2be98afc86aa78a88aa1be369d187a3df</password>
  168 + <servername/>
  169 + <data_tablespace/>
  170 + <index_tablespace/>
  171 + <attributes>
  172 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  173 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  174 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  175 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  176 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  177 + <attribute><code>PORT_NUMBER</code><attribute>45687</attribute></attribute>
  178 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  179 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  180 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  181 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  182 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  183 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  184 + </attributes>
  185 + </connection>
  186 + <connection>
  187 + <name>xlab_mysql_youle&#xff08;&#x672c;&#x673a;&#xff09;</name>
  188 + <server>localhost</server>
  189 + <type>MYSQL</type>
  190 + <access>Native</access>
  191 + <database>xlab_youle</database>
  192 + <port>3306</port>
  193 + <username>root</username>
  194 + <password>Encrypted </password>
  195 + <servername/>
  196 + <data_tablespace/>
  197 + <index_tablespace/>
  198 + <attributes>
  199 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  200 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  201 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  202 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  203 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  204 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  205 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  206 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  207 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  208 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  209 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  210 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  211 + </attributes>
  212 + </connection>
  213 + <connection>
  214 + <name>xlab_youle</name>
  215 + <server/>
  216 + <type>MYSQL</type>
  217 + <access>JNDI</access>
  218 + <database>xlab_youle</database>
  219 + <port>1521</port>
  220 + <username/>
  221 + <password>Encrypted </password>
  222 + <servername/>
  223 + <data_tablespace/>
  224 + <index_tablespace/>
  225 + <attributes>
  226 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  227 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  228 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  229 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  230 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  231 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  232 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  233 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  234 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  235 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  236 + </attributes>
  237 + </connection>
  238 + <order>
  239 + <hop> <from>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</from><to>&#x5217;&#x8f6c;&#x884c;</to><enabled>Y</enabled> </hop>
  240 + <hop> <from>&#x5217;&#x8f6c;&#x884c;</from><to>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</to><enabled>Y</enabled> </hop>
  241 + <hop> <from>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</from><to>Excel&#x8f93;&#x51fa;</to><enabled>Y</enabled> </hop>
  242 + <hop> <from>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x6570;&#x636e;&#x8868;</from><to>&#x8def;&#x724c;&#x540d;&#x5b57;&#x67e5;&#x627e;</to><enabled>Y</enabled> </hop>
  243 + <hop> <from>&#x8def;&#x724c;&#x540d;&#x5b57;&#x67e5;&#x627e;</from><to>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</to><enabled>Y</enabled> </hop>
  244 + </order>
  245 + <step>
  246 + <name>&#x5217;&#x8f6c;&#x884c;</name>
  247 + <type>Denormaliser</type>
  248 + <description/>
  249 + <distribute>Y</distribute>
  250 + <custom_distribution/>
  251 + <copies>1</copies>
  252 + <partitioning>
  253 + <method>none</method>
  254 + <schema_name/>
  255 + </partitioning>
  256 + <key_field>fcno</key_field>
  257 + <group>
  258 + <field>
  259 + <name>lp</name>
  260 + </field>
  261 + </group>
  262 + <fields>
  263 + <field>
  264 + <field_name>fcsj</field_name>
  265 + <key_value>1</key_value>
  266 + <target_name>&#x51fa;&#x573a;1</target_name>
  267 + <target_type>String</target_type>
  268 + <target_format/>
  269 + <target_length>-1</target_length>
  270 + <target_precision>-1</target_precision>
  271 + <target_decimal_symbol/>
  272 + <target_grouping_symbol/>
  273 + <target_currency_symbol/>
  274 + <target_null_string/>
  275 + <target_aggregation_type>-</target_aggregation_type>
  276 + </field>
  277 + <field>
  278 + <field_name>fcsj</field_name>
  279 + <key_value>2</key_value>
  280 + <target_name>&#x9752;&#x5b89;&#x8def;&#x6c7d;&#x8f66;&#x7ad9;2</target_name>
  281 + <target_type>String</target_type>
  282 + <target_format/>
  283 + <target_length>-1</target_length>
  284 + <target_precision>-1</target_precision>
  285 + <target_decimal_symbol/>
  286 + <target_grouping_symbol/>
  287 + <target_currency_symbol/>
  288 + <target_null_string/>
  289 + <target_aggregation_type>-</target_aggregation_type>
  290 + </field>
  291 + <field>
  292 + <field_name>fcsj</field_name>
  293 + <key_value>3</key_value>
  294 + <target_name>&#x9752;&#x5b89;&#x8def;&#x6c7d;&#x8f66;&#x7ad9;3</target_name>
  295 + <target_type>String</target_type>
  296 + <target_format/>
  297 + <target_length>-1</target_length>
  298 + <target_precision>-1</target_precision>
  299 + <target_decimal_symbol/>
  300 + <target_grouping_symbol/>
  301 + <target_currency_symbol/>
  302 + <target_null_string/>
  303 + <target_aggregation_type>-</target_aggregation_type>
  304 + </field>
  305 + <field>
  306 + <field_name>fcsj</field_name>
  307 + <key_value>4</key_value>
  308 + <target_name>&#x9752;&#x5b89;&#x8def;&#x6c7d;&#x8f66;&#x7ad9;4</target_name>
  309 + <target_type>String</target_type>
  310 + <target_format/>
  311 + <target_length>-1</target_length>
  312 + <target_precision>-1</target_precision>
  313 + <target_decimal_symbol/>
  314 + <target_grouping_symbol/>
  315 + <target_currency_symbol/>
  316 + <target_null_string/>
  317 + <target_aggregation_type>-</target_aggregation_type>
  318 + </field>
  319 + <field>
  320 + <field_name>fcsj</field_name>
  321 + <key_value>5</key_value>
  322 + <target_name>&#x9752;&#x5b89;&#x8def;&#x6c7d;&#x8f66;&#x7ad9;5</target_name>
  323 + <target_type>String</target_type>
  324 + <target_format/>
  325 + <target_length>-1</target_length>
  326 + <target_precision>-1</target_precision>
  327 + <target_decimal_symbol/>
  328 + <target_grouping_symbol/>
  329 + <target_currency_symbol/>
  330 + <target_null_string/>
  331 + <target_aggregation_type>-</target_aggregation_type>
  332 + </field>
  333 + <field>
  334 + <field_name>fcsj</field_name>
  335 + <key_value>6</key_value>
  336 + <target_name>&#x9752;&#x5b89;&#x8def;&#x6c7d;&#x8f66;&#x7ad9;6</target_name>
  337 + <target_type>String</target_type>
  338 + <target_format/>
  339 + <target_length>-1</target_length>
  340 + <target_precision>-1</target_precision>
  341 + <target_decimal_symbol/>
  342 + <target_grouping_symbol/>
  343 + <target_currency_symbol/>
  344 + <target_null_string/>
  345 + <target_aggregation_type>-</target_aggregation_type>
  346 + </field>
  347 + <field>
  348 + <field_name>fcsj</field_name>
  349 + <key_value>7</key_value>
  350 + <target_name>&#x8fdb;&#x573a;7</target_name>
  351 + <target_type>String</target_type>
  352 + <target_format/>
  353 + <target_length>-1</target_length>
  354 + <target_precision>-1</target_precision>
  355 + <target_decimal_symbol/>
  356 + <target_grouping_symbol/>
  357 + <target_currency_symbol/>
  358 + <target_null_string/>
  359 + <target_aggregation_type>-</target_aggregation_type>
  360 + </field>
  361 + </fields>
  362 + <cluster_schema/>
  363 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  364 + <xloc>531</xloc>
  365 + <yloc>65</yloc>
  366 + <draw>Y</draw>
  367 + </GUI>
  368 + </step>
  369 +
  370 + <step>
  371 + <name>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</name>
  372 + <type>SortRows</type>
  373 + <description/>
  374 + <distribute>Y</distribute>
  375 + <custom_distribution/>
  376 + <copies>1</copies>
  377 + <partitioning>
  378 + <method>none</method>
  379 + <schema_name/>
  380 + </partitioning>
  381 + <directory>&#x25;&#x25;java.io.tmpdir&#x25;&#x25;</directory>
  382 + <prefix>out</prefix>
  383 + <sort_size>1000000</sort_size>
  384 + <free_memory/>
  385 + <compress>N</compress>
  386 + <compress_variable/>
  387 + <unique_rows>N</unique_rows>
  388 + <fields>
  389 + <field>
  390 + <name>lp</name>
  391 + <ascending>Y</ascending>
  392 + <case_sensitive>N</case_sensitive>
  393 + <presorted>N</presorted>
  394 + </field>
  395 + <field>
  396 + <name>fcno</name>
  397 + <ascending>Y</ascending>
  398 + <case_sensitive>N</case_sensitive>
  399 + <presorted>N</presorted>
  400 + </field>
  401 + </fields>
  402 + <cluster_schema/>
  403 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  404 + <xloc>331</xloc>
  405 + <yloc>65</yloc>
  406 + <draw>Y</draw>
  407 + </GUI>
  408 + </step>
  409 +
  410 + <step>
  411 + <name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x6570;&#x636e;&#x8868;</name>
  412 + <type>TableInput</type>
  413 + <description/>
  414 + <distribute>Y</distribute>
  415 + <custom_distribution/>
  416 + <copies>1</copies>
  417 + <partitioning>
  418 + <method>none</method>
  419 + <schema_name/>
  420 + </partitioning>
  421 + <connection>bus_control_variable</connection>
  422 + <sql>select &#x2a; from bsth_c_s_ttinfo_detail&#xa;where ttinfo &#x3d; &#x24;&#x7b;ttinfoid&#x7d;</sql>
  423 + <limit>0</limit>
  424 + <lookup/>
  425 + <execute_each_row>N</execute_each_row>
  426 + <variables_active>Y</variables_active>
  427 + <lazy_conversion_active>N</lazy_conversion_active>
  428 + <cluster_schema/>
  429 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  430 + <xloc>131</xloc>
  431 + <yloc>65</yloc>
  432 + <draw>Y</draw>
  433 + </GUI>
  434 + </step>
  435 +
  436 + <step>
  437 + <name>Excel&#x8f93;&#x51fa;</name>
  438 + <type>ExcelOutput</type>
  439 + <description/>
  440 + <distribute>Y</distribute>
  441 + <custom_distribution/>
  442 + <copies>1</copies>
  443 + <partitioning>
  444 + <method>none</method>
  445 + <schema_name/>
  446 + </partitioning>
  447 + <header>Y</header>
  448 + <footer>N</footer>
  449 + <encoding/>
  450 + <append>N</append>
  451 + <add_to_result_filenames>Y</add_to_result_filenames>
  452 + <file>
  453 + <name>&#x24;&#x7b;filepath&#x7d;</name>
  454 + <extention/>
  455 + <do_not_open_newfile_init>N</do_not_open_newfile_init>
  456 + <create_parent_folder>N</create_parent_folder>
  457 + <split>N</split>
  458 + <add_date>N</add_date>
  459 + <add_time>N</add_time>
  460 + <SpecifyFormat>N</SpecifyFormat>
  461 + <date_time_format/>
  462 + <sheetname>Sheet1</sheetname>
  463 + <autosizecolums>N</autosizecolums>
  464 + <nullisblank>N</nullisblank>
  465 + <protect_sheet>N</protect_sheet>
  466 + <password>Encrypted </password>
  467 + <splitevery>0</splitevery>
  468 + <usetempfiles>N</usetempfiles>
  469 + <tempdirectory/>
  470 + </file>
  471 + <template>
  472 + <enabled>N</enabled>
  473 + <append>N</append>
  474 + <filename>template.xls</filename>
  475 + </template>
  476 + <fields>
  477 + </fields>
  478 + <custom>
  479 + <header_font_name>arial</header_font_name>
  480 + <header_font_size>10</header_font_size>
  481 + <header_font_bold>N</header_font_bold>
  482 + <header_font_italic>N</header_font_italic>
  483 + <header_font_underline>no</header_font_underline>
  484 + <header_font_orientation>horizontal</header_font_orientation>
  485 + <header_font_color>black</header_font_color>
  486 + <header_background_color>none</header_background_color>
  487 + <header_row_height>255</header_row_height>
  488 + <header_alignment>left</header_alignment>
  489 + <header_image/>
  490 + <row_font_name>arial</row_font_name>
  491 + <row_font_size>10</row_font_size>
  492 + <row_font_color>black</row_font_color>
  493 + <row_background_color>none</row_background_color>
  494 + </custom>
  495 + <cluster_schema/>
  496 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  497 + <xloc>731</xloc>
  498 + <yloc>65</yloc>
  499 + <draw>Y</draw>
  500 + </GUI>
  501 + </step>
  502 +
  503 + <step>
  504 + <name>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</name>
  505 + <type>SelectValues</type>
  506 + <description/>
  507 + <distribute>Y</distribute>
  508 + <custom_distribution/>
  509 + <copies>1</copies>
  510 + <partitioning>
  511 + <method>none</method>
  512 + <schema_name/>
  513 + </partitioning>
  514 + <fields> <field> <name>lp_name</name>
  515 + <rename>&#x8def;&#x724c;</rename>
  516 + <length>-2</length>
  517 + <precision>-2</precision>
  518 + </field> <select_unspecified>Y</select_unspecified>
  519 + </fields> <cluster_schema/>
  520 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  521 + <xloc>534</xloc>
  522 + <yloc>243</yloc>
  523 + <draw>Y</draw>
  524 + </GUI>
  525 + </step>
  526 +
  527 + <step>
  528 + <name>&#x8def;&#x724c;&#x540d;&#x5b57;&#x67e5;&#x627e;</name>
  529 + <type>DBLookup</type>
  530 + <description/>
  531 + <distribute>Y</distribute>
  532 + <custom_distribution/>
  533 + <copies>1</copies>
  534 + <partitioning>
  535 + <method>none</method>
  536 + <schema_name/>
  537 + </partitioning>
  538 + <connection>bus_control_variable</connection>
  539 + <cache>N</cache>
  540 + <cache_load_all>N</cache_load_all>
  541 + <cache_size>0</cache_size>
  542 + <lookup>
  543 + <schema/>
  544 + <table>bsth_c_s_gbi</table>
  545 + <orderby/>
  546 + <fail_on_multiple>N</fail_on_multiple>
  547 + <eat_row_on_failure>N</eat_row_on_failure>
  548 + <key>
  549 + <name>lp</name>
  550 + <field>id</field>
  551 + <condition>&#x3d;</condition>
  552 + <name2/>
  553 + </key>
  554 + <value>
  555 + <name>lp_name</name>
  556 + <rename>lp_name</rename>
  557 + <default/>
  558 + <type>String</type>
  559 + </value>
  560 + </lookup>
  561 + <cluster_schema/>
  562 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  563 + <xloc>237</xloc>
  564 + <yloc>156</yloc>
  565 + <draw>Y</draw>
  566 + </GUI>
  567 + </step>
  568 +
  569 + <step_error_handling>
  570 + </step_error_handling>
  571 + <slave-step-copy-partition-distribution>
  572 +</slave-step-copy-partition-distribution>
  573 + <slave_transformation>N</slave_transformation>
  574 +
  575 +</transformation>
src/main/resources/datatools/ktrs/ttinfodetailDataOutputMetaData.ktr 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<transformation>
  3 + <info>
  4 + <name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x5bfc;&#x51fa;&#x5143;&#x6570;&#x636e;</name>
  5 + <description/>
  6 + <extended_description/>
  7 + <trans_version/>
  8 + <trans_type>Normal</trans_type>
  9 + <trans_status>0</trans_status>
  10 + <directory>&#x2f;</directory>
  11 + <parameters>
  12 + <parameter>
  13 + <name>filepath</name>
  14 + <default_value>&#x2f;Users&#x2f;xu&#x2f;resource&#x2f;project_code&#x2f;runtime_temp&#x2f;bsth_control_u_d_files&#x2f;ttinfodetail_test.xls</default_value>
  15 + <description>&#x65f6;&#x523b;&#x8868;excel&#x5bfc;&#x51fa;&#x6587;&#x4ef6;&#x8def;&#x5f84;&#x540d;</description>
  16 + </parameter>
  17 + <parameter>
  18 + <name>injectktrfile</name>
  19 + <default_value>&#x2f;Users&#x2f;xu&#x2f;resource&#x2f;project_code&#x2f;bsth_project&#x2f;bsth_control&#x2f;src&#x2f;main&#x2f;resources&#x2f;datatools&#x2f;ktrs&#x2f;ttinfodetailDataOutput.ktr</default_value>
  20 + <description>&#x6ce8;&#x5165;&#x5143;&#x6570;&#x636e;&#x7684;ktr&#x6587;&#x4ef6;</description>
  21 + </parameter>
  22 + <parameter>
  23 + <name>ttinfoid</name>
  24 + <default_value>56</default_value>
  25 + <description>&#x65f6;&#x523b;&#x8868;id</description>
  26 + </parameter>
  27 + </parameters>
  28 + <log>
  29 +<trans-log-table><connection/>
  30 +<schema/>
  31 +<table/>
  32 +<size_limit_lines/>
  33 +<interval/>
  34 +<timeout_days/>
  35 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STATUS</id><enabled>Y</enabled><name>STATUS</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name><subject/></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name><subject/></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name><subject/></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name><subject/></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name><subject/></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name><subject/></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>STARTDATE</id><enabled>Y</enabled><name>STARTDATE</name></field><field><id>ENDDATE</id><enabled>Y</enabled><name>ENDDATE</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>DEPDATE</id><enabled>Y</enabled><name>DEPDATE</name></field><field><id>REPLAYDATE</id><enabled>Y</enabled><name>REPLAYDATE</name></field><field><id>LOG_FIELD</id><enabled>Y</enabled><name>LOG_FIELD</name></field><field><id>EXECUTING_SERVER</id><enabled>N</enabled><name>EXECUTING_SERVER</name></field><field><id>EXECUTING_USER</id><enabled>N</enabled><name>EXECUTING_USER</name></field><field><id>CLIENT</id><enabled>N</enabled><name>CLIENT</name></field></trans-log-table>
  36 +<perf-log-table><connection/>
  37 +<schema/>
  38 +<table/>
  39 +<interval/>
  40 +<timeout_days/>
  41 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>SEQ_NR</id><enabled>Y</enabled><name>SEQ_NR</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>INPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>INPUT_BUFFER_ROWS</name></field><field><id>OUTPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>OUTPUT_BUFFER_ROWS</name></field></perf-log-table>
  42 +<channel-log-table><connection/>
  43 +<schema/>
  44 +<table/>
  45 +<timeout_days/>
  46 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>LOGGING_OBJECT_TYPE</id><enabled>Y</enabled><name>LOGGING_OBJECT_TYPE</name></field><field><id>OBJECT_NAME</id><enabled>Y</enabled><name>OBJECT_NAME</name></field><field><id>OBJECT_COPY</id><enabled>Y</enabled><name>OBJECT_COPY</name></field><field><id>REPOSITORY_DIRECTORY</id><enabled>Y</enabled><name>REPOSITORY_DIRECTORY</name></field><field><id>FILENAME</id><enabled>Y</enabled><name>FILENAME</name></field><field><id>OBJECT_ID</id><enabled>Y</enabled><name>OBJECT_ID</name></field><field><id>OBJECT_REVISION</id><enabled>Y</enabled><name>OBJECT_REVISION</name></field><field><id>PARENT_CHANNEL_ID</id><enabled>Y</enabled><name>PARENT_CHANNEL_ID</name></field><field><id>ROOT_CHANNEL_ID</id><enabled>Y</enabled><name>ROOT_CHANNEL_ID</name></field></channel-log-table>
  47 +<step-log-table><connection/>
  48 +<schema/>
  49 +<table/>
  50 +<timeout_days/>
  51 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>LOG_FIELD</id><enabled>N</enabled><name>LOG_FIELD</name></field></step-log-table>
  52 +<metrics-log-table><connection/>
  53 +<schema/>
  54 +<table/>
  55 +<timeout_days/>
  56 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>METRICS_DATE</id><enabled>Y</enabled><name>METRICS_DATE</name></field><field><id>METRICS_CODE</id><enabled>Y</enabled><name>METRICS_CODE</name></field><field><id>METRICS_DESCRIPTION</id><enabled>Y</enabled><name>METRICS_DESCRIPTION</name></field><field><id>METRICS_SUBJECT</id><enabled>Y</enabled><name>METRICS_SUBJECT</name></field><field><id>METRICS_TYPE</id><enabled>Y</enabled><name>METRICS_TYPE</name></field><field><id>METRICS_VALUE</id><enabled>Y</enabled><name>METRICS_VALUE</name></field></metrics-log-table>
  57 + </log>
  58 + <maxdate>
  59 + <connection/>
  60 + <table/>
  61 + <field/>
  62 + <offset>0.0</offset>
  63 + <maxdiff>0.0</maxdiff>
  64 + </maxdate>
  65 + <size_rowset>10000</size_rowset>
  66 + <sleep_time_empty>50</sleep_time_empty>
  67 + <sleep_time_full>50</sleep_time_full>
  68 + <unique_connections>N</unique_connections>
  69 + <feedback_shown>Y</feedback_shown>
  70 + <feedback_size>50000</feedback_size>
  71 + <using_thread_priorities>Y</using_thread_priorities>
  72 + <shared_objects_file/>
  73 + <capture_step_performance>N</capture_step_performance>
  74 + <step_performance_capturing_delay>1000</step_performance_capturing_delay>
  75 + <step_performance_capturing_size_limit>100</step_performance_capturing_size_limit>
  76 + <dependencies>
  77 + </dependencies>
  78 + <partitionschemas>
  79 + </partitionschemas>
  80 + <slaveservers>
  81 + </slaveservers>
  82 + <clusterschemas>
  83 + </clusterschemas>
  84 + <created_user>-</created_user>
  85 + <created_date>2016&#x2f;11&#x2f;15 15&#x3a;02&#x3a;41.624</created_date>
  86 + <modified_user>-</modified_user>
  87 + <modified_date>2016&#x2f;11&#x2f;15 15&#x3a;02&#x3a;41.624</modified_date>
  88 + <key_for_session_key>H4sIAAAAAAAAAAMAAAAAAAAAAAA&#x3d;</key_for_session_key>
  89 + <is_key_private>N</is_key_private>
  90 + </info>
  91 + <notepads>
  92 + </notepads>
  93 + <connection>
  94 + <name>bus_control_variable</name>
  95 + <server>&#x24;&#x7b;v_db_ip&#x7d;</server>
  96 + <type>MYSQL</type>
  97 + <access>Native</access>
  98 + <database>&#x24;&#x7b;v_db_dname&#x7d;</database>
  99 + <port>3306</port>
  100 + <username>&#x24;&#x7b;v_db_uname&#x7d;</username>
  101 + <password>&#x24;&#x7b;v_db_pwd&#x7d;</password>
  102 + <servername/>
  103 + <data_tablespace/>
  104 + <index_tablespace/>
  105 + <attributes>
  106 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  107 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  108 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  109 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  110 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  111 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  112 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  113 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  114 + <attribute><code>STREAM_RESULTS</code><attribute>N</attribute></attribute>
  115 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  116 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  117 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  118 + </attributes>
  119 + </connection>
  120 + <connection>
  121 + <name>bus_control_&#x516c;&#x53f8;_201</name>
  122 + <server>localhost</server>
  123 + <type>MYSQL</type>
  124 + <access>Native</access>
  125 + <database>control</database>
  126 + <port>3306</port>
  127 + <username>root</username>
  128 + <password>Encrypted </password>
  129 + <servername/>
  130 + <data_tablespace/>
  131 + <index_tablespace/>
  132 + <attributes>
  133 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  134 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  135 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  136 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  137 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  138 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  139 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  140 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  141 + <attribute><code>STREAM_RESULTS</code><attribute>N</attribute></attribute>
  142 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  143 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  144 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  145 + </attributes>
  146 + </connection>
  147 + <connection>
  148 + <name>bus_control_&#x672c;&#x673a;</name>
  149 + <server>localhost</server>
  150 + <type>MYSQL</type>
  151 + <access>Native</access>
  152 + <database>control</database>
  153 + <port>3306</port>
  154 + <username>root</username>
  155 + <password>Encrypted </password>
  156 + <servername/>
  157 + <data_tablespace/>
  158 + <index_tablespace/>
  159 + <attributes>
  160 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  161 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  162 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  163 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  164 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  165 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  166 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  167 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  168 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  169 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  170 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  171 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  172 + </attributes>
  173 + </connection>
  174 + <connection>
  175 + <name>xlab_mysql_youle</name>
  176 + <server>101.231.124.8</server>
  177 + <type>MYSQL</type>
  178 + <access>Native</access>
  179 + <database>xlab_youle</database>
  180 + <port>45687</port>
  181 + <username>xlab-youle</username>
  182 + <password>Encrypted 2be98afc86aa78a88aa1be369d187a3df</password>
  183 + <servername/>
  184 + <data_tablespace/>
  185 + <index_tablespace/>
  186 + <attributes>
  187 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  188 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  189 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  190 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  191 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  192 + <attribute><code>PORT_NUMBER</code><attribute>45687</attribute></attribute>
  193 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  194 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  195 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  196 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  197 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  198 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  199 + </attributes>
  200 + </connection>
  201 + <connection>
  202 + <name>xlab_mysql_youle&#xff08;&#x672c;&#x673a;&#xff09;</name>
  203 + <server>localhost</server>
  204 + <type>MYSQL</type>
  205 + <access>Native</access>
  206 + <database>xlab_youle</database>
  207 + <port>3306</port>
  208 + <username>root</username>
  209 + <password>Encrypted </password>
  210 + <servername/>
  211 + <data_tablespace/>
  212 + <index_tablespace/>
  213 + <attributes>
  214 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  215 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  216 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  217 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  218 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  219 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  220 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  221 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  222 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  223 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  224 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  225 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  226 + </attributes>
  227 + </connection>
  228 + <connection>
  229 + <name>xlab_youle</name>
  230 + <server/>
  231 + <type>MYSQL</type>
  232 + <access>JNDI</access>
  233 + <database>xlab_youle</database>
  234 + <port>1521</port>
  235 + <username/>
  236 + <password>Encrypted </password>
  237 + <servername/>
  238 + <data_tablespace/>
  239 + <index_tablespace/>
  240 + <attributes>
  241 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  242 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  243 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  244 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  245 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  246 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  247 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  248 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  249 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  250 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  251 + </attributes>
  252 + </connection>
  253 + <order>
  254 + <hop> <from>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x5206;&#x7ec4;&#x6570;&#x636e;</from><to>&#x8fc7;&#x6ee4;&#x8bb0;&#x5f55;</to><enabled>Y</enabled> </hop>
  255 + <hop> <from>&#x8fc7;&#x6ee4;&#x8bb0;&#x5f55;</from><to>&#x8ba1;&#x7b97;&#x7ad9;&#x70b9;</to><enabled>Y</enabled> </hop>
  256 + <hop> <from>&#x8ba1;&#x7b97;&#x7ad9;&#x70b9;</from><to>&#x67e5;&#x627e;&#x7ad9;&#x70b9;&#x540d;</to><enabled>Y</enabled> </hop>
  257 + <hop> <from>&#x67e5;&#x627e;&#x7ad9;&#x70b9;&#x540d;</from><to>&#x8ba1;&#x7b97;&#x53cd;&#x8303;&#x5f0f;&#x5143;&#x6570;&#x636e;</to><enabled>Y</enabled> </hop>
  258 + <hop> <from>&#x67e5;&#x627e;&#x7ad9;&#x70b9;&#x540d;</from><to>&#x8ba1;&#x7b97;excel&#x8f93;&#x51fa;&#x5b57;&#x6bb5;</to><enabled>Y</enabled> </hop>
  259 + <hop> <from>&#x8ba1;&#x7b97;excel&#x8f93;&#x51fa;&#x5b57;&#x6bb5;</from><to>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</to><enabled>Y</enabled> </hop>
  260 + <hop> <from>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</from><to>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</to><enabled>Y</enabled> </hop>
  261 + <hop> <from>&#x751f;&#x6210;&#x8def;&#x724c;&#x5b57;&#x6bb5;</from><to>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</to><enabled>Y</enabled> </hop>
  262 + <hop> <from>&#x8ba1;&#x7b97;&#x53cd;&#x8303;&#x5f0f;&#x5143;&#x6570;&#x636e;</from><to>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</to><enabled>Y</enabled> </hop>
  263 + <hop> <from>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</from><to>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</to><enabled>Y</enabled> </hop>
  264 + </order>
  265 + <step>
  266 + <name>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</name>
  267 + <type>MetaInject</type>
  268 + <description/>
  269 + <distribute>Y</distribute>
  270 + <custom_distribution/>
  271 + <copies>1</copies>
  272 + <partitioning>
  273 + <method>none</method>
  274 + <schema_name/>
  275 + </partitioning>
  276 + <specification_method>filename</specification_method>
  277 + <trans_object_id/>
  278 + <trans_name/>
  279 + <filename>&#x24;&#x7b;injectktrfile&#x7d;</filename>
  280 + <directory_path/>
  281 + <source_step/>
  282 + <source_output_fields> </source_output_fields> <target_file/>
  283 + <no_execution>N</no_execution>
  284 + <stream_source_step/>
  285 + <stream_target_step/>
  286 + <mappings> <mapping> <target_step_name>&#x5217;&#x8f6c;&#x884c;</target_step_name>
  287 + <target_attribute_key>TARGET_TYPE</target_attribute_key>
  288 + <target_detail>Y</target_detail>
  289 + <source_step>&#x8ba1;&#x7b97;&#x53cd;&#x8303;&#x5f0f;&#x5143;&#x6570;&#x636e;</source_step>
  290 + <source_field>targettype</source_field>
  291 + </mapping> <mapping> <target_step_name>Excel&#x8f93;&#x51fa;</target_step_name>
  292 + <target_attribute_key>TYPE</target_attribute_key>
  293 + <target_detail>Y</target_detail>
  294 + <source_step>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</source_step>
  295 + <source_field>fieldtype</source_field>
  296 + </mapping> <mapping> <target_step_name>&#x5217;&#x8f6c;&#x884c;</target_step_name>
  297 + <target_attribute_key>NAME</target_attribute_key>
  298 + <target_detail>Y</target_detail>
  299 + <source_step>&#x8ba1;&#x7b97;&#x53cd;&#x8303;&#x5f0f;&#x5143;&#x6570;&#x636e;</source_step>
  300 + <source_field>valuefieldname</source_field>
  301 + </mapping> <mapping> <target_step_name>Excel&#x8f93;&#x51fa;</target_step_name>
  302 + <target_attribute_key>NAME</target_attribute_key>
  303 + <target_detail>Y</target_detail>
  304 + <source_step>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</source_step>
  305 + <source_field>fieldname</source_field>
  306 + </mapping> <mapping> <target_step_name>&#x5217;&#x8f6c;&#x884c;</target_step_name>
  307 + <target_attribute_key>TARGET_NAME</target_attribute_key>
  308 + <target_detail>Y</target_detail>
  309 + <source_step>&#x8ba1;&#x7b97;&#x53cd;&#x8303;&#x5f0f;&#x5143;&#x6570;&#x636e;</source_step>
  310 + <source_field>targetfieldname</source_field>
  311 + </mapping> <mapping> <target_step_name>&#x5217;&#x8f6c;&#x884c;</target_step_name>
  312 + <target_attribute_key>KEY_VALUE</target_attribute_key>
  313 + <target_detail>Y</target_detail>
  314 + <source_step>&#x8ba1;&#x7b97;&#x53cd;&#x8303;&#x5f0f;&#x5143;&#x6570;&#x636e;</source_step>
  315 + <source_field>keyvalue</source_field>
  316 + </mapping> </mappings> <cluster_schema/>
  317 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  318 + <xloc>640</xloc>
  319 + <yloc>64</yloc>
  320 + <draw>Y</draw>
  321 + </GUI>
  322 + </step>
  323 +
  324 + <step>
  325 + <name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x5206;&#x7ec4;&#x6570;&#x636e;</name>
  326 + <type>TableInput</type>
  327 + <description/>
  328 + <distribute>Y</distribute>
  329 + <custom_distribution/>
  330 + <copies>1</copies>
  331 + <partitioning>
  332 + <method>none</method>
  333 + <schema_name/>
  334 + </partitioning>
  335 + <connection>bus_control_variable</connection>
  336 + <sql>select &#xa;fcno&#xa;, min&#x28;xl_dir&#x29; xl_dir&#xa;,min&#x28;qdz&#x29; qdz&#xa;,min&#x28;zdz&#x29; zdz&#xa;,bc_type &#xa;from bsth_c_s_ttinfo_detail&#xa;where ttinfo &#x3d; &#x24;&#x7b;ttinfoid&#x7d;&#xa;group by fcno,bc_type</sql>
  337 + <limit>0</limit>
  338 + <lookup/>
  339 + <execute_each_row>N</execute_each_row>
  340 + <variables_active>Y</variables_active>
  341 + <lazy_conversion_active>N</lazy_conversion_active>
  342 + <cluster_schema/>
  343 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  344 + <xloc>56</xloc>
  345 + <yloc>185</yloc>
  346 + <draw>Y</draw>
  347 + </GUI>
  348 + </step>
  349 +
  350 + <step>
  351 + <name>&#x8fc7;&#x6ee4;&#x8bb0;&#x5f55;</name>
  352 + <type>FilterRows</type>
  353 + <description/>
  354 + <distribute>Y</distribute>
  355 + <custom_distribution/>
  356 + <copies>1</copies>
  357 + <partitioning>
  358 + <method>none</method>
  359 + <schema_name/>
  360 + </partitioning>
  361 +<send_true_to/>
  362 +<send_false_to/>
  363 + <compare>
  364 +<condition>
  365 + <negated>N</negated>
  366 + <leftvalue>bc_type</leftvalue>
  367 + <function>IS NOT NULL</function>
  368 + <rightvalue/>
  369 + </condition>
  370 + </compare>
  371 + <cluster_schema/>
  372 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  373 + <xloc>182</xloc>
  374 + <yloc>189</yloc>
  375 + <draw>Y</draw>
  376 + </GUI>
  377 + </step>
  378 +
  379 + <step>
  380 + <name>&#x8ba1;&#x7b97;&#x7ad9;&#x70b9;</name>
  381 + <type>ScriptValueMod</type>
  382 + <description/>
  383 + <distribute>Y</distribute>
  384 + <custom_distribution/>
  385 + <copies>1</copies>
  386 + <partitioning>
  387 + <method>none</method>
  388 + <schema_name/>
  389 + </partitioning>
  390 + <compatible>N</compatible>
  391 + <optimizationLevel>9</optimizationLevel>
  392 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  393 + <jsScript_name>Script 1</jsScript_name>
  394 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;var zd&#x3b;&#xa;&#xa;if &#x28;bc_type &#x3d;&#x3d; &#x27;in&#x27;&#x29; &#x7b;&#xa; zd &#x3d; qdz&#x3b;&#xa;&#x7d; else if &#x28;bc_type &#x3d;&#x3d; &#x27;out&#x27;&#x29; &#x7b;&#xa; zd &#x3d; zdz&#x3b;&#xa;&#x7d; else if &#x28;bc_type &#x3d;&#x3d; &#x27;normal&#x27;&#x29; &#x7b;&#xa; zd &#x3d; qdz&#x3b;&#xa;&#x7d; else &#x7b;&#xa; zd &#x3d; qdz&#x3b;&#xa;&#x7d;&#xa;</jsScript_script>
  395 + </jsScript> </jsScripts> <fields> <field> <name>zd</name>
  396 + <rename>zd</rename>
  397 + <type>String</type>
  398 + <length>-1</length>
  399 + <precision>-1</precision>
  400 + <replace>N</replace>
  401 + </field> </fields> <cluster_schema/>
  402 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  403 + <xloc>300</xloc>
  404 + <yloc>190</yloc>
  405 + <draw>Y</draw>
  406 + </GUI>
  407 + </step>
  408 +
  409 + <step>
  410 + <name>&#x67e5;&#x627e;&#x7ad9;&#x70b9;&#x540d;</name>
  411 + <type>DBLookup</type>
  412 + <description/>
  413 + <distribute>N</distribute>
  414 + <custom_distribution/>
  415 + <copies>1</copies>
  416 + <partitioning>
  417 + <method>none</method>
  418 + <schema_name/>
  419 + </partitioning>
  420 + <connection>bus_control_variable</connection>
  421 + <cache>N</cache>
  422 + <cache_load_all>N</cache_load_all>
  423 + <cache_size>0</cache_size>
  424 + <lookup>
  425 + <schema/>
  426 + <table>bsth_c_stationroute</table>
  427 + <orderby/>
  428 + <fail_on_multiple>N</fail_on_multiple>
  429 + <eat_row_on_failure>N</eat_row_on_failure>
  430 + <key>
  431 + <name>zd</name>
  432 + <field>station</field>
  433 + <condition>&#x3d;</condition>
  434 + <name2/>
  435 + </key>
  436 + <key>
  437 + <name>xl_dir</name>
  438 + <field>directions</field>
  439 + <condition>&#x3d;</condition>
  440 + <name2/>
  441 + </key>
  442 + <value>
  443 + <name>station_name</name>
  444 + <rename>zdname</rename>
  445 + <default/>
  446 + <type>String</type>
  447 + </value>
  448 + </lookup>
  449 + <cluster_schema/>
  450 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  451 + <xloc>410</xloc>
  452 + <yloc>191</yloc>
  453 + <draw>Y</draw>
  454 + </GUI>
  455 + </step>
  456 +
  457 + <step>
  458 + <name>&#x8ba1;&#x7b97;&#x53cd;&#x8303;&#x5f0f;&#x5143;&#x6570;&#x636e;</name>
  459 + <type>ScriptValueMod</type>
  460 + <description/>
  461 + <distribute>Y</distribute>
  462 + <custom_distribution/>
  463 + <copies>1</copies>
  464 + <partitioning>
  465 + <method>none</method>
  466 + <schema_name/>
  467 + </partitioning>
  468 + <compatible>N</compatible>
  469 + <optimizationLevel>9</optimizationLevel>
  470 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  471 + <jsScript_name>Script 1</jsScript_name>
  472 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;var targetfieldname&#x3b; &#x2f;&#x2f; &#x76ee;&#x6807;&#x5b57;&#x6bb5;&#x540d;&#xa;var targettype&#x3b; &#x2f;&#x2f; &#x76ee;&#x6807;&#x7c7b;&#x578b;&#xa;var valuefieldname&#x3b; &#x2f;&#x2f; &#x503c;&#x5b57;&#x6bb5;&#x540d;&#xa;var keyvalue&#x3b; &#x2f;&#x2f; &#x5173;&#x952e;&#x5b57;&#x503c;&#xa;&#xa;if &#x28;bc_type &#x3d;&#x3d; &#x27;in&#x27;&#x29; &#x7b;&#xa; targetfieldname &#x3d; &#x27;&#x8fdb;&#x573a;&#x27; &#x2b; fcno&#x3b;&#xa;&#x7d; else if &#x28;bc_type &#x3d;&#x3d; &#x27;out&#x27;&#x29; &#x7b;&#xa; targetfieldname &#x3d; &#x27;&#x51fa;&#x573a;&#x27; &#x2b; fcno&#x3b;&#xa;&#x7d; else if &#x28;bc_type &#x3d;&#x3d; &#x27;normal&#x27;&#x29; &#x7b;&#xa; targetfieldname &#x3d; zdname &#x2b; fcno&#x3b;&#xa;&#x7d; else &#x7b;&#xa; targetfieldname &#x3d; zdname &#x2b; fcno&#x3b;&#xa;&#x7d; &#xa;&#xa;targettype &#x3d; &#x27;String&#x27;&#x3b;&#xa;valuefieldname &#x3d; &#x27;fcsj&#x27;&#x3b;&#xa;keyvalue &#x3d; fcno&#x3b;&#xa;</jsScript_script>
  473 + </jsScript> </jsScripts> <fields> <field> <name>targetfieldname</name>
  474 + <rename>targetfieldname</rename>
  475 + <type>String</type>
  476 + <length>-1</length>
  477 + <precision>-1</precision>
  478 + <replace>N</replace>
  479 + </field> <field> <name>targettype</name>
  480 + <rename>targettype</rename>
  481 + <type>String</type>
  482 + <length>-1</length>
  483 + <precision>-1</precision>
  484 + <replace>N</replace>
  485 + </field> <field> <name>valuefieldname</name>
  486 + <rename>valuefieldname</rename>
  487 + <type>String</type>
  488 + <length>-1</length>
  489 + <precision>-1</precision>
  490 + <replace>N</replace>
  491 + </field> <field> <name>keyvalue</name>
  492 + <rename>keyvalue</rename>
  493 + <type>String</type>
  494 + <length>-1</length>
  495 + <precision>-1</precision>
  496 + <replace>N</replace>
  497 + </field> </fields> <cluster_schema/>
  498 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  499 + <xloc>410</xloc>
  500 + <yloc>64</yloc>
  501 + <draw>Y</draw>
  502 + </GUI>
  503 + </step>
  504 +
  505 + <step>
  506 + <name>&#x8ba1;&#x7b97;excel&#x8f93;&#x51fa;&#x5b57;&#x6bb5;</name>
  507 + <type>ScriptValueMod</type>
  508 + <description/>
  509 + <distribute>Y</distribute>
  510 + <custom_distribution/>
  511 + <copies>1</copies>
  512 + <partitioning>
  513 + <method>none</method>
  514 + <schema_name/>
  515 + </partitioning>
  516 + <compatible>N</compatible>
  517 + <optimizationLevel>9</optimizationLevel>
  518 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  519 + <jsScript_name>Script 1</jsScript_name>
  520 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;var fieldname&#x3b; &#x2f;&#x2f; &#x5b57;&#x6bb5;&#x540d;&#xa;var fieldtype&#x3b; &#x2f;&#x2f; &#x5b57;&#x6bb5;&#x7c7b;&#x578b;&#xa;&#xa;if &#x28;bc_type &#x3d;&#x3d; &#x27;in&#x27;&#x29; &#x7b;&#xa; fieldname &#x3d; &#x27;&#x8fdb;&#x573a;&#x27; &#x2b; fcno&#x3b;&#xa;&#x7d; else if &#x28;bc_type &#x3d;&#x3d; &#x27;out&#x27;&#x29; &#x7b;&#xa; fieldname &#x3d; &#x27;&#x51fa;&#x573a;&#x27; &#x2b; fcno&#x3b;&#xa;&#x7d; else if &#x28;bc_type &#x3d;&#x3d; &#x27;normal&#x27;&#x29; &#x7b;&#xa; fieldname &#x3d; zdname &#x2b; fcno&#x3b;&#xa;&#x7d; else &#x7b;&#xa; fieldname &#x3d; zdname &#x2b; fcno&#x3b;&#xa;&#x7d; &#xa;&#xa;fieldtype &#x3d; &#x27;String&#x27;&#x3b;&#xa;</jsScript_script>
  521 + </jsScript> </jsScripts> <fields> <field> <name>fieldname</name>
  522 + <rename>fieldname</rename>
  523 + <type>String</type>
  524 + <length>-1</length>
  525 + <precision>-1</precision>
  526 + <replace>N</replace>
  527 + </field> <field> <name>fieldtype</name>
  528 + <rename>fieldtype</rename>
  529 + <type>String</type>
  530 + <length>-1</length>
  531 + <precision>-1</precision>
  532 + <replace>N</replace>
  533 + </field> </fields> <cluster_schema/>
  534 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  535 + <xloc>410</xloc>
  536 + <yloc>326</yloc>
  537 + <draw>Y</draw>
  538 + </GUI>
  539 + </step>
  540 +
  541 + <step>
  542 + <name>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</name>
  543 + <type>SelectValues</type>
  544 + <description/>
  545 + <distribute>Y</distribute>
  546 + <custom_distribution/>
  547 + <copies>1</copies>
  548 + <partitioning>
  549 + <method>none</method>
  550 + <schema_name/>
  551 + </partitioning>
  552 + <fields> <field> <name>fieldname</name>
  553 + <rename/>
  554 + <length>-2</length>
  555 + <precision>-2</precision>
  556 + </field> <field> <name>fieldtype</name>
  557 + <rename/>
  558 + <length>-2</length>
  559 + <precision>-2</precision>
  560 + </field> <field> <name>fcno</name>
  561 + <rename/>
  562 + <length>-2</length>
  563 + <precision>-2</precision>
  564 + </field> <select_unspecified>N</select_unspecified>
  565 + </fields> <cluster_schema/>
  566 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  567 + <xloc>533</xloc>
  568 + <yloc>325</yloc>
  569 + <draw>Y</draw>
  570 + </GUI>
  571 + </step>
  572 +
  573 + <step>
  574 + <name>&#x751f;&#x6210;&#x8def;&#x724c;&#x5b57;&#x6bb5;</name>
  575 + <type>RowGenerator</type>
  576 + <description/>
  577 + <distribute>Y</distribute>
  578 + <custom_distribution/>
  579 + <copies>1</copies>
  580 + <partitioning>
  581 + <method>none</method>
  582 + <schema_name/>
  583 + </partitioning>
  584 + <fields>
  585 + <field>
  586 + <name>fieldname</name>
  587 + <type>String</type>
  588 + <format/>
  589 + <currency/>
  590 + <decimal/>
  591 + <group/>
  592 + <nullif>&#x8def;&#x724c;</nullif>
  593 + <length>-1</length>
  594 + <precision>-1</precision>
  595 + <set_empty_string>N</set_empty_string>
  596 + </field>
  597 + <field>
  598 + <name>fieldtype</name>
  599 + <type>String</type>
  600 + <format/>
  601 + <currency/>
  602 + <decimal/>
  603 + <group/>
  604 + <nullif>String</nullif>
  605 + <length>-1</length>
  606 + <precision>-1</precision>
  607 + <set_empty_string>N</set_empty_string>
  608 + </field>
  609 + <field>
  610 + <name>fcno</name>
  611 + <type>Integer</type>
  612 + <format/>
  613 + <currency/>
  614 + <decimal/>
  615 + <group/>
  616 + <nullif>0</nullif>
  617 + <length>-1</length>
  618 + <precision>-1</precision>
  619 + <set_empty_string>N</set_empty_string>
  620 + </field>
  621 + </fields>
  622 + <limit>1</limit>
  623 + <never_ending>N</never_ending>
  624 + <interval_in_ms>5000</interval_in_ms>
  625 + <row_time_field>now</row_time_field>
  626 + <last_time_field>FiveSecondsAgo</last_time_field>
  627 + <cluster_schema/>
  628 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  629 + <xloc>530</xloc>
  630 + <yloc>194</yloc>
  631 + <draw>Y</draw>
  632 + </GUI>
  633 + </step>
  634 +
  635 + <step>
  636 + <name>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</name>
  637 + <type>SortRows</type>
  638 + <description/>
  639 + <distribute>Y</distribute>
  640 + <custom_distribution/>
  641 + <copies>1</copies>
  642 + <partitioning>
  643 + <method>none</method>
  644 + <schema_name/>
  645 + </partitioning>
  646 + <directory>&#x25;&#x25;java.io.tmpdir&#x25;&#x25;</directory>
  647 + <prefix>out</prefix>
  648 + <sort_size>1000000</sort_size>
  649 + <free_memory/>
  650 + <compress>N</compress>
  651 + <compress_variable/>
  652 + <unique_rows>N</unique_rows>
  653 + <fields>
  654 + <field>
  655 + <name>fcno</name>
  656 + <ascending>Y</ascending>
  657 + <case_sensitive>N</case_sensitive>
  658 + <presorted>N</presorted>
  659 + </field>
  660 + </fields>
  661 + <cluster_schema/>
  662 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  663 + <xloc>642</xloc>
  664 + <yloc>325</yloc>
  665 + <draw>Y</draw>
  666 + </GUI>
  667 + </step>
  668 +
  669 + <step_error_handling>
  670 + </step_error_handling>
  671 + <slave-step-copy-partition-distribution>
  672 +</slave-step-copy-partition-distribution>
  673 + <slave_transformation>N</slave_transformation>
  674 +
  675 +</transformation>
src/main/resources/static/pages/base/carpark/js/carpark-positions-function.js
@@ -59,11 +59,11 @@ var PublicFunctions = function () { @@ -59,11 +59,11 @@ var PublicFunctions = function () {
59 59
60 var shapesV = ''; 60 var shapesV = '';
61 61
62 - if(r[0].carParkShapesType='d') { 62 + if(r[0].carParkShapesType=='d') {
63 63
64 shapesV = '多边形'; 64 shapesV = '多边形';
65 65
66 - }else if(r[0].carParkShapesType='r') { 66 + }else if(r[0].carParkShapesType=='r') {
67 67
68 shapesV = '圆形'; 68 shapesV = '圆形';
69 69
src/main/resources/static/pages/base/carpark/js/carpark-positions-map.js
@@ -326,7 +326,6 @@ var CarParkPWorldsBMap = function () { @@ -326,7 +326,6 @@ var CarParkPWorldsBMap = function () {
326 326
327 // 编辑图形 327 // 编辑图形
328 editShapes : function(stationShapesTypeV,mindex) { 328 editShapes : function(stationShapesTypeV,mindex) {
329 -  
330 // 关闭信息窗口 329 // 关闭信息窗口
331 marker.closeInfoWindow(); 330 marker.closeInfoWindow();
332 331
src/main/resources/static/pages/base/stationroute/js/stationroute-list-function.js
@@ -438,10 +438,10 @@ var PublicFunctions = function () { @@ -438,10 +438,10 @@ var PublicFunctions = function () {
438 // 刷行左边树 438 // 刷行左边树
439 PublicFunctions.resjtreeDate(Line.id,stationRouteDirections); 439 PublicFunctions.resjtreeDate(Line.id,stationRouteDirections);
440 440
441 - /** 查询上行路段信息 @param:<Line.id:线路Id;0:上行> @return:data:上行路段数据 */ 441 + /** 查询上行路段信息 @param:<Line.id:线路Id;0:上行> @return:data:路段数据 */
442 GetAjaxData.getSectionRouteInfo(Line.id,stationRouteDirections,function(data) { 442 GetAjaxData.getSectionRouteInfo(Line.id,stationRouteDirections,function(data) {
443 443
444 - /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:上行路段数据> */ 444 + /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
445 PublicFunctions.linePanlThree(Line.id,data,stationRouteDirections); 445 PublicFunctions.linePanlThree(Line.id,data,stationRouteDirections);
446 446
447 }); 447 });
@@ -594,8 +594,45 @@ var PublicFunctions = function () { @@ -594,8 +594,45 @@ var PublicFunctions = function () {
594 $('#descriptionsTextarea').val(Section.descriptions); 594 $('#descriptionsTextarea').val(Section.descriptions);
595 595
596 }, 596 },
  597 + //lineId,data,direction
  598 + treeSectionClick: function(lineId,data,direction){
  599 + /** 获取站点路由信息 @param:<Line.id:线路Id;0:上行> @return:<resultdata:站点路由数据> */
  600 + WorldsBMap.clearMarkAndOverlays();
  601 + // 编辑路段数据
  602 + for(var d= 0; d<data.length;d++){
  603 +
  604 + // 地图折线坐标点集合
  605 + var polylineArray = [];
  606 + // 获取路段折线坐标字符串
  607 + var sectionBsectionVectorStr = data[d].sectionBsectionVector;
  608 +
  609 + if(sectionBsectionVectorStr==null) {
  610 +
  611 + continue;
  612 +
  613 + }
  614 +
  615 + // 切割段折线坐标字符串
  616 + var tempStr = sectionBsectionVectorStr.substring(11,sectionBsectionVectorStr.length-1);
  617 +
  618 + // 分割折线坐标字符串
  619 + var lineArray = tempStr.split(',');
  620 +
  621 + for(var i = 0;i<lineArray.length;i++) {
  622 +
  623 + polylineArray.push(new BMap.Point(lineArray[i].split(' ')[0],lineArray[i].split(' ')[1]));
  624 +
  625 + }
  626 + var index = parseInt(polylineArray.length/2);
  627 + var center = polylineArray[index];
  628 + /** 在地图上画出线路走向 @param:<polylineArray:地图折线坐标点集合;resultdata:站点路由数据> */
  629 + WorldsBMap.drawingUpline(polylineArray,center);
  630 + /** 在地图上画点 @param:<point_center:中心坐标点> */
  631 + WorldsBMap.drawingUpStationPoint(center,data[d].name,d+1);
  632 + }
  633 + },
597 634
598 - /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:上行路段数据> */ 635 + /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
599 linePanlThree : function(lineId,data,direction) { 636 linePanlThree : function(lineId,data,direction) {
600 637
601 /** 获取站点路由信息 @param:<Line.id:线路Id;0:上行> @return:<resultdata:站点路由数据> */ 638 /** 获取站点路由信息 @param:<Line.id:线路Id;0:上行> @return:<resultdata:站点路由数据> */
@@ -603,18 +640,52 @@ var PublicFunctions = function () { @@ -603,18 +640,52 @@ var PublicFunctions = function () {
603 640
604 WorldsBMap.clearMarkAndOverlays(); 641 WorldsBMap.clearMarkAndOverlays();
605 642
  643 + var polyline_center;
  644 +
  645 + // 如果站点路由数据不为空
  646 + if(resultdata.length>0) {
  647 +
  648 + var ceter_index = Math.round(resultdata.length / 2);
  649 +
  650 + var ceterPointsStr = resultdata[ceter_index].bJwpoints;
  651 +
  652 + var ceterPointsArray = ceterPointsStr.split(' ');
  653 +
  654 + polyline_center = new BMap.Point(ceterPointsArray[0],ceterPointsArray[1]);
  655 +
  656 + // 遍历站点路由数据
  657 + for(var s = 0 ; s<resultdata.length;s++) {
  658 +
  659 + // 中心点坐标字符串
  660 + var bJwpointsStr = resultdata[s].bJwpoints;
  661 +
  662 + var stationName = resultdata[s].stationName;
  663 +
  664 + // 起个中心点坐标字符串
  665 + var bJwpointsArray = bJwpointsStr.split(' ');
  666 +
  667 + // 设置中心点
  668 + var point_center = new BMap.Point(bJwpointsArray[0],bJwpointsArray[1]);
  669 +
  670 + /** 在地图上画点 @param:<point_center:中心坐标点> */
  671 + WorldsBMap.drawingUpStationPoint(point_center,stationName,s+1);
  672 +
  673 + }
  674 +
  675 + }
  676 +
606 // 路段数据长度 677 // 路段数据长度
607 var dataLen = data.length; 678 var dataLen = data.length;
608 - 679 + //debugger;
609 // 如果大于零 680 // 如果大于零
610 if(dataLen>0) { 681 if(dataLen>0) {
611 682
612 - // 地图折线坐标点集合  
613 - var polylineArray = [];  
614 -  
615 // 编辑路段数据 683 // 编辑路段数据
616 for(var d= 0; d<dataLen;d++){ 684 for(var d= 0; d<dataLen;d++){
617 685
  686 + // 地图折线坐标点集合
  687 + var polylineArray = [];
  688 +
618 // 获取路段折线坐标字符串 689 // 获取路段折线坐标字符串
619 var sectionBsectionVectorStr = data[d].sectionBsectionVector; 690 var sectionBsectionVectorStr = data[d].sectionBsectionVector;
620 691
@@ -635,36 +706,10 @@ var PublicFunctions = function () { @@ -635,36 +706,10 @@ var PublicFunctions = function () {
635 polylineArray.push(new BMap.Point(lineArray[i].split(' ')[0],lineArray[i].split(' ')[1])); 706 polylineArray.push(new BMap.Point(lineArray[i].split(' ')[0],lineArray[i].split(' ')[1]));
636 707
637 } 708 }
  709 + /** 在地图上画出线路走向 @param:<polylineArray:地图折线坐标点集合;resultdata:站点路由数据> */
  710 + WorldsBMap.drawingUpline(polylineArray,polyline_center);
638 711
639 } 712 }
640 -  
641 - /** 在地图上画出线路走向 @param:<polylineArray:地图折线坐标点集合;resultdata:站点路由数据> */  
642 - WorldsBMap.drawingUpline(polylineArray,resultdata);  
643 -  
644 - // 如果站点路由数据不为空  
645 - if(resultdata.length>0) {  
646 -  
647 - // 遍历站点路由数据  
648 - for(var s = 0 ; s<resultdata.length;s++) {  
649 -  
650 - // 中心点坐标字符串  
651 - var bJwpointsStr = resultdata[s].bJwpoints;  
652 -  
653 - var stationName = resultdata[s].stationName;  
654 -  
655 - // 起个中心点坐标字符串  
656 - var bJwpointsArray = bJwpointsStr.split(' ');  
657 -  
658 - // 设置中心点  
659 - var point_center = new BMap.Point(bJwpointsArray[0],bJwpointsArray[1]);  
660 -  
661 - /** 在地图上画点 @param:<point_center:中心坐标点> */  
662 - WorldsBMap.drawingUpStationPoint(point_center,stationName,s+1);  
663 -  
664 - }  
665 -  
666 - }  
667 -  
668 } 713 }
669 714
670 }); 715 });
src/main/resources/static/pages/base/stationroute/js/stationroute-list-map.js
@@ -651,10 +651,9 @@ var WorldsBMap = function () { @@ -651,10 +651,9 @@ var WorldsBMap = function () {
651 }, 651 },
652 652
653 // 在地图上画出上行线路走向 653 // 在地图上画出上行线路走向
654 - drawingUpline : function (polylineArray,resultdata) {  
655 -  
656 - WorldsBMap.clearMarkAndOverlays(); 654 + drawingUpline : function (polylineArray,polyline_center) {
657 655
  656 + /*WorldsBMap.clearMarkAndOverlays();*/
658 polyUpline = ''; 657 polyUpline = '';
659 658
660 // 创建线路走向 659 // 创建线路走向
@@ -663,13 +662,13 @@ var WorldsBMap = function () { @@ -663,13 +662,13 @@ var WorldsBMap = function () {
663 // 把折线添加到地图上 662 // 把折线添加到地图上
664 mapBValue.addOverlay(polyUpline); 663 mapBValue.addOverlay(polyUpline);
665 664
666 - var ceter_index = Math.round(resultdata.length / 2); 665 + /*var ceter_index = Math.round(resultdata.length / 2);
667 666
668 var ceterPointsStr = resultdata[ceter_index].bJwpoints; 667 var ceterPointsStr = resultdata[ceter_index].bJwpoints;
669 668
670 var ceterPointsArray = ceterPointsStr.split(' '); 669 var ceterPointsArray = ceterPointsStr.split(' ');
671 670
672 - var polyline_center = new BMap.Point(ceterPointsArray[0],ceterPointsArray[1]); 671 + var polyline_center = new BMap.Point(ceterPointsArray[0],ceterPointsArray[1]);*/
673 672
674 var PanOptions_ ={noAnimation :true}; 673 var PanOptions_ ={noAnimation :true};
675 674
src/main/resources/static/pages/base/stationroute/js/stationroute-list-reload.js
@@ -62,10 +62,10 @@ $(function(){ @@ -62,10 +62,10 @@ $(function(){
62 /** 初始化下行树 @param:<Line.id:线路Id;0:下行> */ 62 /** 初始化下行树 @param:<Line.id:线路Id;0:下行> */
63 PublicFunctions.TreeUpOrDown(Line.id,'1'); 63 PublicFunctions.TreeUpOrDown(Line.id,'1');
64 64
65 - /** 查询上行路段信息 @param:<Line.id:线路Id;0:上行> @return:data:上行路段数据 */ 65 + /** 查询路段信息 @param:<Line.id:线路Id;0:上行> @return:data:路段数据 */
66 GetAjaxData.getSectionRouteInfo(Line.id,'0',function(data) { 66 GetAjaxData.getSectionRouteInfo(Line.id,'0',function(data) {
67 67
68 - /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:上行路段数据> */ 68 + /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
69 PublicFunctions.linePanlThree(Line.id,data,'0'); 69 PublicFunctions.linePanlThree(Line.id,data,'0');
70 70
71 }); 71 });
src/main/resources/static/pages/base/stationroute/js/stationroute-list-treedata.js
@@ -57,8 +57,10 @@ var StationTreeData = function(){ @@ -57,8 +57,10 @@ var StationTreeData = function(){
57 // 线路ID 57 // 线路ID
58 var Line = LineObj.getLineObj(); 58 var Line = LineObj.getLineObj();
59 59
  60 + /*// 百度地图画路段
  61 + PublicFunctions.linePanlThree(Line.id,polylineArray,dire_);*/
60 // 百度地图画路段 62 // 百度地图画路段
61 - PublicFunctions.linePanlThree(Line.id,polylineArray,dire_); 63 + PublicFunctions.treeSectionClick(Line.id,polylineArray,dire_);
62 64
63 } 65 }
64 66
@@ -151,7 +153,8 @@ var StationTreeData = function(){ @@ -151,7 +153,8 @@ var StationTreeData = function(){
151 var polylineArray_ = [edtste]; 153 var polylineArray_ = [edtste];
152 154
153 // 百度地图画路段 155 // 百度地图画路段
154 - PublicFunctions.linePanlThree(edtste.sectionrouteLine,polylineArray_,edtste.sectionrouteDirections); 156 + // PublicFunctions.linePanlThree(edtste.sectionrouteLine,polylineArray_,edtste.sectionrouteDirections);
  157 + PublicFunctions.treeSectionClick(Line.id,polylineArray,dire_);
155 158
156 parmasObj(); 159 parmasObj();
157 160
src/main/resources/static/pages/scheduleApp/module/common/prj-common-globalservice.js
@@ -403,6 +403,22 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;TimeTableDetailManageService_g&#39;, [&#39;$resou @@ -403,6 +403,22 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;TimeTableDetailManageService_g&#39;, [&#39;$resou
403 isArray: true 403 isArray: true
404 } 404 }
405 } 405 }
  406 + ),
  407 + dataTools: $resource(
  408 + '/tidc/:type',
  409 + {},
  410 + {
  411 + dataExport: {
  412 + method: 'GET',
  413 + responseType: "arraybuffer",
  414 + params: {
  415 + type: "dataExportExt"
  416 + },
  417 + transformResponse: function(data, headers){
  418 + return {data : data};
  419 + }
  420 + }
  421 + }
406 ) 422 )
407 423
408 // TODO:导入数据 424 // TODO:导入数据
src/main/resources/static/pages/scheduleApp/module/core/busConfig/edit.html
@@ -64,19 +64,18 @@ @@ -64,19 +64,18 @@
64 <div class="form-group has-success has-feedback"> 64 <div class="form-group has-success has-feedback">
65 <label class="col-md-2 control-label">车辆*:</label> 65 <label class="col-md-2 control-label">车辆*:</label>
66 <div class="col-md-3"> 66 <div class="col-md-3">
67 - <sa-Select3 model="ctrl.busConfigForSave"  
68 - name="cl"  
69 - placeholder="请输拼音..."  
70 - dcvalue="{{ctrl.busConfigForSave.cl.id}}" 67 + <sa-Select5 name="cl"
  68 + model="ctrl.busConfigForSave"
  69 + cmaps="{'cl.id': 'id'}"
71 dcname="cl.id" 70 dcname="cl.id"
72 icname="id" 71 icname="id"
73 - icnames="insideCode"  
74 - datatype="cl"  
75 - dataassociate="true"  
76 - dataparam="{{ {'businessCode_eq': ctrl.busConfigForSave.xl.company} | json }}"  
77 - mlp="true" 72 + dsparams="{{ {type: 'ajax', param:{type: 'all'}, atype:'cl' } | json }}"
  73 + iterobjname="item"
  74 + iterobjexp="item.insideCode"
  75 + searchph="请输拼音..."
  76 + searchexp="this.insideCode"
78 required > 77 required >
79 - </sa-Select3> 78 + </sa-Select5>
80 </div> 79 </div>
81 <!-- 隐藏块,显示验证信息 --> 80 <!-- 隐藏块,显示验证信息 -->
82 <div class="alert alert-danger well-sm" ng-show="myForm.cl.$error.required"> 81 <div class="alert alert-danger well-sm" ng-show="myForm.cl.$error.required">
src/main/resources/static/pages/scheduleApp/module/core/busConfig/form.html
@@ -64,19 +64,18 @@ @@ -64,19 +64,18 @@
64 <div class="form-group has-success has-feedback"> 64 <div class="form-group has-success has-feedback">
65 <label class="col-md-2 control-label">车辆*:</label> 65 <label class="col-md-2 control-label">车辆*:</label>
66 <div class="col-md-3"> 66 <div class="col-md-3">
67 - <sa-Select3 model="ctrl.busConfigForSave"  
68 - name="cl"  
69 - placeholder="请输拼音..."  
70 - dcvalue="{{ctrl.busConfigForSave.cl.id}}" 67 + <sa-Select5 name="cl"
  68 + model="ctrl.busConfigForSave"
  69 + cmaps="{'cl.id': 'id'}"
71 dcname="cl.id" 70 dcname="cl.id"
72 icname="id" 71 icname="id"
73 - icnames="insideCode"  
74 - datatype="cl"  
75 - dataassociate="true"  
76 - dataparam="{{ {'businessCode_eq': ctrl.busConfigForSave.xl.company} | json }}"  
77 - mlp="true" 72 + dsparams="{{ {type: 'ajax', param:{type: 'all'}, atype:'cl' } | json }}"
  73 + iterobjname="item"
  74 + iterobjexp="item.insideCode"
  75 + searchph="请输拼音..."
  76 + searchexp="this.insideCode"
78 required > 77 required >
79 - </sa-Select3> 78 + </sa-Select5>
80 </div> 79 </div>
81 <!-- 隐藏块,显示验证信息 --> 80 <!-- 隐藏块,显示验证信息 -->
82 <div class="alert alert-danger well-sm" ng-show="myForm.cl.$error.required"> 81 <div class="alert alert-danger well-sm" ng-show="myForm.cl.$error.required">
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/list.html
@@ -77,7 +77,7 @@ @@ -77,7 +77,7 @@
77 class="btn btn-info btn-sm" ng-if="info.isCancel == '0'"> 编辑 </a> 77 class="btn btn-info btn-sm" ng-if="info.isCancel == '0'"> 编辑 </a>
78 <a ui-sref="ttInfoDetailManage_form({xlid: info.xl.id, ttid : info.id, xlname: info.xl.name, ttname : info.name})" 78 <a ui-sref="ttInfoDetailManage_form({xlid: info.xl.id, ttid : info.id, xlname: info.xl.name, ttname : info.name})"
79 class="btn btn-info btn-sm" ng-if="info.isCancel == '0'"> 导入 </a> 79 class="btn btn-info btn-sm" ng-if="info.isCancel == '0'"> 导入 </a>
80 - <a href="javascript:" class="btn btn-info btn-sm"> 导出 </a> 80 + <a href="javascript:" class="btn btn-info btn-sm" ng-click="ctrl.exportData(info.id)"> 导出 </a>
81 </td> 81 </td>
82 <td> 82 <td>
83 <!--<a href="details.html?lineId={{obj.id}}" class="btn default blue-stripe btn-sm"> 详细 </a>--> 83 <!--<a href="details.html?lineId={{obj.id}}" class="btn default blue-stripe btn-sm"> 详细 </a>-->
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/main.js
@@ -3,7 +3,8 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -3,7 +3,8 @@ angular.module(&#39;ScheduleApp&#39;).factory(
3 'TtInfoManageService', 3 'TtInfoManageService',
4 [ 4 [
5 'TimeTableManageService_g', 5 'TimeTableManageService_g',
6 - function(service) { 6 + 'TimeTableDetailManageService_g',
  7 + function(service, dservice) {
7 // 当前查询的内容条件搜索对象 8 // 当前查询的内容条件搜索对象
8 var currentSearchCondition = {page: 0}; 9 var currentSearchCondition = {page: 0};
9 // 当前查询返回的信息 10 // 当前查询返回的信息
@@ -42,6 +43,16 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -42,6 +43,16 @@ angular.module(&#39;ScheduleApp&#39;).factory(
42 content: [], 43 content: [],
43 uiNumber: 1 44 uiNumber: 1
44 }; 45 };
  46 + },
  47 + /**
  48 + * 数据导出。
  49 + * @returns {*|Function|promise|n}
  50 + */
  51 + dataExport: function(ttinfoid) {
  52 + var param = {};
  53 + param.type = 'dataExportExt';
  54 + param.ttinfoid = ttinfoid;
  55 + return dservice.dataTools.dataExport(param).$promise;
45 } 56 }
46 57
47 58
@@ -73,7 +84,8 @@ angular.module(&#39;ScheduleApp&#39;).controller( @@ -73,7 +84,8 @@ angular.module(&#39;ScheduleApp&#39;).controller(
73 'TtInfoManageListCtrl', 84 'TtInfoManageListCtrl',
74 [ 85 [
75 'TtInfoManageService', 86 'TtInfoManageService',
76 - function(service) { 87 + 'FileDownload_g',
  88 + function(service, fileDownload) {
77 var self = this; 89 var self = this;
78 var TtInfo = service.getTtInfoQueryClass(); 90 var TtInfo = service.getTtInfoQueryClass();
79 91
@@ -105,6 +117,17 @@ angular.module(&#39;ScheduleApp&#39;).controller( @@ -105,6 +117,17 @@ angular.module(&#39;ScheduleApp&#39;).controller(
105 } 117 }
106 }); 118 });
107 }; 119 };
  120 + // 导出excel
  121 + self.exportData = function(ttinfoid) {
  122 + service.dataExport(ttinfoid).then(
  123 + function(result) {
  124 + fileDownload.downloadFile(result.data, "application/octet-stream", "时刻表.xls");
  125 + },
  126 + function(result) {
  127 + console.log("exportData failed:" + result);
  128 + }
  129 + );
  130 + };
108 131
109 self.doPage(); 132 self.doPage();
110 133
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/core.js 0 → 100644
  1 +/*!
  2 + * jQuery UI Core 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/category/ui-core/
  10 + */
  11 +(function( factory ) {
  12 + if ( typeof define === "function" && define.amd ) {
  13 +
  14 + // AMD. Register as an anonymous module.
  15 + define( [ "jquery" ], factory );
  16 + } else {
  17 +
  18 + // Browser globals
  19 + factory( jQuery );
  20 + }
  21 +}(function( $ ) {
  22 +
  23 +// $.ui might exist from components with no dependencies, e.g., $.ui.position
  24 +$.ui = $.ui || {};
  25 +
  26 +$.extend( $.ui, {
  27 + version: "1.11.1",
  28 +
  29 + keyCode: {
  30 + BACKSPACE: 8,
  31 + COMMA: 188,
  32 + DELETE: 46,
  33 + DOWN: 40,
  34 + END: 35,
  35 + ENTER: 13,
  36 + ESCAPE: 27,
  37 + HOME: 36,
  38 + LEFT: 37,
  39 + PAGE_DOWN: 34,
  40 + PAGE_UP: 33,
  41 + PERIOD: 190,
  42 + RIGHT: 39,
  43 + SPACE: 32,
  44 + TAB: 9,
  45 + UP: 38
  46 + }
  47 +});
  48 +
  49 +// plugins
  50 +$.fn.extend({
  51 + scrollParent: function( includeHidden ) {
  52 + var position = this.css( "position" ),
  53 + excludeStaticParent = position === "absolute",
  54 + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
  55 + scrollParent = this.parents().filter( function() {
  56 + var parent = $( this );
  57 + if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
  58 + return false;
  59 + }
  60 + return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
  61 + }).eq( 0 );
  62 +
  63 + return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
  64 + },
  65 +
  66 + uniqueId: (function() {
  67 + var uuid = 0;
  68 +
  69 + return function() {
  70 + return this.each(function() {
  71 + if ( !this.id ) {
  72 + this.id = "ui-id-" + ( ++uuid );
  73 + }
  74 + });
  75 + };
  76 + })(),
  77 +
  78 + removeUniqueId: function() {
  79 + return this.each(function() {
  80 + if ( /^ui-id-\d+$/.test( this.id ) ) {
  81 + $( this ).removeAttr( "id" );
  82 + }
  83 + });
  84 + }
  85 +});
  86 +
  87 +// selectors
  88 +function focusable( element, isTabIndexNotNaN ) {
  89 + var map, mapName, img,
  90 + nodeName = element.nodeName.toLowerCase();
  91 + if ( "area" === nodeName ) {
  92 + map = element.parentNode;
  93 + mapName = map.name;
  94 + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
  95 + return false;
  96 + }
  97 + img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
  98 + return !!img && visible( img );
  99 + }
  100 + return ( /input|select|textarea|button|object/.test( nodeName ) ?
  101 + !element.disabled :
  102 + "a" === nodeName ?
  103 + element.href || isTabIndexNotNaN :
  104 + isTabIndexNotNaN) &&
  105 + // the element and all of its ancestors must be visible
  106 + visible( element );
  107 +}
  108 +
  109 +function visible( element ) {
  110 + return $.expr.filters.visible( element ) &&
  111 + !$( element ).parents().addBack().filter(function() {
  112 + return $.css( this, "visibility" ) === "hidden";
  113 + }).length;
  114 +}
  115 +
  116 +$.extend( $.expr[ ":" ], {
  117 + data: $.expr.createPseudo ?
  118 + $.expr.createPseudo(function( dataName ) {
  119 + return function( elem ) {
  120 + return !!$.data( elem, dataName );
  121 + };
  122 + }) :
  123 + // support: jQuery <1.8
  124 + function( elem, i, match ) {
  125 + return !!$.data( elem, match[ 3 ] );
  126 + },
  127 +
  128 + focusable: function( element ) {
  129 + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
  130 + },
  131 +
  132 + tabbable: function( element ) {
  133 + var tabIndex = $.attr( element, "tabindex" ),
  134 + isTabIndexNaN = isNaN( tabIndex );
  135 + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
  136 + }
  137 +});
  138 +
  139 +// support: jQuery <1.8
  140 +if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
  141 + $.each( [ "Width", "Height" ], function( i, name ) {
  142 + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
  143 + type = name.toLowerCase(),
  144 + orig = {
  145 + innerWidth: $.fn.innerWidth,
  146 + innerHeight: $.fn.innerHeight,
  147 + outerWidth: $.fn.outerWidth,
  148 + outerHeight: $.fn.outerHeight
  149 + };
  150 +
  151 + function reduce( elem, size, border, margin ) {
  152 + $.each( side, function() {
  153 + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
  154 + if ( border ) {
  155 + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
  156 + }
  157 + if ( margin ) {
  158 + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
  159 + }
  160 + });
  161 + return size;
  162 + }
  163 +
  164 + $.fn[ "inner" + name ] = function( size ) {
  165 + if ( size === undefined ) {
  166 + return orig[ "inner" + name ].call( this );
  167 + }
  168 +
  169 + return this.each(function() {
  170 + $( this ).css( type, reduce( this, size ) + "px" );
  171 + });
  172 + };
  173 +
  174 + $.fn[ "outer" + name] = function( size, margin ) {
  175 + if ( typeof size !== "number" ) {
  176 + return orig[ "outer" + name ].call( this, size );
  177 + }
  178 +
  179 + return this.each(function() {
  180 + $( this).css( type, reduce( this, size, true, margin ) + "px" );
  181 + });
  182 + };
  183 + });
  184 +}
  185 +
  186 +// support: jQuery <1.8
  187 +if ( !$.fn.addBack ) {
  188 + $.fn.addBack = function( selector ) {
  189 + return this.add( selector == null ?
  190 + this.prevObject : this.prevObject.filter( selector )
  191 + );
  192 + };
  193 +}
  194 +
  195 +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
  196 +if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
  197 + $.fn.removeData = (function( removeData ) {
  198 + return function( key ) {
  199 + if ( arguments.length ) {
  200 + return removeData.call( this, $.camelCase( key ) );
  201 + } else {
  202 + return removeData.call( this );
  203 + }
  204 + };
  205 + })( $.fn.removeData );
  206 +}
  207 +
  208 +// deprecated
  209 +$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
  210 +
  211 +$.fn.extend({
  212 + focus: (function( orig ) {
  213 + return function( delay, fn ) {
  214 + return typeof delay === "number" ?
  215 + this.each(function() {
  216 + var elem = this;
  217 + setTimeout(function() {
  218 + $( elem ).focus();
  219 + if ( fn ) {
  220 + fn.call( elem );
  221 + }
  222 + }, delay );
  223 + }) :
  224 + orig.apply( this, arguments );
  225 + };
  226 + })( $.fn.focus ),
  227 +
  228 + disableSelection: (function() {
  229 + var eventType = "onselectstart" in document.createElement( "div" ) ?
  230 + "selectstart" :
  231 + "mousedown";
  232 +
  233 + return function() {
  234 + return this.bind( eventType + ".ui-disableSelection", function( event ) {
  235 + event.preventDefault();
  236 + });
  237 + };
  238 + })(),
  239 +
  240 + enableSelection: function() {
  241 + return this.unbind( ".ui-disableSelection" );
  242 + },
  243 +
  244 + zIndex: function( zIndex ) {
  245 + if ( zIndex !== undefined ) {
  246 + return this.css( "zIndex", zIndex );
  247 + }
  248 +
  249 + if ( this.length ) {
  250 + var elem = $( this[ 0 ] ), position, value;
  251 + while ( elem.length && elem[ 0 ] !== document ) {
  252 + // Ignore z-index if position is set to a value where z-index is ignored by the browser
  253 + // This makes behavior of this function consistent across browsers
  254 + // WebKit always returns auto if the element is positioned
  255 + position = elem.css( "position" );
  256 + if ( position === "absolute" || position === "relative" || position === "fixed" ) {
  257 + // IE returns 0 when zIndex is not specified
  258 + // other browsers return a string
  259 + // we ignore the case of nested elements with an explicit value of 0
  260 + // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
  261 + value = parseInt( elem.css( "zIndex" ), 10 );
  262 + if ( !isNaN( value ) && value !== 0 ) {
  263 + return value;
  264 + }
  265 + }
  266 + elem = elem.parent();
  267 + }
  268 + }
  269 +
  270 + return 0;
  271 + }
  272 +});
  273 +
  274 +// $.ui.plugin is deprecated. Use $.widget() extensions instead.
  275 +$.ui.plugin = {
  276 + add: function( module, option, set ) {
  277 + var i,
  278 + proto = $.ui[ module ].prototype;
  279 + for ( i in set ) {
  280 + proto.plugins[ i ] = proto.plugins[ i ] || [];
  281 + proto.plugins[ i ].push( [ option, set[ i ] ] );
  282 + }
  283 + },
  284 + call: function( instance, name, args, allowDisconnected ) {
  285 + var i,
  286 + set = instance.plugins[ name ];
  287 +
  288 + if ( !set ) {
  289 + return;
  290 + }
  291 +
  292 + if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
  293 + return;
  294 + }
  295 +
  296 + for ( i = 0; i < set.length; i++ ) {
  297 + if ( instance.options[ set[ i ][ 0 ] ] ) {
  298 + set[ i ][ 1 ].apply( instance.element, args );
  299 + }
  300 + }
  301 + }
  302 +};
  303 +
  304 +}));
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/mouse.js 0 → 100644
  1 +/*!
  2 + * jQuery UI Mouse 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/mouse/
  10 + */
  11 +(function( factory ) {
  12 + if ( typeof define === "function" && define.amd ) {
  13 +
  14 + // AMD. Register as an anonymous module.
  15 + define([
  16 + "jquery",
  17 + "./widget"
  18 + ], factory );
  19 + } else {
  20 +
  21 + // Browser globals
  22 + factory( jQuery );
  23 + }
  24 +}(function( $ ) {
  25 +
  26 +var mouseHandled = false;
  27 +$( document ).mouseup( function() {
  28 + mouseHandled = false;
  29 +});
  30 +
  31 +return $.widget("ui.mouse", {
  32 + version: "1.11.1",
  33 + options: {
  34 + cancel: "input,textarea,button,select,option",
  35 + distance: 1,
  36 + delay: 0
  37 + },
  38 + _mouseInit: function() {
  39 + var that = this;
  40 +
  41 + this.element
  42 + .bind("mousedown." + this.widgetName, function(event) {
  43 + return that._mouseDown(event);
  44 + })
  45 + .bind("click." + this.widgetName, function(event) {
  46 + if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
  47 + $.removeData(event.target, that.widgetName + ".preventClickEvent");
  48 + event.stopImmediatePropagation();
  49 + return false;
  50 + }
  51 + });
  52 +
  53 + this.started = false;
  54 + },
  55 +
  56 + // TODO: make sure destroying one instance of mouse doesn't mess with
  57 + // other instances of mouse
  58 + _mouseDestroy: function() {
  59 + this.element.unbind("." + this.widgetName);
  60 + if ( this._mouseMoveDelegate ) {
  61 + this.document
  62 + .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
  63 + .unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
  64 + }
  65 + },
  66 +
  67 + _mouseDown: function(event) {
  68 + // don't let more than one widget handle mouseStart
  69 + if ( mouseHandled ) {
  70 + return;
  71 + }
  72 +
  73 + // we may have missed mouseup (out of window)
  74 + (this._mouseStarted && this._mouseUp(event));
  75 +
  76 + this._mouseDownEvent = event;
  77 +
  78 + var that = this,
  79 + btnIsLeft = (event.which === 1),
  80 + // event.target.nodeName works around a bug in IE 8 with
  81 + // disabled inputs (#7620)
  82 + elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
  83 + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
  84 + return true;
  85 + }
  86 +
  87 + this.mouseDelayMet = !this.options.delay;
  88 + if (!this.mouseDelayMet) {
  89 + this._mouseDelayTimer = setTimeout(function() {
  90 + that.mouseDelayMet = true;
  91 + }, this.options.delay);
  92 + }
  93 +
  94 + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
  95 + this._mouseStarted = (this._mouseStart(event) !== false);
  96 + if (!this._mouseStarted) {
  97 + event.preventDefault();
  98 + return true;
  99 + }
  100 + }
  101 +
  102 + // Click event may never have fired (Gecko & Opera)
  103 + if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
  104 + $.removeData(event.target, this.widgetName + ".preventClickEvent");
  105 + }
  106 +
  107 + // these delegates are required to keep context
  108 + this._mouseMoveDelegate = function(event) {
  109 + return that._mouseMove(event);
  110 + };
  111 + this._mouseUpDelegate = function(event) {
  112 + return that._mouseUp(event);
  113 + };
  114 +
  115 + this.document
  116 + .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
  117 + .bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
  118 +
  119 + event.preventDefault();
  120 +
  121 + mouseHandled = true;
  122 + return true;
  123 + },
  124 +
  125 + _mouseMove: function(event) {
  126 + // IE mouseup check - mouseup happened when mouse was out of window
  127 + if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
  128 + return this._mouseUp(event);
  129 +
  130 + // Iframe mouseup check - mouseup occurred in another document
  131 + } else if ( !event.which ) {
  132 + return this._mouseUp( event );
  133 + }
  134 +
  135 + if (this._mouseStarted) {
  136 + this._mouseDrag(event);
  137 + return event.preventDefault();
  138 + }
  139 +
  140 + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
  141 + this._mouseStarted =
  142 + (this._mouseStart(this._mouseDownEvent, event) !== false);
  143 + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
  144 + }
  145 +
  146 + return !this._mouseStarted;
  147 + },
  148 +
  149 + _mouseUp: function(event) {
  150 + this.document
  151 + .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
  152 + .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
  153 +
  154 + if (this._mouseStarted) {
  155 + this._mouseStarted = false;
  156 +
  157 + if (event.target === this._mouseDownEvent.target) {
  158 + $.data(event.target, this.widgetName + ".preventClickEvent", true);
  159 + }
  160 +
  161 + this._mouseStop(event);
  162 + }
  163 +
  164 + mouseHandled = false;
  165 + return false;
  166 + },
  167 +
  168 + _mouseDistanceMet: function(event) {
  169 + return (Math.max(
  170 + Math.abs(this._mouseDownEvent.pageX - event.pageX),
  171 + Math.abs(this._mouseDownEvent.pageY - event.pageY)
  172 + ) >= this.options.distance
  173 + );
  174 + },
  175 +
  176 + _mouseDelayMet: function(/* event */) {
  177 + return this.mouseDelayMet;
  178 + },
  179 +
  180 + // These are placeholder methods, to be overriden by extending plugin
  181 + _mouseStart: function(/* event */) {},
  182 + _mouseDrag: function(/* event */) {},
  183 + _mouseStop: function(/* event */) {},
  184 + _mouseCapture: function(/* event */) { return true; }
  185 +});
  186 +
  187 +}));
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/resizable.js 0 → 100644
  1 +/*!
  2 + * jQuery UI Resizable 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/resizable/
  10 + */
  11 +(function( factory ) {
  12 + if ( typeof define === "function" && define.amd ) {
  13 +
  14 + // AMD. Register as an anonymous module.
  15 + define([
  16 + "jquery",
  17 + "./core",
  18 + "./mouse",
  19 + "./widget"
  20 + ], factory );
  21 + } else {
  22 +
  23 + // Browser globals
  24 + factory( jQuery );
  25 + }
  26 +}(function( $ ) {
  27 +
  28 +$.widget("ui.resizable", $.ui.mouse, {
  29 + version: "1.11.1",
  30 + widgetEventPrefix: "resize",
  31 + options: {
  32 + alsoResize: false,
  33 + animate: false,
  34 + animateDuration: "slow",
  35 + animateEasing: "swing",
  36 + aspectRatio: false,
  37 + autoHide: false,
  38 + containment: false,
  39 + ghost: false,
  40 + grid: false,
  41 + handles: "e,s,se",
  42 + helper: false,
  43 + maxHeight: null,
  44 + maxWidth: null,
  45 + minHeight: 10,
  46 + minWidth: 10,
  47 + // See #7960
  48 + zIndex: 90,
  49 +
  50 + // callbacks
  51 + resize: null,
  52 + start: null,
  53 + stop: null
  54 + },
  55 +
  56 + _num: function( value ) {
  57 + return parseInt( value, 10 ) || 0;
  58 + },
  59 +
  60 + _isNumber: function( value ) {
  61 + return !isNaN( parseInt( value, 10 ) );
  62 + },
  63 +
  64 + _hasScroll: function( el, a ) {
  65 +
  66 + if ( $( el ).css( "overflow" ) === "hidden") {
  67 + return false;
  68 + }
  69 +
  70 + var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
  71 + has = false;
  72 +
  73 + if ( el[ scroll ] > 0 ) {
  74 + return true;
  75 + }
  76 +
  77 + // TODO: determine which cases actually cause this to happen
  78 + // if the element doesn't have the scroll set, see if it's possible to
  79 + // set the scroll
  80 + el[ scroll ] = 1;
  81 + has = ( el[ scroll ] > 0 );
  82 + el[ scroll ] = 0;
  83 + return has;
  84 + },
  85 +
  86 + _create: function() {
  87 +
  88 + var n, i, handle, axis, hname,
  89 + that = this,
  90 + o = this.options;
  91 + this.element.addClass("ui-resizable");
  92 +
  93 + $.extend(this, {
  94 + _aspectRatio: !!(o.aspectRatio),
  95 + aspectRatio: o.aspectRatio,
  96 + originalElement: this.element,
  97 + _proportionallyResizeElements: [],
  98 + _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
  99 + });
  100 +
  101 + // Wrap the element if it cannot hold child nodes
  102 + if (this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
  103 +
  104 + this.element.wrap(
  105 + $("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
  106 + position: this.element.css("position"),
  107 + width: this.element.outerWidth(),
  108 + height: this.element.outerHeight(),
  109 + top: this.element.css("top"),
  110 + left: this.element.css("left")
  111 + })
  112 + );
  113 +
  114 + this.element = this.element.parent().data(
  115 + "ui-resizable", this.element.resizable( "instance" )
  116 + );
  117 +
  118 + this.elementIsWrapper = true;
  119 +
  120 + this.element.css({
  121 + marginLeft: this.originalElement.css("marginLeft"),
  122 + marginTop: this.originalElement.css("marginTop"),
  123 + marginRight: this.originalElement.css("marginRight"),
  124 + marginBottom: this.originalElement.css("marginBottom")
  125 + });
  126 + this.originalElement.css({
  127 + marginLeft: 0,
  128 + marginTop: 0,
  129 + marginRight: 0,
  130 + marginBottom: 0
  131 + });
  132 + // support: Safari
  133 + // Prevent Safari textarea resize
  134 + this.originalResizeStyle = this.originalElement.css("resize");
  135 + this.originalElement.css("resize", "none");
  136 +
  137 + this._proportionallyResizeElements.push( this.originalElement.css({
  138 + position: "static",
  139 + zoom: 1,
  140 + display: "block"
  141 + }) );
  142 +
  143 + // support: IE9
  144 + // avoid IE jump (hard set the margin)
  145 + this.originalElement.css({ margin: this.originalElement.css("margin") });
  146 +
  147 + this._proportionallyResize();
  148 + }
  149 +
  150 + this.handles = o.handles ||
  151 + ( !$(".ui-resizable-handle", this.element).length ?
  152 + "e,s,se" : {
  153 + n: ".ui-resizable-n",
  154 + e: ".ui-resizable-e",
  155 + s: ".ui-resizable-s",
  156 + w: ".ui-resizable-w",
  157 + se: ".ui-resizable-se",
  158 + sw: ".ui-resizable-sw",
  159 + ne: ".ui-resizable-ne",
  160 + nw: ".ui-resizable-nw"
  161 + } );
  162 +
  163 + if (this.handles.constructor === String) {
  164 +
  165 + if ( this.handles === "all") {
  166 + this.handles = "n,e,s,w,se,sw,ne,nw";
  167 + }
  168 +
  169 + n = this.handles.split(",");
  170 + this.handles = {};
  171 +
  172 + for (i = 0; i < n.length; i++) {
  173 +
  174 + handle = $.trim(n[i]);
  175 + hname = "ui-resizable-" + handle;
  176 + axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
  177 +
  178 + axis.css({ zIndex: o.zIndex });
  179 +
  180 + // TODO : What's going on here?
  181 + if ("se" === handle) {
  182 + axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
  183 + }
  184 +
  185 + this.handles[handle] = ".ui-resizable-" + handle;
  186 + this.element.append(axis);
  187 + }
  188 +
  189 + }
  190 +
  191 + this._renderAxis = function(target) {
  192 +
  193 + var i, axis, padPos, padWrapper;
  194 +
  195 + target = target || this.element;
  196 +
  197 + for (i in this.handles) {
  198 +
  199 + if (this.handles[i].constructor === String) {
  200 + this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
  201 + }
  202 +
  203 + if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
  204 +
  205 + axis = $(this.handles[i], this.element);
  206 +
  207 + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
  208 +
  209 + padPos = [ "padding",
  210 + /ne|nw|n/.test(i) ? "Top" :
  211 + /se|sw|s/.test(i) ? "Bottom" :
  212 + /^e$/.test(i) ? "Right" : "Left" ].join("");
  213 +
  214 + target.css(padPos, padWrapper);
  215 +
  216 + this._proportionallyResize();
  217 +
  218 + }
  219 +
  220 + // TODO: What's that good for? There's not anything to be executed left
  221 + if (!$(this.handles[i]).length) {
  222 + continue;
  223 + }
  224 + }
  225 + };
  226 +
  227 + // TODO: make renderAxis a prototype function
  228 + this._renderAxis(this.element);
  229 +
  230 + this._handles = $(".ui-resizable-handle", this.element)
  231 + .disableSelection();
  232 +
  233 + this._handles.mouseover(function() {
  234 + if (!that.resizing) {
  235 + if (this.className) {
  236 + axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
  237 + }
  238 + that.axis = axis && axis[1] ? axis[1] : "se";
  239 + }
  240 + });
  241 +
  242 + if (o.autoHide) {
  243 + this._handles.hide();
  244 + $(this.element)
  245 + .addClass("ui-resizable-autohide")
  246 + .mouseenter(function() {
  247 + if (o.disabled) {
  248 + return;
  249 + }
  250 + $(this).removeClass("ui-resizable-autohide");
  251 + that._handles.show();
  252 + })
  253 + .mouseleave(function() {
  254 + if (o.disabled) {
  255 + return;
  256 + }
  257 + if (!that.resizing) {
  258 + $(this).addClass("ui-resizable-autohide");
  259 + that._handles.hide();
  260 + }
  261 + });
  262 + }
  263 +
  264 + this._mouseInit();
  265 +
  266 + },
  267 +
  268 + _destroy: function() {
  269 +
  270 + this._mouseDestroy();
  271 +
  272 + var wrapper,
  273 + _destroy = function(exp) {
  274 + $(exp)
  275 + .removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
  276 + .removeData("resizable")
  277 + .removeData("ui-resizable")
  278 + .unbind(".resizable")
  279 + .find(".ui-resizable-handle")
  280 + .remove();
  281 + };
  282 +
  283 + // TODO: Unwrap at same DOM position
  284 + if (this.elementIsWrapper) {
  285 + _destroy(this.element);
  286 + wrapper = this.element;
  287 + this.originalElement.css({
  288 + position: wrapper.css("position"),
  289 + width: wrapper.outerWidth(),
  290 + height: wrapper.outerHeight(),
  291 + top: wrapper.css("top"),
  292 + left: wrapper.css("left")
  293 + }).insertAfter( wrapper );
  294 + wrapper.remove();
  295 + }
  296 +
  297 + this.originalElement.css("resize", this.originalResizeStyle);
  298 + _destroy(this.originalElement);
  299 +
  300 + return this;
  301 + },
  302 +
  303 + _mouseCapture: function(event) {
  304 + var i, handle,
  305 + capture = false;
  306 +
  307 + for (i in this.handles) {
  308 + handle = $(this.handles[i])[0];
  309 + if (handle === event.target || $.contains(handle, event.target)) {
  310 + capture = true;
  311 + }
  312 + }
  313 +
  314 + return !this.options.disabled && capture;
  315 + },
  316 +
  317 + _mouseStart: function(event) {
  318 +
  319 + var curleft, curtop, cursor,
  320 + o = this.options,
  321 + el = this.element;
  322 +
  323 + this.resizing = true;
  324 +
  325 + this._renderProxy();
  326 +
  327 + curleft = this._num(this.helper.css("left"));
  328 + curtop = this._num(this.helper.css("top"));
  329 +
  330 + if (o.containment) {
  331 + curleft += $(o.containment).scrollLeft() || 0;
  332 + curtop += $(o.containment).scrollTop() || 0;
  333 + }
  334 +
  335 + this.offset = this.helper.offset();
  336 + this.position = { left: curleft, top: curtop };
  337 +
  338 + this.size = this._helper ? {
  339 + width: this.helper.width(),
  340 + height: this.helper.height()
  341 + } : {
  342 + width: el.width(),
  343 + height: el.height()
  344 + };
  345 +
  346 + this.originalSize = this._helper ? {
  347 + width: el.outerWidth(),
  348 + height: el.outerHeight()
  349 + } : {
  350 + width: el.width(),
  351 + height: el.height()
  352 + };
  353 +
  354 + this.sizeDiff = {
  355 + width: el.outerWidth() - el.width(),
  356 + height: el.outerHeight() - el.height()
  357 + };
  358 +
  359 + this.originalPosition = { left: curleft, top: curtop };
  360 + this.originalMousePosition = { left: event.pageX, top: event.pageY };
  361 +
  362 + this.aspectRatio = (typeof o.aspectRatio === "number") ?
  363 + o.aspectRatio :
  364 + ((this.originalSize.width / this.originalSize.height) || 1);
  365 +
  366 + cursor = $(".ui-resizable-" + this.axis).css("cursor");
  367 + $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
  368 +
  369 + el.addClass("ui-resizable-resizing");
  370 + this._propagate("start", event);
  371 + return true;
  372 + },
  373 +
  374 + _mouseDrag: function(event) {
  375 +
  376 + var data, props,
  377 + smp = this.originalMousePosition,
  378 + a = this.axis,
  379 + dx = (event.pageX - smp.left) || 0,
  380 + dy = (event.pageY - smp.top) || 0,
  381 + trigger = this._change[a];
  382 +
  383 + this._updatePrevProperties();
  384 +
  385 + if (!trigger) {
  386 + return false;
  387 + }
  388 +
  389 + data = trigger.apply(this, [ event, dx, dy ]);
  390 +
  391 + this._updateVirtualBoundaries(event.shiftKey);
  392 + if (this._aspectRatio || event.shiftKey) {
  393 + data = this._updateRatio(data, event);
  394 + }
  395 +
  396 + data = this._respectSize(data, event);
  397 +
  398 + this._updateCache(data);
  399 +
  400 + this._propagate("resize", event);
  401 +
  402 + props = this._applyChanges();
  403 +
  404 + if ( !this._helper && this._proportionallyResizeElements.length ) {
  405 + this._proportionallyResize();
  406 + }
  407 +
  408 + if ( !$.isEmptyObject( props ) ) {
  409 + this._updatePrevProperties();
  410 + this._trigger( "resize", event, this.ui() );
  411 + this._applyChanges();
  412 + }
  413 +
  414 + return false;
  415 + },
  416 +
  417 + _mouseStop: function(event) {
  418 +
  419 + this.resizing = false;
  420 + var pr, ista, soffseth, soffsetw, s, left, top,
  421 + o = this.options, that = this;
  422 +
  423 + if (this._helper) {
  424 +
  425 + pr = this._proportionallyResizeElements;
  426 + ista = pr.length && (/textarea/i).test(pr[0].nodeName);
  427 + soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height;
  428 + soffsetw = ista ? 0 : that.sizeDiff.width;
  429 +
  430 + s = {
  431 + width: (that.helper.width() - soffsetw),
  432 + height: (that.helper.height() - soffseth)
  433 + };
  434 + left = (parseInt(that.element.css("left"), 10) +
  435 + (that.position.left - that.originalPosition.left)) || null;
  436 + top = (parseInt(that.element.css("top"), 10) +
  437 + (that.position.top - that.originalPosition.top)) || null;
  438 +
  439 + if (!o.animate) {
  440 + this.element.css($.extend(s, { top: top, left: left }));
  441 + }
  442 +
  443 + that.helper.height(that.size.height);
  444 + that.helper.width(that.size.width);
  445 +
  446 + if (this._helper && !o.animate) {
  447 + this._proportionallyResize();
  448 + }
  449 + }
  450 +
  451 + $("body").css("cursor", "auto");
  452 +
  453 + this.element.removeClass("ui-resizable-resizing");
  454 +
  455 + this._propagate("stop", event);
  456 +
  457 + if (this._helper) {
  458 + this.helper.remove();
  459 + }
  460 +
  461 + return false;
  462 +
  463 + },
  464 +
  465 + _updatePrevProperties: function() {
  466 + this.prevPosition = {
  467 + top: this.position.top,
  468 + left: this.position.left
  469 + };
  470 + this.prevSize = {
  471 + width: this.size.width,
  472 + height: this.size.height
  473 + };
  474 + },
  475 +
  476 + _applyChanges: function() {
  477 + var props = {};
  478 +
  479 + if ( this.position.top !== this.prevPosition.top ) {
  480 + props.top = this.position.top + "px";
  481 + }
  482 + if ( this.position.left !== this.prevPosition.left ) {
  483 + props.left = this.position.left + "px";
  484 + }
  485 + if ( this.size.width !== this.prevSize.width ) {
  486 + props.width = this.size.width + "px";
  487 + }
  488 + if ( this.size.height !== this.prevSize.height ) {
  489 + props.height = this.size.height + "px";
  490 + }
  491 +
  492 + this.helper.css( props );
  493 +
  494 + return props;
  495 + },
  496 +
  497 + _updateVirtualBoundaries: function(forceAspectRatio) {
  498 + var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
  499 + o = this.options;
  500 +
  501 + b = {
  502 + minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
  503 + maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
  504 + minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
  505 + maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
  506 + };
  507 +
  508 + if (this._aspectRatio || forceAspectRatio) {
  509 + pMinWidth = b.minHeight * this.aspectRatio;
  510 + pMinHeight = b.minWidth / this.aspectRatio;
  511 + pMaxWidth = b.maxHeight * this.aspectRatio;
  512 + pMaxHeight = b.maxWidth / this.aspectRatio;
  513 +
  514 + if (pMinWidth > b.minWidth) {
  515 + b.minWidth = pMinWidth;
  516 + }
  517 + if (pMinHeight > b.minHeight) {
  518 + b.minHeight = pMinHeight;
  519 + }
  520 + if (pMaxWidth < b.maxWidth) {
  521 + b.maxWidth = pMaxWidth;
  522 + }
  523 + if (pMaxHeight < b.maxHeight) {
  524 + b.maxHeight = pMaxHeight;
  525 + }
  526 + }
  527 + this._vBoundaries = b;
  528 + },
  529 +
  530 + _updateCache: function(data) {
  531 + this.offset = this.helper.offset();
  532 + if (this._isNumber(data.left)) {
  533 + this.position.left = data.left;
  534 + }
  535 + if (this._isNumber(data.top)) {
  536 + this.position.top = data.top;
  537 + }
  538 + if (this._isNumber(data.height)) {
  539 + this.size.height = data.height;
  540 + }
  541 + if (this._isNumber(data.width)) {
  542 + this.size.width = data.width;
  543 + }
  544 + },
  545 +
  546 + _updateRatio: function( data ) {
  547 +
  548 + var cpos = this.position,
  549 + csize = this.size,
  550 + a = this.axis;
  551 +
  552 + if (this._isNumber(data.height)) {
  553 + data.width = (data.height * this.aspectRatio);
  554 + } else if (this._isNumber(data.width)) {
  555 + data.height = (data.width / this.aspectRatio);
  556 + }
  557 +
  558 + if (a === "sw") {
  559 + data.left = cpos.left + (csize.width - data.width);
  560 + data.top = null;
  561 + }
  562 + if (a === "nw") {
  563 + data.top = cpos.top + (csize.height - data.height);
  564 + data.left = cpos.left + (csize.width - data.width);
  565 + }
  566 +
  567 + return data;
  568 + },
  569 +
  570 + _respectSize: function( data ) {
  571 +
  572 + var o = this._vBoundaries,
  573 + a = this.axis,
  574 + ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),
  575 + ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
  576 + isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),
  577 + isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
  578 + dw = this.originalPosition.left + this.originalSize.width,
  579 + dh = this.position.top + this.size.height,
  580 + cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
  581 + if (isminw) {
  582 + data.width = o.minWidth;
  583 + }
  584 + if (isminh) {
  585 + data.height = o.minHeight;
  586 + }
  587 + if (ismaxw) {
  588 + data.width = o.maxWidth;
  589 + }
  590 + if (ismaxh) {
  591 + data.height = o.maxHeight;
  592 + }
  593 +
  594 + if (isminw && cw) {
  595 + data.left = dw - o.minWidth;
  596 + }
  597 + if (ismaxw && cw) {
  598 + data.left = dw - o.maxWidth;
  599 + }
  600 + if (isminh && ch) {
  601 + data.top = dh - o.minHeight;
  602 + }
  603 + if (ismaxh && ch) {
  604 + data.top = dh - o.maxHeight;
  605 + }
  606 +
  607 + // Fixing jump error on top/left - bug #2330
  608 + if (!data.width && !data.height && !data.left && data.top) {
  609 + data.top = null;
  610 + } else if (!data.width && !data.height && !data.top && data.left) {
  611 + data.left = null;
  612 + }
  613 +
  614 + return data;
  615 + },
  616 +
  617 + _getPaddingPlusBorderDimensions: function( element ) {
  618 + var i = 0,
  619 + widths = [],
  620 + borders = [
  621 + element.css( "borderTopWidth" ),
  622 + element.css( "borderRightWidth" ),
  623 + element.css( "borderBottomWidth" ),
  624 + element.css( "borderLeftWidth" )
  625 + ],
  626 + paddings = [
  627 + element.css( "paddingTop" ),
  628 + element.css( "paddingRight" ),
  629 + element.css( "paddingBottom" ),
  630 + element.css( "paddingLeft" )
  631 + ];
  632 +
  633 + for ( ; i < 4; i++ ) {
  634 + widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );
  635 + widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );
  636 + }
  637 +
  638 + return {
  639 + height: widths[ 0 ] + widths[ 2 ],
  640 + width: widths[ 1 ] + widths[ 3 ]
  641 + };
  642 + },
  643 +
  644 + _proportionallyResize: function() {
  645 +
  646 + if (!this._proportionallyResizeElements.length) {
  647 + return;
  648 + }
  649 +
  650 + var prel,
  651 + i = 0,
  652 + element = this.helper || this.element;
  653 +
  654 + for ( ; i < this._proportionallyResizeElements.length; i++) {
  655 +
  656 + prel = this._proportionallyResizeElements[i];
  657 +
  658 + // TODO: Seems like a bug to cache this.outerDimensions
  659 + // considering that we are in a loop.
  660 + if (!this.outerDimensions) {
  661 + this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
  662 + }
  663 +
  664 + prel.css({
  665 + height: (element.height() - this.outerDimensions.height) || 0,
  666 + width: (element.width() - this.outerDimensions.width) || 0
  667 + });
  668 +
  669 + }
  670 +
  671 + },
  672 +
  673 + _renderProxy: function() {
  674 +
  675 + var el = this.element, o = this.options;
  676 + this.elementOffset = el.offset();
  677 +
  678 + if (this._helper) {
  679 +
  680 + this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
  681 +
  682 + this.helper.addClass(this._helper).css({
  683 + width: this.element.outerWidth() - 1,
  684 + height: this.element.outerHeight() - 1,
  685 + position: "absolute",
  686 + left: this.elementOffset.left + "px",
  687 + top: this.elementOffset.top + "px",
  688 + zIndex: ++o.zIndex //TODO: Don't modify option
  689 + });
  690 +
  691 + this.helper
  692 + .appendTo("body")
  693 + .disableSelection();
  694 +
  695 + } else {
  696 + this.helper = this.element;
  697 + }
  698 +
  699 + },
  700 +
  701 + _change: {
  702 + e: function(event, dx) {
  703 + return { width: this.originalSize.width + dx };
  704 + },
  705 + w: function(event, dx) {
  706 + var cs = this.originalSize, sp = this.originalPosition;
  707 + return { left: sp.left + dx, width: cs.width - dx };
  708 + },
  709 + n: function(event, dx, dy) {
  710 + var cs = this.originalSize, sp = this.originalPosition;
  711 + return { top: sp.top + dy, height: cs.height - dy };
  712 + },
  713 + s: function(event, dx, dy) {
  714 + return { height: this.originalSize.height + dy };
  715 + },
  716 + se: function(event, dx, dy) {
  717 + return $.extend(this._change.s.apply(this, arguments),
  718 + this._change.e.apply(this, [ event, dx, dy ]));
  719 + },
  720 + sw: function(event, dx, dy) {
  721 + return $.extend(this._change.s.apply(this, arguments),
  722 + this._change.w.apply(this, [ event, dx, dy ]));
  723 + },
  724 + ne: function(event, dx, dy) {
  725 + return $.extend(this._change.n.apply(this, arguments),
  726 + this._change.e.apply(this, [ event, dx, dy ]));
  727 + },
  728 + nw: function(event, dx, dy) {
  729 + return $.extend(this._change.n.apply(this, arguments),
  730 + this._change.w.apply(this, [ event, dx, dy ]));
  731 + }
  732 + },
  733 +
  734 + _propagate: function(n, event) {
  735 + $.ui.plugin.call(this, n, [ event, this.ui() ]);
  736 + (n !== "resize" && this._trigger(n, event, this.ui()));
  737 + },
  738 +
  739 + plugins: {},
  740 +
  741 + ui: function() {
  742 + return {
  743 + originalElement: this.originalElement,
  744 + element: this.element,
  745 + helper: this.helper,
  746 + position: this.position,
  747 + size: this.size,
  748 + originalSize: this.originalSize,
  749 + originalPosition: this.originalPosition
  750 + };
  751 + }
  752 +
  753 +});
  754 +
  755 +/*
  756 + * Resizable Extensions
  757 + */
  758 +
  759 +$.ui.plugin.add("resizable", "animate", {
  760 +
  761 + stop: function( event ) {
  762 + var that = $(this).resizable( "instance" ),
  763 + o = that.options,
  764 + pr = that._proportionallyResizeElements,
  765 + ista = pr.length && (/textarea/i).test(pr[0].nodeName),
  766 + soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height,
  767 + soffsetw = ista ? 0 : that.sizeDiff.width,
  768 + style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
  769 + left = (parseInt(that.element.css("left"), 10) +
  770 + (that.position.left - that.originalPosition.left)) || null,
  771 + top = (parseInt(that.element.css("top"), 10) +
  772 + (that.position.top - that.originalPosition.top)) || null;
  773 +
  774 + that.element.animate(
  775 + $.extend(style, top && left ? { top: top, left: left } : {}), {
  776 + duration: o.animateDuration,
  777 + easing: o.animateEasing,
  778 + step: function() {
  779 +
  780 + var data = {
  781 + width: parseInt(that.element.css("width"), 10),
  782 + height: parseInt(that.element.css("height"), 10),
  783 + top: parseInt(that.element.css("top"), 10),
  784 + left: parseInt(that.element.css("left"), 10)
  785 + };
  786 +
  787 + if (pr && pr.length) {
  788 + $(pr[0]).css({ width: data.width, height: data.height });
  789 + }
  790 +
  791 + // propagating resize, and updating values for each animation step
  792 + that._updateCache(data);
  793 + that._propagate("resize", event);
  794 +
  795 + }
  796 + }
  797 + );
  798 + }
  799 +
  800 +});
  801 +
  802 +$.ui.plugin.add( "resizable", "containment", {
  803 +
  804 + start: function() {
  805 + var element, p, co, ch, cw, width, height,
  806 + that = $( this ).resizable( "instance" ),
  807 + o = that.options,
  808 + el = that.element,
  809 + oc = o.containment,
  810 + ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
  811 +
  812 + if ( !ce ) {
  813 + return;
  814 + }
  815 +
  816 + that.containerElement = $( ce );
  817 +
  818 + if ( /document/.test( oc ) || oc === document ) {
  819 + that.containerOffset = {
  820 + left: 0,
  821 + top: 0
  822 + };
  823 + that.containerPosition = {
  824 + left: 0,
  825 + top: 0
  826 + };
  827 +
  828 + that.parentData = {
  829 + element: $( document ),
  830 + left: 0,
  831 + top: 0,
  832 + width: $( document ).width(),
  833 + height: $( document ).height() || document.body.parentNode.scrollHeight
  834 + };
  835 + } else {
  836 + element = $( ce );
  837 + p = [];
  838 + $([ "Top", "Right", "Left", "Bottom" ]).each(function( i, name ) {
  839 + p[ i ] = that._num( element.css( "padding" + name ) );
  840 + });
  841 +
  842 + that.containerOffset = element.offset();
  843 + that.containerPosition = element.position();
  844 + that.containerSize = {
  845 + height: ( element.innerHeight() - p[ 3 ] ),
  846 + width: ( element.innerWidth() - p[ 1 ] )
  847 + };
  848 +
  849 + co = that.containerOffset;
  850 + ch = that.containerSize.height;
  851 + cw = that.containerSize.width;
  852 + width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
  853 + height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
  854 +
  855 + that.parentData = {
  856 + element: ce,
  857 + left: co.left,
  858 + top: co.top,
  859 + width: width,
  860 + height: height
  861 + };
  862 + }
  863 + },
  864 +
  865 + resize: function( event ) {
  866 + var woset, hoset, isParent, isOffsetRelative,
  867 + that = $( this ).resizable( "instance" ),
  868 + o = that.options,
  869 + co = that.containerOffset,
  870 + cp = that.position,
  871 + pRatio = that._aspectRatio || event.shiftKey,
  872 + cop = {
  873 + top: 0,
  874 + left: 0
  875 + },
  876 + ce = that.containerElement,
  877 + continueResize = true;
  878 +
  879 + if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
  880 + cop = co;
  881 + }
  882 +
  883 + if ( cp.left < ( that._helper ? co.left : 0 ) ) {
  884 + that.size.width = that.size.width +
  885 + ( that._helper ?
  886 + ( that.position.left - co.left ) :
  887 + ( that.position.left - cop.left ) );
  888 +
  889 + if ( pRatio ) {
  890 + that.size.height = that.size.width / that.aspectRatio;
  891 + continueResize = false;
  892 + }
  893 + that.position.left = o.helper ? co.left : 0;
  894 + }
  895 +
  896 + if ( cp.top < ( that._helper ? co.top : 0 ) ) {
  897 + that.size.height = that.size.height +
  898 + ( that._helper ?
  899 + ( that.position.top - co.top ) :
  900 + that.position.top );
  901 +
  902 + if ( pRatio ) {
  903 + that.size.width = that.size.height * that.aspectRatio;
  904 + continueResize = false;
  905 + }
  906 + that.position.top = that._helper ? co.top : 0;
  907 + }
  908 +
  909 + isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
  910 + isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
  911 +
  912 + if ( isParent && isOffsetRelative ) {
  913 + that.offset.left = that.parentData.left + that.position.left;
  914 + that.offset.top = that.parentData.top + that.position.top;
  915 + } else {
  916 + that.offset.left = that.element.offset().left;
  917 + that.offset.top = that.element.offset().top;
  918 + }
  919 +
  920 + woset = Math.abs( that.sizeDiff.width +
  921 + (that._helper ?
  922 + that.offset.left - cop.left :
  923 + (that.offset.left - co.left)) );
  924 +
  925 + hoset = Math.abs( that.sizeDiff.height +
  926 + (that._helper ?
  927 + that.offset.top - cop.top :
  928 + (that.offset.top - co.top)) );
  929 +
  930 + if ( woset + that.size.width >= that.parentData.width ) {
  931 + that.size.width = that.parentData.width - woset;
  932 + if ( pRatio ) {
  933 + that.size.height = that.size.width / that.aspectRatio;
  934 + continueResize = false;
  935 + }
  936 + }
  937 +
  938 + if ( hoset + that.size.height >= that.parentData.height ) {
  939 + that.size.height = that.parentData.height - hoset;
  940 + if ( pRatio ) {
  941 + that.size.width = that.size.height * that.aspectRatio;
  942 + continueResize = false;
  943 + }
  944 + }
  945 +
  946 + if ( !continueResize ){
  947 + that.position.left = that.prevPosition.left;
  948 + that.position.top = that.prevPosition.top;
  949 + that.size.width = that.prevSize.width;
  950 + that.size.height = that.prevSize.height;
  951 + }
  952 + },
  953 +
  954 + stop: function() {
  955 + var that = $( this ).resizable( "instance" ),
  956 + o = that.options,
  957 + co = that.containerOffset,
  958 + cop = that.containerPosition,
  959 + ce = that.containerElement,
  960 + helper = $( that.helper ),
  961 + ho = helper.offset(),
  962 + w = helper.outerWidth() - that.sizeDiff.width,
  963 + h = helper.outerHeight() - that.sizeDiff.height;
  964 +
  965 + if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
  966 + $( this ).css({
  967 + left: ho.left - cop.left - co.left,
  968 + width: w,
  969 + height: h
  970 + });
  971 + }
  972 +
  973 + if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
  974 + $( this ).css({
  975 + left: ho.left - cop.left - co.left,
  976 + width: w,
  977 + height: h
  978 + });
  979 + }
  980 + }
  981 +});
  982 +
  983 +$.ui.plugin.add("resizable", "alsoResize", {
  984 +
  985 + start: function() {
  986 + var that = $(this).resizable( "instance" ),
  987 + o = that.options,
  988 + _store = function(exp) {
  989 + $(exp).each(function() {
  990 + var el = $(this);
  991 + el.data("ui-resizable-alsoresize", {
  992 + width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
  993 + left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
  994 + });
  995 + });
  996 + };
  997 +
  998 + if (typeof(o.alsoResize) === "object" && !o.alsoResize.parentNode) {
  999 + if (o.alsoResize.length) {
  1000 + o.alsoResize = o.alsoResize[0];
  1001 + _store(o.alsoResize);
  1002 + } else {
  1003 + $.each(o.alsoResize, function(exp) {
  1004 + _store(exp);
  1005 + });
  1006 + }
  1007 + } else {
  1008 + _store(o.alsoResize);
  1009 + }
  1010 + },
  1011 +
  1012 + resize: function(event, ui) {
  1013 + var that = $(this).resizable( "instance" ),
  1014 + o = that.options,
  1015 + os = that.originalSize,
  1016 + op = that.originalPosition,
  1017 + delta = {
  1018 + height: (that.size.height - os.height) || 0,
  1019 + width: (that.size.width - os.width) || 0,
  1020 + top: (that.position.top - op.top) || 0,
  1021 + left: (that.position.left - op.left) || 0
  1022 + },
  1023 +
  1024 + _alsoResize = function(exp, c) {
  1025 + $(exp).each(function() {
  1026 + var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
  1027 + css = c && c.length ?
  1028 + c :
  1029 + el.parents(ui.originalElement[0]).length ?
  1030 + [ "width", "height" ] :
  1031 + [ "width", "height", "top", "left" ];
  1032 +
  1033 + $.each(css, function(i, prop) {
  1034 + var sum = (start[prop] || 0) + (delta[prop] || 0);
  1035 + if (sum && sum >= 0) {
  1036 + style[prop] = sum || null;
  1037 + }
  1038 + });
  1039 +
  1040 + el.css(style);
  1041 + });
  1042 + };
  1043 +
  1044 + if (typeof(o.alsoResize) === "object" && !o.alsoResize.nodeType) {
  1045 + $.each(o.alsoResize, function(exp, c) {
  1046 + _alsoResize(exp, c);
  1047 + });
  1048 + } else {
  1049 + _alsoResize(o.alsoResize);
  1050 + }
  1051 + },
  1052 +
  1053 + stop: function() {
  1054 + $(this).removeData("resizable-alsoresize");
  1055 + }
  1056 +});
  1057 +
  1058 +$.ui.plugin.add("resizable", "ghost", {
  1059 +
  1060 + start: function() {
  1061 +
  1062 + var that = $(this).resizable( "instance" ), o = that.options, cs = that.size;
  1063 +
  1064 + that.ghost = that.originalElement.clone();
  1065 + that.ghost
  1066 + .css({
  1067 + opacity: 0.25,
  1068 + display: "block",
  1069 + position: "relative",
  1070 + height: cs.height,
  1071 + width: cs.width,
  1072 + margin: 0,
  1073 + left: 0,
  1074 + top: 0
  1075 + })
  1076 + .addClass("ui-resizable-ghost")
  1077 + .addClass(typeof o.ghost === "string" ? o.ghost : "");
  1078 +
  1079 + that.ghost.appendTo(that.helper);
  1080 +
  1081 + },
  1082 +
  1083 + resize: function() {
  1084 + var that = $(this).resizable( "instance" );
  1085 + if (that.ghost) {
  1086 + that.ghost.css({
  1087 + position: "relative",
  1088 + height: that.size.height,
  1089 + width: that.size.width
  1090 + });
  1091 + }
  1092 + },
  1093 +
  1094 + stop: function() {
  1095 + var that = $(this).resizable( "instance" );
  1096 + if (that.ghost && that.helper) {
  1097 + that.helper.get(0).removeChild(that.ghost.get(0));
  1098 + }
  1099 + }
  1100 +
  1101 +});
  1102 +
  1103 +$.ui.plugin.add("resizable", "grid", {
  1104 +
  1105 + resize: function() {
  1106 + var outerDimensions,
  1107 + that = $(this).resizable( "instance" ),
  1108 + o = that.options,
  1109 + cs = that.size,
  1110 + os = that.originalSize,
  1111 + op = that.originalPosition,
  1112 + a = that.axis,
  1113 + grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
  1114 + gridX = (grid[0] || 1),
  1115 + gridY = (grid[1] || 1),
  1116 + ox = Math.round((cs.width - os.width) / gridX) * gridX,
  1117 + oy = Math.round((cs.height - os.height) / gridY) * gridY,
  1118 + newWidth = os.width + ox,
  1119 + newHeight = os.height + oy,
  1120 + isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
  1121 + isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
  1122 + isMinWidth = o.minWidth && (o.minWidth > newWidth),
  1123 + isMinHeight = o.minHeight && (o.minHeight > newHeight);
  1124 +
  1125 + o.grid = grid;
  1126 +
  1127 + if (isMinWidth) {
  1128 + newWidth += gridX;
  1129 + }
  1130 + if (isMinHeight) {
  1131 + newHeight += gridY;
  1132 + }
  1133 + if (isMaxWidth) {
  1134 + newWidth -= gridX;
  1135 + }
  1136 + if (isMaxHeight) {
  1137 + newHeight -= gridY;
  1138 + }
  1139 +
  1140 + if (/^(se|s|e)$/.test(a)) {
  1141 + that.size.width = newWidth;
  1142 + that.size.height = newHeight;
  1143 + } else if (/^(ne)$/.test(a)) {
  1144 + that.size.width = newWidth;
  1145 + that.size.height = newHeight;
  1146 + that.position.top = op.top - oy;
  1147 + } else if (/^(sw)$/.test(a)) {
  1148 + that.size.width = newWidth;
  1149 + that.size.height = newHeight;
  1150 + that.position.left = op.left - ox;
  1151 + } else {
  1152 + if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
  1153 + outerDimensions = that._getPaddingPlusBorderDimensions( this );
  1154 + }
  1155 +
  1156 + if ( newHeight - gridY > 0 ) {
  1157 + that.size.height = newHeight;
  1158 + that.position.top = op.top - oy;
  1159 + } else {
  1160 + newHeight = gridY - outerDimensions.height;
  1161 + that.size.height = newHeight;
  1162 + that.position.top = op.top + os.height - newHeight;
  1163 + }
  1164 + if ( newWidth - gridX > 0 ) {
  1165 + that.size.width = newWidth;
  1166 + that.position.left = op.left - ox;
  1167 + } else {
  1168 + newWidth = gridY - outerDimensions.height;
  1169 + that.size.width = newWidth;
  1170 + that.position.left = op.left + os.width - newWidth;
  1171 + }
  1172 + }
  1173 + }
  1174 +
  1175 +});
  1176 +
  1177 +return $.ui.resizable;
  1178 +
  1179 +}));
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/accordion.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Accordion 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/accordion/#theming
  10 + */
  11 +.ui-accordion .ui-accordion-header {
  12 + display: block;
  13 + cursor: pointer;
  14 + position: relative;
  15 + margin: 2px 0 0 0;
  16 + padding: .5em .5em .5em .7em;
  17 + min-height: 0; /* support: IE7 */
  18 + font-size: 100%;
  19 +}
  20 +.ui-accordion .ui-accordion-icons {
  21 + padding-left: 2.2em;
  22 +}
  23 +.ui-accordion .ui-accordion-icons .ui-accordion-icons {
  24 + padding-left: 2.2em;
  25 +}
  26 +.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
  27 + position: absolute;
  28 + left: .5em;
  29 + top: 50%;
  30 + margin-top: -8px;
  31 +}
  32 +.ui-accordion .ui-accordion-content {
  33 + padding: 1em 2.2em;
  34 + border-top: 0;
  35 + overflow: auto;
  36 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/all.css 0 → 100644
  1 +/*!
  2 + * jQuery UI CSS Framework 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/category/theming/
  10 + */
  11 +@import "base.css";
  12 +@import "theme.css";
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/autocomplete.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Autocomplete 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/autocomplete/#theming
  10 + */
  11 +.ui-autocomplete {
  12 + position: absolute;
  13 + top: 0;
  14 + left: 0;
  15 + cursor: default;
  16 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/base.css 0 → 100644
  1 +/*!
  2 + * jQuery UI CSS Framework 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/category/theming/
  10 + */
  11 +@import url("core.css");
  12 +
  13 +@import url("accordion.css");
  14 +@import url("autocomplete.css");
  15 +@import url("button.css");
  16 +@import url("datepicker.css");
  17 +@import url("dialog.css");
  18 +@import url("draggable.css");
  19 +@import url("menu.css");
  20 +@import url("progressbar.css");
  21 +@import url("resizable.css");
  22 +@import url("selectable.css");
  23 +@import url("selectmenu.css");
  24 +@import url("sortable.css");
  25 +@import url("slider.css");
  26 +@import url("spinner.css");
  27 +@import url("tabs.css");
  28 +@import url("tooltip.css");
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/button.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Button 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/button/#theming
  10 + */
  11 +.ui-button {
  12 + display: inline-block;
  13 + position: relative;
  14 + padding: 0;
  15 + line-height: normal;
  16 + margin-right: .1em;
  17 + cursor: pointer;
  18 + vertical-align: middle;
  19 + text-align: center;
  20 + overflow: visible; /* removes extra width in IE */
  21 +}
  22 +.ui-button,
  23 +.ui-button:link,
  24 +.ui-button:visited,
  25 +.ui-button:hover,
  26 +.ui-button:active {
  27 + text-decoration: none;
  28 +}
  29 +/* to make room for the icon, a width needs to be set here */
  30 +.ui-button-icon-only {
  31 + width: 2.2em;
  32 +}
  33 +/* button elements seem to need a little more width */
  34 +button.ui-button-icon-only {
  35 + width: 2.4em;
  36 +}
  37 +.ui-button-icons-only {
  38 + width: 3.4em;
  39 +}
  40 +button.ui-button-icons-only {
  41 + width: 3.7em;
  42 +}
  43 +
  44 +/* button text element */
  45 +.ui-button .ui-button-text {
  46 + display: block;
  47 + line-height: normal;
  48 +}
  49 +.ui-button-text-only .ui-button-text {
  50 + padding: .4em 1em;
  51 +}
  52 +.ui-button-icon-only .ui-button-text,
  53 +.ui-button-icons-only .ui-button-text {
  54 + padding: .4em;
  55 + text-indent: -9999999px;
  56 +}
  57 +.ui-button-text-icon-primary .ui-button-text,
  58 +.ui-button-text-icons .ui-button-text {
  59 + padding: .4em 1em .4em 2.1em;
  60 +}
  61 +.ui-button-text-icon-secondary .ui-button-text,
  62 +.ui-button-text-icons .ui-button-text {
  63 + padding: .4em 2.1em .4em 1em;
  64 +}
  65 +.ui-button-text-icons .ui-button-text {
  66 + padding-left: 2.1em;
  67 + padding-right: 2.1em;
  68 +}
  69 +/* no icon support for input elements, provide padding by default */
  70 +input.ui-button {
  71 + padding: .4em 1em;
  72 +}
  73 +
  74 +/* button icon element(s) */
  75 +.ui-button-icon-only .ui-icon,
  76 +.ui-button-text-icon-primary .ui-icon,
  77 +.ui-button-text-icon-secondary .ui-icon,
  78 +.ui-button-text-icons .ui-icon,
  79 +.ui-button-icons-only .ui-icon {
  80 + position: absolute;
  81 + top: 50%;
  82 + margin-top: -8px;
  83 +}
  84 +.ui-button-icon-only .ui-icon {
  85 + left: 50%;
  86 + margin-left: -8px;
  87 +}
  88 +.ui-button-text-icon-primary .ui-button-icon-primary,
  89 +.ui-button-text-icons .ui-button-icon-primary,
  90 +.ui-button-icons-only .ui-button-icon-primary {
  91 + left: .5em;
  92 +}
  93 +.ui-button-text-icon-secondary .ui-button-icon-secondary,
  94 +.ui-button-text-icons .ui-button-icon-secondary,
  95 +.ui-button-icons-only .ui-button-icon-secondary {
  96 + right: .5em;
  97 +}
  98 +
  99 +/* button sets */
  100 +.ui-buttonset {
  101 + margin-right: 7px;
  102 +}
  103 +.ui-buttonset .ui-button {
  104 + margin-left: 0;
  105 + margin-right: -.3em;
  106 +}
  107 +
  108 +/* workarounds */
  109 +/* reset extra padding in Firefox, see h5bp.com/l */
  110 +input.ui-button::-moz-focus-inner,
  111 +button.ui-button::-moz-focus-inner {
  112 + border: 0;
  113 + padding: 0;
  114 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/core.css 0 → 100644
  1 +/*!
  2 + * jQuery UI CSS Framework 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/category/theming/
  10 + */
  11 +
  12 +/* Layout helpers
  13 +----------------------------------*/
  14 +.ui-helper-hidden {
  15 + display: none;
  16 +}
  17 +.ui-helper-hidden-accessible {
  18 + border: 0;
  19 + clip: rect(0 0 0 0);
  20 + height: 1px;
  21 + margin: -1px;
  22 + overflow: hidden;
  23 + padding: 0;
  24 + position: absolute;
  25 + width: 1px;
  26 +}
  27 +.ui-helper-reset {
  28 + margin: 0;
  29 + padding: 0;
  30 + border: 0;
  31 + outline: 0;
  32 + line-height: 1.3;
  33 + text-decoration: none;
  34 + font-size: 100%;
  35 + list-style: none;
  36 +}
  37 +.ui-helper-clearfix:before,
  38 +.ui-helper-clearfix:after {
  39 + content: "";
  40 + display: table;
  41 + border-collapse: collapse;
  42 +}
  43 +.ui-helper-clearfix:after {
  44 + clear: both;
  45 +}
  46 +.ui-helper-clearfix {
  47 + min-height: 0; /* support: IE7 */
  48 +}
  49 +.ui-helper-zfix {
  50 + width: 100%;
  51 + height: 100%;
  52 + top: 0;
  53 + left: 0;
  54 + position: absolute;
  55 + opacity: 0;
  56 + filter:Alpha(Opacity=0); /* support: IE8 */
  57 +}
  58 +
  59 +.ui-front {
  60 + z-index: 100;
  61 +}
  62 +
  63 +
  64 +/* Interaction Cues
  65 +----------------------------------*/
  66 +.ui-state-disabled {
  67 + cursor: default !important;
  68 +}
  69 +
  70 +
  71 +/* Icons
  72 +----------------------------------*/
  73 +
  74 +/* states and images */
  75 +.ui-icon {
  76 + display: block;
  77 + text-indent: -99999px;
  78 + overflow: hidden;
  79 + background-repeat: no-repeat;
  80 +}
  81 +
  82 +
  83 +/* Misc visuals
  84 +----------------------------------*/
  85 +
  86 +/* Overlays */
  87 +.ui-widget-overlay {
  88 + position: fixed;
  89 + top: 0;
  90 + left: 0;
  91 + width: 100%;
  92 + height: 100%;
  93 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/datepicker.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Datepicker 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/datepicker/#theming
  10 + */
  11 +.ui-datepicker {
  12 + width: 17em;
  13 + padding: .2em .2em 0;
  14 + display: none;
  15 +}
  16 +.ui-datepicker .ui-datepicker-header {
  17 + position: relative;
  18 + padding: .2em 0;
  19 +}
  20 +.ui-datepicker .ui-datepicker-prev,
  21 +.ui-datepicker .ui-datepicker-next {
  22 + position: absolute;
  23 + top: 2px;
  24 + width: 1.8em;
  25 + height: 1.8em;
  26 +}
  27 +.ui-datepicker .ui-datepicker-prev-hover,
  28 +.ui-datepicker .ui-datepicker-next-hover {
  29 + top: 1px;
  30 +}
  31 +.ui-datepicker .ui-datepicker-prev {
  32 + left: 2px;
  33 +}
  34 +.ui-datepicker .ui-datepicker-next {
  35 + right: 2px;
  36 +}
  37 +.ui-datepicker .ui-datepicker-prev-hover {
  38 + left: 1px;
  39 +}
  40 +.ui-datepicker .ui-datepicker-next-hover {
  41 + right: 1px;
  42 +}
  43 +.ui-datepicker .ui-datepicker-prev span,
  44 +.ui-datepicker .ui-datepicker-next span {
  45 + display: block;
  46 + position: absolute;
  47 + left: 50%;
  48 + margin-left: -8px;
  49 + top: 50%;
  50 + margin-top: -8px;
  51 +}
  52 +.ui-datepicker .ui-datepicker-title {
  53 + margin: 0 2.3em;
  54 + line-height: 1.8em;
  55 + text-align: center;
  56 +}
  57 +.ui-datepicker .ui-datepicker-title select {
  58 + font-size: 1em;
  59 + margin: 1px 0;
  60 +}
  61 +.ui-datepicker select.ui-datepicker-month,
  62 +.ui-datepicker select.ui-datepicker-year {
  63 + width: 45%;
  64 +}
  65 +.ui-datepicker table {
  66 + width: 100%;
  67 + font-size: .9em;
  68 + border-collapse: collapse;
  69 + margin: 0 0 .4em;
  70 +}
  71 +.ui-datepicker th {
  72 + padding: .7em .3em;
  73 + text-align: center;
  74 + font-weight: bold;
  75 + border: 0;
  76 +}
  77 +.ui-datepicker td {
  78 + border: 0;
  79 + padding: 1px;
  80 +}
  81 +.ui-datepicker td span,
  82 +.ui-datepicker td a {
  83 + display: block;
  84 + padding: .2em;
  85 + text-align: right;
  86 + text-decoration: none;
  87 +}
  88 +.ui-datepicker .ui-datepicker-buttonpane {
  89 + background-image: none;
  90 + margin: .7em 0 0 0;
  91 + padding: 0 .2em;
  92 + border-left: 0;
  93 + border-right: 0;
  94 + border-bottom: 0;
  95 +}
  96 +.ui-datepicker .ui-datepicker-buttonpane button {
  97 + float: right;
  98 + margin: .5em .2em .4em;
  99 + cursor: pointer;
  100 + padding: .2em .6em .3em .6em;
  101 + width: auto;
  102 + overflow: visible;
  103 +}
  104 +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
  105 + float: left;
  106 +}
  107 +
  108 +/* with multiple calendars */
  109 +.ui-datepicker.ui-datepicker-multi {
  110 + width: auto;
  111 +}
  112 +.ui-datepicker-multi .ui-datepicker-group {
  113 + float: left;
  114 +}
  115 +.ui-datepicker-multi .ui-datepicker-group table {
  116 + width: 95%;
  117 + margin: 0 auto .4em;
  118 +}
  119 +.ui-datepicker-multi-2 .ui-datepicker-group {
  120 + width: 50%;
  121 +}
  122 +.ui-datepicker-multi-3 .ui-datepicker-group {
  123 + width: 33.3%;
  124 +}
  125 +.ui-datepicker-multi-4 .ui-datepicker-group {
  126 + width: 25%;
  127 +}
  128 +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
  129 +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
  130 + border-left-width: 0;
  131 +}
  132 +.ui-datepicker-multi .ui-datepicker-buttonpane {
  133 + clear: left;
  134 +}
  135 +.ui-datepicker-row-break {
  136 + clear: both;
  137 + width: 100%;
  138 + font-size: 0;
  139 +}
  140 +
  141 +/* RTL support */
  142 +.ui-datepicker-rtl {
  143 + direction: rtl;
  144 +}
  145 +.ui-datepicker-rtl .ui-datepicker-prev {
  146 + right: 2px;
  147 + left: auto;
  148 +}
  149 +.ui-datepicker-rtl .ui-datepicker-next {
  150 + left: 2px;
  151 + right: auto;
  152 +}
  153 +.ui-datepicker-rtl .ui-datepicker-prev:hover {
  154 + right: 1px;
  155 + left: auto;
  156 +}
  157 +.ui-datepicker-rtl .ui-datepicker-next:hover {
  158 + left: 1px;
  159 + right: auto;
  160 +}
  161 +.ui-datepicker-rtl .ui-datepicker-buttonpane {
  162 + clear: right;
  163 +}
  164 +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
  165 + float: left;
  166 +}
  167 +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
  168 +.ui-datepicker-rtl .ui-datepicker-group {
  169 + float: right;
  170 +}
  171 +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
  172 +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
  173 + border-right-width: 0;
  174 + border-left-width: 1px;
  175 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/dialog.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Dialog 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/dialog/#theming
  10 + */
  11 +.ui-dialog {
  12 + overflow: hidden;
  13 + position: absolute;
  14 + top: 0;
  15 + left: 0;
  16 + padding: .2em;
  17 + outline: 0;
  18 +}
  19 +.ui-dialog .ui-dialog-titlebar {
  20 + padding: .4em 1em;
  21 + position: relative;
  22 +}
  23 +.ui-dialog .ui-dialog-title {
  24 + float: left;
  25 + margin: .1em 0;
  26 + white-space: nowrap;
  27 + width: 90%;
  28 + overflow: hidden;
  29 + text-overflow: ellipsis;
  30 +}
  31 +.ui-dialog .ui-dialog-titlebar-close {
  32 + position: absolute;
  33 + right: .3em;
  34 + top: 50%;
  35 + width: 20px;
  36 + margin: -10px 0 0 0;
  37 + padding: 1px;
  38 + height: 20px;
  39 +}
  40 +.ui-dialog .ui-dialog-content {
  41 + position: relative;
  42 + border: 0;
  43 + padding: .5em 1em;
  44 + background: none;
  45 + overflow: auto;
  46 +}
  47 +.ui-dialog .ui-dialog-buttonpane {
  48 + text-align: left;
  49 + border-width: 1px 0 0 0;
  50 + background-image: none;
  51 + margin-top: .5em;
  52 + padding: .3em 1em .5em .4em;
  53 +}
  54 +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
  55 + float: right;
  56 +}
  57 +.ui-dialog .ui-dialog-buttonpane button {
  58 + margin: .5em .4em .5em 0;
  59 + cursor: pointer;
  60 +}
  61 +.ui-dialog .ui-resizable-se {
  62 + width: 12px;
  63 + height: 12px;
  64 + right: -5px;
  65 + bottom: -5px;
  66 + background-position: 16px 16px;
  67 +}
  68 +.ui-draggable .ui-dialog-titlebar {
  69 + cursor: move;
  70 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/draggable.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Draggable 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + */
  9 +.ui-draggable-handle {
  10 + -ms-touch-action: none;
  11 + touch-action: none;
  12 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png 0 → 100644

180 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_flat_75_ffffff_40x100.png 0 → 100644

178 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png 0 → 100644

120 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_glass_65_ffffff_1x400.png 0 → 100644

105 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_glass_75_dadada_1x400.png 0 → 100644

111 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png 0 → 100644

110 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png 0 → 100644

119 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png 0 → 100644

101 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-icons_222222_256x240.png 0 → 100644

4.27 KB

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-icons_2e83ff_256x240.png 0 → 100644

4.27 KB

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-icons_454545_256x240.png 0 → 100644

4.27 KB

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-icons_888888_256x240.png 0 → 100644

4.27 KB

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-icons_cd0a0a_256x240.png 0 → 100644

4.27 KB

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/menu.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Menu 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/menu/#theming
  10 + */
  11 +.ui-menu {
  12 + list-style: none;
  13 + padding: 0;
  14 + margin: 0;
  15 + display: block;
  16 + outline: none;
  17 +}
  18 +.ui-menu .ui-menu {
  19 + position: absolute;
  20 +}
  21 +.ui-menu .ui-menu-item {
  22 + position: relative;
  23 + margin: 0;
  24 + padding: 3px 1em 3px .4em;
  25 + cursor: pointer;
  26 + min-height: 0; /* support: IE7 */
  27 + /* support: IE10, see #8844 */
  28 + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
  29 +}
  30 +.ui-menu .ui-menu-divider {
  31 + margin: 5px 0;
  32 + height: 0;
  33 + font-size: 0;
  34 + line-height: 0;
  35 + border-width: 1px 0 0 0;
  36 +}
  37 +.ui-menu .ui-state-focus,
  38 +.ui-menu .ui-state-active {
  39 + margin: -1px;
  40 +}
  41 +
  42 +/* icon support */
  43 +.ui-menu-icons {
  44 + position: relative;
  45 +}
  46 +.ui-menu-icons .ui-menu-item {
  47 + padding-left: 2em;
  48 +}
  49 +
  50 +/* left-aligned */
  51 +.ui-menu .ui-icon {
  52 + position: absolute;
  53 + top: 0;
  54 + bottom: 0;
  55 + left: .2em;
  56 + margin: auto 0;
  57 +}
  58 +
  59 +/* right-aligned */
  60 +.ui-menu .ui-menu-icon {
  61 + left: auto;
  62 + right: 0;
  63 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/progressbar.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Progressbar 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/progressbar/#theming
  10 + */
  11 +.ui-progressbar {
  12 + height: 2em;
  13 + text-align: left;
  14 + overflow: hidden;
  15 +}
  16 +.ui-progressbar .ui-progressbar-value {
  17 + margin: -1px;
  18 + height: 100%;
  19 +}
  20 +.ui-progressbar .ui-progressbar-overlay {
  21 + background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
  22 + height: 100%;
  23 + filter: alpha(opacity=25); /* support: IE8 */
  24 + opacity: 0.25;
  25 +}
  26 +.ui-progressbar-indeterminate .ui-progressbar-value {
  27 + background-image: none;
  28 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/resizable.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Resizable 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + */
  9 +.ui-resizable {
  10 + position: relative;
  11 +}
  12 +.ui-resizable-handle {
  13 + position: absolute;
  14 + font-size: 0.1px;
  15 + display: block;
  16 + -ms-touch-action: none;
  17 + touch-action: none;
  18 +}
  19 +.ui-resizable-disabled .ui-resizable-handle,
  20 +.ui-resizable-autohide .ui-resizable-handle {
  21 + display: none;
  22 +}
  23 +.ui-resizable-n {
  24 + cursor: n-resize;
  25 + height: 7px;
  26 + width: 100%;
  27 + top: -5px;
  28 + left: 0;
  29 +}
  30 +.ui-resizable-s {
  31 + cursor: s-resize;
  32 + height: 7px;
  33 + width: 100%;
  34 + bottom: -5px;
  35 + left: 0;
  36 +}
  37 +.ui-resizable-e {
  38 + cursor: e-resize;
  39 + width: 7px;
  40 + right: -5px;
  41 + top: 0;
  42 + height: 100%;
  43 +}
  44 +.ui-resizable-w {
  45 + cursor: w-resize;
  46 + width: 7px;
  47 + left: -5px;
  48 + top: 0;
  49 + height: 100%;
  50 +}
  51 +.ui-resizable-se {
  52 + cursor: se-resize;
  53 + width: 12px;
  54 + height: 12px;
  55 + right: 1px;
  56 + bottom: 1px;
  57 +}
  58 +.ui-resizable-sw {
  59 + cursor: sw-resize;
  60 + width: 9px;
  61 + height: 9px;
  62 + left: -5px;
  63 + bottom: -5px;
  64 +}
  65 +.ui-resizable-nw {
  66 + cursor: nw-resize;
  67 + width: 9px;
  68 + height: 9px;
  69 + left: -5px;
  70 + top: -5px;
  71 +}
  72 +.ui-resizable-ne {
  73 + cursor: ne-resize;
  74 + width: 9px;
  75 + height: 9px;
  76 + right: -5px;
  77 + top: -5px;
  78 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/selectable.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Selectable 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + */
  9 +.ui-selectable {
  10 + -ms-touch-action: none;
  11 + touch-action: none;
  12 +}
  13 +.ui-selectable-helper {
  14 + position: absolute;
  15 + z-index: 100;
  16 + border: 1px dotted black;
  17 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/selectmenu.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Selectmenu 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/selectmenu/#theming
  10 + */
  11 +.ui-selectmenu-menu {
  12 + padding: 0;
  13 + margin: 0;
  14 + position: absolute;
  15 + top: 0;
  16 + left: 0;
  17 + display: none;
  18 +}
  19 +.ui-selectmenu-menu .ui-menu {
  20 + overflow: auto;
  21 + /* Support: IE7 */
  22 + overflow-x: hidden;
  23 + padding-bottom: 1px;
  24 +}
  25 +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
  26 + font-size: 1em;
  27 + font-weight: bold;
  28 + line-height: 1.5;
  29 + padding: 2px 0.4em;
  30 + margin: 0.5em 0 0 0;
  31 + height: auto;
  32 + border: 0;
  33 +}
  34 +.ui-selectmenu-open {
  35 + display: block;
  36 +}
  37 +.ui-selectmenu-button {
  38 + display: inline-block;
  39 + overflow: hidden;
  40 + position: relative;
  41 + text-decoration: none;
  42 + cursor: pointer;
  43 +}
  44 +.ui-selectmenu-button span.ui-icon {
  45 + right: 0.5em;
  46 + left: auto;
  47 + margin-top: -8px;
  48 + position: absolute;
  49 + top: 50%;
  50 +}
  51 +.ui-selectmenu-button span.ui-selectmenu-text {
  52 + text-align: left;
  53 + padding: 0.4em 2.1em 0.4em 1em;
  54 + display: block;
  55 + line-height: 1.4;
  56 + overflow: hidden;
  57 + text-overflow: ellipsis;
  58 + white-space: nowrap;
  59 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/slider.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Slider 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/slider/#theming
  10 + */
  11 +.ui-slider {
  12 + position: relative;
  13 + text-align: left;
  14 +}
  15 +.ui-slider .ui-slider-handle {
  16 + position: absolute;
  17 + z-index: 2;
  18 + width: 1.2em;
  19 + height: 1.2em;
  20 + cursor: default;
  21 + -ms-touch-action: none;
  22 + touch-action: none;
  23 +}
  24 +.ui-slider .ui-slider-range {
  25 + position: absolute;
  26 + z-index: 1;
  27 + font-size: .7em;
  28 + display: block;
  29 + border: 0;
  30 + background-position: 0 0;
  31 +}
  32 +
  33 +/* support: IE8 - See #6727 */
  34 +.ui-slider.ui-state-disabled .ui-slider-handle,
  35 +.ui-slider.ui-state-disabled .ui-slider-range {
  36 + filter: inherit;
  37 +}
  38 +
  39 +.ui-slider-horizontal {
  40 + height: .8em;
  41 +}
  42 +.ui-slider-horizontal .ui-slider-handle {
  43 + top: -.3em;
  44 + margin-left: -.6em;
  45 +}
  46 +.ui-slider-horizontal .ui-slider-range {
  47 + top: 0;
  48 + height: 100%;
  49 +}
  50 +.ui-slider-horizontal .ui-slider-range-min {
  51 + left: 0;
  52 +}
  53 +.ui-slider-horizontal .ui-slider-range-max {
  54 + right: 0;
  55 +}
  56 +
  57 +.ui-slider-vertical {
  58 + width: .8em;
  59 + height: 100px;
  60 +}
  61 +.ui-slider-vertical .ui-slider-handle {
  62 + left: -.3em;
  63 + margin-left: 0;
  64 + margin-bottom: -.6em;
  65 +}
  66 +.ui-slider-vertical .ui-slider-range {
  67 + left: 0;
  68 + width: 100%;
  69 +}
  70 +.ui-slider-vertical .ui-slider-range-min {
  71 + bottom: 0;
  72 +}
  73 +.ui-slider-vertical .ui-slider-range-max {
  74 + top: 0;
  75 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/sortable.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Sortable 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + */
  9 +.ui-sortable-handle {
  10 + -ms-touch-action: none;
  11 + touch-action: none;
  12 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/spinner.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Spinner 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/spinner/#theming
  10 + */
  11 +.ui-spinner {
  12 + position: relative;
  13 + display: inline-block;
  14 + overflow: hidden;
  15 + padding: 0;
  16 + vertical-align: middle;
  17 +}
  18 +.ui-spinner-input {
  19 + border: none;
  20 + background: none;
  21 + color: inherit;
  22 + padding: 0;
  23 + margin: .2em 0;
  24 + vertical-align: middle;
  25 + margin-left: .4em;
  26 + margin-right: 22px;
  27 +}
  28 +.ui-spinner-button {
  29 + width: 16px;
  30 + height: 50%;
  31 + font-size: .5em;
  32 + padding: 0;
  33 + margin: 0;
  34 + text-align: center;
  35 + position: absolute;
  36 + cursor: default;
  37 + display: block;
  38 + overflow: hidden;
  39 + right: 0;
  40 +}
  41 +/* more specificity required here to override default borders */
  42 +.ui-spinner a.ui-spinner-button {
  43 + border-top: none;
  44 + border-bottom: none;
  45 + border-right: none;
  46 +}
  47 +/* vertically center icon */
  48 +.ui-spinner .ui-icon {
  49 + position: absolute;
  50 + margin-top: -8px;
  51 + top: 50%;
  52 + left: 0;
  53 +}
  54 +.ui-spinner-up {
  55 + top: 0;
  56 +}
  57 +.ui-spinner-down {
  58 + bottom: 0;
  59 +}
  60 +
  61 +/* TR overrides */
  62 +.ui-spinner .ui-icon-triangle-1-s {
  63 + /* need to fix icons sprite */
  64 + background-position: -65px -16px;
  65 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/tabs.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Tabs 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/tabs/#theming
  10 + */
  11 +.ui-tabs {
  12 + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
  13 + padding: .2em;
  14 +}
  15 +.ui-tabs .ui-tabs-nav {
  16 + margin: 0;
  17 + padding: .2em .2em 0;
  18 +}
  19 +.ui-tabs .ui-tabs-nav li {
  20 + list-style: none;
  21 + float: left;
  22 + position: relative;
  23 + top: 0;
  24 + margin: 1px .2em 0 0;
  25 + border-bottom-width: 0;
  26 + padding: 0;
  27 + white-space: nowrap;
  28 +}
  29 +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
  30 + float: left;
  31 + padding: .5em 1em;
  32 + text-decoration: none;
  33 +}
  34 +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
  35 + margin-bottom: -1px;
  36 + padding-bottom: 1px;
  37 +}
  38 +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
  39 +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
  40 +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
  41 + cursor: text;
  42 +}
  43 +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
  44 + cursor: pointer;
  45 +}
  46 +.ui-tabs .ui-tabs-panel {
  47 + display: block;
  48 + border-width: 0;
  49 + padding: 1em 1.4em;
  50 + background: none;
  51 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/theme.css 0 → 100644
  1 +/*!
  2 + * jQuery UI CSS Framework 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/category/theming/
  10 + *
  11 + * To view and modify this theme, visit http://jqueryui.com/themeroller/
  12 + */
  13 +
  14 +
  15 +/* Component containers
  16 +----------------------------------*/
  17 +.ui-widget {
  18 + font-family: Verdana,Arial,sans-serif/*{ffDefault}*/;
  19 + font-size: 1.1em/*{fsDefault}*/;
  20 +}
  21 +.ui-widget .ui-widget {
  22 + font-size: 1em;
  23 +}
  24 +.ui-widget input,
  25 +.ui-widget select,
  26 +.ui-widget textarea,
  27 +.ui-widget button {
  28 + font-family: Verdana,Arial,sans-serif/*{ffDefault}*/;
  29 + font-size: 1em;
  30 +}
  31 +.ui-widget-content {
  32 + border: 1px solid #aaaaaa/*{borderColorContent}*/;
  33 + background: #ffffff/*{bgColorContent}*/ url("images/ui-bg_flat_75_ffffff_40x100.png")/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/;
  34 + color: #222222/*{fcContent}*/;
  35 +}
  36 +.ui-widget-content a {
  37 + color: #222222/*{fcContent}*/;
  38 +}
  39 +.ui-widget-header {
  40 + border: 1px solid #aaaaaa/*{borderColorHeader}*/;
  41 + background: #cccccc/*{bgColorHeader}*/ url("images/ui-bg_highlight-soft_75_cccccc_1x100.png")/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/;
  42 + color: #222222/*{fcHeader}*/;
  43 + font-weight: bold;
  44 +}
  45 +.ui-widget-header a {
  46 + color: #222222/*{fcHeader}*/;
  47 +}
  48 +
  49 +/* Interaction states
  50 +----------------------------------*/
  51 +.ui-state-default,
  52 +.ui-widget-content .ui-state-default,
  53 +.ui-widget-header .ui-state-default {
  54 + border: 1px solid #d3d3d3/*{borderColorDefault}*/;
  55 + background: #e6e6e6/*{bgColorDefault}*/ url("images/ui-bg_glass_75_e6e6e6_1x400.png")/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/;
  56 + font-weight: normal/*{fwDefault}*/;
  57 + color: #555555/*{fcDefault}*/;
  58 +}
  59 +.ui-state-default a,
  60 +.ui-state-default a:link,
  61 +.ui-state-default a:visited {
  62 + color: #555555/*{fcDefault}*/;
  63 + text-decoration: none;
  64 +}
  65 +.ui-state-hover,
  66 +.ui-widget-content .ui-state-hover,
  67 +.ui-widget-header .ui-state-hover,
  68 +.ui-state-focus,
  69 +.ui-widget-content .ui-state-focus,
  70 +.ui-widget-header .ui-state-focus {
  71 + border: 1px solid #999999/*{borderColorHover}*/;
  72 + background: #dadada/*{bgColorHover}*/ url("images/ui-bg_glass_75_dadada_1x400.png")/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/;
  73 + font-weight: normal/*{fwDefault}*/;
  74 + color: #212121/*{fcHover}*/;
  75 +}
  76 +.ui-state-hover a,
  77 +.ui-state-hover a:hover,
  78 +.ui-state-hover a:link,
  79 +.ui-state-hover a:visited,
  80 +.ui-state-focus a,
  81 +.ui-state-focus a:hover,
  82 +.ui-state-focus a:link,
  83 +.ui-state-focus a:visited {
  84 + color: #212121/*{fcHover}*/;
  85 + text-decoration: none;
  86 +}
  87 +.ui-state-active,
  88 +.ui-widget-content .ui-state-active,
  89 +.ui-widget-header .ui-state-active {
  90 + border: 1px solid #aaaaaa/*{borderColorActive}*/;
  91 + background: #ffffff/*{bgColorActive}*/ url("images/ui-bg_glass_65_ffffff_1x400.png")/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/;
  92 + font-weight: normal/*{fwDefault}*/;
  93 + color: #212121/*{fcActive}*/;
  94 +}
  95 +.ui-state-active a,
  96 +.ui-state-active a:link,
  97 +.ui-state-active a:visited {
  98 + color: #212121/*{fcActive}*/;
  99 + text-decoration: none;
  100 +}
  101 +
  102 +/* Interaction Cues
  103 +----------------------------------*/
  104 +.ui-state-highlight,
  105 +.ui-widget-content .ui-state-highlight,
  106 +.ui-widget-header .ui-state-highlight {
  107 + border: 1px solid #fcefa1/*{borderColorHighlight}*/;
  108 + background: #fbf9ee/*{bgColorHighlight}*/ url("images/ui-bg_glass_55_fbf9ee_1x400.png")/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/;
  109 + color: #363636/*{fcHighlight}*/;
  110 +}
  111 +.ui-state-highlight a,
  112 +.ui-widget-content .ui-state-highlight a,
  113 +.ui-widget-header .ui-state-highlight a {
  114 + color: #363636/*{fcHighlight}*/;
  115 +}
  116 +.ui-state-error,
  117 +.ui-widget-content .ui-state-error,
  118 +.ui-widget-header .ui-state-error {
  119 + border: 1px solid #cd0a0a/*{borderColorError}*/;
  120 + background: #fef1ec/*{bgColorError}*/ url("images/ui-bg_glass_95_fef1ec_1x400.png")/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/;
  121 + color: #cd0a0a/*{fcError}*/;
  122 +}
  123 +.ui-state-error a,
  124 +.ui-widget-content .ui-state-error a,
  125 +.ui-widget-header .ui-state-error a {
  126 + color: #cd0a0a/*{fcError}*/;
  127 +}
  128 +.ui-state-error-text,
  129 +.ui-widget-content .ui-state-error-text,
  130 +.ui-widget-header .ui-state-error-text {
  131 + color: #cd0a0a/*{fcError}*/;
  132 +}
  133 +.ui-priority-primary,
  134 +.ui-widget-content .ui-priority-primary,
  135 +.ui-widget-header .ui-priority-primary {
  136 + font-weight: bold;
  137 +}
  138 +.ui-priority-secondary,
  139 +.ui-widget-content .ui-priority-secondary,
  140 +.ui-widget-header .ui-priority-secondary {
  141 + opacity: .7;
  142 + filter:Alpha(Opacity=70); /* support: IE8 */
  143 + font-weight: normal;
  144 +}
  145 +.ui-state-disabled,
  146 +.ui-widget-content .ui-state-disabled,
  147 +.ui-widget-header .ui-state-disabled {
  148 + opacity: .35;
  149 + filter:Alpha(Opacity=35); /* support: IE8 */
  150 + background-image: none;
  151 +}
  152 +.ui-state-disabled .ui-icon {
  153 + filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
  154 +}
  155 +
  156 +/* Icons
  157 +----------------------------------*/
  158 +
  159 +/* states and images */
  160 +.ui-icon {
  161 + width: 16px;
  162 + height: 16px;
  163 +}
  164 +.ui-icon,
  165 +.ui-widget-content .ui-icon {
  166 + background-image: url("images/ui-icons_222222_256x240.png")/*{iconsContent}*/;
  167 +}
  168 +.ui-widget-header .ui-icon {
  169 + background-image: url("images/ui-icons_222222_256x240.png")/*{iconsHeader}*/;
  170 +}
  171 +.ui-state-default .ui-icon {
  172 + background-image: url("images/ui-icons_888888_256x240.png")/*{iconsDefault}*/;
  173 +}
  174 +.ui-state-hover .ui-icon,
  175 +.ui-state-focus .ui-icon {
  176 + background-image: url("images/ui-icons_454545_256x240.png")/*{iconsHover}*/;
  177 +}
  178 +.ui-state-active .ui-icon {
  179 + background-image: url("images/ui-icons_454545_256x240.png")/*{iconsActive}*/;
  180 +}
  181 +.ui-state-highlight .ui-icon {
  182 + background-image: url("images/ui-icons_2e83ff_256x240.png")/*{iconsHighlight}*/;
  183 +}
  184 +.ui-state-error .ui-icon,
  185 +.ui-state-error-text .ui-icon {
  186 + background-image: url("images/ui-icons_cd0a0a_256x240.png")/*{iconsError}*/;
  187 +}
  188 +
  189 +/* positioning */
  190 +.ui-icon-blank { background-position: 16px 16px; }
  191 +.ui-icon-carat-1-n { background-position: 0 0; }
  192 +.ui-icon-carat-1-ne { background-position: -16px 0; }
  193 +.ui-icon-carat-1-e { background-position: -32px 0; }
  194 +.ui-icon-carat-1-se { background-position: -48px 0; }
  195 +.ui-icon-carat-1-s { background-position: -64px 0; }
  196 +.ui-icon-carat-1-sw { background-position: -80px 0; }
  197 +.ui-icon-carat-1-w { background-position: -96px 0; }
  198 +.ui-icon-carat-1-nw { background-position: -112px 0; }
  199 +.ui-icon-carat-2-n-s { background-position: -128px 0; }
  200 +.ui-icon-carat-2-e-w { background-position: -144px 0; }
  201 +.ui-icon-triangle-1-n { background-position: 0 -16px; }
  202 +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
  203 +.ui-icon-triangle-1-e { background-position: -32px -16px; }
  204 +.ui-icon-triangle-1-se { background-position: -48px -16px; }
  205 +.ui-icon-triangle-1-s { background-position: -64px -16px; }
  206 +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
  207 +.ui-icon-triangle-1-w { background-position: -96px -16px; }
  208 +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
  209 +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
  210 +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
  211 +.ui-icon-arrow-1-n { background-position: 0 -32px; }
  212 +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
  213 +.ui-icon-arrow-1-e { background-position: -32px -32px; }
  214 +.ui-icon-arrow-1-se { background-position: -48px -32px; }
  215 +.ui-icon-arrow-1-s { background-position: -64px -32px; }
  216 +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
  217 +.ui-icon-arrow-1-w { background-position: -96px -32px; }
  218 +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
  219 +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
  220 +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
  221 +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
  222 +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
  223 +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
  224 +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
  225 +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
  226 +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
  227 +.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
  228 +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
  229 +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
  230 +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
  231 +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
  232 +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
  233 +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
  234 +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
  235 +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
  236 +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
  237 +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
  238 +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
  239 +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
  240 +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
  241 +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
  242 +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
  243 +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
  244 +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
  245 +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
  246 +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
  247 +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
  248 +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
  249 +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
  250 +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
  251 +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
  252 +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
  253 +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
  254 +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
  255 +.ui-icon-arrow-4 { background-position: 0 -80px; }
  256 +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
  257 +.ui-icon-extlink { background-position: -32px -80px; }
  258 +.ui-icon-newwin { background-position: -48px -80px; }
  259 +.ui-icon-refresh { background-position: -64px -80px; }
  260 +.ui-icon-shuffle { background-position: -80px -80px; }
  261 +.ui-icon-transfer-e-w { background-position: -96px -80px; }
  262 +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
  263 +.ui-icon-folder-collapsed { background-position: 0 -96px; }
  264 +.ui-icon-folder-open { background-position: -16px -96px; }
  265 +.ui-icon-document { background-position: -32px -96px; }
  266 +.ui-icon-document-b { background-position: -48px -96px; }
  267 +.ui-icon-note { background-position: -64px -96px; }
  268 +.ui-icon-mail-closed { background-position: -80px -96px; }
  269 +.ui-icon-mail-open { background-position: -96px -96px; }
  270 +.ui-icon-suitcase { background-position: -112px -96px; }
  271 +.ui-icon-comment { background-position: -128px -96px; }
  272 +.ui-icon-person { background-position: -144px -96px; }
  273 +.ui-icon-print { background-position: -160px -96px; }
  274 +.ui-icon-trash { background-position: -176px -96px; }
  275 +.ui-icon-locked { background-position: -192px -96px; }
  276 +.ui-icon-unlocked { background-position: -208px -96px; }
  277 +.ui-icon-bookmark { background-position: -224px -96px; }
  278 +.ui-icon-tag { background-position: -240px -96px; }
  279 +.ui-icon-home { background-position: 0 -112px; }
  280 +.ui-icon-flag { background-position: -16px -112px; }
  281 +.ui-icon-calendar { background-position: -32px -112px; }
  282 +.ui-icon-cart { background-position: -48px -112px; }
  283 +.ui-icon-pencil { background-position: -64px -112px; }
  284 +.ui-icon-clock { background-position: -80px -112px; }
  285 +.ui-icon-disk { background-position: -96px -112px; }
  286 +.ui-icon-calculator { background-position: -112px -112px; }
  287 +.ui-icon-zoomin { background-position: -128px -112px; }
  288 +.ui-icon-zoomout { background-position: -144px -112px; }
  289 +.ui-icon-search { background-position: -160px -112px; }
  290 +.ui-icon-wrench { background-position: -176px -112px; }
  291 +.ui-icon-gear { background-position: -192px -112px; }
  292 +.ui-icon-heart { background-position: -208px -112px; }
  293 +.ui-icon-star { background-position: -224px -112px; }
  294 +.ui-icon-link { background-position: -240px -112px; }
  295 +.ui-icon-cancel { background-position: 0 -128px; }
  296 +.ui-icon-plus { background-position: -16px -128px; }
  297 +.ui-icon-plusthick { background-position: -32px -128px; }
  298 +.ui-icon-minus { background-position: -48px -128px; }
  299 +.ui-icon-minusthick { background-position: -64px -128px; }
  300 +.ui-icon-close { background-position: -80px -128px; }
  301 +.ui-icon-closethick { background-position: -96px -128px; }
  302 +.ui-icon-key { background-position: -112px -128px; }
  303 +.ui-icon-lightbulb { background-position: -128px -128px; }
  304 +.ui-icon-scissors { background-position: -144px -128px; }
  305 +.ui-icon-clipboard { background-position: -160px -128px; }
  306 +.ui-icon-copy { background-position: -176px -128px; }
  307 +.ui-icon-contact { background-position: -192px -128px; }
  308 +.ui-icon-image { background-position: -208px -128px; }
  309 +.ui-icon-video { background-position: -224px -128px; }
  310 +.ui-icon-script { background-position: -240px -128px; }
  311 +.ui-icon-alert { background-position: 0 -144px; }
  312 +.ui-icon-info { background-position: -16px -144px; }
  313 +.ui-icon-notice { background-position: -32px -144px; }
  314 +.ui-icon-help { background-position: -48px -144px; }
  315 +.ui-icon-check { background-position: -64px -144px; }
  316 +.ui-icon-bullet { background-position: -80px -144px; }
  317 +.ui-icon-radio-on { background-position: -96px -144px; }
  318 +.ui-icon-radio-off { background-position: -112px -144px; }
  319 +.ui-icon-pin-w { background-position: -128px -144px; }
  320 +.ui-icon-pin-s { background-position: -144px -144px; }
  321 +.ui-icon-play { background-position: 0 -160px; }
  322 +.ui-icon-pause { background-position: -16px -160px; }
  323 +.ui-icon-seek-next { background-position: -32px -160px; }
  324 +.ui-icon-seek-prev { background-position: -48px -160px; }
  325 +.ui-icon-seek-end { background-position: -64px -160px; }
  326 +.ui-icon-seek-start { background-position: -80px -160px; }
  327 +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
  328 +.ui-icon-seek-first { background-position: -80px -160px; }
  329 +.ui-icon-stop { background-position: -96px -160px; }
  330 +.ui-icon-eject { background-position: -112px -160px; }
  331 +.ui-icon-volume-off { background-position: -128px -160px; }
  332 +.ui-icon-volume-on { background-position: -144px -160px; }
  333 +.ui-icon-power { background-position: 0 -176px; }
  334 +.ui-icon-signal-diag { background-position: -16px -176px; }
  335 +.ui-icon-signal { background-position: -32px -176px; }
  336 +.ui-icon-battery-0 { background-position: -48px -176px; }
  337 +.ui-icon-battery-1 { background-position: -64px -176px; }
  338 +.ui-icon-battery-2 { background-position: -80px -176px; }
  339 +.ui-icon-battery-3 { background-position: -96px -176px; }
  340 +.ui-icon-circle-plus { background-position: 0 -192px; }
  341 +.ui-icon-circle-minus { background-position: -16px -192px; }
  342 +.ui-icon-circle-close { background-position: -32px -192px; }
  343 +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
  344 +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
  345 +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
  346 +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
  347 +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
  348 +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
  349 +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
  350 +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
  351 +.ui-icon-circle-zoomin { background-position: -176px -192px; }
  352 +.ui-icon-circle-zoomout { background-position: -192px -192px; }
  353 +.ui-icon-circle-check { background-position: -208px -192px; }
  354 +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
  355 +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
  356 +.ui-icon-circlesmall-close { background-position: -32px -208px; }
  357 +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
  358 +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
  359 +.ui-icon-squaresmall-close { background-position: -80px -208px; }
  360 +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
  361 +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
  362 +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
  363 +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
  364 +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
  365 +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
  366 +
  367 +
  368 +/* Misc visuals
  369 +----------------------------------*/
  370 +
  371 +/* Corner radius */
  372 +.ui-corner-all,
  373 +.ui-corner-top,
  374 +.ui-corner-left,
  375 +.ui-corner-tl {
  376 + border-top-left-radius: 4px/*{cornerRadius}*/;
  377 +}
  378 +.ui-corner-all,
  379 +.ui-corner-top,
  380 +.ui-corner-right,
  381 +.ui-corner-tr {
  382 + border-top-right-radius: 4px/*{cornerRadius}*/;
  383 +}
  384 +.ui-corner-all,
  385 +.ui-corner-bottom,
  386 +.ui-corner-left,
  387 +.ui-corner-bl {
  388 + border-bottom-left-radius: 4px/*{cornerRadius}*/;
  389 +}
  390 +.ui-corner-all,
  391 +.ui-corner-bottom,
  392 +.ui-corner-right,
  393 +.ui-corner-br {
  394 + border-bottom-right-radius: 4px/*{cornerRadius}*/;
  395 +}
  396 +
  397 +/* Overlays */
  398 +.ui-widget-overlay {
  399 + background: #aaaaaa/*{bgColorOverlay}*/ url("images/ui-bg_flat_0_aaaaaa_40x100.png")/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/;
  400 + opacity: .3/*{opacityOverlay}*/;
  401 + filter: Alpha(Opacity=30)/*{opacityFilterOverlay}*/; /* support: IE8 */
  402 +}
  403 +.ui-widget-shadow {
  404 + margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/;
  405 + padding: 8px/*{thicknessShadow}*/;
  406 + background: #aaaaaa/*{bgColorShadow}*/ url("images/ui-bg_flat_0_aaaaaa_40x100.png")/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/;
  407 + opacity: .3/*{opacityShadow}*/;
  408 + filter: Alpha(Opacity=30)/*{opacityFilterShadow}*/; /* support: IE8 */
  409 + border-radius: 8px/*{cornerRadiusShadow}*/;
  410 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/tooltip.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Tooltip 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/tooltip/#theming
  10 + */
  11 +.ui-tooltip {
  12 + padding: 8px;
  13 + position: absolute;
  14 + z-index: 9999;
  15 + max-width: 300px;
  16 + -webkit-box-shadow: 0 0 5px #aaa;
  17 + box-shadow: 0 0 5px #aaa;
  18 +}
  19 +body .ui-tooltip {
  20 + border-width: 2px;
  21 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/widget.js 0 → 100644
  1 +/*!
  2 + * jQuery UI Widget 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/jQuery.widget/
  10 + */
  11 +(function( factory ) {
  12 + if ( typeof define === "function" && define.amd ) {
  13 +
  14 + // AMD. Register as an anonymous module.
  15 + define( [ "jquery" ], factory );
  16 + } else {
  17 +
  18 + // Browser globals
  19 + factory( jQuery );
  20 + }
  21 +}(function( $ ) {
  22 +
  23 +var widget_uuid = 0,
  24 + widget_slice = Array.prototype.slice;
  25 +
  26 +$.cleanData = (function( orig ) {
  27 + return function( elems ) {
  28 + var events, elem, i;
  29 + for ( i = 0; (elem = elems[i]) != null; i++ ) {
  30 + try {
  31 +
  32 + // Only trigger remove when necessary to save time
  33 + events = $._data( elem, "events" );
  34 + if ( events && events.remove ) {
  35 + $( elem ).triggerHandler( "remove" );
  36 + }
  37 +
  38 + // http://bugs.jquery.com/ticket/8235
  39 + } catch( e ) {}
  40 + }
  41 + orig( elems );
  42 + };
  43 +})( $.cleanData );
  44 +
  45 +$.widget = function( name, base, prototype ) {
  46 + var fullName, existingConstructor, constructor, basePrototype,
  47 + // proxiedPrototype allows the provided prototype to remain unmodified
  48 + // so that it can be used as a mixin for multiple widgets (#8876)
  49 + proxiedPrototype = {},
  50 + namespace = name.split( "." )[ 0 ];
  51 +
  52 + name = name.split( "." )[ 1 ];
  53 + fullName = namespace + "-" + name;
  54 +
  55 + if ( !prototype ) {
  56 + prototype = base;
  57 + base = $.Widget;
  58 + }
  59 +
  60 + // create selector for plugin
  61 + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
  62 + return !!$.data( elem, fullName );
  63 + };
  64 +
  65 + $[ namespace ] = $[ namespace ] || {};
  66 + existingConstructor = $[ namespace ][ name ];
  67 + constructor = $[ namespace ][ name ] = function( options, element ) {
  68 + // allow instantiation without "new" keyword
  69 + if ( !this._createWidget ) {
  70 + return new constructor( options, element );
  71 + }
  72 +
  73 + // allow instantiation without initializing for simple inheritance
  74 + // must use "new" keyword (the code above always passes args)
  75 + if ( arguments.length ) {
  76 + this._createWidget( options, element );
  77 + }
  78 + };
  79 + // extend with the existing constructor to carry over any static properties
  80 + $.extend( constructor, existingConstructor, {
  81 + version: prototype.version,
  82 + // copy the object used to create the prototype in case we need to
  83 + // redefine the widget later
  84 + _proto: $.extend( {}, prototype ),
  85 + // track widgets that inherit from this widget in case this widget is
  86 + // redefined after a widget inherits from it
  87 + _childConstructors: []
  88 + });
  89 +
  90 + basePrototype = new base();
  91 + // we need to make the options hash a property directly on the new instance
  92 + // otherwise we'll modify the options hash on the prototype that we're
  93 + // inheriting from
  94 + basePrototype.options = $.widget.extend( {}, basePrototype.options );
  95 + $.each( prototype, function( prop, value ) {
  96 + if ( !$.isFunction( value ) ) {
  97 + proxiedPrototype[ prop ] = value;
  98 + return;
  99 + }
  100 + proxiedPrototype[ prop ] = (function() {
  101 + var _super = function() {
  102 + return base.prototype[ prop ].apply( this, arguments );
  103 + },
  104 + _superApply = function( args ) {
  105 + return base.prototype[ prop ].apply( this, args );
  106 + };
  107 + return function() {
  108 + var __super = this._super,
  109 + __superApply = this._superApply,
  110 + returnValue;
  111 +
  112 + this._super = _super;
  113 + this._superApply = _superApply;
  114 +
  115 + returnValue = value.apply( this, arguments );
  116 +
  117 + this._super = __super;
  118 + this._superApply = __superApply;
  119 +
  120 + return returnValue;
  121 + };
  122 + })();
  123 + });
  124 + constructor.prototype = $.widget.extend( basePrototype, {
  125 + // TODO: remove support for widgetEventPrefix
  126 + // always use the name + a colon as the prefix, e.g., draggable:start
  127 + // don't prefix for widgets that aren't DOM-based
  128 + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
  129 + }, proxiedPrototype, {
  130 + constructor: constructor,
  131 + namespace: namespace,
  132 + widgetName: name,
  133 + widgetFullName: fullName
  134 + });
  135 +
  136 + // If this widget is being redefined then we need to find all widgets that
  137 + // are inheriting from it and redefine all of them so that they inherit from
  138 + // the new version of this widget. We're essentially trying to replace one
  139 + // level in the prototype chain.
  140 + if ( existingConstructor ) {
  141 + $.each( existingConstructor._childConstructors, function( i, child ) {
  142 + var childPrototype = child.prototype;
  143 +
  144 + // redefine the child widget using the same prototype that was
  145 + // originally used, but inherit from the new version of the base
  146 + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
  147 + });
  148 + // remove the list of existing child constructors from the old constructor
  149 + // so the old child constructors can be garbage collected
  150 + delete existingConstructor._childConstructors;
  151 + } else {
  152 + base._childConstructors.push( constructor );
  153 + }
  154 +
  155 + $.widget.bridge( name, constructor );
  156 +
  157 + return constructor;
  158 +};
  159 +
  160 +$.widget.extend = function( target ) {
  161 + var input = widget_slice.call( arguments, 1 ),
  162 + inputIndex = 0,
  163 + inputLength = input.length,
  164 + key,
  165 + value;
  166 + for ( ; inputIndex < inputLength; inputIndex++ ) {
  167 + for ( key in input[ inputIndex ] ) {
  168 + value = input[ inputIndex ][ key ];
  169 + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
  170 + // Clone objects
  171 + if ( $.isPlainObject( value ) ) {
  172 + target[ key ] = $.isPlainObject( target[ key ] ) ?
  173 + $.widget.extend( {}, target[ key ], value ) :
  174 + // Don't extend strings, arrays, etc. with objects
  175 + $.widget.extend( {}, value );
  176 + // Copy everything else by reference
  177 + } else {
  178 + target[ key ] = value;
  179 + }
  180 + }
  181 + }
  182 + }
  183 + return target;
  184 +};
  185 +
  186 +$.widget.bridge = function( name, object ) {
  187 + var fullName = object.prototype.widgetFullName || name;
  188 + $.fn[ name ] = function( options ) {
  189 + var isMethodCall = typeof options === "string",
  190 + args = widget_slice.call( arguments, 1 ),
  191 + returnValue = this;
  192 +
  193 + // allow multiple hashes to be passed on init
  194 + options = !isMethodCall && args.length ?
  195 + $.widget.extend.apply( null, [ options ].concat(args) ) :
  196 + options;
  197 +
  198 + if ( isMethodCall ) {
  199 + this.each(function() {
  200 + var methodValue,
  201 + instance = $.data( this, fullName );
  202 + if ( options === "instance" ) {
  203 + returnValue = instance;
  204 + return false;
  205 + }
  206 + if ( !instance ) {
  207 + return $.error( "cannot call methods on " + name + " prior to initialization; " +
  208 + "attempted to call method '" + options + "'" );
  209 + }
  210 + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
  211 + return $.error( "no such method '" + options + "' for " + name + " widget instance" );
  212 + }
  213 + methodValue = instance[ options ].apply( instance, args );
  214 + if ( methodValue !== instance && methodValue !== undefined ) {
  215 + returnValue = methodValue && methodValue.jquery ?
  216 + returnValue.pushStack( methodValue.get() ) :
  217 + methodValue;
  218 + return false;
  219 + }
  220 + });
  221 + } else {
  222 + this.each(function() {
  223 + var instance = $.data( this, fullName );
  224 + if ( instance ) {
  225 + instance.option( options || {} );
  226 + if ( instance._init ) {
  227 + instance._init();
  228 + }
  229 + } else {
  230 + $.data( this, fullName, new object( options, this ) );
  231 + }
  232 + });
  233 + }
  234 +
  235 + return returnValue;
  236 + };
  237 +};
  238 +
  239 +$.Widget = function( /* options, element */ ) {};
  240 +$.Widget._childConstructors = [];
  241 +
  242 +$.Widget.prototype = {
  243 + widgetName: "widget",
  244 + widgetEventPrefix: "",
  245 + defaultElement: "<div>",
  246 + options: {
  247 + disabled: false,
  248 +
  249 + // callbacks
  250 + create: null
  251 + },
  252 + _createWidget: function( options, element ) {
  253 + element = $( element || this.defaultElement || this )[ 0 ];
  254 + this.element = $( element );
  255 + this.uuid = widget_uuid++;
  256 + this.eventNamespace = "." + this.widgetName + this.uuid;
  257 + this.options = $.widget.extend( {},
  258 + this.options,
  259 + this._getCreateOptions(),
  260 + options );
  261 +
  262 + this.bindings = $();
  263 + this.hoverable = $();
  264 + this.focusable = $();
  265 +
  266 + if ( element !== this ) {
  267 + $.data( element, this.widgetFullName, this );
  268 + this._on( true, this.element, {
  269 + remove: function( event ) {
  270 + if ( event.target === element ) {
  271 + this.destroy();
  272 + }
  273 + }
  274 + });
  275 + this.document = $( element.style ?
  276 + // element within the document
  277 + element.ownerDocument :
  278 + // element is window or document
  279 + element.document || element );
  280 + this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
  281 + }
  282 +
  283 + this._create();
  284 + this._trigger( "create", null, this._getCreateEventData() );
  285 + this._init();
  286 + },
  287 + _getCreateOptions: $.noop,
  288 + _getCreateEventData: $.noop,
  289 + _create: $.noop,
  290 + _init: $.noop,
  291 +
  292 + destroy: function() {
  293 + this._destroy();
  294 + // we can probably remove the unbind calls in 2.0
  295 + // all event bindings should go through this._on()
  296 + this.element
  297 + .unbind( this.eventNamespace )
  298 + .removeData( this.widgetFullName )
  299 + // support: jquery <1.6.3
  300 + // http://bugs.jquery.com/ticket/9413
  301 + .removeData( $.camelCase( this.widgetFullName ) );
  302 + this.widget()
  303 + .unbind( this.eventNamespace )
  304 + .removeAttr( "aria-disabled" )
  305 + .removeClass(
  306 + this.widgetFullName + "-disabled " +
  307 + "ui-state-disabled" );
  308 +
  309 + // clean up events and states
  310 + this.bindings.unbind( this.eventNamespace );
  311 + this.hoverable.removeClass( "ui-state-hover" );
  312 + this.focusable.removeClass( "ui-state-focus" );
  313 + },
  314 + _destroy: $.noop,
  315 +
  316 + widget: function() {
  317 + return this.element;
  318 + },
  319 +
  320 + option: function( key, value ) {
  321 + var options = key,
  322 + parts,
  323 + curOption,
  324 + i;
  325 +
  326 + if ( arguments.length === 0 ) {
  327 + // don't return a reference to the internal hash
  328 + return $.widget.extend( {}, this.options );
  329 + }
  330 +
  331 + if ( typeof key === "string" ) {
  332 + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
  333 + options = {};
  334 + parts = key.split( "." );
  335 + key = parts.shift();
  336 + if ( parts.length ) {
  337 + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
  338 + for ( i = 0; i < parts.length - 1; i++ ) {
  339 + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
  340 + curOption = curOption[ parts[ i ] ];
  341 + }
  342 + key = parts.pop();
  343 + if ( arguments.length === 1 ) {
  344 + return curOption[ key ] === undefined ? null : curOption[ key ];
  345 + }
  346 + curOption[ key ] = value;
  347 + } else {
  348 + if ( arguments.length === 1 ) {
  349 + return this.options[ key ] === undefined ? null : this.options[ key ];
  350 + }
  351 + options[ key ] = value;
  352 + }
  353 + }
  354 +
  355 + this._setOptions( options );
  356 +
  357 + return this;
  358 + },
  359 + _setOptions: function( options ) {
  360 + var key;
  361 +
  362 + for ( key in options ) {
  363 + this._setOption( key, options[ key ] );
  364 + }
  365 +
  366 + return this;
  367 + },
  368 + _setOption: function( key, value ) {
  369 + this.options[ key ] = value;
  370 +
  371 + if ( key === "disabled" ) {
  372 + this.widget()
  373 + .toggleClass( this.widgetFullName + "-disabled", !!value );
  374 +
  375 + // If the widget is becoming disabled, then nothing is interactive
  376 + if ( value ) {
  377 + this.hoverable.removeClass( "ui-state-hover" );
  378 + this.focusable.removeClass( "ui-state-focus" );
  379 + }
  380 + }
  381 +
  382 + return this;
  383 + },
  384 +
  385 + enable: function() {
  386 + return this._setOptions({ disabled: false });
  387 + },
  388 + disable: function() {
  389 + return this._setOptions({ disabled: true });
  390 + },
  391 +
  392 + _on: function( suppressDisabledCheck, element, handlers ) {
  393 + var delegateElement,
  394 + instance = this;
  395 +
  396 + // no suppressDisabledCheck flag, shuffle arguments
  397 + if ( typeof suppressDisabledCheck !== "boolean" ) {
  398 + handlers = element;
  399 + element = suppressDisabledCheck;
  400 + suppressDisabledCheck = false;
  401 + }
  402 +
  403 + // no element argument, shuffle and use this.element
  404 + if ( !handlers ) {
  405 + handlers = element;
  406 + element = this.element;
  407 + delegateElement = this.widget();
  408 + } else {
  409 + element = delegateElement = $( element );
  410 + this.bindings = this.bindings.add( element );
  411 + }
  412 +
  413 + $.each( handlers, function( event, handler ) {
  414 + function handlerProxy() {
  415 + // allow widgets to customize the disabled handling
  416 + // - disabled as an array instead of boolean
  417 + // - disabled class as method for disabling individual parts
  418 + if ( !suppressDisabledCheck &&
  419 + ( instance.options.disabled === true ||
  420 + $( this ).hasClass( "ui-state-disabled" ) ) ) {
  421 + return;
  422 + }
  423 + return ( typeof handler === "string" ? instance[ handler ] : handler )
  424 + .apply( instance, arguments );
  425 + }
  426 +
  427 + // copy the guid so direct unbinding works
  428 + if ( typeof handler !== "string" ) {
  429 + handlerProxy.guid = handler.guid =
  430 + handler.guid || handlerProxy.guid || $.guid++;
  431 + }
  432 +
  433 + var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
  434 + eventName = match[1] + instance.eventNamespace,
  435 + selector = match[2];
  436 + if ( selector ) {
  437 + delegateElement.delegate( selector, eventName, handlerProxy );
  438 + } else {
  439 + element.bind( eventName, handlerProxy );
  440 + }
  441 + });
  442 + },
  443 +
  444 + _off: function( element, eventName ) {
  445 + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
  446 + element.unbind( eventName ).undelegate( eventName );
  447 + },
  448 +
  449 + _delay: function( handler, delay ) {
  450 + function handlerProxy() {
  451 + return ( typeof handler === "string" ? instance[ handler ] : handler )
  452 + .apply( instance, arguments );
  453 + }
  454 + var instance = this;
  455 + return setTimeout( handlerProxy, delay || 0 );
  456 + },
  457 +
  458 + _hoverable: function( element ) {
  459 + this.hoverable = this.hoverable.add( element );
  460 + this._on( element, {
  461 + mouseenter: function( event ) {
  462 + $( event.currentTarget ).addClass( "ui-state-hover" );
  463 + },
  464 + mouseleave: function( event ) {
  465 + $( event.currentTarget ).removeClass( "ui-state-hover" );
  466 + }
  467 + });
  468 + },
  469 +
  470 + _focusable: function( element ) {
  471 + this.focusable = this.focusable.add( element );
  472 + this._on( element, {
  473 + focusin: function( event ) {
  474 + $( event.currentTarget ).addClass( "ui-state-focus" );
  475 + },
  476 + focusout: function( event ) {
  477 + $( event.currentTarget ).removeClass( "ui-state-focus" );
  478 + }
  479 + });
  480 + },
  481 +
  482 + _trigger: function( type, event, data ) {
  483 + var prop, orig,
  484 + callback = this.options[ type ];
  485 +
  486 + data = data || {};
  487 + event = $.Event( event );
  488 + event.type = ( type === this.widgetEventPrefix ?
  489 + type :
  490 + this.widgetEventPrefix + type ).toLowerCase();
  491 + // the original event may come from any element
  492 + // so we need to reset the target on the new event
  493 + event.target = this.element[ 0 ];
  494 +
  495 + // copy original event properties over to the new event
  496 + orig = event.originalEvent;
  497 + if ( orig ) {
  498 + for ( prop in orig ) {
  499 + if ( !( prop in event ) ) {
  500 + event[ prop ] = orig[ prop ];
  501 + }
  502 + }
  503 + }
  504 +
  505 + this.element.trigger( event, data );
  506 + return !( $.isFunction( callback ) &&
  507 + callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
  508 + event.isDefaultPrevented() );
  509 + }
  510 +};
  511 +
  512 +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
  513 + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
  514 + if ( typeof options === "string" ) {
  515 + options = { effect: options };
  516 + }
  517 + var hasOptions,
  518 + effectName = !options ?
  519 + method :
  520 + options === true || typeof options === "number" ?
  521 + defaultEffect :
  522 + options.effect || defaultEffect;
  523 + options = options || {};
  524 + if ( typeof options === "number" ) {
  525 + options = { duration: options };
  526 + }
  527 + hasOptions = !$.isEmptyObject( options );
  528 + options.complete = callback;
  529 + if ( options.delay ) {
  530 + element.delay( options.delay );
  531 + }
  532 + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
  533 + element[ method ]( options );
  534 + } else if ( effectName !== method && element[ effectName ] ) {
  535 + element[ effectName ]( options.duration, options.easing, callback );
  536 + } else {
  537 + element.queue(function( next ) {
  538 + $( this )[ method ]();
  539 + if ( callback ) {
  540 + callback.call( element[ 0 ] );
  541 + }
  542 + next();
  543 + });
  544 + }
  545 + };
  546 +});
  547 +
  548 +return $.widget;
  549 +
  550 +}));
src/main/resources/static/real_control_v2/assets/plugins/spectrum/spectrum.css 0 → 100644
  1 +/***
  2 +Spectrum Colorpicker v1.8.0
  3 +https://github.com/bgrins/spectrum
  4 +Author: Brian Grinstead
  5 +License: MIT
  6 +***/
  7 +
  8 +.sp-container {
  9 + position:absolute;
  10 + top:0;
  11 + left:0;
  12 + display:inline-block;
  13 + *display: inline;
  14 + *zoom: 1;
  15 + /* https://github.com/bgrins/spectrum/issues/40 */
  16 + z-index: 9999994;
  17 + overflow: hidden;
  18 +}
  19 +.sp-container.sp-flat {
  20 + position: relative;
  21 +}
  22 +
  23 +/* Fix for * { box-sizing: border-box; } */
  24 +.sp-container,
  25 +.sp-container * {
  26 + -webkit-box-sizing: content-box;
  27 + -moz-box-sizing: content-box;
  28 + box-sizing: content-box;
  29 +}
  30 +
  31 +/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */
  32 +.sp-top {
  33 + position:relative;
  34 + width: 100%;
  35 + display:inline-block;
  36 +}
  37 +.sp-top-inner {
  38 + position:absolute;
  39 + top:0;
  40 + left:0;
  41 + bottom:0;
  42 + right:0;
  43 +}
  44 +.sp-color {
  45 + position: absolute;
  46 + top:0;
  47 + left:0;
  48 + bottom:0;
  49 + right:20%;
  50 +}
  51 +.sp-hue {
  52 + position: absolute;
  53 + top:0;
  54 + right:0;
  55 + bottom:0;
  56 + left:84%;
  57 + height: 100%;
  58 +}
  59 +
  60 +.sp-clear-enabled .sp-hue {
  61 + top:33px;
  62 + height: 77.5%;
  63 +}
  64 +
  65 +.sp-fill {
  66 + padding-top: 80%;
  67 +}
  68 +.sp-sat, .sp-val {
  69 + position: absolute;
  70 + top:0;
  71 + left:0;
  72 + right:0;
  73 + bottom:0;
  74 +}
  75 +
  76 +.sp-alpha-enabled .sp-top {
  77 + margin-bottom: 18px;
  78 +}
  79 +.sp-alpha-enabled .sp-alpha {
  80 + display: block;
  81 +}
  82 +.sp-alpha-handle {
  83 + position:absolute;
  84 + top:-4px;
  85 + bottom: -4px;
  86 + width: 6px;
  87 + left: 50%;
  88 + cursor: pointer;
  89 + border: 1px solid black;
  90 + background: white;
  91 + opacity: .8;
  92 +}
  93 +.sp-alpha {
  94 + display: none;
  95 + position: absolute;
  96 + bottom: -14px;
  97 + right: 0;
  98 + left: 0;
  99 + height: 8px;
  100 +}
  101 +.sp-alpha-inner {
  102 + border: solid 1px #333;
  103 +}
  104 +
  105 +.sp-clear {
  106 + display: none;
  107 +}
  108 +
  109 +.sp-clear.sp-clear-display {
  110 + background-position: center;
  111 +}
  112 +
  113 +.sp-clear-enabled .sp-clear {
  114 + display: block;
  115 + position:absolute;
  116 + top:0px;
  117 + right:0;
  118 + bottom:0;
  119 + left:84%;
  120 + height: 28px;
  121 +}
  122 +
  123 +/* Don't allow text selection */
  124 +.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button {
  125 + -webkit-user-select:none;
  126 + -moz-user-select: -moz-none;
  127 + -o-user-select:none;
  128 + user-select: none;
  129 +}
  130 +
  131 +.sp-container.sp-input-disabled .sp-input-container {
  132 + display: none;
  133 +}
  134 +.sp-container.sp-buttons-disabled .sp-button-container {
  135 + display: none;
  136 +}
  137 +.sp-container.sp-palette-buttons-disabled .sp-palette-button-container {
  138 + display: none;
  139 +}
  140 +.sp-palette-only .sp-picker-container {
  141 + display: none;
  142 +}
  143 +.sp-palette-disabled .sp-palette-container {
  144 + display: none;
  145 +}
  146 +
  147 +.sp-initial-disabled .sp-initial {
  148 + display: none;
  149 +}
  150 +
  151 +
  152 +/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */
  153 +.sp-sat {
  154 + background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0)));
  155 + background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0));
  156 + background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
  157 + background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
  158 + background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
  159 + background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0));
  160 + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)";
  161 + filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81');
  162 +}
  163 +.sp-val {
  164 + background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0)));
  165 + background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0));
  166 + background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
  167 + background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
  168 + background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
  169 + background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0));
  170 + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)";
  171 + filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000');
  172 +}
  173 +
  174 +.sp-hue {
  175 + background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  176 + background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  177 + background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  178 + background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000));
  179 + background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  180 + background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  181 +}
  182 +
  183 +/* IE filters do not support multiple color stops.
  184 + Generate 6 divs, line them up, and do two color gradients for each.
  185 + Yes, really.
  186 + */
  187 +.sp-1 {
  188 + height:17%;
  189 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00');
  190 +}
  191 +.sp-2 {
  192 + height:16%;
  193 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00');
  194 +}
  195 +.sp-3 {
  196 + height:17%;
  197 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff');
  198 +}
  199 +.sp-4 {
  200 + height:17%;
  201 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff');
  202 +}
  203 +.sp-5 {
  204 + height:16%;
  205 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff');
  206 +}
  207 +.sp-6 {
  208 + height:17%;
  209 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000');
  210 +}
  211 +
  212 +.sp-hidden {
  213 + display: none !important;
  214 +}
  215 +
  216 +/* Clearfix hack */
  217 +.sp-cf:before, .sp-cf:after { content: ""; display: table; }
  218 +.sp-cf:after { clear: both; }
  219 +.sp-cf { *zoom: 1; }
  220 +
  221 +/* Mobile devices, make hue slider bigger so it is easier to slide */
  222 +@media (max-device-width: 480px) {
  223 + .sp-color { right: 40%; }
  224 + .sp-hue { left: 63%; }
  225 + .sp-fill { padding-top: 60%; }
  226 +}
  227 +.sp-dragger {
  228 + border-radius: 5px;
  229 + height: 5px;
  230 + width: 5px;
  231 + border: 1px solid #fff;
  232 + background: #000;
  233 + cursor: pointer;
  234 + position:absolute;
  235 + top:0;
  236 + left: 0;
  237 +}
  238 +.sp-slider {
  239 + position: absolute;
  240 + top:0;
  241 + cursor:pointer;
  242 + height: 3px;
  243 + left: -1px;
  244 + right: -1px;
  245 + border: 1px solid #000;
  246 + background: white;
  247 + opacity: .8;
  248 +}
  249 +
  250 +/*
  251 +Theme authors:
  252 +Here are the basic themeable display options (colors, fonts, global widths).
  253 +See http://bgrins.github.io/spectrum/themes/ for instructions.
  254 +*/
  255 +
  256 +.sp-container {
  257 + border-radius: 0;
  258 + background-color: #ECECEC;
  259 + border: solid 1px #f0c49B;
  260 + padding: 0;
  261 +}
  262 +.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear {
  263 + font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
  264 + -webkit-box-sizing: border-box;
  265 + -moz-box-sizing: border-box;
  266 + -ms-box-sizing: border-box;
  267 + box-sizing: border-box;
  268 +}
  269 +.sp-top {
  270 + margin-bottom: 3px;
  271 +}
  272 +.sp-color, .sp-hue, .sp-clear {
  273 + border: solid 1px #666;
  274 +}
  275 +
  276 +/* Input */
  277 +.sp-input-container {
  278 + float:right;
  279 + width: 100px;
  280 + margin-bottom: 4px;
  281 +}
  282 +.sp-initial-disabled .sp-input-container {
  283 + width: 100%;
  284 +}
  285 +.sp-input {
  286 + font-size: 12px !important;
  287 + border: 1px inset;
  288 + padding: 4px 5px;
  289 + margin: 0;
  290 + width: 100%;
  291 + background:transparent;
  292 + border-radius: 3px;
  293 + color: #222;
  294 +}
  295 +.sp-input:focus {
  296 + border: 1px solid orange;
  297 +}
  298 +.sp-input.sp-validation-error {
  299 + border: 1px solid red;
  300 + background: #fdd;
  301 +}
  302 +.sp-picker-container , .sp-palette-container {
  303 + float:left;
  304 + position: relative;
  305 + padding: 10px;
  306 + padding-bottom: 300px;
  307 + margin-bottom: -290px;
  308 +}
  309 +.sp-picker-container {
  310 + width: 172px;
  311 + border-left: solid 1px #fff;
  312 +}
  313 +
  314 +/* Palettes */
  315 +.sp-palette-container {
  316 + border-right: solid 1px #ccc;
  317 +}
  318 +
  319 +.sp-palette-only .sp-palette-container {
  320 + border: 0;
  321 +}
  322 +
  323 +.sp-palette .sp-thumb-el {
  324 + display: block;
  325 + position:relative;
  326 + float:left;
  327 + width: 24px;
  328 + height: 15px;
  329 + margin: 3px;
  330 + cursor: pointer;
  331 + border:solid 2px transparent;
  332 +}
  333 +.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active {
  334 + border-color: orange;
  335 +}
  336 +.sp-thumb-el {
  337 + position:relative;
  338 +}
  339 +
  340 +/* Initial */
  341 +.sp-initial {
  342 + float: left;
  343 + border: solid 1px #333;
  344 +}
  345 +.sp-initial span {
  346 + width: 30px;
  347 + height: 25px;
  348 + border:none;
  349 + display:block;
  350 + float:left;
  351 + margin:0;
  352 +}
  353 +
  354 +.sp-initial .sp-clear-display {
  355 + background-position: center;
  356 +}
  357 +
  358 +/* Buttons */
  359 +.sp-palette-button-container,
  360 +.sp-button-container {
  361 + float: right;
  362 +}
  363 +
  364 +/* Replacer (the little preview div that shows up instead of the <input>) */
  365 +.sp-replacer {
  366 + margin:0;
  367 + overflow:hidden;
  368 + cursor:pointer;
  369 + padding: 4px;
  370 + display:inline-block;
  371 + *zoom: 1;
  372 + *display: inline;
  373 + border: solid 1px #91765d;
  374 + background: #eee;
  375 + color: #333;
  376 + vertical-align: middle;
  377 +}
  378 +.sp-replacer:hover, .sp-replacer.sp-active {
  379 + border-color: #F0C49B;
  380 + color: #111;
  381 +}
  382 +.sp-replacer.sp-disabled {
  383 + cursor:default;
  384 + border-color: silver;
  385 + color: silver;
  386 +}
  387 +.sp-dd {
  388 + padding: 2px 0;
  389 + height: 16px;
  390 + line-height: 16px;
  391 + float:left;
  392 + font-size:10px;
  393 +}
  394 +.sp-preview {
  395 + position:relative;
  396 + width:25px;
  397 + height: 20px;
  398 + border: solid 1px #222;
  399 + margin-right: 5px;
  400 + float:left;
  401 + z-index: 0;
  402 +}
  403 +
  404 +.sp-palette {
  405 + *width: 220px;
  406 + max-width: 220px;
  407 +}
  408 +.sp-palette .sp-thumb-el {
  409 + width:16px;
  410 + height: 16px;
  411 + margin:2px 1px;
  412 + border: solid 1px #d0d0d0;
  413 +}
  414 +
  415 +.sp-container {
  416 + padding-bottom:0;
  417 +}
  418 +
  419 +
  420 +/* Buttons: http://hellohappy.org/css3-buttons/ */
  421 +.sp-container button {
  422 + background-color: #eeeeee;
  423 + background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc);
  424 + background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);
  425 + background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);
  426 + background-image: -o-linear-gradient(top, #eeeeee, #cccccc);
  427 + background-image: linear-gradient(to bottom, #eeeeee, #cccccc);
  428 + border: 1px solid #ccc;
  429 + border-bottom: 1px solid #bbb;
  430 + border-radius: 3px;
  431 + color: #333;
  432 + font-size: 14px;
  433 + line-height: 1;
  434 + padding: 5px 4px;
  435 + text-align: center;
  436 + text-shadow: 0 1px 0 #eee;
  437 + vertical-align: middle;
  438 +}
  439 +.sp-container button:hover {
  440 + background-color: #dddddd;
  441 + background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb);
  442 + background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb);
  443 + background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);
  444 + background-image: -o-linear-gradient(top, #dddddd, #bbbbbb);
  445 + background-image: linear-gradient(to bottom, #dddddd, #bbbbbb);
  446 + border: 1px solid #bbb;
  447 + border-bottom: 1px solid #999;
  448 + cursor: pointer;
  449 + text-shadow: 0 1px 0 #ddd;
  450 +}
  451 +.sp-container button:active {
  452 + border: 1px solid #aaa;
  453 + border-bottom: 1px solid #888;
  454 + -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
  455 + -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
  456 + -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
  457 + -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
  458 + box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
  459 +}
  460 +.sp-cancel {
  461 + font-size: 11px;
  462 + color: #d93f3f !important;
  463 + margin:0;
  464 + padding:2px;
  465 + margin-right: 5px;
  466 + vertical-align: middle;
  467 + text-decoration:none;
  468 +
  469 +}
  470 +.sp-cancel:hover {
  471 + color: #d93f3f !important;
  472 + text-decoration: underline;
  473 +}
  474 +
  475 +
  476 +.sp-palette span:hover, .sp-palette span.sp-thumb-active {
  477 + border-color: #000;
  478 +}
  479 +
  480 +.sp-preview, .sp-alpha, .sp-thumb-el {
  481 + position:relative;
  482 + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
  483 +}
  484 +.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner {
  485 + display:block;
  486 + position:absolute;
  487 + top:0;left:0;bottom:0;right:0;
  488 +}
  489 +
  490 +.sp-palette .sp-thumb-inner {
  491 + background-position: 50% 50%;
  492 + background-repeat: no-repeat;
  493 +}
  494 +
  495 +.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner {
  496 + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=);
  497 +}
  498 +
  499 +.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner {
  500 + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=);
  501 +}
  502 +
  503 +.sp-clear-display {
  504 + background-repeat:no-repeat;
  505 + background-position: center;
  506 + background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==);
  507 +}
src/main/resources/static/real_control_v2/assets/plugins/spectrum/spectrum.js 0 → 100644
  1 +// Spectrum Colorpicker v1.8.0
  2 +// https://github.com/bgrins/spectrum
  3 +// Author: Brian Grinstead
  4 +// License: MIT
  5 +
  6 +(function (factory) {
  7 + "use strict";
  8 +
  9 + if (typeof define === 'function' && define.amd) { // AMD
  10 + define(['jquery'], factory);
  11 + }
  12 + else if (typeof exports == "object" && typeof module == "object") { // CommonJS
  13 + module.exports = factory(require('jquery'));
  14 + }
  15 + else { // Browser
  16 + factory(jQuery);
  17 + }
  18 +})(function($, undefined) {
  19 + "use strict";
  20 +
  21 + var defaultOpts = {
  22 +
  23 + // Callbacks
  24 + beforeShow: noop,
  25 + move: noop,
  26 + change: noop,
  27 + show: noop,
  28 + hide: noop,
  29 +
  30 + // Options
  31 + color: false,
  32 + flat: false,
  33 + showInput: false,
  34 + allowEmpty: false,
  35 + showButtons: true,
  36 + clickoutFiresChange: true,
  37 + showInitial: false,
  38 + showPalette: false,
  39 + showPaletteOnly: false,
  40 + hideAfterPaletteSelect: false,
  41 + togglePaletteOnly: false,
  42 + showSelectionPalette: true,
  43 + localStorageKey: false,
  44 + appendTo: "body",
  45 + maxSelectionSize: 7,
  46 + cancelText: "cancel",
  47 + chooseText: "choose",
  48 + togglePaletteMoreText: "more",
  49 + togglePaletteLessText: "less",
  50 + clearText: "Clear Color Selection",
  51 + noColorSelectedText: "No Color Selected",
  52 + preferredFormat: false,
  53 + className: "", // Deprecated - use containerClassName and replacerClassName instead.
  54 + containerClassName: "",
  55 + replacerClassName: "",
  56 + showAlpha: false,
  57 + theme: "sp-light",
  58 + palette: [["#ffffff", "#000000", "#ff0000", "#ff8000", "#ffff00", "#008000", "#0000ff", "#4b0082", "#9400d3"]],
  59 + selectionPalette: [],
  60 + disabled: false,
  61 + offset: null
  62 + },
  63 + spectrums = [],
  64 + IE = !!/msie/i.exec( window.navigator.userAgent ),
  65 + rgbaSupport = (function() {
  66 + function contains( str, substr ) {
  67 + return !!~('' + str).indexOf(substr);
  68 + }
  69 +
  70 + var elem = document.createElement('div');
  71 + var style = elem.style;
  72 + style.cssText = 'background-color:rgba(0,0,0,.5)';
  73 + return contains(style.backgroundColor, 'rgba') || contains(style.backgroundColor, 'hsla');
  74 + })(),
  75 + replaceInput = [
  76 + "<div class='sp-replacer'>",
  77 + "<div class='sp-preview'><div class='sp-preview-inner'></div></div>",
  78 + "<div class='sp-dd'>&#9660;</div>",
  79 + "</div>"
  80 + ].join(''),
  81 + markup = (function () {
  82 +
  83 + // IE does not support gradients with multiple stops, so we need to simulate
  84 + // that for the rainbow slider with 8 divs that each have a single gradient
  85 + var gradientFix = "";
  86 + if (IE) {
  87 + for (var i = 1; i <= 6; i++) {
  88 + gradientFix += "<div class='sp-" + i + "'></div>";
  89 + }
  90 + }
  91 +
  92 + return [
  93 + "<div class='sp-container sp-hidden'>",
  94 + "<div class='sp-palette-container'>",
  95 + "<div class='sp-palette sp-thumb sp-cf'></div>",
  96 + "<div class='sp-palette-button-container sp-cf'>",
  97 + "<button type='button' class='sp-palette-toggle'></button>",
  98 + "</div>",
  99 + "</div>",
  100 + "<div class='sp-picker-container'>",
  101 + "<div class='sp-top sp-cf'>",
  102 + "<div class='sp-fill'></div>",
  103 + "<div class='sp-top-inner'>",
  104 + "<div class='sp-color'>",
  105 + "<div class='sp-sat'>",
  106 + "<div class='sp-val'>",
  107 + "<div class='sp-dragger'></div>",
  108 + "</div>",
  109 + "</div>",
  110 + "</div>",
  111 + "<div class='sp-clear sp-clear-display'>",
  112 + "</div>",
  113 + "<div class='sp-hue'>",
  114 + "<div class='sp-slider'></div>",
  115 + gradientFix,
  116 + "</div>",
  117 + "</div>",
  118 + "<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle'></div></div></div>",
  119 + "</div>",
  120 + "<div class='sp-input-container sp-cf'>",
  121 + "<input class='sp-input' type='text' spellcheck='false' />",
  122 + "</div>",
  123 + "<div class='sp-initial sp-thumb sp-cf'></div>",
  124 + "<div class='sp-button-container sp-cf'>",
  125 + "<a class='sp-cancel' href='#'></a>",
  126 + "<button type='button' class='sp-choose'></button>",
  127 + "</div>",
  128 + "</div>",
  129 + "</div>"
  130 + ].join("");
  131 + })();
  132 +
  133 + function paletteTemplate (p, color, className, opts) {
  134 + var html = [];
  135 + for (var i = 0; i < p.length; i++) {
  136 + var current = p[i];
  137 + if(current) {
  138 + var tiny = tinycolor(current);
  139 + var c = tiny.toHsl().l < 0.5 ? "sp-thumb-el sp-thumb-dark" : "sp-thumb-el sp-thumb-light";
  140 + c += (tinycolor.equals(color, current)) ? " sp-thumb-active" : "";
  141 + var formattedString = tiny.toString(opts.preferredFormat || "rgb");
  142 + var swatchStyle = rgbaSupport ? ("background-color:" + tiny.toRgbString()) : "filter:" + tiny.toFilter();
  143 + html.push('<span title="' + formattedString + '" data-color="' + tiny.toRgbString() + '" class="' + c + '"><span class="sp-thumb-inner" style="' + swatchStyle + ';" /></span>');
  144 + } else {
  145 + var cls = 'sp-clear-display';
  146 + html.push($('<div />')
  147 + .append($('<span data-color="" style="background-color:transparent;" class="' + cls + '"></span>')
  148 + .attr('title', opts.noColorSelectedText)
  149 + )
  150 + .html()
  151 + );
  152 + }
  153 + }
  154 + return "<div class='sp-cf " + className + "'>" + html.join('') + "</div>";
  155 + }
  156 +
  157 + function hideAll() {
  158 + for (var i = 0; i < spectrums.length; i++) {
  159 + if (spectrums[i]) {
  160 + spectrums[i].hide();
  161 + }
  162 + }
  163 + }
  164 +
  165 + function instanceOptions(o, callbackContext) {
  166 + var opts = $.extend({}, defaultOpts, o);
  167 + opts.callbacks = {
  168 + 'move': bind(opts.move, callbackContext),
  169 + 'change': bind(opts.change, callbackContext),
  170 + 'show': bind(opts.show, callbackContext),
  171 + 'hide': bind(opts.hide, callbackContext),
  172 + 'beforeShow': bind(opts.beforeShow, callbackContext)
  173 + };
  174 +
  175 + return opts;
  176 + }
  177 +
  178 + function spectrum(element, o) {
  179 +
  180 + var opts = instanceOptions(o, element),
  181 + flat = opts.flat,
  182 + showSelectionPalette = opts.showSelectionPalette,
  183 + localStorageKey = opts.localStorageKey,
  184 + theme = opts.theme,
  185 + callbacks = opts.callbacks,
  186 + resize = throttle(reflow, 10),
  187 + visible = false,
  188 + isDragging = false,
  189 + dragWidth = 0,
  190 + dragHeight = 0,
  191 + dragHelperHeight = 0,
  192 + slideHeight = 0,
  193 + slideWidth = 0,
  194 + alphaWidth = 0,
  195 + alphaSlideHelperWidth = 0,
  196 + slideHelperHeight = 0,
  197 + currentHue = 0,
  198 + currentSaturation = 0,
  199 + currentValue = 0,
  200 + currentAlpha = 1,
  201 + palette = [],
  202 + paletteArray = [],
  203 + paletteLookup = {},
  204 + selectionPalette = opts.selectionPalette.slice(0),
  205 + maxSelectionSize = opts.maxSelectionSize,
  206 + draggingClass = "sp-dragging",
  207 + shiftMovementDirection = null;
  208 +
  209 + var doc = element.ownerDocument,
  210 + body = doc.body,
  211 + boundElement = $(element),
  212 + disabled = false,
  213 + container = $(markup, doc).addClass(theme),
  214 + pickerContainer = container.find(".sp-picker-container"),
  215 + dragger = container.find(".sp-color"),
  216 + dragHelper = container.find(".sp-dragger"),
  217 + slider = container.find(".sp-hue"),
  218 + slideHelper = container.find(".sp-slider"),
  219 + alphaSliderInner = container.find(".sp-alpha-inner"),
  220 + alphaSlider = container.find(".sp-alpha"),
  221 + alphaSlideHelper = container.find(".sp-alpha-handle"),
  222 + textInput = container.find(".sp-input"),
  223 + paletteContainer = container.find(".sp-palette"),
  224 + initialColorContainer = container.find(".sp-initial"),
  225 + cancelButton = container.find(".sp-cancel"),
  226 + clearButton = container.find(".sp-clear"),
  227 + chooseButton = container.find(".sp-choose"),
  228 + toggleButton = container.find(".sp-palette-toggle"),
  229 + isInput = boundElement.is("input"),
  230 + isInputTypeColor = isInput && boundElement.attr("type") === "color" && inputTypeColorSupport(),
  231 + shouldReplace = isInput && !flat,
  232 + replacer = (shouldReplace) ? $(replaceInput).addClass(theme).addClass(opts.className).addClass(opts.replacerClassName) : $([]),
  233 + offsetElement = (shouldReplace) ? replacer : boundElement,
  234 + previewElement = replacer.find(".sp-preview-inner"),
  235 + initialColor = opts.color || (isInput && boundElement.val()),
  236 + colorOnShow = false,
  237 + currentPreferredFormat = opts.preferredFormat,
  238 + clickoutFiresChange = !opts.showButtons || opts.clickoutFiresChange,
  239 + isEmpty = !initialColor,
  240 + allowEmpty = opts.allowEmpty && !isInputTypeColor;
  241 +
  242 + function applyOptions() {
  243 +
  244 + if (opts.showPaletteOnly) {
  245 + opts.showPalette = true;
  246 + }
  247 +
  248 + toggleButton.text(opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText);
  249 +
  250 + if (opts.palette) {
  251 + palette = opts.palette.slice(0);
  252 + paletteArray = $.isArray(palette[0]) ? palette : [palette];
  253 + paletteLookup = {};
  254 + for (var i = 0; i < paletteArray.length; i++) {
  255 + for (var j = 0; j < paletteArray[i].length; j++) {
  256 + var rgb = tinycolor(paletteArray[i][j]).toRgbString();
  257 + paletteLookup[rgb] = true;
  258 + }
  259 + }
  260 + }
  261 +
  262 + container.toggleClass("sp-flat", flat);
  263 + container.toggleClass("sp-input-disabled", !opts.showInput);
  264 + container.toggleClass("sp-alpha-enabled", opts.showAlpha);
  265 + container.toggleClass("sp-clear-enabled", allowEmpty);
  266 + container.toggleClass("sp-buttons-disabled", !opts.showButtons);
  267 + container.toggleClass("sp-palette-buttons-disabled", !opts.togglePaletteOnly);
  268 + container.toggleClass("sp-palette-disabled", !opts.showPalette);
  269 + container.toggleClass("sp-palette-only", opts.showPaletteOnly);
  270 + container.toggleClass("sp-initial-disabled", !opts.showInitial);
  271 + container.addClass(opts.className).addClass(opts.containerClassName);
  272 +
  273 + reflow();
  274 + }
  275 +
  276 + function initialize() {
  277 +
  278 + if (IE) {
  279 + container.find("*:not(input)").attr("unselectable", "on");
  280 + }
  281 +
  282 + applyOptions();
  283 +
  284 + if (shouldReplace) {
  285 + boundElement.after(replacer).hide();
  286 + }
  287 +
  288 + if (!allowEmpty) {
  289 + clearButton.hide();
  290 + }
  291 +
  292 + if (flat) {
  293 + boundElement.after(container).hide();
  294 + }
  295 + else {
  296 +
  297 + var appendTo = opts.appendTo === "parent" ? boundElement.parent() : $(opts.appendTo);
  298 + if (appendTo.length !== 1) {
  299 + appendTo = $("body");
  300 + }
  301 +
  302 + appendTo.append(container);
  303 + }
  304 +
  305 + updateSelectionPaletteFromStorage();
  306 +
  307 + offsetElement.on("click.spectrum touchstart.spectrum", function (e) {
  308 + if (!disabled) {
  309 + toggle();
  310 + }
  311 +
  312 + e.stopPropagation();
  313 +
  314 + if (!$(e.target).is("input")) {
  315 + e.preventDefault();
  316 + }
  317 + });
  318 +
  319 + if(boundElement.is(":disabled") || (opts.disabled === true)) {
  320 + disable();
  321 + }
  322 +
  323 + // Prevent clicks from bubbling up to document. This would cause it to be hidden.
  324 + container.click(stopPropagation);
  325 +
  326 + // Handle user typed input
  327 + textInput.change(setFromTextInput);
  328 + textInput.on("paste", function () {
  329 + setTimeout(setFromTextInput, 1);
  330 + });
  331 + textInput.keydown(function (e) { if (e.keyCode == 13) { setFromTextInput(); } });
  332 +
  333 + cancelButton.text(opts.cancelText);
  334 + cancelButton.on("click.spectrum", function (e) {
  335 + e.stopPropagation();
  336 + e.preventDefault();
  337 + revert();
  338 + hide();
  339 + });
  340 +
  341 + clearButton.attr("title", opts.clearText);
  342 + clearButton.on("click.spectrum", function (e) {
  343 + e.stopPropagation();
  344 + e.preventDefault();
  345 + isEmpty = true;
  346 + move();
  347 +
  348 + if(flat) {
  349 + //for the flat style, this is a change event
  350 + updateOriginalInput(true);
  351 + }
  352 + });
  353 +
  354 + chooseButton.text(opts.chooseText);
  355 + chooseButton.on("click.spectrum", function (e) {
  356 + e.stopPropagation();
  357 + e.preventDefault();
  358 +
  359 + if (IE && textInput.is(":focus")) {
  360 + textInput.trigger('change');
  361 + }
  362 +
  363 + if (isValid()) {
  364 + updateOriginalInput(true);
  365 + hide();
  366 + }
  367 + });
  368 +
  369 + toggleButton.text(opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText);
  370 + toggleButton.on("click.spectrum", function (e) {
  371 + e.stopPropagation();
  372 + e.preventDefault();
  373 +
  374 + opts.showPaletteOnly = !opts.showPaletteOnly;
  375 +
  376 + // To make sure the Picker area is drawn on the right, next to the
  377 + // Palette area (and not below the palette), first move the Palette
  378 + // to the left to make space for the picker, plus 5px extra.
  379 + // The 'applyOptions' function puts the whole container back into place
  380 + // and takes care of the button-text and the sp-palette-only CSS class.
  381 + if (!opts.showPaletteOnly && !flat) {
  382 + container.css('left', '-=' + (pickerContainer.outerWidth(true) + 5));
  383 + }
  384 + applyOptions();
  385 + });
  386 +
  387 + draggable(alphaSlider, function (dragX, dragY, e) {
  388 + currentAlpha = (dragX / alphaWidth);
  389 + isEmpty = false;
  390 + if (e.shiftKey) {
  391 + currentAlpha = Math.round(currentAlpha * 10) / 10;
  392 + }
  393 +
  394 + move();
  395 + }, dragStart, dragStop);
  396 +
  397 + draggable(slider, function (dragX, dragY) {
  398 + currentHue = parseFloat(dragY / slideHeight);
  399 + isEmpty = false;
  400 + if (!opts.showAlpha) {
  401 + currentAlpha = 1;
  402 + }
  403 + move();
  404 + }, dragStart, dragStop);
  405 +
  406 + draggable(dragger, function (dragX, dragY, e) {
  407 +
  408 + // shift+drag should snap the movement to either the x or y axis.
  409 + if (!e.shiftKey) {
  410 + shiftMovementDirection = null;
  411 + }
  412 + else if (!shiftMovementDirection) {
  413 + var oldDragX = currentSaturation * dragWidth;
  414 + var oldDragY = dragHeight - (currentValue * dragHeight);
  415 + var furtherFromX = Math.abs(dragX - oldDragX) > Math.abs(dragY - oldDragY);
  416 +
  417 + shiftMovementDirection = furtherFromX ? "x" : "y";
  418 + }
  419 +
  420 + var setSaturation = !shiftMovementDirection || shiftMovementDirection === "x";
  421 + var setValue = !shiftMovementDirection || shiftMovementDirection === "y";
  422 +
  423 + if (setSaturation) {
  424 + currentSaturation = parseFloat(dragX / dragWidth);
  425 + }
  426 + if (setValue) {
  427 + currentValue = parseFloat((dragHeight - dragY) / dragHeight);
  428 + }
  429 +
  430 + isEmpty = false;
  431 + if (!opts.showAlpha) {
  432 + currentAlpha = 1;
  433 + }
  434 +
  435 + move();
  436 +
  437 + }, dragStart, dragStop);
  438 +
  439 + if (!!initialColor) {
  440 + set(initialColor);
  441 +
  442 + // In case color was black - update the preview UI and set the format
  443 + // since the set function will not run (default color is black).
  444 + updateUI();
  445 + currentPreferredFormat = opts.preferredFormat || tinycolor(initialColor).format;
  446 +
  447 + addColorToSelectionPalette(initialColor);
  448 + }
  449 + else {
  450 + updateUI();
  451 + }
  452 +
  453 + if (flat) {
  454 + show();
  455 + }
  456 +
  457 + function paletteElementClick(e) {
  458 + if (e.data && e.data.ignore) {
  459 + set($(e.target).closest(".sp-thumb-el").data("color"));
  460 + move();
  461 + }
  462 + else {
  463 + set($(e.target).closest(".sp-thumb-el").data("color"));
  464 + move();
  465 +
  466 + // If the picker is going to close immediately, a palette selection
  467 + // is a change. Otherwise, it's a move only.
  468 + if (opts.hideAfterPaletteSelect) {
  469 + updateOriginalInput(true);
  470 + hide();
  471 + } else {
  472 + updateOriginalInput();
  473 + }
  474 + }
  475 +
  476 + return false;
  477 + }
  478 +
  479 + var paletteEvent = IE ? "mousedown.spectrum" : "click.spectrum touchstart.spectrum";
  480 + paletteContainer.on(paletteEvent, ".sp-thumb-el", paletteElementClick);
  481 + initialColorContainer.on(paletteEvent, ".sp-thumb-el:nth-child(1)", { ignore: true }, paletteElementClick);
  482 + }
  483 +
  484 + function updateSelectionPaletteFromStorage() {
  485 +
  486 + if (localStorageKey && window.localStorage) {
  487 +
  488 + // Migrate old palettes over to new format. May want to remove this eventually.
  489 + try {
  490 + var oldPalette = window.localStorage[localStorageKey].split(",#");
  491 + if (oldPalette.length > 1) {
  492 + delete window.localStorage[localStorageKey];
  493 + $.each(oldPalette, function(i, c) {
  494 + addColorToSelectionPalette(c);
  495 + });
  496 + }
  497 + }
  498 + catch(e) { }
  499 +
  500 + try {
  501 + selectionPalette = window.localStorage[localStorageKey].split(";");
  502 + }
  503 + catch (e) { }
  504 + }
  505 + }
  506 +
  507 + function addColorToSelectionPalette(color) {
  508 + if (showSelectionPalette) {
  509 + var rgb = tinycolor(color).toRgbString();
  510 + if (!paletteLookup[rgb] && $.inArray(rgb, selectionPalette) === -1) {
  511 + selectionPalette.push(rgb);
  512 + while(selectionPalette.length > maxSelectionSize) {
  513 + selectionPalette.shift();
  514 + }
  515 + }
  516 +
  517 + if (localStorageKey && window.localStorage) {
  518 + try {
  519 + window.localStorage[localStorageKey] = selectionPalette.join(";");
  520 + }
  521 + catch(e) { }
  522 + }
  523 + }
  524 + }
  525 +
  526 + function getUniqueSelectionPalette() {
  527 + var unique = [];
  528 + if (opts.showPalette) {
  529 + for (var i = 0; i < selectionPalette.length; i++) {
  530 + var rgb = tinycolor(selectionPalette[i]).toRgbString();
  531 +
  532 + if (!paletteLookup[rgb]) {
  533 + unique.push(selectionPalette[i]);
  534 + }
  535 + }
  536 + }
  537 +
  538 + return unique.reverse().slice(0, opts.maxSelectionSize);
  539 + }
  540 +
  541 + function drawPalette() {
  542 +
  543 + var currentColor = get();
  544 +
  545 + var html = $.map(paletteArray, function (palette, i) {
  546 + return paletteTemplate(palette, currentColor, "sp-palette-row sp-palette-row-" + i, opts);
  547 + });
  548 +
  549 + updateSelectionPaletteFromStorage();
  550 +
  551 + if (selectionPalette) {
  552 + html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, "sp-palette-row sp-palette-row-selection", opts));
  553 + }
  554 +
  555 + paletteContainer.html(html.join(""));
  556 + }
  557 +
  558 + function drawInitial() {
  559 + if (opts.showInitial) {
  560 + var initial = colorOnShow;
  561 + var current = get();
  562 + initialColorContainer.html(paletteTemplate([initial, current], current, "sp-palette-row-initial", opts));
  563 + }
  564 + }
  565 +
  566 + function dragStart() {
  567 + if (dragHeight <= 0 || dragWidth <= 0 || slideHeight <= 0) {
  568 + reflow();
  569 + }
  570 + isDragging = true;
  571 + container.addClass(draggingClass);
  572 + shiftMovementDirection = null;
  573 + boundElement.trigger('dragstart.spectrum', [ get() ]);
  574 + }
  575 +
  576 + function dragStop() {
  577 + isDragging = false;
  578 + container.removeClass(draggingClass);
  579 + boundElement.trigger('dragstop.spectrum', [ get() ]);
  580 + }
  581 +
  582 + function setFromTextInput() {
  583 +
  584 + var value = textInput.val();
  585 +
  586 + if ((value === null || value === "") && allowEmpty) {
  587 + set(null);
  588 + move();
  589 + updateOriginalInput();
  590 + }
  591 + else {
  592 + var tiny = tinycolor(value);
  593 + if (tiny.isValid()) {
  594 + set(tiny);
  595 + move();
  596 + updateOriginalInput();
  597 + }
  598 + else {
  599 + textInput.addClass("sp-validation-error");
  600 + }
  601 + }
  602 + }
  603 +
  604 + function toggle() {
  605 + if (visible) {
  606 + hide();
  607 + }
  608 + else {
  609 + show();
  610 + }
  611 + }
  612 +
  613 + function show() {
  614 + var event = $.Event('beforeShow.spectrum');
  615 +
  616 + if (visible) {
  617 + reflow();
  618 + return;
  619 + }
  620 +
  621 + boundElement.trigger(event, [ get() ]);
  622 +
  623 + if (callbacks.beforeShow(get()) === false || event.isDefaultPrevented()) {
  624 + return;
  625 + }
  626 +
  627 + hideAll();
  628 + visible = true;
  629 +
  630 + $(doc).on("keydown.spectrum", onkeydown);
  631 + $(doc).on("click.spectrum", clickout);
  632 + $(window).on("resize.spectrum", resize);
  633 + replacer.addClass("sp-active");
  634 + container.removeClass("sp-hidden");
  635 +
  636 + reflow();
  637 + updateUI();
  638 +
  639 + colorOnShow = get();
  640 +
  641 + drawInitial();
  642 + callbacks.show(colorOnShow);
  643 + boundElement.trigger('show.spectrum', [ colorOnShow ]);
  644 + }
  645 +
  646 + function onkeydown(e) {
  647 + // Close on ESC
  648 + if (e.keyCode === 27) {
  649 + hide();
  650 + }
  651 + }
  652 +
  653 + function clickout(e) {
  654 + // Return on right click.
  655 + if (e.button == 2) { return; }
  656 +
  657 + // If a drag event was happening during the mouseup, don't hide
  658 + // on click.
  659 + if (isDragging) { return; }
  660 +
  661 + if (clickoutFiresChange) {
  662 + updateOriginalInput(true);
  663 + }
  664 + else {
  665 + revert();
  666 + }
  667 + hide();
  668 + }
  669 +
  670 + function hide() {
  671 + // Return if hiding is unnecessary
  672 + if (!visible || flat) { return; }
  673 + visible = false;
  674 +
  675 + $(doc).off("keydown.spectrum", onkeydown);
  676 + $(doc).off("click.spectrum", clickout);
  677 + $(window).off("resize.spectrum", resize);
  678 +
  679 + replacer.removeClass("sp-active");
  680 + container.addClass("sp-hidden");
  681 +
  682 + callbacks.hide(get());
  683 + boundElement.trigger('hide.spectrum', [ get() ]);
  684 + }
  685 +
  686 + function revert() {
  687 + set(colorOnShow, true);
  688 + updateOriginalInput(true);
  689 + }
  690 +
  691 + function set(color, ignoreFormatChange) {
  692 + if (tinycolor.equals(color, get())) {
  693 + // Update UI just in case a validation error needs
  694 + // to be cleared.
  695 + updateUI();
  696 + return;
  697 + }
  698 +
  699 + var newColor, newHsv;
  700 + if (!color && allowEmpty) {
  701 + isEmpty = true;
  702 + } else {
  703 + isEmpty = false;
  704 + newColor = tinycolor(color);
  705 + newHsv = newColor.toHsv();
  706 +
  707 + currentHue = (newHsv.h % 360) / 360;
  708 + currentSaturation = newHsv.s;
  709 + currentValue = newHsv.v;
  710 + currentAlpha = newHsv.a;
  711 + }
  712 + updateUI();
  713 +
  714 + if (newColor && newColor.isValid() && !ignoreFormatChange) {
  715 + currentPreferredFormat = opts.preferredFormat || newColor.getFormat();
  716 + }
  717 + }
  718 +
  719 + function get(opts) {
  720 + opts = opts || { };
  721 +
  722 + if (allowEmpty && isEmpty) {
  723 + return null;
  724 + }
  725 +
  726 + return tinycolor.fromRatio({
  727 + h: currentHue,
  728 + s: currentSaturation,
  729 + v: currentValue,
  730 + a: Math.round(currentAlpha * 1000) / 1000
  731 + }, { format: opts.format || currentPreferredFormat });
  732 + }
  733 +
  734 + function isValid() {
  735 + return !textInput.hasClass("sp-validation-error");
  736 + }
  737 +
  738 + function move() {
  739 + updateUI();
  740 +
  741 + callbacks.move(get());
  742 + boundElement.trigger('move.spectrum', [ get() ]);
  743 + }
  744 +
  745 + function updateUI() {
  746 +
  747 + textInput.removeClass("sp-validation-error");
  748 +
  749 + updateHelperLocations();
  750 +
  751 + // Update dragger background color (gradients take care of saturation and value).
  752 + var flatColor = tinycolor.fromRatio({ h: currentHue, s: 1, v: 1 });
  753 + dragger.css("background-color", flatColor.toHexString());
  754 +
  755 + // Get a format that alpha will be included in (hex and names ignore alpha)
  756 + var format = currentPreferredFormat;
  757 + if (currentAlpha < 1 && !(currentAlpha === 0 && format === "name")) {
  758 + if (format === "hex" || format === "hex3" || format === "hex6" || format === "name") {
  759 + format = "rgb";
  760 + }
  761 + }
  762 +
  763 + var realColor = get({ format: format }),
  764 + displayColor = '';
  765 +
  766 + //reset background info for preview element
  767 + previewElement.removeClass("sp-clear-display");
  768 + previewElement.css('background-color', 'transparent');
  769 +
  770 + if (!realColor && allowEmpty) {
  771 + // Update the replaced elements background with icon indicating no color selection
  772 + previewElement.addClass("sp-clear-display");
  773 + }
  774 + else {
  775 + var realHex = realColor.toHexString(),
  776 + realRgb = realColor.toRgbString();
  777 +
  778 + // Update the replaced elements background color (with actual selected color)
  779 + if (rgbaSupport || realColor.alpha === 1) {
  780 + previewElement.css("background-color", realRgb);
  781 + }
  782 + else {
  783 + previewElement.css("background-color", "transparent");
  784 + previewElement.css("filter", realColor.toFilter());
  785 + }
  786 +
  787 + if (opts.showAlpha) {
  788 + var rgb = realColor.toRgb();
  789 + rgb.a = 0;
  790 + var realAlpha = tinycolor(rgb).toRgbString();
  791 + var gradient = "linear-gradient(left, " + realAlpha + ", " + realHex + ")";
  792 +
  793 + if (IE) {
  794 + alphaSliderInner.css("filter", tinycolor(realAlpha).toFilter({ gradientType: 1 }, realHex));
  795 + }
  796 + else {
  797 + alphaSliderInner.css("background", "-webkit-" + gradient);
  798 + alphaSliderInner.css("background", "-moz-" + gradient);
  799 + alphaSliderInner.css("background", "-ms-" + gradient);
  800 + // Use current syntax gradient on unprefixed property.
  801 + alphaSliderInner.css("background",
  802 + "linear-gradient(to right, " + realAlpha + ", " + realHex + ")");
  803 + }
  804 + }
  805 +
  806 + displayColor = realColor.toString(format);
  807 + }
  808 +
  809 + // Update the text entry input as it changes happen
  810 + if (opts.showInput) {
  811 + textInput.val(displayColor);
  812 + }
  813 +
  814 + if (opts.showPalette) {
  815 + drawPalette();
  816 + }
  817 +
  818 + drawInitial();
  819 + }
  820 +
  821 + function updateHelperLocations() {
  822 + var s = currentSaturation;
  823 + var v = currentValue;
  824 +
  825 + if(allowEmpty && isEmpty) {
  826 + //if selected color is empty, hide the helpers
  827 + alphaSlideHelper.hide();
  828 + slideHelper.hide();
  829 + dragHelper.hide();
  830 + }
  831 + else {
  832 + //make sure helpers are visible
  833 + alphaSlideHelper.show();
  834 + slideHelper.show();
  835 + dragHelper.show();
  836 +
  837 + // Where to show the little circle in that displays your current selected color
  838 + var dragX = s * dragWidth;
  839 + var dragY = dragHeight - (v * dragHeight);
  840 + dragX = Math.max(
  841 + -dragHelperHeight,
  842 + Math.min(dragWidth - dragHelperHeight, dragX - dragHelperHeight)
  843 + );
  844 + dragY = Math.max(
  845 + -dragHelperHeight,
  846 + Math.min(dragHeight - dragHelperHeight, dragY - dragHelperHeight)
  847 + );
  848 + dragHelper.css({
  849 + "top": dragY + "px",
  850 + "left": dragX + "px"
  851 + });
  852 +
  853 + var alphaX = currentAlpha * alphaWidth;
  854 + alphaSlideHelper.css({
  855 + "left": (alphaX - (alphaSlideHelperWidth / 2)) + "px"
  856 + });
  857 +
  858 + // Where to show the bar that displays your current selected hue
  859 + var slideY = (currentHue) * slideHeight;
  860 + slideHelper.css({
  861 + "top": (slideY - slideHelperHeight) + "px"
  862 + });
  863 + }
  864 + }
  865 +
  866 + function updateOriginalInput(fireCallback) {
  867 + var color = get(),
  868 + displayColor = '',
  869 + hasChanged = !tinycolor.equals(color, colorOnShow);
  870 +
  871 + if (color) {
  872 + displayColor = color.toString(currentPreferredFormat);
  873 + // Update the selection palette with the current color
  874 + addColorToSelectionPalette(color);
  875 + }
  876 +
  877 + if (isInput) {
  878 + boundElement.val(displayColor);
  879 + }
  880 +
  881 + if (fireCallback && hasChanged) {
  882 + callbacks.change(color);
  883 + boundElement.trigger('change', [ color ]);
  884 + }
  885 + }
  886 +
  887 + function reflow() {
  888 + if (!visible) {
  889 + return; // Calculations would be useless and wouldn't be reliable anyways
  890 + }
  891 + dragWidth = dragger.width();
  892 + dragHeight = dragger.height();
  893 + dragHelperHeight = dragHelper.height();
  894 + slideWidth = slider.width();
  895 + slideHeight = slider.height();
  896 + slideHelperHeight = slideHelper.height();
  897 + alphaWidth = alphaSlider.width();
  898 + alphaSlideHelperWidth = alphaSlideHelper.width();
  899 +
  900 + if (!flat) {
  901 + container.css("position", "absolute");
  902 + if (opts.offset) {
  903 + container.offset(opts.offset);
  904 + } else {
  905 + container.offset(getOffset(container, offsetElement));
  906 + }
  907 + }
  908 +
  909 + updateHelperLocations();
  910 +
  911 + if (opts.showPalette) {
  912 + drawPalette();
  913 + }
  914 +
  915 + boundElement.trigger('reflow.spectrum');
  916 + }
  917 +
  918 + function destroy() {
  919 + boundElement.show();
  920 + offsetElement.off("click.spectrum touchstart.spectrum");
  921 + container.remove();
  922 + replacer.remove();
  923 + spectrums[spect.id] = null;
  924 + }
  925 +
  926 + function option(optionName, optionValue) {
  927 + if (optionName === undefined) {
  928 + return $.extend({}, opts);
  929 + }
  930 + if (optionValue === undefined) {
  931 + return opts[optionName];
  932 + }
  933 +
  934 + opts[optionName] = optionValue;
  935 +
  936 + if (optionName === "preferredFormat") {
  937 + currentPreferredFormat = opts.preferredFormat;
  938 + }
  939 + applyOptions();
  940 + }
  941 +
  942 + function enable() {
  943 + disabled = false;
  944 + boundElement.attr("disabled", false);
  945 + offsetElement.removeClass("sp-disabled");
  946 + }
  947 +
  948 + function disable() {
  949 + hide();
  950 + disabled = true;
  951 + boundElement.attr("disabled", true);
  952 + offsetElement.addClass("sp-disabled");
  953 + }
  954 +
  955 + function setOffset(coord) {
  956 + opts.offset = coord;
  957 + reflow();
  958 + }
  959 +
  960 + initialize();
  961 +
  962 + var spect = {
  963 + show: show,
  964 + hide: hide,
  965 + toggle: toggle,
  966 + reflow: reflow,
  967 + option: option,
  968 + enable: enable,
  969 + disable: disable,
  970 + offset: setOffset,
  971 + set: function (c) {
  972 + set(c);
  973 + updateOriginalInput();
  974 + },
  975 + get: get,
  976 + destroy: destroy,
  977 + container: container
  978 + };
  979 +
  980 + spect.id = spectrums.push(spect) - 1;
  981 +
  982 + return spect;
  983 + }
  984 +
  985 + /**
  986 + * checkOffset - get the offset below/above and left/right element depending on screen position
  987 + * Thanks https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js
  988 + */
  989 + function getOffset(picker, input) {
  990 + var extraY = 0;
  991 + var dpWidth = picker.outerWidth();
  992 + var dpHeight = picker.outerHeight();
  993 + var inputHeight = input.outerHeight();
  994 + var doc = picker[0].ownerDocument;
  995 + var docElem = doc.documentElement;
  996 + var viewWidth = docElem.clientWidth + $(doc).scrollLeft();
  997 + var viewHeight = docElem.clientHeight + $(doc).scrollTop();
  998 + var offset = input.offset();
  999 + var offsetLeft = offset.left;
  1000 + var offsetTop = offset.top;
  1001 +
  1002 + offsetTop += inputHeight;
  1003 +
  1004 + offsetLeft -=
  1005 + Math.min(offsetLeft, (offsetLeft + dpWidth > viewWidth && viewWidth > dpWidth) ?
  1006 + Math.abs(offsetLeft + dpWidth - viewWidth) : 0);
  1007 +
  1008 + offsetTop -=
  1009 + Math.min(offsetTop, ((offsetTop + dpHeight > viewHeight && viewHeight > dpHeight) ?
  1010 + Math.abs(dpHeight + inputHeight - extraY) : extraY));
  1011 +
  1012 + return {
  1013 + top: offsetTop,
  1014 + bottom: offset.bottom,
  1015 + left: offsetLeft,
  1016 + right: offset.right,
  1017 + width: offset.width,
  1018 + height: offset.height
  1019 + };
  1020 + }
  1021 +
  1022 + /**
  1023 + * noop - do nothing
  1024 + */
  1025 + function noop() {
  1026 +
  1027 + }
  1028 +
  1029 + /**
  1030 + * stopPropagation - makes the code only doing this a little easier to read in line
  1031 + */
  1032 + function stopPropagation(e) {
  1033 + e.stopPropagation();
  1034 + }
  1035 +
  1036 + /**
  1037 + * Create a function bound to a given object
  1038 + * Thanks to underscore.js
  1039 + */
  1040 + function bind(func, obj) {
  1041 + var slice = Array.prototype.slice;
  1042 + var args = slice.call(arguments, 2);
  1043 + return function () {
  1044 + return func.apply(obj, args.concat(slice.call(arguments)));
  1045 + };
  1046 + }
  1047 +
  1048 + /**
  1049 + * Lightweight drag helper. Handles containment within the element, so that
  1050 + * when dragging, the x is within [0,element.width] and y is within [0,element.height]
  1051 + */
  1052 + function draggable(element, onmove, onstart, onstop) {
  1053 + onmove = onmove || function () { };
  1054 + onstart = onstart || function () { };
  1055 + onstop = onstop || function () { };
  1056 + var doc = document;
  1057 + var dragging = false;
  1058 + var offset = {};
  1059 + var maxHeight = 0;
  1060 + var maxWidth = 0;
  1061 + var hasTouch = ('ontouchstart' in window);
  1062 +
  1063 + var duringDragEvents = {};
  1064 + duringDragEvents["selectstart"] = prevent;
  1065 + duringDragEvents["dragstart"] = prevent;
  1066 + duringDragEvents["touchmove mousemove"] = move;
  1067 + duringDragEvents["touchend mouseup"] = stop;
  1068 +
  1069 + function prevent(e) {
  1070 + if (e.stopPropagation) {
  1071 + e.stopPropagation();
  1072 + }
  1073 + if (e.preventDefault) {
  1074 + e.preventDefault();
  1075 + }
  1076 + e.returnValue = false;
  1077 + }
  1078 +
  1079 + function move(e) {
  1080 + if (dragging) {
  1081 + // Mouseup happened outside of window
  1082 + if (IE && doc.documentMode < 9 && !e.button) {
  1083 + return stop();
  1084 + }
  1085 +
  1086 + var t0 = e.originalEvent && e.originalEvent.touches && e.originalEvent.touches[0];
  1087 + var pageX = t0 && t0.pageX || e.pageX;
  1088 + var pageY = t0 && t0.pageY || e.pageY;
  1089 +
  1090 + var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth));
  1091 + var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight));
  1092 +
  1093 + if (hasTouch) {
  1094 + // Stop scrolling in iOS
  1095 + prevent(e);
  1096 + }
  1097 +
  1098 + onmove.apply(element, [dragX, dragY, e]);
  1099 + }
  1100 + }
  1101 +
  1102 + function start(e) {
  1103 + var rightclick = (e.which) ? (e.which == 3) : (e.button == 2);
  1104 +
  1105 + if (!rightclick && !dragging) {
  1106 + if (onstart.apply(element, arguments) !== false) {
  1107 + dragging = true;
  1108 + maxHeight = $(element).height();
  1109 + maxWidth = $(element).width();
  1110 + offset = $(element).offset();
  1111 +
  1112 + $(doc).on(duringDragEvents);
  1113 + $(doc.body).addClass("sp-dragging");
  1114 +
  1115 + move(e);
  1116 +
  1117 + prevent(e);
  1118 + }
  1119 + }
  1120 + }
  1121 +
  1122 + function stop() {
  1123 + if (dragging) {
  1124 + $(doc).off(duringDragEvents);
  1125 + $(doc.body).removeClass("sp-dragging");
  1126 +
  1127 + // Wait a tick before notifying observers to allow the click event
  1128 + // to fire in Chrome.
  1129 + setTimeout(function() {
  1130 + onstop.apply(element, arguments);
  1131 + }, 0);
  1132 + }
  1133 + dragging = false;
  1134 + }
  1135 +
  1136 + $(element).on("touchstart mousedown", start);
  1137 + }
  1138 +
  1139 + function throttle(func, wait, debounce) {
  1140 + var timeout;
  1141 + return function () {
  1142 + var context = this, args = arguments;
  1143 + var throttler = function () {
  1144 + timeout = null;
  1145 + func.apply(context, args);
  1146 + };
  1147 + if (debounce) clearTimeout(timeout);
  1148 + if (debounce || !timeout) timeout = setTimeout(throttler, wait);
  1149 + };
  1150 + }
  1151 +
  1152 + function inputTypeColorSupport() {
  1153 + return $.fn.spectrum.inputTypeColorSupport();
  1154 + }
  1155 +
  1156 + /**
  1157 + * Define a jQuery plugin
  1158 + */
  1159 + var dataID = "spectrum.id";
  1160 + $.fn.spectrum = function (opts, extra) {
  1161 +
  1162 + if (typeof opts == "string") {
  1163 +
  1164 + var returnValue = this;
  1165 + var args = Array.prototype.slice.call( arguments, 1 );
  1166 +
  1167 + this.each(function () {
  1168 + var spect = spectrums[$(this).data(dataID)];
  1169 + if (spect) {
  1170 + var method = spect[opts];
  1171 + if (!method) {
  1172 + throw new Error( "Spectrum: no such method: '" + opts + "'" );
  1173 + }
  1174 +
  1175 + if (opts == "get") {
  1176 + returnValue = spect.get();
  1177 + }
  1178 + else if (opts == "container") {
  1179 + returnValue = spect.container;
  1180 + }
  1181 + else if (opts == "option") {
  1182 + returnValue = spect.option.apply(spect, args);
  1183 + }
  1184 + else if (opts == "destroy") {
  1185 + spect.destroy();
  1186 + $(this).removeData(dataID);
  1187 + }
  1188 + else {
  1189 + method.apply(spect, args);
  1190 + }
  1191 + }
  1192 + });
  1193 +
  1194 + return returnValue;
  1195 + }
  1196 +
  1197 + // Initializing a new instance of spectrum
  1198 + return this.spectrum("destroy").each(function () {
  1199 + var options = $.extend({}, $(this).data(), opts);
  1200 + var spect = spectrum(this, options);
  1201 + $(this).data(dataID, spect.id);
  1202 + });
  1203 + };
  1204 +
  1205 + $.fn.spectrum.load = true;
  1206 + $.fn.spectrum.loadOpts = {};
  1207 + $.fn.spectrum.draggable = draggable;
  1208 + $.fn.spectrum.defaults = defaultOpts;
  1209 + $.fn.spectrum.inputTypeColorSupport = function inputTypeColorSupport() {
  1210 + if (typeof inputTypeColorSupport._cachedResult === "undefined") {
  1211 + var colorInput = $("<input type='color'/>")[0]; // if color element is supported, value will default to not null
  1212 + inputTypeColorSupport._cachedResult = colorInput.type === "color" && colorInput.value !== "";
  1213 + }
  1214 + return inputTypeColorSupport._cachedResult;
  1215 + };
  1216 +
  1217 + $.spectrum = { };
  1218 + $.spectrum.localization = { };
  1219 + $.spectrum.palettes = { };
  1220 +
  1221 + $.fn.spectrum.processNativeColorInputs = function () {
  1222 + var colorInputs = $("input[type=color]");
  1223 + if (colorInputs.length && !inputTypeColorSupport()) {
  1224 + colorInputs.spectrum({
  1225 + preferredFormat: "hex6"
  1226 + });
  1227 + }
  1228 + };
  1229 +
  1230 + // TinyColor v1.1.2
  1231 + // https://github.com/bgrins/TinyColor
  1232 + // Brian Grinstead, MIT License
  1233 +
  1234 + (function() {
  1235 +
  1236 + var trimLeft = /^[\s,#]+/,
  1237 + trimRight = /\s+$/,
  1238 + tinyCounter = 0,
  1239 + math = Math,
  1240 + mathRound = math.round,
  1241 + mathMin = math.min,
  1242 + mathMax = math.max,
  1243 + mathRandom = math.random;
  1244 +
  1245 + var tinycolor = function(color, opts) {
  1246 +
  1247 + color = (color) ? color : '';
  1248 + opts = opts || { };
  1249 +
  1250 + // If input is already a tinycolor, return itself
  1251 + if (color instanceof tinycolor) {
  1252 + return color;
  1253 + }
  1254 + // If we are called as a function, call using new instead
  1255 + if (!(this instanceof tinycolor)) {
  1256 + return new tinycolor(color, opts);
  1257 + }
  1258 +
  1259 + var rgb = inputToRGB(color);
  1260 + this._originalInput = color,
  1261 + this._r = rgb.r,
  1262 + this._g = rgb.g,
  1263 + this._b = rgb.b,
  1264 + this._a = rgb.a,
  1265 + this._roundA = mathRound(1000 * this._a) / 1000,
  1266 + this._format = opts.format || rgb.format;
  1267 + this._gradientType = opts.gradientType;
  1268 +
  1269 + // Don't let the range of [0,255] come back in [0,1].
  1270 + // Potentially lose a little bit of precision here, but will fix issues where
  1271 + // .5 gets interpreted as half of the total, instead of half of 1
  1272 + // If it was supposed to be 128, this was already taken care of by `inputToRgb`
  1273 + if (this._r < 1) { this._r = mathRound(this._r); }
  1274 + if (this._g < 1) { this._g = mathRound(this._g); }
  1275 + if (this._b < 1) { this._b = mathRound(this._b); }
  1276 +
  1277 + this._ok = rgb.ok;
  1278 + this._tc_id = tinyCounter++;
  1279 + };
  1280 +
  1281 + tinycolor.prototype = {
  1282 + isDark: function() {
  1283 + return this.getBrightness() < 128;
  1284 + },
  1285 + isLight: function() {
  1286 + return !this.isDark();
  1287 + },
  1288 + isValid: function() {
  1289 + return this._ok;
  1290 + },
  1291 + getOriginalInput: function() {
  1292 + return this._originalInput;
  1293 + },
  1294 + getFormat: function() {
  1295 + return this._format;
  1296 + },
  1297 + getAlpha: function() {
  1298 + return this._a;
  1299 + },
  1300 + getBrightness: function() {
  1301 + var rgb = this.toRgb();
  1302 + return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
  1303 + },
  1304 + setAlpha: function(value) {
  1305 + this._a = boundAlpha(value);
  1306 + this._roundA = mathRound(1000 * this._a) / 1000;
  1307 + return this;
  1308 + },
  1309 + toHsv: function() {
  1310 + var hsv = rgbToHsv(this._r, this._g, this._b);
  1311 + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };
  1312 + },
  1313 + toHsvString: function() {
  1314 + var hsv = rgbToHsv(this._r, this._g, this._b);
  1315 + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);
  1316 + return (this._a == 1) ?
  1317 + "hsv(" + h + ", " + s + "%, " + v + "%)" :
  1318 + "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")";
  1319 + },
  1320 + toHsl: function() {
  1321 + var hsl = rgbToHsl(this._r, this._g, this._b);
  1322 + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };
  1323 + },
  1324 + toHslString: function() {
  1325 + var hsl = rgbToHsl(this._r, this._g, this._b);
  1326 + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);
  1327 + return (this._a == 1) ?
  1328 + "hsl(" + h + ", " + s + "%, " + l + "%)" :
  1329 + "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")";
  1330 + },
  1331 + toHex: function(allow3Char) {
  1332 + return rgbToHex(this._r, this._g, this._b, allow3Char);
  1333 + },
  1334 + toHexString: function(allow3Char) {
  1335 + return '#' + this.toHex(allow3Char);
  1336 + },
  1337 + toHex8: function() {
  1338 + return rgbaToHex(this._r, this._g, this._b, this._a);
  1339 + },
  1340 + toHex8String: function() {
  1341 + return '#' + this.toHex8();
  1342 + },
  1343 + toRgb: function() {
  1344 + return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };
  1345 + },
  1346 + toRgbString: function() {
  1347 + return (this._a == 1) ?
  1348 + "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" :
  1349 + "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";
  1350 + },
  1351 + toPercentageRgb: function() {
  1352 + return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a };
  1353 + },
  1354 + toPercentageRgbString: function() {
  1355 + return (this._a == 1) ?
  1356 + "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" :
  1357 + "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
  1358 + },
  1359 + toName: function() {
  1360 + if (this._a === 0) {
  1361 + return "transparent";
  1362 + }
  1363 +
  1364 + if (this._a < 1) {
  1365 + return false;
  1366 + }
  1367 +
  1368 + return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
  1369 + },
  1370 + toFilter: function(secondColor) {
  1371 + var hex8String = '#' + rgbaToHex(this._r, this._g, this._b, this._a);
  1372 + var secondHex8String = hex8String;
  1373 + var gradientType = this._gradientType ? "GradientType = 1, " : "";
  1374 +
  1375 + if (secondColor) {
  1376 + var s = tinycolor(secondColor);
  1377 + secondHex8String = s.toHex8String();
  1378 + }
  1379 +
  1380 + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")";
  1381 + },
  1382 + toString: function(format) {
  1383 + var formatSet = !!format;
  1384 + format = format || this._format;
  1385 +
  1386 + var formattedString = false;
  1387 + var hasAlpha = this._a < 1 && this._a >= 0;
  1388 + var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "name");
  1389 +
  1390 + if (needsAlphaFormat) {
  1391 + // Special case for "transparent", all other non-alpha formats
  1392 + // will return rgba when there is transparency.
  1393 + if (format === "name" && this._a === 0) {
  1394 + return this.toName();
  1395 + }
  1396 + return this.toRgbString();
  1397 + }
  1398 + if (format === "rgb") {
  1399 + formattedString = this.toRgbString();
  1400 + }
  1401 + if (format === "prgb") {
  1402 + formattedString = this.toPercentageRgbString();
  1403 + }
  1404 + if (format === "hex" || format === "hex6") {
  1405 + formattedString = this.toHexString();
  1406 + }
  1407 + if (format === "hex3") {
  1408 + formattedString = this.toHexString(true);
  1409 + }
  1410 + if (format === "hex8") {
  1411 + formattedString = this.toHex8String();
  1412 + }
  1413 + if (format === "name") {
  1414 + formattedString = this.toName();
  1415 + }
  1416 + if (format === "hsl") {
  1417 + formattedString = this.toHslString();
  1418 + }
  1419 + if (format === "hsv") {
  1420 + formattedString = this.toHsvString();
  1421 + }
  1422 +
  1423 + return formattedString || this.toHexString();
  1424 + },
  1425 +
  1426 + _applyModification: function(fn, args) {
  1427 + var color = fn.apply(null, [this].concat([].slice.call(args)));
  1428 + this._r = color._r;
  1429 + this._g = color._g;
  1430 + this._b = color._b;
  1431 + this.setAlpha(color._a);
  1432 + return this;
  1433 + },
  1434 + lighten: function() {
  1435 + return this._applyModification(lighten, arguments);
  1436 + },
  1437 + brighten: function() {
  1438 + return this._applyModification(brighten, arguments);
  1439 + },
  1440 + darken: function() {
  1441 + return this._applyModification(darken, arguments);
  1442 + },
  1443 + desaturate: function() {
  1444 + return this._applyModification(desaturate, arguments);
  1445 + },
  1446 + saturate: function() {
  1447 + return this._applyModification(saturate, arguments);
  1448 + },
  1449 + greyscale: function() {
  1450 + return this._applyModification(greyscale, arguments);
  1451 + },
  1452 + spin: function() {
  1453 + return this._applyModification(spin, arguments);
  1454 + },
  1455 +
  1456 + _applyCombination: function(fn, args) {
  1457 + return fn.apply(null, [this].concat([].slice.call(args)));
  1458 + },
  1459 + analogous: function() {
  1460 + return this._applyCombination(analogous, arguments);
  1461 + },
  1462 + complement: function() {
  1463 + return this._applyCombination(complement, arguments);
  1464 + },
  1465 + monochromatic: function() {
  1466 + return this._applyCombination(monochromatic, arguments);
  1467 + },
  1468 + splitcomplement: function() {
  1469 + return this._applyCombination(splitcomplement, arguments);
  1470 + },
  1471 + triad: function() {
  1472 + return this._applyCombination(triad, arguments);
  1473 + },
  1474 + tetrad: function() {
  1475 + return this._applyCombination(tetrad, arguments);
  1476 + }
  1477 + };
  1478 +
  1479 + // If input is an object, force 1 into "1.0" to handle ratios properly
  1480 + // String input requires "1.0" as input, so 1 will be treated as 1
  1481 + tinycolor.fromRatio = function(color, opts) {
  1482 + if (typeof color == "object") {
  1483 + var newColor = {};
  1484 + for (var i in color) {
  1485 + if (color.hasOwnProperty(i)) {
  1486 + if (i === "a") {
  1487 + newColor[i] = color[i];
  1488 + }
  1489 + else {
  1490 + newColor[i] = convertToPercentage(color[i]);
  1491 + }
  1492 + }
  1493 + }
  1494 + color = newColor;
  1495 + }
  1496 +
  1497 + return tinycolor(color, opts);
  1498 + };
  1499 +
  1500 + // Given a string or object, convert that input to RGB
  1501 + // Possible string inputs:
  1502 + //
  1503 + // "red"
  1504 + // "#f00" or "f00"
  1505 + // "#ff0000" or "ff0000"
  1506 + // "#ff000000" or "ff000000"
  1507 + // "rgb 255 0 0" or "rgb (255, 0, 0)"
  1508 + // "rgb 1.0 0 0" or "rgb (1, 0, 0)"
  1509 + // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
  1510 + // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
  1511 + // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
  1512 + // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
  1513 + // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
  1514 + //
  1515 + function inputToRGB(color) {
  1516 +
  1517 + var rgb = { r: 0, g: 0, b: 0 };
  1518 + var a = 1;
  1519 + var ok = false;
  1520 + var format = false;
  1521 +
  1522 + if (typeof color == "string") {
  1523 + color = stringInputToObject(color);
  1524 + }
  1525 +
  1526 + if (typeof color == "object") {
  1527 + if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) {
  1528 + rgb = rgbToRgb(color.r, color.g, color.b);
  1529 + ok = true;
  1530 + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
  1531 + }
  1532 + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) {
  1533 + color.s = convertToPercentage(color.s);
  1534 + color.v = convertToPercentage(color.v);
  1535 + rgb = hsvToRgb(color.h, color.s, color.v);
  1536 + ok = true;
  1537 + format = "hsv";
  1538 + }
  1539 + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) {
  1540 + color.s = convertToPercentage(color.s);
  1541 + color.l = convertToPercentage(color.l);
  1542 + rgb = hslToRgb(color.h, color.s, color.l);
  1543 + ok = true;
  1544 + format = "hsl";
  1545 + }
  1546 +
  1547 + if (color.hasOwnProperty("a")) {
  1548 + a = color.a;
  1549 + }
  1550 + }
  1551 +
  1552 + a = boundAlpha(a);
  1553 +
  1554 + return {
  1555 + ok: ok,
  1556 + format: color.format || format,
  1557 + r: mathMin(255, mathMax(rgb.r, 0)),
  1558 + g: mathMin(255, mathMax(rgb.g, 0)),
  1559 + b: mathMin(255, mathMax(rgb.b, 0)),
  1560 + a: a
  1561 + };
  1562 + }
  1563 +
  1564 +
  1565 + // Conversion Functions
  1566 + // --------------------
  1567 +
  1568 + // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
  1569 + // <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
  1570 +
  1571 + // `rgbToRgb`
  1572 + // Handle bounds / percentage checking to conform to CSS color spec
  1573 + // <http://www.w3.org/TR/css3-color/>
  1574 + // *Assumes:* r, g, b in [0, 255] or [0, 1]
  1575 + // *Returns:* { r, g, b } in [0, 255]
  1576 + function rgbToRgb(r, g, b){
  1577 + return {
  1578 + r: bound01(r, 255) * 255,
  1579 + g: bound01(g, 255) * 255,
  1580 + b: bound01(b, 255) * 255
  1581 + };
  1582 + }
  1583 +
  1584 + // `rgbToHsl`
  1585 + // Converts an RGB color value to HSL.
  1586 + // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
  1587 + // *Returns:* { h, s, l } in [0,1]
  1588 + function rgbToHsl(r, g, b) {
  1589 +
  1590 + r = bound01(r, 255);
  1591 + g = bound01(g, 255);
  1592 + b = bound01(b, 255);
  1593 +
  1594 + var max = mathMax(r, g, b), min = mathMin(r, g, b);
  1595 + var h, s, l = (max + min) / 2;
  1596 +
  1597 + if(max == min) {
  1598 + h = s = 0; // achromatic
  1599 + }
  1600 + else {
  1601 + var d = max - min;
  1602 + s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
  1603 + switch(max) {
  1604 + case r: h = (g - b) / d + (g < b ? 6 : 0); break;
  1605 + case g: h = (b - r) / d + 2; break;
  1606 + case b: h = (r - g) / d + 4; break;
  1607 + }
  1608 +
  1609 + h /= 6;
  1610 + }
  1611 +
  1612 + return { h: h, s: s, l: l };
  1613 + }
  1614 +
  1615 + // `hslToRgb`
  1616 + // Converts an HSL color value to RGB.
  1617 + // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
  1618 + // *Returns:* { r, g, b } in the set [0, 255]
  1619 + function hslToRgb(h, s, l) {
  1620 + var r, g, b;
  1621 +
  1622 + h = bound01(h, 360);
  1623 + s = bound01(s, 100);
  1624 + l = bound01(l, 100);
  1625 +
  1626 + function hue2rgb(p, q, t) {
  1627 + if(t < 0) t += 1;
  1628 + if(t > 1) t -= 1;
  1629 + if(t < 1/6) return p + (q - p) * 6 * t;
  1630 + if(t < 1/2) return q;
  1631 + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
  1632 + return p;
  1633 + }
  1634 +
  1635 + if(s === 0) {
  1636 + r = g = b = l; // achromatic
  1637 + }
  1638 + else {
  1639 + var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
  1640 + var p = 2 * l - q;
  1641 + r = hue2rgb(p, q, h + 1/3);
  1642 + g = hue2rgb(p, q, h);
  1643 + b = hue2rgb(p, q, h - 1/3);
  1644 + }
  1645 +
  1646 + return { r: r * 255, g: g * 255, b: b * 255 };
  1647 + }
  1648 +
  1649 + // `rgbToHsv`
  1650 + // Converts an RGB color value to HSV
  1651 + // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
  1652 + // *Returns:* { h, s, v } in [0,1]
  1653 + function rgbToHsv(r, g, b) {
  1654 +
  1655 + r = bound01(r, 255);
  1656 + g = bound01(g, 255);
  1657 + b = bound01(b, 255);
  1658 +
  1659 + var max = mathMax(r, g, b), min = mathMin(r, g, b);
  1660 + var h, s, v = max;
  1661 +
  1662 + var d = max - min;
  1663 + s = max === 0 ? 0 : d / max;
  1664 +
  1665 + if(max == min) {
  1666 + h = 0; // achromatic
  1667 + }
  1668 + else {
  1669 + switch(max) {
  1670 + case r: h = (g - b) / d + (g < b ? 6 : 0); break;
  1671 + case g: h = (b - r) / d + 2; break;
  1672 + case b: h = (r - g) / d + 4; break;
  1673 + }
  1674 + h /= 6;
  1675 + }
  1676 + return { h: h, s: s, v: v };
  1677 + }
  1678 +
  1679 + // `hsvToRgb`
  1680 + // Converts an HSV color value to RGB.
  1681 + // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
  1682 + // *Returns:* { r, g, b } in the set [0, 255]
  1683 + function hsvToRgb(h, s, v) {
  1684 +
  1685 + h = bound01(h, 360) * 6;
  1686 + s = bound01(s, 100);
  1687 + v = bound01(v, 100);
  1688 +
  1689 + var i = math.floor(h),
  1690 + f = h - i,
  1691 + p = v * (1 - s),
  1692 + q = v * (1 - f * s),
  1693 + t = v * (1 - (1 - f) * s),
  1694 + mod = i % 6,
  1695 + r = [v, q, p, p, t, v][mod],
  1696 + g = [t, v, v, q, p, p][mod],
  1697 + b = [p, p, t, v, v, q][mod];
  1698 +
  1699 + return { r: r * 255, g: g * 255, b: b * 255 };
  1700 + }
  1701 +
  1702 + // `rgbToHex`
  1703 + // Converts an RGB color to hex
  1704 + // Assumes r, g, and b are contained in the set [0, 255]
  1705 + // Returns a 3 or 6 character hex
  1706 + function rgbToHex(r, g, b, allow3Char) {
  1707 +
  1708 + var hex = [
  1709 + pad2(mathRound(r).toString(16)),
  1710 + pad2(mathRound(g).toString(16)),
  1711 + pad2(mathRound(b).toString(16))
  1712 + ];
  1713 +
  1714 + // Return a 3 character hex if possible
  1715 + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
  1716 + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
  1717 + }
  1718 +
  1719 + return hex.join("");
  1720 + }
  1721 + // `rgbaToHex`
  1722 + // Converts an RGBA color plus alpha transparency to hex
  1723 + // Assumes r, g, b and a are contained in the set [0, 255]
  1724 + // Returns an 8 character hex
  1725 + function rgbaToHex(r, g, b, a) {
  1726 +
  1727 + var hex = [
  1728 + pad2(convertDecimalToHex(a)),
  1729 + pad2(mathRound(r).toString(16)),
  1730 + pad2(mathRound(g).toString(16)),
  1731 + pad2(mathRound(b).toString(16))
  1732 + ];
  1733 +
  1734 + return hex.join("");
  1735 + }
  1736 +
  1737 + // `equals`
  1738 + // Can be called with any tinycolor input
  1739 + tinycolor.equals = function (color1, color2) {
  1740 + if (!color1 || !color2) { return false; }
  1741 + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
  1742 + };
  1743 + tinycolor.random = function() {
  1744 + return tinycolor.fromRatio({
  1745 + r: mathRandom(),
  1746 + g: mathRandom(),
  1747 + b: mathRandom()
  1748 + });
  1749 + };
  1750 +
  1751 +
  1752 + // Modification Functions
  1753 + // ----------------------
  1754 + // Thanks to less.js for some of the basics here
  1755 + // <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>
  1756 +
  1757 + function desaturate(color, amount) {
  1758 + amount = (amount === 0) ? 0 : (amount || 10);
  1759 + var hsl = tinycolor(color).toHsl();
  1760 + hsl.s -= amount / 100;
  1761 + hsl.s = clamp01(hsl.s);
  1762 + return tinycolor(hsl);
  1763 + }
  1764 +
  1765 + function saturate(color, amount) {
  1766 + amount = (amount === 0) ? 0 : (amount || 10);
  1767 + var hsl = tinycolor(color).toHsl();
  1768 + hsl.s += amount / 100;
  1769 + hsl.s = clamp01(hsl.s);
  1770 + return tinycolor(hsl);
  1771 + }
  1772 +
  1773 + function greyscale(color) {
  1774 + return tinycolor(color).desaturate(100);
  1775 + }
  1776 +
  1777 + function lighten (color, amount) {
  1778 + amount = (amount === 0) ? 0 : (amount || 10);
  1779 + var hsl = tinycolor(color).toHsl();
  1780 + hsl.l += amount / 100;
  1781 + hsl.l = clamp01(hsl.l);
  1782 + return tinycolor(hsl);
  1783 + }
  1784 +
  1785 + function brighten(color, amount) {
  1786 + amount = (amount === 0) ? 0 : (amount || 10);
  1787 + var rgb = tinycolor(color).toRgb();
  1788 + rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100))));
  1789 + rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100))));
  1790 + rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100))));
  1791 + return tinycolor(rgb);
  1792 + }
  1793 +
  1794 + function darken (color, amount) {
  1795 + amount = (amount === 0) ? 0 : (amount || 10);
  1796 + var hsl = tinycolor(color).toHsl();
  1797 + hsl.l -= amount / 100;
  1798 + hsl.l = clamp01(hsl.l);
  1799 + return tinycolor(hsl);
  1800 + }
  1801 +
  1802 + // Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
  1803 + // Values outside of this range will be wrapped into this range.
  1804 + function spin(color, amount) {
  1805 + var hsl = tinycolor(color).toHsl();
  1806 + var hue = (mathRound(hsl.h) + amount) % 360;
  1807 + hsl.h = hue < 0 ? 360 + hue : hue;
  1808 + return tinycolor(hsl);
  1809 + }
  1810 +
  1811 + // Combination Functions
  1812 + // ---------------------
  1813 + // Thanks to jQuery xColor for some of the ideas behind these
  1814 + // <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
  1815 +
  1816 + function complement(color) {
  1817 + var hsl = tinycolor(color).toHsl();
  1818 + hsl.h = (hsl.h + 180) % 360;
  1819 + return tinycolor(hsl);
  1820 + }
  1821 +
  1822 + function triad(color) {
  1823 + var hsl = tinycolor(color).toHsl();
  1824 + var h = hsl.h;
  1825 + return [
  1826 + tinycolor(color),
  1827 + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),
  1828 + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })
  1829 + ];
  1830 + }
  1831 +
  1832 + function tetrad(color) {
  1833 + var hsl = tinycolor(color).toHsl();
  1834 + var h = hsl.h;
  1835 + return [
  1836 + tinycolor(color),
  1837 + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),
  1838 + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),
  1839 + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })
  1840 + ];
  1841 + }
  1842 +
  1843 + function splitcomplement(color) {
  1844 + var hsl = tinycolor(color).toHsl();
  1845 + var h = hsl.h;
  1846 + return [
  1847 + tinycolor(color),
  1848 + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),
  1849 + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})
  1850 + ];
  1851 + }
  1852 +
  1853 + function analogous(color, results, slices) {
  1854 + results = results || 6;
  1855 + slices = slices || 30;
  1856 +
  1857 + var hsl = tinycolor(color).toHsl();
  1858 + var part = 360 / slices;
  1859 + var ret = [tinycolor(color)];
  1860 +
  1861 + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {
  1862 + hsl.h = (hsl.h + part) % 360;
  1863 + ret.push(tinycolor(hsl));
  1864 + }
  1865 + return ret;
  1866 + }
  1867 +
  1868 + function monochromatic(color, results) {
  1869 + results = results || 6;
  1870 + var hsv = tinycolor(color).toHsv();
  1871 + var h = hsv.h, s = hsv.s, v = hsv.v;
  1872 + var ret = [];
  1873 + var modification = 1 / results;
  1874 +
  1875 + while (results--) {
  1876 + ret.push(tinycolor({ h: h, s: s, v: v}));
  1877 + v = (v + modification) % 1;
  1878 + }
  1879 +
  1880 + return ret;
  1881 + }
  1882 +
  1883 + // Utility Functions
  1884 + // ---------------------
  1885 +
  1886 + tinycolor.mix = function(color1, color2, amount) {
  1887 + amount = (amount === 0) ? 0 : (amount || 50);
  1888 +
  1889 + var rgb1 = tinycolor(color1).toRgb();
  1890 + var rgb2 = tinycolor(color2).toRgb();
  1891 +
  1892 + var p = amount / 100;
  1893 + var w = p * 2 - 1;
  1894 + var a = rgb2.a - rgb1.a;
  1895 +
  1896 + var w1;
  1897 +
  1898 + if (w * a == -1) {
  1899 + w1 = w;
  1900 + } else {
  1901 + w1 = (w + a) / (1 + w * a);
  1902 + }
  1903 +
  1904 + w1 = (w1 + 1) / 2;
  1905 +
  1906 + var w2 = 1 - w1;
  1907 +
  1908 + var rgba = {
  1909 + r: rgb2.r * w1 + rgb1.r * w2,
  1910 + g: rgb2.g * w1 + rgb1.g * w2,
  1911 + b: rgb2.b * w1 + rgb1.b * w2,
  1912 + a: rgb2.a * p + rgb1.a * (1 - p)
  1913 + };
  1914 +
  1915 + return tinycolor(rgba);
  1916 + };
  1917 +
  1918 +
  1919 + // Readability Functions
  1920 + // ---------------------
  1921 + // <http://www.w3.org/TR/AERT#color-contrast>
  1922 +
  1923 + // `readability`
  1924 + // Analyze the 2 colors and returns an object with the following properties:
  1925 + // `brightness`: difference in brightness between the two colors
  1926 + // `color`: difference in color/hue between the two colors
  1927 + tinycolor.readability = function(color1, color2) {
  1928 + var c1 = tinycolor(color1);
  1929 + var c2 = tinycolor(color2);
  1930 + var rgb1 = c1.toRgb();
  1931 + var rgb2 = c2.toRgb();
  1932 + var brightnessA = c1.getBrightness();
  1933 + var brightnessB = c2.getBrightness();
  1934 + var colorDiff = (
  1935 + Math.max(rgb1.r, rgb2.r) - Math.min(rgb1.r, rgb2.r) +
  1936 + Math.max(rgb1.g, rgb2.g) - Math.min(rgb1.g, rgb2.g) +
  1937 + Math.max(rgb1.b, rgb2.b) - Math.min(rgb1.b, rgb2.b)
  1938 + );
  1939 +
  1940 + return {
  1941 + brightness: Math.abs(brightnessA - brightnessB),
  1942 + color: colorDiff
  1943 + };
  1944 + };
  1945 +
  1946 + // `readable`
  1947 + // http://www.w3.org/TR/AERT#color-contrast
  1948 + // Ensure that foreground and background color combinations provide sufficient contrast.
  1949 + // *Example*
  1950 + // tinycolor.isReadable("#000", "#111") => false
  1951 + tinycolor.isReadable = function(color1, color2) {
  1952 + var readability = tinycolor.readability(color1, color2);
  1953 + return readability.brightness > 125 && readability.color > 500;
  1954 + };
  1955 +
  1956 + // `mostReadable`
  1957 + // Given a base color and a list of possible foreground or background
  1958 + // colors for that base, returns the most readable color.
  1959 + // *Example*
  1960 + // tinycolor.mostReadable("#123", ["#fff", "#000"]) => "#000"
  1961 + tinycolor.mostReadable = function(baseColor, colorList) {
  1962 + var bestColor = null;
  1963 + var bestScore = 0;
  1964 + var bestIsReadable = false;
  1965 + for (var i=0; i < colorList.length; i++) {
  1966 +
  1967 + // We normalize both around the "acceptable" breaking point,
  1968 + // but rank brightness constrast higher than hue.
  1969 +
  1970 + var readability = tinycolor.readability(baseColor, colorList[i]);
  1971 + var readable = readability.brightness > 125 && readability.color > 500;
  1972 + var score = 3 * (readability.brightness / 125) + (readability.color / 500);
  1973 +
  1974 + if ((readable && ! bestIsReadable) ||
  1975 + (readable && bestIsReadable && score > bestScore) ||
  1976 + ((! readable) && (! bestIsReadable) && score > bestScore)) {
  1977 + bestIsReadable = readable;
  1978 + bestScore = score;
  1979 + bestColor = tinycolor(colorList[i]);
  1980 + }
  1981 + }
  1982 + return bestColor;
  1983 + };
  1984 +
  1985 +
  1986 + // Big List of Colors
  1987 + // ------------------
  1988 + // <http://www.w3.org/TR/css3-color/#svg-color>
  1989 + var names = tinycolor.names = {
  1990 + aliceblue: "f0f8ff",
  1991 + antiquewhite: "faebd7",
  1992 + aqua: "0ff",
  1993 + aquamarine: "7fffd4",
  1994 + azure: "f0ffff",
  1995 + beige: "f5f5dc",
  1996 + bisque: "ffe4c4",
  1997 + black: "000",
  1998 + blanchedalmond: "ffebcd",
  1999 + blue: "00f",
  2000 + blueviolet: "8a2be2",
  2001 + brown: "a52a2a",
  2002 + burlywood: "deb887",
  2003 + burntsienna: "ea7e5d",
  2004 + cadetblue: "5f9ea0",
  2005 + chartreuse: "7fff00",
  2006 + chocolate: "d2691e",
  2007 + coral: "ff7f50",
  2008 + cornflowerblue: "6495ed",
  2009 + cornsilk: "fff8dc",
  2010 + crimson: "dc143c",
  2011 + cyan: "0ff",
  2012 + darkblue: "00008b",
  2013 + darkcyan: "008b8b",
  2014 + darkgoldenrod: "b8860b",
  2015 + darkgray: "a9a9a9",
  2016 + darkgreen: "006400",
  2017 + darkgrey: "a9a9a9",
  2018 + darkkhaki: "bdb76b",
  2019 + darkmagenta: "8b008b",
  2020 + darkolivegreen: "556b2f",
  2021 + darkorange: "ff8c00",
  2022 + darkorchid: "9932cc",
  2023 + darkred: "8b0000",
  2024 + darksalmon: "e9967a",
  2025 + darkseagreen: "8fbc8f",
  2026 + darkslateblue: "483d8b",
  2027 + darkslategray: "2f4f4f",
  2028 + darkslategrey: "2f4f4f",
  2029 + darkturquoise: "00ced1",
  2030 + darkviolet: "9400d3",
  2031 + deeppink: "ff1493",
  2032 + deepskyblue: "00bfff",
  2033 + dimgray: "696969",
  2034 + dimgrey: "696969",
  2035 + dodgerblue: "1e90ff",
  2036 + firebrick: "b22222",
  2037 + floralwhite: "fffaf0",
  2038 + forestgreen: "228b22",
  2039 + fuchsia: "f0f",
  2040 + gainsboro: "dcdcdc",
  2041 + ghostwhite: "f8f8ff",
  2042 + gold: "ffd700",
  2043 + goldenrod: "daa520",
  2044 + gray: "808080",
  2045 + green: "008000",
  2046 + greenyellow: "adff2f",
  2047 + grey: "808080",
  2048 + honeydew: "f0fff0",
  2049 + hotpink: "ff69b4",
  2050 + indianred: "cd5c5c",
  2051 + indigo: "4b0082",
  2052 + ivory: "fffff0",
  2053 + khaki: "f0e68c",
  2054 + lavender: "e6e6fa",
  2055 + lavenderblush: "fff0f5",
  2056 + lawngreen: "7cfc00",
  2057 + lemonchiffon: "fffacd",
  2058 + lightblue: "add8e6",
  2059 + lightcoral: "f08080",
  2060 + lightcyan: "e0ffff",
  2061 + lightgoldenrodyellow: "fafad2",
  2062 + lightgray: "d3d3d3",
  2063 + lightgreen: "90ee90",
  2064 + lightgrey: "d3d3d3",
  2065 + lightpink: "ffb6c1",
  2066 + lightsalmon: "ffa07a",
  2067 + lightseagreen: "20b2aa",
  2068 + lightskyblue: "87cefa",
  2069 + lightslategray: "789",
  2070 + lightslategrey: "789",
  2071 + lightsteelblue: "b0c4de",
  2072 + lightyellow: "ffffe0",
  2073 + lime: "0f0",
  2074 + limegreen: "32cd32",
  2075 + linen: "faf0e6",
  2076 + magenta: "f0f",
  2077 + maroon: "800000",
  2078 + mediumaquamarine: "66cdaa",
  2079 + mediumblue: "0000cd",
  2080 + mediumorchid: "ba55d3",
  2081 + mediumpurple: "9370db",
  2082 + mediumseagreen: "3cb371",
  2083 + mediumslateblue: "7b68ee",
  2084 + mediumspringgreen: "00fa9a",
  2085 + mediumturquoise: "48d1cc",
  2086 + mediumvioletred: "c71585",
  2087 + midnightblue: "191970",
  2088 + mintcream: "f5fffa",
  2089 + mistyrose: "ffe4e1",
  2090 + moccasin: "ffe4b5",
  2091 + navajowhite: "ffdead",
  2092 + navy: "000080",
  2093 + oldlace: "fdf5e6",
  2094 + olive: "808000",
  2095 + olivedrab: "6b8e23",
  2096 + orange: "ffa500",
  2097 + orangered: "ff4500",
  2098 + orchid: "da70d6",
  2099 + palegoldenrod: "eee8aa",
  2100 + palegreen: "98fb98",
  2101 + paleturquoise: "afeeee",
  2102 + palevioletred: "db7093",
  2103 + papayawhip: "ffefd5",
  2104 + peachpuff: "ffdab9",
  2105 + peru: "cd853f",
  2106 + pink: "ffc0cb",
  2107 + plum: "dda0dd",
  2108 + powderblue: "b0e0e6",
  2109 + purple: "800080",
  2110 + rebeccapurple: "663399",
  2111 + red: "f00",
  2112 + rosybrown: "bc8f8f",
  2113 + royalblue: "4169e1",
  2114 + saddlebrown: "8b4513",
  2115 + salmon: "fa8072",
  2116 + sandybrown: "f4a460",
  2117 + seagreen: "2e8b57",
  2118 + seashell: "fff5ee",
  2119 + sienna: "a0522d",
  2120 + silver: "c0c0c0",
  2121 + skyblue: "87ceeb",
  2122 + slateblue: "6a5acd",
  2123 + slategray: "708090",
  2124 + slategrey: "708090",
  2125 + snow: "fffafa",
  2126 + springgreen: "00ff7f",
  2127 + steelblue: "4682b4",
  2128 + tan: "d2b48c",
  2129 + teal: "008080",
  2130 + thistle: "d8bfd8",
  2131 + tomato: "ff6347",
  2132 + turquoise: "40e0d0",
  2133 + violet: "ee82ee",
  2134 + wheat: "f5deb3",
  2135 + white: "fff",
  2136 + whitesmoke: "f5f5f5",
  2137 + yellow: "ff0",
  2138 + yellowgreen: "9acd32"
  2139 + };
  2140 +
  2141 + // Make it easy to access colors via `hexNames[hex]`
  2142 + var hexNames = tinycolor.hexNames = flip(names);
  2143 +
  2144 +
  2145 + // Utilities
  2146 + // ---------
  2147 +
  2148 + // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
  2149 + function flip(o) {
  2150 + var flipped = { };
  2151 + for (var i in o) {
  2152 + if (o.hasOwnProperty(i)) {
  2153 + flipped[o[i]] = i;
  2154 + }
  2155 + }
  2156 + return flipped;
  2157 + }
  2158 +
  2159 + // Return a valid alpha value [0,1] with all invalid values being set to 1
  2160 + function boundAlpha(a) {
  2161 + a = parseFloat(a);
  2162 +
  2163 + if (isNaN(a) || a < 0 || a > 1) {
  2164 + a = 1;
  2165 + }
  2166 +
  2167 + return a;
  2168 + }
  2169 +
  2170 + // Take input from [0, n] and return it as [0, 1]
  2171 + function bound01(n, max) {
  2172 + if (isOnePointZero(n)) { n = "100%"; }
  2173 +
  2174 + var processPercent = isPercentage(n);
  2175 + n = mathMin(max, mathMax(0, parseFloat(n)));
  2176 +
  2177 + // Automatically convert percentage into number
  2178 + if (processPercent) {
  2179 + n = parseInt(n * max, 10) / 100;
  2180 + }
  2181 +
  2182 + // Handle floating point rounding errors
  2183 + if ((math.abs(n - max) < 0.000001)) {
  2184 + return 1;
  2185 + }
  2186 +
  2187 + // Convert into [0, 1] range if it isn't already
  2188 + return (n % max) / parseFloat(max);
  2189 + }
  2190 +
  2191 + // Force a number between 0 and 1
  2192 + function clamp01(val) {
  2193 + return mathMin(1, mathMax(0, val));
  2194 + }
  2195 +
  2196 + // Parse a base-16 hex value into a base-10 integer
  2197 + function parseIntFromHex(val) {
  2198 + return parseInt(val, 16);
  2199 + }
  2200 +
  2201 + // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
  2202 + // <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
  2203 + function isOnePointZero(n) {
  2204 + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
  2205 + }
  2206 +
  2207 + // Check to see if string passed in is a percentage
  2208 + function isPercentage(n) {
  2209 + return typeof n === "string" && n.indexOf('%') != -1;
  2210 + }
  2211 +
  2212 + // Force a hex value to have 2 characters
  2213 + function pad2(c) {
  2214 + return c.length == 1 ? '0' + c : '' + c;
  2215 + }
  2216 +
  2217 + // Replace a decimal with it's percentage value
  2218 + function convertToPercentage(n) {
  2219 + if (n <= 1) {
  2220 + n = (n * 100) + "%";
  2221 + }
  2222 +
  2223 + return n;
  2224 + }
  2225 +
  2226 + // Converts a decimal to a hex value
  2227 + function convertDecimalToHex(d) {
  2228 + return Math.round(parseFloat(d) * 255).toString(16);
  2229 + }
  2230 + // Converts a hex value to a decimal
  2231 + function convertHexToDecimal(h) {
  2232 + return (parseIntFromHex(h) / 255);
  2233 + }
  2234 +
  2235 + var matchers = (function() {
  2236 +
  2237 + // <http://www.w3.org/TR/css3-values/#integers>
  2238 + var CSS_INTEGER = "[-\\+]?\\d+%?";
  2239 +
  2240 + // <http://www.w3.org/TR/css3-values/#number-value>
  2241 + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
  2242 +
  2243 + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
  2244 + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
  2245 +
  2246 + // Actual matching.
  2247 + // Parentheses and commas are optional, but not required.
  2248 + // Whitespace can take the place of commas or opening paren
  2249 + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
  2250 + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
  2251 +
  2252 + return {
  2253 + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
  2254 + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
  2255 + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
  2256 + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
  2257 + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
  2258 + hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
  2259 + hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
  2260 + hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
  2261 + hex8: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
  2262 + };
  2263 + })();
  2264 +
  2265 + // `stringInputToObject`
  2266 + // Permissive string parsing. Take in a number of formats, and output an object
  2267 + // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
  2268 + function stringInputToObject(color) {
  2269 +
  2270 + color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase();
  2271 + var named = false;
  2272 + if (names[color]) {
  2273 + color = names[color];
  2274 + named = true;
  2275 + }
  2276 + else if (color == 'transparent') {
  2277 + return { r: 0, g: 0, b: 0, a: 0, format: "name" };
  2278 + }
  2279 +
  2280 + // Try to match string input using regular expressions.
  2281 + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
  2282 + // Just return an object and let the conversion functions handle that.
  2283 + // This way the result will be the same whether the tinycolor is initialized with string or object.
  2284 + var match;
  2285 + if ((match = matchers.rgb.exec(color))) {
  2286 + return { r: match[1], g: match[2], b: match[3] };
  2287 + }
  2288 + if ((match = matchers.rgba.exec(color))) {
  2289 + return { r: match[1], g: match[2], b: match[3], a: match[4] };
  2290 + }
  2291 + if ((match = matchers.hsl.exec(color))) {
  2292 + return { h: match[1], s: match[2], l: match[3] };
  2293 + }
  2294 + if ((match = matchers.hsla.exec(color))) {
  2295 + return { h: match[1], s: match[2], l: match[3], a: match[4] };
  2296 + }
  2297 + if ((match = matchers.hsv.exec(color))) {
  2298 + return { h: match[1], s: match[2], v: match[3] };
  2299 + }
  2300 + if ((match = matchers.hsva.exec(color))) {
  2301 + return { h: match[1], s: match[2], v: match[3], a: match[4] };
  2302 + }
  2303 + if ((match = matchers.hex8.exec(color))) {
  2304 + return {
  2305 + a: convertHexToDecimal(match[1]),
  2306 + r: parseIntFromHex(match[2]),
  2307 + g: parseIntFromHex(match[3]),
  2308 + b: parseIntFromHex(match[4]),
  2309 + format: named ? "name" : "hex8"
  2310 + };
  2311 + }
  2312 + if ((match = matchers.hex6.exec(color))) {
  2313 + return {
  2314 + r: parseIntFromHex(match[1]),
  2315 + g: parseIntFromHex(match[2]),
  2316 + b: parseIntFromHex(match[3]),
  2317 + format: named ? "name" : "hex"
  2318 + };
  2319 + }
  2320 + if ((match = matchers.hex3.exec(color))) {
  2321 + return {
  2322 + r: parseIntFromHex(match[1] + '' + match[1]),
  2323 + g: parseIntFromHex(match[2] + '' + match[2]),
  2324 + b: parseIntFromHex(match[3] + '' + match[3]),
  2325 + format: named ? "name" : "hex"
  2326 + };
  2327 + }
  2328 +
  2329 + return false;
  2330 + }
  2331 +
  2332 + window.tinycolor = tinycolor;
  2333 + })();
  2334 +
  2335 + $(function () {
  2336 + if ($.fn.spectrum.load) {
  2337 + $.fn.spectrum.processNativeColorInputs();
  2338 + }
  2339 + });
  2340 +
  2341 +});
src/main/resources/static/real_control_v2/assets/plugins/uikit-2.27.1/components/form-advanced.gradient.min.css 0 → 100644
  1 +/*! UIkit 2.27.1 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
  2 +.uk-form input[type=radio],.uk-form input[type=checkbox]{display:inline-block;height:14px;width:14px;border:1px solid #aaa;overflow:hidden;margin-top:-4px;vertical-align:middle;-webkit-appearance:none;outline:0;background:0 0}.uk-form input[type=radio]{border-radius:50%}.uk-form input[type=checkbox]:before,.uk-form input[type=radio]:before{display:block}.uk-form input[type=radio]:checked:before{content:'';width:8px;height:8px;margin:2px auto 0;border-radius:50%;background:#00a8e6}.uk-form input[type=checkbox]:checked:before,.uk-form input[type=checkbox]:indeterminate:before{content:"\f00c";font-family:FontAwesome;font-size:12px;-webkit-font-smoothing:antialiased;text-align:center;line-height:12px;color:#00a8e6}.uk-form input[type=checkbox]:indeterminate:before{content:"\f068"}.uk-form input[type=checkbox]:disabled,.uk-form input[type=radio]:disabled{border-color:#ddd}.uk-form input[type=radio]:disabled:checked:before{background-color:#aaa}.uk-form input[type=checkbox]:disabled:checked:before,.uk-form input[type=checkbox]:disabled:indeterminate:before{color:#aaa}
0 \ No newline at end of file 3 \ No newline at end of file
src/main/resources/static/real_control_v2/css/line_schedule.css
@@ -827,4 +827,23 @@ input.i-cbox[type=checkbox]{ @@ -827,4 +827,23 @@ input.i-cbox[type=checkbox]{
827 827
828 .qtip.sch-tl-tip{ 828 .qtip.sch-tl-tip{
829 max-width: 335px; 829 max-width: 335px;
  830 +}
  831 +
  832 +.sfsj-sch-detail{
  833 + list-style: none;
  834 + padding: 5px 0px;
  835 + margin-bottom: 3px;
  836 +}
  837 +.sfsj-sch-detail li{
  838 + font-size: 14px;
  839 + line-height: 24px;
  840 +}
  841 +
  842 +.sfsj-sch-detail li span{
  843 + display: inline-block;
  844 + width: 65px;
  845 + text-align: right;
  846 + color: #bab6b6;
  847 + font-family: 微软雅黑;
  848 + font-size: 13px;
830 } 849 }
831 \ No newline at end of file 850 \ No newline at end of file
src/main/resources/static/real_control_v2/css/main.css
@@ -140,8 +140,9 @@ svg.line-chart path.station_link.down { @@ -140,8 +140,9 @@ svg.line-chart path.station_link.down {
140 140
141 svg.line-chart text.station_text { 141 svg.line-chart text.station_text {
142 writing-mode: tb; 142 writing-mode: tb;
143 - fill: #676767;  
144 - text-shadow: 1px 1px 1px #e0e0e0; 143 + fill: #3e3e3e;
  144 + letter-spacing: -.2px;
  145 + text-shadow: 0 0 2px #dadada;
145 } 146 }
146 147
147 svg.line-chart text.station_text.up { 148 svg.line-chart text.station_text.up {
@@ -165,17 +166,19 @@ svg.line-chart g.item:nth-last-child(3)&gt;text { @@ -165,17 +166,19 @@ svg.line-chart g.item:nth-last-child(3)&gt;text {
165 svg.line-chart g.gps-wrap>rect { 166 svg.line-chart g.gps-wrap>rect {
166 width: 28px; 167 width: 28px;
167 height: 24px; 168 height: 24px;
168 - fill: #fff;  
169 - rx: 5px; 169 + /*fill: #fff;*/
  170 + rx: 4px;
170 cursor: pointer; 171 cursor: pointer;
171 } 172 }
172 173
173 svg.line-chart g.gps-wrap>rect[updown="0"] { 174 svg.line-chart g.gps-wrap>rect[updown="0"] {
174 - stroke: #5e96d2; 175 + stroke: rgb(62, 80, 179);
  176 + fill: rgb(62, 80, 179);
175 } 177 }
176 178
177 svg.line-chart g.gps-wrap>rect[updown="1"] { 179 svg.line-chart g.gps-wrap>rect[updown="1"] {
178 - stroke: #c92121; 180 + stroke: #c94f21;
  181 + fill: #c94f21;
179 } 182 }
180 183
181 svg.line-chart g.gps-wrap>rect.hover { 184 svg.line-chart g.gps-wrap>rect.hover {
@@ -189,11 +192,11 @@ svg.line-chart g.gps-wrap&gt;text { @@ -189,11 +192,11 @@ svg.line-chart g.gps-wrap&gt;text {
189 } 192 }
190 193
191 svg.line-chart g.gps-wrap>text[updown="0"] { 194 svg.line-chart g.gps-wrap>text[updown="0"] {
192 - fill: #5e96d2; 195 + fill: #fff;
193 } 196 }
194 197
195 svg.line-chart g.gps-wrap>text[updown="1"] { 198 svg.line-chart g.gps-wrap>text[updown="1"] {
196 - fill: #c92121; 199 + fill: #fff;
197 } 200 }
198 201
199 svg.line-chart .merge_hide { 202 svg.line-chart .merge_hide {
@@ -204,8 +207,11 @@ svg.line-chart g.merge-item rect { @@ -204,8 +207,11 @@ svg.line-chart g.merge-item rect {
204 width: 24px; 207 width: 24px;
205 height: 24px; 208 height: 24px;
206 rx: 15px; 209 rx: 15px;
207 - fill: rgb(62, 80, 179); 210 + fill: #19a53a;
208 cursor: pointer; 211 cursor: pointer;
  212 + stroke: #19a53a;
  213 + stroke-dasharray: 1,2;
  214 + stroke-width: 3px;
209 } 215 }
210 216
211 svg.line-chart g.merge-item text { 217 svg.line-chart g.merge-item text {
@@ -302,4 +308,9 @@ canvas.crosshair-layer { @@ -302,4 +308,9 @@ canvas.crosshair-layer {
302 li.map-panel{ 308 li.map-panel{
303 height: 100%; 309 height: 100%;
304 position: relative; 310 position: relative;
  311 +}
  312 +
  313 +.main-container .load-panel{
  314 + display: block;
  315 + color: #999797;
305 } 316 }
306 \ No newline at end of file 317 \ No newline at end of file
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/add_temp_sch.html
@@ -131,12 +131,12 @@ @@ -131,12 +131,12 @@
131 //车辆 131 //车辆
132 gb_common.carAutocomplete($('.car-autocom', modal), rs); 132 gb_common.carAutocomplete($('.car-autocom', modal), rs);
133 }); 133 });
134 - $.get('/basic/all_personnel', function(rs) { 134 + //$.get('/basic/all_personnel', function(rs) {
135 //驾驶员 135 //驾驶员
136 - gb_common.personAutocomplete($('.jsy-autocom', modal), rs); 136 + gb_common.personAutocomplete($('.jsy-autocom', modal));
137 //售票员 137 //售票员
138 - gb_common.personAutocomplete($('.spy-autocom', modal), rs);  
139 - }); 138 + gb_common.personAutocomplete($('.spy-autocom', modal));
  139 + //});
140 140
141 //站点路由 141 //站点路由
142 stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function(a, b){ 142 stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function(a, b){
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/tzrc.html
@@ -158,18 +158,6 @@ @@ -158,18 +158,6 @@
158 dl.removeClass('active'); 158 dl.removeClass('active');
159 }); 159 });
160 160
161 - //----------- Autocomplete --------------  
162 - $.get('/basic/cars', function(rs) {  
163 - //车辆  
164 - gb_common.carAutocomplete($('.car-autocom', modal), rs);  
165 - });  
166 - $.get('/basic/all_personnel', function(rs) {  
167 - //驾驶员  
168 - gb_common.personAutocomplete($('.jsy-autocom', modal), rs);  
169 - //售票员  
170 - gb_common.personAutocomplete($('.spy-autocom', modal), rs);  
171 - });  
172 -  
173 //默认选中项 161 //默认选中项
174 $('[name=lineSelect]', modal).val(sch.xlBm).trigger('change'); 162 $('[name=lineSelect]', modal).val(sch.xlBm).trigger('change');
175 $('[name=lpName]', modal).val(sch.lpName).trigger('change'); 163 $('[name=lpName]', modal).val(sch.lpName).trigger('change');
@@ -184,6 +172,18 @@ @@ -184,6 +172,18 @@
184 172
185 gb_ct_table.fixedHead($('.ct_table_wrap', modal)); 173 gb_ct_table.fixedHead($('.ct_table_wrap', modal));
186 174
  175 + //----------- Autocomplete --------------
  176 + $.get('/basic/cars', function(rs) {
  177 + //车辆
  178 + gb_common.carAutocomplete($('.car-autocom', modal), rs);
  179 + });
  180 + //$.get('/basic/all_personnel', function(rs) {
  181 + //驾驶员
  182 + gb_common.personAutocomplete($('.jsy-autocom', modal));
  183 + //售票员
  184 + gb_common.personAutocomplete($('.spy-autocom', modal));
  185 + //});
  186 +
187 //submit 187 //submit
188 var f = $('form.tzrc_form', modal).formValidation(gb_form_validation_opts); 188 var f = $('form.tzrc_form', modal).formValidation(gb_form_validation_opts);
189 f.on('success.form.fv', function(e) { 189 f.on('success.form.fv', function(e) {
src/main/resources/static/real_control_v2/fragments/line_schedule/sch_table.html
@@ -67,15 +67,15 @@ @@ -67,15 +67,15 @@
67 </dd> 67 </dd>
68 <dd data-sort-val={{sch.dfsjT}} dbclick dbclick-type="dfsj" dbclick-val="{{sch.dfsj}}">{{sch.dfsj}}</dd> 68 <dd data-sort-val={{sch.dfsjT}} dbclick dbclick-type="dfsj" dbclick-val="{{sch.dfsj}}">{{sch.dfsj}}</dd>
69 <dd class=" 69 <dd class="
70 - {{if sch.status==-1}}  
71 - tl-qrlb  
72 - {{else if sch.status==2}}  
73 - tl-yzx  
74 - {{else if sch.status==1}}  
75 - tl-zzzx  
76 - {{else if sch.status == 0 && sch.late}}  
77 - tl-wd  
78 - {{/if}}"> 70 + {{if sch.status==-1}}
  71 + tl-qrlb
  72 + {{else if sch.status==2}}
  73 + tl-yzx
  74 + {{else if sch.status==1}}
  75 + tl-zzzx
  76 + {{else if sch.status == 0 && sch.late}}
  77 + tl-wd
  78 + {{/if}} fcsjActualCell" >
79 {{sch.fcsjActual}}<span class="fcsj-diff">{{sch.fcsj_diff}}</span> 79 {{sch.fcsjActual}}<span class="fcsj-diff">{{sch.fcsj_diff}}</span>
80 </dd> 80 </dd>
81 <dd data-uk-observe> 81 <dd data-uk-observe>
@@ -111,19 +111,19 @@ @@ -111,19 +111,19 @@
111 </dd> 111 </dd>
112 </script> 112 </script>
113 113
114 -<script id="line-schedule-sfsj-temp" type="text/html">  
115 -<dd class="  
116 -{{if status==-1}}  
117 - tl-qrlb  
118 -{{else if status==2}}  
119 - tl-yzx  
120 -{{else if status==1}}  
121 - tl-zzzx  
122 -{{else if status == 0 && late}}  
123 - tl-wd  
124 -{{/if}}">  
125 - {{fcsjActual}}<span class="fcsj-diff">{{fcsj_diff}}</span>  
126 - </dd> 114 + <script id="line-schedule-sfsj-temp" type="text/html">
  115 + <dd class="
  116 + {{if status==-1}}
  117 + tl-qrlb
  118 + {{else if status==2}}
  119 + tl-yzx
  120 + {{else if status==1}}
  121 + tl-zzzx
  122 + {{else if status == 0 && late}}
  123 + tl-wd
  124 + {{/if}}">
  125 + {{fcsjActual}}<span class="fcsj-diff">{{fcsj_diff}}</span>
  126 + </dd>
127 </script> 127 </script>
128 128
129 <script id="line-schedule-nbbm-temp" type="text/html"> 129 <script id="line-schedule-nbbm-temp" type="text/html">
@@ -132,4 +132,18 @@ @@ -132,4 +132,18 @@
132 {{clZbh}} 132 {{clZbh}}
133 </dd> 133 </dd>
134 </script> 134 </script>
  135 +
  136 + <script id="sfsj_sch-detail-temp" type="text/html">
  137 + <ul class="sfsj-sch-detail">
  138 + <li><span>路牌:</span>{{lpName}}</li>
  139 + <li><span>车辆:</span>{{clZbh}}</li>
  140 + <li><span>计发:</span>{{fcsj}}</li>
  141 + <li><span>实发:</span>{{fcsjActual}}</li>
  142 + <li><span>计达:</span>{{zdsj}}</li>
  143 + <li><span>实达:</span>{{zdsjActual}}</li>
  144 + <li><span>驾驶员:</span>{{jName}}</li>
  145 + <li><span>售票员:</span>{{sName}}</li>
  146 + <li><span>终点站:</span>{{zdzName}}</li>
  147 + </ul>
  148 + </script>
135 </div> 149 </div>
src/main/resources/static/real_control_v2/js/common.js
@@ -177,7 +177,7 @@ var gb_common = (function() { @@ -177,7 +177,7 @@ var gb_common = (function() {
177 }; 177 };
178 178
179 var personAutocomplete = function(element, personMaps) { 179 var personAutocomplete = function(element, personMaps) {
180 - var data = [],name; 180 + /*var data = [],name;
181 for(var jobCode in personMaps){ 181 for(var jobCode in personMaps){
182 name=personMaps[jobCode]; 182 name=personMaps[jobCode];
183 data.push({ 183 data.push({
@@ -185,8 +185,9 @@ var gb_common = (function() { @@ -185,8 +185,9 @@ var gb_common = (function() {
185 fullChars: pinyin.getFullChars(name).toUpperCase(), 185 fullChars: pinyin.getFullChars(name).toUpperCase(),
186 camelChars: pinyin.getCamelChars(name) 186 camelChars: pinyin.getCamelChars(name)
187 }); 187 });
188 - }  
189 - init_autocom_pinyin(element, data); 188 + }*/
  189 + //init_autocom_pinyin(element, data);
  190 + init_autocom_pinyin(element, gb_data_basic.allPersonnel());
190 }; 191 };
191 192
192 var carAutocomplete=function(element, list){ 193 var carAutocomplete=function(element, list){
src/main/resources/static/real_control_v2/js/data/data_basic.js
1 /* 基础数据管理模块 */ 1 /* 基础数据管理模块 */
2 2
3 -var gb_data_basic = (function() { 3 +var gb_data_basic = (function () {
4 4
5 - var stationRoutes,lineCode2NameAll,lineInformations, nbbm2deviceMap;  
6 - var ep = EventProxy.create("stationRoutes", "lineCode2Name", "lineInformations", "nbbm2deviceId", function(routes, code2Name, informations, nbbm2device) {  
7 - stationRoutes = routes;  
8 - lineCode2NameAll = code2Name;  
9 - lineInformations = informations;  
10 - nbbm2deviceMap = nbbm2device;  
11 - gb_main_ep.emitLater('data-basic');  
12 - }); 5 + var stationRoutes, lineCode2NameAll, lineInformations, nbbm2deviceMap, allPersonnel;
  6 + var ep = EventProxy.create("stationRoutes", "lineCode2Name", "lineInformations", "nbbm2deviceId", "all_personnel"
  7 + , function (routes, code2Name, informations, nbbm2device, all_personnel) {
  8 + stationRoutes = routes;
  9 + lineCode2NameAll = code2Name;
  10 + lineInformations = informations;
  11 + nbbm2deviceMap = nbbm2device;
  12 + allPersonnel = all_personnel;
  13 + gb_main_ep.emitLater('data-basic');
  14 + });
13 15
14 var storage = window.localStorage; 16 var storage = window.localStorage;
15 //激活的线路 17 //激活的线路
16 var activeLines = JSON.parse(storage.getItem('lineControlItems')); 18 var activeLines = JSON.parse(storage.getItem('lineControlItems'));
17 //lineCode to line object 19 //lineCode to line object
18 - var codeToLine={}; 20 + var codeToLine = {};
19 //lineCode idx string 21 //lineCode idx string
20 - var line_idx = (function() { 22 + var line_idx = (function () {
21 var str = ''; 23 var str = '';
22 - for (var i = 0, item; item = activeLines[i++];){  
23 - str += (',' + item.lineCode);  
24 - codeToLine[item.lineCode] = item; 24 + for (var i = 0, item; item = activeLines[i++];) {
  25 + str += (',' + item.lineCode);
  26 + codeToLine[item.lineCode] = item;
25 } 27 }
26 return str.substr(1); 28 return str.substr(1);
27 })(); 29 })();
28 30
29 //站点路由 31 //站点路由
30 - gb_common.$get('/stationroute/multiLine', {lineIds: line_idx}, function(rs) { 32 + gb_common.$get('/stationroute/multiLine', {lineIds: line_idx}, function (rs) {
31 var list = JSON.parse(rs.list); 33 var list = JSON.parse(rs.list);
32 ep.emit('stationRoutes', gb_common.groupBy(list, 'lineCode')); 34 ep.emit('stationRoutes', gb_common.groupBy(list, 'lineCode'));
33 }); 35 });
34 36
35 //线路标准信息 37 //线路标准信息
36 - gb_common.$get('/lineInformation/line/multi', {lineCodes: line_idx}, function(rs){  
37 - var informations={};  
38 - $.each(rs, function(){ 38 + gb_common.$get('/lineInformation/line/multi', {lineCodes: line_idx}, function (rs) {
  39 + var informations = {};
  40 + $.each(rs, function () {
39 informations[this.line.lineCode] = this; 41 informations[this.line.lineCode] = this;
40 delete this['line']; 42 delete this['line'];
41 - });  
42 - ep.emit('lineInformations', informations); 43 + });
  44 + ep.emit('lineInformations', informations);
  45 + });
  46 +
  47 +
  48 + //人员信息
  49 + $.get('/basic/all_personnel', function (rs) {
  50 + //转换成自动补全组件需要的数据
  51 + var data=[],name;
  52 + for(var jobCode in rs){
  53 + name=rs[jobCode];
  54 + data.push({
  55 + value: jobCode+'/'+name,
  56 + fullChars: pinyin.getFullChars(name).toUpperCase(),
  57 + camelChars: pinyin.getCamelChars(name)
  58 + });
  59 + }
  60 + ep.emit('all_personnel', data);
43 }); 61 });
44 62
45 //line code to name 63 //line code to name
46 - $.get('/basic/lineCode2Name', function(rs){  
47 - ep.emit('lineCode2Name', rs); 64 + $.get('/basic/lineCode2Name', function (rs) {
  65 + ep.emit('lineCode2Name', rs);
48 }); 66 });
49 67
50 //nbbm to device id 68 //nbbm to device id
51 - $.get('/basic/nbbm2deviceId', function(rs){  
52 - ep.emit('nbbm2deviceId', rs); 69 + $.get('/basic/nbbm2deviceId', function (rs) {
  70 + ep.emit('nbbm2deviceId', rs);
53 }); 71 });
54 72
55 - function findLineByCodes(codeArr){  
56 - var rs=[];  
57 - $.each(codeArr, function(){  
58 - rs.push(codeToLine[this]);  
59 - });  
60 - return rs; 73 + function findLineByCodes(codeArr) {
  74 + var rs = [];
  75 + $.each(codeArr, function () {
  76 + rs.push(codeToLine[this]);
  77 + });
  78 + return rs;
61 } 79 }
62 80
63 - var findCodeByLinename = function(name){  
64 - for(var code in lineCode2NameAll){  
65 - if(name == lineCode2NameAll[code])  
66 - return code;  
67 - } 81 + var findCodeByLinename = function (name) {
  82 + for (var code in lineCode2NameAll) {
  83 + if (name == lineCode2NameAll[code])
  84 + return code;
  85 + }
68 86
69 - return null; 87 + return null;
70 } 88 }
71 89
72 - var getLineInformation=function(lineCode){  
73 - return lineInformations[lineCode]; 90 + var getLineInformation = function (lineCode) {
  91 + return lineInformations[lineCode];
74 } 92 }
75 //文件载入完毕 93 //文件载入完毕
76 res_load_ep.emitLater('load_data_basic'); 94 res_load_ep.emitLater('load_data_basic');
@@ -79,11 +97,20 @@ var gb_data_basic = (function() { @@ -79,11 +97,20 @@ var gb_data_basic = (function() {
79 activeLines: activeLines, 97 activeLines: activeLines,
80 line_idx: line_idx, 98 line_idx: line_idx,
81 codeToLine: codeToLine, 99 codeToLine: codeToLine,
82 - nbbm2deviceMap: function(){return nbbm2deviceMap;}, 100 + nbbm2deviceMap: function () {
  101 + return nbbm2deviceMap;
  102 + },
83 getLineInformation: getLineInformation, 103 getLineInformation: getLineInformation,
84 - stationRoutes: function(lineCode){return stationRoutes[lineCode]}, 104 + stationRoutes: function (lineCode) {
  105 + return stationRoutes[lineCode]
  106 + },
85 findLineByCodes: findLineByCodes, 107 findLineByCodes: findLineByCodes,
86 - lineCode2NameAll: function(){return lineCode2NameAll}, 108 + lineCode2NameAll: function () {
  109 + return lineCode2NameAll
  110 + },
  111 + allPersonnel: function () {
  112 + return allPersonnel;
  113 + },
87 findCodeByLinename: findCodeByLinename 114 findCodeByLinename: findCodeByLinename
88 }; 115 };
89 })(); 116 })();
src/main/resources/static/real_control_v2/js/home/line_panel.js
@@ -82,6 +82,9 @@ var gb_home_line_panel = (function() { @@ -82,6 +82,9 @@ var gb_home_line_panel = (function() {
82 var cells = e.find('dd'); 82 var cells = e.find('dd');
83 $(cells[1]).text(t.speed); 83 $(cells[1]).text(t.speed);
84 $(cells[2]).html(t.expectStopTime == null ? '' : t.expectStopTime); 84 $(cells[2]).html(t.expectStopTime == null ? '' : t.expectStopTime);
  85 +
  86 + if(!t.stationName)
  87 + t.stationName='';
85 $(cells[3]).text(t.stationName).attr('title', t.stationName); 88 $(cells[3]).text(t.stationName).attr('title', t.stationName);
86 89
87 //班次信息 90 //班次信息
src/main/resources/static/real_control_v2/js/line_schedule/sch_table.js
@@ -65,10 +65,37 @@ var gb_schedule_table = (function() { @@ -65,10 +65,37 @@ var gb_schedule_table = (function() {
65 //dbclick event 65 //dbclick event
66 gb_schedule_table_dbclick.init(); 66 gb_schedule_table_dbclick.init();
67 67
  68 + fcsjActualCellQtip();
68 cb && cb(); 69 cb && cb();
69 }); 70 });
70 } 71 }
71 72
  73 + function fcsjActualCellQtip(){
  74 + //单击实发单元格显示详细信息
  75 + $('dd.fcsjActualCell').qtip({
  76 + show: 'click',
  77 + content: {
  78 + text: function(e) {
  79 + var lineCode=$(e.target).parents('li.line_schedule').data('id')
  80 + ,id=$(e.target).parent().data('id')
  81 + ,sch=line2Schedule[lineCode][id];
  82 + return temps['sfsj_sch-detail-temp'](sch);
  83 + }
  84 + }
  85 + ,style: {
  86 + classes: 'qtip-dark qtip-rounded qtip-shadow'
  87 + },
  88 + hide: {
  89 + fixed: true,
  90 + delay: 300
  91 + },
  92 + position: {
  93 + my: 'center left',
  94 + at: 'center right'
  95 + }
  96 + });
  97 + }
  98 +
72 //重置序号 99 //重置序号
73 var reset_seq_no = function(dls) { 100 var reset_seq_no = function(dls) {
74 dls.each(function(i, dl) { 101 dls.each(function(i, dl) {
src/main/resources/static/real_control_v2/js/main.js
@@ -58,7 +58,7 @@ var gb_main_ep = new EventProxy(), @@ -58,7 +58,7 @@ var gb_main_ep = new EventProxy(),
58 }); 58 });
59 59
60 //嵌入地图页面 60 //嵌入地图页面
61 - $('li.map-panel','#main-tab-content').load('/real_control_v2/mapmonitor/real_monitor/real.html'); 61 + $('li.map-panel','#main-tab-content').load('/real_control_v2/mapmonitor/real.html');
62 }); 62 });
63 63
64 function g_emit(id) { 64 function g_emit(id) {
src/main/resources/static/real_control_v2/js/utils/svg_chart.js
@@ -97,7 +97,8 @@ var gb_svg_chart = (function() { @@ -97,7 +97,8 @@ var gb_svg_chart = (function() {
97 var c_clzz = { 97 var c_clzz = {
98 'station_circle': true 98 'station_circle': true
99 }; 99 };
100 - items.append('circle').classed(c_clzz) 100 + items.select(function (d) {return d.type!=1?this:null;})
  101 + .append('circle').classed(c_clzz)
101 .attr('cx', cx) 102 .attr('cx', cx)
102 .attr('cy', cy) 103 .attr('cy', cy)
103 .attr('data-id', function(d) { 104 .attr('data-id', function(d) {
@@ -106,13 +107,14 @@ var gb_svg_chart = (function() { @@ -106,13 +107,14 @@ var gb_svg_chart = (function() {
106 107
107 //down circle 108 //down circle
108 c_clzz.down = true; 109 c_clzz.down = true;
109 - items.append('circle').classed(c_clzz) 110 + items.select(function (d) {return d.type!=0?this:null;})
  111 + .append('circle').classed(c_clzz)
110 .attr('cx', cx) 112 .attr('cx', cx)
111 .attr('cy', function(d, i) { 113 .attr('cy', function(d, i) {
112 return cy(d, i) + chart_height; 114 return cy(d, i) + chart_height;
113 }) 115 })
114 .attr('data-id', function(d) { 116 .attr('data-id', function(d) {
115 - return d.id[1]; 117 + return d.type==1?d.id[0]:d.id[1];
116 }); 118 });
117 119
118 //station name text 120 //station name text
@@ -148,9 +150,14 @@ var gb_svg_chart = (function() { @@ -148,9 +150,14 @@ var gb_svg_chart = (function() {
148 //gps 按线路站点分组后的下标映射 150 //gps 按线路站点分组后的下标映射
149 var line_gps_index = {}; 151 var line_gps_index = {};
150 var get_circle = function(dataId, svg) { 152 var get_circle = function(dataId, svg) {
151 - var circle = $('.station_circle[data-id=' + dataId + ']', svg);  
152 - if (circle.length == 0)  
153 - circle = null; 153 + try {
  154 + var circle = $('.station_circle[data-id=' + dataId + ']', svg);
  155 + if (circle.length == 0)
  156 + circle = null;
  157 + }catch (e){
  158 + console.log('get_circle error! station_circle data-id:' + dataId);
  159 + return null;
  160 + }
154 return circle; 161 return circle;
155 }, 162 },
156 gx = function(gps, svg) { 163 gx = function(gps, svg) {
@@ -216,10 +223,20 @@ var gb_svg_chart = (function() { @@ -216,10 +223,20 @@ var gb_svg_chart = (function() {
216 var svgs = $('.line-chart[data-code=' + lineCode + ']'), 223 var svgs = $('.line-chart[data-code=' + lineCode + ']'),
217 data = gb_data_gps.gpsByLineCode(lineCode); 224 data = gb_data_gps.gpsByLineCode(lineCode);
218 225
219 - line_gps_index[lineCode] = gps_index_mapp(data); 226 + var list=[];
  227 + //过滤数据,起终点站附加 方向标识
  228 + $.each(data, function(){
  229 + if(!this.stopNo || this.stopNo=='')
  230 + return true;
  231 + if(this.sEPoint)
  232 + this.stopNo=this.stopNo+'_'+this.upDown;
  233 + list.push(this);
  234 + });
  235 +
  236 + line_gps_index[lineCode] = gps_index_mapp(list);
220 $.each(svgs, function() { 237 $.each(svgs, function() {
221 //绘制gps 238 //绘制gps
222 - draw_gps(this, data); 239 + draw_gps(this, list);
223 //聚合gps 240 //聚合gps
224 marker_clusterer(this, lineCode); 241 marker_clusterer(this, lineCode);
225 }); 242 });
@@ -280,12 +297,12 @@ var gb_svg_chart = (function() { @@ -280,12 +297,12 @@ var gb_svg_chart = (function() {
280 //merge rect 297 //merge rect
281 mergerG.append('rect').attr('x', x - 12) 298 mergerG.append('rect').attr('x', x - 12)
282 .attr('y', function() { 299 .attr('y', function() {
283 - return isDown ? y + 5 : y - 30; 300 + return isDown ? y + 7 : y - 32;
284 }); 301 });
285 //merge text 302 //merge text
286 mergerG.append('text').text(gpsArr.length) 303 mergerG.append('text').text(gpsArr.length)
287 .attr('x', x - 4) 304 .attr('x', x - 4)
288 - .attr('y', isDown ? y + 22 : y - 12); 305 + .attr('y', isDown ? y + 24 : y - 14);
289 } 306 }
290 307
291 return { 308 return {
src/main/resources/static/real_control_v2/js/utils/svg_chart_map.js
1 -var gb_svg_map_util = (function(){  
2 - var storage = window.localStorage;  
3 - var drawLine = function(map, gps) {  
4 - //从storage里获取路段路由数据  
5 - var routes = JSON.parse(storage.getItem(gps.lineId + '_route')),  
6 - updown = gps.upDown == 0 ? 'up' : 'down',  
7 - pots = [],  
8 - tempArr;  
9 -  
10 - $.each(routes[updown].split(','), function() {  
11 - tempArr = this.split(' ');  
12 - pots.push(new BMap.Point(tempArr[0], tempArr[1]));  
13 - });  
14 -  
15 - var polyline = new BMap.Polyline(pots, {  
16 - strokeWeight: 6,  
17 - strokeOpacity: 0.5,  
18 - strokeColor: gps.upDown == 0 ? 'blue' : 'red'  
19 - });  
20 -  
21 - map.addOverlay(polyline);  
22 -  
23 - $.each(gb_data_basic.stationRoutes(gps.lineId), function() {  
24 - if (this.directions == gps.upDown) {  
25 - var marker = drawStationMarker(this);  
26 - if (marker)  
27 - map.addOverlay(marker);  
28 - }  
29 - })  
30 - }  
31 -  
32 - var drawStationMarker = function(routeItem) {  
33 - var station = routeItem.station,  
34 - coord = TransGPS.wgsToBD(station.gLaty, station.gLonx);  
35 -  
36 - var marker = new BMap.Marker(new BMap.Point(coord.lng, coord.lat));  
37 -  
38 - //label  
39 - var offsetX = Math.abs(station.stationName.length / 2 * 12),  
40 - offsetY = -20,  
41 - label = new BMap.Label(station.stationName, {  
42 - offset: new BMap.Size(-offsetX, offsetY)  
43 - });  
44 -  
45 - label.setStyle({  
46 - borderColor: 'rgb(130, 119, 119)',  
47 - borderRadius: '3px',  
48 - padding: '3px 7px 3px 7px',  
49 - color: 'rgb(130, 119, 119)'  
50 - });  
51 - marker.setLabel(label);  
52 - return marker;  
53 - }  
54 -  
55 - return {drawLine: drawLine}; 1 +var gb_svg_map_util = (function () {
  2 + var storage = window.localStorage;
  3 + var drawLine = function (map, gps) {
  4 + //从storage里获取路段路由数据
  5 + var routes = JSON.parse(storage.getItem(gps.lineId + '_route')),
  6 + updown = gps.upDown == 0 ? 'up' : 'down',
  7 + pots = [],
  8 + tempArr;
  9 +
  10 + $.each(routes[updown].split(','), function () {
  11 + tempArr = this.split(' ');
  12 + pots.push(new BMap.Point(tempArr[0], tempArr[1]));
  13 + });
  14 +
  15 + var polyline = new BMap.Polyline(pots, {
  16 + strokeWeight: 6,
  17 + strokeOpacity: 0.5,
  18 + strokeColor: gps.upDown == 0 ? 'blue' : 'red'
  19 + });
  20 +
  21 + map.addOverlay(polyline);
  22 +
  23 + $.each(gb_data_basic.stationRoutes(gps.lineId), function (i) {
  24 + if (this.directions == gps.upDown) {
  25 + try {
  26 + var marker = drawStationMarker(this);
  27 + if (marker)
  28 + map.addOverlay(marker);
  29 + }catch(e){
  30 + console.log(e);}
  31 + }
  32 + })
  33 + }
  34 +
  35 + var drawStationMarker = function (routeItem) {
  36 + var station = routeItem.station,
  37 + coord = TransGPS.wgsToBD(station.gLaty, station.gLonx);
  38 +
  39 + var marker = new BMap.Marker(new BMap.Point(coord.lng, coord.lat));
  40 +
  41 + //label
  42 + var offsetX = Math.abs(station.stationName.length / 2 * 12),
  43 + offsetY = -20,
  44 + label = new BMap.Label(station.stationName, {
  45 + offset: new BMap.Size(-offsetX, offsetY)
  46 + });
  47 +
  48 + label.setStyle({
  49 + borderColor: 'rgb(130, 119, 119)',
  50 + borderRadius: '3px',
  51 + padding: '3px 7px 3px 7px',
  52 + color: 'rgb(130, 119, 119)'
  53 + });
  54 + marker.setLabel(label);
  55 + return marker;
  56 + }
  57 +
  58 + return {drawLine: drawLine};
56 })(); 59 })();
src/main/resources/static/real_control_v2/js/utils/svg_chart_tooltip.js
@@ -57,10 +57,10 @@ var gb_svg_tooltip = (function() { @@ -57,10 +57,10 @@ var gb_svg_tooltip = (function() {
57 // var gps = gb_data_gps.findOne($(this).attr('_id').split('_')[1]); 57 // var gps = gb_data_gps.findOne($(this).attr('_id').split('_')[1]);
58 //获取聚合的gps 58 //获取聚合的gps
59 var lineCode=$(this).parents('svg').data('code') 59 var lineCode=$(this).parents('svg').data('code')
60 - ,stop=$(this).parent().attr('_id').split('_')[1] 60 + ,stop=$(this).parent().attr('_id').substr(7)//merger_
61 ,gpsArray=searchByStop(gb_data_gps.gpsByLineCode(lineCode), stop); 61 ,gpsArray=searchByStop(gb_data_gps.gpsByLineCode(lineCode), stop);
62 62
63 - console.log('gpsArray...',gpsArray); 63 + console.log('stop...',stop);
64 $(this).qtip({ 64 $(this).qtip({
65 show: { 65 show: {
66 ready: true, 66 ready: true,
src/main/resources/static/real_control_v2/js/utils/svg_data_convert.js
@@ -20,7 +20,7 @@ var gb_svg_data_convert = (function() { @@ -20,7 +20,7 @@ var gb_svg_data_convert = (function() {
20 downS = nvl_get(down, j), 20 downS = nvl_get(down, j),
21 op = { 21 op = {
22 name: [upS.stationName], 22 name: [upS.stationName],
23 - id: [upS.stationCode, downS.stationCode], 23 + id: [get_station_code(upS), get_station_code(downS)],
24 type: 2, 24 type: 2,
25 stationMark: upS.stationMark//站点标记 25 stationMark: upS.stationMark//站点标记
26 }; 26 };
@@ -85,14 +85,14 @@ var gb_svg_data_convert = (function() { @@ -85,14 +85,14 @@ var gb_svg_data_convert = (function() {
85 85
86 var upSort = function(a, b) { 86 var upSort = function(a, b) {
87 return a.stationRouteCode - b.stationRouteCode; 87 return a.stationRouteCode - b.stationRouteCode;
88 - } 88 + };
89 89
90 var downSort = function(a, b) { 90 var downSort = function(a, b) {
91 return b.stationRouteCode - a.stationRouteCode; 91 return b.stationRouteCode - a.stationRouteCode;
92 - } 92 + };
93 93
94 var station_indexof = function(array, station, start) { 94 var station_indexof = function(array, station, start) {
95 - var res = -1 95 + var res = -1;
96 for (var i = start, obj; obj = array[i++];) { 96 for (var i = start, obj; obj = array[i++];) {
97 if (obj.stationName == station.stationName) { 97 if (obj.stationName == station.stationName) {
98 res = i; 98 res = i;
@@ -100,10 +100,17 @@ var gb_svg_data_convert = (function() { @@ -100,10 +100,17 @@ var gb_svg_data_convert = (function() {
100 } 100 }
101 } 101 }
102 return res; 102 return res;
103 - } 103 + };
  104 +
  105 + var get_station_code=function (station) {
  106 + if(station.stationMark=='B' || station.stationMark=='E')
  107 + return station.stationCode+'_'+station.directions;
  108 + else
  109 + return station.stationCode;
  110 + };
104 111
105 var nvl_get = function(list, index) { 112 var nvl_get = function(list, index) {
106 return list[index] == null ? {} : list[index]; 113 return list[index] == null ? {} : list[index];
107 - } 114 + };
108 return {mergeRoute: mergeRoute}; 115 return {mergeRoute: mergeRoute};
109 })(); 116 })();
src/main/resources/static/real_control_v2/main.html
@@ -50,7 +50,12 @@ @@ -50,7 +50,12 @@
50 <div class="north-tabs"></div> 50 <div class="north-tabs"></div>
51 </div> 51 </div>
52 52
53 - <div class="main-container"></div> 53 + <div class="main-container">
  54 + <div class="load-panel">
  55 + <i class="uk-icon-spinner uk-icon-spin"></i>
  56 + 正在加载数据
  57 + </div>
  58 + </div>
54 59
55 <!-- 地图相关 --> 60 <!-- 地图相关 -->
56 <script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT" ></script> 61 <script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT" ></script>
src/main/resources/static/real_control_v2/mapmonitor/css/real.css 0 → 100644
  1 +.z-depth-2 {
  2 + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
  3 +}
  4 +
  5 +.map-system-msg a{
  6 + position: absolute;
  7 + z-index: 2;
  8 + top: 20px;
  9 + background: red;
  10 + color: white;
  11 + padding: 7px;
  12 + left: calc(50% - 150px);
  13 + border-radius: 5px;
  14 + font-size: 20px;
  15 + cursor: pointer;
  16 +}
  17 +
  18 +#real_map_container{
  19 + width: 100%;
  20 + height: 100%;
  21 +
  22 + moz-user-select: -moz-none;
  23 + -moz-user-select: none;
  24 + -o-user-select:none;
  25 + -khtml-user-select:none;
  26 + -webkit-user-select:none;
  27 + -ms-user-select:none;
  28 + user-select:none;
  29 +}
  30 +
  31 +.real_right_gps_panel{
  32 + position: absolute;
  33 + right: 4px;
  34 + width: 320px;
  35 + height: 100%;
  36 + height: calc(100% - 6px);
  37 + background: #ffffff;
  38 + top: 3px;
  39 + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
  40 +}
  41 +
  42 +/**/
  43 +.real_bottom_panel{
  44 + position: absolute !important;
  45 + height: 180px;
  46 + width: 100%;
  47 + width: calc(100% - 342px);
  48 + bottom: 2px !important;
  49 + left: 0px !important;
  50 + background: #fff;
  51 + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
  52 + /* border-radius: 0 60px 0 0;*/
  53 + border: 1px solid #bfbcbc;
  54 +}
  55 +
  56 +
  57 +.real_right_gps_panel>form{
  58 + text-align: center;
  59 + margin-top: 20px;
  60 +}
  61 +
  62 +.real_right_gps_panel>form>div.uk-form-icon{
  63 + width: 88%;
  64 +}
  65 +
  66 +.real_right_gps_panel>form>div.uk-form-icon input{
  67 + width: 100%;
  68 +}
  69 +
  70 +.real_right_gps_panel>form>div.uk-form-icon input::-webkit-input-placeholder{
  71 + font-size: 12px;
  72 +}
  73 +
  74 +.real_right_gps_panel .gps_tree_list{
  75 + height: calc(100% - 80px);
  76 + overflow: auto;
  77 + padding: 20px 0 0 32px;
  78 +}
  79 +
  80 +/*.real_bottom_panel{
  81 + width: 100%;
  82 + background: red;
  83 + height: 100px;
  84 + position: fixed !important;
  85 + top: auto !important;
  86 + bottom: 0 !important;
  87 + left: 0;
  88 + right: 0;
  89 +}
  90 +*/
  91 +.real_bottom_panel #handle{
  92 + width: 100%;
  93 + height: 4px;
  94 + top: -4px;
  95 + background-color: rgba(136, 137, 138, 0.49);
  96 + cursor: row-resize;
  97 +}
  98 +
  99 +
  100 +.real_bottom_panel .real_bl_cont{
  101 + display: inline-block;
  102 + width: calc(100% - 240px);
  103 + height: 100%;
  104 + overflow: auto;
  105 +}
  106 +
  107 +.real_bottom_panel .real_br_cont{
  108 + display: inline-block;
  109 + width: 232px;
  110 + height: 100%;
  111 + height: calc(100% - 7px);
  112 + overflow: auto;
  113 + padding-top: 7px;
  114 + font-size: 13px
  115 +}
  116 +
  117 +.real_br_cont .uk-form .uk-form-row{
  118 + border-bottom: 1px solid #e9e9e9;
  119 + padding-bottom: 4px;
  120 +}
  121 +
  122 +.real_br_cont .uk-form input{
  123 + vertical-align: middle;
  124 + margin-top: -2px;
  125 +}
  126 +
  127 +.real_br_cont .uk-form .uk-form-controls label{
  128 + margin-right: 15px;
  129 + display: inline-block;
  130 +}
  131 +
  132 +.real_br_cont .uk-form .uk-form-controls label:last-child{
  133 + margin-right: 0;
  134 +}
  135 +
  136 +.real_br_cont .sp-placeholder{
  137 + width: 15px;
  138 + height: 15px;
  139 + margin: 2px 0 0 7px;
  140 + border-radius: 2px;
  141 + float: right;
  142 + cursor: pointer;
  143 +}
  144 +
  145 +.real_br_cont .color_block{
  146 + display: inline-block;
  147 + margin-right: 9px;
  148 +}
  149 +
  150 +.real_br_cont .color_block:last-child{
  151 + margin-right: 0;
  152 +}
  153 +
  154 +.real_br_cont .sp-placeholder .sp-placeholder-color {
  155 + width: 15px;
  156 + height: 15px;
  157 + border-radius: 2px;
  158 + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset;
  159 +}
  160 +
  161 +.sp-container {
  162 + border: 1px solid #d3d3d3;
  163 + background-color: #fff;
  164 + border-radius: 4px;
  165 + box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  166 +}
0 \ No newline at end of file 167 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/js/config.js 0 → 100644
  1 +/** 地图配置信息 */
  2 +
  3 +var gb_map_config=(function () {
  4 +
  5 + var defaultConfig={
  6 + //地图类型
  7 + map_type: 'baidu',
  8 + //实时路况
  9 + traffic: false
  10 +
  11 + };
  12 +})();
0 \ No newline at end of file 13 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/js/map/iMap.js 0 → 100644
  1 +/** 各地图平台通用接口定义 */
  2 +var gb_map_imap = (function(){
  3 +
  4 + var storage = window.localStorage;
  5 + // 地图DOM容器
  6 + var mapContainer = $('#mapContainer');
  7 + var maps = {};
  8 + //尝试从 localStorage 里获取默认的地图类型
  9 + var currentMap = storage.getItem('real_map');
  10 + var mapProxy = {
  11 + //添加一个地图实例
  12 + addMap: function(name, text, instance){
  13 + maps[name] = {name: name, text: text, instance: instance};
  14 +
  15 + if(!currentMap)
  16 + currentMap = name;
  17 + return mapProxy;
  18 + },
  19 + changeDefault: function(mapName){
  20 + if(mapName == currentMap)
  21 + return;
  22 + if(maps[mapName]){
  23 + //原地图 destroy
  24 + var oldMap = maps[currentMap].instance;
  25 + oldMap.destroy && oldMap.destroy();
  26 + $(gb_map_consts.mapContainer).html('');
  27 + //解除实时路况按钮点击事件
  28 + $(gb_map_consts.trafficBtn).unbind('click');
  29 +
  30 + //新地图 INIT
  31 + var text = maps[mapName].text;
  32 + //layer.msg('正在切换到' + text + '...', {icon : 16,shade : [ 0.6, '#393D49' ],time : 0});
  33 + var newMap = maps[mapName].instance;
  34 + newMap.init();
  35 + setText(text);
  36 +
  37 + currentMap = mapName;
  38 + //收拢线路
  39 + $('.mapRightWrap .collapse.in').collapse('hide');
  40 + }else
  41 + alertErr('不存在的地图实例' + mapName);
  42 + },
  43 + createCarIcon: createCarIcon,
  44 + call: function(f, opts){
  45 + if(f == 'init')
  46 + setText(maps[currentMap].text);
  47 +
  48 + var instance = maps[currentMap].instance;
  49 + if(instance[f])
  50 + instance[f](opts);
  51 + else
  52 + alertErr('当前地图实例不支持操作:' + f);
  53 + return mapProxy;
  54 + }
  55 + }
  56 +
  57 + //绘制车辆icon
  58 + function createCarIcon(gps, w){
  59 + var canvas = $('<canvas></canvas>')[0];
  60 + var ctx = canvas.getContext('2d');
  61 +
  62 + var colours = color(gps);
  63 +
  64 + ctx.shadowOffsetX = 5; // 阴影Y轴偏移
  65 + ctx.shadowOffsetY = 5; // 阴影X轴偏移
  66 + ctx.shadowBlur = 1; // 模糊尺寸
  67 + ctx.shadowColor = colours.shadow; // 颜色
  68 +
  69 + //绘制背景
  70 + if(!w)
  71 + w = 70;
  72 +
  73 + ctx.roundRect(0, 0, w, 25, 5).stroke();
  74 + ctx.fillStyle=colours.bgColor;
  75 + ctx.fill();
  76 + //文字
  77 + ctx.font="14px arial";
  78 + ctx.fillStyle = "#fff";
  79 + ctx.fillText(gps.nbbm, 8, 18);
  80 +
  81 + return canvas.toDataURL();
  82 + }
  83 +
  84 + function color(g){
  85 + var colours = {};
  86 + switch (g.state) {
  87 + case 0:
  88 + if(g.upDown == 0){
  89 + //营运上行
  90 + colours['bgColor'] = 'rgba(94, 150, 210, 1)';
  91 + colours['shadow'] = 'rgba(94, 150, 210, 0.3)';
  92 + }
  93 + else if(g.upDown == 1){
  94 + //营运下行
  95 + colours['bgColor'] = 'rgba(201, 33, 33, 1)';
  96 + colours['shadow'] = 'rgba(201, 33, 33, 0.3)';
  97 + }
  98 + else{
  99 + //未知走向
  100 + colours['bgColor'] = 'rgba(0, 0, 0, 1)';
  101 + colours['shadow'] = 'rgba(0, 0, 0, 0.3)';
  102 + }
  103 + break;
  104 +
  105 + default:
  106 + //非营运
  107 + colours['bgColor'] = 'rgba(136, 133, 133, 1)';
  108 + colours['shadow'] = 'rgba(136, 133, 133, 0.3)';
  109 + break;
  110 + }
  111 +
  112 + return colours;
  113 + }
  114 +
  115 + function alertErr(text){
  116 + notify_err('map -'+text);
  117 + }
  118 +
  119 + function setText(text) {
  120 + $('#curr_map_name').text(text);
  121 + }
  122 +
  123 + //文件载入完毕
  124 + mapmonitor_load_ep.emitLater('load_iMap');
  125 + return mapProxy;
  126 +})();
src/main/resources/static/real_control_v2/mapmonitor/js/map/platform/baidu.js 0 → 100644
  1 +/** 百度地图相关接口封装 */
  2 +var gb_map_baidu = (function(){
  3 +
  4 + var map;
  5 + var realMarkers = {};
  6 + var topMarker;
  7 + //实时路况是否打开
  8 + var traffVisible;
  9 + //线路 Polyline
  10 + var linePolyline;
  11 +
  12 + var polylines={};
  13 + var buffAreas = {};
  14 + var baiduInstance = {
  15 + //初始化
  16 + init: function(){
  17 + if(!window.BMap){
  18 + alert('地图没有加载成功,请确认是否能正常连接外网!!');
  19 + return;
  20 + }
  21 + map = new BMap.Map($(gb_map_consts.mapContainer)[0]);
  22 + //中心点和缩放级别
  23 + map.centerAndZoom(new BMap.Point(gb_map_consts.center_point.lng, gb_map_consts.center_point.lat), 12);
  24 + map.enableScrollWheelZoom();
  25 +
  26 + window.localStorage.setItem('real_map', 'baidu');
  27 +
  28 + // 路况控件
  29 +/* var ctrl = new BMapLib.TrafficControl();
  30 + map.addControl(ctrl);
  31 +
  32 + $(gb_map_consts.trafficBtn).on('click', function() {
  33 + if (traffVisible) {
  34 + ctrl.hide();
  35 + traffVisible = false;
  36 + showLinePolyline();
  37 + } else {
  38 + ctrl.show();
  39 + traffVisible = true;
  40 + hideLinePolyline();
  41 + }
  42 + });
  43 + //百度路况控件自身关闭按钮
  44 + $('.portlet-fullscreen').on('click', '.maplibTc .maplibTcClose', function(){
  45 + traffVisible = false;
  46 + showLinePolyline();
  47 + });*/
  48 +
  49 + //$('#tcWrap.maplibTc').addClass('animated bounceInLeft');
  50 + //$('.maplibTcBtn_deskTop.anchorTR').remove();
  51 + },
  52 + destroy: function(){
  53 + realMarkers = {};
  54 + linePolyline = [];
  55 + },
  56 + clear: function(){
  57 + realMarkers = {};
  58 + map.clearOverlays();
  59 + },
  60 + //画线路图层
  61 + drawLine: function(opts){
  62 + if(polylines[opts.key]){
  63 + //centerToPolyline(polylines[opts.key]);
  64 + return;
  65 + }
  66 + var plconfg={strokeWeight:6, strokeOpacity:0.5};
  67 + var pos = [], tempArray;
  68 + var route;
  69 + var polyline;
  70 + //上行
  71 + if(opts.updown==0){
  72 + route=opts.route.up;
  73 + plconfg.strokeColor="blue";
  74 + }
  75 + else if(opts.updown==1){
  76 + route=opts.route.down;
  77 + plconfg.strokeColor="red";
  78 + }
  79 + $.each(route.split(','), function(){
  80 + tempArray = this.split(' ');
  81 + pos.push(new BMap.Point(tempArray[0], tempArray[1]));
  82 + });
  83 +
  84 + polyline = new BMap.Polyline(pos, plconfg);
  85 + polylines[opts.key]=polyline;
  86 + map.addOverlay(polyline);
  87 +
  88 + console.log('centerToPolyline...');
  89 + centerToPolyline(polyline);
  90 + },
  91 + removeLine: function(opts){
  92 + var polyline=polylines[opts.key];
  93 + if(polyline){
  94 + map.removeOverlay(polyline);
  95 + polylines[opts.key]=null;
  96 + delete polylines[opts.key];
  97 + }
  98 + },
  99 + //绘制GPS信号
  100 + drawRealGpsMarker: function(opts){
  101 + var gpsArray = opts.gpsList;
  102 + var marker, coord;
  103 + $.each(gpsArray, function(i, gps){
  104 + if(opts.coordTransform){
  105 + //坐标转换
  106 + coord = TransGPS.wgsToBD(gps.lat, gps.lon);
  107 + gps.bd_lat = coord.lat;
  108 + gps.bd_lon = coord.lng;
  109 + }
  110 +
  111 +
  112 + marker = realMarkers[gps.deviceId];
  113 + if(marker){
  114 + if(gps.timestamp == marker.gpsData.timestamp)
  115 + return;
  116 + else
  117 + moveMarker(marker, gps);//移动marker
  118 + }
  119 + else{
  120 + //创建marker
  121 + marker = createBDMarkerByGps(gps);
  122 + map.addOverlay(marker);
  123 + //设备号和marker映射
  124 + realMarkers[gps.deviceId] = marker;
  125 + }
  126 + });
  127 + },
  128 + removeGps: function(opts){
  129 + var deviceArr = opts.deviceArr;
  130 + $.each(deviceArr, function(){
  131 + if(realMarkers[this]){
  132 + map.removeOverlay(realMarkers[this]);
  133 + realMarkers[this]=null;
  134 + delete realMarkers[this];
  135 + }
  136 + });
  137 + },
  138 + //定位到marker
  139 + goToMarker: function(opts){
  140 + var deviceId = opts.deviceId
  141 + ,m = realMarkers[deviceId];
  142 + if(m){
  143 + map.panTo(m.point);
  144 + setTop(m);
  145 + }
  146 + },
  147 + //打开信息窗口
  148 + openWindow: function(opts){
  149 + var deviceId = opts.deviceId
  150 + ,m = realMarkers[deviceId];
  151 + bdOpenWindow(m);
  152 + },
  153 + //绘制圆形
  154 + drawCircle: function(opts){
  155 + var coord = TransGPS.wgsToBD(opts.lat, opts.lon);
  156 + var circle = new BMap.Circle(new BMap.Point(coord.lng, coord.lat), opts.radius);
  157 + if(opts.color)
  158 + circle.setStrokeColor(opts.color);
  159 + if(opts.weight)
  160 + circle.setStrokeWeight(opts.weight);
  161 +
  162 + map.addOverlay(circle);
  163 + buffAreas[opts.id] = circle;
  164 + },
  165 + //绘制多边形
  166 + drawPolygon: function(opts){
  167 + var wgs,coord, points = [];
  168 + $.each(opts.cds, function(){
  169 + wgs = this.split(' ');
  170 + coord = TransGPS.wgsToBD(parseFloat(wgs[1]), parseFloat(wgs[0]));
  171 + points.push(new BMap.Point(coord.lng, coord.lat));
  172 + });
  173 +
  174 + var polygon = new BMap.Polygon(points, {strokeColor: opts.color, strokeWeight: opts.weight, strokeOpacity: 0.7});
  175 + map.addOverlay(polygon);
  176 + buffAreas[opts.id] = polygon;
  177 + },
  178 + //删除缓冲区
  179 + clearBuffArea: function(code){
  180 + if(buffAreas[code]){
  181 + map.removeOverlay(buffAreas[code]);
  182 + delete buffAreas[code];
  183 + }
  184 + }
  185 + };
  186 +
  187 + var bd_gps_info_win_opts = {
  188 + width : 190,
  189 + height: 255,
  190 + enableMessage:true
  191 + };
  192 + function createBDMarkerByGps(gpsData){
  193 +
  194 + var point = new BMap.Point(gpsData.bd_lon, gpsData.bd_lat);
  195 + var marker = new BMap.Marker(point);
  196 +
  197 + //根据编码长度 计算marker 宽度
  198 + var w = gpsData.nbbm.length * 10;
  199 + marker.setIcon(new BMap.Icon(gb_map_imap.createCarIcon(gpsData, w), new BMap.Size(w,25)));
  200 +
  201 + marker.infoWindow = new BMap.InfoWindow(bd_gps_info_win_opts);
  202 + marker.gpsData = gpsData;
  203 + //click
  204 + /*marker.addEventListener('click', function(){
  205 + bdOpenWindow(this);
  206 + });*/
  207 + //mouseover
  208 + marker.addEventListener('mouseover', function(){
  209 + setTop(this);
  210 + });
  211 + return marker;
  212 + }
  213 +
  214 + //隐藏线路线条
  215 + function hideLinePolyline(){
  216 + if(!linePolyline || linePolyline.length == 0)
  217 + return;
  218 +
  219 + layer.msg('隐藏线路图层',{offset: 'ct', shift : 5});
  220 + $.each(linePolyline, function(){
  221 + this.setStrokeOpacity(0.1);
  222 + });
  223 + }
  224 +
  225 + //显示线路线条
  226 + function showLinePolyline(){
  227 + if(!linePolyline || linePolyline.length == 0)
  228 + return;
  229 +
  230 + layer.msg('显示线路图层',{offset: 'ct', shift : 5});
  231 + $.each(linePolyline, function(){
  232 + this.setStrokeOpacity(0.5);
  233 + });
  234 + }
  235 +
  236 + function moveMarker(m, gps){
  237 + m.setPosition(new BMap.Point(gps.bd_lon, gps.bd_lat));
  238 + m.gpsData = gps;
  239 + //重新设置icon
  240 + //根据编码长度 计算marker 宽度
  241 + var w = gps.nbbm.length * 10;
  242 + m.setIcon(new BMap.Icon(gb_map_imap.createCarIcon(gps, w), new BMap.Size(w,25)));
  243 +
  244 + //更新 infoWindow
  245 + if(m.infoWindow.isOpen()){
  246 + bdOpenWindow(m);
  247 + }
  248 + }
  249 +
  250 + function setTop(m){
  251 + if(topMarker)
  252 + topMarker.setTop(false);
  253 + m.setTop(true);
  254 + topMarker = m;
  255 + }
  256 +
  257 + function bdOpenWindow(marker){
  258 + marker.gpsData.fromNow = moment(marker.gpsData.timestamp).fromNow();
  259 +
  260 + marker.infoWindow.setContent(template('map_gps_info_win_temp', marker.gpsData));
  261 + map.openInfoWindow(marker.infoWindow, marker.point);
  262 + }
  263 +
  264 + function centerToPolyline(polyline){
  265 + var pos=polyline.getPath();
  266 + map.panTo(pos[parseInt(pos.length / 2)]);
  267 + }
  268 +
  269 + //文件载入完毕
  270 + mapmonitor_load_ep.emitLater('load_baidu');
  271 +
  272 + return baiduInstance;
  273 +})();
src/main/resources/static/real_control_v2/mapmonitor/js/map/platform/gaode.js 0 → 100644
  1 +/** 高德地图相关接口封装 */
  2 +var gb_map_gaode = (function() {
  3 +
  4 + var mapLoadAnim = '<div class="sk-cube-grid _center">'
  5 + + '<div class="sk-cube sk-cube1"></div>'
  6 + + '<div class="sk-cube sk-cube2"></div>'
  7 + + '<div class="sk-cube sk-cube3"></div>'
  8 + + '<div class="sk-cube sk-cube4"></div>'
  9 + + '<div class="sk-cube sk-cube5"></div>'
  10 + + '<div class="sk-cube sk-cube6"></div>'
  11 + + '<div class="sk-cube sk-cube7"></div>'
  12 + + '<div class="sk-cube sk-cube8"></div>'
  13 + + '<div class="sk-cube sk-cube9"></div>' + '</div>';
  14 +
  15 + var map;
  16 + var topMarkr;
  17 + var realMarkers = {};
  18 + //线路路由线条
  19 + var linePolyline;
  20 + //实时路况是否显示
  21 + var traffVisible;
  22 + var gaodeInstance = {
  23 + init : function() {
  24 + var $mapCon = $(gb_map_consts.mapContainer);
  25 + $mapCon.html(mapLoadAnim);
  26 + //设置样式
  27 + gaodeInstance.setStyle();
  28 +
  29 + map = new AMap.Map($mapCon[0]);
  30 + // 地图中心和缩放级别
  31 + map.setZoomAndCenter(14, [ gb_map_consts.center_point.lng, gb_map_consts.center_point.lat ]);
  32 + // 加载完成
  33 + AMap.event.addListener(map, 'complete', function() {
  34 + layer.closeAll();
  35 + window.localStorage.setItem('real_map', 'gaode');
  36 + /*storage.setItem('real_map', REAL_GAODE_TEXT);
  37 + $('.sk-cube-grid._center').remove();*/
  38 + });
  39 +
  40 + // 实时路况图层
  41 + var trafficLayer = new AMap.TileLayer.Traffic();
  42 + trafficLayer.setMap(map);
  43 + trafficLayer.hide();
  44 +
  45 + $(gb_map_consts.trafficBtn).on('click', function() {
  46 + if (traffVisible) {
  47 + trafficLayer.hide();
  48 + traffVisible = false;
  49 + $(this).removeClass('active');
  50 + showLinePolyline();
  51 + } else {
  52 + trafficLayer.show();
  53 + traffVisible = true;
  54 + $(this).addClass('active');
  55 + hideLinePolyline();
  56 + }
  57 + });
  58 + },
  59 + setStyle : function() {
  60 + $('.mapRightWrap').addClass('gaode');
  61 + $('.mapTools').addClass('gaode');
  62 + $('.leftUtils').addClass('gaode');
  63 + },
  64 + destroy:function(){
  65 + realMarkers = {};
  66 + $('.mapRightWrap').removeClass('gaode');
  67 + $('.mapTools').removeClass('gaode');
  68 + $('.leftUtils').removeClass('gaode');
  69 + },
  70 + clear: function(){
  71 + realMarkers = {};
  72 + map.clearMap();
  73 + linePolyline = [];
  74 + },
  75 + drawLine: function(opts){
  76 + linePolyline = [];
  77 +
  78 + map.clearMap();
  79 +
  80 + var upArr = [], downArr = [];
  81 + var upLineOps = {path: upArr, strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5}
  82 + ,downLineOps = {path: downArr, strokeColor:"red", strokeWeight:6, strokeOpacity:0.5};
  83 + var route = opts.route;
  84 + //上行
  85 + if(route.up){
  86 + $.each(route.up_gcj.split(','), function(){
  87 + tempArray = this.split(' ');
  88 + upArr.push([tempArray[0], tempArray[1]]);
  89 + });
  90 + var upLine = new AMap.Polyline(upLineOps);
  91 + //保存线条引用
  92 + linePolyline.push(upLine);
  93 + upLine.setMap(map);
  94 + map.setCenter(upArr[parseInt(upArr.length / 2)]);
  95 +
  96 + }
  97 + //下行
  98 + if(route.down){
  99 + $.each(route.down_gcj.split(','), function(){
  100 + tempArray = this.split(' ');
  101 + downArr.push([tempArray[0], tempArray[1]]);
  102 + });
  103 + var downLine = new AMap.Polyline(downLineOps);
  104 + //保存线条引用
  105 + linePolyline.push(downLine);
  106 + downLine.setMap(map);
  107 + }
  108 + //实时路况下不显示
  109 + if(traffVisible)
  110 + hideLinePolyline();
  111 + },
  112 + drawRealGpsMarker: function(opts){
  113 + var gpsArray = opts.gpsList;
  114 + var coord;
  115 + $.each(gpsArray, function(i, gps){
  116 + if(opts.coordTransform){
  117 + coord = TransGPS.transformFromWGSToGCJ(gps.lat, gps.lon);
  118 + gps.gcj_lat = coord.lat;
  119 + gps.gcj_lon = coord.lng;
  120 + }
  121 +
  122 + marker = realMarkers[gps.deviceId];
  123 + if(marker){
  124 + if(gps.timestamp == marker.gpsData.timestamp)
  125 + return;
  126 + else
  127 + moveMarker(marker, gps);//移动marker
  128 + }
  129 + else{
  130 + var marker = createGDMarkerByGps(gps);
  131 + realMarkers[gps.deviceId] = marker
  132 + }
  133 + });
  134 + },
  135 + goToMarker: function(opts){
  136 + var deviceId = opts.deviceId
  137 + ,m = realMarkers[deviceId];
  138 + if(m){
  139 + map.setCenter(m.getPosition());
  140 + setTop(m);
  141 + }
  142 + },
  143 + openWindow: function(opts){
  144 + var deviceId = opts.deviceId
  145 + ,m = realMarkers[deviceId];
  146 + openWindow(m);
  147 + }
  148 + };
  149 +
  150 + function createGDMarkerByGps(gps){
  151 + //根据编码长度 计算marker 宽度
  152 + var w = gps.nbbm.length * 10;
  153 +
  154 + var marker = new AMap.Marker({
  155 + map: map,
  156 + position: [gps.gcj_lon, gps.gcj_lat],
  157 + icon: new AMap.Icon({
  158 + size: new AMap.Size(w, 25), //图标大小
  159 + image: iMap.createCarIcon(gps, w)
  160 + }),
  161 + offset: new AMap.Pixel(-35, -12)
  162 + });
  163 +
  164 + //绑定数据
  165 + marker.gpsData = gps;
  166 + marker.infoWindow = new AMap.InfoWindow();
  167 +
  168 + marker.on('mouseover', function(){
  169 + setTop(this);
  170 + });
  171 + //点击事件
  172 + marker.on('click', function(){
  173 + openWindow(this);
  174 + });
  175 +
  176 + return marker;
  177 + }
  178 +
  179 + function moveMarker(m, gps){
  180 + m.setPosition(new AMap.LngLat(gps.gcj_lon, gps.gcj_lat));
  181 + m.gpsData = gps;
  182 + //重新设置icon
  183 + //根据编码长度 计算marker 宽度
  184 + var w = gps.nbbm.length * 10;
  185 + m.setIcon(new AMap.Icon({
  186 + size: new AMap.Size(w, 25),
  187 + image: iMap.createCarIcon(gps, w)
  188 + }));
  189 +
  190 + if(m.infoWindow.getIsOpen())
  191 + openWindow(m);
  192 + }
  193 +
  194 + //隐藏线路线条
  195 + function hideLinePolyline(){
  196 + if(!linePolyline || linePolyline.length == 0)
  197 + return;
  198 + layer.msg('隐藏线路图层',{offset: 'ct', shift : 5});
  199 + $.each(linePolyline, function(){
  200 + this.setOptions({strokeOpacity: 0});
  201 + });
  202 + }
  203 +
  204 + //显示线路线条
  205 + function showLinePolyline(){
  206 + if(!linePolyline || linePolyline.length == 0)
  207 + return;
  208 +
  209 + layer.msg('显示线路图层',{offset: 'ct', shift : 5});
  210 + $.each(linePolyline, function(){
  211 + this.setOptions({strokeOpacity: 0.5});
  212 + });
  213 + }
  214 +
  215 + function openWindow(marker){
  216 + marker.gpsData.fromNow = moment(marker.gpsData.timestamp).fromNow();
  217 + /*var infoWindow = new AMap.InfoWindow({
  218 + content: template('gps_info_win_temp', marker.gpsData)
  219 + });*/
  220 + marker.infoWindow.setContent(template('gps_info_win_temp', marker.gpsData));
  221 + marker.infoWindow.open(map, marker.getPosition());
  222 + }
  223 +
  224 + function setTop(marker){
  225 + if(topMarkr)
  226 + topMarkr.setzIndex(1);
  227 + marker.setzIndex(2);
  228 + topMarkr = marker;
  229 + }
  230 +
  231 + //文件载入完毕
  232 + mapmonitor_load_ep.emitLater('load_gaode');
  233 +
  234 + return gaodeInstance;
  235 +})();
src/main/resources/static/real_control_v2/mapmonitor/js/map_overlay_manager.js 0 → 100644
  1 +var gb_map_overlay_mge=(function () {
  2 +
  3 +
  4 + var gpsRefresh=function(addArr, upArr, upDownChange) {
  5 + //console.log('1111111', addArr, upArr, upDownChange);
  6 + var all = addArr.concat(upArr).concat(upDownChange);
  7 + gpsRefreshAll(all);
  8 +
  9 + };
  10 +
  11 + var gpsRefreshAll=function (all) {
  12 + gb_map_imap.call('drawRealGpsMarker', {gpsList: all, coordTransform: true});
  13 + };
  14 +
  15 + if(gb_data_gps){
  16 + //如果是嵌入线调,注册GPS刷新事件
  17 + gb_data_gps.registerCallback(gpsRefresh);
  18 + }
  19 +
  20 + return {};
  21 +})();
0 \ No newline at end of file 22 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/js/real.js 0 → 100644
  1 +var mapmonitor_load_ep = EventProxy.create('load_iMap', 'load_baidu', 'load_gaode', function () {
  2 + moment.locale('zh-cn');
  3 + //地图
  4 + gb_map_imap.addMap('baidu', '百度地图', gb_map_baidu)
  5 + .addMap('gaode', '高德地图', gb_map_gaode)
  6 + .call('init');
  7 +
  8 + //设备树
  9 + var treeData = gb_common.get_device_tree_data();
  10 + _tree = $('.real_right_gps_panel .gps_tree_list')
  11 + .on('loaded.jstree', function () {
  12 + _tree.jstree(true).open_all();
  13 + //删掉tree node a标签的 href值(不然鼠标悬停浏览器会出现状态条)
  14 + $('.gps_tree_list .jstree-container-ul a.jstree-anchor').removeAttr('href');
  15 + })
  16 + .jstree({
  17 + 'core': {
  18 + 'data': treeData
  19 + },
  20 + 'checkbox': {
  21 + 'keep_selected_style': false,
  22 + 'whole_node': false,
  23 + 'tie_selection': false
  24 + },
  25 + 'contextmenu':{
  26 + 'items': {
  27 + '轨迹回放':{
  28 + 'label': '轨迹回放',
  29 + 'action': function (data) {
  30 + console.log('action', data);
  31 + }
  32 + },
  33 + '发送指令':{
  34 + 'label': '发送指令',
  35 + 'action': function (data) {
  36 + console.log('action', data);
  37 + }
  38 + }
  39 + }
  40 + },
  41 + 'plugins': ['checkbox', 'contextmenu', 'state']
  42 + });
  43 +
  44 + $(".real_bottom_panel").resizable({
  45 + handles: {
  46 + 'n': '.real_bottom_panel #handle'
  47 + },
  48 + maxHeight: 650,
  49 + minHeight: 70
  50 + });
  51 +
  52 + $(".color_block").spectrum({
  53 + color: "#f00",
  54 + showInput: true,
  55 + chooseText: "确定",
  56 + cancelText: "取消",
  57 + preferredFormat: "hex"
  58 + });
  59 +});
  60 +
  61 +var gb_map_consts = {
  62 + mapContainer: '#real_map_container',
  63 + center_point: {
  64 + lng: 121.544336,
  65 + lat: 31.221315
  66 + },
  67 + allGps: {},
  68 + trafficBtn: '' //实时路况按钮
  69 +};
  70 +
  71 +//Canvas 带圆角的矩形
  72 +CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {
  73 + if (w < 2 * r) r = w / 2;
  74 + if (h < 2 * r) r = h / 2;
  75 + this.strokeStyle ='rgba(0,102,0,.1)';
  76 + this.beginPath();
  77 + this.moveTo(x+r, y);
  78 + this.arcTo(x+w, y, x+w, y+h, r);
  79 + this.arcTo(x+w, y+h, x, y+h, r);
  80 + this.arcTo(x, y+h, x, y, r);
  81 + this.arcTo(x, y, x+w, y, r);
  82 + this.closePath();
  83 + return this;
  84 +}
0 \ No newline at end of file 85 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/real.html 0 → 100644
  1 +<link href="/assets/css/TrafficControl.css" rel="stylesheet"/>
  2 +<link rel="stylesheet" href="/real_control_v2/assets/plugins/jquery.ui/themes/base/all.css"/>
  3 +<link rel="stylesheet" href="/real_control_v2/assets/plugins/spectrum/spectrum.css"/>
  4 +
  5 +<link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/form-advanced.gradient.min.css"/>
  6 +<link rel="stylesheet" href="/real_control_v2/mapmonitor/css/real.css"/>
  7 +
  8 +<div class="map-system-msg">
  9 + <a class="z-depth-2" href="/pages/mapmonitor/alone/wrap.html" target="_blank">当前地图模块正在维护升级,点这里打开原版地图。</a>
  10 +</div>
  11 +
  12 +<div id="real_map_container"></div>
  13 +<div class="real_right_gps_panel">
  14 + <form class="uk-form" data-uk-margin="">
  15 + <div class="uk-form-icon">
  16 + <i class="uk-icon-search"></i>
  17 + <input type="text" placeholder="搜索..." >
  18 + </div>
  19 + </form>
  20 +
  21 + <div class="gps_tree_list"></div>
  22 +</div>
  23 +
  24 +<div class="real_bottom_panel">
  25 + <div id="handle" class="ui-resizable-handle ui-resizable-n"></div>
  26 + <div class="real_bl_cont">
  27 +
  28 + </div>
  29 + <div class="real_br_cont">
  30 + <form class="uk-form uk-form-stacked">
  31 + <div class="uk-form-row">
  32 + <span class="uk-form-label">图层</span>
  33 + <div class="uk-form-controls">
  34 + <label><input type="radio" name="map_type" checked> 百度</label>
  35 + <label><input type="radio" name="map_type"> 高德</label>
  36 + <label><input type="checkbox" name="map_type"> 实时路况</label>
  37 + </div>
  38 + </div>
  39 +
  40 + <div class="uk-form-row">
  41 + <span class="uk-form-label">空间数据</span>
  42 + <div class="uk-form-controls">
  43 + <label><input type="checkbox" checked> 站点</label>
  44 + <label><input type="checkbox" > 电子围栏</label>
  45 + <label><input type="checkbox" > 停车场</label>
  46 + </div>
  47 + </div>
  48 +
  49 + <div class="uk-form-row">
  50 + <span class="uk-form-label">异常警报输出</span>
  51 + <div class="uk-form-controls">
  52 + <label><input type="checkbox" checked> 超速</label>
  53 + <label><input type="checkbox" checked> 越界</label>
  54 + <label><input type="checkbox" > 大间隔</label>
  55 + </div>
  56 + </div>
  57 +
  58 + <div class="uk-form-row">
  59 + <span class="uk-form-label">车辆图标</span>
  60 + <div class="uk-form-controls">
  61 + <label><input type="checkbox" > 标示角度</label>
  62 + <label><input type="checkbox" > 聚合</label>
  63 + </div>
  64 + </div>
  65 +
  66 + <div class="uk-form-row">
  67 + <span class="uk-form-label">车辆颜色</span>
  68 + <div class="uk-form-controls">
  69 + <div class="color_block">
  70 + 上行
  71 + <div class="sp-placeholder">
  72 + <div class="sp-placeholder-color" ></div>
  73 + </div>
  74 + </div>
  75 +
  76 + <div class="color_block">
  77 + 下行
  78 + <div class="sp-placeholder">
  79 + <div class="sp-placeholder-color" ></div>
  80 + </div>
  81 + </div>
  82 +
  83 + <div class="color_block">
  84 + 非营运
  85 + <div class="sp-placeholder">
  86 + <div class="sp-placeholder-color" ></div>
  87 + </div>
  88 + </div>
  89 + </div>
  90 + </div>
  91 +
  92 + <div class="uk-form-row">
  93 + <span class="uk-form-label">路段颜色</span>
  94 + <div class="uk-form-controls">
  95 + <div class="color_block">
  96 + 上行
  97 + <div class="sp-placeholder">
  98 + <div class="sp-placeholder-color" ></div>
  99 + </div>
  100 + </div>
  101 +
  102 + <div class="color_block">
  103 + 下行
  104 + <div class="sp-placeholder">
  105 + <div class="sp-placeholder-color" ></div>
  106 + </div>
  107 + </div>
  108 + </div>
  109 + </div>
  110 +
  111 + <br>
  112 + </form>
  113 + </div>
  114 +</div>
  115 +
  116 +<script src="/real_control_v2/mapmonitor/js/map_overlay_manager.js"></script>
  117 +<script src="/real_control_v2/mapmonitor/js/real.js"></script>
  118 +<script src="/real_control_v2/mapmonitor/js/map/iMap.js"></script>
  119 +<script src="/real_control_v2/mapmonitor/js/map/platform/baidu.js"></script>
  120 +<script src="/real_control_v2/mapmonitor/js/map/platform/gaode.js"></script>
  121 +
  122 +<!-- jquery ui -->
  123 +<script src="/real_control_v2/assets/plugins/jquery.ui/core.js"></script>
  124 +<script src="/real_control_v2/assets/plugins/jquery.ui/widget.js"></script>
  125 +<script src="/real_control_v2/assets/plugins/jquery.ui/mouse.js"></script>
  126 +<script src="/real_control_v2/assets/plugins/jquery.ui/resizable.js"></script>
  127 +
  128 +
  129 +<script src="/real_control_v2/assets/plugins/spectrum/spectrum.js"></script>
0 \ No newline at end of file 130 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/real_monitor/css/real.css
@@ -30,7 +30,7 @@ @@ -30,7 +30,7 @@
30 .map_rt_wrap .uk-tab { 30 .map_rt_wrap .uk-tab {
31 background: white; 31 background: white;
32 font-family: 华文细黑; 32 font-family: 华文细黑;
33 - border-radius: 5px 33 + border-radius: 5px;
34 width: 350px; 34 width: 350px;
35 float: right; 35 float: right;
36 } 36 }