Commit 08d4195aeed0a3d70d63afe4e0a3cc07d632ec94

Authored by 潘钊
2 parents af4c8c90 795b4905

Merge branch 'minhang' of http://222.66.0.204:8090/panzhaov5/bsth_control into minhang

Showing 47 changed files with 9506 additions and 8823 deletions
src/main/java/com/bsth/controller/forms/ExportController.java 0 → 100644
  1 +package com.bsth.controller.forms;
  2 +
  3 +import java.text.SimpleDateFormat;
  4 +import java.util.ArrayList;
  5 +import java.util.HashMap;
  6 +import java.util.Iterator;
  7 +import java.util.List;
  8 +import java.util.Map;
  9 +
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.web.bind.annotation.RequestMapping;
  12 +import org.springframework.web.bind.annotation.RequestMethod;
  13 +import org.springframework.web.bind.annotation.RequestParam;
  14 +import org.springframework.web.bind.annotation.RestController;
  15 +
  16 +import com.bsth.entity.mcy_forms.Linepasswengerflow;
  17 +import com.bsth.entity.mcy_forms.Operationservice;
  18 +import com.bsth.entity.mcy_forms.Shifday;
  19 +import com.bsth.entity.mcy_forms.Shiftuehiclemanth;
  20 +import com.bsth.entity.mcy_forms.Singledata;
  21 +import com.bsth.entity.mcy_forms.Vehicleloading;
  22 +import com.bsth.entity.mcy_forms.Waybillday;
  23 +import com.bsth.service.forms.ExportService;
  24 +import com.bsth.service.forms.FormsService;
  25 +import com.bsth.util.ReportUtils;
  26 +
  27 +@RestController
  28 +@RequestMapping("mcy_export")
  29 +public class ExportController {
  30 +
  31 + @Autowired
  32 + FormsService formsService;
  33 +
  34 + @Autowired
  35 + ExportService exportService;
  36 +
  37 + //行车路单日报表
  38 + @RequestMapping(value = "/waybilldayExport",method = RequestMethod.POST)
  39 + public List<Waybillday> waybilldayExport(@RequestParam Map<String, Object> map){
  40 + List<Waybillday> waybillday = formsService.waybillday(map);
  41 + exportService.waybillday(map.get("date").toString(), waybillday);
  42 + return waybillday;
  43 + }
  44 +
  45 +
  46 + //线路客流量报表
  47 + @RequestMapping(value = "/linepasswengerflowExport",method = RequestMethod.POST)
  48 + public List<Map<String, Object>> linepasswengerflowExport(@RequestParam Map<String, Object> map){
  49 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  50 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  51 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  52 + ReportUtils ee = new ReportUtils();
  53 + List<Linepasswengerflow> linepasswengerflow = formsService.linepasswengerflow(map);
  54 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  55 + int i=1;
  56 + for(Linepasswengerflow l : linepasswengerflow){
  57 + Map<String, Object> m = new HashMap<String, Object>();
  58 + m.put("i", i);
  59 + m.put("stationName", l.getStationName());
  60 + m.put("1", " ");
  61 + m.put("2", " ");
  62 + resList.add(m);
  63 + i++;
  64 + }
  65 +
  66 + try {
  67 + listI.add(resList.iterator());
  68 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  69 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\linepassengerflow.xls",
  70 + path+"export\\线路客流量报表" + sdfSimple.format(sdfMonth.parse(map.get("date").toString())) + ".xls");
  71 + } catch (Exception e) {
  72 + e.printStackTrace();
  73 + }
  74 + return resList;
  75 + }
  76 +
  77 +
  78 +
  79 + //班次车辆人员日统计
  80 + @RequestMapping(value = "/shifdayExport",method = RequestMethod.POST)
  81 + public List<Map<String, Object>> shifdayExport(@RequestParam Map<String, Object> map){
  82 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  83 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  84 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  85 + ReportUtils ee = new ReportUtils();
  86 + List<Shifday> shifday = formsService.shifday(map);
  87 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  88 + for(Shifday l : shifday){
  89 + Map<String, Object> m = new HashMap<String, Object>();
  90 + m.put("jName",l.getjName());
  91 + m.put("sName", l.getsName());
  92 + m.put("lpName", l.getLpName());
  93 + m.put("carPlate", l.getCarPlate());
  94 + m.put("jhlc", l.getJhlc());
  95 + //m.put("sjjhlc", l.getSjjhlc());
  96 + m.put("yygl", l.getYygl());
  97 + m.put("emptMileage", l.getEmptMileage());
  98 + m.put("remMileage", l.getRemMileage());
  99 + m.put("addMileage", l.getAddMileage());
  100 + m.put("totalm", l.getTotalm());
  101 + m.put("jhbc", l.getJhbc());
  102 + //m.put("sjjhbc", l.getSjjhbc());
  103 + m.put("cjbc", l.getCjbc());
  104 + m.put("ljbc", l.getLjbc());
  105 + m.put("sjbc", l.getSjbc());
  106 + resList.add(m);
  107 + }
  108 +
  109 + try {
  110 + listI.add(resList.iterator());
  111 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  112 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\shifday.xls",
  113 + path+"export\\班次车辆人员日报表" + sdfSimple.format(sdfMonth.parse(map.get("date").toString())) + ".xls");
  114 + } catch (Exception e) {
  115 + e.printStackTrace();
  116 + }
  117 + return resList;
  118 + }
  119 +
  120 + //班次车辆人员月统计
  121 + @RequestMapping(value = "/shiftuehiclemanthExport",method = RequestMethod.POST)
  122 + public List<Map<String, Object>> shiftuehiclemanthExport(@RequestParam Map<String, Object> map){
  123 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  124 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  125 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  126 + ReportUtils ee = new ReportUtils();
  127 + List<Shiftuehiclemanth> shiftuehiclemanth = formsService.shiftuehiclemanth(map);
  128 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  129 + int i=1;
  130 + for(Shiftuehiclemanth l : shiftuehiclemanth){
  131 + Map<String, Object> m = new HashMap<String, Object>();
  132 + m.put("i", i);
  133 + m.put("jName",l.getjName() );
  134 + m.put("jhlc", l.getJhlc());
  135 + m.put("emptMileage",l.getEmptMileage() );
  136 + m.put("remMileage", l.getRemMileage());
  137 + m.put("addMileage", l.getAddMileage());
  138 + m.put("totalm", l.getTotalm());
  139 + m.put("cjbc", l.getCjbc());
  140 + m.put("ljbc", l.getLjbc());
  141 + m.put("sjbc", l.getSjbc());
  142 + resList.add(m);
  143 + i++;
  144 + }
  145 +
  146 + try {
  147 + listI.add(resList.iterator());
  148 +
  149 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  150 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\shiftuehiclemanth.xls",
  151 + path+"export\\班次车辆人员月报表" + sdfSimple.format(sdfMonth.parse(map.get("startDate").toString())) + ".xls");
  152 +
  153 + } catch (Exception e) {
  154 + e.printStackTrace();
  155 + }
  156 +
  157 + return resList;
  158 + }
  159 +
  160 +
  161 + //路单数据报表
  162 + @RequestMapping(value = "/singledataExport",method = RequestMethod.POST)
  163 + public List<Map<String, Object>> singledataExport(@RequestParam Map<String, Object> map){
  164 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  165 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  166 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  167 + ReportUtils ee = new ReportUtils();
  168 + List<Singledata> singledata = formsService.singledata(map);
  169 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  170 + int i=1;
  171 + for(Singledata l : singledata){
  172 + Map<String, Object> m = new HashMap<String, Object>();
  173 + m.put("i", i);
  174 + m.put("rQ",l.getrQ());
  175 + m.put("gS", l.getgS());
  176 + m.put("xL",l.getxL() );
  177 + m.put("clzbh", l.getClzbh());
  178 + m.put("jsy", l.getJsy());
  179 + m.put("jName", l.getjName());
  180 + m.put("sgh", l.getSgh());
  181 + m.put("sName", l.getsName());
  182 + m.put("jhlc", l.getJhlc());
  183 + m.put("emptMileage", l.getEmptMileage());
  184 + m.put("hyl", l.getHyl());
  185 + m.put("jzl", l.getJzl());
  186 + m.put("unyyyl",l.getUnyyyl());
  187 + m.put("jhjl", l.getJhjl());
  188 + resList.add(m);
  189 + i++;
  190 + }
  191 +
  192 + try {
  193 + listI.add(resList.iterator());
  194 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  195 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\singledata.xls",
  196 + path+"export\\路单报表" + sdfSimple.format(sdfMonth.parse(map.get("startDate").toString())) + ".xls");
  197 + } catch (Exception e) {
  198 + e.printStackTrace();
  199 + }
  200 +
  201 + return resList;
  202 + }
  203 +
  204 + //车辆加注
  205 + @RequestMapping(value = "/vehicleloadingExport",method = RequestMethod.POST)
  206 + public List<Map<String, Object>> vehicleloadingExport(@RequestParam Map<String, Object> map){
  207 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  208 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  209 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  210 + ReportUtils ee = new ReportUtils();
  211 + List<Vehicleloading> vehicleloading = formsService.vehicleloading(map.get("line").toString(), map.get("date").toString());
  212 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  213 + int i=1;
  214 + for(Vehicleloading l : vehicleloading){
  215 + Map<String, Object> m = new HashMap<String, Object>();
  216 + m.put("i", i);
  217 + m.put("rQ", l.getrQ());
  218 + m.put("gS", l.getgS());
  219 + m.put("xL", l.getxL());
  220 + m.put("clzbh", l.getClzbh());
  221 + m.put("hyl", l.getHyl());
  222 + m.put("jzl", l.getJzl());
  223 + m.put("ls", l.getLs());
  224 + m.put("jhlc", l.getJhlc());
  225 + m.put("unyyyl", l.getUnyyyl());
  226 + m.put("jhbc", l.getJhbc());
  227 + m.put("sjbc", l.getSjbc());
  228 + resList.add(m);
  229 + i++;
  230 + }
  231 +
  232 + try {
  233 + listI.add(resList.iterator());
  234 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  235 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\vehicleloading.xls",
  236 + path+"export\\车辆加注" + sdfSimple.format(sdfMonth.parse(map.get("date").toString())) + ".xls");
  237 + } catch (Exception e) {
  238 + e.printStackTrace();
  239 + }
  240 + return resList;
  241 + }
  242 +
  243 + //运营服务阶段报表
  244 + @RequestMapping(value = "/operationserviceExport",method = RequestMethod.POST)
  245 + public List<Map<String, Object>> operationserviceExport(@RequestParam Map<String, Object> map){
  246 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  247 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  248 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  249 + ReportUtils ee = new ReportUtils();
  250 + List<Operationservice> operationservice = formsService.operationservice(map);
  251 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  252 + int i=1;
  253 + for(Operationservice l : operationservice){
  254 + Map<String, Object> m = new HashMap<String, Object>();
  255 + m.put("i", i);
  256 + m.put("xlName", l.getXlName());
  257 + m.put("jzl", l.getJzl());
  258 + m.put("xhl", l.getXhl());
  259 + m.put("xsgl", l.getXsgl());
  260 + m.put("emptMileage", l.getEmptMileage());
  261 + m.put("sjbc", l.getSjbc());
  262 + resList.add(m);
  263 + i++;
  264 + }
  265 +
  266 + try {
  267 + listI.add(resList.iterator());
  268 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  269 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\operationservice.xls",
  270 + path+"export\\运营服务阶段报表" + sdfSimple.format(sdfMonth.parse(map.get("startDate").toString())) + ".xls");
  271 + } catch (Exception e) {
  272 + e.printStackTrace();
  273 + }
  274 + return resList;
  275 + }
  276 +
  277 +
  278 +
  279 +
  280 +
  281 +}
