Browse Source

电动牙刷静态页面

liujiankang 7 years ago
commit
885f941eca
100 changed files with 20305 additions and 0 deletions
  1. 28 0
      .project
  2. 65 0
      add-tooth.html
  3. 401 0
      clearing.html
  4. 115 0
      coupon_list.html
  5. 55 0
      css/iconfont.css
  6. 63 0
      css/icons-extra.css
  7. 627 0
      css/main.css
  8. 136 0
      css/mui.dtpicker.css
  9. 123 0
      css/mui.imageviewer.css
  10. 5 0
      css/mui.min.css
  11. 85 0
      css/mui.picker.css
  12. 7 0
      css/mui.picker.min.css
  13. 64 0
      css/mui.poppicker.css
  14. 8 0
      css/rp.txt
  15. 12 0
      css/swiper.min.css
  16. 102 0
      customer-service.html
  17. 181 0
      exchange-goods.html
  18. 48 0
      follow-me.html
  19. BIN
      fonts/iconfont.ttf
  20. BIN
      fonts/mui-icons-extra.ttf
  21. BIN
      fonts/mui.ttf
  22. BIN
      images/banner-1.jpg
  23. BIN
      images/banner-2.jpg
  24. BIN
      images/banner-3.jpg
  25. BIN
      images/card-bai.png
  26. BIN
      images/card-fen.png
  27. BIN
      images/card-hei.png
  28. BIN
      images/card-huang.png
  29. BIN
      images/card-lan.png
  30. BIN
      images/cart-null.png
  31. BIN
      images/detais-1.jpg
  32. BIN
      images/detais-2.jpg
  33. BIN
      images/detais-3.jpg
  34. BIN
      images/detais-4.jpg
  35. BIN
      images/detais-5.jpg
  36. BIN
      images/erweima-soodo.png
  37. BIN
      images/icon-vip-1.png
  38. BIN
      images/icon-vip-2.png
  39. BIN
      images/icon-vip-3.png
  40. BIN
      images/index-1.jpg
  41. BIN
      images/index-2.jpg
  42. BIN
      images/index-content.jpg
  43. BIN
      images/index-tit-1.jpg
  44. BIN
      images/index-tit-2.jpg
  45. BIN
      images/index-tit-3.jpg
  46. BIN
      images/index-tit-4.jpg
  47. BIN
      images/indexShare.jpg
  48. BIN
      images/loading.png
  49. BIN
      images/logo.png
  50. BIN
      images/next.png
  51. BIN
      images/pay-win-bg-1.png
  52. BIN
      images/pay-win-bg.png
  53. BIN
      images/prev.png
  54. BIN
      images/pro-bai.png
  55. BIN
      images/pro-fen.png
  56. BIN
      images/pro-hei.png
  57. BIN
      images/pro-huang.png
  58. BIN
      images/pro-lan.png
  59. BIN
      images/radio-1.png
  60. BIN
      images/radio-2.png
  61. BIN
      images/scan-frame.png
  62. BIN
      images/select-1.png
  63. BIN
      images/select-2.png
  64. BIN
      images/share.png
  65. BIN
      images/shuatou-1.jpg
  66. BIN
      images/shuatou-1.png
  67. BIN
      images/shuatou-2.jpg
  68. BIN
      images/shuatou-2.png
  69. BIN
      images/to-press.png
  70. BIN
      images/to-vip.png
  71. BIN
      images/tx-1.png
  72. BIN
      images/yashua-bai.png
  73. BIN
      images/yashua-fen.png
  74. BIN
      images/yashua-hei.png
  75. BIN
      images/yashua-huang.png
  76. BIN
      images/yashua-lan.png
  77. BIN
      images/yhq-1.png
  78. BIN
      images/yhq-2.png
  79. BIN
      images/youhuiquan-details.jpg
  80. BIN
      images/youhuiquan.jpg
  81. 231 0
      index.html
  82. 474 0
      integral-log.html
  83. 11548 0
      js/city.data-3.js
  84. 1605 0
      js/city.data.js
  85. 4 0
      js/jquery-2.1.1.min.js
  86. 867 0
      js/jquery.autocompleter.js
  87. 9 0
      js/jquery.autocompleter.min.js
  88. 431 0
      js/main.js
  89. 403 0
      js/main.js.bak
  90. 268 0
      js/mui.imageViewer.js
  91. 116 0
      js/mui.lazyload.img.js
  92. 327 0
      js/mui.lazyload.js
  93. 9 0
      js/mui.min.js
  94. 389 0
      js/mui.picker.js
  95. 7 0
      js/mui.picker.min.js
  96. 160 0
      js/mui.poppicker.js
  97. 382 0
      js/mui.previewimage.js
  98. 628 0
      js/mui.view.js
  99. 322 0
      js/mui.zoom.js
  100. 0 0
      js/swiper.min.js

+ 28 - 0
.project

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>soodo-wechat</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.aptana.ide.core.unifiedBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.aptana.projects.webnature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1515572579268</id>
+			<name></name>
+			<type>26</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-node_modules</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>

+ 65 - 0
add-tooth.html

@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+
+	<head>
+		<meta charset="UTF-8">
+		<title>添加牙刷</title>
+		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
+		<meta name="apple-mobile-web-app-capable" content="yes">
+		<meta name="apple-mobile-web-app-status-bar-style" content="black">
+		<link rel="stylesheet" type="text/css" href="css/mui.min.css" />
+		<link rel="stylesheet" type="text/css" href="css/iconfont.css" />
+		<link rel="stylesheet" type="text/css" href="css/main.css" />
+		
+	</head>
+
+	<body>
+		<div class="mui-content">
+			<div class="scan-frame-box saomiao">
+				<img src="images/scan-frame.png" />
+				<br />
+				<div>您还没有添加牙刷,请添加 </div>
+				<p>(点击扫描产品唯一码)</p>
+			</div>
+		</div>
+		<div class="add-tooth">
+
+		</div>
+		<div class="add-tooth-footer">
+			<h4 class="mui-text-center cl-red"> 添加成为会员</h4>
+			<div class="add-tooth-content">
+				<p class="cl-red">1.购买soodo上朵电动牙刷</p>
+				<p class="cl-red">2.扫描电动牙刷欢迎卡上的产品唯一码</p>
+			</div>
+		</div>
+		<!-- 加载ing begin-->
+		<div class="loading covers">
+			<div class="loading-bj"></div>
+			<p>正在加载...</p>
+		</div>
+		<!-- 加载ing end -->
+		<script type="text/javascript" src="js/mui.min.js"></script>
+		<script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
+		<script type="text/javascript" src="js/main.js"></script>
+		<script type="text/javascript" src="js/wechat-utils-1.0.js"></script>
+		<script type="text/javascript">
+			
+			//调用微信扫一扫
+			$(document).on('tap', '.saomiao', function() {
+				wx.scanQRCode({
+					needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
+					scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
+					success: function(res) {
+						/*var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
+						*/
+					}
+				});
+			});
+			mui.ready(function() {
+				console.log("页面加载完毕");
+				$(".loading").hide().css("opacity", "0"); //隐藏(正在加载...)
+			});
+		</script>
+	</body>
+
+</html>

File diff suppressed because it is too large
+ 401 - 0
clearing.html


+ 115 - 0
coupon_list.html

@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<html>
+
+	<head>
+		<meta charset="UTF-8">
+		<title>优惠券</title>
+		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
+		<meta name="apple-mobile-web-app-capable" content="yes">
+		<meta name="apple-mobile-web-app-status-bar-style" content="black">
+		<link rel="stylesheet" type="text/css" href="css/mui.min.css" />
+		<link rel="stylesheet" type="text/css" href="css/iconfont.css" />
+		<link rel="stylesheet" type="text/css" href="css/main.css" />
+		<script type="text/javascript">
+			// 屏蔽分享
+			window.hiddenAllWechatMenu = true;
+		</script>
+	</head>
+
+	<body>
+		<!--下拉刷新容器-->
+		<div id="pullrefresh_yhq_list" class="mui-content mui-scroll-wrapper">
+			<div class="mui-scroll">
+				<!--优惠券列表-->
+				<ul class="my-yhq-list">
+
+				</ul>
+			</div>
+		</div>
+		<script type="text/javascript" src="js/mui.min.js"></script>
+		<script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
+		<script type="text/javascript" src="js/main.js"></script>
+		<script type="text/javascript" src="js/wechat-utils-1.0.js"></script>
+		<script>
+			window.addEventListener('pageshow', function(e) {
+				// 通过persisted属性判断是否存在 BF Cache
+				if(e.persisted) {
+					location.reload();
+				}
+			});
+			var pageNumber = 0,
+				pagesize = 10;
+			mui.init({
+				pullRefresh: {
+					container: '#pullrefresh_yhq_list',
+					down: {
+						//callback: pulldownRefresh
+					},
+					up: {
+						contentrefresh: '正在加载...',
+						callback: pullupRefresh
+					}
+				}
+			});
+			/**
+			 * 上拉加载具体业务实现
+			 */
+			function pullupRefresh() {
+				++pageNumber; //每次上拉页数+1
+				$.ajax(base_path + '/wechat/coupon/couponItemList?dates=' + new Date().getTime(), {
+					data: {
+						"pageNo": pageNumber, //pageNo第几页
+						"pageSize": pagesize //pageSize每页条数
+					},
+					dataType: 'json',
+					xhrFields: {
+						withCredentials: true
+					},
+					crossDomain: true,
+					type: 'get',
+					timeout: 15000,
+					success: function(dt) {
+						if(dt.isRedirect) {
+							location.href = dt.redirectURL;
+						} else {
+							console.log(dt)
+							if(dt.status) { //判断接口返回状态status
+								var table = document.body.querySelector('.my-yhq-list');
+								var data = dt.data.itemList;
+								mui('#pullrefresh_yhq_list').pullRefresh().endPullupToRefresh(dt.data.itemList.length < pagesize); //endPullupToRefresh(ture)表示没有更多数据了,停止上拉加载
+								mui.each(data, function(index) {
+									var li = document.createElement('li'); //创建li标签
+									var src = 'images/yhq-1.png';
+									if(new Date(this.couponUseEndDate) >= new Date) {
+										li.className = 'my-yhq-cell';
+									} else {
+										li.className = 'my-yhq-cell active';
+										src = 'images/yhq-2.png';
+									}
+									var couponReduceHtml = '';
+									if(this.couponType == 1) { //减免金额
+										couponReduceHtml += '<span>' + (this.couponReduce / 100).toFixed(0) + '</span>元';
+									} else if(this.couponType == 2) { //减免率
+										couponReduceHtml += '<span>' + (this.couponReduce / 100).toFixed(1) + '</span>折';
+									}
+									li.innerHTML = '<img width="100%" src="' + src + '" /><div class="fixed-box"><div class="table"><div class="left-cell"><span class="tit">' + this.couponName + '</span><p class="time">使用条件:满' + (this.couponConsumeEnough / 100).toFixed(0) + '元可用</p><span class="condition">有效期至:' + this.couponUseEndDate + '</span></div><div class="right-cell"><div class="money">' + couponReduceHtml + '</div></div></div></div';
+									table.appendChild(li);
+								});
+							} else {
+								mui.alert("获取优惠券列表失败!");
+							}
+						}
+					},
+					error: function(xhr, type, errorThrown) {
+						console.log(xhr);
+						mui.alert("获取优惠券列表失败!网络错误");
+					}
+				});
+			}
+			mui.ready(function() {
+				mui('#pullrefresh_yhq_list').pullRefresh().pullupLoading();//首次加载
+			});
+		</script>
+	</body>
+
+</html>

+ 55 - 0
css/iconfont.css

@@ -0,0 +1,55 @@
+@font-face {font-family: "iconfont";
+  src: url('../fonts/iconfont.ttf?t=1515658169779') format('truetype'); /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+}
+
+.iconfont {
+	position: relative;
+  font-family:"iconfont" !important;
+  font-size:25px;
+  font-style:normal;
+  -webkit-font-smoothing: antialiased;
+  padding:0;
+}
+
+.icon-liebiao:before { content: "\e6cd"; }
+
+.icon-gouwuche:before { content: "\e6ce"; }
+
+.icon-shouye:before { content: "\e6cf"; }
+
+.icon-huiyuan:before { content: "\e6d0"; }
+
+.icon-shuoming:before { content: "\e6d1"; }
+
+.icon-nan:before { content: "\e6d2"; }
+
+.icon-nv:before { content: "\e6d3"; }
+
+.icon-jia:before { content: "\e6d4"; }
+
+.icon-saomiao:before { content: "\e6d5"; }
+
+.icon-chenggong:before { content: "\e6d6"; }
+
+.icon-dingwei:before { content: "\e6d7"; }
+
+.icon-yashua:before { content: "\e6d8"; }
+
+.icon-jifen:before { content: "\e6d9"; }
+
+.icon-tianjia:before { content: "\e6da"; }
+
+.icon-daifukuan:before { content: "\e6db"; }
+
+.icon-quanbao:before { content: "\e6dc"; }
+
+.icon-yifahuo:before { content: "\e6dd"; }
+
+.icon-daifahuo:before { content: "\e6de"; }
+
+.icon-fenxiang:before { content: "\e6df"; }
+
+.icon-quanbu:before { content: "\e6e0"; }
+
+.icon-guanbi:before { content: "\e6e1"; }
+

+ 63 - 0
css/icons-extra.css

@@ -0,0 +1,63 @@
+@font-face {
+    font-family: MuiiconSpread;
+    font-weight: normal;
+    font-style: normal;
+    src:  url('../fonts/mui-icons-extra.ttf') format('truetype'); /* iOS 4.1- */
+}
+.mui-icon-extra
+{
+    font-family: MuiiconSpread;
+    font-size: 24px;
+    font-weight: normal;
+    font-style: normal;
+    line-height: 1;
+    display: inline-block;
+    text-decoration: none;
+    -webkit-font-smoothing: antialiased;
+}
+.mui-icon-extra-cold:before { content: "\e500"; }
+.mui-icon-extra-share:before { content: "\e200"; }
+.mui-icon-extra-class:before { content: "\e118"; }
+.mui-icon-extra-custom:before { content: "\e117"; }
+.mui-icon-extra-new:before { content: "\e103"; }
+.mui-icon-extra-card:before { content: "\e104"; }
+.mui-icon-extra-grech:before { content: "\e105"; }
+.mui-icon-extra-trend:before { content: "\e106"; }
+.mui-icon-extra-filter:before { content: "\e207"; }
+.mui-icon-extra-holiday:before { content: "\e300"; }
+.mui-icon-extra-cart:before { content: "\e107"; }
+.mui-icon-extra-heart:before { content: "\e180"; }
+.mui-icon-extra-computer:before { content: "\e600"; }
+.mui-icon-extra-express:before { content: "\e108"; }
+.mui-icon-extra-gift:before { content: "\e109"; }
+.mui-icon-extra-gold:before { content: "\e102"; }
+.mui-icon-extra-lamp:before { content: "\e601"; }
+.mui-icon-extra-rank:before { content: "\e110"; }
+.mui-icon-extra-notice:before { content: "\e111"; }
+.mui-icon-extra-sweep:before { content: "\e202"; }
+.mui-icon-extra-arrowleftcricle:before { content: "\e401"; }
+.mui-icon-extra-dictionary:before { content: "\e602"; }
+.mui-icon-extra-heart-filled:before { content: "\e119"; }
+.mui-icon-extra-xiaoshuo:before { content: "\e607"; }
+.mui-icon-extra-top:before { content: "\e403"; }
+.mui-icon-extra-people:before { content: "\e203"; }
+.mui-icon-extra-topic:before { content: "\e603"; }
+.mui-icon-extra-hotel:before { content: "\e301"; }
+.mui-icon-extra-like:before { content: "\e206"; }
+.mui-icon-extra-regist:before { content: "\e201"; }
+.mui-icon-extra-order:before { content: "\e113"; }
+.mui-icon-extra-alipay:before { content: "\e114"; }
+.mui-icon-extra-find:before { content: "\e400"; }
+.mui-icon-extra-arrowrightcricle:before { content: "\e402"; }
+.mui-icon-extra-calendar:before { content: "\e115"; }
+.mui-icon-extra-prech:before { content: "\e116"; }
+.mui-icon-extra-cate:before { content: "\e501"; }
+.mui-icon-extra-comment:before { content: "\e209"; }
+.mui-icon-extra-at:before { content: "\e208"; }
+.mui-icon-extra-addpeople:before { content: "\e204"; }
+.mui-icon-extra-peoples:before { content: "\e205"; }
+.mui-icon-extra-calc:before { content: "\e101"; }
+.mui-icon-extra-classroom:before { content: "\e604"; }
+.mui-icon-extra-phone:before { content: "\e404"; }
+.mui-icon-extra-university:before { content: "\e605"; }
+.mui-icon-extra-outline:before { content: "\e606"; }

+ 627 - 0
css/main.css

