├── README.md ├── animate.html ├── css3-animate.html ├── js ├── bezier.js └── 遍历多叉树(递归、非递归) │ └── tree-iterator.js ├── timetag.js ├── util.js ├── utils-page ├── css │ └── index.css ├── index.html └── js │ ├── index.js │ ├── jquery-2.1.4.js │ ├── jquery.qrcode.min.js │ └── pic-preview-base64-jq.js ├── webApp-layout ├── index.html └── sprite.png └── 第三方工具 ├── mobiscroll.more ├── css │ ├── icons_mobiscroll.eot │ ├── icons_mobiscroll.svg │ ├── icons_mobiscroll.ttf │ ├── icons_mobiscroll.woff │ └── mobiscroll.custom-2.17.0.min.css ├── index.html ├── js │ └── mobiscroll.custom-2.17.0.min.more.js ├── license │ └── EULA.pdf └── readme.txt └── mobiscroll.trial ├── css ├── icons_mobiscroll.eot ├── icons_mobiscroll.svg ├── icons_mobiscroll.ttf ├── icons_mobiscroll.woff └── mobiscroll.custom-2.17.0.min.css ├── index.html ├── js └── mobiscroll.custom-2.17.0.min.js ├── license └── EULA.pdf └── readme.txt /README.md: -------------------------------------------------------------------------------- 1 | # notes 2 | 3 | 日常学习的一些有用小笔记 4 | 5 | ## 博客 6 | * [剖析Vue原理&实现双向绑定MVVM](https://segmentfault.com/a/1190000006599500) 7 | * [微信小游戏跳一跳Node版本 - 半自动版](https://github.com/DMQ/jumpgame-auto/blob/master/README.md) 8 | * [移动端web app自适应布局探索与总结](http://segmentfault.com/a/1190000003931773) 9 | * [web app遇到的一些坑及小技能(持续更新...)](http://segmentfault.com/a/1190000003932970) 10 | * [css编码规范](http://segmentfault.com/a/1190000003992270) 11 | * [遍历多叉树(递归、非递归广度优先、深度优先)](https://segmentfault.com/a/1190000003004435) 12 | 13 | ## 网站收录 14 | * [基于webpack的在线调试(vue)工具 -- webpackbin](http://www.webpackbin.com/EJsur-jpl) 15 | * [基于bootstrap的拖拉生成页面工具](https://bootstrapstudio.io/) 16 | * [占位图利器 -- placehold](https://placehold.it/) 17 | * [js编译成app利器 -- fuse](https://www.fusetools.com/); [相关文章](http://www.tuicool.com/articles/NfyuY3i) 18 | * [设置网站图标favico.js](http://lab.ejci.net/favico.js/) 19 | * [短链服务](http://www.ft12.com/) 20 | 21 | 22 | 短链接口(百度api): 23 | ```javascript 24 | $.ajax({ 25 | headers: { 26 | 'apikey': '0bcae0071cafdafadd3a85acd22493af' 27 | }, 28 | type: 'GET', 29 | url: '//apis.baidu.com/3023/shorturl/shorten?url_long=' + encodeURIComponent('http://baidu.com') 30 | }) 31 | ``` 32 | -------------------------------------------------------------------------------- /animate.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | animate 8 | 50 | 51 | 52 |
53 | 54 | 55 | 98 |
99 | 371 | 372 | -------------------------------------------------------------------------------- /css3-animate.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | css3动画 5 | 108 | 113 | 114 | 115 |
116 |
117 |
1、loading动画1
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 | 225 |
226 |
227 |
228 |
2、loading动画2
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 | 322 |
323 |
324 |
325 |
3、loading动画3
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 | 335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 | 584 |
585 |
586 |
587 |
4、圆形进度(实现1)
588 |
589 |
590 |
591 |
592 |
593 |
594 |
595 |
596 |
597 |
598 |
599 |
600 |
601 |
602 |
603 |
604 |
605 |
606 |
607 |
608 |
609 |
610 |
611 |
612 |
613 |
614 |
615 |
616 |
617 |
618 |
619 |
620 |
621 |
622 |
623 |
624 |
625 |
626 |
627 |
628 |
629 |
630 |
631 |
632 |
633 |
634 |
635 |
636 |
637 |
638 |
639 |
640 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
654 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 | 667 | 777 |
778 |
779 |
780 |
5、圆形进度(实现2)
781 |
782 |
783 |
784 |
785 |
786 |
787 |
788 |
789 |
790 |
791 |
792 |
793 |
794 |
795 |
796 |
797 |
798 |
799 |
800 |
801 |
802 |
803 |
804 |
805 |
806 |
807 |
808 |
809 |
810 |
811 |
812 |
813 |
814 |
815 |
816 |
817 |
818 |
819 |
820 |
821 |
822 |
823 |
824 |
825 |
826 |
827 |
828 |
829 |
830 |
831 |
832 |
833 |
834 |
835 |
836 |
837 | 838 | 839 | 931 |
932 |
933 |
934 |
6、翻转效果
935 |
936 |
937 |
938 |
939 |
940 |
941 |
942 | 943 | 986 | 987 |
988 |
989 |
990 |
991 |
992 |
993 | 994 | 1042 | 1043 |
1044 |
1045 |
1
1046 |
6
1047 |
2
1048 |
5
1049 |
3
1050 |
4
1051 |
1052 |
1053 | 1054 |
1055 | 1056 | 1057 | 1058 | 1059 | 1060 | 1061 |
1062 | 1063 | 1157 | 1158 | 1173 |
1174 |
1175 |
1176 |
7、旋转跑马灯
1177 |
1178 |
1179 |
1180 |
1
1181 |
2
1182 |
3
1183 |
4
1184 |
5
1185 |
6
1186 |
7
1187 |
8
1188 |
1189 |
1190 | 1191 |
1192 | 1193 | 1194 |
1195 | 1196 | 1289 | 1290 | 1321 |
1322 |
1323 |
1324 |
8
1325 |
1326 |
1327 |
1328 | 1329 |
1330 | -------------------------------------------------------------------------------- /js/bezier.js: -------------------------------------------------------------------------------- 1 | function bezier(pots, amount){ 2 | var pot; 3 | var lines; 4 | var ret = []; 5 | var points; 6 | for(var i = 0; i <= amount; i++){ 7 | points = pots.slice(0); 8 | lines = []; 9 | while(pot = points.shift()){ 10 | if(points.length){ 11 | lines.push( pointLine([pot, points[0]], i / amount) ); 12 | }else if(lines.length > 1){ 13 | points = lines; 14 | lines = []; 15 | }else{ 16 | break; 17 | } 18 | } 19 | ret.push(lines[0]); 20 | } 21 | function pointLine(points, rate){ 22 | return { 23 | x: (1 - rate) * points[0].x + rate * points[1].x, 24 | y: (1 - rate) * points[0].y + rate * points[1].y 25 | } 26 | } 27 | return ret; 28 | } 29 | 30 | function bezier2(points, amount) { 31 | var p = []; 32 | for (var i = 0; i <= amount; i++) { 33 | p.push(calcBesier(points, i / amount)) 34 | } 35 | 36 | return p 37 | } 38 | 39 | function calcBesier(points, rate) { 40 | var x = 0, y = 0, 41 | len = points.length, 42 | n = len - 1 // 几阶 43 | 44 | var temp 45 | for (var i = 0; i < len; i++) { 46 | temp = compose(n, i) * Math.pow((1 - rate), n - i) * Math.pow(rate, i) 47 | x += temp * points[i].x 48 | y += temp * points[i].y 49 | } 50 | 51 | return {x: x, y: y} 52 | } 53 | 54 | 55 | // 计算组合数值,Cn,m => n! / ((n - m)! * m!); eg: C5,3 = 5*4*3*2*1 / 2*1 * 3*2*1 = 10 56 | function compose(n, m) { 57 | if (m == 0 || m == n) return 1 58 | if (m == 1 || m == (n - 1)) return n 59 | 60 | // return factorial(n) / (factorial(n - m) * factorial(m)) 61 | 62 | // 优化,C5,1 => C5,4,两者相等的 63 | var r = n - m 64 | if (r > m) { 65 | m = r 66 | } 67 | 68 | // 公式简化 69 | return factorial(n, m) / factorial(n - m) 70 | } 71 | 72 | // 计算阶乘,若传入m,则乘到m的前一个数就结束 73 | function factorial(n, m) { 74 | if (n < 1) return n 75 | 76 | m = m || 1; 77 | 78 | var result = 1; 79 | while (n > m) { 80 | result = result * n-- 81 | } 82 | 83 | 84 | return result 85 | } 86 | 87 | // 杨辉三角: https://baike.baidu.com/item/%E6%9D%A8%E8%BE%89%E4%B8%89%E8%A7%92 88 | 89 | // 通过第i行,j列的数字等于 第i-1行 第j-1列 + 第j列数字的和 90 | // 的特性,计算杨辉三角n层的数据(贝塞尔公式的每一项的常数项系数) 91 | function calcYHTriangle2(n) { 92 | if (n == 1) return [1] 93 | 94 | var temp; 95 | var arr = [1, 1]; // 第二层的数据 96 | 97 | // 第三层开始遍历 98 | for (var i = 3; i <= n; i++) { 99 | 100 | // 拷贝上一层的数据 101 | temp = arr.slice(0) 102 | 103 | // 第一个值永远是1 104 | arr[0] = 1 105 | // 当前层的第j个位置的值等于上一层的j-1位置 + j位置的值 106 | // arr[j] = temp[j - 1] + temp[j] 107 | for (var j = 1; j < i - 1; j++) { 108 | arr[j] = temp[j - 1] + temp[j] 109 | } 110 | 111 | // 最后一个值永远是1 112 | arr.push(1) 113 | } 114 | 115 | return arr 116 | } 117 | 118 | // 通过组合数的特性,计算杨辉三角(贝塞尔公式的每一项的常数项系数) 119 | function calcYHTriangle(level) { 120 | console.log(1) 121 | console.log(1, 1) 122 | 123 | for (var i = 3; i <= level; i++) { 124 | var nums = [1] 125 | for (var j = 2; j < i; j++) { 126 | nums.push(compose(i - 1, j - 1)) 127 | } 128 | nums.push(1) 129 | console.log.apply(console, nums) 130 | } 131 | } 132 | 133 | 134 | function bezier3(points, amount) { 135 | var len = points.length 136 | 137 | if (len < 2) return // 至少两个点 138 | 139 | // var n = len - 1; // 几阶 140 | 141 | // 计算公式的多项式常数(杨辉三角规律) 142 | 143 | var c_n_k = calcYHTriangle2(len) 144 | var arr = [] 145 | 146 | // 总点数 147 | for (var i = 0; i <= amount; i++) { 148 | var x = 0, y = 0; 149 | var temp; 150 | var n = len - 1; // 几阶 151 | var rate = i / amount 152 | 153 | 154 | // 遍历控制点 155 | for (var j = 0; j < len; j++) { 156 | temp = c_n_k[j] * Math.pow((1 - rate), n - j) * Math.pow(rate, j) 157 | x += temp * points[j].x 158 | y += temp * points[j].y 159 | } 160 | 161 | arr.push({x: x, y: y}) 162 | } 163 | 164 | return arr 165 | } 166 | 167 | 168 | 169 | // calcYHTriangle(8) 170 | // console.log(factorial(5, 2)) 171 | // console.log(besier3([{x:0, y:0}, {x:1, y:0}, {x:1, y:1}], 10)) -------------------------------------------------------------------------------- /js/遍历多叉树(递归、非递归)/tree-iterator.js: -------------------------------------------------------------------------------- 1 | (function (window, undefined) { 2 | var treeNodes = [ 3 | { 4 | id: 1, 5 | name: '1', 6 | children: [ 7 | { 8 | id: 11, 9 | name: '11', 10 | children: [ 11 | { 12 | id: 111, 13 | name: '111', 14 | children:[] 15 | }, 16 | { 17 | id: 112, 18 | name: '112' 19 | } 20 | ] 21 | }, 22 | { 23 | id: 12, 24 | name: '12', 25 | children: [] 26 | } 27 | ], 28 | users: [] 29 | }, 30 | { 31 | id: 2, 32 | name: '2', 33 | children: [ 34 | { 35 | id: 22, 36 | name: '22', 37 | children: [] 38 | } 39 | ] 40 | } 41 | ]; 42 | 43 | //递归实现 44 | var parseTreeJson = function(treeNodes){ 45 | if (!treeNodes || !treeNodes.length) return; 46 | 47 | for (var i = 0, len = treeNodes.length; i < len; i++) { 48 | 49 | var childs = treeNodes[i].children; 50 | 51 | console.log(treeNodes[i].id); 52 | 53 | if(childs && childs.length > 0){ 54 | parseTreeJson(childs); 55 | } 56 | } 57 | }; 58 | 59 | console.log('------------- 递归实现 ------------------'); 60 | parseTreeJson(treeNodes); 61 | 62 | //非递归广度优先实现 63 | var iterator1 = function (treeNodes) { 64 | if (!treeNodes || !treeNodes.length) return; 65 | 66 | var stack = []; 67 | 68 | //先将第一层节点放入栈 69 | for (var i = 0, len = treeNodes.length; i < len; i++) { 70 | stack.push(treeNodes[i]); 71 | } 72 | 73 | var item; 74 | 75 | while (stack.length) { 76 | item = stack.shift(); 77 | 78 | console.log(item.id); 79 | 80 | //如果该节点有子节点,继续添加进入栈底 81 | if (item.children && item.children.length) { 82 | //len = item.children.length; 83 | 84 | // for (i = 0; i < len; i++) { 85 | // stack.push(item.children[i]); 86 | // } 87 | 88 | stack = stack.concat(item.children); 89 | } 90 | } 91 | }; 92 | 93 | console.log('------------- 非递归广度优先实现 ------------------'); 94 | iterator1(treeNodes); 95 | 96 | //非递归深度优先实现 97 | var iterator2 = function (treeNodes) { 98 | if (!treeNodes || !treeNodes.length) return; 99 | 100 | var stack = []; 101 | 102 | //先将第一层节点放入栈 103 | for (var i = 0, len = treeNodes.length; i < len; i++) { 104 | stack.push(treeNodes[i]); 105 | } 106 | 107 | var item; 108 | 109 | while (stack.length) { 110 | item = stack.shift(); 111 | 112 | console.log(item.id); 113 | 114 | //如果该节点有子节点,继续添加进入栈顶 115 | if (item.children && item.children.length) { 116 | // len = item.children.length; 117 | 118 | // for (; len; len--) { 119 | // stack.unshift(item.children[len - 1]); 120 | // } 121 | stack = item.children.concat(stack); 122 | } 123 | } 124 | }; 125 | 126 | console.log('------------- 非递归深度优先实现 ------------------'); 127 | iterator2(treeNodes); 128 | })(window); -------------------------------------------------------------------------------- /timetag.js: -------------------------------------------------------------------------------- 1 | var node_modules = 'C:/Users/mumu/AppData/Roaming/npm/node_modules/'; 2 | var fs = require('fs'); 3 | var Q = require(node_modules + 'q'); 4 | var glob = require(node_modules + 'glob'); 5 | // var filePath = './**/*.{html,css}'; // 要处理的文件 6 | // var copyFilePath = './**/*-copy.{html,css}'; // 要删除的备份文件 7 | 8 | var filePath = 'E:/dev_tools/git/operate/WebContent/newguys/**/*.{html,css}'; // 要处理的文件 9 | var copyFilePath = 'E:/dev_tools/git/operate/WebContent/newguys/**/*-copy.{html,css}'; // 要删除的备份文件 10 | 11 | doIt(); 12 | // reset(); 13 | 14 | function doIt() { 15 | deletCopyFiles(copyFilePath).done(function (data) { 16 | log('删除备份文件共处理', 17 | data.count, 18 | '个,成功', 19 | data.successCount, 20 | '个,过滤', 21 | data.filterCount, 22 | '个,失败', 23 | data.errCount, 24 | '个\n' 25 | ); 26 | 27 | glob(filePath, function (err, filesList) { 28 | var count = 0; 29 | var errCount = 0; 30 | 31 | if (err) { 32 | log('读取文件列表失败'); 33 | return ; 34 | } 35 | 36 | filesList.forEach(function (file, index) { 37 | preadFile(file, 'utf-8') 38 | .then(function (fileObj) { 39 | var fileCopyName = file.replace(/(?=\.[^.]+$)/g, '-copy'); 40 | 41 | // 备份 42 | return pwriteFile(fileCopyName, fileObj.fileData); 43 | }, function () { 44 | log('读取文件 ' + file + ' 失败'); 45 | count += 1; 46 | errCount += 1; 47 | 48 | if (count == filesList.length) { 49 | log('处理完毕:共', count, '个,', count - errCount, '个成功,', errCount, '个失败'); 50 | } 51 | }) 52 | .then(function (fileObj) { 53 | log('备份文件: ' + file + ' ==> ' + fileObj.fileName + ' 成功'); 54 | 55 | // 添加时间戳 56 | return timetagHandler(file, fileObj.fileData); 57 | }, function (fileObj) { 58 | log('备份文件 ' + file + '失败'); 59 | }) 60 | .then(function () { 61 | log(file + ' 添加时间戳成功, index: ' + index); 62 | }, function () { 63 | log(file + ' 添加时间戳失败'); 64 | errCount += 1; 65 | }) 66 | .finally(function () { 67 | count += 1; 68 | 69 | if (count == filesList.length) { 70 | log('\n处理完毕:共', count, '个, 成功', count - errCount, '个, 失败', errCount, '个'); 71 | } 72 | }); 73 | }); 74 | }); 75 | }); 76 | } 77 | 78 | // 从备份文件恢复 79 | function reset() { 80 | deletCopyFiles(filePath, /-copy/g).done(function (data) { 81 | log('删除备份文件共处理', 82 | data.count, 83 | '个,成功', 84 | data.successCount, 85 | '个,过滤', 86 | data.filterCount, 87 | '个,失败', 88 | data.errCount, 89 | '个\n' 90 | ); 91 | 92 | glob(copyFilePath, function (err, filesList) { 93 | var count = 0; 94 | var errCount = 0; 95 | 96 | if (err) { 97 | log('读取文件列表失败'); 98 | return ; 99 | } 100 | 101 | filesList.forEach(function (file, index) { 102 | preadFile(file, 'utf-8') 103 | .then(function (fileObj) { 104 | var fileCopyName = file.replace(/-copy/g, ''); 105 | 106 | // 备份 107 | return pwriteFile(fileCopyName, fileObj.fileData); 108 | }, function () { 109 | log('读取文件 ' + file + ' 失败'); 110 | count += 1; 111 | errCount += 1; 112 | 113 | if (count == filesList.length) { 114 | log('处理完毕:共', count, '个,', count - errCount, '个成功,', errCount, '个失败'); 115 | } 116 | }) 117 | .then(function (fileObj) { 118 | log('从备份文件恢复: ' + file + ' ==> ' + fileObj.fileName + ' 成功'); 119 | 120 | }, function (fileObj) { 121 | log('从备份文件恢复:' + file + '失败'); 122 | }) 123 | .finally(function () { 124 | count += 1; 125 | 126 | if (count == filesList.length) { 127 | log('\n从备份文件恢复处理完毕:共', count, '个, 成功', count - errCount, '个, 失败', errCount, '个'); 128 | } 129 | }); 130 | }); 131 | }); 132 | }); 133 | } 134 | 135 | function timetagHandler(file, fileData) { 136 | var cssReg = /\.css$/; 137 | var replaceReg; 138 | 139 | // css文件 140 | if (cssReg.test(file)) { 141 | // 匹配 url 的值 142 | replaceReg = /url\([\"\']?(.*?)[\"\']?\)/g; 143 | 144 | fileData = fileData.replace(replaceReg, function ($1, $2) { 145 | // 排除base64图片 146 | if (/^data/.test($2)) { 147 | return $1; 148 | } else { 149 | return $1.replace($2, addTimetag($2)); 150 | } 151 | }); 152 | } else { 153 | // 匹配标签 href、src 属性的值 154 | replaceReg = /\<.*(href|src)\s?\=\s?[\"\'](.*?)[\"\'].*\>/g; 155 | 156 | fileData = fileData.replace(replaceReg, function ($1, $2, $3) { 157 | return $1.replace($3, addTimetag($3)); 158 | }); 159 | } 160 | 161 | // 添加了时间戳的内容重新写入文件 162 | return pwriteFile(file, fileData); 163 | }; 164 | 165 | // 读文件 166 | function preadFile(file, encoding) { 167 | var def = Q.defer(); 168 | encoding = encoding || null; 169 | 170 | fs.readFile(file, encoding, function (err, fileData) { 171 | if (err) { 172 | def.reject({ 173 | 'fileName': file 174 | }); 175 | } else { 176 | def.resolve({ 177 | 'fileName': file, 178 | 'fileData': fileData 179 | }); 180 | } 181 | }); 182 | 183 | return def.promise; 184 | } 185 | 186 | // 写入文件 187 | function pwriteFile(file, fileData) { 188 | var def = Q.defer(); 189 | 190 | if (!fileData) { 191 | def.reject({'errorMsg': '没有传入文件内容'}); 192 | } else { 193 | fs.writeFile(file, fileData, function (err) { 194 | if (err) { 195 | def.reject({ 196 | 'fileName': file 197 | }); 198 | } else { 199 | def.resolve({ 200 | 'fileName': file, 201 | 'fileData': fileData 202 | }); 203 | } 204 | }); 205 | } 206 | 207 | return def.promise; 208 | } 209 | 210 | // 删除所有备份文件 211 | function deletCopyFiles(filePath, filterReg) { 212 | var def = Q.defer(); 213 | var count = 0; 214 | var filterCount = 0; 215 | var errCount = 0; 216 | 217 | glob(filePath, function (err, filesList) { 218 | if (err) { 219 | log('读取备份文件失败'); 220 | } 221 | 222 | if (!filesList.length) { 223 | checkResolve(0); 224 | 225 | return ; 226 | } 227 | 228 | filesList.forEach(function (file) { 229 | if (filterReg && filterReg.test(file)) { 230 | count += 1; 231 | filterCount += 1; 232 | 233 | checkResolve(filesList.length); 234 | 235 | return ; 236 | } 237 | 238 | fs.unlink(file, function (err) { 239 | count += 1; 240 | 241 | if (err) { 242 | errCount += 1; 243 | log('删除备份文件 ' + file + ' 失败'); 244 | } 245 | 246 | checkResolve(filesList.length); 247 | }); 248 | }); 249 | }); 250 | 251 | function checkResolve(listLength) { 252 | if (count == listLength) { 253 | def.resolve({ 254 | 'count': count, 255 | 'filterCount': filterCount, 256 | 'successCount': count - filterCount - errCount, 257 | 'errCount': errCount 258 | }); 259 | } 260 | } 261 | 262 | return def.promise; 263 | } 264 | 265 | // 给路径添加时间戳 266 | function addTimetag(str) { 267 | if (/^(#+|javascript|tel|email)/.test(str)) { 268 | return str; 269 | } 270 | 271 | var now = new Date(); 272 | var year = now.getFullYear(); 273 | var month = addZero(now.getMonth() + 1); 274 | var date = addZero(now.getDate()); 275 | var hour = addZero(now.getHours()); 276 | var minute = addZero(now.getMinutes()); 277 | var time = '' + year + month + date + hour + minute; 278 | var reg = /_t\=[^\"\']*/; 279 | 280 | var strArr = str.split('#'); 281 | var hash = strArr.length > 1 ? ('#' + strArr[1]) : ''; 282 | var returnStr = ''; 283 | 284 | str = strArr[0]; 285 | 286 | if (str.indexOf('?') > -1) { 287 | if (reg.test(str)) { 288 | returnStr = str.replace(reg, '_t=' + time) + hash; 289 | } else { 290 | returnStr = str + '&_t=' + time + hash; 291 | } 292 | } else { 293 | returnStr = str + '?_t=' + time + hash; 294 | } 295 | 296 | if (!/^(http|\/)/.test(returnStr)) { 297 | returnStr = '/operate/newguys/' + returnStr.replace(/^(\.+\/)+/, ''); 298 | } 299 | 300 | return returnStr; 301 | } 302 | 303 | function addZero(num) { 304 | return num >= 10 ? num : '0' + num; 305 | } 306 | 307 | function log () { 308 | console.log.apply(null, [].slice.call(arguments)); 309 | } 310 | -------------------------------------------------------------------------------- /util.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 通用工具集 3 | * @author muqin_deng 4 | * @time 2015/03/16 5 | */ 6 | (function(window, undefined) { 7 | var util = { 8 | data: { 9 | ONE_DATE: 24 * 60 * 60 * 1000 10 | }, 11 | 12 | userAgent: navigator.userAgent, 13 | 14 | loading: function(show) { 15 | var $loading = $('.loading'); 16 | 17 | if (show === false) { 18 | $loading.hide(); 19 | return; 20 | } 21 | 22 | $loading.show(); 23 | }, 24 | 25 | //时间补0 26 | timeAddZero: function(time) { 27 | if (time < 10) { 28 | return '0' + time; 29 | } else { 30 | return '' + time; 31 | } 32 | }, 33 | 34 | //显示消息提示 35 | showTips: function(tips, time) { 36 | var me = this, 37 | $userinfoPs = $("#tips-msg"), 38 | closeTime = time || 1000; 39 | 40 | if (tips == 'HIDE') { 41 | $userinfoPs.fadeOut(); 42 | return; 43 | } 44 | 45 | $userinfoPs.html(tips).fadeIn(function() { 46 | if (closeTime == 'NOHIDE') { 47 | return; 48 | } 49 | 50 | me.delay(closeTime).done(function() { 51 | $userinfoPs.fadeOut(); 52 | }); 53 | }); 54 | }, 55 | 56 | //延时函数 57 | delay: function(t) { 58 | var deferred = $.Deferred(); 59 | 60 | setTimeout(function() { 61 | deferred.resolve(); 62 | }, t); 63 | 64 | return deferred.promise(); 65 | }, 66 | 67 | //转义特殊字符<,>,",' 68 | escapeHtml: function(html) { 69 | var div = document.createElement('div'); 70 | 71 | if (div.innerText) { 72 | div.innerText = html; 73 | } else { 74 | div.textContent = html; 75 | } 76 | 77 | return div.innerHTML; 78 | }, 79 | 80 | //根据连接符取驼峰式单词 81 | getCamelWord: function(str, connector) { 82 | var strArr, i, len; 83 | 84 | connector = connector || '-'; 85 | 86 | strArr = str.split(connector); 87 | 88 | str = strArr[0]; 89 | 90 | for (i = 1, len = strArr.length; i < len; i++) { 91 | str += strArr[i].slice(0, 1).toLocaleUpperCase() + strArr[i].slice(1); 92 | } 93 | return str; 94 | }, 95 | 96 | //获取根路径(可含项目路径) 97 | getRootPath: function(needProjectPath) { 98 | var href = window.location.href, //完整路径 99 | pathName = window.location.pathname, //主机后面的路径 100 | pos = href.indexOf(pathName), 101 | localhostPath = href.substring(0, pos), //主机路径 102 | projectName = /\/[^\/]+\//.exec(pathName)[0]; 103 | 104 | if (needProjectPath) { 105 | return (localhostPath + projectName); 106 | } 107 | 108 | return localhostPath; 109 | }, 110 | 111 | //获取字节长度 112 | getRealLength: function(str) { 113 | return str.replace(/[^\x00-\xff]/g, "**").length; 114 | }, 115 | 116 | //判断移动端系统 117 | checkMobileSystem: function(type) { 118 | var regObj = { 119 | 'ios': /\(i[^;]+;( U;)? CPU.+Mac OS X/, 120 | 'android': /Android/i 121 | }; 122 | 123 | if (!regObj[type]) { 124 | return; 125 | } 126 | 127 | return regObj[type].test(this.userAgent); 128 | }, 129 | 130 | //获取url键值对 131 | getUrlKeyValObj: function() { 132 | var url = window.location.href, 133 | arr, i, len, 134 | paramsObj = {}; 135 | 136 | if (this.urlKeyValObj) { 137 | return this.urlKeyValObj; 138 | } 139 | 140 | arr = url.substring(url.indexOf('?') + 1).split('&'); 141 | 142 | for (i = 0, len = arr.length; i < len; i++) { 143 | var reg = /(.*)\=(.*)/g, 144 | match = reg.exec(arr[i]); 145 | 146 | if (match && match[1]) { 147 | paramsObj[decodeURIComponent(match[1])] = decodeURIComponent(match[2]); 148 | } 149 | } 150 | 151 | this.urlKeyValObj = paramsObj; 152 | 153 | return paramsObj; 154 | }, 155 | 156 | //获取url的对应参数的值 157 | getUrlValue: function(param) { 158 | if (!param) { 159 | return ''; 160 | } 161 | 162 | var paramsObj = this.getUrlKeyValObj(); 163 | 164 | if (paramsObj.hasOwnProperty(param)) { 165 | return paramsObj[param]; 166 | } else { 167 | return ''; 168 | } 169 | }, 170 | 171 | /* 172 | * 函数节流 173 | * @param {function} method 要进行节流的函数 174 | * @param {number} delay 延时时间(ms) 175 | * @param {number} duration 经过duration时间(ms)必须执行函数method 176 | */ 177 | throttle: function(method, delay, duration) { 178 | var timer = null, 179 | begin = null; 180 | return function() { 181 | var context = this, 182 | args = arguments, 183 | current = new Date(); 184 | if (!begin) { 185 | begin = current; 186 | } 187 | if (timer) { 188 | window.clearTimeout(timer); 189 | } 190 | if (duration && current - begin >= duration) { 191 | method.apply(context, args); 192 | begin = null; 193 | } else { 194 | timer = window.setTimeout(function() { 195 | method.apply(context, args); 196 | begin = null; 197 | }, delay); 198 | } 199 | }; 200 | }, 201 | 202 | /* 203 | * 页面模板引擎解析 204 | * @param {string} html 要进行解析的html字符串(在<##>里面的转换成js来执行) 205 | * @param {object} data html中解析传入的数据对象 206 | * @param {object} scope 作用域 207 | * @return {string} 返回解析后的html字符串 208 | */ 209 | templateEngine = function(html, data, scope) { 210 | var re = /<#(.*?)#>/g, 211 | reExp = /(^(\s|\t|\n|\r)*((var|if|for|else|switch|case|break)\b|{|}))(.*)?/g, 212 | code = 'var r=[];\n', 213 | cursor = 0; 214 | 215 | html = html.replace(/\n|\r|\t/g, ''); 216 | 217 | var add = function(line, js) { 218 | js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : 219 | (code += line !== '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : ''); 220 | return add; 221 | }; 222 | 223 | while (match = re.exec(html)) { 224 | var noJsStr = html.slice(cursor, match.index); 225 | add(/[^\s]/g.test(noJsStr) ? noJsStr : '')(match[1], true); 226 | cursor = match.index + match[0].length; 227 | } 228 | add(html.substr(cursor, html.length - cursor)); 229 | code += 'return r.join("");'; 230 | 231 | var variable = [], 232 | value = []; 233 | for (var key in data) { 234 | variable.push(key); 235 | value.push(data[key]); 236 | } 237 | 238 | return new Function(variable, code.replace(/[\r\t\n]/g, '')).apply(scope ? scope : data, value); 239 | } 240 | 241 | //元素滚动到可见区域 242 | scrollIntoView: function(elem, always) { 243 | if (always === true) { 244 | elem.scrollIntoView(); 245 | return; 246 | } 247 | elem.scrollIntoViewIfNeeded(); 248 | }, 249 | 250 | //获取用户当前经纬度,使用HTML5 Geolocation API 251 | getLocation: function(successFn, errorFn) { 252 | if (navigator.geolocation) { 253 | navigator.geolocation.getCurrentPosition(function(position) { 254 | successFn(position.coords.longitude, position.coords.latitude); 255 | }, errorFn); 256 | } else { 257 | this.delay(100, errorFn); 258 | } 259 | }, 260 | 261 | //获取当前城市,使用百度地图api接口 http://api.map.baidu.com/api?v=2.0&ak=kx7GASe6dXLGpwUsvqKxQdMn 262 | getCurrentCity: function() { 263 | var deferred = $.Deferred(); 264 | //获取经纬度 265 | this.getLocation(function(lng, lat) { 266 | var point = new BMap.Point(lng, lat), 267 | geoc = new BMap.Geocoder(); 268 | 269 | geoc.getLocation(point, function(rs) { 270 | var addComp = rs.addressComponents; 271 | 272 | if (!addComp.city) { 273 | addComp.city = '海外'; 274 | } 275 | 276 | deferred.resolve(addComp.city); 277 | }); 278 | }, function(error) { 279 | deferred.reject(error); 280 | }); 281 | 282 | return deferred.promise(); 283 | } 284 | 285 | }; 286 | 287 | if (typeof define == 'function') { 288 | define(['Zepto'], function($) { 289 | return util; 290 | }); 291 | } 292 | 293 | window.Util = window.Util || util; 294 | 295 | /*** 时间格式化相关 ***/ 296 | var format = function(formatStr) { 297 | var year, month, day, hour, minute, second, 298 | reg, rule, afterFormat; 299 | 300 | if (!formatStr) { 301 | return this.getTime(); 302 | } 303 | 304 | year = this.getFullYear(); 305 | month = this.getMonth() + 1; 306 | day = this.getDate(); 307 | hour = this.getHours(); 308 | minute = this.getMinutes(); 309 | second = this.getSeconds(); 310 | 311 | rule = { 312 | 'yy': year - 2000, 313 | 'yyyy': year, 314 | 'M': month, 315 | 'MM': util.timeAddZero(month), 316 | 'd': day, 317 | 'dd': util.timeAddZero(day), 318 | 'h': hour, 319 | 'hh': util.timeAddZero(hour), 320 | 'm': minute, 321 | 'mm': util.timeAddZero(minute), 322 | 's': second, 323 | 'ss': util.timeAddZero(second) 324 | }; 325 | 326 | reg = /y{2,4}|M{1,2}|d{1,2}|h{1,2}|m{1,2}|s{1,2}/g; 327 | 328 | afterFormat = formatStr.replace(reg, function($) { 329 | if ($ in rule) { 330 | return rule[$]; 331 | } else { 332 | return $; 333 | } 334 | }); 335 | 336 | return afterFormat; 337 | 338 | }; 339 | 340 | Date.prototype.format = format; 341 | 342 | //天,时,分,秒的毫秒数 343 | var ONE_SECOND = 1000, 344 | ONE_MINUTE = ONE_SECOND * 60, 345 | ONE_HOUR = ONE_MINUTE * 60, 346 | ONE_DAY = ONE_HOUR * 24; 347 | 348 | var timeGone = function(infoObj) { 349 | 350 | 351 | var now = new Date(), 352 | currYear = now.getFullYear(), //当前年 353 | currMonDays = new Date(currYear, now.getMonth() + 1, 0).getDate(), //当前月的总天数 354 | firstDay = new Date(currYear, 0, 1), //当前年的第一天 355 | lastDay = new Date(currYear, 11, 31), //当前年的最后一天 356 | oneYearDays = lastDay.getTime() - firstDay.getTime() + ONE_DAY; //当前年的总毫秒数 357 | 358 | var compareArr = [{ 359 | 'type': 'year', 360 | 'time': oneYearDays 361 | }, { 362 | 'type': 'month', 363 | 'time': currMonDays * ONE_DAY 364 | }, { 365 | 'type': 'day', 366 | 'time': ONE_DAY 367 | }, { 368 | 'type': 'hour', 369 | 'time': ONE_HOUR 370 | }, { 371 | 'type': 'minute', 372 | 'time': ONE_MINUTE 373 | }, { 374 | 'type': 'second', 375 | 'time': ONE_SECOND 376 | }], 377 | info = { 378 | 'year': '年', 379 | 'month': '个月', 380 | 'day': '天', 381 | 'hour': '小时', 382 | 'minute': '分钟', 383 | 'second': '秒' 384 | }, 385 | i = 0, 386 | differ = Math.abs(now.getTime() - this.getTime()), //传入时间与当前时间的毫秒差值 387 | result = 0; 388 | 389 | //从年开始算,不满1就继续往下推,大于等于1就结束 390 | while (result < 1 && i < compareArr.length) { 391 | result = differ / compareArr[i].time; 392 | i++; 393 | } 394 | 395 | var type = compareArr[i - 1].type; 396 | 397 | result = Math.floor(result) === 0 ? 1 : Math.floor(result); 398 | 399 | return result + (infoObj && infoObj[type] ? infoObj[type] : info[type]) + '前'; 400 | }; 401 | 402 | Date.prototype.timeGone = timeGone; 403 | 404 | 405 | 406 | if (window.localStorage) { 407 | util.ls = { 408 | set: function(key, value) { 409 | var oldval = this.get(key); 410 | 411 | //在setItem前先removeItem避免iPhone/ipad上偶尔的QUOTA_EXCEEDED_ERR错误 412 | if (oldval !== '') { 413 | this.remove(key); 414 | } 415 | 416 | window.localStorage.setItem(key, value); 417 | 418 | return this; 419 | }, 420 | 421 | get: function(key) { 422 | var value = window.localStorage.getItem(key); 423 | //如果为空统一返回null 424 | return !value ? '' : value; 425 | }, 426 | 427 | remove: function(key) { 428 | window.localStorage.removeItem(key); 429 | 430 | return this; 431 | } 432 | }; 433 | } else { 434 | //操作cookie 435 | util.ls = { 436 | //expires传过期月数 437 | set: function(name, value, expires, path, domain, secure) { 438 | var cookieText = encodeURIComponent(name) + '=' + encodeURIComponent(value); 439 | 440 | if (!expires) { 441 | expires = 12; //默认一年过期 442 | } 443 | 444 | var today = new Date(); 445 | expires *= 2592000000; 446 | var expires_date = new Date(today.getTime() + expires); 447 | cookieText += '; expires=' + expires_date.toGMTString(); 448 | 449 | if (path) { 450 | cookieText += '; path=' + path; 451 | } 452 | 453 | if (domain) { 454 | cookieText += '; domain=' + domain; 455 | } 456 | 457 | if (secure) { 458 | cookieText += '; secure'; 459 | } 460 | 461 | document.cookie = cookieText; 462 | 463 | return this; 464 | }, 465 | 466 | get: function(name) { 467 | var reg = new RegExp(name + '\=([^;=]+)'); 468 | var match = reg.exec(document.cookie); 469 | 470 | return match ? match[1] : ''; 471 | }, 472 | 473 | remove: function(name, path, domain, secure) { 474 | this.set(name, '', new Date(0), path, domain, secure); 475 | 476 | return this; 477 | } 478 | }; 479 | } 480 | 481 | })(window); -------------------------------------------------------------------------------- /utils-page/css/index.css: -------------------------------------------------------------------------------- 1 | *{ 2 | margin: 0; 3 | padding: 0; 4 | border: none; 5 | font-size: 14px; 6 | outline: none; 7 | } 8 | body{ 9 | background: #fff; 10 | } 11 | label{ 12 | vertical-align: top; 13 | } 14 | input[type="text"], textarea{ 15 | border: 1px solid #ccc; 16 | padding: 4px 5px; 17 | } 18 | .text-center{ 19 | text-align: center; 20 | } 21 | .fl{ 22 | float: left; 23 | } 24 | .fr{ 25 | float: right; 26 | } 27 | .clearfix{ 28 | zoom: 1; 29 | } 30 | .clearfix:after{ 31 | content: ''; 32 | display: block; 33 | height: 0; 34 | opacity: 0; 35 | clear: both; 36 | } 37 | 38 | .row{ 39 | width: 900px; 40 | margin: 0px auto; 41 | } 42 | 43 | .container{ 44 | padding: 50px 0 20px 0; 45 | border-bottom: 1px solid #ddd; 46 | } 47 | 48 | .container:last-child{ 49 | border: none; 50 | } 51 | 52 | .title{ 53 | padding-bottom: 20px; 54 | margin-bottom: 20px; 55 | font-size: 20px; 56 | font-weight: bold; 57 | } 58 | 59 | .col-left{ 60 | width: 306x; 61 | float: left; 62 | } 63 | .link{ 64 | width: 365px; 65 | height: 150px; 66 | } 67 | .col-right{ 68 | width: 365px; 69 | float: right; 70 | } 71 | #qrcode-pic{ 72 | width: 250px; 73 | height: 250px; 74 | display: inline-block; 75 | } 76 | 77 | /*---------- 生成base64部分 ----------*/ 78 | .settings{ 79 | line-height: 24px; 80 | } 81 | 82 | .file-group{ 83 | width: 541px; 84 | } 85 | 86 | #file{ 87 | width: 200px; 88 | } 89 | 90 | .drop-area{ 91 | width: 280px; 92 | height: 130px; 93 | margin-right: 40px; 94 | vertical-align: top; 95 | border: 2px dashed #ddd; 96 | } 97 | 98 | .drop-area.drag-over{ 99 | border-color: #43E61C; 100 | } 101 | 102 | .select-group{ 103 | width: 339px; 104 | padding-left: 20px; 105 | } 106 | 107 | .select-group label{ 108 | margin: 0 0 0 20px; 109 | } 110 | 111 | .select-group label:first-child{ 112 | margin: 0; 113 | } 114 | 115 | .need-compress{ 116 | vertical-align: -1px; 117 | } 118 | 119 | .width-input, .height-input{ 120 | width: 40px; 121 | } 122 | 123 | .image-type-group{ 124 | padding: 20px 0 0 20px; 125 | } 126 | 127 | .image-type-group input[type="radio"]{ 128 | vertical-align: middle; 129 | margin-right: 5px; 130 | } 131 | 132 | /*--------- 图片生成base64详情部分 --------*/ 133 | 134 | .result-wrap{ 135 | margin-top: 40px; 136 | background-color: #7C797E; 137 | border-radius: 4px; 138 | color: #fff; 139 | padding-bottom: 10px; 140 | } 141 | 142 | .result-wrap .title{ 143 | font-size: 0; 144 | line-height: 40px; 145 | padding: 0; 146 | margin: 0; 147 | font-weight: normal; 148 | } 149 | 150 | .result-wrap .col{ 151 | display: inline-block; 152 | vertical-align: middle; 153 | width: 20%; 154 | } 155 | 156 | .result-wrap .col:last-child{ 157 | width: 40%; 158 | } 159 | 160 | .result-wrap .content{ 161 | font-size: 0; 162 | } 163 | 164 | .result-wrap .content img{ 165 | max-width: 100%; 166 | } 167 | 168 | .result-wrap .content textarea{ 169 | width: 85%; 170 | height: 180px; 171 | } 172 | -------------------------------------------------------------------------------- /utils-page/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 前端工具 6 | 7 | 8 | 9 |
10 |
11 |

二维码

12 |
13 | 14 | 15 |
16 |
17 | 18 |
19 |
20 |
21 |
22 |

图片生成Base64

23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 | 31 | 32 |
33 | 压缩图片格式: 34 | 35 | 36 |
37 |
38 |
39 |
40 |
41 | 源文件大小 42 | 缩略图 43 | Base64大小 44 | Base64 URL 45 |
46 |
47 | 48 | 49 | 50 | 51 |
52 |
53 |
54 |
55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /utils-page/js/index.js: -------------------------------------------------------------------------------- 1 | ;!function (window, $, undefined) { 2 | var module = { 3 | //二维码相关 4 | qrCode: { 5 | init: function () { 6 | $('.link').on('keyup', function () { 7 | var link = $(this).val().trim(); 8 | 9 | $('#qrcode-pic').html('').qrcode({ 10 | render: 'canvas', 11 | width: 250, 12 | height: 250, 13 | text: link 14 | }); 15 | }); 16 | } 17 | }, 18 | 19 | //base64相关 20 | base64: { 21 | init: function () { 22 | this.picPreview(); 23 | this.compressCtrl(); 24 | }, 25 | 26 | picPreview: function () { 27 | var me = this, 28 | $dropArea = $('.drop-area'), 29 | $file = $('file'); 30 | 31 | $('#file').picPreview({ 32 | 'dropTarget': $dropArea, 33 | 'compress': false, 34 | 'onBefore': function (e) { 35 | me.onPreviewBefore(this, e); 36 | }, 37 | 'onSuccess': function (base64Url) { 38 | var file = this.get('file'), 39 | $content = $('.result-wrap .content'); 40 | 41 | $dropArea.val(file.name); 42 | 43 | 44 | $content.find('span').first().html(this.fileSizeText(file.size) + '

' + file.originalWidth + ' x ' + file.originalHeight); 45 | 46 | 47 | $content.find('span').eq(2).html(this.fileSizeText(base64Url.length) + '

' + file.compressWidth + ' x ' + file.compressHeight); 48 | 49 | $content.find('textarea').val(base64Url); 50 | $content.find('img').attr('src', base64Url); 51 | }, 52 | 'onError': function (errorMsg) { 53 | alert(errorMsg); 54 | } 55 | }); 56 | }, 57 | 58 | onPreviewBefore: function (previewObj, e) { 59 | var compress = $('.need-compress').prop('checked'); 60 | 61 | if (compress) { 62 | var width = $('.width-input').val(), 63 | height = $('.height-input').val(), 64 | imageType = $('input[name="image-type"]:checked').val(); 65 | 66 | previewObj.set({ 67 | 'compress': true, 68 | 'compressWidth': width, 69 | 'compressHeight': height, 70 | 'imageType': imageType 71 | }); 72 | } else { 73 | previewObj.set({ 74 | 'compress': false, 75 | 'imageType': '' 76 | }); 77 | } 78 | }, 79 | 80 | compressCtrl: function () { 81 | var handler = function () { 82 | var checked = $(this).prop('checked'); 83 | $('.select-group input').not('.need-compress').prop('disabled', !checked); 84 | 85 | $('#file').data('picPreview').preview(); 86 | }; 87 | 88 | $('.settings').on('change', '.need-compress', handler) 89 | .on('change', 'input[name="image-type"]', handler) 90 | .on('change', '.width-input, .height-input', function () { 91 | $('#file').data('picPreview').preview(); 92 | }); 93 | } 94 | } 95 | }; 96 | 97 | 98 | $(function () { 99 | module.qrCode.init(); 100 | module.base64.init(); 101 | }); 102 | }(window, jQuery); -------------------------------------------------------------------------------- /utils-page/js/jquery.qrcode.min.js: -------------------------------------------------------------------------------- 1 | (function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;da||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]= 5 | 0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c= 7 | j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount- 8 | b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0g;g++)if(null==this.modules[b][i-g]){var n=!1;f>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a, 9 | c),b=new t,e=0;e8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d= 10 | 0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+ 14 | a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;dc)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+ 15 | a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256), 17 | LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d 18 | this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b>>7-a%8&1)},put:function(a,c){for(var d=0;d>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1, 26 | correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e").css("height",b+"px").appendTo(c);for(i=0;i").css("width", 28 | d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery); 29 | -------------------------------------------------------------------------------- /utils-page/js/pic-preview-base64-jq.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 图片上传预览组件 3 | * 依赖jQuery 4 | * @author muqin_deng@kingdee.com 5 | * @time 2014/11/20 6 | */ 7 | 8 | ;(function (global, doc, factory) { 9 | factory = factory(global, doc); 10 | 11 | if (typeof define === 'function' && (define.adm || define.cmd)) { 12 | define(['jQuery'], function ($) { 13 | $.fn.picPreview = factory; 14 | }); 15 | } else { 16 | $.fn.picPreview = factory; 17 | } 18 | 19 | })(window, document, function (global, doc) { 20 | 21 | var isSuppFR = suppFileReader(), 22 | defaultSettings = { 23 | target: null, //如果传了target则将target的事件委托到选中元素上 24 | 25 | dropTarget: null, //拖放目标(如果有,可拖放图片到该元素目标上) 26 | 27 | size: 1024 * 1024 * 200, //200M 28 | 29 | compress: false, //是否进行压缩 30 | 31 | imageType: null, //压缩后的图片格式 32 | 33 | compressWidth: 0, //压缩后的目标宽度1 34 | 35 | compressHeight: 0, //压缩后的目标高度 36 | 37 | onSuccess: function (result) {}, //成功回调 38 | 39 | onError: function (msg) {}, //失败回调 40 | 41 | onBefore: function (e, pp) {}, //在上传文件预览前执行 42 | 43 | onAlways: function (e) {} //在change监听函数里必须执行 44 | }; 45 | 46 | //最终返回的辅助函数 47 | function picPreview (settings) { 48 | var cfg = $.extend({}, defaultSettings, settings); 49 | 50 | return this.each(function () { 51 | var pp = new PicPreview(cfg); 52 | 53 | pp.init(); 54 | 55 | if (cfg.target) { 56 | $(this).on('change', cfg.target , function (e) { 57 | onChange(e, pp); 58 | }); 59 | } else { 60 | $(this).on('change', function (e) { 61 | onChange(e, pp); 62 | }); 63 | } 64 | 65 | if (cfg.dropTarget) { 66 | $(cfg.dropTarget).on('dragover', fileDrapOver) 67 | .on('dragleave', fileDrapOver) 68 | .on('drop', function (e) { 69 | e.preventDefault(); 70 | e.stopPropagation(); 71 | onChange(e, pp); 72 | }); 73 | } 74 | 75 | //将实例存放起来,便于外部访问 76 | $(this).data("picPreview", pp); 77 | 78 | }); 79 | }; 80 | 81 | function onChange(e, pp) { 82 | var files = e.target.files || e.originalEvent.dataTransfer.files; 83 | 84 | 85 | if (!isSuppFR) { 86 | pp.cfg.onError.call(pp, '您的浏览器不支持FileReader'); 87 | } 88 | 89 | if (files.length > 0) { 90 | pp.cfg.file = files[0]; 91 | pp.cfg.event = e; 92 | pp.preview(); 93 | } 94 | 95 | if (pp.cfg.dropTarget) { 96 | $(pp.cfg.dropTarget).removeClass('drag-over'); 97 | } 98 | 99 | pp.cfg.onAlways.call(pp, e); 100 | 101 | } 102 | 103 | function fileDrapOver(e) { 104 | e.preventDefault(); 105 | e.stopPropagation(); 106 | $(this)[e.type == 'dragover' ? 'addClass' : 'removeClass']('drag-over'); 107 | } 108 | 109 | //预览压缩类 110 | function PicPreview (settings) { 111 | this._$elem = $(''); //根节点 112 | this.cfg = settings; 113 | } 114 | 115 | PicPreview.prototype = { 116 | 117 | init: function (cfg) { 118 | var $drawImagePreview = $('#draw-image-preview_'); 119 | 120 | if ($drawImagePreview.length) { 121 | this._$elem = $drawImagePreview; 122 | } else { 123 | this._$elem = $('').appendTo('body'); 124 | } 125 | 126 | return this; 127 | }, 128 | 129 | //预览 130 | preview: function () { 131 | var me = this, 132 | file = this.cfg.file, 133 | msg = ''; 134 | 135 | this.cfg.onBefore.call(this, this.cfg.event); 136 | 137 | if (!file) { //文件不存在 138 | return ; 139 | } 140 | 141 | if (!/image\/\w+/.test(file.type)) { 142 | msg = '请选择图像类型文件' 143 | 144 | } else if (file.size > this.cfg.size) { 145 | msg = '图片不能大于' + this.fileSizeText(this.cfg.size); 146 | } else { 147 | var fileReader = new FileReader(); 148 | fileReader.readAsDataURL(file); 149 | fileReader.onload = function () { 150 | var img = new Image(); 151 | 152 | img.onload = function () { 153 | file.compressWidth = file.originalWidth = img.width; 154 | file.compressHeight = file.originalHeight = img.height; 155 | //是否压缩 156 | if (!me.cfg.compress) { 157 | me.cfg.onSuccess.call(me, fileReader.result); 158 | } else { 159 | me._compress(fileReader.result, img); 160 | } 161 | }; 162 | 163 | img.src = this.result; 164 | }; 165 | return ; 166 | } 167 | 168 | this.cfg.onError.call(me, msg); 169 | }, 170 | 171 | //压缩(等比缩小图片) 172 | _compress: function (rs, img) { 173 | var me = this, 174 | file = this.cfg.file, 175 | width = img.width, 176 | height = img.height, 177 | canvas = this._$elem[0], 178 | context = canvas.getContext('2d'), 179 | compressWidth = this.cfg.compressWidth, 180 | compressHeight = this.cfg.compressHeight, 181 | scale; //源图片高宽比例 182 | 183 | //高跟宽的比例 184 | scale = height / width; 185 | 186 | //判断是否有设定压缩后的宽跟高 187 | if (compressWidth && !isNaN(compressWidth) && compressHeight && !isNaN(compressHeight)) { 188 | width = compressWidth; 189 | height = compressHeight; 190 | } else if (compressWidth && !isNaN(compressWidth)) { 191 | width = compressWidth; 192 | height = parseInt(width * scale); 193 | } else if (compressHeight && !isNaN(compressHeight)) { 194 | height = compressHeight; 195 | width = parseInt(height / scale); 196 | } 197 | 198 | file.compressWidth = width; 199 | file.compressHeight = height; 200 | 201 | me._setWH(width, height); 202 | 203 | context.clearRect(0, 0, width, height); 204 | 205 | context.drawImage(img, 0, 0, width, height); 206 | 207 | var imageType = me.cfg.imageType || file.type; 208 | 209 | me.cfg.onSuccess.call(me, canvas.toDataURL(imageType)); 210 | }, 211 | 212 | //设置cavans宽高 213 | _setWH: function (w, h) { 214 | this._$elem[0].width = w; 215 | this._$elem[0].height = h; 216 | }, 217 | 218 | set: function (obj) { 219 | $.extend(this.cfg, obj); 220 | }, 221 | 222 | get: function (name) { 223 | return this.cfg[name]; 224 | }, 225 | 226 | fileSizeText: function (size) { 227 | var typeArr = ['B', 'KB', 'M', 'G']; 228 | 229 | if (isNaN(size)) { return '0B'; } 230 | 231 | for (var i = 0, len = typeArr.length; i < len; i++) { 232 | if (size < 1024) { 233 | break; 234 | } 235 | size = size / 1024; 236 | } 237 | 238 | return ('' + size).match(/\d+(\.\d{1,2})?/)[0] + typeArr[i >= len ? len -1 : i]; 239 | } 240 | 241 | }; 242 | 243 | //判断是否支持文件转base64 244 | function suppFileReader() { 245 | try{ 246 | FileReader; 247 | return true; 248 | }catch(e){ 249 | return false; 250 | } 251 | } 252 | 253 | return picPreview; 254 | }); 255 | -------------------------------------------------------------------------------- /webApp-layout/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | demo 7 | 159 | 160 | 161 | 162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 | 177 | 187 | 188 | -------------------------------------------------------------------------------- /webApp-layout/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DMQ/notes/63639b912f0bf1a81107f11511110ca227e6e38a/webApp-layout/sprite.png -------------------------------------------------------------------------------- /第三方工具/mobiscroll.more/css/icons_mobiscroll.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DMQ/notes/63639b912f0bf1a81107f11511110ca227e6e38a/第三方工具/mobiscroll.more/css/icons_mobiscroll.eot -------------------------------------------------------------------------------- /第三方工具/mobiscroll.more/css/icons_mobiscroll.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by FontForge 20120731 at Thu Oct 22 10:15:00 2015 9 | By root 10 | Created by root with FontForge 2.0 (http://fontforge.sf.net) 11 | 12 | 13 | 14 | 27 | 28 | 30 | 32 | 34 | 36 | 39 | 41 | 47 | 50 | 53 | 55 | 57 | 59 | 62 | 64 | 66 | 68 | 73 | 75 | 78 | 81 | 83 | 86 | 88 | 91 | 93 | 95 | 97 | 100 | 102 | 104 | 106 | 108 | 110 | 114 | 116 | 121 | 124 | 127 | 129 | 132 | 134 | 137 | 139 | 141 | 143 | 145 | 147 | 149 | 152 | 155 | 158 | 160 | 162 | 166 | 170 | 172 | 174 | 177 | 179 | 181 | 184 | 187 | 191 | 194 | 200 | 202 | 205 | 207 | 209 | 212 | 214 | 216 | 219 | 222 | 224 | 226 | 228 | 230 | 232 | 234 | 238 | 241 | 243 | 245 | 247 | 248 | 249 | -------------------------------------------------------------------------------- /第三方工具/mobiscroll.more/css/icons_mobiscroll.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DMQ/notes/63639b912f0bf1a81107f11511110ca227e6e38a/第三方工具/mobiscroll.more/css/icons_mobiscroll.ttf -------------------------------------------------------------------------------- /第三方工具/mobiscroll.more/css/icons_mobiscroll.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DMQ/notes/63639b912f0bf1a81107f11511110ca227e6e38a/第三方工具/mobiscroll.more/css/icons_mobiscroll.woff -------------------------------------------------------------------------------- /第三方工具/mobiscroll.more/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mobiscroll 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 25 | 26 | 170 | 171 | 172 | 173 |
174 |

Mobiscroll

175 |
176 | 177 |
178 | 179 | 180 |
181 | 182 | 189 |
190 |
191 | 192 | 197 |
198 |
199 | 200 | 207 |
208 |
209 | 210 | 213 |
214 |
215 | 216 | 229 |
230 | 231 | 232 | 233 | 234 | 235 |
236 | 237 | 249 |
250 | 251 | 252 |
253 | 254 | 255 |
256 | 257 | 258 |
259 | 260 | 261 |
262 | 263 | 264 |
265 | 266 | 267 |
268 | 269 | 270 |
271 | 272 | 273 |
274 | 275 | 276 |
277 | 278 | 279 |
280 | 281 | 282 |
283 | 284 | 285 |
286 | 287 | 288 |
289 | 290 | 291 |
292 | 293 | 294 |
295 | 296 | 297 |
298 | 299 | 300 |
301 | 302 | 303 |
304 | 305 | 306 |
307 | 308 | 309 |
310 | 311 |
312 | 313 | 314 | -------------------------------------------------------------------------------- /第三方工具/mobiscroll.more/license/EULA.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DMQ/notes/63639b912f0bf1a81107f11511110ca227e6e38a/第三方工具/mobiscroll.more/license/EULA.pdf -------------------------------------------------------------------------------- /第三方工具/mobiscroll.more/readme.txt: -------------------------------------------------------------------------------- 1 | This is the Mobiscroll Trial package, which contains a trial version of the respective Mobiscroll commercial product. 2 | 3 | Please refer to the EULA licensing terms (present in the license folder) or http://mobiscroll.com/EULA for more info. -------------------------------------------------------------------------------- /第三方工具/mobiscroll.trial/css/icons_mobiscroll.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DMQ/notes/63639b912f0bf1a81107f11511110ca227e6e38a/第三方工具/mobiscroll.trial/css/icons_mobiscroll.eot -------------------------------------------------------------------------------- /第三方工具/mobiscroll.trial/css/icons_mobiscroll.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by FontForge 20120731 at Mon Oct 26 10:55:54 2015 9 | By root 10 | Created by root with FontForge 2.0 (http://fontforge.sf.net) 11 | 12 | 13 | 14 | 27 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /第三方工具/mobiscroll.trial/css/icons_mobiscroll.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DMQ/notes/63639b912f0bf1a81107f11511110ca227e6e38a/第三方工具/mobiscroll.trial/css/icons_mobiscroll.ttf -------------------------------------------------------------------------------- /第三方工具/mobiscroll.trial/css/icons_mobiscroll.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DMQ/notes/63639b912f0bf1a81107f11511110ca227e6e38a/第三方工具/mobiscroll.trial/css/icons_mobiscroll.woff -------------------------------------------------------------------------------- /第三方工具/mobiscroll.trial/css/mobiscroll.custom-2.17.0.min.css: -------------------------------------------------------------------------------- 1 | /* 362c3ff4-6ce4-4d45-af2b-4710ec9d358a */ 2 | @font-face{font-family:'icons_mobiscroll';src:url('icons_mobiscroll.eot?vmhlb3');src:url('icons_mobiscroll.eot?#iefixvmhlb3') format('embedded-opentype'),url('icons_mobiscroll.ttf?vmhlb3') format('truetype'),url('icons_mobiscroll.woff?vmhlb3') format('woff'),url('icons_mobiscroll.woff') format('woff'),url('icons_mobiscroll.svg?vmhlb3#icons_mobiscroll') format('svg');font-style:normal}.mbsc-ic:before{font-family:'icons_mobiscroll';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mbsc-ic-arrow-down5:before{content:"\f100"}.mbsc-ic-arrow-down6:before{content:"\f101"}.mbsc-ic-arrow-left5:before{content:"\f102"}.mbsc-ic-arrow-left6:before{content:"\f103"}.mbsc-ic-arrow-right5:before{content:"\f104"}.mbsc-ic-arrow-right6:before{content:"\f105"}.mbsc-ic-arrow-up5:before{content:"\f106"}.mbsc-ic-arrow-up6:before{content:"\f107"}.mbsc-ic-checkmark:before{content:"\f108"}.mbsc-ic-ion-ios7-checkmark-empty:before{content:"\f109"}.dw,.dwo{-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mbsc-fr-lock{-ms-touch-action:none;touch-action:none}.dw{max-width:98%;position:absolute;top:0;left:0;z-index:2;font-size:12px;text-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y}.dw:focus{outline:0}.dw:focus{outline-offset:-2px}.dw-rtl{direction:rtl}.dw,.dwbc{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.dwwr{min-width:200px;zoom:1;overflow:hidden;text-align:center;font-family:arial,verdana,sans-serif}.dw-persp,.dwo{width:100%;height:100%;position:absolute;top:0;left:0}.dw-persp{z-index:99998;pointer-events:auto}.dwo{z-index:1;background:#000;background:rgba(0,0,0,.7);filter:Alpha(Opacity=70)}.dw-liq .dw{max-width:100%}.dw-top .dw,.dw-bottom .dw{width:100%;max-width:100%}.dw-inline .dw{position:static;display:inline-block;max-width:100%}.dw-inline.dw-liq .dw-persp .dw{display:block}.dw-inline .dw-persp{position:static}.dw-bubble .dw{margin:20px 0}.dw-bubble .dw-arrw{position:absolute;z-index:1;left:0;width:100%}.dw-bubble-top .dw-arrw{bottom:-36px}.dw-bubble-bottom .dw-arrw{top:-36px}.dw-bubble .dw-arrw-i{margin:0 30px;position:relative;height:36px}.dw-bubble .dw-arr{display:block}.dw-arr{display:none;position:absolute;left:0;width:0;height:0;border-width:18px 18px;border-style:solid;margin-left:-18px}.dw-bubble-bottom .dw-arr{top:0}.dw-bubble-top .dw-arr{bottom:0}.dw-hidden{width:0;height:0;margin:0;padding:0;border:0;overflow:hidden}.dwv{overflow:hidden;text-overflow:ellipsis}.dwb{overflow:hidden;display:block;text-decoration:none;white-space:nowrap;text-overflow:ellipsis;vertical-align:top}.dwb-e{cursor:pointer}.dwb-d{cursor:default}.dwbc{display:table;width:100%;text-align:center}.dwbc .dwb-d{opacity:.3}.dwbw{vertical-align:top;display:table-cell;position:relative;z-index:5}.dwbw .dwb:before{padding:.375em}.mbsc-wdg .dwcc{position:relative;z-index:0;padding:1em;font-size:14px;text-align:left;white-space:normal}.mbsc-mobiscroll .dwwr{min-width:16em;background:#f7f7f7;color:#454545;font-size:16px}.mbsc-mobiscroll .dwv{padding:0 .6666em;padding-top:.6666em;color:#4eccc4;font-size:.75em;text-transform:uppercase;min-height:2em;line-height:2em}.mbsc-mobiscroll .dwbc{display:block;overflow:hidden;text-align:right;padding:0 .5em .5em .5em}.mbsc-mobiscroll .dwbw{display:block;float:right}.mbsc-mobiscroll .dw-rtl .dwbw{float:left}.mbsc-mobiscroll .dwb{height:2.5em;line-height:2.5em;padding:0 1em;color:#4eccc4;text-transform:uppercase}.mbsc-mobiscroll .dwb-a{background:rgba(78,204,196,.3)}.mbsc-mobiscroll .dw-bubble-bottom .dw-arr{border-color:transparent transparent #f7f7f7 transparent}.mbsc-mobiscroll .dw-bubble-top .dw-arr{border-color:#f7f7f7 transparent transparent transparent}.mbsc-android-holo .dwwr{background:#292829;color:#fff;border-radius:.1875em;font-size:16px}.mbsc-android-holo .dwv{color:#31b6e7;padding:0 .5em;min-height:2em;line-height:2em;border-bottom:2px solid #31b6e7;font-size:1.125em}.mbsc-android-holo .dwbc{border-top:1px solid #424542}.mbsc-android-holo .dwb{height:2.6em;line-height:2.6em;color:#fff;font-size:.875em}.mbsc-android-holo .dwb-a{background:#29799c}.mbsc-android-holo .dwbw .dwb{border-left:1px solid #424542}.mbsc-android-holo .dwbw:first-child .dwb{border:0;border-radius:0 0 0 .1875em}.mbsc-android-holo .dwbw:last-child .dwb{border-radius:0 0 .1875em 0}.mbsc-android-holo .dw-rtl .dwbw .dwb{border:0;border-right:1px solid #424542}.mbsc-android-holo .dw-rtl .dwbw:last-child .dwb{border-radius:0 0 0 .1875em}.mbsc-android-holo .dw-rtl .dwbw:first-child .dwb{border:0;border-radius:0 0 .1875em 0}.mbsc-android-holo.dw-liq .dwwr,.mbsc-android-holo.dw-top .dwwr,.mbsc-android-holo.dw-bottom .dwwr,.mbsc-android-holo.dw-liq .dwbw .dwb,.mbsc-android-holo.dw-top .dwbw .dwb,.mbsc-android-holo.dw-bottom .dwbw .dwb{border-radius:0}.mbsc-android-holo .dw-bubble-bottom .dw-arr{border-color:transparent transparent #292829 transparent}.mbsc-android-holo .dw-bubble-top .dw-arr{border-color:#292829 transparent transparent transparent}.mbsc-ios .dwo{background:rgba(0,0,0,.2);filter:Alpha(Opacity=20)}.mbsc-ios .dwwr{position:relative;background:#f7f7f7;color:#000;padding-top:3.333334em;font-size:12px}.mbsc-ios .dwv{padding:0 .416667em;color:#9d9d9d;line-height:2.5em;min-height:2.5em;border-bottom:1px solid #acacac}.mbsc-ios .dwbc{position:absolute;top:0;left:0;width:100%;border-bottom:1px solid #acacac}.mbsc-ios .dwb{height:2.352941em;line-height:2.352941em;padding:0 .588235em;display:inline-block;color:#007aff;font-size:1.416667em}.mbsc-ios .dwb-a{opacity:.5}.mbsc-ios .dwbw{display:block;float:right}.mbsc-ios .dwb-c{float:left}.mbsc-ios .dwb-s .dwb{font-weight:bold}.mbsc-ios .dw-bubble-bottom .dw-arr{border-color:transparent transparent #f7f7f7 transparent}.mbsc-ios .dw-bubble-top .dw-arr{border-color:#f7f7f7 transparent transparent transparent}.mbsc-ios.dw-bubble .dwwr{border-radius:8px}.mbsc-ios.dw-nobtn .dwwr{padding-top:0}.dwwb,.dwwo,.dwwol{-webkit-transform:translateZ(0)}.dwc{max-width:100%;vertical-align:middle;display:inline-block;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.dwl{line-height:30px;height:30px;top:-30px;left:0;text-align:center;white-space:nowrap;position:absolute;width:100%}.dwwc{margin:0 auto;position:relative;zoom:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.dwfl{max-width:100%;-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;-ms-touch-action:none;touch-action:none}.dwwl{position:relative;z-index:5}.dwww{position:relative;padding:1px}.dww{overflow:hidden;position:relative;border-radius:1px;border-top:1px solid transparent;border-bottom:1px solid transparent}.dw-bf{-webkit-backface-visibility:hidden;-webkit-perspective:1000px;backface-visibility:hidden;perspective:1000px}.dw-ul{position:relative;z-index:3}.dw-li{padding:0 5px;position:relative;text-align:center;white-space:nowrap;vertical-align:bottom;opacity:.3;filter:Alpha(Opacity=30);cursor:pointer;-webkit-transition:opacity .2s ease-out;-moz-transition:opacity .2s ease-out;transition:opacity .2s ease-out}.dw-li.dw-v,.dw-li.dw-fv{opacity:1;filter:Alpha(Opacity=100)}.dw-li.dw-h{visibility:hidden}.dw-i{position:relative;height:100%;overflow:hidden;text-overflow:ellipsis}.dwwb{position:absolute;z-index:4;left:0;cursor:pointer;width:100%;text-decoration:none;text-align:center;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.dwa .dwwb{opacity:0}.dwpm .dwwbp{top:0}.dwpm .dwwbm{bottom:0}.dwpm .dwwol{display:none}.dwwo{position:absolute;z-index:3;top:0;left:0;width:100%;height:100%;pointer-events:none}.dwwol{position:absolute;z-index:1;top:50%;left:0;width:100%;pointer-events:none}.dw-liq .dwc{display:block}.dw-liq .dw-tbl{width:100%;table-layout:fixed}.dwhl .dwl{display:none}.dw-hsel{position:absolute;height:1px!important;width:1px!important;left:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}.dw-ml .dw-li{overflow:hidden}.dw-ml .dw-li .dw-i{width:100%;height:auto;display:inline-block;vertical-align:middle;white-space:normal}.dwwms .dw-li{padding:0 40px}.dwwms .dwwol{display:none}.dw-msel:before{width:40px;text-align:center;position:absolute;top:0;left:0}.dww .dw-w-gr{padding:0 5px;opacity:1;font-weight:bold;text-align:left}.mbsc-mobiscroll .dwc{padding:2em .25em 0 .25em}.mbsc-mobiscroll .dwl{color:#4eccc4;font-size:.75em;text-transform:uppercase}.mbsc-mobiscroll .dwhl{padding-top:0}.mbsc-mobiscroll .dwfl{padding:.5em .25em}.mbsc-mobiscroll .dw-li{font-size:1.375em}.mbsc-mobiscroll .dw-hl{background:rgba(78,204,196,.3)}.mbsc-mobiscroll .dwwol{border-top:1px solid #4eccc4;border-bottom:1px solid #4eccc4}.mbsc-mobiscroll .dwpm .dwwol{display:block}.mbsc-mobiscroll .dwwb{color:#4eccc4;background:#f7f7f7}.mbsc-mobiscroll .dwwbp{bottom:0;top:auto}.mbsc-mobiscroll .dwwbm{top:0;bottom:auto}.mbsc-mobiscroll .dwwb span{display:none}.mbsc-mobiscroll .dwwb:before{position:absolute;left:0;top:0;width:100%;font-size:24px;text-align:center}.mbsc-mobiscroll .dwwb.dwb-a:before{background:rgba(78,204,196,.3)}.mbsc-mobiscroll .dw-w-gr{font-size:1.125em}.mbsc-mobiscroll .dw-msel:before{font-size:40px;color:#4eccc4}.mbsc-mobiscroll .dwwms .dwwol{display:none}.mbsc-android-holo .dwc{padding:1.875em .625em .063em .625em}.mbsc-android-holo .dwl{font-size:.75em}.mbsc-android-holo .dwhl{padding:.0625em .625em}.mbsc-android-holo .dw-li{color:#fff;font-size:1.125em}.mbsc-android-holo .dw-hl{background:rgba(49,182,231,.5)}.mbsc-android-holo .dwwo{background:-webkit-gradient(linear,left bottom,left top,from(#282828),color-stop(0.52,rgba(40,40,40,0)),color-stop(0.48,rgba(40,40,40,0)),to(#282828));background:-webkit-linear-gradient(#282828,rgba(40,40,40,0) 52%,rgba(40,40,40,0) 48%,#282828);background:-moz-linear-gradient(#282828,rgba(40,40,40,0) 52%,rgba(40,40,40,0) 48%,#282828);background:linear-gradient(#282828,rgba(40,40,40,0) 52%,rgba(40,40,40,0) 48%,#282828)}.mbsc-android-holo .dwwb{color:#7e7e7e;background:#292829}.mbsc-android-holo .dwwb span{display:none}.mbsc-android-holo .dwwb:before{position:absolute;top:0;left:0;width:100%;font-size:1.625em;text-align:center}.mbsc-android-holo .dwwbm{top:0;bottom:auto}.mbsc-android-holo .dwwbp{bottom:0;top:auto}.mbsc-android-holo .dwwl .dwb-a{background:#292829;color:#319abd}.mbsc-android-holo .dwwol{display:block;width:60%;left:20%;border-top:2px solid #31b6e7;border-bottom:2px solid #31b6e7}.mbsc-android-holo .dwwms .dwwo,.mbsc-android-holo .dwwms .dwwol{display:none}.mbsc-android-holo .dwwms .dw-li{padding:0 2.25em}.mbsc-android-holo .dwwms .dw-li:after{content:'';position:absolute;z-index:1;top:50%;left:auto;right:.625em;width:.875em;height:.875em;margin-top:-.5625em;border:1px solid #424542}.mbsc-android-holo .dw-msel:before{z-index:2;top:50%;left:auto;right:.625em;width:.875em;color:#31b6e7;margin-top:-.625em;line-height:.875em;text-shadow:0 0 .375em #29799c}.mbsc-android-holo .dww .dw-w-gr{padding:0 .375em;font-size:1em;font-weight:normal}.mbsc-android-holo .dww .dw-w-gr:after{display:none}.mbsc-ios .dwl{text-align:left;text-indent:.4166667em;color:#ababab}.mbsc-ios .dwwc{padding:2.5em .833333em .833333em .833333em}.mbsc-ios .dwhl .dwwc{padding-top:.833333em}.mbsc-ios .dwwo{background:-webkit-gradient(linear,left bottom,left top,from(#f7f7f7),color-stop(0.52,rgba(245,245,245,0)),color-stop(0.48,rgba(245,245,245,0)),to(#f7f7f7));background:-webkit-linear-gradient(#f7f7f7,rgba(245,245,245,0) 52%,rgba(245,245,245,0) 48%,#f7f7f7);background:-moz-linear-gradient(#f7f7f7,rgba(245,245,245,0) 52%,rgba(245,245,245,0) 48%,#f7f7f7);background:linear-gradient(#f7f7f7,rgba(245,245,245,0) 52%,rgba(245,245,245,0) 48%,#f7f7f7)}.mbsc-ios .dwwol{padding:0 .833333em;height:2.833333em;margin:-1.5em 0 0 -.833333em;border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb}.mbsc-ios .dw-li{color:#9d9d9d;font-size:1.833333em;text-align:left}.mbsc-ios .dw-hl{background:rgba(0,122,255,.2)}.mbsc-ios .dw-sel{color:#000}.mbsc-ios .dwpm .dw-li{text-align:center}.mbsc-ios .dwpm .dwwol{display:block}.mbsc-ios .dwwb{color:#007aff;background:#f7f7f7}.mbsc-ios .dwwbp{bottom:0;top:auto}.mbsc-ios .dwwbm{top:0;bottom:auto}.mbsc-ios .dwwb span{display:none}.mbsc-ios .dwwb:before{position:absolute;left:0;top:0;width:100%;font-size:2em;text-align:center}.mbsc-ios.dw-select .dwwo{display:none}.mbsc-ios .dwwms .dw-li{padding:0 .227272em 0 1.818181em;color:#000}.mbsc-ios .dwwms .dw-msel{color:#007aff}.mbsc-ios .dw-msel:before{font-size:1.818181em}.mbsc-ios .dw-select-gr .dw-li{padding-left:1.818181em}.mbsc-ios .dw-select-gr .dw-w-gr{padding-left:.277777em;font-weight:normal;font-size:1.222222em}.dw-trans .dw-persp{overflow:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}.dw-trans .dw,.dw-trans .dwo{-webkit-animation-fill-mode:forwards;-webkit-animation-duration:200ms;-moz-animation-fill-mode:forwards;-moz-animation-duration:200ms;animation-fill-mode:forwards;animation-duration:200ms}.dw-trans .dwo{-webkit-backface-visibility:hidden}.dw-in .dw{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;animation-timing-function:ease-out}.dw-out .dw{-webkit-animation-timing-function:ease-in;-moz-animation-timing-function:ease-in;animation-timing-function:ease-in}.dw-in .dwo{-webkit-animation-name:dw-f-in;-moz-animation-name:dw-f-in;animation-name:dw-f-in}.dw-out .dwo{-webkit-animation-name:dw-f-out;-moz-animation-name:dw-f-out;animation-name:dw-f-out}.dw-flip,.dw-swing,.dw-slidehorizontal,.dw-slidevertical,.dw-slidedown,.dw-slideup,.dw-fade{-webkit-backface-visibility:hidden;-webkit-transform:translateX(0);-moz-backface-visibility:hidden;-moz-transform:translateX(0);backface-visibility:hidden;transform:translateX(0)}.dw-swing,.dw-slidehorizontal,.dw-slidevertical,.dw-slidedown,.dw-slideup,.dw-fade{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;transform-origin:0 0}.dw-flip,.dw-pop{-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;transform-origin:50% 50%}.dw-in .dw-pop{opacity:1;-webkit-animation-name:dw-p-in;-webkit-transform:scale(1);-moz-animation-name:dw-p-in;-moz-transform:scale(1);transform:scale(1);animation-name:dw-p-in}.dw-out .dw-pop{opacity:0;-webkit-animation-name:dw-p-out;-moz-animation-name:dw-p-out;animation-name:dw-p-out}.dw-in .dw-flip{opacity:1;-webkit-animation-name:dw-fl-in;-webkit-transform:scale(1);-moz-animation-name:dw-fl-in;-moz-transform:scale(1);animation-name:dw-fl-in;transform:scale(1)}.dw-out .dw-flip{opacity:0;animation-name:dw-fl-out;-webkit-animation-name:dw-fl-out;-moz-animation-name:dw-fl-out}.dw-in .dw-swing{opacity:1;-webkit-animation-name:dw-sw-in;-webkit-transform:scale(1);-moz-animation-name:dw-sw-in;-moz-transform:scale(1);transform:scale(1);animation-name:dw-sw-in}.dw-out .dw-swing{opacity:0;-webkit-animation-name:dw-sw-out;-moz-animation-name:dw-sw-out;animation-name:dw-sw-out}.dw-in .dw-slidehorizontal{opacity:1;-webkit-animation-name:dw-sh-in;-webkit-transform:scale(1);-moz-animation-name:dw-sh-in;-moz-transform:scale(1);transform:scale(1);animation-name:dw-sh-in}.dw-out .dw-slidehorizontal{opacity:0;-webkit-animation-name:dw-sh-out;-moz-animation-name:dw-sh-out;animation-name:dw-sh-out}.dw-in .dw-slidevertical{opacity:1;-webkit-animation-name:dw-sv-in;-webkit-transform:scale(1);-moz-animation-name:dw-sv-in;-moz-transform:scale(1);animation-name:dw-sv-in;transform:scale(1)}.dw-out .dw-slidevertical{opacity:0;-webkit-animation-name:dw-sv-out;-moz-animation-name:dw-sv-out;animation-name:dw-sv-out}.dw-in .dw-slidedown{-webkit-animation-name:dw-sd-in;-webkit-transform:scale(1);-moz-animation-name:dw-sd-in;-moz-transform:scale(1);animation-name:dw-sd-in;transform:scale(1)}.dw-out .dw-slidedown{animation-name:dw-sd-out;-webkit-animation-name:dw-sd-out;-webkit-transform:translateY(-100%);-moz-animation-name:dw-sd-out;-moz-transform:translateY(-100%)}.dw-in .dw-slideup{-webkit-animation-name:dw-su-in;-webkit-transform:scale(1);-moz-animation-name:dw-su-in;-moz-transform:scale(1);transform:scale(1);animation-name:dw-su-in}.dw-out .dw-slideup{animation-name:dw-su-out;-webkit-animation-name:dw-su-out;-webkit-transform:translateY(100%);-moz-animation-name:dw-su-out;-moz-transform:translateY(100%)}.dw-in .dw-fade{opacity:1;-webkit-animation-name:dw-f-in;-moz-animation-name:dw-f-in;animation-name:dw-f-in}.dw-out .dw-fade{opacity:0;-webkit-animation-name:dw-f-out;-moz-animation-name:dw-f-out;animation-name:dw-f-out}@keyframes dw-f-in{from{opacity:0}to{opacity:1}}@-webkit-keyframes dw-f-in{from{opacity:0}to{opacity:1}}@-moz-keyframes dw-f-in{from{opacity:0}to{opacity:1}}@keyframes dw-f-out{from{visibility:visible;opacity:1}to{opacity:0}}@-webkit-keyframes dw-f-out{from{visibility:visible;opacity:1}to{opacity:0}}@-moz-keyframes dw-f-out{from{visibility:visible;opacity:1}to{opacity:0}}@keyframes dw-p-in{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:scale(1)}}@-webkit-keyframes dw-p-in{from{opacity:0;-webkit-transform:scale(0.8)}to{opacity:1;-webkit-transform:scale(1)}}@-moz-keyframes dw-p-in{from{opacity:0;-moz-transform:scale(0.8)}to{opacity:1;-moz-transform:scale(1)}}@keyframes dw-p-out{from{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(0.8)}}@-webkit-keyframes dw-p-out{from{opacity:1;-webkit-transform:scale(1)}to{opacity:0;-webkit-transform:scale(0.8)}}@-moz-keyframes dw-p-out{from{opacity:1;-moz-transform:scale(1)}to{opacity:0;-moz-transform:scale(0.8)}}@keyframes dw-fl-in{from{opacity:0;transform:rotateY(90deg)}to{opacity:1;transform:rotateY(0)}}@-webkit-keyframes dw-fl-in{from{opacity:0;-webkit-transform:rotateY(90deg)}to{opacity:1;-webkit-transform:rotateY(0)}}@-moz-keyframes dw-fl-in{from{opacity:0;-moz-transform:rotateY(90deg)}to{opacity:1;-moz-transform:rotateY(0)}}@keyframes dw-fl-out{from{opacity:1;transform:rotateY(0deg)}to{opacity:0;transform:rotateY(-90deg)}}@-webkit-keyframes dw-fl-out{from{opacity:1;-webkit-transform:rotateY(0deg)}to{opacity:0;-webkit-transform:rotateY(-90deg)}}@-moz-keyframes dw-fl-out{from{opacity:1;-moz-transform:rotateY(0deg)}to{opacity:0;-moz-transform:rotateY(-90deg)}}@keyframes dw-sw-in{from{opacity:0;transform:rotateY(-90deg)}to{opacity:1;transform:rotateY(0deg)}}@-webkit-keyframes dw-sw-in{from{opacity:0;-webkit-transform:rotateY(-90deg)}to{opacity:1;-webkit-transform:rotateY(0deg)}}@-moz-keyframes dw-sw-in{from{opacity:0;-moz-transform:rotateY(-90deg)}to{opacity:1;-moz-transform:rotateY(0deg)}}@keyframes dw-sw-out{from{opacity:1;transform:rotateY(0deg)}to{opacity:0;transform:rotateY(-90deg)}}@-webkit-keyframes dw-sw-out{from{opacity:1;-webkit-transform:rotateY(0deg)}to{opacity:0;-webkit-transform:rotateY(-90deg)}}@-moz-keyframes dw-sw-out{from{opacity:1;-moz-transform:rotateY(0deg)}to{opacity:0;-moz-transform:rotateY(-90deg)}}@keyframes dw-sh-in{from{opacity:0;transform:translateX(-100%)}to{opacity:1;transform:translateX(0)}}@-webkit-keyframes dw-sh-in{from{opacity:0;-webkit-transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0)}}@-moz-keyframes dw-sh-in{from{opacity:0;-moz-transform:translateX(-100%)}to{opacity:1;-moz-transform:translateX(0)}}@keyframes dw-sh-out{from{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(100%)}}@-webkit-keyframes dw-sh-out{from{opacity:1;-webkit-transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(100%)}}@-moz-keyframes dw-sh-out{from{opacity:1;-moz-transform:translateX(0)}to{opacity:0;-moz-transform:translateX(100%)}}@keyframes dw-sv-in{from{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@-webkit-keyframes dw-sv-in{from{opacity:0;-webkit-transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes dw-sv-in{from{opacity:0;-moz-transform:translateY(-100%)}to{opacity:1;-moz-transform:translateY(0)}}@keyframes dw-sv-out{from{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}@-webkit-keyframes dw-sv-out{from{opacity:1;-webkit-transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(100%)}}@-moz-keyframes dw-sv-out{from{opacity:1;-moz-transform:translateY(0)}to{opacity:0;-moz-transform:translateY(100%)}}@keyframes dw-sd-in{from{transform:translateY(-100%)}to{transform:translateY(0)}}@-webkit-keyframes dw-sd-in{from{opacity:1;-webkit-transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes dw-sd-in{from{-moz-transform:translateY(-100%)}to{-moz-transform:translateY(0)}}@keyframes dw-sd-out{from{transform:translateY(0)}to{transform:translateY(-100%)}}@-webkit-keyframes dw-sd-out{from{opacity:1;-webkit-transform:translateY(0)}to{opacity:1;-webkit-transform:translateY(-100%)}}@-moz-keyframes dw-sd-out{from{-moz-transform:translateY(0)}to{-moz-transform:translateY(-100%)}}@keyframes dw-su-in{from{transform:translateY(100%)}to{transform:translateY(0)}}@-webkit-keyframes dw-su-in{from{opacity:1;-webkit-transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes dw-su-in{from{-moz-transform:translateY(100%)}to{-moz-transform:translateY(0)}}@keyframes dw-su-out{from{transform:translateY(0)}to{transform:translateY(100%)}}@-webkit-keyframes dw-su-out{from{opacity:1;-webkit-transform:translateY(0)}to{opacity:1;-webkit-transform:translateY(100%)}}@-moz-keyframes dw-su-out{from{-moz-transform:translateY(0)}to{-moz-transform:translateY(100%)}}.mbsc-android-holo-light .dwwr,.mbsc-android-holo-light .dw-cal-sc-c{background:#f5f5f5}.mbsc-android-holo-light .dwwr,.mbsc-android-holo-light .dwb,.mbsc-android-holo-light .dw-li,.mbsc-android-holo-light .dw-dr,.mbsc-android-holo-light .dw-cal-tabs .dw-i{color:#000}.mbsc-android-holo-light .dwv{color:#31b7e8;border-bottom:2px solid #31b7e8}.mbsc-android-holo-light .dw-hl{background:#31b7e8;background:rgba(49,183,232,0.5)}.mbsc-android-holo-light .dwwb{color:#7d7d7d;background:#f5f5f5}.mbsc-android-holo-light .dwwl .dwb-a{color:#319abd;background:#f5f5f5}.mbsc-android-holo-light .dwwol{border-top:2px solid #31b7e8;border-bottom:2px solid #31b7e8}.mbsc-android-holo-light .dwb-a{background:#28799c;color:black}.mbsc-android-holo-light .dwwms .dw-li:after{border-color:#d9d4d4}.mbsc-android-holo-light .dw-msel:before{color:#31b7e8;text-shadow:0 0 5px #28799c}.mbsc-android-holo-light .dwwo{background:-webkit-gradient(linear,left bottom,left top,from(#f5f5f5),color-stop(0.52,rgba(245,245,245,0)),color-stop(0.48,rgba(245,245,245,0)),to(#f5f5f5));background:-webkit-linear-gradient(#f5f5f5,rgba(245,245,245,0) 52%,rgba(245,245,245,0) 48%,#f5f5f5);background:-moz-linear-gradient(#f5f5f5,rgba(245,245,245,0) 52%,rgba(245,245,245,0) 48%,#f5f5f5);background:linear-gradient(#f5f5f5,rgba(245,245,245,0) 52%,rgba(245,245,245,0) 48%,#f5f5f5)}.mbsc-android-holo-light .dwbc,.mbsc-android-holo-light .dwbw .dwb{border-color:#d9d4d4}.mbsc-android-holo-light .dw-bubble-bottom .dw-arr{border-color:transparent transparent #f5f5f5 transparent}.mbsc-android-holo-light .dw-bubble-top .dw-arr{border-color:#f5f5f5 transparent transparent transparent}.mbsc-android-holo-light .dw-cal-day-m{border-color:#31b7e8 #31b7e8 transparent transparent}.mbsc-android-holo-light .dw-cal-m-bottom .dw-cal-day-m{background:#31b7e8}.mbsc-android-holo-light .dw-cal .dw-sel .dw-i{background:#31b7e8;background:rgba(49,183,232,0.5)}.mbsc-android-holo-light .dw-hl-now .dw-cal-today{color:#31b7e8}.mbsc-android-holo-light .dwb-a .dw-cal-btn-txt{color:#319abd}.mbsc-android-holo-light .dw-cal-tabs .dw-sel{border-bottom:5px solid #31b7e8}.mbsc-android-holo-light .dw-cal-event-color{background:#31b7e8}.mbsc-android-holo-light .dw-cal .dw-cal-day-hl .dw-i{background:#31b7e8;color:white}.mbsc-android-holo-light .dw-cal-tabs{background:#e6e6e6}.mbsc-android-holo-light .dw-cal-tab{border-color:#e6e6e6}.mbsc-android-holo-light .dw-cal-tabs .dw-i,.mbsc-android-holo-light .dw-cal-day,.mbsc-android-holo-light .dw-cal-sc-m-cell{border-color:#d9d9d9}.mbsc-android-holo-light .dw-cal-btn-txt{color:#7d7d7d}.mbsc-android-holo-light .dw-week-nrs-c{background:#f5f5f5}.mbsc-android-holo-light .dw-week-nr-i{border-color:#d9d9d9;color:#7d7d7d}.mbsc-android-holo-light .dw-cal th{color:#7d7d7d}.mbsc-android-holo-light .dw-cal-events{background:#000;background:rgba(0,0,0,0.8)}.mbsc-android-holo-light .dw-cal-events-arr{border-color:rgba(0,0,0,0.8) transparent transparent}.mbsc-android-holo-light .dw-cal-events-b .dw-cal-events-arr{border-color:transparent transparent rgba(0,0,0,0.8)}.mbsc-android-holo-light .dw-cal-event{background:#7d7d7d;color:white}.mbsc-android-holo-light .dw-dr{background:#d9d9d9}.mbsc-android-holo-light .dw-sel .dw-dr{background:#31b7e8;color:white}.mbsc-android-holo-light.dw-timer .dwl{color:#31b7e8}.mbsc-android-holo-light .mbsc-rating-icon{color:#31b7e8}.mbsc-android-holo-light .mbsc-np-hdr{border-color:#d9d9d9}.mbsc-lv-android-holo-light .mbsc-lv{background:#dbdbdb}.mbsc-lv-android-holo-light .mbsc-lv .mbsc-lv-item.mbsc-lv-item-dragging{background:#31b7e8;background:rgba(49,183,232,0.5);border-color:rgba(49,183,232,0.5)}.mbsc-lv-android-holo-light .mbsc-lv-item,.mbsc-lv-android-holo-light .mbsc-lv-gr-title{background:#f5f5f5;color:#000}.mbsc-lv-android-holo-light.mbsc-lv-alt-row .mbsc-lv-item:nth-child(even){background:#ededed}.mbsc-lv-android-holo-light .mbsc-lv-item{border-color:#dbdbdb}.mbsc-lv-android-holo-light .mbsc-lv-gr-title{border-color:#dbdbdb}.mbsc-lv-android-holo-light .mbsc-lv .mbsc-lv-item.mbsc-lv-item-active{background:#dbdbdb}.mbsc-lv-android-holo-light .mbsc-lv-handle-bar-c,.mbsc-lv-android-holo-light.mbsc-lv-handle-left .mbsc-lv-handle-bar-c{border-color:#b3b3b3}.mbsc-lv-android-holo-light .mbsc-lv-handle-bar{background:#b3b3b3}.mbsc-android-holo-light.mbsc-ms-c{color:#000;background:#f5f5f5}.mbsc-android-holo-light.mbsc-ms-a .mbsc-ms-item-sel .mbsc-ms-item-i{color:#31b7e8}.mbsc-android-holo-light.mbsc-ms-b.mbsc-ms-top{border-color:#31b7e8}.mbsc-android-holo-light.mbsc-ms-b.mbsc-ms-bottom{border-color:#31b7e8}.mbsc-android-holo-light.mbsc-ms-b .mbsc-ms-item-sel .mbsc-ms-item-i{border-bottom-color:#31b7e8}.mbsc-android-holo-light.mbsc-ms-b.mbsc-ms-bottom .mbsc-ms-item-sel .mbsc-ms-item-i{border-top-color:#31b7e8}.mbsc-android-holo-light.mbsc-ms-b .mbsc-ms-item-i-c{border-color:#d9d9d9}.mbsc-android-holo-light .mbsc-btn-a .mbsc-ms-item-i{background:#28799c}.mbsc-android-holo-light .mbsc-progress-track{background:#d9d4d4}.mbsc-android-holo-light .mbsc-progress-bar{background:#31b7e8}.mbsc-android-holo-light .mbsc-slider-step{background:#000}.mbsc-android-holo-light .mbsc-slider-handle{background:#31b7e8}.mbsc-android-holo-light .mbsc-slider-handle.mbsc-active{background:#000}.mbsc-android-holo-light .mbsc-slider-handle:after{background:rgba(49,183,232,0.3)}.mbsc-android-holo-light .mbsc-slider-handle:focus:after,.mbsc-android-holo-light .mbsc-active .mbsc-slider-handle:after{border-color:#28799c}.mbsc-android-holo-light .mbsc-slider-tooltip{color:#000;background:#f5f5f5}.mbsc-android-holo-light.mbsc-slider input:disabled ~ .mbsc-progress-cont .mbsc-progress-track{background:#4d4d4d}.mbsc-android-holo-light.mbsc-slider input:disabled ~ .mbsc-progress-cont .mbsc-slider-handle{background:#000}.mbsc-android-holo-light.mbsc-slider input:disabled ~ .mbsc-progress-cont .mbsc-progress-bar{background:#a8a8a8}.mbsc-android-holo-light.mbsc-form{background:#f5f5f5;color:#000}.mbsc-android-holo-light .mbsc-desc{color:#a1a1a1}.mbsc-android-holo-light .mbsc-input select,.mbsc-android-holo-light .mbsc-input textarea,.mbsc-android-holo-light .mbsc-input input{background:#f5f5f5;outline-color:#f5f5f5;color:#000;border-color:#a8a8a8}.mbsc-android-holo-light.mbsc-wdg .mbsc-input textarea,.mbsc-android-holo-light.mbsc-wdg .mbsc-input input,.mbsc-lv-android-holo-light .mbsc-input textarea,.mbsc-lv-android-holo-light .mbsc-input input{background:#f5f5f5;outline-color:#f5f5f5}.mbsc-android-holo-light .mbsc-select .mbsc-input-wrap .mbsc-select-ic{border-color:transparent #a8a8a8 #a8a8a8 transparent}.mbsc-android-holo-light .mbsc-input textarea:-webkit-autofill,.mbsc-android-holo-light .mbsc-input input:-webkit-autofill{box-shadow:0 0 0 50em #f5f5f5 inset;-webkit-text-fill-color:#000}.mbsc-android-holo-light .mbsc-radio-box,.mbsc-android-holo-light .mbsc-checkbox-box{border-color:#4d4d4d}.mbsc-android-holo-light .mbsc-checkbox input.mbsc-active+.mbsc-checkbox-box:before,.mbsc-android-holo-light .mbsc-radio input.mbsc-active+.mbsc-radio-box:before{background:rgba(150,150,150,0.2)}.mbsc-android-holo-light .mbsc-btn{border-color:#d4d4d4;border-top:0;background:#d4d4d4;color:#000}.mbsc-android-holo-light .mbsc-btn.mbsc-active{background:#c2c2c2}.mbsc-android-holo-light .mbsc-btn-flat{background:transparent;border-color:transparent;color:#000}.mbsc-android-holo-light .mbsc-btn-flat.mbsc-active{background:transparent;border-color:transparent}.mbsc-android-holo-light .mbsc-btn:not(.mbsc-btn-flat){border-color:#d4d4d4;background:#d4d4d4;color:#000}.mbsc-android-holo-light .mbsc-btn-flat:disabled{color:#000}.mbsc-android-holo-light .mbsc-btn:disabled{background:#e6e6e6;color:#b5b5b5}.mbsc-android-holo-light.mbsc-form *::-moz-selection{background:#31b7e8}.mbsc-android-holo-light.mbsc-form *::selection{background:#31b7e8}.mbsc-android-holo-light .mbsc-divider{border-bottom:1px solid #31b7e8;color:#31b7e8}.mbsc-android-holo-light a{color:#31b7e8}.mbsc-android-holo-light .mbsc-input select:focus+input,.mbsc-android-holo-light .mbsc-input textarea:focus,.mbsc-android-holo-light .mbsc-input input:focus{border-color:#31b7e8}.mbsc-android-holo-light .mbsc-input .mbsc-control:focus ~ .mbsc-select-ic{border-color:transparent #31b7e8 #31b7e8 transparent}.mbsc-android-holo-light .mbsc-checkbox-box:after{border:3px solid #31b7e8;border-top:0;border-right:0}.mbsc-android-holo-light .mbsc-radio-box:after{background:#31b7e8}.mbsc-android-holo-light .mbsc-switch-handle{color:#fff;background:#c9c9c9}.mbsc-android-holo-light .mbsc-switch .mbsc-switch-track{background:#d9d9d9}.mbsc-android-holo-light .mbsc-switch input:checked:not(:disabled)+.mbsc-switch-track .mbsc-switch-handle{background:#31b7e8;background:rgba(49,183,232,0.7)}.mbsc-android-holo-light .mbsc-segmented-content{border-color:#31b7e8}.mbsc-android-holo-light .mbsc-segmented input:checked+.mbsc-segmented-content{background:#31b7e8}.mbsc-android-holo-light .mbsc-segmented input.mbsc-active+.mbsc-segmented-content{background:rgba(49,183,232,0.35)}.mbsc-android-holo-light .mbsc-stepper .mbsc-segmented-content{border-color:#d4d4d4}.mbsc-android-holo-light .mbsc-stepper .mbsc-stepper-val{background:#999;border-color:#999;color:#f5f5f5}.mbsc-android-holo-light .mbsc-stepper-control .mbsc-segmented-content{background:#d4d4d4}.mbsc-android-holo-light .mbsc-stepper .mbsc-active .mbsc-segmented-content{background:#c2c2c2;border-color:#c2c2c2}.mbsc-android-holo-light .mbsc-segmented input:disabled+.mbsc-segmented-content{border-color:#d4d4d4;color:#000}.mbsc-android-holo-light .mbsc-segmented input:disabled:checked+.mbsc-segmented-content,.mbsc-android-holo-light .mbsc-step-disabled .mbsc-segmented-content{background:#d4d4d4;border-color:#d4d4d4;color:#000}.mbsc-android-holo-light .mbsc-stepper input:disabled ~ .mbsc-segmented-item .mbsc-stepper-val{background:#f5f5f5}.mbsc-android-holo-light .mbsc-segmented input:disabled:checked+.mbsc-segmented-content,.mbsc-android-holo-light .mbsc-stepper input:disabled ~ .mbsc-segmented-item .mbsc-segmented-content,.mbsc-android-holo-light .mbsc-stepper .mbsc-step-disabled .mbsc-segmented-content{background:#e6e6e6;color:#b5b5b5}.mbsc-android-holo-light .mbsc-stepper input:disabled{color:#b5b5b5;-webkit-text-fill-color:#b5b5b5}.mbsc-android-holo-light .mbsc-stepper input{color:#f5f5f5}.mbsc-android-holo-light .mbsc-stepper-val-left input,.mbsc-android-holo-light .mbsc-stepper-val-right input{color:#000} -------------------------------------------------------------------------------- /第三方工具/mobiscroll.trial/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mobiscroll 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 25 | 26 | 90 | 91 | 92 | 93 |
94 |

Mobiscroll

95 |
96 | 97 |
98 | 99 | 100 |
101 | 102 | 109 |
110 |
111 | 112 | 117 |
118 |
119 | 120 | 127 |
128 |
129 | 130 | 134 |
135 |
136 | 137 | 143 |
144 | 145 | 146 | 147 | 148 | 149 |
150 | 151 | 163 |
164 | 165 | 166 |
167 | 168 | 169 |
170 | 171 | 172 |
173 | 174 | 175 |
176 | 177 | 178 |
179 | 180 | 181 |
182 | 183 |
184 | 185 | 186 | -------------------------------------------------------------------------------- /第三方工具/mobiscroll.trial/license/EULA.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DMQ/notes/63639b912f0bf1a81107f11511110ca227e6e38a/第三方工具/mobiscroll.trial/license/EULA.pdf -------------------------------------------------------------------------------- /第三方工具/mobiscroll.trial/readme.txt: -------------------------------------------------------------------------------- 1 | This is the Mobiscroll Trial package, which contains a trial version of the respective Mobiscroll commercial product. 2 | 3 | Please refer to the EULA licensing terms (present in the license folder) or http://mobiscroll.com/EULA for more info. --------------------------------------------------------------------------------