src/main/java/com/bsth/controller/oil/YlbController.java
@@ -4,6 +4,7 @@ import java.text.ParseException; @@ -4,6 +4,7 @@ import java.text.ParseException;
4 import java.text.SimpleDateFormat; 4 import java.text.SimpleDateFormat;
5 import java.util.ArrayList; 5 import java.util.ArrayList;
6 import java.util.Date; 6 import java.util.Date;
  7 +import java.util.HashMap;
7 import java.util.Iterator; 8 import java.util.Iterator;
8 import java.util.List; 9 import java.util.List;
9 import java.util.Map; 10 import java.util.Map;
@@ -23,6 +24,7 @@ import com.bsth.entity.oil.Ylb; @@ -23,6 +24,7 @@ import com.bsth.entity.oil.Ylb;
23 import com.bsth.entity.sys.SysUser; 24 import com.bsth.entity.sys.SysUser;
24 import com.bsth.security.util.SecurityUtils; 25 import com.bsth.security.util.SecurityUtils;
25 import com.bsth.service.oil.YlbService; 26 import com.bsth.service.oil.YlbService;
  27 +import com.bsth.util.ReportUtils;
26 import com.google.common.base.Splitter; 28 import com.google.common.base.Splitter;
27 29
28 @RestController 30 @RestController
@@ -131,4 +133,58 @@ public class YlbController extends BaseController&lt;Ylb, Integer&gt;{ @@ -131,4 +133,58 @@ public class YlbController extends BaseController&lt;Ylb, Integer&gt;{
131 return yblService.oilListMonth(line, date); 133 return yblService.oilListMonth(line, date);
132 } 134 }
133 135
  136 +
  137 + @RequestMapping(value = "/listExport",method = RequestMethod.POST)
  138 + public List<Map<String, Object>> listExport(@RequestParam Map<String, Object> map){
  139 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  140 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  141 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  142 + ReportUtils ee = new ReportUtils();
  143 + String rq=map.get("rq").toString();
  144 + if(!(rq=="")){
  145 + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  146 + try {
  147 + map.put("rq_eq", sdfMonth.parse(rq));
  148 + } catch (ParseException e) {
  149 + // TODO Auto-generated catch block
  150 + e.printStackTrace();
  151 + }
  152 + }
  153 + List<Ylb> ylb= (List<Ylb>)yblService.list(map);
  154 +// (new CustomerSpecs<Ylb>(map)).iterator();
  155 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  156 + for (Ylb y : ylb) {
  157 + Map<String, Object> m = new HashMap<String, Object>();
  158 + m.put("rq", y.getRq());
  159 + m.put("gsname",y.getGsname() );
  160 + m.put("xlname", y.getXlname());
  161 + m.put("nbbm", y.getNbbm());
  162 + m.put("jsy", y.getJsy());
  163 + m.put("jzl", y.getJzl());
  164 + m.put("czlc", y.getCzlc());
  165 + m.put("jzlc", y.getJzlc());
  166 + m.put("czyl", y.getCzyl());
  167 + m.put("jzyl", y.getJzyl());
  168 + m.put("yh", y.getYh());
  169 + m.put("rylx", y.getRylx());
  170 + m.put("ns", y.getNs());
  171 + m.put("shyy", y.getShyy());
  172 + m.put("sh", y.getSh());
  173 + m.put("zlc", y.getZlc());
  174 + m.put("yhlx", y.getYhlx());
  175 + m.put("bglyh", y.getBglyh());
  176 + resList.add(m);
  177 + }
  178 + try {
  179 + listI.add(resList.iterator());
  180 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  181 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\list.xls",
  182 + path+"export\\进出场存油量" + sdfSimple.format(sdfMonth.parse(map.get("rq").toString())) + ".xls");
  183 + } catch (Exception e) {
  184 + e.printStackTrace();
  185 + }
  186 +
  187 + return resList;
  188 +
  189 + }