@@ -0,0 +1,627 @@
+/* Css Reset */
+body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,
+form,fieldset,input,textarea,p,blockquote,th,td,img { padding: 0; margin: 0; }
+fieldset,img { border: 0; }
+address,caption,cite,code,dfn,em,th,var,i { font-weight:normal; font-style:normal; }
+ol,ul,li { list-style: none; }
+div,dl,dt,dd,ol,ul,li{ zoom:1; }
+caption,th { text-align: left; }
+q:before,q:after { content:''; }
+abbr,acronym { border: 0; }
+
+/*loading*/
+.loading{width: 100%;height:100%;position: fixed;top: 0;padding-top: 50%; left: 0;background: rgba(0,0,0,0.8);z-index: 999;}
+.loading-bj{background: url(../images/loading.png);width: 20px;height: 20px;background-size: 20px;margin: 0.3rem auto 0;animation:rotateIn 1s .2s linear infinite;-moz-animation:rotateIn 1s .2s linear infinite;-webkit-animation:rotateIn 1s .2s linear infinite;}
+.loading p{color:#fff;opacity: .7; font-size: 12px;text-align: center;margin-top: 0.1rem;}
+
+@-webkit-keyframes rotateIn{
+0%{transform: rotate(0)}
+100%{transform: rotate(360deg)}
+}
+@-moz-keyframes rotateIn{
+0%{transform: rotate(0)}
+100%{transform: rotate(360deg)}
+}
+body{background-color: #fff;font-size: 14px;}
+p{color: #999;}
+.mui-pull-caption,.mui-pull{font-size: 12px;font-weight: 300;}
+.loading-bg{width: 100%;min-width:100%;height: 100%;min-height:100%; background-color:#F0F0F0;position: fixed;left: 0;top: 0;z-index: 999;}
+.loading-bg .mui-loading{margin-top: 50%;text-align: center;color: #aaa;}
+.my-content-padded{margin: 15px;}
+.mui-table-view-cell:after{left: 0;}
+.details-content{max-width: 100%;overflow: hidden;word-break: break-all;}
+.details-content img{max-width: 100% !important;}
+.mui-content{background-color: #fff;}
+.mui-bar-nav{-webkit-box-shadow: 0 0 0 #fff;box-shadow: 0 0 0 #fff;position: fixed;background-color: #fff; padding: 10px 14px;height: 55px;}
+.mui-bar-nav:after{display: none;}
+.mui-bar-nav~.mui-content{padding-top: 55px;}
+.my-btn-cancel {display: none; position: absolute;right: 10px;top: 10px;padding: 7px 5px;width: 15%;text-align: center;border-radius: 5px;color: #666;}
+.header{margin: 10px 0;}
+#index-top-menu{border: 0;}
+#index-top-menu .mui-control-item{color: #333;border: 0;position: relative;}
+#index-top-menu .mui-control-item.mui-active{background-color: #fff;color: #333;}
+#index-top-menu .mui-control-item.mui-active:after{content: '';position: absolute;left: 50%;bottom: 6px;width: 26px;margin-left: -13px;height: 1px;background-color: #333;}
+#pro-top-menu{border: 0;padding-top: 5px;}
+#pro-top-menu .mui-control-item{color: #333;border: 0;position: relative;}
+#pro-top-menu .mui-control-item.mui-active{background-color: #fff;color: #333;}
+#pro-top-menu .mui-control-item:after{content: '';position: absolute;left: 0;bottom: 0;width: 100%;height: 1px;background-color: #ccc;}
+#pro-top-menu .mui-control-item.mui-active:after{background-color: #333;}
+.pro-name{font-size: 14px;color: #333;padding: 2px 0;}
+.pro-price{font-size: 14px;color: #f16071;padding: 2px 0;}
+.banner-box{margin: 0;}
+.swiper-slide img{width: 100%;}
+.banner-box-pro{margin: 12px 14px 5px 14px;}
+.mui-slider-indicator .mui-indicator {display: inline-block;width: 8px;height: 8px;margin: 1px 2px;cursor: pointer;border-radius: 8px;background: #e8e8e8;-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,.7);box-shadow: 0 0 0 0 rgba(130,130,130,.7);}
+.mui-slider-indicator .mui-active.mui-indicator{background-color: #f16071;width: 8px;}
+.mui-slider-indicator{bottom: 4px;}
+.table-top{vertical-align: top;}
+.table-bottom{vertical-align: bottom;}
+.table-middle{vertical-align: middle;}
+.div-btn-buy-know{background-color: #f16071;color: #fff;font-size: 16px;}
+.cart{line-height: 1.1;}
+.cart div{font-size: 12px;}
+.my-badge-danger{background: #f16071;color: #fff; -webkit-transform: scale(.7);}
+.cart .my-badge-danger{position: absolute;top: 3px;display: none;}
+.cart:after{content:'';position: absolute;top: 0;left: 0;width: 100%;height: 1px;background: #ccc;-webkit-transform: scaleY(.5);}
+.my-picker{position: fixed;bottom: 0;padding-top: 0;max-height: 500px; left: 0;width: 100%;z-index: 999; background-color: #fff; -webkit-transform: translateY(100%);transform: translateY(100%); -webkit-transition: .5s;transition: .5s;}
+.my-picker.active{-webkit-transform: translateY(0%);transform: translateY(0%);}
+.my-picker .icon-guanbi{position: absolute;right:0;top:0;color: #999;font-size: 16px;padding: 10px;}
+.pro-select-color{padding: 3px 0;background: #f8f8f8;color: #999;border-radius: 15px;margin-right: 8px;margin-bottom: 15px; display: inline-block;width: 22.4%;text-align: center;}
+.pro-select-color.active{background: #f16071;color: #fff;}
+.my-btn-block{font-size: 16px;display: block;width: 100%;margin-bottom:0;padding: 15px 0;border-radius: 0;}
+.my-btn-buy-know{border: 0;background-color: #f16071;color: #fff;}
+.my-btn-buy-know:active{background-color: #f16071 !important;color: #fff;}
+.my-btn-add-cart{border: 0;background-color: #f7a0aa;color: #fff;}
+.my-btn-add-cart:active{background-color: #f7a0aa !important;color: #fff;}
+.my-btn-user-know{border: 0;background-color: #dddddd;color: #fff;}
+.my-btn-user-know.active{border: 0;background-color: #f16071;}
+.div-btn-buy-cart{background-color: #f7a0aa;color: #fff;font-size: 16px;}
+.mui-bar-tab{background-color: #fff;-webkit-box-shadow: 0 0 1px rgba(0,0,0,.2);box-shadow: 0 0 1px rgba(0,0,0,.2);}
+.swiper-button-next.swiper-button-black{background-image: url(../images/next.png);width: 15px;height: 24px;background-size: 15px 24px;right: 15px;}
+.swiper-button-prev.swiper-button-black{background-image: url(../images/prev.png);width: 15px;height: 24px;background-size: 15px 24px;left: 15px;}
+.mui-bar-tab .mui-tab-item{color: #bbb;}
+.mui-bar-tab .mui-tab-item .iconfont {top: 3px;width: 24px;height: 24px;padding-top: 0;padding-bottom: 0;}
+.mui-bar-tab .mui-tab-item .iconfont~.mui-tab-label{font-size: 12px;display: block;overflow: hidden;text-overflow: ellipsis;    padding-top: 5px;line-height: 1;}
+.mui-bar-tab .mui-tab-item.mui-active{color: #333;}
+.my-grid-view-no:after,.my-grid-view-no:before,.my-grid-view-no .mui-table-view-cell:after{display: none;}
+.my-view-no:after,.my-view-no:before{display: none;}
+#vip-menu-nav{border: 0;}
+#vip-menu-nav .mui-control-item{color: #333;border: 0;position: relative;line-height: 28px;}
+#vip-menu-nav .mui-control-item.mui-active{background-color: #fff;color: #333;}
+#vip-menu-nav .mui-control-item.mui-active:after{content: '';position: absolute;left: 50%;bottom: 6px;width: 26px;margin-left: -13px;height: 1px;background-color: #333;}
+.mui-numbox [class*=btn-numbox], .mui-numbox [class*=numbox-btn]{line-height: 22px;}
+#jifen-menu-nav {border: 0;}
+#jifen-menu-nav .mui-control-item{color: #999;border: 0;position: relative;line-height: 20px;font-size: 13px;}
+#jifen-menu-nav .mui-control-item>div{color: #f16071;font-size: 14px;}
+#jifen-menu-nav .mui-control-item:before{content:'';position: absolute;left: 0;top: 30%;height: 40%;width: 1px;background: #ccc;-webkit-transform: scaleX(.5);}
+#jifen-menu-nav .mui-control-item:first-child:before{display: none;}
+#jifen-menu-nav .mui-control-item.mui-active{background-color: #fff;color: #999;}
+
+.tel{color: #333;}
+.mui-bar-tab .my-grid-view-no{height: 100%;}
+.mui-bar-tab .mui-table-view-cell{height: 100%;padding:0;}
+.mui-bar-tab .mui-table-view-cell.mui-active{background-color: #fff;}
+.mui-bar-tab .mui-table{height: 100%;text-align: center;}
+.buy-footer1 {position: fixed;bottom: 0;left: 0;height: 50px;background-color: #f0f0f0;width: 100%;padding: 0;}
+.btn-add-address{height: 20px;line-height: 20px; position: relative;width: 110px; margin: 0 auto;text-align: right;color: #666;}
+.btn-add-address .icon-jia{position: absolute;left:0%;top: 0;font-size: 20px;}
+.my-btn{width: 100px;color: #666;}
+.pro-table-pull{padding-bottom: 50px;}
+.mui-table-view.mui-grid-view .mui-table-view-cell{font-size: 14px;}
+.dalog-vip-center{
+    display: none;
+    -webkit-transition-duration: 400ms;
+    transition-duration: 400ms;
+    position: fixed;
+    width: 280px;
+    height: 260px;
+    top: 50%;
+    left: 50%;
+    margin-left: -140px;
+    margin-top: -140px;
+    opacity: 1;
+    z-index: 999;
+}
+.buy-footer1 {position: fixed;bottom: 0;left: 0;height: 50px;background-color: #f0f0f0;width: 100%;padding: 0;}
+.buy-footer1 .tb-clearing tr td:first-child,.buy-footer1 .tb-clearing tr td:nth-of-type(2){position: relative;}
+.buy-footer1 .tb-clearing tr td:first-child:after,.buy-footer1 .tb-clearing tr td:nth-of-type(2):after{content: '';position: absolute;left: 0;top: 0;right: 0;height: 1px;width: 100%;background: #ccc;}
+.buy-footer1 .tb-clearing{border-top: 0;}
+.status-list li{font-size: 12px;color: #666;padding: 5px 15px;}
+.my-btn-black{border: 1px solid rgba(0,0,0,.5);padding: 10px 0;text-align: center;width: 32%;margin: 0 4% 50px 4%;border-radius: 0;}
+.cusomer-ul .mui-table-view-cell>a:not(.mui-btn){margin: -11px -30px;}
+#pro-menu{top: 0;border: 0; border-bottom: 1px solid rgba(0,0,0,.1);border-radius: 0;padding-top: 10px;}
+#pro-menu .mui-control-item{color: #bbb;border-left: 0;position: relative;}
+#pro-menu .mui-control-item:after{content: '';position: absolute;left: 0; width:100%;height: 1px;background-color: transparent;bottom: 0;}
+#pro-menu .mui-control-item:first-child{border-left-width: 0px;}
+/*#pro-menu .mui-control-item:last-child:after{width: 4em;}*/
+#pro-menu .mui-control-item.mui-active{color: #333;background-color: #fff;}
+#pro-menu .mui-control-item.mui-active:after{background-color: #333;}
+.price{padding:0 0 2px 0;}
+.add_gwc{padding: 18px 25px;border-radius: 0;background-color: #f16071 !important;color: #fff;border: 0;}
+.add_gwc1 {padding: 18px 25px;border-radius: 0;background-color: #ddd;color: #fff;border: 0;width: 100%;}
+.add_gwc:active{color: #fff;background-color:#ff1b68;}
+.gwc_null {padding: 12% 0 8% 0;text-align: center;display: none;}
+.tb-clearing {width: 100%;background-color: #fff;border-top: 1px solid rgba(0,0,0,.1);}
+.tb-clearing tr td:first-child {width: 22%;text-align: right;min-width: 3.5em;}
+.shopping-box{margin-bottom: 55px;}
+.quanxuan {position: relative;}
+.tb-clearing tr td:nth-of-type(2) {width: 50%;}
+.mt-mr-che {margin: 2.5em .3em 0 0;}
+.wh-100 {width: 130px !important;max-width: 130px !important;height: 100px !important;line-height: 100px; margin-top: 0;overflow: hidden;}
+.wh-100 img {height: 100%;}
+.count_price_box {color: #e4004d;}
+.cl-red{color: #f16071;}
+.gift{padding-top: 5px;margin-bottom: 0;font-size: 12px;}
+.clearing-box{margin: 14px;}
+.clearing-box .center{margin-left: 35%;}
+.my-view-no-top:before{display: none;}
+.my-view-no-top .mui-navigate-right:after{right: 0;font-size: 22px;}
+			input[name=checkbox] {
+    width: 18px;
+    height: 18px;
+    -webkit-appearance: none;
+    appearance: none;
+    cursor: pointer;
+    vertical-align: top;
+    background: url(../images/select-1.png) center center no-repeat;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    position: relative;
+    border: 0;
+    background-size: 100%;
+}
+input[name=checkbox]:checked {
+    background: url(../images/select-2.png) center center no-repeat;
+    background-size: 100%;
+}
+			input[name=radio] {
+    width: 18px;
+    height: 18px;
+    -webkit-appearance: none;
+    appearance: none;
+    cursor: pointer;
+    vertical-align: top;
+    background: url(../images/radio-1.png) center center no-repeat;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    position: relative;
+    border: 0;
+    background-size: 100%;
+}
+input[name=radio]:checked {
+    background: url(../images/radio-2.png) center center no-repeat;
+    background-size: 100%;
+}
+.pay-yes{background: #fde9eb;border-radius: 0 0 50% 50%;-webkit-transform: scaleX(1.2);transform: scaleX(1.2); background-size: 100% auto; height:220px;text-align: center;padding: 50px 0;}
+.add-tooth{background: #fde9eb;border-radius:50% 50% 0 0;-webkit-transform: scaleX(1.2);transform: scaleX(1.2); background-size: 100% auto; height:220px;text-align: center;padding: 50px 0;position: fixed;left: 0;width: 100%;bottom: 0;}
+.mui-input-row label{padding: 11px 10px;}
+.my-table{padding: 0 10px;}
+.my-table .my-label{padding-left:50px !important;padding-right:0 !important;}
+.my-table .mui-checkbox input[type=checkbox]:before, .mui-radio input[type=radio]:before{font-size: 25px !important;}
+.my-table .mui-checkbox input[type=checkbox]:checked:before, .mui-radio input[type=radio]:checked:before{color: #f16071;}
+.mui-input-group .mui-input-row:after{display: none;}
+.mui-input-group .line-bottom:after{display: block;left: 10px;right: 10px;}
+.mui-input-group .line-bottom input,.mui-input-group .line-top input{font-size: 12px;}
+.mui-card{border-radius: 5px;box-shadow: 0 1px 5px rgba(0,0,0,.2);}
+.my-tooth-ul>li{margin: 15px 0;}
+.my-tooth-ul>li .footer{color: #666;font-size: 12px;padding-top: 10px;}
+.my-tooth-ul>li .mui-card-header.mui-card-media .mui-media-body{line-height: 27px;padding-left: 20px;}
+.my-tooth-ul>li .mui-card-header>img:first-child{width: 55px;height: 55px;}
+.update {
+    font-style: normal;
+    color: #999999;
+    margin-right: -25px;
+}
+.my-vip-msg-list:after,.my-vip-msg-list:before,.my-vip-msg-list .mui-table-view-cell:after{left: 10px;right: 10px;}
+.my-vip-msg-list.mui-table-view-chevron .mui-table-view-cell{padding: 11px 59px 11px 13px;}
+.my-vip-msg-list input{font-size: 14px;color: #999;}
+.my-vip-msg-list input::-webkit-input-placeholder{color: #ccc;}
+.my-btn-receive{display: block;width: 170px;border: 0;border-radius: 0; padding: 13px 0; margin: 0 auto;background: #f16071;color: #fff;font-size: 16px;}
+.cl-blue{color: #0bacf7;}
+.cl-yellow{color: #f4b200;}
+.integral-list .mui-col-xs-4:after{content:'';position: absolute;right: 0;top: 20%;height: 60%; width: 1px;background: #ccc;}
+.integral-list .mui-col-xs-4:last-child:after{display: none;}
+.my-integral-cell{padding:12px 10px 12px 0;border-radius: 5px;    box-shadow: 0 1px 5px rgba(0,0,0,.2);}
+.integral-number{display: inline-block;border-radius: 50%;width:60px;height: 60px;background: #f8f8f8;line-height: 60px;font-weight: bold;}
+.mui-input-group .line-top:before{content: '';position: absolute;
+    right: 10px;
+    top: 0;
+    left: 10px;
+    height: 1px;
+    content: '';
+    -webkit-transform: scaleY(.5);
+    transform: scaleY(.5);
+    background-color: #c8c7cc;}
+.mui-input-group:before,.mui-input-group:after{left: 10px;right: 10px;}
+.my-table .mui-radio input[type=radio].icon-boy:before{    position: relative;
+    font-family: "iconfont" !important;
+    font-size: 28px !important;
+    font-style: normal;
+    -webkit-font-smoothing: antialiased;
+    padding: 0;content: '\e6d2';}
+.my-table .mui-radio input[type=radio].icon-girl:before{    position: relative;
+    font-family: "iconfont" !important;
+    font-size: 28px !important;
+    font-style: normal;
+    -webkit-font-smoothing: antialiased;
+    padding: 0;content: '\e6d3';}    
+.address-cantainner{margin:14px 14px 0 14px;background-color: #f3f3f3;text-align: center;}
+.address-cantainner .mui-table-view-cell{background-color: #f3f3f3;border-radius: 5px;padding: 11px 8px;}
+.address-cantainner .mui-table-view-cell.mui-active{background-color: #f3f3f3;}
+.address-cantainner .mui-table{max-height: 80px;min-height: 42px;}
+.address-cantainner .add-address{height: 20px;position: relative;width: 150px; margin: 0 auto;}
+.address-cantainner .icon-jia{position: absolute;left:0%;top: 0;font-size: 20px;}
+.address-cantainner p{font-size: 12px;}
+.btn-youhuiquan:after{right: 0;}
+.lbl-remarks{width: 20% !important;padding:12px 0 10px 0 !important;}
+.ipt-remarks{font-size: 12px;width: 80% !important;}
+.btn-youhuiquan .cl-red{margin-right: 10px;}
+.icon-dingwei{color: #f16071;}
+.btn-add-address{height: 20px;line-height: 20px; position: relative;width: 110px; margin: 0 auto;text-align: right;color: #666;}
+.btn-add-address .icon-jia{position: absolute;left:0%;top: 0;font-size: 20px;}
+.mui-btn-red{background-color: #f16071;}
+
+.dalog-vip-center>div{position: relative;}
+.dalog-vip-center img{display: block;}
+.dalog-vip-center .icon-guanbi{position: absolute;right: 12px;top: 12px;font-size: 20px;color: #f16071;}
+.dalog-vip-center button{background-color: #f16071;color: #fff;border: 0;border-radius: 0;padding: 8px 0;position: absolute;left: 50%;width: 100px;margin-left: -50px;bottom: 20px;}
+.jifen-box{padding: 10px 0;border-bottom: 1px solid rgba(0,0,0,.1);margin-bottom: 20px;}
+.order-menu-box{padding:0;background: #fff;margin-bottom: 8px;}
+.order-menu-box .my-badge-danger{position: absolute;top: -2px;right: 25%;}
+.user-leave{position: absolute;right: 0;bottom: 0;width: 20px;}
+.user-leave img{width: 100%;}
+h4{color: #333;font-weight: 500;}
+			
+			.mui-demo-container{
+				background-color: #fff;
+				padding: 10px 15px;
+			}
+			.mui-progressbar{
+				margin-bottom: 6px;
+				background-color: #e6e6e6;
+			}
+			.mui-btn-block{
+				padding: 5px 0;
+			}
+			
+			#demo5 .mui-progressbar{
+				margin: 15px 10px;
+			}
+			
+			.mui-progressbar-success span {
+				background-color: #4cd964;
+			}
+			.mui-progressbar-warning span {
+				background-color: #f0ad4e;
+			}
+			.mui-progressbar-danger span {
+				background-color: #dd524d;
+			}
+			.mui-progressbar-royal span {
+				background-color: #8a6de9;
+			}
+			.mui-progressbar span{
+				background-color: #f16071;
+			}
+						.content article,.content section,.content time,.content aside {
+				display: block;
+			}
+			.point-time {
+				content: "";
+				position: absolute;
+				width: 13px;
+				height: 13px;
+				top: 14px;
+				left: 10%;
+				background: #f16071;
+				margin-left: -4px;
+				border-radius: 50%;
+				box-shadow: 0 0 0 2px #fff;
+			}
+
+			.text-red {
+				color: #f6393f;
+			}
+
+			.text-blue {
+				color: #1c87bf;
+			}
+
+			.text-green {
+				color: #95c91e;
+			}
+
+			.text-yellow {
+				color: #ffb902;
+			}
+
+			.text-purple {
+				color: #d32d93;
+			}
+
+			.content {
+				width: 100%;
+				margin: 20px auto;
+			}
+			.content article {
+				position: relative;
+			}
+			.content article > h3 {
+				width: 100%;
+				height: 20px;
+				line-height: 20px;
+				text-align: left;
+				text-indent: 3%;
+				font-size: 1.4em;
+				color: #fff;
+				padding: 10px 0 20px;
+				background-color: #dd6d01;
+			}
+			.content article section {
+				padding: 0 0 17px;
+				position: relative;
+			}
+			.content article section:before {
+				content: "";
+				width: 5px;
+				top: 17px;
+				bottom: -17px;
+				left: 10%;
+				background: #e6e6e6;
+				position: absolute;
+			}
+			.content article section:last-child:before {
+				display: none;
+			}
+			.content article section time {
+				width: 25%;
+				display: block;
+				position: absolute;
+				left: 12%;
+				padding-top: 10px;
+			}
+			.content article section time > span {
+				display: block;
+				text-align: center;
+			}
+			.content article section aside {
+				color: #3a3a38;
+				margin-left: 40%;
+				padding-bottom: 15px;
+			}
+			.content article section .brief {
+				color: #333;
+			}
+			.content article section .things {
+				color: #333;
+			}
+			.scan-frame-box{margin:50px auto;width:240px;text-align: center;}
+			.scan-frame-box img{width: 180px;display: block;margin: 0 auto;}
+			.add-tooth-footer{position: fixed;width: 100%;left: 0;bottom: 50px;text-align: left;}
+			.add-tooth-content{padding:20px 0 10px 15%;}
+.my-pull-right{float: right;margin-right: 25px;}
+.mui-table-view-cell .my-order-btn{width: 40%;color: #666;margin: 0 0 0 10px;padding: 6px 0;}
+.my-table-view-order>li{position: relative;padding-bottom: 0;}
+.my-table-view-order .mui-col-xs-6{font-size: 15px !important;}
+.my-table-view-order>li:after{content: '';position: absolute;left: 14px;bottom: 0;right:14px;height: 1px;background-color: #ccc;-webkit-transform: scaleY(.5);}
+.mui-col-xs-8 div,.mui-col-xs-8 p,.mui-col-xs-8 h6{margin:0 0 5px 0;}
+.my-table-view{padding: 15px 0;}
+.my-table-view>li{margin: 10px 0;}
+.mui-table-view-cell.mui-active{background-color: #fff;}
+.share-dalog{background: rgba(0,0,0,.7);position: fixed;left: 0;top: 0;right: 0;bottom: 0;width: 100%;height: 100%;z-index: 99;display: none;}
+.share-dalog img{width: 100%;}
+.mui-table-view-cell>a:not(.mui-btn).mui-active{background-color: #fff;}
+.my-btn-request{width: 100px;color: #666;padding: 10px 15px;border-radius: 5px;}
+.user-head{width: 80px;margin: 0 auto;line-height: 0;font-size: 0;border: 2px solid #fff;position: relative;}
+.xiajia{position: absolute;width: 100%;height: 100%;left: 0;top: 0;background: rgba(255,255,255,.6);padding-top: 43px;padding-left: 60px;}
+.xiajia:before{content: '';background: rgba(0,0,0,.1);position: absolute;left: 25px;top: 0;width: 120px;height: 100px;opacity: .5;}
+.user-head img{width: 100%;display: block;border-radius: 50%;}
+.user-name{font-size: 16px;padding: 10px 0;}
+.my-center-no:after,.my-center-no:before{display: none;}
+.my-center-no .mui-table-view-cell{color: #666;padding: 15px;}
+.my-center-no .mui-table-view-cell:nth-of-type(5){padding-top: 25px;}
+.my-center-no .mui-table-view-cell .mui-icon{color: #666;}
+.my-center-no .mui-table-view-cell .iconfont{color: #333;margin-right: 10px;float: left;}
+.my-center-no .mui-table-view-cell:after{right: 14px;}
+.my-center-no .mui-table-view-cell:last-child:after{height: 1px;}
+.back_top {position: fixed;right: 15px; bottom: 20px;width: 45px;height: 45px;background: rgba(0,0,0,.2);border-radius: 50%;cursor: pointer;display: none;text-align: center;line-height: 50px;color: #666;}
+.card-input-group .mui-input-row{border: 1px solid #ccc;margin:  10px;border-radius: 5px;}
+.card-input-group .mui-input-row:after,.card-input-group:before,.card-input-group:after{display: none;}
+.card-input-group .mui-input-row input{font-size: 14px;}
+.card-input-group .mui-input-row label{width: 25%;}
+.card-input-group .mui-input-row label~input{width: 75%;}
+.card-input-group .btn-pull-code{background-color: #666;color: #fff;border: 0;float: right;margin:3px 3px 0 0;width: 100px;}
+.card-input-group input::-webkit-input-placeholder{color: #bbb;}
+.my-btn-submit{width: 100%;background-color: #666;color: #fff;border-radius: 0;border: 0;height: 50px;font-size: 18px;}
+.vip-user-box{position: relative;height: 180px;}
+.user-middle{position: absolute;left: 0; top: 50%;-webkit-transform: translateY(-50%);transform: translateY(-50%);width: 100%;text-align: center;}
+.progressbar-box{width: 200px;margin: 0 auto;text-align: center;}
+.vip-user-box .my-h6{font-size: 12px;color: #999;margin: 10px 0 0 0;}
+.shopping-cart-list .mui-table-view-cell.mui-active{background-color: #fff;}
+.shopping-cart-list .mui-table-view-cell.mui-active>.mui-slider-handle{background-color: #fff;}
+.mui-preview-image.mui-fullscreen {
+				position: fixed;
+				z-index: 20;
+				background-color: #000;
+			}
+			.mui-preview-header,
+			.mui-preview-footer {
+				position: absolute;
+				width: 100%;
+				left: 0;
+				z-index: 10;
+			}
+			.mui-preview-header {
+				height: 24px;
+				bottom: 0;
+			}
+			.mui-preview-footer {
+				height: 50px;
+				bottom: 0px;
+			}
+			.mui-preview-header .mui-preview-indicator {
+				display: block;
+				line-height: 25px;
+				color: #fff;
+				text-align: center;
+				margin: 15px auto 4;
+				width: 70px;
+				background-color: rgba(0, 0, 0, 0.4);
+				border-radius: 12px;
+				font-size: 12px;
+				margin: 0 auto;
+			}
+			.mui-preview-image {
+				display: none;
+				-webkit-animation-duration: 0.5s;
+				animation-duration: 0.5s;
+				-webkit-animation-fill-mode: both;
+				animation-fill-mode: both;
+			}
+			.mui-preview-image.mui-preview-in {
+				-webkit-animation-name: fadeIn;
+				animation-name: fadeIn;
+			}
+			.mui-preview-image.mui-preview-out {
+				background: none;
+				-webkit-animation-name: fadeOut;
+				animation-name: fadeOut;
+			}
+			.mui-preview-image.mui-preview-out .mui-preview-header,
+			.mui-preview-image.mui-preview-out .mui-preview-footer {
+				display: none;
+			}
+			.mui-zoom-scroller {
+				position: absolute;
+				display: -webkit-box;
+				display: -webkit-flex;
+				display: flex;
+				-webkit-box-align: center;
+				-webkit-align-items: center;
+				align-items: center;
+				-webkit-box-pack: center;
+				-webkit-justify-content: center;
+				justify-content: center;
+				left: 0;
+				right: 0;
+				bottom: 0;
+				top: 0;
+				width: 100%;
+				height: 100%;
+				margin: 0;
+				-webkit-backface-visibility: hidden;
+			}
+			.mui-zoom {
+				-webkit-transform-style: preserve-3d;
+				transform-style: preserve-3d;
+			}
+			.mui-slider .mui-slider-group .mui-slider-item img {
+				width: auto;
+				height: auto;
+				max-width: 100%;
+				max-height: 100%;
+			}
+			.mui-android-4-1 .mui-slider .mui-slider-group .mui-slider-item img {
+				width: 100%;
+			}
+			.mui-android-4-1 .mui-slider.mui-preview-image .mui-slider-group .mui-slider-item {
+				display: inline-table;
+			}
+			.mui-android-4-1 .mui-slider.mui-preview-image .mui-zoom-scroller img {
+				display: table-cell;
+				vertical-align: middle;
+			}
+			.mui-preview-loading {
+				position: absolute;
+				width: 100%;
+				height: 100%;
+				top: 0;
+				left: 0;
+				display: none;
+			}
+			.mui-preview-loading.mui-active {
+				display: block;
+			}
+			.mui-preview-loading .mui-spinner-white {
+				position: absolute;
+				top: 50%;
+				left: 50%;
+				margin-left: -25px;
+				margin-top: -25px;
+				height: 50px;
+				width: 50px;
+			}
+			.mui-preview-image img.mui-transitioning {
+				-webkit-transition: -webkit-transform 0.5s ease, opacity 0.5s ease;
+				transition: transform 0.5s ease, opacity 0.5s ease;
+			}
+			@-webkit-keyframes fadeIn {
+				0% {
+					opacity: 0;
+				}
+				100% {
+					opacity: 1;
+				}
+			}
+			@keyframes fadeIn {
+				0% {
+					opacity: 0;
+				}
+				100% {
+					opacity: 1;
+				}
+			}
+			@-webkit-keyframes fadeOut {
+				0% {
+					opacity: 1;
+				}
+				100% {
+					opacity: 0;
+				}
+			}
+			@keyframes fadeOut {
+				0% {
+					opacity: 1;
+				}
+				100% {
+					opacity: 0;
+				}
+			}
+			p img {
+				max-width: 100%;
+				height: auto;
+			}
+		.my-yhq-list{background-color: transparent;padding:0 15px;}
+		.my-yhq-list:before,.my-yhq-list:after{display: none;}
+		.my-yhq-list .my-yhq-cell{margin: 15px 0;position: relative;}
+		.my-yhq-list .my-yhq-cell:last-child{margin-bottom: 0;}
+		.my-yhq-list .fixed-box{position: absolute;left: 0;top: 0;width: 100%;height: 100%;}
+		.my-yhq-list .table{display: table;height: 100%;width: 100%;}
+		.my-yhq-list .left-cell{display: table-cell;width: 69%;height: 100%;padding:5%;}
+		.my-yhq-list .right-cell{display: table-cell;width: 31%;height: 100%;text-align: center;vertical-align: middle;}
+		.my-yhq-list .left-cell .tit{font-size: 18px;color: #333;}
+		.my-yhq-list .active .left-cell .tit{color: #999;}
+		.my-yhq-list .left-cell .time{color: #666;font-size: 12px;}
+		.my-yhq-list .active .left-cell .time{color: #999;}
+		.my-yhq-list .left-cell .condition{position: absolute;left: 5%;bottom: 18%;font-size: 12px;color: #666;}
+		.my-yhq-list .active .left-cell .condition{color: #999;}
+		.my-yhq-list .right-cell .money{color: #f16071;margin: 5px 0;}
+		.my-yhq-list .active .right-cell .money{color: #999;}
+		.my-yhq-list .right-cell .money>span{font-size: 35px;}
+		.my-yhq-list .right-cell .my-btn{color: #fff;padding:8px 10px;font-size: 14px;border-radius: 5px;}
+		.my-yhq-list .right-cell .my-btn:active{background-color: rgba(0,0,0,.5);}
+		.grayscale{color: #807f80 !important;}
+		.my-yhq-list .right-cell .my-btn.grayscale{opacity: 0;}
+
+		.tab-yhq-list{background: #fff;border: 0;position: fixed;left: 0;top: 0;width: 100%;z-index: 10;}
+		.tab-yhq-list .mui-control-item{position: relative;}
+		.tab-yhq-list .mui-control-item{color: #a1a1a1;}
+		.tab-yhq-list .mui-control-item.mui-active {color: #f44f80 !important;border-bottom: 2px solid #f44f80;}
+		.follow-me-box{background-color: #fff;height:220px;text-align: center;padding: 50px 0;}
+		.follow-me-cell{margin:-40px auto 0 auto;width:240px;text-align: center;}
+		.integral-log-nav{position: fixed;left: 0;top: 0;width: 100%;height: 44px;}
+		.logistics-massage-head{background-color: #fff;height:175px;text-align: center;padding:10px 0;border-bottom: 1px solid rgba(0,0,0,.1);}
+		.logistics-massage-cell{position: absolute;width: 100%;left: 0;top: 18px;text-align: center;}
+		.logistics-massage-cell h4,.logistics-massage-cell h6{margin: 10px 0;}

+ 136 - 0
css/mui.dtpicker.css

@@ -0,0 +1,136 @@
+.mui-dtpicker {
+	position: fixed;
+	left: 0px;
+	width: 100%;
+	z-index: 999999;
+	background-color: #eee;
+	border-top: solid 1px #ccc;
+	box-shadow: 0px -5px 7px 0px rgba(0, 0, 0, 0.1);
+	-webkit-transition: .3s;
+	bottom: 0px;
+	-webkit-transform: translateY(300px);
+}
+.mui-dtpicker.mui-active {
+	-webkit-transform: translateY(0px);
+}
+/*用于将 html body 禁止滚动条*/
+
+.mui-dtpicker-active-for-page {
+	overflow: hidden !important;
+}
+.mui-android-5-1 .mui-dtpicker {
+	bottom: -300px;
+	-webkit-transition-property: bottom;
+	-webkit-transform: none;
+}
+.mui-android-5-1 .mui-dtpicker.mui-active {
+	bottom: 0px;
+	-webkit-transition-property: bottom;
+	-webkit-transform: none;
+}
+.mui-dtpicker-header {
+	padding: 6px;
+	font-size: 14px;
+	color: #888;
+}
+.mui-dtpicker-header button {
+	font-size: 12px;
+	padding: 5px 10px;
+}
+.mui-dtpicker-header button:last-child {
+	float: right;
+}
+.mui-dtpicker-body {
+	position: relative;
+	width: 100%;
+	height: 200px;
+	/*border-top: solid 1px #eee;
+	background-color: #fff;*/
+}
+.mui-ios .mui-dtpicker-body {
+	-webkit-perspective: 1200px;
+	perspective: 1200px;
+	-webkit-transform-style: preserve-3d;
+	transform-style: preserve-3d;
+}
+.mui-dtpicker-title h5 {
+	display: inline-block;
+	width: 20%;
+	margin: 0px;
+	padding: 8px;
+	text-align: center;
+	border-top: solid 1px #ddd;
+	background-color: #f0f0f0;
+	border-bottom: solid 1px #ccc;
+}
+.mui-dtpicker .mui-picker {
+	width: 20%;
+	height: 100%;
+	margin: 0px;
+	float: left;
+	border: none;
+}
+/*年月日时分*/
+
+[data-type="datetime"] .mui-picker,
+[data-type="time"] .mui-dtpicker-title h5 {
+	width: 20%;
+}
+[data-type="datetime"] [data-id="picker-h"],
+[data-type="datetime"] [data-id="title-h"] {
+	border-left: dotted 1px #ccc;
+}
+/*年月日*/
+
+[data-type="date"] .mui-picker,
+[data-type="date"] .mui-dtpicker-title h5 {
+	width: 33.3%;
+}
+[data-type="date"] [data-id="picker-h"],
+[data-type="date"] [data-id="picker-i"],
+[data-type="date"] [data-id="title-h"],
+[data-type="date"] [data-id="title-i"] {
+	display: none;
+}
+/*年月日时*/
+
+[data-type="hour"] .mui-picker,
+[data-type="hour"] .mui-dtpicker-title h5 {
+	width: 25%;
+}
+[data-type="hour"] [data-id="picker-i"],
+[data-type="hour"] [data-id="title-i"] {
+	display: none;
+}
+[data-type="hour"] [data-id="picker-h"],
+[data-type="hour"] [data-id="title-h"] {
+	border-left: dotted 1px #ccc;
+}
+/*时分*/
+
+[data-type="time"] .mui-picker,
+[data-type="time"] .mui-dtpicker-title h5 {
+	width: 50%;
+}
+[data-type="time"] [data-id="picker-y"],
+[data-type="time"] [data-id="picker-m"],
+[data-type="time"] [data-id="picker-d"],
+[data-type="time"] [data-id="title-y"],
+[data-type="time"] [data-id="title-m"],
+[data-type="time"] [data-id="title-d"] {
+	display: none;
+}
+/*年月*/
+
+[data-type="month"] .mui-picker,
+[data-type="month"] .mui-dtpicker-title h5 {
+	width: 50%;
+}
+[data-type="month"] [data-id="picker-d"],
+[data-type="month"] [data-id="picker-h"],
+[data-type="month"] [data-id="picker-i"],
+[data-type="month"] [data-id="title-d"],
+[data-type="month"] [data-id="title-h"],
+[data-type="month"] [data-id="title-i"] {
+	display: none;
+}

+ 123 - 0
css/mui.imageviewer.css

@@ -0,0 +1,123 @@
+.mui-imageviewer {
+	position: absolute;
+	position: fixed;
+	background-color: rgba(0, 0, 0, 0.9);
+	width: 100%;
+	height: 100%;
+	z-index: 99;
+	left: 0px;
+	top: 0px;
+	display: none;
+	opacity: 0;
+	-webkit-transition: all 0.6s ease-in-out;
+	transition: all 0.6s ease-in-out;
+	-webkit-transform-style: preserve-3d;
+	-webkit-backface-visibility: hidden;
+	overflow: hidden;
+	margin: 0px;
+	padding: 0px;
+	box-sizing: border-box;
+}
+.mui-imageviewer-mask {
+	position: absolute;
+	z-index: 11;
+	width: 100%;
+	height: 100%;
+	left: 0px;
+	top: 0px;
+	display: none;
+}
+.mui-imageviewer .mui-imageviewer-header {
+	position: absolute;
+	height: 45px;
+	width: 100%;
+	left: 0px;
+	top: 0px;
+	z-index: 10;
+	background-color: rgba(0, 0, 0, 0.5);
+	margin: 0px;
+	padding: 0px;
+	box-sizing: border-box;
+}
+.mui-imageviewer .mui-imageviewer-state {
+	display: block;
+	width: 100%;
+	height: 100%;
+	line-height: 100%;
+	color: #eee;
+	text-align: center;
+	font-size: 16px;
+	padding: 15px;
+}
+.mui-imageviewer .mui-imageviewer-header .mui-imageviewer-close {
+	position: absolute;
+	top: 5px;
+	right: 5px;
+	font-size: 32px;
+	color: #aaa;
+}
+.mui-imageviewer .mui-imageviewer-header .mui-imageviewer-close:active {
+	color: #FF5053;
+}
+.mui-imageviewer .mui-imageviewer-item {
+	width: 100%;
+	height: 100%;
+	left: 0px;
+	top: 0px;
+	position: absolute;
+	z-index: 0;
+	margin: 0px;
+	padding: 0px;
+	box-sizing: border-box;
+	-webkit-transition: -webkit-transform 500ms ease-in-out;
+	transition: transform 500ms ease-in-out;
+	display: table;
+	overflow: hidden;
+}
+.mui-imageviewer .mui-imageviewer-item-center {
+	-webkit-transform: translateX(0);
+	transform: translateX(0);
+}
+.mui-imageviewer .mui-imageviewer-item-left {
+	-webkit-transform: translateX(-100%);
+	transform: translateX(-100%);
+}
+.mui-imageviewer .mui-imageviewer-item-right {
+	-webkit-transform: translateX(100%);
+	transform: translateX(100%);
+}
+.mui-imageviewer .mui-imageviewer-item span {
+	display: table-cell;
+	text-align: center;
+	vertical-align: middle;
+	line-height: 100%;
+	font-size: 100%;
+	margin: 0px;
+	padding: 0px;
+	box-sizing: border-box;
+	overflow: auto;
+}
+.mui-imageviewer .mui-imageviewer-item img {
+	backface-visibility: hidden;
+	transform-origin: 50% 50% 0px;
+	max-width: 100%;
+}
+.mui-imageviewer-left,
+.mui-imageviewer-right {
+	position: absolute;
+	z-index: 2;
+	color: #aaa;
+	top: 50%;
+	margin-top: -18px;
+	font-size: 36px;
+}
+.mui-imageviewer-left {
+	left: 5px;
+}
+.mui-imageviewer-right {
+	right: 5px;
+}
+.mui-imageviewer-left:active,
+.mui-imageviewer-right:active {
+	color: #fff;
+}

File diff suppressed because it is too large
+ 5 - 0
css/mui.min.css


+ 85 - 0
css/mui.picker.css

@@ -0,0 +1,85 @@
+/**
+ * 选择列表插件
+ * varstion 2.0.0
+ * by Houfeng
+ * Houfeng@DCloud.io
+ */
+
+.mui-picker {
+    background-color: #ddd;
+    position: relative;
+    height: 200px;
+    overflow: hidden;
+    border: solid 1px rgba(0, 0, 0, 0.1);
+    -webkit-user-select: none;
+    user-select: none;
+    box-sizing: border-box;
+}
+.mui-picker-inner {
+    box-sizing: border-box;
+    position: relative;
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+    -webkit-mask-box-image: -webkit-linear-gradient(bottom, transparent, transparent 5%, #fff 20%, #fff 80%, transparent 95%, transparent);
+    -webkit-mask-box-image: linear-gradient(top, transparent, transparent 5%, #fff 20%, #fff 80%, transparent 95%, transparent);
+}
+.mui-pciker-list,
+.mui-pciker-rule {
+    box-sizing: border-box;
+    padding: 0px;
+    margin: 0px;
+    width: 100%;
+    height: 36px;
+    line-height: 36px;
+    position: absolute;
+    left: 0px;
+    top: 50%;
+    margin-top: -18px;
+}
+.mui-pciker-rule-bg {
+    z-index: 0;
+    /*background-color: #cfd5da;*/
+}
+.mui-pciker-rule-ft {
+    z-index: 2;
+    border-top: solid 1px rgba(0, 0, 0, 0.1);
+    border-bottom: solid 1px rgba(0, 0, 0, 0.1);
+    /*-webkit-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);*/
+    /*box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);*/
+}
+.mui-pciker-list {
+    z-index: 1;
+    -webkit-transform-style: preserve-3d;
+    transform-style: preserve-3d;
+    -webkit-transform: perspective(1000px) rotateY(0deg) rotateX(0deg);
+    transform: perspective(1000px) rotateY(0deg) rotateX(0deg);
+}
+.mui-pciker-list li {
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    text-align: center;
+    vertical-align: middle;
+    -webkit-backface-visibility: hidden;
+    backface-visibility: hidden;
+    overflow: hidden;
+    box-sizing: border-box;
+    font-size: 16px;
+    font-family: "Helvetica Neue", "Helvetica", "Arial", "sans-serif";
+    color: #888;
+    padding: 0px 8px;
+    white-space: nowrap;
+    -webkit-text-overflow: ellipsis;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    cursor: default;
+    visibility: hidden;
+}
+.mui-pciker-list li.highlight,
+.mui-pciker-list li.visible {
+    visibility: visible;
+}
+.mui-pciker-list li.highlight {
+    color: #222;
+}

File diff suppressed because it is too large
+ 7 - 0
css/mui.picker.min.css


+ 64 - 0
css/mui.poppicker.css

@@ -0,0 +1,64 @@
+.mui-poppicker {
+	position: fixed;
+	left: 0px;
+	width: 100%;
+	z-index: 999;
+	background-color: #eee;
+	border-top: solid 1px #ccc;
+	box-shadow: 0px -5px 7px 0px rgba(0, 0, 0, 0.1);
+	-webkit-transition: .3s;
+	bottom: 0px;
+	-webkit-transform: translateY(300px);
+}
+.mui-poppicker.mui-active {
+	-webkit-transform: translateY(0px);
+}
+.mui-android-5-1 .mui-poppicker {
+	bottom: -300px;
+	-webkit-transition-property: bottom;
+	-webkit-transform: none;
+}
+.mui-android-5-1 .mui-poppicker.mui-active {
+	bottom: 0px;
+	-webkit-transition-property: bottom;
+	-webkit-transform: none;
+}
+.mui-poppicker-header {
+	padding: 6px;
+	font-size: 14px;
+	color: #888;
+}
+.mui-poppicker-header .mui-btn {
+	font-size: 12px;
+	padding: 5px 10px;
+}
+.mui-poppicker-btn-cancel {
+	float: left;
+}
+.mui-poppicker-btn-ok {
+	float: right;
+}
+.mui-poppicker-clear {
+	clear: both;
+	height: 0px;
+	line-height: 0px;
+	font-size: 0px;
+	overflow: hidden;
+}
+.mui-poppicker-body {
+	position: relative;
+	width: 100%;
+	height: 200px;
+	border-top: solid 1px #ddd;
+	/*-webkit-perspective: 1200px;
+	perspective: 1200px;
+	-webkit-transform-style: preserve-3d;
+	transform-style: preserve-3d;*/
+}
+.mui-poppicker-body .mui-picker {
+	width: 100%;
+	height: 100%;
+	margin: 0px;
+	border: none;
+	float: left;
+}

+ 8 - 0
css/rp.txt

@@ -0,0 +1,8 @@
+接口域名
+w.iamberry.com
+修改本地计算机hosts
+127.0.0.1       h5.iamberry.com
+浏览器访问地址
+http://h5.iamberry.com/soodo-wechat/index.html
+接口文档
+https://static.iamberry.com/api/tooth/#api-getproduct-PostWechatIndexdata

File diff suppressed because it is too large
+ 12 - 0
css/swiper.min.css


+ 102 - 0
customer-service.html

@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html>
+
+	<head>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
+		<meta name="apple-mobile-web-app-capable" content="yes">
+		<meta name="apple-mobile-web-app-status-bar-style" content="black">
+		<title>申请售后</title>
+		<link rel="stylesheet" type="text/css" href="css/mui.min.css" />
+		<link rel="stylesheet" type="text/css" href="css/iconfont.css" />
+		<link rel="stylesheet" type="text/css" href="css/main.css" />
+	</head>
+
+	<body>
+		<div class="mui-content">
+			<div class="clearing-box">
+				<ul class="mui-table-view mui-table-view-striped my-grid-view-no mui-table-view-condensed shopping-cart-list">
+
+				</ul>
+				<br />
+				<ul class="mui-table-view cusomer-ul">
+					<li class="mui-table-view-cell mui-media" id="retreat">
+						<a class="mui-navigate-right order_process"  newStatus="2"><div class="mui-media-body">仅退款<p class="mui-ellipsis">还未收到货,并与客服协商同意后</p></div></a>
+					</li>
+					<li class="mui-table-view-cell mui-media" id="returnOfGoods">
+						<a class="mui-navigate-right order_process" newStatus="4"><div class="mui-media-body">退货退款<p class="mui-ellipsis">已收到货,需联系客服寄回已收货物</p></div></a>
+					</li>
+					<li class="mui-table-view-cell mui-media" id="exchangeGood">
+						<a class="mui-navigate-right order_process" newStatus="7"><div class="mui-media-body">申请换货<p class="mui-ellipsis">已收到货,需联系客服获得寄换地址</p></div></a>
+					</li>
+				</ul>
+			</div>
+		</div>
+		<!-- 加载ing begin-->
+		<div class="loading covers">
+			<div class="loading-bj"></div>
+			<p>正在加载...</p>
+		</div>
+		<!-- 加载ing end -->
+		<script src="js/mui.min.js"></script>
+		<script src="js/jquery-2.1.1.min.js"></script>
+		<script src="js/main.js"></script>
+		<script>
+			var orderId = getParam("orderId");//从URL带过来的订单id
+			var status = 0;
+			//dom加载完毕
+			mui.ready(function() {
+				$.ajax(base_path + '/wechat/cart/getShopOrderByOrderId?dates=' + new Date().getTime(), {
+					data: {
+						"orderId": orderId
+					},
+					dataType: 'json',
+					xhrFields: {
+						withCredentials: true
+					},
+					crossDomain: true,
+					type: 'get',
+					timeout: 15000,
+					success: function(dt) {
+						if(dt.isRedirect) {
+							location.href = dt.redirectURL;
+						} else {
+							console.log(dt);
+							var order = dt.data
+							status = order.salesStatus; //赋值状态
+							if(status == 2){
+								$("#retreat").show();
+								$("#returnOfGoods").hide();
+								$("#exchangeGood").hide();
+							}else if(status == 5){
+								$("#retreat").hide();
+								$("#returnOfGoods").show();
+								$("#exchangeGood").show();
+							}
+							var str = "";
+							mui.each(order.orderItemList, function(index) {
+								str += '<div class="mui-table"><div class="mui-table-cell mui-col-xs-5"><img class="mui-media-object wh-100" src="'+ this.itemProductPic +'"></div><div class="mui-table-cell table-middle mui-col-xs-7" style="line-height:2.5">'+ this.itemProductName +'<h6>颜色:'+ this.productColor +'<span class="center">数量:'+ this.itemNum +'</span></h6><div>¥'+ (this.itemProductDiscount / 100).toFixed(2) +'</div></div></div>';
+							});
+							document.querySelector('.shopping-cart-list').innerHTML = str;
+							
+							$(".loading").hide().css("opacity", "0"); //隐藏(正在加载...)
+						}
+					},
+					error: function(xhr, type, errorThrown) {
+						console.log(xhr);
+						mui.alert("获取订单列表失败!网络错误");
+					}
+				});
+				
+				$(".loading").hide().css("opacity", "0"); //隐藏(正在加载...)
+			});
+			
+			/*申请退款*/
+			$(document).on('tap', '.order_process', function() {
+				var newStatus =  $(this).attr("newStatus");
+				location.href = "exchange-goods.html?orderId=" + orderId + "&newStatus=" + newStatus;
+			})
+		</script>
+	</body>
+
+</html>

+ 181 - 0
exchange-goods.html

@@ -0,0 +1,181 @@
+<!DOCTYPE html>
+<html>
+
+	<head>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
+		<meta name="apple-mobile-web-app-capable" content="yes">
+		<meta name="apple-mobile-web-app-status-bar-style" content="black">
+		<title>我要售后</title>
+		<link rel="stylesheet" type="text/css" href="css/mui.min.css" />
+		<link rel="stylesheet" type="text/css" href="css/iconfont.css" />
+		<link rel="stylesheet" type="text/css" href="css/main.css" />
+	</head>
+
+	<body>
+		<div class="mui-content">
+			<div class="clearing-box">
+				<!--换货列表-->
+				<ul class="mui-table-view mui-table-view-striped my-grid-view-no mui-table-view-condensed shopping-cart-list">
+					
+				</ul>
+				<br/>
+				<ul class="mui-table-view cusomer-ul">
+					<li>
+						<div class="mui-input-row">
+						<label class="lbl-remarks"><span id="nameMsg"></span></label>
+						<input class="ipt-remarks" type="text" placeholder="" id="remark">
+					</div>
+					</li>
+				</ul>
+				</div>
+			<div class="address-cantainner" id="addressInfo">
+				<ul class="mui-table-view mui-table-view-striped my-grid-view-no mui-table-view-condensed">
+					<li class="mui-table-view-cell">
+						<div class="mui-table">							
+							<!--微信地址-->
+							<div class="mui-table-cell mui-col-xs-1 mui-text-left table-middle">
+								<p><span class="iconfont icon-dingwei"></span></p>
+							</div>
+							<div class="mui-table-cell mui-col-xs-10 mui-text-left table-middle">
+								<div>收货人:杨春有 <span class="mui-pull-right">13592708169</span></div>
+								<p>收货地址:东莞清溪三中金龙工业区徐福记对面优尼雅 电子科技</p>
+							</div>
+						</div>
+					</li>
+				</ul>
+			</div>
+			<div class="clearing-box">
+				<br />
+				<p id="msg"></p>
+				<br />
+				<div class="mui-content-padded mui-text-center">
+					<button type="button" class="my-btn-black" id="orderUpdateStatus">提交</button>
+				</div>
+			</div>
+		</div>
+		<!-- 加载ing begin-->
+		<div class="loading covers">
+			<div class="loading-bj"></div>
+			<p>正在加载...</p>
+		</div>
+		<!-- 加载ing end -->
+		<script src="js/mui.min.js"></script>
+		<script src="js/jquery-2.1.1.min.js"></script>
+		<script src="js/main.js"></script>
+		<script>
+			var orderId = getParam("orderId");//从URL带过来的订单id
+			var newStatus = getParam("newStatus"); //2:退款   4:退货       7:换货
+			var status = 0;
+			//dom加载完毕
+			mui.ready(function() {
+				
+				var nameMsg = "";
+				if(newStatus == 2){
+					$("#nameMsg").html("退款原因");
+					$("#remark").attr("placeholder","请填写您的退款原因");
+				}else if(newStatus == 4){
+					$("#nameMsg").html("退货原因");
+					$("#remark").attr("placeholder","请填写您的退货原因");
+				}else if(newStatus == 7){
+					$("#nameMsg").html("换货原因");
+					$("#remark").attr("placeholder","请填写您的换货原因");
+				}
+				
+				$.ajax(base_path + '/wechat/cart/getShopOrderByOrderId?dates=' + new Date().getTime(), {
+					data: {
+						"orderId": orderId
+					},
+					dataType: 'json',
+					xhrFields: {
+						withCredentials: true
+					},
+					crossDomain: true,
+					type: 'get',
+					timeout: 15000,
+					success: function(dt) {
+						if(dt.isRedirect) {
+							location.href = dt.redirectURL;
+						} else {
+							console.log(dt);
+							var order = dt.data
+							status = order.salesStatus; //赋值状态
+							if(status == 2){
+								$("#addressInfo").hide();
+								$("#msg").html("提示:提交审核成功后,将在3个工作日内退款将退回原支付账户");
+							}else if(status == 5){
+								$("#addressInfo").show();
+								$("#msg").html("提示:提交成功后,需联系客服并寄回产品,并且将寄回单号和 寄件人信息、需要更换的机器信息一起提供给客服" );
+							}
+							var str = "";
+							mui.each(order.orderItemList, function(index) {
+								str += '<div class="mui-table"><div class="mui-table-cell mui-col-xs-5"><img class="mui-media-object wh-100" src="'+ this.itemProductPic +'"></div><div class="mui-table-cell table-middle mui-col-xs-7" style="line-height:2.5">'+ this.itemProductName +'<h6>颜色:'+ this.productColor +'<span class="center">数量:'+ this.itemNum +'</span></h6><div>¥'+ (this.itemProductDiscount / 100).toFixed(2) +'</div></div></div>';
+							});
+							document.querySelector('.shopping-cart-list').innerHTML = str;
+							
+							$(".loading").hide().css("opacity", "0"); //隐藏(正在加载...)
+						}
+					},
+					error: function(xhr, type, errorThrown) {
+						console.log(xhr);
+						mui.alert("获取订单列表失败!网络错误");
+					}
+				});
+				
+				$(".loading").hide().css("opacity", "0"); //隐藏(正在加载...)
+			});
+			
+			
+			/*提交*/
+			$(document).on('tap', '#orderUpdateStatus', function() {
+				var remark = $("#remark").val();
+				if(remark !=null && remark != "" && typeof(remark)!="undefined"){
+					//if(remark){
+					//}
+					updateOrderStatus(orderId,newStatus,remark);
+				}else{
+					var info = "";
+					if(newStatus == 2){
+						info = "请填写您的退款原因";
+					}else if(newStatus == 4){
+						info = "请填写您的退货原因";
+					}else if(newStatus == 7){
+						info = "请填写您的换货原因";
+					}
+					mui.alert(info);
+				}
+			})
+			/*修改状态*/
+			function updateOrderStatus(orderId, status, remark) {
+				var msg = "";
+			 	$.ajax(base_path + '/wechat/cart/updateOrderStatus?dates=' + new Date().getTime(), {
+					data: {
+						"status": status, //更改后的状态
+						"orderId": orderId, //订单id
+						"remark": remark
+					},
+					dataType: 'json',
+					xhrFields: {
+						withCredentials: true
+					},
+					crossDomain: true,
+					type: 'get',
+					timeout: 15000,
+					success: function(dt) {
+						if(dt.resultCode == 200) {
+							console.log(dt);
+							location.href = "order-details.html?orderId="+orderId;
+						} else{
+							mui.alert(dt.message);
+						}
+					},
+					error: function(xhr, type, errorThrown) {
+						console.log(xhr);
+						mui.alert("提交失败!网络错误");
+					}
+				});
+			}
+		</script>
+	</body>
+
+</html>

+ 48 - 0
follow-me.html

@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+
+	<head>
+		<meta charset="UTF-8">
+		<title>关注soodo上朵</title>
+		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
+		<meta name="apple-mobile-web-app-capable" content="yes">
+		<meta name="apple-mobile-web-app-status-bar-style" content="black">
+		<link rel="stylesheet" type="text/css" href="css/mui.min.css" />
+		<link rel="stylesheet" type="text/css" href="css/iconfont.css" />
+		<link rel="stylesheet" type="text/css" href="css/main.css" />
+		<script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
+		<script>
+			//屏蔽分享
+						document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
+							WeixinJSBridge.call('hideOptionMenu');
+						});
+		</script>
+	</head>
+
+	<body>
+		<div class="mui-content">
+			<div class="follow-me-box">
+				<h3 class="cl-red"> 500积分已入账</h3>
+				<br />
+				<div>
+					关注soodo上朵即可使用<br />立即享受2年续保服务
+				</div>
+			</div>
+			<div class="follow-me-cell">
+				<img width="200px" src="images/erweima-soodo.png" />
+				<p>
+					长按识别,关注soodo公众号
+				</p>
+			</div>
+		</div>
+		<script type="text/javascript" src="js/mui.min.js"></script>
+		<script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
+		<script type="text/javascript" src="js/main.js"></script>
+		<script type="text/javascript">
+			mui.ready(function() {
+				console.log("页面加载完毕");
+			});
+		</script>
+	</body>
+
+</html>

BIN
fonts/iconfont.ttf


BIN
fonts/mui-icons-extra.ttf


BIN
fonts/mui.ttf


BIN
images/banner-1.jpg


BIN
images/banner-2.jpg


BIN
images/banner-3.jpg


BIN
images/card-bai.png


BIN
images/card-fen.png


BIN
images/card-hei.png


BIN
images/card-huang.png


BIN
images/card-lan.png


BIN
images/cart-null.png


BIN
images/detais-1.jpg


BIN
images/detais-2.jpg


BIN
images/detais-3.jpg


BIN
images/detais-4.jpg


BIN
images/detais-5.jpg


BIN
images/erweima-soodo.png


BIN
images/icon-vip-1.png


BIN
images/icon-vip-2.png


BIN
images/icon-vip-3.png


BIN
images/index-1.jpg


BIN
images/index-2.jpg


BIN
images/index-content.jpg


BIN
images/index-tit-1.jpg


BIN
images/index-tit-2.jpg


BIN
images/index-tit-3.jpg


BIN
images/index-tit-4.jpg


BIN
images/indexShare.jpg


BIN
images/loading.png


BIN
images/logo.png


BIN
images/next.png


BIN
images/pay-win-bg-1.png


BIN
images/pay-win-bg.png


BIN
images/prev.png


BIN
images/pro-bai.png


BIN
images/pro-fen.png


BIN
images/pro-hei.png


BIN
images/pro-huang.png


BIN
images/pro-lan.png


BIN
images/radio-1.png


BIN
images/radio-2.png


BIN
images/scan-frame.png


BIN
images/select-1.png


BIN
images/select-2.png


BIN
images/share.png


BIN
images/shuatou-1.jpg


BIN
images/shuatou-1.png


BIN
images/shuatou-2.jpg


BIN
images/shuatou-2.png


BIN
images/to-press.png


BIN
images/to-vip.png


BIN
images/tx-1.png


BIN
images/yashua-bai.png


BIN
images/yashua-fen.png


BIN
images/yashua-hei.png


BIN
images/yashua-huang.png


BIN
images/yashua-lan.png


BIN
images/yhq-1.png


BIN
images/yhq-2.png


BIN
images/youhuiquan-details.jpg


BIN
images/youhuiquan.jpg


+ 231 - 0
index.html

@@ -0,0 +1,231 @@
+<!DOCTYPE html>
+<html>
+
+	<head>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
+		<meta name="apple-mobile-web-app-capable" content="yes">
+		<meta name="apple-mobile-web-app-status-bar-style" content="black">
+		<title>soodo上朵</title>
+		<link rel="stylesheet" type="text/css" href="css/mui.min.css" />
+		<link rel="stylesheet" type="text/css" href="css/swiper.min.css" />
+		<link rel="stylesheet" type="text/css" href="css/iconfont.css" />
+		<link rel="stylesheet" type="text/css" href="css/main.css" />
+	</head>
+
+	<body>
+		<!--底部菜单开始-->
+		<footer class="mui-bar mui-bar-tab" id="footer-bar-tab">
+			<a class="mui-tab-item mui-active">
+				<span class="iconfont icon-shouye"></span>
+				<span class="mui-tab-label">首页</span>
+			</a>
+			<a class="mui-tab-item">
+				<span class="iconfont icon-liebiao"></span>
+				<span class="mui-tab-label">列表</span>
+			</a>
+			<a class="mui-tab-item">
+				<span class="iconfont icon-gouwuche"></span>
+				<span class="mui-tab-label">购物车</span>
+			</a>
+			<a class="mui-tab-item">
+				<span class="iconfont icon-huiyuan"></span>
+				<span class="mui-tab-label">会员</span>
+			</a>
+		</footer>
+		<!--底部菜单结束-->
+		
+		<!--内容开始-->
+		<div class="mui-content">
+			<header class="header">
+				<!--头部选项卡-->
+				<div id="index-top-menu" class="mui-segmented-control">
+					<!--(默认选中哪个就加上mui-active),其他不加-->
+					<a class="mui-control-item mui-active" href="#item1">首页</a>
+					<a class="mui-control-item" href="#item2">声波牙刷</a>
+					<a class="mui-control-item" href="#item3">刷头</a>
+				</div>
+			</header>
+			<!--选项卡item1显示区域(默认选中哪个就加上mui-active),其他不加-->
+			<div id="item1" class="mui-control-content mui-active">
+				<div class="banner-box">
+					<!--banner开始-->
+					<div id="slider" class="mui-slider">
+						<div class="mui-slider-group mui-slider-loop">
+							<!-- 额外增加的一个节点(循环轮播:第一个节点是最后一张轮播) -->
+							<div class="mui-slider-item mui-slider-item-duplicate">
+								<a>
+									<img src="images/banner-3.jpg">
+								</a>
+							</div>
+							<!-- 第一张 -->
+							<div class="mui-slider-item">
+								<a>
+									<img src="images/banner-1.jpg">
+								</a>
+							</div>
+							<!-- 第二张 -->
+							<div class="mui-slider-item">
+								<a>
+									<img src="images/banner-2.jpg">
+								</a>
+							</div>
+							<!-- 第三张 -->
+							<div class="mui-slider-item">
+								<a>
+									<img src="images/banner-3.jpg">
+								</a>
+							</div>
+							<!-- 额外增加的一个节点(循环轮播:最后一个节点是第一张轮播) -->
+							<div class="mui-slider-item mui-slider-item-duplicate">
+								<a>
+									<img src="images/banner-1.jpg">
+								</a>
+							</div>
+						</div>
+						<!--轮播图下面的点(和轮播图数量一致)-->
+						<div class="mui-slider-indicator my-slider-indicator">
+							<div class="mui-indicator mui-active"></div>
+							<div class="mui-indicator"></div>
+							<div class="mui-indicator"></div>
+						</div>
+					</div>
+					<!--banner结束-->
+					<div class="index-banner" style="display: none;"></div>
+				</div>
+				<div>
+					<img width="100%" src="images/index-tit-1.jpg" />
+				</div>
+				<div>
+					<img width="100%" src="images/index-1.jpg" />
+				</div>
+				<div style="padding-top: 30px;">
+					<!-- Swiper begin-->
+					<div class="swiper-container">
+						<div class="swiper-wrapper">
+							<div class="swiper-slide"><img src="images/yashua-fen.png">
+								<div class="mui-text-center">樱花粉</div>
+							</div>
+							<div class="swiper-slide"><img src="images/yashua-huang.png">
+								<div class="mui-text-center">奶油黄</div>
+							</div>
+							<div class="swiper-slide"><img src="images/yashua-lan.png">
+								<div class="mui-text-center">冰川蓝</div>
+							</div>
+							<div class="swiper-slide"><img src="images/yashua-hei.png">
+								<div class="mui-text-center">晶石黑</div>
+							</div>
+							<div class="swiper-slide"><img src="images/yashua-bai.png">
+								<div class="mui-text-center">极光白</div>
+							</div>
+						</div>
+						<!-- Add Arrows -->
+						<div class="swiper-button-next swiper-button-black"></div>
+						<div class="swiper-button-prev swiper-button-black"></div>
+					</div>
+					<!-- Swiper end-->
+				</div>
+
+				<div>
+					<img width="100%" src="images/index-tit-2.jpg" />
+				</div>
+				<div>
+					<img width="100%" src="images/index-2.jpg" />
+				</div>
+				<div>
+					<br />
+					<ul class="mui-table-view mui-grid-view my-grid-view-no">
+						<li class="mui-table-view-cell mui-media mui-col-xs-6">
+							<a href="#">
+								<img class="mui-media-object" src="images/shuatou-1.png">
+								<div class="mui-media-body">柔羽呵护刷头</div>
+							</a>
+						</li>
+						<li class="mui-table-view-cell mui-media mui-col-xs-6">
+							<a href="#">
+								<img class="mui-media-object" src="images/shuatou-1.png">
+								<div class="mui-media-body">杜邦超软刷头</div>
+							</a>
+						</li>
+					</ul>
+				</div>
+				<div>
+					<img width="100%" src="images/index-content.jpg" />
+				</div>
+			</div>
+			<!--选项卡item2显示区域-->
+			<div id="item2" class="mui-control-content">
+				<div>
+					<img width="100%" src="images/banner-2.jpg" />
+				</div>
+				<div>
+					<img width="100%" src="images/index-tit-3.jpg" />
+				</div>
+				<div>
+					<img width="100%" src="images/index-1.jpg" />
+				</div>
+				<div class="mui-text-center mui-content-padded">
+					<span style="color: #f16071;">¥199.00</span>
+				</div>
+			</div>
+			<!--选项卡item3显示区域-->
+			<div id="item3" class="mui-control-content">
+				<div>
+					<img width="100%" src="images/banner-3.jpg" />
+				</div>
+				<div>
+					<img width="100%" src="images/index-tit-4.jpg" />
+				</div>
+				<div>
+					<img width="100%" src="images/index-2.jpg" />
+				</div>
+				<div class="mui-text-center mui-content-padded">
+					<span style="color: #f16071;">¥199.00</span>
+				</div>
+			</div>
+		</div>
+		<!--内容结束-->
+		<!-- 加载ing begin-->
+		<div class="loading covers">
+			<div class="loading-bj"></div>
+			<p>正在加载...</p>
+		</div>
+		<!-- 加载ing end -->
+		<script src="js/mui.min.js"></script>
+		<script src="js/jquery-2.1.1.min.js"></script>
+		<script src="js/swiper.min.js"></script>
+		<script src="js/main.js"></script>
+		<script src="js/wechat-utils-1.0.js"></script>
+		<script>
+			window.addEventListener('pageshow', function(e) {
+				// 通过persisted属性判断是否存在 BF Cache
+				if(e.persisted) {
+					location.reload();
+				}
+			});
+			//ready事件
+			mui.ready(function() {
+				//banner轮播图
+				var slider = mui("#slider");
+				slider.slider({
+					interval: 5000 //interval设置为0(毫秒)时不轮播
+				});
+				//牙刷图swiper左右切换
+				var swiper = new Swiper('.swiper-container', {
+					slidesPerView: 3,//每行可视数量
+					slidesPerGroup: 3,//每组展示数量
+					slidesPerColumn: 1,//展示几列
+					loop: true,//循环
+					slidesPerColumnFill: 'row',//排序方式
+					navigation: {
+						nextEl: '.swiper-button-next',//后箭头
+						prevEl: '.swiper-button-prev',//前箭头
+					},
+					spaceBetween: 0//每个图片的左右间距
+				});
+				$(".loading").hide().css("opacity", "0");//隐藏(正在加载...)
+			});
+		</script>
+	</body>
+
+</html>

+ 474 - 0
integral-log.html

@@ -0,0 +1,474 @@
+<!DOCTYPE html>
+<html>
+
+	<head>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
+		<meta name="apple-mobile-web-app-capable" content="yes">
+		<meta name="apple-mobile-web-app-status-bar-style" content="black">
+		<title>积分记录</title>
+		<link rel="stylesheet" type="text/css" href="css/mui.min.css" />
+		<link rel="stylesheet" type="text/css" href="css/iconfont.css" />
+		<link rel="stylesheet" type="text/css" href="css/main.css" />
+		<script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
+		<script>
+			//屏蔽分享
+			//			document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
+			//				WeixinJSBridge.call('hideOptionMenu');
+			//			});
+		</script>
+	</head>
+
+	<body>
+		<!--底部菜单开始-->
+		<footer class="mui-bar mui-bar-tab" id="footer-bar-tab">
+			<a class="mui-tab-item">
+				<span class="iconfont icon-shouye"></span>
+				<span class="mui-tab-label">首页</span>
+			</a>
+			<a class="mui-tab-item">
+				<span class="iconfont icon-liebiao"></span>
+				<span class="mui-tab-label">列表</span>
+			</a>
+			<a class="mui-tab-item">
+				<span class="iconfont icon-gouwuche"></span>
+				<span class="mui-tab-label">购物车</span>
+			</a>
+			<a class="mui-tab-item">
+				<span class="iconfont icon-huiyuan"></span>
+				<span class="mui-tab-label">会员</span>
+			</a>
+		</footer>
+		<!--底部菜单结束-->
+		<div class="integral-log-nav">
+			<!--头部选项卡-->
+			<div id="pro-top-menu" class="mui-segmented-control">
+				<!--(默认选中哪个就加上mui-active),其他不加-->
+				<a class="mui-control-item" name="1" href="#item1">收入记录</a>
+				<a class="mui-control-item" name="3" href="#item2">待入记录</a>
+				<a class="mui-control-item mui-active" name="2" href="#item3">全部记录</a>
+			</div>
+		</div>
+		<!--内容开始-->
+		<div id="item" class="mui-content" style="padding-top: 44px;">
+
+			<!--选项卡item1显示区域(默认选中哪个就加上mui-active),其他不加-->
+			<div id="item1"  class="mui-control-content mui-active">
+				<ul class="mui-table-view my-grid-view-no integral-list ">
+					<!--<li class="mui-table-view-cell">
+						<br />
+						<div class="mui-table mui-text-center">
+							<div class="mui-table-cell mui-col-xs-4">
+								<h3 class="mui-ellipsis cl-blue">+378</h3>
+							</div>
+						</div>
+					</li>
+					<li class="mui-table-view-cell">
+						<div class="mui-table my-integral-cell">
+							<div class="mui-table-cell mui-col-xs-3 mui-text-center">
+								<div class="integral-number">
+									<span class="cl-blue">+122</span>
+								</div>
+							</div>
+							<div class="mui-table-cell mui-col-xs-9">
+								<span>完善会员信息赠送积分</span>
+								<span class="mui-h6 mui-pull-right">2017-12-20</span>
+							</div>
+						</div>
+					</li>
+					<li class="mui-table-view-cell">
+						<div class="mui-table my-integral-cell">
+							<div class="mui-table-cell mui-col-xs-3 mui-text-center">
+								<div class="integral-number">
+									<span class="cl-blue">+122</span>
+								</div>
+							</div>
+							<div class="mui-table-cell mui-col-xs-9">
+								<span>完善会员信息赠送积分</span>
+								<span class="mui-h6 mui-pull-right">2017-12-20</span>
+							</div>
+						</div>
+					</li>
+					<li class="mui-table-view-cell">
+						<div class="mui-table my-integral-cell">
+							<div class="mui-table-cell mui-col-xs-3 mui-text-center">
+								<div class="integral-number">
+									<span class="cl-blue">+122</span>
+								</div>
+							</div>
+							<div class="mui-table-cell mui-col-xs-9">
+								<span>完善会员信息赠送积分</span>
+								<span class="mui-h6 mui-pull-right">2017-12-20</span>
+							</div>
+						</div>
+					</li>-->
+				</ul>
+			</div>
+			<!--选项卡item2显示区域-->
+			<!--<div id="item2" class="mui-control-content">
+				<ul class="mui-table-view my-grid-view-no integral-list">-->
+					<!--<li class="mui-table-view-cell">
+						<br />
+						<div class="mui-table mui-text-center">
+							<div class="mui-table-cell mui-col-xs-4">
+								<h3 class="mui-ellipsis cl-yellow">378</h3>
+							</div>
+						</div>
+					</li>-->
+					<!--<li class="mui-table-view-cell">
+						<div class="mui-table my-integral-cell">
+							<div class="mui-table-cell mui-col-xs-3 mui-text-center">
+								<div class="integral-number">
+									<span class="cl-yellow">122</span>
+								</div>
+							</div>
+							<div class="mui-table-cell mui-col-xs-9">
+								<span>购买刷头待入积分</span>
+								<span class="mui-h6 mui-pull-right">2017-12-20</span>
+							</div>
+						</div>
+					</li>-->
+					<!--<li class="mui-table-view-cell">
+						<div class="mui-table my-integral-cell">
+							<div class="mui-table-cell mui-col-xs-3 mui-text-center">
+								<div class="integral-number">
+										<span class="cl-yellow">33</span>
+								</div>
+							</div>
+							<div class="mui-table-cell mui-col-xs-9">
+								<span>购买刷头待入积分</span>
+								<span class="mui-h6 mui-pull-right">2017-12-20</span>
+							</div>
+						</div>
+					</li>-->
+					<!--<li class="mui-table-view-cell">
+						<div class="mui-table my-integral-cell">
+							<div class="mui-table-cell mui-col-xs-3 mui-text-center">
+								<div class="integral-number">
+									<span class="cl-yellow">122</span>
+								</div>
+							</div>
+							<div class="mui-table-cell mui-col-xs-9">
+								<span>购买刷头待入积分</span>
+								<span class="mui-h6 mui-pull-right">2017-12-20</span>
+							</div>
+						</div>
+					</li>-->
+				<!--</ul>
+			</div>-->
+			<!--选项卡item3显示区域-->
+			<!--<div id="item3" class="mui-control-content mui-active">
+				<ul class="mui-table-view my-grid-view-no integral-list">-->
+					<!--<li class="mui-table-view-cell">
+						<br />
+						<div class="mui-table mui-text-center">
+							<div class="mui-table-cell mui-col-xs-4">
+								<h3 class="mui-ellipsis cl-blue">+378</h3>
+							</div>
+							<div class="mui-table-cell mui-col-xs-4">
+								<h3 class="mui-ellipsis cl-yellow">378</h3>
+							</div>
+							<div class="mui-table-cell mui-col-xs-4">
+								<h3 class="mui-ellipsis cl-red">-378</h3>
+							</div>
+						</div>
+					</li>
+					<li class="mui-table-view-cell">
+						<div class="mui-table my-integral-cell">
+							<div class="mui-table-cell mui-col-xs-3 mui-text-center">
+								<div class="integral-number">
+									<span class="cl-blue">+122</span>
+								</div>
+							</div>
+							<div class="mui-table-cell mui-col-xs-9">
+								<span>完善会员信息赠送积分</span>
+								<span class="mui-h6 mui-pull-right">2017-12-20</span>
+							</div>
+						</div>
+					</li>
+					<li class="mui-table-view-cell">
+						<div class="mui-table my-integral-cell">
+							<div class="mui-table-cell mui-col-xs-3 mui-text-center">
+								<div class="integral-number">
+									<span class="cl-yellow">122</span>
+								</div>
+							</div>
+							<div class="mui-table-cell mui-col-xs-9">
+								<span>购买刷头待入积分</span>
+								<span class="mui-h6 mui-pull-right">2017-12-20</span>
+							</div>
+						</div>
+					</li>
+					<li class="mui-table-view-cell">
+						<div class="mui-table my-integral-cell">
+							<div class="mui-table-cell mui-col-xs-3 mui-text-center">
+								<div class="integral-number">
+									<span class="cl-red">-122</span>
+								</div>
+							</div>
+							<div class="mui-table-cell mui-col-xs-9">
+								<span>积分商城兑换礼品</span>
+								<span class="mui-h6 mui-pull-right">2017-12-20</span>
+							</div>
+						</div>
+					</li>-->
+				<!--</ul>
+			</div>-->
+		</div>
+		<!--内容结束-->
+		<!-- 加载ing begin-->
+		<div class="loading covers">
+			<div class="loading-bj"></div>
+			<p>正在加载...</p>
+		</div>
+		<!-- 加载ing end -->
+		<script src="js/mui.min.js"></script>
+		<script src="js/jquery-2.1.1.min.js"></script>
+		<script src="js/swiper.min.js"></script>
+		<script src="js/main.js"></script>
+		<script>
+			
+			
+			var pageNumber = 0,pagesize = 10;//pageNumber第几页,pagesize每页条数
+			mui.init({
+				pullRefresh: {
+					container: '#item',//上拉加载容器
+					down: {
+						//callback: pulldownRefresh
+					},
+					up: {
+						contentrefresh: '正在加载...',//上拉加载时显示的文字
+						callback: pullupRefresh//上拉加载的回调方法
+					}
+				}
+			});
+			
+			
+			//ready事件    收入记录
+//			mui.ready(function() {
+//				$(".loading").hide().css("opacity", "0"); //隐藏(正在加载...)
+//				mui('#item').pullRefresh().pullupLoading();//重新加载数据
+//			});
+//			function pullupRefresh() {		
+//				++pageNumber;//每次上拉页数+1
+//				$.ajax(base_path + '/wechat/userIntegral/listGainIntegralInfo?dates=' + new Date().getTime(), {
+//					data:{
+//						"useType":1,
+//						"pageNo":pageNumber,//pageNo第几页
+//						"pageSize":pagesize//pageSize每页条数
+//						},
+//					dataType: 'json',
+//					xhrFields: {
+//						withCredentials: true
+//					},
+//					crossDomain: true,
+//					type: 'post',
+//					timeout: 15000,
+//					success:function(dt){
+//						if(dt.isRedirect){
+//							location.href = dt.redirectURL;
+//						} else {
+//							if(dt.status){
+//								console.log(dt);
+//								var table = document.body.querySelector('.integral-list');//table是插入数据li的父级容器
+//								mui('#item').pullRefresh().endPullupToRefresh(dt.data.listGainIntegralInfo.length<pagesize);//endPullupToRefresh(ture)表示没有更多数据了,停止上拉加载
+//								var li = document.createElement('li');//创建li标签
+//										li.className='mui-table-view-cell';//給li标签className
+//										li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+'+'+dt.data.gainIntegralCount+'</h3></div></div>';
+//										table.appendChild(li);//将li插入table
+//								mui.each(dt.data.listGainIntegralInfo, function(index) {
+//										var li = document.createElement('li');//创建li标签
+//										li.className='mui-table-view-cell';//給li标签className
+//										li.innerHTML += '<div class="mui-table my-integral-cell"><div class="mui-table-cell mui-col-xs-3 mui-text-center"><div class="integral-number"><span class="cl-blue">'+'+'+this.integralNumber+'</span></div></div><div class="mui-table-cell mui-col-xs-9"><span>'+this.integralConfigName+'</span><span class="mui-h6 mui-pull-right">'+this.integralCreateTime+'</span></div></div>';
+//										table.appendChild(li);//将li插入table
+//									});
+//							} else {
+//								mui.alert("获取数据失败!");
+//							}
+//						}
+//					},
+//				});
+//			}
+//		
+//			
+//			//待入记录
+//			mui.ready(function() {
+//				$(".loading").hide().css("opacity", "0"); //隐藏(正在加载...)
+//				mui('#item').pullRefresh().pullupLoading();//重新加载数据
+//			});
+//			function pullupRefresh() {		
+//				++pageNumber;//每次上拉页数+1
+//			$.ajax(base_path + '/wechat/userIntegral/listStayIntegral?dates=' + new Date().getTime(), {
+//				data:{
+//					"useType":3,
+//					"pageNo":pageNumber,//pageNo第几页
+//					"pageSize":pagesize//pageSize每页条数
+//				},
+//				dataType: 'json',
+//				xhrFields: {
+//					withCredentials: true
+//				},
+//				crossDomain: true,
+//				type: 'post',
+//				timeout: 15000,
+//				success:function(dt){
+//					if(dt.isRedirect){
+//						location.href = dt.redirectURL;
+//					} else {
+//						if(dt.status){
+//							console.log(dt);
+//							var table = document.body.querySelector('.integral-list');//table是插入数据li的父级容器
+//							mui('#item').pullRefresh().endPullupToRefresh(dt.data.listStayIntegralInfo.length<pagesize);//endPullupToRefresh(ture)表示没有更多数据了,停止上拉加载
+//							var li = document.createElement('li');//创建li标签
+//									li.className='mui-table-view-cell';//給li标签className
+//									li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+'+'+dt.data.stayIntegralCount+'</h3></div></div>';
+//									table.appendChild(li);//将li插入table
+//							mui.each(dt.data.listStayIntegralInfo, function(index) {
+//									
+//									var li = document.createElement('li');//创建li标签
+//									li.className='mui-table-view-cell';//給li标签className
+//									li.innerHTML += '<div class="mui-table my-integral-cell"><div class="mui-table-cell mui-col-xs-3 mui-text-center"><div class="integral-number"><span class="cl-yellow">'+'+'+this.integralNumber+'</span></div></div><div class="mui-table-cell mui-col-xs-9"><span>'+this.integralConfigName+'</span><span class="mui-h6 mui-pull-right">'+this.integralCreateTime+'</span></div></div>';
+//									table.appendChild(li);//将li插入table
+//								});
+//						} else {
+//							mui.alert("获取数据失败!");
+//						}
+//					}
+//				},
+//			});
+//			}	
+//			
+			
+			//全部记录
+			
+			function pullupRefresh() {		
+				
+				++pageNumber;//每次上拉页数+1
+				var parameter = {}; //ajax参数json集合
+				parameter["pageNo"] = pageNumber;
+				parameter["pageSize"] = pagesize;
+				if(item != 2){
+					parameter["useType"] = item;
+				}
+			$.ajax(base_path + '/wechat/userIntegral/listAllIntegralInfo?dates=' + new Date().getTime(), {
+				
+//				data:{
+//					parameter
+//					"pageNo":pageNumber,//pageNo第几页
+//					"pageSize":pagesize//pageSize每页条数
+//				},
+				data:parameter,
+				dataType: 'json',
+				xhrFields: {
+					withCredentials: true
+				},
+				crossDomain: true,
+				type: 'post',
+				timeout: 15000,
+				success:function(dt){
+					if(dt.isRedirect){
+						location.href = dt.redirectURL;
+					} else {
+						if(dt.status){
+							console.log(dt);
+							if(item == 1) {
+								var table = document.body.querySelector('.integral-list');//table是插入数据li的父级容器
+								mui('#item').pullRefresh().endPullupToRefresh(dt.data.listIntegralInfo.length<pagesize);//endPullupToRefresh(ture)表示没有更多数据了,停止上拉加载
+								var li = document.createElement('li');//创建li标签
+										li.className='mui-table-view-cell';//給li标签className
+										if(dt.data.gainIntegralCount == undefined && dt.data.gainIntegralCount == null) {
+											li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+0+'</h3></div></div>';
+											table.appendChild(li);//将li插入table
+										}else {
+											li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+'+'+dt.data.gainIntegralCount+'</h3></div></div>';
+											table.appendChild(li);//将li插入table
+										}
+								mui.each(dt.data.listIntegralInfo, function(index) {
+										var li = document.createElement('li');//创建li标签
+										li.className='mui-table-view-cell';//給li标签className
+										li.innerHTML += '<div class="mui-table my-integral-cell"><div class="mui-table-cell mui-col-xs-3 mui-text-center"><div class="integral-number"><span class="cl-blue">'+'+'+this.integralNumber+'</span></div></div><div class="mui-table-cell mui-col-xs-9"><span>'+this.integralConfigName+'</span><span class="mui-h6 mui-pull-right">'+this.integralCreateTime+'</span></div></div>';
+										table.appendChild(li);//将li插入table
+										
+									});
+							}else if(item == 3) {
+								var table = document.body.querySelector('.integral-list');//table是插入数据li的父级容器
+							mui('#item').pullRefresh().endPullupToRefresh(dt.data.listIntegralInfo.length<pagesize);//endPullupToRefresh(ture)表示没有更多数据了,停止上拉加载	
+							var li = document.createElement('li');//创建li标签
+									li.className='mui-table-view-cell';//給li标签className
+									if(dt.data.stayIntegralCount == undefined && dt.data.stayIntegralCount == null){
+										li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+0+'</h3></div></div>';
+									}else{
+										li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+'+'+dt.data.stayIntegralCount+'</h3></div></div>';
+									}
+									table.appendChild(li);//将li插入table
+							mui.each(dt.data.listIntegralInfo, function(index) {
+									console.log(dt.data);
+									var li = document.createElement('li');//创建li标签
+									li.className='mui-table-view-cell';//給li标签className
+									li.innerHTML += '<div class="mui-table my-integral-cell"><div class="mui-table-cell mui-col-xs-3 mui-text-center"><div class="integral-number"><span class="cl-yellow">'+'+'+this.integralNumber+'</span></div></div><div class="mui-table-cell mui-col-xs-9"><span>'+this.integralConfigName +'</span><span class="mui-h6 mui-pull-right">'+this.stayRecordedTime+'</span></div></div>';
+									table.appendChild(li);//将li插入table
+								});
+							} else {
+								var table = document.body.querySelector('.integral-list');//table是插入数据li的父级容器
+							mui('#item').pullRefresh().endPullupToRefresh(dt.data.listIntegralInfo.length<pagesize);//endPullupToRefresh(ture)表示没有更多数据了,停止上拉加载
+							var li = document.createElement('li');//创建li标签
+									li.className='mui-table-view-cell';//給li标签className
+										if(dt.data.gainIntegralCount == undefined && dt.data.gainIntegralCount == null && dt.data.stayIntegralCount == undefined && dt.data.stayIntegralCount == null && dt.data.useIntegralCount == undefined && dt.data.useIntegralCount == null){
+											li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+0+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+0+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-red">'+0+'</h3></div></div>';
+										}else if(dt.data.gainIntegralCount != undefined && dt.data.gainIntegralCount != null && dt.data.stayIntegralCount == undefined && dt.data.stayIntegralCount == null && dt.data.useIntegralCount == undefined && dt.data.useIntegralCount == null){
+											li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+'+'+dt.data.gainIntegralCount+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+0+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-red">'+0+'</h3></div></div>';
+										}else if(dt.data.gainIntegralCount != undefined && dt.data.gainIntegralCount != null && dt.data.stayIntegralCount == undefined && dt.data.stayIntegralCount == null && dt.data.useIntegralCount != undefined && dt.data.useIntegralCount != null){
+											li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+0+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+0+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-red">'+'-'+dt.data.useIntegralCount+'</h3></div></div>';
+										}else if(dt.data.gainIntegralCount == undefined && dt.data.gainIntegralCount == null && dt.data.stayIntegralCount != undefined && dt.data.stayIntegralCount != null && dt.data.useIntegralCount != undefined && dt.data.useIntegralCount != null){
+											li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+0+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+'+'+dt.data.stayIntegralCount+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-red">'+'-'+dt.data.useIntegralCount+'</h3></div></div>';
+										}else if(dt.data.gainIntegralCount == undefined && dt.data.gainIntegralCount == null && dt.data.stayIntegralCount != undefined && dt.data.stayIntegralCount != null && dt.data.useIntegralCount == undefined && dt.data.useIntegralCount == null){
+											li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+0+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+'+'+dt.data.stayIntegralCount+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-red">'+0+'</h3></div></div>';
+										}else if(dt.data.gainIntegralCount == undefined && dt.data.gainIntegralCount == null && dt.data.stayIntegralCount == undefined && dt.data.stayIntegralCount == null && dt.data.useIntegralCount != undefined && dt.data.useIntegralCount != null){
+											li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+0+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+0+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-red">'+'-'+dt.data.useIntegralCount+'</h3></div></div>';
+										}else if(dt.data.gainIntegralCount != undefined && dt.data.gainIntegralCount != null && dt.data.stayIntegralCount != undefined && dt.data.stayIntegralCount != null && dt.data.useIntegralCount == undefined && dt.data.useIntegralCount == null){
+											li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+'+'+dt.data.gainIntegralCount+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+'+'+dt.data.stayIntegralCount+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-red">'+0+'</h3></div></div>';
+										}else{
+											li.innerHTML += '<div class="mui-table mui-text-center"><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-blue">'+'+'+dt.data.gainIntegralCount+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-yellow">'+'+'+dt.data.stayIntegralCount+'</h3></div><div class="mui-table-cell mui-col-xs-4"><h3 class="mui-ellipsis cl-red">'+'-'+dt.data.useIntegralCount+'</h3></div></div>';
+										}
+									table.appendChild(li);//将li插入table
+							mui.each(dt.data.listIntegralInfo, function(index) {
+									var li = document.createElement('li');//创建li标签
+									li.className='mui-table-view-cell';//給li标签className 
+									if(this.integralType == 1){
+										li.innerHTML += '<div class="mui-table my-integral-cell"><div class="mui-table-cell mui-col-xs-3 mui-text-center"><div class="integral-number"><span class="cl-blue">'+'+'+this.integralNumber+'</span></div></div><div class="mui-table-cell mui-col-xs-9"><span>'+this.integralConfigName+'</span><span class="mui-h6 mui-pull-right">'+this.integralCreateTime+'</span></div></div>';
+									}else if(this.integralType == 2){
+										li.innerHTML += '<div class="mui-table my-integral-cell"><div class="mui-table-cell mui-col-xs-3 mui-text-center"><div class="integral-number"><span class="cl-red">'+'-'+this.integralNumber+'</span></div></div><div class="mui-table-cell mui-col-xs-9"><span>'+this.integralConfigName+'</span><span class="mui-h6 mui-pull-right">'+this.integralCreateTime+'</span></div></div>';
+									}else{
+										li.innerHTML += '<div class="mui-table my-integral-cell"><div class="mui-table-cell mui-col-xs-3 mui-text-center"><div class="integral-number"><span class="cl-yellow">'+'+'+this.integralNumber+'</span></div></div><div class="mui-table-cell mui-col-xs-9"><span>'+this.integralConfigName+'</span><span class="mui-h6 mui-pull-right">'+this.stayRecordedTime +'</span></div></div>';
+									}
+									console.log(li);
+									table.appendChild(li);//将li插入table
+									
+								});
+							}
+								
+						} else {
+							mui.alert("获取数据失败!");
+						}
+					}
+				},
+			});
+		}
+
+//		头部选项卡点击事件
+			var item = 2;
+			$(document).on('tap', '#pro-top-menu>a', function() {
+				item = $(this).attr('name');
+				pageNumber=0;//页数归零
+				$('.integral-list').empty();//清空产品列表
+				mui('#item').pullRefresh().pullupLoading();//重新加载数据
+			});
+			
+			mui.ready(function() {
+				$(".loading").hide().css("opacity", "0"); //隐藏(正在加载...)
+				mui('#item').pullRefresh().pullupLoading();//重新加载数据
+			});
+		</script>
+	</body>
+
+</html>

File diff suppressed because it is too large
+ 11548 - 0
js/city.data-3.js


File diff suppressed because it is too large
+ 1605 - 0
js/city.data.js


File diff suppressed because it is too large
+ 4 - 0
js/jquery-2.1.1.min.js


+ 867 - 0
js/jquery.autocompleter.js

@@ -0,0 +1,867 @@
+/* 
+ * Autocompleter v0.1.2 - 2014-05-20 
+ * Simple, easy, customisable and with cache support. 
+ * http://github.com/ArtemFitiskin/jquery-autocompleter 
+ * 
+ * Copyright 2014 Artem Fitiskin; MIT Licensed 
+ */ 
+
+;(function ($, window) {
+    "use strict";
+
+    var guid = 0,
+        ignoredKeyCode = [9, 13, 17, 19, 20, 27, 33, 34, 35, 36, 37, 39, 44, 92, 113, 114, 115, 118, 119, 120, 122, 123, 144, 145],
+        allowOptions = ['source', 'empty', 'limit', 'cache', 'focusOpen', 'selectFirst', 'changeWhenSelect', 'highlightMatches', 'ignoredKeyCode', 'customLabel', 'customValue', 'template', 'combine', 'callback'],
+        userAgent = (window.navigator.userAgent||window.navigator.vendor||window.opera),
+        isFirefox = /Firefox/i.test(userAgent),
+        isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(userAgent),
+        isFirefoxMobile = (isFirefox && isMobile),
+        $body = null,
+        localStorageKey = 'autocompleterCache',
+        supportLocalStorage = (function () {
+            var supported = typeof window.localStorage !== 'undefined';
+            if (supported) {
+                try {
+                    localStorage.setItem("autocompleter", "autocompleter");
+                    localStorage.removeItem("autocompleter");
+                } catch (e) {
+                    supported = false;
+                }
+            }
+            return supported;
+        })();
+
+    /**
+	 * @options
+	 * @param source [(string|object)] <null> "URL to the server or a local object"
+	 * @param empty [boolean] <true> "Launch if value is empty"
+	 * @param limit [int] <10> "Number of results to be displayed"
+	 * @param customClass [array] <[]> "Array with custom classes for autocompleter element"
+	 * @param cache [boolean] <true> "Save xhr data to localStorage to avoid the repetition of requests"
+	 * @param focusOpen [boolean] <true> "Launch autocompleter when input gets focus"
+	 * @param hint [boolean] <false> "Add hint to input with first matched label, correct styles should be installed"
+	 * @param selectFirst [boolean] <false> "If set to true, first element in autocomplete list will be selected automatically, ignore if changeWhenSelect is on"
+	 * @param changeWhenSelect [boolean] <true> "Allows to change input value using arrow keys navigation in autocomplete list"
+	 * @param highlightMatches [boolean] <false> "This option defines <strong> tag wrap for matches in autocomplete results"
+	 * @param ignoredKeyCode [array] <[]> "Array with ignorable keycodes"
+	 * @param customLabel [boolean] <false> "The name of object's property which will be used as a label"
+	 * @param customValue [boolean] <false> "The name of object's property which will be used as a value"
+     * @param template [(string|boolean)] <false> "Custom template for list items"
+	 * @param combine [function] <$.noop> "Returns an object which extends ajax data. Useful if you want to pass some additional server options"
+	 * @param callback [function] <$.noop> "Select value callback function. Arguments: value, index"
+	 */
+    var options = {
+        source: null,
+        empty: true,
+        limit: 10,
+        customClass: [],
+        cache: true,
+        focusOpen: true,
+        hint: false,
+        selectFirst: false,
+        changeWhenSelect: true,
+        highlightMatches: false,
+        ignoredKeyCode: [],
+        customLabel: false,
+        customValue: false,
+        template: false,
+        combine: $.noop,
+        callback: $.noop
+    };
+
+    var publics = {
+
+        /**
+         * @method
+         * @name defaults
+         * @description Sets default plugin options
+         * @param opts [object] <{}> "Options object"
+         * @example $.autocompleter("defaults", opts);
+         */
+        defaults: function (opts) {
+            options = $.extend(options, opts || {});
+            return $(this);
+        },
+
+        /**
+         * @method
+         * @name option
+         * @description Open autocompleter list
+         */
+        option: function (properties) {
+            return $(this).each(function(i, input) {
+                var data = $(input).next(".autocompleter").data("autocompleter");
+
+                for (var property in properties) {
+                    if ($.inArray(property, allowOptions) !== -1) {
+                        data[property] = properties[property];
+                    }
+                }
+            });
+        },
+
+        /**
+         * @method
+         * @name open
+         * @description Open autocompleter list
+         */
+        open: function () {
+            return $(this).each(function(i, input) {
+                var data = $(input).next(".autocompleter").data("autocompleter");
+
+                if (data) {
+                    _open(null, data);
+                }
+            });
+        },
+
+        /**
+         * @method
+         * @name close
+         * @description Close autocompleter list
+         */
+        close: function () {
+            return $(this).each(function(i, input) {
+                var data = $(input).next(".autocompleter").data("autocompleter");
+
+                if (data) {
+                    _close(null, data);
+                }
+            });
+        },
+
+        /**
+         * @method
+         * @name clearCache
+         * @description Remove localStorage cache
+         */
+        clearCache: function () {
+            _deleteCache();
+        },
+
+        /**
+         * @method
+         * @name destroy
+         * @description Removes instance of plugin
+         * @example $(".target").autocompleter("destroy");
+         */
+        destroy: function () {
+            return $(this).each(function (i, input) {
+                var data = $(input).next(".autocompleter").data("autocompleter");
+
+                if (data) {
+                    // Abort xhr
+                    if (data.jqxhr) {
+                        data.jqxhr.abort();
+                    }
+
+                    // If has selected item & open - confirm it
+                    if (data.$autocompleter.hasClass("open")) {
+                        data.$autocompleter.find(".autocompleter-selected")
+                                            .trigger("click.autocompleter");
+                    }
+
+                    // Restore original autocomplete attr
+                    if(!data.originalAutocomplete) {
+                        data.$node.removeAttr("autocomplete");
+                    } else {
+                        data.$node.attr("autocomplete", data.originalAutocomplete);
+                    }
+
+                    // Remove autocompleter & unbind events
+                     data.$node.off(".autocompleter")
+                               .removeClass("autocompleter-node");
+                     data.$autocompleter.off(".autocompleter")
+                                         .remove();
+                }
+            });
+        }
+    };
+
+    /**
+     * @method private
+     * @name _init
+     * @description Initializes plugin
+     * @param opts [object] "Initialization options"
+     */
+    function _init(opts) {
+        // Local options
+        opts = $.extend({}, options, opts || {});
+
+        // Check for Body
+        if ($body === null) {
+            $body = $("body");
+        }
+
+        // Apply to each element
+        var $items = $(this);
+        for (var i = 0, count = $items.length; i < count; i++) {
+            _build($items.eq(i), opts);
+        }
+
+        return $items;
+    }
+
+    /**
+	 * @method private
+	 * @name _build
+	 * @description Builds each instance
+	 * @param $node [jQuery object] "Target jQuery object"
+	 * @param opts [object] <{}> "Options object"
+	 */
+    function _build($node, opts) {
+        if (!$node.hasClass("autocompleter-node")) {
+            // Extend options
+            opts = $.extend({}, opts, $node.data("autocompleter-options"));
+
+            var html = '<div class="autocompleter '+opts.customClass.join(' ')+'" id="autocompleter-'+(guid+1)+'">';
+                if (opts.hint) {
+                    html += '<div class="autocompleter-hint"></div>';
+                }
+                html += '<ul class="autocompleter-list"></ul>';
+                html += '</div>';
+
+            $node.addClass("autocompleter-node")
+                 .after(html);
+
+            var $autocompleter = $node.next(".autocompleter").eq(0);
+
+            // Set autocomplete to off for warn overlay
+            var originalAutocomplete = $node.attr("autocomplete");
+            $node.attr("autocomplete", "off");
+
+            // Store plugin data
+            var data = $.extend({
+                $node: $node,
+                $autocompleter: $autocompleter,
+                $selected: null,
+                $list: null,
+                index: -1,
+                hintText: false,
+                source: false,
+                jqxhr: false,
+                response: null,
+                focused: false,
+                query: '',
+                originalAutocomplete: originalAutocomplete,
+                guid: guid++
+            }, opts);
+
+            // Bind autocompleter events
+            data.$autocompleter.on("mousedown.autocompleter", ".autocompleter-item", data, _select)
+                                .data("autocompleter", data);
+
+            // Bind node events
+            data.$node.on("keyup.autocompleter", data, _onKeyup)
+                      .on("keydown.autocompleter", data, _onKeydownHelper)
+                      .on("focus.autocompleter", data, _onFocus)
+                      .on("blur.autocompleter", data, _onBlur)
+                      .on("mousedown.autocompleter", data, _onMousedown);
+        }
+    }
+
+    /**
+     * @method private
+     * @name _search
+     * @description Local search function, return best collation
+     * @param query [string] "Query string"
+     * @param source [object] "Source data"
+     * @param limit [integer] "Results length"
+     */
+    function _search(query, source, limit) {
+        var response = [];
+        query = query.toUpperCase();
+
+        if (source.length) {
+            for (var i = 0; i < 2; i++) {
+                for (var item in source) {
+                    if (response.length < limit) {
+                        switch (i) {
+                            case 0:
+                                if (source[item].label.toUpperCase().search(query) === 0) {
+                                    response.push(source[item]);
+                                    delete source[item];
+                                }
+                            break;
+
+                            case 1:
+                                if (source[item].label.toUpperCase().search(query) !== -1) {
+                                    response.push(source[item]);
+                                    delete source[item];
+                                }
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        return response;
+    }
+
+    /**
+     * @method private
+     * @name _launch
+     * @description Use source locally or create xhr
+     * @param data [object] "Instance data"
+     */
+    function _launch(data) {
+        data.query = $.trim(data.$node.val());
+
+        if (!data.empty && data.query.length === 0) {
+            _clear(data);
+            return;
+        } else {
+            if (typeof data.source === 'object') {
+                _clear(data);
+
+                // Local search
+                var search = _search(data.query, _clone(data.source), data.limit);
+                if (search.length) {
+                    _response(search, data);
+                }
+            } else {
+                if (data.jqxhr) {
+                    data.jqxhr.abort();
+                }
+
+                var ajaxData = $.extend({
+                    limit: data.limit,
+                    query: data.query
+                }, data.combine());
+
+                data.jqxhr = $.ajax({
+                    url:        data.source,
+                    dataType:   "json",
+                    data:       ajaxData,
+                    beforeSend: function (xhr) {
+                        data.$autocompleter.addClass('autocompleter-ajax');
+                        _clear(data);
+                        if (data.cache) {
+                            var stored = _getCache(this.url);
+                            if (stored) {
+                                xhr.abort();
+                                _response(stored, data);
+                            }
+                        }
+                    }
+                })
+                .done(function (response) {
+                    if (data.cache) {
+                        _setCache(this.url, response);
+                    }
+                    _response(response, data);
+                })
+                .always(function () {
+                    data.$autocompleter.removeClass('autocompleter-ajax');
+                });
+            }
+        }
+    }
+
+    /**
+     * @method private
+     * @name _clear
+     * @param data [object] "Instance data"
+     */
+    function _clear(data) {
+        // Clear data
+        data.response = null;
+        data.$list = null;
+        data.$selected = null;
+        data.index = 0;
+        data.$autocompleter.find(".autocompleter-list").empty();
+        data.$autocompleter.find('.autocompleter-hint').removeClass('autocompleter-hint-show').empty();
+        data.hintText = false;
+
+        _close(null, data);
+    }
+
+    /**
+     * @method private
+     * @name _response
+     * @description Main source response function
+     * @param response [object] "Source data"
+     * @param data [object] "Instance data"
+     */
+    function _response(response, data) {
+        _buildList(response, data);
+
+        if (data.$autocompleter.hasClass('autocompleter-focus')) {
+            _open(null, data);
+        }
+    }
+
+    /**
+     * @method private
+     * @name _buildList
+     * @description Generate autocompleter-list and update instance data by source
+     * @param list [object] "Source data"
+     * @param data [object] "Instance data"
+     */
+    function _buildList(list, data) {
+        var menu = '';
+
+        for (var item = 0, count = list.length; item < count; item++) {
+            var classes = ["autocompleter-item"];
+
+            if (data.selectFirst && item === 0 && !data.changeWhenSelect) {
+                classes.push("autocompleter-item-selected");
+            }
+
+            var highlightReg = new RegExp(data.query, "gi");
+            var label = (data.customLabel && list[item][data.customLabel]) ? list[item][data.customLabel] : list[item].label;
+
+            var clear = label;
+
+            label = data.highlightMatches ? label.replace(highlightReg, "<strong>$&</strong>") : label;
+
+            var value = (data.customValue && list[item][data.customValue]) ? list[item][data.customValue] : list[item].value;
+
+            // Apply custom template
+            if (data.template) {
+                var template = data.template.replace(/({{ label }})/gi, label);
+
+                for (var property in list[item]) {
+                    if (list[item].hasOwnProperty(property)) {
+                        var regex = new RegExp('{{ '+ property +' }}', 'gi');
+                        template = template.replace(regex, list[item][property]);
+                    }
+                }
+
+                label = template;
+            }
+
+            if (value) {
+                menu += '<li data-value="'+value+'" data-label="'+clear+'" class="'+classes.join(' ')+'">'+label+'</li>';
+            } else {
+                menu += '<li data-label="'+clear+'" class="'+classes.join(' ')+'">'+label+'</li>';
+            }
+        }
+
+        // Set hint
+        if (list.length && data.hint) {
+            var hint = ( list[0].label.substr(0, data.query.length).toUpperCase() === data.query.toUpperCase() ) ? list[0].label : false;
+            if (hint && (data.query !== list[0].label)) {
+                var hintReg = new RegExp(data.query, "i");
+                var hintText = hint.replace(hintReg, "<span>"+data.query+"</span>");
+                data.$autocompleter.find('.autocompleter-hint').addClass('autocompleter-hint-show').html(hintText);
+                data.hintText = hintText;
+            }
+        }
+
+        // Update data
+        data.response = list;
+        data.$autocompleter.find(".autocompleter-list").html(menu);
+        data.$selected = (data.$autocompleter.find(".autocompleter-item-selected").length) ? data.$autocompleter.find(".autocompleter-item-selected") : null;
+        data.$list = (list.length) ? data.$autocompleter.find(".autocompleter-item") : null;
+        data.index = data.$selected ? data.$list.index(data.$selected) : -1;
+        data.$autocompleter.find(".autocompleter-item").each(function (i, j) {
+            $(j).data(data.response[i]);
+        });
+    }
+
+    /**
+     * @method private
+     * @name _onKeyup
+     * @description Keyup events in node, up/down autocompleter-list navigation, typing and enter button callbacks
+     * @param e [object] "Event data"
+     */
+    function _onKeyup(e) {
+        var data = e.data;
+        var code = e.keyCode ? e.keyCode : e.which;
+
+        if ( (code === 40 || code === 38) && data.$autocompleter.hasClass('autocompleter-show') ) {
+            // Arrows up & down
+            var len = data.$list.length,
+                next,
+                prev;
+
+            if (len) {
+                // Determine new index
+                if (len > 1) {
+                    if (data.index === len - 1) {
+                        next = data.changeWhenSelect ? -1 : 0;
+                        prev = data.index - 1;
+                    } else if (data.index === 0) {
+                        next = data.index + 1;
+                        prev = data.changeWhenSelect ? -1 : len - 1;
+                    } else if (data.index === -1) {
+                        next = 0;
+                        prev = len - 1;
+                    } else {
+                        next = data.index + 1;
+                        prev = data.index - 1;
+                    }
+                } else if (data.index === -1) {
+                    next = 0;
+                    prev = 0;
+                } else {
+                    prev = -1;
+                    next = -1;
+                }
+                data.index = (code === 40) ? next : prev;
+
+                // Update HTML
+                data.$list.removeClass("autocompleter-item-selected");
+                if (data.index !== -1) {
+                    data.$list.eq(data.index).addClass("autocompleter-item-selected");
+                }
+                data.$selected = data.$autocompleter.find(".autocompleter-item-selected").length ? data.$autocompleter.find(".autocompleter-item-selected") : null;
+                if (data.changeWhenSelect) {
+                    _setValue(data);
+                }
+            }
+        } else if ($.inArray(code, ignoredKeyCode) === -1 && $.inArray(code, data.ignoredKeyCode) === -1) {
+            // Typing
+            _launch(data);
+        }
+    }
+
+    /**
+     * @method private
+     * @name _onKeydownHelper
+     * @description Keydown events in node, up/down for prevent cursor moving and right arrow for hint
+     * @param e [object] "Event data"
+     */
+    function _onKeydownHelper(e) {
+        var code = e.keyCode ? e.keyCode : e.which;
+        var data = e.data;
+
+        if (code === 40 || code === 38 ) {
+            e.preventDefault();
+            e.stopPropagation();
+        } else if (code === 39) {
+            // Right arrow
+            if (data.hint && data.hintText && data.$autocompleter.find('.autocompleter-hint').hasClass('autocompleter-hint-show')) {
+                e.preventDefault();
+                e.stopPropagation();
+
+                var hintOrigin = data.$autocompleter.find(".autocompleter-item").length ? data.$autocompleter.find(".autocompleter-item").eq(0).attr('data-label') : false;
+                if (hintOrigin) {
+                    data.query = hintOrigin;
+                    _setHint(data);
+                }
+            }
+        } else if (code === 13) {
+            // Enter
+            if (data.$autocompleter.hasClass('autocompleter-show') && data.$selected) {
+                _select(e);
+            }
+        }
+    }
+
+    /**
+     * @method private
+     * @name _onFocus
+     * @description Handles instance focus
+     * @param e [object] "Event data"
+     * @param internal [boolean] "Called by plugin"
+     */
+    function _onFocus(e, internal) {
+        if (!internal) {
+            var data = e.data;
+
+            data.$autocompleter.addClass("autocompleter-focus");
+
+            if (!data.$node.prop("disabled") && !data.$autocompleter.hasClass('autocompleter-show')) {
+                if (data.focusOpen) {
+                    _launch(data);
+                    data.focused = true;
+                    setTimeout(function () {
+                        data.focused = false;
+                    }, 500);
+                }
+            }
+        }
+    }
+
+    /**
+     * @method private
+     * @name _onBlur
+     * @description Handles instance blur
+     * @param e [object] "Event data"
+     * @param internal [boolean] "Called by plugin"
+     */
+    function _onBlur(e, internal) {
+        e.preventDefault();
+        e.stopPropagation();
+
+        var data = e.data;
+
+        if (!internal) {
+            data.$autocompleter.removeClass("autocompleter-focus");
+            _close(e);
+        }
+    }
+
+    /**
+     * @method private
+     * @name _onMousedown
+     * @description Handles mousedown to node
+     * @param e [object] "Event data"
+     */
+    function _onMousedown(e) {
+        // Disable middle & right mouse click
+        if (e.type === "mousedown" && $.inArray(e.which, [2, 3]) !== -1) { return; }
+
+        var data = e.data;
+        if (data.$list && !data.focused) {
+            if (!data.$node.is(":disabled")) {
+                if (isMobile && !isFirefoxMobile) {
+                    var el = data.$select[0];
+                    if (window.document.createEvent) { // All
+                        var evt = window.document.createEvent("MouseEvents");
+                        evt.initMouseEvent("mousedown", false, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+                        el.dispatchEvent(evt);
+                    } else if (el.fireEvent) { // IE
+                        el.fireEvent("onmousedown");
+                    }
+                } else {
+                    // Delegate intent
+                    if (data.$autocompleter.hasClass("autocompleter-closed")) {
+                        _open(e);
+                    } else if (data.$autocompleter.hasClass("autocompleter-show")) {
+                        _close(e);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * @method private
+     * @name _open
+     * @description Opens option set
+     * @param e [object] "Event data"
+     * @param instanceData [object] "Instance data"
+     */
+    function _open(e, instanceData) {
+        var data = e ? e.data : instanceData;
+
+        if (!data.$node.prop("disabled") && !data.$autocompleter.hasClass("autocompleter-show") && data.$list && data.$list.length ) {
+            data.$autocompleter.removeClass("autocompleter-closed").addClass("autocompleter-show");
+            $body.on("click.autocompleter-" + data.guid, ":not(.autocompleter-item)", data, _closeHelper);
+        }
+    }
+
+    /**
+     * @method private
+     * @name _closeHelper
+     * @description Determines if event target is outside instance before closing
+     * @param e [object] "Event data"
+     */
+    function _closeHelper(e) {
+        if ( $(e.target).hasClass('autocompleter-node') ) {
+            return;
+        }
+
+        if ($(e.currentTarget).parents(".autocompleter").length === 0) {
+            _close(e);
+        }
+    }
+
+    /**
+     * @method private
+     * @name _close
+     * @description Closes option set
+     * @param e [object] "Event data"
+     * @param instanceData [object] "Instance data"
+     */
+    function _close(e, instanceData) {
+        var data = e ? e.data : instanceData;
+
+        if (data.$autocompleter.hasClass("autocompleter-show")) {
+            data.$autocompleter.removeClass("autocompleter-show").addClass("autocompleter-closed");
+            $body.off(".autocompleter-" + data.guid);
+        }
+    }
+
+    /**
+     * @method private
+     * @name _select
+     * @description Select item from .autocompleter-list
+     * @param e [object] "Event data"
+     */
+    function _select(e) {
+        // Disable middle & right mouse click
+        if (e.type === "mousedown" && $.inArray(e.which, [2, 3]) !== -1) { return; }
+
+        var data = e.data;
+
+        e.preventDefault();
+        e.stopPropagation();
+
+        if (e.type === "mousedown" && $(this).length) {
+            data.$selected = $(this);
+            data.index = data.$list.index(data.$selected);
+        }
+
+        if (!data.$node.prop("disabled")) {
+            _close(e);
+            _update(data);
+
+            if (e.type === "click") {
+                data.$node.trigger("focus", [true]);
+            }
+        }
+    }
+
+    /**
+     * @method private
+     * @name _setHint
+     * @description Set autocompleter by hint
+     * @param data [object] "Instance data"
+     */
+    function _setHint(data) {
+        _setValue(data);
+        _handleChange(data);
+        _launch(data);
+    }
+
+    /**
+     * @method private
+     * @name _setValue
+     * @description Set value for native field
+     * @param data [object] "Instance data"
+     */
+    function _setValue(data) {
+        if (data.$selected) {
+            if (data.hintText && data.$autocompleter.find('.autocompleter-hint').hasClass('autocompleter-hint-show')) {
+                data.$autocompleter.find('.autocompleter-hint').removeClass('autocompleter-hint-show');
+            }
+            var value = data.$selected.attr('data-value') ? data.$selected.attr('data-value') : data.$selected.attr('data-label');
+            data.$node.val(value);
+        } else {
+            if (data.hintText && !data.$autocompleter.find('.autocompleter-hint').hasClass('autocompleter-hint-show')) {
+                data.$autocompleter.find('.autocompleter-hint').addClass('autocompleter-hint-show');
+            }
+            data.$node.val(data.query);
+        }
+    }
+
+    /**
+     * @method private
+     * @name _update
+     * @param data [object] "Instance data"
+     */
+    function _update(data) {
+        _setValue(data);
+        _handleChange(data);
+        _clear(data);
+    }
+
+    /**
+     * @method private
+     * @name _handleChange
+     * @description Trigger node change event and call the callback function
+     * @param data [object] "Instance data"
+     */
+    function _handleChange(data) {
+        data.callback.call(data.$autocompleter, data.$node.val(), data.index, data.response[data.index]);
+        data.$node.trigger("change");
+    }
+
+    /**
+     * @method private
+     * @name _getCache
+     * @description Store AJAX response in plugin cache
+     * @param url [string] "AJAX get query string"
+     * @param data [object] "AJAX response data"
+     */
+    function _setCache(url, data) {
+        if (!supportLocalStorage) { return; }
+        if (url && data) {
+            cache[url] = {
+                value: data
+            };
+
+            // Proccess to localStorage
+            try {
+                  localStorage.setItem(localStorageKey, JSON.stringify(cache));
+            } catch (e) {
+                  var code = e.code || e.number || e.message;
+                  if (code === 22) {
+                    _deleteCache();
+                  } else {
+                    throw(e);
+                  }
+            }
+        }
+    }
+
+    /**
+     * @method private
+     * @name _getCache
+     * @description Get cached data by url if exist
+     * @param url [string] "AJAX get query string"
+     */
+    function _getCache(url) {
+        if (!url) { return; }
+        var response = (cache[url] && cache[url].value) ? cache[url].value : false;
+        return response;
+    }
+
+    /**
+     * @method private
+     * @name _loadCache
+     * @description Load all plugin cache from localStorage
+     */
+    function _loadCache() {
+        if (!supportLocalStorage) { return; }
+        var json = localStorage.getItem(localStorageKey) || '{}';
+        return JSON.parse(json);
+    }
+
+    /**
+	 * @method private
+     * @name _deleteCache
+     * @description Delete all plugin cache from localStorage
+     */
+    function _deleteCache() {
+        try {
+            localStorage.removeItem(localStorageKey);
+            cache = _loadCache();
+        } catch (e) {
+            throw(e);
+        }
+    }
+
+    /**
+     * @method private
+     * @name _clone
+     * @description Clone JavaScript object
+     */
+    function _clone(obj) {
+        if (null === obj || "object" !== typeof obj) {
+            return obj;
+        }
+        var copy = obj.constructor();
+        for (var attr in obj) {
+            if (obj.hasOwnProperty(attr)) {
+                copy[attr] = obj[attr];
+            }
+        }
+        return copy;
+    }
+
+    // Load cache
+    var cache = _loadCache();
+
+    $.fn.autocompleter = function (method) {
+        if (publics[method]) {
+            return publics[method].apply(this, Array.prototype.slice.call(arguments, 1));
+        } else if (typeof method === 'object' || !method) {
+            return _init.apply(this, arguments);
+        }
+        return this;
+    };
+
+    $.autocompleter = function (method) {
+        if (method === "defaults") {
+            publics.defaults.apply(this, Array.prototype.slice.call(arguments, 1));
+        } else if (method === "clearCache") {
+            publics.clearCache.apply(this, null);
+        }
+    };
+})(jQuery, window);

File diff suppressed because it is too large
+ 9 - 0
js/jquery.autocompleter.min.js


+ 431 - 0
js/main.js

@@ -0,0 +1,431 @@
+var domanUrl = "http://" + window.location.host;
+var base_path = "http://w.iamberry.com/tooth";
+//var base_path = domanUrl+"/tooth";
+
+//ajax loading
+$(window).ajaxStart(function(){
+    $(".covers").show();
+});
+$(window).ajaxStop(function(){
+    $(".covers").hide();
+});
+
+mui.each(document.querySelectorAll('#footer-bar-tab .mui-tab-item'), function(index, el) {
+					el.addEventListener('tap', function() {
+						switch(index) {
+							case 0:
+								mui.openWindow({
+									url: 'index.html'
+								});
+								break;
+							case 1:
+								mui.openWindow({
+									url: 'pro-list.html'
+								});
+								break;
+							case 2:
+								mui.openWindow({
+									url: 'shopping-cart.html'
+								});
+								break;
+							case 3:
+								mui.openWindow({
+									url: 'my-center.html'
+								});
+								break;	
+							default:
+								break;
+						}
+					}, false);
+				});
+
+function time_before(t){
+	var minute=1000*60;
+	var hour=minute*60;
+	var day=hour*24;
+	var halfamonth=day*15;
+	var month=day*30;
+	var now=new Date().getTime();
+	var diffValue=now-new Date().setTime(t);
+	var monthC=diffValue/month;
+	var weekC=diffValue/(7*day);
+	var dayC=diffValue/day;
+	var hourC=diffValue/hour;
+	var minC=diffValue/minute;
+	if(monthC>=1){
+		result=""+parseInt(monthC)+"月前";
+	}else if(weekC>=1){
+		result=""+parseInt(weekC)+"周前";
+	}else if(dayC>=1){
+		result=""+parseInt(dayC)+"天前";
+	}else if(hourC>=1){
+		result=""+parseInt(hourC)+"小时前";
+	}else if(minC>=2){
+		result=""+parseInt(minC)+"分钟前";
+	}else{
+		result="刚刚";
+	}
+	return result;
+};
+//封装document.getElementById
+function dc(objectid) {
+	if(document.getElementById && document.getElementById(objectid)) {
+		return document.getElementById(objectid);// w3c dom
+	} else if (document.all && document.all(objectid)) {
+		return document.all(objectid);// msie 4 dom
+	} else if (document.layers && document.layers[objectid]) {
+		return document.layers[objectid];// nn 4 dom.. note: this won't find nested layers
+	} else {
+		return false;
+	}
+};
+//生成随机字符,n长度
+function generateMixed(n) {
+	var chars = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
+     var res = "";
+     for(var i = 0; i < n ; i ++) {
+         var id = Math.ceil(Math.random()*35);
+         res += chars[id];
+     }
+     return res;
+}
+function getParam(paramName) {
+	paramValue = "", isFound = !1;
+	if(this.location.search.indexOf("?") == 0 && this.location.search.indexOf("=") > 1) {
+		arrSource = unescape(this.location.search).substring(1, this.location.search.length).split("&"), i = 0;
+		while(i < arrSource.length && !isFound) {
+			arrSource[i].indexOf("=") > 0 && arrSource[i].split("=")[0].toLowerCase() == paramName.toLowerCase() && (paramValue = arrSource[i].split("=")[1], isFound = !0), i++
+		}
+	}
+	return paramValue == "" && (paramValue = null), paramValue
+};
+function getQueryString(name) { 
+var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 
+var r = window.location.search.substr(1).match(reg); 
+if (r != null) return unescape(r[2]); return null; 
+} 
+// 对Date的扩展,将 Date 转化为指定格式的String   
+// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,   
+// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)   
+// 例子:   
+// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423   
+// (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18   
+Date.prototype.format = function(fmt)   
+{ //author: meizz   
+  var o = {   
+    "M+" : this.getMonth()+1,                 //月份   
+    "d+" : this.getDate(),                    //日   
+    "h+" : this.getHours(),                   //小时   
+    "m+" : this.getMinutes(),                 //分   
+    "s+" : this.getSeconds(),                 //秒   
+    "q+" : Math.floor((this.getMonth()+3)/3), //季度   
+    "S"  : this.getMilliseconds()             //毫秒   
+  };   
+  if(/(y+)/.test(fmt))   
+    fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));   
+  for(var k in o)   
+    if(new RegExp("("+ k +")").test(fmt))   
+  fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));   
+  return fmt;   
+}
+//计算月份差
+function getMonthNumber(date1,date2){
+  //默认格式为"2010-01-01",根据自己需要改格式和方法
+  var d1=date1.replaceAll("-",''),d2=date2.replaceAll("-",'');
+
+  var year1 =  d1.substring(0,4);
+  var year2 =  d2.substring(0,4); 
+  var month1 = d1.substring(6,4);
+  var month2 = d2.substring(6,4);
+  var len=parseInt((year2-year1)*12+(month2-month1));
+  return len;
+}
+ //替换所有要替换的文字
+String.prototype.replaceAll = function (str1,str2){
+var str = this; 
+var result = str.replace(eval("/"+str1+"/gi"),str2);
+return result;
+}
+/**
+ ** 加法函数,用来得到精确的加法结果
+ ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
+ ** 调用:accAdd(arg1,arg2)
+ ** 返回值:arg1加上arg2的精确结果
+ **/
+function accAdd(arg1, arg2) {
+    var r1, r2, m, c;
+    try {
+        r1 = arg1.toString().split(".")[1].length;
+    }
+    catch (e) {
+        r1 = 0;
+    }
+    try {
+        r2 = arg2.toString().split(".")[1].length;
+    }
+    catch (e) {
+        r2 = 0;
+    }
+    c = Math.abs(r1 - r2);
+    m = Math.pow(10, Math.max(r1, r2));
+    if (c > 0) {
+        var cm = Math.pow(10, c);
+        if (r1 > r2) {
+            arg1 = Number(arg1.toString().replace(".", ""));
+            arg2 = Number(arg2.toString().replace(".", "")) * cm;
+        } else {
+            arg1 = Number(arg1.toString().replace(".", "")) * cm;
+            arg2 = Number(arg2.toString().replace(".", ""));
+        }
+    } else {
+        arg1 = Number(arg1.toString().replace(".", ""));
+        arg2 = Number(arg2.toString().replace(".", ""));
+    }
+    return (arg1 + arg2) / m;
+}
+
+//给Number类型增加一个add方法,调用起来更加方便。
+Number.prototype.add = function (arg) {
+    return accAdd(arg, this);
+};
+/**
+ ** 减法函数,用来得到精确的减法结果
+ ** 说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。
+ ** 调用:accSub(arg1,arg2)
+ ** 返回值:arg1加上arg2的精确结果
+ **/
+function accSub(arg1, arg2) {
+    var r1, r2, m, n;
+    try {
+        r1 = arg1.toString().split(".")[1].length;
+    }
+    catch (e) {
+        r1 = 0;
+    }
+    try {
+        r2 = arg2.toString().split(".")[1].length;
+    }
+    catch (e) {
+        r2 = 0;
+    }
+    m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
+    n = (r1 >= r2) ? r1 : r2;
+    return ((arg1 * m - arg2 * m) / m).toFixed(n);
+}
+
+// 给Number类型增加一个mul方法,调用起来更加方便。
+Number.prototype.sub = function (arg) {
+    return accSub(arg, this);
+};
+/** 
+ ** 除法函数,用来得到精确的除法结果
+ ** 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
+ ** 调用:accDiv(arg1,arg2)
+ ** 返回值:arg1除以arg2的精确结果
+ **/
+function accDiv(arg1, arg2) {
+    var t1 = 0, t2 = 0, r1, r2;
+    try {
+        t1 = arg1.toString().split(".")[1].length;
+    }
+    catch (e) {
+    }
+    try {
+        t2 = arg2.toString().split(".")[1].length;
+    }
+    catch (e) {
+    }
+    with (Math) {
+        r1 = Number((arg1 + "").replace(".", ""));
+        r2 = Number((arg2 + "").replace(".", ""));
+        return (r1 / r2) * pow(10, t2 - t1);
+    }
+}
+//给Number类型增加一个div方法,调用起来更加方便。
+Number.prototype.div = function (arg) {
+  return accDiv(this, arg);
+};
+/**
+ ** 乘法函数,用来得到精确的乘法结果
+ ** 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
+ ** 调用:accMul(arg1,arg2)
+ ** 返回值:arg1乘以 arg2的精确结果
+ **/
+function accMul(arg1, arg2) {
+    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
+    try {
+        m += s1.split(".")[1].length;
+    }
+    catch (e) {
+    }
+    try {
+        m += s2.split(".")[1].length;
+    }
+    catch (e) {
+    }
+    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
+}
+// 给Number类型增加一个mul方法,调用起来更加方便。
+Number.prototype.mul = function (arg) {
+    return accMul(arg, this);
+};
+function formatDate(now)   {     
+	now = new Date(now);
+    var   year=now.getFullYear();     
+    var   month=now.getMonth()+1;
+    if(month<10){
+    	month="0"+month;
+    }
+    var   date=now.getDate();         
+    return   year+"年"+month+"月"+date+"日";     
+}
+function formatTime(msd) {  
+    var time = parseFloat(msd) /1000;  
+    if (null!= time &&""!= time) {  
+        if (time >60&& time <60*60) {  
+        	 time = parseInt(time /60.0) +"分"; 
+//          time = parseInt(time /60.0) +"分钟"+ parseInt((parseFloat(time /60.0) -  
+//          parseInt(time /60.0)) *60) +"秒";  
+        }else if (time >=60*60&& time <60*60*24) {  
+//          time = parseInt(time /3600.0) +"小时"+ parseInt((parseFloat(time /3600.0) -  
+//          parseInt(time /3600.0)) *60) +"分钟"+
+//          parseInt((parseFloat((parseFloat(time /3600.0) - parseInt(time /3600.0)) *60) -  
+//          parseInt((parseFloat(time /3600.0) - parseInt(time /3600.0)) *60)) *60) +"秒";  
+            time = parseInt(time /3600.0) +"时"+ parseInt((parseFloat(time /3600.0) -  
+            parseInt(time /3600.0)) *60) +"分"; 
+        }else {  
+            time = parseInt(time) +"分";  
+        }  
+    }else{  
+        time = "0分";  
+    }  
+    return time;  
+}
+function formatMinutes(msd) { 
+	// 参数msd (秒)
+    var time = parseFloat(msd);  
+    if (null!= time && ""!= time) {  
+        if (time >0&& time <60*60) {  
+        	 time = parseInt(time /60.0) +"分"; 
+        }else{  
+            time = parseInt(time /3600.0) +"时"+ parseInt((parseFloat(time /3600.0) -  
+            parseInt(time /3600.0)) *60) +"分"; 
+        }
+    }else{  
+        time = "0分"; 
+    }  
+    return time;  
+}
+function formatDay(now)   {     
+	now = new Date(now);    
+    var   month=now.getMonth()+1;  
+    if(month<10){
+    	month="0"+month;
+    }
+    var   date=now.getDate();
+    if(date<10){
+    	date="0"+date;
+    }
+    return month+"-"+date;     
+}
+function formatDateFull(now)   {     
+	now = new Date(now);
+    var   year=now.getFullYear();     
+    var   month=now.getMonth()+1;  
+    if(month<10){
+    	month="0"+month;
+    }
+    var   date=now.getDate();
+    if(date<10){
+    	date="0"+date;
+    }
+    return year+"-"+month+"-"+date;     
+}
+function formatDateMinute(now)   {     
+	now = new Date(now);
+    var   year=now.getFullYear();     
+    var   month=now.getMonth()+1; 
+    if(month<10){
+    	month="0"+month;
+    }
+    var   date=now.getDate();
+    if(date<10){
+    	date="0"+date;
+    }
+    var   hour=now.getHours();
+    if(hour<10){
+    	hour="0"+hour;
+    }
+    var   Minute=now.getMinutes();
+    if(Minute<10){
+    	Minute="0"+Minute;
+    }
+    return year+"-"+month+"-"+date+" "+hour+":"+Minute;     
+}
+function int_for_time(obj){
+	return obj+":00";
+}
+//替换指定传入参数的值,paramName为参数,replaceWith为新值
+function replaceParamVal(paramName,replaceWith) {
+    var oUrl = this.location.href.toString();
+    var re=eval('/('+ paramName+'=)([^&]*)/gi');
+    var nUrl = oUrl.replace(re,paramName+'='+replaceWith);
+    window.history.pushState({},0,nUrl); 
+}
+function isEmptyObject(e) {  
+    var t;  
+    for (t in e)  
+        return !1;  
+    return !0  
+}
+function gotoTop() {
+	mui('.my-scroll-wrapper').scroll().scrollTo(0,0,500);//500毫秒滚动到顶
+	//$(".mui-scroll").css({"transform":"translate3d(0px, 0px, 0px) translateZ(0px)","transition-duration":"100ms"});
+};
+function gotoBottom(){
+	mui('.my-scroll-wrapper').scroll().scrollToBottom();//500毫秒滚动到底部
+}
+$(document).on('tap', '.go_pro_list', function() {
+	var positions='';
+	if(typeof($(this).attr("pos"))!="undefined"){
+		positions=$(this).attr("pos");
+		location.href="pro-list.html?pos="+positions;
+	}else{
+		location.href="pro-list.html";
+	}
+});
+$(document).on('tap', '.icon-shouye', function() {
+	location.href="index.html";
+});
+//回到顶部
+function gotoTop(acceleration, stime) {
+	acceleration = acceleration || 0.1;
+	stime = stime || 10;
+	var x1 = 0,
+		y1 = 0,
+		x2 = 0,
+		y2 = 0,
+		x3 = 0,
+		y3 = 0;
+	if (document.documentElement) {
+		x1 = document.documentElement.scrollLeft || 0;
+		y1 = document.documentElement.scrollTop || 0;
+	}
+	if (document.body) {
+		x2 = document.body.scrollLeft || 0;
+		y2 = document.body.scrollTop || 0;
+	}
+	var x3 = window.scrollX || 0;
+	var y3 = window.scrollY || 0;
+
+	var x = Math.max(x1, Math.max(x2, x3));
+	var y = Math.max(y1, Math.max(y2, y3));
+
+	var speeding = 1 + acceleration;
+	window.scrollTo(Math.floor(x / speeding), Math.floor(y / speeding));
+
+	if (x > 0 || y > 0) {
+		var run = "gotoTop(" + acceleration + ", " + stime + ")";
+		window.setTimeout(run, stime);
+	}
+}

+ 403 - 0
js/main.js.bak

@@ -0,0 +1,403 @@
+var domanUrl = "http://" + window.location.host;
+var base_path = "http://w.iamberry.com/iamberry";
+//var base_path = "/iamberry";
+
+//ajax loading
+$(window).ajaxStart(function(){
+    $(".covers").show();
+});
+$(window).ajaxStop(function(){
+    $(".covers").hide();
+});
+
+mui.each(document.querySelectorAll('#footer-bar-tab .mui-tab-item'), function(index, el) {
+					el.addEventListener('tap', function() {
+						switch(index) {
+							case 0:
+								mui.openWindow({
+									url: 'index.html'
+								});
+								break;
+							case 1:
+								mui.openWindow({
+									url: 'pro-list.html'
+								});
+								break;
+							case 2:
+								mui.openWindow({
+									url: 'shopping-cart.html'
+								});
+								break;
+							case 3:
+								mui.openWindow({
+									url: 'my-center.html'
+								});
+								break;	
+							default:
+								break;
+						}
+					}, false);
+				});
+
+function time_before(t){
+	var minute=1000*60;
+	var hour=minute*60;
+	var day=hour*24;
+	var halfamonth=day*15;
+	var month=day*30;
+	var now=new Date().getTime();
+	var diffValue=now-new Date().setTime(t);
+	var monthC=diffValue/month;
+	var weekC=diffValue/(7*day);
+	var dayC=diffValue/day;
+	var hourC=diffValue/hour;
+	var minC=diffValue/minute;
+	if(monthC>=1){
+		result=""+parseInt(monthC)+"月前";
+	}else if(weekC>=1){
+		result=""+parseInt(weekC)+"周前";
+	}else if(dayC>=1){
+		result=""+parseInt(dayC)+"天前";
+	}else if(hourC>=1){
+		result=""+parseInt(hourC)+"小时前";
+	}else if(minC>=2){
+		result=""+parseInt(minC)+"分钟前";
+	}else{
+		result="刚刚";
+	}
+	return result;
+};
+//封装document.getElementById
+function dc(objectid) {
+	if(document.getElementById && document.getElementById(objectid)) {
+		return document.getElementById(objectid);// w3c dom
+	} else if (document.all && document.all(objectid)) {
+		return document.all(objectid);// msie 4 dom
+	} else if (document.layers && document.layers[objectid]) {
+		return document.layers[objectid];// nn 4 dom.. note: this won't find nested layers
+	} else {
+		return false;
+	}
+};
+//生成随机字符,n长度
+function generateMixed(n) {
+	var chars = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
+     var res = "";
+     for(var i = 0; i < n ; i ++) {
+         var id = Math.ceil(Math.random()*35);
+         res += chars[id];
+     }
+     return res;
+}
+function getParam(paramName) {
+	paramValue = "", isFound = !1;
+	if(this.location.search.indexOf("?") == 0 && this.location.search.indexOf("=") > 1) {
+		arrSource = unescape(this.location.search).substring(1, this.location.search.length).split("&"), i = 0;
+		while(i < arrSource.length && !isFound) {
+			arrSource[i].indexOf("=") > 0 && arrSource[i].split("=")[0].toLowerCase() == paramName.toLowerCase() && (paramValue = arrSource[i].split("=")[1], isFound = !0), i++
+		}
+	}
+	return paramValue == "" && (paramValue = null), paramValue
+};
+function getQueryString(name) { 
+var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 
+var r = window.location.search.substr(1).match(reg); 
+if (r != null) return unescape(r[2]); return null; 
+} 
+// 对Date的扩展,将 Date 转化为指定格式的String   
+// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,   
+// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)   
+// 例子:   
+// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423   
+// (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18   
+Date.prototype.format = function(fmt)   
+{ //author: meizz   
+  var o = {   
+    "M+" : this.getMonth()+1,                 //月份   
+    "d+" : this.getDate(),                    //日   
+    "h+" : this.getHours(),                   //小时   
+    "m+" : this.getMinutes(),                 //分   
+    "s+" : this.getSeconds(),                 //秒   
+    "q+" : Math.floor((this.getMonth()+3)/3), //季度   
+    "S"  : this.getMilliseconds()             //毫秒   
+  };   
+  if(/(y+)/.test(fmt))   
+    fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));   
+  for(var k in o)   
+    if(new RegExp("("+ k +")").test(fmt))   
+  fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));   
+  return fmt;   
+}
+//计算月份差
+function getMonthNumber(date1,date2){
+  //默认格式为"2010-01-01",根据自己需要改格式和方法
+  var d1=date1.replaceAll("-",''),d2=date2.replaceAll("-",'');
+
+  var year1 =  d1.substring(0,4);
+  var year2 =  d2.substring(0,4); 
+  var month1 = d1.substring(6,4);
+  var month2 = d2.substring(6,4);
+  var len=parseInt((year2-year1)*12+(month2-month1));
+  return len;
+}
+ //替换所有要替换的文字
+String.prototype.replaceAll = function (str1,str2){
+var str = this; 
+var result = str.replace(eval("/"+str1+"/gi"),str2);
+return result;
+}
+/**
+ ** 加法函数,用来得到精确的加法结果
+ ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
+ ** 调用:accAdd(arg1,arg2)
+ ** 返回值:arg1加上arg2的精确结果
+ **/
+function accAdd(arg1, arg2) {
+    var r1, r2, m, c;
+    try {
+        r1 = arg1.toString().split(".")[1].length;
+    }
+    catch (e) {
+        r1 = 0;
+    }
+    try {
+        r2 = arg2.toString().split(".")[1].length;
+    }
+    catch (e) {
+        r2 = 0;
+    }
+    c = Math.abs(r1 - r2);
+    m = Math.pow(10, Math.max(r1, r2));
+    if (c > 0) {
+        var cm = Math.pow(10, c);
+        if (r1 > r2) {
+            arg1 = Number(arg1.toString().replace(".", ""));
+            arg2 = Number(arg2.toString().replace(".", "")) * cm;
+        } else {
+            arg1 = Number(arg1.toString().replace(".", "")) * cm;
+            arg2 = Number(arg2.toString().replace(".", ""));
+        }
+    } else {
+        arg1 = Number(arg1.toString().replace(".", ""));
+        arg2 = Number(arg2.toString().replace(".", ""));
+    }
+    return (arg1 + arg2) / m;
+}
+
+//给Number类型增加一个add方法,调用起来更加方便。
+Number.prototype.add = function (arg) {
+    return accAdd(arg, this);
+};
+
+/** 
+ ** 除法函数,用来得到精确的除法结果
+ ** 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
+ ** 调用:accDiv(arg1,arg2)
+ ** 返回值:arg1除以arg2的精确结果
+ **/
+function accDiv(arg1, arg2) {
+    var t1 = 0, t2 = 0, r1, r2;
+    try {
+        t1 = arg1.toString().split(".")[1].length;
+    }
+    catch (e) {
+    }
+    try {
+        t2 = arg2.toString().split(".")[1].length;
+    }
+    catch (e) {
+    }
+    with (Math) {
+        r1 = Number((arg1 + "").replace(".", ""));
+        r2 = Number((arg2 + "").replace(".", ""));
+        return (r1 / r2) * pow(10, t2 - t1);
+    }
+}
+//给Number类型增加一个div方法,调用起来更加方便。
+Number.prototype.div = function (arg) {
+  return accDiv(this, arg);
+};
+/**
+ ** 乘法函数,用来得到精确的乘法结果
+ ** 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
+ ** 调用:accMul(arg1,arg2)
+ ** 返回值:arg1乘以 arg2的精确结果
+ **/
+function accMul(arg1, arg2) {
+    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
+    try {
+        m += s1.split(".")[1].length;
+    }
+    catch (e) {
+    }
+    try {
+        m += s2.split(".")[1].length;
+    }
+    catch (e) {
+    }
+    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
+}
+// 给Number类型增加一个mul方法,调用起来更加方便。
+Number.prototype.mul = function (arg) {
+    return accMul(arg, this);
+};
+function formatDate(now)   {     
+	now = new Date(now);
+    var   year=now.getFullYear();     
+    var   month=now.getMonth()+1;
+    if(month<10){
+    	month="0"+month;
+    }
+    var   date=now.getDate();         
+    return   year+"年"+month+"月"+date+"日";     
+}
+function formatTime(msd) {  
+    var time = parseFloat(msd) /1000;  
+    if (null!= time &&""!= time) {  
+        if (time >60&& time <60*60) {  
+        	 time = parseInt(time /60.0) +"分"; 
+//          time = parseInt(time /60.0) +"分钟"+ parseInt((parseFloat(time /60.0) -  
+//          parseInt(time /60.0)) *60) +"秒";  
+        }else if (time >=60*60&& time <60*60*24) {  
+//          time = parseInt(time /3600.0) +"小时"+ parseInt((parseFloat(time /3600.0) -  
+//          parseInt(time /3600.0)) *60) +"分钟"+
+//          parseInt((parseFloat((parseFloat(time /3600.0) - parseInt(time /3600.0)) *60) -  
+//          parseInt((parseFloat(time /3600.0) - parseInt(time /3600.0)) *60)) *60) +"秒";  
+            time = parseInt(time /3600.0) +"时"+ parseInt((parseFloat(time /3600.0) -  
+            parseInt(time /3600.0)) *60) +"分"; 
+        }else {  
+            time = parseInt(time) +"分";  
+        }  
+    }else{  
+        time = "0分";  
+    }  
+    return time;  
+}
+function formatMinutes(msd) { 
+	// 参数msd (秒)
+    var time = parseFloat(msd);  
+    if (null!= time && ""!= time) {  
+        if (time >0&& time <60*60) {  
+        	 time = parseInt(time /60.0) +"分"; 
+        }else{  
+            time = parseInt(time /3600.0) +"时"+ parseInt((parseFloat(time /3600.0) -  
+            parseInt(time /3600.0)) *60) +"分"; 
+        }
+    }else{  
+        time = "0分"; 
+    }  
+    return time;  
+}
+function formatDay(now)   {     
+	now = new Date(now);    
+    var   month=now.getMonth()+1;  
+    if(month<10){
+    	month="0"+month;
+    }
+    var   date=now.getDate();
+    if(date<10){
+    	date="0"+date;
+    }
+    return month+"-"+date;     
+}
+function formatDateFull(now)   {     
+	now = new Date(now);
+    var   year=now.getFullYear();     
+    var   month=now.getMonth()+1;  
+    if(month<10){
+    	month="0"+month;
+    }
+    var   date=now.getDate();
+    if(date<10){
+    	date="0"+date;
+    }
+    return year+"-"+month+"-"+date;     
+}
+function formatDateMinute(now)   {     
+	now = new Date(now);
+    var   year=now.getFullYear();     
+    var   month=now.getMonth()+1; 
+    if(month<10){
+    	month="0"+month;
+    }
+    var   date=now.getDate();
+    if(date<10){
+    	date="0"+date;
+    }
+    var   hour=now.getHours();
+    if(hour<10){
+    	hour="0"+hour;
+    }
+    var   Minute=now.getMinutes();
+    if(Minute<10){
+    	Minute="0"+Minute;
+    }
+    return year+"-"+month+"-"+date+" "+hour+":"+Minute;     
+}
+function int_for_time(obj){
+	return obj+":00";
+}
+//替换指定传入参数的值,paramName为参数,replaceWith为新值
+function replaceParamVal(paramName,replaceWith) {
+    var oUrl = this.location.href.toString();
+    var re=eval('/('+ paramName+'=)([^&]*)/gi');
+    var nUrl = oUrl.replace(re,paramName+'='+replaceWith);
+    window.history.pushState({},0,nUrl); 
+}
+function isEmptyObject(e) {  
+    var t;  
+    for (t in e)  
+        return !1;  
+    return !0  
+}
+function gotoTop() {
+	mui('.my-scroll-wrapper').scroll().scrollTo(0,0,500);//500毫秒滚动到顶
+	//$(".mui-scroll").css({"transform":"translate3d(0px, 0px, 0px) translateZ(0px)","transition-duration":"100ms"});
+};
+function gotoBottom(){
+	mui('.my-scroll-wrapper').scroll().scrollToBottom();//500毫秒滚动到底部
+}
+$(document).on('tap', '.go_pro_list', function() {
+	var positions='';
+	if(typeof($(this).attr("pos"))!="undefined"){
+		positions=$(this).attr("pos");
+		location.href="pro-list.html?pos="+positions;
+	}else{
+		location.href="pro-list.html";
+	}
+});
+$(document).on('tap', '.icon-shouye', function() {
+	location.href="index.html";
+});
+//回到顶部
+function gotoTop(acceleration, stime) {
+	acceleration = acceleration || 0.1;
+	stime = stime || 10;
+	var x1 = 0,
+		y1 = 0,
+		x2 = 0,
+		y2 = 0,
+		x3 = 0,
+		y3 = 0;
+	if (document.documentElement) {
+		x1 = document.documentElement.scrollLeft || 0;
+		y1 = document.documentElement.scrollTop || 0;
+	}
+	if (document.body) {
+		x2 = document.body.scrollLeft || 0;
+		y2 = document.body.scrollTop || 0;
+	}
+	var x3 = window.scrollX || 0;
+	var y3 = window.scrollY || 0;
+
+	var x = Math.max(x1, Math.max(x2, x3));
+	var y = Math.max(y1, Math.max(y2, y3));
+
+	var speeding = 1 + acceleration;
+	window.scrollTo(Math.floor(x / speeding), Math.floor(y / speeding));
+
+	if (x > 0 || y > 0) {
+		var run = "gotoTop(" + acceleration + ", " + stime + ")";
+		window.setTimeout(run, stime);
+	}
+}

+ 268 - 0
js/mui.imageViewer.js

@@ -0,0 +1,268 @@
+/**
+ * 图片预览组件
+ * varstion 0.4.0
+ * by Houfeng
+ * Houfeng@DCloud.io
+ */
+
+(function($, document) {
+
+	$.init({
+		gestureConfig: {
+			tap: true, //默认为true
+			doubletap: true, //默认为false
+			longtap: true, //默认为false
+			swipe: true, //默认为true
+			drag: true, //默认为true
+			hold: true, //默认为false,不监听
+			release: true //默认为false,不监听
+		}
+	});
+
+	var touchSupport = ('ontouchstart' in document);
+	var tapEventName = touchSupport ? 'tap' : 'click';
+	var enterEventName = touchSupport ? 'tap' : 'click';
+	var imageClassName = $.className('image');
+
+
+	//创建DOM (此函数是否可放在 mui.js 中)
+	$.dom = function(str) {
+		if (!$.__create_dom_div__) {
+			$.__create_dom_div__ = document.createElement('div');
+		}
+		$.__create_dom_div__.innerHTML = str;
+		return $.__create_dom_div__.childNodes;
+	};
+
+	//图片预览组件类
+	var ImageViewer = $.ImageViewer = $.Class.extend({
+		//构造函数
+		init: function(selector, options) {
+			var self = this;
+			self.options = options || {};
+			self.selector = selector || 'img';
+			if (self.options.dbl) {
+				enterEventName = touchSupport ? 'doubletap' : 'dblclick';
+			}
+			self.findAllImage();
+			self.createViewer();
+			self.bindEvent();
+		},
+		//创建图片预览组件的整体 UI
+		createViewer: function() {
+			var self = this;
+			self.viewer = $.dom("<div class='mui-imageviewer'><div class='mui-imageviewer-mask'></div><div class='mui-imageviewer-header'><i class='mui-icon mui-icon-closeempty mui-imageviewer-close'></i><span class='mui-imageviewer-state'></span></div><i class='mui-icon mui-icon-arrowleft  mui-imageviewer-left'></i><i class='mui-icon mui-icon-arrowright mui-imageviewer-right'></i></div>");
+			self.viewer = self.viewer[0] || self.viewer;
+			//self.viewer.style.height = screen.height;
+			self.closeButton = self.viewer.querySelector('.mui-imageviewer-close');
+			self.state = self.viewer.querySelector('.mui-imageviewer-state');
+			self.leftButton = self.viewer.querySelector('.mui-imageviewer-left');
+			self.rightButton = self.viewer.querySelector('.mui-imageviewer-right');
+			self.mask = self.viewer.querySelector('.mui-imageviewer-mask');
+			document.body.appendChild(self.viewer);
+		},
+		//查找所有符合的图片
+		findAllImage: function() {
+			var self = this;
+			self.images = [].slice.call($(self.selector));
+		},
+		//检查图片是否为启动预览的图片
+		checkImage: function(target) {
+			var self = this;
+			if (target.tagName !== 'IMG') return false;
+			return self.images.some(function(image) {
+				return image == target;
+			});
+		},
+		//绑定事件
+		bindEvent: function() {
+			var self = this;
+			//绑定图片 tap 事件
+			document.addEventListener(enterEventName, function(event) {
+				if (!self.viewer) return;
+				var target = event.target;
+				if (!self.checkImage(target)) return;
+				self.viewer.style.display = 'block';
+				setTimeout(function() {
+					self.viewer.style.opacity = 1;
+				}, 0);
+				self.index = self.images.indexOf(target);
+				self.currentItem = self.createImage(self.index);
+			}, false);
+			//关系按钮事件
+			self.closeButton.addEventListener(tapEventName, function(event) {
+				self.viewer.style.opacity = 0;
+				setTimeout(function() {
+					self.viewer.style.display = 'none';
+					self.disposeImage(true);
+				}, 600);
+				event.preventDefault();
+				event.cancelBubble = true;
+			}, false);
+			//处理左右按钮
+			self.leftButton.addEventListener(tapEventName, function() {
+				self.prev();
+			}, false);
+			self.rightButton.addEventListener(tapEventName, function() {
+				self.next();
+			}, false);
+			//处理划动
+			self.mask.addEventListener($.EVENT_MOVE, function(event) {
+				event.preventDefault();
+				event.cancelBubble = true;
+			}, false);
+			self.viewer.addEventListener('swipeleft', function(event) {
+				if (self.scaleValue == 1) self.next();
+				event.preventDefault();
+				event.cancelBubble = true;
+			}, false);
+			self.viewer.addEventListener('swiperight', function(event) {
+				if (self.scaleValue == 1) self.prev();
+				event.preventDefault();
+				event.cancelBubble = true;
+			}, false);
+			//处理缩放开始
+			self.viewer.addEventListener($.EVENT_START, function(event) {
+				var touches = event.touches;
+				if (touches.length == 2) {
+					var p1 = touches[0];
+					var p2 = touches[1];
+					var x = p1.pageX - p2.pageX; //x1-x2
+					var y = p1.pageY - p2.pageY; //y1-y2
+					self.scaleStart = Math.sqrt(x * x + y * y);
+					self.isMultiTouch = true;
+				} else if (touches.length = 1) {
+					self.dragStart = touches[0];
+				}
+			}, false);
+			self.viewer.addEventListener($.EVENT_MOVE, function(event) {
+				var img = self.currentItem.querySelector('img');
+				var touches = event.changedTouches;
+				if (touches.length == 2) {
+					event.preventDefault();
+					event.cancelBubble = true;
+					var p1 = touches[0];
+					var p2 = touches[1];
+					var x = p1.pageX - p2.pageX;
+					var y = p1.pageY - p2.pageY;
+					self.scaleEnd = Math.sqrt(x * x + y * y);
+					self._scaleValue = (self.scaleValue * (self.scaleEnd / self.scaleStart));
+					//self.state.innerText = self._scaleValue;
+					img.style.webkitTransform = "scale(" + self._scaleValue + "," + self._scaleValue + ") "; // + " translate(" + self.dragX || 0 + "px," + self.dragY || 0 + "px)";
+				} else if (!self.isMultiTouch && touches.length == 1 && self.scaleValue != 1) {
+					event.preventDefault();
+					event.cancelBubble = true;
+					self.dragEnd = touches[0];
+					self._dragX = self.dragX + (self.dragEnd.pageX - self.dragStart.pageX);
+					self._dragY = self.dragY + (self.dragEnd.pageY - self.dragStart.pageY);
+					img.style.marginLeft = self._dragX + 'px';
+					img.style.marginTop = self._dragY + 'px';
+					//img.style.transform = "translate(" + self._dragX + "px," + self._dragY + "px) " + " scale(" + self.scaleValue || 1 + "," + self.scaleValue || 1 + ")";
+				}
+			}, false);
+			self.viewer.addEventListener($.EVENT_END, function() {
+				self.scaleValue = self._scaleValue || self.scaleValue;
+				self._scaleValue = null;
+				self.dragX = self._dragX;
+				self.dragY = self._dragY;
+				self._dragX = null;
+				self._dragY = null;
+				var touches = event.touches;
+				self.isMultiTouch = (touches.length != 0);
+			});
+			// doubletap 好像不能用
+			self.viewer.addEventListener('doubletap', function() {
+				var img = self.currentItem.querySelector('img');
+				if (self.scaleValue === 1) {
+					self.scaleValue = 2;
+				} else {
+					self.scaleValue = 1;
+				}
+				self.dragX = 0;
+				self.dragY = 0;
+				img.style.marginLeft = self.dragX + 'px';
+				img.style.marginTop = self.dragY + 'px';
+				img.style.webkitTransform = "scale(" + self.scaleValue + "," + self.scaleValue + ") "; //+ " translate(" + self.dragX || 0 + "px," + self.dragY || 0 + "px)";
+				self.viewer.__tap_num = 0;
+			}, false);
+			//处理缩放结束
+		},
+		//下一张图片
+		next: function() {
+			var self = this;
+			self.mask.style.display = 'block';
+			self.index++;
+			var newItem = self.createImage(self.index, 'right');
+			setTimeout(function() {
+				self.currentItem.classList.remove('mui-imageviewer-item-center');
+				self.currentItem.classList.add('mui-imageviewer-item-left');
+				newItem.classList.remove('mui-imageviewer-item-right');
+				newItem.classList.add('mui-imageviewer-item-center');
+				self.oldItem = self.currentItem;
+				self.currentItem = newItem;
+				// TODO: 临时,稍候将调整
+				setTimeout(function() {
+					self.disposeImage();
+					self.mask.style.display = 'none';
+				}, 600);
+			}, 25);
+		},
+		//上一张图片
+		prev: function() {
+			var self = this;
+			self.mask.style.display = 'block';
+			self.index--;
+			var newItem = self.createImage(self.index, 'left');
+			setTimeout(function() {
+				self.currentItem.classList.remove('mui-imageviewer-item-center');
+				self.currentItem.classList.add('mui-imageviewer-item-right');
+				newItem.classList.remove('mui-imageviewer-item-left');
+				newItem.classList.add('mui-imageviewer-item-center');
+				self.oldItem = self.currentItem;
+				self.currentItem = newItem;
+				// TODO: 临时,稍候将调整
+				setTimeout(function() {
+					self.disposeImage();
+					self.mask.style.display = 'none';
+				}, 600);
+			}, 25);
+		},
+		//释放不显示的图片
+		disposeImage: function(all) {
+			var sel = '.mui-imageviewer-item-left,.mui-imageviewer-item-right';
+			if (all) sel += ",.mui-imageviewer-item";
+			var willdisposes = $(sel);
+			willdisposes.each(function(i, item) {
+				if (item.parentNode && item.parentNode.removeChild)
+					item.parentNode.removeChild(item, true);
+			});
+		},
+		//创建一个图片
+		createImage: function(index, type) {
+			var self = this;
+			type = type || 'center';
+			if (index < 0) index = self.images.length - 1;
+			if (index > self.images.length - 1) index = 0;
+			self.index = index;
+			var item = $.dom("<div class='mui-imageviewer-item'></div>")[0];
+			item.appendChild($.dom('<span><img src="' + self.images[self.index].src + '"/></span>')[0]);
+			item.classList.add('mui-imageviewer-item-' + type);
+			self.viewer.appendChild(item);
+			self.state.innerText = (self.index + 1) + "/" + self.images.length;
+			//重置初始缩放比例
+			self.scaleValue = 1;
+			self.dragX = 0;
+			self.dragY = 0;
+			return item;
+		}
+	});
+
+	$.imageViewer = function(selector, options) {
+		return new ImageViewer(selector, options);
+	};
+
+	$.ready(function() {
+		$.imageViewer('.' + imageClassName);
+	});
+
+}(mui, document));

+ 116 - 0
js/mui.lazyload.img.js

@@ -0,0 +1,116 @@
+(function($, window, document) {
+	var ImageLazyload = $.Lazyload.extend({
+		init: function(element, options) {
+			this._super(element, options);
+		},
+		_init: function() {
+			this.options.selector = '[data-lazyload]';
+			this._super();
+		},
+		_set: function(element, uri) {
+			if (element.tagName === 'IMG') {
+				element.src = uri;
+			} else {
+				element.style.backgroundImage = "url(" + uri + ")";
+			}
+		},
+		_hasPlaceholder: function(element) {
+			if (element.offsetWidth) {
+				if (element.tagName === 'IMG') {
+					return !!element.src;
+				} else {
+					return !!element.style.backgroundImage;
+				}
+			}
+			return false;
+		},
+		_addPlaceHolder: function(element) {
+			var self = this;
+			if (element.tagName === 'IMG') {
+				self._counter++;
+				element.onload = function() {
+					self._counter--;
+					self.addCallback(element, self.handle);
+					this.onload = null;
+				};
+				self.onPlaceHolder(function(placeholder) {
+					self._set(element, placeholder);
+				});
+			} else {
+				element.style.backgroundImage = "url(" + self.options.placeholder + ")";
+			}
+		},
+		addElement: function(element) {
+			var self = this;
+			var uri = element.getAttribute('data-lazyload');
+			if (uri) {
+				if (self._hasPlaceholder(element)) {
+					self.addCallback(element, self.handle);
+				} else {
+					self.onPlaceHolder = self._createLoader(function(callback) {
+						var img = new Image();
+						var placeholder = self.options.placeholder;
+						img.src = placeholder;
+						img.onload = img.onerror = function() {
+							callback(placeholder);
+						};
+					});
+					self._addPlaceHolder(element);
+				}
+				return true;
+			}
+			return false;
+		},
+		set: function(element, uri) {
+			var self = this;
+			var img = new Image();
+			img.onload = function() {
+				self._set(element, uri);
+				$.trigger(self.element, 'success', {
+					element: element,
+					uri: uri
+				});
+			};
+			img.onerror = function() {
+				$.trigger(self.element, 'error', {
+					element: element,
+					uri: uri
+				});
+			};
+			img.src = uri;
+			element.removeAttribute('data-lazyload'); //只尝试一次,后续可能支持多次尝试
+		},
+		handle: function(element, key) {
+			var uri = element.getAttribute('data-lazyload');
+			if (uri) {
+				this.set(element, uri);
+				//element.parentNode.parentNode.setAttribute('data-lazyload', 'true'); //debug
+			}
+		},
+		destroy: function() {
+			this._super();
+			this.element.removeAttribute('data-imageLazyload');
+		}
+
+	});
+	$.fn.imageLazyload = function(options) {
+		var lazyloadApis = [];
+		this.each(function() {
+			var self = this;
+			var lazyloadApi = null;
+			if (self === document || self === window) {
+				self = document.body;
+			}
+			var id = self.getAttribute('data-imageLazyload');
+			if (!id) {
+				id = ++$.uuid;
+				$.data[id] = lazyloadApi = new ImageLazyload(self, options);
+				self.setAttribute('data-imageLazyload', id);
+			} else {
+				lazyloadApi = $.data[id];
+			}
+			lazyloadApis.push(lazyloadApi);
+		});
+		return lazyloadApis.length === 1 ? lazyloadApis[0] : lazyloadApis;
+	}
+})(mui, window, document);

+ 327 - 0
js/mui.lazyload.js

@@ -0,0 +1,327 @@
+(function($, window, document) {
+	var mid = 0;
+	$.Lazyload = $.Class.extend({
+		init: function(element, options) {
+			var self = this;
+			this.container = this.element = element;
+			//			placeholder //默认图片
+			this.options = $.extend({
+				selector: '', //查询哪些元素需要lazyload
+				diff: false, //距离视窗底部多少像素出发lazyload
+				force: false, //强制加载(不论元素是否在是视窗内)
+				autoDestroy: true, //元素加载完后是否自动销毁当前插件对象
+				duration: 100 //滑动停止多久后开始加载
+			}, options);
+
+			this._key = 0;
+			this._containerIsNotDocument = this.container.nodeType !== 9;
+			this._callbacks = {};
+
+			this._init();
+		},
+		_init: function() {
+			this._initLoadFn();
+
+			this.addElements();
+
+			this._loadFn();
+
+			$.ready(function() {
+				this._loadFn();
+			}.bind(this));
+
+			this.resume();
+		},
+		_initLoadFn: function() {
+			var self = this;
+			self._loadFn = this._buffer(function() { // 加载延迟项
+				if(self.options.autoDestroy && self._counter == 0 && $.isEmptyObject(self._callbacks)) {
+					self.destroy();
+				}
+				self._loadItems();
+			}, self.options.duration, self);
+		},
+		/**
+		 *根据加载函数实现加载器
+		 *@param {Function} load 加载函数
+		 *@returns {Function} 加载器
+		 */
+		_createLoader: function(load) {
+			var value, loading, handles = [],
+				h;
+			return function(handle) {
+				if(!loading) {
+					loading = true;
+					load(function(v) {
+						value = v;
+						while(h = handles.shift()) {
+							try {
+								h && h.apply(null, [value]);
+							} catch(e) {
+								setTimeout(function() {
+									throw e;
+								}, 0)
+							}
+						}
+					})
+				}
+				if(value) {
+					handle && handle.apply(null, [value]);
+					return value;
+				}
+				handle && handles.push(handle);
+				return value;
+			}
+		},
+		_buffer: function(fn, ms, context) {
+			var timer;
+			var lastStart = 0;
+			var lastEnd = 0;
+			var ms = ms || 150;
+
+			function run() {
+				if(timer) {
+					timer.cancel();
+					timer = 0;
+				}
+				lastStart = $.now();
+				fn.apply(context || this, arguments);
+				lastEnd = $.now();
+			}
+
+			return $.extend(function() {
+				if(
+					(!lastStart) || // 从未运行过
+					(lastEnd >= lastStart && $.now() - lastEnd > ms) || // 上次运行成功后已经超过ms毫秒
+					(lastEnd < lastStart && $.now() - lastStart > ms * 8) // 上次运行或未完成,后8*ms毫秒
+				) {
+					run();
+				} else {
+					if(timer) {
+						timer.cancel();
+					}
+					timer = $.later(run, ms, null, arguments);
+				}
+			}, {
+				stop: function() {
+					if(timer) {
+						timer.cancel();
+						timer = 0;
+					}
+				}
+			});
+		},
+		_getBoundingRect: function(c) {
+			var vh, vw, left, top;
+
+			if(c !== undefined) {
+				vh = c.offsetHeight;
+				vw = c.offsetWidth;
+				var offset = $.offset(c);
+				left = offset.left;
+				top = offset.top;
+			} else {
+				vh = window.innerHeight;
+				vw = window.innerWidth;
+				left = 0;
+				top = window.pageYOffset;
+			}
+
+			var diff = this.options.diff;
+
+			var diffX = diff === false ? vw : diff;
+			var diffX0 = 0;
+			var diffX1 = diffX;
+
+			var diffY = diff === false ? vh : diff;
+			var diffY0 = 0;
+			var diffY1 = diffY;
+
+			var right = left + vw;
+			var bottom = top + vh;
+
+			left -= diffX0;
+			right += diffX1;
+			top -= diffY0;
+			bottom += diffY1;
+			return {
+				left: left,
+				top: top,
+				right: right,
+				bottom: bottom
+			};
+		},
+		_cacheWidth: function(el) {
+			if(el._mui_lazy_width) {
+				return el._mui_lazy_width;
+			}
+			return el._mui_lazy_width = el.offsetWidth;
+		},
+		_cacheHeight: function(el) {
+			if(el._mui_lazy_height) {
+				return el._mui_lazy_height;
+			}
+			return el._mui_lazy_height = el.offsetHeight;
+		},
+		_isCross: function(r1, r2) {
+			var r = {};
+			r.top = Math.max(r1.top, r2.top);
+			r.bottom = Math.min(r1.bottom, r2.bottom);
+			r.left = Math.max(r1.left, r2.left);
+			r.right = Math.min(r1.right, r2.right);
+			return r.bottom >= r.top && r.right >= r.left;
+		},
+		_elementInViewport: function(elem, windowRegion, containerRegion) {
+			// display none or inside display none
+			if(!elem.offsetWidth) {
+				return false;
+			}
+			var elemOffset = $.offset(elem);
+			var inContainer = true;
+			var inWin;
+			var left = elemOffset.left;
+			var top = elemOffset.top;
+			var elemRegion = {
+				left: left,
+				top: top,
+				right: left + this._cacheWidth(elem),
+				bottom: top + this._cacheHeight(elem)
+			};
+
+			inWin = this._isCross(windowRegion, elemRegion);
+
+			if(inWin && containerRegion) {
+				inContainer = this._isCross(containerRegion, elemRegion);
+			}
+			// 确保在容器内出现
+			// 并且在视窗内也出现
+			return inContainer && inWin;
+		},
+		_loadItems: function() {
+			var self = this;
+			// container is display none
+			if(self._containerIsNotDocument && !self.container.offsetWidth) {
+				return;
+			}
+			self._windowRegion = self._getBoundingRect();
+
+			if(self._containerIsNotDocument) {
+				self._containerRegion = self._getBoundingRect(this.container);
+			}
+			$.each(self._callbacks, function(key, callback) {
+				callback && self._loadItem(key, callback);
+			});
+		},
+		_loadItem: function(key, callback) {
+			var self = this;
+			callback = callback || self._callbacks[key];
+			if(!callback) {
+				return true;
+			}
+			var el = callback.el;
+			var remove = false;
+			var fn = callback.fn;
+			if(self.options.force || self._elementInViewport(el, self._windowRegion, self._containerRegion)) {
+				try {
+					remove = fn.call(self, el, key);
+				} catch(e) {
+					setTimeout(function() {
+						throw e;
+					}, 0);
+				}
+			}
+			if(remove !== false) {
+				delete self._callbacks[key];
+			}
+			return remove;
+		},
+		addCallback: function(el, fn) {
+			var self = this;
+			var callbacks = self._callbacks;
+			var callback = {
+				el: el,
+				fn: fn || $.noop
+			};
+			var key = ++this._key;
+			callbacks[key] = callback;
+
+			// add 立即检测,防止首屏元素问题
+			if(self._windowRegion) {
+				self._loadItem(key, callback);
+			} else {
+				self.refresh();
+			}
+		},
+		addElements: function(elements) {
+			var self = this;
+			self._counter = self._counter || 0;
+			var lazyloads = [];
+			if(!elements && self.options.selector) {
+				lazyloads = self.container.querySelectorAll(self.options.selector);
+			} else {
+				$.each(elements, function(index, el) {
+					lazyloads = lazyloads.concat($.qsa(self.options.selector, el));
+				});
+			}
+			//addElements时,自动初始化一次
+			if(self._containerIsNotDocument) {
+				self._containerRegion = self._getBoundingRect(self.container);
+			}
+			$.each(lazyloads, function(index, el) {
+				if(!el.getAttribute('data-lazyload-id')) {
+					if(self.addElement(el)) {
+						el.setAttribute('data-lazyload-id', mid++);
+						self.addCallback(el, self.handle);
+					}
+				}
+			});
+		},
+		addElement: function(el) {
+			return true;
+		},
+		handle: function() {
+			//throw new Error('需子类实现');
+		},
+		refresh: function(check) {
+			if(check) { //检查新的lazyload
+				this.addElements();
+			}
+			this._loadFn();
+		},
+		pause: function() {
+			var load = this._loadFn;
+			if(this._destroyed) {
+				return;
+			}
+			window.removeEventListener('scroll', load);
+			window.removeEventListener($.EVENT_MOVE, load);
+			window.removeEventListener('resize', load);
+			if(this._containerIsNotDocument) {
+				this.container.removeEventListener('scrollend', load);
+				this.container.removeEventListener('scroll', load);
+				this.container.removeEventListener($.EVENT_MOVE, load);
+			}
+		},
+		resume: function() {
+			var load = this._loadFn;
+			if(this._destroyed) {
+				return;
+			}
+			window.addEventListener('scroll', load, false);
+			window.addEventListener($.EVENT_MOVE, load, false);
+			window.addEventListener('resize', load, false);
+			if(this._containerIsNotDocument) {
+				this.container.addEventListener('scrollend', load, false);
+				this.container.addEventListener('scroll', load, false);
+				this.container.addEventListener($.EVENT_MOVE, load, false);
+			}
+		},
+		destroy: function() {
+			var self = this;
+			self.pause();
+			self._callbacks = {};
+			$.trigger(this.container, 'destroy', self);
+			self._destroyed = 1;
+		}
+	});
+})(mui, window, document);

File diff suppressed because it is too large
+ 9 - 0
js/mui.min.js


+ 389 - 0
js/mui.picker.js

@@ -0,0 +1,389 @@
+/**
+ * 选择列表插件
+ * varstion 2.0.0
+ * by Houfeng
+ * Houfeng@DCloud.io
+ */
+
+(function($, window, document, undefined) {
+
+	var MAX_EXCEED = 30;
+	var VISIBLE_RANGE = 90;
+	var DEFAULT_ITEM_HEIGHT = 40;
+	var BLUR_WIDTH = 10;
+
+	var rad2deg = $.rad2deg = function(rad) {
+		return rad / (Math.PI / 180);
+	};
+
+	var deg2rad = $.deg2rad = function(deg) {
+		return deg * (Math.PI / 180);
+	};
+
+	var platform = navigator.platform.toLowerCase();
+	var userAgent = navigator.userAgent.toLowerCase();
+	var isIos = (userAgent.indexOf('iphone') > -1 ||
+			userAgent.indexOf('ipad') > -1 ||
+			userAgent.indexOf('ipod') > -1) &&
+		(platform.indexOf('iphone') > -1 ||
+			platform.indexOf('ipad') > -1 ||
+			platform.indexOf('ipod') > -1);
+	//alert(isIos);
+
+	var Picker = $.Picker = function(holder, options) {
+		var self = this;
+		self.holder = holder;
+		self.options = options || {};
+		self.init();
+		self.initInertiaParams();
+		self.calcElementItemPostion(true);
+		self.bindEvent();
+	};
+
+	Picker.prototype.findElementItems = function() {
+		var self = this;
+		self.elementItems = [].slice.call(self.holder.querySelectorAll('li'));
+		return self.elementItems;
+	};
+
+	Picker.prototype.init = function() {
+		var self = this;
+		self.list = self.holder.querySelector('ul');
+		self.findElementItems();
+		self.height = self.holder.offsetHeight;
+		self.r = self.height / 2 - BLUR_WIDTH;
+		self.d = self.r * 2;
+		self.itemHeight = self.elementItems.length > 0 ? self.elementItems[0].offsetHeight : DEFAULT_ITEM_HEIGHT;
+		self.itemAngle = parseInt(self.calcAngle(self.itemHeight * 0.8));
+		self.hightlightRange = self.itemAngle / 2;
+		self.visibleRange = VISIBLE_RANGE;
+		self.beginAngle = 0;
+		self.beginExceed = self.beginAngle - MAX_EXCEED;
+		self.list.angle = self.beginAngle;
+		if (isIos) {
+			self.list.style.webkitTransformOrigin = "center center " + self.r + "px";
+		}
+	};
+
+	Picker.prototype.calcElementItemPostion = function(andGenerateItms) {
+		var self = this;
+		if (andGenerateItms) {
+			self.items = [];
+		}
+		self.elementItems.forEach(function(item) {
+			var index = self.elementItems.indexOf(item);
+			self.endAngle = self.itemAngle * index;
+			item.angle = self.endAngle;
+			item.style.webkitTransformOrigin = "center center -" + self.r + "px";
+			item.style.webkitTransform = "translateZ(" + self.r + "px) rotateX(" + (-self.endAngle) + "deg)";
+			if (andGenerateItms) {
+				var dataItem = {};
+				dataItem.text = item.innerHTML || '';
+				dataItem.value = item.getAttribute('data-value') || dataItem.text;
+				self.items.push(dataItem);
+			}
+		});
+		self.endExceed = self.endAngle + MAX_EXCEED;
+		self.calcElementItemVisibility(self.beginAngle);
+	};
+
+	Picker.prototype.calcAngle = function(c) {
+		var self = this;
+		var a = b = parseFloat(self.r);
+		//直径的整倍数部分直接乘以 180
+		c = Math.abs(c); //只算角度不关心正否值
+		var intDeg = parseInt(c / self.d) * 180;
+		c = c % self.d;
+		//余弦
+		var cosC = (a * a + b * b - c * c) / (2 * a * b);
+		var angleC = intDeg + rad2deg(Math.acos(cosC));
+		return angleC;
+	};
+
+	Picker.prototype.calcElementItemVisibility = function(angle) {
+		var self = this;
+		self.elementItems.forEach(function(item) {
+			var difference = Math.abs(item.angle - angle);
+			if (difference < self.hightlightRange) {
+				item.classList.add('highlight');
+			} else if (difference < self.visibleRange) {
+				item.classList.add('visible');
+				item.classList.remove('highlight');
+			} else {
+				item.classList.remove('highlight');
+				item.classList.remove('visible');
+			}
+		});
+	};
+
+	Picker.prototype.setAngle = function(angle) {
+		var self = this;
+		self.list.angle = angle;
+		self.list.style.webkitTransform = "perspective(1000px) rotateY(0deg) rotateX(" + angle + "deg)";
+		self.calcElementItemVisibility(angle);
+	};
+
+	Picker.prototype.bindEvent = function() {
+		var self = this;
+		var lastAngle = 0;
+		var startY = null;
+		var isPicking = false;
+		self.holder.addEventListener($.EVENT_START, function(event) {
+			isPicking = true;
+			event.preventDefault();
+			self.list.style.webkitTransition = '';
+			startY = (event.changedTouches ? event.changedTouches[0] : event).pageY;
+			lastAngle = self.list.angle;
+			self.updateInertiaParams(event, true);
+		}, false);
+		self.holder.addEventListener($.EVENT_END, function(event) {
+			isPicking = false;
+			event.preventDefault();
+			self.startInertiaScroll(event);
+		}, false);
+		self.holder.addEventListener($.EVENT_CANCEL, function(event) {
+			isPicking = false;
+			event.preventDefault();
+			self.startInertiaScroll(event);
+		}, false);
+		self.holder.addEventListener($.EVENT_MOVE, function(event) {
+			if (!isPicking) {
+				return;
+			}
+			event.preventDefault();
+			var endY = (event.changedTouches ? event.changedTouches[0] : event).pageY;
+			var dragRange = endY - startY;
+			var dragAngle = self.calcAngle(dragRange);
+			var newAngle = dragRange > 0 ? lastAngle - dragAngle : lastAngle + dragAngle;
+			if (newAngle > self.endExceed) {
+				newAngle = self.endExceed
+			}
+			if (newAngle < self.beginExceed) {
+				newAngle = self.beginExceed
+			}
+			self.setAngle(newAngle);
+			self.updateInertiaParams(event);
+		}, false);
+		//--
+		self.list.addEventListener('tap', function(event) {
+			elementItem = event.target;
+			if (elementItem.tagName == 'LI') {
+				self.setSelectedIndex(self.elementItems.indexOf(elementItem), 200);
+			}
+		}, false);
+	};
+
+	Picker.prototype.initInertiaParams = function() {
+		var self = this;
+		self.lastMoveTime = 0;
+		self.lastMoveStart = 0;
+		self.stopInertiaMove = false;
+	};
+
+	Picker.prototype.updateInertiaParams = function(event, isStart) {
+		var self = this;
+		var point = event.changedTouches ? event.changedTouches[0] : event;
+		if (isStart) {
+			self.lastMoveStart = point.pageY;
+			self.lastMoveTime = event.timeStamp || Date.now();
+			self.startAngle = self.list.angle;
+		} else {
+			var nowTime = event.timeStamp || Date.now();
+			if (nowTime - self.lastMoveTime > 300) {
+				self.lastMoveTime = nowTime;
+				self.lastMoveStart = point.pageY;
+			}
+		}
+		self.stopInertiaMove = true;
+	};
+
+	Picker.prototype.startInertiaScroll = function(event) {
+		var self = this;
+		var point = event.changedTouches ? event.changedTouches[0] : event;
+		/** 
+		 * 缓动代码
+		 */
+		var nowTime = event.timeStamp || Date.now();
+		var v = (point.pageY - self.lastMoveStart) / (nowTime - self.lastMoveTime); //最后一段时间手指划动速度  
+		var dir = v > 0 ? -1 : 1; //加速度方向  
+		var deceleration = dir * 0.0006 * -1;
+		var duration = Math.abs(v / deceleration); // 速度消减至0所需时间  
+		var dist = v * duration / 2; //最终移动多少 
+		var startAngle = self.list.angle;
+		var distAngle = self.calcAngle(dist) * dir;
+		//----
+		var srcDistAngle = distAngle;
+		if (startAngle + distAngle < self.beginExceed) {
+			distAngle = self.beginExceed - startAngle;
+			duration = duration * (distAngle / srcDistAngle) * 0.6;
+		}
+		if (startAngle + distAngle > self.endExceed) {
+			distAngle = self.endExceed - startAngle;
+			duration = duration * (distAngle / srcDistAngle) * 0.6;
+		}
+		//----
+		if (distAngle == 0) {
+			self.endScroll();
+			return;
+		}
+		self.scrollDistAngle(nowTime, startAngle, distAngle, duration);
+	};
+
+	Picker.prototype.scrollDistAngle = function(nowTime, startAngle, distAngle, duration) {
+		var self = this;
+		self.stopInertiaMove = false;
+		(function(nowTime, startAngle, distAngle, duration) {
+			var frameInterval = 13;
+			var stepCount = duration / frameInterval;
+			var stepIndex = 0;
+			(function inertiaMove() {
+				if (self.stopInertiaMove) return;
+				var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);
+				self.setAngle(newAngle);
+				stepIndex++;
+				if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {
+					self.endScroll();
+					return;
+				}
+				setTimeout(inertiaMove, frameInterval);
+			})();
+		})(nowTime, startAngle, distAngle, duration);
+	};
+
+	Picker.prototype.quartEaseOut = function(t, b, c, d) {
+		return -c * ((t = t / d - 1) * t * t * t - 1) + b;
+	};
+
+	Picker.prototype.endScroll = function() {
+		var self = this;
+		if (self.list.angle < self.beginAngle) {
+			self.list.style.webkitTransition = "150ms ease-out";
+			self.setAngle(self.beginAngle);
+		} else if (self.list.angle > self.endAngle) {
+			self.list.style.webkitTransition = "150ms ease-out";
+			self.setAngle(self.endAngle);
+		} else {
+			var index = parseInt((self.list.angle / self.itemAngle).toFixed(0));
+			self.list.style.webkitTransition = "100ms ease-out";
+			self.setAngle(self.itemAngle * index);
+		}
+		self.triggerChange();
+	};
+
+	Picker.prototype.triggerChange = function(force) {
+		var self = this;
+		setTimeout(function() {
+			var index = self.getSelectedIndex();
+			var item = self.items[index];
+			if ($.trigger && (index != self.lastIndex || force === true)) {
+				$.trigger(self.holder, 'change', {
+					"index": index,
+					"item": item
+				});
+				//console.log('change:' + index);
+			}
+			self.lastIndex = index;
+			typeof force === 'function' && force();
+		}, 0);
+	};
+
+	Picker.prototype.correctAngle = function(angle) {
+		var self = this;
+		if (angle < self.beginAngle) {
+			return self.beginAngle;
+		} else if (angle > self.endAngle) {
+			return self.endAngle;
+		} else {
+			return angle;
+		}
+	};
+
+	Picker.prototype.setItems = function(items) {
+		var self = this;
+		self.items = items || [];
+		var buffer = [];
+		self.items.forEach(function(item) {
+			if (item !== null && item !== undefined) {
+				buffer.push('<li>' + (item.text || item) + '</li>');
+			}
+		});
+		self.list.innerHTML = buffer.join('');
+		self.findElementItems();
+		self.calcElementItemPostion();
+		self.setAngle(self.correctAngle(self.list.angle));
+		self.triggerChange(true);
+	};
+
+	Picker.prototype.getItems = function() {
+		var self = this;
+		return self.items;
+	};
+
+	Picker.prototype.getSelectedIndex = function() {
+		var self = this;
+		return parseInt((self.list.angle / self.itemAngle).toFixed(0));
+	};
+
+	Picker.prototype.setSelectedIndex = function(index, duration, callback) {
+		var self = this;
+		self.list.style.webkitTransition = '';
+		var angle = self.correctAngle(self.itemAngle * index);
+		if (duration && duration > 0) {
+			var distAngle = angle - self.list.angle;
+			self.scrollDistAngle(Date.now(), self.list.angle, distAngle, duration);
+		} else {
+			self.setAngle(angle);
+		}
+		self.triggerChange(callback);
+	};
+
+	Picker.prototype.getSelectedItem = function() {
+		var self = this;
+		return self.items[self.getSelectedIndex()];
+	};
+
+	Picker.prototype.getSelectedValue = function() {
+		var self = this;
+		return (self.items[self.getSelectedIndex()] || {}).value;
+	};
+
+	Picker.prototype.getSelectedText = function() {
+		var self = this;
+		return (self.items[self.getSelectedIndex()] || {}).text;
+	};
+
+	Picker.prototype.setSelectedValue = function(value, duration, callback) {
+		var self = this;
+		for (var index in self.items) {
+			var item = self.items[index];
+			if (item.value == value) {
+				self.setSelectedIndex(index, duration, callback);
+				return;
+			}
+		}
+	};
+
+	if ($.fn) {
+		$.fn.picker = function(options) {
+			//遍历选择的元素
+			this.each(function(i, element) {
+				if (element.picker) return;
+				if (options) {
+					element.picker = new Picker(element, options);
+				} else {
+					var optionsText = element.getAttribute('data-picker-options');
+					var _options = optionsText ? JSON.parse(optionsText) : {};
+					element.picker = new Picker(element, _options);
+				}
+			});
+			return this[0] ? this[0].picker : null;
+		};
+
+		//自动初始化
+		$.ready(function() {
+			$('.mui-picker').picker();
+		});
+	}
+
+})(window.mui || window, window, document, undefined);
+//end

File diff suppressed because it is too large
+ 7 - 0
js/mui.picker.min.js


+ 160 - 0
js/mui.poppicker.js

@@ -0,0 +1,160 @@
+/**
+ * 弹出选择列表插件
+ * 此组件依赖 listpcker ,请在页面中先引入 mui.picker.css + mui.picker.js
+ * varstion 1.0.1
+ * by Houfeng
+ * Houfeng@DCloud.io
+ */
+
+(function($, document) {
+
+	//创建 DOM
+	$.dom = function(str) {
+		if (typeof(str) !== 'string') {
+			if ((str instanceof Array) || (str[0] && str.length)) {
+				return [].slice.call(str);
+			} else {
+				return [str];
+			}
+		}
+		if (!$.__create_dom_div__) {
+			$.__create_dom_div__ = document.createElement('div');
+		}
+		$.__create_dom_div__.innerHTML = str;
+		return [].slice.call($.__create_dom_div__.childNodes);
+	};
+
+	var panelBuffer = '<div class="mui-poppicker">\
+		<div class="mui-poppicker-header">\
+			<button class="mui-btn mui-poppicker-btn-cancel">取消</button>\
+			<button class="mui-btn mui-btn-blue mui-poppicker-btn-ok">确定</button>\
+			<div class="mui-poppicker-clear"></div>\
+		</div>\
+		<div class="mui-poppicker-body">\
+		</div>\
+	</div>';
+
+	var pickerBuffer = '<div class="mui-picker">\
+		<div class="mui-picker-inner">\
+			<div class="mui-pciker-rule mui-pciker-rule-ft"></div>\
+			<ul class="mui-pciker-list">\
+			</ul>\
+			<div class="mui-pciker-rule mui-pciker-rule-bg"></div>\
+		</div>\
+	</div>';
+
+	//定义弹出选择器类
+	var PopPicker = $.PopPicker = $.Class.extend({
+		//构造函数
+		init: function(options) {
+			var self = this;
+			self.options = options || {};
+			self.options.buttons = self.options.buttons || ['取消', '确定'];
+			self.panel = $.dom(panelBuffer)[0];
+			document.body.appendChild(self.panel);
+			self.ok = self.panel.querySelector('.mui-poppicker-btn-ok');
+			self.cancel = self.panel.querySelector('.mui-poppicker-btn-cancel');
+			self.body = self.panel.querySelector('.mui-poppicker-body');
+			self.mask = $.createMask();
+			self.cancel.innerText = self.options.buttons[0];
+			self.ok.innerText = self.options.buttons[1];
+			self.cancel.addEventListener('tap', function(event) {
+				self.hide();
+			}, false);
+			self.ok.addEventListener('tap', function(event) {
+				if (self.callback) {
+					var rs = self.callback(self.getSelectedItems());
+					if (rs !== false) {
+						self.hide();
+					}
+				}
+			}, false);
+			self.mask[0].addEventListener('tap', function() {
+				self.hide();
+			}, false);
+			self._createPicker();
+			//防止滚动穿透
+			self.panel.addEventListener($.EVENT_START, function(event) {
+				event.preventDefault();
+			}, false);
+			self.panel.addEventListener($.EVENT_MOVE, function(event) {
+				event.preventDefault();
+			}, false);
+		},
+		_createPicker: function() {
+			var self = this;
+			var layer = self.options.layer || 1;
+			var width = (100 / layer) + '%';
+			self.pickers = [];
+			for (var i = 1; i <= layer; i++) {
+				var pickerElement = $.dom(pickerBuffer)[0];
+				pickerElement.style.width = width;
+				self.body.appendChild(pickerElement);
+				var picker = $(pickerElement).picker();
+				self.pickers.push(picker);
+				pickerElement.addEventListener('change', function(event) {
+					var nextPickerElement = this.nextSibling;
+					if (nextPickerElement && nextPickerElement.picker) {
+						var eventData = event.detail || {};
+						var preItem = eventData.item || {};
+						nextPickerElement.picker.setItems(preItem.children);
+					}
+				}, false);
+			}
+		},
+		//填充数据
+		setData: function(data) {
+			var self = this;
+			data = data || [];
+			self.pickers[0].setItems(data);
+		},
+		//获取选中的项(数组)
+		getSelectedItems: function() {
+			var self = this;
+			var items = [];
+			for (var i in self.pickers) {    
+				if(self.pickers.hasOwnProperty(i)) { // 修复for in会访问继承属性造成items报错情况
+					var picker = self.pickers[i];
+					items.push(picker.getSelectedItem() || {});
+				}
+			}
+			return items;
+		},
+		//显示
+		show: function(callback) {
+			var self = this;
+			self.callback = callback;
+			self.mask.show();
+			document.body.classList.add($.className('poppicker-active-for-page'));
+			self.panel.classList.add($.className('active'));
+			//处理物理返回键
+			self.__back = $.back;
+			$.back = function() {
+				self.hide();
+			};
+		},
+		//隐藏
+		hide: function() {
+			var self = this;
+			if (self.disposed) return;
+			self.panel.classList.remove($.className('active'));
+			self.mask.close();
+			document.body.classList.remove($.className('poppicker-active-for-page'));
+			//处理物理返回键
+			$.back=self.__back;
+		},
+		dispose: function() {
+			var self = this;
+			self.hide();
+			setTimeout(function() {
+				self.panel.parentNode.removeChild(self.panel);
+				for (var name in self) {
+					self[name] = null;
+					delete self[name];
+				};
+				self.disposed = true;
+			}, 300);
+		}
+	});
+
+})(mui, document);

+ 382 - 0
js/mui.previewimage.js

@@ -0,0 +1,382 @@
+(function($, window) {
+
+	var template = '<div id="{{id}}" class="mui-slider mui-preview-image mui-fullscreen"><div class="mui-preview-header">{{header}}</div><div class="mui-slider-group"></div><div class="mui-preview-footer mui-hidden">{{footer}}</div><div class="mui-preview-loading"><span class="mui-spinner mui-spinner-white"></span></div></div>';
+	var itemTemplate = '<div class="mui-slider-item mui-zoom-wrapper {{className}}"><div class="mui-zoom-scroller"><img src="{{src}}" data-preview-lazyload="{{lazyload}}" style="{{style}}" class="mui-zoom"></div></div>';
+	var defaultGroupName = '__DEFAULT';
+	var div = document.createElement('div');
+	var imgId = 0;
+	var PreviewImage = function(options) {
+		this.options = $.extend(true, {
+			id: '__MUI_PREVIEWIMAGE',
+			zoom: true,
+			header: '<span class="mui-preview-indicator"></span>',
+			footer: ''
+		}, options || {});
+		this.init();
+		this.initEvent();
+	};
+	var proto = PreviewImage.prototype;
+	proto.init = function() {
+		var options = this.options;
+		var el = document.getElementById(this.options.id);
+		if (!el) {
+			div.innerHTML = template.replace(/\{\{id\}\}/g, this.options.id).replace('{{header}}', options.header).replace('{{footer}}', options.footer);
+			document.body.appendChild(div.firstElementChild);
+			el = document.getElementById(this.options.id);
+		}
+
+		this.element = el;
+		this.scroller = this.element.querySelector($.classSelector('.slider-group'));
+		this.indicator = this.element.querySelector($.classSelector('.preview-indicator'));
+		this.loader = this.element.querySelector($.classSelector('.preview-loading'));
+		if (options.footer) {
+			this.element.querySelector($.classSelector('.preview-footer')).classList.remove($.className('hidden'));
+		}
+		this.addImages();
+	};
+	proto.initEvent = function() {
+		var self = this;
+		$(document.body).on('tap', 'img[data-preview-src]', function() {
+			self.open(this);
+			return false;
+		});
+		var laterClose = null;
+		var laterCloseEvent = function() {
+			!laterClose && (laterClose = $.later(function() {
+				self.loader.removeEventListener('tap', laterCloseEvent);
+				self.scroller.removeEventListener('tap', laterCloseEvent);
+				self.close();
+			}, 300));
+		};
+		this.scroller.addEventListener('doubletap', function() {
+			if (laterClose) {
+				laterClose.cancel();
+				laterClose = null;
+			}
+		});
+		this.element.addEventListener('webkitAnimationEnd', function() {
+			if (self.element.classList.contains($.className('preview-out'))) { //close
+				self.element.style.display = 'none';
+				self.element.classList.remove($.className('preview-out'));
+				self.element.classList.remove($.className('preview-in'));
+				laterClose = null;
+			} else { //open
+				self.loader.addEventListener('tap', laterCloseEvent);
+				self.scroller.addEventListener('tap', laterCloseEvent);
+			}
+		});
+		this.element.addEventListener('slide', function(e) {
+			if (self.options.zoom) {
+				var lastZoomerEl = self.element.querySelector('.mui-zoom-wrapper:nth-child(' + (self.lastIndex + 1) + ')');
+				if (lastZoomerEl) {
+					$(lastZoomerEl).zoom().setZoom(1);
+				}
+			}
+			var slideNumber = e.detail.slideNumber;
+			self.lastIndex = slideNumber;
+			self.indicator && (self.indicator.innerText = (slideNumber + 1) + '/' + self.currentGroup.length);
+			self._loadItem(slideNumber);
+
+		});
+	};
+	proto.addImages = function(group, index) {
+		this.groups = {};
+		var imgs = [];
+		if (group) {
+			if (group === defaultGroupName) {
+				imgs = document.querySelectorAll("img[data-preview-src]:not([data-preview-group])");
+			} else {
+				imgs = document.querySelectorAll("img[data-preview-src][data-preview-group='" + group + "']");
+			}
+		} else {
+			imgs = document.querySelectorAll("img[data-preview-src]");
+		}
+		if (imgs.length) {
+			for (var i = 0, len = imgs.length; i < len; i++) {
+				this.addImage(imgs[i]);
+			}
+		}
+	};
+	proto.addImage = function(img) {
+		var group = img.getAttribute('data-preview-group');
+		group = group || defaultGroupName;
+		if (!this.groups[group]) {
+			this.groups[group] = [];
+		}
+		var src = img.getAttribute('src');
+		if (img.__mui_img_data && img.__mui_img_data.src === src) { //已缓存且图片未变化
+			this.groups[group].push(img.__mui_img_data);
+		} else {
+			var lazyload = img.getAttribute('data-preview-src');
+			if (!lazyload) {
+				lazyload = src;
+			}
+			var imgObj = {
+				src: src,
+				lazyload: src === lazyload ? '' : lazyload,
+				loaded: src === lazyload ? true : false,
+				sWidth: 0,
+				sHeight: 0,
+				sTop: 0,
+				sLeft: 0,
+				sScale: 1,
+				el: img
+			};
+			this.groups[group].push(imgObj);
+			img.__mui_img_data = imgObj;
+		}
+	};
+
+
+	proto.empty = function() {
+		this.scroller.innerHTML = '';
+	};
+	proto._initImgData = function(itemData, imgEl) {
+		if (!itemData.sWidth) {
+			var img = itemData.el;
+			itemData.sWidth = img.offsetWidth;
+			itemData.sHeight = img.offsetHeight;
+			var offset = $.offset(img);
+			itemData.sTop = offset.top;
+			itemData.sLeft = offset.left;
+			itemData.sScale = Math.max(itemData.sWidth / window.innerWidth, itemData.sHeight / window.innerHeight);
+		}
+		imgEl.style.webkitTransform = 'translate3d(0,0,0) scale(' + itemData.sScale + ')';
+	};
+
+	proto._getScale = function(from, to) {
+		var scaleX = from.width / to.width;
+		var scaleY = from.height / to.height;
+		var scale = 1;
+		if (scaleX <= scaleY) {
+			scale = from.height / (to.height * scaleX);
+		} else {
+			scale = from.width / (to.width * scaleY);
+		}
+		return scale;
+	};
+	proto._imgTransitionEnd = function(e) {
+		var img = e.target;
+		img.classList.remove($.className('transitioning'));
+		img.removeEventListener('webkitTransitionEnd', this._imgTransitionEnd.bind(this));
+	};
+	proto._loadItem = function(index, isOpening) { //TODO 暂时仅支持img
+		var itemEl = this.scroller.querySelector($.classSelector('.slider-item:nth-child(' + (index + 1) + ')'));
+		var itemData = this.currentGroup[index];
+		var imgEl = itemEl.querySelector('img');
+		this._initImgData(itemData, imgEl);
+		if (isOpening) {
+			var posi = this._getPosition(itemData);
+			imgEl.style.webkitTransitionDuration = '0ms';
+			imgEl.style.webkitTransform = 'translate3d(' + posi.x + 'px,' + posi.y + 'px,0) scale(' + itemData.sScale + ')';
+			imgEl.offsetHeight;
+		}
+		if (!itemData.loaded && imgEl.getAttribute('data-preview-lazyload')) {
+			var self = this;
+			self.loader.classList.add($.className('active'));
+			//移动位置动画
+			imgEl.style.webkitTransitionDuration = '0.5s';
+			imgEl.addEventListener('webkitTransitionEnd', self._imgTransitionEnd.bind(self));
+			imgEl.style.webkitTransform = 'translate3d(0,0,0) scale(' + itemData.sScale + ')';
+			this.loadImage(imgEl, function() {
+				itemData.loaded = true;
+				imgEl.src = itemData.lazyload;
+				self._initZoom(itemEl, this.width, this.height);
+				imgEl.classList.add($.className('transitioning'));
+				imgEl.addEventListener('webkitTransitionEnd', self._imgTransitionEnd.bind(self));
+				imgEl.setAttribute('style', '');
+				imgEl.offsetHeight;
+				self.loader.classList.remove($.className('active'));
+			});
+		} else {
+			itemData.lazyload && (imgEl.src = itemData.lazyload);
+			this._initZoom(itemEl, imgEl.width, imgEl.height);
+			imgEl.classList.add($.className('transitioning'));
+			imgEl.addEventListener('webkitTransitionEnd', this._imgTransitionEnd.bind(this));
+			imgEl.setAttribute('style', '');
+			imgEl.offsetHeight;
+		}
+		this._preloadItem(index + 1);
+		this._preloadItem(index - 1);
+	};
+	proto._preloadItem = function(index) {
+		var itemEl = this.scroller.querySelector($.classSelector('.slider-item:nth-child(' + (index + 1) + ')'));
+		if (itemEl) {
+			var itemData = this.currentGroup[index];
+			if (!itemData.sWidth) {
+				var imgEl = itemEl.querySelector('img');
+				this._initImgData(itemData, imgEl);
+			}
+		}
+	};
+	proto._initZoom = function(zoomWrapperEl, zoomerWidth, zoomerHeight) {
+		if (!this.options.zoom) {
+			return;
+		}
+		if (zoomWrapperEl.getAttribute('data-zoomer')) {
+			return;
+		}
+		var zoomEl = zoomWrapperEl.querySelector($.classSelector('.zoom'));
+		if (zoomEl.tagName === 'IMG') {
+			var self = this;
+			var maxZoom = self._getScale({
+				width: zoomWrapperEl.offsetWidth,
+				height: zoomWrapperEl.offsetHeight
+			}, {
+				width: zoomerWidth,
+				height: zoomerHeight
+			});
+			$(zoomWrapperEl).zoom({
+				maxZoom: Math.max(maxZoom, 1)
+			});
+		} else {
+			$(zoomWrapperEl).zoom();
+		}
+	};
+	proto.loadImage = function(imgEl, callback) {
+		var onReady = function() {
+			callback && callback.call(this);
+		};
+		var img = new Image();
+		img.onload = onReady;
+		img.onerror = onReady;
+		img.src = imgEl.getAttribute('data-preview-lazyload');
+	};
+	proto.getRangeByIndex = function(index, length) {
+		return {
+			from: 0,
+			to: length - 1
+		};
+		//		var from = Math.max(index - 1, 0);
+		//		var to = Math.min(index + 1, length);
+		//		if (index === length - 1) {
+		//			from = Math.max(length - 3, 0);
+		//			to = length - 1;
+		//		}
+		//		if (index === 0) {
+		//			from = 0;
+		//			to = Math.min(2, length - 1);
+		//		}
+		//		return {
+		//			from: from,
+		//			to: to
+		//		};
+	};
+
+	proto._getPosition = function(itemData) {
+		var sLeft = itemData.sLeft - window.pageXOffset;
+		var sTop = itemData.sTop - window.pageYOffset;
+		var left = (window.innerWidth - itemData.sWidth) / 2;
+		var top = (window.innerHeight - itemData.sHeight) / 2;
+		return {
+			left: sLeft,
+			top: sTop,
+			x: sLeft - left,
+			y: sTop - top
+		};
+	};
+	proto.refresh = function(index, groupArray) {
+		this.currentGroup = groupArray;
+		//重新生成slider
+		var length = groupArray.length;
+		var itemHtml = [];
+		var currentRange = this.getRangeByIndex(index, length);
+		var from = currentRange.from;
+		var to = currentRange.to + 1;
+		var currentIndex = index;
+		var className = '';
+		var itemStr = '';
+		var wWidth = window.innerWidth;
+		var wHeight = window.innerHeight;
+		for (var i = 0; from < to; from++, i++) {
+			var itemData = groupArray[from];
+			var style = '';
+			if (itemData.sWidth) {
+				style = '-webkit-transform:translate3d(0,0,0) scale(' + itemData.sScale + ');transform:translate3d(0,0,0) scale(' + itemData.sScale + ')';
+			}
+			itemStr = itemTemplate.replace('{{src}}', itemData.src).replace('{{lazyload}}', itemData.lazyload).replace('{{style}}', style);
+			if (from === index) {
+				currentIndex = i;
+				className = $.className('active');
+			} else {
+				className = '';
+			}
+			itemHtml.push(itemStr.replace('{{className}}', className));
+		}
+		this.scroller.innerHTML = itemHtml.join('');
+		this.element.style.display = 'block';
+		this.element.classList.add($.className('preview-in'));
+		this.lastIndex = currentIndex;
+		this.element.offsetHeight;
+		$(this.element).slider().gotoItem(currentIndex, 0);
+		this.indicator && (this.indicator.innerText = (currentIndex + 1) + '/' + this.currentGroup.length);
+		this._loadItem(currentIndex, true);
+	};
+	proto.openByGroup = function(index, group) {
+		index = Math.min(Math.max(0, index), this.groups[group].length - 1);
+		this.refresh(index, this.groups[group]);
+	};
+	proto.open = function(index, group) {
+		if (this.isShown()) {
+			return;
+		}
+		if (typeof index === "number") {
+			group = group || defaultGroupName;
+			this.addImages(group, index); //刷新当前group
+			this.openByGroup(index, group);
+		} else {
+			group = index.getAttribute('data-preview-group');
+			group = group || defaultGroupName;
+			this.addImages(group, index); //刷新当前group
+			this.openByGroup(this.groups[group].indexOf(index.__mui_img_data), group);
+		}
+	};
+	proto.close = function(index, group) {
+		if (!this.isShown()) {
+			return;
+		}
+		this.element.classList.remove($.className('preview-in'));
+		this.element.classList.add($.className('preview-out'));
+		var itemEl = this.scroller.querySelector($.classSelector('.slider-item:nth-child(' + (this.lastIndex + 1) + ')'));
+		var imgEl = itemEl.querySelector('img');
+		if (imgEl) {
+			imgEl.classList.add($.className('transitioning'));
+			var itemData = this.currentGroup[this.lastIndex];
+			var posi = this._getPosition(itemData);
+			var sLeft = posi.left;
+			var sTop = posi.top;
+			if (sTop > window.innerHeight || sLeft > window.innerWidth || sTop < 0 || sLeft < 0) { //out viewport
+				imgEl.style.opacity = 0;
+				imgEl.style.webkitTransitionDuration = '0.5s';
+				imgEl.style.webkitTransform = 'scale(' + itemData.sScale + ')';
+			} else {
+				if (this.options.zoom) {
+					$(imgEl.parentNode.parentNode).zoom().toggleZoom(0);
+				}
+				imgEl.style.webkitTransitionDuration = '0.5s';
+				imgEl.style.webkitTransform = 'translate3d(' + posi.x + 'px,' + posi.y + 'px,0) scale(' + itemData.sScale + ')';
+			}
+		}
+		var zoomers = this.element.querySelectorAll($.classSelector('.zoom-wrapper'));
+		for (var i = 0, len = zoomers.length; i < len; i++) {
+			$(zoomers[i]).zoom().destroy();
+		}
+		$(this.element).slider().destroy();
+//		this.empty();
+	};
+	proto.isShown = function() {
+		return this.element.classList.contains($.className('preview-in'));
+	};
+
+	var previewImageApi = null;
+	$.previewImage = function(options) {
+		if (!previewImageApi) {
+			previewImageApi = new PreviewImage(options);
+		}
+		return previewImageApi;
+	};
+	$.getPreviewImage = function() {
+		return previewImageApi;
+	}
+
+})(mui, window);

+ 628 - 0
js/mui.view.js

@@ -0,0 +1,628 @@
+/**
+ * <div id="app" class="mui-views">
+	<div class="mui-view">
+		<div class="mui-navbar">
+		</div>
+		<div class="mui-pages">
+		</div>
+	</div>
+</div>
+ * @param {Object} $
+ * @param {Object} window
+ */
+(function($, window) {
+	var CLASS_LEFT = $.className('left');
+	var CLASS_CENTER = $.className('center');
+	var CLASS_RIGHT = $.className('right');
+	var CLASS_PAGE = $.className('page');
+	var CLASS_PAGE_LEFT = $.className('page-left');
+	var CLASS_PAGE_CENTER = $.className('page-center');
+	var CLASS_NAVBAR_LEFT = $.className('navbar-left');
+	var CLASS_NAVBAR_CENTER = $.className('navbar-center');
+	var CLASS_PAGE_SHADOW = $.className('page-shadow');
+
+	var CLASS_TRANSITIONING = $.className('transitioning');
+
+	var SELECTOR_LEFT = '.' + CLASS_LEFT;
+	var SELECTOR_CENTER = '.' + CLASS_CENTER;
+	var SELECTOR_RIGHT = '.' + CLASS_RIGHT;
+
+	var SELECTOR_ICON = $.classSelector('.icon');
+	var SELECTOR_NAVBAR = $.classSelector('.navbar');
+	var SELECTOR_NAVBAR_INNER = $.classSelector('.navbar-inner');
+	var SELECTOR_PAGES = $.classSelector('.pages');
+	var SELECTOR_BTN_NAV = $.classSelector('.btn-nav');
+	var SELECTOR_PAGE_LEFT = '.' + CLASS_PAGE_LEFT;
+	var SELECTOR_PAGE_CENTER = '.' + CLASS_PAGE_CENTER;
+	var SELECTOR_NAVBAR_LEFT = '.' + CLASS_NAVBAR_LEFT;
+	var SELECTOR_NAVBAR_CENTER = '.' + CLASS_NAVBAR_CENTER;
+
+	var View = $.Class.extend({
+		init: function(element, options) {
+			this.view = this.element = element;
+			this.options = $.extend({
+				animateNavbar: 'ios', //ios
+				swipeBackPageActiveArea: 30,
+				hardwareAccelerated: true
+			}, options);
+			this.navbars = this.view.querySelector(SELECTOR_NAVBAR);
+			this.pages = this.view.querySelector(SELECTOR_PAGES);
+
+			this.history = []; //history
+
+			this.maxScrollX = this.view.offsetWidth;
+			this.x = this.y = 0;
+			this.translateZ = this.options.hardwareAccelerated ? ' translateZ(0)' : '';
+			this.ratio = 0;
+			this.isBack = true;
+			this.moved = this.dragging = false;
+
+			this.activeNavbar = this.previousNavbar = null;
+			this.activePage = this.previousPage = null;
+
+			this._initPageEventMethod();
+
+			this._initDefaultPage();
+
+			this.navbars && this._initNavBar();
+
+			this.initEvent();
+		},
+		_initPageEventMethod: function() {
+			var self = this;
+			$.each(['onPageBeforeShow', 'onPageShow', 'onPageBeforeBack', 'onPageBack'], function(index, event) {
+				self[event + 'Callbacks'] = {};
+				self[event] = function(page, callback) {
+					var eventCallbacks = event + 'Callbacks';
+					if (!self[eventCallbacks].hasOwnProperty(page)) {
+						self[eventCallbacks][page] = [callback];
+					} else {
+						self[eventCallbacks][page].push(callback);
+					}
+				};
+			});
+		},
+		_initDefaultPage: function() {
+			var defaultPage = document.querySelector(this.options.defaultPage);
+			if (defaultPage) {
+				this._appendPage(defaultPage);
+			} else {
+				throw new Error('defaultPage[' + this.options.defaultPage + '] does not exist');
+			}
+		},
+		initEvent: function() {
+			this.view.addEventListener('click', this);
+			this.view.addEventListener('tap', this);
+			this.pages.addEventListener('drag', this);
+			this.pages.addEventListener('dragend', this);
+			this.pages.addEventListener('webkitTransitionEnd', this);
+		},
+		handleEvent: function(event) {
+			switch (event.type) {
+				case 'click':
+					this._click(event);
+					break;
+				case 'tap':
+					this._tap(event);
+					break;
+				case 'drag':
+					this._drag(event);
+					break;
+				case 'dragend':
+					this._dragend(event);
+					break;
+				case 'webkitTransitionEnd':
+					this._webkitTransitionEnd(event);
+					break;
+			}
+		},
+		shadow: function() {
+			var shadow = document.createElement('div');
+			shadow.className = CLASS_PAGE_SHADOW;
+			return shadow;
+		}(),
+		_removePage: function(page, navbar) {
+			navbar && this._removeNavbar(page, navbar);
+			document.body.appendChild(page);
+			this._cleanPageClass(page);
+		},
+		_prependPage: function(page) {
+			var navbar = page.querySelector(SELECTOR_NAVBAR_INNER);
+			navbar && this._prependNavbar(navbar);
+			page.classList.add(CLASS_PAGE_LEFT);
+			this.pages.insertBefore(page, this.pages.firstElementChild);
+		},
+		_appendPage: function(page) {
+			var navbar = page.querySelector(SELECTOR_NAVBAR_INNER);
+			navbar && this._appendNavbar(navbar);
+			page.classList.add(CLASS_PAGE_CENTER);
+			this.pages.appendChild(page);
+		},
+		_removeNavbar: function(page, navbar) {
+			page.insertBefore(navbar, page.firstElementChild);
+			this._cleanNavbarClass(navbar);
+		},
+		_prependNavbar: function(navbar) {
+			navbar.classList.add(CLASS_NAVBAR_LEFT);
+			this.navbars.insertBefore(navbar, this.navbars.firstElementChild);
+		},
+		_appendNavbar: function(navbar) {
+			navbar.classList.add(CLASS_NAVBAR_CENTER);
+			this.navbars.appendChild(navbar);
+		},
+		_cleanPageClass: function(page) {
+			page.classList.remove(CLASS_PAGE_CENTER);
+			page.classList.remove(CLASS_PAGE_LEFT);
+		},
+		_cleanNavbarClass: function(navbar) {
+			navbar.classList.remove(CLASS_NAVBAR_CENTER);
+			navbar.classList.remove(CLASS_NAVBAR_LEFT);
+		},
+		_tap: function(event) {
+			var target = event.target;
+			for (; target && target !== document; target = target.parentNode) {
+				if (target.tagName === 'A' && target.hash) {
+					var page = document.getElementById(target.hash.replace('#', ''));
+					if (page && page.classList.contains(CLASS_PAGE)) {
+						event.stopPropagation();
+						event.detail.gesture.preventDefault();
+						this.go(target.hash);
+						break;
+					}
+				}
+			}
+		},
+		_click: function(event) {
+			var target = event.target;
+			for (; target && target !== document; target = target.parentNode) {
+				if (target.tagName === 'A' && target.hash) {
+					var page = document.getElementById(target.hash.replace('#', ''));
+					if (page && page.classList.contains(CLASS_PAGE)) {
+						event.preventDefault();
+						break;
+					}
+				}
+			}
+		},
+		_cleanStyle: function(el) {
+			if (el) {
+				el.style.webkitTransform = '';
+				el.style.opacity = '';
+			}
+		},
+		_isAnimateNavbarIOS: function() {
+			return !$.os.android && this.options.animateNavbar === 'ios';
+		},
+		_webkitTransitionEnd: function(event) {
+			this.dragging = this.moved = false;
+			if (this.activePage !== event.target) {
+				return;
+			}
+
+			this.isInTransition = false;
+
+			this.shadow.parentNode === this.activePage && this.activePage.removeChild(this.shadow);
+			this.previousPageClassList.remove(CLASS_TRANSITIONING);
+			this.activePageClassList.remove(CLASS_TRANSITIONING);
+
+			var self = this;
+			if (this._isAnimateNavbarIOS() && this.previousNavElements && this.activeNavElements) {
+				var isBack = this.isBack;
+				$.each(this.previousNavElements, function(i, el) {
+					el.classList.remove(CLASS_TRANSITIONING);
+					isBack && self._cleanStyle(el);
+				});
+				$.each(this.activeNavElements, function(i, el) {
+					el.classList.remove(CLASS_TRANSITIONING);
+					self._cleanStyle(el);
+				});
+				if (this.previousNavBackIcon) {
+					this.previousNavBackIcon.classList.remove(CLASS_TRANSITIONING);
+					isBack && this._cleanStyle(this.previousNavBackIcon);
+				}
+				if (this.activeNavBackIcon) {
+					this.activeNavBackIcon.classList.remove(CLASS_TRANSITIONING);
+					this._cleanStyle(this.activeNavBackIcon);
+				}
+			} else {
+				this.previousNavbar && this.previousNavbar.classList.remove(CLASS_TRANSITIONING);
+				this.activeNavbar && this.activeNavbar.classList.remove(CLASS_TRANSITIONING);
+				this._cleanStyle(this.previousNavbar);
+				this._cleanStyle(this.activeNavbar);
+			}
+
+			this._cleanStyle(this.previousPage);
+			this._cleanStyle(this.activePage);
+
+			if (this.ratio <= 0.5) {
+				return;
+			}
+			if (this.isBack) {
+				this._removePage(this.activePage, this.activeNavbar);
+				this.previousPageClassList.remove(CLASS_PAGE_LEFT);
+				this.previousPageClassList.add(CLASS_PAGE_CENTER);
+				if (this.previousNavbar) {
+					this.previousNavbar.classList.remove(CLASS_NAVBAR_LEFT);
+					this.previousNavbar.classList.add(CLASS_NAVBAR_CENTER);
+				}
+				if (this.history.length > 0) {
+					this._prependPage(this.history.pop());
+				}
+				this.navbars && this._initNavBar();
+				this._trigger('pageBack', this.activePage);
+				this._trigger('pageShow', this.previousPage);
+			} else {
+				this.previousPageClassList.add(CLASS_PAGE_LEFT);
+				this.activePageClassList.add(CLASS_PAGE_CENTER);
+				this._trigger('pageShow', this.activePage);
+			}
+
+
+		},
+		_trigger: function(eventType, page) {
+			var eventCallbacks = 'on' + eventType.charAt(0).toUpperCase() + eventType.slice(1) + 'Callbacks';
+			if (this[eventCallbacks].hasOwnProperty(page.id)) {
+				var callbacks = this[eventCallbacks][page.id];
+				var event = new CustomEvent(eventType, {
+					detail: {
+						page: page
+					},
+					bubbles: true,
+					cancelable: true
+				});
+				for (var len = callbacks.length; len--;) {
+					callbacks[len].call(this, event);
+				}
+			}
+			$.trigger(this.view, eventType, {
+				page: page
+			});
+		},
+		_initPageTransform: function() {
+			this.previousPage = this.pages.querySelector(SELECTOR_PAGE_LEFT);
+			this.activePage = this.pages.querySelector(SELECTOR_PAGE_CENTER);
+			if (this.previousPage && this.activePage) {
+				this.activePage.appendChild(this.shadow);
+				this.previousPageClassList = this.previousPage.classList;
+				this.activePageClassList = this.activePage.classList;
+
+				this.previousPageStyle = this.previousPage.style;
+				this.activePageStyle = this.activePage.style;
+
+				this.previousPageClassList.remove(CLASS_TRANSITIONING);
+				this.activePageClassList.remove(CLASS_TRANSITIONING);
+
+				if (this.navbars) {
+					this.previousNavbar = this.navbars.querySelector(SELECTOR_NAVBAR_LEFT);
+					this.activeNavbar = this.navbars.querySelector(SELECTOR_NAVBAR_CENTER);
+					if (this._isAnimateNavbarIOS() && this.previousNavbar && this.activeNavbar) {
+						this.previousNavElements = this.previousNavbar.querySelectorAll(SELECTOR_LEFT + ',' + SELECTOR_CENTER + ',' + SELECTOR_RIGHT);
+						this.activeNavElements = this.activeNavbar.querySelectorAll(SELECTOR_LEFT + ',' + SELECTOR_CENTER + ',' + SELECTOR_RIGHT);
+						this.previousNavBackIcon = this.previousNavbar.querySelector(SELECTOR_LEFT + SELECTOR_BTN_NAV + ' ' + SELECTOR_ICON);
+						this.activeNavBackIcon = this.activeNavbar.querySelector(SELECTOR_LEFT + SELECTOR_BTN_NAV + ' ' + SELECTOR_ICON);
+					}
+				}
+				this.x = 0;
+				this.dragging = true;
+				return true;
+			}
+			return false;
+		},
+		_initNavBar: function() {
+			if (this._isAnimateNavbarIOS() && this.navbars) {
+				var inners = this.navbars.querySelectorAll(SELECTOR_NAVBAR_INNER);
+				var inner, left, right, center, leftWidth, rightWidth, centerWidth, noLeft, onRight, currLeft, diff, navbarWidth;
+				for (var i = 0, len = inners.length; i < len; i++) {
+					inner = inners[i];
+					left = inner.querySelector(SELECTOR_LEFT);
+					right = inner.querySelector(SELECTOR_RIGHT);
+					center = inner.querySelector(SELECTOR_CENTER);
+					noLeft = !left;
+					noRight = !right;
+					leftWidth = noLeft ? 0 : left.offsetWidth;
+					rightWidth = noRight ? 0 : right.offsetWidth;
+					centerWidth = center ? center.offsetWidth : 0;
+					navbarWidth = this.maxScrollX;
+					onLeft = inner.classList.contains('navbar-left');
+					if (noRight) {
+						currLeft = navbarWidth - centerWidth;
+					}
+					if (noLeft) {
+						currLeft = 0;
+					}
+					if (!noLeft && !noRight) {
+						currLeft = (navbarWidth - rightWidth - centerWidth + leftWidth) / 2;
+					}
+					var requiredLeft = (navbarWidth - centerWidth) / 2;
+					if (navbarWidth - leftWidth - rightWidth > centerWidth) {
+						if (requiredLeft < leftWidth) {
+							requiredLeft = leftWidth;
+						}
+						if (requiredLeft + centerWidth > navbarWidth - rightWidth) {
+							requiredLeft = navbarWidth - rightWidth - centerWidth;
+						}
+						diff = requiredLeft - currLeft;
+					} else {
+						diff = 0;
+					}
+
+					var centerLeft = diff;
+					if (center) {
+						center.style.marginLeft = -leftWidth + 'px';
+						center.mNavbarLeftOffset = -(currLeft + diff) + 30; //这个30是测出来的。后续要实际计算一下
+						center.mNavbarRightOffset = navbarWidth - currLeft - diff - centerWidth;
+					}
+
+					if (onLeft) center.style.webkitTransform = ('translate3d(' + center.mNavbarLeftOffset + 'px, 0, 0)');
+
+					if (!noLeft) {
+						left.mNavbarLeftOffset = -leftWidth;
+						left.mNavbarRightOffset = (navbarWidth - leftWidth) / 2;
+						if (onLeft) left.style.webkitTransform = ('translate3d(' + left[0].mNavbarLeftOffset + 'px, 0, 0)');
+					}
+
+					if (!noRight) {
+						right.mNavbarLeftOffset = -(navbarWidth - rightWidth) / 2;
+						right.mNavbarRightOffset = rightWidth;
+						if (onLeft) right.style.webkitTransform = ('translate3d(' + right[0].mNavbarLeftOffset + 'px, 0, 0)');
+					}
+
+				}
+			}
+		},
+		_drag: function(event) {
+			if (this.isInTransition) {
+				return;
+			}
+			var detail = event.detail;
+			if (!this.dragging) {
+				if (($.gestures.session.firstTouch.center.x - this.view.offsetLeft) < this.options.swipeBackPageActiveArea) {
+					this.isBack = true;
+					this._initPageTransform();
+				}
+			}
+			if (this.dragging) {
+				var deltaX = 0;
+				if (!this.moved) { //start
+					deltaX = detail.deltaX;
+					$.gestures.session.lockDirection = true; //锁定方向
+					$.gestures.session.startDirection = detail.direction;
+				} else { //move
+					deltaX = detail.deltaX - ($.gestures.session.prevTouch && $.gestures.session.prevTouch.deltaX || 0);
+				}
+				var newX = this.x + deltaX;
+				if (newX < 0 || newX > this.maxScrollX) {
+					newX = newX < 0 ? 0 : this.maxScrollX;
+				}
+
+				event.stopPropagation();
+				detail.gesture.preventDefault();
+
+				if (!this.requestAnimationFrame) {
+					this._updateTranslate();
+				}
+
+				this.moved = true;
+				this.x = newX;
+				this.y = 0;
+			}
+		},
+		_dragend: function(event) {
+			if (!this.moved) {
+				return;
+			}
+
+			event.stopPropagation();
+
+			var detail = event.detail;
+
+			this._clearRequestAnimationFrame();
+
+			this._prepareTransition();
+
+			this.ratio = this.x / this.maxScrollX;
+			if (this.ratio === 1 || this.ratio === 0) {
+				$.trigger(this.activePage, 'webkitTransitionEnd');
+				return;
+			}
+			if (this.ratio > 0.5) {
+				this.setTranslate(this.maxScrollX, 0);
+			} else {
+				this._cleanStyle(this.previousPage);
+				this._cleanStyle(this.activePage);
+			}
+		},
+		_prepareTransition: function() {
+			this.isInTransition = true;
+			this.previousPageClassList.add(CLASS_TRANSITIONING);
+			this.activePageClassList.add(CLASS_TRANSITIONING);
+			var self = this;
+			if (this.previousNavbar && this.activeNavbar) {
+				this.previousNavbar.classList.add(CLASS_TRANSITIONING);
+				this.activeNavbar.classList.add(CLASS_TRANSITIONING);
+				if (this._isAnimateNavbarIOS() && this.previousNavElements && this.activeNavElements) {
+					$.each(this.previousNavElements, function(i, el) {
+						el.classList.add(CLASS_TRANSITIONING);
+						self._cleanStyle(el);
+					});
+					$.each(this.activeNavElements, function(i, el) {
+						el.classList.add(CLASS_TRANSITIONING);
+						self._cleanStyle(el);
+					});
+					if (this.previousNavBackIcon) {
+						this._cleanStyle(this.previousNavBackIcon);
+						this.previousNavBackIcon.classList.add(CLASS_TRANSITIONING);
+					}
+					if (this.activeNavBackIcon) {
+						this._cleanStyle(this.activeNavBackIcon);
+						this.activeNavBackIcon.classList.add(CLASS_TRANSITIONING);
+					}
+				}
+			}
+		},
+		_clearRequestAnimationFrame: function() {
+			if (this.requestAnimationFrame) {
+				cancelAnimationFrame(this.requestAnimationFrame);
+				this.requestAnimationFrame = null;
+			}
+		},
+		_getTranslateStr: function(x, y) {
+			if (this.options.hardwareAccelerated) {
+				return 'translate3d(' + x + 'px,' + y + 'px,0px) ' + this.translateZ;
+			}
+			return 'translate(' + x + 'px,' + y + 'px) ';
+		},
+
+		_updateTranslate: function() {
+			var self = this;
+			if (self.x !== self.lastX || self.y !== self.lastY) {
+				self.setTranslate(self.x, self.y);
+			}
+			self.requestAnimationFrame = requestAnimationFrame(function() {
+				self._updateTranslate();
+			});
+		},
+		_setNavbarTranslate: function(x, y) {
+			var percentage = x / this.maxScrollX;
+			//only for ios
+			if (this._isAnimateNavbarIOS()) {
+				if (this.previousNavElements && this.activeNavElements) {
+					this.animateNavbarByIOS(percentage);
+				}
+			} else { //pop-in
+				this.activeNavbar.style.opacity = 1 - percentage * 1.3;
+				this.previousNavbar.style.opacity = percentage * 1.3 - 0.3;
+			}
+		},
+		animateNavbarByIOS: function(percentage) {
+			var i, len, style, el;
+			for (i = 0, len = this.activeNavElements.length; i < len; i++) {
+				el = this.activeNavElements[i];
+				style = el.style;
+				style.opacity = (1 - percentage * (el.classList.contains(CLASS_LEFT) ? 3.5 : 1.3));
+				if (!el.classList.contains(CLASS_RIGHT)) {
+					var activeNavTranslate = percentage * el.mNavbarRightOffset;
+					el.style.webkitTransform = ('translate3d(' + activeNavTranslate + 'px,0,0)');
+					if (el.classList.contains(CLASS_LEFT) && this.activeNavBackIcon) {
+						this.activeNavBackIcon.style.webkitTransform = ('translate3d(' + -activeNavTranslate + 'px,0,0)');
+					}
+				}
+			}
+			for (i = 0, len = this.previousNavElements.length; i < len; i++) {
+				el = this.previousNavElements[i];
+				style = el.style;
+				style.opacity = percentage * 1.3 - 0.3;
+				if (!el.classList.contains(CLASS_RIGHT)) {
+					var previousNavTranslate = el.mNavbarLeftOffset * (1 - percentage);
+					el.style.webkitTransform = ('translate3d(' + previousNavTranslate + 'px,0,0)');
+					if (el.classList.contains(CLASS_LEFT) && this.previousNavBackIcon) {
+						this.previousNavBackIcon.style.webkitTransform = ('translate3d(' + -previousNavTranslate + 'px,0,0)');
+					}
+				}
+			}
+		},
+		setTranslate: function(x, y) {
+			this.x = x;
+			this.y = y;
+			this.previousPage.style.opacity = 0.9 + 0.1 * x / this.maxScrollX;
+			this.previousPage.style['webkitTransform'] = this._getTranslateStr((x / 6 - this.maxScrollX / 6), y);
+			this.activePage.style['webkitTransform'] = this._getTranslateStr(x, y);
+
+			this.navbars && this._setNavbarTranslate(x, y);
+			this.lastX = this.x;
+			this.lastY = this.y;
+		},
+		canBack: function() {
+			return this.pages.querySelector(SELECTOR_PAGE_LEFT);
+		},
+		back: function() {
+			if (this.isInTransition) {
+				return;
+			}
+			this.isBack = true;
+			this.ratio = 1;
+			if (this._initPageTransform()) {
+				this._trigger('pageBeforeBack', this.activePage);
+				this._trigger('pageBeforeShow', this.previousPage);
+				this._prepareTransition();
+				this.previousPage.offsetHeight;
+				this.activePage.offsetHeight;
+				this.setTranslate(this.maxScrollX, 0);
+			}
+		},
+		go: function(pageSelector) {
+			if (this.isInTransition) {
+				return;
+			}
+			var nextPage = document.querySelector(pageSelector);
+
+			if (nextPage) {
+				var previousPage = this.pages.querySelector(SELECTOR_PAGE_LEFT);
+				var activePage = this.pages.querySelector(SELECTOR_PAGE_CENTER);
+				var previousNavbar;
+				var activeNavbar;
+				if (this.navbars) {
+					previousNavbar = this.navbars.querySelector(SELECTOR_NAVBAR_LEFT);
+					activeNavbar = this.navbars.querySelector(SELECTOR_NAVBAR_CENTER);
+				}
+				if (activeNavbar) {
+					activeNavbar.classList.remove(CLASS_NAVBAR_CENTER);
+					activeNavbar.classList.add(CLASS_NAVBAR_LEFT);
+				}
+
+				if (previousPage) {
+					this._removePage(previousPage, previousNavbar);
+					this.history.push(previousPage); //add to history
+				}
+
+				if (activePage) {
+					activePage.classList.remove(CLASS_PAGE_CENTER);
+					activePage.style.webkitTransform = 'translate3d(0,0,0)';
+					activePage.classList.add(CLASS_PAGE_LEFT);
+				}
+
+
+				nextPage.style.webkitTransform = 'translate3d(100%,0,0)';
+				this._appendPage(nextPage);
+				nextPage.appendChild(this.shadow); //shadow
+				nextPage.offsetHeight; //force
+				this.isBack = false;
+				this.ratio = 1;
+
+				this._initPageTransform();
+
+				this.navbars && this._initNavBar();
+
+				this.navbars && this._setNavbarTranslate(this.maxScrollX, 0);
+				//force
+				this.previousPage.offsetHeight;
+				this.activePage.offsetHeight;
+
+				if (this.navbars) {
+					this.previousNavbar.offsetHeight;
+					this.activeNavbar.offsetHeight;
+				}
+
+				this._trigger('pageBeforeShow', this.activePage);
+				this._prepareTransition();
+				this.setTranslate(0, 0);
+			}
+		}
+
+	});
+
+
+	$.fn.view = function(options) {
+		var self = this[0];
+		var viewApi = null;
+		var id = self.getAttribute('data-view');
+		if (!id) {
+			id = ++$.uuid;
+			$.data[id] = viewApi = new View(self, options);
+			self.setAttribute('data-view', id);
+		} else {
+			viewApi = $.data[id];
+		}
+		return viewApi;
+	}
+})(mui, window);

+ 322 - 0
js/mui.zoom.js

@@ -0,0 +1,322 @@
+(function($, window) {
+	var CLASS_ZOOM = $.className('zoom');
+	var CLASS_ZOOM_SCROLLER = $.className('zoom-scroller');
+
+	var SELECTOR_ZOOM = '.' + CLASS_ZOOM;
+	var SELECTOR_ZOOM_SCROLLER = '.' + CLASS_ZOOM_SCROLLER;
+
+	var EVENT_PINCH_START = 'pinchstart';
+	var EVENT_PINCH = 'pinch';
+	var EVENT_PINCH_END = 'pinchend';
+	if ('ongesturestart' in window) {
+		EVENT_PINCH_START = 'gesturestart';
+		EVENT_PINCH = 'gesturechange';
+		EVENT_PINCH_END = 'gestureend';
+	}
+	$.Zoom = function(element, options) {
+		var zoom = this;
+
+		zoom.options = $.extend($.Zoom.defaults, options);
+
+		zoom.wrapper = zoom.element = element;
+		zoom.scroller = element.querySelector(SELECTOR_ZOOM_SCROLLER);
+		zoom.scrollerStyle = zoom.scroller && zoom.scroller.style;
+
+		zoom.zoomer = element.querySelector(SELECTOR_ZOOM);
+		zoom.zoomerStyle = zoom.zoomer && zoom.zoomer.style;
+
+		zoom.init = function() {
+			//自动启用
+			$.options.gestureConfig.pinch = true;
+			$.options.gestureConfig.doubletap = true;
+			zoom.initEvents();
+		};
+
+		zoom.initEvents = function(detach) {
+			var action = detach ? 'removeEventListener' : 'addEventListener';
+			var target = zoom.scroller;
+
+			target[action](EVENT_PINCH_START, zoom.onPinchstart);
+			target[action](EVENT_PINCH, zoom.onPinch);
+			target[action](EVENT_PINCH_END, zoom.onPinchend);
+
+			target[action]($.EVENT_START, zoom.onTouchstart);
+			target[action]($.EVENT_MOVE, zoom.onTouchMove);
+			target[action]($.EVENT_CANCEL, zoom.onTouchEnd);
+			target[action]($.EVENT_END, zoom.onTouchEnd);
+
+			target[action]('drag', zoom.dragEvent);
+			target[action]('doubletap', zoom.doubleTapEvent);
+		};
+		zoom.dragEvent = function(e) {
+			if (imageIsMoved || isGesturing) {
+				e.stopPropagation();
+			}
+		};
+		zoom.doubleTapEvent = function(e) {
+			zoom.toggleZoom(e.detail.center);
+		};
+		zoom.transition = function(style, time) {
+			time = time || 0;
+			style['webkitTransitionDuration'] = time + 'ms';
+			return zoom;
+		};
+		zoom.translate = function(style, x, y) {
+			x = x || 0;
+			y = y || 0;
+			style['webkitTransform'] = 'translate3d(' + x + 'px,' + y + 'px,0px)';
+			return zoom;
+		};
+		zoom.scale = function(style, scale) {
+			scale = scale || 1;
+			style['webkitTransform'] = 'translate3d(0,0,0) scale(' + scale + ')';
+			return zoom;
+		};
+		zoom.scrollerTransition = function(time) {
+			return zoom.transition(zoom.scrollerStyle, time);
+		};
+		zoom.scrollerTransform = function(x, y) {
+			return zoom.translate(zoom.scrollerStyle, x, y);
+		};
+		zoom.zoomerTransition = function(time) {
+			return zoom.transition(zoom.zoomerStyle, time);
+		};
+		zoom.zoomerTransform = function(scale) {
+			return zoom.scale(zoom.zoomerStyle, scale);
+		};
+
+		// Gestures
+		var scale = 1,
+			currentScale = 1,
+			isScaling = false,
+			isGesturing = false;
+		zoom.onPinchstart = function(e) {
+			isGesturing = true;
+		};
+		zoom.onPinch = function(e) {
+			if (!isScaling) {
+				zoom.zoomerTransition(0);
+				isScaling = true;
+			}
+			scale = (e.detail ? e.detail.scale : e.scale) * currentScale;
+			if (scale > zoom.options.maxZoom) {
+				scale = zoom.options.maxZoom - 1 + Math.pow((scale - zoom.options.maxZoom + 1), 0.5);
+			}
+			if (scale < zoom.options.minZoom) {
+				scale = zoom.options.minZoom + 1 - Math.pow((zoom.options.minZoom - scale + 1), 0.5);
+			}
+			zoom.zoomerTransform(scale);
+		};
+		zoom.onPinchend = function(e) {
+			scale = Math.max(Math.min(scale, zoom.options.maxZoom), zoom.options.minZoom);
+			zoom.zoomerTransition(zoom.options.speed).zoomerTransform(scale);
+			currentScale = scale;
+			isScaling = false;
+		};
+		zoom.setZoom = function(newScale) {
+			scale = currentScale = newScale;
+			zoom.scrollerTransition(zoom.options.speed).scrollerTransform(0, 0);
+			zoom.zoomerTransition(zoom.options.speed).zoomerTransform(scale);
+		};
+		zoom.toggleZoom = function(position, speed) {
+			if (typeof position === 'number') {
+				speed = position;
+				position = undefined;
+			}
+			speed = typeof speed === 'undefined' ? zoom.options.speed : speed;
+			if (scale && scale !== 1) {
+				scale = currentScale = 1;
+				zoom.scrollerTransition(speed).scrollerTransform(0, 0);
+			} else {
+				scale = currentScale = zoom.options.maxZoom;
+				if (position) {
+					var offset = $.offset(zoom.zoomer);
+					var top = offset.top;
+					var left = offset.left;
+					var offsetX = (position.x - left) * scale;
+					var offsetY = (position.y - top) * scale;
+					this._cal();
+					if (offsetX >= imageMaxX && offsetX <= (imageMaxX + wrapperWidth)) { //center
+						offsetX = imageMaxX - offsetX + wrapperWidth / 2;
+					} else if (offsetX < imageMaxX) { //left
+						offsetX = imageMaxX - offsetX + wrapperWidth / 2;
+					} else if (offsetX > (imageMaxX + wrapperWidth)) { //right
+						offsetX = imageMaxX + wrapperWidth - offsetX - wrapperWidth / 2;
+					}
+					if (offsetY >= imageMaxY && offsetY <= (imageMaxY + wrapperHeight)) { //middle
+						offsetY = imageMaxY - offsetY + wrapperHeight / 2;
+					} else if (offsetY < imageMaxY) { //top
+						offsetY = imageMaxY - offsetY + wrapperHeight / 2;
+					} else if (offsetY > (imageMaxY + wrapperHeight)) { //bottom
+						offsetY = imageMaxY + wrapperHeight - offsetY - wrapperHeight / 2;
+					}
+					offsetX = Math.min(Math.max(offsetX, imageMinX), imageMaxX);
+					offsetY = Math.min(Math.max(offsetY, imageMinY), imageMaxY);
+					zoom.scrollerTransition(speed).scrollerTransform(offsetX, offsetY);
+				} else {
+					zoom.scrollerTransition(speed).scrollerTransform(0, 0);
+				}
+			}
+			zoom.zoomerTransition(speed).zoomerTransform(scale);
+		};
+
+		zoom._cal = function() {
+			wrapperWidth = zoom.wrapper.offsetWidth;
+			wrapperHeight = zoom.wrapper.offsetHeight;
+			imageWidth = zoom.zoomer.offsetWidth;
+			imageHeight = zoom.zoomer.offsetHeight;
+			var scaledWidth = imageWidth * scale;
+			var scaledHeight = imageHeight * scale;
+			imageMinX = Math.min((wrapperWidth / 2 - scaledWidth / 2), 0);
+			imageMaxX = -imageMinX;
+			imageMinY = Math.min((wrapperHeight / 2 - scaledHeight / 2), 0);
+			imageMaxY = -imageMinY;
+		};
+
+		var wrapperWidth, wrapperHeight, imageIsTouched, imageIsMoved, imageCurrentX, imageCurrentY, imageMinX, imageMinY, imageMaxX, imageMaxY, imageWidth, imageHeight, imageTouchesStart = {},
+			imageTouchesCurrent = {},
+			imageStartX, imageStartY, velocityPrevPositionX, velocityPrevTime, velocityX, velocityPrevPositionY, velocityY;
+
+		zoom.onTouchstart = function(e) {
+			e.preventDefault();
+			imageIsTouched = true;
+			imageTouchesStart.x = e.type === $.EVENT_START ? e.targetTouches[0].pageX : e.pageX;
+			imageTouchesStart.y = e.type === $.EVENT_START ? e.targetTouches[0].pageY : e.pageY;
+		};
+		zoom.onTouchMove = function(e) {
+			e.preventDefault();
+			if (!imageIsTouched) return;
+			if (!imageIsMoved) {
+				wrapperWidth = zoom.wrapper.offsetWidth;
+				wrapperHeight = zoom.wrapper.offsetHeight;
+				imageWidth = zoom.zoomer.offsetWidth;
+				imageHeight = zoom.zoomer.offsetHeight;
+				var translate = $.parseTranslateMatrix($.getStyles(zoom.scroller, 'webkitTransform'));
+				imageStartX = translate.x || 0;
+				imageStartY = translate.y || 0;
+				zoom.scrollerTransition(0);
+			}
+			var scaledWidth = imageWidth * scale;
+			var scaledHeight = imageHeight * scale;
+
+			if (scaledWidth < wrapperWidth && scaledHeight < wrapperHeight) return;
+
+			imageMinX = Math.min((wrapperWidth / 2 - scaledWidth / 2), 0);
+			imageMaxX = -imageMinX;
+			imageMinY = Math.min((wrapperHeight / 2 - scaledHeight / 2), 0);
+			imageMaxY = -imageMinY;
+
+			imageTouchesCurrent.x = e.type === $.EVENT_MOVE ? e.targetTouches[0].pageX : e.pageX;
+			imageTouchesCurrent.y = e.type === $.EVENT_MOVE ? e.targetTouches[0].pageY : e.pageY;
+
+			if (!imageIsMoved && !isScaling) {
+				//				if (Math.abs(imageTouchesCurrent.y - imageTouchesStart.y) < Math.abs(imageTouchesCurrent.x - imageTouchesStart.x)) {
+				//TODO 此处需要优化,当遇到长图,需要上下滚动时,下列判断会导致滚动不流畅
+				if (
+					(Math.floor(imageMinX) === Math.floor(imageStartX) && imageTouchesCurrent.x < imageTouchesStart.x) ||
+					(Math.floor(imageMaxX) === Math.floor(imageStartX) && imageTouchesCurrent.x > imageTouchesStart.x)
+				) {
+					imageIsTouched = false;
+					return;
+				}
+				//				}
+			}
+			imageIsMoved = true;
+			imageCurrentX = imageTouchesCurrent.x - imageTouchesStart.x + imageStartX;
+			imageCurrentY = imageTouchesCurrent.y - imageTouchesStart.y + imageStartY;
+
+			if (imageCurrentX < imageMinX) {
+				imageCurrentX = imageMinX + 1 - Math.pow((imageMinX - imageCurrentX + 1), 0.8);
+			}
+			if (imageCurrentX > imageMaxX) {
+				imageCurrentX = imageMaxX - 1 + Math.pow((imageCurrentX - imageMaxX + 1), 0.8);
+			}
+
+			if (imageCurrentY < imageMinY) {
+				imageCurrentY = imageMinY + 1 - Math.pow((imageMinY - imageCurrentY + 1), 0.8);
+			}
+			if (imageCurrentY > imageMaxY) {
+				imageCurrentY = imageMaxY - 1 + Math.pow((imageCurrentY - imageMaxY + 1), 0.8);
+			}
+
+			//Velocity
+			if (!velocityPrevPositionX) velocityPrevPositionX = imageTouchesCurrent.x;
+			if (!velocityPrevPositionY) velocityPrevPositionY = imageTouchesCurrent.y;
+			if (!velocityPrevTime) velocityPrevTime = $.now();
+			velocityX = (imageTouchesCurrent.x - velocityPrevPositionX) / ($.now() - velocityPrevTime) / 2;
+			velocityY = (imageTouchesCurrent.y - velocityPrevPositionY) / ($.now() - velocityPrevTime) / 2;
+			if (Math.abs(imageTouchesCurrent.x - velocityPrevPositionX) < 2) velocityX = 0;
+			if (Math.abs(imageTouchesCurrent.y - velocityPrevPositionY) < 2) velocityY = 0;
+			velocityPrevPositionX = imageTouchesCurrent.x;
+			velocityPrevPositionY = imageTouchesCurrent.y;
+			velocityPrevTime = $.now();
+
+			zoom.scrollerTransform(imageCurrentX, imageCurrentY);
+		};
+		zoom.onTouchEnd = function(e) {
+			if (!e.touches.length) {
+				isGesturing = false;
+			}
+			if (!imageIsTouched || !imageIsMoved) {
+				imageIsTouched = false;
+				imageIsMoved = false;
+				return;
+			}
+			imageIsTouched = false;
+			imageIsMoved = false;
+			var momentumDurationX = 300;
+			var momentumDurationY = 300;
+			var momentumDistanceX = velocityX * momentumDurationX;
+			var newPositionX = imageCurrentX + momentumDistanceX;
+			var momentumDistanceY = velocityY * momentumDurationY;
+			var newPositionY = imageCurrentY + momentumDistanceY;
+
+			if (velocityX !== 0) momentumDurationX = Math.abs((newPositionX - imageCurrentX) / velocityX);
+			if (velocityY !== 0) momentumDurationY = Math.abs((newPositionY - imageCurrentY) / velocityY);
+			var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
+
+			imageCurrentX = newPositionX;
+			imageCurrentY = newPositionY;
+
+			var scaledWidth = imageWidth * scale;
+			var scaledHeight = imageHeight * scale;
+			imageMinX = Math.min((wrapperWidth / 2 - scaledWidth / 2), 0);
+			imageMaxX = -imageMinX;
+			imageMinY = Math.min((wrapperHeight / 2 - scaledHeight / 2), 0);
+			imageMaxY = -imageMinY;
+			imageCurrentX = Math.max(Math.min(imageCurrentX, imageMaxX), imageMinX);
+			imageCurrentY = Math.max(Math.min(imageCurrentY, imageMaxY), imageMinY);
+
+			zoom.scrollerTransition(momentumDuration).scrollerTransform(imageCurrentX, imageCurrentY);
+		};
+		zoom.destroy = function() {
+			zoom.initEvents(true); //detach
+			delete $.data[zoom.wrapper.getAttribute('data-zoomer')];
+			zoom.wrapper.setAttribute('data-zoomer', '');
+		}
+		zoom.init();
+		return zoom;
+	};
+	$.Zoom.defaults = {
+		speed: 300,
+		maxZoom: 3,
+		minZoom: 1,
+	};
+	$.fn.zoom = function(options) {
+		var zoomApis = [];
+		this.each(function() {
+			var zoomApi = null;
+			var self = this;
+			var id = self.getAttribute('data-zoomer');
+			if (!id) {
+				id = ++$.uuid;
+				$.data[id] = zoomApi = new $.Zoom(self, options);
+				self.setAttribute('data-zoomer', id);
+			} else {
+				zoomApi = $.data[id];
+			}
+			zoomApis.push(zoomApi);
+		});
+		return zoomApis.length === 1 ? zoomApis[0] : zoomApis;
+	};
+})(mui, window);

+ 0 - 0
js/swiper.min.js


Some files were not shown because too many files changed in this diff