├── README.md
├── calendar_showcase.html
├── css
├── mui.min.css
├── mui.min.js
└── showcase.css
├── fonts
├── mui-icons-extra.ttf
└── mui.ttf
├── img
├── checkbox_pressed.png
├── checkbox_unable.png
├── img_sdule_point.png
├── img_sdule_point2.png
├── img_sdule_selected.png
└── img_success.png
├── js
└── calendar_showcase.js
└── libs
├── calendar_base.css
├── calendar_base.js
├── mustache.min.js
├── swiper.min.css
└── swiper.min.js
/README.md:
--------------------------------------------------------------------------------
1 | # 移动端H5日历组件
2 | 文档维护者:`孙尊路 `
3 |
4 | 喜欢的话,记得`star` 一下噢!
5 |
6 | ## 适用场景
7 |
8 | - 该组件目前仅适用于移动端H5页面展示,后期高级用法中会讲述到如何基于日历基类实现自定义模板传入。(即:开发者只需要传入自己的模板即可实现出自己的优美的日历出来。) `本篇主要是带大家入门日历组件的使用,该文档后面会持续优化更新。若有不足,请大家多多指教,小编会及时更正!`
9 |
10 |
11 | ## 实例展示
12 | 
13 |
14 |
15 | - [日历示例演示,支持滑动屏幕左右切换等效果](http://ydyfcs.epoint.com.cn:8066/H5/Attaches/%E6%97%A5%E5%8E%86%E7%BB%84%E4%BB%B6/calendar_showcase/calendar_showcase.html) ` 注:按F12可在浏览器预览`
16 |
17 | - 示例demo源代码(H5):[点击此处进行下载](https://github.com/sunzunlu/MobileCalendar)
18 |
19 |
20 | ## 典型项目应用案例
21 |
22 | - 【移动OA类】 我的日程
23 | - 【招投标类】 开标日程
24 |
25 | ## 依赖资源
26 |
27 | - `libs/calendar_base.js` 日历组件基类js库
28 | - `libs/calendar_base.css` 日历组件基类css库,可以根据业务需求,任意个性化,从而达到设计视觉效果
29 |
30 | ## 配置和使用方法
31 |
32 | __DOM结构__
33 |
34 | 一个`div`即可
35 |
36 | ```html
37 |
38 | ```
39 |
40 | __初始化__
41 |
42 | 以下代码是最简单的用法,更多复杂用法请参考`calendar_showcase`[源码下载](https://github.com/sunzunlu/MobileCalendar)
43 |
44 | ```js
45 | var calendar = new Calendar({
46 | // 日历容器
47 | container: "#calendar",
48 | // 点击日期事件
49 | onItemClick: function(item) {
50 | var defaultDate = item.date;
51 | }
52 | });
53 | ```
54 |
55 | __参数说明__
56 |
57 | | 参数 | 参数类型 | 说明 |
58 | | :------------- |:-------------:|:-------------|
59 | | container | string或HTMLElement | `必选` Calendar容器的css选择器,例如“#calendar”。默认为`#calendar` |
60 | | pre | string或HTMLElement | `可选` 前一个月按钮的css选择器或HTML元素。默认`.pre` |
61 | | next | string或HTMLElement | `可选`后一个月按钮的css选择器或HTML元素。默认`.next` |
62 | | backToToday | string或HTMLElement | `可选` 返回今天按钮的css选择器或HTML元素。默认`.backToToday` |
63 | | dataRequest | Function | `可选` 回调函数,绑定业务数据。例如:某天有日程,则会在对应日期上标识出一个小红点或者其他标识,默认传入数据格式:data=`[{"date":"2018-04-18"},{"date":"2018-04-17"},{"date":"2018-04-16"}]` |
64 | | onItemClick | Function | `必选` 回调函数,当你点击或轻触某日期 300ms后执行。回调日期结果:`2018-04-07` |
65 | | swipeCallback | Function | `可选` 回调函数,滑块释放时如果触发slider向后(左、上)切换则执行 |
66 | | template | Function或String | `可选`,元素渲染的模板,可以是一个模板字符串,也可以是一个函数,为函数时,确保返回模板字符串,默认组件内置模板 |
67 | | isDebug | Boolean | `可选`是否开启调试模式,默认`false` |
68 |
69 |
70 | # API
71 |
72 | 生成的`calendar`对象可以调用如下API
73 |
74 | ```js
75 | var calendar = new Calendar(...);
76 | ```
77 |
78 | ### refresh()
79 |
80 | 会销毁清空日历容器中的数据重新进行渲染。默认传入参数为空,刷新当前月份的日历数据。
81 |
82 | ```js
83 | calendar.refresh();
84 | ```
85 |
86 | 同时也可以手动传入某个日期渲染日历数据,例如:渲染出`2020-08-08`的日历如下:
87 |
88 | ```js
89 | calendar.refresh({
90 | year: "2020",
91 | month: "08",
92 | day: "08"
93 | });
94 | ```
95 |
96 | __参数说明__
97 |
98 | | 参数 | 参数类型 | 说明 |
99 | | :------------- |:-------------:|:-------------|
100 | | {} | object | `必选` 日期对象必须传入以下格式:{year:"2018",month:"04",day:"08"} |
101 |
102 | ### slidePrev()
103 |
104 | `切换为上一个月`,与组件内部传入参数`pre`作用一样,该API支持Promise异步成功回调里处理自己的业务逻辑。
105 |
106 | ```js
107 | calendar.slidePrev().then(...).then(...);
108 | ```
109 |
110 | ### slideNext()
111 |
112 | `切换为下一个月`,与组件内部传入参数`next`作用一样,该API支持Promise异步成功回调里处理自己的业务逻辑。
113 |
114 | ```js
115 | calendar.slideNext().then(...).then(...);
116 | ```
117 |
118 | ### addActiveStyleFordate()
119 |
120 | `给特定日期新增选中激活样式`,比如:把日期`2018-08-21`标记位已选中状态。
121 |
122 | ```js
123 | calendar.addActiveStyleFordate("2018-08-21");
124 | ```
125 | __参数说明__
126 |
127 | | 参数 | 参数类型 | 说明 |
128 | | :------------- |:-------------:|:-------------|
129 | | "2018-08-21" | String | `必选` 日期格式必须符合以下格式:2018-08-21 |
130 |
131 | ### refreshData()
132 |
133 | 会获取整个月的日历数据(`6 * 7 = 42`方格的日期),可根据该API自行个性化开发自己的日历组件,例如:
134 |
135 | ```js
136 | calendar.refreshData({
137 | year: "2018",
138 | month: "04",
139 | day: "08"
140 | },
141 | function(output, data) {
142 | console.log("==某个月的日历渲染数据:==" + JSON.stringify(data));
143 | console.log("==组件自带模板==" + output);
144 | });
145 |
146 | ```
147 | `输出日历数据格式:`
148 | ```js
149 | [{"day":25,"lunar":"初九","date":"2018-03-25","isforbid":"0"}]
150 | ```
151 |
152 | `输出内置组件模板格式:`
153 | ```html
154 |
155 | ```
156 | ## 优点和好处
157 | 能够极大方便实际项目上开发人员的上手使用,而且版本是不断根据实际项目上的需求进行优化升级的,开放源码可以让特殊需求的项目开发人员进行修改、补充和完善。
158 |
159 | ## 存在的不足之处
160 | 目前依赖js库有多个(mustache.min.js、mui.min.js)主要是一些常用的移动端js库(无可厚非),包含组件的核心库,或许有人认为影响加载速度之类的,其实已经有很多项目在应用效果还可以,当然了小编也正在努力`剥离第三方js库`,思路已经有了,只不过需要一点时间进行代码重构,若在此之前给你带来的不便,还请多多包涵,毕竟`优化组件`确实需要花费大量时间的。
161 |
--------------------------------------------------------------------------------
/calendar_showcase.html:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 |
11 |
12 | 日历组件
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | 上一月
32 |
33 |
34 | ...
35 |
36 |
37 | 下一月
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | 返回今天
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/css/mui.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * =====================================================
3 | * Mui v3.7.2 (http://dev.dcloud.net.cn/mui)
4 | * =====================================================
5 | *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{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{font:inherit;margin:0;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input{line-height:normal}input[type=checkbox],input[type=radio]{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-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}*{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;outline:0;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent}body{font-family:'Helvetica Neue',Helvetica,sans-serif;font-size:17px;line-height:21px;color:#000;background-color:#efeff4;-webkit-overflow-scrolling:touch}a{text-decoration:none;color:#007aff}a:active{color:#0062cc}.mui-content{background-color:#efeff4;-webkit-overflow-scrolling:touch}.mui-bar-nav~.mui-content{padding-top:44px}.mui-bar-nav~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{top:44px}.mui-bar-header-secondary~.mui-content{padding-top:88px}.mui-bar-header-secondary~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{top:88px}.mui-bar-footer~.mui-content{padding-bottom:44px}.mui-bar-footer~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:44px}.mui-bar-footer-secondary~.mui-content{padding-bottom:88px}.mui-bar-footer-secondary~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:88px}.mui-bar-tab~.mui-content{padding-bottom:50px}.mui-bar-tab~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:50px}.mui-bar-footer-secondary-tab~.mui-content{padding-bottom:94px}.mui-bar-footer-secondary-tab~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:94px}.mui-content-padded{margin:10px}.mui-inline{display:inline-block;vertical-align:top}.mui-block{display:block!important}.mui-visibility{visibility:visible!important}.mui-hidden{display:none!important}.mui-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mui-ellipsis-2{display:-webkit-box;overflow:hidden;white-space:normal!important;text-overflow:ellipsis;word-wrap:break-word;-webkit-line-clamp:2;-webkit-box-orient:vertical}.mui-table{display:table;width:100%;table-layout:fixed}.mui-table-cell{position:relative;display:table-cell}.mui-text-left{text-align:left!important}.mui-text-center{text-align:center!important}.mui-text-justify{text-align:justify!important}.mui-text-right{text-align:right!important}.mui-pull-left{float:left}.mui-pull-right{float:right}.mui-list-unstyled{padding-left:0;list-style:none}.mui-list-inline{margin-left:-5px;padding-left:0;list-style:none}.mui-list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.mui-clearfix:after,.mui-clearfix:before{display:table;content:' '}.mui-clearfix:after{clear:both}.mui-bg-primary{background-color:#007aff}.mui-bg-positive{background-color:#4cd964}.mui-bg-negative{background-color:#dd524d}.mui-error{margin:88px 35px;padding:10px;border-radius:6px;background-color:#bbb}.mui-subtitle{font-size:15px}h1,h2,h3,h4,h5,h6{line-height:1;margin-top:5px;margin-bottom:5px}.mui-h1,h1{font-size:36px}.mui-h2,h2{font-size:30px}.mui-h3,h3{font-size:24px}.mui-h4,h4{font-size:18px}.mui-h5,h5{font-size:14px;font-weight:400;color:#8f8f94}.mui-h6,h6{font-size:12px;font-weight:400;color:#8f8f94}p{font-size:14px;margin-top:0;margin-bottom:10px;color:#8f8f94}.mui-row:after,.mui-row:before{display:table;content:' '}.mui-row:after{clear:both}.mui-col-sm-1,.mui-col-sm-10,.mui-col-sm-11,.mui-col-sm-12,.mui-col-sm-2,.mui-col-sm-3,.mui-col-sm-4,.mui-col-sm-5,.mui-col-sm-6,.mui-col-sm-7,.mui-col-sm-8,.mui-col-sm-9,.mui-col-xs-1,.mui-col-xs-10,.mui-col-xs-11,.mui-col-xs-12,.mui-col-xs-2,.mui-col-xs-3,.mui-col-xs-4,.mui-col-xs-5,.mui-col-xs-6,.mui-col-xs-7,.mui-col-xs-8,.mui-col-xs-9{position:relative;min-height:1px}.mui-row>[class*=mui-col-]{float:left}.mui-col-xs-12{width:100%}.mui-col-xs-11{width:91.66666667%}.mui-col-xs-10{width:83.33333333%}.mui-col-xs-9{width:75%}.mui-col-xs-8{width:66.66666667%}.mui-col-xs-7{width:58.33333333%}.mui-col-xs-6{width:50%}.mui-col-xs-5{width:41.66666667%}.mui-col-xs-4{width:33.33333333%}.mui-col-xs-3{width:25%}.mui-col-xs-2{width:16.66666667%}.mui-col-xs-1{width:8.33333333%}@media (min-width:400px){.mui-col-sm-12{width:100%}.mui-col-sm-11{width:91.66666667%}.mui-col-sm-10{width:83.33333333%}.mui-col-sm-9{width:75%}.mui-col-sm-8{width:66.66666667%}.mui-col-sm-7{width:58.33333333%}.mui-col-sm-6{width:50%}.mui-col-sm-5{width:41.66666667%}.mui-col-sm-4{width:33.33333333%}.mui-col-sm-3{width:25%}.mui-col-sm-2{width:16.66666667%}.mui-col-sm-1{width:8.33333333%}}.mui-scroll-wrapper{position:absolute;z-index:2;top:0;bottom:0;left:0;overflow:hidden;width:100%}.mui-scroll{position:absolute;z-index:1;width:100%}.mui-scrollbar{position:absolute;z-index:9998;overflow:hidden;-webkit-transition:500ms;transition:500ms;transform:translateZ(0px);pointer-events:none;opacity:0}.mui-scrollbar-vertical{top:0;right:1px;bottom:2px;width:4px}.mui-scrollbar-vertical .mui-scrollbar-indicator{width:100%}.mui-scrollbar-horizontal{right:2px;bottom:0;left:2px;height:4px}.mui-scrollbar-horizontal .mui-scrollbar-indicator{height:100%}.mui-scrollbar-indicator{position:absolute;display:block;box-sizing:border-box;-webkit-transition:.01s cubic-bezier(.1,.57,.1,1);transition:.01s cubic-bezier(.1,.57,.1,1);transform:translate(0px,0) translateZ(0px);border:1px solid rgba(255,255,255,.80196);border-radius:2px;background:rgba(0,0,0,.39804)}.mui-plus-pullrefresh .mui-fullscreen .mui-scroll-wrapper .mui-scroll-wrapper,.mui-plus-pullrefresh .mui-fullscreen .mui-slider-group .mui-scroll-wrapper{position:absolute;top:0;bottom:0;left:0;overflow:hidden;width:100%}.mui-plus-pullrefresh .mui-fullscreen .mui-scroll-wrapper .mui-scroll,.mui-plus-pullrefresh .mui-fullscreen .mui-slider-group .mui-scroll{position:absolute;width:100%}.mui-plus-pullrefresh .mui-scroll-wrapper,.mui-plus-pullrefresh .mui-slider-group{position:static;top:auto;bottom:auto;left:auto;overflow:auto;width:auto}.mui-plus-pullrefresh .mui-slider-group{overflow:visible}.mui-plus-pullrefresh .mui-scroll{position:static;width:auto}.mui-off-canvas-wrap .mui-bar{position:absolute!important;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-box-shadow:none;box-shadow:none}.mui-off-canvas-wrap{position:relative;z-index:1;overflow:hidden;width:100%;height:100%}.mui-off-canvas-wrap .mui-inner-wrap{position:relative;z-index:1;width:100%;height:100%}.mui-off-canvas-wrap .mui-inner-wrap.mui-transitioning{-webkit-transition:-webkit-transform 350ms;transition:transform 350ms cubic-bezier(.165,.84,.44,1)}.mui-off-canvas-wrap .mui-inner-wrap .mui-off-canvas-left{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mui-off-canvas-wrap .mui-inner-wrap .mui-off-canvas-right{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mui-off-canvas-wrap.mui-active{overflow:hidden;height:100%}.mui-off-canvas-wrap.mui-active .mui-off-canvas-backdrop{position:absolute;z-index:998;top:0;right:0;bottom:0;left:0;display:block;transition:background 350ms cubic-bezier(.165,.84,.44,1);background:rgba(0,0,0,.4);box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);-webkit-tap-highlight-color:transparent}.mui-off-canvas-wrap.mui-slide-in .mui-off-canvas-right{z-index:10000!important;-webkit-transform:translate3d(100%,0,0)}.mui-off-canvas-wrap.mui-slide-in .mui-off-canvas-left{z-index:10000!important;-webkit-transform:translate3d(-100%,0,0)}.mui-off-canvas-left,.mui-off-canvas-right{position:absolute;z-index:-1;top:0;bottom:0;visibility:hidden;box-sizing:content-box;width:70%;min-height:100%;background:#333;-webkit-overflow-scrolling:touch}.mui-off-canvas-left.mui-transitioning,.mui-off-canvas-right.mui-transitioning{-webkit-transition:-webkit-transform 350ms cubic-bezier(.165,.84,.44,1);transition:transform 350ms cubic-bezier(.165,.84,.44,1)}.mui-off-canvas-left{left:0}.mui-off-canvas-right{right:0}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable{background-color:#333}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-left,.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-right{width:80%;-webkit-transform:scale(.8);transform:scale(.8);opacity:.1}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-left.mui-transitioning,.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-right.mui-transitioning{-webkit-transition:-webkit-transform 350ms cubic-bezier(.165,.84,.44,1),opacity 350ms cubic-bezier(.165,.84,.44,1);transition:transform 350ms cubic-bezier(.165,.84,.44,1),opacity 350ms cubic-bezier(.165,.84,.44,1)}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-left{-webkit-transform-origin:-100%;transform-origin:-100%}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-right{-webkit-transform-origin:200%;transform-origin:200%}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable.mui-active>.mui-inner-wrap{-webkit-transform:scale(.8);transform:scale(.8)}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable.mui-active>.mui-off-canvas-left,.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable.mui-active>.mui-off-canvas-right{-webkit-transform:scale(1);transform:scale(1);opacity:1}.mui-loading .mui-spinner{display:block;margin:0 auto}.mui-spinner{display:inline-block;width:24px;height:24px;-webkit-transform-origin:50%;transform-origin:50%;-webkit-animation:spinner-spin 1s step-end infinite;animation:spinner-spin 1s step-end infinite}.mui-spinner:after{display:block;width:100%;height:100%;content:'';background-image:url('data:image/svg+xml;charset=utf-8,');background-repeat:no-repeat;background-position:50%;background-size:100%}.mui-spinner-white:after{background-image:url('data:image/svg+xml;charset=utf-8,')}@-webkit-keyframes spinner-spin{0%{-webkit-transform:rotate(0deg)}8.33333333%{-webkit-transform:rotate(30deg)}16.66666667%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.33333333%{-webkit-transform:rotate(120deg)}41.66666667%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.33333333%{-webkit-transform:rotate(210deg)}66.66666667%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.33333333%{-webkit-transform:rotate(300deg)}91.66666667%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes spinner-spin{0%{transform:rotate(0deg)}8.33333333%{transform:rotate(30deg)}16.66666667%{transform:rotate(60deg)}25%{transform:rotate(90deg)}33.33333333%{transform:rotate(120deg)}41.66666667%{transform:rotate(150deg)}50%{transform:rotate(180deg)}58.33333333%{transform:rotate(210deg)}66.66666667%{transform:rotate(240deg)}75%{transform:rotate(270deg)}83.33333333%{transform:rotate(300deg)}91.66666667%{transform:rotate(330deg)}100%{transform:rotate(360deg)}}.mui-btn,button,input[type=button],input[type=reset],input[type=submit]{font-size:14px;font-weight:400;line-height:1.42;position:relative;display:inline-block;margin-bottom:0;padding:6px 12px;cursor:pointer;-webkit-transition:all;transition:all;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:.2s;transition-duration:.2s;text-align:center;vertical-align:top;white-space:nowrap;color:#333;border:1px solid #ccc;border-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;background-color:#fff;background-clip:padding-box}.mui-btn.mui-active:enabled,.mui-btn:enabled:active,button.mui-active:enabled,button:enabled:active,input[type=button].mui-active:enabled,input[type=button]:enabled:active,input[type=reset].mui-active:enabled,input[type=reset]:enabled:active,input[type=submit].mui-active:enabled,input[type=submit]:enabled:active{color:#fff;background-color:#929292}.mui-btn.mui-disabled,.mui-btn:disabled,button.mui-disabled,button:disabled,input[type=button].mui-disabled,input[type=button]:disabled,input[type=reset].mui-disabled,input[type=reset]:disabled,input[type=submit].mui-disabled,input[type=submit]:disabled{opacity:.6}.mui-btn-blue,.mui-btn-primary,input[type=submit]{color:#fff;border:1px solid #007aff;background-color:#007aff}.mui-btn-blue.mui-active:enabled,.mui-btn-blue:enabled:active,.mui-btn-primary.mui-active:enabled,.mui-btn-primary:enabled:active,input[type=submit].mui-active:enabled,input[type=submit]:enabled:active{color:#fff;border:1px solid #0062cc;background-color:#0062cc}.mui-btn-green,.mui-btn-positive,.mui-btn-success{color:#fff;border:1px solid #4cd964;background-color:#4cd964}.mui-btn-green.mui-active:enabled,.mui-btn-green:enabled:active,.mui-btn-positive.mui-active:enabled,.mui-btn-positive:enabled:active,.mui-btn-success.mui-active:enabled,.mui-btn-success:enabled:active{color:#fff;border:1px solid #2ac845;background-color:#2ac845}.mui-btn-warning,.mui-btn-yellow{color:#fff;border:1px solid #f0ad4e;background-color:#f0ad4e}.mui-btn-warning.mui-active:enabled,.mui-btn-warning:enabled:active,.mui-btn-yellow.mui-active:enabled,.mui-btn-yellow:enabled:active{color:#fff;border:1px solid #ec971f;background-color:#ec971f}.mui-btn-danger,.mui-btn-negative,.mui-btn-red{color:#fff;border:1px solid #dd524d;background-color:#dd524d}.mui-btn-danger.mui-active:enabled,.mui-btn-danger:enabled:active,.mui-btn-negative.mui-active:enabled,.mui-btn-negative:enabled:active,.mui-btn-red.mui-active:enabled,.mui-btn-red:enabled:active{color:#fff;border:1px solid #cf2d28;background-color:#cf2d28}.mui-btn-purple,.mui-btn-royal{color:#fff;border:1px solid #8a6de9;background-color:#8a6de9}.mui-btn-purple.mui-active:enabled,.mui-btn-purple:enabled:active,.mui-btn-royal.mui-active:enabled,.mui-btn-royal:enabled:active{color:#fff;border:1px solid #6641e2;background-color:#6641e2}.mui-btn-grey{color:#fff;border:1px solid #c7c7cc;background-color:#c7c7cc}.mui-btn-grey.mui-active:enabled,.mui-btn-grey:enabled:active{color:#fff;border:1px solid #acacb4;background-color:#acacb4}.mui-btn-outlined{background-color:transparent}.mui-btn-outlined.mui-btn-blue,.mui-btn-outlined.mui-btn-primary{color:#007aff}.mui-btn-outlined.mui-btn-green,.mui-btn-outlined.mui-btn-positive,.mui-btn-outlined.mui-btn-success{color:#4cd964}.mui-btn-outlined.mui-btn-warning,.mui-btn-outlined.mui-btn-yellow{color:#f0ad4e}.mui-btn-outlined.mui-btn-danger,.mui-btn-outlined.mui-btn-negative,.mui-btn-outlined.mui-btn-red{color:#dd524d}.mui-btn-outlined.mui-btn-purple,.mui-btn-outlined.mui-btn-royal{color:#8a6de9}.mui-btn-outlined.mui-btn-blue:enabled:active,.mui-btn-outlined.mui-btn-danger:enabled:active,.mui-btn-outlined.mui-btn-green:enabled:active,.mui-btn-outlined.mui-btn-negative:enabled:active,.mui-btn-outlined.mui-btn-positive:enabled:active,.mui-btn-outlined.mui-btn-primary:enabled:active,.mui-btn-outlined.mui-btn-purple:enabled:active,.mui-btn-outlined.mui-btn-red:enabled:active,.mui-btn-outlined.mui-btn-royal:enabled:active,.mui-btn-outlined.mui-btn-success:enabled:active,.mui-btn-outlined.mui-btn-warning:enabled:active,.mui-btn-outlined.mui-btn-yellow:enabled:active{color:#fff}.mui-btn-link{padding-top:6px;padding-bottom:6px;color:#007aff;border:0;background-color:transparent}.mui-btn-link.mui-active:enabled,.mui-btn-link:enabled:active{color:#0062cc;background-color:transparent}.mui-btn-block{font-size:18px;display:block;width:100%;margin-bottom:10px;padding:15px 0}.mui-btn .mui-badge{font-size:14px;margin:-2px -4px -2px 4px;background-color:rgba(0,0,0,.15)}.mui-btn .mui-badge-inverted,.mui-btn:enabled:active .mui-badge-inverted{background-color:transparent}.mui-btn-negative:enabled:active .mui-badge-inverted,.mui-btn-positive:enabled:active .mui-badge-inverted,.mui-btn-primary:enabled:active .mui-badge-inverted{color:#fff}.mui-btn-block .mui-badge{position:absolute;right:0;margin-right:10px}.mui-btn .mui-icon{font-size:inherit}.mui-btn.mui-icon{font-size:14px;line-height:1.42}.mui-btn.mui-fab{width:56px;height:56px;padding:16px;border-radius:50%;outline:0}.mui-btn.mui-fab.mui-btn-mini{width:40px;height:40px;padding:8px}.mui-btn.mui-fab .mui-icon{font-size:24px;line-height:24px;width:24px;height:24px}.mui-btn .mui-spinner{width:14px;height:14px;vertical-align:text-bottom}.mui-btn-block .mui-spinner{width:22px;height:22px}.mui-bar{position:fixed;z-index:10;right:0;left:0;height:44px;padding-right:10px;padding-left:10px;border-bottom:0;background-color:#f7f7f7;-webkit-box-shadow:0 0 1px rgba(0,0,0,.85);box-shadow:0 0 1px rgba(0,0,0,.85);-webkit-backface-visibility:hidden;backface-visibility:hidden}.mui-bar .mui-title{right:40px;left:40px;display:inline-block;overflow:hidden;width:auto;margin:0;text-overflow:ellipsis}.mui-bar .mui-backdrop{background:0 0}.mui-bar-header-secondary{top:44px}.mui-bar-footer{bottom:0}.mui-bar-footer-secondary{bottom:44px}.mui-bar-footer-secondary-tab{bottom:50px}.mui-bar-footer,.mui-bar-footer-secondary,.mui-bar-footer-secondary-tab{border-top:0}.mui-bar-transparent{top:0;background-color:rgba(247,247,247,0);-webkit-box-shadow:none;box-shadow:none}.mui-bar-nav{top:0;-webkit-box-shadow:0 1px 6px #ccc;box-shadow:0 1px 6px #ccc}.mui-bar-nav~.mui-content .mui-anchor{display:block;visibility:hidden;height:45px;margin-top:-45px}.mui-bar-nav.mui-bar .mui-icon{margin-right:-10px;margin-left:-10px;padding-right:10px;padding-left:10px}.mui-title{font-size:17px;font-weight:500;line-height:44px;position:absolute;display:block;width:100%;margin:0 -10px;padding:0;text-align:center;white-space:nowrap;color:#000}.mui-title a{color:inherit}.mui-bar-tab{bottom:0;display:table;width:100%;height:50px;padding:0;table-layout:fixed;border-top:0;border-bottom:0;-webkit-touch-callout:none}.mui-bar-tab .mui-tab-item{display:table-cell;overflow:hidden;width:1%;height:50px;text-align:center;vertical-align:middle;white-space:nowrap;text-overflow:ellipsis;color:#929292}.mui-bar-tab .mui-tab-item.mui-active{color:#007aff}.mui-bar-tab .mui-tab-item .mui-icon{top:3px;width:24px;height:24px;padding-top:0;padding-bottom:0}.mui-bar-tab .mui-tab-item .mui-icon~.mui-tab-label{font-size:11px;display:block;overflow:hidden;text-overflow:ellipsis}.mui-bar-tab .mui-tab-item .mui-icon:active{background:0 0}.mui-focusin>.mui-bar-header-secondary,.mui-focusin>.mui-bar-nav{position:absolute}.mui-focusin>.mui-bar~.mui-content{padding-bottom:0}.mui-bar .mui-btn{font-weight:400;position:relative;z-index:20;top:7px;margin-top:0;padding:6px 12px 7px}.mui-bar .mui-btn.mui-pull-right{margin-left:10px}.mui-bar .mui-btn.mui-pull-left{margin-right:10px}.mui-bar .mui-btn-link{font-size:16px;line-height:44px;top:0;padding:0;color:#007aff;border:0}.mui-bar .mui-btn-link.mui-active,.mui-bar .mui-btn-link:active{color:#0062cc}.mui-bar .mui-btn-block{font-size:16px;top:6px;margin-bottom:0;padding:5px 0}.mui-bar .mui-btn-nav.mui-pull-left{margin-left:-5px}.mui-bar .mui-btn-nav.mui-pull-left .mui-icon-left-nav{margin-right:-3px}.mui-bar .mui-btn-nav.mui-pull-right{margin-right:-5px}.mui-bar .mui-btn-nav.mui-pull-right .mui-icon-right-nav{margin-left:-3px}.mui-bar .mui-btn-nav:active{opacity:.3}.mui-bar .mui-icon{font-size:24px;position:relative;z-index:20;padding-top:10px;padding-bottom:10px}.mui-bar .mui-icon:active{opacity:.3}.mui-bar .mui-btn .mui-icon{top:1px;margin:0;padding:0}.mui-bar .mui-title .mui-icon{margin:0;padding:0}.mui-bar .mui-title .mui-icon.mui-icon-caret{top:4px;margin-left:-5px}.mui-bar input[type=search]{height:29px;margin:6px 0}.mui-bar .mui-input-row .mui-btn{padding:12px 10px}.mui-bar .mui-search:before{margin-top:-10px}.mui-bar .mui-input-row .mui-input-clear~.mui-icon-clear,.mui-bar .mui-input-row .mui-input-speech~.mui-icon-speech{top:0;right:12px}.mui-bar.mui-bar-header-secondary .mui-input-row .mui-input-clear~.mui-icon-clear,.mui-bar.mui-bar-header-secondary .mui-input-row .mui-input-speech~.mui-icon-speech{top:0;right:0}.mui-bar .mui-segmented-control{top:7px;width:auto;margin:0 auto}.mui-bar.mui-bar-header-secondary .mui-segmented-control{top:0}.mui-badge{font-size:12px;line-height:1;display:inline-block;padding:3px 6px;color:#333;border-radius:100px;background-color:rgba(0,0,0,.15)}.mui-badge.mui-badge-inverted{padding:0 5px 0 0;color:#929292;background-color:transparent}.mui-badge-blue,.mui-badge-primary{color:#fff;background-color:#007aff}.mui-badge-blue.mui-badge-inverted,.mui-badge-primary.mui-badge-inverted{color:#007aff;background-color:transparent}.mui-badge-green,.mui-badge-success{color:#fff;background-color:#4cd964}.mui-badge-green.mui-badge-inverted,.mui-badge-success.mui-badge-inverted{color:#4cd964;background-color:transparent}.mui-badge-warning,.mui-badge-yellow{color:#fff;background-color:#f0ad4e}.mui-badge-warning.mui-badge-inverted,.mui-badge-yellow.mui-badge-inverted{color:#f0ad4e;background-color:transparent}.mui-badge-danger,.mui-badge-red{color:#fff;background-color:#dd524d}.mui-badge-danger.mui-badge-inverted,.mui-badge-red.mui-badge-inverted{color:#dd524d;background-color:transparent}.mui-badge-purple,.mui-badge-royal{color:#fff;background-color:#8a6de9}.mui-badge-purple.mui-badge-inverted,.mui-badge-royal.mui-badge-inverted{color:#8a6de9;background-color:transparent}.mui-icon .mui-badge{font-size:10px;line-height:1.4;position:absolute;top:-2px;left:100%;margin-left:-10px;padding:1px 5px;color:#fff;background:red}.mui-card{font-size:14px;position:relative;overflow:hidden;margin:10px;border-radius:2px;background-color:#fff;background-clip:padding-box;box-shadow:0 1px 2px rgba(0,0,0,.3)}.mui-content>.mui-card:first-child{margin-top:15px}.mui-card .mui-input-group .mui-input-row:last-child:after,.mui-card .mui-input-group .mui-input-row:last-child:before,.mui-card .mui-input-group:after,.mui-card .mui-input-group:before{height:0}.mui-card .mui-table-view{margin-bottom:0;border-top:0;border-bottom:0;border-radius:6px}.mui-card .mui-table-view .mui-table-view-cell:first-child,.mui-card .mui-table-view .mui-table-view-divider:first-child{top:0;border-top-left-radius:6px;border-top-right-radius:6px}.mui-card .mui-table-view .mui-table-view-cell:last-child,.mui-card .mui-table-view .mui-table-view-divider:last-child{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.mui-card .mui-table-view:after,.mui-card .mui-table-view:before,.mui-card>.mui-table-view>.mui-table-view-cell:last-child:after,.mui-card>.mui-table-view>.mui-table-view-cell:last-child:before{height:0}.mui-card-footer,.mui-card-header{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;min-height:44px;padding:10px 15px;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.mui-card-footer .mui-card-link,.mui-card-header .mui-card-link{line-height:44px;position:relative;display:-webkit-box;display:-webkit-flex;display:flex;height:44px;margin-top:-10px;margin-bottom:-10px;-webkit-transition-duration:.3s;transition-duration:.3s;text-decoration:none;-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.mui-card-footer:before,.mui-card-header:after{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-card-header{font-size:17px;border-radius:2px 2px 0 0}.mui-card-header:after{top:auto;bottom:0}.mui-card-header>img:first-child{font-size:0;line-height:0;float:left;width:34px;height:34px}.mui-card-footer{color:#6d6d72;border-radius:0 0 2px 2px}.mui-card-content{font-size:14px;position:relative}.mui-card-content-inner{position:relative;padding:15px}.mui-card-media{vertical-align:bottom;color:#fff;background-position:center;background-size:cover}.mui-card-header.mui-card-media{display:block;padding:10px}.mui-card-header.mui-card-media .mui-media-body{font-size:14px;font-weight:500;line-height:17px;margin-bottom:0;margin-left:44px;color:#333}.mui-card-header.mui-card-media .mui-media-body p{font-size:13px;margin-bottom:0}.mui-table-view{position:relative;margin-top:0;margin-bottom:0;padding-left:0;list-style:none;background-color:#fff}.mui-table-view:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view:before{position:absolute;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc;top:-1px}.mui-table-view-icon .mui-table-view-cell .mui-navigate-right .mui-icon{font-size:20px;margin-top:-1px;margin-right:5px;margin-left:-5px}.mui-table-view-icon .mui-table-view-cell:after{left:40px}.mui-table-view-chevron .mui-table-view-cell{padding-right:65px}.mui-table-view-chevron .mui-table-view-cell>a:not(.mui-btn){margin-right:-65px}.mui-table-view-radio .mui-table-view-cell{padding-right:65px}.mui-table-view-radio .mui-table-view-cell>a:not(.mui-btn){margin-right:-65px}.mui-table-view-radio .mui-table-view-cell .mui-navigate-right:after{font-size:30px;font-weight:600;right:9px;content:'';color:#007aff}.mui-table-view-radio .mui-table-view-cell.mui-selected .mui-navigate-right:after{content:'\e472'}.mui-table-view-inverted{color:#fff;background:#333}.mui-table-view-inverted:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#222}.mui-table-view-inverted:before{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#222}.mui-table-view-inverted .mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:15px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#222}.mui-table-view-inverted .mui-table-view-cell.mui-active,.mui-table-view-inverted .mui-table-view-cell>a:not(.mui-btn).mui-active{background-color:#242424}.mui-table-view-cell{position:relative;overflow:hidden;padding:11px 15px;-webkit-touch-callout:none}.mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:15px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view-cell.mui-checkbox input[type=checkbox],.mui-table-view-cell.mui-radio input[type=radio]{top:8px}.mui-table-view-cell.mui-checkbox.mui-left,.mui-table-view-cell.mui-radio.mui-left{padding-left:58px}.mui-table-view-cell.mui-active{background-color:#eee}.mui-table-view-cell:last-child:after,.mui-table-view-cell:last-child:before{height:0}.mui-table-view-cell>a:not(.mui-btn){position:relative;display:block;overflow:hidden;margin:-11px -15px;padding:inherit;white-space:nowrap;text-overflow:ellipsis;color:inherit}.mui-table-view-cell>a:not(.mui-btn).mui-active{background-color:#eee}.mui-table-view-cell p{margin-bottom:0}.mui-table-view-cell.mui-transitioning>.mui-slider-handle,.mui-table-view-cell.mui-transitioning>.mui-slider-left .mui-btn,.mui-table-view-cell.mui-transitioning>.mui-slider-right .mui-btn{-webkit-transition:-webkit-transform 300ms ease;transition:transform 300ms ease}.mui-table-view-cell.mui-active>.mui-slider-handle{background-color:#eee}.mui-table-view-cell>.mui-slider-handle{position:relative;background-color:#fff}.mui-table-view-cell>.mui-slider-handle .mui-navigate-right:after,.mui-table-view-cell>.mui-slider-handle.mui-navigate-right:after{right:0}.mui-table-view-cell>.mui-slider-handle,.mui-table-view-cell>.mui-slider-left .mui-btn,.mui-table-view-cell>.mui-slider-right .mui-btn{-webkit-transition:-webkit-transform 0ms ease;transition:transform 0ms ease}.mui-table-view-cell>.mui-slider-left,.mui-table-view-cell>.mui-slider-right{position:absolute;top:0;display:-webkit-box;display:-webkit-flex;display:flex;height:100%}.mui-table-view-cell>.mui-slider-left>.mui-btn,.mui-table-view-cell>.mui-slider-right>.mui-btn{position:relative;left:0;display:-webkit-box;display:-webkit-flex;display:flex;padding:0 30px;color:#fff;border:0;border-radius:0;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.mui-table-view-cell>.mui-slider-left>.mui-btn:after,.mui-table-view-cell>.mui-slider-right>.mui-btn:after{position:absolute;z-index:-1;top:0;width:600%;height:100%;content:'';background:inherit}.mui-table-view-cell>.mui-slider-left>.mui-btn.mui-icon,.mui-table-view-cell>.mui-slider-right>.mui-btn.mui-icon{font-size:30px}.mui-table-view-cell>.mui-slider-right{right:0;-webkit-transition:-webkit-transform 0ms ease;transition:transform 0ms ease;-webkit-transform:translateX(100%);transform:translateX(100%)}.mui-table-view-cell>.mui-slider-left{left:0;-webkit-transition:-webkit-transform 0ms ease;transition:transform 0ms ease;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.mui-table-view-cell>.mui-slider-left>.mui-btn:after{right:100%;margin-right:-1px}.mui-table-view-divider{font-weight:500;position:relative;margin-top:-1px;margin-left:0;padding-top:6px;padding-bottom:6px;padding-left:15px;color:#999;background-color:#fafafa}.mui-table-view-divider:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view-divider:before{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view .mui-media,.mui-table-view .mui-media-body{overflow:hidden}.mui-table-view .mui-media-large .mui-media-object{line-height:80px;max-width:80px;height:80px}.mui-table-view .mui-media .mui-subtitle{color:#000}.mui-table-view .mui-media-object{line-height:42px;max-width:42px;height:42px}.mui-table-view .mui-media-object.mui-pull-left{margin-right:10px}.mui-table-view .mui-media-object.mui-pull-right{margin-left:10px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object{line-height:29px;max-width:29px;height:29px;margin:-4px 0}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object img{line-height:29px;max-width:29px;height:29px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object.mui-pull-left{margin-right:10px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object .mui-icon{font-size:29px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-body:after{position:absolute;right:0;bottom:0;left:55px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view .mui-table-view-cell.mui-media-icon:after{height:0!important}.mui-table-view.mui-unfold .mui-table-view-cell.mui-collapse .mui-table-view{display:block}.mui-table-view.mui-unfold .mui-table-view-cell.mui-collapse .mui-table-view:after,.mui-table-view.mui-unfold .mui-table-view-cell.mui-collapse .mui-table-view:before{height:0!important}.mui-table-view.mui-unfold .mui-table-view-cell.mui-media-icon.mui-collapse .mui-media-body:after{position:absolute;right:0;bottom:0;left:70px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view-cell>.mui-badge,.mui-table-view-cell>.mui-btn,.mui-table-view-cell>.mui-switch,.mui-table-view-cell>a>.mui-badge,.mui-table-view-cell>a>.mui-btn,.mui-table-view-cell>a>.mui-switch{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mui-table-view-cell .mui-navigate-right>.mui-badge,.mui-table-view-cell .mui-navigate-right>.mui-btn,.mui-table-view-cell .mui-navigate-right>.mui-switch,.mui-table-view-cell .mui-push-left>.mui-badge,.mui-table-view-cell .mui-push-left>.mui-btn,.mui-table-view-cell .mui-push-left>.mui-switch,.mui-table-view-cell .mui-push-right>.mui-badge,.mui-table-view-cell .mui-push-right>.mui-btn,.mui-table-view-cell .mui-push-right>.mui-switch,.mui-table-view-cell>a .mui-navigate-right>.mui-badge,.mui-table-view-cell>a .mui-navigate-right>.mui-btn,.mui-table-view-cell>a .mui-navigate-right>.mui-switch,.mui-table-view-cell>a .mui-push-left>.mui-badge,.mui-table-view-cell>a .mui-push-left>.mui-btn,.mui-table-view-cell>a .mui-push-left>.mui-switch,.mui-table-view-cell>a .mui-push-right>.mui-badge,.mui-table-view-cell>a .mui-push-right>.mui-btn,.mui-table-view-cell>a .mui-push-right>.mui-switch{right:35px}.mui-content>.mui-table-view:first-child{margin-top:15px}.mui-table-view-cell.mui-collapse .mui-table-view .mui-table-view-cell:last-child:after,.mui-table-view-cell.mui-collapse .mui-table-view:after,.mui-table-view-cell.mui-collapse .mui-table-view:before{height:0}.mui-table-view-cell.mui-collapse>.mui-navigate-right:after,.mui-table-view-cell.mui-collapse>.mui-push-right:after{content:'\e581'}.mui-table-view-cell.mui-collapse.mui-active{margin-top:-1px}.mui-table-view-cell.mui-collapse.mui-active .mui-collapse-content,.mui-table-view-cell.mui-collapse.mui-active .mui-table-view{display:block}.mui-table-view-cell.mui-collapse.mui-active>.mui-navigate-right:after,.mui-table-view-cell.mui-collapse.mui-active>.mui-push-right:after{content:'\e580'}.mui-table-view-cell.mui-collapse.mui-active .mui-table-view-cell>a:not(.mui-btn).mui-active{margin-left:-31px;padding-left:47px}.mui-table-view-cell.mui-collapse .mui-collapse-content{position:relative;display:none;overflow:hidden;margin:11px -15px -11px;padding:8px 15px;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease;background:#fff}.mui-table-view-cell.mui-collapse .mui-collapse-content>.mui-input-group,.mui-table-view-cell.mui-collapse .mui-collapse-content>.mui-slider{width:auto;height:auto;margin:-8px -15px}.mui-table-view-cell.mui-collapse .mui-collapse-content>.mui-slider{margin:-8px -16px}.mui-table-view-cell.mui-collapse .mui-table-view{display:none;margin-top:11px;margin-right:-15px;margin-bottom:-11px;margin-left:-15px;border:0}.mui-table-view-cell.mui-collapse .mui-table-view.mui-table-view-chevron{margin-right:-65px}.mui-table-view-cell.mui-collapse .mui-table-view .mui-table-view-cell{padding-left:31px;background-position:31px 100%}.mui-table-view-cell.mui-collapse .mui-table-view .mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:30px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view.mui-grid-view{font-size:0;display:block;width:100%;padding:0 10px 10px 0;white-space:normal}.mui-table-view.mui-grid-view .mui-table-view-cell{font-size:17px;display:inline-block;margin-right:-4px;padding:10px 0 0 14px;text-align:center;vertical-align:middle;background:0 0}.mui-table-view.mui-grid-view .mui-table-view-cell .mui-media-object{width:100%;max-width:100%;height:auto}.mui-table-view.mui-grid-view .mui-table-view-cell>a:not(.mui-btn){margin:-10px 0 0 -14px}.mui-table-view.mui-grid-view .mui-table-view-cell>a:not(.mui-btn).mui-active,.mui-table-view.mui-grid-view .mui-table-view-cell>a:not(.mui-btn):active{background:0 0}.mui-table-view.mui-grid-view .mui-table-view-cell .mui-media-body{font-size:15px;line-height:15px;display:block;width:100%;height:15px;margin-top:8px;text-overflow:ellipsis;color:#333}.mui-table-view.mui-grid-view .mui-table-view-cell:after,.mui-table-view.mui-grid-view .mui-table-view-cell:before{height:0}.mui-grid-view.mui-grid-9{margin:0;padding:0;border-top:1px solid #eee;border-left:1px solid #eee;background-color:#f2f2f2}.mui-grid-view.mui-grid-9:after,.mui-grid-view.mui-grid-9:before{display:table;content:' '}.mui-grid-view.mui-grid-9:after{clear:both;position:static}.mui-grid-view.mui-grid-9 .mui-table-view-cell{margin:0;padding:11px 15px;vertical-align:top;border-right:1px solid #eee;border-bottom:1px solid #eee}.mui-grid-view.mui-grid-9 .mui-table-view-cell.mui-active{background-color:#eee}.mui-grid-view.mui-grid-9 .mui-table-view-cell>a:not(.mui-btn){margin:0;padding:10px 0}.mui-grid-view.mui-grid-9:before{height:0}.mui-grid-view.mui-grid-9 .mui-media{color:#797979}.mui-grid-view.mui-grid-9 .mui-media .mui-icon{font-size:2.4em;position:relative}.mui-slider-cell{position:relative}.mui-slider-cell>.mui-slider-handle{z-index:1}.mui-slider-cell>.mui-slider-left,.mui-slider-cell>.mui-slider-right{position:absolute;z-index:0;top:0;bottom:0}.mui-slider-cell>.mui-slider-left{left:0}.mui-slider-cell>.mui-slider-right{right:0}input,select,textarea{font-family:'Helvetica Neue',Helvetica,sans-serif;font-size:17px;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent}input:focus,select:focus,textarea:focus{-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;-webkit-user-modify:read-write-plaintext-only}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{line-height:21px;width:100%;height:40px;margin-bottom:15px;padding:10px 15px;-webkit-user-select:text;border:1px solid rgba(0,0,0,.2);border-radius:3px;outline:0;background-color:#fff;-webkit-appearance:none}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{margin:0;-webkit-appearance:none}input[type=search]{font-size:16px;-webkit-box-sizing:border-box;box-sizing:border-box;height:34px;text-align:center;border:0;border-radius:6px;background-color:rgba(0,0,0,.1)}input[type=search]:focus{text-align:left}textarea{height:auto;resize:none}select{font-size:14px;height:auto;margin-top:1px;border:0!important;background-color:#fff}select:focus{-webkit-user-modify:read-only}.mui-input-group{position:relative;padding:0;border:0;background-color:#fff}.mui-input-group:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-input-group:before{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-input-group input,.mui-input-group textarea{margin-bottom:0;border:0;border-radius:0;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.mui-input-group input[type=search]{background:0 0}.mui-input-group input:last-child{background-image:none}.mui-input-row{clear:left;overflow:hidden}.mui-input-row select{font-size:17px;height:37px;padding:0}.mui-input-row .mui-btn+input,.mui-input-row label+input,.mui-input-row:last-child{background:0 0}.mui-input-group .mui-input-row{height:40px}.mui-input-group .mui-input-row:after{position:absolute;right:0;bottom:0;left:15px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-input-row label{font-family:'Helvetica Neue',Helvetica,sans-serif;line-height:1.1;float:left;width:35%;padding:11px 15px}.mui-input-row label~input,.mui-input-row label~select,.mui-input-row label~textarea{float:right;width:65%;margin-bottom:0;padding-left:0;border:0}.mui-input-row .mui-btn{line-height:1.1;float:right;width:15%;padding:10px 15px}.mui-input-row .mui-btn~input,.mui-input-row .mui-btn~select,.mui-input-row .mui-btn~textarea{float:left;width:85%;margin-bottom:0;padding-left:0;border:0}.mui-button-row{position:relative;padding-top:5px;text-align:center}.mui-input-group .mui-button-row{height:45px}.mui-input-row{position:relative}.mui-input-row.mui-input-range{overflow:visible;padding-right:20px}.mui-input-row .mui-inline{padding:8px 0}.mui-input-row .mui-input-clear~.mui-icon-clear,.mui-input-row .mui-input-password~.mui-icon-eye,.mui-input-row .mui-input-speech~.mui-icon-speech{font-size:20px;position:absolute;z-index:1;top:10px;right:0;width:38px;height:38px;text-align:center;color:#999}.mui-input-row .mui-input-clear~.mui-icon-clear.mui-active,.mui-input-row .mui-input-password~.mui-icon-eye.mui-active,.mui-input-row .mui-input-speech~.mui-icon-speech.mui-active{color:#007aff}.mui-input-row .mui-input-speech~.mui-icon-speech{font-size:24px;top:8px}.mui-input-row .mui-input-clear~.mui-icon-clear~.mui-icon-speech{display:none}.mui-input-row .mui-input-clear~.mui-icon-clear.mui-hidden~.mui-icon-speech{display:inline-block}.mui-input-row .mui-icon-speech~.mui-placeholder{right:38px}.mui-input-row.mui-search .mui-icon-clear{top:7px}.mui-input-row.mui-search .mui-icon-speech{top:5px}.mui-checkbox,.mui-radio{position:relative}.mui-checkbox label,.mui-radio label{display:inline-block;float:none;width:100%;padding-right:58px}.mui-checkbox.mui-left input[type=checkbox],.mui-radio.mui-left input[type=radio]{left:20px}.mui-checkbox.mui-left label,.mui-radio.mui-left label{padding-right:15px;padding-left:58px}.mui-checkbox input[type=checkbox],.mui-radio input[type=radio]{position:absolute;top:4px;right:20px;display:inline-block;width:28px;height:26px;border:0;outline:0!important;background-color:transparent;-webkit-appearance:none}.mui-checkbox input[type=checkbox][disabled]:before,.mui-radio input[type=radio][disabled]:before{opacity:.3}.mui-checkbox input[type=checkbox]:before,.mui-radio input[type=radio]:before{font-family:Muiicons;font-size:28px;font-weight:400;line-height:1;text-decoration:none;color:#aaa;border-radius:0;background:0 0;-webkit-font-smoothing:antialiased}.mui-checkbox input[type=checkbox]:checked:before,.mui-radio input[type=radio]:checked:before{color:#007aff}.mui-checkbox label.mui-disabled,.mui-checkbox.mui-disabled label,.mui-radio label.mui-disabled,.mui-radio.mui-disabled label{opacity:.4}.mui-radio input[type=radio]:before{content:'\e411'}.mui-radio input[type=radio]:checked:before{content:'\e441'}.mui-checkbox input[type=checkbox]:before{content:'\e411'}.mui-checkbox input[type=checkbox]:checked:before{content:'\e442'}.mui-select{position:relative}.mui-select:before{font-family:Muiicons;position:absolute;top:8px;right:21px;content:'\e581';color:rgba(170,170,170,.6)}.mui-input-row .mui-switch{float:right;margin-top:5px;margin-right:20px}.mui-input-range input[type=range]{position:relative;width:100%;height:2px;margin:17px 0;padding:0;cursor:pointer;border:0;border-radius:3px;outline:0;background-color:#999;-webkit-appearance:none!important}.mui-input-range input[type=range]::-webkit-slider-thumb{width:28px;height:28px;border-color:#0062cc;border-radius:50%;background-color:#007aff;background-clip:padding-box;-webkit-appearance:none!important}.mui-input-range label~input[type=range]{width:65%}.mui-input-range .mui-tooltip{font-size:36px;line-height:64px;position:absolute;z-index:1;top:-70px;width:64px;height:64px;text-align:center;opacity:.8;color:#333;border:1px solid #ddd;border-radius:6px;background-color:#fff;text-shadow:0 1px 0 #f3f3f3}.mui-search{position:relative}.mui-search input[type=search]{padding-left:30px}.mui-search .mui-placeholder{font-size:16px;line-height:34px;position:absolute;z-index:1;top:0;right:0;bottom:0;left:0;display:inline-block;height:34px;text-align:center;color:#999;border:0;border-radius:6px;background:0 0}.mui-search .mui-placeholder .mui-icon{font-size:20px;color:#333}.mui-search:before{font-family:Muiicons;font-size:20px;font-weight:400;position:absolute;top:50%;right:50%;display:none;margin-top:-18px;margin-right:31px;content:'\e466'}.mui-search.mui-active:before{font-size:20px;right:auto;left:5px;display:block;margin-right:0}.mui-search.mui-active input[type=search]{text-align:left}.mui-search.mui-active .mui-placeholder{display:none}.mui-segmented-control{font-size:15px;font-weight:400;position:relative;display:table;overflow:hidden;width:100%;table-layout:fixed;border:1px solid #007aff;border-radius:3px;background-color:transparent;-webkit-touch-callout:none}.mui-segmented-control.mui-segmented-control-vertical{border-collapse:collapse;border-width:0;border-radius:0}.mui-segmented-control.mui-segmented-control-vertical .mui-control-item{display:block;border-bottom:1px solid #c8c7cc;border-left-width:0}.mui-segmented-control.mui-scroll-wrapper{height:38px}.mui-segmented-control.mui-scroll-wrapper .mui-scroll{width:auto;height:40px;white-space:nowrap}.mui-segmented-control.mui-scroll-wrapper .mui-control-item{display:inline-block;width:auto;padding:0 20px;border:0}.mui-segmented-control .mui-control-item{line-height:38px;display:table-cell;overflow:hidden;width:1%;-webkit-transition:background-color .1s linear;transition:background-color .1s linear;text-align:center;white-space:nowrap;text-overflow:ellipsis;color:#007aff;border-color:#007aff;border-left:1px solid #007aff}.mui-segmented-control .mui-control-item:first-child{border-left-width:0}.mui-segmented-control .mui-control-item.mui-active{color:#fff;background-color:#007aff}.mui-segmented-control.mui-segmented-control-inverted{width:100%;border:0;border-radius:0}.mui-segmented-control.mui-segmented-control-inverted.mui-segmented-control-vertical .mui-control-item,.mui-segmented-control.mui-segmented-control-inverted.mui-segmented-control-vertical .mui-control-item.mui-active{border-bottom:1px solid #c8c7cc}.mui-segmented-control.mui-segmented-control-inverted .mui-control-item{color:inherit;border:0}.mui-segmented-control.mui-segmented-control-inverted .mui-control-item.mui-active{color:#007aff;border-bottom:2px solid #007aff;background:0 0}.mui-segmented-control.mui-segmented-control-inverted~.mui-slider-progress-bar{background-color:#007aff}.mui-segmented-control-positive{border:1px solid #4cd964}.mui-segmented-control-positive .mui-control-item{color:#4cd964;border-color:inherit}.mui-segmented-control-positive .mui-control-item.mui-active{color:#fff;background-color:#4cd964}.mui-segmented-control-positive.mui-segmented-control-inverted .mui-control-item.mui-active{color:#4cd964;border-bottom:2px solid #4cd964;background:0 0}.mui-segmented-control-positive.mui-segmented-control-inverted~.mui-slider-progress-bar{background-color:#4cd964}.mui-segmented-control-negative{border:1px solid #dd524d}.mui-segmented-control-negative .mui-control-item{color:#dd524d;border-color:inherit}.mui-segmented-control-negative .mui-control-item.mui-active{color:#fff;background-color:#dd524d}.mui-segmented-control-negative.mui-segmented-control-inverted .mui-control-item.mui-active{color:#dd524d;border-bottom:2px solid #dd524d;background:0 0}.mui-segmented-control-negative.mui-segmented-control-inverted~.mui-slider-progress-bar{background-color:#dd524d}.mui-control-content{position:relative;display:none}.mui-control-content.mui-active{display:block}.mui-popover{position:absolute;z-index:999;display:none;width:280px;-webkit-transition:opacity .3s;transition:opacity .3s;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none;opacity:0;border-radius:7px;background-color:#f7f7f7;-webkit-box-shadow:0 0 15px rgba(0,0,0,.1);box-shadow:0 0 15px rgba(0,0,0,.1)}.mui-popover .mui-popover-arrow{position:absolute;z-index:1000;top:-25px;left:0;overflow:hidden;width:26px;height:26px}.mui-popover .mui-popover-arrow:after{position:absolute;top:19px;left:0;width:26px;height:26px;content:' ';-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:3px;background:#f7f7f7}.mui-popover .mui-popover-arrow.mui-bottom{top:100%;left:-26px;margin-top:-1px}.mui-popover .mui-popover-arrow.mui-bottom:after{top:-19px;left:0}.mui-popover.mui-popover-action{bottom:0;width:100%;-webkit-transition:-webkit-transform .3s,opacity .3s;transition:transform .3s,opacity .3s;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);border-radius:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.mui-popover.mui-popover-action .mui-popover-arrow{display:none}.mui-popover.mui-popover-action.mui-popover-bottom{position:fixed}.mui-popover.mui-popover-action.mui-active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mui-popover.mui-popover-action .mui-table-view{margin:8px;text-align:center;color:#007aff;border-radius:4px}.mui-popover.mui-popover-action .mui-table-view .mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-popover.mui-popover-action .mui-table-view small{font-weight:400;line-height:1.3;display:block}.mui-popover.mui-active{display:block;opacity:1}.mui-popover .mui-bar~.mui-table-view{padding-top:44px}.mui-backdrop{position:fixed;z-index:998;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.3)}.mui-bar-backdrop.mui-backdrop{bottom:50px;background:0 0}.mui-backdrop-action.mui-backdrop{background-color:rgba(0,0,0,.3)}.mui-backdrop-action.mui-backdrop,.mui-bar-backdrop.mui-backdrop{opacity:0}.mui-backdrop-action.mui-backdrop.mui-active,.mui-bar-backdrop.mui-backdrop.mui-active{-webkit-transition:all .4s ease;transition:all .4s ease;opacity:1}.mui-popover .mui-btn-block{margin-bottom:5px}.mui-popover .mui-btn-block:last-child{margin-bottom:0}.mui-popover .mui-bar{-webkit-box-shadow:none;box-shadow:none}.mui-popover .mui-bar-nav{border-bottom:1px solid rgba(0,0,0,.15);border-top-left-radius:12px;border-top-right-radius:12px;-webkit-box-shadow:none;box-shadow:none}.mui-popover .mui-scroll-wrapper{margin:7px 0;border-radius:7px;background-clip:padding-box}.mui-popover .mui-scroll .mui-table-view{max-height:none}.mui-popover .mui-table-view{overflow:auto;max-height:300px;margin-bottom:0;border-radius:7px;background-color:#f7f7f7;background-image:none;-webkit-overflow-scrolling:touch}.mui-popover .mui-table-view:after,.mui-popover .mui-table-view:before{height:0}.mui-popover .mui-table-view .mui-table-view-cell:first-child,.mui-popover .mui-table-view .mui-table-view-cell:first-child>a:not(.mui-btn){border-top-left-radius:12px;border-top-right-radius:12px}.mui-popover .mui-table-view .mui-table-view-cell:last-child,.mui-popover .mui-table-view .mui-table-view-cell:last-child>a:not(.mui-btn){border-bottom-right-radius:12px;border-bottom-left-radius:12px}.mui-popover.mui-bar-popover .mui-table-view{width:106px}.mui-popover.mui-bar-popover .mui-table-view .mui-table-view-cell{padding:11px 15px;background-position:0 100%}.mui-popover.mui-bar-popover .mui-table-view .mui-table-view-cell>a:not(.mui-btn){margin:-11px -15px -11px -15px}.mui-popup-backdrop{position:fixed;z-index:998;top:0;right:0;bottom:0;left:0;-webkit-transition-duration:400ms;transition-duration:400ms;opacity:0;background:rgba(0,0,0,.4)}.mui-popup-backdrop.mui-active{opacity:1}.mui-popup{position:fixed;z-index:10000;top:50%;left:50%;display:none;overflow:hidden;width:270px;-webkit-transition-property:-webkit-transform,opacity;transition-property:transform,opacity;-webkit-transform:translate3d(-50%,-50%,0) scale(1.185);transform:translate3d(-50%,-50%,0) scale(1.185);text-align:center;opacity:0;color:#000;border-radius:13px}.mui-popup.mui-popup-in{display:block;-webkit-transition-duration:400ms;transition-duration:400ms;-webkit-transform:translate3d(-50%,-50%,0) scale(1);transform:translate3d(-50%,-50%,0) scale(1);opacity:1}.mui-popup.mui-popup-out{-webkit-transition-duration:400ms;transition-duration:400ms;-webkit-transform:translate3d(-50%,-50%,0) scale(1);transform:translate3d(-50%,-50%,0) scale(1);opacity:0}.mui-popup-inner{position:relative;padding:15px;border-radius:13px 13px 0 0;background:rgba(255,255,255,.95)}.mui-popup-inner:after{position:absolute;z-index:15;top:auto;right:auto;bottom:0;left:0;display:block;width:100%;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transform-origin:50% 100%;transform-origin:50% 100%;background-color:rgba(0,0,0,.2)}.mui-popup-title{font-size:18px;font-weight:500;text-align:center}.mui-popup-title+.mui-popup-text{font-family:inherit;font-size:14px;margin:5px 0 0}.mui-popup-buttons{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;height:44px;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.mui-popup-button{font-size:17px;line-height:44px;position:relative;display:block;overflow:hidden;box-sizing:border-box;width:100%;height:44px;padding:0 5px;cursor:pointer;text-align:center;white-space:nowrap;text-overflow:ellipsis;color:#007aff;background:rgba(255,255,255,.95);-webkit-box-flex:1}.mui-popup-button:after{position:absolute;z-index:15;top:0;right:0;bottom:auto;left:auto;display:block;width:1px;height:100%;content:'';-webkit-transform:scaleX(.5);transform:scaleX(.5);-webkit-transform-origin:100% 50%;transform-origin:100% 50%;background-color:rgba(0,0,0,.2)}.mui-popup-button:first-child{border-radius:0 0 0 13px}.mui-popup-button:first-child:last-child{border-radius:0 0 13px 13px}.mui-popup-button:last-child{border-radius:0 0 13px}.mui-popup-button:last-child:after{display:none}.mui-popup-button.mui-popup-button-bold{font-weight:600}.mui-popup-input input{font-size:14px;width:100%;height:26px;margin:15px 0 0;padding:0 5px;border:1px solid rgba(0,0,0,.3);border-radius:0;background:#fff}.mui-plus.mui-android .mui-popup-backdrop{-webkit-transition-duration:1ms;transition-duration:1ms}.mui-plus.mui-android .mui-popup{-webkit-transition-duration:1ms;transition-duration:1ms;-webkit-transform:translate3d(-50%,-50%,0) scale(1);transform:translate3d(-50%,-50%,0) scale(1)}.mui-progressbar{position:relative;display:block;overflow:hidden;width:100%;height:2px;-webkit-transform-origin:center top;transform-origin:center top;vertical-align:middle;border-radius:2px;background:#b6b6b6;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.mui-progressbar span{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-transition:150ms;transition:150ms;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);background:#007aff}.mui-progressbar.mui-progressbar-infinite:before{position:absolute;top:0;left:0;width:100%;height:100%;content:'';-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transform-origin:left center;transform-origin:left center;-webkit-animation:mui-progressbar-infinite 1s linear infinite;animation:mui-progressbar-infinite 1s linear infinite;background:#007aff}body>.mui-progressbar{position:absolute;z-index:10000;top:44px;left:0;border-radius:0}.mui-progressbar-in{-webkit-animation:mui-progressbar-in 300ms forwards;animation:mui-progressbar-in 300ms forwards}.mui-progressbar-out{-webkit-animation:mui-progressbar-out 300ms forwards;animation:mui-progressbar-out 300ms forwards}@-webkit-keyframes mui-progressbar-in{from{-webkit-transform:scaleY(0);opacity:0}to{-webkit-transform:scaleY(1);opacity:1}}@keyframes mui-progressbar-in{from{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}}@-webkit-keyframes mui-progressbar-out{from{-webkit-transform:scaleY(1);opacity:1}to{-webkit-transform:scaleY(0);opacity:0}}@keyframes mui-progressbar-out{from{transform:scaleY(1);opacity:1}to{transform:scaleY(0);opacity:0}}@-webkit-keyframes mui-progressbar-infinite{0%{-webkit-transform:translate3d(-50%,0,0) scaleX(.5)}100%{-webkit-transform:translate3d(100%,0,0) scaleX(.5)}}@keyframes mui-progressbar-infinite{0%{transform:translate3d(-50%,0,0) scaleX(.5)}100%{transform:translate3d(100%,0,0) scaleX(.5)}}.mui-pagination{display:inline-block;margin:0 auto;padding-left:0;border-radius:6px}.mui-pagination>li{display:inline}.mui-pagination>li>a,.mui-pagination>li>span{line-height:1.428571429;position:relative;float:left;margin-left:-1px;padding:6px 12px;text-decoration:none;color:#007aff;border:1px solid #ddd;background-color:#fff}.mui-pagination>li:first-child>a,.mui-pagination>li:first-child>span{margin-left:0;border-top-left-radius:6px;border-bottom-left-radius:6px;background-clip:padding-box}.mui-pagination>li:last-child>a,.mui-pagination>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px;background-clip:padding-box}.mui-pagination>li.mui-active>a,.mui-pagination>li.mui-active>a:active,.mui-pagination>li.mui-active>span,.mui-pagination>li.mui-active>span:active,.mui-pagination>li:active>a,.mui-pagination>li:active>a:active,.mui-pagination>li:active>span,.mui-pagination>li:active>span:active{z-index:2;cursor:default;color:#fff;border-color:#007aff;background-color:#007aff}.mui-pagination>li.mui-disabled>a,.mui-pagination>li.mui-disabled>a:active,.mui-pagination>li.mui-disabled>span,.mui-pagination>li.mui-disabled>span:active{opacity:.6;color:#777;border:1px solid #ddd;background-color:#fff}.mui-pagination-lg>li>a,.mui-pagination-lg>li>span{font-size:18px;padding:10px 16px}.mui-pagination-sm>li>a,.mui-pagination-sm>li>span{font-size:12px;padding:5px 10px}.mui-pager{padding-left:0;list-style:none;text-align:center}.mui-pager:after,.mui-pager:before{display:table;content:' '}.mui-pager:after{clear:both}.mui-pager li{display:inline}.mui-pager li>a,.mui-pager li>span{display:inline-block;padding:5px 14px;border:1px solid #ddd;border-radius:6px;background-color:#fff;background-clip:padding-box}.mui-pager li.mui-active>a,.mui-pager li.mui-active>span,.mui-pager li:active>a,.mui-pager li:active>span{cursor:default;text-decoration:none;color:#fff;border-color:#007aff;background-color:#007aff}.mui-pager .mui-next>a,.mui-pager .mui-next>span{float:right}.mui-pager .mui-previous>a,.mui-pager .mui-previous>span{float:left}.mui-pager .mui-disabled>a,.mui-pager .mui-disabled>a:active,.mui-pager .mui-disabled>span,.mui-pager .mui-disabled>span:active{opacity:.6;color:#777;border:1px solid #ddd;background-color:#fff}.mui-modal{position:fixed;z-index:999;top:0;overflow:hidden;width:100%;min-height:100%;-webkit-transition:-webkit-transform .25s,opacity 1ms .25s;transition:transform .25s,opacity 1ms .25s;-webkit-transition-timing-function:cubic-bezier(.1,.5,.1,1);transition-timing-function:cubic-bezier(.1,.5,.1,1);-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0;background-color:#fff}.mui-modal.mui-active{height:100%;-webkit-transition:-webkit-transform .25s;transition:transform .25s;-webkit-transition-timing-function:cubic-bezier(.1,.5,.1,1);transition-timing-function:cubic-bezier(.1,.5,.1,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.mui-android .mui-modal .mui-bar{position:static}.mui-android .mui-modal .mui-bar-nav~.mui-content{padding-top:0}.mui-slider{position:relative;z-index:1;overflow:hidden;width:100%}.mui-slider .mui-segmented-control.mui-segmented-control-inverted .mui-control-item.mui-active{border-bottom:0}.mui-slider .mui-segmented-control.mui-segmented-control-inverted~.mui-slider-group .mui-slider-item{border-top:1px solid #c8c7cc;border-bottom:1px solid #c8c7cc}.mui-slider .mui-slider-group{font-size:0;position:relative;-webkit-transition:all 0s linear;transition:all 0s linear;white-space:nowrap}.mui-slider .mui-slider-group .mui-slider-item{font-size:14px;position:relative;display:inline-block;width:100%;height:100%;vertical-align:top;white-space:normal}.mui-slider .mui-slider-group .mui-slider-item>a:not(.mui-control-item){line-height:0;position:relative;display:block}.mui-slider .mui-slider-group .mui-slider-item img{width:100%}.mui-slider .mui-slider-group .mui-slider-item .mui-table-view:after,.mui-slider .mui-slider-group .mui-slider-item .mui-table-view:before{height:0}.mui-slider .mui-slider-group.mui-slider-loop{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}.mui-slider-title{line-height:30px;position:absolute;bottom:0;left:0;width:100%;height:30px;margin:0;text-align:left;text-indent:12px;opacity:.8;background-color:#000}.mui-slider-indicator{position:absolute;bottom:8px;width:100%;text-align:center;background:0 0}.mui-slider-indicator.mui-segmented-control{position:relative;bottom:auto}.mui-slider-indicator .mui-indicator{display:inline-block;width:6px;height:6px;margin:1px 6px;cursor:pointer;border-radius:50%;background:#aaa;-webkit-box-shadow:0 0 1px 1px rgba(130,130,130,.7);box-shadow:0 0 1px 1px rgba(130,130,130,.7)}.mui-slider-indicator .mui-active.mui-indicator{background:#fff}.mui-slider-indicator .mui-icon{font-size:20px;line-height:30px;width:40px;height:30px;margin:3px;text-align:center;border:1px solid #ddd}.mui-slider-indicator .mui-number{line-height:32px;display:inline-block;width:58px}.mui-slider-indicator .mui-number span{color:#ff5053}.mui-slider-progress-bar{z-index:1;height:2px;-webkit-transform:translateZ(0);transform:translateZ(0)}.mui-switch{position:relative;display:block;width:74px;height:30px;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:background-color,border;transition-property:background-color,border;border:2px solid #ddd;border-radius:20px;background-color:#fff;background-clip:padding-box}.mui-switch.mui-disabled{opacity:.3}.mui-switch .mui-switch-handle{position:absolute;z-index:1;top:-1px;left:-1px;width:28px;height:28px;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out;-webkit-transition-property:-webkit-transform,width,left;transition-property:transform,width,left;border-radius:16px;background-color:#fff;background-clip:padding-box;-webkit-box-shadow:0 2px 5px rgba(0,0,0,.4);box-shadow:0 2px 5px rgba(0,0,0,.4)}.mui-switch:before{font-size:13px;position:absolute;top:3px;right:11px;content:'Off';text-transform:uppercase;color:#999}.mui-switch.mui-dragging{border-color:#f7f7f7;background-color:#f7f7f7}.mui-switch.mui-dragging .mui-switch-handle{width:38px}.mui-switch.mui-dragging.mui-active .mui-switch-handle{left:-11px;width:38px}.mui-switch.mui-active{border-color:#4cd964;background-color:#4cd964}.mui-switch.mui-active .mui-switch-handle{-webkit-transform:translate(43px,0);transform:translate(43px,0)}.mui-switch.mui-active:before{right:auto;left:15px;content:'On';color:#fff}.mui-switch input[type=checkbox]{display:none}.mui-switch-mini{width:47px}.mui-switch-mini:before{display:none}.mui-switch-mini.mui-active .mui-switch-handle{-webkit-transform:translate(16px,0);transform:translate(16px,0)}.mui-switch-blue.mui-active{border:2px solid #007aff;background-color:#007aff}.mui-content.mui-fade{left:0;opacity:0}.mui-content.mui-fade.mui-in{opacity:1}.mui-content.mui-sliding{z-index:2;-webkit-transition:-webkit-transform .4s;transition:transform .4s;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mui-content.mui-sliding.mui-left{z-index:1;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mui-content.mui-sliding.mui-right{z-index:3;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mui-navigate-right:after,.mui-push-left:after,.mui-push-right:after{font-family:Muiicons;font-size:inherit;line-height:1;position:absolute;top:50%;display:inline-block;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-decoration:none;color:#bbb;-webkit-font-smoothing:antialiased}.mui-push-left:after{left:15px;content:'\e582'}.mui-navigate-right:after,.mui-push-right:after{right:15px;content:'\e583'}.mui-pull-bottom-pocket,.mui-pull-top-pocket{position:absolute;left:0;display:block;visibility:hidden;overflow:hidden;width:100%;height:50px}.mui-plus-pullrefresh .mui-pull-bottom-pocket,.mui-plus-pullrefresh .mui-pull-top-pocket{display:none;visibility:visible}.mui-pull-top-pocket{top:0}.mui-bar-nav~.mui-content .mui-pull-top-pocket{top:44px}.mui-bar-nav~.mui-bar-header-secondary~.mui-content .mui-pull-top-pocket{top:88px}.mui-pull-bottom-pocket{position:relative;bottom:0;height:40px}.mui-pull-bottom-pocket .mui-pull-loading{visibility:hidden}.mui-pull-bottom-pocket .mui-pull-loading.mui-in{display:inline-block}.mui-pull{font-weight:700;position:absolute;right:0;bottom:10px;left:0;text-align:center;color:#777}.mui-pull-loading{margin-right:10px;-webkit-transition:-webkit-transform .4s;transition:transform .4s;-webkit-transition-duration:400ms;transition-duration:400ms;vertical-align:middle}.mui-pull-loading.mui-reverse{-webkit-transform:rotate(180deg) translateZ(0);transform:rotate(180deg) translateZ(0)}.mui-pull-caption{font-size:15px;line-height:24px;position:relative;display:inline-block;overflow:visible;margin-top:0;vertical-align:middle}.mui-pull-caption span{display:none}.mui-pull-caption span.mui-in{display:inline}.mui-toast-container{line-height:17px;position:fixed;z-index:9999;bottom:50px;left:50%;-webkit-transition:opacity .3s;transition:opacity .3s;-webkit-transform:translate(-50%,0);transform:translate(-50%,0);opacity:0}.mui-toast-container.mui-active{opacity:.9}.mui-toast-message{font-size:14px;padding:10px 25px;text-align:center;color:#fff;border-radius:6px;background-color:#323232}.mui-numbox{position:relative;display:inline-block;overflow:hidden;width:120px;height:35px;padding:0 40px;vertical-align:top;vertical-align:middle;border:solid 1px #bbb;border-radius:3px;background-color:#efeff4}.mui-numbox [class*=btn-numbox],.mui-numbox [class*=numbox-btn]{font-size:18px;font-weight:400;line-height:100%;position:absolute;top:0;overflow:hidden;width:40px;height:100%;padding:0;color:#555;border:none;border-radius:0;background-color:#f9f9f9}.mui-numbox [class*=btn-numbox]:active,.mui-numbox [class*=numbox-btn]:active{background-color:#ccc}.mui-numbox [class*=btn-numbox][disabled],.mui-numbox [class*=numbox-btn][disabled]{color:silver}.mui-numbox .mui-btn-numbox-plus,.mui-numbox .mui-numbox-btn-plus{right:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.mui-numbox .mui-btn-numbox-minus,.mui-numbox .mui-numbox-btn-minus{left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.mui-numbox .mui-input-numbox,.mui-numbox .mui-numbox-input{display:inline-block;overflow:hidden;width:100%!important;height:100%;margin:0;padding:0 3px!important;text-align:center;text-overflow:ellipsis;word-break:normal;border:none!important;border-right:solid 1px #ccc!important;border-left:solid 1px #ccc!important;border-radius:0!important}.mui-input-row .mui-numbox{float:right;margin:2px 8px}@font-face{font-family:Muiicons;font-weight:400;font-style:normal;src:url(../fonts/mui.ttf) format('truetype')}.mui-icon{font-family:Muiicons;font-size:24px;font-weight:400;font-style:normal;line-height:1;display:inline-block;text-decoration:none;-webkit-font-smoothing:antialiased}.mui-icon.mui-active{color:#007aff}.mui-icon.mui-right:before{float:right;padding-left:.2em}.mui-icon-contact:before{content:'\e100'}.mui-icon-person:before{content:'\e101'}.mui-icon-personadd:before{content:'\e102'}.mui-icon-contact-filled:before{content:'\e130'}.mui-icon-person-filled:before{content:'\e131'}.mui-icon-personadd-filled:before{content:'\e132'}.mui-icon-phone:before{content:'\e200'}.mui-icon-email:before{content:'\e201'}.mui-icon-chatbubble:before{content:'\e202'}.mui-icon-chatboxes:before{content:'\e203'}.mui-icon-phone-filled:before{content:'\e230'}.mui-icon-email-filled:before{content:'\e231'}.mui-icon-chatbubble-filled:before{content:'\e232'}.mui-icon-chatboxes-filled:before{content:'\e233'}.mui-icon-weibo:before{content:'\e260'}.mui-icon-weixin:before{content:'\e261'}.mui-icon-pengyouquan:before{content:'\e262'}.mui-icon-chat:before{content:'\e263'}.mui-icon-qq:before{content:'\e264'}.mui-icon-videocam:before{content:'\e300'}.mui-icon-camera:before{content:'\e301'}.mui-icon-mic:before{content:'\e302'}.mui-icon-location:before{content:'\e303'}.mui-icon-mic-filled:before,.mui-icon-speech:before{content:'\e332'}.mui-icon-location-filled:before{content:'\e333'}.mui-icon-micoff:before{content:'\e360'}.mui-icon-image:before{content:'\e363'}.mui-icon-map:before{content:'\e364'}.mui-icon-compose:before{content:'\e400'}.mui-icon-trash:before{content:'\e401'}.mui-icon-upload:before{content:'\e402'}.mui-icon-download:before{content:'\e403'}.mui-icon-close:before{content:'\e404'}.mui-icon-redo:before{content:'\e405'}.mui-icon-undo:before{content:'\e406'}.mui-icon-refresh:before{content:'\e407'}.mui-icon-star:before{content:'\e408'}.mui-icon-plus:before{content:'\e409'}.mui-icon-minus:before{content:'\e410'}.mui-icon-checkbox:before,.mui-icon-circle:before{content:'\e411'}.mui-icon-clear:before,.mui-icon-close-filled:before{content:'\e434'}.mui-icon-refresh-filled:before{content:'\e437'}.mui-icon-star-filled:before{content:'\e438'}.mui-icon-plus-filled:before{content:'\e439'}.mui-icon-minus-filled:before{content:'\e440'}.mui-icon-circle-filled:before{content:'\e441'}.mui-icon-checkbox-filled:before{content:'\e442'}.mui-icon-closeempty:before{content:'\e460'}.mui-icon-refreshempty:before{content:'\e461'}.mui-icon-reload:before{content:'\e462'}.mui-icon-starhalf:before{content:'\e463'}.mui-icon-spinner:before{content:'\e464'}.mui-icon-spinner-cycle:before{content:'\e465'}.mui-icon-search:before{content:'\e466'}.mui-icon-plusempty:before{content:'\e468'}.mui-icon-forward:before{content:'\e470'}.mui-icon-back:before,.mui-icon-left-nav:before{content:'\e471'}.mui-icon-checkmarkempty:before{content:'\e472'}.mui-icon-home:before{content:'\e500'}.mui-icon-navigate:before{content:'\e501'}.mui-icon-gear:before{content:'\e502'}.mui-icon-paperplane:before{content:'\e503'}.mui-icon-info:before{content:'\e504'}.mui-icon-help:before{content:'\e505'}.mui-icon-locked:before{content:'\e506'}.mui-icon-more:before{content:'\e507'}.mui-icon-flag:before{content:'\e508'}.mui-icon-home-filled:before{content:'\e530'}.mui-icon-gear-filled:before{content:'\e532'}.mui-icon-info-filled:before{content:'\e534'}.mui-icon-help-filled:before{content:'\e535'}.mui-icon-more-filled:before{content:'\e537'}.mui-icon-settings:before{content:'\e560'}.mui-icon-list:before{content:'\e562'}.mui-icon-bars:before{content:'\e563'}.mui-icon-loop:before{content:'\e565'}.mui-icon-paperclip:before{content:'\e567'}.mui-icon-eye:before{content:'\e568'}.mui-icon-arrowup:before{content:'\e580'}.mui-icon-arrowdown:before{content:'\e581'}.mui-icon-arrowleft:before{content:'\e582'}.mui-icon-arrowright:before{content:'\e583'}.mui-icon-arrowthinup:before{content:'\e584'}.mui-icon-arrowthindown:before{content:'\e585'}.mui-icon-arrowthinleft:before{content:'\e586'}.mui-icon-arrowthinright:before{content:'\e587'}.mui-icon-pulldown:before{content:'\e588'}.mui-fullscreen{position:absolute;top:0;right:0;bottom:0;left:0}.mui-fullscreen.mui-slider .mui-slider-group{height:100%}.mui-fullscreen .mui-segmented-control~.mui-slider-group{position:absolute;top:40px;bottom:0;width:100%;height:auto}.mui-fullscreen.mui-slider .mui-slider-item>a{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mui-fullscreen .mui-off-canvas-wrap .mui-slider-item>a{top:auto;-webkit-transform:none;transform:none}.mui-bar-nav~.mui-content .mui-slider.mui-fullscreen{top:44px}.mui-bar-tab~.mui-content .mui-slider.mui-fullscreen .mui-segmented-control~.mui-slider-group{bottom:50px}.mui-android.mui-android-4-0 input:focus,.mui-android.mui-android-4-0 textarea:focus{-webkit-user-modify:inherit}.mui-android.mui-android-4-2 input,.mui-android.mui-android-4-2 textarea,.mui-android.mui-android-4-3 input,.mui-android.mui-android-4-3 textarea{-webkit-user-select:text}.mui-ios .mui-table-view-cell{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.mui-plus-visible,.mui-wechat-visible{display:none!important}.mui-plus-hidden,.mui-wechat-hidden{display:block!important}.mui-tab-item.mui-plus-hidden,.mui-tab-item.mui-wechat-hidden{display:table-cell!important}.mui-plus .mui-plus-visible,.mui-wechat .mui-wechat-visible{display:block!important}.mui-plus .mui-tab-item.mui-plus-visible,.mui-wechat .mui-tab-item.mui-wechat-visible{display:table-cell!important}.mui-plus .mui-plus-hidden,.mui-wechat .mui-wechat-hidden{display:none!important}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-nav{height:64px;padding-top:20px}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-nav~.mui-content{padding-top:64px}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-header-secondary,.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-nav~.mui-content .mui-pull-top-pocket{top:64px}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-header-secondary~.mui-content{padding-top:94px}.mui-iframe-wrapper{position:absolute;right:0;left:0;-webkit-overflow-scrolling:touch}.mui-iframe-wrapper iframe{width:100%;height:100%;border:0}
--------------------------------------------------------------------------------
/css/showcase.css:
--------------------------------------------------------------------------------
1 | /**
2 | * 作者: 孙尊路
3 | * 创建时间:2017/06/16 14:47:28
4 | * 版本: [1.0, 2017/6/16]
5 | * 描述: 我的日程
6 | **/
7 |
8 |
9 | /*全局格式化样式*/
10 |
11 | body,
12 | .mui-content {
13 | background-color: #F5F5F5;
14 | }
15 |
16 |
17 | /*日历*/
18 |
19 | .em-calendar {
20 | border-bottom: 1px solid #e0e0e0;
21 | }
22 |
23 |
24 | /*左右切换*/
25 |
26 | .em-journal-title {
27 | width: 100%;
28 | display: block;
29 | height: 50px;
30 | line-height: 50px;
31 | background-color: #3C80E6;
32 | }
33 |
34 | .em-per-block {
35 | float: left;
36 | width: 33%;
37 | color: #fff;
38 | font-size: 18px;
39 | }
40 |
41 | .em-per-block.pre {
42 | text-align: left;
43 | font-size: 15px;
44 | }
45 |
46 | .em-per-block.next:active,
47 | .em-per-block.pre:active {
48 | background-color: #3a79d8;
49 | border-radius: 15px;
50 | font-weight: 800;
51 | }
52 |
53 | .em-per-block.mid {
54 | text-align: center;
55 | font-size: 18px;
56 | }
57 |
58 | .em-per-block.next {
59 | text-align: right;
60 | font-size: 15px;
61 | }
62 |
63 | .backToday {
64 | background: #3c80e6;
65 | color: #fff;
66 | height: 44px;
67 | line-height: 44px;
68 | text-align: center;
69 | }
70 |
--------------------------------------------------------------------------------
/fonts/mui-icons-extra.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sunzunlu/MobileCalendar/49e778349522dedd377dff556227dcffd968e503/fonts/mui-icons-extra.ttf
--------------------------------------------------------------------------------
/fonts/mui.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sunzunlu/MobileCalendar/49e778349522dedd377dff556227dcffd968e503/fonts/mui.ttf
--------------------------------------------------------------------------------
/img/checkbox_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sunzunlu/MobileCalendar/49e778349522dedd377dff556227dcffd968e503/img/checkbox_pressed.png
--------------------------------------------------------------------------------
/img/checkbox_unable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sunzunlu/MobileCalendar/49e778349522dedd377dff556227dcffd968e503/img/checkbox_unable.png
--------------------------------------------------------------------------------
/img/img_sdule_point.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sunzunlu/MobileCalendar/49e778349522dedd377dff556227dcffd968e503/img/img_sdule_point.png
--------------------------------------------------------------------------------
/img/img_sdule_point2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sunzunlu/MobileCalendar/49e778349522dedd377dff556227dcffd968e503/img/img_sdule_point2.png
--------------------------------------------------------------------------------
/img/img_sdule_selected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sunzunlu/MobileCalendar/49e778349522dedd377dff556227dcffd968e503/img/img_sdule_selected.png
--------------------------------------------------------------------------------
/img/img_success.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sunzunlu/MobileCalendar/49e778349522dedd377dff556227dcffd968e503/img/img_success.png
--------------------------------------------------------------------------------
/js/calendar_showcase.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 作者: 孙尊路
3 | * 创建时间: 2018/08/21 13:27:09
4 | * 版本: [1.0, 2018/08/21]
5 | * 描述: 日历组件示例
6 | */
7 |
8 | "use strict";
9 |
10 | var customBiz = {
11 | init: function() {
12 | var self = this;
13 | // 初始化日历
14 |
15 | var calendar = new Calendar({
16 | // swiper滑动容器
17 | container: "#calendar",
18 | // 上一月节点
19 | pre: ".pre",
20 | // 下一月节点
21 | next: ".next",
22 | // 回到今天
23 | backToToday: ".backToday",
24 | // 业务数据改变
25 | dataRequest: function(currdate, callback, _this) {
26 | // 无日程安排
27 | var data = [{
28 | "date": "2018-04-18"
29 | }, {
30 | "date": "2018-04-17"
31 | }, {
32 | "date": "2018-04-16"
33 | }];
34 | callback && callback(data);
35 | },
36 | // 点击日期事件
37 | onItemClick: function(item) {
38 | var defaultDate = item.date;
39 | // 设置标题
40 | setTitle(defaultDate);
41 | },
42 | // 滑动回调
43 | swipeCallback: function(item) {
44 | var defaultDate = item.date;
45 | // 设置标题
46 | setTitle(defaultDate);
47 |
48 | // 动态新增点击样式
49 | calendar.addActiveStyleFordate(defaultDate);
50 |
51 | },
52 | // 调试
53 | isDebug: false
54 | });
55 | // 设置标题
56 | var titleNode = document.querySelector('.mid span');
57 |
58 | function setTitle(date) {
59 | titleNode.innerText = date;
60 | }
61 |
62 | }
63 | }
64 |
65 | // 初始化
66 | customBiz.init();
67 |
--------------------------------------------------------------------------------
/libs/calendar_base.css:
--------------------------------------------------------------------------------
1 | /**
2 | * 作者: 孙尊路
3 | * 创建时间:2017/06/16 14:47:28
4 | * 版本: [1.0, 2017/6/16]
5 | * 描述: 日历组件基类样式
6 | **/
7 |
8 |
9 | /*日历容器样式*/
10 |
11 | .em-calendar-container,
12 | .em-calendar-wrapper-week,
13 | .em-calendar-wrapper,
14 | .em-calendar {
15 | overflow: hidden;
16 | background: #ffffff;
17 | }
18 |
19 | .em-calendar-container {
20 | border-bottom: 1px solid #e0e0e0;
21 | }
22 |
23 |
24 | /*标注红色*/
25 |
26 | .em-red {
27 | color: #E60012;
28 | }
29 |
30 |
31 | /*最上面一行周历显示*/
32 |
33 | .em-week {
34 | display: flex;
35 | justify-content: space-around;
36 | padding-top: 18px;
37 | padding-bottom: 15px;
38 | color: #999999;
39 | font-size: 13px;
40 | }
41 |
42 | .em-calendar-content .em-calendar-item {
43 | float: left;
44 | width: 14.285vw;
45 | height: 14.285vw;
46 | text-align: center;
47 | /*border:1px solid #000;*/
48 | border-radius: 50%;
49 | margin-bottom: 5px;
50 | }
51 |
52 |
53 | /* 周六、周日列字体标红*/
54 |
55 | .em-calendar-content .em-calendar-item:nth-child(7n) .day,
56 | .em-calendar-content .em-calendar-item:nth-child(7n+1) .day {
57 | color: #E60012;
58 | font-size: 16px;
59 | }
60 |
61 |
62 | /* 上个月和下个月 置成灰色,不可点击*/
63 |
64 | .em-calendar-content .isforbid1.em-calendar-item {}
65 |
66 | .em-calendar-content .isforbid0.em-calendar-item {}
67 |
68 | .em-calendar-content .isforbid0.em-calendar-item .day {
69 | display: block;
70 | padding-top: 7px;
71 | font-size: 16px;
72 | color: #D8D8D8;
73 | }
74 |
75 | .em-calendar-content .isforbid0.em-calendar-item .lunar {
76 | font-size: 10px;
77 | color: #D8D8D8;
78 | margin-top: -3px;
79 | }
80 |
81 | .em-calendar-content .em-calendar-item .day {
82 | display: block;
83 | padding-top: 2vw;
84 | font-size: 16px;
85 | color: #333333;
86 | }
87 |
88 | .em-calendar-content .em-calendar-item .lunar {
89 | font-size: 10px;
90 | color: #666666;
91 | margin-top: -3px;
92 | }
93 |
94 |
95 | /*通用点皮肤*/
96 |
97 | .em-calendar-content .em-calendar-item .dot {
98 | display: inline-flex;
99 | width: 8px;
100 | height: 8px;
101 | margin-top: -13px;
102 | position: absolute;
103 | margin-left: -4px;
104 | }
105 |
106 |
107 | /*皮肤1*/
108 |
109 | .em-calendar-content .em-calendar-item .dot-type1 {
110 | background-image: url(../img/img_sdule_point.png);
111 | background-size: 100% 100%;
112 | }
113 |
114 |
115 | /*皮肤2*/
116 |
117 | .em-calendar-content .em-calendar-item .dot-type2 {
118 | background-image: url(../img/img_success.png);
119 | background-size: 100% 100%;
120 | }
121 |
122 | .em-calendar-content .em-calendar-item img {
123 | width: 10px;
124 | height: 10px;
125 | margin-top: -12px;
126 | position: absolute;
127 | margin-left: -3px;
128 | }
129 |
130 |
131 | /**
132 | * 日历表中的颜色
133 | * 日历拓展;四种样式
134 | **/
135 |
136 |
137 | /*迟到*/
138 |
139 | .em-calendar-late {
140 | border: 2px solid #F5B6B6;
141 | }
142 |
143 |
144 | /*早退*/
145 |
146 | .em-calendar-early {
147 | border: 2px solid #F5CAB6;
148 | }
149 |
150 |
151 | /*调休*/
152 |
153 | .em-calendar-rest {
154 | border: 2px solid #D5E6D4;
155 | }
156 |
157 |
158 | /*请假*/
159 |
160 | .em-calendar-leave {
161 | border: 2px solid #AFDDD9;
162 | }
163 |
164 |
165 | /*点击效果*/
166 |
167 | .em-calendar-content .em-calendar-active.em-calendar-item:nth-child(7n) .day,
168 | .em-calendar-content .em-calendar-active.em-calendar-item:nth-child(7n+1) .day {
169 | color: #ffffff;
170 | }
171 |
172 | .em-calendar-active {
173 | background-color: #3C80E6;
174 | width: 14.285%;
175 | height: 54px;
176 | }
177 |
178 | .em-calendar-content .em-calendar-active .day,
179 | .em-calendar-content .em-calendar-active .lunar {
180 | color: #FFFFFF;
181 | }
182 |
--------------------------------------------------------------------------------
/libs/calendar_base.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 作者: 孙尊路
3 | * 创建时间: 2017-07-14 13:26:47
4 | * 版本: [1.0, 2017/7/14]
5 | * 说明: 常用工具js
6 | */
7 | window.innerCalendarUtil = window.innerCalendarUtil || (function (exports) {
8 |
9 | /**
10 | * 产生一个 唯一uuid,默认为32位的随机字符串,8-4-4-4-12 格式
11 | * @param {Object} options 配置参数
12 | * len 默认为32位,最大不能超过36,最小不能小于4
13 | * radix 随机的基数,如果小于等于10代表只用纯数字,最大为62,最小为2,默认为62
14 | * type 类别,默认为default代表 8-4-4-4-12的模式,如果为 noline代表不会有连线
15 | * @return {String} 返回一个随机性的唯一uuid
16 | */
17 | exports.uuid = function (options) {
18 | options = options || {};
19 |
20 | var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''),
21 | uuid = [],
22 | i;
23 | var radix = options.radix || chars.length;
24 | var len = options.len || 32;
25 | var type = options.type || 'default';
26 |
27 | len = Math.min(len, 36);
28 | len = Math.max(len, 4);
29 | radix = Math.min(radix, 62);
30 | radix = Math.max(radix, 2);
31 |
32 | if(len) {
33 | for(i = 0; i < len; i++) {
34 | uuid[i] = chars[0 | Math.random() * radix];
35 | }
36 |
37 | if(type === 'default') {
38 | len > 23 && (uuid[23] = '-');
39 | len > 18 && (uuid[18] = '-');
40 | len > 13 && (uuid[13] = '-');
41 | len > 8 && (uuid[8] = '-');
42 | }
43 | }
44 |
45 | return uuid.join('');
46 | };
47 |
48 | var class2type = {};
49 |
50 | exports.noop = function () {};
51 |
52 | exports.isFunction = function (value) {
53 | return exports.type(value) === 'function';
54 | };
55 | exports.isPlainObject = function (obj) {
56 | return exports.isObject(obj) && !exports.isWindow(obj) && Object.getPrototypeOf(obj) === Object.prototype;
57 | };
58 | exports.isArray = Array.isArray ||
59 | function (object) {
60 | return object instanceof Array;
61 | };
62 |
63 | /**
64 | * isWindow(需考虑obj为undefined的情况)
65 | * @param {Object} obj 需要判断的对象
66 | * @return {Boolean} 返回true或false
67 | */
68 | exports.isWindow = function (obj) {
69 | return obj && obj === window;
70 | };
71 | exports.isObject = function (obj) {
72 | return exports.type(obj) === 'object';
73 | };
74 | exports.type = function (obj) {
75 | return(obj === null || obj === undefined) ? String(obj) : class2type[{}.toString.call(obj)] || 'object';
76 | };
77 | /**
78 | * each遍历操作
79 | * @param {Object} elements 元素
80 | * @param {Function} callback 回调
81 | * @param {Function} hasOwnProperty 过滤函数
82 | * @returns {global} 返回调用的上下文
83 | */
84 | exports.each = function (elements, callback, hasOwnProperty) {
85 | if(!elements) {
86 | return this;
87 | }
88 | if(typeof elements.length === 'number') {
89 | [].every.call(elements, function (el, idx) {
90 | return callback.call(el, idx, el) !== false;
91 | });
92 | } else {
93 | for(var key in elements) {
94 | if(hasOwnProperty) {
95 | if(elements.hasOwnProperty(key)) {
96 | if(callback.call(elements[key], key, elements[key]) === false) {
97 | return elements;
98 | }
99 | }
100 | } else {
101 | if(callback.call(elements[key], key, elements[key]) === false) {
102 | return elements;
103 | }
104 | }
105 | }
106 | }
107 |
108 | return this;
109 | };
110 |
111 | /**
112 | * extend 合并多个对象,可以递归合并
113 | * @param {type} deep 是否递归合并
114 | * @param {type} target 最终返回的就是target
115 | * @param {type} source 从左到又,优先级依次提高,最右侧的是最后覆盖的
116 | * @returns {Object} 最终的合并对象
117 | */
118 | exports.extend = function () {
119 | var args = [].slice.call(arguments);
120 |
121 | // 目标
122 | var target = args[0] || {},
123 | // 默认source从1开始
124 | index = 1,
125 | len = args.length,
126 | // 默认非深复制
127 | deep = false;
128 |
129 | if(typeof target === 'boolean') {
130 | // 如果开启了深复制
131 | deep = target;
132 | target = args[index] || {};
133 | index++;
134 | }
135 |
136 | if(!exports.isObject(target)) {
137 | // 确保拓展的一定是object
138 | target = {};
139 | }
140 |
141 | for(; index < len; index++) {
142 | // source的拓展
143 | var source = args[index];
144 |
145 | if(source && exports.isObject(source)) {
146 | for(var name in source) {
147 | if(!Object.prototype.hasOwnProperty.call(source, name)) {
148 | // 防止原型上的数据
149 | continue;
150 | }
151 |
152 | var src = target[name];
153 | var copy = source[name];
154 | var clone,
155 | copyIsArray;
156 |
157 | if(target === copy) {
158 | // 防止环形引用
159 | continue;
160 | }
161 |
162 | // 这里必须用isPlainObject,只有同样是普通的object才会复制继承,如果是FormData之流的,会走后面的覆盖路线
163 | if(deep && copy && (exports.isPlainObject(copy) || (copyIsArray = exports.isArray(copy)))) {
164 | if(copyIsArray) {
165 | copyIsArray = false;
166 | clone = src && exports.isArray(src) ? src : [];
167 | } else {
168 | clone = src && exports.isPlainObject(src) ? src : {};
169 | }
170 |
171 | target[name] = exports.extend(deep, clone, copy);
172 | } else if(copy !== undefined) {
173 | // 如果不是普通的object,直接覆盖,例如FormData之类的会覆盖
174 | target[name] = copy;
175 | }
176 | }
177 | }
178 | }
179 |
180 | return target;
181 | };
182 |
183 | exports.each(['Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Object', 'Error'], function (i, name) {
184 | class2type['[object ' + name + ']'] = name.toLowerCase();
185 | });
186 |
187 | /**
188 | * 选择这段代码用到的太多了,因此抽取封装出来
189 | * @param {Object} element dom元素或者selector
190 | * @return {HTMLElement} 返回对应的dom
191 | */
192 | exports.selector = function (element) {
193 | if(typeof element === 'string') {
194 | element = document.querySelector(element);
195 | }
196 |
197 | return element;
198 | };
199 |
200 | /**
201 | * 设置一个Util对象下的命名空间
202 | * @param {String} namespace 命名空间
203 | * @param {Object} obj 需要赋值的目标对象
204 | * @return {Object} 返回目标对象
205 | */
206 | exports.namespace = function (namespace, obj) {
207 | var parent = window.Util;
208 |
209 | if(!namespace) {
210 | return parent;
211 | }
212 |
213 | var namespaceArr = namespace.split('.'),
214 | len = namespaceArr.length;
215 |
216 | for(var i = 0; i < len - 1; i++) {
217 | var tmp = namespaceArr[i];
218 |
219 | // 不存在的话要重新创建对象
220 | parent[tmp] = parent[tmp] || {};
221 | // parent要向下一级
222 | parent = parent[tmp];
223 | }
224 | parent[namespaceArr[len - 1]] = obj;
225 |
226 | return parent[namespaceArr[len - 1]];
227 | };
228 |
229 | /**
230 | * 获取这个模块下对应命名空间的对象
231 | * 如果不存在,则返回null,这个api只要是供内部获取接口数据时调用
232 | * @param {Object} module 模块
233 | * @param {Array} namespace 命名空间
234 | * @return {Object} 返回目标对象
235 | */
236 | exports.getNameSpaceObj = function (module, namespace) {
237 | if(!namespace) {
238 | return null;
239 | }
240 | var namespaceArr = namespace.split('.'),
241 | len = namespaceArr.length;
242 |
243 | for(var i = 0; i < len; i++) {
244 | module && (module = module[namespaceArr[i]]);
245 | }
246 |
247 | return module;
248 | };
249 |
250 | /**
251 | * 将string字符串转为html对象,默认创一个div填充
252 | * 因为很常用,所以单独提取出来了
253 | * @param {String} strHtml 目标字符串
254 | * @return {HTMLElement} 返回处理好后的html对象,如果字符串非法,返回null
255 | */
256 | exports.parseHtml = function (strHtml) {
257 | if(!strHtml || typeof (strHtml) !== 'string') {
258 | return null;
259 | }
260 | // 创一个灵活的div
261 | var i,
262 | a = document.createElement('div');
263 | var b = document.createDocumentFragment();
264 |
265 | a.innerHTML = strHtml;
266 | while((i = a.firstChild)) {
267 | b.appendChild(i);
268 | }
269 |
270 | return b;
271 | };
272 |
273 | /**
274 | * 图片的base64字符串转Blob
275 | * @param {String} urlData 完整的base64字符串
276 | * @return {Blob} 转换后的Blob对象,可用于表单文件上传
277 | */
278 | exports.base64ToBlob = function (urlData) {
279 | var arr = urlData.split(',');
280 | var mime = arr[0].match(/:(.*?);/)[1] || 'image/png';
281 | // 去掉url的头,并转化为byte
282 | var bytes = window.atob(arr[1]);
283 | // 处理异常,将ascii码小于0的转换为大于0
284 | var ab = new ArrayBuffer(bytes.length);
285 | // 生成视图(直接针对内存):8位无符号整数,长度1个字节
286 | var ia = new Uint8Array(ab);
287 |
288 | for(var i = 0; i < bytes.length; i++) {
289 | ia[i] = bytes.charCodeAt(i);
290 | }
291 |
292 | return new Blob([ab], {
293 | type: mime
294 | });
295 | };
296 |
297 | /**
298 | * 通过传入key值,得到页面key的初始化传值
299 | * 实际情况是获取 window.location.href 中的参数的值
300 | * @param {String} key 键名
301 | * @return {String} 键值
302 | */
303 | exports.getExtraDataByKey = function (key) {
304 | if(!key) {
305 | return null;
306 | }
307 | // 获取url中的参数值
308 | var getUrlParamsValue = function (url, paramName) {
309 | var paraString = url.substring(url.indexOf('?') + 1, url.length).split('&');
310 | var paraObj = {};
311 | var i,
312 | j;
313 |
314 | for(i = 0;
315 | (j = paraString[i]); i++) {
316 | paraObj[j.substring(0, j.indexOf('=')).toLowerCase()] = j.substring(j.indexOf('=') + 1, j.length);
317 | }
318 | var returnValue = paraObj[paramName.toLowerCase()];
319 |
320 | // 需要解码浏览器编码
321 | returnValue = decodeURIComponent(returnValue);
322 | if(typeof (returnValue) === 'undefined') {
323 | return undefined;
324 | } else {
325 | return returnValue;
326 | }
327 | };
328 | var value = getUrlParamsValue(window.location.href, key);
329 |
330 | if(value === 'undefined') {
331 | value = null;
332 | }
333 |
334 | return value;
335 | };
336 |
337 | // 避免提示警告
338 | var Console = console;
339 |
340 | exports.log = function () {
341 | // 方便后续控制
342 | Console.log.apply(this, arguments);
343 | };
344 |
345 | exports.warn = function () {
346 | Console.warn.apply(this, arguments);
347 | };
348 |
349 | exports.error = function () {
350 | Console.error.apply(this, arguments);
351 | };
352 |
353 | return exports;
354 | })({});
355 | /**
356 | * 作者: 孙尊路
357 | * 创建时间: 2017-07-14 13:26:47
358 | * 版本: [1.0, 2017/7/14]
359 | * 版权: 江苏国泰新点软件有限公司
360 | * 描述:日历组件基类
361 | * 实现方案:自定义日历组件+swiper插件的完美结合。
362 | * 更新日志:
363 | * (1)修复了农历显示不正确、不对应的问题
364 | * (2)增加了外部刷新的方法
365 | * (3)整体优化日程的解耦合情形
366 | * (4)优化实例化日期,增加时间戳
367 | */
368 |
369 | (function () {
370 | "use strict";
371 |
372 | /**
373 | * 全局生效默认设置
374 | * 默认设置可以最大程度的减小调用时的代码
375 | */
376 | var defaultOptions = {
377 | // 默认日历组件容器
378 | container: "#calendar",
379 | // swiper滑动容器
380 | swiper: ".swiper-container",
381 | // 默认显示农历
382 | isLunar: true,
383 | // 默认开启水平方向切换月份
384 | isSwipeH: true,
385 | // 默认开启垂直方向切换月份
386 | isSwipeV: true,
387 | // 滑动回调
388 | swipeCallback: noop,
389 | // 上一月节点
390 | pre: ".pre",
391 | // 上一月回调
392 | preCallback: noop,
393 | // 下一月节点
394 | next: ".next",
395 | // 下一月回调
396 | nextCallback: noop,
397 | // 点击回调
398 | onItemClick: noop,
399 | // 自定义输入模板
400 | template: noop,
401 | // 业务数据绑定
402 | dataRequest: noop,
403 | // 是否开启调试
404 | isDebug: false
405 | };
406 |
407 | function noop() {}
408 |
409 | /**
410 | * 日历的构造函数
411 | * @param {Object} options 配置参数,和init以及_initData的一致
412 | * @constructor
413 | */
414 | function Calendar(options) {
415 |
416 | options = innerCalendarUtil.extend({}, defaultOptions, options);
417 | if(!this._selector(options.container)) {
418 | // 抛异常
419 | throw new Error("传入的日历组件容器Selector #id不存在或者为空,请仔细检查!");
420 | return;
421 | }
422 | this.container = this._selector(options.container);
423 |
424 | this._initData(options);
425 | }
426 |
427 | Calendar.prototype = {
428 | /**
429 | * 初始化数据单独提取,方便refreshData使用
430 | * @param {Object} options 配置参数
431 | */
432 | _initData: function (options) {
433 | var self = this;
434 | this.options = options;
435 |
436 | // 创建日历DOM结构体
437 | this.CreateDOMFactory(function () {
438 | // 程序入口
439 | self._initParams();
440 | });
441 | },
442 | _initParams: function () {
443 | var self = this;
444 | self.nowYear = self.DateObj().getFullYear();
445 | self.nowMonth = self.tod(self.DateObj().getMonth() + 1);
446 | self.nowDay = self.tod(self.DateObj().getDate());
447 | // 当前日期
448 | self.currentDate = self.nowYear + "-" + self.nowMonth + "-" + self.nowDay;
449 |
450 | // 定义全局变量 计算农历
451 | self.CalendarData = new Array(100);
452 | self.madd = new Array(12);
453 | self.tgString = "甲乙丙丁戊己庚辛壬癸";
454 | self.dzString = "子丑寅卯辰巳午未申酉戌亥";
455 | self.numString = "一二三四五六七八九十";
456 | self.monString = "正二三四五六七八九十冬腊";
457 | self.weekString = "日一二三四五六";
458 | self.sx = "鼠牛虎兔龙蛇马羊猴鸡狗猪";
459 | self.cYear, self.cMonth, self.cDay, self.TheDate;
460 | self.CalendarData = new Array(0xA4B, 0x5164B, 0x6A5, 0x6D4, 0x415B5, 0x2B6, 0x957, 0x2092F, 0x497, 0x60C96, 0xD4A, 0xEA5, 0x50DA9, 0x5AD, 0x2B6, 0x3126E, 0x92E, 0x7192D, 0xC95, 0xD4A, 0x61B4A, 0xB55, 0x56A, 0x4155B, 0x25D, 0x92D, 0x2192B, 0xA95, 0x71695, 0x6CA, 0xB55, 0x50AB5, 0x4DA, 0xA5B, 0x30A57, 0x52B, 0x8152A, 0xE95, 0x6AA, 0x615AA, 0xAB5, 0x4B6, 0x414AE, 0xA57, 0x526, 0x31D26, 0xD95, 0x70B55, 0x56A, 0x96D, 0x5095D, 0x4AD, 0xA4D, 0x41A4D, 0xD25, 0x81AA5, 0xB54, 0xB6A, 0x612DA, 0x95B, 0x49B, 0x41497, 0xA4B, 0xA164B, 0x6A5, 0x6D4, 0x615B4, 0xAB6, 0x957, 0x5092F, 0x497, 0x64B, 0x30D4A, 0xEA5, 0x80D65, 0x5AC, 0xAB6, 0x5126D, 0x92E, 0xC96, 0x41A95, 0xD4A, 0xDA5, 0x20B55, 0x56A, 0x7155B, 0x25D, 0x92D, 0x5192B, 0xA95, 0xB4A, 0x416AA, 0xAD5, 0x90AB5, 0x4BA, 0xA5B, 0x60A57, 0x52B, 0xA93, 0x40E95);
461 | self.madd[0] = 0;
462 | self.madd[1] = 31;
463 | self.madd[2] = 59;
464 | self.madd[3] = 90;
465 | self.madd[4] = 120;
466 | self.madd[5] = 151;
467 | self.madd[6] = 181;
468 | self.madd[7] = 212;
469 | self.madd[8] = 243;
470 | self.madd[9] = 273;
471 | self.madd[10] = 304;
472 | self.madd[11] = 334;
473 |
474 | // 生成日历
475 | self.initEntry();
476 |
477 | },
478 | /**
479 | * 初始化日历
480 | */
481 | initEntry: function (op) {
482 | var self = this;
483 | var options = innerCalendarUtil.extend({
484 | year: "",
485 | month: "",
486 | day: ""
487 | }, op);
488 | //console.log("合并后:"+JSON.stringify(options));
489 | // 获取前一个月份
490 | if(!options.year) {
491 | options.year = self.DateObj().getFullYear(); //默认不传为"当前年"
492 | } else {
493 | options.year = op.year;
494 | }
495 | if(!options.month) {
496 | options.month = self.tod(self.DateObj().getMonth() + 1); //默认不传为"当前月"
497 | } else {
498 | options.month = op.month;
499 | }
500 |
501 | var preYear = options.year;
502 | var m = options.month;
503 | var preMonth = parseInt(m) - parseInt(1);
504 |
505 | if(preMonth == 0) {
506 | preYear = options.year - 1;
507 | preMonth = 12;
508 | }
509 | preMonth = self.tom(preMonth);
510 | var preDay = self.tod("01");
511 | //if(self.options.isDebug) {
512 | if(self.options.isDebug) {
513 | console.log("(前)初始化年月日:" + preYear + "-" + preMonth + "-" + preDay);
514 |
515 | }
516 |
517 | // 生成上一个月份的日历
518 | var outputs = [];
519 | self.refreshData({
520 | year: preYear,
521 | month: preMonth,
522 | day: preDay
523 | }, function (output) {
524 | outputs.push({
525 | templ: output
526 | });
527 |
528 | // 初始化默认当前日期
529 | var curYear = options.year || self.DateObj().getFullYear();
530 | var curMonth = options.month || self.tod(self.DateObj().getMonth() + 1);
531 | var curDay = options.day || self.tod(self.DateObj().getDate());
532 | //alert("默认对不对:"+curYear+"-"+curMonth+"-"+curDay);
533 | self.curYear = options.year || self.DateObj().getFullYear();
534 | self.curMonth = options.month || self.tod(self.DateObj().getMonth() + 1);
535 | self.curDay = options.day || self.tod(self.DateObj().getDate());
536 | if(self.options.isDebug) {
537 | console.log("(中)初始化年月日:" + curYear + "-" + curMonth + "-" + curDay);
538 | }
539 |
540 | // 生成本月份的日历
541 | self.refreshData({
542 | year: curYear,
543 | month: curMonth,
544 | day: curDay
545 | }, function (output1) {
546 | outputs.push({
547 | templ: output1
548 | });
549 | // 渲染日历模板
550 | var templ = self.SLIDER_ITEM_CONTAINER;
551 |
552 | var html = "";
553 | for(var i = 0; i < outputs.length; i++) {
554 | html += Mustache.render(templ, outputs[i]);
555 | }
556 | document.querySelector(".swiper-wrapper").innerHTML = html;
557 | // 初始化swiper监听
558 | self._addEvent();
559 | });
560 | });
561 | },
562 | /**
563 | * 刷新日历,传入日期格式须:2017-07-01 或2017-12-09
564 | */
565 | //refreshData: function(year, month, day, activeSlideNode) {
566 | refreshData: function (dateObj, callback) {
567 | var self = this;
568 |
569 | self.nowYear = parseInt(dateObj.year);
570 | self.nowMonth = self.tom(dateObj.month);
571 | self.nowDay = self.tod(dateObj.day);
572 |
573 | // 获取星期
574 | var tmptmp = new Date(Date.parse(self.nowYear + '/' + self.nowMonth + '/01'));
575 | var nowXingQiJi = tmptmp.getDay();
576 | //console.log("星期"+nowXingQiJi);
577 |
578 | nowXingQiJi = parseInt(nowXingQiJi);
579 | if(nowXingQiJi == 0) {
580 | nowXingQiJi = 7;
581 | }
582 | // 根据年份、月份 计算月份中的天数(比如:28、29、30、31等)
583 | var dayCount = self._judgeDaysByYearMonth(self.nowYear, self.nowMonth);
584 | // 总天数
585 | self.dayCount = dayCount;
586 | // 保留老的存储方式
587 | var fileInfo = {};
588 | // 新的存储方式
589 | var tmpInfo = [];
590 |
591 | var preDayCount = self._judgeDaysByYearMonth(self.nowYear, parseInt(self.nowMonth - 1));
592 | //console.log("前一月总天数:" + preDayCount);
593 | preDayCount = parseInt(preDayCount);
594 |
595 | // 头部日期计算
596 | for(var i = 1; i < nowXingQiJi + 1; i++) {
597 | var preMonthDay = preDayCount - nowXingQiJi + i;
598 | var tmpName = 'day' + i;
599 | var lunar = 'lunar' + i;
600 | //日、农历、完整日期
601 | var y = parseInt(self.nowYear);
602 | var m = parseInt(self.nowMonth);
603 | m = -1 + m;
604 | if(m == 0) {
605 | m = 12
606 | y = parseInt(self.nowYear - 1)
607 | }
608 | fileInfo[tmpName] = preMonthDay;
609 | fileInfo[lunar] = self._getLunar(preMonthDay, m, y);
610 | // console.log("农历:" + fileInfo[lunar]);
611 | //存储前一个月数据
612 | //console.log(self.nowYear + "-" + self.tom(parseInt(self.nowMonth - 1)) + "-" + self.tod(preMonthDay));
613 | tmpInfo.push({
614 | day: preMonthDay, //日
615 | lunar: self._getLunar(preMonthDay, m, y), //农历
616 | date: y + "-" + self.tom(m) + "-" + self.tod(preMonthDay), //完整日期
617 | isforbid: "0", //前一个月和后一个月不可点击
618 | tip: 'prev',
619 | });
620 | //console.log("年份:" + self.nowYear);
621 | //console.log("上个月的数据:\n" + JSON.stringify(tmpInfo)+"\n");
622 | }
623 | var daonale = 0;
624 |
625 | if(dayCount == '28') {
626 | daonale = 28 + nowXingQiJi;
627 | for(var index = nowXingQiJi + 1, indexindex = 1; index < (28 + nowXingQiJi + 1); index++, indexindex++) {
628 | var tmpName = 'day' + index;
629 | var lunar = 'lunar' + index;
630 | fileInfo[tmpName] = indexindex;
631 | fileInfo[lunar] = self._getLunar(indexindex);
632 | //存储当前月数据
633 | tmpInfo.push({
634 | day: indexindex, //日
635 | lunar: self._getLunar(indexindex), //农历
636 | date: self.nowYear + "-" + self.tom(self.nowMonth) + "-" + self.tod(indexindex), //完整日期
637 | isforbid: "1" //当前月可点击
638 | });
639 | // console.log(self.tom(parseInt(self.nowMonth)) + "月份:" + self.tod(indexindex));
640 |
641 | }
642 | }
643 | if(dayCount == '29') {
644 | daonale = 29 + nowXingQiJi;
645 | for(var index = nowXingQiJi + 1, indexindex = 1; index < (29 + nowXingQiJi + 1); index++, indexindex++) {
646 | var tmpName = 'day' + index;
647 | var lunar = 'lunar' + index;
648 | fileInfo[tmpName] = indexindex;
649 | fileInfo[lunar] = self._getLunar(indexindex);
650 | //存储当前月数据
651 | tmpInfo.push({
652 | day: indexindex, //日
653 | lunar: self._getLunar(indexindex), //农历
654 | date: self.nowYear + "-" + self.tom(self.nowMonth) + "-" + self.tod(indexindex), //完整日期
655 | isforbid: "1" //当前月可点击
656 | });
657 | //console.log(self.tom(parseInt(self.nowMonth)) + "月份:" + self.tod(indexindex));
658 |
659 | }
660 | }
661 | if(dayCount == '30') {
662 | daonale = 30 + nowXingQiJi;
663 | for(var index = nowXingQiJi + 1, indexindex = 1; index < (30 + nowXingQiJi + 1); index++, indexindex++) {
664 | var tmpName = 'day' + index;
665 | var lunar = 'lunar' + index;
666 | fileInfo[tmpName] = indexindex;
667 | fileInfo[lunar] = self._getLunar(indexindex);
668 | //存储当前月数据
669 | tmpInfo.push({
670 | day: indexindex, //日
671 | lunar: self._getLunar(indexindex), //农历
672 | date: self.nowYear + "-" + self.tom(self.nowMonth) + "-" + self.tod(indexindex), //完整日期
673 | isforbid: "1" //当前月可点击
674 | });
675 | //console.log(self.tom(parseInt(self.nowMonth)) + "月份:" + self.tod(indexindex));
676 | }
677 | }
678 | if(dayCount == '31') {
679 | daonale = 31 + nowXingQiJi;
680 | for(var index = nowXingQiJi + 1, indexindex = 1; index < (31 + nowXingQiJi + 1); index++, indexindex++) {
681 | var tmpName = 'day' + index;
682 | var lunar = 'lunar' + index;
683 | fileInfo[tmpName] = indexindex;
684 | fileInfo[lunar] = self._getLunar(indexindex);
685 | //存储当前月数据
686 | tmpInfo.push({
687 | day: indexindex, //日
688 | lunar: self._getLunar(indexindex), //农历
689 | date: self.nowYear + "-" + self.tom(self.nowMonth) + "-" + self.tod(indexindex), //完整日期
690 | isforbid: "1" //当前月可点击
691 | });
692 | //console.log(self.tom(parseInt(self.nowMonth)) + "月份:" + self.tod(indexindex));
693 | }
694 | }
695 | // 尾部日期计算
696 | for(var index2 = daonale + 1, index3 = 1; index2 <= 42; index2++, index3++) {
697 | var tmpName = 'day' + index2;
698 | var lunar = 'lunar' + index2;
699 | //日、农历、完整日期
700 | var y2 = parseInt(self.nowYear);
701 | var m2 = parseInt(self.nowMonth) + parseInt(1);
702 | if(m2 == 13) {
703 | m2 = 1;
704 | y2 = parseInt(self.nowYear) + parseInt(1)
705 | }
706 | fileInfo[tmpName] = index3;
707 | fileInfo[lunar] = self._getLunar(index3, m2, y2);
708 | //存储当前月数据
709 | tmpInfo.push({
710 | day: index3, //日
711 | lunar: self._getLunar(index3, m2, y2), //农历
712 | date: y2 + "-" + self.tom(m2) + "-" + self.tod(index3), //完整日期
713 | isforbid: "0", //前一月和后一月不可点击
714 | tip: 'next',
715 | });
716 | //console.log("后面一个月的数据:\n" + JSON.stringify(tmpInfo) + "\n");
717 | //console.log(self.tom(parseInt(self.nowMonth) + parseInt(1)) + "月份:" + self.tod(index3));
718 | }
719 | if(self.options.isDebug) {
720 | console.log("*********日历格式********:\n" + JSON.stringify(tmpInfo) + "\n");
721 | }
722 | //this._render(fileInfo, tmpInfo, dateObj.activeSlideNode);
723 | this._render({
724 | fileInfo: fileInfo,
725 | tmpInfo: tmpInfo,
726 | activeSlideNode: dateObj.activeSlideNode,
727 | }, callback);
728 | },
729 |
730 | /**
731 | * 视图的渲染和数据分离,采用内部的数据
732 | */
733 | //_render: function(fileInfo, tmpInfo, activeSlideNode) {
734 | _render: function (dataObj, callback) {
735 | var self = this;
736 | //console.log("XXXX" + JSON.stringify(dataObj.fileInfo));
737 | // 渲染之前,业务ajax请求,显示日历上日程标记
738 | var dateStr = self.nowYear + "-" + self.nowMonth + "-";
739 |
740 | // 必须设置延迟300ms,否则滑动有偏差
741 | setTimeout(function () {
742 | self.options.dataRequest(dateStr, function (data) {
743 | var res = data || [];
744 | //和业务绑定
745 | if(self.options.isDebug) {
746 | console.log("*********业务数据:********:\n" + JSON.stringify(res) + "\n");
747 | }
748 | for(var j = 0; j < res.length; j++) {
749 | for(var i = 0; i < dataObj.tmpInfo.length; i++) {
750 | if(res[j].date == dataObj.tmpInfo[i].date) {
751 | dataObj.tmpInfo[i].isSelected = "1";
752 | }
753 | }
754 | }
755 | //完全支持自定义外部传入模板
756 | var html = self.getThemeHtml(dataObj);
757 |
758 | if(self.options.isDebug) {
759 | console.log("*********日历模板********:\n" + html + "\n");
760 | }
761 | if(typeof (callback) == "function") {
762 | callback && callback(html, dataObj.tmpInfo);
763 | }
764 |
765 | return;
766 | }, self);
767 | }, 100);
768 | },
769 | /**
770 | * 获取主题模板
771 | */
772 | getThemeHtml: function (dataObj) {
773 | var self = this;
774 | // 模板集合
775 | var html = "";
776 | // 模板项
777 | var template = "";
778 | // 当前日期
779 | var curr = self.currentDate;
780 |
781 | for(var i = 0, len = dataObj.tmpInfo.length; i < len; i++) {
782 | // 如果传入模板为空,则默认日历主题模板
783 | var value = dataObj.tmpInfo[i];
784 | var templData = self.options.template(value, curr);
785 | if(!templData) {
786 | //console.log("=======默认日历主题模板=======");
787 | // =======默认日历主题模板=======
788 | // 上一月和下一月不可点击模板
789 | if(value.date == curr) {
790 | //今天
791 | if(value.isSelected) {
792 | template = '';
793 | } else {
794 | template = '';
795 | }
796 | } else {
797 | if(value.isSelected) {
798 | // 个性化和业务贴近
799 | template = '';
800 | } else {
801 | template = '';
802 | }
803 | }
804 | html += Mustache.render(template, value);
805 | } else {
806 | // console.log("=======自定义传入=======");
807 | // =======自定义传入=======
808 | html += Mustache.render(templData, value);
809 | }
810 | }
811 |
812 | return html;
813 | },
814 | /**
815 | * 创建DOM元素工厂,将样式固定结构存储起来,外部可通过样式修改
816 | */
817 | CreateDOMFactory: function (callback) {
818 | var self = this;
819 | // 头部样式
820 | self.HEADER_BAR = '\
821 | 日\
822 | 一\
823 | 二\
824 | 三\
825 | 四\
826 | 五\
827 | 六\
828 |
';
829 |
830 | self.HEADER = '
\
831 |
';
832 |
833 | // 底部样式
834 | self.FOOTER = '
\
835 |
\
836 |
';
837 |
838 | // 日历面板容器样式
839 | self.SLIDER_ITEM_CONTAINER = '\
840 |
\
841 |
{{{templ}}}
\
842 |
';
843 |
844 | var output = self.HEADER_BAR + self.HEADER + self.FOOTER;
845 | self.container.innerHTML = output;
846 |
847 | // 执行回调
848 | callback && callback();
849 | },
850 | /*
851 | * JSON数组去重
852 | * @param: [array] json Array
853 | * @param: [string] 唯一的key名,根据此键名进行去重
854 | */
855 | uniqueArray: function (array, key) {
856 | var result = [array[0]];
857 | for(var i = 1; i < array.length; i++) {
858 | var item = array[i];
859 | var repeat = false;
860 | for(var j = 0; j < result.length; j++) {
861 | if(item[key] == result[j][key]) {
862 | repeat = true;
863 | break;
864 | }
865 | }
866 | if(!repeat) {
867 | result.push(item);
868 | }
869 | }
870 | return result;
871 |
872 | },
873 | /**
874 | * 增加事件,包括
875 | * 日历点击的监听
876 | * 日历左滑、右滑切换,等等
877 | */
878 | _addEvent: function () {
879 | var self = this;
880 | var onItemClick = self.options.onItemClick;
881 | var swipeCallback = self.options.swipeCallback;
882 | var preCallback = self.options.preCallback;
883 | var nextCallback = self.options.nextCallback;
884 |
885 | // 记录上一月和上一年的索引
886 | var preMonthIndex = parseInt(self.curMonth) - parseInt(2);;
887 | var preYearIndex = self.curYear;
888 | // 记录下一月和下一年的索引
889 | var nextMonthIndex = parseInt(self.curMonth);
890 | var nextYearIndex = self.DateObj().getFullYear();
891 | var nextYear = self.curYear;
892 | var nextMonth;
893 |
894 | var count = 0;
895 | var currYearIndex = self.curYear;
896 | var currMonthIndex = parseInt(self.curMonth);
897 | var currDayIndex = self.curDay;
898 | // 创建swiper 组件对象
899 | self.mySwiper = new Swiper('.swiper-container', {
900 | loop: false,
901 | initialSlide: 1,
902 | speed: 150,
903 | prevButton: self.options.pre,
904 | nextButton: self.options.next,
905 | // 增加监听点击事件
906 | onClick: function (swiper, e) {
907 | // console.log(e.target.innerHTML);
908 | // 日期灰色部分不启用
909 | var _this = e.target.parentNode;
910 | // 日期输出值
911 | var dateStr = _this.getAttribute('date');
912 | // 农历输出值
913 | if(_this.querySelector('.lunar')) {
914 | var lunarStr = _this.querySelector('.lunar').innerText.trim();
915 | } else {
916 | var lunarStr = "已签";
917 | }
918 | // 可点击区域
919 | if(!_this.classList.contains('isforbid0')) {
920 | if(_this.getAttribute("date")) {
921 | _this.classList.add('em-calendar-active');
922 | self.sibling(_this, function (el) {
923 | el.classList.remove('em-calendar-active');
924 | });
925 | }
926 | } else {
927 | // 不可点击区域
928 | if(_this.classList.contains('tipprev')) {
929 | // 前进
930 | self.slidePrev().then(function () {
931 | // 给特定日期新增点击激活样式
932 | self.addActiveStyleFordate(dateStr);
933 | });
934 | } else if(_this.classList.contains('tipnext')) {
935 | // 后退
936 | self.slideNext().then(function () {
937 | // 给特定日期新增点击激活样式
938 | self.addActiveStyleFordate(dateStr);
939 | });
940 |
941 | }
942 | }
943 | // 点击回调
944 | onItemClick && onItemClick({
945 | date: dateStr, //日期
946 | lunar: lunarStr //农历
947 | });
948 | },
949 | /**
950 | * @description 月份递增
951 | * @param {Object} swiper swiper对象
952 | */
953 | onSlideNextStart: function (swiper) {
954 | count++;
955 | if(count == "1") {
956 | //alert("等于1,并不能代表是当前月");
957 | //alert("传过来的是"+self.nowYear+self.nowMonth);
958 | currDayIndex = self.curDay;
959 | currMonthIndex = parseInt(self.curMonth);
960 | } else {
961 | currMonthIndex = currMonthIndex + 1;
962 | currDayIndex = "01";
963 |
964 | }
965 | if(currMonthIndex == "13") {
966 | currYearIndex = parseInt(currYearIndex) + parseInt(1);
967 | currMonthIndex = 1;
968 | }
969 | // 开启调试模式
970 | if(self.options.isDebug) {
971 | console.log("currMonthIndex:" + currMonthIndex);
972 | console.log("currYearIndex:" + currYearIndex);
973 | console.log(">>>>>>" + self.nowYear + "-" + self.nowMonth + "-" + self.nowDay);
974 | }
975 | //alert("向后回调"+">>>>>>" + currYearIndex + "-" + currMonthIndex + "-" + self.nowDay);
976 | //回调
977 | swipeCallback && swipeCallback({
978 | year: currYearIndex,
979 | month: self.tom(currMonthIndex),
980 | day: currDayIndex,
981 | date: currYearIndex + "-" + self.tom(currMonthIndex) + "-" + currDayIndex,
982 | dayCount: self.dayCount
983 | });
984 | /**
985 | * @description 后加
986 | */
987 | nextMonthIndex += parseInt(1);
988 | if(nextMonthIndex == 13) {
989 | nextYear = nextYearIndex + 1;
990 | nextMonthIndex = 1;
991 | }
992 | nextMonth = self.tom(nextMonthIndex);
993 |
994 | if(self.options.isDebug) {
995 | console.log("(后)初始化年月日:" + nextYear + "-" + nextMonth + "-" + "01");
996 | }
997 |
998 | self.refreshData({
999 | year: nextYear,
1000 | month: nextMonth,
1001 | day: "01"
1002 | }, function (output1) {
1003 | var outputs = [];
1004 | outputs.push({
1005 | templ: output1
1006 | });
1007 | // 渲染日历模板
1008 | var templ = self.SLIDER_ITEM_CONTAINER;
1009 | var html = "";
1010 | for(var i = 0; i < outputs.length; i++) {
1011 | html += Mustache.render(templ, outputs[i]);
1012 | }
1013 | swiper.appendSlide(html);
1014 | });
1015 | // 如果往后滑动时后一个月非当前月,重新渲染1号样式
1016 | if(self.tom(currMonthIndex) !== self.curMonth) {
1017 | var chooseDom = document.querySelector('.swiper-slide-active .em-calendar-active')
1018 | if(chooseDom) {
1019 | chooseDom.classList.remove('em-calendar-active')
1020 | }
1021 | document.querySelector('.swiper-slide-active .isforbid1').classList.add('em-calendar-active')
1022 |
1023 | }
1024 |
1025 | },
1026 | /**
1027 | * @description 月份递减
1028 | * @param {Object} swiper swiper对象
1029 | */
1030 | onSlidePrevStart: function (swiper) {
1031 | count--;
1032 | if(count == "1") {
1033 | currDayIndex = self.curDay;
1034 | currMonthIndex = parseInt(self.curMonth);
1035 | } else {
1036 | currMonthIndex = parseInt(currMonthIndex) - parseInt(1);
1037 | currDayIndex = "01";
1038 |
1039 | }
1040 |
1041 | if(currMonthIndex == 0) {
1042 | currYearIndex = parseInt(currYearIndex) - parseInt(1);
1043 | currMonthIndex = 12;
1044 | }
1045 | // 开启调试模式
1046 | if(self.options.isDebug) {
1047 | console.log("currMonthIndex:" + currMonthIndex);
1048 | console.log("currYearIndex:" + currYearIndex);
1049 | console.log("当前" + self.nowYear + "-" + self.nowMonth + "月份");
1050 | }
1051 |
1052 | // 点击回调
1053 | swipeCallback && swipeCallback({
1054 | year: currYearIndex,
1055 | month: self.tom(currMonthIndex),
1056 | day: currDayIndex,
1057 | date: currYearIndex + "-" + self.tom(currMonthIndex) + "-" + currDayIndex,
1058 | dayCount: self.dayCount
1059 | });
1060 |
1061 | if(preMonthIndex == 0) {
1062 | preYearIndex--;
1063 | preMonthIndex = 12;
1064 | }
1065 | var preMonth = self.tom(preMonthIndex);
1066 | //console.log("前加:" + preYearIndex + "-" + preMonth + "-" + "01");
1067 | //ejs.ui.toast("前加:" + preYearIndex + "-" + preMonth + "-" + preDay);
1068 |
1069 | preMonthIndex--;
1070 | // 刷新日历
1071 |
1072 | self.refreshData({
1073 | year: preYearIndex,
1074 | month: preMonth,
1075 | day: "01"
1076 | }, function (output1) {
1077 |
1078 | var outputs = [];
1079 | outputs.push({
1080 | templ: output1
1081 | });
1082 | // 渲染日历模板
1083 | var templ = self.SLIDER_ITEM_CONTAINER;
1084 | var html = "";
1085 | for(var i = 0; i < outputs.length; i++) {
1086 | html += Mustache.render(templ, outputs[i]);
1087 | }
1088 | swiper.prependSlide(html);
1089 | });
1090 |
1091 | // 如果往前滑动时前一个月非当前月,重新渲染1号样式
1092 | if(self.tom(currMonthIndex) !== self.curMonth) {
1093 | var chooseDom = document.querySelector('.swiper-slide-active .em-calendar-active')
1094 | if(chooseDom) {
1095 | chooseDom.classList.remove('em-calendar-active')
1096 | }
1097 | document.querySelector('.swiper-slide-active .isforbid1').classList.add('em-calendar-active')
1098 |
1099 | }
1100 | }
1101 | });
1102 |
1103 | // 回到今天
1104 | if(self._selector(self.options.backToToday)) {
1105 | self._selector(self.options.backToToday).addEventListener("touchstart", function () {
1106 | // 外部执行回调
1107 | var curYear = self.DateObj().getFullYear();
1108 | var curMonth = self.tod(self.DateObj().getMonth() + 1);
1109 | var curDay = self.tod(self.DateObj().getDate());
1110 | // 刷新
1111 | self.refresh();
1112 |
1113 | });
1114 | }
1115 | },
1116 | /**
1117 | * @description 给特定日期新增选中激活样式
1118 | * @param {Object} dateStr 点击后的日期 ,例如:“2018-08-20”
1119 | */
1120 | addActiveStyleFordate: function (dateStr) {
1121 | var self = this;
1122 | // 给前后月的点击日期加选中标记
1123 | var clickactives = document.querySelector('.swiper-slide-active').querySelectorAll('.em-calendar-item');
1124 | for(var i = 0; i < clickactives.length; i++) {
1125 | if(clickactives[i].getAttribute("date") == dateStr) {
1126 | clickactives[i].classList.add('em-calendar-active');
1127 | self.sibling(clickactives[i], function (el) {
1128 | el.classList.remove('em-calendar-active');
1129 | });
1130 | }
1131 | }
1132 | },
1133 | /**
1134 | * 向前滑动
1135 | */
1136 | slidePrev: function (options) {
1137 | var self = this;
1138 | return new Promise(function (resolve, reject) {
1139 | self.mySwiper.slidePrev();
1140 | return resolve(options);
1141 | });
1142 | },
1143 |
1144 | /**
1145 | * 向后滑动
1146 | */
1147 | slideNext: function (options) {
1148 | var self = this;
1149 | return new Promise(function (resolve, reject) {
1150 | self.mySwiper.slideNext();
1151 | return resolve(options);
1152 | });
1153 | },
1154 | /**
1155 | * 外部刷新
1156 | */
1157 | refresh: function (options) {
1158 | var self = this;
1159 | // 销毁
1160 | self.destroySwiper();
1161 | // 创建
1162 | self.initEntry(options);
1163 |
1164 | },
1165 | /**
1166 | * 销毁swiper
1167 | */
1168 | destroySwiper: function () {
1169 | var self = this;
1170 | // 销毁
1171 | self.mySwiper.destroy(true);
1172 | },
1173 |
1174 | /**
1175 | * 获取当前农历
1176 | * @param {Object} currentday
1177 | * @param {Object} month
1178 | * @return {String}
1179 | */
1180 | _getLunar: function (currentday, month, year) {
1181 | var self = this;
1182 | // 中间需默认当前年和当前月,两头需要传年和月
1183 | var yy = year || self.nowYear;
1184 | var mm = month || self.nowMonth;
1185 | var dd = currentday;
1186 | return this._getLunarDay(yy, mm, dd);
1187 | },
1188 | /**
1189 | * 根据年月计算当月的天数
1190 | * @param {Object} y
1191 | * @param {Object} m
1192 | */
1193 | _judgeDaysByYearMonth: function (y, m) {
1194 | var self = this;
1195 | if(y == undefined || y == null) {
1196 | throw "=====获取当前月份天数时,缺少y参数,未定义!=======";
1197 | }
1198 | if(m == undefined || m == null) {
1199 | throw "=====获取当前月份天数时,缺少m参数,未定义!=======";
1200 | }
1201 | var y = parseInt(y);
1202 | var m = parseInt(m);
1203 | if(m == 0) {
1204 | y--;
1205 | m = 12;
1206 | }
1207 | if(m == 2) {
1208 | if((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
1209 | return '29';
1210 | } else {
1211 | return '28';
1212 | }
1213 | } else {
1214 | if(self._inArray(m, [1, 3, 5, 7, 8, 10, 12])) {
1215 | return '31';
1216 | } else {
1217 | return '30';
1218 | }
1219 | }
1220 |
1221 | },
1222 |
1223 | /**
1224 | * 进行一次全局验证,验证输入的合法性
1225 | * 这个验证是强制性的
1226 | */
1227 | _validate: function () {
1228 | var flag = true;
1229 | if(!this.options.container) {
1230 | flag = false;
1231 | }
1232 | return flag;
1233 | },
1234 | _selector: function (el) {
1235 | // 减少耦合
1236 | return document.querySelector(el);
1237 | },
1238 | /**
1239 | * 判断元素在数组中是否存在
1240 | * @param {Object} str 数字或者字符串元素
1241 | * @param {Object} arr 有效数组
1242 | */
1243 | _inArray: function (str, arr) {
1244 | // 不是数组则抛出异常
1245 | if(!Array.isArray(arr)) {
1246 | throw "arguments is not Array";
1247 | }
1248 | // 遍历是否在数组中
1249 | for(var i = 0, k = arr.length; i < k; i++) {
1250 | if(str == arr[i]) {
1251 | return true;
1252 | }
1253 | }
1254 | // 如果不在数组中就会返回false
1255 | return false;
1256 | },
1257 | // 遍历查找同级元素
1258 | _sibling: function (elem, forCB) {
1259 | var r = [];
1260 | var n = elem.parentNode.firstChild;
1261 | for(; n; n = n.nextSibling) {
1262 | if(n.nodeType === 1 && n !== elem) {
1263 | if(forCB && typeof (forCB) == "function") {
1264 | forCB(n);
1265 | }
1266 | }
1267 | }
1268 | },
1269 | _getBit: function (m, n) {
1270 | var self = this;
1271 | // 农历转换
1272 | return(m >> n) & 1;
1273 | },
1274 | _e2c: function () {
1275 | var self = this;
1276 | self.TheDate = (arguments.length != 3) ? new Date() : new Date(arguments[0], arguments[1], arguments[2]);
1277 | var total, m, n, k;
1278 | var isEnd = false;
1279 | var tmp = self.TheDate.getYear();
1280 | if(tmp < 1900) {
1281 | tmp += 1900;
1282 | }
1283 | total = (tmp - 1921) * 365 + Math.floor((tmp - 1921) / 4) + self.madd[self.TheDate.getMonth()] + self.TheDate.getDate() - 38;
1284 |
1285 | if(self.TheDate.getYear() % 4 == 0 && self.TheDate.getMonth() > 1) {
1286 | total++;
1287 | }
1288 | for(m = 0;; m++) {
1289 | k = (self.CalendarData[m] < 0xfff) ? 11 : 12;
1290 | for(n = k; n >= 0; n--) {
1291 | if(total <= 29 + self._getBit(self.CalendarData[m], n)) {
1292 | isEnd = true;
1293 | break;
1294 | }
1295 | total = total - 29 - self._getBit(self.CalendarData[m], n);
1296 | }
1297 | if(isEnd) break;
1298 | }
1299 | self.cYear = 1921 + m;
1300 | self.cMonth = k - n + 1;
1301 | self.cDay = total;
1302 | if(k == 12) {
1303 | if(self.cMonth == Math.floor(self.CalendarData[m] / 0x10000) + 1) {
1304 | self.cMonth = 1 - self.cMonth;
1305 | }
1306 | if(self.cMonth > Math.floor(self.CalendarData[m] / 0x10000) + 1) {
1307 | self.cMonth--;
1308 | }
1309 | }
1310 |
1311 | },
1312 |
1313 | _getcDateString: function () {
1314 | var self = this;
1315 | var tmp = "";
1316 | /*显示农历年:( 如:甲午(马)年 )*/
1317 | if(self.cMonth < 1) {
1318 | // tmp += "(闰)";
1319 | // tmp += self.monString.charAt(-self.cMonth - 1);
1320 | } else {
1321 | // tmp += self.monString.charAt(self.cMonth - 1);
1322 | }
1323 | //tmp += "月";
1324 | tmp += (self.cDay < 11) ? "初" : ((self.cDay < 20) ? "十" : ((self.cDay < 30) ? "廿" : "三十"));
1325 | if(self.cDay % 10 != 0 || self.cDay == 10) {
1326 | tmp += self.numString.charAt((self.cDay - 1) % 10);
1327 | }
1328 | return tmp;
1329 |
1330 | },
1331 | _getLunarDay: function (solarYear, solarMonth, solarDay) {
1332 | var self = this;
1333 | //solarYear = solarYear<1900?(1900+solarYear):solarYear;
1334 | if(solarYear < 1921 || solarYear > 2080) {
1335 | return "";
1336 | } else {
1337 | solarMonth = (parseInt(solarMonth) > 0) ? (solarMonth - 1) : 11;
1338 | self._e2c(solarYear, solarMonth, solarDay);
1339 | return self._getcDateString();
1340 | }
1341 |
1342 | },
1343 | /**
1344 | * 将1,2,3,4,5格式化01,02,03,04,05
1345 | * @param {Object} m 月份转换
1346 | */
1347 | tom: function (m) {
1348 | if(parseInt(m) > 9) {
1349 | m = "" + parseInt(m);
1350 | } else {
1351 | m = "0" + parseInt(m);
1352 | }
1353 | return m;
1354 | },
1355 | /**
1356 | * 将1,2,3,4,5格式化01,02,03,04,05
1357 | * @param {Object} 日转换
1358 | */
1359 | tod: function (d) {
1360 | if(parseInt(d) > 9) {
1361 | d = "" + parseInt(d);
1362 | } else {
1363 | d = "0" + parseInt(d);
1364 | }
1365 | return d;
1366 | },
1367 | /**
1368 | * 获取小时、分钟、秒 例如:18:09:00
1369 | * @param {Object} format hh:mm 输出00:00 hh:mm:ss 输出00:00:00
1370 | */
1371 | getTime: function (format) {
1372 | var self = this;
1373 | var hh = self.DateObj().getHours();
1374 | var mm = self.DateObj().getMinutes();
1375 | var ss = self.DateObj().getSeconds();
1376 | var timeStr = "";
1377 | if("hh:mm" == format) {
1378 | timeStr += hh + ":" + mm;
1379 | } else if("hh:mm:ss" == format) {
1380 | timeStr += hh + ":" + mm + ":" + ss;
1381 | }
1382 | return timeStr;
1383 | },
1384 | /**
1385 | * 获取对象
1386 | */
1387 | DateObj: function (dateStr) {
1388 | var dateObj;
1389 | if(!dateStr) {
1390 | //throw("请输入合法日期格式!"+str);
1391 | dateObj = new Date();
1392 | } else {
1393 | // 注意:须先把时间戳(122891289)转成字符串然后进行查找
1394 | var index = dateStr.toString().indexOf('-');
1395 | if(index == "-1") {
1396 | // 解析时间戳
1397 | dateObj = new Date(dateStr);
1398 | } else {
1399 | // 解析正常格式时间戳,切记不要直接传 new Date 2017-09-09 19:00:00,
1400 | dateObj = new Date(dateStr.replace(/-/g, '/'));
1401 | }
1402 | }
1403 | return dateObj;
1404 | },
1405 | /**
1406 | * @description 获取某个元素的所有兄弟节点;这里还是建议使用库来实现 ,喜欢深究的可以参考下面代码(原理类似Zepto,jquery 的silbling()方法)。
1407 | * @param {Object} elem 选中的当前节点
1408 | * @param {Function} forCB 遍历回调每个兄弟节点
1409 | * 用法如下:
1410 | */
1411 | sibling: function (elem, forCB) {
1412 | var r = [];
1413 | var n = elem.parentNode.firstChild;
1414 | for(; n; n = n.nextSibling) {
1415 | if(n.nodeType === 1 && n !== elem) {
1416 | if(forCB && typeof (forCB) == "function") {
1417 | forCB(n);
1418 | }
1419 | }
1420 | }
1421 | },
1422 |
1423 | };
1424 |
1425 | window.Calendar = Calendar;
1426 | })();
1427 |
--------------------------------------------------------------------------------
/libs/mustache.min.js:
--------------------------------------------------------------------------------
1 | (function defineMustache(global,factory){if(typeof exports==="object"&&exports&&typeof exports.nodeName!=="string"){factory(exports)}else if(typeof define==="function"&&define.amd){define(["exports"],factory)}else{global.Mustache={};factory(global.Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)==="[object Array]"};function isFunction(object){return typeof object==="function"}function typeStr(obj){return isArray(obj)?"array":typeof obj}function escapeRegExp(string){return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function hasProperty(obj,propName){return obj!=null&&typeof obj==="object"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};function escapeHtml(string){return String(string).replace(/[&<>"'`=\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile==="string")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error("Invalid tags: "+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===""};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){value=context.view;names=name.split(".");index=0;while(value!=null&&index")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol==="&")value=this.unescapedValue(token,context);else if(symbol==="name")value=this.escapedValue(token,context);else if(symbol==="text")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j.swiper-wrapper{-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate(0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{-webkit-flex-shrink:0;-ms-flex:0 0 auto;flex-shrink:0;width:100%;height:100%;position:relative}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform,height}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;-moz-background-size:27px 44px;-webkit-background-size:27px 44px;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;transition:.3s;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1;background:#007aff}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination-bullets{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-o-transform:translate(0,-50%);-ms-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 5px}.swiper-pagination-progress{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progress .swiper-pagination-progressbar{background:#007aff;position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left top}.swiper-container-rtl .swiper-pagination-progress .swiper-pagination-progressbar{-webkit-transform-origin:right top;-moz-transform-origin:right top;-ms-transform-origin:right top;-o-transform-origin:right top;transform-origin:right top}.swiper-container-horizontal>.swiper-pagination-progress{width:100%;height:4px;left:0;top:0}.swiper-container-vertical>.swiper-pagination-progress{width:4px;height:100%;left:0;top:0}.swiper-pagination-progress.swiper-pagination-white{background:rgba(255,255,255,.5)}.swiper-pagination-progress.swiper-pagination-white .swiper-pagination-progressbar{background:#fff}.swiper-pagination-progress.swiper-pagination-black .swiper-pagination-progressbar{background:#000}.swiper-container-3d{-webkit-perspective:1200px;-moz-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-coverflow .swiper-wrapper,.swiper-container-flip .swiper-wrapper{-ms-perspective:1200px}.swiper-container-cube,.swiper-container-flip{overflow:visible}.swiper-container-cube .swiper-slide,.swiper-container-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-container-cube .swiper-slide .swiper-slide,.swiper-container-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-active .swiper-slide-active,.swiper-container-flip .swiper-slide-active,.swiper-container-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top,.swiper-container-flip .swiper-slide-shadow-bottom,.swiper-container-flip .swiper-slide-shadow-left,.swiper-container-flip .swiper-slide-shadow-right,.swiper-container-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-slide{visibility:hidden;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;width:100%;height:100%}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-zoom-container{width:100%;height:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-pack:center;-moz-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-moz-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-moz-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;-moz-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;-webkit-background-size:100%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}}
--------------------------------------------------------------------------------