134 } 190 }
src/main/java/com/bsth/service/forms/ExportService.java 0 → 100644
  1 +package com.bsth.service.forms;
  2 +
  3 +import java.util.List;
  4 +
  5 +import com.bsth.entity.mcy_forms.Linepasswengerflow;
  6 +import com.bsth.entity.mcy_forms.Operationservice;
  7 +import com.bsth.entity.mcy_forms.Shifday;
  8 +import com.bsth.entity.mcy_forms.Shiftuehiclemanth;
  9 +import com.bsth.entity.mcy_forms.Singledata;
  10 +import com.bsth.entity.mcy_forms.Vehicleloading;
  11 +import com.bsth.entity.mcy_forms.Waybillday;
  12 +
  13 +public interface ExportService {
  14 +
  15 + public void waybillday(String date, List<Waybillday> resList);
  16 +
  17 + public void linepasswengerflow(String date,List<Linepasswengerflow> resList);
  18 +
  19 + public void shifday(String date, List<Shifday> resList);
  20 +
  21 + public void shiftuehiclemanth(String startDate, String endDate, String lpName,
  22 + List<Shiftuehiclemanth> resList);
  23 +
  24 + public void singledata(String startDate, String endDate, String lpName, List<Singledata> resList);
  25 +
  26 + public void vehicleloading(String date, List<Vehicleloading> resList);
  27 +
  28 + public void operationservice(String startDate, String endDate, String lpName,
  29 + List<Operationservice> resList);
  30 +
  31 +
  32 +
  33 +}
