diff --git a/src/main/java/com/emr/controller/DictionaryController.java b/src/main/java/com/emr/controller/DictionaryController.java index 30d0197..b6d99b4 100644 --- a/src/main/java/com/emr/controller/DictionaryController.java +++ b/src/main/java/com/emr/controller/DictionaryController.java @@ -7,6 +7,7 @@ package com.emr.controller; import com.emr.entity.Emr_Dictionary; +import com.emr.entity.Power_User; import com.emr.service.Emr_DictionaryService; import com.emr.util.ExceptionPrintUtil; import org.apache.shiro.SecurityUtils; @@ -17,6 +18,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @@ -62,22 +64,19 @@ public class DictionaryController { @ResponseBody @RequestMapping(value = "/saveInfo") - public String saveInfo(Emr_Dictionary emrDictionary) { + public String saveInfo(Emr_Dictionary emrDictionary, HttpServletRequest request) { String result=""; int bol=0; Emr_Dictionary dic2 = new Emr_Dictionary(); // 从session获取用户名 - Subject currentUser = SecurityUtils.getSubject(); - Session session = currentUser.getSession(); - String username = (String) session.getAttribute("userSession");//获取前面登录的用户名 - + Power_User powerUser = (Power_User)request.getSession().getAttribute("CURRENT_USER"); SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String nowTime = format1.format(new Date()); try{ if(emrDictionary.getId()!=null){ //判断类别代码或代码是否已经存在 //存在修改 - emrDictionary.setUpdater(username); + emrDictionary.setUpdater(powerUser.getUserName()); emrDictionary.setUpdateTime(nowTime); bol=emrDictionaryService.updateCloById(emrDictionary); if (bol == 1) { @@ -86,10 +85,10 @@ public class DictionaryController { result = "修改失败!"; } }else{ - emrDictionary.setCreater(username); + emrDictionary.setCreater(powerUser.getUserName()); emrDictionary.setCreateTime(nowTime); //判断类别代码或代码是否已经存在 - if(emrDictionary.getCode()!=null && emrDictionary.getCode()!=""){ + if(emrDictionary.getCode()!=null && !"".equals(emrDictionary.getCode())){ dic2.setCode(emrDictionary.getCode()); dic2.setParentId(emrDictionary.getParentId()); //根据代码查询该父类下是否存在是否已经存在 diff --git a/src/main/java/com/emr/controller/LoginController.java b/src/main/java/com/emr/controller/LoginController.java index c3c168e..03318da 100644 --- a/src/main/java/com/emr/controller/LoginController.java +++ b/src/main/java/com/emr/controller/LoginController.java @@ -2,6 +2,7 @@ package com.emr.controller; import com.alibaba.fastjson.JSONObject; import com.emr.entity.Power_User; +import com.emr.util.ActionScopeUtils; import com.emr.util.HttpClientUtils; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; @@ -22,18 +23,22 @@ import javax.servlet.http.HttpServletRequest; */ @Controller public class LoginController { - + @Value("${TOKEN_EXPIRE_TIME}") + private long TOKEN_EXPIRE_TIME; + @Value("${STR_SPLIT}") + private String STR_SPLIT; @Value("${POWER_URLHEAD}") private String POWER_URLHEAD; - @Value("${POWER_JSP}") private String POWER_JSP; + @Value("${WEBSOCKET_URLHEAD}") + private String WEBSOCKET_URLHEAD; @Value("${powerUrl}") private String powerUrl; @RequestMapping(value = "/toLogin") - public String toLogin(Model model) { + public String toLogin() { return "redirect:/login.jsp"; } @@ -70,16 +75,20 @@ public class LoginController { } ObjectMapper mapper = new ObjectMapper(); Power_User powerUser = mapper.readValue(objects[0].toString(), Power_User.class); - //设置进session - request.getSession().setAttribute("CURRENT_USER", powerUser); if (null == powerUser.getUserId()) { return "redirect:/error.jsp"; } UsernamePasswordToken userToken = new UsernamePasswordToken(userName, "123456"); Subject subject = SecurityUtils.getSubject(); subject.login(userToken); - model.addAttribute("POWER_URLHEAD", POWER_JSP); - request.getSession().setAttribute("token", token); + model.addAttribute("POWER_URLHEAD", POWER_URLHEAD); + model.addAttribute("POWER_JSP", POWER_JSP); + //传递通知需要的数据 + model.addAttribute("WEBSOCKET_URLHEAD", WEBSOCKET_URLHEAD); + model.addAttribute("STR_SPLIT", STR_SPLIT); + //设置进session + ActionScopeUtils.setSessionAttribute("token",token,Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME))); + ActionScopeUtils.setSessionAttribute("CURRENT_USER",powerUser,Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME))); }else{ return "redirect:"+POWER_URLHEAD+"/login"; } diff --git a/src/main/java/com/emr/controller/WebServiceLoad.java b/src/main/java/com/emr/controller/WebServiceLoad.java index e91d3fb..6c33d35 100644 --- a/src/main/java/com/emr/controller/WebServiceLoad.java +++ b/src/main/java/com/emr/controller/WebServiceLoad.java @@ -2,6 +2,7 @@ package com.emr.controller; import com.emr.util.PropertiesUtils; import org.apache.cxf.endpoint.Client; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @@ -24,11 +25,13 @@ public class WebServiceLoad { public void contextInitialized() { new Thread(() -> { String token = "ORsaVDUBE1RFRFRETE5BR05ERVQ3JyBURkRGRA=="; - String POWER_URLHEAD = PropertiesUtils.getProperty("POWER_JSP"); + String POWER_IP = PropertiesUtils.getProperty("POWER_IP"); + String POWER_PORT = PropertiesUtils.getProperty("POWER_PORT"); //创建连接工厂 JAXDynamicClientFactory dcf = JAXDynamicClientFactory.newInstance(); //创建客户端 - Client client = dcf.createClient(POWER_URLHEAD + "/WebService/PowerWebService?wsdl"); + String url = "http://"+POWER_IP+":"+POWER_PORT+ "/power/WebService/PowerWebService?wsdl"; + Client client = dcf.createClient(url); try { //动态调用getInfosByUserId方法 client.invoke("getInfosByUserId", token, "emr_medical_record"); diff --git a/src/main/java/com/emr/controller/inHospitalController.java b/src/main/java/com/emr/controller/inHospitalController.java index 9e6cd25..e0ad196 100644 --- a/src/main/java/com/emr/controller/inHospitalController.java +++ b/src/main/java/com/emr/controller/inHospitalController.java @@ -482,10 +482,7 @@ public class inHospitalController { if (StringUtils.isNotBlank(masterId)) { path2 += masterId + "\\"; } - // 从session获取用户名 - Subject currentUser = SecurityUtils.getSubject(); - Session session = currentUser.getSession(); - String username = (String) session.getAttribute("userSession");//获取前面登录的用户名 + Power_User powerUser = (Power_User)request.getSession().getAttribute("CURRENT_USER"); //类循环 if (fileObj != null && fileObj.size() > 0) { for (int x = 0; x < fileObj.size(); x++) { @@ -509,7 +506,7 @@ public class inHospitalController { entity.setRelationId(masterId); entity.setAssortId(obj.get("selectVal").toString()); entity.setUpdateTime(nowTime); - entity.setUpdater(username); + entity.setUpdater(powerUser.getUserName()); int bol = 0; String id= obj.get("id").toString(); try { @@ -576,7 +573,7 @@ public class inHospitalController { //上传图片 imgs[t].transferTo(new File( pictureUrl+path2 + pathType + trueFileName)); entity.setId(idTime); - entity.setCreater(username); + entity.setCreater(powerUser.getUserName()); entity.setCreateTime(nowTime); entity.setEffective(1); entity.setMaxPicture(picSrc + path2 + pathType + trueFileName); @@ -600,7 +597,7 @@ public class inHospitalController { //新的图片地址 entity.setMaxPicture(picSrc + path2 + pathType + trueFileName); entity.setId(idTime); - entity.setCreater(username); + entity.setCreater(powerUser.getUserName()); entity.setCreateTime(nowTime); entity.setEffective(1); //插入记录 diff --git a/src/main/java/com/emr/service/ipml/Archive_MasterServiceImpl.java b/src/main/java/com/emr/service/ipml/Archive_MasterServiceImpl.java index fb73726..106ca3f 100644 --- a/src/main/java/com/emr/service/ipml/Archive_MasterServiceImpl.java +++ b/src/main/java/com/emr/service/ipml/Archive_MasterServiceImpl.java @@ -431,7 +431,7 @@ public class Archive_MasterServiceImpl implements Archive_MasterService { if (headNurseCheckFlag) { if (headNurseCheckPower == 1 && headNurseCheckEffective == 1) { targetCode = EnumVerify.DocState.HeadNurseCheck.getCode(); - btns += ""; + btns += ""; } } else { @@ -439,41 +439,41 @@ public class Archive_MasterServiceImpl implements Archive_MasterService { if (!EnumVerify.DocState.HasCurrentState(status, EnumVerify.DocState.DortorSubmit)) { if (doctorSumbitPower == 1 && doctorSubmitEffective == 1) { targetCode = EnumVerify.DocState.DortorSubmit.getCode(); - btns += ""; + btns += ""; } } //没有医生质控员提交 if (!EnumVerify.DocState.HasCurrentState(status, EnumVerify.DocState.DortorCheck) && EnumVerify.DocState.HasCurrentState(status, EnumVerify.DocState.DortorSubmit) || doctorSubmitEffective == 0) { if (doctorCheckSumbitPower == 1 && dortorCheckEffective == 1) { targetCode = EnumVerify.DocState.DortorCheck.getCode(); - btns += ""; + btns += ""; } } //没有科主任审核 if (!EnumVerify.DocState.HasCurrentState(status, EnumVerify.DocState.DirectorCheck) && EnumVerify.DocState.HasCurrentState(status, EnumVerify.DocState.DortorCheck) || (dortorCheckEffective == 0 && doctorSubmitEffective == 0) || (dortorCheckEffective == 0 && EnumVerify.DocState.HasCurrentState(status, EnumVerify.DocState.DortorSubmit))) { if (directorCheckSumbitPower == 1 && directorCheckEffective == 1) { targetCode = EnumVerify.DocState.DirectorCheck.getCode(); - btns += ""; + btns += ""; } } //没有护士提交 if (!EnumVerify.DocState.HasCurrentState(status, EnumVerify.DocState.NurseSubmit)) { if (nurseSumbitPower == 1 && nurseSubmitEffective == 1) { targetCode = EnumVerify.DocState.NurseSubmit.getCode(); - btns += ""; + btns += ""; } //没有护士质控员提交 } if (!EnumVerify.DocState.HasCurrentState(status, EnumVerify.DocState.NurseCheck) && EnumVerify.DocState.HasCurrentState(status, EnumVerify.DocState.NurseSubmit) || nurseSubmitEffective == 0) { if (nurseCheckSumbitPower == 1 && nurseCheckEffective == 1) { targetCode = EnumVerify.DocState.NurseCheck.getCode(); - btns += ""; + btns += ""; } } } //退回按钮 if(StringUtils.isNotBlank(btns) && backPower == 1){ - btns += ""; + btns += ""; } } } diff --git a/src/main/java/com/emr/shiro/MyRealm.java b/src/main/java/com/emr/shiro/MyRealm.java index 95c73fd..917eb3d 100644 --- a/src/main/java/com/emr/shiro/MyRealm.java +++ b/src/main/java/com/emr/shiro/MyRealm.java @@ -2,7 +2,6 @@ package com.emr.shiro; import com.alibaba.fastjson.JSONObject; import com.emr.util.HttpClientUtils; -import org.apache.poi.ss.formula.functions.T; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; @@ -10,12 +9,8 @@ import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.session.Session; import org.apache.shiro.subject.PrincipalCollection; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import java.util.List; -import java.util.Set; - /** * @author HJL * @create 2019/4/29 diff --git a/src/main/java/com/emr/util/ActionScopeUtils.java b/src/main/java/com/emr/util/ActionScopeUtils.java new file mode 100644 index 0000000..53f359b --- /dev/null +++ b/src/main/java/com/emr/util/ActionScopeUtils.java @@ -0,0 +1,43 @@ +package com.emr.util; + + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +/** + * 关于作用域的操作 + * @Author: ljx + * @Date: 2019/4/23 18:24 + * @Version 1.0 + */ +public class ActionScopeUtils { + + public static HttpSession getSession(HttpServletRequest request){ + return request.getSession(); + } + + public static HttpServletRequest getRequest(){ + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + } + + public static void setSessionAttribute(String key,Object value,int expireTime){ + getSession(getRequest()).setAttribute(key,value); + getSession(getRequest()).setMaxInactiveInterval(expireTime); + } + + public static Object getSessionAttribute(String key){ + return getSession(getRequest()).getAttribute(key); + } + + public static void setRequestAttribute(String key,Object value){ + getRequest().setAttribute(key,value); + } + + public static Object getRequestAttribute(String key){ + return getRequest().getAttribute(key); + } + +} diff --git a/src/main/java/com/emr/util/PropertiesUtils.java b/src/main/java/com/emr/util/PropertiesUtils.java index b23d53b..e88964f 100644 --- a/src/main/java/com/emr/util/PropertiesUtils.java +++ b/src/main/java/com/emr/util/PropertiesUtils.java @@ -5,7 +5,7 @@ import java.io.*; import java.util.Properties; public class PropertiesUtils { - private static String fileName = "\\config\\jdbc.properties"; + private static String fileName = "\\config\\config.properties"; private static Properties props; synchronized static private void loadProps(){ diff --git a/src/main/resources/config/applicationContext.xml b/src/main/resources/config/applicationContext.xml index ad5ea29..04d9749 100644 --- a/src/main/resources/config/applicationContext.xml +++ b/src/main/resources/config/applicationContext.xml @@ -30,7 +30,7 @@ - + @@ -46,6 +46,7 @@ + diff --git a/src/main/resources/config/config.properties b/src/main/resources/config/config.properties index 60181b0..9a983f8 100644 --- a/src/main/resources/config/config.properties +++ b/src/main/resources/config/config.properties @@ -1,3 +1,36 @@ +#power\u6743\u9650\u7CFB\u7EDFIP\u548C\u7AEF\u53E3 +POWER_IP = 192.168.1.3 +POWER_PORT = 8080 + +#power\u6743\u9650\u7CFB\u7EDF\u7684\u670D\u52A1\u5668\u5730\u5740\u5934 +POWER_URLHEAD = http://${POWER_IP}:${POWER_PORT}/power + +#jsp\u9875\u9762\u524D\u7AEF\u8DF3\u8F6Cpower\u6743\u9650\u7CFB\u7EDFIP\u548C\u7AEF\u53E3 +POWER_JSPHEAD = ${POWER_IP} +POWER_JSP = ${POWER_URLHEAD} + +#power\u6743\u9650\u7CFB\u7EDF\u7684\u670D\u52A1\u5668\u5730\u5740\u5934\u5982\uFF1Ahttp://192.168.1.3:8081/power +powerUrl=${POWER_URLHEAD}/font/getMenusByUserIdAndSysFlag + +#\u6821\u9A8C\u5B8C\u6574\u6027webService\u670D\u52A1\u63A5\u53E3 +#\u6821\u9A8C\u5B8C\u6574\u6027IP +CHECKSUCCESS_IP = ${POWER_IP} +#\u6821\u9A8C\u5B8C\u6574\u6027\u7AEF\u53E3 +CHECKSUCCESS_PORT = 8888 +HomepageDictionary=http://${CHECKSUCCESS_IP}:${CHECKSUCCESS_PORT}/filing/services/HomepageDictionary?wsdl +HomepageMethod=CheckData + +#webSocket\u670D\u52A1\u5668\u5730\u5740 +WEBSOCKET_URLHEAD = ${POWER_IP}:8088 + +#session\u8FC7\u671F\u65F6\u95F4,\u5355\u4F4D\u79D2 +TOKEN_EXPIRE_TIME = 7200 + +#\u901A\u77E5\u5B57\u7B26\u4E32\u95F4\u9694\u7B26 +STR_SPLIT = *^:|,. + +recallReason=\u533B\u9662\u9700\u8981\u8FD9\u4EFD\u6587\u6863 + #pdf\u6C34\u5370 pdfWater = \u4F5B\u5C71\u5E02\u9AD8\u660E\u4EBA\u6C11\u533B\u9662 diff --git a/src/main/resources/config/jdbc.properties b/src/main/resources/config/jdbc.properties index 61a4651..1078a69 100644 --- a/src/main/resources/config/jdbc.properties +++ b/src/main/resources/config/jdbc.properties @@ -5,31 +5,7 @@ jdbc.password=docus702 filters=stat maxWait=60000 -#Oracle -oracle.driver=oracle.jdbc.driver.OracleDriver -oracle.url=jdbc:oracle:thin:@192.168.10.6:1521/orc1 -oracle.username=pacs -oracle.password=pacs -#hibernate config -hibernate.dialect=org.hibernate.dialect.SQLServerDialect -hibernate.show_sql=true -hibernate.format_sql=true -hibernate.hbm2ddl.auto=update -#hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext -hibernate.current_session_context_class=thread -hibernate.jdbc.batch_size=50 -hibernate.enable_lazy_load_no_trans=true - -#\u83DC\u5355\u63A5\u53E3http://120.27.212.36:8888/power/font/getMenusByUserIdAndSysFlag -#powerUrl=http://120.27.212.36:8888/power/font/getMenusByUserIdAndSysFlag -#POWER_URLHEAD=http://120.27.212.36:8888/power -#power\u6743\u9650\u7CFB\u7EDF\u7684\u670D\u52A1\u5668\u5730\u5740\u5934\u5982\uFF1Ahttp://192.168.1.3:8081/power -powerUrl=http://192.168.1.3:8080/power/font/getMenusByUserIdAndSysFlag -POWER_URLHEAD=http://192.168.1.3:8080/power -POWER_JSP=http://192.168.1.3:8080/power -recallReason=\u533B\u9662\u9700\u8981\u8FD9\u4EFD\u6587\u6863 -HomepageDictionary=http://200.100.104.40:8081/filing/services/HomepageDictionary?wsdl -HomepageMethod=CheckData + diff --git a/src/main/webapp/WEB-INF/jspf/webSocket.jspf b/src/main/webapp/WEB-INF/jspf/webSocket.jspf new file mode 100644 index 0000000..97e337c --- /dev/null +++ b/src/main/webapp/WEB-INF/jspf/webSocket.jspf @@ -0,0 +1,86 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + diff --git a/src/main/webapp/WEB-INF/views/beHospitaledDir/beHospList.jsp b/src/main/webapp/WEB-INF/views/beHospitaledDir/beHospList.jsp index 349d5ee..16f6a75 100644 --- a/src/main/webapp/WEB-INF/views/beHospitaledDir/beHospList.jsp +++ b/src/main/webapp/WEB-INF/views/beHospitaledDir/beHospList.jsp @@ -671,7 +671,7 @@ - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/faultDir/faultList.jsp b/src/main/webapp/WEB-INF/views/faultDir/faultList.jsp index 67062bd..6f5c12b 100644 --- a/src/main/webapp/WEB-INF/views/faultDir/faultList.jsp +++ b/src/main/webapp/WEB-INF/views/faultDir/faultList.jsp @@ -168,7 +168,7 @@ undefinedText: '---', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(219), //定义表格的高度。 + //height: getHeight(219), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -348,6 +348,7 @@ //console.info("加载成功"); $(".page-list").show(); tipLoad = 0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 //console.info("加载数据失败"); diff --git a/src/main/webapp/WEB-INF/views/flowInfo/flowInfoList.jsp b/src/main/webapp/WEB-INF/views/flowInfo/flowInfoList.jsp index 98ac560..c479efa 100644 --- a/src/main/webapp/WEB-INF/views/flowInfo/flowInfoList.jsp +++ b/src/main/webapp/WEB-INF/views/flowInfo/flowInfoList.jsp @@ -114,7 +114,7 @@ - + diff --git a/src/main/webapp/WEB-INF/views/holidaySetDir/holidaySetList.jsp b/src/main/webapp/WEB-INF/views/holidaySetDir/holidaySetList.jsp index fba3ab8..3257b13 100644 --- a/src/main/webapp/WEB-INF/views/holidaySetDir/holidaySetList.jsp +++ b/src/main/webapp/WEB-INF/views/holidaySetDir/holidaySetList.jsp @@ -126,5 +126,5 @@ - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/inHospitalDir/inHositalList.jsp b/src/main/webapp/WEB-INF/views/inHospitalDir/inHositalList.jsp index b464708..059a1e2 100644 --- a/src/main/webapp/WEB-INF/views/inHospitalDir/inHositalList.jsp +++ b/src/main/webapp/WEB-INF/views/inHospitalDir/inHositalList.jsp @@ -521,7 +521,7 @@ undefinedText: '---', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(220), //定义表格的高度。 + //height: getHeight(220), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -738,6 +738,7 @@ // console.info("加载成功"); $(".page-list").show(); tipLoad = 0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 //console.info("加载数据失败"); diff --git a/src/main/webapp/WEB-INF/views/index.jsp b/src/main/webapp/WEB-INF/views/index.jsp index 60e173f..bc4145b 100644 --- a/src/main/webapp/WEB-INF/views/index.jsp +++ b/src/main/webapp/WEB-INF/views/index.jsp @@ -25,6 +25,9 @@ .indexSelected{ background-color: #42515F; } + .navbar-custom-menu{ + padding-right:17px; + } #indexTreeMenu:hover{ overflow-y: auto; overflow-x: hidden; @@ -32,6 +35,14 @@ #indexTreeMenu::-webkit-scrollbar{ display: none; } + .pageTab{ + font-weight: bold; + font-size: 14px; + padding-left: 15px; + } + .content{ + padding-top:0px; + } @@ -151,16 +162,20 @@ }); + + + +
-
- + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/statistics/finalStatistics.jsp b/src/main/webapp/WEB-INF/views/statistics/finalStatistics.jsp index d296b1d..297895a 100644 --- a/src/main/webapp/WEB-INF/views/statistics/finalStatistics.jsp +++ b/src/main/webapp/WEB-INF/views/statistics/finalStatistics.jsp @@ -87,7 +87,7 @@ - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/statistics/finalStatisticsDetail.jsp b/src/main/webapp/WEB-INF/views/statistics/finalStatisticsDetail.jsp index 22bcb7f..34b90b2 100644 --- a/src/main/webapp/WEB-INF/views/statistics/finalStatisticsDetail.jsp +++ b/src/main/webapp/WEB-INF/views/statistics/finalStatisticsDetail.jsp @@ -110,7 +110,7 @@ - + diff --git a/src/main/webapp/WEB-INF/views/statistics/firstStatistics.jsp b/src/main/webapp/WEB-INF/views/statistics/firstStatistics.jsp index 971b6f7..612979f 100644 --- a/src/main/webapp/WEB-INF/views/statistics/firstStatistics.jsp +++ b/src/main/webapp/WEB-INF/views/statistics/firstStatistics.jsp @@ -71,7 +71,7 @@ - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/statistics/printCount.jsp b/src/main/webapp/WEB-INF/views/statistics/printCount.jsp index 1e11ce3..e7eed85 100644 --- a/src/main/webapp/WEB-INF/views/statistics/printCount.jsp +++ b/src/main/webapp/WEB-INF/views/statistics/printCount.jsp @@ -75,7 +75,7 @@ - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/statistics/printInfo.jsp b/src/main/webapp/WEB-INF/views/statistics/printInfo.jsp index 4cac4d3..9cf101b 100644 --- a/src/main/webapp/WEB-INF/views/statistics/printInfo.jsp +++ b/src/main/webapp/WEB-INF/views/statistics/printInfo.jsp @@ -75,7 +75,7 @@ - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/statistics/recordStatistics.jsp b/src/main/webapp/WEB-INF/views/statistics/recordStatistics.jsp index 36b0841..cfdcf9b 100644 --- a/src/main/webapp/WEB-INF/views/statistics/recordStatistics.jsp +++ b/src/main/webapp/WEB-INF/views/statistics/recordStatistics.jsp @@ -117,7 +117,7 @@ - + diff --git a/src/main/webapp/WEB-INF/views/statistics/scanCount.jsp b/src/main/webapp/WEB-INF/views/statistics/scanCount.jsp index 08048d1..c79ac89 100644 --- a/src/main/webapp/WEB-INF/views/statistics/scanCount.jsp +++ b/src/main/webapp/WEB-INF/views/statistics/scanCount.jsp @@ -75,7 +75,7 @@ - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/statistics/scanInfo.jsp b/src/main/webapp/WEB-INF/views/statistics/scanInfo.jsp index 97b1ca7..1ca9368 100644 --- a/src/main/webapp/WEB-INF/views/statistics/scanInfo.jsp +++ b/src/main/webapp/WEB-INF/views/statistics/scanInfo.jsp @@ -75,7 +75,7 @@ - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/statistics/statisticsDetail.jsp b/src/main/webapp/WEB-INF/views/statistics/statisticsDetail.jsp index 59f2c69..0ebc3e6 100644 --- a/src/main/webapp/WEB-INF/views/statistics/statisticsDetail.jsp +++ b/src/main/webapp/WEB-INF/views/statistics/statisticsDetail.jsp @@ -110,7 +110,7 @@ - + diff --git a/src/main/webapp/WEB-INF/views/unfileMedicalDir/unfileMedicalList.jsp b/src/main/webapp/WEB-INF/views/unfileMedicalDir/unfileMedicalList.jsp index 7f6d55f..d316c51 100644 --- a/src/main/webapp/WEB-INF/views/unfileMedicalDir/unfileMedicalList.jsp +++ b/src/main/webapp/WEB-INF/views/unfileMedicalDir/unfileMedicalList.jsp @@ -667,7 +667,7 @@ undefinedText: '---', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(260), //定义表格的高度。 + //height: getHeight(260), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -899,6 +899,7 @@ // console.info("加载成功"); $(".page-list").show(); tipLoad = 0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 //console.info("加载数据失败"); diff --git a/src/main/webapp/WEB-INF/views/vCountDir/vCountList.jsp b/src/main/webapp/WEB-INF/views/vCountDir/vCountList.jsp index 16370c6..b94be8f 100644 --- a/src/main/webapp/WEB-INF/views/vCountDir/vCountList.jsp +++ b/src/main/webapp/WEB-INF/views/vCountDir/vCountList.jsp @@ -707,7 +707,7 @@ undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(197), //定义表格的高度。 + //height: getHeight(197), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -874,6 +874,7 @@ onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad = 0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp deleted file mode 100644 index c38169b..0000000 --- a/src/main/webapp/index.jsp +++ /dev/null @@ -1,5 +0,0 @@ - - -

Hello World!

- - diff --git a/src/main/webapp/login.jsp b/src/main/webapp/login.jsp deleted file mode 100644 index 0135cef..0000000 --- a/src/main/webapp/login.jsp +++ /dev/null @@ -1,23 +0,0 @@ -<%-- - Created by IntelliJ IDEA. - User: Administrator - Date: 2019/4/29 - Time: 10:31 - To change this template use File | Settings | File Templates. ---%> -<%@ page contentType="text/html;charset=UTF-8" language="java" %> - - - Title - - -
- -
- -
- -
-例如:用户名:admin 密码:123456 - - diff --git a/src/main/webapp/static/bootstrap-3.3.7/bower_components/bootstrap-table/bootstrap-table.min.css b/src/main/webapp/static/bootstrap-3.3.7/bower_components/bootstrap-table/bootstrap-table.min.css index 6ed8bbb..42f2dcf 100644 --- a/src/main/webapp/static/bootstrap-3.3.7/bower_components/bootstrap-table/bootstrap-table.min.css +++ b/src/main/webapp/static/bootstrap-3.3.7/bower_components/bootstrap-table/bootstrap-table.min.css @@ -1 +1 @@ -.fixed-table-container .bs-checkbox,.fixed-table-container .no-records-found{text-align:center}.fixed-table-body thead th .th-inner,.table td,.table th{box-sizing:border-box}.bootstrap-table .table{margin-bottom:0!important;border-bottom:1px solid #ddd;border-collapse:collapse!important;border-radius:1px}.bootstrap-table .table,.bootstrap-table .table>tbody>tr>td,.bootstrap-table .table>tbody>tr>th,.bootstrap-table .table>tfoot>tr>td,.bootstrap-table .table>tfoot>tr>th,.bootstrap-table .table>thead>tr>td{padding:8px!important}.bootstrap-table .table.table-no-bordered>tbody>tr>td,.bootstrap-table .table.table-no-bordered>thead>tr>th{border-right:2px solid transparent}.fixed-table-container{position:relative;clear:both;border:1px solid #ddd;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px}.fixed-table-container.table-no-bordered{border:1px solid transparent}.fixed-table-footer,.fixed-table-header{overflow:hidden}.fixed-table-footer{border-top:1px solid #ddd}.fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.fixed-table-container table{width:100%}.fixed-table-container thead th{height:0;padding:0;margin:0;border-left:1px solid #ddd}.fixed-table-container thead th:first-child{border-left:none;border-top-left-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px}.fixed-table-container tbody td .th-inner,.fixed-table-container thead th .th-inner{padding:8px;line-height:24px;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fixed-table-container thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px}.fixed-table-container thead th .both{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC')}.fixed-table-container thead th .asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}.fixed-table-container thead th .desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}.fixed-table-container th.detail{width:30px}.fixed-table-container tbody td{border-left:1px solid #ddd}.fixed-table-container tbody tr:first-child td{border-top:none}.fixed-table-container tbody td:first-child{border-left:none}.fixed-table-container tbody .selected td{background-color:#f5f5f5}.fixed-table-container .bs-checkbox .th-inner{padding:8px 0}.fixed-table-container input[type=radio],.fixed-table-container input[type=checkbox]{margin:0 auto!important}.fixed-table-pagination .pagination-detail,.fixed-table-pagination div.pagination{margin-top:10px;margin-bottom:10px}.fixed-table-pagination div.pagination .pagination{margin:0}.fixed-table-pagination .pagination a{padding:6px 12px;line-height:1.428571429}.fixed-table-pagination .pagination-info{line-height:34px;margin-right:5px}.fixed-table-pagination .btn-group{position:relative;display:inline-block;vertical-align:middle}.fixed-table-pagination .dropup .dropdown-menu{margin-bottom:0}.fixed-table-pagination .page-list{display:inline-block}.fixed-table-toolbar .columns-left{margin-right:5px}.fixed-table-toolbar .columns-right{margin-left:5px}.fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.fixed-table-toolbar .bars,.fixed-table-toolbar .columns,.fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px;line-height:34px}.fixed-table-pagination li.disabled a{pointer-events:none;cursor:default}.fixed-table-loading{display:none;position:absolute;top:42px;right:0;bottom:0;left:0;z-index:99;background-color:#fff;text-align:center}.fixed-table-body .card-view .title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.table td,.table th{vertical-align:middle}.fixed-table-toolbar .dropdown-menu{text-align:left;max-height:300px;overflow:auto}.fixed-table-toolbar .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.fixed-table-toolbar .btn-group>.btn-group>.btn{border-radius:0}.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .table>thead>tr>th{vertical-align:bottom;border-bottom:1px solid #ddd}.bootstrap-table .table thead>tr>th{padding:0;margin:0}.bootstrap-table .fixed-table-footer tbody>tr>td{padding:0!important}.bootstrap-table .fixed-table-footer .table{border-bottom:none;border-radius:0}.pull-right .dropdown-menu{right:0;left:auto}p.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden} \ No newline at end of file +.fixed-table-container .bs-checkbox,.fixed-table-container .no-records-found{text-align:center}.fixed-table-body thead th .th-inner,.table td,.table th{box-sizing:border-box}.bootstrap-table .table{margin-bottom:0!important;border-bottom:1px solid #ddd;border-collapse:collapse!important;border-radius:1px}.bootstrap-table .table,.bootstrap-table .table>tbody>tr>td,.bootstrap-table .table>tbody>tr>th,.bootstrap-table .table>tfoot>tr>td,.bootstrap-table .table>tfoot>tr>th,.bootstrap-table .table>thead>tr>td{padding:8px!important}.bootstrap-table .table.table-no-bordered>tbody>tr>td,.bootstrap-table .table.table-no-bordered>thead>tr>th{border-right:2px solid transparent}.fixed-table-container{position:relative;clear:both;border:1px solid #ddd;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px}.fixed-table-container.table-no-bordered{border:1px solid transparent}.fixed-table-footer,.fixed-table-header{overflow:hidden}.fixed-table-footer{border-top:1px solid #ddd}.fixed-table-body{overflow-x:auto;overflow-y:auto;/*height:100%*/}.fixed-table-container table{width:100%}.fixed-table-container thead th{height:0;padding:0;margin:0;border-left:1px solid #ddd}.fixed-table-container thead th:first-child{border-left:none;border-top-left-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px}.fixed-table-container tbody td .th-inner,.fixed-table-container thead th .th-inner{padding:8px;line-height:24px;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fixed-table-container thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px}.fixed-table-container thead th .both{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC')}.fixed-table-container thead th .asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}.fixed-table-container thead th .desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}.fixed-table-container th.detail{width:30px}.fixed-table-container tbody td{border-left:1px solid #ddd}.fixed-table-container tbody tr:first-child td{border-top:none}.fixed-table-container tbody td:first-child{border-left:none}.fixed-table-container tbody .selected td{background-color:#f5f5f5}.fixed-table-container .bs-checkbox .th-inner{padding:8px 0}.fixed-table-container input[type=radio],.fixed-table-container input[type=checkbox]{margin:0 auto!important}.fixed-table-pagination .pagination-detail,.fixed-table-pagination div.pagination{margin-top:5px;margin-bottom:10px}.fixed-table-pagination div.pagination .pagination{margin:0}.fixed-table-pagination .pagination a{padding:6px 12px;line-height:1.428571429}.fixed-table-pagination .pagination-info{line-height:34px;margin-right:5px}.fixed-table-pagination .btn-group{position:relative;display:inline-block;vertical-align:middle}.fixed-table-pagination .dropup .dropdown-menu{margin-bottom:0}.fixed-table-pagination .page-list{display:inline-block}.fixed-table-toolbar .columns-left{margin-right:5px}.fixed-table-toolbar .columns-right{margin-left:5px}.fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.fixed-table-toolbar .bars,.fixed-table-toolbar .columns,.fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px;line-height:34px}.fixed-table-pagination li.disabled a{pointer-events:none;cursor:default}.fixed-table-loading{display:none;position:absolute;top:42px;right:0;bottom:0;left:0;z-index:99;background-color:#fff;text-align:center}.fixed-table-body .card-view .title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.table td,.table th{vertical-align:middle}.fixed-table-toolbar .dropdown-menu{text-align:left;max-height:300px;overflow:auto}.fixed-table-toolbar .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.fixed-table-toolbar .btn-group>.btn-group>.btn{border-radius:0}.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .table>thead>tr>th{vertical-align:bottom;border-bottom:1px solid #ddd}.bootstrap-table .table thead>tr>th{padding:0;margin:0}.bootstrap-table .fixed-table-footer tbody>tr>td{padding:0!important}.bootstrap-table .fixed-table-footer .table{border-bottom:none;border-radius:0}.pull-right .dropdown-menu{right:0;left:auto}p.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden} \ No newline at end of file diff --git a/src/main/webapp/static/js/beHospList/beHospList.js b/src/main/webapp/static/js/beHospList/beHospList.js index e44aee0..a79da95 100644 --- a/src/main/webapp/static/js/beHospList/beHospList.js +++ b/src/main/webapp/static/js/beHospList/beHospList.js @@ -20,7 +20,7 @@ function initTable() { undefinedText: '---', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(220), //定义表格的高度。 + //height: getHeight(220), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -157,13 +157,13 @@ function initTable() { var index = url.substring(url.lastIndexOf('?') + 1).replace("num=", ""); var html = ""; if (index != null && index.indexOf("select") !== -1) { - html = html + ''; + html = html + ''; } if (row.btns != '' && row.btns != null) { html += row.btns; } if (index != null && index.indexOf("showFlow") !== -1) { - html += '' + html += '' } return html; }, @@ -246,7 +246,8 @@ function initTable() { ], onLoadSuccess: function () { //加载成功时执行 $(".page-list").show(); - tipLoad = 0 + tipLoad = 0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0 diff --git a/src/main/webapp/static/js/comm.js b/src/main/webapp/static/js/comm.js index b3c4e44..421bc7a 100644 --- a/src/main/webapp/static/js/comm.js +++ b/src/main/webapp/static/js/comm.js @@ -99,6 +99,12 @@ function initDateInput(startTimeId,endTimeId){ function getHeight(height) { return $(window).height() - height; } +//重设表格高度 +function reloadTableHeight(tableId) { + $("#"+tableId+".fixed-table-container").css({ "padding-bottom": "0px", height: $("#"+tableId+".fixed-table-body table").height() + 20 }); + $('#'+tableId).bootstrapTable('resetView', { height: "auto" }); +} + //加载时段 function loadTimeInterval(){ $.ajax({ diff --git a/src/main/webapp/static/js/flowInfo/flowInfoList.js b/src/main/webapp/static/js/flowInfo/flowInfoList.js index 291a9a1..91a02c7 100644 --- a/src/main/webapp/static/js/flowInfo/flowInfoList.js +++ b/src/main/webapp/static/js/flowInfo/flowInfoList.js @@ -21,7 +21,7 @@ function initTable() { undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(224), //定义表格的高度。 + //height: getHeight(224), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -150,6 +150,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad =0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/js/holidaySet/holidaySetList.js b/src/main/webapp/static/js/holidaySet/holidaySetList.js index aad73c4..a04c940 100644 --- a/src/main/webapp/static/js/holidaySet/holidaySetList.js +++ b/src/main/webapp/static/js/holidaySet/holidaySetList.js @@ -163,7 +163,7 @@ function initTable() { undefinedText: '---', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(266), //定义表格的高度。 + //height: getHeight(266), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -262,7 +262,8 @@ function initTable() { ], onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); - tipLoad = 0 + tipLoad = 0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0 diff --git a/src/main/webapp/static/js/lastVerifyList/lastVerifyList.js b/src/main/webapp/static/js/lastVerifyList/lastVerifyList.js index 11d581f..d51c1fe 100644 --- a/src/main/webapp/static/js/lastVerifyList/lastVerifyList.js +++ b/src/main/webapp/static/js/lastVerifyList/lastVerifyList.js @@ -24,7 +24,7 @@ function initTable() { undefinedText: '---', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(220), //定义表格的高度。 + //height: getHeight(220), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -91,38 +91,38 @@ function initTable() { checkbox: true, width: 25, align: 'center', - valign: 'middle', + valign: 'middle' }, { title: '住院号', field: 'inpNo', align: 'left', - valign: 'middle', + valign: 'middle' }, { title: '住院次数', field: 'visitId', align: 'center', - valign: 'middle', + valign: 'middle' }, { title: '姓名', field: 'name', align: 'left', - valign: 'middle', + valign: 'middle' }, { title: '性别', field: 'sex', align: 'center', - valign: 'middle', + valign: 'middle' }, { title: '出院科室', field: 'deptName', align: 'left', - valign: 'middle', + valign: 'middle' }, { title: '出院日期', @@ -135,7 +135,7 @@ function initTable() { { title: '主管医生', field: 'doctorInCharge', - align: 'left', + align: 'left' }, { title: '状态', @@ -161,16 +161,16 @@ function initTable() { var index = url.substring(url.lastIndexOf('?') + 1).replace("num=", ""); var html = ""; if (index != null && index != "" && index.indexOf("select") != -1) { - html = ''; + html = ''; } if (index != null && index != "" && index.indexOf("last") != -1) { - html += ''; + html += ''; } if (index != null && index != "" && index.indexOf("back") != -1) { - html += ''; + html += ''; } if (index != null && index != "" && index.indexOf("showFlow") != -1) { - html += '' + html += '' } return html; }, @@ -276,6 +276,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad = 0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/js/medicalRecallList/medicalRecallList.js b/src/main/webapp/static/js/medicalRecallList/medicalRecallList.js index 3f87185..9381b42 100644 --- a/src/main/webapp/static/js/medicalRecallList/medicalRecallList.js +++ b/src/main/webapp/static/js/medicalRecallList/medicalRecallList.js @@ -38,7 +38,6 @@ function initTable() { undefinedText: '---', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(185), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -226,6 +225,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad = 0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/js/statistics/finalStatistics.js b/src/main/webapp/static/js/statistics/finalStatistics.js index 544a855..bccf82b 100644 --- a/src/main/webapp/static/js/statistics/finalStatistics.js +++ b/src/main/webapp/static/js/statistics/finalStatistics.js @@ -17,7 +17,7 @@ function initTable() { undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getStaticTableHeight(), //定义表格的高度。 + //height: getStaticTableHeight(), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -101,6 +101,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad =0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/js/statistics/finalStatisticsDetail.js b/src/main/webapp/static/js/statistics/finalStatisticsDetail.js index 14227c0..e4cb9a2 100644 --- a/src/main/webapp/static/js/statistics/finalStatisticsDetail.js +++ b/src/main/webapp/static/js/statistics/finalStatisticsDetail.js @@ -20,7 +20,7 @@ function initTable() { undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(224), //定义表格的高度。 + //height: getHeight(224), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -161,6 +161,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad =0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/js/statistics/firstStatistics.js b/src/main/webapp/static/js/statistics/firstStatistics.js index 53904f4..2edea66 100644 --- a/src/main/webapp/static/js/statistics/firstStatistics.js +++ b/src/main/webapp/static/js/statistics/firstStatistics.js @@ -17,7 +17,7 @@ function initTable() { undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getStaticTableHeight(), //定义表格的高度。 + //height: getStaticTableHeight(), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -101,6 +101,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad =0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/js/statistics/printCount.js b/src/main/webapp/static/js/statistics/printCount.js index 407bf9d..adf987b 100644 --- a/src/main/webapp/static/js/statistics/printCount.js +++ b/src/main/webapp/static/js/statistics/printCount.js @@ -17,7 +17,7 @@ function initTable() { undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getStaticTableHeight(), //定义表格的高度。 + //height: getStaticTableHeight(), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -112,6 +112,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad =0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/js/statistics/printInfo.js b/src/main/webapp/static/js/statistics/printInfo.js index dc05eee..2e963cb 100644 --- a/src/main/webapp/static/js/statistics/printInfo.js +++ b/src/main/webapp/static/js/statistics/printInfo.js @@ -17,7 +17,7 @@ function initTable() { undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getStaticTableHeight(), //定义表格的高度。 + //height: getStaticTableHeight(), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -148,6 +148,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad =0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/js/statistics/recordStatistics.js b/src/main/webapp/static/js/statistics/recordStatistics.js index 3bc8d81..b2a1344 100644 --- a/src/main/webapp/static/js/statistics/recordStatistics.js +++ b/src/main/webapp/static/js/statistics/recordStatistics.js @@ -58,7 +58,6 @@ function initTable() { undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(100), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 showHeader: true,//是否显示列头。 //是否显示导出按钮 @@ -149,7 +148,7 @@ function initTable1() { singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 - height: getHeight(150), //定义表格的高度。 + //height: getHeight(150), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 showHeader: true,//是否显示列头。 //查询条件 @@ -210,6 +209,7 @@ function initTable1() { ], onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); + reloadTableHeight("table1"); }, //展开详情事件 onExpandRow: function (index, row, $detail) {//點擊datagrid 展開按鈕事件 @@ -242,7 +242,7 @@ function initTable2() { singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 - height: getHeight(150), //定义表格的高度。 + //height: getHeight(150), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 showHeader: true,//是否显示列头。 //是否显示导出按钮 @@ -319,6 +319,7 @@ function initTable2() { ], onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); + reloadTableHeight("table2"); } }); } diff --git a/src/main/webapp/static/js/statistics/scanCount.js b/src/main/webapp/static/js/statistics/scanCount.js index 8340100..0ba7ce0 100644 --- a/src/main/webapp/static/js/statistics/scanCount.js +++ b/src/main/webapp/static/js/statistics/scanCount.js @@ -17,7 +17,7 @@ function initTable() { undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getStaticTableHeight(), //定义表格的高度。 + //height: getStaticTableHeight(), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -94,6 +94,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad =0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/js/statistics/scanInfo.js b/src/main/webapp/static/js/statistics/scanInfo.js index 748f21f..3e24856 100644 --- a/src/main/webapp/static/js/statistics/scanInfo.js +++ b/src/main/webapp/static/js/statistics/scanInfo.js @@ -17,7 +17,7 @@ function initTable() { undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getStaticTableHeight(), //定义表格的高度。 + //height: getStaticTableHeight(), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -136,6 +136,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad =0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/js/statistics/statisticsCommom.js b/src/main/webapp/static/js/statistics/statisticsCommom.js index 790ee1d..c701cd0 100644 --- a/src/main/webapp/static/js/statistics/statisticsCommom.js +++ b/src/main/webapp/static/js/statistics/statisticsCommom.js @@ -14,9 +14,9 @@ $(function () { }) //指定扫描打印表格高度 -function getStaticTableHeight(){ +/*function getStaticTableHeight(){ return $(window).height() - 150; -} +}*/ function initDateInput(idVal){ $('#startTime'+idVal).datepicker({ language: "zh-CN", diff --git a/src/main/webapp/static/js/statistics/statisticsDetail.js b/src/main/webapp/static/js/statistics/statisticsDetail.js index ac9cee4..b8540a4 100644 --- a/src/main/webapp/static/js/statistics/statisticsDetail.js +++ b/src/main/webapp/static/js/statistics/statisticsDetail.js @@ -20,7 +20,7 @@ function initTable() { undefinedText: '--', //当数据为 undefined 时显示的字符 singleSelect: false,//设置True 将禁止多选 clickToSelect: true,//设置true 将在点击行时,自动选择rediobox 和 checkbox - height: getHeight(224), //定义表格的高度。 + //height: getHeight(224), //定义表格的高度。 searchTimeOut: 500,// 默认500 设置搜索超时时间。 toolbarAlign: 'right',// 指定 toolbar 水平方向的位置。'left' 或 'right' paginationDetailHAlign: 'left',//指定 分页详细信息 在水平方向的位置。'left' 或 'right'。 @@ -165,6 +165,7 @@ function initTable() { onLoadSuccess: function (result) { //加载成功时执行 $(".page-list").show(); tipLoad =0; + reloadTableHeight("table"); }, onLoadError: function () { //加载失败时执行 tipLoad = 0; diff --git a/src/main/webapp/static/naranja/css/bootstrap-grid.min.css b/src/main/webapp/static/naranja/css/bootstrap-grid.min.css new file mode 100644 index 0000000..1a480ca --- /dev/null +++ b/src/main/webapp/static/naranja/css/bootstrap-grid.min.css @@ -0,0 +1,14 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=bb2d2388d48b31344c5e) + * Config saved to config.json and https://gist.github.com/bb2d2388d48b31344c5e + *//*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} \ No newline at end of file diff --git a/src/main/webapp/static/naranja/css/demo.css b/src/main/webapp/static/naranja/css/demo.css new file mode 100644 index 0000000..51862d5 --- /dev/null +++ b/src/main/webapp/static/naranja/css/demo.css @@ -0,0 +1,25 @@ +body, html { font-size: 100%; padding: 0; margin: 0;} + +/* Reset */ +*, +*:after, +*:before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* Clearfix hack by Nicolas Gallagher: http://nicolasgallagher.com/micro-clearfix-hack/ */ +.clearfix:before, +.clearfix:after { + content: " "; + display: table; +} + +.clearfix:after { + clear: both; +} + +body{ + font-family: "Microsoft YaHei","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif; +} \ No newline at end of file diff --git a/src/main/webapp/static/naranja/css/naranja.min.css b/src/main/webapp/static/naranja/css/naranja.min.css new file mode 100644 index 0000000..5943055 --- /dev/null +++ b/src/main/webapp/static/naranja/css/naranja.min.css @@ -0,0 +1,213 @@ +.naranja-notification { + height: 0; + box-sizing: content-box; + padding: 10px 0; + transition: padding .7s cubic-bezier(0, .5, 0, 1), height .7s + cubic-bezier(0, .5, 0, 1) +} + +.naranja-notification * { + box-sizing: border-box +} + +.naranja-notification .narj-log { + background-color: #F9F9F9 +} + +.naranja-notification .narj-log button { + border: 1px solid #D2D2D2; + background-color: white +} + +.naranja-notification .narj-log button:first-of-type { + color: #0099E5 +} + +.naranja-notification .narj-success { + background-color: #B8F4BC +} + +.naranja-notification .narj-success button { + border: 1px solid #6ED69A; + background-color: #B8F4BC; + opacity: .9; + color: #11B674 +} + +.naranja-notification .narj-success button:first-of-type { + opacity: 1 +} + +.naranja-notification .narj-warn { + background-color: #FFDD85 +} + +.naranja-notification .narj-warn button { + border: 1px solid #F5CE69; + background-color: #FFDD85; + opacity: .9; + color: #D9993F +} + +.naranja-notification .narj-warn button:first-of-type { + opacity: 1 +} + +.naranja-notification .narj-error { + background-color: #ED9286 +} + +.naranja-notification .narj-error button { + border: 1px solid #ED8476; + background-color: #ED9286; + opacity: .9; + color: #C24343 +} + +.naranja-notification .narj-error button:first-of-type { + opacity: 1 +} + +.naranja-notification .naranja-body-notification { + animation: .4s fadeUpIn 1 cubic-bezier(0, .5, 0, 1); + position: relative; + display: flex; + width: 310px; + border-radius: 4px; + padding: 7px; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.16); + margin-bottom: 7px; + margin-top: 12px; + opacity: 1; + transition: opacity .15s ease, marginTop .3s ease, marginBottom .3s ease, + padding .3s ease +} + +.naranja-notification .naranja-body-notification:hover .naranja-close-icon + { + opacity: .7 +} + +.naranja-notification .naranja-body-notification:hover .naranja-close-icon:hover + { + opacity: 1 +} + +.naranja-notification .naranja-body-notification>div { + display: inline-flex; + justify-content: center; + align-items: center +} + +.naranja-notification .naranja-body-notification .naranja-text-and-title + { + padding-left: 15px; + flex-direction: column; + justify-content: center; + align-items: flex-start +} + +.naranja-notification .naranja-body-notification .naranja-text-and-title>p + { + margin: 5px; + font-family: 'Open Sans' +} + +.naranja-notification .naranja-body-notification .naranja-text-and-title>div + { + width: 100% +} + +.naranja-notification .naranja-body-notification .naranja-text-and-title>div button + { + float: right; + margin-left: 6px; + margin-top: 10px; + margin-bottom: 2px; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + border-radius: 3px; + padding: 2px 11px; + font-size: 14px; + text-align: center; + outline: none; + border-width: 1px; + box-shadow: 0 2px 4px -2px rgba(0, 0, 0, 0.2); + cursor: pointer +} + +.naranja-notification .naranja-body-notification .naranja-text-and-title>div button:active + { + opacity: .7 +} + +.naranja-notification .naranja-body-notification .naranja-title { + font-size: 20px; + opacity: 1 +} + +.naranja-notification .naranja-body-notification .naranja-parragraph { + font-size: 14px; + opacity: .6; + padding-right: 30px; + line-height: 1.4em +} + +.naranja-close-icon { + position: absolute; + right: 7px; + top: 7px; + opacity: 0; + cursor: pointer; + transition: opacity .25s ease +} + +@ +keyframes fadeUpIn { + from {opacity: .2; + box-shadow: 0 0 0 rgba(0, 0, 0, 0.5); + transform: scale(.95) +} + +75%{ +opacity +: +1 +} +to { + opacity: 1; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.16); + transform: scale(1) +} + +} +.naranja-notification-box { + z-index:999; + box-sizing: content-box; + display: flex; + flex-direction: column-reverse; + position: fixed; + bottom: 0; + right: 0; + width: 315px; + height: auto; + max-height: 100vh; + overflow: auto; + padding: 8px; + padding-top: 20px +} + +.naranja-notification-box .naranja-notification-advice { + position: fixed; + right: 138px; + top: -39px; + transform: translateY(0); + cursor: pointer; + transition: transform .3s ease +} + +.naranja-notification-box .naranja-notification-advice.active { + transform: translateY(60px) +} \ No newline at end of file diff --git a/src/main/webapp/static/naranja/js/naranja.js b/src/main/webapp/static/naranja/js/naranja.js new file mode 100644 index 0000000..957da7e --- /dev/null +++ b/src/main/webapp/static/naranja/js/naranja.js @@ -0,0 +1,276 @@ + + +// bip sound +// http://soundbible.com/mp3/A-Tone-His_Self-1266414414.mp3 + +(function (factory) { + // checking for exports avalible + if (typeof module !== 'undefined' && module.exports) { + // export Collection + module.exports = factory + } else { + // else add to root variable + window['naranja'] = factory + } + +})(function () { + function setSideUpAnimation (finalNotification) { + setTimeout(function () { + + var notificaciónHeight = finalNotification + .querySelector('.naranja-body-notification') + .offsetHeight + + finalNotification.style.height = notificaciónHeight + 'px' + }, 0) + } + + function createText (text) { + return document.createTextNode(text) + } + + /** + * provide a reusable way to create html + * elements + * @param tag String – html tag name + * @param classes Array – html tag classes + */ + + function createElement (tag, classes) { + var $HTMLElement = document.createElement(tag) + if ( !!classes ) { + classes.forEach(function (className) { + $HTMLElement.classList.add(className) + }) + } + + return $HTMLElement + } + + var $narjContainer = document.querySelector('.naranja-notification-box') + + if (!$narjContainer) { + $narjContainer = createElement('div', ['naranja-notification-box']) + $newNotificationsAdvice = createElement('div', ['naranja-notification-advice']) + $newNotificationsAdvice.addEventListener('click', function () { + $narjContainer.scrollTop = '0' + }) + $narjContainer.appendChild($newNotificationsAdvice) + + document.body.appendChild($narjContainer) + } + + $narjContainer.__proto__.unshifElement = function (node) { + this.insertBefore(node, this.childNodes[0]) + } + + $narjContainer.addEventListener('scroll', function (e) { + if (e.currentTarget.scrollTop < 20) { + $newNotificationsAdvice.classList.remove('active') + } + }) + + return { + log: function (argm) { + this.createNotification('log', argm) + }, + success: function (argm) { + this.createNotification('success', argm) + }, + warn: function (argm) { + this.createNotification('warn', argm) + }, + error: function (argm) { + this.createNotification('error', argm) + }, + + /* + * Internal methods for + * launch notifications + */ + createNotification: function (type, argm) { + + this.type = type + this.title = argm.title + this.text = argm.text + this.icon = (argm.icon === undefined) ? true : argm.icon + this.buttons = argm.buttons + + var $notification = this.$createContainer() + var $body = $notification.querySelector('div') + + this.$notification = $notification + this.$body = $body + + // render icon if exists + if (this.icon) { + var $iconContainer = createElement('div', [ + 'naranja-icon', + 'narj-icon-' + type + ]) + + $iconContainer.innerHTML = this.chooseIcon[type] + + $body.appendChild($iconContainer) + } + + var $title = this.createTitle() + var $text = this.createText() + + var $textAndTitleContainer = createElement('div', [ + 'naranja-text-and-title' + ]) + + $textAndTitleContainer.appendChild($title) + $textAndTitleContainer.appendChild($text) + + $body.appendChild($textAndTitleContainer) + + // render buttons fragment if exists + if (this.buttons) { + var $buttons = this.createButtons($notification, $body) + + $body + .querySelector('.naranja-text-and-title') + .appendChild($buttons) + } + + + var $close = createElement('div', [ + 'naranja-close-icon' + ]) + + $close.addEventListener('click', (function () { + this.closeNotification() + }).bind(this)) + + // var $close = document.createElement('div') + // $close.classList.add('naranja-close-icon') + $close.innerHTML = this.chooseIcon.close + + $body.appendChild($close) + + $narjContainer.unshifElement($notification) + setSideUpAnimation($notification) + + if ($narjContainer.scrollTop > 20) { + $newNotificationsAdvice.classList.add('active') + $newNotificationsAdvice.innerHTML = this.chooseIcon.newNotification + } + + if (argm.timeout !== 'keep') { + setTimeout( + (function () { + this.closeNotification() + }).bind(this), + argm.timeout || 5000 + ) + } + }, + $createContainer: function () { + // generate box for notification + + var $container = createElement('div', [ + 'naranja-notification', + 'naranja-' + this.type + ]) + + var $innerContainer = createElement('div', [ + 'naranja-body-notification', + 'narj-' + this.type + ]) + + $container.appendChild($innerContainer) + + return $container + }, + createTitle: function () { + var $parragraph = createElement('p', [ + 'naranja-title' + ]) + var $tt = createText(this.title) + $parragraph.appendChild($tt) + + return $parragraph + }, + createText: function () { + var $title = createElement('p', [ + 'naranja-parragraph' + ]) + + var $tx = document.createTextNode(this.text) + $title.appendChild($tx) + + return $title + }, + createButtons: function ($notification, $body) { + var $buttonsContainer = createElement('div', [ + 'naranja-buttons-container' + ]) + + var self = this + + this.buttons.forEach(function (button) { + var $buttonElement = createElement('button') + $buttonElement.appendChild(document.createTextNode(button.text)) + + $buttonElement.addEventListener('click', function (event) { + + self.removeNotification = true + event.preventClose = function () { + self.removeNotification = false + } + + event.closeNotification = function () { + self.closeNotification() + } + + button.click(event) + + if (self.removeNotification) self.closeNotification() + }) + + $buttonsContainer.appendChild($buttonElement) + }) + + return $buttonsContainer + }, + closeNotification: function () { + var self = this + if ( !this.elementWasRemoved ) { + self.$body.style.opacity = '0' + setTimeout(function () { + self.$body.style.marginTop = '0px' + self.$body.style.marginBottom = '0px' + self.$body.style.padding = '0px' + self.$notification.style.height = 0 + 'px' + self.$notification.style.padding = 0 + 'px' + setTimeout(function () { + self.$notification + .parentNode + .removeChild( + self.$notification + ) + }, 600); + if ($narjContainer.scrollTop < 20) { + $newNotificationsAdvice.classList.remove('active') + } + }, 150) + } + this.elementWasRemoved = true + }, + chooseIcon: { + log: '', + + success: '', + + warn: '', + + error: '', + + close: '', + + newNotification: '' + } + } +}) diff --git a/src/main/webapp/static/naranja/sockjs.js b/src/main/webapp/static/naranja/sockjs.js new file mode 100644 index 0000000..24242c0 --- /dev/null +++ b/src/main/webapp/static/naranja/sockjs.js @@ -0,0 +1,5818 @@ +/* sockjs-client v1.4.0 | http://sockjs.org | MIT license */ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.SockJS = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 1) { + // Make a copy so as not to interfere with a current dispatchEvent. + this._listeners[eventType] = arr.slice(0, idx).concat(arr.slice(idx + 1)); + } else { + delete this._listeners[eventType]; + } + return; + } +}; + +EventTarget.prototype.dispatchEvent = function() { + var event = arguments[0]; + var t = event.type; + // equivalent of Array.prototype.slice.call(arguments, 0); + var args = arguments.length === 1 ? [event] : Array.apply(null, arguments); + // TODO: This doesn't match the real behavior; per spec, onfoo get + // their place in line from the /first/ time they're set from + // non-null. Although WebKit bumps it to the end every time it's + // set. + if (this['on' + t]) { + this['on' + t].apply(this, args); + } + if (t in this._listeners) { + // Grab a reference to the listeners list. removeEventListener may alter the list. + var listeners = this._listeners[t]; + for (var i = 0; i < listeners.length; i++) { + listeners[i].apply(this, args); + } + } +}; + +module.exports = EventTarget; + +},{}],6:[function(require,module,exports){ +'use strict'; + +var inherits = require('inherits') + , Event = require('./event') + ; + +function TransportMessageEvent(data) { + Event.call(this); + this.initEvent('message', false, false); + this.data = data; +} + +inherits(TransportMessageEvent, Event); + +module.exports = TransportMessageEvent; + +},{"./event":4,"inherits":57}],7:[function(require,module,exports){ +'use strict'; + +var JSON3 = require('json3') + , iframeUtils = require('./utils/iframe') + ; + +function FacadeJS(transport) { + this._transport = transport; + transport.on('message', this._transportMessage.bind(this)); + transport.on('close', this._transportClose.bind(this)); +} + +FacadeJS.prototype._transportClose = function(code, reason) { + iframeUtils.postMessage('c', JSON3.stringify([code, reason])); +}; +FacadeJS.prototype._transportMessage = function(frame) { + iframeUtils.postMessage('t', frame); +}; +FacadeJS.prototype._send = function(data) { + this._transport.send(data); +}; +FacadeJS.prototype._close = function() { + this._transport.close(); + this._transport.removeAllListeners(); +}; + +module.exports = FacadeJS; + +},{"./utils/iframe":47,"json3":58}],8:[function(require,module,exports){ +(function (process){ +'use strict'; + +var urlUtils = require('./utils/url') + , eventUtils = require('./utils/event') + , JSON3 = require('json3') + , FacadeJS = require('./facade') + , InfoIframeReceiver = require('./info-iframe-receiver') + , iframeUtils = require('./utils/iframe') + , loc = require('./location') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:iframe-bootstrap'); +} + +module.exports = function(SockJS, availableTransports) { + var transportMap = {}; + availableTransports.forEach(function(at) { + if (at.facadeTransport) { + transportMap[at.facadeTransport.transportName] = at.facadeTransport; + } + }); + + // hard-coded for the info iframe + // TODO see if we can make this more dynamic + transportMap[InfoIframeReceiver.transportName] = InfoIframeReceiver; + var parentOrigin; + + /* eslint-disable camelcase */ + SockJS.bootstrap_iframe = function() { + /* eslint-enable camelcase */ + var facade; + iframeUtils.currentWindowId = loc.hash.slice(1); + var onMessage = function(e) { + if (e.source !== parent) { + return; + } + if (typeof parentOrigin === 'undefined') { + parentOrigin = e.origin; + } + if (e.origin !== parentOrigin) { + return; + } + + var iframeMessage; + try { + iframeMessage = JSON3.parse(e.data); + } catch (ignored) { + debug('bad json', e.data); + return; + } + + if (iframeMessage.windowId !== iframeUtils.currentWindowId) { + return; + } + switch (iframeMessage.type) { + case 's': + var p; + try { + p = JSON3.parse(iframeMessage.data); + } catch (ignored) { + debug('bad json', iframeMessage.data); + break; + } + var version = p[0]; + var transport = p[1]; + var transUrl = p[2]; + var baseUrl = p[3]; + debug(version, transport, transUrl, baseUrl); + // change this to semver logic + if (version !== SockJS.version) { + throw new Error('Incompatible SockJS! Main site uses:' + + ' "' + version + '", the iframe:' + + ' "' + SockJS.version + '".'); + } + + if (!urlUtils.isOriginEqual(transUrl, loc.href) || + !urlUtils.isOriginEqual(baseUrl, loc.href)) { + throw new Error('Can\'t connect to different domain from within an ' + + 'iframe. (' + loc.href + ', ' + transUrl + ', ' + baseUrl + ')'); + } + facade = new FacadeJS(new transportMap[transport](transUrl, baseUrl)); + break; + case 'm': + facade._send(iframeMessage.data); + break; + case 'c': + if (facade) { + facade._close(); + } + facade = null; + break; + } + }; + + eventUtils.attachEvent('message', onMessage); + + // Start + iframeUtils.postMessage('s'); + }; +}; + +}).call(this,{ env: {} }) + +},{"./facade":7,"./info-iframe-receiver":10,"./location":13,"./utils/event":46,"./utils/iframe":47,"./utils/url":52,"debug":55,"json3":58}],9:[function(require,module,exports){ +(function (process){ +'use strict'; + +var EventEmitter = require('events').EventEmitter + , inherits = require('inherits') + , JSON3 = require('json3') + , objectUtils = require('./utils/object') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:info-ajax'); +} + +function InfoAjax(url, AjaxObject) { + EventEmitter.call(this); + + var self = this; + var t0 = +new Date(); + this.xo = new AjaxObject('GET', url); + + this.xo.once('finish', function(status, text) { + var info, rtt; + if (status === 200) { + rtt = (+new Date()) - t0; + if (text) { + try { + info = JSON3.parse(text); + } catch (e) { + debug('bad json', text); + } + } + + if (!objectUtils.isObject(info)) { + info = {}; + } + } + self.emit('finish', info, rtt); + self.removeAllListeners(); + }); +} + +inherits(InfoAjax, EventEmitter); + +InfoAjax.prototype.close = function() { + this.removeAllListeners(); + this.xo.close(); +}; + +module.exports = InfoAjax; + +}).call(this,{ env: {} }) + +},{"./utils/object":49,"debug":55,"events":3,"inherits":57,"json3":58}],10:[function(require,module,exports){ +'use strict'; + +var inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + , JSON3 = require('json3') + , XHRLocalObject = require('./transport/sender/xhr-local') + , InfoAjax = require('./info-ajax') + ; + +function InfoReceiverIframe(transUrl) { + var self = this; + EventEmitter.call(this); + + this.ir = new InfoAjax(transUrl, XHRLocalObject); + this.ir.once('finish', function(info, rtt) { + self.ir = null; + self.emit('message', JSON3.stringify([info, rtt])); + }); +} + +inherits(InfoReceiverIframe, EventEmitter); + +InfoReceiverIframe.transportName = 'iframe-info-receiver'; + +InfoReceiverIframe.prototype.close = function() { + if (this.ir) { + this.ir.close(); + this.ir = null; + } + this.removeAllListeners(); +}; + +module.exports = InfoReceiverIframe; + +},{"./info-ajax":9,"./transport/sender/xhr-local":37,"events":3,"inherits":57,"json3":58}],11:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +var EventEmitter = require('events').EventEmitter + , inherits = require('inherits') + , JSON3 = require('json3') + , utils = require('./utils/event') + , IframeTransport = require('./transport/iframe') + , InfoReceiverIframe = require('./info-iframe-receiver') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:info-iframe'); +} + +function InfoIframe(baseUrl, url) { + var self = this; + EventEmitter.call(this); + + var go = function() { + var ifr = self.ifr = new IframeTransport(InfoReceiverIframe.transportName, url, baseUrl); + + ifr.once('message', function(msg) { + if (msg) { + var d; + try { + d = JSON3.parse(msg); + } catch (e) { + debug('bad json', msg); + self.emit('finish'); + self.close(); + return; + } + + var info = d[0], rtt = d[1]; + self.emit('finish', info, rtt); + } + self.close(); + }); + + ifr.once('close', function() { + self.emit('finish'); + self.close(); + }); + }; + + // TODO this seems the same as the 'needBody' from transports + if (!global.document.body) { + utils.attachEvent('load', go); + } else { + go(); + } +} + +inherits(InfoIframe, EventEmitter); + +InfoIframe.enabled = function() { + return IframeTransport.enabled(); +}; + +InfoIframe.prototype.close = function() { + if (this.ifr) { + this.ifr.close(); + } + this.removeAllListeners(); + this.ifr = null; +}; + +module.exports = InfoIframe; + +}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./info-iframe-receiver":10,"./transport/iframe":22,"./utils/event":46,"debug":55,"events":3,"inherits":57,"json3":58}],12:[function(require,module,exports){ +(function (process){ +'use strict'; + +var EventEmitter = require('events').EventEmitter + , inherits = require('inherits') + , urlUtils = require('./utils/url') + , XDR = require('./transport/sender/xdr') + , XHRCors = require('./transport/sender/xhr-cors') + , XHRLocal = require('./transport/sender/xhr-local') + , XHRFake = require('./transport/sender/xhr-fake') + , InfoIframe = require('./info-iframe') + , InfoAjax = require('./info-ajax') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:info-receiver'); +} + +function InfoReceiver(baseUrl, urlInfo) { + debug(baseUrl); + var self = this; + EventEmitter.call(this); + + setTimeout(function() { + self.doXhr(baseUrl, urlInfo); + }, 0); +} + +inherits(InfoReceiver, EventEmitter); + +// TODO this is currently ignoring the list of available transports and the whitelist + +InfoReceiver._getReceiver = function(baseUrl, url, urlInfo) { + // determine method of CORS support (if needed) + if (urlInfo.sameOrigin) { + return new InfoAjax(url, XHRLocal); + } + if (XHRCors.enabled) { + return new InfoAjax(url, XHRCors); + } + if (XDR.enabled && urlInfo.sameScheme) { + return new InfoAjax(url, XDR); + } + if (InfoIframe.enabled()) { + return new InfoIframe(baseUrl, url); + } + return new InfoAjax(url, XHRFake); +}; + +InfoReceiver.prototype.doXhr = function(baseUrl, urlInfo) { + var self = this + , url = urlUtils.addPath(baseUrl, '/info') + ; + debug('doXhr', url); + + this.xo = InfoReceiver._getReceiver(baseUrl, url, urlInfo); + + this.timeoutRef = setTimeout(function() { + debug('timeout'); + self._cleanup(false); + self.emit('finish'); + }, InfoReceiver.timeout); + + this.xo.once('finish', function(info, rtt) { + debug('finish', info, rtt); + self._cleanup(true); + self.emit('finish', info, rtt); + }); +}; + +InfoReceiver.prototype._cleanup = function(wasClean) { + debug('_cleanup'); + clearTimeout(this.timeoutRef); + this.timeoutRef = null; + if (!wasClean && this.xo) { + this.xo.close(); + } + this.xo = null; +}; + +InfoReceiver.prototype.close = function() { + debug('close'); + this.removeAllListeners(); + this._cleanup(false); +}; + +InfoReceiver.timeout = 8000; + +module.exports = InfoReceiver; + +}).call(this,{ env: {} }) + +},{"./info-ajax":9,"./info-iframe":11,"./transport/sender/xdr":34,"./transport/sender/xhr-cors":35,"./transport/sender/xhr-fake":36,"./transport/sender/xhr-local":37,"./utils/url":52,"debug":55,"events":3,"inherits":57}],13:[function(require,module,exports){ +(function (global){ +'use strict'; + +module.exports = global.location || { + origin: 'http://localhost:80' +, protocol: 'http:' +, host: 'localhost' +, port: 80 +, href: 'http://localhost/' +, hash: '' +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],14:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +require('./shims'); + +var URL = require('url-parse') + , inherits = require('inherits') + , JSON3 = require('json3') + , random = require('./utils/random') + , escape = require('./utils/escape') + , urlUtils = require('./utils/url') + , eventUtils = require('./utils/event') + , transport = require('./utils/transport') + , objectUtils = require('./utils/object') + , browser = require('./utils/browser') + , log = require('./utils/log') + , Event = require('./event/event') + , EventTarget = require('./event/eventtarget') + , loc = require('./location') + , CloseEvent = require('./event/close') + , TransportMessageEvent = require('./event/trans-message') + , InfoReceiver = require('./info-receiver') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:main'); +} + +var transports; + +// follow constructor steps defined at http://dev.w3.org/html5/websockets/#the-websocket-interface +function SockJS(url, protocols, options) { + if (!(this instanceof SockJS)) { + return new SockJS(url, protocols, options); + } + if (arguments.length < 1) { + throw new TypeError("Failed to construct 'SockJS: 1 argument required, but only 0 present"); + } + EventTarget.call(this); + + this.readyState = SockJS.CONNECTING; + this.extensions = ''; + this.protocol = ''; + + // non-standard extension + options = options || {}; + if (options.protocols_whitelist) { + log.warn("'protocols_whitelist' is DEPRECATED. Use 'transports' instead."); + } + this._transportsWhitelist = options.transports; + this._transportOptions = options.transportOptions || {}; + this._timeout = options.timeout || 0; + + var sessionId = options.sessionId || 8; + if (typeof sessionId === 'function') { + this._generateSessionId = sessionId; + } else if (typeof sessionId === 'number') { + this._generateSessionId = function() { + return random.string(sessionId); + }; + } else { + throw new TypeError('If sessionId is used in the options, it needs to be a number or a function.'); + } + + this._server = options.server || random.numberString(1000); + + // Step 1 of WS spec - parse and validate the url. Issue #8 + var parsedUrl = new URL(url); + if (!parsedUrl.host || !parsedUrl.protocol) { + throw new SyntaxError("The URL '" + url + "' is invalid"); + } else if (parsedUrl.hash) { + throw new SyntaxError('The URL must not contain a fragment'); + } else if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') { + throw new SyntaxError("The URL's scheme must be either 'http:' or 'https:'. '" + parsedUrl.protocol + "' is not allowed."); + } + + var secure = parsedUrl.protocol === 'https:'; + // Step 2 - don't allow secure origin with an insecure protocol + if (loc.protocol === 'https:' && !secure) { + throw new Error('SecurityError: An insecure SockJS connection may not be initiated from a page loaded over HTTPS'); + } + + // Step 3 - check port access - no need here + // Step 4 - parse protocols argument + if (!protocols) { + protocols = []; + } else if (!Array.isArray(protocols)) { + protocols = [protocols]; + } + + // Step 5 - check protocols argument + var sortedProtocols = protocols.sort(); + sortedProtocols.forEach(function(proto, i) { + if (!proto) { + throw new SyntaxError("The protocols entry '" + proto + "' is invalid."); + } + if (i < (sortedProtocols.length - 1) && proto === sortedProtocols[i + 1]) { + throw new SyntaxError("The protocols entry '" + proto + "' is duplicated."); + } + }); + + // Step 6 - convert origin + var o = urlUtils.getOrigin(loc.href); + this._origin = o ? o.toLowerCase() : null; + + // remove the trailing slash + parsedUrl.set('pathname', parsedUrl.pathname.replace(/\/+$/, '')); + + // store the sanitized url + this.url = parsedUrl.href; + debug('using url', this.url); + + // Step 7 - start connection in background + // obtain server info + // http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html#section-26 + this._urlInfo = { + nullOrigin: !browser.hasDomain() + , sameOrigin: urlUtils.isOriginEqual(this.url, loc.href) + , sameScheme: urlUtils.isSchemeEqual(this.url, loc.href) + }; + + this._ir = new InfoReceiver(this.url, this._urlInfo); + this._ir.once('finish', this._receiveInfo.bind(this)); +} + +inherits(SockJS, EventTarget); + +function userSetCode(code) { + return code === 1000 || (code >= 3000 && code <= 4999); +} + +SockJS.prototype.close = function(code, reason) { + // Step 1 + if (code && !userSetCode(code)) { + throw new Error('InvalidAccessError: Invalid code'); + } + // Step 2.4 states the max is 123 bytes, but we are just checking length + if (reason && reason.length > 123) { + throw new SyntaxError('reason argument has an invalid length'); + } + + // Step 3.1 + if (this.readyState === SockJS.CLOSING || this.readyState === SockJS.CLOSED) { + return; + } + + // TODO look at docs to determine how to set this + var wasClean = true; + this._close(code || 1000, reason || 'Normal closure', wasClean); +}; + +SockJS.prototype.send = function(data) { + // #13 - convert anything non-string to string + // TODO this currently turns objects into [object Object] + if (typeof data !== 'string') { + data = '' + data; + } + if (this.readyState === SockJS.CONNECTING) { + throw new Error('InvalidStateError: The connection has not been established yet'); + } + if (this.readyState !== SockJS.OPEN) { + return; + } + this._transport.send(escape.quote(data)); +}; + +SockJS.version = require('./version'); + +SockJS.CONNECTING = 0; +SockJS.OPEN = 1; +SockJS.CLOSING = 2; +SockJS.CLOSED = 3; + +SockJS.prototype._receiveInfo = function(info, rtt) { + debug('_receiveInfo', rtt); + this._ir = null; + if (!info) { + this._close(1002, 'Cannot connect to server'); + return; + } + + // establish a round-trip timeout (RTO) based on the + // round-trip time (RTT) + this._rto = this.countRTO(rtt); + // allow server to override url used for the actual transport + this._transUrl = info.base_url ? info.base_url : this.url; + info = objectUtils.extend(info, this._urlInfo); + debug('info', info); + // determine list of desired and supported transports + var enabledTransports = transports.filterToEnabled(this._transportsWhitelist, info); + this._transports = enabledTransports.main; + debug(this._transports.length + ' enabled transports'); + + this._connect(); +}; + +SockJS.prototype._connect = function() { + for (var Transport = this._transports.shift(); Transport; Transport = this._transports.shift()) { + debug('attempt', Transport.transportName); + if (Transport.needBody) { + if (!global.document.body || + (typeof global.document.readyState !== 'undefined' && + global.document.readyState !== 'complete' && + global.document.readyState !== 'interactive')) { + debug('waiting for body'); + this._transports.unshift(Transport); + eventUtils.attachEvent('load', this._connect.bind(this)); + return; + } + } + + // calculate timeout based on RTO and round trips. Default to 5s + var timeoutMs = Math.max(this._timeout, (this._rto * Transport.roundTrips) || 5000); + this._transportTimeoutId = setTimeout(this._transportTimeout.bind(this), timeoutMs); + debug('using timeout', timeoutMs); + + var transportUrl = urlUtils.addPath(this._transUrl, '/' + this._server + '/' + this._generateSessionId()); + var options = this._transportOptions[Transport.transportName]; + debug('transport url', transportUrl); + var transportObj = new Transport(transportUrl, this._transUrl, options); + transportObj.on('message', this._transportMessage.bind(this)); + transportObj.once('close', this._transportClose.bind(this)); + transportObj.transportName = Transport.transportName; + this._transport = transportObj; + + return; + } + this._close(2000, 'All transports failed', false); +}; + +SockJS.prototype._transportTimeout = function() { + debug('_transportTimeout'); + if (this.readyState === SockJS.CONNECTING) { + if (this._transport) { + this._transport.close(); + } + + this._transportClose(2007, 'Transport timed out'); + } +}; + +SockJS.prototype._transportMessage = function(msg) { + debug('_transportMessage', msg); + var self = this + , type = msg.slice(0, 1) + , content = msg.slice(1) + , payload + ; + + // first check for messages that don't need a payload + switch (type) { + case 'o': + this._open(); + return; + case 'h': + this.dispatchEvent(new Event('heartbeat')); + debug('heartbeat', this.transport); + return; + } + + if (content) { + try { + payload = JSON3.parse(content); + } catch (e) { + debug('bad json', content); + } + } + + if (typeof payload === 'undefined') { + debug('empty payload', content); + return; + } + + switch (type) { + case 'a': + if (Array.isArray(payload)) { + payload.forEach(function(p) { + debug('message', self.transport, p); + self.dispatchEvent(new TransportMessageEvent(p)); + }); + } + break; + case 'm': + debug('message', this.transport, payload); + this.dispatchEvent(new TransportMessageEvent(payload)); + break; + case 'c': + if (Array.isArray(payload) && payload.length === 2) { + this._close(payload[0], payload[1], true); + } + break; + } +}; + +SockJS.prototype._transportClose = function(code, reason) { + debug('_transportClose', this.transport, code, reason); + if (this._transport) { + this._transport.removeAllListeners(); + this._transport = null; + this.transport = null; + } + + if (!userSetCode(code) && code !== 2000 && this.readyState === SockJS.CONNECTING) { + this._connect(); + return; + } + + this._close(code, reason); +}; + +SockJS.prototype._open = function() { + debug('_open', this._transport && this._transport.transportName, this.readyState); + if (this.readyState === SockJS.CONNECTING) { + if (this._transportTimeoutId) { + clearTimeout(this._transportTimeoutId); + this._transportTimeoutId = null; + } + this.readyState = SockJS.OPEN; + this.transport = this._transport.transportName; + this.dispatchEvent(new Event('open')); + debug('connected', this.transport); + } else { + // The server might have been restarted, and lost track of our + // connection. + this._close(1006, 'Server lost session'); + } +}; + +SockJS.prototype._close = function(code, reason, wasClean) { + debug('_close', this.transport, code, reason, wasClean, this.readyState); + var forceFail = false; + + if (this._ir) { + forceFail = true; + this._ir.close(); + this._ir = null; + } + if (this._transport) { + this._transport.close(); + this._transport = null; + this.transport = null; + } + + if (this.readyState === SockJS.CLOSED) { + throw new Error('InvalidStateError: SockJS has already been closed'); + } + + this.readyState = SockJS.CLOSING; + setTimeout(function() { + this.readyState = SockJS.CLOSED; + + if (forceFail) { + this.dispatchEvent(new Event('error')); + } + + var e = new CloseEvent('close'); + e.wasClean = wasClean || false; + e.code = code || 1000; + e.reason = reason; + + this.dispatchEvent(e); + this.onmessage = this.onclose = this.onerror = null; + debug('disconnected'); + }.bind(this), 0); +}; + +// See: http://www.erg.abdn.ac.uk/~gerrit/dccp/notes/ccid2/rto_estimator/ +// and RFC 2988. +SockJS.prototype.countRTO = function(rtt) { + // In a local environment, when using IE8/9 and the `jsonp-polling` + // transport the time needed to establish a connection (the time that pass + // from the opening of the transport to the call of `_dispatchOpen`) is + // around 200msec (the lower bound used in the article above) and this + // causes spurious timeouts. For this reason we calculate a value slightly + // larger than that used in the article. + if (rtt > 100) { + return 4 * rtt; // rto > 400msec + } + return 300 + rtt; // 300msec < rto <= 400msec +}; + +module.exports = function(availableTransports) { + transports = transport(availableTransports); + require('./iframe-bootstrap')(SockJS, availableTransports); + return SockJS; +}; + +}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./event/close":2,"./event/event":4,"./event/eventtarget":5,"./event/trans-message":6,"./iframe-bootstrap":8,"./info-receiver":12,"./location":13,"./shims":15,"./utils/browser":44,"./utils/escape":45,"./utils/event":46,"./utils/log":48,"./utils/object":49,"./utils/random":50,"./utils/transport":51,"./utils/url":52,"./version":53,"debug":55,"inherits":57,"json3":58,"url-parse":61}],15:[function(require,module,exports){ +/* eslint-disable */ +/* jscs: disable */ +'use strict'; + +// pulled specific shims from https://github.com/es-shims/es5-shim + +var ArrayPrototype = Array.prototype; +var ObjectPrototype = Object.prototype; +var FunctionPrototype = Function.prototype; +var StringPrototype = String.prototype; +var array_slice = ArrayPrototype.slice; + +var _toString = ObjectPrototype.toString; +var isFunction = function (val) { + return ObjectPrototype.toString.call(val) === '[object Function]'; +}; +var isArray = function isArray(obj) { + return _toString.call(obj) === '[object Array]'; +}; +var isString = function isString(obj) { + return _toString.call(obj) === '[object String]'; +}; + +var supportsDescriptors = Object.defineProperty && (function () { + try { + Object.defineProperty({}, 'x', {}); + return true; + } catch (e) { /* this is ES3 */ + return false; + } +}()); + +// Define configurable, writable and non-enumerable props +// if they don't exist. +var defineProperty; +if (supportsDescriptors) { + defineProperty = function (object, name, method, forceAssign) { + if (!forceAssign && (name in object)) { return; } + Object.defineProperty(object, name, { + configurable: true, + enumerable: false, + writable: true, + value: method + }); + }; +} else { + defineProperty = function (object, name, method, forceAssign) { + if (!forceAssign && (name in object)) { return; } + object[name] = method; + }; +} +var defineProperties = function (object, map, forceAssign) { + for (var name in map) { + if (ObjectPrototype.hasOwnProperty.call(map, name)) { + defineProperty(object, name, map[name], forceAssign); + } + } +}; + +var toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError("can't convert " + o + ' to object'); + } + return Object(o); +}; + +// +// Util +// ====== +// + +// ES5 9.4 +// http://es5.github.com/#x9.4 +// http://jsperf.com/to-integer + +function toInteger(num) { + var n = +num; + if (n !== n) { // isNaN + n = 0; + } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + return n; +} + +function ToUint32(x) { + return x >>> 0; +} + +// +// Function +// ======== +// + +// ES-5 15.3.4.5 +// http://es5.github.com/#x15.3.4.5 + +function Empty() {} + +defineProperties(FunctionPrototype, { + bind: function bind(that) { // .length is 1 + // 1. Let Target be the this value. + var target = this; + // 2. If IsCallable(Target) is false, throw a TypeError exception. + if (!isFunction(target)) { + throw new TypeError('Function.prototype.bind called on incompatible ' + target); + } + // 3. Let A be a new (possibly empty) internal list of all of the + // argument values provided after thisArg (arg1, arg2 etc), in order. + // XXX slicedArgs will stand in for "A" if used + var args = array_slice.call(arguments, 1); // for normal call + // 4. Let F be a new native ECMAScript object. + // 11. Set the [[Prototype]] internal property of F to the standard + // built-in Function prototype object as specified in 15.3.3.1. + // 12. Set the [[Call]] internal property of F as described in + // 15.3.4.5.1. + // 13. Set the [[Construct]] internal property of F as described in + // 15.3.4.5.2. + // 14. Set the [[HasInstance]] internal property of F as described in + // 15.3.4.5.3. + var binder = function () { + + if (this instanceof bound) { + // 15.3.4.5.2 [[Construct]] + // When the [[Construct]] internal method of a function object, + // F that was created using the bind function is called with a + // list of arguments ExtraArgs, the following steps are taken: + // 1. Let target be the value of F's [[TargetFunction]] + // internal property. + // 2. If target has no [[Construct]] internal method, a + // TypeError exception is thrown. + // 3. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Construct]] internal + // method of target providing args as the arguments. + + var result = target.apply( + this, + args.concat(array_slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return this; + + } else { + // 15.3.4.5.1 [[Call]] + // When the [[Call]] internal method of a function object, F, + // which was created using the bind function is called with a + // this value and a list of arguments ExtraArgs, the following + // steps are taken: + // 1. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 2. Let boundThis be the value of F's [[BoundThis]] internal + // property. + // 3. Let target be the value of F's [[TargetFunction]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Call]] internal method + // of target providing boundThis as the this value and + // providing args as the arguments. + + // equiv: target.call(this, ...boundArgs, ...args) + return target.apply( + that, + args.concat(array_slice.call(arguments)) + ); + + } + + }; + + // 15. If the [[Class]] internal property of Target is "Function", then + // a. Let L be the length property of Target minus the length of A. + // b. Set the length own property of F to either 0 or L, whichever is + // larger. + // 16. Else set the length own property of F to 0. + + var boundLength = Math.max(0, target.length - args.length); + + // 17. Set the attributes of the length own property of F to the values + // specified in 15.3.5.1. + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs.push('$' + i); + } + + // XXX Build a dynamic function with desired amount of arguments is the only + // way to set the length property of a function. + // In environments where Content Security Policies enabled (Chrome extensions, + // for ex.) all use of eval or Function costructor throws an exception. + // However in all of these environments Function.prototype.bind exists + // and so this code will never be executed. + var bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder); + + if (target.prototype) { + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + // Clean up dangling references. + Empty.prototype = null; + } + + // TODO + // 18. Set the [[Extensible]] internal property of F to true. + + // TODO + // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). + // 20. Call the [[DefineOwnProperty]] internal method of F with + // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: + // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and + // false. + // 21. Call the [[DefineOwnProperty]] internal method of F with + // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, + // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, + // and false. + + // TODO + // NOTE Function objects created using Function.prototype.bind do not + // have a prototype property or the [[Code]], [[FormalParameters]], and + // [[Scope]] internal properties. + // XXX can't delete prototype in pure-js. + + // 22. Return F. + return bound; + } +}); + +// +// Array +// ===== +// + +// ES5 15.4.3.2 +// http://es5.github.com/#x15.4.3.2 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray +defineProperties(Array, { isArray: isArray }); + + +var boxedString = Object('a'); +var splitString = boxedString[0] !== 'a' || !(0 in boxedString); + +var properlyBoxesContext = function properlyBoxed(method) { + // Check node 0.6.21 bug where third parameter is not boxed + var properlyBoxesNonStrict = true; + var properlyBoxesStrict = true; + if (method) { + method.call('foo', function (_, __, context) { + if (typeof context !== 'object') { properlyBoxesNonStrict = false; } + }); + + method.call([1], function () { + 'use strict'; + properlyBoxesStrict = typeof this === 'string'; + }, 'x'); + } + return !!method && properlyBoxesNonStrict && properlyBoxesStrict; +}; + +defineProperties(ArrayPrototype, { + forEach: function forEach(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && isString(this) ? this.split('') : object, + thisp = arguments[1], + i = -1, + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (!isFunction(fun)) { + throw new TypeError(); // TODO message + } + + while (++i < length) { + if (i in self) { + // Invoke the callback function with call, passing arguments: + // context, property value, property key, thisArg object + // context + fun.call(thisp, self[i], i, object); + } + } + } +}, !properlyBoxesContext(ArrayPrototype.forEach)); + +// ES5 15.4.4.14 +// http://es5.github.com/#x15.4.4.14 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf +var hasFirefox2IndexOfBug = Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1; +defineProperties(ArrayPrototype, { + indexOf: function indexOf(sought /*, fromIndex */ ) { + var self = splitString && isString(this) ? this.split('') : toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + + var i = 0; + if (arguments.length > 1) { + i = toInteger(arguments[1]); + } + + // handle negative indices + i = i >= 0 ? i : Math.max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === sought) { + return i; + } + } + return -1; + } +}, hasFirefox2IndexOfBug); + +// +// String +// ====== +// + +// ES5 15.5.4.14 +// http://es5.github.com/#x15.5.4.14 + +// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers] +// Many browsers do not split properly with regular expressions or they +// do not perform the split correctly under obscure conditions. +// See http://blog.stevenlevithan.com/archives/cross-browser-split +// I've tested in many browsers and this seems to cover the deviant ones: +// 'ab'.split(/(?:ab)*/) should be ["", ""], not [""] +// '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""] +// 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not +// [undefined, "t", undefined, "e", ...] +// ''.split(/.?/) should be [], not [""] +// '.'.split(/()()/) should be ["."], not ["", "", "."] + +var string_split = StringPrototype.split; +if ( + 'ab'.split(/(?:ab)*/).length !== 2 || + '.'.split(/(.?)(.?)/).length !== 4 || + 'tesst'.split(/(s)*/)[1] === 't' || + 'test'.split(/(?:)/, -1).length !== 4 || + ''.split(/.?/).length || + '.'.split(/()()/).length > 1 +) { + (function () { + var compliantExecNpcg = /()??/.exec('')[1] === void 0; // NPCG: nonparticipating capturing group + + StringPrototype.split = function (separator, limit) { + var string = this; + if (separator === void 0 && limit === 0) { + return []; + } + + // If `separator` is not a regex, use native split + if (_toString.call(separator) !== '[object RegExp]') { + return string_split.call(this, separator, limit); + } + + var output = [], + flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.extended ? 'x' : '') + // Proposed for ES6 + (separator.sticky ? 'y' : ''), // Firefox 3+ + lastLastIndex = 0, + // Make `global` and avoid `lastIndex` issues by working with a copy + separator2, match, lastIndex, lastLength; + separator = new RegExp(separator.source, flags + 'g'); + string += ''; // Type-convert + if (!compliantExecNpcg) { + // Doesn't need flags gy, but they don't hurt + separator2 = new RegExp('^' + separator.source + '$(?!\\s)', flags); + } + /* Values for `limit`, per the spec: + * If undefined: 4294967295 // Math.pow(2, 32) - 1 + * If 0, Infinity, or NaN: 0 + * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; + * If negative number: 4294967296 - Math.floor(Math.abs(limit)) + * If other: Type-convert, then use the above rules + */ + limit = limit === void 0 ? + -1 >>> 0 : // Math.pow(2, 32) - 1 + ToUint32(limit); + while (match = separator.exec(string)) { + // `separator.lastIndex` is not reliable cross-browser + lastIndex = match.index + match[0].length; + if (lastIndex > lastLastIndex) { + output.push(string.slice(lastLastIndex, match.index)); + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1) { + match[0].replace(separator2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === void 0) { + match[i] = void 0; + } + } + }); + } + if (match.length > 1 && match.index < string.length) { + ArrayPrototype.push.apply(output, match.slice(1)); + } + lastLength = match[0].length; + lastLastIndex = lastIndex; + if (output.length >= limit) { + break; + } + } + if (separator.lastIndex === match.index) { + separator.lastIndex++; // Avoid an infinite loop + } + } + if (lastLastIndex === string.length) { + if (lastLength || !separator.test('')) { + output.push(''); + } + } else { + output.push(string.slice(lastLastIndex)); + } + return output.length > limit ? output.slice(0, limit) : output; + }; + }()); + +// [bugfix, chrome] +// If separator is undefined, then the result array contains just one String, +// which is the this value (converted to a String). If limit is not undefined, +// then the output array is truncated so that it contains no more than limit +// elements. +// "0".split(undefined, 0) -> [] +} else if ('0'.split(void 0, 0).length) { + StringPrototype.split = function split(separator, limit) { + if (separator === void 0 && limit === 0) { return []; } + return string_split.call(this, separator, limit); + }; +} + +// ECMA-262, 3rd B.2.3 +// Not an ECMAScript standard, although ECMAScript 3rd Edition has a +// non-normative section suggesting uniform semantics and it should be +// normalized across all browsers +// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE +var string_substr = StringPrototype.substr; +var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b'; +defineProperties(StringPrototype, { + substr: function substr(start, length) { + return string_substr.call( + this, + start < 0 ? ((start = this.length + start) < 0 ? 0 : start) : start, + length + ); + } +}, hasNegativeSubstrBug); + +},{}],16:[function(require,module,exports){ +'use strict'; + +module.exports = [ + // streaming transports + require('./transport/websocket') +, require('./transport/xhr-streaming') +, require('./transport/xdr-streaming') +, require('./transport/eventsource') +, require('./transport/lib/iframe-wrap')(require('./transport/eventsource')) + + // polling transports +, require('./transport/htmlfile') +, require('./transport/lib/iframe-wrap')(require('./transport/htmlfile')) +, require('./transport/xhr-polling') +, require('./transport/xdr-polling') +, require('./transport/lib/iframe-wrap')(require('./transport/xhr-polling')) +, require('./transport/jsonp-polling') +]; + +},{"./transport/eventsource":20,"./transport/htmlfile":21,"./transport/jsonp-polling":23,"./transport/lib/iframe-wrap":26,"./transport/websocket":38,"./transport/xdr-polling":39,"./transport/xdr-streaming":40,"./transport/xhr-polling":41,"./transport/xhr-streaming":42}],17:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +var EventEmitter = require('events').EventEmitter + , inherits = require('inherits') + , utils = require('../../utils/event') + , urlUtils = require('../../utils/url') + , XHR = global.XMLHttpRequest + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:browser:xhr'); +} + +function AbstractXHRObject(method, url, payload, opts) { + debug(method, url); + var self = this; + EventEmitter.call(this); + + setTimeout(function () { + self._start(method, url, payload, opts); + }, 0); +} + +inherits(AbstractXHRObject, EventEmitter); + +AbstractXHRObject.prototype._start = function(method, url, payload, opts) { + var self = this; + + try { + this.xhr = new XHR(); + } catch (x) { + // intentionally empty + } + + if (!this.xhr) { + debug('no xhr'); + this.emit('finish', 0, 'no xhr support'); + this._cleanup(); + return; + } + + // several browsers cache POSTs + url = urlUtils.addQuery(url, 't=' + (+new Date())); + + // Explorer tends to keep connection open, even after the + // tab gets closed: http://bugs.jquery.com/ticket/5280 + this.unloadRef = utils.unloadAdd(function() { + debug('unload cleanup'); + self._cleanup(true); + }); + try { + this.xhr.open(method, url, true); + if (this.timeout && 'timeout' in this.xhr) { + this.xhr.timeout = this.timeout; + this.xhr.ontimeout = function() { + debug('xhr timeout'); + self.emit('finish', 0, ''); + self._cleanup(false); + }; + } + } catch (e) { + debug('exception', e); + // IE raises an exception on wrong port. + this.emit('finish', 0, ''); + this._cleanup(false); + return; + } + + if ((!opts || !opts.noCredentials) && AbstractXHRObject.supportsCORS) { + debug('withCredentials'); + // Mozilla docs says https://developer.mozilla.org/en/XMLHttpRequest : + // "This never affects same-site requests." + + this.xhr.withCredentials = true; + } + if (opts && opts.headers) { + for (var key in opts.headers) { + this.xhr.setRequestHeader(key, opts.headers[key]); + } + } + + this.xhr.onreadystatechange = function() { + if (self.xhr) { + var x = self.xhr; + var text, status; + debug('readyState', x.readyState); + switch (x.readyState) { + case 3: + // IE doesn't like peeking into responseText or status + // on Microsoft.XMLHTTP and readystate=3 + try { + status = x.status; + text = x.responseText; + } catch (e) { + // intentionally empty + } + debug('status', status); + // IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450 + if (status === 1223) { + status = 204; + } + + // IE does return readystate == 3 for 404 answers. + if (status === 200 && text && text.length > 0) { + debug('chunk'); + self.emit('chunk', status, text); + } + break; + case 4: + status = x.status; + debug('status', status); + // IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450 + if (status === 1223) { + status = 204; + } + // IE returns this for a bad port + // http://msdn.microsoft.com/en-us/library/windows/desktop/aa383770(v=vs.85).aspx + if (status === 12005 || status === 12029) { + status = 0; + } + + debug('finish', status, x.responseText); + self.emit('finish', status, x.responseText); + self._cleanup(false); + break; + } + } + }; + + try { + self.xhr.send(payload); + } catch (e) { + self.emit('finish', 0, ''); + self._cleanup(false); + } +}; + +AbstractXHRObject.prototype._cleanup = function(abort) { + debug('cleanup'); + if (!this.xhr) { + return; + } + this.removeAllListeners(); + utils.unloadDel(this.unloadRef); + + // IE needs this field to be a function + this.xhr.onreadystatechange = function() {}; + if (this.xhr.ontimeout) { + this.xhr.ontimeout = null; + } + + if (abort) { + try { + this.xhr.abort(); + } catch (x) { + // intentionally empty + } + } + this.unloadRef = this.xhr = null; +}; + +AbstractXHRObject.prototype.close = function() { + debug('close'); + this._cleanup(true); +}; + +AbstractXHRObject.enabled = !!XHR; +// override XMLHttpRequest for IE6/7 +// obfuscate to avoid firewalls +var axo = ['Active'].concat('Object').join('X'); +if (!AbstractXHRObject.enabled && (axo in global)) { + debug('overriding xmlhttprequest'); + XHR = function() { + try { + return new global[axo]('Microsoft.XMLHTTP'); + } catch (e) { + return null; + } + }; + AbstractXHRObject.enabled = !!new XHR(); +} + +var cors = false; +try { + cors = 'withCredentials' in new XHR(); +} catch (ignored) { + // intentionally empty +} + +AbstractXHRObject.supportsCORS = cors; + +module.exports = AbstractXHRObject; + +}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"../../utils/event":46,"../../utils/url":52,"debug":55,"events":3,"inherits":57}],18:[function(require,module,exports){ +(function (global){ +module.exports = global.EventSource; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],19:[function(require,module,exports){ +(function (global){ +'use strict'; + +var Driver = global.WebSocket || global.MozWebSocket; +if (Driver) { + module.exports = function WebSocketBrowserDriver(url) { + return new Driver(url); + }; +} else { + module.exports = undefined; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],20:[function(require,module,exports){ +'use strict'; + +var inherits = require('inherits') + , AjaxBasedTransport = require('./lib/ajax-based') + , EventSourceReceiver = require('./receiver/eventsource') + , XHRCorsObject = require('./sender/xhr-cors') + , EventSourceDriver = require('eventsource') + ; + +function EventSourceTransport(transUrl) { + if (!EventSourceTransport.enabled()) { + throw new Error('Transport created when disabled'); + } + + AjaxBasedTransport.call(this, transUrl, '/eventsource', EventSourceReceiver, XHRCorsObject); +} + +inherits(EventSourceTransport, AjaxBasedTransport); + +EventSourceTransport.enabled = function() { + return !!EventSourceDriver; +}; + +EventSourceTransport.transportName = 'eventsource'; +EventSourceTransport.roundTrips = 2; + +module.exports = EventSourceTransport; + +},{"./lib/ajax-based":24,"./receiver/eventsource":29,"./sender/xhr-cors":35,"eventsource":18,"inherits":57}],21:[function(require,module,exports){ +'use strict'; + +var inherits = require('inherits') + , HtmlfileReceiver = require('./receiver/htmlfile') + , XHRLocalObject = require('./sender/xhr-local') + , AjaxBasedTransport = require('./lib/ajax-based') + ; + +function HtmlFileTransport(transUrl) { + if (!HtmlfileReceiver.enabled) { + throw new Error('Transport created when disabled'); + } + AjaxBasedTransport.call(this, transUrl, '/htmlfile', HtmlfileReceiver, XHRLocalObject); +} + +inherits(HtmlFileTransport, AjaxBasedTransport); + +HtmlFileTransport.enabled = function(info) { + return HtmlfileReceiver.enabled && info.sameOrigin; +}; + +HtmlFileTransport.transportName = 'htmlfile'; +HtmlFileTransport.roundTrips = 2; + +module.exports = HtmlFileTransport; + +},{"./lib/ajax-based":24,"./receiver/htmlfile":30,"./sender/xhr-local":37,"inherits":57}],22:[function(require,module,exports){ +(function (process){ +'use strict'; + +// Few cool transports do work only for same-origin. In order to make +// them work cross-domain we shall use iframe, served from the +// remote domain. New browsers have capabilities to communicate with +// cross domain iframe using postMessage(). In IE it was implemented +// from IE 8+, but of course, IE got some details wrong: +// http://msdn.microsoft.com/en-us/library/cc197015(v=VS.85).aspx +// http://stevesouders.com/misc/test-postmessage.php + +var inherits = require('inherits') + , JSON3 = require('json3') + , EventEmitter = require('events').EventEmitter + , version = require('../version') + , urlUtils = require('../utils/url') + , iframeUtils = require('../utils/iframe') + , eventUtils = require('../utils/event') + , random = require('../utils/random') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:transport:iframe'); +} + +function IframeTransport(transport, transUrl, baseUrl) { + if (!IframeTransport.enabled()) { + throw new Error('Transport created when disabled'); + } + EventEmitter.call(this); + + var self = this; + this.origin = urlUtils.getOrigin(baseUrl); + this.baseUrl = baseUrl; + this.transUrl = transUrl; + this.transport = transport; + this.windowId = random.string(8); + + var iframeUrl = urlUtils.addPath(baseUrl, '/iframe.html') + '#' + this.windowId; + debug(transport, transUrl, iframeUrl); + + this.iframeObj = iframeUtils.createIframe(iframeUrl, function(r) { + debug('err callback'); + self.emit('close', 1006, 'Unable to load an iframe (' + r + ')'); + self.close(); + }); + + this.onmessageCallback = this._message.bind(this); + eventUtils.attachEvent('message', this.onmessageCallback); +} + +inherits(IframeTransport, EventEmitter); + +IframeTransport.prototype.close = function() { + debug('close'); + this.removeAllListeners(); + if (this.iframeObj) { + eventUtils.detachEvent('message', this.onmessageCallback); + try { + // When the iframe is not loaded, IE raises an exception + // on 'contentWindow'. + this.postMessage('c'); + } catch (x) { + // intentionally empty + } + this.iframeObj.cleanup(); + this.iframeObj = null; + this.onmessageCallback = this.iframeObj = null; + } +}; + +IframeTransport.prototype._message = function(e) { + debug('message', e.data); + if (!urlUtils.isOriginEqual(e.origin, this.origin)) { + debug('not same origin', e.origin, this.origin); + return; + } + + var iframeMessage; + try { + iframeMessage = JSON3.parse(e.data); + } catch (ignored) { + debug('bad json', e.data); + return; + } + + if (iframeMessage.windowId !== this.windowId) { + debug('mismatched window id', iframeMessage.windowId, this.windowId); + return; + } + + switch (iframeMessage.type) { + case 's': + this.iframeObj.loaded(); + // window global dependency + this.postMessage('s', JSON3.stringify([ + version + , this.transport + , this.transUrl + , this.baseUrl + ])); + break; + case 't': + this.emit('message', iframeMessage.data); + break; + case 'c': + var cdata; + try { + cdata = JSON3.parse(iframeMessage.data); + } catch (ignored) { + debug('bad json', iframeMessage.data); + return; + } + this.emit('close', cdata[0], cdata[1]); + this.close(); + break; + } +}; + +IframeTransport.prototype.postMessage = function(type, data) { + debug('postMessage', type, data); + this.iframeObj.post(JSON3.stringify({ + windowId: this.windowId + , type: type + , data: data || '' + }), this.origin); +}; + +IframeTransport.prototype.send = function(message) { + debug('send', message); + this.postMessage('m', message); +}; + +IframeTransport.enabled = function() { + return iframeUtils.iframeEnabled; +}; + +IframeTransport.transportName = 'iframe'; +IframeTransport.roundTrips = 2; + +module.exports = IframeTransport; + +}).call(this,{ env: {} }) + +},{"../utils/event":46,"../utils/iframe":47,"../utils/random":50,"../utils/url":52,"../version":53,"debug":55,"events":3,"inherits":57,"json3":58}],23:[function(require,module,exports){ +(function (global){ +'use strict'; + +// The simplest and most robust transport, using the well-know cross +// domain hack - JSONP. This transport is quite inefficient - one +// message could use up to one http request. But at least it works almost +// everywhere. +// Known limitations: +// o you will get a spinning cursor +// o for Konqueror a dumb timer is needed to detect errors + +var inherits = require('inherits') + , SenderReceiver = require('./lib/sender-receiver') + , JsonpReceiver = require('./receiver/jsonp') + , jsonpSender = require('./sender/jsonp') + ; + +function JsonPTransport(transUrl) { + if (!JsonPTransport.enabled()) { + throw new Error('Transport created when disabled'); + } + SenderReceiver.call(this, transUrl, '/jsonp', jsonpSender, JsonpReceiver); +} + +inherits(JsonPTransport, SenderReceiver); + +JsonPTransport.enabled = function() { + return !!global.document; +}; + +JsonPTransport.transportName = 'jsonp-polling'; +JsonPTransport.roundTrips = 1; +JsonPTransport.needBody = true; + +module.exports = JsonPTransport; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./lib/sender-receiver":28,"./receiver/jsonp":31,"./sender/jsonp":33,"inherits":57}],24:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , urlUtils = require('../../utils/url') + , SenderReceiver = require('./sender-receiver') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:ajax-based'); +} + +function createAjaxSender(AjaxObject) { + return function(url, payload, callback) { + debug('create ajax sender', url, payload); + var opt = {}; + if (typeof payload === 'string') { + opt.headers = {'Content-type': 'text/plain'}; + } + var ajaxUrl = urlUtils.addPath(url, '/xhr_send'); + var xo = new AjaxObject('POST', ajaxUrl, payload, opt); + xo.once('finish', function(status) { + debug('finish', status); + xo = null; + + if (status !== 200 && status !== 204) { + return callback(new Error('http status ' + status)); + } + callback(); + }); + return function() { + debug('abort'); + xo.close(); + xo = null; + + var err = new Error('Aborted'); + err.code = 1000; + callback(err); + }; + }; +} + +function AjaxBasedTransport(transUrl, urlSuffix, Receiver, AjaxObject) { + SenderReceiver.call(this, transUrl, urlSuffix, createAjaxSender(AjaxObject), Receiver, AjaxObject); +} + +inherits(AjaxBasedTransport, SenderReceiver); + +module.exports = AjaxBasedTransport; + +}).call(this,{ env: {} }) + +},{"../../utils/url":52,"./sender-receiver":28,"debug":55,"inherits":57}],25:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:buffered-sender'); +} + +function BufferedSender(url, sender) { + debug(url); + EventEmitter.call(this); + this.sendBuffer = []; + this.sender = sender; + this.url = url; +} + +inherits(BufferedSender, EventEmitter); + +BufferedSender.prototype.send = function(message) { + debug('send', message); + this.sendBuffer.push(message); + if (!this.sendStop) { + this.sendSchedule(); + } +}; + +// For polling transports in a situation when in the message callback, +// new message is being send. If the sending connection was started +// before receiving one, it is possible to saturate the network and +// timeout due to the lack of receiving socket. To avoid that we delay +// sending messages by some small time, in order to let receiving +// connection be started beforehand. This is only a halfmeasure and +// does not fix the big problem, but it does make the tests go more +// stable on slow networks. +BufferedSender.prototype.sendScheduleWait = function() { + debug('sendScheduleWait'); + var self = this; + var tref; + this.sendStop = function() { + debug('sendStop'); + self.sendStop = null; + clearTimeout(tref); + }; + tref = setTimeout(function() { + debug('timeout'); + self.sendStop = null; + self.sendSchedule(); + }, 25); +}; + +BufferedSender.prototype.sendSchedule = function() { + debug('sendSchedule', this.sendBuffer.length); + var self = this; + if (this.sendBuffer.length > 0) { + var payload = '[' + this.sendBuffer.join(',') + ']'; + this.sendStop = this.sender(this.url, payload, function(err) { + self.sendStop = null; + if (err) { + debug('error', err); + self.emit('close', err.code || 1006, 'Sending error: ' + err); + self.close(); + } else { + self.sendScheduleWait(); + } + }); + this.sendBuffer = []; + } +}; + +BufferedSender.prototype._cleanup = function() { + debug('_cleanup'); + this.removeAllListeners(); +}; + +BufferedSender.prototype.close = function() { + debug('close'); + this._cleanup(); + if (this.sendStop) { + this.sendStop(); + this.sendStop = null; + } +}; + +module.exports = BufferedSender; + +}).call(this,{ env: {} }) + +},{"debug":55,"events":3,"inherits":57}],26:[function(require,module,exports){ +(function (global){ +'use strict'; + +var inherits = require('inherits') + , IframeTransport = require('../iframe') + , objectUtils = require('../../utils/object') + ; + +module.exports = function(transport) { + + function IframeWrapTransport(transUrl, baseUrl) { + IframeTransport.call(this, transport.transportName, transUrl, baseUrl); + } + + inherits(IframeWrapTransport, IframeTransport); + + IframeWrapTransport.enabled = function(url, info) { + if (!global.document) { + return false; + } + + var iframeInfo = objectUtils.extend({}, info); + iframeInfo.sameOrigin = true; + return transport.enabled(iframeInfo) && IframeTransport.enabled(); + }; + + IframeWrapTransport.transportName = 'iframe-' + transport.transportName; + IframeWrapTransport.needBody = true; + IframeWrapTransport.roundTrips = IframeTransport.roundTrips + transport.roundTrips - 1; // html, javascript (2) + transport - no CORS (1) + + IframeWrapTransport.facadeTransport = transport; + + return IframeWrapTransport; +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"../../utils/object":49,"../iframe":22,"inherits":57}],27:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:polling'); +} + +function Polling(Receiver, receiveUrl, AjaxObject) { + debug(receiveUrl); + EventEmitter.call(this); + this.Receiver = Receiver; + this.receiveUrl = receiveUrl; + this.AjaxObject = AjaxObject; + this._scheduleReceiver(); +} + +inherits(Polling, EventEmitter); + +Polling.prototype._scheduleReceiver = function() { + debug('_scheduleReceiver'); + var self = this; + var poll = this.poll = new this.Receiver(this.receiveUrl, this.AjaxObject); + + poll.on('message', function(msg) { + debug('message', msg); + self.emit('message', msg); + }); + + poll.once('close', function(code, reason) { + debug('close', code, reason, self.pollIsClosing); + self.poll = poll = null; + + if (!self.pollIsClosing) { + if (reason === 'network') { + self._scheduleReceiver(); + } else { + self.emit('close', code || 1006, reason); + self.removeAllListeners(); + } + } + }); +}; + +Polling.prototype.abort = function() { + debug('abort'); + this.removeAllListeners(); + this.pollIsClosing = true; + if (this.poll) { + this.poll.abort(); + } +}; + +module.exports = Polling; + +}).call(this,{ env: {} }) + +},{"debug":55,"events":3,"inherits":57}],28:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , urlUtils = require('../../utils/url') + , BufferedSender = require('./buffered-sender') + , Polling = require('./polling') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:sender-receiver'); +} + +function SenderReceiver(transUrl, urlSuffix, senderFunc, Receiver, AjaxObject) { + var pollUrl = urlUtils.addPath(transUrl, urlSuffix); + debug(pollUrl); + var self = this; + BufferedSender.call(this, transUrl, senderFunc); + + this.poll = new Polling(Receiver, pollUrl, AjaxObject); + this.poll.on('message', function(msg) { + debug('poll message', msg); + self.emit('message', msg); + }); + this.poll.once('close', function(code, reason) { + debug('poll close', code, reason); + self.poll = null; + self.emit('close', code, reason); + self.close(); + }); +} + +inherits(SenderReceiver, BufferedSender); + +SenderReceiver.prototype.close = function() { + BufferedSender.prototype.close.call(this); + debug('close'); + this.removeAllListeners(); + if (this.poll) { + this.poll.abort(); + this.poll = null; + } +}; + +module.exports = SenderReceiver; + +}).call(this,{ env: {} }) + +},{"../../utils/url":52,"./buffered-sender":25,"./polling":27,"debug":55,"inherits":57}],29:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + , EventSourceDriver = require('eventsource') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:receiver:eventsource'); +} + +function EventSourceReceiver(url) { + debug(url); + EventEmitter.call(this); + + var self = this; + var es = this.es = new EventSourceDriver(url); + es.onmessage = function(e) { + debug('message', e.data); + self.emit('message', decodeURI(e.data)); + }; + es.onerror = function(e) { + debug('error', es.readyState, e); + // ES on reconnection has readyState = 0 or 1. + // on network error it's CLOSED = 2 + var reason = (es.readyState !== 2 ? 'network' : 'permanent'); + self._cleanup(); + self._close(reason); + }; +} + +inherits(EventSourceReceiver, EventEmitter); + +EventSourceReceiver.prototype.abort = function() { + debug('abort'); + this._cleanup(); + this._close('user'); +}; + +EventSourceReceiver.prototype._cleanup = function() { + debug('cleanup'); + var es = this.es; + if (es) { + es.onmessage = es.onerror = null; + es.close(); + this.es = null; + } +}; + +EventSourceReceiver.prototype._close = function(reason) { + debug('close', reason); + var self = this; + // Safari and chrome < 15 crash if we close window before + // waiting for ES cleanup. See: + // https://code.google.com/p/chromium/issues/detail?id=89155 + setTimeout(function() { + self.emit('close', null, reason); + self.removeAllListeners(); + }, 200); +}; + +module.exports = EventSourceReceiver; + +}).call(this,{ env: {} }) + +},{"debug":55,"events":3,"eventsource":18,"inherits":57}],30:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +var inherits = require('inherits') + , iframeUtils = require('../../utils/iframe') + , urlUtils = require('../../utils/url') + , EventEmitter = require('events').EventEmitter + , random = require('../../utils/random') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:receiver:htmlfile'); +} + +function HtmlfileReceiver(url) { + debug(url); + EventEmitter.call(this); + var self = this; + iframeUtils.polluteGlobalNamespace(); + + this.id = 'a' + random.string(6); + url = urlUtils.addQuery(url, 'c=' + decodeURIComponent(iframeUtils.WPrefix + '.' + this.id)); + + debug('using htmlfile', HtmlfileReceiver.htmlfileEnabled); + var constructFunc = HtmlfileReceiver.htmlfileEnabled ? + iframeUtils.createHtmlfile : iframeUtils.createIframe; + + global[iframeUtils.WPrefix][this.id] = { + start: function() { + debug('start'); + self.iframeObj.loaded(); + } + , message: function(data) { + debug('message', data); + self.emit('message', data); + } + , stop: function() { + debug('stop'); + self._cleanup(); + self._close('network'); + } + }; + this.iframeObj = constructFunc(url, function() { + debug('callback'); + self._cleanup(); + self._close('permanent'); + }); +} + +inherits(HtmlfileReceiver, EventEmitter); + +HtmlfileReceiver.prototype.abort = function() { + debug('abort'); + this._cleanup(); + this._close('user'); +}; + +HtmlfileReceiver.prototype._cleanup = function() { + debug('_cleanup'); + if (this.iframeObj) { + this.iframeObj.cleanup(); + this.iframeObj = null; + } + delete global[iframeUtils.WPrefix][this.id]; +}; + +HtmlfileReceiver.prototype._close = function(reason) { + debug('_close', reason); + this.emit('close', null, reason); + this.removeAllListeners(); +}; + +HtmlfileReceiver.htmlfileEnabled = false; + +// obfuscate to avoid firewalls +var axo = ['Active'].concat('Object').join('X'); +if (axo in global) { + try { + HtmlfileReceiver.htmlfileEnabled = !!new global[axo]('htmlfile'); + } catch (x) { + // intentionally empty + } +} + +HtmlfileReceiver.enabled = HtmlfileReceiver.htmlfileEnabled || iframeUtils.iframeEnabled; + +module.exports = HtmlfileReceiver; + +}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"../../utils/iframe":47,"../../utils/random":50,"../../utils/url":52,"debug":55,"events":3,"inherits":57}],31:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +var utils = require('../../utils/iframe') + , random = require('../../utils/random') + , browser = require('../../utils/browser') + , urlUtils = require('../../utils/url') + , inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:receiver:jsonp'); +} + +function JsonpReceiver(url) { + debug(url); + var self = this; + EventEmitter.call(this); + + utils.polluteGlobalNamespace(); + + this.id = 'a' + random.string(6); + var urlWithId = urlUtils.addQuery(url, 'c=' + encodeURIComponent(utils.WPrefix + '.' + this.id)); + + global[utils.WPrefix][this.id] = this._callback.bind(this); + this._createScript(urlWithId); + + // Fallback mostly for Konqueror - stupid timer, 35 seconds shall be plenty. + this.timeoutId = setTimeout(function() { + debug('timeout'); + self._abort(new Error('JSONP script loaded abnormally (timeout)')); + }, JsonpReceiver.timeout); +} + +inherits(JsonpReceiver, EventEmitter); + +JsonpReceiver.prototype.abort = function() { + debug('abort'); + if (global[utils.WPrefix][this.id]) { + var err = new Error('JSONP user aborted read'); + err.code = 1000; + this._abort(err); + } +}; + +JsonpReceiver.timeout = 35000; +JsonpReceiver.scriptErrorTimeout = 1000; + +JsonpReceiver.prototype._callback = function(data) { + debug('_callback', data); + this._cleanup(); + + if (this.aborting) { + return; + } + + if (data) { + debug('message', data); + this.emit('message', data); + } + this.emit('close', null, 'network'); + this.removeAllListeners(); +}; + +JsonpReceiver.prototype._abort = function(err) { + debug('_abort', err); + this._cleanup(); + this.aborting = true; + this.emit('close', err.code, err.message); + this.removeAllListeners(); +}; + +JsonpReceiver.prototype._cleanup = function() { + debug('_cleanup'); + clearTimeout(this.timeoutId); + if (this.script2) { + this.script2.parentNode.removeChild(this.script2); + this.script2 = null; + } + if (this.script) { + var script = this.script; + // Unfortunately, you can't really abort script loading of + // the script. + script.parentNode.removeChild(script); + script.onreadystatechange = script.onerror = + script.onload = script.onclick = null; + this.script = null; + } + delete global[utils.WPrefix][this.id]; +}; + +JsonpReceiver.prototype._scriptError = function() { + debug('_scriptError'); + var self = this; + if (this.errorTimer) { + return; + } + + this.errorTimer = setTimeout(function() { + if (!self.loadedOkay) { + self._abort(new Error('JSONP script loaded abnormally (onerror)')); + } + }, JsonpReceiver.scriptErrorTimeout); +}; + +JsonpReceiver.prototype._createScript = function(url) { + debug('_createScript', url); + var self = this; + var script = this.script = global.document.createElement('script'); + var script2; // Opera synchronous load trick. + + script.id = 'a' + random.string(8); + script.src = url; + script.type = 'text/javascript'; + script.charset = 'UTF-8'; + script.onerror = this._scriptError.bind(this); + script.onload = function() { + debug('onload'); + self._abort(new Error('JSONP script loaded abnormally (onload)')); + }; + + // IE9 fires 'error' event after onreadystatechange or before, in random order. + // Use loadedOkay to determine if actually errored + script.onreadystatechange = function() { + debug('onreadystatechange', script.readyState); + if (/loaded|closed/.test(script.readyState)) { + if (script && script.htmlFor && script.onclick) { + self.loadedOkay = true; + try { + // In IE, actually execute the script. + script.onclick(); + } catch (x) { + // intentionally empty + } + } + if (script) { + self._abort(new Error('JSONP script loaded abnormally (onreadystatechange)')); + } + } + }; + // IE: event/htmlFor/onclick trick. + // One can't rely on proper order for onreadystatechange. In order to + // make sure, set a 'htmlFor' and 'event' properties, so that + // script code will be installed as 'onclick' handler for the + // script object. Later, onreadystatechange, manually execute this + // code. FF and Chrome doesn't work with 'event' and 'htmlFor' + // set. For reference see: + // http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html + // Also, read on that about script ordering: + // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order + if (typeof script.async === 'undefined' && global.document.attachEvent) { + // According to mozilla docs, in recent browsers script.async defaults + // to 'true', so we may use it to detect a good browser: + // https://developer.mozilla.org/en/HTML/Element/script + if (!browser.isOpera()) { + // Naively assume we're in IE + try { + script.htmlFor = script.id; + script.event = 'onclick'; + } catch (x) { + // intentionally empty + } + script.async = true; + } else { + // Opera, second sync script hack + script2 = this.script2 = global.document.createElement('script'); + script2.text = "try{var a = document.getElementById('" + script.id + "'); if(a)a.onerror();}catch(x){};"; + script.async = script2.async = false; + } + } + if (typeof script.async !== 'undefined') { + script.async = true; + } + + var head = global.document.getElementsByTagName('head')[0]; + head.insertBefore(script, head.firstChild); + if (script2) { + head.insertBefore(script2, head.firstChild); + } +}; + +module.exports = JsonpReceiver; + +}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"../../utils/browser":44,"../../utils/iframe":47,"../../utils/random":50,"../../utils/url":52,"debug":55,"events":3,"inherits":57}],32:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:receiver:xhr'); +} + +function XhrReceiver(url, AjaxObject) { + debug(url); + EventEmitter.call(this); + var self = this; + + this.bufferPosition = 0; + + this.xo = new AjaxObject('POST', url, null); + this.xo.on('chunk', this._chunkHandler.bind(this)); + this.xo.once('finish', function(status, text) { + debug('finish', status, text); + self._chunkHandler(status, text); + self.xo = null; + var reason = status === 200 ? 'network' : 'permanent'; + debug('close', reason); + self.emit('close', null, reason); + self._cleanup(); + }); +} + +inherits(XhrReceiver, EventEmitter); + +XhrReceiver.prototype._chunkHandler = function(status, text) { + debug('_chunkHandler', status); + if (status !== 200 || !text) { + return; + } + + for (var idx = -1; ; this.bufferPosition += idx + 1) { + var buf = text.slice(this.bufferPosition); + idx = buf.indexOf('\n'); + if (idx === -1) { + break; + } + var msg = buf.slice(0, idx); + if (msg) { + debug('message', msg); + this.emit('message', msg); + } + } +}; + +XhrReceiver.prototype._cleanup = function() { + debug('_cleanup'); + this.removeAllListeners(); +}; + +XhrReceiver.prototype.abort = function() { + debug('abort'); + if (this.xo) { + this.xo.close(); + debug('close'); + this.emit('close', null, 'user'); + this.xo = null; + } + this._cleanup(); +}; + +module.exports = XhrReceiver; + +}).call(this,{ env: {} }) + +},{"debug":55,"events":3,"inherits":57}],33:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +var random = require('../../utils/random') + , urlUtils = require('../../utils/url') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:sender:jsonp'); +} + +var form, area; + +function createIframe(id) { + debug('createIframe', id); + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + return global.document.createElement('