src/main/java/com/bsth/service/forms/impl/ExportServiceImpl.java 0 → 100644
  1 +package com.bsth.service.forms.impl;
  2 +
  3 +import java.text.SimpleDateFormat;
  4 +import java.util.ArrayList;
  5 +import java.util.HashMap;
  6 +import java.util.Iterator;
  7 +import java.util.List;
  8 +import java.util.Map;
  9 +import org.springframework.stereotype.Service;
  10 +
  11 +import com.bsth.entity.mcy_forms.Linepasswengerflow;
  12 +import com.bsth.entity.mcy_forms.Operationservice;
  13 +import com.bsth.entity.mcy_forms.Shifday;
  14 +import com.bsth.entity.mcy_forms.Shiftuehiclemanth;
  15 +import com.bsth.entity.mcy_forms.Singledata;
  16 +import com.bsth.entity.mcy_forms.Vehicleloading;
  17 +import com.bsth.entity.mcy_forms.Waybillday;
  18 +import com.bsth.service.forms.ExportService;
  19 +import com.bsth.util.ReportUtils;
  20 +
  21 +@Service
  22 +public class ExportServiceImpl implements ExportService{
  23 +
  24 +
  25 + //行车路单日报表
  26 + @Override
  27 + public void waybillday(String date, List<Waybillday> list) {
  28 +
  29 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  30 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  31 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  32 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  33 + Map<String,Object> map = new HashMap<String, Object>();
  34 + ReportUtils ee = new ReportUtils();
  35 +
  36 + for(Waybillday w : list){
  37 + Map<String, Object> m = new HashMap<String, Object>();
  38 + m.put("carPlate", w.getCarPlate());
  39 + m.put("jzl1", w.getJzl1());
  40 + m.put("jzl", w.getJzl());
  41 + m.put("yh", w.getYh());
  42 + m.put("jName", w.getjName());
  43 + m.put("zlc", w.getZlc());
  44 + resList.add(m);
  45 + }
  46 +
  47 + try {
  48 + listI.add(resList.iterator());
  49 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  50 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\waybillday.xls",
  51 + path+"export\\行车路单日报表" + sdfSimple.format(sdfMonth.parse(date)) + ".xls");
  52 + } catch (Exception e) {
  53 + e.printStackTrace();
  54 + }
  55 + }
  56 +
  57 + //线路客流量报表
  58 + @Override
  59 + public void linepasswengerflow(String date, List<Linepasswengerflow> list) {
  60 +
  61 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  62 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  63 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  64 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  65 + Map<String,Object> map = new HashMap<String, Object>();
  66 + ReportUtils ee = new ReportUtils();
  67 + for(Linepasswengerflow l : list){
  68 + Map<String, Object> m = new HashMap<String, Object>();
  69 + m.put("stationName", l.getStationName());
  70 + resList.add(m);
  71 + }
  72 +
  73 + try {
  74 + listI.add(resList.iterator());
  75 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  76 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\linepasswengerflow.xls",
  77 + path+"export\\线路客流量报表" + sdfSimple.format(sdfMonth.parse(date)) + ".xls");
  78 + } catch (Exception e) {
  79 + e.printStackTrace();
  80 + }
  81 +
  82 + }
  83 +
  84 +
  85 + //班次车辆人员日统计
  86 + @Override
  87 + public void shifday(String date,List<Shifday> list) {
  88 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  89 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  90 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  91 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  92 + Map<String,Object> map = new HashMap<String, Object>();
  93 + ReportUtils ee = new ReportUtils();
  94 +
  95 + for(Shifday l : list){
  96 + Map<String, Object> m = new HashMap<String, Object>();
  97 + m.put("jName",l.getjName());
  98 + m.put("sName", l.getsName());
  99 + m.put("lpName", l.getLpName());
  100 + m.put("carPlate", l.getCarPlate());
  101 + m.put("jhlc", l.getJhlc());
  102 + m.put("sjjhlc", l.getSjjhlc());
  103 + m.put("yygl", l.getYygl());
  104 + m.put("emptMileage", l.getEmptMileage());
  105 + m.put("remMileage", l.getRemMileage());
  106 + m.put("addMileage", l.getAddMileage());
  107 + m.put("totalm", l.getTotalm());
  108 + m.put("jhbc", l.getJhbc());
  109 + m.put("sjjhbc", l.getSjjhbc());
  110 + m.put("cjbc", l.getCjbc());
  111 + m.put("ljbc", l.getLjbc());
  112 + m.put("sjbc", l.getSjbc());
  113 + resList.add(m);
  114 + }
  115 +
  116 + try {
  117 + listI.add(resList.iterator());
  118 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  119 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\shifday.xls",
  120 + path+"export\\班次车辆人员日报表" + sdfSimple.format(sdfMonth.parse(date)) + ".xls");
  121 + } catch (Exception e) {
  122 + e.printStackTrace();
  123 + }
  124 +
  125 + }
  126 +
  127 + //班次车辆人员月统计
  128 + @Override
  129 + public void shiftuehiclemanth(String startDate,String endDate,String lpName, List<Shiftuehiclemanth> list) {
  130 +
  131 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  132 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  133 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  134 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  135 + Map<String,Object> map = new HashMap<String, Object>();
  136 + ReportUtils ee = new ReportUtils();
  137 +
  138 + for(Shiftuehiclemanth l : list){
  139 + Map<String, Object> m = new HashMap<String, Object>();
  140 + m.put("jName",l.getjName() );
  141 + m.put("jhlc", l.getJhlc());
  142 + m.put("emptMileage",l.getEmptMileage() );
  143 + m.put("remMileage", l.getRemMileage());
  144 + m.put("addMileage", l.getAddMileage());
  145 + m.put("totalm", l.getTotalm());
  146 + m.put("cjbc", l.getCjbc());
  147 + m.put("ljbc", l.getLjbc());
  148 + m.put("sjbc", l.getSjbc());
  149 + resList.add(m);
  150 + }
  151 +
  152 + try {
  153 + listI.add(resList.iterator());
  154 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  155 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\shiftuehiclemanth.xls",
  156 + path+"export\\班次车辆人员月报表" + sdfSimple.format(sdfMonth.parse(startDate)) + ".xls");
  157 + } catch (Exception e) {
  158 + e.printStackTrace();
  159 + }
  160 +
  161 + }
  162 +
  163 + //路单报表
  164 + @Override
  165 + public void singledata(String startDate,String endDate,String lpName, List<Singledata> list) {
  166 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  167 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  168 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  169 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  170 + Map<String,Object> map = new HashMap<String, Object>();
  171 + ReportUtils ee = new ReportUtils();
  172 +
  173 + for(Singledata l : list){
  174 + Map<String, Object> m = new HashMap<String, Object>();
  175 + m.put("rQ",l.getrQ());
  176 + m.put("gS", l.getgS());
  177 + m.put("xL",l.getxL() );
  178 + m.put("clzbh", l.getClzbh());
  179 + m.put("jsy", l.getJsy());
  180 + m.put("jName", l.getjName());
  181 + m.put("sgh", l.getSgh());
  182 + m.put("sName", l.getsName());
  183 + m.put("jhlc", l.getJhlc());
  184 + m.put("emptMileage", l.getEmptMileage());
  185 + m.put("hyl", l.getHyl());
  186 + m.put("jzl", l.getJzl());
  187 + m.put("unyyyl",l.getUnyyyl());
  188 + m.put("jhjl", l.getJhjl());
  189 + resList.add(m);
  190 + }
  191 +
  192 + try {
  193 + listI.add(resList.iterator());
  194 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  195 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\singledata.xls",
  196 + path+"export\\路单日报表" + sdfSimple.format(sdfMonth.parse(startDate)) + ".xls");
  197 + } catch (Exception e) {
  198 + e.printStackTrace();
  199 + }
  200 +
  201 +
  202 + }
  203 +
  204 +
  205 + //车辆加注
  206 + @Override
  207 + public void vehicleloading(String date, List<Vehicleloading> list) {
  208 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  209 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  210 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  211 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  212 + Map<String,Object> map = new HashMap<String, Object>();
  213 + ReportUtils ee = new ReportUtils();
  214 +
  215 + for(Vehicleloading l : list){
  216 + Map<String, Object> m = new HashMap<String, Object>();
  217 + m.put("rQ", l.getrQ());
  218 + m.put("gS", l.getgS());
  219 + m.put("xL", l.getxL());
  220 + m.put("clzbh", l.getClzbh());
  221 + m.put("hyl", l.getHyl());
  222 + m.put("jzl", l.getJzl());
  223 + m.put("ls", l.getLs());
  224 + m.put("jhlc", l.getJhlc());
  225 + m.put("unyyyl", l.getUnyyyl());
  226 + m.put("jhbc", l.getJhbc());
  227 + m.put("sjbc", l.getSjbc());
  228 + resList.add(m);
  229 + }
  230 +
  231 + try {
  232 + listI.add(resList.iterator());
  233 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  234 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\vehicleloading.xls",
  235 + path+"export\\车辆加注" + sdfSimple.format(sdfMonth.parse(date)) + ".xls");
  236 + } catch (Exception e) {
  237 + e.printStackTrace();
  238 + }
  239 + }
  240 +
  241 + //运营服务阶段报表
  242 + @Override
  243 + public void operationservice(String startDate,String endDate,String lpName,List<Operationservice> list) {
  244 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  245 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  246 +
  247 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  248 + Map<String,Object> map = new HashMap<String, Object>();
  249 + ReportUtils ee = new ReportUtils();
  250 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  251 + for(Operationservice l : list){
  252 + Map<String, Object> m = new HashMap<String, Object>();
  253 + m.put("xlName", l.getXlName());
  254 + m.put("jzl", l.getJzl());
  255 + m.put("xhl", l.getXhl());
  256 + m.put("xsgl", l.getXsgl());
  257 + m.put("emptMileage", l.getEmptMileage());
  258 + m.put("sjbc", l.getSjbc());
  259 + resList.add(m);
  260 + }
  261 +
  262 + try {
  263 + listI.add(resList.iterator());
  264 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  265 + ee.excelReplace(listI, new Object[] { map }, path+"mould\\operationservice.xls",
  266 + path+"export\\运营服务阶段报表" + sdfSimple.format(sdfMonth.parse(startDate)) + ".xls");
  267 + } catch (Exception e) {
  268 + e.printStackTrace();
  269 + }
  270 + }
  271 +
  272 +
  273 +}
src/main/java/com/bsth/service/forms/impl/FormsServiceImpl.java
@@ -339,4 +339,5 @@ public class FormsServiceImpl implements FormsService{ @@ -339,4 +339,5 @@ public class FormsServiceImpl implements FormsService{
339 } 339 }
340 340
341 341
  342 +
342 } 343 }
src/main/resources/datatools/ktrs/ttinfodetailDataOutput.ktr
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> 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
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> 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/forms/mould/list.xls 0 → 100644
No preview for this file type
src/main/resources/static/pages/forms/mould/waybillday.xls 0 → 100644
No preview for this file type
src/main/resources/static/pages/forms/statement/waybillday.html
@@ -118,9 +118,11 @@ @@ -118,9 +118,11 @@
118 } 118 }
119 }); 119 });
120 120
  121 + var line;
  122 + var date;
121 $("#query").on("click",function(){ 123 $("#query").on("click",function(){
122 - var line = $("#line").val();  
123 - var date = $("#date").val(); 124 + line = $("#line").val();
  125 + date = $("#date").val();
124 $post('/mcy_forms/waybillday',{line:line,date:date},function(result){ 126 $post('/mcy_forms/waybillday',{line:line,date:date},function(result){
125 $.each(result, function(i, obj) { 127 $.each(result, function(i, obj) {
126 obj.requestType = reqCodeMap[obj.requestType]; 128 obj.requestType = reqCodeMap[obj.requestType];
@@ -132,18 +134,11 @@ @@ -132,18 +134,11 @@
132 }); 134 });
133 }); 135 });
134 136
135 - //导出  
136 -// $("#export").on("click",function(){  
137 -// $get('/mcy_forms/waybilldayExcel',{line:line,date:date,type:'export'},function(result){  
138 -// window.open("/downloadFile/download?fileName=行车路单日报表"+moment(date).format("YYYYMMDD"));  
139 -// });  
140 -// });  
141 $("#export").on("click",function(){ 137 $("#export").on("click",function(){
142 -  
143 - $post('/mcy_forms/waybilldayExcel',{line:line,date:date},function(result){  
144 - window.open("/downloadFile/download?fileName="+line); 138 + $post('/mcy_export/waybilldayExport',{line:line,date:date,type:'export'},function(result){
  139 + window.open("/downloadFile/download?fileName=行车路单日报表"+moment(date).format("YYYYMMDD"));
145 }); 140 });
146 - }); 141 + });
147 }); 142 });
148 </script> 143 </script>
149 <script type="text/html" id="waybillday"> 144 <script type="text/html" id="waybillday">
src/main/resources/static/pages/oil/jyszAdd.html
@@ -21,7 +21,10 @@ @@ -21,7 +21,10 @@
21 <label class="col-md-3 control-label">公司</label> 21 <label class="col-md-3 control-label">公司</label>
22 <div class="col-md-9"> 22 <div class="col-md-9">
23 <select class="form-control input-medium " name="gsdm"> 23 <select class="form-control input-medium " name="gsdm">
24 - <option value="77">闵行公交</option> 24 + <option value="22">金高公交</option>
  25 + <option value="05">杨高公交</option>
  26 + <option value="55">上南公交</option>
  27 + <option value="26">南汇公交</option>
25 </select> 28 </select>
26 </div> 29 </div>
27 </div> 30 </div>
src/main/resources/static/pages/oil/list.html
@@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
42 </a></li> 42 </a></li>
43 <li class="divider"></li> 43 <li class="divider"></li>
44 <li><a href="javascript:;" data-action="3" 44 <li><a href="javascript:;" data-action="3"
45 - class="tool-action"> <i class="fa fa-file-excel-o"></i> 45 + class="tool-action" id="export"> <i class="fa fa-file-excel-o"></i>
46 导出Excel 46 导出Excel
47 </a></li> 47 </a></li>
48 </ul> 48 </ul>
@@ -57,30 +57,30 @@ @@ -57,30 +57,30 @@
57 <thead> 57 <thead>
58 <tr role="row" class="filter"> 58 <tr role="row" class="filter">
59 <td colspan="3"> 59 <td colspan="3">
60 -<!-- 公司: -->  
61 -<!-- <select name="ssgsdm"> -->  
62 -<!-- <option value="">请选择...</option> -->  
63 -<!-- <option value="1">可用</option> -->  
64 -<!-- <option value="0">禁用</option> -->  
65 -<!-- </select> --> 60 + <!-- 公司:
  61 + <select name="ssgsdm" id="ssgsdm">
  62 + <option value="">请选择...</option>
  63 + <option value="1">可用</option>
  64 + <option value="0">禁用</option>
  65 + </select> -->
66 </td> 66 </td>
67 - 67 + <td >
68 <!-- <select name="fgsdm"> --> 68 <!-- <select name="fgsdm"> -->
69 <!-- <option value="">请选择...</option> --> 69 <!-- <option value="">请选择...</option> -->
70 <!-- <option value="1">可用</option> --> 70 <!-- <option value="1">可用</option> -->
71 <!-- <option value="0">禁用</option> --> 71 <!-- <option value="0">禁用</option> -->
72 <!-- </select> --> 72 <!-- </select> -->
73 - <td> 73 +
74 日期: 74 日期:
75 </td> 75 </td>
76 - <td colspan="2">  
77 - <input type="text" style="width: 80px" name="rq" id="rq"/> 76 + <td colspan="2">
  77 + <input type="text" style="width: 80px" name="rq" id="rq"/>
78 </td> 78 </td>
79 <td colspan="2"> 79 <td colspan="2">
80 线路: 80 线路:
81 </td> 81 </td>
82 <td colspan="3"> 82 <td colspan="3">
83 - <select class="form-control" name="xlbm" id="xlbm" style="width: 120px;"></select> 83 + <select class="form-control" name="xlbm_eq" id="xlbm" style="width: 120px;"></select>
84 &nbsp; 84 &nbsp;
85 </td> 85 </td>
86 <td colspan="2"> 86 <td colspan="2">
@@ -405,9 +405,20 @@ $(function(){ @@ -405,9 +405,20 @@ $(function(){
405 return; 405 return;
406 } 406 }
407 407
408 -  
409 - page = num - 1;  
410 - jsDoQuery(null, false); 408 + var cells = $('tr.filter')[0].cells
  409 + ,params = {}
  410 + ,name;
  411 + $.each(cells, function(i, cell){
  412 + var items = $('input,select', cell);
  413 + for(var j = 0, item; item = items[j++];){
  414 + name = $(item).attr('name');
  415 + if(name){
  416 + params[name] = $(item).val();
  417 + }
  418 + }
  419 + });
  420 + page = num - 1;
  421 + jsDoQuery(params, true);
411 } 422 }
412 }); 423 });
413 } 424 }
@@ -505,6 +516,33 @@ $(function(){ @@ -505,6 +516,33 @@ $(function(){
505 } 516 }
506 }) 517 })
507 518
  519 +
  520 +//导出
  521 +
  522 + $("#export").on("click",function(){
  523 + if($("#rq").val()!=""){
  524 + var cells = $('tr.filter')[0].cells
  525 + ,params = {}
  526 + ,name;
  527 + $.each(cells, function(i, cell){
  528 + var items = $('input,select', cell);
  529 + for(var j = 0, item; item = items[j++];){
  530 + name = $(item).attr('name');
  531 + if(name){
  532 + params[name] = $(item).val();
  533 + }
  534 + }
  535 + });
  536 + console.log(params);
  537 + $post('/ylb/listExport',params,function(result){
  538 + console.log(result);
  539 + window.open("/downloadFile/download?fileName=进出场存油量"+moment($("#rq").val()).format("YYYYMMDD"));
  540 + });
  541 + }else{
  542 + layer.msg('请选择日期.');
  543 + }
  544 + });
  545 +
508 }); 546 });
509 //改变状态 547 //改变状态
510 function startOptJzylLink(id){ 548 function startOptJzylLink(id){
@@ -526,5 +564,8 @@ function startOptJzylLink(id){ @@ -526,5 +564,8 @@ function startOptJzylLink(id){
526 .on('save', function(e, params) { 564 .on('save', function(e, params) {
527 $('#'+id).text(params.newValue); 565 $('#'+id).text(params.newValue);
528 }); 566 });
  567 +
  568 +
  569 +
529 } 570 }
530 </script> 571 </script>
531 \ No newline at end of file 572 \ No newline at end of file
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/core.js
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 -})); 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
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 -})); 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
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 -})); 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
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 -} 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
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"; 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
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 -} 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
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"); 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
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 -} 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
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 -} 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
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 -} 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
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 -} 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
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 -} 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/menu.css
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 -} 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
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 -} 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
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 -} 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
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 -} 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
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 -} 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
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 -} 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
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 -} 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
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 -} 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
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 -} 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
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 -} 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
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 -} 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
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 -})); 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
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 -} 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
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 -}); 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
1 -/*! UIkit 2.27.1 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */ 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} 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}
3 \ No newline at end of file 3 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/css/real.css
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); 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 } 166 }
167 \ No newline at end of file 167 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/js/config.js
1 -/** 地图配置信息 */  
2 -  
3 -var gb_map_config=(function () {  
4 -  
5 - var defaultConfig={  
6 - //地图类型  
7 - map_type: 'baidu',  
8 - //实时路况  
9 - traffic: false  
10 -  
11 - }; 1 +/** 地图配置信息 */
  2 +
  3 +var gb_map_config=(function () {
  4 +
  5 + var defaultConfig={
  6 + //地图类型
  7 + map_type: 'baidu',
  8 + //实时路况
  9 + traffic: false
  10 +
  11 + };
12 })(); 12 })();
13 \ 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
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 -})(); 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
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 -})(); 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
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 -})(); 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
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 {}; 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 })(); 21 })();
22 \ No newline at end of file 22 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/js/real.js
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; 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 } 84 }
85 \ No newline at end of file 85 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/real.html
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 - 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> 129 <script src="/real_control_v2/assets/plugins/spectrum/spectrum.js"></script>
130 \ No newline at end of file 130 \ No newline at end of file