浏览代码

重新构建js

guohh 7 年之前
父节点
当前提交
7ec3043aba
共有 4 个文件被更改,包括 4 次插入4 次删除
  1. 1 1
      ipuui/dist/js/ipu.js.map
  2. 1 1
      ipuui/dist/js/ipu.min.js.map
  3. 1 1
      ipuui/ipu/dist/js/ipu.js.map
  4. 1 1
      ipuui/ipu/dist/js/ipu.min.js.map

+ 1 - 1
ipuui/dist/js/ipu.js.map

@ -1 +1 @@
1
{"version":3,"sources":["ipu-prefix.js","carousel.js","dtPicker.js","hammerCarousel.js","modal.js","navBar.js","pages.js","picker.js","popPicker.js","progressBar.js","refresh.js","tab.js","tap.js","_device.js","ipu-suffix.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"ipu.js","sourcesContent":["(function () {\r\n    function setup(jQuery, iScroll, Hammer, FastClick) {\r\n        var ipu = {};\r\n","// Carousel\r\n(function (ipu, $, iscroll) {\r\n// carouselSlt应该是唯一的,否则怎么支撑多个回调,如果用户不需要多个回调,也不主动调用,则可以,先不管吧???\r\n    function Carousel(slt, options) {\r\n        this.options = options = $.extend({}, this.defaultOpt, options);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = options.autoPlay;\r\n         this.hasIndicator = options.indicator;\r\n        this.callBack = options.callBack;\r\n        this.currentIndex = null;\r\n\r\n        this._init();\r\n        this.play();\r\n    }\r\n\r\n    Carousel.prototype = {\r\n        defaultOpt: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            that = this;\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.hasIndicator) {\r\n                this._addIndicator();\r\n            }\r\n            $(window).resize(function () {\r\n                that.refresh();\r\n            });\r\n            var scrollOpt = {\r\n                snap: \"li\",          // carousel效果\r\n                momentum: false,     // 移除惯性处理\r\n                scrollX: true,       // X轴移动\r\n                scrollY:false,\r\n                hScrollbar: false,   // 没有纵向滚动条\r\n                onScrollStart: function () {\r\n                    that._pause();\r\n                },\r\n                onTouchEnd: function () {\r\n                    // 后面优化\r\n                    /*\r\n                     if (that.iscroll.currPageX == that.size - 1) {\r\n                     that.show(that.size - 2);\r\n                     }\r\n                     */\r\n                },\r\n                onScrollEnd: function () {\r\n                    that._end();\r\n                }\r\n            };\r\n            this.iscroll = new iscroll(this.el.get(0), scrollOpt);\r\n            this.show(this.options.index, 0);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.autoPlay=false;\r\n        },\r\n        _pause: function () {\r\n            if (this.autoPlay && this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            this.show(index);\r\n        },\r\n        next: function () {\r\n            var index = this.currentIndex == this.size - 1 ? 0 : this.currentIndex + 1;\r\n            this.show(index);\r\n        },\r\n        show: function (index, time) {\r\n            this._pause();\r\n            this.iscroll.scrollToPage(index, 0, time);\r\n        },\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        refresh: function () {\r\n            var that = this;\r\n            that.show(this.currentIndex);\r\n        },\r\n        _play: function () {\r\n            if (this.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    this.timeoutId = null;\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {\r\n            var currentIndex = this.iscroll.currPageX;\r\n            if (currentIndex != this.currentIndex) {\r\n                if (this.callBack) {\r\n                    this.callBack(currentIndex, this.currentIndex);\r\n                }\r\n                this.currentIndex = currentIndex;\r\n\r\n                if (this.hasIndicator) {\r\n                    this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this._play();\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        destroy: function () {\r\n            // 自己怎么销毁,相关事件移除??\r\n            this.iscroll.destroy();\r\n        }\r\n    };\r\n\r\n    ipu.carousel =  function (slt, options) {\r\n        return new Carousel(slt, options);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n","// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来运算\r\n\r\n\r\n    // show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n    // 日期范围的选择处理\r\n    function DtPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    DtPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker ui-dtpicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-clear\">清除</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-title\">\\\r\n                            <label class=\"ui-dtpicker-y\"></label>\\\r\n                            <label class=\"ui-dtpicker-m\"></label>\\\r\n                            <label class=\"ui-dtpicker-d\"></label>\\\r\n                            <label class=\"ui-dtpicker-h\"></label>\\\r\n                            <label class=\"ui-dtpicker-mi\"></label>\\\r\n                        </div>\\\r\n                        <div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                            <div class=\"ui-picker\" data-id=\"picker-y\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-m\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-d\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-h\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-mi\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                        </div>\\\r\n                    </div>',\r\n        buttons: ['取消', '确认', '清除'],\r\n        labels: ['年', '月', '日', '时', '分'],\r\n        type: 'datetime',       // date, time, datetime, hour, month\r\n        customData: {},  // 自定义数据\r\n        hasClear: false,    // 是否显示清除按钮\r\n        callBack: function () { // 选择数据时的回调函数\r\n        }\r\n        // beginDate: Date类型,或毫秒值\r\n        // endDate: 同上\r\n    };\r\n\r\n    DtPicker.prototype._init = function () {\r\n        var self = this;\r\n        this.mask = this.createMask();\r\n\r\n        var _picker = this.holder = $(this.options.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ui-poppicker-btn-ok', _picker),\r\n            cancel: $('.ui-poppicker-btn-cancel', _picker),\r\n            clear: $('.ui-poppicker-btn-clear', _picker),\r\n            buttons: $('.ui-poppicker-header .ui-btn', _picker),\r\n            labels: $('.ui-poppicker-title label', _picker)\r\n        };\r\n\r\n\r\n        ui.i = new Picker($('[data-id=\"picker-mi\"]', _picker), {listen: false}); // 分钟变更无需要处理\r\n\r\n        ui.h = new Picker($('[data-id=\"picker-h\"]', _picker), {         // 小时变更,有最小值或最大值,需要变更分钟\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createMinutes();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.d = new Picker($('[data-id=\"picker-d\"]', _picker), { //仅提供了beginDate时,触发day,hours,minutes的change\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createHours();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.m = new Picker($('[data-id=\"picker-m\"]', _picker), { // 月变更时,总要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null) {\r\n                    self._createDay();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.y = new Picker($('[data-id=\"picker-y\"]', _picker), { // 年发生变更,如果没有结束月,此时有所有的月,是不需要变更月的,只需要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index != null) {\r\n                    if (self.options.beginMonth || self.options.endMonth) {\r\n                        self._createMonth();\r\n                    } else {\r\n                        self._createDay();\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n\r\n\r\n\r\n        self._create();\r\n\r\n        var ui = self.ui;\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.options.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.options.value);\r\n\r\n        //防止滚动穿透 TODO:待确认情况\r\n        /* self.ui.picker.addEventListener($.EVENT_START, function (event) {\r\n         event.preventDefault();\r\n         }, false);\r\n         self.ui.picker.addEventListener($.EVENT_MOVE, function (event) {\r\n         event.preventDefault();\r\n         }, false);*/\r\n    };\r\n\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.options.type;\r\n        var selected = {\r\n            type: type,\r\n            y: ui.y.getSelectedItem(),\r\n            m: ui.m.getSelectedItem(),\r\n            d: ui.d.getSelectedItem(),\r\n            h: ui.h.getSelectedItem(),\r\n            i: ui.i.getSelectedItem(),\r\n            toString: function () {\r\n                return this.value;\r\n            }\r\n        };\r\n        switch (type) {\r\n            case 'datetime':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'date':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text;\r\n                break;\r\n            case 'time':\r\n                selected.value = selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'month':\r\n                selected.value = selected.y.value + '-' + selected.m.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text;\r\n                break;\r\n            case 'hour':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text;\r\n                break;\r\n        }\r\n        return selected;\r\n    };\r\n\r\n    DtPicker.prototype._setSelectedValue = function (value) {\r\n        var self = this;\r\n        var ui = self.ui;\r\n\r\n        if(!value){\r\n            if(this.options.type == 'time'){\r\n                value = '00:00';\r\n            }else{\r\n                value = defaultPickerDate.getFullYear()+'-'+(defaultPickerDate.getMonth()+1)+'-'+defaultPickerDate.getDate()+' '\r\n                    + defaultPickerDate.getHours() + ':' + defaultPickerDate.getMinutes();\r\n            }\r\n        }\r\n        var parsedValue = self._parseSetValue(value);\r\n\r\n        ui.y.setListen(true);\r\n        ui.m.setListen(false);\r\n        ui.d.setListen(false);\r\n        ui.h.setListen(false);\r\n        ui.i.setListen(false);\r\n        ui.y.setSelectedValue(parsedValue.y);\r\n\r\n        ui.m.setListen(true);\r\n        ui.m.setSelectedValue(parsedValue.m);\r\n\r\n        ui.d.setListen(true);\r\n        ui.d.setSelectedValue(parsedValue.d);\r\n\r\n        ui.h.setListen(true);\r\n        ui.h.setSelectedValue(parsedValue.h);\r\n\r\n        ui.i.setListen(true);\r\n        ui.i.setSelectedValue(parsedValue.i);\r\n\r\n        this.value = this.getSelected().value;\r\n    };\r\n\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    DtPicker.prototype.isLeapYear = function (year) {\r\n        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);\r\n    };\r\n\r\n    DtPicker.prototype._inArray = function (array, item) {\r\n        for (var index in array) {\r\n            var _item = array[index];\r\n            if (_item === item) return true;\r\n        }\r\n        return false;\r\n    };\r\n\r\n    DtPicker.prototype.getDayNum = function (year, month) {\r\n        var self = this;\r\n        if (self._inArray([1, 3, 5, 7, 8, 10, 12], month)) {\r\n            return 31;\r\n        } else if (self._inArray([4, 6, 9, 11], month)) {\r\n            return 30;\r\n        } else if (self.isLeapYear(year)) {\r\n            return 29;\r\n        } else {\r\n            return 28;\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype._fill = function (num) {\r\n        num = num.toString();\r\n        if (num.length < 2) {\r\n            num = 0 + num;\r\n        }\r\n        return num;\r\n    };\r\n\r\n    DtPicker.prototype._isBeginYear = function () {\r\n        return this.options.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.options.beginMonth && this._isBeginYear() && this.options.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.options.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.options.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.options.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.options.endMonth && this._isEndYear() && this.options.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.options.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.options.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (options.customData.y) {\r\n            yArray = options.customData.y;\r\n        } else {\r\n            var yBegin = options.beginYear;\r\n            var yEnd = options.endYear;\r\n            for (var y = yBegin; y <= yEnd; y++) {\r\n                yArray.push({\r\n                    text: y + '',\r\n                    value: y\r\n                });\r\n            }\r\n        }\r\n        ui.y.setItems(yArray);\r\n        //ui.y.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMonth = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (options.customData.m) {\r\n            mArray = options.customData.m;\r\n        } else {\r\n            var m = options.beginMonth && self._isBeginYear() ? options.beginMonth : 1;\r\n            var maxMonth = options.endMonth && self._isEndYear() ? options.endMonth : 12;\r\n            for (; m <= maxMonth; m++) {\r\n                var val = self._fill(m);\r\n                mArray.push({\r\n                    text: val,\r\n                    value: m\r\n                });\r\n            }\r\n        }\r\n        ui.m.setItems(mArray);\r\n        //ui.m.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createDay = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (options.customData.d) {\r\n            dArray = options.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? options.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? options.endDay : self.getDayNum(parseInt(this.ui.y.getSelectedValue()), parseInt(this.ui.m.getSelectedValue()));\r\n            for (; d <= maxDay; d++) {\r\n                var val = self._fill(d);\r\n                dArray.push({\r\n                    text: val,\r\n                    value: d\r\n                });\r\n            }\r\n        }\r\n        ui.d.setItems(dArray);\r\n        //current = current || ui.d.getSelectedValue();\r\n        //ui.d.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createHours = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (options.customData.h) {\r\n            hArray = options.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? options.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? options.endHours : 23;\r\n            for (; h <= maxHours; h++) {\r\n                var val = self._fill(h);\r\n                hArray.push({\r\n                    text: val,\r\n                    value: h\r\n                });\r\n            }\r\n        }\r\n        ui.h.setItems(hArray);\r\n        //ui.h.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMinutes = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (options.customData.i) {\r\n            iArray = options.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? options.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? options.endMinutes : 59;\r\n            for (; i <= maxMinutes; i++) {\r\n                var val = self._fill(i);\r\n                iArray.push({\r\n                    text: val,\r\n                    value: i\r\n                });\r\n            }\r\n        }\r\n        ui.i.setItems(iArray);\r\n        //ui.i.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._setLabels = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = options.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.cancel.text(options.buttons[0]);\r\n        ui.ok.text(options.buttons[1]);\r\n\r\n        if(options.hasClear){\r\n            ui.clear.text(options.buttons[2])\r\n        }else{\r\n            ui.clear.hide();\r\n        }\r\n\r\n        ui.buttons.each(function (index) {\r\n            $(this).click(function () {\r\n                self.clickCall(index);\r\n            })\r\n        })\r\n    };\r\n\r\n    // 解析设置的值,目前是字符串,完整日期格式 2012-12-12 12:21\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.options.type;\r\n\r\n        var rs = {\r\n            y: now.getFullYear(),\r\n            m: now.getMonth()+1,\r\n            d: now.getDate(),\r\n            h: now.getHours(),\r\n            i: now.getMinutes()\r\n        };\r\n\r\n        if(value instanceof Date){\r\n            if( type == 'time'){\r\n                valu= +value.getHours()+\":\"+value.getMinutes();\r\n            }else{\r\n                value = value.getFullYear()+'-'+(value.getMonth()+1)+'-'+value.getDate()+ ' '\r\n                    +value.getHours()+\":\"+value.getMinutes();\r\n            }\r\n        }\r\n\r\n        var parts = value.replace(\":\", \"-\").replace(\" \", \"-\").split(\"-\");\r\n        for(var i=0, j=parts.length; i<j; i++){\r\n            parts[i] = parseInt(parts[i]);\r\n        }\r\n\r\n        if(type == 'datetime'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = parts[4];\r\n        }else if(type == 'date'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }else if(type == 'time'){\r\n            rs.h = parts[0];    //\r\n            rs.i = parts[1];\r\n        }else if(type == 'hour'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = 0;\r\n        }else if(type == 'month'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = 1;    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }\r\n\r\n        return rs;\r\n    };\r\n\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var options = this.options;\r\n        var now = defaultPickerDate;\r\n\r\n        var beginDate = options.beginDate;\r\n        if(beginDate){\r\n            beginDate = this._parseSetValue(beginDate);\r\n            options.beginYear = beginDate.y;\r\n            options.beginMonth = beginDate.m;\r\n            options.beginDay = beginDate.d;\r\n            options.beginHours = beginDate.h;\r\n            options.beginMinutes = beginDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.beginYear =  now.getFullYear();\r\n            options.beginMonth = now.getMonth() + 1;\r\n            options.beginDay = now.getDate();\r\n            options.beginHours = 0;\r\n            options.beginMinutes = 0;\r\n        }else {\r\n            options.beginYear =  now.getFullYear() - 5;\r\n        }\r\n\r\n        var endDate = options.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            options.endYear = endDate.y;\r\n            options.endMonth = endDate.m;\r\n            options.endDay = endDate.d;\r\n            options.endHours = endDate.h;\r\n            options.endMinutes = endDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.endYear =  now.getFullYear();\r\n            options.endMonth = now.getMonth() + 1;\r\n            options.endDay = now.getDate();\r\n            options.endHours = 24;\r\n            options.endMinutes = 59;\r\n        }else {\r\n            options.endYear =  options.beginYear + 10 ;\r\n        }\r\n\r\n        //生成\r\n        self._createYear();\r\n        self._createMonth();\r\n        self._createDay();\r\n        self._createHours();\r\n        self._createMinutes();\r\n    };\r\n\r\n    // 更新选择框,更新当前值\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.options.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    // 判断最大最小值合理性\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.options.endDate = date;\r\n        this._create();\r\n    };\r\n\r\n    DtPicker.prototype.dispose = function () {\r\n        var self = this;\r\n        self.hide();\r\n        setTimeout(function () {\r\n            self.ui.picker.parentNode.removeChild(self.ui.picker);\r\n            for (var name in self) {\r\n                self[name] = null;\r\n                delete self[name];\r\n            }\r\n            self.disposed = true;\r\n        }, 300);\r\n    };\r\n\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    DtPicker.prototype.clickCall = function(index){\r\n        var self = this;\r\n        var sltDate = self.getSelected();\r\n        var rs = self.options.callBack.call(this , sltDate, index);\r\n        if (rs !== false) {\r\n            if(index == 1){ // 假定确认按钮在第二个位置,传回true则存储当前值\r\n                self.value = sltDate.value;\r\n            }else if(index == 2){\r\n                self.value = null;\r\n            }\r\n            self.hide();\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    DtPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.clickCall(0);\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.dtPicker = function(options){\r\n        return new DtPicker(options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","// 支持非循环\r\n// size命名用的有点混淆。。\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n\r\n(function (ipu, $, Hammer) {\r\n    function HammerCarousel(navSlt, options) {\r\n        this.options = options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(navSlt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    // 直接替换掉了prototype对象,可能不是个好选择\r\n    HammerCarousel.prototype = {\r\n        defaultOptions: {\r\n            index: null,        // 默认显示第几个项,其实挺没用的,默认显示第一个,用户再调用一下显示第几个,作用一样现在。\r\n            autoPlay: false,    // 是否自动轮播\r\n            duration: 3000,     // 轮播间隔\r\n            indicator: false,  //是否生成指示器,即小点点\r\n            callBack: null,  // 轮播后回调函数\r\n            clickBack: null   // 各子项用户点击事件\r\n            //indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\r\n\r\n\r\n            this.showSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n            this.carouselItemSizes = [];\r\n            this.currentIndex = 0;\r\n            this.moveLen = 0;\r\n            this.lastItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来判断是复制项\r\n\r\n            // 这里假设每个元素都是相等的\r\n            this.carouselItems.slice(0, this.showSize).clone().appendTo(this.wrapper); // 如果做无限循环则要这样处理\r\n            this.size = this.carouselItems.size();\r\n\r\n            var self = this;\r\n            if(this.options.clickBack){\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        self.options.clickBack.call(this, i%self.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this.sizeCount();\r\n            var that = this;\r\n\r\n            this.hammer = new Hammer.Manager(this.el); // 避免因为li里面的内容高度不够,而不能触发相关事件\r\n            this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_HORIZONTAL, threshold: 10}));\r\n            this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this.onPan, this));\r\n\r\n            $(window).resize(function () { // 在尺寸变化时,处理,是否可以考虑只在宽度变化时处理,横屏事件?\r\n                that.refresh();\r\n            });\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.options.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.options.index);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.options.autoPlay = false;\r\n        },\r\n        _pause: function () {\r\n            if (this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            if (index == this.size - 1) {\r\n                this._show(this.size, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        next: function () {//下一张\r\n            var index = this.currentIndex == this.size ? 1 : this.currentIndex + 1;\r\n            if (index == 1) {\r\n                this._show(0, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % size;\r\n            if(index < 0 ){\r\n                index = size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        play: function () {\r\n            this.options.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.options.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    that.timeoutId = null;//清空这个timeoutId,代表该次处理已经执行了\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {//移动结束时调用\r\n            var currentIndex = this.currentIndex;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n\r\n            this._play();//处理自动播放\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        sizeCount: function () {\r\n            this.wrapperSize = this.wrapper.outerWidth(true);\r\n            this.itemSize = this.carouselItems.eq(0).outerWidth(true);\r\n            this.mostSize = this.size * this.itemSize; // 宽度*数量\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\").width();\r\n\r\n            var that = this;\r\n            $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n                that.carouselItemSizes[index] = $(this).position().left;\r\n            });\r\n        },\r\n        refresh: function () {\r\n            if (this.wrapperSize != this.wrapper.outerWidth(true)) {\r\n                this.sizeCount();\r\n                this._show(this.currentIndex, true); //新的位置\r\n            }\r\n        },\r\n        move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\");\r\n            var move = (this.moveLen - moveLen) % this.mostSize;\r\n            move = (move + this.mostSize) % this.mostSize;\r\n            this.displayMoveLen = move;\r\n\r\n            move = -move + \"px\";\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        },\r\n        _show: function (index, animate) { // 知道最终移动到的项时,调用\r\n            if (animate !== false) { // 默认值为true\r\n                animate = true;\r\n            }\r\n\r\n            this._pause();\r\n            $(this.wrapper).toggleClass(\"ui-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            //this.currentIndex = index;\r\n            this.lastItem = index == this.size;\r\n            var move = this.carouselItemSizes[index];\r\n            this.moveLen = move;\r\n            move = -move + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n            if (animate) {\r\n                this._end();\r\n            }\r\n        },\r\n        onPan: function (ev) {\r\n            var delta = ev.deltaX;\r\n            // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n            if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n                var value = delta / this.itemSize;\r\n                var intValue = parseInt(Math.abs(value));               // 取整数\r\n                var decimal = Math.abs(value) % 1;                   // 取小数\r\n\r\n                if (decimal > 0.2) { // 滑动超过页面宽20%;\r\n                    intValue = intValue + 1;\r\n                }\r\n                if (value > 0) {\r\n                    intValue = -intValue;\r\n                }\r\n\r\n                var index = (this.currentIndex + intValue) % this.size;\r\n                index = (index + this.size) % this.size; // 因为可能是个负值,转换成正值\r\n\r\n                // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n                if (index == 0 && this.displayMoveLen > this.itemSize) {\r\n                    index = this.size;\r\n                }\r\n                this._show(index);\r\n            } else if (ev.type == 'panmove'){\r\n                this.move(delta);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.hammerCarousel = function (slt, options) {\r\n        return new HammerCarousel(slt, options);\r\n    };\r\n})(ipu || window, jQuery,  Hammer);\r\n","(function (ipu, $) {\r\n    //$ extends\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        // console.log('__dealCssEvent');\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            /*jshint validthis:true */\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.transitionEnd = function (callback) {\r\n        // console.log('transitionEnd');\r\n        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalStack: true,\r\n        modalButtonOk: '确定',\r\n        modalButtonCancel: '取消',\r\n        modalPreloaderTitle: '加载中',\r\n        modalContainer: document.body ? document.body : 'body'\r\n    };\r\n\r\n    ipu.modalStack = [];\r\n\r\n    ipu.modalStackClearQueue = function () {\r\n        if (ipu.modalStack.length) {\r\n            (ipu.modalStack.shift())();\r\n        }\r\n    };\r\n    ipu.modal = function (params) {\r\n        params = params || {};\r\n        var modalHTML = '';\r\n        var buttonsHTML = '';\r\n        if (params.buttons && params.buttons.length > 0) {\r\n            for (var i = 0; i < params.buttons.length; i++) {\r\n                buttonsHTML += '<span class=\"ui-modal-button' + (params.buttons[i].bold ? ' ui-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\r\n            }\r\n        }\r\n        var extraClass = params.extraClass || '';\r\n        var titleHTML = params.title ? '<div class=\"ui-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ui-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ui-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ui-modal-buttons-vertical' : '';\r\n        modalHTML = '<div class=\"ui-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ui-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ui-modal-buttons ' + verticalButtons + '\">' + buttonsHTML + '</div></div>';\r\n\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n\r\n        var modal = $(_modalTemplateTempDiv).children();\r\n\r\n        $(defaults.modalContainer).append(modal[0]);\r\n\r\n        // Add events on buttons\r\n        modal.find('.ui-modal-button').each(function (index, el) {\r\n            $(el).on('click', function (e) {\r\n                if (params.buttons[index].close !== false) ipu.closeModal(modal);\r\n                if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\r\n                if (params.onClick) params.onClick(modal, index);\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n    ipu.alert = function (text, title, callbackOk) {\r\n        if (typeof title === 'function') {\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\r\n        });\r\n    };\r\n    ipu.confirm = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [\r\n                {text: defaults.modalButtonCancel, omodalButtonCancelnClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n    ipu.prompt = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            afterText: '<input type=\"text\" class=\"ui-modal-text-input\">',\r\n            buttons: [\r\n                {\r\n                    text: defaults.modalButtonCancel\r\n                },\r\n                {\r\n                    text: defaults.modalButtonOk,\r\n                    bold: true\r\n                }\r\n            ],\r\n            onClick: function (modal, index) {\r\n                if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ui-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ui-modal-text-input').val());\r\n            }\r\n        });\r\n    };\r\n\r\n    var minLoad = false;        // 是否最小时间调用方式\r\n    var loadOverTime = false;   // 是否超过最小调用时间\r\n    var loadEnd = false;        // 是否调用结束\r\n    var loadTimeOut = null;     // 延时调用ID\r\n\r\n    ipu.showPreloader = function (title, minTime) {\r\n        ipu.hidePreloader(true);\r\n\r\n        ipu.showPreloader.preloaderModal = ipu.modal({\r\n            title: title || defaults.modalPreloaderTitle,\r\n            text: '<div class=\"ui-preloader\"></div>'\r\n        });\r\n\r\n        if(minTime){\r\n            minLoad = true;\r\n            loadTimeOut = setTimeout(function () {\r\n                loadOverTime = true;\r\n                if(loadEnd){\r\n                    ipu.hidePreloader();\r\n                }\r\n            }, minTime);\r\n        }\r\n\r\n        return ipu.showPreloader.preloaderModal;\r\n    };\r\n    ipu.hidePreloader = function (force) {\r\n        if(force || !minLoad || (minLoad && loadOverTime)){\r\n            if(force && loadTimeOut){\r\n                window.clearTimeout(loadTimeOut);\r\n            }\r\n            ipu.showPreloader.preloaderModal && ipu.closeModal(ipu.showPreloader.preloaderModal);\r\n            minLoad = false; // 重置各标志位\r\n            loadOverTime = false;\r\n            loadEnd = false;\r\n            loadTimeOut = null;\r\n        }else{\r\n            loadEnd = true;\r\n        }\r\n    };\r\n    ipu.showIndicator = function () {\r\n        if ($('.ui-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ui-preloader-indicator-overlay\"></div><div class=\"ui-preloader-indicator-modal\"><span class=\"ui-preloader ui-preloader-white\"></span></div>');\r\n    };\r\n    ipu.hideIndicator = function () {\r\n        $('.ui-preloader-indicator-overlay, .ui-preloader-indicator-modal').remove();\r\n    };\r\n    // Action Sheet\r\n    ipu.actions = function (params) {\r\n        var modal, groupSelector, buttonSelector;\r\n        params = params || [];\r\n\r\n        if (params.length > 0 && !$.isArray(params[0])) {\r\n            params = [params];\r\n        }\r\n        var modalHTML;\r\n        var buttonsHTML = '';\r\n        for (var i = 0; i < params.length; i++) {\r\n            for (var j = 0; j < params[i].length; j++) {\r\n                if (j === 0) buttonsHTML += '<div class=\"ui-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ui-actions-modal-label' : 'ui-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ui-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ui-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ui-bg-' + button.bg;\r\n                if (button.disabled) buttonClass += ' disabled';\r\n                buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\r\n                if (j === params[i].length - 1) buttonsHTML += '</div>';\r\n            }\r\n        }\r\n        modalHTML = '<div class=\"ui-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ui-actions-modal-group';\r\n        buttonSelector = '.ui-actions-modal-button';\r\n\r\n        var groups = modal.find(groupSelector);\r\n        groups.each(function (index, el) {\r\n            var groupIndex = index;\r\n            $(el).children().each(function (index, el) {\r\n                var buttonIndex = index;\r\n                var buttonParams = params[groupIndex][buttonIndex];\r\n                var clickTarget;\r\n                if ($(el).is(buttonSelector)) clickTarget = $(el);\r\n                // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\r\n\r\n                if (clickTarget) {\r\n                    clickTarget.on('click', function (e) {\r\n                        if (buttonParams.close !== false) ipu.closeModal(modal);\r\n                        if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n                    });\r\n                }\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n\r\n    //显示一个消息,会在2秒钟后自动消失\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ui-modal ui-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n        ipu.openModal($toast, function () {\r\n            setTimeout(function () {\r\n                ipu.closeModal($toast);\r\n            }, duration || 2000);\r\n        });\r\n    };\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isNotToast = !modal.hasClass('ui-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n        if ($('.ui-modal.ui-modal-in:not(.ui-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\r\n            ipu.modalStack.push(function () {\r\n                ipu.openModal(modal, cb);\r\n            });\r\n            return;\r\n        }\r\n        var isPopup = modal.hasClass('ui-popup');\r\n        var isLoginScreen = modal.hasClass('ui-login-screen');\r\n        var isPickerModal = modal.hasClass('ui-picker-modal');\r\n        var isToast = modal.hasClass('ui-toast');\r\n        if (isModal) {\r\n            modal.show();\r\n            modal.css({\r\n                marginTop: -Math.round(modal.outerHeight() / 2) + 'px'\r\n            });\r\n        }\r\n        if (isToast) {\r\n            modal.css({\r\n                marginLeft: -Math.round(modal.outerWidth() / 2 ) + 'px' //1.185 是初始化时候的放大效果\r\n            });\r\n        }\r\n\r\n        var overlay;\r\n        if (!isLoginScreen && !isPickerModal && !isToast) {\r\n            if ($('.ui-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ui-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        }\r\n\r\n        //Make sure that styles are applied, trigger relayout;\r\n        var clientLeft = modal[0].clientLeft;\r\n\r\n        // Trugger open event\r\n        modal.trigger('open');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).addClass('ui-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('ui-modal-overlay-visible');\r\n        modal.removeClass('ui-modal-out').addClass('ui-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n        });\r\n        // excute callback\r\n        if (typeof cb === 'function') {\r\n            cb.call(this);\r\n        }\r\n        return true;\r\n    };\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ui-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isPopup = modal.hasClass('ui-popup'),\r\n            isToast = modal.hasClass('ui-toast'),\r\n            isLoginScreen = modal.hasClass('ui-login-screen'),\r\n            isPickerModal = modal.hasClass('ui-picker-modal'),\r\n            removeOnClose = modal.hasClass('ui-remove-on-close'),\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ui-popup.ui-modal-in').length) {\r\n                overlay.removeClass('ui-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ui-modal-overlay-visible');\r\n        }\r\n        modal.trigger('close');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).removeClass('ui-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ui-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ui-modal-in').addClass('ui-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ui-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ui-modal-out').hide();\r\n                if (removeOnClose && modal.length > 0) {\r\n                    modal.remove();\r\n                }\r\n            }\r\n            else {\r\n                modal.remove();\r\n            }\r\n        });\r\n        if (isModal && defaults.modalStack) {\r\n            ipu.modalStackClearQueue();\r\n        }\r\n\r\n        return true;\r\n    };\r\n    function handleClicks(e) {\r\n        /*jshint validthis:true */\r\n        var clicked = $(this);\r\n        var url = clicked.attr('href');\r\n\r\n\r\n        //Collect Clicked data- attributes\r\n       /* var clickedData = clicked.dataset();\r\n\r\n        // Popup\r\n        var popup;\r\n        if (clicked.hasClass('ui-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ui-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ui-modal-overlay')) {\r\n            if ($('.ui-modal.ui-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ui-modal.ui-modal-in');\r\n            if ($('.ui-actions-modal.ui-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ui-actions-modal.ui-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ui-popup-overlay')) {\r\n            if ($('.ui-popup.ui-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ui-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ui-modal-overlay, .ui-popup-overlay, .ui-close-popup, .ui-open-popup, .ui-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n    NavBar.prototype.defaultOpt = {\r\n        animate: false,           // 默认有动画\r\n        contentSlt: \".ui-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) { // currentIndex: 当前索引,lastIndex上一次索引(第一次时为null)\r\n        }\r\n    };\r\n\r\n    function NavBar(slt, options) {\r\n        this.options = $.extend({}, this.defaultOpt, options);\r\n        this.content = $(this.options.contentSlt);\r\n        this.nav = $(slt);\r\n        this.wrapper = $(\">ul\", this.content);\r\n        this.contents = $(\">li\", this.wrapper);\r\n        this.navs = $(\">a\", this.nav);\r\n        var me = this;\r\n\r\n        var activeIndex = this.navs.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.options.animate) {\r\n            this.wrapper.addClass(\"ui-no-animation\")\r\n        }\r\n\r\n        this.navs.each(function (index, i) {\r\n            $(this).click(function () {\r\n                me.show(index);\r\n            });\r\n        });\r\n\r\n        this.lastIndex = null;\r\n        this.currentIndex = null;\r\n        me.show(this.options.index);\r\n    }\r\n\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            var currentContent = $(this.contents[index]).addClass(\"ui-show\");\r\n\r\n            if (this.options.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ui-show\"); // 隐藏上上个元素\r\n                }\r\n\r\n                if (this.currentIndex != null) {        // 非第一次需要动画效果\r\n                    if (this.currentIndex < index) {   // 需要内容为往左走,显示右边的内容\r\n                        if (this.lastIndex != null && this.lastIndex < this.currentIndex) {  // 内容已经左走过了,则需要移除动画复原位置,再通过width()方法强制生效\r\n                            this.wrapper.addClass(\"ui-no-animation\").removeClass(\"ui-nav-content-right\").width(); // 可以强制刷新,默认jquery应该会将这些dom上的修改延时处理?\r\n                        }\r\n                    } else {\r\n                        if (this.lastIndex == null || this.lastIndex > this.currentIndex) { // 类似同上\r\n                            this.wrapper.addClass(\"ui-no-animation\").addClass(\"ui-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ui-no-animation\").toggleClass(\"ui-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ui-show\");\r\n            }\r\n\r\n            // 更新class,ui-current状态\r\n            $(this.contents[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n            $(this.navs[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.navBar = function (slt, options) {\r\n        return new NavBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\n    function __dealCssEvent(eventNameArr, callback) {\n        var events = eventNameArr,\n            i, dom = this;// jshint ignore:line\n\n        function fireCallBack(e) {\n            if (e.target !== this) return;\n            callback.call(this, e);\n            for (i = 0; i < events.length; i++) {\n                dom.off(events[i], fireCallBack);\n            }\n        }\n\n        if (callback) {\n            for (i = 0; i < events.length; i++) {\n                dom.on(events[i], fireCallBack);\n            }\n        }\n    }\n\n    $.fn.animationEnd = function (callback) {\n        __dealCssEvent.call(this, ['webkitAnimationEnd', 'animationend'], callback);\n        return this;\n    };\n\n    function submitForm(doc, url ,params){\n        var form = doc.createElement(\"form\");\n        form.action = url;\n        form.method = \"post\";\n        form.style.display = \"none\";\n\n        for (var x in params) {\n            var ele = doc.createElement(\"input\");\n            ele.type=\"hidden\";\n            ele.name = x;\n            ele.value =  params[x];\n            form.appendChild(ele);\n        }\n\n        doc.body.appendChild(form);\n        form.submit();\n    }\n\n    // 检查是否有ui-pages的结构\n    function checkPages() {\n        if(!hasPages){\n            pagesObj = $(\".ui-pages\"); // pagesObj为空则进行jquery取值\n            if(pagesObj.size() == 0){\n                pagesObj =  $(\"<div class='ui-pages'><div class='ui-page ui-show \"+zeroPageClass+\"' id='\"+pageIdPrefix+\"0'></div>\").appendTo(\"body\");\n            }\n            hasPages = true;\n        }\n    }\n\n    // 站位页面\n    function isZeroPage(page) {\n        return $(page).hasClass(zeroPageClass);\n    }\n\n    var page = {};\n    var hasPages = false;\n    var maps = {};\n    var pageNo = 1; // 编号0留给主页面或当前页面,或没有\n    var pageIdPrefix = \"ipuPage-\";\n    var pagesObj = null;\n    var animateInClass = \"ui-anim ui-slideRightIn\";\n    var animateOutClass  = \"ui-anim ui-slideRightOut\";\n    var eventName = \"ipuUIPageBack\";\n    var zeroPageClass = 'ui-page-zero';   // 占位页面,对于为当前页面\n    var zeroPagesClass = 'ui-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\n\n\n\n    page.options = {     // 那个窗口执行open,默认父窗口\n        target: window.parent, // 默认执行父窗口,方法:all\n        backIndex: -1,    // 默认回退一页         方法:back\n        closeIndex: -1,   // 默认关闭最近一个页面 方法:close\n        params:{},        // post的传参            方法:post\n        animate: true,     // 是否动画效果        方法:open post\n        showLoading: true,   // 是否显示加载消息  方法:open post\n        loadingMessage: '正在加载中',  //          方法:open post\n        method : null,     // 请求方式,内置参数,方法自己设置,用户不需要设置  方法:无\n        minMessageTime: 500, // 最小显示加载时间,避免出现闪现的情况 方法:open post\n        data: null,         // 回退时,回传参数, 方法:back\n        pageName: '',     // 给打开的页面命名,以便根据此页面名称来切换页面 方法:open post back close\n        callBack:function () { // 事件回调       方法:open post close back\n        }\n    };\n\n    // 当前页面加载,针对顶层父窗口\n    page.openPage = function (url, options) {\n        var newPage = null;\n        var nowPageNo = pageIdPrefix + (pageNo++);\n        maps[nowPageNo] = url;\n\n        checkPages();\n\n        if(options.showLoading){\n            ipu.showPreloader(options.loadingMessage, options.minMessageTime);\n        }\n\n        if(options.method == 'post'){\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe'></iframe></div>\");\n        }else{\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe' src='\"+url+\"'></iframe></div>\");\n        }\n\n        var zeroPage = isZeroPage($(\".ui-page:last\", pagesObj));\n        var animatePage = newPage;\n        if(zeroPage){\n            animatePage = pagesObj.addClass(zeroPagesClass);\n        }\n\n        function end() {\n            if(options.showLoading) {\n                ipu.hidePreloader();\n            }\n\n            if(options.animate) {\n                animatePage.removeClass(animateInClass);\n            }\n\n            newPage.siblings(\".ui-show\").removeClass('ui-show');\n            if(options.callBack){\n                options.callBack();\n            }\n        }\n\n        $(\".ui-page-iframe\", newPage).one('load', function () {\n            newPage.addClass(\"ui-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\n\n            if(zeroPage){\n                animatePage.removeClass(zeroPagesClass);\n            }\n            if(options.animate){\n                animatePage.addClass(animateInClass).animationEnd(end);\n            }else{\n                end();\n            }\n        });\n\n        newPage.appendTo(pagesObj);\n        if(options.method == 'post') {\n            var pageDoc = $(\".ui-page-iframe\", newPage)[0].contentDocument;\n            submitForm(pageDoc, url, options.params);\n        }\n    };\n\n    // post方式加载页面\n    page.postPage = function (url, options) {\n        options.method = 'post';\n        page.openPage(url, options);\n    };\n\n    // 当前页面后退,针对顶层父窗口\n    page.backPage = function (options) {\n        var backIndex = options.backIndex;\n        var page = null;\n        var nowPage = $(\".ui-page.ui-show\", pagesObj);\n\n        if(options.pageName){\n            page =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj);\n        }else if(backIndex == 0){\n            page = $(\".ui-page:first\", pagesObj);\n        }else { // 越界的情况\n            var prevPage = nowPage.prevAll(\".ui-page\");\n            if(backIndex < 0){\n                page= $(prevPage[-backIndex - 1]);\n            }else{\n                page= $(prevPage[prevPage.size() - backIndex]);\n            }\n        }\n\n        var animatePage = nowPage;\n        var zeroPage = isZeroPage(page);\n\n        // 主页面模式时\n        if(zeroPage){\n            animatePage = pagesObj;\n        }else{\n            page.addClass(\"ui-show\"); //显示前一个\n        }\n\n        function end (){\n            $(this).removeClass(animateOutClass);\n            page.nextAll(\".ui-page\").remove();\n\n            var iframe = $(\".ui-page-iframe\", page);\n            var nowDoc;\n\n            if(iframe.size() == 0){ // 找不到子窗口就当是返回了主页面,在当前窗口触发\n                nowDoc = window.document;\n            }else{\n                nowDoc = iframe[0].contentDocument;\n            }\n\n            if(zeroPage){\n                pagesObj.addClass(zeroPagesClass);\n            }\n\n            var evt = nowDoc.createEvent('Event');\n            evt.initEvent(eventName, true, true);\n            if(options.data){\n                evt.data = options.data;\n            }\n            nowDoc.body.dispatchEvent(evt);\n            if(options.callBack){\n                options.callBack();\n            }\n        }\n\n        if(options.animate){\n            animatePage.addClass(animateOutClass).animationEnd(end);\n        }else{\n            end();\n        }\n    };\n\n    // 往前关闭窗口\n    page.closePage = function (options) {\n        var closeIndex = options.closeIndex;\n        var prevPage = $(\".ui-page.ui-show\", pagesObj).prevAll(\".ui-page\");\n\n        if(options.pageName){\n            closeIndex =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj).index();\n        }else if(closeIndex < 0){\n            closeIndex = -closeIndex -1;\n        }else{\n            closeIndex = prevPage.size() - closeIndex;\n        }\n\n        $(prevPage[closeIndex]).remove();\n        if(options.callBack){\n            options.callBack();\n        }\n    };\n\n    // 调用父窗口打开页面\n    page.open = function (url, options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.openPage(url, options);\n    };\n\n    // post方法\n    page.post = function (url, options) {\n        options = $.extend({}, this.options, options);\n        options.method = 'post';\n        options.target.ipu.page.openPage(url, options);\n    };\n\n    // 调用父窗口,回退\n    page.back = function (options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.backPage(options);\n    };\n\n    // 返回首页\n    page.backHome = function (options) {\n        options = options || {};\n        options.backIndex = 0;\n        page.back(options);\n    };\n\n    // 子窗口,待确认\n    page.close = function (options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.closePage(options);\n    };\n\n    // 添加回调事件\n    page.onBack = function (back) {\n        $(\"body\").on(eventName, function (e) {\n            var data = e.originalEvent.data;\n            back(data);\n        });\n    };\n\n    // 提供一个关闭一群窗口的方法\n    ipu.page = page;\n})(ipu || window, jQuery);\n","// picker\r\n(function (ipu, $, Hammer) {\r\n    var showItemSize = 9;   // 显示的子项数量,\r\n    var r = 90;             // 计算旋转的圆半径,结果应该缩小,是为了r不要距离容器太近\r\n    var itemAngle = 180 / showItemSize;   // 每项对应的角度是 180/9 = 20\r\n    var maxExceed = itemAngle;         // 滚动时允许超出边界的最大角度\r\n    // itemHeight = 40px;       // 需要给出r=89是怎么计算出来的,是根据 40/2/Math.tan(40/2/180*Math.PI)=113,直接太大不好看\r\n\r\n    function Picker(slt, options) {\r\n        this.el = $(slt)[0];\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this._init();\r\n    }\r\n\r\n    // 默认参数\r\n    Picker.prototype.defaultOptions = {\r\n        onChange: function () {       // 子项选中事件\r\n        },\r\n        listen: true,                  // 默认已开记监听变化\r\n        data: []\r\n    };\r\n\r\n    Picker.prototype._init = function () {\r\n        var self = this;\r\n        this.wrap = $(\">ul\", this.el);\r\n        this.index = null;\r\n        this.listen = !!this.options.listen;\r\n\r\n        this.beginAngle = 0;\r\n        this.beginExceed = this.beginAngle - maxExceed;       // 最小角度值\r\n        this.stopInertiaMove = false;\r\n        this.lastAngle = null; // 保存滑动前的角度\r\n        this.empty = this.options.data.length == 0;\r\n\r\n        // 如果是ios,则ul的旋转中心点,有变化\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+r+\"px\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n        this.hammer = new Hammer.Manager(this.el);\r\n        this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_VERTICAL, threshold: 5}));\r\n        this.hammer.add(new Hammer.Press({threshold: 4}));  //\r\n        this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this._onPan, this));\r\n\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\r\n           // console.log('press');\r\n            if(this.empty){\r\n                return ;\r\n            }\r\n\r\n            self.stopInertiaMove = true;\r\n            if (e.type == 'pressup') {\r\n                self.endScroll();\r\n            }\r\n        });\r\n\r\n        this.setItems(this.options.data);\r\n    };\r\n\r\n    Picker.prototype.setItems = function (data, textName) {\r\n        this.wrap.empty(); // 清空历史数据\r\n        this.data = data = data || [];\r\n        this.empty = data.length == 0; // 数据是否为空\r\n\r\n        this.newData = true; // 表示设置了新数据,触发change回调,但第一次设置时,不需要触发\r\n        var self = this;\r\n        var lis = \"\";\r\n        textName = textName || 'text';\r\n\r\n        for (var i = 0, j = data.length; i < j; i++) {\r\n            lis = lis + \"<li>\" + data[i][textName] + \"</li>\";\r\n        }\r\n\r\n        $(lis).appendTo(this.wrap);\r\n\r\n        this.items = $(\">li\", this.wrap);\r\n        this.itemsSize = this.items.size();\r\n\r\n        this.endAngle = (this.empty ? 0 : this.itemsSize - 1) * itemAngle;\r\n        this.endExceed = this.endAngle + maxExceed;  // 最大旋转角度值\r\n\r\n        // 初始化各子项角度\r\n        this.items.each(function (i) {\r\n            $(this).css({\r\n                \"transform\": \"translateZ(\" + r + \"px) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + r + \"px\"\r\n            });\r\n            $(this).click(function () {\r\n                self.stopInertiaMove = true;\r\n                self.setAngle(i * itemAngle, true);\r\n            })\r\n        });\r\n\r\n        var newAngle ;\r\n        if(this.empty || this.index == null){\r\n            newAngle = 0;\r\n        }else {\r\n            if(this.index > this.itemsSize - 1){\r\n                newAngle = (this.itemsSize - 1) * itemAngle;\r\n            }else{\r\n                newAngle = this.index * itemAngle;\r\n            }\r\n        }\r\n        this.setAngle(newAngle, true);\r\n\r\n        /*if (this.index !== null) { // 当前已经旋转则,保留当前的索引\r\n         if (this.index > this.itemsSize - 1 && !this.empty) {\r\n         this.index = this.itemsSize - 1;\r\n         }\r\n         this.setAngle(this.index * itemAngle, true);\r\n         } else { // 第一次初始数据,不触发change事件\r\n         this.index = 0;     // 被调用后,不能再使用null值了\r\n         this.setAngle(0, false); // 第一次设置初始化时,不触发change事件\r\n         }*/\r\n    };\r\n\r\n    Picker.prototype._onPan = function (ev) {\r\n        if(this.empty){\r\n            return ;\r\n        }\r\n\r\n        //console.log(ev.deltaX + \"==\"+ ev.deltaY);\r\n        if (ev.type == 'panstart') { // 好像一定要移动才有startg事件\r\n            self.stopInertiaMove = true;\r\n            this.lastAngle = this.angle;\r\n            this.wrap.addClass(\"ui-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\r\n           // console.log('panstart');\r\n\r\n        } else if (ev.type == 'panmove') {\r\n            var moveAngle = this.calcAngle(ev.deltaY);\r\n            var newAngle = this.lastAngle - moveAngle;   //最新的角度\r\n            //console.log('=='+newAngle);\r\n            // 一个可以转动的最小值和最大值过滤\r\n            if (newAngle < this.beginExceed) {\r\n                newAngle = this.beginExceed;\r\n            }\r\n            if (newAngle > this.endExceed) {\r\n                newAngle = this.endExceed;\r\n            }\r\n            this.setAngle(newAngle);\r\n\r\n        } else { // end or cancel事件\r\n            // console.log('end or cancel:' + ev.type);\r\n            var v = ev.overallVelocityY;    // 滑动的速度\r\n            var dir = v > 0 ? -1 : 1; //加速度方向\r\n            var deceleration = dir * 0.0006 * -1;\r\n            var duration = Math.abs(v / deceleration); // 速度消减至0所需时间\r\n            var dist = v * duration / 2; //最终移动多少\r\n\r\n            var startAngle = this.angle;\r\n            var distAngle = -this.calcAngle(dist);\r\n           //  console.log(\"dist=\" + dist + \", distAngle\" + distAngle);\r\n\r\n            //----\r\n            var srcDistAngle = distAngle;\r\n            if (startAngle + distAngle < this.beginExceed) {\r\n                distAngle = this.beginExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n            if (startAngle + distAngle > this.endExceed) {\r\n                distAngle = this.endExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n\r\n            if (distAngle == 0) {\r\n                this.endScroll();\r\n                return;\r\n            }\r\n            this.scrollDistAngle(startAngle, distAngle, duration);\r\n        }\r\n    };\r\n\r\n    // 计算移动的角度,转动的角度,就是移动的距离对应相关圆周\r\n    // 2*r*PI = 360,  angle = 360*c/(2*r*PI)\r\n    var ca = 360 / (2 * r * Math.PI);\r\n    Picker.prototype.calcAngle = function (c) {\r\n        return c * ca;\r\n    };\r\n\r\n    // endScroll 是否为结束的滚动结束,滚动结束需要调用结束事件\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(1000px) rotateY(0deg) rotateX(\" + newAngle + \"deg)\");\r\n        this.calcItemVisable(newAngle);\r\n\r\n        if (endScroll) {\r\n            var index = newAngle / itemAngle;\r\n            var oldIndex = this.index;\r\n            this.index = this.empty ? null : index; // 这里可以做一个判断,如果是empty,则index值可以不改变\r\n\r\n            // 这个地方要判断下,数据更新或索引更新都要触发\r\n            if (oldIndex != index || this.newData) {\r\n                this.newData = false;\r\n               // console.log('change');\r\n                if (this.options.onChange && this.listen) {\r\n                    // console.log('changed call');\r\n                    this.options.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n            }\r\n        }\r\n    };\r\n\r\n    // 计算子项的显示情况\r\n    Picker.prototype.calcItemVisable = function (angle) {\r\n        this.items.each(function (index) {\r\n            var difference = Math.abs(index * itemAngle - angle);\r\n\r\n            if (difference < itemAngle / 2) {\r\n                $(this).addClass(\"ui-highlight ui-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ui-highlight ui-visible\");\r\n            } else {\r\n                $(this).addClass(\"ui-visible\").removeClass(\"ui-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ui-noanimate\");\r\n        var endAngle;\r\n\r\n        if (this.angle < this.beginAngle) {\r\n            endAngle = this.beginAngle;\r\n        } else if (this.angle > this.endAngle) {\r\n            endAngle = this.endAngle;\r\n        } else {\r\n            var index = parseInt((this.angle / itemAngle).toFixed(0));\r\n            endAngle = (itemAngle * index);\r\n        }\r\n\r\n        this.setAngle(endAngle, true);\r\n    };\r\n\r\n    // 进行惯性滚动\r\n    Picker.prototype.scrollDistAngle = function (startAngle, distAngle, duration) {\r\n        var self = this;\r\n        var nowTime = new Date().getTime();\r\n        this.stopInertiaMove = false;\r\n        duration = 1 * duration; // 滚动时长控制修改\r\n\r\n        // hammer调用的惯性函数\r\n        (function (nowTime, startAngle, distAngle, duration) {\r\n            var frameInterval = 13;\r\n            var stepCount = duration / frameInterval;\r\n            var stepIndex = 0;\r\n\r\n            (function inertiaMove() {\r\n                if (self.stopInertiaMove) return;\r\n                var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);\r\n                self.setAngle(newAngle);\r\n                stepIndex++;\r\n\r\n                if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {\r\n                    self.endScroll();\r\n                    return;\r\n                }\r\n\r\n                setTimeout(inertiaMove, frameInterval);\r\n            })();\r\n\r\n        })(nowTime, startAngle, distAngle, duration);\r\n    };\r\n\r\n    Picker.prototype.setListen = function (bool) {\r\n        this.listen = !!bool;\r\n    };\r\n\r\n    Picker.prototype.quartEaseOut = function (t, b, c, d) {\r\n        return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n    };\r\n\r\n    Picker.prototype.setSelectedValue = function (value) {\r\n        var self = this;\r\n        for (var index in self.data) {\r\n            var item = self.data[index];\r\n            if (item.value == value) {\r\n                self.setAngle(index* itemAngle, true);\r\n                return;\r\n            }\r\n        }\r\n    };\r\n\r\n    // 获取当前选中的值\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    Picker.prototype.getSelectedIndex = function () {\r\n        return this.index;\r\n    };\r\n\r\n    ipu.Picker = Picker;\r\n\r\n})(ipu || window, jQuery, Hammer);\r\n","// popPicker\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n\r\n    function PopPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                        </div>\\\r\n                    </div>',\r\n        pickerTemplate: '<div class=\"ui-picker\">\\\r\n                            <div class=\"ui-picker-selectbox\"></div>\\\r\n                            <ul></ul>\\\r\n                          </div>',\r\n        data: [],    // 数据\r\n        layer: 1,   // 数据层级\r\n        btns: ['取消', '确认'],\r\n        callBack: function () { // 选择数据时的回调函数\r\n\r\n        }\r\n    };\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.options.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ui-poppicker-body\", this.holder);\r\n\r\n        var layer = this.options.layer;\r\n        var width = (100 / layer) + \"%\";\r\n        this.pickers = new Array(layer);\r\n        var self = this;\r\n        var pickerHtml;\r\n        this.mask = this.createMask();\r\n\r\n        // 先初始化最底层picerk,再上面来\r\n        for (var i = layer -1; i >=0; i--) {\r\n            pickerHtml = $(this.options.pickerTemplate).prependTo(bodyHtml).css({width: width});\r\n\r\n            this.pickers[i] = new  Picker(pickerHtml, {\r\n                onChange: (function (i) {\r\n                    return function (item, index) { // 更新底部的值\r\n                        if (i != layer - 1) {\r\n                            self.pickers[i + 1].setItems(item.data);\r\n                        }\r\n                    };\r\n                })(i)\r\n            });\r\n        }\r\n\r\n        $(\".ui-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.options.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.options.btns[1]);\r\n\r\n        $(\".ui-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.options.btns[0]);\r\n    };\r\n\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 获取相关值\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.options.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.options.layer; i++) {\r\n                rs.push(this.pickers[i].getSelectedItem());\r\n            }\r\n            return rs;\r\n        }\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    PopPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.hide();\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.popPicker = function (options) {\r\n        return new PopPicker(options);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n\r\n    /**\r\n     *进度条\r\n     */\r\n    function progressBar(id, options) {\r\n        this.id = id;\r\n        this.level = options.level;\r\n        this.progress = options.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (options.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (options.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    progressBar.prototype.setProgress = function (pro) {\r\n        if (pro < 0 || pro > 100) return;\r\n\r\n        $(this.progressBar.find(\".ipu-progressbar\")).css(\"transform\", \"translate3d(\" + (-(100 - pro)) + \"%, 0px, 0px)\");\r\n        this.progress = pro;\r\n    };\r\n\r\n    progressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    progressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-hightlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-highlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    ipu.progressBar = function (slt, options) {\r\n        return new progressBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $, iScroll) {\r\n\r\n    // 扩展参数,iscroll组件的参数选项\r\n    // 扩展参数,用户直接在页面上自定好,顶端和底部加载html\r\n    // 设置上下条件长度,或计算函数\r\n    // 处理resize的问题,用户主动调用refresh??\r\n    // 底部启用或停用时,应该刷新组件iscroll高度\r\n    // 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n    Refresh.prototype.defaultOptions = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ui-refresh-bottom\"><span class=\"ui-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ui-refresh-top\"><span class=\"ui-refresh-loading\"></span><div class=\"ui-refresh-arrow\"></div></div>',\r\n                // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n                // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ui-refresh-top-loading\r\n                // 拖动达到加载距离,则增加class:ui-refresh-toload\r\n                // 加载中,则增加class:ui-refresh-top-loading,移除class:ui-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOptions:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    function Refresh(slt, options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOptions = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ui-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ui-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ui-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ui-refresh-toload');\r\n                    }\r\n                }\r\n\r\n                me._checkBottomLoading(); // 底部加载条件和顶部条件不一样,只要滚动离底部一定高度就开始加载\r\n                me.goTop = this.y > me.topPullOffset; // 记录是否位于顶部位置,以便刷新后可以回到此位置\r\n            },\r\n            onBeforeScrollEnd: function () {    // 一定是用户拖动触发,在滚动结束前应该触发\r\n                me._checkTopLoading();\r\n                me._checkBottomLoading();\r\n            },\r\n            onScrollEnd: function () { // 这个事件可能由非用户拖动时触发,可能是拖动惯性导致,所有顶部不应该处理,但顶部不管是否惯性,位置条件满足即触发\r\n                if (me.topLoading && this.y < this.minScrollY && me.goTop) {\r\n                    me.iScroll.scrollTo(0, this.minScrollY, 0);\r\n                }\r\n                me._checkBottomLoading(); // 在beforend执行还不够,还在要end执行\r\n            },\r\n            onRefresh: function () { // 刷新时,若顶部加载还在进行,且当前显示的顶部加载,则继续显示,否则刷新后会消失顶部加载,这里代码没有考虑重用了,应该可以做一步提取\r\n                if (me.topLoading) { // 如果顶部在加载,则刷新的时候,设置最小顶部距离,显示顶部加载状态\r\n                    this.minScrollY = this.minScrollY + me.topPullOffset;\r\n                }\r\n            }\r\n        };\r\n\r\n        this.iScrollOptions = $.extend({}, this.options.iScrollOptions, this.iScrollOptions);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOptions);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ui-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.options.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.options.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.options.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        this.topLoading = false;        // 顶部正在载加载\r\n        this.bottomLoading = false;     // 底部正在加载\r\n        this.bottomEnable = this.options.initEnableBottom && !!this.options.bottomLoadFun;\r\n        this.topEnable = this.options.initEnableTop && !!this.options.topLoadFun;\r\n        this.goTop = false;         // 用来处理,因为iScroll使用momentum(惯性), 导致有时顶部显示不正确问题,true表示顶部显示加载条\r\n\r\n        this.enableBottom(this.bottomEnable);\r\n        this.enableTop(this.topEnable);\r\n    };\r\n\r\n    // 检查是否需要底部加载\r\n    Refresh.prototype._checkBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            if (this.iScroll.y < this.iScroll.maxScrollY + this.bottomPullOffset) {\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    Refresh.prototype._checkTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            if (this.topEl.hasClass('ui-refresh-toload')) {\r\n                this._startTopLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 检查内容是否超出容器高度,未超出时,自动调用底部加载\r\n    Refresh.prototype._checkContentLoading = function () {\r\n        if(this.iScroll.maxScrollY >= -this.bottomPullOffset){ // 此处要计算底端的高度\r\n            this._startBottomLoading();\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.options.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ui-refresh-toload').addClass('ui-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.options.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 结束底部加载\r\n    Refresh.prototype.endBottomLoading = function () {\r\n        this.bottomLoading = false;\r\n        this.refresh();\r\n    };\r\n\r\n    // 结束顶部加载\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ui-refresh-top-loading');\r\n        this.topLoading = false;\r\n        // this.iScroll.scrollTo(0, 0); // 刷新加载则应该回到顶部,待测试确认\r\n        this.refresh();\r\n    };\r\n\r\n    // 设置顶部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableTop = function (enable) {\r\n        this.topEnable = enable;\r\n        if (enable) {\r\n            this.topEl.show();\r\n        } else {\r\n            this.topEl.hide();\r\n        }\r\n    };\r\n\r\n    // 设置底部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableBottom = function (enable) {\r\n        this.bottomEnable = enable;\r\n        if (enable) {\r\n            this.bottomEl.show();\r\n        } else {\r\n            this.bottomEl.hide();\r\n        }\r\n    };\r\n\r\n    // 只有在内容发生变更时,但是又没有触发调用end相关方法时,使用此方法更新高度信息\r\n    // 或者组件在一开始未显示??\r\n    // 刷新会移除拖动中状态\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n    ipu.refresh = function (slt, optoins) {\r\n        return new Refresh(slt, optoins);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n","// Tab\r\n(function (ipu, $) {\r\n    function Tab(holder, options) {\r\n        this.el = $(holder).get(0);\r\n        this.titleItems = $(\".ui-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ui-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ui-tab-fixed\"); // 是否为固定高度的\r\n\r\n        var that = this;\r\n        this.titleItems.each(function (index) {\r\n            $(this).click(function () {\r\n                that.show(index);\r\n            });\r\n        });\r\n\r\n        var index = this.titleItems.filter(\".ui-current\").index();\r\n        if (index == -1) {\r\n            index = 0;\r\n        }\r\n\r\n        this.show(index);\r\n    }\r\n\r\n    Tab.prototype.defaultOptions = {\r\n        callBack: null  // 回调函数,tab切换时回调函数\r\n    };\r\n\r\n    Tab.prototype.show = function (index) {\r\n        if (this.fixed) {\r\n            var move = -index * 100 + \"%\";\r\n            this.bodyWrapper.css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        }\r\n        this.contentItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this.titleItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this._end(index);\r\n    };\r\n\r\n    Tab.prototype._end = function (index) {\r\n        this.lastIndex = this.currentIndex;\r\n        this.currentIndex = index;\r\n\r\n        if (this.options.callBack) {\r\n            this.options.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, options) {\r\n        return new Tab(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\r\n","// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipu, $) {\r\n    var active = {};\r\n\r\n    var options = defaultOptions = {\r\n        distanceAllow: 10,   // 最大移动距离,超过移除效果\r\n        displayDelay: 100,  // 延时显示时间,以防止是滚动操作\r\n        hideDelay: 120,     // 隐藏延时时间\r\n        eventName: 'click', // 事件处理是click\r\n        activeClass: 'ui-active',   // 激活时的class\r\n        getHandleNode: function (node) {  // 找到最先一级处理此click事件的元素\r\n            if (!node || !node.nodeType) return;\r\n\r\n            var distNode = null;\r\n            var nodeArray = [];\r\n\r\n            // 还有其它情形考虑,如a标签的跳转,或在原生元素添加事件属性的\r\n            function findHander(inNode) {\r\n                // 此方法适用于jquery, 1.12.4, 2.2.4, 3.2.1版本,_data方法以后可能会被移除。$.data是一些老版本写法\r\n                var eventHandlers = ($._data || $.data)(inNode, 'events');\r\n\r\n                if (eventHandlers) {\r\n                    eventHandlers = eventHandlers[options.eventName];\r\n                }\r\n\r\n                if (!eventHandlers) {\r\n                    return;\r\n                }\r\n\r\n                var thisNode = false;\r\n                $.each(eventHandlers, function (index, handler) {\r\n                    if (handler.selector) {\r\n                        var objs = $(handler.selector, inNode);\r\n                        $.each(nodeArray, function (tIndex, tNode) {\r\n                            if (objs.is(tNode)) {\r\n                                distNode = tNode;\r\n                                return false;\r\n                            }\r\n                        });\r\n\r\n                        if (distNode) {\r\n                            return false; //\r\n                        }\r\n                    } else {\r\n                        thisNode = true;  // 保存distNode,有可能有子节点满足条件,所以只保存此值为默认值\r\n                    }\r\n                });\r\n\r\n                if (thisNode && distNode == null) { // 如果没在子节点找到click事件,而当前节点又有click事件,就使用当前节点\r\n                    distNode = inNode;\r\n                }\r\n\r\n                return distNode;\r\n            }\r\n\r\n            while (!(\"tagName\" in node) || !findHander(node)) {\r\n                if (!node.parentNode || node.parentNode.nodeType != 1) {\r\n                    break;\r\n                }\r\n                nodeArray.push(node);\r\n                node = node.parentNode;\r\n            }\r\n\r\n            return distNode;\r\n        }\r\n    };\r\n\r\n    function getOriginalEvent(e) {\r\n        return e.originalEvent || e;\r\n    }\r\n\r\n    function getXY(e) {\r\n        var x = e.touches ? e.touches[0].pageX : e.clientX;\r\n        var y = e.touches ? e.touches[0].pageY : e.clientY;\r\n        return [x, y];\r\n    }\r\n\r\n    //根据不同浏览器获取不同原生事件event\r\n    var hasTouch = \"ontouchstart\" in window,\r\n        START_EVENT = hasTouch ? 'touchstart' : 'mousedown',\r\n        MOVE_EVENT = hasTouch ? 'touchmove' : 'mousemove',\r\n        END_EVENT = hasTouch ? 'touchend' : 'mouseup',\r\n        CANCEL_EVENT = hasTouch ? 'touchcancel' : '';\r\n\r\n    $(function () {\r\n        var startXY, tapEl, timeOutID;\r\n        var dom = document.body;\r\n\r\n        // force为false的时候,不用管timeOutID,在老的timeOutID未移除的情况下,有可能又产生了新的,\r\n        // 导致else代码未被执行,导致老的点击元素class未被移除\r\n        function removeClass(dom, force) {\r\n            if (force && timeOutID) {\r\n                window.clearTimeout(timeOutID);\r\n            } else {\r\n                $(dom).removeClass(options.activeClass);\r\n            }\r\n        }\r\n\r\n        function removeActive(force) {\r\n            if (force) {\r\n                removeClass(tapEl, force);\r\n            } else {\r\n                window.setTimeout(removeClass, options.hideDelay, tapEl, force);\r\n            }\r\n            startXY = null;\r\n            tapEl = null;\r\n        }\r\n\r\n        $(dom).bind(START_EVENT, function (e) {\r\n            if (tapEl) {    // 多点接触时处理\r\n                removeActive(true);\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n            startXY = getXY(e);\r\n            tapEl = options.getHandleNode(e.target);\r\n\r\n            if (tapEl) {\r\n                timeOutID = window.setTimeout(function (dom) {\r\n                    timeOutID = null;\r\n                    $(dom).addClass(options.activeClass);\r\n                }, options.displayDelay, tapEl);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(MOVE_EVENT, function (e) {\r\n            if (!tapEl) {\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n\r\n            var xy = getXY(e);\r\n            if (startXY && (Math.abs(xy[0] - startXY[0]) > options.distanceAllow || Math.abs(xy[1] - startXY[1]) > options.distanceAllow)) {\r\n                removeActive(true);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(END_EVENT, function (e) {\r\n            if (tapEl) {\r\n                removeActive();\r\n            }\r\n        });\r\n\r\n        // 手机来电等非用户取消操作时触发事件\r\n        if (CANCEL_EVENT) {\r\n            $(dom).bind(CANCEL_EVENT, function (e) {\r\n                if (tapEl) {\r\n                    removeActive();\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    // 更新默认值\r\n    active.setOptions = function (opts) {\r\n        options = this.options = $.extend({}, defaultOptions, opts);\r\n    };\r\n    ipu.active = active;\r\n})(ipu || window, jQuery);\r\n\r\n","/*===========================\r\nDevice/OS Detection\r\n===========================*/\r\n// from sui,但IPU框架的ua不是这样的\r\n;(function (ipu, $) {\r\n    \"use strict\";\r\n    var device = {};  // Classes\r\n    var classNames = [];\r\n    var ua = navigator.userAgent\r\n    \r\n    // 这中针对ipu框架的情况,待测试\r\n    if(ua.match(/ipumobile/i)){\r\n        device.ios =  !!ua.match(/ios/i);\r\n        device.android = !!ua.match(/android/i);\r\n    }else{\r\n        var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\r\n        var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\r\n        var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\r\n        var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\r\n\r\n        device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\r\n\r\n        // Android\r\n        if (android) {\r\n            device.os = 'android';\r\n            device.osVersion = android[2];\r\n            device.android = true;\r\n            device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\r\n        }\r\n        if (ipad || iphone || ipod) {\r\n            device.os = 'ios';\r\n            device.ios = true;\r\n        }\r\n        // iOS\r\n        if (iphone && !ipod) {\r\n            device.osVersion = iphone[2].replace(/_/g, '.');\r\n            device.iphone = true;\r\n        }\r\n        if (ipad) {\r\n            device.osVersion = ipad[2].replace(/_/g, '.');\r\n            device.ipad = true;\r\n        }\r\n        if (ipod) {\r\n            device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\r\n            device.iphone = true;\r\n        }\r\n        // iOS 8+ changed UA\r\n        if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\r\n            if (device.osVersion.split('.')[0] === '10') {\r\n                device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\r\n            }\r\n        }\r\n\r\n        // Webview\r\n        device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\r\n\r\n        // Minimal UI\r\n        if (device.os && device.os === 'ios') {\r\n            var osVersionArr = device.osVersion.split('.');\r\n            device.minimalUi = !device.webView &&\r\n                (ipod || iphone) &&\r\n                (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\r\n                $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\r\n        }\r\n\r\n        // Check for status bar and fullscreen app mode\r\n        var windowWidth = $(window).width();\r\n        var windowHeight = $(window).height();\r\n        device.statusBar = false;\r\n        if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\r\n            device.statusBar = true;\r\n        }\r\n        else {\r\n            device.statusBar = false;\r\n        }\r\n\r\n\r\n        // Pixel Ratio\r\n        device.pixelRatio = window.devicePixelRatio || 1;\r\n        classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\r\n        if (device.pixelRatio >= 2) {\r\n            classNames.push('retina');\r\n        }\r\n\r\n        // OS classes\r\n        if (device.os) {\r\n            classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\r\n            if (device.os === 'ios') {\r\n                var major = parseInt(device.osVersion.split('.')[0], 10);\r\n                for (var i = major - 1; i >= 6; i--) {\r\n                    classNames.push('ios-gt-' + i);\r\n                }\r\n            }\r\n\r\n        }\r\n        // Status bar classes\r\n        if (device.statusBar) {\r\n            classNames.push('with-statusbar-overlay');\r\n        }\r\n        else {\r\n            $('html').removeClass('with-statusbar-overlay');\r\n        }\r\n\r\n\r\n        // keng..\r\n        device.isWeixin = /MicroMessenger/i.test(ua);\r\n    }\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0){\r\n        $('html').addClass(classNames.join(' '));\r\n    }\r\n\r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n","\r\n        // 初始化代码\r\n        jQuery(function () {\r\n            FastClick.attach(document.body);\r\n        });\r\n\r\n        return ipu;\r\n    }\r\n\r\n    // todo:可以添加一个和其它库的适配处理,\r\n    // 这里假设第三方库,jquery,iScroll,Hammer的史称已经固定\r\n    if ( typeof define === \"function\" && define.amd ) {\r\n        define(['jquery', 'iScroll', 'Hammer', 'FastClick'], function (jQuery, iScroll, Hammer, FastClick) {\r\n            return window.ipu = setup(jQuery, iScroll, Hammer, FastClick);\r\n        });\r\n    } else {\r\n        window.ipu = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n    }\r\n})();\r\n"]}
1
{"version":3,"sources":["ipu-prefix.js","carousel.js","dtPicker.js","hammerCarousel.js","modal.js","navBar.js","pages.js","picker.js","popPicker.js","progressBar.js","refresh.js","tab.js","tap.js","_device.js","ipu-suffix.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"ipu.js","sourcesContent":["(function () {\r\n    function setup(jQuery, iScroll, Hammer, FastClick) {\r\n        var ipu = {};\r\n","// Carousel\r\n(function (ipu, $, iscroll) {\r\n// carouselSlt应该是唯一的,否则怎么支撑多个回调,如果用户不需要多个回调,也不主动调用,则可以,先不管吧???\r\n    function Carousel(slt, options) {\r\n        this.options = options = $.extend({}, this.defaultOpt, options);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = options.autoPlay;\r\n         this.hasIndicator = options.indicator;\r\n        this.callBack = options.callBack;\r\n        this.currentIndex = null;\r\n\r\n        this._init();\r\n        this.play();\r\n    }\r\n\r\n    Carousel.prototype = {\r\n        defaultOpt: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            that = this;\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.hasIndicator) {\r\n                this._addIndicator();\r\n            }\r\n            $(window).resize(function () {\r\n                that.refresh();\r\n            });\r\n            var scrollOpt = {\r\n                snap: \"li\",          // carousel效果\r\n                momentum: false,     // 移除惯性处理\r\n                scrollX: true,       // X轴移动\r\n                scrollY:false,\r\n                hScrollbar: false,   // 没有纵向滚动条\r\n                onScrollStart: function () {\r\n                    that._pause();\r\n                },\r\n                onTouchEnd: function () {\r\n                    // 后面优化\r\n                    /*\r\n                     if (that.iscroll.currPageX == that.size - 1) {\r\n                     that.show(that.size - 2);\r\n                     }\r\n                     */\r\n                },\r\n                onScrollEnd: function () {\r\n                    that._end();\r\n                }\r\n            };\r\n            this.iscroll = new iscroll(this.el.get(0), scrollOpt);\r\n            this.show(this.options.index, 0);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.autoPlay=false;\r\n        },\r\n        _pause: function () {\r\n            if (this.autoPlay && this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            this.show(index);\r\n        },\r\n        next: function () {\r\n            var index = this.currentIndex == this.size - 1 ? 0 : this.currentIndex + 1;\r\n            this.show(index);\r\n        },\r\n        show: function (index, time) {\r\n            this._pause();\r\n            this.iscroll.scrollToPage(index, 0, time);\r\n        },\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        refresh: function () {\r\n            var that = this;\r\n            that.show(this.currentIndex);\r\n        },\r\n        _play: function () {\r\n            if (this.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    this.timeoutId = null;\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {\r\n            var currentIndex = this.iscroll.currPageX;\r\n            if (currentIndex != this.currentIndex) {\r\n                if (this.callBack) {\r\n                    this.callBack(currentIndex, this.currentIndex);\r\n                }\r\n                this.currentIndex = currentIndex;\r\n\r\n                if (this.hasIndicator) {\r\n                    this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this._play();\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        destroy: function () {\r\n            // 自己怎么销毁,相关事件移除??\r\n            this.iscroll.destroy();\r\n        }\r\n    };\r\n\r\n    ipu.carousel =  function (slt, options) {\r\n        return new Carousel(slt, options);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n","// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来运算\r\n\r\n\r\n    // show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n    // 日期范围的选择处理\r\n    function DtPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    DtPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker ui-dtpicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-clear\">清除</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-title\">\\\r\n                            <label class=\"ui-dtpicker-y\"></label>\\\r\n                            <label class=\"ui-dtpicker-m\"></label>\\\r\n                            <label class=\"ui-dtpicker-d\"></label>\\\r\n                            <label class=\"ui-dtpicker-h\"></label>\\\r\n                            <label class=\"ui-dtpicker-mi\"></label>\\\r\n                        </div>\\\r\n                        <div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                            <div class=\"ui-picker\" data-id=\"picker-y\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-m\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-d\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-h\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-mi\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                        </div>\\\r\n                    </div>',\r\n        buttons: ['取消', '确认', '清除'],\r\n        labels: ['年', '月', '日', '时', '分'],\r\n        type: 'datetime',       // date, time, datetime, hour, month\r\n        customData: {},  // 自定义数据\r\n        hasClear: false,    // 是否显示清除按钮\r\n        callBack: function () { // 选择数据时的回调函数\r\n        }\r\n        // beginDate: Date类型,或毫秒值\r\n        // endDate: 同上\r\n    };\r\n\r\n    DtPicker.prototype._init = function () {\r\n        var self = this;\r\n        this.mask = this.createMask();\r\n\r\n        var _picker = this.holder = $(this.options.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ui-poppicker-btn-ok', _picker),\r\n            cancel: $('.ui-poppicker-btn-cancel', _picker),\r\n            clear: $('.ui-poppicker-btn-clear', _picker),\r\n            buttons: $('.ui-poppicker-header .ui-btn', _picker),\r\n            labels: $('.ui-poppicker-title label', _picker)\r\n        };\r\n\r\n\r\n        ui.i = new Picker($('[data-id=\"picker-mi\"]', _picker), {listen: false}); // 分钟变更无需要处理\r\n\r\n        ui.h = new Picker($('[data-id=\"picker-h\"]', _picker), {         // 小时变更,有最小值或最大值,需要变更分钟\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createMinutes();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.d = new Picker($('[data-id=\"picker-d\"]', _picker), { //仅提供了beginDate时,触发day,hours,minutes的change\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createHours();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.m = new Picker($('[data-id=\"picker-m\"]', _picker), { // 月变更时,总要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null) {\r\n                    self._createDay();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.y = new Picker($('[data-id=\"picker-y\"]', _picker), { // 年发生变更,如果没有结束月,此时有所有的月,是不需要变更月的,只需要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index != null) {\r\n                    if (self.options.beginMonth || self.options.endMonth) {\r\n                        self._createMonth();\r\n                    } else {\r\n                        self._createDay();\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n\r\n\r\n\r\n        self._create();\r\n\r\n        var ui = self.ui;\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.options.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.options.value);\r\n\r\n        //防止滚动穿透 TODO:待确认情况\r\n        /* self.ui.picker.addEventListener($.EVENT_START, function (event) {\r\n         event.preventDefault();\r\n         }, false);\r\n         self.ui.picker.addEventListener($.EVENT_MOVE, function (event) {\r\n         event.preventDefault();\r\n         }, false);*/\r\n    };\r\n\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.options.type;\r\n        var selected = {\r\n            type: type,\r\n            y: ui.y.getSelectedItem(),\r\n            m: ui.m.getSelectedItem(),\r\n            d: ui.d.getSelectedItem(),\r\n            h: ui.h.getSelectedItem(),\r\n            i: ui.i.getSelectedItem(),\r\n            toString: function () {\r\n                return this.value;\r\n            }\r\n        };\r\n        switch (type) {\r\n            case 'datetime':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'date':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text;\r\n                break;\r\n            case 'time':\r\n                selected.value = selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'month':\r\n                selected.value = selected.y.value + '-' + selected.m.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text;\r\n                break;\r\n            case 'hour':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text;\r\n                break;\r\n        }\r\n        return selected;\r\n    };\r\n\r\n    DtPicker.prototype._setSelectedValue = function (value) {\r\n        var self = this;\r\n        var ui = self.ui;\r\n\r\n        if(!value){\r\n            if(this.options.type == 'time'){\r\n                value = '00:00';\r\n            }else{\r\n                value = defaultPickerDate.getFullYear()+'-'+(defaultPickerDate.getMonth()+1)+'-'+defaultPickerDate.getDate()+' '\r\n                    + defaultPickerDate.getHours() + ':' + defaultPickerDate.getMinutes();\r\n            }\r\n        }\r\n        var parsedValue = self._parseSetValue(value);\r\n\r\n        ui.y.setListen(true);\r\n        ui.m.setListen(false);\r\n        ui.d.setListen(false);\r\n        ui.h.setListen(false);\r\n        ui.i.setListen(false);\r\n        ui.y.setSelectedValue(parsedValue.y);\r\n\r\n        ui.m.setListen(true);\r\n        ui.m.setSelectedValue(parsedValue.m);\r\n\r\n        ui.d.setListen(true);\r\n        ui.d.setSelectedValue(parsedValue.d);\r\n\r\n        ui.h.setListen(true);\r\n        ui.h.setSelectedValue(parsedValue.h);\r\n\r\n        ui.i.setListen(true);\r\n        ui.i.setSelectedValue(parsedValue.i);\r\n\r\n        this.value = this.getSelected().value;\r\n    };\r\n\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    DtPicker.prototype.isLeapYear = function (year) {\r\n        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);\r\n    };\r\n\r\n    DtPicker.prototype._inArray = function (array, item) {\r\n        for (var index in array) {\r\n            var _item = array[index];\r\n            if (_item === item) return true;\r\n        }\r\n        return false;\r\n    };\r\n\r\n    DtPicker.prototype.getDayNum = function (year, month) {\r\n        var self = this;\r\n        if (self._inArray([1, 3, 5, 7, 8, 10, 12], month)) {\r\n            return 31;\r\n        } else if (self._inArray([4, 6, 9, 11], month)) {\r\n            return 30;\r\n        } else if (self.isLeapYear(year)) {\r\n            return 29;\r\n        } else {\r\n            return 28;\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype._fill = function (num) {\r\n        num = num.toString();\r\n        if (num.length < 2) {\r\n            num = 0 + num;\r\n        }\r\n        return num;\r\n    };\r\n\r\n    DtPicker.prototype._isBeginYear = function () {\r\n        return this.options.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.options.beginMonth && this._isBeginYear() && this.options.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.options.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.options.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.options.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.options.endMonth && this._isEndYear() && this.options.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.options.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.options.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (options.customData.y) {\r\n            yArray = options.customData.y;\r\n        } else {\r\n            var yBegin = options.beginYear;\r\n            var yEnd = options.endYear;\r\n            for (var y = yBegin; y <= yEnd; y++) {\r\n                yArray.push({\r\n                    text: y + '',\r\n                    value: y\r\n                });\r\n            }\r\n        }\r\n        ui.y.setItems(yArray);\r\n        //ui.y.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMonth = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (options.customData.m) {\r\n            mArray = options.customData.m;\r\n        } else {\r\n            var m = options.beginMonth && self._isBeginYear() ? options.beginMonth : 1;\r\n            var maxMonth = options.endMonth && self._isEndYear() ? options.endMonth : 12;\r\n            for (; m <= maxMonth; m++) {\r\n                var val = self._fill(m);\r\n                mArray.push({\r\n                    text: val,\r\n                    value: m\r\n                });\r\n            }\r\n        }\r\n        ui.m.setItems(mArray);\r\n        //ui.m.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createDay = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (options.customData.d) {\r\n            dArray = options.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? options.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? options.endDay : self.getDayNum(parseInt(this.ui.y.getSelectedValue()), parseInt(this.ui.m.getSelectedValue()));\r\n            for (; d <= maxDay; d++) {\r\n                var val = self._fill(d);\r\n                dArray.push({\r\n                    text: val,\r\n                    value: d\r\n                });\r\n            }\r\n        }\r\n        ui.d.setItems(dArray);\r\n        //current = current || ui.d.getSelectedValue();\r\n        //ui.d.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createHours = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (options.customData.h) {\r\n            hArray = options.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? options.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? options.endHours : 23;\r\n            for (; h <= maxHours; h++) {\r\n                var val = self._fill(h);\r\n                hArray.push({\r\n                    text: val,\r\n                    value: h\r\n                });\r\n            }\r\n        }\r\n        ui.h.setItems(hArray);\r\n        //ui.h.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMinutes = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (options.customData.i) {\r\n            iArray = options.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? options.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? options.endMinutes : 59;\r\n            for (; i <= maxMinutes; i++) {\r\n                var val = self._fill(i);\r\n                iArray.push({\r\n                    text: val,\r\n                    value: i\r\n                });\r\n            }\r\n        }\r\n        ui.i.setItems(iArray);\r\n        //ui.i.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._setLabels = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = options.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.cancel.text(options.buttons[0]);\r\n        ui.ok.text(options.buttons[1]);\r\n\r\n        if(options.hasClear){\r\n            ui.clear.text(options.buttons[2])\r\n        }else{\r\n            ui.clear.hide();\r\n        }\r\n\r\n        ui.buttons.each(function (index) {\r\n            $(this).click(function () {\r\n                self.clickCall(index);\r\n            })\r\n        })\r\n    };\r\n\r\n    // 解析设置的值,目前是字符串,完整日期格式 2012-12-12 12:21\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.options.type;\r\n\r\n        var rs = {\r\n            y: now.getFullYear(),\r\n            m: now.getMonth()+1,\r\n            d: now.getDate(),\r\n            h: now.getHours(),\r\n            i: now.getMinutes()\r\n        };\r\n\r\n        if(value instanceof Date){\r\n            if( type == 'time'){\r\n                valu= +value.getHours()+\":\"+value.getMinutes();\r\n            }else{\r\n                value = value.getFullYear()+'-'+(value.getMonth()+1)+'-'+value.getDate()+ ' '\r\n                    +value.getHours()+\":\"+value.getMinutes();\r\n            }\r\n        }\r\n\r\n        var parts = value.replace(\":\", \"-\").replace(\" \", \"-\").split(\"-\");\r\n        for(var i=0, j=parts.length; i<j; i++){\r\n            parts[i] = parseInt(parts[i]);\r\n        }\r\n\r\n        if(type == 'datetime'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = parts[4];\r\n        }else if(type == 'date'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }else if(type == 'time'){\r\n            rs.h = parts[0];    //\r\n            rs.i = parts[1];\r\n        }else if(type == 'hour'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = 0;\r\n        }else if(type == 'month'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = 1;    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }\r\n\r\n        return rs;\r\n    };\r\n\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var options = this.options;\r\n        var now = defaultPickerDate;\r\n\r\n        var beginDate = options.beginDate;\r\n        if(beginDate){\r\n            beginDate = this._parseSetValue(beginDate);\r\n            options.beginYear = beginDate.y;\r\n            options.beginMonth = beginDate.m;\r\n            options.beginDay = beginDate.d;\r\n            options.beginHours = beginDate.h;\r\n            options.beginMinutes = beginDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.beginYear =  now.getFullYear();\r\n            options.beginMonth = now.getMonth() + 1;\r\n            options.beginDay = now.getDate();\r\n            options.beginHours = 0;\r\n            options.beginMinutes = 0;\r\n        }else {\r\n            options.beginYear =  now.getFullYear() - 5;\r\n        }\r\n\r\n        var endDate = options.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            options.endYear = endDate.y;\r\n            options.endMonth = endDate.m;\r\n            options.endDay = endDate.d;\r\n            options.endHours = endDate.h;\r\n            options.endMinutes = endDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.endYear =  now.getFullYear();\r\n            options.endMonth = now.getMonth() + 1;\r\n            options.endDay = now.getDate();\r\n            options.endHours = 24;\r\n            options.endMinutes = 59;\r\n        }else {\r\n            options.endYear =  options.beginYear + 10 ;\r\n        }\r\n\r\n        //生成\r\n        self._createYear();\r\n        self._createMonth();\r\n        self._createDay();\r\n        self._createHours();\r\n        self._createMinutes();\r\n    };\r\n\r\n    // 更新选择框,更新当前值\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.options.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    // 判断最大最小值合理性\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.options.endDate = date;\r\n        this._create();\r\n    };\r\n\r\n    DtPicker.prototype.dispose = function () {\r\n        var self = this;\r\n        self.hide();\r\n        setTimeout(function () {\r\n            self.ui.picker.parentNode.removeChild(self.ui.picker);\r\n            for (var name in self) {\r\n                self[name] = null;\r\n                delete self[name];\r\n            }\r\n            self.disposed = true;\r\n        }, 300);\r\n    };\r\n\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    DtPicker.prototype.clickCall = function(index){\r\n        var self = this;\r\n        var sltDate = self.getSelected();\r\n        var rs = self.options.callBack.call(this , sltDate, index);\r\n        if (rs !== false) {\r\n            if(index == 1){ // 假定确认按钮在第二个位置,传回true则存储当前值\r\n                self.value = sltDate.value;\r\n            }else if(index == 2){\r\n                self.value = null;\r\n            }\r\n            self.hide();\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    DtPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.clickCall(0);\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.dtPicker = function(options){\r\n        return new DtPicker(options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","// 支持非循环\r\n// size命名用的有点混淆。。\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n\r\n(function (ipu, $, Hammer) {\r\n    function HammerCarousel(navSlt, options) {\r\n        this.options = options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(navSlt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    // 直接替换掉了prototype对象,可能不是个好选择\r\n    HammerCarousel.prototype = {\r\n        defaultOptions: {\r\n            index: null,        // 默认显示第几个项,其实挺没用的,默认显示第一个,用户再调用一下显示第几个,作用一样现在。\r\n            autoPlay: false,    // 是否自动轮播\r\n            duration: 3000,     // 轮播间隔\r\n            indicator: false,  //是否生成指示器,即小点点\r\n            callBack: null,  // 轮播后回调函数\r\n            clickBack: null   // 各子项用户点击事件\r\n            //indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\r\n\r\n\r\n            this.showSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n            this.carouselItemSizes = [];\r\n            this.currentIndex = 0;\r\n            this.moveLen = 0;\r\n            this.lastItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来判断是复制项\r\n\r\n            // 这里假设每个元素都是相等的\r\n            this.carouselItems.slice(0, this.showSize).clone().appendTo(this.wrapper); // 如果做无限循环则要这样处理\r\n            this.size = this.carouselItems.size();\r\n\r\n            var self = this;\r\n            if(this.options.clickBack){\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        self.options.clickBack.call(this, i%self.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this.sizeCount();\r\n            var that = this;\r\n\r\n            this.hammer = new Hammer.Manager(this.el); // 避免因为li里面的内容高度不够,而不能触发相关事件\r\n            this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_HORIZONTAL, threshold: 10}));\r\n            this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this.onPan, this));\r\n\r\n            $(window).resize(function () { // 在尺寸变化时,处理,是否可以考虑只在宽度变化时处理,横屏事件?\r\n                that.refresh();\r\n            });\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.options.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.options.index);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.options.autoPlay = false;\r\n        },\r\n        _pause: function () {\r\n            if (this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            if (index == this.size - 1) {\r\n                this._show(this.size, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        next: function () {//下一张\r\n            var index = this.currentIndex == this.size ? 1 : this.currentIndex + 1;\r\n            if (index == 1) {\r\n                this._show(0, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % size;\r\n            if(index < 0 ){\r\n                index = size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        play: function () {\r\n            this.options.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.options.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    that.timeoutId = null;//清空这个timeoutId,代表该次处理已经执行了\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {//移动结束时调用\r\n            var currentIndex = this.currentIndex;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n\r\n            this._play();//处理自动播放\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        sizeCount: function () {\r\n            this.wrapperSize = this.wrapper.outerWidth(true);\r\n            this.itemSize = this.carouselItems.eq(0).outerWidth(true);\r\n            this.mostSize = this.size * this.itemSize; // 宽度*数量\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\").width();\r\n\r\n            var that = this;\r\n            $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n                that.carouselItemSizes[index] = $(this).position().left;\r\n            });\r\n        },\r\n        refresh: function () {\r\n            if (this.wrapperSize != this.wrapper.outerWidth(true)) {\r\n                this.sizeCount();\r\n                this._show(this.currentIndex, true); //新的位置\r\n            }\r\n        },\r\n        move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\");\r\n            var move = (this.moveLen - moveLen) % this.mostSize;\r\n            move = (move + this.mostSize) % this.mostSize;\r\n            this.displayMoveLen = move;\r\n\r\n            move = -move + \"px\";\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        },\r\n        _show: function (index, animate) { // 知道最终移动到的项时,调用\r\n            if (animate !== false) { // 默认值为true\r\n                animate = true;\r\n            }\r\n\r\n            this._pause();\r\n            $(this.wrapper).toggleClass(\"ui-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            //this.currentIndex = index;\r\n            this.lastItem = index == this.size;\r\n            var move = this.carouselItemSizes[index];\r\n            this.moveLen = move;\r\n            move = -move + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n            if (animate) {\r\n                this._end();\r\n            }\r\n        },\r\n        onPan: function (ev) {\r\n            var delta = ev.deltaX;\r\n            // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n            if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n                var value = delta / this.itemSize;\r\n                var intValue = parseInt(Math.abs(value));               // 取整数\r\n                var decimal = Math.abs(value) % 1;                   // 取小数\r\n\r\n                if (decimal > 0.2) { // 滑动超过页面宽20%;\r\n                    intValue = intValue + 1;\r\n                }\r\n                if (value > 0) {\r\n                    intValue = -intValue;\r\n                }\r\n\r\n                var index = (this.currentIndex + intValue) % this.size;\r\n                index = (index + this.size) % this.size; // 因为可能是个负值,转换成正值\r\n\r\n                // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n                if (index == 0 && this.displayMoveLen > this.itemSize) {\r\n                    index = this.size;\r\n                }\r\n                this._show(index);\r\n            } else if (ev.type == 'panmove'){\r\n                this.move(delta);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.hammerCarousel = function (slt, options) {\r\n        return new HammerCarousel(slt, options);\r\n    };\r\n})(ipu || window, jQuery,  Hammer);\r\n","(function (ipu, $) {\r\n    //$ extends\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        // console.log('__dealCssEvent');\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            /*jshint validthis:true */\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.transitionEnd = function (callback) {\r\n        // console.log('transitionEnd');\r\n        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalStack: true,\r\n        modalButtonOk: '确定',\r\n        modalButtonCancel: '取消',\r\n        modalPreloaderTitle: '加载中',\r\n        modalContainer: document.body ? document.body : 'body'\r\n    };\r\n\r\n    ipu.modalStack = [];\r\n\r\n    ipu.modalStackClearQueue = function () {\r\n        if (ipu.modalStack.length) {\r\n            (ipu.modalStack.shift())();\r\n        }\r\n    };\r\n    ipu.modal = function (params) {\r\n        params = params || {};\r\n        var modalHTML = '';\r\n        var buttonsHTML = '';\r\n        if (params.buttons && params.buttons.length > 0) {\r\n            for (var i = 0; i < params.buttons.length; i++) {\r\n                buttonsHTML += '<span class=\"ui-modal-button' + (params.buttons[i].bold ? ' ui-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\r\n            }\r\n        }\r\n        var extraClass = params.extraClass || '';\r\n        var titleHTML = params.title ? '<div class=\"ui-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ui-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ui-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ui-modal-buttons-vertical' : '';\r\n        modalHTML = '<div class=\"ui-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ui-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ui-modal-buttons ' + verticalButtons + '\">' + buttonsHTML + '</div></div>';\r\n\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n\r\n        var modal = $(_modalTemplateTempDiv).children();\r\n\r\n        $(defaults.modalContainer).append(modal[0]);\r\n\r\n        // Add events on buttons\r\n        modal.find('.ui-modal-button').each(function (index, el) {\r\n            $(el).on('click', function (e) {\r\n                if (params.buttons[index].close !== false) ipu.closeModal(modal);\r\n                if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\r\n                if (params.onClick) params.onClick(modal, index);\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n    ipu.alert = function (text, title, callbackOk) {\r\n        if (typeof title === 'function') {\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\r\n        });\r\n    };\r\n    ipu.confirm = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [\r\n                {text: defaults.modalButtonCancel, omodalButtonCancelnClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n    ipu.prompt = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            afterText: '<input type=\"text\" class=\"ui-modal-text-input\">',\r\n            buttons: [\r\n                {\r\n                    text: defaults.modalButtonCancel\r\n                },\r\n                {\r\n                    text: defaults.modalButtonOk,\r\n                    bold: true\r\n                }\r\n            ],\r\n            onClick: function (modal, index) {\r\n                if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ui-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ui-modal-text-input').val());\r\n            }\r\n        });\r\n    };\r\n\r\n    var minLoad = false;        // 是否最小时间调用方式\r\n    var loadOverTime = false;   // 是否超过最小调用时间\r\n    var loadEnd = false;        // 是否调用结束\r\n    var loadTimeOut = null;     // 延时调用ID\r\n\r\n    ipu.showPreloader = function (title, minTime) {\r\n        ipu.hidePreloader(true);\r\n\r\n        ipu.showPreloader.preloaderModal = ipu.modal({\r\n            title: title || defaults.modalPreloaderTitle,\r\n            text: '<div class=\"ui-preloader\"></div>'\r\n        });\r\n\r\n        if(minTime){\r\n            minLoad = true;\r\n            loadTimeOut = setTimeout(function () {\r\n                loadOverTime = true;\r\n                if(loadEnd){\r\n                    ipu.hidePreloader();\r\n                }\r\n            }, minTime);\r\n        }\r\n\r\n        return ipu.showPreloader.preloaderModal;\r\n    };\r\n    ipu.hidePreloader = function (force) {\r\n        if(force || !minLoad || (minLoad && loadOverTime)){\r\n            if(force && loadTimeOut){\r\n                window.clearTimeout(loadTimeOut);\r\n            }\r\n            ipu.showPreloader.preloaderModal && ipu.closeModal(ipu.showPreloader.preloaderModal);\r\n            minLoad = false; // 重置各标志位\r\n            loadOverTime = false;\r\n            loadEnd = false;\r\n            loadTimeOut = null;\r\n        }else{\r\n            loadEnd = true;\r\n        }\r\n    };\r\n    ipu.showIndicator = function () {\r\n        if ($('.ui-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ui-preloader-indicator-overlay\"></div><div class=\"ui-preloader-indicator-modal\"><span class=\"ui-preloader ui-preloader-white\"></span></div>');\r\n    };\r\n    ipu.hideIndicator = function () {\r\n        $('.ui-preloader-indicator-overlay, .ui-preloader-indicator-modal').remove();\r\n    };\r\n    // Action Sheet\r\n    ipu.actions = function (params) {\r\n        var modal, groupSelector, buttonSelector;\r\n        params = params || [];\r\n\r\n        if (params.length > 0 && !$.isArray(params[0])) {\r\n            params = [params];\r\n        }\r\n        var modalHTML;\r\n        var buttonsHTML = '';\r\n        for (var i = 0; i < params.length; i++) {\r\n            for (var j = 0; j < params[i].length; j++) {\r\n                if (j === 0) buttonsHTML += '<div class=\"ui-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ui-actions-modal-label' : 'ui-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ui-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ui-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ui-bg-' + button.bg;\r\n                if (button.disabled) buttonClass += ' disabled';\r\n                buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\r\n                if (j === params[i].length - 1) buttonsHTML += '</div>';\r\n            }\r\n        }\r\n        modalHTML = '<div class=\"ui-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ui-actions-modal-group';\r\n        buttonSelector = '.ui-actions-modal-button';\r\n\r\n        var groups = modal.find(groupSelector);\r\n        groups.each(function (index, el) {\r\n            var groupIndex = index;\r\n            $(el).children().each(function (index, el) {\r\n                var buttonIndex = index;\r\n                var buttonParams = params[groupIndex][buttonIndex];\r\n                var clickTarget;\r\n                if ($(el).is(buttonSelector)) clickTarget = $(el);\r\n                // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\r\n\r\n                if (clickTarget) {\r\n                    clickTarget.on('click', function (e) {\r\n                        if (buttonParams.close !== false) ipu.closeModal(modal);\r\n                        if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n                    });\r\n                }\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n\r\n    //显示一个消息,会在2秒钟后自动消失\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ui-modal ui-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n        ipu.openModal($toast, function () {\r\n            setTimeout(function () {\r\n                ipu.closeModal($toast);\r\n            }, duration || 2000);\r\n        });\r\n    };\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isNotToast = !modal.hasClass('ui-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n        if ($('.ui-modal.ui-modal-in:not(.ui-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\r\n            ipu.modalStack.push(function () {\r\n                ipu.openModal(modal, cb);\r\n            });\r\n            return;\r\n        }\r\n        var isPopup = modal.hasClass('ui-popup');\r\n        var isLoginScreen = modal.hasClass('ui-login-screen');\r\n        var isPickerModal = modal.hasClass('ui-picker-modal');\r\n        var isToast = modal.hasClass('ui-toast');\r\n        if (isModal) {\r\n            modal.show();\r\n            modal.css({\r\n                marginTop: -Math.round(modal.outerHeight() / 2) + 'px'\r\n            });\r\n        }\r\n        if (isToast) {\r\n            modal.css({\r\n                marginLeft: -Math.round(modal.outerWidth() / 2 ) + 'px' //1.185 是初始化时候的放大效果\r\n            });\r\n        }\r\n\r\n        var overlay;\r\n        if (!isLoginScreen && !isPickerModal && !isToast) {\r\n            if ($('.ui-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ui-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        }\r\n\r\n        //Make sure that styles are applied, trigger relayout;\r\n        var clientLeft = modal[0].clientLeft;\r\n\r\n        // Trugger open event\r\n        modal.trigger('open');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).addClass('ui-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('ui-modal-overlay-visible');\r\n        modal.removeClass('ui-modal-out').addClass('ui-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n        });\r\n        // excute callback\r\n        if (typeof cb === 'function') {\r\n            cb.call(this);\r\n        }\r\n        return true;\r\n    };\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ui-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isPopup = modal.hasClass('ui-popup'),\r\n            isToast = modal.hasClass('ui-toast'),\r\n            isLoginScreen = modal.hasClass('ui-login-screen'),\r\n            isPickerModal = modal.hasClass('ui-picker-modal'),\r\n            removeOnClose = modal.hasClass('ui-remove-on-close'),\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ui-popup.ui-modal-in').length) {\r\n                overlay.removeClass('ui-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ui-modal-overlay-visible');\r\n        }\r\n        modal.trigger('close');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).removeClass('ui-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ui-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ui-modal-in').addClass('ui-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ui-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ui-modal-out').hide();\r\n                if (removeOnClose && modal.length > 0) {\r\n                    modal.remove();\r\n                }\r\n            }\r\n            else {\r\n                modal.remove();\r\n            }\r\n        });\r\n        if (isModal && defaults.modalStack) {\r\n            ipu.modalStackClearQueue();\r\n        }\r\n\r\n        return true;\r\n    };\r\n    function handleClicks(e) {\r\n        /*jshint validthis:true */\r\n        var clicked = $(this);\r\n        var url = clicked.attr('href');\r\n\r\n\r\n        //Collect Clicked data- attributes\r\n       /* var clickedData = clicked.dataset();\r\n\r\n        // Popup\r\n        var popup;\r\n        if (clicked.hasClass('ui-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ui-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ui-modal-overlay')) {\r\n            if ($('.ui-modal.ui-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ui-modal.ui-modal-in');\r\n            if ($('.ui-actions-modal.ui-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ui-actions-modal.ui-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ui-popup-overlay')) {\r\n            if ($('.ui-popup.ui-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ui-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ui-modal-overlay, .ui-popup-overlay, .ui-close-popup, .ui-open-popup, .ui-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n    NavBar.prototype.defaultOpt = {\r\n        animate: false,           // 默认有动画\r\n        contentSlt: \".ui-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) { // currentIndex: 当前索引,lastIndex上一次索引(第一次时为null)\r\n        }\r\n    };\r\n\r\n    function NavBar(slt, options) {\r\n        this.options = $.extend({}, this.defaultOpt, options);\r\n        this.content = $(this.options.contentSlt);\r\n        this.nav = $(slt);\r\n        this.wrapper = $(\">ul\", this.content);\r\n        this.contents = $(\">li\", this.wrapper);\r\n        this.navs = $(\">a\", this.nav);\r\n        var me = this;\r\n\r\n        var activeIndex = this.navs.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.options.animate) {\r\n            this.wrapper.addClass(\"ui-no-animation\")\r\n        }\r\n\r\n        this.navs.each(function (index, i) {\r\n            $(this).click(function () {\r\n                me.show(index);\r\n            });\r\n        });\r\n\r\n        this.lastIndex = null;\r\n        this.currentIndex = null;\r\n        me.show(this.options.index);\r\n    }\r\n\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            var currentContent = $(this.contents[index]).addClass(\"ui-show\");\r\n\r\n            if (this.options.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ui-show\"); // 隐藏上上个元素\r\n                }\r\n\r\n                if (this.currentIndex != null) {        // 非第一次需要动画效果\r\n                    if (this.currentIndex < index) {   // 需要内容为往左走,显示右边的内容\r\n                        if (this.lastIndex != null && this.lastIndex < this.currentIndex) {  // 内容已经左走过了,则需要移除动画复原位置,再通过width()方法强制生效\r\n                            this.wrapper.addClass(\"ui-no-animation\").removeClass(\"ui-nav-content-right\").width(); // 可以强制刷新,默认jquery应该会将这些dom上的修改延时处理?\r\n                        }\r\n                    } else {\r\n                        if (this.lastIndex == null || this.lastIndex > this.currentIndex) { // 类似同上\r\n                            this.wrapper.addClass(\"ui-no-animation\").addClass(\"ui-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ui-no-animation\").toggleClass(\"ui-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ui-show\");\r\n            }\r\n\r\n            // 更新class,ui-current状态\r\n            $(this.contents[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n            $(this.navs[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.navBar = function (slt, options) {\r\n        return new NavBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.animationEnd = function (callback) {\r\n        __dealCssEvent.call(this, ['webkitAnimationEnd', 'animationend'], callback);\r\n        return this;\r\n    };\r\n\r\n    function submitForm(doc, url ,params){\r\n        var form = doc.createElement(\"form\");\r\n        form.action = url;\r\n        form.method = \"post\";\r\n        form.style.display = \"none\";\r\n\r\n        for (var x in params) {\r\n            var ele = doc.createElement(\"input\");\r\n            ele.type=\"hidden\";\r\n            ele.name = x;\r\n            ele.value =  params[x];\r\n            form.appendChild(ele);\r\n        }\r\n\r\n        doc.body.appendChild(form);\r\n        form.submit();\r\n    }\r\n\r\n    // 检查是否有ui-pages的结构\r\n    function checkPages() {\r\n        if(!hasPages){\r\n            pagesObj = $(\".ui-pages\"); // pagesObj为空则进行jquery取值\r\n            if(pagesObj.size() == 0){\r\n                pagesObj =  $(\"<div class='ui-pages'><div class='ui-page ui-show \"+zeroPageClass+\"' id='\"+pageIdPrefix+\"0'></div>\").appendTo(\"body\");\r\n            }\r\n            hasPages = true;\r\n        }\r\n    }\r\n\r\n    // 站位页面\r\n    function isZeroPage(page) {\r\n        return $(page).hasClass(zeroPageClass);\r\n    }\r\n\r\n    var page = {};\r\n    var hasPages = false;\r\n    var maps = {};\r\n    var pageNo = 1; // 编号0留给主页面或当前页面,或没有\r\n    var pageIdPrefix = \"ipuPage-\";\r\n    var pagesObj = null;\r\n    var animateInClass = \"ui-anim ui-slideRightIn\";\r\n    var animateOutClass  = \"ui-anim ui-slideRightOut\";\r\n    var eventName = \"ipuUIPageBack\";\r\n    var zeroPageClass = 'ui-page-zero';   // 占位页面,对于为当前页面\r\n    var zeroPagesClass = 'ui-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\r\n\r\n\r\n\r\n    page.options = {     // 那个窗口执行open,默认父窗口\r\n        target: window.parent, // 默认执行父窗口,方法:all\r\n        backIndex: -1,    // 默认回退一页         方法:back\r\n        closeIndex: -1,   // 默认关闭最近一个页面 方法:close\r\n        params:{},        // post的传参            方法:post\r\n        animate: true,     // 是否动画效果        方法:open post\r\n        showLoading: true,   // 是否显示加载消息  方法:open post\r\n        loadingMessage: '正在加载中',  //          方法:open post\r\n        method : null,     // 请求方式,内置参数,方法自己设置,用户不需要设置  方法:无\r\n        minMessageTime: 500, // 最小显示加载时间,避免出现闪现的情况 方法:open post\r\n        data: null,         // 回退时,回传参数, 方法:back\r\n        pageName: '',     // 给打开的页面命名,以便根据此页面名称来切换页面 方法:open post back close\r\n        callBack:function () { // 事件回调       方法:open post close back\r\n        }\r\n    };\r\n\r\n    // 当前页面加载,针对顶层父窗口\r\n    page.openPage = function (url, options) {\r\n        var newPage = null;\r\n        var nowPageNo = pageIdPrefix + (pageNo++);\r\n        maps[nowPageNo] = url;\r\n\r\n        checkPages();\r\n\r\n        if(options.showLoading){\r\n            ipu.showPreloader(options.loadingMessage, options.minMessageTime);\r\n        }\r\n\r\n        if(options.method == 'post'){\r\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe'></iframe></div>\");\r\n        }else{\r\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe' src='\"+url+\"'></iframe></div>\");\r\n        }\r\n\r\n        var zeroPage = isZeroPage($(\".ui-page:last\", pagesObj));\r\n        var animatePage = newPage;\r\n        if(zeroPage){\r\n            animatePage = pagesObj.addClass(zeroPagesClass);\r\n        }\r\n\r\n        function end() {\r\n            if(options.showLoading) {\r\n                ipu.hidePreloader();\r\n            }\r\n\r\n            if(options.animate) {\r\n                animatePage.removeClass(animateInClass);\r\n            }\r\n\r\n            newPage.siblings(\".ui-show\").removeClass('ui-show');\r\n            if(options.callBack){\r\n                options.callBack();\r\n            }\r\n        }\r\n\r\n        $(\".ui-page-iframe\", newPage).one('load', function () {\r\n            newPage.addClass(\"ui-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\r\n\r\n            if(zeroPage){\r\n                animatePage.removeClass(zeroPagesClass);\r\n            }\r\n            if(options.animate){\r\n                animatePage.addClass(animateInClass).animationEnd(end);\r\n            }else{\r\n                end();\r\n            }\r\n        });\r\n\r\n        newPage.appendTo(pagesObj);\r\n        if(options.method == 'post') {\r\n            var pageDoc = $(\".ui-page-iframe\", newPage)[0].contentDocument;\r\n            submitForm(pageDoc, url, options.params);\r\n        }\r\n    };\r\n\r\n    // post方式加载页面\r\n    page.postPage = function (url, options) {\r\n        options.method = 'post';\r\n        page.openPage(url, options);\r\n    };\r\n\r\n    // 当前页面后退,针对顶层父窗口\r\n    page.backPage = function (options) {\r\n        var backIndex = options.backIndex;\r\n        var page = null;\r\n        var nowPage = $(\".ui-page.ui-show\", pagesObj);\r\n\r\n        if(options.pageName){\r\n            page =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj);\r\n        }else if(backIndex == 0){\r\n            page = $(\".ui-page:first\", pagesObj);\r\n        }else { // 越界的情况\r\n            var prevPage = nowPage.prevAll(\".ui-page\");\r\n            if(backIndex < 0){\r\n                page= $(prevPage[-backIndex - 1]);\r\n            }else{\r\n                page= $(prevPage[prevPage.size() - backIndex]);\r\n            }\r\n        }\r\n\r\n        var animatePage = nowPage;\r\n        var zeroPage = isZeroPage(page);\r\n\r\n        // 主页面模式时\r\n        if(zeroPage){\r\n            animatePage = pagesObj;\r\n        }else{\r\n            page.addClass(\"ui-show\"); //显示前一个\r\n        }\r\n\r\n        function end (){\r\n            $(this).removeClass(animateOutClass);\r\n            page.nextAll(\".ui-page\").remove();\r\n\r\n            var iframe = $(\".ui-page-iframe\", page);\r\n            var nowDoc;\r\n\r\n            if(iframe.size() == 0){ // 找不到子窗口就当是返回了主页面,在当前窗口触发\r\n                nowDoc = window.document;\r\n            }else{\r\n                nowDoc = iframe[0].contentDocument;\r\n            }\r\n\r\n            if(zeroPage){\r\n                pagesObj.addClass(zeroPagesClass);\r\n            }\r\n\r\n            var evt = nowDoc.createEvent('Event');\r\n            evt.initEvent(eventName, true, true);\r\n            if(options.data){\r\n                evt.data = options.data;\r\n            }\r\n            nowDoc.body.dispatchEvent(evt);\r\n            if(options.callBack){\r\n                options.callBack();\r\n            }\r\n        }\r\n\r\n        if(options.animate){\r\n            animatePage.addClass(animateOutClass).animationEnd(end);\r\n        }else{\r\n            end();\r\n        }\r\n    };\r\n\r\n    // 往前关闭窗口\r\n    page.closePage = function (options) {\r\n        var closeIndex = options.closeIndex;\r\n        var prevPage = $(\".ui-page.ui-show\", pagesObj).prevAll(\".ui-page\");\r\n\r\n        if(options.pageName){\r\n            closeIndex =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj).index();\r\n        }else if(closeIndex < 0){\r\n            closeIndex = -closeIndex -1;\r\n        }else{\r\n            closeIndex = prevPage.size() - closeIndex;\r\n        }\r\n\r\n        $(prevPage[closeIndex]).remove();\r\n        if(options.callBack){\r\n            options.callBack();\r\n        }\r\n    };\r\n\r\n    // 调用父窗口打开页面\r\n    page.open = function (url, options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.openPage(url, options);\r\n    };\r\n\r\n    // post方法\r\n    page.post = function (url, options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.method = 'post';\r\n        options.target.ipu.page.openPage(url, options);\r\n    };\r\n\r\n    // 调用父窗口,回退\r\n    page.back = function (options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.backPage(options);\r\n    };\r\n\r\n    // 返回首页\r\n    page.backHome = function (options) {\r\n        options = options || {};\r\n        options.backIndex = 0;\r\n        page.back(options);\r\n    };\r\n\r\n    // 子窗口,待确认\r\n    page.close = function (options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.closePage(options);\r\n    };\r\n\r\n    // 添加回调事件\r\n    page.onBack = function (back) {\r\n        $(\"body\").on(eventName, function (e) {\r\n            var data = e.originalEvent.data;\r\n            back(data);\r\n        });\r\n    };\r\n\r\n    // 提供一个关闭一群窗口的方法\r\n    ipu.page = page;\r\n})(ipu || window, jQuery);\r\n","// picker\r\n(function (ipu, $, Hammer) {\r\n    var showItemSize = 9;   // 显示的子项数量,\r\n    var r = 90;             // 计算旋转的圆半径,结果应该缩小,是为了r不要距离容器太近\r\n    var itemAngle = 180 / showItemSize;   // 每项对应的角度是 180/9 = 20\r\n    var maxExceed = itemAngle;         // 滚动时允许超出边界的最大角度\r\n    // itemHeight = 40px;       // 需要给出r=89是怎么计算出来的,是根据 40/2/Math.tan(40/2/180*Math.PI)=113,直接太大不好看\r\n\r\n    function Picker(slt, options) {\r\n        this.el = $(slt)[0];\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this._init();\r\n    }\r\n\r\n    // 默认参数\r\n    Picker.prototype.defaultOptions = {\r\n        onChange: function () {       // 子项选中事件\r\n        },\r\n        listen: true,                  // 默认已开记监听变化\r\n        data: []\r\n    };\r\n\r\n    Picker.prototype._init = function () {\r\n        var self = this;\r\n        this.wrap = $(\">ul\", this.el);\r\n        this.index = null;\r\n        this.listen = !!this.options.listen;\r\n\r\n        this.beginAngle = 0;\r\n        this.beginExceed = this.beginAngle - maxExceed;       // 最小角度值\r\n        this.stopInertiaMove = false;\r\n        this.lastAngle = null; // 保存滑动前的角度\r\n        this.empty = this.options.data.length == 0;\r\n\r\n        // 如果是ios,则ul的旋转中心点,有变化\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+r+\"px\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n        this.hammer = new Hammer.Manager(this.el);\r\n        this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_VERTICAL, threshold: 5}));\r\n        this.hammer.add(new Hammer.Press({threshold: 4}));  //\r\n        this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this._onPan, this));\r\n\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\r\n           // console.log('press');\r\n            if(this.empty){\r\n                return ;\r\n            }\r\n\r\n            self.stopInertiaMove = true;\r\n            if (e.type == 'pressup') {\r\n                self.endScroll();\r\n            }\r\n        });\r\n\r\n        this.setItems(this.options.data);\r\n    };\r\n\r\n    Picker.prototype.setItems = function (data, textName) {\r\n        this.wrap.empty(); // 清空历史数据\r\n        this.data = data = data || [];\r\n        this.empty = data.length == 0; // 数据是否为空\r\n\r\n        this.newData = true; // 表示设置了新数据,触发change回调,但第一次设置时,不需要触发\r\n        var self = this;\r\n        var lis = \"\";\r\n        textName = textName || 'text';\r\n\r\n        for (var i = 0, j = data.length; i < j; i++) {\r\n            lis = lis + \"<li>\" + data[i][textName] + \"</li>\";\r\n        }\r\n\r\n        $(lis).appendTo(this.wrap);\r\n\r\n        this.items = $(\">li\", this.wrap);\r\n        this.itemsSize = this.items.size();\r\n\r\n        this.endAngle = (this.empty ? 0 : this.itemsSize - 1) * itemAngle;\r\n        this.endExceed = this.endAngle + maxExceed;  // 最大旋转角度值\r\n\r\n        // 初始化各子项角度\r\n        this.items.each(function (i) {\r\n            $(this).css({\r\n                \"transform\": \"translateZ(\" + r + \"px) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + r + \"px\"\r\n            });\r\n            $(this).click(function () {\r\n                self.stopInertiaMove = true;\r\n                self.setAngle(i * itemAngle, true);\r\n            })\r\n        });\r\n\r\n        var newAngle ;\r\n        if(this.empty || this.index == null){\r\n            newAngle = 0;\r\n        }else {\r\n            if(this.index > this.itemsSize - 1){\r\n                newAngle = (this.itemsSize - 1) * itemAngle;\r\n            }else{\r\n                newAngle = this.index * itemAngle;\r\n            }\r\n        }\r\n        this.setAngle(newAngle, true);\r\n\r\n        /*if (this.index !== null) { // 当前已经旋转则,保留当前的索引\r\n         if (this.index > this.itemsSize - 1 && !this.empty) {\r\n         this.index = this.itemsSize - 1;\r\n         }\r\n         this.setAngle(this.index * itemAngle, true);\r\n         } else { // 第一次初始数据,不触发change事件\r\n         this.index = 0;     // 被调用后,不能再使用null值了\r\n         this.setAngle(0, false); // 第一次设置初始化时,不触发change事件\r\n         }*/\r\n    };\r\n\r\n    Picker.prototype._onPan = function (ev) {\r\n        if(this.empty){\r\n            return ;\r\n        }\r\n\r\n        //console.log(ev.deltaX + \"==\"+ ev.deltaY);\r\n        if (ev.type == 'panstart') { // 好像一定要移动才有startg事件\r\n            self.stopInertiaMove = true;\r\n            this.lastAngle = this.angle;\r\n            this.wrap.addClass(\"ui-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\r\n           // console.log('panstart');\r\n\r\n        } else if (ev.type == 'panmove') {\r\n            var moveAngle = this.calcAngle(ev.deltaY);\r\n            var newAngle = this.lastAngle - moveAngle;   //最新的角度\r\n            //console.log('=='+newAngle);\r\n            // 一个可以转动的最小值和最大值过滤\r\n            if (newAngle < this.beginExceed) {\r\n                newAngle = this.beginExceed;\r\n            }\r\n            if (newAngle > this.endExceed) {\r\n                newAngle = this.endExceed;\r\n            }\r\n            this.setAngle(newAngle);\r\n\r\n        } else { // end or cancel事件\r\n            // console.log('end or cancel:' + ev.type);\r\n            var v = ev.overallVelocityY;    // 滑动的速度\r\n            var dir = v > 0 ? -1 : 1; //加速度方向\r\n            var deceleration = dir * 0.0006 * -1;\r\n            var duration = Math.abs(v / deceleration); // 速度消减至0所需时间\r\n            var dist = v * duration / 2; //最终移动多少\r\n\r\n            var startAngle = this.angle;\r\n            var distAngle = -this.calcAngle(dist);\r\n           //  console.log(\"dist=\" + dist + \", distAngle\" + distAngle);\r\n\r\n            //----\r\n            var srcDistAngle = distAngle;\r\n            if (startAngle + distAngle < this.beginExceed) {\r\n                distAngle = this.beginExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n            if (startAngle + distAngle > this.endExceed) {\r\n                distAngle = this.endExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n\r\n            if (distAngle == 0) {\r\n                this.endScroll();\r\n                return;\r\n            }\r\n            this.scrollDistAngle(startAngle, distAngle, duration);\r\n        }\r\n    };\r\n\r\n    // 计算移动的角度,转动的角度,就是移动的距离对应相关圆周\r\n    // 2*r*PI = 360,  angle = 360*c/(2*r*PI)\r\n    var ca = 360 / (2 * r * Math.PI);\r\n    Picker.prototype.calcAngle = function (c) {\r\n        return c * ca;\r\n    };\r\n\r\n    // endScroll 是否为结束的滚动结束,滚动结束需要调用结束事件\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(1000px) rotateY(0deg) rotateX(\" + newAngle + \"deg)\");\r\n        this.calcItemVisable(newAngle);\r\n\r\n        if (endScroll) {\r\n            var index = newAngle / itemAngle;\r\n            var oldIndex = this.index;\r\n            this.index = this.empty ? null : index; // 这里可以做一个判断,如果是empty,则index值可以不改变\r\n\r\n            // 这个地方要判断下,数据更新或索引更新都要触发\r\n            if (oldIndex != index || this.newData) {\r\n                this.newData = false;\r\n               // console.log('change');\r\n                if (this.options.onChange && this.listen) {\r\n                    // console.log('changed call');\r\n                    this.options.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n            }\r\n        }\r\n    };\r\n\r\n    // 计算子项的显示情况\r\n    Picker.prototype.calcItemVisable = function (angle) {\r\n        this.items.each(function (index) {\r\n            var difference = Math.abs(index * itemAngle - angle);\r\n\r\n            if (difference < itemAngle / 2) {\r\n                $(this).addClass(\"ui-highlight ui-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ui-highlight ui-visible\");\r\n            } else {\r\n                $(this).addClass(\"ui-visible\").removeClass(\"ui-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ui-noanimate\");\r\n        var endAngle;\r\n\r\n        if (this.angle < this.beginAngle) {\r\n            endAngle = this.beginAngle;\r\n        } else if (this.angle > this.endAngle) {\r\n            endAngle = this.endAngle;\r\n        } else {\r\n            var index = parseInt((this.angle / itemAngle).toFixed(0));\r\n            endAngle = (itemAngle * index);\r\n        }\r\n\r\n        this.setAngle(endAngle, true);\r\n    };\r\n\r\n    // 进行惯性滚动\r\n    Picker.prototype.scrollDistAngle = function (startAngle, distAngle, duration) {\r\n        var self = this;\r\n        var nowTime = new Date().getTime();\r\n        this.stopInertiaMove = false;\r\n        duration = 1 * duration; // 滚动时长控制修改\r\n\r\n        // hammer调用的惯性函数\r\n        (function (nowTime, startAngle, distAngle, duration) {\r\n            var frameInterval = 13;\r\n            var stepCount = duration / frameInterval;\r\n            var stepIndex = 0;\r\n\r\n            (function inertiaMove() {\r\n                if (self.stopInertiaMove) return;\r\n                var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);\r\n                self.setAngle(newAngle);\r\n                stepIndex++;\r\n\r\n                if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {\r\n                    self.endScroll();\r\n                    return;\r\n                }\r\n\r\n                setTimeout(inertiaMove, frameInterval);\r\n            })();\r\n\r\n        })(nowTime, startAngle, distAngle, duration);\r\n    };\r\n\r\n    Picker.prototype.setListen = function (bool) {\r\n        this.listen = !!bool;\r\n    };\r\n\r\n    Picker.prototype.quartEaseOut = function (t, b, c, d) {\r\n        return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n    };\r\n\r\n    Picker.prototype.setSelectedValue = function (value) {\r\n        var self = this;\r\n        for (var index in self.data) {\r\n            var item = self.data[index];\r\n            if (item.value == value) {\r\n                self.setAngle(index* itemAngle, true);\r\n                return;\r\n            }\r\n        }\r\n    };\r\n\r\n    // 获取当前选中的值\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    Picker.prototype.getSelectedIndex = function () {\r\n        return this.index;\r\n    };\r\n\r\n    ipu.Picker = Picker;\r\n\r\n})(ipu || window, jQuery, Hammer);\r\n","// popPicker\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n\r\n    function PopPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                        </div>\\\r\n                    </div>',\r\n        pickerTemplate: '<div class=\"ui-picker\">\\\r\n                            <div class=\"ui-picker-selectbox\"></div>\\\r\n                            <ul></ul>\\\r\n                          </div>',\r\n        data: [],    // 数据\r\n        layer: 1,   // 数据层级\r\n        btns: ['取消', '确认'],\r\n        callBack: function () { // 选择数据时的回调函数\r\n\r\n        }\r\n    };\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.options.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ui-poppicker-body\", this.holder);\r\n\r\n        var layer = this.options.layer;\r\n        var width = (100 / layer) + \"%\";\r\n        this.pickers = new Array(layer);\r\n        var self = this;\r\n        var pickerHtml;\r\n        this.mask = this.createMask();\r\n\r\n        // 先初始化最底层picerk,再上面来\r\n        for (var i = layer -1; i >=0; i--) {\r\n            pickerHtml = $(this.options.pickerTemplate).prependTo(bodyHtml).css({width: width});\r\n\r\n            this.pickers[i] = new  Picker(pickerHtml, {\r\n                onChange: (function (i) {\r\n                    return function (item, index) { // 更新底部的值\r\n                        if (i != layer - 1) {\r\n                            self.pickers[i + 1].setItems(item.data);\r\n                        }\r\n                    };\r\n                })(i)\r\n            });\r\n        }\r\n\r\n        $(\".ui-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.options.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.options.btns[1]);\r\n\r\n        $(\".ui-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.options.btns[0]);\r\n    };\r\n\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 获取相关值\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.options.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.options.layer; i++) {\r\n                rs.push(this.pickers[i].getSelectedItem());\r\n            }\r\n            return rs;\r\n        }\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    PopPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.hide();\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.popPicker = function (options) {\r\n        return new PopPicker(options);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n\r\n    /**\r\n     *进度条\r\n     */\r\n    function progressBar(id, options) {\r\n        this.id = id;\r\n        this.level = options.level;\r\n        this.progress = options.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (options.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (options.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    progressBar.prototype.setProgress = function (pro) {\r\n        if (pro < 0 || pro > 100) return;\r\n\r\n        $(this.progressBar.find(\".ipu-progressbar\")).css(\"transform\", \"translate3d(\" + (-(100 - pro)) + \"%, 0px, 0px)\");\r\n        this.progress = pro;\r\n    };\r\n\r\n    progressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    progressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-hightlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-highlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    ipu.progressBar = function (slt, options) {\r\n        return new progressBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $, iScroll) {\r\n\r\n    // 扩展参数,iscroll组件的参数选项\r\n    // 扩展参数,用户直接在页面上自定好,顶端和底部加载html\r\n    // 设置上下条件长度,或计算函数\r\n    // 处理resize的问题,用户主动调用refresh??\r\n    // 底部启用或停用时,应该刷新组件iscroll高度\r\n    // 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n    Refresh.prototype.defaultOptions = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ui-refresh-bottom\"><span class=\"ui-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ui-refresh-top\"><span class=\"ui-refresh-loading\"></span><div class=\"ui-refresh-arrow\"></div></div>',\r\n                // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n                // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ui-refresh-top-loading\r\n                // 拖动达到加载距离,则增加class:ui-refresh-toload\r\n                // 加载中,则增加class:ui-refresh-top-loading,移除class:ui-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOptions:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    function Refresh(slt, options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOptions = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ui-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ui-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ui-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ui-refresh-toload');\r\n                    }\r\n                }\r\n\r\n                me._checkBottomLoading(); // 底部加载条件和顶部条件不一样,只要滚动离底部一定高度就开始加载\r\n                me.goTop = this.y > me.topPullOffset; // 记录是否位于顶部位置,以便刷新后可以回到此位置\r\n            },\r\n            onBeforeScrollEnd: function () {    // 一定是用户拖动触发,在滚动结束前应该触发\r\n                me._checkTopLoading();\r\n                me._checkBottomLoading();\r\n            },\r\n            onScrollEnd: function () { // 这个事件可能由非用户拖动时触发,可能是拖动惯性导致,所有顶部不应该处理,但顶部不管是否惯性,位置条件满足即触发\r\n                if (me.topLoading && this.y < this.minScrollY && me.goTop) {\r\n                    me.iScroll.scrollTo(0, this.minScrollY, 0);\r\n                }\r\n                me._checkBottomLoading(); // 在beforend执行还不够,还在要end执行\r\n            },\r\n            onRefresh: function () { // 刷新时,若顶部加载还在进行,且当前显示的顶部加载,则继续显示,否则刷新后会消失顶部加载,这里代码没有考虑重用了,应该可以做一步提取\r\n                if (me.topLoading) { // 如果顶部在加载,则刷新的时候,设置最小顶部距离,显示顶部加载状态\r\n                    this.minScrollY = this.minScrollY + me.topPullOffset;\r\n                }\r\n            }\r\n        };\r\n\r\n        this.iScrollOptions = $.extend({}, this.options.iScrollOptions, this.iScrollOptions);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOptions);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ui-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.options.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.options.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.options.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        this.topLoading = false;        // 顶部正在载加载\r\n        this.bottomLoading = false;     // 底部正在加载\r\n        this.bottomEnable = this.options.initEnableBottom && !!this.options.bottomLoadFun;\r\n        this.topEnable = this.options.initEnableTop && !!this.options.topLoadFun;\r\n        this.goTop = false;         // 用来处理,因为iScroll使用momentum(惯性), 导致有时顶部显示不正确问题,true表示顶部显示加载条\r\n\r\n        this.enableBottom(this.bottomEnable);\r\n        this.enableTop(this.topEnable);\r\n    };\r\n\r\n    // 检查是否需要底部加载\r\n    Refresh.prototype._checkBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            if (this.iScroll.y < this.iScroll.maxScrollY + this.bottomPullOffset) {\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    Refresh.prototype._checkTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            if (this.topEl.hasClass('ui-refresh-toload')) {\r\n                this._startTopLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 检查内容是否超出容器高度,未超出时,自动调用底部加载\r\n    Refresh.prototype._checkContentLoading = function () {\r\n        if(this.iScroll.maxScrollY >= -this.bottomPullOffset){ // 此处要计算底端的高度\r\n            this._startBottomLoading();\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.options.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ui-refresh-toload').addClass('ui-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.options.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 结束底部加载\r\n    Refresh.prototype.endBottomLoading = function () {\r\n        this.bottomLoading = false;\r\n        this.refresh();\r\n    };\r\n\r\n    // 结束顶部加载\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ui-refresh-top-loading');\r\n        this.topLoading = false;\r\n        // this.iScroll.scrollTo(0, 0); // 刷新加载则应该回到顶部,待测试确认\r\n        this.refresh();\r\n    };\r\n\r\n    // 设置顶部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableTop = function (enable) {\r\n        this.topEnable = enable;\r\n        if (enable) {\r\n            this.topEl.show();\r\n        } else {\r\n            this.topEl.hide();\r\n        }\r\n    };\r\n\r\n    // 设置底部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableBottom = function (enable) {\r\n        this.bottomEnable = enable;\r\n        if (enable) {\r\n            this.bottomEl.show();\r\n        } else {\r\n            this.bottomEl.hide();\r\n        }\r\n    };\r\n\r\n    // 只有在内容发生变更时,但是又没有触发调用end相关方法时,使用此方法更新高度信息\r\n    // 或者组件在一开始未显示??\r\n    // 刷新会移除拖动中状态\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n    ipu.refresh = function (slt, optoins) {\r\n        return new Refresh(slt, optoins);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n","// Tab\r\n(function (ipu, $) {\r\n    function Tab(holder, options) {\r\n        this.el = $(holder).get(0);\r\n        this.titleItems = $(\".ui-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ui-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ui-tab-fixed\"); // 是否为固定高度的\r\n\r\n        var that = this;\r\n        this.titleItems.each(function (index) {\r\n            $(this).click(function () {\r\n                that.show(index);\r\n            });\r\n        });\r\n\r\n        var index = this.titleItems.filter(\".ui-current\").index();\r\n        if (index == -1) {\r\n            index = 0;\r\n        }\r\n\r\n        this.show(index);\r\n    }\r\n\r\n    Tab.prototype.defaultOptions = {\r\n        callBack: null  // 回调函数,tab切换时回调函数\r\n    };\r\n\r\n    Tab.prototype.show = function (index) {\r\n        if (this.fixed) {\r\n            var move = -index * 100 + \"%\";\r\n            this.bodyWrapper.css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        }\r\n        this.contentItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this.titleItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this._end(index);\r\n    };\r\n\r\n    Tab.prototype._end = function (index) {\r\n        this.lastIndex = this.currentIndex;\r\n        this.currentIndex = index;\r\n\r\n        if (this.options.callBack) {\r\n            this.options.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, options) {\r\n        return new Tab(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\r\n","// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipu, $) {\r\n    var active = {};\r\n\r\n    var options = defaultOptions = {\r\n        distanceAllow: 10,   // 最大移动距离,超过移除效果\r\n        displayDelay: 100,  // 延时显示时间,以防止是滚动操作\r\n        hideDelay: 120,     // 隐藏延时时间\r\n        eventName: 'click', // 事件处理是click\r\n        activeClass: 'ui-active',   // 激活时的class\r\n        getHandleNode: function (node) {  // 找到最先一级处理此click事件的元素\r\n            if (!node || !node.nodeType) return;\r\n\r\n            var distNode = null;\r\n            var nodeArray = [];\r\n\r\n            // 还有其它情形考虑,如a标签的跳转,或在原生元素添加事件属性的\r\n            function findHander(inNode) {\r\n                // 此方法适用于jquery, 1.12.4, 2.2.4, 3.2.1版本,_data方法以后可能会被移除。$.data是一些老版本写法\r\n                var eventHandlers = ($._data || $.data)(inNode, 'events');\r\n\r\n                if (eventHandlers) {\r\n                    eventHandlers = eventHandlers[options.eventName];\r\n                }\r\n\r\n                if (!eventHandlers) {\r\n                    return;\r\n                }\r\n\r\n                var thisNode = false;\r\n                $.each(eventHandlers, function (index, handler) {\r\n                    if (handler.selector) {\r\n                        var objs = $(handler.selector, inNode);\r\n                        $.each(nodeArray, function (tIndex, tNode) {\r\n                            if (objs.is(tNode)) {\r\n                                distNode = tNode;\r\n                                return false;\r\n                            }\r\n                        });\r\n\r\n                        if (distNode) {\r\n                            return false; //\r\n                        }\r\n                    } else {\r\n                        thisNode = true;  // 保存distNode,有可能有子节点满足条件,所以只保存此值为默认值\r\n                    }\r\n                });\r\n\r\n                if (thisNode && distNode == null) { // 如果没在子节点找到click事件,而当前节点又有click事件,就使用当前节点\r\n                    distNode = inNode;\r\n                }\r\n\r\n                return distNode;\r\n            }\r\n\r\n            while (!(\"tagName\" in node) || !findHander(node)) {\r\n                if (!node.parentNode || node.parentNode.nodeType != 1) {\r\n                    break;\r\n                }\r\n                nodeArray.push(node);\r\n                node = node.parentNode;\r\n            }\r\n\r\n            return distNode;\r\n        }\r\n    };\r\n\r\n    function getOriginalEvent(e) {\r\n        return e.originalEvent || e;\r\n    }\r\n\r\n    function getXY(e) {\r\n        var x = e.touches ? e.touches[0].pageX : e.clientX;\r\n        var y = e.touches ? e.touches[0].pageY : e.clientY;\r\n        return [x, y];\r\n    }\r\n\r\n    //根据不同浏览器获取不同原生事件event\r\n    var hasTouch = \"ontouchstart\" in window,\r\n        START_EVENT = hasTouch ? 'touchstart' : 'mousedown',\r\n        MOVE_EVENT = hasTouch ? 'touchmove' : 'mousemove',\r\n        END_EVENT = hasTouch ? 'touchend' : 'mouseup',\r\n        CANCEL_EVENT = hasTouch ? 'touchcancel' : '';\r\n\r\n    $(function () {\r\n        var startXY, tapEl, timeOutID;\r\n        var dom = document.body;\r\n\r\n        // force为false的时候,不用管timeOutID,在老的timeOutID未移除的情况下,有可能又产生了新的,\r\n        // 导致else代码未被执行,导致老的点击元素class未被移除\r\n        function removeClass(dom, force) {\r\n            if (force && timeOutID) {\r\n                window.clearTimeout(timeOutID);\r\n            } else {\r\n                $(dom).removeClass(options.activeClass);\r\n            }\r\n        }\r\n\r\n        function removeActive(force) {\r\n            if (force) {\r\n                removeClass(tapEl, force);\r\n            } else {\r\n                window.setTimeout(removeClass, options.hideDelay, tapEl, force);\r\n            }\r\n            startXY = null;\r\n            tapEl = null;\r\n        }\r\n\r\n        $(dom).bind(START_EVENT, function (e) {\r\n            if (tapEl) {    // 多点接触时处理\r\n                removeActive(true);\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n            startXY = getXY(e);\r\n            tapEl = options.getHandleNode(e.target);\r\n\r\n            if (tapEl) {\r\n                timeOutID = window.setTimeout(function (dom) {\r\n                    timeOutID = null;\r\n                    $(dom).addClass(options.activeClass);\r\n                }, options.displayDelay, tapEl);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(MOVE_EVENT, function (e) {\r\n            if (!tapEl) {\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n\r\n            var xy = getXY(e);\r\n            if (startXY && (Math.abs(xy[0] - startXY[0]) > options.distanceAllow || Math.abs(xy[1] - startXY[1]) > options.distanceAllow)) {\r\n                removeActive(true);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(END_EVENT, function (e) {\r\n            if (tapEl) {\r\n                removeActive();\r\n            }\r\n        });\r\n\r\n        // 手机来电等非用户取消操作时触发事件\r\n        if (CANCEL_EVENT) {\r\n            $(dom).bind(CANCEL_EVENT, function (e) {\r\n                if (tapEl) {\r\n                    removeActive();\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    // 更新默认值\r\n    active.setOptions = function (opts) {\r\n        options = this.options = $.extend({}, defaultOptions, opts);\r\n    };\r\n    ipu.active = active;\r\n})(ipu || window, jQuery);\r\n\r\n","/*===========================\r\nDevice/OS Detection\r\n===========================*/\r\n// from sui,但IPU框架的ua不是这样的\r\n;(function (ipu, $) {\r\n    \"use strict\";\r\n    var device = {};  // Classes\r\n    var classNames = [];\r\n    var ua = navigator.userAgent\r\n    \r\n    // 这中针对ipu框架的情况,待测试\r\n    if(ua.match(/ipumobile/i)){\r\n        device.ios =  !!ua.match(/ios/i);\r\n        device.android = !!ua.match(/android/i);\r\n    }else{\r\n        var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\r\n        var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\r\n        var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\r\n        var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\r\n\r\n        device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\r\n\r\n        // Android\r\n        if (android) {\r\n            device.os = 'android';\r\n            device.osVersion = android[2];\r\n            device.android = true;\r\n            device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\r\n        }\r\n        if (ipad || iphone || ipod) {\r\n            device.os = 'ios';\r\n            device.ios = true;\r\n        }\r\n        // iOS\r\n        if (iphone && !ipod) {\r\n            device.osVersion = iphone[2].replace(/_/g, '.');\r\n            device.iphone = true;\r\n        }\r\n        if (ipad) {\r\n            device.osVersion = ipad[2].replace(/_/g, '.');\r\n            device.ipad = true;\r\n        }\r\n        if (ipod) {\r\n            device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\r\n            device.iphone = true;\r\n        }\r\n        // iOS 8+ changed UA\r\n        if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\r\n            if (device.osVersion.split('.')[0] === '10') {\r\n                device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\r\n            }\r\n        }\r\n\r\n        // Webview\r\n        device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\r\n\r\n        // Minimal UI\r\n        if (device.os && device.os === 'ios') {\r\n            var osVersionArr = device.osVersion.split('.');\r\n            device.minimalUi = !device.webView &&\r\n                (ipod || iphone) &&\r\n                (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\r\n                $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\r\n        }\r\n\r\n        // Check for status bar and fullscreen app mode\r\n        var windowWidth = $(window).width();\r\n        var windowHeight = $(window).height();\r\n        device.statusBar = false;\r\n        if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\r\n            device.statusBar = true;\r\n        }\r\n        else {\r\n            device.statusBar = false;\r\n        }\r\n\r\n\r\n        // Pixel Ratio\r\n        device.pixelRatio = window.devicePixelRatio || 1;\r\n        classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\r\n        if (device.pixelRatio >= 2) {\r\n            classNames.push('retina');\r\n        }\r\n\r\n        // OS classes\r\n        if (device.os) {\r\n            classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\r\n            if (device.os === 'ios') {\r\n                var major = parseInt(device.osVersion.split('.')[0], 10);\r\n                for (var i = major - 1; i >= 6; i--) {\r\n                    classNames.push('ios-gt-' + i);\r\n                }\r\n            }\r\n\r\n        }\r\n        // Status bar classes\r\n        if (device.statusBar) {\r\n            classNames.push('with-statusbar-overlay');\r\n        }\r\n        else {\r\n            $('html').removeClass('with-statusbar-overlay');\r\n        }\r\n\r\n\r\n        // keng..\r\n        device.isWeixin = /MicroMessenger/i.test(ua);\r\n    }\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0){\r\n        $('html').addClass(classNames.join(' '));\r\n    }\r\n\r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n","\r\n        // 初始化代码\r\n        jQuery(function () {\r\n            FastClick.attach(document.body);\r\n        });\r\n\r\n        return ipu;\r\n    }\r\n\r\n    // todo:可以添加一个和其它库的适配处理,\r\n    // 这里假设第三方库,jquery,iScroll,Hammer的史称已经固定\r\n    if ( typeof define === \"function\" && define.amd ) {\r\n        define(['jquery', 'iScroll', 'Hammer', 'FastClick'], function (jQuery, iScroll, Hammer, FastClick) {\r\n            return window.ipu = setup(jQuery, iScroll, Hammer, FastClick);\r\n        });\r\n    } else {\r\n        window.ipu = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n    }\r\n})();\r\n"]}

+ 1 - 1
ipuui/dist/js/ipu.min.js.map

@ -1 +1 @@
1
{"version":3,"sources":["ipu.js"],"names":["setup","jQuery","iScroll","Hammer","FastClick","ipu","$","iscroll","Carousel","slt","options","this","extend","defaultOpt","el","eq","autoPlay","hasIndicator","indicator","callBack","currentIndex","_init","play","prototype","index","duration","indicatorPosition","wrapper","carouselItems","size","that","activeIndex","filter","_addIndicator","window","resize","refresh","scrollOpt","snap","momentum","scrollX","scrollY","hScrollbar","onScrollStart","_pause","onTouchEnd","onScrollEnd","_end","get","show","stop","timeoutId","clearTimeout","prev","next","time","scrollToPage","_play","setTimeout","currPageX","indicatorIndexs","addClass","siblings","removeClass","html","i","appendTo","destroy","carousel","DtPicker","defaultOptions","Picker","defaultPickerDate","Date","template","buttons","labels","type","customData","hasClear","self","mask","createMask","_picker","holder","ui","picker","ok","cancel","clear","listen","h","onChange","item","beginMonth","endMonth","_createMinutes","d","_createHours","m","_createDay","y","_createMonth","_create","_setLabels","_setButtons","attr","_setSelectedValue","value","getSelected","selected","getSelectedItem","toString","text","getFullYear","getMonth","getDate","getHours","getMinutes","parsedValue","_parseSetValue","setListen","setSelectedValue","isLeapYear","year","_inArray","array","_item","getDayNum","month","_fill","num","length","_isBeginYear","beginYear","parseInt","getSelectedValue","_isBeginMonth","_isBeginDay","beginDay","_isBeginHours","beginHours","_isEndYear","endYear","_isEndMonth","_isEndDay","endDay","_isEndHours","endHours","_createYear","current","yArray","yBegin","yEnd","push","setItems","mArray","maxMonth","val","dArray","maxDay","hArray","maxHours","iArray","beginMinutes","maxMinutes","endMinutes","each","label","innerText","hide","click","clickCall","now","rs","valu","parts","replace","split","j","beginDate","endDate","setBeginDate","date","setEndDate","dispose","parentNode","removeChild","name","disposed","sltDate","call","close","callback","element","document","createElement","classList","add","addEventListener","_show","setAttribute","body","appendChild","_remove","dtPicker","HammerCarousel","navSlt","clickBack","showSize","carouselItemSizes","moveLen","lastItem","slice","clone","sizeCount","hammer","Manager","Pan","direction","DIRECTION_HORIZONTAL","threshold","on","bindFn","onPan","width","wrapperSize","outerWidth","itemSize","mostSize","dom","position","left","move","displayMoveLen","css","animate","toggleClass","ev","delta","deltaX","intValue","Math","abs","decimal","hammerCarousel","__dealCssEvent","eventNameArr","fireCallBack","e","target","events","off","handleClicks","clicked","hasClass","defaults","modalCloseByOutside","closeModal","actionsCloseByOutside","popupCloseByOutside","fn","transitionEnd","_modalTemplateTempDiv","modalStack","modalButtonOk","modalButtonCancel","modalPreloaderTitle","modalContainer","modalStackClearQueue","shift","modal","params","modalHTML","buttonsHTML","bold","extraClass","titleHTML","title","textHTML","afterTextHTML","afterText","noButtons","verticalButtons","innerHTML","children","append","find","onClick","openModal","alert","callbackOk","arguments","undefined","modalTitle","confirm","callbackCancel","omodalButtonCancelnClick","prompt","minLoad","loadOverTime","loadEnd","loadTimeOut","showPreloader","minTime","hidePreloader","preloaderModal","force","showIndicator","hideIndicator","remove","actions","groupSelector","buttonSelector","isArray","button","buttonClass","color","bg","disabled","groups","groupIndex","clickTarget","buttonIndex","buttonParams","is","toast","msg","extraclass","$toast","cb","isModal","isNotToast","isPopup","isLoginScreen","isPickerModal","isToast","marginTop","round","outerHeight","marginLeft","overlay","clientLeft","trigger","removeOnClose","NavBar","content","contentSlt","nav","contents","navs","me","lastIndex","navBar","submitForm","doc","url","form","action","method","style","display","x","ele","submit","checkPages","hasPages","pagesObj","zeroPageClass","pageIdPrefix","isZeroPage","page","animationEnd","maps","pageNo","animateInClass","animateOutClass","eventName","zeroPagesClass","parent","backIndex","closeIndex","showLoading","loadingMessage","minMessageTime","data","pageName","openPage","end","animatePage","newPage","nowPageNo","zeroPage","one","pageDoc","contentDocument","postPage","backPage","nextAll","nowDoc","iframe","evt","createEvent","initEvent","dispatchEvent","nowPage","prevPage","prevAll","closePage","open","post","back","backHome","onBack","originalEvent","showItemSize","r","itemAngle","maxExceed","wrap","beginAngle","beginExceed","stopInertiaMove","lastAngle","empty","device","ios","DIRECTION_VERTICAL","Press","_onPan","endScroll","textName","newData","lis","items","itemsSize","endAngle","endExceed","transform","transform-origin","setAngle","newAngle","angle","moveAngle","calcAngle","deltaY","v","overallVelocityY","dir","deceleration","dist","startAngle","distAngle","srcDistAngle","scrollDistAngle","ca","PI","c","calcItemVisable","oldIndex","difference","toFixed","nowTime","getTime","frameInterval","stepCount","stepIndex","inertiaMove","quartEaseOut","bool","t","b","getSelectedText","getSelectedIndex","PopPicker","pickerTemplate","layer","btns","bodyHtml","pickers","Array","pickerHtml","prependTo","getSelectItems","setData","popPicker","progressBar","id","level","progress","setProgress","setLevel","pro","getProgress","Refresh","_initBottomAndTop","iScrollOptions","onScrollMove","topEnable","topLoading","topPullOffset","topEl","_checkBottomLoading","goTop","onBeforeScrollEnd","_checkTopLoading","minScrollY","scrollTo","onRefresh","_checkContentLoading","bottomLoadFun","topLoadFun","initEnableTop","initEnableBottom","bottomLoadHtml","topLoadHtml","bottomAddLen","scrollEl","bottomEl","bottomPullOffset","bottomLoading","bottomEnable","enableBottom","enableTop","maxScrollY","_startBottomLoading","_startTopLoading","endBottomLoading","endTopLoading","enable","optoins","Tab","titleItems","bodyWrapper","contentItems","fixed","tab","getOriginalEvent","getXY","touches","pageX","clientX","pageY","clientY","active","distanceAllow","displayDelay","hideDelay","activeClass","getHandleNode","node","findHander","inNode","eventHandlers","_data","thisNode","handler","selector","objs","nodeArray","tIndex","tNode","distNode","nodeType","hasTouch","START_EVENT","MOVE_EVENT","END_EVENT","CANCEL_EVENT","timeOutID","removeActive","tapEl","startXY","bind","xy","setOptions","opts","classNames","ua","navigator","userAgent","match","android","ipad","ipod","iphone","androidChrome","os","osVersion","toLowerCase","indexOf","webView","osVersionArr","minimalUi","windowWidth","windowHeight","height","statusBar","screen","pixelRatio","devicePixelRatio","floor","major","isWeixin","test","join","attach","define","amd"],"mappings":"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","file":"ipu.min.js","sourcesContent":["(function () {\r\n    function setup(jQuery, iScroll, Hammer, FastClick) {\r\n        var ipu = {};\r\n\n// Carousel\r\n(function (ipu, $, iscroll) {\r\n// carouselSlt应该是唯一的,否则怎么支撑多个回调,如果用户不需要多个回调,也不主动调用,则可以,先不管吧???\r\n    function Carousel(slt, options) {\r\n        this.options = options = $.extend({}, this.defaultOpt, options);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = options.autoPlay;\r\n         this.hasIndicator = options.indicator;\r\n        this.callBack = options.callBack;\r\n        this.currentIndex = null;\r\n\r\n        this._init();\r\n        this.play();\r\n    }\r\n\r\n    Carousel.prototype = {\r\n        defaultOpt: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            that = this;\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.hasIndicator) {\r\n                this._addIndicator();\r\n            }\r\n            $(window).resize(function () {\r\n                that.refresh();\r\n            });\r\n            var scrollOpt = {\r\n                snap: \"li\",          // carousel效果\r\n                momentum: false,     // 移除惯性处理\r\n                scrollX: true,       // X轴移动\r\n                scrollY:false,\r\n                hScrollbar: false,   // 没有纵向滚动条\r\n                onScrollStart: function () {\r\n                    that._pause();\r\n                },\r\n                onTouchEnd: function () {\r\n                    // 后面优化\r\n                    /*\r\n                     if (that.iscroll.currPageX == that.size - 1) {\r\n                     that.show(that.size - 2);\r\n                     }\r\n                     */\r\n                },\r\n                onScrollEnd: function () {\r\n                    that._end();\r\n                }\r\n            };\r\n            this.iscroll = new iscroll(this.el.get(0), scrollOpt);\r\n            this.show(this.options.index, 0);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.autoPlay=false;\r\n        },\r\n        _pause: function () {\r\n            if (this.autoPlay && this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            this.show(index);\r\n        },\r\n        next: function () {\r\n            var index = this.currentIndex == this.size - 1 ? 0 : this.currentIndex + 1;\r\n            this.show(index);\r\n        },\r\n        show: function (index, time) {\r\n            this._pause();\r\n            this.iscroll.scrollToPage(index, 0, time);\r\n        },\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        refresh: function () {\r\n            var that = this;\r\n            that.show(this.currentIndex);\r\n        },\r\n        _play: function () {\r\n            if (this.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    this.timeoutId = null;\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {\r\n            var currentIndex = this.iscroll.currPageX;\r\n            if (currentIndex != this.currentIndex) {\r\n                if (this.callBack) {\r\n                    this.callBack(currentIndex, this.currentIndex);\r\n                }\r\n                this.currentIndex = currentIndex;\r\n\r\n                if (this.hasIndicator) {\r\n                    this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this._play();\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        destroy: function () {\r\n            // 自己怎么销毁,相关事件移除??\r\n            this.iscroll.destroy();\r\n        }\r\n    };\r\n\r\n    ipu.carousel =  function (slt, options) {\r\n        return new Carousel(slt, options);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来运算\r\n\r\n\r\n    // show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n    // 日期范围的选择处理\r\n    function DtPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    DtPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker ui-dtpicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-clear\">清除</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-title\">\\\r\n                            <label class=\"ui-dtpicker-y\"></label>\\\r\n                            <label class=\"ui-dtpicker-m\"></label>\\\r\n                            <label class=\"ui-dtpicker-d\"></label>\\\r\n                            <label class=\"ui-dtpicker-h\"></label>\\\r\n                            <label class=\"ui-dtpicker-mi\"></label>\\\r\n                        </div>\\\r\n                        <div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                            <div class=\"ui-picker\" data-id=\"picker-y\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-m\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-d\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-h\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-mi\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                        </div>\\\r\n                    </div>',\r\n        buttons: ['取消', '确认', '清除'],\r\n        labels: ['年', '月', '日', '时', '分'],\r\n        type: 'datetime',       // date, time, datetime, hour, month\r\n        customData: {},  // 自定义数据\r\n        hasClear: false,    // 是否显示清除按钮\r\n        callBack: function () { // 选择数据时的回调函数\r\n        }\r\n        // beginDate: Date类型,或毫秒值\r\n        // endDate: 同上\r\n    };\r\n\r\n    DtPicker.prototype._init = function () {\r\n        var self = this;\r\n        this.mask = this.createMask();\r\n\r\n        var _picker = this.holder = $(this.options.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ui-poppicker-btn-ok', _picker),\r\n            cancel: $('.ui-poppicker-btn-cancel', _picker),\r\n            clear: $('.ui-poppicker-btn-clear', _picker),\r\n            buttons: $('.ui-poppicker-header .ui-btn', _picker),\r\n            labels: $('.ui-poppicker-title label', _picker)\r\n        };\r\n\r\n\r\n        ui.i = new Picker($('[data-id=\"picker-mi\"]', _picker), {listen: false}); // 分钟变更无需要处理\r\n\r\n        ui.h = new Picker($('[data-id=\"picker-h\"]', _picker), {         // 小时变更,有最小值或最大值,需要变更分钟\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createMinutes();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.d = new Picker($('[data-id=\"picker-d\"]', _picker), { //仅提供了beginDate时,触发day,hours,minutes的change\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createHours();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.m = new Picker($('[data-id=\"picker-m\"]', _picker), { // 月变更时,总要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null) {\r\n                    self._createDay();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.y = new Picker($('[data-id=\"picker-y\"]', _picker), { // 年发生变更,如果没有结束月,此时有所有的月,是不需要变更月的,只需要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index != null) {\r\n                    if (self.options.beginMonth || self.options.endMonth) {\r\n                        self._createMonth();\r\n                    } else {\r\n                        self._createDay();\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n\r\n\r\n\r\n        self._create();\r\n\r\n        var ui = self.ui;\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.options.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.options.value);\r\n\r\n        //防止滚动穿透 TODO:待确认情况\r\n        /* self.ui.picker.addEventListener($.EVENT_START, function (event) {\r\n         event.preventDefault();\r\n         }, false);\r\n         self.ui.picker.addEventListener($.EVENT_MOVE, function (event) {\r\n         event.preventDefault();\r\n         }, false);*/\r\n    };\r\n\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.options.type;\r\n        var selected = {\r\n            type: type,\r\n            y: ui.y.getSelectedItem(),\r\n            m: ui.m.getSelectedItem(),\r\n            d: ui.d.getSelectedItem(),\r\n            h: ui.h.getSelectedItem(),\r\n            i: ui.i.getSelectedItem(),\r\n            toString: function () {\r\n                return this.value;\r\n            }\r\n        };\r\n        switch (type) {\r\n            case 'datetime':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'date':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text;\r\n                break;\r\n            case 'time':\r\n                selected.value = selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'month':\r\n                selected.value = selected.y.value + '-' + selected.m.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text;\r\n                break;\r\n            case 'hour':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text;\r\n                break;\r\n        }\r\n        return selected;\r\n    };\r\n\r\n    DtPicker.prototype._setSelectedValue = function (value) {\r\n        var self = this;\r\n        var ui = self.ui;\r\n\r\n        if(!value){\r\n            if(this.options.type == 'time'){\r\n                value = '00:00';\r\n            }else{\r\n                value = defaultPickerDate.getFullYear()+'-'+(defaultPickerDate.getMonth()+1)+'-'+defaultPickerDate.getDate()+' '\r\n                    + defaultPickerDate.getHours() + ':' + defaultPickerDate.getMinutes();\r\n            }\r\n        }\r\n        var parsedValue = self._parseSetValue(value);\r\n\r\n        ui.y.setListen(true);\r\n        ui.m.setListen(false);\r\n        ui.d.setListen(false);\r\n        ui.h.setListen(false);\r\n        ui.i.setListen(false);\r\n        ui.y.setSelectedValue(parsedValue.y);\r\n\r\n        ui.m.setListen(true);\r\n        ui.m.setSelectedValue(parsedValue.m);\r\n\r\n        ui.d.setListen(true);\r\n        ui.d.setSelectedValue(parsedValue.d);\r\n\r\n        ui.h.setListen(true);\r\n        ui.h.setSelectedValue(parsedValue.h);\r\n\r\n        ui.i.setListen(true);\r\n        ui.i.setSelectedValue(parsedValue.i);\r\n\r\n        this.value = this.getSelected().value;\r\n    };\r\n\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    DtPicker.prototype.isLeapYear = function (year) {\r\n        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);\r\n    };\r\n\r\n    DtPicker.prototype._inArray = function (array, item) {\r\n        for (var index in array) {\r\n            var _item = array[index];\r\n            if (_item === item) return true;\r\n        }\r\n        return false;\r\n    };\r\n\r\n    DtPicker.prototype.getDayNum = function (year, month) {\r\n        var self = this;\r\n        if (self._inArray([1, 3, 5, 7, 8, 10, 12], month)) {\r\n            return 31;\r\n        } else if (self._inArray([4, 6, 9, 11], month)) {\r\n            return 30;\r\n        } else if (self.isLeapYear(year)) {\r\n            return 29;\r\n        } else {\r\n            return 28;\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype._fill = function (num) {\r\n        num = num.toString();\r\n        if (num.length < 2) {\r\n            num = 0 + num;\r\n        }\r\n        return num;\r\n    };\r\n\r\n    DtPicker.prototype._isBeginYear = function () {\r\n        return this.options.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.options.beginMonth && this._isBeginYear() && this.options.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.options.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.options.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.options.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.options.endMonth && this._isEndYear() && this.options.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.options.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.options.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (options.customData.y) {\r\n            yArray = options.customData.y;\r\n        } else {\r\n            var yBegin = options.beginYear;\r\n            var yEnd = options.endYear;\r\n            for (var y = yBegin; y <= yEnd; y++) {\r\n                yArray.push({\r\n                    text: y + '',\r\n                    value: y\r\n                });\r\n            }\r\n        }\r\n        ui.y.setItems(yArray);\r\n        //ui.y.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMonth = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (options.customData.m) {\r\n            mArray = options.customData.m;\r\n        } else {\r\n            var m = options.beginMonth && self._isBeginYear() ? options.beginMonth : 1;\r\n            var maxMonth = options.endMonth && self._isEndYear() ? options.endMonth : 12;\r\n            for (; m <= maxMonth; m++) {\r\n                var val = self._fill(m);\r\n                mArray.push({\r\n                    text: val,\r\n                    value: m\r\n                });\r\n            }\r\n        }\r\n        ui.m.setItems(mArray);\r\n        //ui.m.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createDay = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (options.customData.d) {\r\n            dArray = options.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? options.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? options.endDay : self.getDayNum(parseInt(this.ui.y.getSelectedValue()), parseInt(this.ui.m.getSelectedValue()));\r\n            for (; d <= maxDay; d++) {\r\n                var val = self._fill(d);\r\n                dArray.push({\r\n                    text: val,\r\n                    value: d\r\n                });\r\n            }\r\n        }\r\n        ui.d.setItems(dArray);\r\n        //current = current || ui.d.getSelectedValue();\r\n        //ui.d.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createHours = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (options.customData.h) {\r\n            hArray = options.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? options.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? options.endHours : 23;\r\n            for (; h <= maxHours; h++) {\r\n                var val = self._fill(h);\r\n                hArray.push({\r\n                    text: val,\r\n                    value: h\r\n                });\r\n            }\r\n        }\r\n        ui.h.setItems(hArray);\r\n        //ui.h.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMinutes = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (options.customData.i) {\r\n            iArray = options.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? options.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? options.endMinutes : 59;\r\n            for (; i <= maxMinutes; i++) {\r\n                var val = self._fill(i);\r\n                iArray.push({\r\n                    text: val,\r\n                    value: i\r\n                });\r\n            }\r\n        }\r\n        ui.i.setItems(iArray);\r\n        //ui.i.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._setLabels = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = options.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.cancel.text(options.buttons[0]);\r\n        ui.ok.text(options.buttons[1]);\r\n\r\n        if(options.hasClear){\r\n            ui.clear.text(options.buttons[2])\r\n        }else{\r\n            ui.clear.hide();\r\n        }\r\n\r\n        ui.buttons.each(function (index) {\r\n            $(this).click(function () {\r\n                self.clickCall(index);\r\n            })\r\n        })\r\n    };\r\n\r\n    // 解析设置的值,目前是字符串,完整日期格式 2012-12-12 12:21\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.options.type;\r\n\r\n        var rs = {\r\n            y: now.getFullYear(),\r\n            m: now.getMonth()+1,\r\n            d: now.getDate(),\r\n            h: now.getHours(),\r\n            i: now.getMinutes()\r\n        };\r\n\r\n        if(value instanceof Date){\r\n            if( type == 'time'){\r\n                valu= +value.getHours()+\":\"+value.getMinutes();\r\n            }else{\r\n                value = value.getFullYear()+'-'+(value.getMonth()+1)+'-'+value.getDate()+ ' '\r\n                    +value.getHours()+\":\"+value.getMinutes();\r\n            }\r\n        }\r\n\r\n        var parts = value.replace(\":\", \"-\").replace(\" \", \"-\").split(\"-\");\r\n        for(var i=0, j=parts.length; i<j; i++){\r\n            parts[i] = parseInt(parts[i]);\r\n        }\r\n\r\n        if(type == 'datetime'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = parts[4];\r\n        }else if(type == 'date'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }else if(type == 'time'){\r\n            rs.h = parts[0];    //\r\n            rs.i = parts[1];\r\n        }else if(type == 'hour'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = 0;\r\n        }else if(type == 'month'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = 1;    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }\r\n\r\n        return rs;\r\n    };\r\n\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var options = this.options;\r\n        var now = defaultPickerDate;\r\n\r\n        var beginDate = options.beginDate;\r\n        if(beginDate){\r\n            beginDate = this._parseSetValue(beginDate);\r\n            options.beginYear = beginDate.y;\r\n            options.beginMonth = beginDate.m;\r\n            options.beginDay = beginDate.d;\r\n            options.beginHours = beginDate.h;\r\n            options.beginMinutes = beginDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.beginYear =  now.getFullYear();\r\n            options.beginMonth = now.getMonth() + 1;\r\n            options.beginDay = now.getDate();\r\n            options.beginHours = 0;\r\n            options.beginMinutes = 0;\r\n        }else {\r\n            options.beginYear =  now.getFullYear() - 5;\r\n        }\r\n\r\n        var endDate = options.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            options.endYear = endDate.y;\r\n            options.endMonth = endDate.m;\r\n            options.endDay = endDate.d;\r\n            options.endHours = endDate.h;\r\n            options.endMinutes = endDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.endYear =  now.getFullYear();\r\n            options.endMonth = now.getMonth() + 1;\r\n            options.endDay = now.getDate();\r\n            options.endHours = 24;\r\n            options.endMinutes = 59;\r\n        }else {\r\n            options.endYear =  options.beginYear + 10 ;\r\n        }\r\n\r\n        //生成\r\n        self._createYear();\r\n        self._createMonth();\r\n        self._createDay();\r\n        self._createHours();\r\n        self._createMinutes();\r\n    };\r\n\r\n    // 更新选择框,更新当前值\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.options.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    // 判断最大最小值合理性\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.options.endDate = date;\r\n        this._create();\r\n    };\r\n\r\n    DtPicker.prototype.dispose = function () {\r\n        var self = this;\r\n        self.hide();\r\n        setTimeout(function () {\r\n            self.ui.picker.parentNode.removeChild(self.ui.picker);\r\n            for (var name in self) {\r\n                self[name] = null;\r\n                delete self[name];\r\n            }\r\n            self.disposed = true;\r\n        }, 300);\r\n    };\r\n\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    DtPicker.prototype.clickCall = function(index){\r\n        var self = this;\r\n        var sltDate = self.getSelected();\r\n        var rs = self.options.callBack.call(this , sltDate, index);\r\n        if (rs !== false) {\r\n            if(index == 1){ // 假定确认按钮在第二个位置,传回true则存储当前值\r\n                self.value = sltDate.value;\r\n            }else if(index == 2){\r\n                self.value = null;\r\n            }\r\n            self.hide();\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    DtPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.clickCall(0);\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.dtPicker = function(options){\r\n        return new DtPicker(options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n// 支持非循环\r\n// size命名用的有点混淆。。\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n\r\n(function (ipu, $, Hammer) {\r\n    function HammerCarousel(navSlt, options) {\r\n        this.options = options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(navSlt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    // 直接替换掉了prototype对象,可能不是个好选择\r\n    HammerCarousel.prototype = {\r\n        defaultOptions: {\r\n            index: null,        // 默认显示第几个项,其实挺没用的,默认显示第一个,用户再调用一下显示第几个,作用一样现在。\r\n            autoPlay: false,    // 是否自动轮播\r\n            duration: 3000,     // 轮播间隔\r\n            indicator: false,  //是否生成指示器,即小点点\r\n            callBack: null,  // 轮播后回调函数\r\n            clickBack: null   // 各子项用户点击事件\r\n            //indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\r\n\r\n\r\n            this.showSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n            this.carouselItemSizes = [];\r\n            this.currentIndex = 0;\r\n            this.moveLen = 0;\r\n            this.lastItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来判断是复制项\r\n\r\n            // 这里假设每个元素都是相等的\r\n            this.carouselItems.slice(0, this.showSize).clone().appendTo(this.wrapper); // 如果做无限循环则要这样处理\r\n            this.size = this.carouselItems.size();\r\n\r\n            var self = this;\r\n            if(this.options.clickBack){\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        self.options.clickBack.call(this, i%self.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this.sizeCount();\r\n            var that = this;\r\n\r\n            this.hammer = new Hammer.Manager(this.el); // 避免因为li里面的内容高度不够,而不能触发相关事件\r\n            this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_HORIZONTAL, threshold: 10}));\r\n            this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this.onPan, this));\r\n\r\n            $(window).resize(function () { // 在尺寸变化时,处理,是否可以考虑只在宽度变化时处理,横屏事件?\r\n                that.refresh();\r\n            });\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.options.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.options.index);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.options.autoPlay = false;\r\n        },\r\n        _pause: function () {\r\n            if (this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            if (index == this.size - 1) {\r\n                this._show(this.size, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        next: function () {//下一张\r\n            var index = this.currentIndex == this.size ? 1 : this.currentIndex + 1;\r\n            if (index == 1) {\r\n                this._show(0, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % size;\r\n            if(index < 0 ){\r\n                index = size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        play: function () {\r\n            this.options.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.options.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    that.timeoutId = null;//清空这个timeoutId,代表该次处理已经执行了\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {//移动结束时调用\r\n            var currentIndex = this.currentIndex;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n\r\n            this._play();//处理自动播放\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        sizeCount: function () {\r\n            this.wrapperSize = this.wrapper.outerWidth(true);\r\n            this.itemSize = this.carouselItems.eq(0).outerWidth(true);\r\n            this.mostSize = this.size * this.itemSize; // 宽度*数量\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\").width();\r\n\r\n            var that = this;\r\n            $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n                that.carouselItemSizes[index] = $(this).position().left;\r\n            });\r\n        },\r\n        refresh: function () {\r\n            if (this.wrapperSize != this.wrapper.outerWidth(true)) {\r\n                this.sizeCount();\r\n                this._show(this.currentIndex, true); //新的位置\r\n            }\r\n        },\r\n        move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\");\r\n            var move = (this.moveLen - moveLen) % this.mostSize;\r\n            move = (move + this.mostSize) % this.mostSize;\r\n            this.displayMoveLen = move;\r\n\r\n            move = -move + \"px\";\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        },\r\n        _show: function (index, animate) { // 知道最终移动到的项时,调用\r\n            if (animate !== false) { // 默认值为true\r\n                animate = true;\r\n            }\r\n\r\n            this._pause();\r\n            $(this.wrapper).toggleClass(\"ui-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            //this.currentIndex = index;\r\n            this.lastItem = index == this.size;\r\n            var move = this.carouselItemSizes[index];\r\n            this.moveLen = move;\r\n            move = -move + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n            if (animate) {\r\n                this._end();\r\n            }\r\n        },\r\n        onPan: function (ev) {\r\n            var delta = ev.deltaX;\r\n            // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n            if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n                var value = delta / this.itemSize;\r\n                var intValue = parseInt(Math.abs(value));               // 取整数\r\n                var decimal = Math.abs(value) % 1;                   // 取小数\r\n\r\n                if (decimal > 0.2) { // 滑动超过页面宽20%;\r\n                    intValue = intValue + 1;\r\n                }\r\n                if (value > 0) {\r\n                    intValue = -intValue;\r\n                }\r\n\r\n                var index = (this.currentIndex + intValue) % this.size;\r\n                index = (index + this.size) % this.size; // 因为可能是个负值,转换成正值\r\n\r\n                // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n                if (index == 0 && this.displayMoveLen > this.itemSize) {\r\n                    index = this.size;\r\n                }\r\n                this._show(index);\r\n            } else if (ev.type == 'panmove'){\r\n                this.move(delta);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.hammerCarousel = function (slt, options) {\r\n        return new HammerCarousel(slt, options);\r\n    };\r\n})(ipu || window, jQuery,  Hammer);\r\n\n(function (ipu, $) {\r\n    //$ extends\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        // console.log('__dealCssEvent');\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            /*jshint validthis:true */\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.transitionEnd = function (callback) {\r\n        // console.log('transitionEnd');\r\n        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalStack: true,\r\n        modalButtonOk: '确定',\r\n        modalButtonCancel: '取消',\r\n        modalPreloaderTitle: '加载中',\r\n        modalContainer: document.body ? document.body : 'body'\r\n    };\r\n\r\n    ipu.modalStack = [];\r\n\r\n    ipu.modalStackClearQueue = function () {\r\n        if (ipu.modalStack.length) {\r\n            (ipu.modalStack.shift())();\r\n        }\r\n    };\r\n    ipu.modal = function (params) {\r\n        params = params || {};\r\n        var modalHTML = '';\r\n        var buttonsHTML = '';\r\n        if (params.buttons && params.buttons.length > 0) {\r\n            for (var i = 0; i < params.buttons.length; i++) {\r\n                buttonsHTML += '<span class=\"ui-modal-button' + (params.buttons[i].bold ? ' ui-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\r\n            }\r\n        }\r\n        var extraClass = params.extraClass || '';\r\n        var titleHTML = params.title ? '<div class=\"ui-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ui-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ui-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ui-modal-buttons-vertical' : '';\r\n        modalHTML = '<div class=\"ui-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ui-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ui-modal-buttons ' + verticalButtons + '\">' + buttonsHTML + '</div></div>';\r\n\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n\r\n        var modal = $(_modalTemplateTempDiv).children();\r\n\r\n        $(defaults.modalContainer).append(modal[0]);\r\n\r\n        // Add events on buttons\r\n        modal.find('.ui-modal-button').each(function (index, el) {\r\n            $(el).on('click', function (e) {\r\n                if (params.buttons[index].close !== false) ipu.closeModal(modal);\r\n                if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\r\n                if (params.onClick) params.onClick(modal, index);\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n    ipu.alert = function (text, title, callbackOk) {\r\n        if (typeof title === 'function') {\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\r\n        });\r\n    };\r\n    ipu.confirm = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [\r\n                {text: defaults.modalButtonCancel, omodalButtonCancelnClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n    ipu.prompt = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            afterText: '<input type=\"text\" class=\"ui-modal-text-input\">',\r\n            buttons: [\r\n                {\r\n                    text: defaults.modalButtonCancel\r\n                },\r\n                {\r\n                    text: defaults.modalButtonOk,\r\n                    bold: true\r\n                }\r\n            ],\r\n            onClick: function (modal, index) {\r\n                if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ui-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ui-modal-text-input').val());\r\n            }\r\n        });\r\n    };\r\n\r\n    var minLoad = false;        // 是否最小时间调用方式\r\n    var loadOverTime = false;   // 是否超过最小调用时间\r\n    var loadEnd = false;        // 是否调用结束\r\n    var loadTimeOut = null;     // 延时调用ID\r\n\r\n    ipu.showPreloader = function (title, minTime) {\r\n        ipu.hidePreloader(true);\r\n\r\n        ipu.showPreloader.preloaderModal = ipu.modal({\r\n            title: title || defaults.modalPreloaderTitle,\r\n            text: '<div class=\"ui-preloader\"></div>'\r\n        });\r\n\r\n        if(minTime){\r\n            minLoad = true;\r\n            loadTimeOut = setTimeout(function () {\r\n                loadOverTime = true;\r\n                if(loadEnd){\r\n                    ipu.hidePreloader();\r\n                }\r\n            }, minTime);\r\n        }\r\n\r\n        return ipu.showPreloader.preloaderModal;\r\n    };\r\n    ipu.hidePreloader = function (force) {\r\n        if(force || !minLoad || (minLoad && loadOverTime)){\r\n            if(force && loadTimeOut){\r\n                window.clearTimeout(loadTimeOut);\r\n            }\r\n            ipu.showPreloader.preloaderModal && ipu.closeModal(ipu.showPreloader.preloaderModal);\r\n            minLoad = false; // 重置各标志位\r\n            loadOverTime = false;\r\n            loadEnd = false;\r\n            loadTimeOut = null;\r\n        }else{\r\n            loadEnd = true;\r\n        }\r\n    };\r\n    ipu.showIndicator = function () {\r\n        if ($('.ui-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ui-preloader-indicator-overlay\"></div><div class=\"ui-preloader-indicator-modal\"><span class=\"ui-preloader ui-preloader-white\"></span></div>');\r\n    };\r\n    ipu.hideIndicator = function () {\r\n        $('.ui-preloader-indicator-overlay, .ui-preloader-indicator-modal').remove();\r\n    };\r\n    // Action Sheet\r\n    ipu.actions = function (params) {\r\n        var modal, groupSelector, buttonSelector;\r\n        params = params || [];\r\n\r\n        if (params.length > 0 && !$.isArray(params[0])) {\r\n            params = [params];\r\n        }\r\n        var modalHTML;\r\n        var buttonsHTML = '';\r\n        for (var i = 0; i < params.length; i++) {\r\n            for (var j = 0; j < params[i].length; j++) {\r\n                if (j === 0) buttonsHTML += '<div class=\"ui-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ui-actions-modal-label' : 'ui-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ui-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ui-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ui-bg-' + button.bg;\r\n                if (button.disabled) buttonClass += ' disabled';\r\n                buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\r\n                if (j === params[i].length - 1) buttonsHTML += '</div>';\r\n            }\r\n        }\r\n        modalHTML = '<div class=\"ui-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ui-actions-modal-group';\r\n        buttonSelector = '.ui-actions-modal-button';\r\n\r\n        var groups = modal.find(groupSelector);\r\n        groups.each(function (index, el) {\r\n            var groupIndex = index;\r\n            $(el).children().each(function (index, el) {\r\n                var buttonIndex = index;\r\n                var buttonParams = params[groupIndex][buttonIndex];\r\n                var clickTarget;\r\n                if ($(el).is(buttonSelector)) clickTarget = $(el);\r\n                // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\r\n\r\n                if (clickTarget) {\r\n                    clickTarget.on('click', function (e) {\r\n                        if (buttonParams.close !== false) ipu.closeModal(modal);\r\n                        if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n                    });\r\n                }\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n\r\n    //显示一个消息,会在2秒钟后自动消失\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ui-modal ui-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n        ipu.openModal($toast, function () {\r\n            setTimeout(function () {\r\n                ipu.closeModal($toast);\r\n            }, duration || 2000);\r\n        });\r\n    };\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isNotToast = !modal.hasClass('ui-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n        if ($('.ui-modal.ui-modal-in:not(.ui-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\r\n            ipu.modalStack.push(function () {\r\n                ipu.openModal(modal, cb);\r\n            });\r\n            return;\r\n        }\r\n        var isPopup = modal.hasClass('ui-popup');\r\n        var isLoginScreen = modal.hasClass('ui-login-screen');\r\n        var isPickerModal = modal.hasClass('ui-picker-modal');\r\n        var isToast = modal.hasClass('ui-toast');\r\n        if (isModal) {\r\n            modal.show();\r\n            modal.css({\r\n                marginTop: -Math.round(modal.outerHeight() / 2) + 'px'\r\n            });\r\n        }\r\n        if (isToast) {\r\n            modal.css({\r\n                marginLeft: -Math.round(modal.outerWidth() / 2 ) + 'px' //1.185 是初始化时候的放大效果\r\n            });\r\n        }\r\n\r\n        var overlay;\r\n        if (!isLoginScreen && !isPickerModal && !isToast) {\r\n            if ($('.ui-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ui-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        }\r\n\r\n        //Make sure that styles are applied, trigger relayout;\r\n        var clientLeft = modal[0].clientLeft;\r\n\r\n        // Trugger open event\r\n        modal.trigger('open');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).addClass('ui-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('ui-modal-overlay-visible');\r\n        modal.removeClass('ui-modal-out').addClass('ui-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n        });\r\n        // excute callback\r\n        if (typeof cb === 'function') {\r\n            cb.call(this);\r\n        }\r\n        return true;\r\n    };\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ui-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isPopup = modal.hasClass('ui-popup'),\r\n            isToast = modal.hasClass('ui-toast'),\r\n            isLoginScreen = modal.hasClass('ui-login-screen'),\r\n            isPickerModal = modal.hasClass('ui-picker-modal'),\r\n            removeOnClose = modal.hasClass('ui-remove-on-close'),\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ui-popup.ui-modal-in').length) {\r\n                overlay.removeClass('ui-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ui-modal-overlay-visible');\r\n        }\r\n        modal.trigger('close');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).removeClass('ui-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ui-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ui-modal-in').addClass('ui-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ui-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ui-modal-out').hide();\r\n                if (removeOnClose && modal.length > 0) {\r\n                    modal.remove();\r\n                }\r\n            }\r\n            else {\r\n                modal.remove();\r\n            }\r\n        });\r\n        if (isModal && defaults.modalStack) {\r\n            ipu.modalStackClearQueue();\r\n        }\r\n\r\n        return true;\r\n    };\r\n    function handleClicks(e) {\r\n        /*jshint validthis:true */\r\n        var clicked = $(this);\r\n        var url = clicked.attr('href');\r\n\r\n\r\n        //Collect Clicked data- attributes\r\n       /* var clickedData = clicked.dataset();\r\n\r\n        // Popup\r\n        var popup;\r\n        if (clicked.hasClass('ui-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ui-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ui-modal-overlay')) {\r\n            if ($('.ui-modal.ui-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ui-modal.ui-modal-in');\r\n            if ($('.ui-actions-modal.ui-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ui-actions-modal.ui-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ui-popup-overlay')) {\r\n            if ($('.ui-popup.ui-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ui-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ui-modal-overlay, .ui-popup-overlay, .ui-close-popup, .ui-open-popup, .ui-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n    NavBar.prototype.defaultOpt = {\r\n        animate: false,           // 默认有动画\r\n        contentSlt: \".ui-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) { // currentIndex: 当前索引,lastIndex上一次索引(第一次时为null)\r\n        }\r\n    };\r\n\r\n    function NavBar(slt, options) {\r\n        this.options = $.extend({}, this.defaultOpt, options);\r\n        this.content = $(this.options.contentSlt);\r\n        this.nav = $(slt);\r\n        this.wrapper = $(\">ul\", this.content);\r\n        this.contents = $(\">li\", this.wrapper);\r\n        this.navs = $(\">a\", this.nav);\r\n        var me = this;\r\n\r\n        var activeIndex = this.navs.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.options.animate) {\r\n            this.wrapper.addClass(\"ui-no-animation\")\r\n        }\r\n\r\n        this.navs.each(function (index, i) {\r\n            $(this).click(function () {\r\n                me.show(index);\r\n            });\r\n        });\r\n\r\n        this.lastIndex = null;\r\n        this.currentIndex = null;\r\n        me.show(this.options.index);\r\n    }\r\n\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            var currentContent = $(this.contents[index]).addClass(\"ui-show\");\r\n\r\n            if (this.options.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ui-show\"); // 隐藏上上个元素\r\n                }\r\n\r\n                if (this.currentIndex != null) {        // 非第一次需要动画效果\r\n                    if (this.currentIndex < index) {   // 需要内容为往左走,显示右边的内容\r\n                        if (this.lastIndex != null && this.lastIndex < this.currentIndex) {  // 内容已经左走过了,则需要移除动画复原位置,再通过width()方法强制生效\r\n                            this.wrapper.addClass(\"ui-no-animation\").removeClass(\"ui-nav-content-right\").width(); // 可以强制刷新,默认jquery应该会将这些dom上的修改延时处理?\r\n                        }\r\n                    } else {\r\n                        if (this.lastIndex == null || this.lastIndex > this.currentIndex) { // 类似同上\r\n                            this.wrapper.addClass(\"ui-no-animation\").addClass(\"ui-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ui-no-animation\").toggleClass(\"ui-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ui-show\");\r\n            }\r\n\r\n            // 更新class,ui-current状态\r\n            $(this.contents[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n            $(this.navs[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.navBar = function (slt, options) {\r\n        return new NavBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\n    function __dealCssEvent(eventNameArr, callback) {\n        var events = eventNameArr,\n            i, dom = this;// jshint ignore:line\n\n        function fireCallBack(e) {\n            if (e.target !== this) return;\n            callback.call(this, e);\n            for (i = 0; i < events.length; i++) {\n                dom.off(events[i], fireCallBack);\n            }\n        }\n\n        if (callback) {\n            for (i = 0; i < events.length; i++) {\n                dom.on(events[i], fireCallBack);\n            }\n        }\n    }\n\n    $.fn.animationEnd = function (callback) {\n        __dealCssEvent.call(this, ['webkitAnimationEnd', 'animationend'], callback);\n        return this;\n    };\n\n    function submitForm(doc, url ,params){\n        var form = doc.createElement(\"form\");\n        form.action = url;\n        form.method = \"post\";\n        form.style.display = \"none\";\n\n        for (var x in params) {\n            var ele = doc.createElement(\"input\");\n            ele.type=\"hidden\";\n            ele.name = x;\n            ele.value =  params[x];\n            form.appendChild(ele);\n        }\n\n        doc.body.appendChild(form);\n        form.submit();\n    }\n\n    // 检查是否有ui-pages的结构\n    function checkPages() {\n        if(!hasPages){\n            pagesObj = $(\".ui-pages\"); // pagesObj为空则进行jquery取值\n            if(pagesObj.size() == 0){\n                pagesObj =  $(\"<div class='ui-pages'><div class='ui-page ui-show \"+zeroPageClass+\"' id='\"+pageIdPrefix+\"0'></div>\").appendTo(\"body\");\n            }\n            hasPages = true;\n        }\n    }\n\n    // 站位页面\n    function isZeroPage(page) {\n        return $(page).hasClass(zeroPageClass);\n    }\n\n    var page = {};\n    var hasPages = false;\n    var maps = {};\n    var pageNo = 1; // 编号0留给主页面或当前页面,或没有\n    var pageIdPrefix = \"ipuPage-\";\n    var pagesObj = null;\n    var animateInClass = \"ui-anim ui-slideRightIn\";\n    var animateOutClass  = \"ui-anim ui-slideRightOut\";\n    var eventName = \"ipuUIPageBack\";\n    var zeroPageClass = 'ui-page-zero';   // 占位页面,对于为当前页面\n    var zeroPagesClass = 'ui-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\n\n\n\n    page.options = {     // 那个窗口执行open,默认父窗口\n        target: window.parent, // 默认执行父窗口,方法:all\n        backIndex: -1,    // 默认回退一页         方法:back\n        closeIndex: -1,   // 默认关闭最近一个页面 方法:close\n        params:{},        // post的传参            方法:post\n        animate: true,     // 是否动画效果        方法:open post\n        showLoading: true,   // 是否显示加载消息  方法:open post\n        loadingMessage: '正在加载中',  //          方法:open post\n        method : null,     // 请求方式,内置参数,方法自己设置,用户不需要设置  方法:无\n        minMessageTime: 500, // 最小显示加载时间,避免出现闪现的情况 方法:open post\n        data: null,         // 回退时,回传参数, 方法:back\n        pageName: '',     // 给打开的页面命名,以便根据此页面名称来切换页面 方法:open post back close\n        callBack:function () { // 事件回调       方法:open post close back\n        }\n    };\n\n    // 当前页面加载,针对顶层父窗口\n    page.openPage = function (url, options) {\n        var newPage = null;\n        var nowPageNo = pageIdPrefix + (pageNo++);\n        maps[nowPageNo] = url;\n\n        checkPages();\n\n        if(options.showLoading){\n            ipu.showPreloader(options.loadingMessage, options.minMessageTime);\n        }\n\n        if(options.method == 'post'){\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe'></iframe></div>\");\n        }else{\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe' src='\"+url+\"'></iframe></div>\");\n        }\n\n        var zeroPage = isZeroPage($(\".ui-page:last\", pagesObj));\n        var animatePage = newPage;\n        if(zeroPage){\n            animatePage = pagesObj.addClass(zeroPagesClass);\n        }\n\n        function end() {\n            if(options.showLoading) {\n                ipu.hidePreloader();\n            }\n\n            if(options.animate) {\n                animatePage.removeClass(animateInClass);\n            }\n\n            newPage.siblings(\".ui-show\").removeClass('ui-show');\n            if(options.callBack){\n                options.callBack();\n            }\n        }\n\n        $(\".ui-page-iframe\", newPage).one('load', function () {\n            newPage.addClass(\"ui-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\n\n            if(zeroPage){\n                animatePage.removeClass(zeroPagesClass);\n            }\n            if(options.animate){\n                animatePage.addClass(animateInClass).animationEnd(end);\n            }else{\n                end();\n            }\n        });\n\n        newPage.appendTo(pagesObj);\n        if(options.method == 'post') {\n            var pageDoc = $(\".ui-page-iframe\", newPage)[0].contentDocument;\n            submitForm(pageDoc, url, options.params);\n        }\n    };\n\n    // post方式加载页面\n    page.postPage = function (url, options) {\n        options.method = 'post';\n        page.openPage(url, options);\n    };\n\n    // 当前页面后退,针对顶层父窗口\n    page.backPage = function (options) {\n        var backIndex = options.backIndex;\n        var page = null;\n        var nowPage = $(\".ui-page.ui-show\", pagesObj);\n\n        if(options.pageName){\n            page =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj);\n        }else if(backIndex == 0){\n            page = $(\".ui-page:first\", pagesObj);\n        }else { // 越界的情况\n            var prevPage = nowPage.prevAll(\".ui-page\");\n            if(backIndex < 0){\n                page= $(prevPage[-backIndex - 1]);\n            }else{\n                page= $(prevPage[prevPage.size() - backIndex]);\n            }\n        }\n\n        var animatePage = nowPage;\n        var zeroPage = isZeroPage(page);\n\n        // 主页面模式时\n        if(zeroPage){\n            animatePage = pagesObj;\n        }else{\n            page.addClass(\"ui-show\"); //显示前一个\n        }\n\n        function end (){\n            $(this).removeClass(animateOutClass);\n            page.nextAll(\".ui-page\").remove();\n\n            var iframe = $(\".ui-page-iframe\", page);\n            var nowDoc;\n\n            if(iframe.size() == 0){ // 找不到子窗口就当是返回了主页面,在当前窗口触发\n                nowDoc = window.document;\n            }else{\n                nowDoc = iframe[0].contentDocument;\n            }\n\n            if(zeroPage){\n                pagesObj.addClass(zeroPagesClass);\n            }\n\n            var evt = nowDoc.createEvent('Event');\n            evt.initEvent(eventName, true, true);\n            if(options.data){\n                evt.data = options.data;\n            }\n            nowDoc.body.dispatchEvent(evt);\n            if(options.callBack){\n                options.callBack();\n            }\n        }\n\n        if(options.animate){\n            animatePage.addClass(animateOutClass).animationEnd(end);\n        }else{\n            end();\n        }\n    };\n\n    // 往前关闭窗口\n    page.closePage = function (options) {\n        var closeIndex = options.closeIndex;\n        var prevPage = $(\".ui-page.ui-show\", pagesObj).prevAll(\".ui-page\");\n\n        if(options.pageName){\n            closeIndex =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj).index();\n        }else if(closeIndex < 0){\n            closeIndex = -closeIndex -1;\n        }else{\n            closeIndex = prevPage.size() - closeIndex;\n        }\n\n        $(prevPage[closeIndex]).remove();\n        if(options.callBack){\n            options.callBack();\n        }\n    };\n\n    // 调用父窗口打开页面\n    page.open = function (url, options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.openPage(url, options);\n    };\n\n    // post方法\n    page.post = function (url, options) {\n        options = $.extend({}, this.options, options);\n        options.method = 'post';\n        options.target.ipu.page.openPage(url, options);\n    };\n\n    // 调用父窗口,回退\n    page.back = function (options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.backPage(options);\n    };\n\n    // 返回首页\n    page.backHome = function (options) {\n        options = options || {};\n        options.backIndex = 0;\n        page.back(options);\n    };\n\n    // 子窗口,待确认\n    page.close = function (options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.closePage(options);\n    };\n\n    // 添加回调事件\n    page.onBack = function (back) {\n        $(\"body\").on(eventName, function (e) {\n            var data = e.originalEvent.data;\n            back(data);\n        });\n    };\n\n    // 提供一个关闭一群窗口的方法\n    ipu.page = page;\n})(ipu || window, jQuery);\n\n// picker\r\n(function (ipu, $, Hammer) {\r\n    var showItemSize = 9;   // 显示的子项数量,\r\n    var r = 90;             // 计算旋转的圆半径,结果应该缩小,是为了r不要距离容器太近\r\n    var itemAngle = 180 / showItemSize;   // 每项对应的角度是 180/9 = 20\r\n    var maxExceed = itemAngle;         // 滚动时允许超出边界的最大角度\r\n    // itemHeight = 40px;       // 需要给出r=89是怎么计算出来的,是根据 40/2/Math.tan(40/2/180*Math.PI)=113,直接太大不好看\r\n\r\n    function Picker(slt, options) {\r\n        this.el = $(slt)[0];\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this._init();\r\n    }\r\n\r\n    // 默认参数\r\n    Picker.prototype.defaultOptions = {\r\n        onChange: function () {       // 子项选中事件\r\n        },\r\n        listen: true,                  // 默认已开记监听变化\r\n        data: []\r\n    };\r\n\r\n    Picker.prototype._init = function () {\r\n        var self = this;\r\n        this.wrap = $(\">ul\", this.el);\r\n        this.index = null;\r\n        this.listen = !!this.options.listen;\r\n\r\n        this.beginAngle = 0;\r\n        this.beginExceed = this.beginAngle - maxExceed;       // 最小角度值\r\n        this.stopInertiaMove = false;\r\n        this.lastAngle = null; // 保存滑动前的角度\r\n        this.empty = this.options.data.length == 0;\r\n\r\n        // 如果是ios,则ul的旋转中心点,有变化\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+r+\"px\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n        this.hammer = new Hammer.Manager(this.el);\r\n        this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_VERTICAL, threshold: 5}));\r\n        this.hammer.add(new Hammer.Press({threshold: 4}));  //\r\n        this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this._onPan, this));\r\n\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\r\n           // console.log('press');\r\n            if(this.empty){\r\n                return ;\r\n            }\r\n\r\n            self.stopInertiaMove = true;\r\n            if (e.type == 'pressup') {\r\n                self.endScroll();\r\n            }\r\n        });\r\n\r\n        this.setItems(this.options.data);\r\n    };\r\n\r\n    Picker.prototype.setItems = function (data, textName) {\r\n        this.wrap.empty(); // 清空历史数据\r\n        this.data = data = data || [];\r\n        this.empty = data.length == 0; // 数据是否为空\r\n\r\n        this.newData = true; // 表示设置了新数据,触发change回调,但第一次设置时,不需要触发\r\n        var self = this;\r\n        var lis = \"\";\r\n        textName = textName || 'text';\r\n\r\n        for (var i = 0, j = data.length; i < j; i++) {\r\n            lis = lis + \"<li>\" + data[i][textName] + \"</li>\";\r\n        }\r\n\r\n        $(lis).appendTo(this.wrap);\r\n\r\n        this.items = $(\">li\", this.wrap);\r\n        this.itemsSize = this.items.size();\r\n\r\n        this.endAngle = (this.empty ? 0 : this.itemsSize - 1) * itemAngle;\r\n        this.endExceed = this.endAngle + maxExceed;  // 最大旋转角度值\r\n\r\n        // 初始化各子项角度\r\n        this.items.each(function (i) {\r\n            $(this).css({\r\n                \"transform\": \"translateZ(\" + r + \"px) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + r + \"px\"\r\n            });\r\n            $(this).click(function () {\r\n                self.stopInertiaMove = true;\r\n                self.setAngle(i * itemAngle, true);\r\n            })\r\n        });\r\n\r\n        var newAngle ;\r\n        if(this.empty || this.index == null){\r\n            newAngle = 0;\r\n        }else {\r\n            if(this.index > this.itemsSize - 1){\r\n                newAngle = (this.itemsSize - 1) * itemAngle;\r\n            }else{\r\n                newAngle = this.index * itemAngle;\r\n            }\r\n        }\r\n        this.setAngle(newAngle, true);\r\n\r\n        /*if (this.index !== null) { // 当前已经旋转则,保留当前的索引\r\n         if (this.index > this.itemsSize - 1 && !this.empty) {\r\n         this.index = this.itemsSize - 1;\r\n         }\r\n         this.setAngle(this.index * itemAngle, true);\r\n         } else { // 第一次初始数据,不触发change事件\r\n         this.index = 0;     // 被调用后,不能再使用null值了\r\n         this.setAngle(0, false); // 第一次设置初始化时,不触发change事件\r\n         }*/\r\n    };\r\n\r\n    Picker.prototype._onPan = function (ev) {\r\n        if(this.empty){\r\n            return ;\r\n        }\r\n\r\n        //console.log(ev.deltaX + \"==\"+ ev.deltaY);\r\n        if (ev.type == 'panstart') { // 好像一定要移动才有startg事件\r\n            self.stopInertiaMove = true;\r\n            this.lastAngle = this.angle;\r\n            this.wrap.addClass(\"ui-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\r\n           // console.log('panstart');\r\n\r\n        } else if (ev.type == 'panmove') {\r\n            var moveAngle = this.calcAngle(ev.deltaY);\r\n            var newAngle = this.lastAngle - moveAngle;   //最新的角度\r\n            //console.log('=='+newAngle);\r\n            // 一个可以转动的最小值和最大值过滤\r\n            if (newAngle < this.beginExceed) {\r\n                newAngle = this.beginExceed;\r\n            }\r\n            if (newAngle > this.endExceed) {\r\n                newAngle = this.endExceed;\r\n            }\r\n            this.setAngle(newAngle);\r\n\r\n        } else { // end or cancel事件\r\n            // console.log('end or cancel:' + ev.type);\r\n            var v = ev.overallVelocityY;    // 滑动的速度\r\n            var dir = v > 0 ? -1 : 1; //加速度方向\r\n            var deceleration = dir * 0.0006 * -1;\r\n            var duration = Math.abs(v / deceleration); // 速度消减至0所需时间\r\n            var dist = v * duration / 2; //最终移动多少\r\n\r\n            var startAngle = this.angle;\r\n            var distAngle = -this.calcAngle(dist);\r\n           //  console.log(\"dist=\" + dist + \", distAngle\" + distAngle);\r\n\r\n            //----\r\n            var srcDistAngle = distAngle;\r\n            if (startAngle + distAngle < this.beginExceed) {\r\n                distAngle = this.beginExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n            if (startAngle + distAngle > this.endExceed) {\r\n                distAngle = this.endExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n\r\n            if (distAngle == 0) {\r\n                this.endScroll();\r\n                return;\r\n            }\r\n            this.scrollDistAngle(startAngle, distAngle, duration);\r\n        }\r\n    };\r\n\r\n    // 计算移动的角度,转动的角度,就是移动的距离对应相关圆周\r\n    // 2*r*PI = 360,  angle = 360*c/(2*r*PI)\r\n    var ca = 360 / (2 * r * Math.PI);\r\n    Picker.prototype.calcAngle = function (c) {\r\n        return c * ca;\r\n    };\r\n\r\n    // endScroll 是否为结束的滚动结束,滚动结束需要调用结束事件\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(1000px) rotateY(0deg) rotateX(\" + newAngle + \"deg)\");\r\n        this.calcItemVisable(newAngle);\r\n\r\n        if (endScroll) {\r\n            var index = newAngle / itemAngle;\r\n            var oldIndex = this.index;\r\n            this.index = this.empty ? null : index; // 这里可以做一个判断,如果是empty,则index值可以不改变\r\n\r\n            // 这个地方要判断下,数据更新或索引更新都要触发\r\n            if (oldIndex != index || this.newData) {\r\n                this.newData = false;\r\n               // console.log('change');\r\n                if (this.options.onChange && this.listen) {\r\n                    // console.log('changed call');\r\n                    this.options.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n            }\r\n        }\r\n    };\r\n\r\n    // 计算子项的显示情况\r\n    Picker.prototype.calcItemVisable = function (angle) {\r\n        this.items.each(function (index) {\r\n            var difference = Math.abs(index * itemAngle - angle);\r\n\r\n            if (difference < itemAngle / 2) {\r\n                $(this).addClass(\"ui-highlight ui-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ui-highlight ui-visible\");\r\n            } else {\r\n                $(this).addClass(\"ui-visible\").removeClass(\"ui-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ui-noanimate\");\r\n        var endAngle;\r\n\r\n        if (this.angle < this.beginAngle) {\r\n            endAngle = this.beginAngle;\r\n        } else if (this.angle > this.endAngle) {\r\n            endAngle = this.endAngle;\r\n        } else {\r\n            var index = parseInt((this.angle / itemAngle).toFixed(0));\r\n            endAngle = (itemAngle * index);\r\n        }\r\n\r\n        this.setAngle(endAngle, true);\r\n    };\r\n\r\n    // 进行惯性滚动\r\n    Picker.prototype.scrollDistAngle = function (startAngle, distAngle, duration) {\r\n        var self = this;\r\n        var nowTime = new Date().getTime();\r\n        this.stopInertiaMove = false;\r\n        duration = 1 * duration; // 滚动时长控制修改\r\n\r\n        // hammer调用的惯性函数\r\n        (function (nowTime, startAngle, distAngle, duration) {\r\n            var frameInterval = 13;\r\n            var stepCount = duration / frameInterval;\r\n            var stepIndex = 0;\r\n\r\n            (function inertiaMove() {\r\n                if (self.stopInertiaMove) return;\r\n                var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);\r\n                self.setAngle(newAngle);\r\n                stepIndex++;\r\n\r\n                if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {\r\n                    self.endScroll();\r\n                    return;\r\n                }\r\n\r\n                setTimeout(inertiaMove, frameInterval);\r\n            })();\r\n\r\n        })(nowTime, startAngle, distAngle, duration);\r\n    };\r\n\r\n    Picker.prototype.setListen = function (bool) {\r\n        this.listen = !!bool;\r\n    };\r\n\r\n    Picker.prototype.quartEaseOut = function (t, b, c, d) {\r\n        return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n    };\r\n\r\n    Picker.prototype.setSelectedValue = function (value) {\r\n        var self = this;\r\n        for (var index in self.data) {\r\n            var item = self.data[index];\r\n            if (item.value == value) {\r\n                self.setAngle(index* itemAngle, true);\r\n                return;\r\n            }\r\n        }\r\n    };\r\n\r\n    // 获取当前选中的值\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    Picker.prototype.getSelectedIndex = function () {\r\n        return this.index;\r\n    };\r\n\r\n    ipu.Picker = Picker;\r\n\r\n})(ipu || window, jQuery, Hammer);\r\n\n// popPicker\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n\r\n    function PopPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                        </div>\\\r\n                    </div>',\r\n        pickerTemplate: '<div class=\"ui-picker\">\\\r\n                            <div class=\"ui-picker-selectbox\"></div>\\\r\n                            <ul></ul>\\\r\n                          </div>',\r\n        data: [],    // 数据\r\n        layer: 1,   // 数据层级\r\n        btns: ['取消', '确认'],\r\n        callBack: function () { // 选择数据时的回调函数\r\n\r\n        }\r\n    };\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.options.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ui-poppicker-body\", this.holder);\r\n\r\n        var layer = this.options.layer;\r\n        var width = (100 / layer) + \"%\";\r\n        this.pickers = new Array(layer);\r\n        var self = this;\r\n        var pickerHtml;\r\n        this.mask = this.createMask();\r\n\r\n        // 先初始化最底层picerk,再上面来\r\n        for (var i = layer -1; i >=0; i--) {\r\n            pickerHtml = $(this.options.pickerTemplate).prependTo(bodyHtml).css({width: width});\r\n\r\n            this.pickers[i] = new  Picker(pickerHtml, {\r\n                onChange: (function (i) {\r\n                    return function (item, index) { // 更新底部的值\r\n                        if (i != layer - 1) {\r\n                            self.pickers[i + 1].setItems(item.data);\r\n                        }\r\n                    };\r\n                })(i)\r\n            });\r\n        }\r\n\r\n        $(\".ui-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.options.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.options.btns[1]);\r\n\r\n        $(\".ui-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.options.btns[0]);\r\n    };\r\n\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 获取相关值\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.options.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.options.layer; i++) {\r\n                rs.push(this.pickers[i].getSelectedItem());\r\n            }\r\n            return rs;\r\n        }\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    PopPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.hide();\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.popPicker = function (options) {\r\n        return new PopPicker(options);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n\r\n    /**\r\n     *进度条\r\n     */\r\n    function progressBar(id, options) {\r\n        this.id = id;\r\n        this.level = options.level;\r\n        this.progress = options.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (options.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (options.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    progressBar.prototype.setProgress = function (pro) {\r\n        if (pro < 0 || pro > 100) return;\r\n\r\n        $(this.progressBar.find(\".ipu-progressbar\")).css(\"transform\", \"translate3d(\" + (-(100 - pro)) + \"%, 0px, 0px)\");\r\n        this.progress = pro;\r\n    };\r\n\r\n    progressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    progressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-hightlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-highlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    ipu.progressBar = function (slt, options) {\r\n        return new progressBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $, iScroll) {\r\n\r\n    // 扩展参数,iscroll组件的参数选项\r\n    // 扩展参数,用户直接在页面上自定好,顶端和底部加载html\r\n    // 设置上下条件长度,或计算函数\r\n    // 处理resize的问题,用户主动调用refresh??\r\n    // 底部启用或停用时,应该刷新组件iscroll高度\r\n    // 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n    Refresh.prototype.defaultOptions = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ui-refresh-bottom\"><span class=\"ui-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ui-refresh-top\"><span class=\"ui-refresh-loading\"></span><div class=\"ui-refresh-arrow\"></div></div>',\r\n                // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n                // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ui-refresh-top-loading\r\n                // 拖动达到加载距离,则增加class:ui-refresh-toload\r\n                // 加载中,则增加class:ui-refresh-top-loading,移除class:ui-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOptions:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    function Refresh(slt, options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOptions = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ui-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ui-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ui-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ui-refresh-toload');\r\n                    }\r\n                }\r\n\r\n                me._checkBottomLoading(); // 底部加载条件和顶部条件不一样,只要滚动离底部一定高度就开始加载\r\n                me.goTop = this.y > me.topPullOffset; // 记录是否位于顶部位置,以便刷新后可以回到此位置\r\n            },\r\n            onBeforeScrollEnd: function () {    // 一定是用户拖动触发,在滚动结束前应该触发\r\n                me._checkTopLoading();\r\n                me._checkBottomLoading();\r\n            },\r\n            onScrollEnd: function () { // 这个事件可能由非用户拖动时触发,可能是拖动惯性导致,所有顶部不应该处理,但顶部不管是否惯性,位置条件满足即触发\r\n                if (me.topLoading && this.y < this.minScrollY && me.goTop) {\r\n                    me.iScroll.scrollTo(0, this.minScrollY, 0);\r\n                }\r\n                me._checkBottomLoading(); // 在beforend执行还不够,还在要end执行\r\n            },\r\n            onRefresh: function () { // 刷新时,若顶部加载还在进行,且当前显示的顶部加载,则继续显示,否则刷新后会消失顶部加载,这里代码没有考虑重用了,应该可以做一步提取\r\n                if (me.topLoading) { // 如果顶部在加载,则刷新的时候,设置最小顶部距离,显示顶部加载状态\r\n                    this.minScrollY = this.minScrollY + me.topPullOffset;\r\n                }\r\n            }\r\n        };\r\n\r\n        this.iScrollOptions = $.extend({}, this.options.iScrollOptions, this.iScrollOptions);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOptions);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ui-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.options.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.options.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.options.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        this.topLoading = false;        // 顶部正在载加载\r\n        this.bottomLoading = false;     // 底部正在加载\r\n        this.bottomEnable = this.options.initEnableBottom && !!this.options.bottomLoadFun;\r\n        this.topEnable = this.options.initEnableTop && !!this.options.topLoadFun;\r\n        this.goTop = false;         // 用来处理,因为iScroll使用momentum(惯性), 导致有时顶部显示不正确问题,true表示顶部显示加载条\r\n\r\n        this.enableBottom(this.bottomEnable);\r\n        this.enableTop(this.topEnable);\r\n    };\r\n\r\n    // 检查是否需要底部加载\r\n    Refresh.prototype._checkBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            if (this.iScroll.y < this.iScroll.maxScrollY + this.bottomPullOffset) {\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    Refresh.prototype._checkTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            if (this.topEl.hasClass('ui-refresh-toload')) {\r\n                this._startTopLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 检查内容是否超出容器高度,未超出时,自动调用底部加载\r\n    Refresh.prototype._checkContentLoading = function () {\r\n        if(this.iScroll.maxScrollY >= -this.bottomPullOffset){ // 此处要计算底端的高度\r\n            this._startBottomLoading();\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.options.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ui-refresh-toload').addClass('ui-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.options.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 结束底部加载\r\n    Refresh.prototype.endBottomLoading = function () {\r\n        this.bottomLoading = false;\r\n        this.refresh();\r\n    };\r\n\r\n    // 结束顶部加载\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ui-refresh-top-loading');\r\n        this.topLoading = false;\r\n        // this.iScroll.scrollTo(0, 0); // 刷新加载则应该回到顶部,待测试确认\r\n        this.refresh();\r\n    };\r\n\r\n    // 设置顶部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableTop = function (enable) {\r\n        this.topEnable = enable;\r\n        if (enable) {\r\n            this.topEl.show();\r\n        } else {\r\n            this.topEl.hide();\r\n        }\r\n    };\r\n\r\n    // 设置底部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableBottom = function (enable) {\r\n        this.bottomEnable = enable;\r\n        if (enable) {\r\n            this.bottomEl.show();\r\n        } else {\r\n            this.bottomEl.hide();\r\n        }\r\n    };\r\n\r\n    // 只有在内容发生变更时,但是又没有触发调用end相关方法时,使用此方法更新高度信息\r\n    // 或者组件在一开始未显示??\r\n    // 刷新会移除拖动中状态\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n    ipu.refresh = function (slt, optoins) {\r\n        return new Refresh(slt, optoins);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// Tab\r\n(function (ipu, $) {\r\n    function Tab(holder, options) {\r\n        this.el = $(holder).get(0);\r\n        this.titleItems = $(\".ui-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ui-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ui-tab-fixed\"); // 是否为固定高度的\r\n\r\n        var that = this;\r\n        this.titleItems.each(function (index) {\r\n            $(this).click(function () {\r\n                that.show(index);\r\n            });\r\n        });\r\n\r\n        var index = this.titleItems.filter(\".ui-current\").index();\r\n        if (index == -1) {\r\n            index = 0;\r\n        }\r\n\r\n        this.show(index);\r\n    }\r\n\r\n    Tab.prototype.defaultOptions = {\r\n        callBack: null  // 回调函数,tab切换时回调函数\r\n    };\r\n\r\n    Tab.prototype.show = function (index) {\r\n        if (this.fixed) {\r\n            var move = -index * 100 + \"%\";\r\n            this.bodyWrapper.css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        }\r\n        this.contentItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this.titleItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this._end(index);\r\n    };\r\n\r\n    Tab.prototype._end = function (index) {\r\n        this.lastIndex = this.currentIndex;\r\n        this.currentIndex = index;\r\n\r\n        if (this.options.callBack) {\r\n            this.options.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, options) {\r\n        return new Tab(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\r\n\n// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipu, $) {\r\n    var active = {};\r\n\r\n    var options = defaultOptions = {\r\n        distanceAllow: 10,   // 最大移动距离,超过移除效果\r\n        displayDelay: 100,  // 延时显示时间,以防止是滚动操作\r\n        hideDelay: 120,     // 隐藏延时时间\r\n        eventName: 'click', // 事件处理是click\r\n        activeClass: 'ui-active',   // 激活时的class\r\n        getHandleNode: function (node) {  // 找到最先一级处理此click事件的元素\r\n            if (!node || !node.nodeType) return;\r\n\r\n            var distNode = null;\r\n            var nodeArray = [];\r\n\r\n            // 还有其它情形考虑,如a标签的跳转,或在原生元素添加事件属性的\r\n            function findHander(inNode) {\r\n                // 此方法适用于jquery, 1.12.4, 2.2.4, 3.2.1版本,_data方法以后可能会被移除。$.data是一些老版本写法\r\n                var eventHandlers = ($._data || $.data)(inNode, 'events');\r\n\r\n                if (eventHandlers) {\r\n                    eventHandlers = eventHandlers[options.eventName];\r\n                }\r\n\r\n                if (!eventHandlers) {\r\n                    return;\r\n                }\r\n\r\n                var thisNode = false;\r\n                $.each(eventHandlers, function (index, handler) {\r\n                    if (handler.selector) {\r\n                        var objs = $(handler.selector, inNode);\r\n                        $.each(nodeArray, function (tIndex, tNode) {\r\n                            if (objs.is(tNode)) {\r\n                                distNode = tNode;\r\n                                return false;\r\n                            }\r\n                        });\r\n\r\n                        if (distNode) {\r\n                            return false; //\r\n                        }\r\n                    } else {\r\n                        thisNode = true;  // 保存distNode,有可能有子节点满足条件,所以只保存此值为默认值\r\n                    }\r\n                });\r\n\r\n                if (thisNode && distNode == null) { // 如果没在子节点找到click事件,而当前节点又有click事件,就使用当前节点\r\n                    distNode = inNode;\r\n                }\r\n\r\n                return distNode;\r\n            }\r\n\r\n            while (!(\"tagName\" in node) || !findHander(node)) {\r\n                if (!node.parentNode || node.parentNode.nodeType != 1) {\r\n                    break;\r\n                }\r\n                nodeArray.push(node);\r\n                node = node.parentNode;\r\n            }\r\n\r\n            return distNode;\r\n        }\r\n    };\r\n\r\n    function getOriginalEvent(e) {\r\n        return e.originalEvent || e;\r\n    }\r\n\r\n    function getXY(e) {\r\n        var x = e.touches ? e.touches[0].pageX : e.clientX;\r\n        var y = e.touches ? e.touches[0].pageY : e.clientY;\r\n        return [x, y];\r\n    }\r\n\r\n    //根据不同浏览器获取不同原生事件event\r\n    var hasTouch = \"ontouchstart\" in window,\r\n        START_EVENT = hasTouch ? 'touchstart' : 'mousedown',\r\n        MOVE_EVENT = hasTouch ? 'touchmove' : 'mousemove',\r\n        END_EVENT = hasTouch ? 'touchend' : 'mouseup',\r\n        CANCEL_EVENT = hasTouch ? 'touchcancel' : '';\r\n\r\n    $(function () {\r\n        var startXY, tapEl, timeOutID;\r\n        var dom = document.body;\r\n\r\n        // force为false的时候,不用管timeOutID,在老的timeOutID未移除的情况下,有可能又产生了新的,\r\n        // 导致else代码未被执行,导致老的点击元素class未被移除\r\n        function removeClass(dom, force) {\r\n            if (force && timeOutID) {\r\n                window.clearTimeout(timeOutID);\r\n            } else {\r\n                $(dom).removeClass(options.activeClass);\r\n            }\r\n        }\r\n\r\n        function removeActive(force) {\r\n            if (force) {\r\n                removeClass(tapEl, force);\r\n            } else {\r\n                window.setTimeout(removeClass, options.hideDelay, tapEl, force);\r\n            }\r\n            startXY = null;\r\n            tapEl = null;\r\n        }\r\n\r\n        $(dom).bind(START_EVENT, function (e) {\r\n            if (tapEl) {    // 多点接触时处理\r\n                removeActive(true);\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n            startXY = getXY(e);\r\n            tapEl = options.getHandleNode(e.target);\r\n\r\n            if (tapEl) {\r\n                timeOutID = window.setTimeout(function (dom) {\r\n                    timeOutID = null;\r\n                    $(dom).addClass(options.activeClass);\r\n                }, options.displayDelay, tapEl);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(MOVE_EVENT, function (e) {\r\n            if (!tapEl) {\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n\r\n            var xy = getXY(e);\r\n            if (startXY && (Math.abs(xy[0] - startXY[0]) > options.distanceAllow || Math.abs(xy[1] - startXY[1]) > options.distanceAllow)) {\r\n                removeActive(true);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(END_EVENT, function (e) {\r\n            if (tapEl) {\r\n                removeActive();\r\n            }\r\n        });\r\n\r\n        // 手机来电等非用户取消操作时触发事件\r\n        if (CANCEL_EVENT) {\r\n            $(dom).bind(CANCEL_EVENT, function (e) {\r\n                if (tapEl) {\r\n                    removeActive();\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    // 更新默认值\r\n    active.setOptions = function (opts) {\r\n        options = this.options = $.extend({}, defaultOptions, opts);\r\n    };\r\n    ipu.active = active;\r\n})(ipu || window, jQuery);\r\n\r\n\n/*===========================\r\nDevice/OS Detection\r\n===========================*/\r\n// from sui,但IPU框架的ua不是这样的\r\n;(function (ipu, $) {\r\n    \"use strict\";\r\n    var device = {};  // Classes\r\n    var classNames = [];\r\n    var ua = navigator.userAgent\r\n    \r\n    // 这中针对ipu框架的情况,待测试\r\n    if(ua.match(/ipumobile/i)){\r\n        device.ios =  !!ua.match(/ios/i);\r\n        device.android = !!ua.match(/android/i);\r\n    }else{\r\n        var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\r\n        var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\r\n        var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\r\n        var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\r\n\r\n        device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\r\n\r\n        // Android\r\n        if (android) {\r\n            device.os = 'android';\r\n            device.osVersion = android[2];\r\n            device.android = true;\r\n            device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\r\n        }\r\n        if (ipad || iphone || ipod) {\r\n            device.os = 'ios';\r\n            device.ios = true;\r\n        }\r\n        // iOS\r\n        if (iphone && !ipod) {\r\n            device.osVersion = iphone[2].replace(/_/g, '.');\r\n            device.iphone = true;\r\n        }\r\n        if (ipad) {\r\n            device.osVersion = ipad[2].replace(/_/g, '.');\r\n            device.ipad = true;\r\n        }\r\n        if (ipod) {\r\n            device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\r\n            device.iphone = true;\r\n        }\r\n        // iOS 8+ changed UA\r\n        if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\r\n            if (device.osVersion.split('.')[0] === '10') {\r\n                device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\r\n            }\r\n        }\r\n\r\n        // Webview\r\n        device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\r\n\r\n        // Minimal UI\r\n        if (device.os && device.os === 'ios') {\r\n            var osVersionArr = device.osVersion.split('.');\r\n            device.minimalUi = !device.webView &&\r\n                (ipod || iphone) &&\r\n                (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\r\n                $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\r\n        }\r\n\r\n        // Check for status bar and fullscreen app mode\r\n        var windowWidth = $(window).width();\r\n        var windowHeight = $(window).height();\r\n        device.statusBar = false;\r\n        if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\r\n            device.statusBar = true;\r\n        }\r\n        else {\r\n            device.statusBar = false;\r\n        }\r\n\r\n\r\n        // Pixel Ratio\r\n        device.pixelRatio = window.devicePixelRatio || 1;\r\n        classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\r\n        if (device.pixelRatio >= 2) {\r\n            classNames.push('retina');\r\n        }\r\n\r\n        // OS classes\r\n        if (device.os) {\r\n            classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\r\n            if (device.os === 'ios') {\r\n                var major = parseInt(device.osVersion.split('.')[0], 10);\r\n                for (var i = major - 1; i >= 6; i--) {\r\n                    classNames.push('ios-gt-' + i);\r\n                }\r\n            }\r\n\r\n        }\r\n        // Status bar classes\r\n        if (device.statusBar) {\r\n            classNames.push('with-statusbar-overlay');\r\n        }\r\n        else {\r\n            $('html').removeClass('with-statusbar-overlay');\r\n        }\r\n\r\n\r\n        // keng..\r\n        device.isWeixin = /MicroMessenger/i.test(ua);\r\n    }\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0){\r\n        $('html').addClass(classNames.join(' '));\r\n    }\r\n\r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n\n\r\n        // 初始化代码\r\n        jQuery(function () {\r\n            FastClick.attach(document.body);\r\n        });\r\n\r\n        return ipu;\r\n    }\r\n\r\n    // todo:可以添加一个和其它库的适配处理,\r\n    // 这里假设第三方库,jquery,iScroll,Hammer的史称已经固定\r\n    if ( typeof define === \"function\" && define.amd ) {\r\n        define(['jquery', 'iScroll', 'Hammer', 'FastClick'], function (jQuery, iScroll, Hammer, FastClick) {\r\n            return window.ipu = setup(jQuery, iScroll, Hammer, FastClick);\r\n        });\r\n    } else {\r\n        window.ipu = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n    }\r\n})();\r\n\r\n//# sourceMappingURL=ipu.js.map\r\n"]}
1
{"version":3,"sources":["ipu.js"],"names":["setup","jQuery","iScroll","Hammer","FastClick","ipu","$","iscroll","Carousel","slt","options","this","extend","defaultOpt","el","eq","autoPlay","hasIndicator","indicator","callBack","currentIndex","_init","play","prototype","index","duration","indicatorPosition","wrapper","carouselItems","size","that","activeIndex","filter","_addIndicator","window","resize","refresh","scrollOpt","snap","momentum","scrollX","scrollY","hScrollbar","onScrollStart","_pause","onTouchEnd","onScrollEnd","_end","get","show","stop","timeoutId","clearTimeout","prev","next","time","scrollToPage","_play","setTimeout","currPageX","indicatorIndexs","addClass","siblings","removeClass","html","i","appendTo","destroy","carousel","DtPicker","defaultOptions","Picker","defaultPickerDate","Date","template","buttons","labels","type","customData","hasClear","self","mask","createMask","_picker","holder","ui","picker","ok","cancel","clear","listen","h","onChange","item","beginMonth","endMonth","_createMinutes","d","_createHours","m","_createDay","y","_createMonth","_create","_setLabels","_setButtons","attr","_setSelectedValue","value","getSelected","selected","getSelectedItem","toString","text","getFullYear","getMonth","getDate","getHours","getMinutes","parsedValue","_parseSetValue","setListen","setSelectedValue","isLeapYear","year","_inArray","array","_item","getDayNum","month","_fill","num","length","_isBeginYear","beginYear","parseInt","getSelectedValue","_isBeginMonth","_isBeginDay","beginDay","_isBeginHours","beginHours","_isEndYear","endYear","_isEndMonth","_isEndDay","endDay","_isEndHours","endHours","_createYear","current","yArray","yBegin","yEnd","push","setItems","mArray","maxMonth","val","dArray","maxDay","hArray","maxHours","iArray","beginMinutes","maxMinutes","endMinutes","each","label","innerText","hide","click","clickCall","now","rs","valu","parts","replace","split","j","beginDate","endDate","setBeginDate","date","setEndDate","dispose","parentNode","removeChild","name","disposed","sltDate","call","close","callback","element","document","createElement","classList","add","addEventListener","_show","setAttribute","body","appendChild","_remove","dtPicker","HammerCarousel","navSlt","clickBack","showSize","carouselItemSizes","moveLen","lastItem","slice","clone","sizeCount","hammer","Manager","Pan","direction","DIRECTION_HORIZONTAL","threshold","on","bindFn","onPan","width","wrapperSize","outerWidth","itemSize","mostSize","dom","position","left","move","displayMoveLen","css","animate","toggleClass","ev","delta","deltaX","intValue","Math","abs","decimal","hammerCarousel","__dealCssEvent","eventNameArr","fireCallBack","e","target","events","off","handleClicks","clicked","hasClass","defaults","modalCloseByOutside","closeModal","actionsCloseByOutside","popupCloseByOutside","fn","transitionEnd","_modalTemplateTempDiv","modalStack","modalButtonOk","modalButtonCancel","modalPreloaderTitle","modalContainer","modalStackClearQueue","shift","modal","params","modalHTML","buttonsHTML","bold","extraClass","titleHTML","title","textHTML","afterTextHTML","afterText","noButtons","verticalButtons","innerHTML","children","append","find","onClick","openModal","alert","callbackOk","arguments","undefined","modalTitle","confirm","callbackCancel","omodalButtonCancelnClick","prompt","minLoad","loadOverTime","loadEnd","loadTimeOut","showPreloader","minTime","hidePreloader","preloaderModal","force","showIndicator","hideIndicator","remove","actions","groupSelector","buttonSelector","isArray","button","buttonClass","color","bg","disabled","groups","groupIndex","clickTarget","buttonIndex","buttonParams","is","toast","msg","extraclass","$toast","cb","isModal","isNotToast","isPopup","isLoginScreen","isPickerModal","isToast","marginTop","round","outerHeight","marginLeft","overlay","clientLeft","trigger","removeOnClose","NavBar","content","contentSlt","nav","contents","navs","me","lastIndex","navBar","submitForm","doc","url","form","action","method","style","display","x","ele","submit","checkPages","hasPages","pagesObj","zeroPageClass","pageIdPrefix","isZeroPage","page","animationEnd","maps","pageNo","animateInClass","animateOutClass","eventName","zeroPagesClass","parent","backIndex","closeIndex","showLoading","loadingMessage","minMessageTime","data","pageName","openPage","end","animatePage","newPage","nowPageNo","zeroPage","one","pageDoc","contentDocument","postPage","backPage","nextAll","nowDoc","iframe","evt","createEvent","initEvent","dispatchEvent","nowPage","prevPage","prevAll","closePage","open","post","back","backHome","onBack","originalEvent","showItemSize","r","itemAngle","maxExceed","wrap","beginAngle","beginExceed","stopInertiaMove","lastAngle","empty","device","ios","DIRECTION_VERTICAL","Press","_onPan","endScroll","textName","newData","lis","items","itemsSize","endAngle","endExceed","transform","transform-origin","setAngle","newAngle","angle","moveAngle","calcAngle","deltaY","v","overallVelocityY","dir","deceleration","dist","startAngle","distAngle","srcDistAngle","scrollDistAngle","ca","PI","c","calcItemVisable","oldIndex","difference","toFixed","nowTime","getTime","frameInterval","stepCount","stepIndex","inertiaMove","quartEaseOut","bool","t","b","getSelectedText","getSelectedIndex","PopPicker","pickerTemplate","layer","btns","bodyHtml","pickers","Array","pickerHtml","prependTo","getSelectItems","setData","popPicker","progressBar","id","level","progress","setProgress","setLevel","pro","getProgress","Refresh","_initBottomAndTop","iScrollOptions","onScrollMove","topEnable","topLoading","topPullOffset","topEl","_checkBottomLoading","goTop","onBeforeScrollEnd","_checkTopLoading","minScrollY","scrollTo","onRefresh","_checkContentLoading","bottomLoadFun","topLoadFun","initEnableTop","initEnableBottom","bottomLoadHtml","topLoadHtml","bottomAddLen","scrollEl","bottomEl","bottomPullOffset","bottomLoading","bottomEnable","enableBottom","enableTop","maxScrollY","_startBottomLoading","_startTopLoading","endBottomLoading","endTopLoading","enable","optoins","Tab","titleItems","bodyWrapper","contentItems","fixed","tab","getOriginalEvent","getXY","touches","pageX","clientX","pageY","clientY","active","distanceAllow","displayDelay","hideDelay","activeClass","getHandleNode","node","findHander","inNode","eventHandlers","_data","thisNode","handler","selector","objs","nodeArray","tIndex","tNode","distNode","nodeType","hasTouch","START_EVENT","MOVE_EVENT","END_EVENT","CANCEL_EVENT","timeOutID","removeActive","tapEl","startXY","bind","xy","setOptions","opts","classNames","ua","navigator","userAgent","match","android","ipad","ipod","iphone","androidChrome","os","osVersion","toLowerCase","indexOf","webView","osVersionArr","minimalUi","windowWidth","windowHeight","height","statusBar","screen","pixelRatio","devicePixelRatio","floor","major","isWeixin","test","join","attach","define","amd"],"mappings":"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","file":"ipu.min.js","sourcesContent":["(function () {\r\n    function setup(jQuery, iScroll, Hammer, FastClick) {\r\n        var ipu = {};\r\n\n// Carousel\r\n(function (ipu, $, iscroll) {\r\n// carouselSlt应该是唯一的,否则怎么支撑多个回调,如果用户不需要多个回调,也不主动调用,则可以,先不管吧???\r\n    function Carousel(slt, options) {\r\n        this.options = options = $.extend({}, this.defaultOpt, options);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = options.autoPlay;\r\n         this.hasIndicator = options.indicator;\r\n        this.callBack = options.callBack;\r\n        this.currentIndex = null;\r\n\r\n        this._init();\r\n        this.play();\r\n    }\r\n\r\n    Carousel.prototype = {\r\n        defaultOpt: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            that = this;\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.hasIndicator) {\r\n                this._addIndicator();\r\n            }\r\n            $(window).resize(function () {\r\n                that.refresh();\r\n            });\r\n            var scrollOpt = {\r\n                snap: \"li\",          // carousel效果\r\n                momentum: false,     // 移除惯性处理\r\n                scrollX: true,       // X轴移动\r\n                scrollY:false,\r\n                hScrollbar: false,   // 没有纵向滚动条\r\n                onScrollStart: function () {\r\n                    that._pause();\r\n                },\r\n                onTouchEnd: function () {\r\n                    // 后面优化\r\n                    /*\r\n                     if (that.iscroll.currPageX == that.size - 1) {\r\n                     that.show(that.size - 2);\r\n                     }\r\n                     */\r\n                },\r\n                onScrollEnd: function () {\r\n                    that._end();\r\n                }\r\n            };\r\n            this.iscroll = new iscroll(this.el.get(0), scrollOpt);\r\n            this.show(this.options.index, 0);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.autoPlay=false;\r\n        },\r\n        _pause: function () {\r\n            if (this.autoPlay && this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            this.show(index);\r\n        },\r\n        next: function () {\r\n            var index = this.currentIndex == this.size - 1 ? 0 : this.currentIndex + 1;\r\n            this.show(index);\r\n        },\r\n        show: function (index, time) {\r\n            this._pause();\r\n            this.iscroll.scrollToPage(index, 0, time);\r\n        },\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        refresh: function () {\r\n            var that = this;\r\n            that.show(this.currentIndex);\r\n        },\r\n        _play: function () {\r\n            if (this.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    this.timeoutId = null;\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {\r\n            var currentIndex = this.iscroll.currPageX;\r\n            if (currentIndex != this.currentIndex) {\r\n                if (this.callBack) {\r\n                    this.callBack(currentIndex, this.currentIndex);\r\n                }\r\n                this.currentIndex = currentIndex;\r\n\r\n                if (this.hasIndicator) {\r\n                    this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this._play();\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        destroy: function () {\r\n            // 自己怎么销毁,相关事件移除??\r\n            this.iscroll.destroy();\r\n        }\r\n    };\r\n\r\n    ipu.carousel =  function (slt, options) {\r\n        return new Carousel(slt, options);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来运算\r\n\r\n\r\n    // show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n    // 日期范围的选择处理\r\n    function DtPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    DtPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker ui-dtpicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-clear\">清除</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-title\">\\\r\n                            <label class=\"ui-dtpicker-y\"></label>\\\r\n                            <label class=\"ui-dtpicker-m\"></label>\\\r\n                            <label class=\"ui-dtpicker-d\"></label>\\\r\n                            <label class=\"ui-dtpicker-h\"></label>\\\r\n                            <label class=\"ui-dtpicker-mi\"></label>\\\r\n                        </div>\\\r\n                        <div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                            <div class=\"ui-picker\" data-id=\"picker-y\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-m\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-d\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-h\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-mi\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                        </div>\\\r\n                    </div>',\r\n        buttons: ['取消', '确认', '清除'],\r\n        labels: ['年', '月', '日', '时', '分'],\r\n        type: 'datetime',       // date, time, datetime, hour, month\r\n        customData: {},  // 自定义数据\r\n        hasClear: false,    // 是否显示清除按钮\r\n        callBack: function () { // 选择数据时的回调函数\r\n        }\r\n        // beginDate: Date类型,或毫秒值\r\n        // endDate: 同上\r\n    };\r\n\r\n    DtPicker.prototype._init = function () {\r\n        var self = this;\r\n        this.mask = this.createMask();\r\n\r\n        var _picker = this.holder = $(this.options.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ui-poppicker-btn-ok', _picker),\r\n            cancel: $('.ui-poppicker-btn-cancel', _picker),\r\n            clear: $('.ui-poppicker-btn-clear', _picker),\r\n            buttons: $('.ui-poppicker-header .ui-btn', _picker),\r\n            labels: $('.ui-poppicker-title label', _picker)\r\n        };\r\n\r\n\r\n        ui.i = new Picker($('[data-id=\"picker-mi\"]', _picker), {listen: false}); // 分钟变更无需要处理\r\n\r\n        ui.h = new Picker($('[data-id=\"picker-h\"]', _picker), {         // 小时变更,有最小值或最大值,需要变更分钟\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createMinutes();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.d = new Picker($('[data-id=\"picker-d\"]', _picker), { //仅提供了beginDate时,触发day,hours,minutes的change\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createHours();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.m = new Picker($('[data-id=\"picker-m\"]', _picker), { // 月变更时,总要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null) {\r\n                    self._createDay();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.y = new Picker($('[data-id=\"picker-y\"]', _picker), { // 年发生变更,如果没有结束月,此时有所有的月,是不需要变更月的,只需要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index != null) {\r\n                    if (self.options.beginMonth || self.options.endMonth) {\r\n                        self._createMonth();\r\n                    } else {\r\n                        self._createDay();\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n\r\n\r\n\r\n        self._create();\r\n\r\n        var ui = self.ui;\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.options.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.options.value);\r\n\r\n        //防止滚动穿透 TODO:待确认情况\r\n        /* self.ui.picker.addEventListener($.EVENT_START, function (event) {\r\n         event.preventDefault();\r\n         }, false);\r\n         self.ui.picker.addEventListener($.EVENT_MOVE, function (event) {\r\n         event.preventDefault();\r\n         }, false);*/\r\n    };\r\n\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.options.type;\r\n        var selected = {\r\n            type: type,\r\n            y: ui.y.getSelectedItem(),\r\n            m: ui.m.getSelectedItem(),\r\n            d: ui.d.getSelectedItem(),\r\n            h: ui.h.getSelectedItem(),\r\n            i: ui.i.getSelectedItem(),\r\n            toString: function () {\r\n                return this.value;\r\n            }\r\n        };\r\n        switch (type) {\r\n            case 'datetime':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'date':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text;\r\n                break;\r\n            case 'time':\r\n                selected.value = selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'month':\r\n                selected.value = selected.y.value + '-' + selected.m.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text;\r\n                break;\r\n            case 'hour':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text;\r\n                break;\r\n        }\r\n        return selected;\r\n    };\r\n\r\n    DtPicker.prototype._setSelectedValue = function (value) {\r\n        var self = this;\r\n        var ui = self.ui;\r\n\r\n        if(!value){\r\n            if(this.options.type == 'time'){\r\n                value = '00:00';\r\n            }else{\r\n                value = defaultPickerDate.getFullYear()+'-'+(defaultPickerDate.getMonth()+1)+'-'+defaultPickerDate.getDate()+' '\r\n                    + defaultPickerDate.getHours() + ':' + defaultPickerDate.getMinutes();\r\n            }\r\n        }\r\n        var parsedValue = self._parseSetValue(value);\r\n\r\n        ui.y.setListen(true);\r\n        ui.m.setListen(false);\r\n        ui.d.setListen(false);\r\n        ui.h.setListen(false);\r\n        ui.i.setListen(false);\r\n        ui.y.setSelectedValue(parsedValue.y);\r\n\r\n        ui.m.setListen(true);\r\n        ui.m.setSelectedValue(parsedValue.m);\r\n\r\n        ui.d.setListen(true);\r\n        ui.d.setSelectedValue(parsedValue.d);\r\n\r\n        ui.h.setListen(true);\r\n        ui.h.setSelectedValue(parsedValue.h);\r\n\r\n        ui.i.setListen(true);\r\n        ui.i.setSelectedValue(parsedValue.i);\r\n\r\n        this.value = this.getSelected().value;\r\n    };\r\n\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    DtPicker.prototype.isLeapYear = function (year) {\r\n        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);\r\n    };\r\n\r\n    DtPicker.prototype._inArray = function (array, item) {\r\n        for (var index in array) {\r\n            var _item = array[index];\r\n            if (_item === item) return true;\r\n        }\r\n        return false;\r\n    };\r\n\r\n    DtPicker.prototype.getDayNum = function (year, month) {\r\n        var self = this;\r\n        if (self._inArray([1, 3, 5, 7, 8, 10, 12], month)) {\r\n            return 31;\r\n        } else if (self._inArray([4, 6, 9, 11], month)) {\r\n            return 30;\r\n        } else if (self.isLeapYear(year)) {\r\n            return 29;\r\n        } else {\r\n            return 28;\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype._fill = function (num) {\r\n        num = num.toString();\r\n        if (num.length < 2) {\r\n            num = 0 + num;\r\n        }\r\n        return num;\r\n    };\r\n\r\n    DtPicker.prototype._isBeginYear = function () {\r\n        return this.options.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.options.beginMonth && this._isBeginYear() && this.options.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.options.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.options.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.options.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.options.endMonth && this._isEndYear() && this.options.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.options.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.options.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (options.customData.y) {\r\n            yArray = options.customData.y;\r\n        } else {\r\n            var yBegin = options.beginYear;\r\n            var yEnd = options.endYear;\r\n            for (var y = yBegin; y <= yEnd; y++) {\r\n                yArray.push({\r\n                    text: y + '',\r\n                    value: y\r\n                });\r\n            }\r\n        }\r\n        ui.y.setItems(yArray);\r\n        //ui.y.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMonth = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (options.customData.m) {\r\n            mArray = options.customData.m;\r\n        } else {\r\n            var m = options.beginMonth && self._isBeginYear() ? options.beginMonth : 1;\r\n            var maxMonth = options.endMonth && self._isEndYear() ? options.endMonth : 12;\r\n            for (; m <= maxMonth; m++) {\r\n                var val = self._fill(m);\r\n                mArray.push({\r\n                    text: val,\r\n                    value: m\r\n                });\r\n            }\r\n        }\r\n        ui.m.setItems(mArray);\r\n        //ui.m.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createDay = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (options.customData.d) {\r\n            dArray = options.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? options.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? options.endDay : self.getDayNum(parseInt(this.ui.y.getSelectedValue()), parseInt(this.ui.m.getSelectedValue()));\r\n            for (; d <= maxDay; d++) {\r\n                var val = self._fill(d);\r\n                dArray.push({\r\n                    text: val,\r\n                    value: d\r\n                });\r\n            }\r\n        }\r\n        ui.d.setItems(dArray);\r\n        //current = current || ui.d.getSelectedValue();\r\n        //ui.d.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createHours = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (options.customData.h) {\r\n            hArray = options.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? options.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? options.endHours : 23;\r\n            for (; h <= maxHours; h++) {\r\n                var val = self._fill(h);\r\n                hArray.push({\r\n                    text: val,\r\n                    value: h\r\n                });\r\n            }\r\n        }\r\n        ui.h.setItems(hArray);\r\n        //ui.h.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMinutes = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (options.customData.i) {\r\n            iArray = options.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? options.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? options.endMinutes : 59;\r\n            for (; i <= maxMinutes; i++) {\r\n                var val = self._fill(i);\r\n                iArray.push({\r\n                    text: val,\r\n                    value: i\r\n                });\r\n            }\r\n        }\r\n        ui.i.setItems(iArray);\r\n        //ui.i.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._setLabels = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = options.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.cancel.text(options.buttons[0]);\r\n        ui.ok.text(options.buttons[1]);\r\n\r\n        if(options.hasClear){\r\n            ui.clear.text(options.buttons[2])\r\n        }else{\r\n            ui.clear.hide();\r\n        }\r\n\r\n        ui.buttons.each(function (index) {\r\n            $(this).click(function () {\r\n                self.clickCall(index);\r\n            })\r\n        })\r\n    };\r\n\r\n    // 解析设置的值,目前是字符串,完整日期格式 2012-12-12 12:21\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.options.type;\r\n\r\n        var rs = {\r\n            y: now.getFullYear(),\r\n            m: now.getMonth()+1,\r\n            d: now.getDate(),\r\n            h: now.getHours(),\r\n            i: now.getMinutes()\r\n        };\r\n\r\n        if(value instanceof Date){\r\n            if( type == 'time'){\r\n                valu= +value.getHours()+\":\"+value.getMinutes();\r\n            }else{\r\n                value = value.getFullYear()+'-'+(value.getMonth()+1)+'-'+value.getDate()+ ' '\r\n                    +value.getHours()+\":\"+value.getMinutes();\r\n            }\r\n        }\r\n\r\n        var parts = value.replace(\":\", \"-\").replace(\" \", \"-\").split(\"-\");\r\n        for(var i=0, j=parts.length; i<j; i++){\r\n            parts[i] = parseInt(parts[i]);\r\n        }\r\n\r\n        if(type == 'datetime'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = parts[4];\r\n        }else if(type == 'date'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }else if(type == 'time'){\r\n            rs.h = parts[0];    //\r\n            rs.i = parts[1];\r\n        }else if(type == 'hour'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = 0;\r\n        }else if(type == 'month'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = 1;    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }\r\n\r\n        return rs;\r\n    };\r\n\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var options = this.options;\r\n        var now = defaultPickerDate;\r\n\r\n        var beginDate = options.beginDate;\r\n        if(beginDate){\r\n            beginDate = this._parseSetValue(beginDate);\r\n            options.beginYear = beginDate.y;\r\n            options.beginMonth = beginDate.m;\r\n            options.beginDay = beginDate.d;\r\n            options.beginHours = beginDate.h;\r\n            options.beginMinutes = beginDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.beginYear =  now.getFullYear();\r\n            options.beginMonth = now.getMonth() + 1;\r\n            options.beginDay = now.getDate();\r\n            options.beginHours = 0;\r\n            options.beginMinutes = 0;\r\n        }else {\r\n            options.beginYear =  now.getFullYear() - 5;\r\n        }\r\n\r\n        var endDate = options.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            options.endYear = endDate.y;\r\n            options.endMonth = endDate.m;\r\n            options.endDay = endDate.d;\r\n            options.endHours = endDate.h;\r\n            options.endMinutes = endDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.endYear =  now.getFullYear();\r\n            options.endMonth = now.getMonth() + 1;\r\n            options.endDay = now.getDate();\r\n            options.endHours = 24;\r\n            options.endMinutes = 59;\r\n        }else {\r\n            options.endYear =  options.beginYear + 10 ;\r\n        }\r\n\r\n        //生成\r\n        self._createYear();\r\n        self._createMonth();\r\n        self._createDay();\r\n        self._createHours();\r\n        self._createMinutes();\r\n    };\r\n\r\n    // 更新选择框,更新当前值\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.options.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    // 判断最大最小值合理性\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.options.endDate = date;\r\n        this._create();\r\n    };\r\n\r\n    DtPicker.prototype.dispose = function () {\r\n        var self = this;\r\n        self.hide();\r\n        setTimeout(function () {\r\n            self.ui.picker.parentNode.removeChild(self.ui.picker);\r\n            for (var name in self) {\r\n                self[name] = null;\r\n                delete self[name];\r\n            }\r\n            self.disposed = true;\r\n        }, 300);\r\n    };\r\n\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    DtPicker.prototype.clickCall = function(index){\r\n        var self = this;\r\n        var sltDate = self.getSelected();\r\n        var rs = self.options.callBack.call(this , sltDate, index);\r\n        if (rs !== false) {\r\n            if(index == 1){ // 假定确认按钮在第二个位置,传回true则存储当前值\r\n                self.value = sltDate.value;\r\n            }else if(index == 2){\r\n                self.value = null;\r\n            }\r\n            self.hide();\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    DtPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.clickCall(0);\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.dtPicker = function(options){\r\n        return new DtPicker(options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n// 支持非循环\r\n// size命名用的有点混淆。。\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n\r\n(function (ipu, $, Hammer) {\r\n    function HammerCarousel(navSlt, options) {\r\n        this.options = options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(navSlt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    // 直接替换掉了prototype对象,可能不是个好选择\r\n    HammerCarousel.prototype = {\r\n        defaultOptions: {\r\n            index: null,        // 默认显示第几个项,其实挺没用的,默认显示第一个,用户再调用一下显示第几个,作用一样现在。\r\n            autoPlay: false,    // 是否自动轮播\r\n            duration: 3000,     // 轮播间隔\r\n            indicator: false,  //是否生成指示器,即小点点\r\n            callBack: null,  // 轮播后回调函数\r\n            clickBack: null   // 各子项用户点击事件\r\n            //indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\r\n\r\n\r\n            this.showSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n            this.carouselItemSizes = [];\r\n            this.currentIndex = 0;\r\n            this.moveLen = 0;\r\n            this.lastItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来判断是复制项\r\n\r\n            // 这里假设每个元素都是相等的\r\n            this.carouselItems.slice(0, this.showSize).clone().appendTo(this.wrapper); // 如果做无限循环则要这样处理\r\n            this.size = this.carouselItems.size();\r\n\r\n            var self = this;\r\n            if(this.options.clickBack){\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        self.options.clickBack.call(this, i%self.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this.sizeCount();\r\n            var that = this;\r\n\r\n            this.hammer = new Hammer.Manager(this.el); // 避免因为li里面的内容高度不够,而不能触发相关事件\r\n            this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_HORIZONTAL, threshold: 10}));\r\n            this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this.onPan, this));\r\n\r\n            $(window).resize(function () { // 在尺寸变化时,处理,是否可以考虑只在宽度变化时处理,横屏事件?\r\n                that.refresh();\r\n            });\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.options.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.options.index);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.options.autoPlay = false;\r\n        },\r\n        _pause: function () {\r\n            if (this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            if (index == this.size - 1) {\r\n                this._show(this.size, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        next: function () {//下一张\r\n            var index = this.currentIndex == this.size ? 1 : this.currentIndex + 1;\r\n            if (index == 1) {\r\n                this._show(0, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % size;\r\n            if(index < 0 ){\r\n                index = size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        play: function () {\r\n            this.options.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.options.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    that.timeoutId = null;//清空这个timeoutId,代表该次处理已经执行了\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {//移动结束时调用\r\n            var currentIndex = this.currentIndex;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n\r\n            this._play();//处理自动播放\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        sizeCount: function () {\r\n            this.wrapperSize = this.wrapper.outerWidth(true);\r\n            this.itemSize = this.carouselItems.eq(0).outerWidth(true);\r\n            this.mostSize = this.size * this.itemSize; // 宽度*数量\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\").width();\r\n\r\n            var that = this;\r\n            $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n                that.carouselItemSizes[index] = $(this).position().left;\r\n            });\r\n        },\r\n        refresh: function () {\r\n            if (this.wrapperSize != this.wrapper.outerWidth(true)) {\r\n                this.sizeCount();\r\n                this._show(this.currentIndex, true); //新的位置\r\n            }\r\n        },\r\n        move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\");\r\n            var move = (this.moveLen - moveLen) % this.mostSize;\r\n            move = (move + this.mostSize) % this.mostSize;\r\n            this.displayMoveLen = move;\r\n\r\n            move = -move + \"px\";\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        },\r\n        _show: function (index, animate) { // 知道最终移动到的项时,调用\r\n            if (animate !== false) { // 默认值为true\r\n                animate = true;\r\n            }\r\n\r\n            this._pause();\r\n            $(this.wrapper).toggleClass(\"ui-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            //this.currentIndex = index;\r\n            this.lastItem = index == this.size;\r\n            var move = this.carouselItemSizes[index];\r\n            this.moveLen = move;\r\n            move = -move + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n            if (animate) {\r\n                this._end();\r\n            }\r\n        },\r\n        onPan: function (ev) {\r\n            var delta = ev.deltaX;\r\n            // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n            if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n                var value = delta / this.itemSize;\r\n                var intValue = parseInt(Math.abs(value));               // 取整数\r\n                var decimal = Math.abs(value) % 1;                   // 取小数\r\n\r\n                if (decimal > 0.2) { // 滑动超过页面宽20%;\r\n                    intValue = intValue + 1;\r\n                }\r\n                if (value > 0) {\r\n                    intValue = -intValue;\r\n                }\r\n\r\n                var index = (this.currentIndex + intValue) % this.size;\r\n                index = (index + this.size) % this.size; // 因为可能是个负值,转换成正值\r\n\r\n                // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n                if (index == 0 && this.displayMoveLen > this.itemSize) {\r\n                    index = this.size;\r\n                }\r\n                this._show(index);\r\n            } else if (ev.type == 'panmove'){\r\n                this.move(delta);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.hammerCarousel = function (slt, options) {\r\n        return new HammerCarousel(slt, options);\r\n    };\r\n})(ipu || window, jQuery,  Hammer);\r\n\n(function (ipu, $) {\r\n    //$ extends\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        // console.log('__dealCssEvent');\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            /*jshint validthis:true */\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.transitionEnd = function (callback) {\r\n        // console.log('transitionEnd');\r\n        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalStack: true,\r\n        modalButtonOk: '确定',\r\n        modalButtonCancel: '取消',\r\n        modalPreloaderTitle: '加载中',\r\n        modalContainer: document.body ? document.body : 'body'\r\n    };\r\n\r\n    ipu.modalStack = [];\r\n\r\n    ipu.modalStackClearQueue = function () {\r\n        if (ipu.modalStack.length) {\r\n            (ipu.modalStack.shift())();\r\n        }\r\n    };\r\n    ipu.modal = function (params) {\r\n        params = params || {};\r\n        var modalHTML = '';\r\n        var buttonsHTML = '';\r\n        if (params.buttons && params.buttons.length > 0) {\r\n            for (var i = 0; i < params.buttons.length; i++) {\r\n                buttonsHTML += '<span class=\"ui-modal-button' + (params.buttons[i].bold ? ' ui-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\r\n            }\r\n        }\r\n        var extraClass = params.extraClass || '';\r\n        var titleHTML = params.title ? '<div class=\"ui-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ui-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ui-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ui-modal-buttons-vertical' : '';\r\n        modalHTML = '<div class=\"ui-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ui-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ui-modal-buttons ' + verticalButtons + '\">' + buttonsHTML + '</div></div>';\r\n\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n\r\n        var modal = $(_modalTemplateTempDiv).children();\r\n\r\n        $(defaults.modalContainer).append(modal[0]);\r\n\r\n        // Add events on buttons\r\n        modal.find('.ui-modal-button').each(function (index, el) {\r\n            $(el).on('click', function (e) {\r\n                if (params.buttons[index].close !== false) ipu.closeModal(modal);\r\n                if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\r\n                if (params.onClick) params.onClick(modal, index);\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n    ipu.alert = function (text, title, callbackOk) {\r\n        if (typeof title === 'function') {\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\r\n        });\r\n    };\r\n    ipu.confirm = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [\r\n                {text: defaults.modalButtonCancel, omodalButtonCancelnClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n    ipu.prompt = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            afterText: '<input type=\"text\" class=\"ui-modal-text-input\">',\r\n            buttons: [\r\n                {\r\n                    text: defaults.modalButtonCancel\r\n                },\r\n                {\r\n                    text: defaults.modalButtonOk,\r\n                    bold: true\r\n                }\r\n            ],\r\n            onClick: function (modal, index) {\r\n                if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ui-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ui-modal-text-input').val());\r\n            }\r\n        });\r\n    };\r\n\r\n    var minLoad = false;        // 是否最小时间调用方式\r\n    var loadOverTime = false;   // 是否超过最小调用时间\r\n    var loadEnd = false;        // 是否调用结束\r\n    var loadTimeOut = null;     // 延时调用ID\r\n\r\n    ipu.showPreloader = function (title, minTime) {\r\n        ipu.hidePreloader(true);\r\n\r\n        ipu.showPreloader.preloaderModal = ipu.modal({\r\n            title: title || defaults.modalPreloaderTitle,\r\n            text: '<div class=\"ui-preloader\"></div>'\r\n        });\r\n\r\n        if(minTime){\r\n            minLoad = true;\r\n            loadTimeOut = setTimeout(function () {\r\n                loadOverTime = true;\r\n                if(loadEnd){\r\n                    ipu.hidePreloader();\r\n                }\r\n            }, minTime);\r\n        }\r\n\r\n        return ipu.showPreloader.preloaderModal;\r\n    };\r\n    ipu.hidePreloader = function (force) {\r\n        if(force || !minLoad || (minLoad && loadOverTime)){\r\n            if(force && loadTimeOut){\r\n                window.clearTimeout(loadTimeOut);\r\n            }\r\n            ipu.showPreloader.preloaderModal && ipu.closeModal(ipu.showPreloader.preloaderModal);\r\n            minLoad = false; // 重置各标志位\r\n            loadOverTime = false;\r\n            loadEnd = false;\r\n            loadTimeOut = null;\r\n        }else{\r\n            loadEnd = true;\r\n        }\r\n    };\r\n    ipu.showIndicator = function () {\r\n        if ($('.ui-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ui-preloader-indicator-overlay\"></div><div class=\"ui-preloader-indicator-modal\"><span class=\"ui-preloader ui-preloader-white\"></span></div>');\r\n    };\r\n    ipu.hideIndicator = function () {\r\n        $('.ui-preloader-indicator-overlay, .ui-preloader-indicator-modal').remove();\r\n    };\r\n    // Action Sheet\r\n    ipu.actions = function (params) {\r\n        var modal, groupSelector, buttonSelector;\r\n        params = params || [];\r\n\r\n        if (params.length > 0 && !$.isArray(params[0])) {\r\n            params = [params];\r\n        }\r\n        var modalHTML;\r\n        var buttonsHTML = '';\r\n        for (var i = 0; i < params.length; i++) {\r\n            for (var j = 0; j < params[i].length; j++) {\r\n                if (j === 0) buttonsHTML += '<div class=\"ui-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ui-actions-modal-label' : 'ui-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ui-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ui-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ui-bg-' + button.bg;\r\n                if (button.disabled) buttonClass += ' disabled';\r\n                buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\r\n                if (j === params[i].length - 1) buttonsHTML += '</div>';\r\n            }\r\n        }\r\n        modalHTML = '<div class=\"ui-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ui-actions-modal-group';\r\n        buttonSelector = '.ui-actions-modal-button';\r\n\r\n        var groups = modal.find(groupSelector);\r\n        groups.each(function (index, el) {\r\n            var groupIndex = index;\r\n            $(el).children().each(function (index, el) {\r\n                var buttonIndex = index;\r\n                var buttonParams = params[groupIndex][buttonIndex];\r\n                var clickTarget;\r\n                if ($(el).is(buttonSelector)) clickTarget = $(el);\r\n                // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\r\n\r\n                if (clickTarget) {\r\n                    clickTarget.on('click', function (e) {\r\n                        if (buttonParams.close !== false) ipu.closeModal(modal);\r\n                        if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n                    });\r\n                }\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n\r\n    //显示一个消息,会在2秒钟后自动消失\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ui-modal ui-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n        ipu.openModal($toast, function () {\r\n            setTimeout(function () {\r\n                ipu.closeModal($toast);\r\n            }, duration || 2000);\r\n        });\r\n    };\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isNotToast = !modal.hasClass('ui-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n        if ($('.ui-modal.ui-modal-in:not(.ui-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\r\n            ipu.modalStack.push(function () {\r\n                ipu.openModal(modal, cb);\r\n            });\r\n            return;\r\n        }\r\n        var isPopup = modal.hasClass('ui-popup');\r\n        var isLoginScreen = modal.hasClass('ui-login-screen');\r\n        var isPickerModal = modal.hasClass('ui-picker-modal');\r\n        var isToast = modal.hasClass('ui-toast');\r\n        if (isModal) {\r\n            modal.show();\r\n            modal.css({\r\n                marginTop: -Math.round(modal.outerHeight() / 2) + 'px'\r\n            });\r\n        }\r\n        if (isToast) {\r\n            modal.css({\r\n                marginLeft: -Math.round(modal.outerWidth() / 2 ) + 'px' //1.185 是初始化时候的放大效果\r\n            });\r\n        }\r\n\r\n        var overlay;\r\n        if (!isLoginScreen && !isPickerModal && !isToast) {\r\n            if ($('.ui-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ui-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        }\r\n\r\n        //Make sure that styles are applied, trigger relayout;\r\n        var clientLeft = modal[0].clientLeft;\r\n\r\n        // Trugger open event\r\n        modal.trigger('open');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).addClass('ui-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('ui-modal-overlay-visible');\r\n        modal.removeClass('ui-modal-out').addClass('ui-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n        });\r\n        // excute callback\r\n        if (typeof cb === 'function') {\r\n            cb.call(this);\r\n        }\r\n        return true;\r\n    };\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ui-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isPopup = modal.hasClass('ui-popup'),\r\n            isToast = modal.hasClass('ui-toast'),\r\n            isLoginScreen = modal.hasClass('ui-login-screen'),\r\n            isPickerModal = modal.hasClass('ui-picker-modal'),\r\n            removeOnClose = modal.hasClass('ui-remove-on-close'),\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ui-popup.ui-modal-in').length) {\r\n                overlay.removeClass('ui-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ui-modal-overlay-visible');\r\n        }\r\n        modal.trigger('close');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).removeClass('ui-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ui-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ui-modal-in').addClass('ui-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ui-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ui-modal-out').hide();\r\n                if (removeOnClose && modal.length > 0) {\r\n                    modal.remove();\r\n                }\r\n            }\r\n            else {\r\n                modal.remove();\r\n            }\r\n        });\r\n        if (isModal && defaults.modalStack) {\r\n            ipu.modalStackClearQueue();\r\n        }\r\n\r\n        return true;\r\n    };\r\n    function handleClicks(e) {\r\n        /*jshint validthis:true */\r\n        var clicked = $(this);\r\n        var url = clicked.attr('href');\r\n\r\n\r\n        //Collect Clicked data- attributes\r\n       /* var clickedData = clicked.dataset();\r\n\r\n        // Popup\r\n        var popup;\r\n        if (clicked.hasClass('ui-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ui-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ui-modal-overlay')) {\r\n            if ($('.ui-modal.ui-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ui-modal.ui-modal-in');\r\n            if ($('.ui-actions-modal.ui-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ui-actions-modal.ui-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ui-popup-overlay')) {\r\n            if ($('.ui-popup.ui-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ui-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ui-modal-overlay, .ui-popup-overlay, .ui-close-popup, .ui-open-popup, .ui-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n    NavBar.prototype.defaultOpt = {\r\n        animate: false,           // 默认有动画\r\n        contentSlt: \".ui-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) { // currentIndex: 当前索引,lastIndex上一次索引(第一次时为null)\r\n        }\r\n    };\r\n\r\n    function NavBar(slt, options) {\r\n        this.options = $.extend({}, this.defaultOpt, options);\r\n        this.content = $(this.options.contentSlt);\r\n        this.nav = $(slt);\r\n        this.wrapper = $(\">ul\", this.content);\r\n        this.contents = $(\">li\", this.wrapper);\r\n        this.navs = $(\">a\", this.nav);\r\n        var me = this;\r\n\r\n        var activeIndex = this.navs.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.options.animate) {\r\n            this.wrapper.addClass(\"ui-no-animation\")\r\n        }\r\n\r\n        this.navs.each(function (index, i) {\r\n            $(this).click(function () {\r\n                me.show(index);\r\n            });\r\n        });\r\n\r\n        this.lastIndex = null;\r\n        this.currentIndex = null;\r\n        me.show(this.options.index);\r\n    }\r\n\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            var currentContent = $(this.contents[index]).addClass(\"ui-show\");\r\n\r\n            if (this.options.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ui-show\"); // 隐藏上上个元素\r\n                }\r\n\r\n                if (this.currentIndex != null) {        // 非第一次需要动画效果\r\n                    if (this.currentIndex < index) {   // 需要内容为往左走,显示右边的内容\r\n                        if (this.lastIndex != null && this.lastIndex < this.currentIndex) {  // 内容已经左走过了,则需要移除动画复原位置,再通过width()方法强制生效\r\n                            this.wrapper.addClass(\"ui-no-animation\").removeClass(\"ui-nav-content-right\").width(); // 可以强制刷新,默认jquery应该会将这些dom上的修改延时处理?\r\n                        }\r\n                    } else {\r\n                        if (this.lastIndex == null || this.lastIndex > this.currentIndex) { // 类似同上\r\n                            this.wrapper.addClass(\"ui-no-animation\").addClass(\"ui-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ui-no-animation\").toggleClass(\"ui-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ui-show\");\r\n            }\r\n\r\n            // 更新class,ui-current状态\r\n            $(this.contents[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n            $(this.navs[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.navBar = function (slt, options) {\r\n        return new NavBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.animationEnd = function (callback) {\r\n        __dealCssEvent.call(this, ['webkitAnimationEnd', 'animationend'], callback);\r\n        return this;\r\n    };\r\n\r\n    function submitForm(doc, url ,params){\r\n        var form = doc.createElement(\"form\");\r\n        form.action = url;\r\n        form.method = \"post\";\r\n        form.style.display = \"none\";\r\n\r\n        for (var x in params) {\r\n            var ele = doc.createElement(\"input\");\r\n            ele.type=\"hidden\";\r\n            ele.name = x;\r\n            ele.value =  params[x];\r\n            form.appendChild(ele);\r\n        }\r\n\r\n        doc.body.appendChild(form);\r\n        form.submit();\r\n    }\r\n\r\n    // 检查是否有ui-pages的结构\r\n    function checkPages() {\r\n        if(!hasPages){\r\n            pagesObj = $(\".ui-pages\"); // pagesObj为空则进行jquery取值\r\n            if(pagesObj.size() == 0){\r\n                pagesObj =  $(\"<div class='ui-pages'><div class='ui-page ui-show \"+zeroPageClass+\"' id='\"+pageIdPrefix+\"0'></div>\").appendTo(\"body\");\r\n            }\r\n            hasPages = true;\r\n        }\r\n    }\r\n\r\n    // 站位页面\r\n    function isZeroPage(page) {\r\n        return $(page).hasClass(zeroPageClass);\r\n    }\r\n\r\n    var page = {};\r\n    var hasPages = false;\r\n    var maps = {};\r\n    var pageNo = 1; // 编号0留给主页面或当前页面,或没有\r\n    var pageIdPrefix = \"ipuPage-\";\r\n    var pagesObj = null;\r\n    var animateInClass = \"ui-anim ui-slideRightIn\";\r\n    var animateOutClass  = \"ui-anim ui-slideRightOut\";\r\n    var eventName = \"ipuUIPageBack\";\r\n    var zeroPageClass = 'ui-page-zero';   // 占位页面,对于为当前页面\r\n    var zeroPagesClass = 'ui-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\r\n\r\n\r\n\r\n    page.options = {     // 那个窗口执行open,默认父窗口\r\n        target: window.parent, // 默认执行父窗口,方法:all\r\n        backIndex: -1,    // 默认回退一页         方法:back\r\n        closeIndex: -1,   // 默认关闭最近一个页面 方法:close\r\n        params:{},        // post的传参            方法:post\r\n        animate: true,     // 是否动画效果        方法:open post\r\n        showLoading: true,   // 是否显示加载消息  方法:open post\r\n        loadingMessage: '正在加载中',  //          方法:open post\r\n        method : null,     // 请求方式,内置参数,方法自己设置,用户不需要设置  方法:无\r\n        minMessageTime: 500, // 最小显示加载时间,避免出现闪现的情况 方法:open post\r\n        data: null,         // 回退时,回传参数, 方法:back\r\n        pageName: '',     // 给打开的页面命名,以便根据此页面名称来切换页面 方法:open post back close\r\n        callBack:function () { // 事件回调       方法:open post close back\r\n        }\r\n    };\r\n\r\n    // 当前页面加载,针对顶层父窗口\r\n    page.openPage = function (url, options) {\r\n        var newPage = null;\r\n        var nowPageNo = pageIdPrefix + (pageNo++);\r\n        maps[nowPageNo] = url;\r\n\r\n        checkPages();\r\n\r\n        if(options.showLoading){\r\n            ipu.showPreloader(options.loadingMessage, options.minMessageTime);\r\n        }\r\n\r\n        if(options.method == 'post'){\r\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe'></iframe></div>\");\r\n        }else{\r\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe' src='\"+url+\"'></iframe></div>\");\r\n        }\r\n\r\n        var zeroPage = isZeroPage($(\".ui-page:last\", pagesObj));\r\n        var animatePage = newPage;\r\n        if(zeroPage){\r\n            animatePage = pagesObj.addClass(zeroPagesClass);\r\n        }\r\n\r\n        function end() {\r\n            if(options.showLoading) {\r\n                ipu.hidePreloader();\r\n            }\r\n\r\n            if(options.animate) {\r\n                animatePage.removeClass(animateInClass);\r\n            }\r\n\r\n            newPage.siblings(\".ui-show\").removeClass('ui-show');\r\n            if(options.callBack){\r\n                options.callBack();\r\n            }\r\n        }\r\n\r\n        $(\".ui-page-iframe\", newPage).one('load', function () {\r\n            newPage.addClass(\"ui-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\r\n\r\n            if(zeroPage){\r\n                animatePage.removeClass(zeroPagesClass);\r\n            }\r\n            if(options.animate){\r\n                animatePage.addClass(animateInClass).animationEnd(end);\r\n            }else{\r\n                end();\r\n            }\r\n        });\r\n\r\n        newPage.appendTo(pagesObj);\r\n        if(options.method == 'post') {\r\n            var pageDoc = $(\".ui-page-iframe\", newPage)[0].contentDocument;\r\n            submitForm(pageDoc, url, options.params);\r\n        }\r\n    };\r\n\r\n    // post方式加载页面\r\n    page.postPage = function (url, options) {\r\n        options.method = 'post';\r\n        page.openPage(url, options);\r\n    };\r\n\r\n    // 当前页面后退,针对顶层父窗口\r\n    page.backPage = function (options) {\r\n        var backIndex = options.backIndex;\r\n        var page = null;\r\n        var nowPage = $(\".ui-page.ui-show\", pagesObj);\r\n\r\n        if(options.pageName){\r\n            page =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj);\r\n        }else if(backIndex == 0){\r\n            page = $(\".ui-page:first\", pagesObj);\r\n        }else { // 越界的情况\r\n            var prevPage = nowPage.prevAll(\".ui-page\");\r\n            if(backIndex < 0){\r\n                page= $(prevPage[-backIndex - 1]);\r\n            }else{\r\n                page= $(prevPage[prevPage.size() - backIndex]);\r\n            }\r\n        }\r\n\r\n        var animatePage = nowPage;\r\n        var zeroPage = isZeroPage(page);\r\n\r\n        // 主页面模式时\r\n        if(zeroPage){\r\n            animatePage = pagesObj;\r\n        }else{\r\n            page.addClass(\"ui-show\"); //显示前一个\r\n        }\r\n\r\n        function end (){\r\n            $(this).removeClass(animateOutClass);\r\n            page.nextAll(\".ui-page\").remove();\r\n\r\n            var iframe = $(\".ui-page-iframe\", page);\r\n            var nowDoc;\r\n\r\n            if(iframe.size() == 0){ // 找不到子窗口就当是返回了主页面,在当前窗口触发\r\n                nowDoc = window.document;\r\n            }else{\r\n                nowDoc = iframe[0].contentDocument;\r\n            }\r\n\r\n            if(zeroPage){\r\n                pagesObj.addClass(zeroPagesClass);\r\n            }\r\n\r\n            var evt = nowDoc.createEvent('Event');\r\n            evt.initEvent(eventName, true, true);\r\n            if(options.data){\r\n                evt.data = options.data;\r\n            }\r\n            nowDoc.body.dispatchEvent(evt);\r\n            if(options.callBack){\r\n                options.callBack();\r\n            }\r\n        }\r\n\r\n        if(options.animate){\r\n            animatePage.addClass(animateOutClass).animationEnd(end);\r\n        }else{\r\n            end();\r\n        }\r\n    };\r\n\r\n    // 往前关闭窗口\r\n    page.closePage = function (options) {\r\n        var closeIndex = options.closeIndex;\r\n        var prevPage = $(\".ui-page.ui-show\", pagesObj).prevAll(\".ui-page\");\r\n\r\n        if(options.pageName){\r\n            closeIndex =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj).index();\r\n        }else if(closeIndex < 0){\r\n            closeIndex = -closeIndex -1;\r\n        }else{\r\n            closeIndex = prevPage.size() - closeIndex;\r\n        }\r\n\r\n        $(prevPage[closeIndex]).remove();\r\n        if(options.callBack){\r\n            options.callBack();\r\n        }\r\n    };\r\n\r\n    // 调用父窗口打开页面\r\n    page.open = function (url, options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.openPage(url, options);\r\n    };\r\n\r\n    // post方法\r\n    page.post = function (url, options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.method = 'post';\r\n        options.target.ipu.page.openPage(url, options);\r\n    };\r\n\r\n    // 调用父窗口,回退\r\n    page.back = function (options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.backPage(options);\r\n    };\r\n\r\n    // 返回首页\r\n    page.backHome = function (options) {\r\n        options = options || {};\r\n        options.backIndex = 0;\r\n        page.back(options);\r\n    };\r\n\r\n    // 子窗口,待确认\r\n    page.close = function (options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.closePage(options);\r\n    };\r\n\r\n    // 添加回调事件\r\n    page.onBack = function (back) {\r\n        $(\"body\").on(eventName, function (e) {\r\n            var data = e.originalEvent.data;\r\n            back(data);\r\n        });\r\n    };\r\n\r\n    // 提供一个关闭一群窗口的方法\r\n    ipu.page = page;\r\n})(ipu || window, jQuery);\r\n\n// picker\r\n(function (ipu, $, Hammer) {\r\n    var showItemSize = 9;   // 显示的子项数量,\r\n    var r = 90;             // 计算旋转的圆半径,结果应该缩小,是为了r不要距离容器太近\r\n    var itemAngle = 180 / showItemSize;   // 每项对应的角度是 180/9 = 20\r\n    var maxExceed = itemAngle;         // 滚动时允许超出边界的最大角度\r\n    // itemHeight = 40px;       // 需要给出r=89是怎么计算出来的,是根据 40/2/Math.tan(40/2/180*Math.PI)=113,直接太大不好看\r\n\r\n    function Picker(slt, options) {\r\n        this.el = $(slt)[0];\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this._init();\r\n    }\r\n\r\n    // 默认参数\r\n    Picker.prototype.defaultOptions = {\r\n        onChange: function () {       // 子项选中事件\r\n        },\r\n        listen: true,                  // 默认已开记监听变化\r\n        data: []\r\n    };\r\n\r\n    Picker.prototype._init = function () {\r\n        var self = this;\r\n        this.wrap = $(\">ul\", this.el);\r\n        this.index = null;\r\n        this.listen = !!this.options.listen;\r\n\r\n        this.beginAngle = 0;\r\n        this.beginExceed = this.beginAngle - maxExceed;       // 最小角度值\r\n        this.stopInertiaMove = false;\r\n        this.lastAngle = null; // 保存滑动前的角度\r\n        this.empty = this.options.data.length == 0;\r\n\r\n        // 如果是ios,则ul的旋转中心点,有变化\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+r+\"px\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n        this.hammer = new Hammer.Manager(this.el);\r\n        this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_VERTICAL, threshold: 5}));\r\n        this.hammer.add(new Hammer.Press({threshold: 4}));  //\r\n        this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this._onPan, this));\r\n\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\r\n           // console.log('press');\r\n            if(this.empty){\r\n                return ;\r\n            }\r\n\r\n            self.stopInertiaMove = true;\r\n            if (e.type == 'pressup') {\r\n                self.endScroll();\r\n            }\r\n        });\r\n\r\n        this.setItems(this.options.data);\r\n    };\r\n\r\n    Picker.prototype.setItems = function (data, textName) {\r\n        this.wrap.empty(); // 清空历史数据\r\n        this.data = data = data || [];\r\n        this.empty = data.length == 0; // 数据是否为空\r\n\r\n        this.newData = true; // 表示设置了新数据,触发change回调,但第一次设置时,不需要触发\r\n        var self = this;\r\n        var lis = \"\";\r\n        textName = textName || 'text';\r\n\r\n        for (var i = 0, j = data.length; i < j; i++) {\r\n            lis = lis + \"<li>\" + data[i][textName] + \"</li>\";\r\n        }\r\n\r\n        $(lis).appendTo(this.wrap);\r\n\r\n        this.items = $(\">li\", this.wrap);\r\n        this.itemsSize = this.items.size();\r\n\r\n        this.endAngle = (this.empty ? 0 : this.itemsSize - 1) * itemAngle;\r\n        this.endExceed = this.endAngle + maxExceed;  // 最大旋转角度值\r\n\r\n        // 初始化各子项角度\r\n        this.items.each(function (i) {\r\n            $(this).css({\r\n                \"transform\": \"translateZ(\" + r + \"px) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + r + \"px\"\r\n            });\r\n            $(this).click(function () {\r\n                self.stopInertiaMove = true;\r\n                self.setAngle(i * itemAngle, true);\r\n            })\r\n        });\r\n\r\n        var newAngle ;\r\n        if(this.empty || this.index == null){\r\n            newAngle = 0;\r\n        }else {\r\n            if(this.index > this.itemsSize - 1){\r\n                newAngle = (this.itemsSize - 1) * itemAngle;\r\n            }else{\r\n                newAngle = this.index * itemAngle;\r\n            }\r\n        }\r\n        this.setAngle(newAngle, true);\r\n\r\n        /*if (this.index !== null) { // 当前已经旋转则,保留当前的索引\r\n         if (this.index > this.itemsSize - 1 && !this.empty) {\r\n         this.index = this.itemsSize - 1;\r\n         }\r\n         this.setAngle(this.index * itemAngle, true);\r\n         } else { // 第一次初始数据,不触发change事件\r\n         this.index = 0;     // 被调用后,不能再使用null值了\r\n         this.setAngle(0, false); // 第一次设置初始化时,不触发change事件\r\n         }*/\r\n    };\r\n\r\n    Picker.prototype._onPan = function (ev) {\r\n        if(this.empty){\r\n            return ;\r\n        }\r\n\r\n        //console.log(ev.deltaX + \"==\"+ ev.deltaY);\r\n        if (ev.type == 'panstart') { // 好像一定要移动才有startg事件\r\n            self.stopInertiaMove = true;\r\n            this.lastAngle = this.angle;\r\n            this.wrap.addClass(\"ui-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\r\n           // console.log('panstart');\r\n\r\n        } else if (ev.type == 'panmove') {\r\n            var moveAngle = this.calcAngle(ev.deltaY);\r\n            var newAngle = this.lastAngle - moveAngle;   //最新的角度\r\n            //console.log('=='+newAngle);\r\n            // 一个可以转动的最小值和最大值过滤\r\n            if (newAngle < this.beginExceed) {\r\n                newAngle = this.beginExceed;\r\n            }\r\n            if (newAngle > this.endExceed) {\r\n                newAngle = this.endExceed;\r\n            }\r\n            this.setAngle(newAngle);\r\n\r\n        } else { // end or cancel事件\r\n            // console.log('end or cancel:' + ev.type);\r\n            var v = ev.overallVelocityY;    // 滑动的速度\r\n            var dir = v > 0 ? -1 : 1; //加速度方向\r\n            var deceleration = dir * 0.0006 * -1;\r\n            var duration = Math.abs(v / deceleration); // 速度消减至0所需时间\r\n            var dist = v * duration / 2; //最终移动多少\r\n\r\n            var startAngle = this.angle;\r\n            var distAngle = -this.calcAngle(dist);\r\n           //  console.log(\"dist=\" + dist + \", distAngle\" + distAngle);\r\n\r\n            //----\r\n            var srcDistAngle = distAngle;\r\n            if (startAngle + distAngle < this.beginExceed) {\r\n                distAngle = this.beginExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n            if (startAngle + distAngle > this.endExceed) {\r\n                distAngle = this.endExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n\r\n            if (distAngle == 0) {\r\n                this.endScroll();\r\n                return;\r\n            }\r\n            this.scrollDistAngle(startAngle, distAngle, duration);\r\n        }\r\n    };\r\n\r\n    // 计算移动的角度,转动的角度,就是移动的距离对应相关圆周\r\n    // 2*r*PI = 360,  angle = 360*c/(2*r*PI)\r\n    var ca = 360 / (2 * r * Math.PI);\r\n    Picker.prototype.calcAngle = function (c) {\r\n        return c * ca;\r\n    };\r\n\r\n    // endScroll 是否为结束的滚动结束,滚动结束需要调用结束事件\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(1000px) rotateY(0deg) rotateX(\" + newAngle + \"deg)\");\r\n        this.calcItemVisable(newAngle);\r\n\r\n        if (endScroll) {\r\n            var index = newAngle / itemAngle;\r\n            var oldIndex = this.index;\r\n            this.index = this.empty ? null : index; // 这里可以做一个判断,如果是empty,则index值可以不改变\r\n\r\n            // 这个地方要判断下,数据更新或索引更新都要触发\r\n            if (oldIndex != index || this.newData) {\r\n                this.newData = false;\r\n               // console.log('change');\r\n                if (this.options.onChange && this.listen) {\r\n                    // console.log('changed call');\r\n                    this.options.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n            }\r\n        }\r\n    };\r\n\r\n    // 计算子项的显示情况\r\n    Picker.prototype.calcItemVisable = function (angle) {\r\n        this.items.each(function (index) {\r\n            var difference = Math.abs(index * itemAngle - angle);\r\n\r\n            if (difference < itemAngle / 2) {\r\n                $(this).addClass(\"ui-highlight ui-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ui-highlight ui-visible\");\r\n            } else {\r\n                $(this).addClass(\"ui-visible\").removeClass(\"ui-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ui-noanimate\");\r\n        var endAngle;\r\n\r\n        if (this.angle < this.beginAngle) {\r\n            endAngle = this.beginAngle;\r\n        } else if (this.angle > this.endAngle) {\r\n            endAngle = this.endAngle;\r\n        } else {\r\n            var index = parseInt((this.angle / itemAngle).toFixed(0));\r\n            endAngle = (itemAngle * index);\r\n        }\r\n\r\n        this.setAngle(endAngle, true);\r\n    };\r\n\r\n    // 进行惯性滚动\r\n    Picker.prototype.scrollDistAngle = function (startAngle, distAngle, duration) {\r\n        var self = this;\r\n        var nowTime = new Date().getTime();\r\n        this.stopInertiaMove = false;\r\n        duration = 1 * duration; // 滚动时长控制修改\r\n\r\n        // hammer调用的惯性函数\r\n        (function (nowTime, startAngle, distAngle, duration) {\r\n            var frameInterval = 13;\r\n            var stepCount = duration / frameInterval;\r\n            var stepIndex = 0;\r\n\r\n            (function inertiaMove() {\r\n                if (self.stopInertiaMove) return;\r\n                var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);\r\n                self.setAngle(newAngle);\r\n                stepIndex++;\r\n\r\n                if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {\r\n                    self.endScroll();\r\n                    return;\r\n                }\r\n\r\n                setTimeout(inertiaMove, frameInterval);\r\n            })();\r\n\r\n        })(nowTime, startAngle, distAngle, duration);\r\n    };\r\n\r\n    Picker.prototype.setListen = function (bool) {\r\n        this.listen = !!bool;\r\n    };\r\n\r\n    Picker.prototype.quartEaseOut = function (t, b, c, d) {\r\n        return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n    };\r\n\r\n    Picker.prototype.setSelectedValue = function (value) {\r\n        var self = this;\r\n        for (var index in self.data) {\r\n            var item = self.data[index];\r\n            if (item.value == value) {\r\n                self.setAngle(index* itemAngle, true);\r\n                return;\r\n            }\r\n        }\r\n    };\r\n\r\n    // 获取当前选中的值\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    Picker.prototype.getSelectedIndex = function () {\r\n        return this.index;\r\n    };\r\n\r\n    ipu.Picker = Picker;\r\n\r\n})(ipu || window, jQuery, Hammer);\r\n\n// popPicker\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n\r\n    function PopPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                        </div>\\\r\n                    </div>',\r\n        pickerTemplate: '<div class=\"ui-picker\">\\\r\n                            <div class=\"ui-picker-selectbox\"></div>\\\r\n                            <ul></ul>\\\r\n                          </div>',\r\n        data: [],    // 数据\r\n        layer: 1,   // 数据层级\r\n        btns: ['取消', '确认'],\r\n        callBack: function () { // 选择数据时的回调函数\r\n\r\n        }\r\n    };\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.options.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ui-poppicker-body\", this.holder);\r\n\r\n        var layer = this.options.layer;\r\n        var width = (100 / layer) + \"%\";\r\n        this.pickers = new Array(layer);\r\n        var self = this;\r\n        var pickerHtml;\r\n        this.mask = this.createMask();\r\n\r\n        // 先初始化最底层picerk,再上面来\r\n        for (var i = layer -1; i >=0; i--) {\r\n            pickerHtml = $(this.options.pickerTemplate).prependTo(bodyHtml).css({width: width});\r\n\r\n            this.pickers[i] = new  Picker(pickerHtml, {\r\n                onChange: (function (i) {\r\n                    return function (item, index) { // 更新底部的值\r\n                        if (i != layer - 1) {\r\n                            self.pickers[i + 1].setItems(item.data);\r\n                        }\r\n                    };\r\n                })(i)\r\n            });\r\n        }\r\n\r\n        $(\".ui-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.options.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.options.btns[1]);\r\n\r\n        $(\".ui-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.options.btns[0]);\r\n    };\r\n\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 获取相关值\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.options.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.options.layer; i++) {\r\n                rs.push(this.pickers[i].getSelectedItem());\r\n            }\r\n            return rs;\r\n        }\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    PopPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.hide();\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.popPicker = function (options) {\r\n        return new PopPicker(options);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n\r\n    /**\r\n     *进度条\r\n     */\r\n    function progressBar(id, options) {\r\n        this.id = id;\r\n        this.level = options.level;\r\n        this.progress = options.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (options.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (options.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    progressBar.prototype.setProgress = function (pro) {\r\n        if (pro < 0 || pro > 100) return;\r\n\r\n        $(this.progressBar.find(\".ipu-progressbar\")).css(\"transform\", \"translate3d(\" + (-(100 - pro)) + \"%, 0px, 0px)\");\r\n        this.progress = pro;\r\n    };\r\n\r\n    progressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    progressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-hightlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-highlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    ipu.progressBar = function (slt, options) {\r\n        return new progressBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $, iScroll) {\r\n\r\n    // 扩展参数,iscroll组件的参数选项\r\n    // 扩展参数,用户直接在页面上自定好,顶端和底部加载html\r\n    // 设置上下条件长度,或计算函数\r\n    // 处理resize的问题,用户主动调用refresh??\r\n    // 底部启用或停用时,应该刷新组件iscroll高度\r\n    // 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n    Refresh.prototype.defaultOptions = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ui-refresh-bottom\"><span class=\"ui-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ui-refresh-top\"><span class=\"ui-refresh-loading\"></span><div class=\"ui-refresh-arrow\"></div></div>',\r\n                // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n                // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ui-refresh-top-loading\r\n                // 拖动达到加载距离,则增加class:ui-refresh-toload\r\n                // 加载中,则增加class:ui-refresh-top-loading,移除class:ui-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOptions:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    function Refresh(slt, options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOptions = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ui-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ui-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ui-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ui-refresh-toload');\r\n                    }\r\n                }\r\n\r\n                me._checkBottomLoading(); // 底部加载条件和顶部条件不一样,只要滚动离底部一定高度就开始加载\r\n                me.goTop = this.y > me.topPullOffset; // 记录是否位于顶部位置,以便刷新后可以回到此位置\r\n            },\r\n            onBeforeScrollEnd: function () {    // 一定是用户拖动触发,在滚动结束前应该触发\r\n                me._checkTopLoading();\r\n                me._checkBottomLoading();\r\n            },\r\n            onScrollEnd: function () { // 这个事件可能由非用户拖动时触发,可能是拖动惯性导致,所有顶部不应该处理,但顶部不管是否惯性,位置条件满足即触发\r\n                if (me.topLoading && this.y < this.minScrollY && me.goTop) {\r\n                    me.iScroll.scrollTo(0, this.minScrollY, 0);\r\n                }\r\n                me._checkBottomLoading(); // 在beforend执行还不够,还在要end执行\r\n            },\r\n            onRefresh: function () { // 刷新时,若顶部加载还在进行,且当前显示的顶部加载,则继续显示,否则刷新后会消失顶部加载,这里代码没有考虑重用了,应该可以做一步提取\r\n                if (me.topLoading) { // 如果顶部在加载,则刷新的时候,设置最小顶部距离,显示顶部加载状态\r\n                    this.minScrollY = this.minScrollY + me.topPullOffset;\r\n                }\r\n            }\r\n        };\r\n\r\n        this.iScrollOptions = $.extend({}, this.options.iScrollOptions, this.iScrollOptions);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOptions);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ui-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.options.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.options.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.options.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        this.topLoading = false;        // 顶部正在载加载\r\n        this.bottomLoading = false;     // 底部正在加载\r\n        this.bottomEnable = this.options.initEnableBottom && !!this.options.bottomLoadFun;\r\n        this.topEnable = this.options.initEnableTop && !!this.options.topLoadFun;\r\n        this.goTop = false;         // 用来处理,因为iScroll使用momentum(惯性), 导致有时顶部显示不正确问题,true表示顶部显示加载条\r\n\r\n        this.enableBottom(this.bottomEnable);\r\n        this.enableTop(this.topEnable);\r\n    };\r\n\r\n    // 检查是否需要底部加载\r\n    Refresh.prototype._checkBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            if (this.iScroll.y < this.iScroll.maxScrollY + this.bottomPullOffset) {\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    Refresh.prototype._checkTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            if (this.topEl.hasClass('ui-refresh-toload')) {\r\n                this._startTopLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 检查内容是否超出容器高度,未超出时,自动调用底部加载\r\n    Refresh.prototype._checkContentLoading = function () {\r\n        if(this.iScroll.maxScrollY >= -this.bottomPullOffset){ // 此处要计算底端的高度\r\n            this._startBottomLoading();\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.options.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ui-refresh-toload').addClass('ui-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.options.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 结束底部加载\r\n    Refresh.prototype.endBottomLoading = function () {\r\n        this.bottomLoading = false;\r\n        this.refresh();\r\n    };\r\n\r\n    // 结束顶部加载\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ui-refresh-top-loading');\r\n        this.topLoading = false;\r\n        // this.iScroll.scrollTo(0, 0); // 刷新加载则应该回到顶部,待测试确认\r\n        this.refresh();\r\n    };\r\n\r\n    // 设置顶部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableTop = function (enable) {\r\n        this.topEnable = enable;\r\n        if (enable) {\r\n            this.topEl.show();\r\n        } else {\r\n            this.topEl.hide();\r\n        }\r\n    };\r\n\r\n    // 设置底部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableBottom = function (enable) {\r\n        this.bottomEnable = enable;\r\n        if (enable) {\r\n            this.bottomEl.show();\r\n        } else {\r\n            this.bottomEl.hide();\r\n        }\r\n    };\r\n\r\n    // 只有在内容发生变更时,但是又没有触发调用end相关方法时,使用此方法更新高度信息\r\n    // 或者组件在一开始未显示??\r\n    // 刷新会移除拖动中状态\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n    ipu.refresh = function (slt, optoins) {\r\n        return new Refresh(slt, optoins);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// Tab\r\n(function (ipu, $) {\r\n    function Tab(holder, options) {\r\n        this.el = $(holder).get(0);\r\n        this.titleItems = $(\".ui-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ui-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ui-tab-fixed\"); // 是否为固定高度的\r\n\r\n        var that = this;\r\n        this.titleItems.each(function (index) {\r\n            $(this).click(function () {\r\n                that.show(index);\r\n            });\r\n        });\r\n\r\n        var index = this.titleItems.filter(\".ui-current\").index();\r\n        if (index == -1) {\r\n            index = 0;\r\n        }\r\n\r\n        this.show(index);\r\n    }\r\n\r\n    Tab.prototype.defaultOptions = {\r\n        callBack: null  // 回调函数,tab切换时回调函数\r\n    };\r\n\r\n    Tab.prototype.show = function (index) {\r\n        if (this.fixed) {\r\n            var move = -index * 100 + \"%\";\r\n            this.bodyWrapper.css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        }\r\n        this.contentItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this.titleItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this._end(index);\r\n    };\r\n\r\n    Tab.prototype._end = function (index) {\r\n        this.lastIndex = this.currentIndex;\r\n        this.currentIndex = index;\r\n\r\n        if (this.options.callBack) {\r\n            this.options.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, options) {\r\n        return new Tab(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\r\n\n// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipu, $) {\r\n    var active = {};\r\n\r\n    var options = defaultOptions = {\r\n        distanceAllow: 10,   // 最大移动距离,超过移除效果\r\n        displayDelay: 100,  // 延时显示时间,以防止是滚动操作\r\n        hideDelay: 120,     // 隐藏延时时间\r\n        eventName: 'click', // 事件处理是click\r\n        activeClass: 'ui-active',   // 激活时的class\r\n        getHandleNode: function (node) {  // 找到最先一级处理此click事件的元素\r\n            if (!node || !node.nodeType) return;\r\n\r\n            var distNode = null;\r\n            var nodeArray = [];\r\n\r\n            // 还有其它情形考虑,如a标签的跳转,或在原生元素添加事件属性的\r\n            function findHander(inNode) {\r\n                // 此方法适用于jquery, 1.12.4, 2.2.4, 3.2.1版本,_data方法以后可能会被移除。$.data是一些老版本写法\r\n                var eventHandlers = ($._data || $.data)(inNode, 'events');\r\n\r\n                if (eventHandlers) {\r\n                    eventHandlers = eventHandlers[options.eventName];\r\n                }\r\n\r\n                if (!eventHandlers) {\r\n                    return;\r\n                }\r\n\r\n                var thisNode = false;\r\n                $.each(eventHandlers, function (index, handler) {\r\n                    if (handler.selector) {\r\n                        var objs = $(handler.selector, inNode);\r\n                        $.each(nodeArray, function (tIndex, tNode) {\r\n                            if (objs.is(tNode)) {\r\n                                distNode = tNode;\r\n                                return false;\r\n                            }\r\n                        });\r\n\r\n                        if (distNode) {\r\n                            return false; //\r\n                        }\r\n                    } else {\r\n                        thisNode = true;  // 保存distNode,有可能有子节点满足条件,所以只保存此值为默认值\r\n                    }\r\n                });\r\n\r\n                if (thisNode && distNode == null) { // 如果没在子节点找到click事件,而当前节点又有click事件,就使用当前节点\r\n                    distNode = inNode;\r\n                }\r\n\r\n                return distNode;\r\n            }\r\n\r\n            while (!(\"tagName\" in node) || !findHander(node)) {\r\n                if (!node.parentNode || node.parentNode.nodeType != 1) {\r\n                    break;\r\n                }\r\n                nodeArray.push(node);\r\n                node = node.parentNode;\r\n            }\r\n\r\n            return distNode;\r\n        }\r\n    };\r\n\r\n    function getOriginalEvent(e) {\r\n        return e.originalEvent || e;\r\n    }\r\n\r\n    function getXY(e) {\r\n        var x = e.touches ? e.touches[0].pageX : e.clientX;\r\n        var y = e.touches ? e.touches[0].pageY : e.clientY;\r\n        return [x, y];\r\n    }\r\n\r\n    //根据不同浏览器获取不同原生事件event\r\n    var hasTouch = \"ontouchstart\" in window,\r\n        START_EVENT = hasTouch ? 'touchstart' : 'mousedown',\r\n        MOVE_EVENT = hasTouch ? 'touchmove' : 'mousemove',\r\n        END_EVENT = hasTouch ? 'touchend' : 'mouseup',\r\n        CANCEL_EVENT = hasTouch ? 'touchcancel' : '';\r\n\r\n    $(function () {\r\n        var startXY, tapEl, timeOutID;\r\n        var dom = document.body;\r\n\r\n        // force为false的时候,不用管timeOutID,在老的timeOutID未移除的情况下,有可能又产生了新的,\r\n        // 导致else代码未被执行,导致老的点击元素class未被移除\r\n        function removeClass(dom, force) {\r\n            if (force && timeOutID) {\r\n                window.clearTimeout(timeOutID);\r\n            } else {\r\n                $(dom).removeClass(options.activeClass);\r\n            }\r\n        }\r\n\r\n        function removeActive(force) {\r\n            if (force) {\r\n                removeClass(tapEl, force);\r\n            } else {\r\n                window.setTimeout(removeClass, options.hideDelay, tapEl, force);\r\n            }\r\n            startXY = null;\r\n            tapEl = null;\r\n        }\r\n\r\n        $(dom).bind(START_EVENT, function (e) {\r\n            if (tapEl) {    // 多点接触时处理\r\n                removeActive(true);\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n            startXY = getXY(e);\r\n            tapEl = options.getHandleNode(e.target);\r\n\r\n            if (tapEl) {\r\n                timeOutID = window.setTimeout(function (dom) {\r\n                    timeOutID = null;\r\n                    $(dom).addClass(options.activeClass);\r\n                }, options.displayDelay, tapEl);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(MOVE_EVENT, function (e) {\r\n            if (!tapEl) {\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n\r\n            var xy = getXY(e);\r\n            if (startXY && (Math.abs(xy[0] - startXY[0]) > options.distanceAllow || Math.abs(xy[1] - startXY[1]) > options.distanceAllow)) {\r\n                removeActive(true);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(END_EVENT, function (e) {\r\n            if (tapEl) {\r\n                removeActive();\r\n            }\r\n        });\r\n\r\n        // 手机来电等非用户取消操作时触发事件\r\n        if (CANCEL_EVENT) {\r\n            $(dom).bind(CANCEL_EVENT, function (e) {\r\n                if (tapEl) {\r\n                    removeActive();\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    // 更新默认值\r\n    active.setOptions = function (opts) {\r\n        options = this.options = $.extend({}, defaultOptions, opts);\r\n    };\r\n    ipu.active = active;\r\n})(ipu || window, jQuery);\r\n\r\n\n/*===========================\r\nDevice/OS Detection\r\n===========================*/\r\n// from sui,但IPU框架的ua不是这样的\r\n;(function (ipu, $) {\r\n    \"use strict\";\r\n    var device = {};  // Classes\r\n    var classNames = [];\r\n    var ua = navigator.userAgent\r\n    \r\n    // 这中针对ipu框架的情况,待测试\r\n    if(ua.match(/ipumobile/i)){\r\n        device.ios =  !!ua.match(/ios/i);\r\n        device.android = !!ua.match(/android/i);\r\n    }else{\r\n        var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\r\n        var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\r\n        var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\r\n        var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\r\n\r\n        device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\r\n\r\n        // Android\r\n        if (android) {\r\n            device.os = 'android';\r\n            device.osVersion = android[2];\r\n            device.android = true;\r\n            device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\r\n        }\r\n        if (ipad || iphone || ipod) {\r\n            device.os = 'ios';\r\n            device.ios = true;\r\n        }\r\n        // iOS\r\n        if (iphone && !ipod) {\r\n            device.osVersion = iphone[2].replace(/_/g, '.');\r\n            device.iphone = true;\r\n        }\r\n        if (ipad) {\r\n            device.osVersion = ipad[2].replace(/_/g, '.');\r\n            device.ipad = true;\r\n        }\r\n        if (ipod) {\r\n            device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\r\n            device.iphone = true;\r\n        }\r\n        // iOS 8+ changed UA\r\n        if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\r\n            if (device.osVersion.split('.')[0] === '10') {\r\n                device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\r\n            }\r\n        }\r\n\r\n        // Webview\r\n        device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\r\n\r\n        // Minimal UI\r\n        if (device.os && device.os === 'ios') {\r\n            var osVersionArr = device.osVersion.split('.');\r\n            device.minimalUi = !device.webView &&\r\n                (ipod || iphone) &&\r\n                (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\r\n                $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\r\n        }\r\n\r\n        // Check for status bar and fullscreen app mode\r\n        var windowWidth = $(window).width();\r\n        var windowHeight = $(window).height();\r\n        device.statusBar = false;\r\n        if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\r\n            device.statusBar = true;\r\n        }\r\n        else {\r\n            device.statusBar = false;\r\n        }\r\n\r\n\r\n        // Pixel Ratio\r\n        device.pixelRatio = window.devicePixelRatio || 1;\r\n        classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\r\n        if (device.pixelRatio >= 2) {\r\n            classNames.push('retina');\r\n        }\r\n\r\n        // OS classes\r\n        if (device.os) {\r\n            classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\r\n            if (device.os === 'ios') {\r\n                var major = parseInt(device.osVersion.split('.')[0], 10);\r\n                for (var i = major - 1; i >= 6; i--) {\r\n                    classNames.push('ios-gt-' + i);\r\n                }\r\n            }\r\n\r\n        }\r\n        // Status bar classes\r\n        if (device.statusBar) {\r\n            classNames.push('with-statusbar-overlay');\r\n        }\r\n        else {\r\n            $('html').removeClass('with-statusbar-overlay');\r\n        }\r\n\r\n\r\n        // keng..\r\n        device.isWeixin = /MicroMessenger/i.test(ua);\r\n    }\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0){\r\n        $('html').addClass(classNames.join(' '));\r\n    }\r\n\r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n\n\r\n        // 初始化代码\r\n        jQuery(function () {\r\n            FastClick.attach(document.body);\r\n        });\r\n\r\n        return ipu;\r\n    }\r\n\r\n    // todo:可以添加一个和其它库的适配处理,\r\n    // 这里假设第三方库,jquery,iScroll,Hammer的史称已经固定\r\n    if ( typeof define === \"function\" && define.amd ) {\r\n        define(['jquery', 'iScroll', 'Hammer', 'FastClick'], function (jQuery, iScroll, Hammer, FastClick) {\r\n            return window.ipu = setup(jQuery, iScroll, Hammer, FastClick);\r\n        });\r\n    } else {\r\n        window.ipu = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n    }\r\n})();\r\n\r\n//# sourceMappingURL=ipu.js.map\r\n"]}

+ 1 - 1
ipuui/ipu/dist/js/ipu.js.map

@ -1 +1 @@
1
{"version":3,"sources":["ipu-prefix.js","carousel.js","dtPicker.js","hammerCarousel.js","modal.js","navBar.js","pages.js","picker.js","popPicker.js","progressBar.js","refresh.js","tab.js","tap.js","_device.js","ipu-suffix.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"ipu.js","sourcesContent":["(function () {\r\n    function setup(jQuery, iScroll, Hammer, FastClick) {\r\n        var ipu = {};\r\n","// Carousel\r\n(function (ipu, $, iscroll) {\r\n// carouselSlt应该是唯一的,否则怎么支撑多个回调,如果用户不需要多个回调,也不主动调用,则可以,先不管吧???\r\n    function Carousel(slt, options) {\r\n        this.options = options = $.extend({}, this.defaultOpt, options);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = options.autoPlay;\r\n         this.hasIndicator = options.indicator;\r\n        this.callBack = options.callBack;\r\n        this.currentIndex = null;\r\n\r\n        this._init();\r\n        this.play();\r\n    }\r\n\r\n    Carousel.prototype = {\r\n        defaultOpt: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            that = this;\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.hasIndicator) {\r\n                this._addIndicator();\r\n            }\r\n            $(window).resize(function () {\r\n                that.refresh();\r\n            });\r\n            var scrollOpt = {\r\n                snap: \"li\",          // carousel效果\r\n                momentum: false,     // 移除惯性处理\r\n                scrollX: true,       // X轴移动\r\n                scrollY:false,\r\n                hScrollbar: false,   // 没有纵向滚动条\r\n                onScrollStart: function () {\r\n                    that._pause();\r\n                },\r\n                onTouchEnd: function () {\r\n                    // 后面优化\r\n                    /*\r\n                     if (that.iscroll.currPageX == that.size - 1) {\r\n                     that.show(that.size - 2);\r\n                     }\r\n                     */\r\n                },\r\n                onScrollEnd: function () {\r\n                    that._end();\r\n                }\r\n            };\r\n            this.iscroll = new iscroll(this.el.get(0), scrollOpt);\r\n            this.show(this.options.index, 0);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.autoPlay=false;\r\n        },\r\n        _pause: function () {\r\n            if (this.autoPlay && this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            this.show(index);\r\n        },\r\n        next: function () {\r\n            var index = this.currentIndex == this.size - 1 ? 0 : this.currentIndex + 1;\r\n            this.show(index);\r\n        },\r\n        show: function (index, time) {\r\n            this._pause();\r\n            this.iscroll.scrollToPage(index, 0, time);\r\n        },\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        refresh: function () {\r\n            var that = this;\r\n            that.show(this.currentIndex);\r\n        },\r\n        _play: function () {\r\n            if (this.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    this.timeoutId = null;\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {\r\n            var currentIndex = this.iscroll.currPageX;\r\n            if (currentIndex != this.currentIndex) {\r\n                if (this.callBack) {\r\n                    this.callBack(currentIndex, this.currentIndex);\r\n                }\r\n                this.currentIndex = currentIndex;\r\n\r\n                if (this.hasIndicator) {\r\n                    this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this._play();\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        destroy: function () {\r\n            // 自己怎么销毁,相关事件移除??\r\n            this.iscroll.destroy();\r\n        }\r\n    };\r\n\r\n    ipu.carousel =  function (slt, options) {\r\n        return new Carousel(slt, options);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n","// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来运算\r\n\r\n\r\n    // show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n    // 日期范围的选择处理\r\n    function DtPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    DtPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker ui-dtpicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-clear\">清除</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-title\">\\\r\n                            <label class=\"ui-dtpicker-y\"></label>\\\r\n                            <label class=\"ui-dtpicker-m\"></label>\\\r\n                            <label class=\"ui-dtpicker-d\"></label>\\\r\n                            <label class=\"ui-dtpicker-h\"></label>\\\r\n                            <label class=\"ui-dtpicker-mi\"></label>\\\r\n                        </div>\\\r\n                        <div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                            <div class=\"ui-picker\" data-id=\"picker-y\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-m\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-d\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-h\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-mi\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                        </div>\\\r\n                    </div>',\r\n        buttons: ['取消', '确认', '清除'],\r\n        labels: ['年', '月', '日', '时', '分'],\r\n        type: 'datetime',       // date, time, datetime, hour, month\r\n        customData: {},  // 自定义数据\r\n        hasClear: false,    // 是否显示清除按钮\r\n        callBack: function () { // 选择数据时的回调函数\r\n        }\r\n        // beginDate: Date类型,或毫秒值\r\n        // endDate: 同上\r\n    };\r\n\r\n    DtPicker.prototype._init = function () {\r\n        var self = this;\r\n        this.mask = this.createMask();\r\n\r\n        var _picker = this.holder = $(this.options.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ui-poppicker-btn-ok', _picker),\r\n            cancel: $('.ui-poppicker-btn-cancel', _picker),\r\n            clear: $('.ui-poppicker-btn-clear', _picker),\r\n            buttons: $('.ui-poppicker-header .ui-btn', _picker),\r\n            labels: $('.ui-poppicker-title label', _picker)\r\n        };\r\n\r\n\r\n        ui.i = new Picker($('[data-id=\"picker-mi\"]', _picker), {listen: false}); // 分钟变更无需要处理\r\n\r\n        ui.h = new Picker($('[data-id=\"picker-h\"]', _picker), {         // 小时变更,有最小值或最大值,需要变更分钟\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createMinutes();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.d = new Picker($('[data-id=\"picker-d\"]', _picker), { //仅提供了beginDate时,触发day,hours,minutes的change\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createHours();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.m = new Picker($('[data-id=\"picker-m\"]', _picker), { // 月变更时,总要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null) {\r\n                    self._createDay();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.y = new Picker($('[data-id=\"picker-y\"]', _picker), { // 年发生变更,如果没有结束月,此时有所有的月,是不需要变更月的,只需要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index != null) {\r\n                    if (self.options.beginMonth || self.options.endMonth) {\r\n                        self._createMonth();\r\n                    } else {\r\n                        self._createDay();\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n\r\n\r\n\r\n        self._create();\r\n\r\n        var ui = self.ui;\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.options.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.options.value);\r\n\r\n        //防止滚动穿透 TODO:待确认情况\r\n        /* self.ui.picker.addEventListener($.EVENT_START, function (event) {\r\n         event.preventDefault();\r\n         }, false);\r\n         self.ui.picker.addEventListener($.EVENT_MOVE, function (event) {\r\n         event.preventDefault();\r\n         }, false);*/\r\n    };\r\n\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.options.type;\r\n        var selected = {\r\n            type: type,\r\n            y: ui.y.getSelectedItem(),\r\n            m: ui.m.getSelectedItem(),\r\n            d: ui.d.getSelectedItem(),\r\n            h: ui.h.getSelectedItem(),\r\n            i: ui.i.getSelectedItem(),\r\n            toString: function () {\r\n                return this.value;\r\n            }\r\n        };\r\n        switch (type) {\r\n            case 'datetime':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'date':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text;\r\n                break;\r\n            case 'time':\r\n                selected.value = selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'month':\r\n                selected.value = selected.y.value + '-' + selected.m.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text;\r\n                break;\r\n            case 'hour':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text;\r\n                break;\r\n        }\r\n        return selected;\r\n    };\r\n\r\n    DtPicker.prototype._setSelectedValue = function (value) {\r\n        var self = this;\r\n        var ui = self.ui;\r\n\r\n        if(!value){\r\n            if(this.options.type == 'time'){\r\n                value = '00:00';\r\n            }else{\r\n                value = defaultPickerDate.getFullYear()+'-'+(defaultPickerDate.getMonth()+1)+'-'+defaultPickerDate.getDate()+' '\r\n                    + defaultPickerDate.getHours() + ':' + defaultPickerDate.getMinutes();\r\n            }\r\n        }\r\n        var parsedValue = self._parseSetValue(value);\r\n\r\n        ui.y.setListen(true);\r\n        ui.m.setListen(false);\r\n        ui.d.setListen(false);\r\n        ui.h.setListen(false);\r\n        ui.i.setListen(false);\r\n        ui.y.setSelectedValue(parsedValue.y);\r\n\r\n        ui.m.setListen(true);\r\n        ui.m.setSelectedValue(parsedValue.m);\r\n\r\n        ui.d.setListen(true);\r\n        ui.d.setSelectedValue(parsedValue.d);\r\n\r\n        ui.h.setListen(true);\r\n        ui.h.setSelectedValue(parsedValue.h);\r\n\r\n        ui.i.setListen(true);\r\n        ui.i.setSelectedValue(parsedValue.i);\r\n\r\n        this.value = this.getSelected().value;\r\n    };\r\n\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    DtPicker.prototype.isLeapYear = function (year) {\r\n        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);\r\n    };\r\n\r\n    DtPicker.prototype._inArray = function (array, item) {\r\n        for (var index in array) {\r\n            var _item = array[index];\r\n            if (_item === item) return true;\r\n        }\r\n        return false;\r\n    };\r\n\r\n    DtPicker.prototype.getDayNum = function (year, month) {\r\n        var self = this;\r\n        if (self._inArray([1, 3, 5, 7, 8, 10, 12], month)) {\r\n            return 31;\r\n        } else if (self._inArray([4, 6, 9, 11], month)) {\r\n            return 30;\r\n        } else if (self.isLeapYear(year)) {\r\n            return 29;\r\n        } else {\r\n            return 28;\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype._fill = function (num) {\r\n        num = num.toString();\r\n        if (num.length < 2) {\r\n            num = 0 + num;\r\n        }\r\n        return num;\r\n    };\r\n\r\n    DtPicker.prototype._isBeginYear = function () {\r\n        return this.options.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.options.beginMonth && this._isBeginYear() && this.options.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.options.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.options.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.options.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.options.endMonth && this._isEndYear() && this.options.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.options.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.options.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (options.customData.y) {\r\n            yArray = options.customData.y;\r\n        } else {\r\n            var yBegin = options.beginYear;\r\n            var yEnd = options.endYear;\r\n            for (var y = yBegin; y <= yEnd; y++) {\r\n                yArray.push({\r\n                    text: y + '',\r\n                    value: y\r\n                });\r\n            }\r\n        }\r\n        ui.y.setItems(yArray);\r\n        //ui.y.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMonth = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (options.customData.m) {\r\n            mArray = options.customData.m;\r\n        } else {\r\n            var m = options.beginMonth && self._isBeginYear() ? options.beginMonth : 1;\r\n            var maxMonth = options.endMonth && self._isEndYear() ? options.endMonth : 12;\r\n            for (; m <= maxMonth; m++) {\r\n                var val = self._fill(m);\r\n                mArray.push({\r\n                    text: val,\r\n                    value: m\r\n                });\r\n            }\r\n        }\r\n        ui.m.setItems(mArray);\r\n        //ui.m.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createDay = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (options.customData.d) {\r\n            dArray = options.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? options.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? options.endDay : self.getDayNum(parseInt(this.ui.y.getSelectedValue()), parseInt(this.ui.m.getSelectedValue()));\r\n            for (; d <= maxDay; d++) {\r\n                var val = self._fill(d);\r\n                dArray.push({\r\n                    text: val,\r\n                    value: d\r\n                });\r\n            }\r\n        }\r\n        ui.d.setItems(dArray);\r\n        //current = current || ui.d.getSelectedValue();\r\n        //ui.d.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createHours = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (options.customData.h) {\r\n            hArray = options.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? options.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? options.endHours : 23;\r\n            for (; h <= maxHours; h++) {\r\n                var val = self._fill(h);\r\n                hArray.push({\r\n                    text: val,\r\n                    value: h\r\n                });\r\n            }\r\n        }\r\n        ui.h.setItems(hArray);\r\n        //ui.h.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMinutes = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (options.customData.i) {\r\n            iArray = options.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? options.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? options.endMinutes : 59;\r\n            for (; i <= maxMinutes; i++) {\r\n                var val = self._fill(i);\r\n                iArray.push({\r\n                    text: val,\r\n                    value: i\r\n                });\r\n            }\r\n        }\r\n        ui.i.setItems(iArray);\r\n        //ui.i.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._setLabels = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = options.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.cancel.text(options.buttons[0]);\r\n        ui.ok.text(options.buttons[1]);\r\n\r\n        if(options.hasClear){\r\n            ui.clear.text(options.buttons[2])\r\n        }else{\r\n            ui.clear.hide();\r\n        }\r\n\r\n        ui.buttons.each(function (index) {\r\n            $(this).click(function () {\r\n                self.clickCall(index);\r\n            })\r\n        })\r\n    };\r\n\r\n    // 解析设置的值,目前是字符串,完整日期格式 2012-12-12 12:21\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.options.type;\r\n\r\n        var rs = {\r\n            y: now.getFullYear(),\r\n            m: now.getMonth()+1,\r\n            d: now.getDate(),\r\n            h: now.getHours(),\r\n            i: now.getMinutes()\r\n        };\r\n\r\n        if(value instanceof Date){\r\n            if( type == 'time'){\r\n                valu= +value.getHours()+\":\"+value.getMinutes();\r\n            }else{\r\n                value = value.getFullYear()+'-'+(value.getMonth()+1)+'-'+value.getDate()+ ' '\r\n                    +value.getHours()+\":\"+value.getMinutes();\r\n            }\r\n        }\r\n\r\n        var parts = value.replace(\":\", \"-\").replace(\" \", \"-\").split(\"-\");\r\n        for(var i=0, j=parts.length; i<j; i++){\r\n            parts[i] = parseInt(parts[i]);\r\n        }\r\n\r\n        if(type == 'datetime'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = parts[4];\r\n        }else if(type == 'date'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }else if(type == 'time'){\r\n            rs.h = parts[0];    //\r\n            rs.i = parts[1];\r\n        }else if(type == 'hour'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = 0;\r\n        }else if(type == 'month'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = 1;    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }\r\n\r\n        return rs;\r\n    };\r\n\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var options = this.options;\r\n        var now = defaultPickerDate;\r\n\r\n        var beginDate = options.beginDate;\r\n        if(beginDate){\r\n            beginDate = this._parseSetValue(beginDate);\r\n            options.beginYear = beginDate.y;\r\n            options.beginMonth = beginDate.m;\r\n            options.beginDay = beginDate.d;\r\n            options.beginHours = beginDate.h;\r\n            options.beginMinutes = beginDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.beginYear =  now.getFullYear();\r\n            options.beginMonth = now.getMonth() + 1;\r\n            options.beginDay = now.getDate();\r\n            options.beginHours = 0;\r\n            options.beginMinutes = 0;\r\n        }else {\r\n            options.beginYear =  now.getFullYear() - 5;\r\n        }\r\n\r\n        var endDate = options.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            options.endYear = endDate.y;\r\n            options.endMonth = endDate.m;\r\n            options.endDay = endDate.d;\r\n            options.endHours = endDate.h;\r\n            options.endMinutes = endDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.endYear =  now.getFullYear();\r\n            options.endMonth = now.getMonth() + 1;\r\n            options.endDay = now.getDate();\r\n            options.endHours = 24;\r\n            options.endMinutes = 59;\r\n        }else {\r\n            options.endYear =  options.beginYear + 10 ;\r\n        }\r\n\r\n        //生成\r\n        self._createYear();\r\n        self._createMonth();\r\n        self._createDay();\r\n        self._createHours();\r\n        self._createMinutes();\r\n    };\r\n\r\n    // 更新选择框,更新当前值\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.options.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    // 判断最大最小值合理性\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.options.endDate = date;\r\n        this._create();\r\n    };\r\n\r\n    DtPicker.prototype.dispose = function () {\r\n        var self = this;\r\n        self.hide();\r\n        setTimeout(function () {\r\n            self.ui.picker.parentNode.removeChild(self.ui.picker);\r\n            for (var name in self) {\r\n                self[name] = null;\r\n                delete self[name];\r\n            }\r\n            self.disposed = true;\r\n        }, 300);\r\n    };\r\n\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    DtPicker.prototype.clickCall = function(index){\r\n        var self = this;\r\n        var sltDate = self.getSelected();\r\n        var rs = self.options.callBack.call(this , sltDate, index);\r\n        if (rs !== false) {\r\n            if(index == 1){ // 假定确认按钮在第二个位置,传回true则存储当前值\r\n                self.value = sltDate.value;\r\n            }else if(index == 2){\r\n                self.value = null;\r\n            }\r\n            self.hide();\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    DtPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.clickCall(0);\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.dtPicker = function(options){\r\n        return new DtPicker(options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","// 支持非循环\r\n// size命名用的有点混淆。。\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n\r\n(function (ipu, $, Hammer) {\r\n    function HammerCarousel(navSlt, options) {\r\n        this.options = options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(navSlt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    // 直接替换掉了prototype对象,可能不是个好选择\r\n    HammerCarousel.prototype = {\r\n        defaultOptions: {\r\n            index: null,        // 默认显示第几个项,其实挺没用的,默认显示第一个,用户再调用一下显示第几个,作用一样现在。\r\n            autoPlay: false,    // 是否自动轮播\r\n            duration: 3000,     // 轮播间隔\r\n            indicator: false,  //是否生成指示器,即小点点\r\n            callBack: null,  // 轮播后回调函数\r\n            clickBack: null   // 各子项用户点击事件\r\n            //indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\r\n\r\n\r\n            this.showSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n            this.carouselItemSizes = [];\r\n            this.currentIndex = 0;\r\n            this.moveLen = 0;\r\n            this.lastItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来判断是复制项\r\n\r\n            // 这里假设每个元素都是相等的\r\n            this.carouselItems.slice(0, this.showSize).clone().appendTo(this.wrapper); // 如果做无限循环则要这样处理\r\n            this.size = this.carouselItems.size();\r\n\r\n            var self = this;\r\n            if(this.options.clickBack){\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        self.options.clickBack.call(this, i%self.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this.sizeCount();\r\n            var that = this;\r\n\r\n            this.hammer = new Hammer.Manager(this.el); // 避免因为li里面的内容高度不够,而不能触发相关事件\r\n            this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_HORIZONTAL, threshold: 10}));\r\n            this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this.onPan, this));\r\n\r\n            $(window).resize(function () { // 在尺寸变化时,处理,是否可以考虑只在宽度变化时处理,横屏事件?\r\n                that.refresh();\r\n            });\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.options.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.options.index);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.options.autoPlay = false;\r\n        },\r\n        _pause: function () {\r\n            if (this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            if (index == this.size - 1) {\r\n                this._show(this.size, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        next: function () {//下一张\r\n            var index = this.currentIndex == this.size ? 1 : this.currentIndex + 1;\r\n            if (index == 1) {\r\n                this._show(0, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % size;\r\n            if(index < 0 ){\r\n                index = size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        play: function () {\r\n            this.options.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.options.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    that.timeoutId = null;//清空这个timeoutId,代表该次处理已经执行了\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {//移动结束时调用\r\n            var currentIndex = this.currentIndex;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n\r\n            this._play();//处理自动播放\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        sizeCount: function () {\r\n            this.wrapperSize = this.wrapper.outerWidth(true);\r\n            this.itemSize = this.carouselItems.eq(0).outerWidth(true);\r\n            this.mostSize = this.size * this.itemSize; // 宽度*数量\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\").width();\r\n\r\n            var that = this;\r\n            $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n                that.carouselItemSizes[index] = $(this).position().left;\r\n            });\r\n        },\r\n        refresh: function () {\r\n            if (this.wrapperSize != this.wrapper.outerWidth(true)) {\r\n                this.sizeCount();\r\n                this._show(this.currentIndex, true); //新的位置\r\n            }\r\n        },\r\n        move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\");\r\n            var move = (this.moveLen - moveLen) % this.mostSize;\r\n            move = (move + this.mostSize) % this.mostSize;\r\n            this.displayMoveLen = move;\r\n\r\n            move = -move + \"px\";\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        },\r\n        _show: function (index, animate) { // 知道最终移动到的项时,调用\r\n            if (animate !== false) { // 默认值为true\r\n                animate = true;\r\n            }\r\n\r\n            this._pause();\r\n            $(this.wrapper).toggleClass(\"ui-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            //this.currentIndex = index;\r\n            this.lastItem = index == this.size;\r\n            var move = this.carouselItemSizes[index];\r\n            this.moveLen = move;\r\n            move = -move + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n            if (animate) {\r\n                this._end();\r\n            }\r\n        },\r\n        onPan: function (ev) {\r\n            var delta = ev.deltaX;\r\n            // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n            if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n                var value = delta / this.itemSize;\r\n                var intValue = parseInt(Math.abs(value));               // 取整数\r\n                var decimal = Math.abs(value) % 1;                   // 取小数\r\n\r\n                if (decimal > 0.2) { // 滑动超过页面宽20%;\r\n                    intValue = intValue + 1;\r\n                }\r\n                if (value > 0) {\r\n                    intValue = -intValue;\r\n                }\r\n\r\n                var index = (this.currentIndex + intValue) % this.size;\r\n                index = (index + this.size) % this.size; // 因为可能是个负值,转换成正值\r\n\r\n                // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n                if (index == 0 && this.displayMoveLen > this.itemSize) {\r\n                    index = this.size;\r\n                }\r\n                this._show(index);\r\n            } else if (ev.type == 'panmove'){\r\n                this.move(delta);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.hammerCarousel = function (slt, options) {\r\n        return new HammerCarousel(slt, options);\r\n    };\r\n})(ipu || window, jQuery,  Hammer);\r\n","(function (ipu, $) {\r\n    //$ extends\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        // console.log('__dealCssEvent');\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            /*jshint validthis:true */\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.transitionEnd = function (callback) {\r\n        // console.log('transitionEnd');\r\n        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalStack: true,\r\n        modalButtonOk: '确定',\r\n        modalButtonCancel: '取消',\r\n        modalPreloaderTitle: '加载中',\r\n        modalContainer: document.body ? document.body : 'body'\r\n    };\r\n\r\n    ipu.modalStack = [];\r\n\r\n    ipu.modalStackClearQueue = function () {\r\n        if (ipu.modalStack.length) {\r\n            (ipu.modalStack.shift())();\r\n        }\r\n    };\r\n    ipu.modal = function (params) {\r\n        params = params || {};\r\n        var modalHTML = '';\r\n        var buttonsHTML = '';\r\n        if (params.buttons && params.buttons.length > 0) {\r\n            for (var i = 0; i < params.buttons.length; i++) {\r\n                buttonsHTML += '<span class=\"ui-modal-button' + (params.buttons[i].bold ? ' ui-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\r\n            }\r\n        }\r\n        var extraClass = params.extraClass || '';\r\n        var titleHTML = params.title ? '<div class=\"ui-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ui-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ui-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ui-modal-buttons-vertical' : '';\r\n        modalHTML = '<div class=\"ui-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ui-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ui-modal-buttons ' + verticalButtons + '\">' + buttonsHTML + '</div></div>';\r\n\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n\r\n        var modal = $(_modalTemplateTempDiv).children();\r\n\r\n        $(defaults.modalContainer).append(modal[0]);\r\n\r\n        // Add events on buttons\r\n        modal.find('.ui-modal-button').each(function (index, el) {\r\n            $(el).on('click', function (e) {\r\n                if (params.buttons[index].close !== false) ipu.closeModal(modal);\r\n                if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\r\n                if (params.onClick) params.onClick(modal, index);\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n    ipu.alert = function (text, title, callbackOk) {\r\n        if (typeof title === 'function') {\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\r\n        });\r\n    };\r\n    ipu.confirm = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [\r\n                {text: defaults.modalButtonCancel, omodalButtonCancelnClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n    ipu.prompt = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            afterText: '<input type=\"text\" class=\"ui-modal-text-input\">',\r\n            buttons: [\r\n                {\r\n                    text: defaults.modalButtonCancel\r\n                },\r\n                {\r\n                    text: defaults.modalButtonOk,\r\n                    bold: true\r\n                }\r\n            ],\r\n            onClick: function (modal, index) {\r\n                if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ui-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ui-modal-text-input').val());\r\n            }\r\n        });\r\n    };\r\n\r\n    var minLoad = false;        // 是否最小时间调用方式\r\n    var loadOverTime = false;   // 是否超过最小调用时间\r\n    var loadEnd = false;        // 是否调用结束\r\n    var loadTimeOut = null;     // 延时调用ID\r\n\r\n    ipu.showPreloader = function (title, minTime) {\r\n        ipu.hidePreloader(true);\r\n\r\n        ipu.showPreloader.preloaderModal = ipu.modal({\r\n            title: title || defaults.modalPreloaderTitle,\r\n            text: '<div class=\"ui-preloader\"></div>'\r\n        });\r\n\r\n        if(minTime){\r\n            minLoad = true;\r\n            loadTimeOut = setTimeout(function () {\r\n                loadOverTime = true;\r\n                if(loadEnd){\r\n                    ipu.hidePreloader();\r\n                }\r\n            }, minTime);\r\n        }\r\n\r\n        return ipu.showPreloader.preloaderModal;\r\n    };\r\n    ipu.hidePreloader = function (force) {\r\n        if(force || !minLoad || (minLoad && loadOverTime)){\r\n            if(force && loadTimeOut){\r\n                window.clearTimeout(loadTimeOut);\r\n            }\r\n            ipu.showPreloader.preloaderModal && ipu.closeModal(ipu.showPreloader.preloaderModal);\r\n            minLoad = false; // 重置各标志位\r\n            loadOverTime = false;\r\n            loadEnd = false;\r\n            loadTimeOut = null;\r\n        }else{\r\n            loadEnd = true;\r\n        }\r\n    };\r\n    ipu.showIndicator = function () {\r\n        if ($('.ui-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ui-preloader-indicator-overlay\"></div><div class=\"ui-preloader-indicator-modal\"><span class=\"ui-preloader ui-preloader-white\"></span></div>');\r\n    };\r\n    ipu.hideIndicator = function () {\r\n        $('.ui-preloader-indicator-overlay, .ui-preloader-indicator-modal').remove();\r\n    };\r\n    // Action Sheet\r\n    ipu.actions = function (params) {\r\n        var modal, groupSelector, buttonSelector;\r\n        params = params || [];\r\n\r\n        if (params.length > 0 && !$.isArray(params[0])) {\r\n            params = [params];\r\n        }\r\n        var modalHTML;\r\n        var buttonsHTML = '';\r\n        for (var i = 0; i < params.length; i++) {\r\n            for (var j = 0; j < params[i].length; j++) {\r\n                if (j === 0) buttonsHTML += '<div class=\"ui-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ui-actions-modal-label' : 'ui-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ui-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ui-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ui-bg-' + button.bg;\r\n                if (button.disabled) buttonClass += ' disabled';\r\n                buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\r\n                if (j === params[i].length - 1) buttonsHTML += '</div>';\r\n            }\r\n        }\r\n        modalHTML = '<div class=\"ui-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ui-actions-modal-group';\r\n        buttonSelector = '.ui-actions-modal-button';\r\n\r\n        var groups = modal.find(groupSelector);\r\n        groups.each(function (index, el) {\r\n            var groupIndex = index;\r\n            $(el).children().each(function (index, el) {\r\n                var buttonIndex = index;\r\n                var buttonParams = params[groupIndex][buttonIndex];\r\n                var clickTarget;\r\n                if ($(el).is(buttonSelector)) clickTarget = $(el);\r\n                // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\r\n\r\n                if (clickTarget) {\r\n                    clickTarget.on('click', function (e) {\r\n                        if (buttonParams.close !== false) ipu.closeModal(modal);\r\n                        if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n                    });\r\n                }\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n\r\n    //显示一个消息,会在2秒钟后自动消失\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ui-modal ui-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n        ipu.openModal($toast, function () {\r\n            setTimeout(function () {\r\n                ipu.closeModal($toast);\r\n            }, duration || 2000);\r\n        });\r\n    };\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isNotToast = !modal.hasClass('ui-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n        if ($('.ui-modal.ui-modal-in:not(.ui-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\r\n            ipu.modalStack.push(function () {\r\n                ipu.openModal(modal, cb);\r\n            });\r\n            return;\r\n        }\r\n        var isPopup = modal.hasClass('ui-popup');\r\n        var isLoginScreen = modal.hasClass('ui-login-screen');\r\n        var isPickerModal = modal.hasClass('ui-picker-modal');\r\n        var isToast = modal.hasClass('ui-toast');\r\n        if (isModal) {\r\n            modal.show();\r\n            modal.css({\r\n                marginTop: -Math.round(modal.outerHeight() / 2) + 'px'\r\n            });\r\n        }\r\n        if (isToast) {\r\n            modal.css({\r\n                marginLeft: -Math.round(modal.outerWidth() / 2 ) + 'px' //1.185 是初始化时候的放大效果\r\n            });\r\n        }\r\n\r\n        var overlay;\r\n        if (!isLoginScreen && !isPickerModal && !isToast) {\r\n            if ($('.ui-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ui-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        }\r\n\r\n        //Make sure that styles are applied, trigger relayout;\r\n        var clientLeft = modal[0].clientLeft;\r\n\r\n        // Trugger open event\r\n        modal.trigger('open');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).addClass('ui-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('ui-modal-overlay-visible');\r\n        modal.removeClass('ui-modal-out').addClass('ui-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n        });\r\n        // excute callback\r\n        if (typeof cb === 'function') {\r\n            cb.call(this);\r\n        }\r\n        return true;\r\n    };\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ui-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isPopup = modal.hasClass('ui-popup'),\r\n            isToast = modal.hasClass('ui-toast'),\r\n            isLoginScreen = modal.hasClass('ui-login-screen'),\r\n            isPickerModal = modal.hasClass('ui-picker-modal'),\r\n            removeOnClose = modal.hasClass('ui-remove-on-close'),\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ui-popup.ui-modal-in').length) {\r\n                overlay.removeClass('ui-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ui-modal-overlay-visible');\r\n        }\r\n        modal.trigger('close');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).removeClass('ui-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ui-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ui-modal-in').addClass('ui-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ui-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ui-modal-out').hide();\r\n                if (removeOnClose && modal.length > 0) {\r\n                    modal.remove();\r\n                }\r\n            }\r\n            else {\r\n                modal.remove();\r\n            }\r\n        });\r\n        if (isModal && defaults.modalStack) {\r\n            ipu.modalStackClearQueue();\r\n        }\r\n\r\n        return true;\r\n    };\r\n    function handleClicks(e) {\r\n        /*jshint validthis:true */\r\n        var clicked = $(this);\r\n        var url = clicked.attr('href');\r\n\r\n\r\n        //Collect Clicked data- attributes\r\n       /* var clickedData = clicked.dataset();\r\n\r\n        // Popup\r\n        var popup;\r\n        if (clicked.hasClass('ui-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ui-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ui-modal-overlay')) {\r\n            if ($('.ui-modal.ui-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ui-modal.ui-modal-in');\r\n            if ($('.ui-actions-modal.ui-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ui-actions-modal.ui-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ui-popup-overlay')) {\r\n            if ($('.ui-popup.ui-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ui-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ui-modal-overlay, .ui-popup-overlay, .ui-close-popup, .ui-open-popup, .ui-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n    NavBar.prototype.defaultOpt = {\r\n        animate: false,           // 默认有动画\r\n        contentSlt: \".ui-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) { // currentIndex: 当前索引,lastIndex上一次索引(第一次时为null)\r\n        }\r\n    };\r\n\r\n    function NavBar(slt, options) {\r\n        this.options = $.extend({}, this.defaultOpt, options);\r\n        this.content = $(this.options.contentSlt);\r\n        this.nav = $(slt);\r\n        this.wrapper = $(\">ul\", this.content);\r\n        this.contents = $(\">li\", this.wrapper);\r\n        this.navs = $(\">a\", this.nav);\r\n        var me = this;\r\n\r\n        var activeIndex = this.navs.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.options.animate) {\r\n            this.wrapper.addClass(\"ui-no-animation\")\r\n        }\r\n\r\n        this.navs.each(function (index, i) {\r\n            $(this).click(function () {\r\n                me.show(index);\r\n            });\r\n        });\r\n\r\n        this.lastIndex = null;\r\n        this.currentIndex = null;\r\n        me.show(this.options.index);\r\n    }\r\n\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            var currentContent = $(this.contents[index]).addClass(\"ui-show\");\r\n\r\n            if (this.options.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ui-show\"); // 隐藏上上个元素\r\n                }\r\n\r\n                if (this.currentIndex != null) {        // 非第一次需要动画效果\r\n                    if (this.currentIndex < index) {   // 需要内容为往左走,显示右边的内容\r\n                        if (this.lastIndex != null && this.lastIndex < this.currentIndex) {  // 内容已经左走过了,则需要移除动画复原位置,再通过width()方法强制生效\r\n                            this.wrapper.addClass(\"ui-no-animation\").removeClass(\"ui-nav-content-right\").width(); // 可以强制刷新,默认jquery应该会将这些dom上的修改延时处理?\r\n                        }\r\n                    } else {\r\n                        if (this.lastIndex == null || this.lastIndex > this.currentIndex) { // 类似同上\r\n                            this.wrapper.addClass(\"ui-no-animation\").addClass(\"ui-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ui-no-animation\").toggleClass(\"ui-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ui-show\");\r\n            }\r\n\r\n            // 更新class,ui-current状态\r\n            $(this.contents[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n            $(this.navs[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.navBar = function (slt, options) {\r\n        return new NavBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\n    function __dealCssEvent(eventNameArr, callback) {\n        var events = eventNameArr,\n            i, dom = this;// jshint ignore:line\n\n        function fireCallBack(e) {\n            if (e.target !== this) return;\n            callback.call(this, e);\n            for (i = 0; i < events.length; i++) {\n                dom.off(events[i], fireCallBack);\n            }\n        }\n\n        if (callback) {\n            for (i = 0; i < events.length; i++) {\n                dom.on(events[i], fireCallBack);\n            }\n        }\n    }\n\n    $.fn.animationEnd = function (callback) {\n        __dealCssEvent.call(this, ['webkitAnimationEnd', 'animationend'], callback);\n        return this;\n    };\n\n    function submitForm(doc, url ,params){\n        var form = doc.createElement(\"form\");\n        form.action = url;\n        form.method = \"post\";\n        form.style.display = \"none\";\n\n        for (var x in params) {\n            var ele = doc.createElement(\"input\");\n            ele.type=\"hidden\";\n            ele.name = x;\n            ele.value =  params[x];\n            form.appendChild(ele);\n        }\n\n        doc.body.appendChild(form);\n        form.submit();\n    }\n\n    // 检查是否有ui-pages的结构\n    function checkPages() {\n        if(!hasPages){\n            pagesObj = $(\".ui-pages\"); // pagesObj为空则进行jquery取值\n            if(pagesObj.size() == 0){\n                pagesObj =  $(\"<div class='ui-pages'><div class='ui-page ui-show \"+zeroPageClass+\"' id='\"+pageIdPrefix+\"0'></div>\").appendTo(\"body\");\n            }\n            hasPages = true;\n        }\n    }\n\n    // 站位页面\n    function isZeroPage(page) {\n        return $(page).hasClass(zeroPageClass);\n    }\n\n    var page = {};\n    var hasPages = false;\n    var maps = {};\n    var pageNo = 1; // 编号0留给主页面或当前页面,或没有\n    var pageIdPrefix = \"ipuPage-\";\n    var pagesObj = null;\n    var animateInClass = \"ui-anim ui-slideRightIn\";\n    var animateOutClass  = \"ui-anim ui-slideRightOut\";\n    var eventName = \"ipuUIPageBack\";\n    var zeroPageClass = 'ui-page-zero';   // 占位页面,对于为当前页面\n    var zeroPagesClass = 'ui-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\n\n\n\n    page.options = {     // 那个窗口执行open,默认父窗口\n        target: window.parent, // 默认执行父窗口,方法:all\n        backIndex: -1,    // 默认回退一页         方法:back\n        closeIndex: -1,   // 默认关闭最近一个页面 方法:close\n        params:{},        // post的传参            方法:post\n        animate: true,     // 是否动画效果        方法:open post\n        showLoading: true,   // 是否显示加载消息  方法:open post\n        loadingMessage: '正在加载中',  //          方法:open post\n        method : null,     // 请求方式,内置参数,方法自己设置,用户不需要设置  方法:无\n        minMessageTime: 500, // 最小显示加载时间,避免出现闪现的情况 方法:open post\n        data: null,         // 回退时,回传参数, 方法:back\n        pageName: '',     // 给打开的页面命名,以便根据此页面名称来切换页面 方法:open post back close\n        callBack:function () { // 事件回调       方法:open post close back\n        }\n    };\n\n    // 当前页面加载,针对顶层父窗口\n    page.openPage = function (url, options) {\n        var newPage = null;\n        var nowPageNo = pageIdPrefix + (pageNo++);\n        maps[nowPageNo] = url;\n\n        checkPages();\n\n        if(options.showLoading){\n            ipu.showPreloader(options.loadingMessage, options.minMessageTime);\n        }\n\n        if(options.method == 'post'){\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe'></iframe></div>\");\n        }else{\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe' src='\"+url+\"'></iframe></div>\");\n        }\n\n        var zeroPage = isZeroPage($(\".ui-page:last\", pagesObj));\n        var animatePage = newPage;\n        if(zeroPage){\n            animatePage = pagesObj.addClass(zeroPagesClass);\n        }\n\n        function end() {\n            if(options.showLoading) {\n                ipu.hidePreloader();\n            }\n\n            if(options.animate) {\n                animatePage.removeClass(animateInClass);\n            }\n\n            newPage.siblings(\".ui-show\").removeClass('ui-show');\n            if(options.callBack){\n                options.callBack();\n            }\n        }\n\n        $(\".ui-page-iframe\", newPage).one('load', function () {\n            newPage.addClass(\"ui-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\n\n            if(zeroPage){\n                animatePage.removeClass(zeroPagesClass);\n            }\n            if(options.animate){\n                animatePage.addClass(animateInClass).animationEnd(end);\n            }else{\n                end();\n            }\n        });\n\n        newPage.appendTo(pagesObj);\n        if(options.method == 'post') {\n            var pageDoc = $(\".ui-page-iframe\", newPage)[0].contentDocument;\n            submitForm(pageDoc, url, options.params);\n        }\n    };\n\n    // post方式加载页面\n    page.postPage = function (url, options) {\n        options.method = 'post';\n        page.openPage(url, options);\n    };\n\n    // 当前页面后退,针对顶层父窗口\n    page.backPage = function (options) {\n        var backIndex = options.backIndex;\n        var page = null;\n        var nowPage = $(\".ui-page.ui-show\", pagesObj);\n\n        if(options.pageName){\n            page =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj);\n        }else if(backIndex == 0){\n            page = $(\".ui-page:first\", pagesObj);\n        }else { // 越界的情况\n            var prevPage = nowPage.prevAll(\".ui-page\");\n            if(backIndex < 0){\n                page= $(prevPage[-backIndex - 1]);\n            }else{\n                page= $(prevPage[prevPage.size() - backIndex]);\n            }\n        }\n\n        var animatePage = nowPage;\n        var zeroPage = isZeroPage(page);\n\n        // 主页面模式时\n        if(zeroPage){\n            animatePage = pagesObj;\n        }else{\n            page.addClass(\"ui-show\"); //显示前一个\n        }\n\n        function end (){\n            $(this).removeClass(animateOutClass);\n            page.nextAll(\".ui-page\").remove();\n\n            var iframe = $(\".ui-page-iframe\", page);\n            var nowDoc;\n\n            if(iframe.size() == 0){ // 找不到子窗口就当是返回了主页面,在当前窗口触发\n                nowDoc = window.document;\n            }else{\n                nowDoc = iframe[0].contentDocument;\n            }\n\n            if(zeroPage){\n                pagesObj.addClass(zeroPagesClass);\n            }\n\n            var evt = nowDoc.createEvent('Event');\n            evt.initEvent(eventName, true, true);\n            if(options.data){\n                evt.data = options.data;\n            }\n            nowDoc.body.dispatchEvent(evt);\n            if(options.callBack){\n                options.callBack();\n            }\n        }\n\n        if(options.animate){\n            animatePage.addClass(animateOutClass).animationEnd(end);\n        }else{\n            end();\n        }\n    };\n\n    // 往前关闭窗口\n    page.closePage = function (options) {\n        var closeIndex = options.closeIndex;\n        var prevPage = $(\".ui-page.ui-show\", pagesObj).prevAll(\".ui-page\");\n\n        if(options.pageName){\n            closeIndex =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj).index();\n        }else if(closeIndex < 0){\n            closeIndex = -closeIndex -1;\n        }else{\n            closeIndex = prevPage.size() - closeIndex;\n        }\n\n        $(prevPage[closeIndex]).remove();\n        if(options.callBack){\n            options.callBack();\n        }\n    };\n\n    // 调用父窗口打开页面\n    page.open = function (url, options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.openPage(url, options);\n    };\n\n    // post方法\n    page.post = function (url, options) {\n        options = $.extend({}, this.options, options);\n        options.method = 'post';\n        options.target.ipu.page.openPage(url, options);\n    };\n\n    // 调用父窗口,回退\n    page.back = function (options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.backPage(options);\n    };\n\n    // 返回首页\n    page.backHome = function (options) {\n        options = options || {};\n        options.backIndex = 0;\n        page.back(options);\n    };\n\n    // 子窗口,待确认\n    page.close = function (options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.closePage(options);\n    };\n\n    // 添加回调事件\n    page.onBack = function (back) {\n        $(\"body\").on(eventName, function (e) {\n            var data = e.originalEvent.data;\n            back(data);\n        });\n    };\n\n    // 提供一个关闭一群窗口的方法\n    ipu.page = page;\n})(ipu || window, jQuery);\n","// picker\r\n(function (ipu, $, Hammer) {\r\n    var showItemSize = 9;   // 显示的子项数量,\r\n    var r = 90;             // 计算旋转的圆半径,结果应该缩小,是为了r不要距离容器太近\r\n    var itemAngle = 180 / showItemSize;   // 每项对应的角度是 180/9 = 20\r\n    var maxExceed = itemAngle;         // 滚动时允许超出边界的最大角度\r\n    // itemHeight = 40px;       // 需要给出r=89是怎么计算出来的,是根据 40/2/Math.tan(40/2/180*Math.PI)=113,直接太大不好看\r\n\r\n    function Picker(slt, options) {\r\n        this.el = $(slt)[0];\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this._init();\r\n    }\r\n\r\n    // 默认参数\r\n    Picker.prototype.defaultOptions = {\r\n        onChange: function () {       // 子项选中事件\r\n        },\r\n        listen: true,                  // 默认已开记监听变化\r\n        data: []\r\n    };\r\n\r\n    Picker.prototype._init = function () {\r\n        var self = this;\r\n        this.wrap = $(\">ul\", this.el);\r\n        this.index = null;\r\n        this.listen = !!this.options.listen;\r\n\r\n        this.beginAngle = 0;\r\n        this.beginExceed = this.beginAngle - maxExceed;       // 最小角度值\r\n        this.stopInertiaMove = false;\r\n        this.lastAngle = null; // 保存滑动前的角度\r\n        this.empty = this.options.data.length == 0;\r\n\r\n        // 如果是ios,则ul的旋转中心点,有变化\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+r+\"px\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n        this.hammer = new Hammer.Manager(this.el);\r\n        this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_VERTICAL, threshold: 5}));\r\n        this.hammer.add(new Hammer.Press({threshold: 4}));  //\r\n        this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this._onPan, this));\r\n\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\r\n           // console.log('press');\r\n            if(this.empty){\r\n                return ;\r\n            }\r\n\r\n            self.stopInertiaMove = true;\r\n            if (e.type == 'pressup') {\r\n                self.endScroll();\r\n            }\r\n        });\r\n\r\n        this.setItems(this.options.data);\r\n    };\r\n\r\n    Picker.prototype.setItems = function (data, textName) {\r\n        this.wrap.empty(); // 清空历史数据\r\n        this.data = data = data || [];\r\n        this.empty = data.length == 0; // 数据是否为空\r\n\r\n        this.newData = true; // 表示设置了新数据,触发change回调,但第一次设置时,不需要触发\r\n        var self = this;\r\n        var lis = \"\";\r\n        textName = textName || 'text';\r\n\r\n        for (var i = 0, j = data.length; i < j; i++) {\r\n            lis = lis + \"<li>\" + data[i][textName] + \"</li>\";\r\n        }\r\n\r\n        $(lis).appendTo(this.wrap);\r\n\r\n        this.items = $(\">li\", this.wrap);\r\n        this.itemsSize = this.items.size();\r\n\r\n        this.endAngle = (this.empty ? 0 : this.itemsSize - 1) * itemAngle;\r\n        this.endExceed = this.endAngle + maxExceed;  // 最大旋转角度值\r\n\r\n        // 初始化各子项角度\r\n        this.items.each(function (i) {\r\n            $(this).css({\r\n                \"transform\": \"translateZ(\" + r + \"px) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + r + \"px\"\r\n            });\r\n            $(this).click(function () {\r\n                self.stopInertiaMove = true;\r\n                self.setAngle(i * itemAngle, true);\r\n            })\r\n        });\r\n\r\n        var newAngle ;\r\n        if(this.empty || this.index == null){\r\n            newAngle = 0;\r\n        }else {\r\n            if(this.index > this.itemsSize - 1){\r\n                newAngle = (this.itemsSize - 1) * itemAngle;\r\n            }else{\r\n                newAngle = this.index * itemAngle;\r\n            }\r\n        }\r\n        this.setAngle(newAngle, true);\r\n\r\n        /*if (this.index !== null) { // 当前已经旋转则,保留当前的索引\r\n         if (this.index > this.itemsSize - 1 && !this.empty) {\r\n         this.index = this.itemsSize - 1;\r\n         }\r\n         this.setAngle(this.index * itemAngle, true);\r\n         } else { // 第一次初始数据,不触发change事件\r\n         this.index = 0;     // 被调用后,不能再使用null值了\r\n         this.setAngle(0, false); // 第一次设置初始化时,不触发change事件\r\n         }*/\r\n    };\r\n\r\n    Picker.prototype._onPan = function (ev) {\r\n        if(this.empty){\r\n            return ;\r\n        }\r\n\r\n        //console.log(ev.deltaX + \"==\"+ ev.deltaY);\r\n        if (ev.type == 'panstart') { // 好像一定要移动才有startg事件\r\n            self.stopInertiaMove = true;\r\n            this.lastAngle = this.angle;\r\n            this.wrap.addClass(\"ui-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\r\n           // console.log('panstart');\r\n\r\n        } else if (ev.type == 'panmove') {\r\n            var moveAngle = this.calcAngle(ev.deltaY);\r\n            var newAngle = this.lastAngle - moveAngle;   //最新的角度\r\n            //console.log('=='+newAngle);\r\n            // 一个可以转动的最小值和最大值过滤\r\n            if (newAngle < this.beginExceed) {\r\n                newAngle = this.beginExceed;\r\n            }\r\n            if (newAngle > this.endExceed) {\r\n                newAngle = this.endExceed;\r\n            }\r\n            this.setAngle(newAngle);\r\n\r\n        } else { // end or cancel事件\r\n            // console.log('end or cancel:' + ev.type);\r\n            var v = ev.overallVelocityY;    // 滑动的速度\r\n            var dir = v > 0 ? -1 : 1; //加速度方向\r\n            var deceleration = dir * 0.0006 * -1;\r\n            var duration = Math.abs(v / deceleration); // 速度消减至0所需时间\r\n            var dist = v * duration / 2; //最终移动多少\r\n\r\n            var startAngle = this.angle;\r\n            var distAngle = -this.calcAngle(dist);\r\n           //  console.log(\"dist=\" + dist + \", distAngle\" + distAngle);\r\n\r\n            //----\r\n            var srcDistAngle = distAngle;\r\n            if (startAngle + distAngle < this.beginExceed) {\r\n                distAngle = this.beginExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n            if (startAngle + distAngle > this.endExceed) {\r\n                distAngle = this.endExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n\r\n            if (distAngle == 0) {\r\n                this.endScroll();\r\n                return;\r\n            }\r\n            this.scrollDistAngle(startAngle, distAngle, duration);\r\n        }\r\n    };\r\n\r\n    // 计算移动的角度,转动的角度,就是移动的距离对应相关圆周\r\n    // 2*r*PI = 360,  angle = 360*c/(2*r*PI)\r\n    var ca = 360 / (2 * r * Math.PI);\r\n    Picker.prototype.calcAngle = function (c) {\r\n        return c * ca;\r\n    };\r\n\r\n    // endScroll 是否为结束的滚动结束,滚动结束需要调用结束事件\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(1000px) rotateY(0deg) rotateX(\" + newAngle + \"deg)\");\r\n        this.calcItemVisable(newAngle);\r\n\r\n        if (endScroll) {\r\n            var index = newAngle / itemAngle;\r\n            var oldIndex = this.index;\r\n            this.index = this.empty ? null : index; // 这里可以做一个判断,如果是empty,则index值可以不改变\r\n\r\n            // 这个地方要判断下,数据更新或索引更新都要触发\r\n            if (oldIndex != index || this.newData) {\r\n                this.newData = false;\r\n               // console.log('change');\r\n                if (this.options.onChange && this.listen) {\r\n                    // console.log('changed call');\r\n                    this.options.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n            }\r\n        }\r\n    };\r\n\r\n    // 计算子项的显示情况\r\n    Picker.prototype.calcItemVisable = function (angle) {\r\n        this.items.each(function (index) {\r\n            var difference = Math.abs(index * itemAngle - angle);\r\n\r\n            if (difference < itemAngle / 2) {\r\n                $(this).addClass(\"ui-highlight ui-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ui-highlight ui-visible\");\r\n            } else {\r\n                $(this).addClass(\"ui-visible\").removeClass(\"ui-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ui-noanimate\");\r\n        var endAngle;\r\n\r\n        if (this.angle < this.beginAngle) {\r\n            endAngle = this.beginAngle;\r\n        } else if (this.angle > this.endAngle) {\r\n            endAngle = this.endAngle;\r\n        } else {\r\n            var index = parseInt((this.angle / itemAngle).toFixed(0));\r\n            endAngle = (itemAngle * index);\r\n        }\r\n\r\n        this.setAngle(endAngle, true);\r\n    };\r\n\r\n    // 进行惯性滚动\r\n    Picker.prototype.scrollDistAngle = function (startAngle, distAngle, duration) {\r\n        var self = this;\r\n        var nowTime = new Date().getTime();\r\n        this.stopInertiaMove = false;\r\n        duration = 1 * duration; // 滚动时长控制修改\r\n\r\n        // hammer调用的惯性函数\r\n        (function (nowTime, startAngle, distAngle, duration) {\r\n            var frameInterval = 13;\r\n            var stepCount = duration / frameInterval;\r\n            var stepIndex = 0;\r\n\r\n            (function inertiaMove() {\r\n                if (self.stopInertiaMove) return;\r\n                var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);\r\n                self.setAngle(newAngle);\r\n                stepIndex++;\r\n\r\n                if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {\r\n                    self.endScroll();\r\n                    return;\r\n                }\r\n\r\n                setTimeout(inertiaMove, frameInterval);\r\n            })();\r\n\r\n        })(nowTime, startAngle, distAngle, duration);\r\n    };\r\n\r\n    Picker.prototype.setListen = function (bool) {\r\n        this.listen = !!bool;\r\n    };\r\n\r\n    Picker.prototype.quartEaseOut = function (t, b, c, d) {\r\n        return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n    };\r\n\r\n    Picker.prototype.setSelectedValue = function (value) {\r\n        var self = this;\r\n        for (var index in self.data) {\r\n            var item = self.data[index];\r\n            if (item.value == value) {\r\n                self.setAngle(index* itemAngle, true);\r\n                return;\r\n            }\r\n        }\r\n    };\r\n\r\n    // 获取当前选中的值\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    Picker.prototype.getSelectedIndex = function () {\r\n        return this.index;\r\n    };\r\n\r\n    ipu.Picker = Picker;\r\n\r\n})(ipu || window, jQuery, Hammer);\r\n","// popPicker\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n\r\n    function PopPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                        </div>\\\r\n                    </div>',\r\n        pickerTemplate: '<div class=\"ui-picker\">\\\r\n                            <div class=\"ui-picker-selectbox\"></div>\\\r\n                            <ul></ul>\\\r\n                          </div>',\r\n        data: [],    // 数据\r\n        layer: 1,   // 数据层级\r\n        btns: ['取消', '确认'],\r\n        callBack: function () { // 选择数据时的回调函数\r\n\r\n        }\r\n    };\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.options.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ui-poppicker-body\", this.holder);\r\n\r\n        var layer = this.options.layer;\r\n        var width = (100 / layer) + \"%\";\r\n        this.pickers = new Array(layer);\r\n        var self = this;\r\n        var pickerHtml;\r\n        this.mask = this.createMask();\r\n\r\n        // 先初始化最底层picerk,再上面来\r\n        for (var i = layer -1; i >=0; i--) {\r\n            pickerHtml = $(this.options.pickerTemplate).prependTo(bodyHtml).css({width: width});\r\n\r\n            this.pickers[i] = new  Picker(pickerHtml, {\r\n                onChange: (function (i) {\r\n                    return function (item, index) { // 更新底部的值\r\n                        if (i != layer - 1) {\r\n                            self.pickers[i + 1].setItems(item.data);\r\n                        }\r\n                    };\r\n                })(i)\r\n            });\r\n        }\r\n\r\n        $(\".ui-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.options.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.options.btns[1]);\r\n\r\n        $(\".ui-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.options.btns[0]);\r\n    };\r\n\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 获取相关值\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.options.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.options.layer; i++) {\r\n                rs.push(this.pickers[i].getSelectedItem());\r\n            }\r\n            return rs;\r\n        }\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    PopPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.hide();\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.popPicker = function (options) {\r\n        return new PopPicker(options);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n\r\n    /**\r\n     *进度条\r\n     */\r\n    function progressBar(id, options) {\r\n        this.id = id;\r\n        this.level = options.level;\r\n        this.progress = options.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (options.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (options.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    progressBar.prototype.setProgress = function (pro) {\r\n        if (pro < 0 || pro > 100) return;\r\n\r\n        $(this.progressBar.find(\".ipu-progressbar\")).css(\"transform\", \"translate3d(\" + (-(100 - pro)) + \"%, 0px, 0px)\");\r\n        this.progress = pro;\r\n    };\r\n\r\n    progressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    progressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-hightlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-highlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    ipu.progressBar = function (slt, options) {\r\n        return new progressBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $, iScroll) {\r\n\r\n    // 扩展参数,iscroll组件的参数选项\r\n    // 扩展参数,用户直接在页面上自定好,顶端和底部加载html\r\n    // 设置上下条件长度,或计算函数\r\n    // 处理resize的问题,用户主动调用refresh??\r\n    // 底部启用或停用时,应该刷新组件iscroll高度\r\n    // 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n    Refresh.prototype.defaultOptions = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ui-refresh-bottom\"><span class=\"ui-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ui-refresh-top\"><span class=\"ui-refresh-loading\"></span><div class=\"ui-refresh-arrow\"></div></div>',\r\n                // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n                // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ui-refresh-top-loading\r\n                // 拖动达到加载距离,则增加class:ui-refresh-toload\r\n                // 加载中,则增加class:ui-refresh-top-loading,移除class:ui-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOptions:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    function Refresh(slt, options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOptions = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ui-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ui-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ui-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ui-refresh-toload');\r\n                    }\r\n                }\r\n\r\n                me._checkBottomLoading(); // 底部加载条件和顶部条件不一样,只要滚动离底部一定高度就开始加载\r\n                me.goTop = this.y > me.topPullOffset; // 记录是否位于顶部位置,以便刷新后可以回到此位置\r\n            },\r\n            onBeforeScrollEnd: function () {    // 一定是用户拖动触发,在滚动结束前应该触发\r\n                me._checkTopLoading();\r\n                me._checkBottomLoading();\r\n            },\r\n            onScrollEnd: function () { // 这个事件可能由非用户拖动时触发,可能是拖动惯性导致,所有顶部不应该处理,但顶部不管是否惯性,位置条件满足即触发\r\n                if (me.topLoading && this.y < this.minScrollY && me.goTop) {\r\n                    me.iScroll.scrollTo(0, this.minScrollY, 0);\r\n                }\r\n                me._checkBottomLoading(); // 在beforend执行还不够,还在要end执行\r\n            },\r\n            onRefresh: function () { // 刷新时,若顶部加载还在进行,且当前显示的顶部加载,则继续显示,否则刷新后会消失顶部加载,这里代码没有考虑重用了,应该可以做一步提取\r\n                if (me.topLoading) { // 如果顶部在加载,则刷新的时候,设置最小顶部距离,显示顶部加载状态\r\n                    this.minScrollY = this.minScrollY + me.topPullOffset;\r\n                }\r\n            }\r\n        };\r\n\r\n        this.iScrollOptions = $.extend({}, this.options.iScrollOptions, this.iScrollOptions);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOptions);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ui-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.options.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.options.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.options.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        this.topLoading = false;        // 顶部正在载加载\r\n        this.bottomLoading = false;     // 底部正在加载\r\n        this.bottomEnable = this.options.initEnableBottom && !!this.options.bottomLoadFun;\r\n        this.topEnable = this.options.initEnableTop && !!this.options.topLoadFun;\r\n        this.goTop = false;         // 用来处理,因为iScroll使用momentum(惯性), 导致有时顶部显示不正确问题,true表示顶部显示加载条\r\n\r\n        this.enableBottom(this.bottomEnable);\r\n        this.enableTop(this.topEnable);\r\n    };\r\n\r\n    // 检查是否需要底部加载\r\n    Refresh.prototype._checkBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            if (this.iScroll.y < this.iScroll.maxScrollY + this.bottomPullOffset) {\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    Refresh.prototype._checkTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            if (this.topEl.hasClass('ui-refresh-toload')) {\r\n                this._startTopLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 检查内容是否超出容器高度,未超出时,自动调用底部加载\r\n    Refresh.prototype._checkContentLoading = function () {\r\n        if(this.iScroll.maxScrollY >= -this.bottomPullOffset){ // 此处要计算底端的高度\r\n            this._startBottomLoading();\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.options.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ui-refresh-toload').addClass('ui-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.options.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 结束底部加载\r\n    Refresh.prototype.endBottomLoading = function () {\r\n        this.bottomLoading = false;\r\n        this.refresh();\r\n    };\r\n\r\n    // 结束顶部加载\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ui-refresh-top-loading');\r\n        this.topLoading = false;\r\n        // this.iScroll.scrollTo(0, 0); // 刷新加载则应该回到顶部,待测试确认\r\n        this.refresh();\r\n    };\r\n\r\n    // 设置顶部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableTop = function (enable) {\r\n        this.topEnable = enable;\r\n        if (enable) {\r\n            this.topEl.show();\r\n        } else {\r\n            this.topEl.hide();\r\n        }\r\n    };\r\n\r\n    // 设置底部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableBottom = function (enable) {\r\n        this.bottomEnable = enable;\r\n        if (enable) {\r\n            this.bottomEl.show();\r\n        } else {\r\n            this.bottomEl.hide();\r\n        }\r\n    };\r\n\r\n    // 只有在内容发生变更时,但是又没有触发调用end相关方法时,使用此方法更新高度信息\r\n    // 或者组件在一开始未显示??\r\n    // 刷新会移除拖动中状态\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n    ipu.refresh = function (slt, optoins) {\r\n        return new Refresh(slt, optoins);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n","// Tab\r\n(function (ipu, $) {\r\n    function Tab(holder, options) {\r\n        this.el = $(holder).get(0);\r\n        this.titleItems = $(\".ui-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ui-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ui-tab-fixed\"); // 是否为固定高度的\r\n\r\n        var that = this;\r\n        this.titleItems.each(function (index) {\r\n            $(this).click(function () {\r\n                that.show(index);\r\n            });\r\n        });\r\n\r\n        var index = this.titleItems.filter(\".ui-current\").index();\r\n        if (index == -1) {\r\n            index = 0;\r\n        }\r\n\r\n        this.show(index);\r\n    }\r\n\r\n    Tab.prototype.defaultOptions = {\r\n        callBack: null  // 回调函数,tab切换时回调函数\r\n    };\r\n\r\n    Tab.prototype.show = function (index) {\r\n        if (this.fixed) {\r\n            var move = -index * 100 + \"%\";\r\n            this.bodyWrapper.css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        }\r\n        this.contentItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this.titleItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this._end(index);\r\n    };\r\n\r\n    Tab.prototype._end = function (index) {\r\n        this.lastIndex = this.currentIndex;\r\n        this.currentIndex = index;\r\n\r\n        if (this.options.callBack) {\r\n            this.options.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, options) {\r\n        return new Tab(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\r\n","// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipu, $) {\r\n    var active = {};\r\n\r\n    var options = defaultOptions = {\r\n        distanceAllow: 10,   // 最大移动距离,超过移除效果\r\n        displayDelay: 100,  // 延时显示时间,以防止是滚动操作\r\n        hideDelay: 120,     // 隐藏延时时间\r\n        eventName: 'click', // 事件处理是click\r\n        activeClass: 'ui-active',   // 激活时的class\r\n        getHandleNode: function (node) {  // 找到最先一级处理此click事件的元素\r\n            if (!node || !node.nodeType) return;\r\n\r\n            var distNode = null;\r\n            var nodeArray = [];\r\n\r\n            // 还有其它情形考虑,如a标签的跳转,或在原生元素添加事件属性的\r\n            function findHander(inNode) {\r\n                // 此方法适用于jquery, 1.12.4, 2.2.4, 3.2.1版本,_data方法以后可能会被移除。$.data是一些老版本写法\r\n                var eventHandlers = ($._data || $.data)(inNode, 'events');\r\n\r\n                if (eventHandlers) {\r\n                    eventHandlers = eventHandlers[options.eventName];\r\n                }\r\n\r\n                if (!eventHandlers) {\r\n                    return;\r\n                }\r\n\r\n                var thisNode = false;\r\n                $.each(eventHandlers, function (index, handler) {\r\n                    if (handler.selector) {\r\n                        var objs = $(handler.selector, inNode);\r\n                        $.each(nodeArray, function (tIndex, tNode) {\r\n                            if (objs.is(tNode)) {\r\n                                distNode = tNode;\r\n                                return false;\r\n                            }\r\n                        });\r\n\r\n                        if (distNode) {\r\n                            return false; //\r\n                        }\r\n                    } else {\r\n                        thisNode = true;  // 保存distNode,有可能有子节点满足条件,所以只保存此值为默认值\r\n                    }\r\n                });\r\n\r\n                if (thisNode && distNode == null) { // 如果没在子节点找到click事件,而当前节点又有click事件,就使用当前节点\r\n                    distNode = inNode;\r\n                }\r\n\r\n                return distNode;\r\n            }\r\n\r\n            while (!(\"tagName\" in node) || !findHander(node)) {\r\n                if (!node.parentNode || node.parentNode.nodeType != 1) {\r\n                    break;\r\n                }\r\n                nodeArray.push(node);\r\n                node = node.parentNode;\r\n            }\r\n\r\n            return distNode;\r\n        }\r\n    };\r\n\r\n    function getOriginalEvent(e) {\r\n        return e.originalEvent || e;\r\n    }\r\n\r\n    function getXY(e) {\r\n        var x = e.touches ? e.touches[0].pageX : e.clientX;\r\n        var y = e.touches ? e.touches[0].pageY : e.clientY;\r\n        return [x, y];\r\n    }\r\n\r\n    //根据不同浏览器获取不同原生事件event\r\n    var hasTouch = \"ontouchstart\" in window,\r\n        START_EVENT = hasTouch ? 'touchstart' : 'mousedown',\r\n        MOVE_EVENT = hasTouch ? 'touchmove' : 'mousemove',\r\n        END_EVENT = hasTouch ? 'touchend' : 'mouseup',\r\n        CANCEL_EVENT = hasTouch ? 'touchcancel' : '';\r\n\r\n    $(function () {\r\n        var startXY, tapEl, timeOutID;\r\n        var dom = document.body;\r\n\r\n        // force为false的时候,不用管timeOutID,在老的timeOutID未移除的情况下,有可能又产生了新的,\r\n        // 导致else代码未被执行,导致老的点击元素class未被移除\r\n        function removeClass(dom, force) {\r\n            if (force && timeOutID) {\r\n                window.clearTimeout(timeOutID);\r\n            } else {\r\n                $(dom).removeClass(options.activeClass);\r\n            }\r\n        }\r\n\r\n        function removeActive(force) {\r\n            if (force) {\r\n                removeClass(tapEl, force);\r\n            } else {\r\n                window.setTimeout(removeClass, options.hideDelay, tapEl, force);\r\n            }\r\n            startXY = null;\r\n            tapEl = null;\r\n        }\r\n\r\n        $(dom).bind(START_EVENT, function (e) {\r\n            if (tapEl) {    // 多点接触时处理\r\n                removeActive(true);\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n            startXY = getXY(e);\r\n            tapEl = options.getHandleNode(e.target);\r\n\r\n            if (tapEl) {\r\n                timeOutID = window.setTimeout(function (dom) {\r\n                    timeOutID = null;\r\n                    $(dom).addClass(options.activeClass);\r\n                }, options.displayDelay, tapEl);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(MOVE_EVENT, function (e) {\r\n            if (!tapEl) {\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n\r\n            var xy = getXY(e);\r\n            if (startXY && (Math.abs(xy[0] - startXY[0]) > options.distanceAllow || Math.abs(xy[1] - startXY[1]) > options.distanceAllow)) {\r\n                removeActive(true);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(END_EVENT, function (e) {\r\n            if (tapEl) {\r\n                removeActive();\r\n            }\r\n        });\r\n\r\n        // 手机来电等非用户取消操作时触发事件\r\n        if (CANCEL_EVENT) {\r\n            $(dom).bind(CANCEL_EVENT, function (e) {\r\n                if (tapEl) {\r\n                    removeActive();\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    // 更新默认值\r\n    active.setOptions = function (opts) {\r\n        options = this.options = $.extend({}, defaultOptions, opts);\r\n    };\r\n    ipu.active = active;\r\n})(ipu || window, jQuery);\r\n\r\n","/*===========================\r\nDevice/OS Detection\r\n===========================*/\r\n// from sui,但IPU框架的ua不是这样的\r\n;(function (ipu, $) {\r\n    \"use strict\";\r\n    var device = {};  // Classes\r\n    var classNames = [];\r\n    var ua = navigator.userAgent\r\n    \r\n    // 这中针对ipu框架的情况,待测试\r\n    if(ua.match(/ipumobile/i)){\r\n        device.ios =  !!ua.match(/ios/i);\r\n        device.android = !!ua.match(/android/i);\r\n    }else{\r\n        var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\r\n        var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\r\n        var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\r\n        var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\r\n\r\n        device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\r\n\r\n        // Android\r\n        if (android) {\r\n            device.os = 'android';\r\n            device.osVersion = android[2];\r\n            device.android = true;\r\n            device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\r\n        }\r\n        if (ipad || iphone || ipod) {\r\n            device.os = 'ios';\r\n            device.ios = true;\r\n        }\r\n        // iOS\r\n        if (iphone && !ipod) {\r\n            device.osVersion = iphone[2].replace(/_/g, '.');\r\n            device.iphone = true;\r\n        }\r\n        if (ipad) {\r\n            device.osVersion = ipad[2].replace(/_/g, '.');\r\n            device.ipad = true;\r\n        }\r\n        if (ipod) {\r\n            device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\r\n            device.iphone = true;\r\n        }\r\n        // iOS 8+ changed UA\r\n        if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\r\n            if (device.osVersion.split('.')[0] === '10') {\r\n                device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\r\n            }\r\n        }\r\n\r\n        // Webview\r\n        device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\r\n\r\n        // Minimal UI\r\n        if (device.os && device.os === 'ios') {\r\n            var osVersionArr = device.osVersion.split('.');\r\n            device.minimalUi = !device.webView &&\r\n                (ipod || iphone) &&\r\n                (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\r\n                $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\r\n        }\r\n\r\n        // Check for status bar and fullscreen app mode\r\n        var windowWidth = $(window).width();\r\n        var windowHeight = $(window).height();\r\n        device.statusBar = false;\r\n        if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\r\n            device.statusBar = true;\r\n        }\r\n        else {\r\n            device.statusBar = false;\r\n        }\r\n\r\n\r\n        // Pixel Ratio\r\n        device.pixelRatio = window.devicePixelRatio || 1;\r\n        classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\r\n        if (device.pixelRatio >= 2) {\r\n            classNames.push('retina');\r\n        }\r\n\r\n        // OS classes\r\n        if (device.os) {\r\n            classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\r\n            if (device.os === 'ios') {\r\n                var major = parseInt(device.osVersion.split('.')[0], 10);\r\n                for (var i = major - 1; i >= 6; i--) {\r\n                    classNames.push('ios-gt-' + i);\r\n                }\r\n            }\r\n\r\n        }\r\n        // Status bar classes\r\n        if (device.statusBar) {\r\n            classNames.push('with-statusbar-overlay');\r\n        }\r\n        else {\r\n            $('html').removeClass('with-statusbar-overlay');\r\n        }\r\n\r\n\r\n        // keng..\r\n        device.isWeixin = /MicroMessenger/i.test(ua);\r\n    }\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0){\r\n        $('html').addClass(classNames.join(' '));\r\n    }\r\n\r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n","\r\n        // 初始化代码\r\n        jQuery(function () {\r\n            FastClick.attach(document.body);\r\n        });\r\n\r\n        return ipu;\r\n    }\r\n\r\n    // todo:可以添加一个和其它库的适配处理,\r\n    // 这里假设第三方库,jquery,iScroll,Hammer的史称已经固定\r\n    if ( typeof define === \"function\" && define.amd ) {\r\n        define(['jquery', 'iScroll', 'Hammer', 'FastClick'], function (jQuery, iScroll, Hammer, FastClick) {\r\n            return window.ipu = setup(jQuery, iScroll, Hammer, FastClick);\r\n        });\r\n    } else {\r\n        window.ipu = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n    }\r\n})();\r\n"]}
1
{"version":3,"sources":["ipu-prefix.js","carousel.js","dtPicker.js","hammerCarousel.js","modal.js","navBar.js","pages.js","picker.js","popPicker.js","progressBar.js","refresh.js","tab.js","tap.js","_device.js","ipu-suffix.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"ipu.js","sourcesContent":["(function () {\r\n    function setup(jQuery, iScroll, Hammer, FastClick) {\r\n        var ipu = {};\r\n","// Carousel\r\n(function (ipu, $, iscroll) {\r\n// carouselSlt应该是唯一的,否则怎么支撑多个回调,如果用户不需要多个回调,也不主动调用,则可以,先不管吧???\r\n    function Carousel(slt, options) {\r\n        this.options = options = $.extend({}, this.defaultOpt, options);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = options.autoPlay;\r\n         this.hasIndicator = options.indicator;\r\n        this.callBack = options.callBack;\r\n        this.currentIndex = null;\r\n\r\n        this._init();\r\n        this.play();\r\n    }\r\n\r\n    Carousel.prototype = {\r\n        defaultOpt: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            that = this;\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.hasIndicator) {\r\n                this._addIndicator();\r\n            }\r\n            $(window).resize(function () {\r\n                that.refresh();\r\n            });\r\n            var scrollOpt = {\r\n                snap: \"li\",          // carousel效果\r\n                momentum: false,     // 移除惯性处理\r\n                scrollX: true,       // X轴移动\r\n                scrollY:false,\r\n                hScrollbar: false,   // 没有纵向滚动条\r\n                onScrollStart: function () {\r\n                    that._pause();\r\n                },\r\n                onTouchEnd: function () {\r\n                    // 后面优化\r\n                    /*\r\n                     if (that.iscroll.currPageX == that.size - 1) {\r\n                     that.show(that.size - 2);\r\n                     }\r\n                     */\r\n                },\r\n                onScrollEnd: function () {\r\n                    that._end();\r\n                }\r\n            };\r\n            this.iscroll = new iscroll(this.el.get(0), scrollOpt);\r\n            this.show(this.options.index, 0);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.autoPlay=false;\r\n        },\r\n        _pause: function () {\r\n            if (this.autoPlay && this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            this.show(index);\r\n        },\r\n        next: function () {\r\n            var index = this.currentIndex == this.size - 1 ? 0 : this.currentIndex + 1;\r\n            this.show(index);\r\n        },\r\n        show: function (index, time) {\r\n            this._pause();\r\n            this.iscroll.scrollToPage(index, 0, time);\r\n        },\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        refresh: function () {\r\n            var that = this;\r\n            that.show(this.currentIndex);\r\n        },\r\n        _play: function () {\r\n            if (this.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    this.timeoutId = null;\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {\r\n            var currentIndex = this.iscroll.currPageX;\r\n            if (currentIndex != this.currentIndex) {\r\n                if (this.callBack) {\r\n                    this.callBack(currentIndex, this.currentIndex);\r\n                }\r\n                this.currentIndex = currentIndex;\r\n\r\n                if (this.hasIndicator) {\r\n                    this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this._play();\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        destroy: function () {\r\n            // 自己怎么销毁,相关事件移除??\r\n            this.iscroll.destroy();\r\n        }\r\n    };\r\n\r\n    ipu.carousel =  function (slt, options) {\r\n        return new Carousel(slt, options);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n","// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来运算\r\n\r\n\r\n    // show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n    // 日期范围的选择处理\r\n    function DtPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    DtPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker ui-dtpicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-clear\">清除</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-title\">\\\r\n                            <label class=\"ui-dtpicker-y\"></label>\\\r\n                            <label class=\"ui-dtpicker-m\"></label>\\\r\n                            <label class=\"ui-dtpicker-d\"></label>\\\r\n                            <label class=\"ui-dtpicker-h\"></label>\\\r\n                            <label class=\"ui-dtpicker-mi\"></label>\\\r\n                        </div>\\\r\n                        <div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                            <div class=\"ui-picker\" data-id=\"picker-y\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-m\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-d\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-h\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-mi\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                        </div>\\\r\n                    </div>',\r\n        buttons: ['取消', '确认', '清除'],\r\n        labels: ['年', '月', '日', '时', '分'],\r\n        type: 'datetime',       // date, time, datetime, hour, month\r\n        customData: {},  // 自定义数据\r\n        hasClear: false,    // 是否显示清除按钮\r\n        callBack: function () { // 选择数据时的回调函数\r\n        }\r\n        // beginDate: Date类型,或毫秒值\r\n        // endDate: 同上\r\n    };\r\n\r\n    DtPicker.prototype._init = function () {\r\n        var self = this;\r\n        this.mask = this.createMask();\r\n\r\n        var _picker = this.holder = $(this.options.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ui-poppicker-btn-ok', _picker),\r\n            cancel: $('.ui-poppicker-btn-cancel', _picker),\r\n            clear: $('.ui-poppicker-btn-clear', _picker),\r\n            buttons: $('.ui-poppicker-header .ui-btn', _picker),\r\n            labels: $('.ui-poppicker-title label', _picker)\r\n        };\r\n\r\n\r\n        ui.i = new Picker($('[data-id=\"picker-mi\"]', _picker), {listen: false}); // 分钟变更无需要处理\r\n\r\n        ui.h = new Picker($('[data-id=\"picker-h\"]', _picker), {         // 小时变更,有最小值或最大值,需要变更分钟\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createMinutes();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.d = new Picker($('[data-id=\"picker-d\"]', _picker), { //仅提供了beginDate时,触发day,hours,minutes的change\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createHours();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.m = new Picker($('[data-id=\"picker-m\"]', _picker), { // 月变更时,总要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null) {\r\n                    self._createDay();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.y = new Picker($('[data-id=\"picker-y\"]', _picker), { // 年发生变更,如果没有结束月,此时有所有的月,是不需要变更月的,只需要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index != null) {\r\n                    if (self.options.beginMonth || self.options.endMonth) {\r\n                        self._createMonth();\r\n                    } else {\r\n                        self._createDay();\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n\r\n\r\n\r\n        self._create();\r\n\r\n        var ui = self.ui;\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.options.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.options.value);\r\n\r\n        //防止滚动穿透 TODO:待确认情况\r\n        /* self.ui.picker.addEventListener($.EVENT_START, function (event) {\r\n         event.preventDefault();\r\n         }, false);\r\n         self.ui.picker.addEventListener($.EVENT_MOVE, function (event) {\r\n         event.preventDefault();\r\n         }, false);*/\r\n    };\r\n\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.options.type;\r\n        var selected = {\r\n            type: type,\r\n            y: ui.y.getSelectedItem(),\r\n            m: ui.m.getSelectedItem(),\r\n            d: ui.d.getSelectedItem(),\r\n            h: ui.h.getSelectedItem(),\r\n            i: ui.i.getSelectedItem(),\r\n            toString: function () {\r\n                return this.value;\r\n            }\r\n        };\r\n        switch (type) {\r\n            case 'datetime':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'date':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text;\r\n                break;\r\n            case 'time':\r\n                selected.value = selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'month':\r\n                selected.value = selected.y.value + '-' + selected.m.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text;\r\n                break;\r\n            case 'hour':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text;\r\n                break;\r\n        }\r\n        return selected;\r\n    };\r\n\r\n    DtPicker.prototype._setSelectedValue = function (value) {\r\n        var self = this;\r\n        var ui = self.ui;\r\n\r\n        if(!value){\r\n            if(this.options.type == 'time'){\r\n                value = '00:00';\r\n            }else{\r\n                value = defaultPickerDate.getFullYear()+'-'+(defaultPickerDate.getMonth()+1)+'-'+defaultPickerDate.getDate()+' '\r\n                    + defaultPickerDate.getHours() + ':' + defaultPickerDate.getMinutes();\r\n            }\r\n        }\r\n        var parsedValue = self._parseSetValue(value);\r\n\r\n        ui.y.setListen(true);\r\n        ui.m.setListen(false);\r\n        ui.d.setListen(false);\r\n        ui.h.setListen(false);\r\n        ui.i.setListen(false);\r\n        ui.y.setSelectedValue(parsedValue.y);\r\n\r\n        ui.m.setListen(true);\r\n        ui.m.setSelectedValue(parsedValue.m);\r\n\r\n        ui.d.setListen(true);\r\n        ui.d.setSelectedValue(parsedValue.d);\r\n\r\n        ui.h.setListen(true);\r\n        ui.h.setSelectedValue(parsedValue.h);\r\n\r\n        ui.i.setListen(true);\r\n        ui.i.setSelectedValue(parsedValue.i);\r\n\r\n        this.value = this.getSelected().value;\r\n    };\r\n\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    DtPicker.prototype.isLeapYear = function (year) {\r\n        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);\r\n    };\r\n\r\n    DtPicker.prototype._inArray = function (array, item) {\r\n        for (var index in array) {\r\n            var _item = array[index];\r\n            if (_item === item) return true;\r\n        }\r\n        return false;\r\n    };\r\n\r\n    DtPicker.prototype.getDayNum = function (year, month) {\r\n        var self = this;\r\n        if (self._inArray([1, 3, 5, 7, 8, 10, 12], month)) {\r\n            return 31;\r\n        } else if (self._inArray([4, 6, 9, 11], month)) {\r\n            return 30;\r\n        } else if (self.isLeapYear(year)) {\r\n            return 29;\r\n        } else {\r\n            return 28;\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype._fill = function (num) {\r\n        num = num.toString();\r\n        if (num.length < 2) {\r\n            num = 0 + num;\r\n        }\r\n        return num;\r\n    };\r\n\r\n    DtPicker.prototype._isBeginYear = function () {\r\n        return this.options.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.options.beginMonth && this._isBeginYear() && this.options.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.options.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.options.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.options.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.options.endMonth && this._isEndYear() && this.options.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.options.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.options.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (options.customData.y) {\r\n            yArray = options.customData.y;\r\n        } else {\r\n            var yBegin = options.beginYear;\r\n            var yEnd = options.endYear;\r\n            for (var y = yBegin; y <= yEnd; y++) {\r\n                yArray.push({\r\n                    text: y + '',\r\n                    value: y\r\n                });\r\n            }\r\n        }\r\n        ui.y.setItems(yArray);\r\n        //ui.y.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMonth = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (options.customData.m) {\r\n            mArray = options.customData.m;\r\n        } else {\r\n            var m = options.beginMonth && self._isBeginYear() ? options.beginMonth : 1;\r\n            var maxMonth = options.endMonth && self._isEndYear() ? options.endMonth : 12;\r\n            for (; m <= maxMonth; m++) {\r\n                var val = self._fill(m);\r\n                mArray.push({\r\n                    text: val,\r\n                    value: m\r\n                });\r\n            }\r\n        }\r\n        ui.m.setItems(mArray);\r\n        //ui.m.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createDay = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (options.customData.d) {\r\n            dArray = options.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? options.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? options.endDay : self.getDayNum(parseInt(this.ui.y.getSelectedValue()), parseInt(this.ui.m.getSelectedValue()));\r\n            for (; d <= maxDay; d++) {\r\n                var val = self._fill(d);\r\n                dArray.push({\r\n                    text: val,\r\n                    value: d\r\n                });\r\n            }\r\n        }\r\n        ui.d.setItems(dArray);\r\n        //current = current || ui.d.getSelectedValue();\r\n        //ui.d.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createHours = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (options.customData.h) {\r\n            hArray = options.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? options.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? options.endHours : 23;\r\n            for (; h <= maxHours; h++) {\r\n                var val = self._fill(h);\r\n                hArray.push({\r\n                    text: val,\r\n                    value: h\r\n                });\r\n            }\r\n        }\r\n        ui.h.setItems(hArray);\r\n        //ui.h.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMinutes = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (options.customData.i) {\r\n            iArray = options.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? options.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? options.endMinutes : 59;\r\n            for (; i <= maxMinutes; i++) {\r\n                var val = self._fill(i);\r\n                iArray.push({\r\n                    text: val,\r\n                    value: i\r\n                });\r\n            }\r\n        }\r\n        ui.i.setItems(iArray);\r\n        //ui.i.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._setLabels = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = options.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.cancel.text(options.buttons[0]);\r\n        ui.ok.text(options.buttons[1]);\r\n\r\n        if(options.hasClear){\r\n            ui.clear.text(options.buttons[2])\r\n        }else{\r\n            ui.clear.hide();\r\n        }\r\n\r\n        ui.buttons.each(function (index) {\r\n            $(this).click(function () {\r\n                self.clickCall(index);\r\n            })\r\n        })\r\n    };\r\n\r\n    // 解析设置的值,目前是字符串,完整日期格式 2012-12-12 12:21\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.options.type;\r\n\r\n        var rs = {\r\n            y: now.getFullYear(),\r\n            m: now.getMonth()+1,\r\n            d: now.getDate(),\r\n            h: now.getHours(),\r\n            i: now.getMinutes()\r\n        };\r\n\r\n        if(value instanceof Date){\r\n            if( type == 'time'){\r\n                valu= +value.getHours()+\":\"+value.getMinutes();\r\n            }else{\r\n                value = value.getFullYear()+'-'+(value.getMonth()+1)+'-'+value.getDate()+ ' '\r\n                    +value.getHours()+\":\"+value.getMinutes();\r\n            }\r\n        }\r\n\r\n        var parts = value.replace(\":\", \"-\").replace(\" \", \"-\").split(\"-\");\r\n        for(var i=0, j=parts.length; i<j; i++){\r\n            parts[i] = parseInt(parts[i]);\r\n        }\r\n\r\n        if(type == 'datetime'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = parts[4];\r\n        }else if(type == 'date'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }else if(type == 'time'){\r\n            rs.h = parts[0];    //\r\n            rs.i = parts[1];\r\n        }else if(type == 'hour'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = 0;\r\n        }else if(type == 'month'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = 1;    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }\r\n\r\n        return rs;\r\n    };\r\n\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var options = this.options;\r\n        var now = defaultPickerDate;\r\n\r\n        var beginDate = options.beginDate;\r\n        if(beginDate){\r\n            beginDate = this._parseSetValue(beginDate);\r\n            options.beginYear = beginDate.y;\r\n            options.beginMonth = beginDate.m;\r\n            options.beginDay = beginDate.d;\r\n            options.beginHours = beginDate.h;\r\n            options.beginMinutes = beginDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.beginYear =  now.getFullYear();\r\n            options.beginMonth = now.getMonth() + 1;\r\n            options.beginDay = now.getDate();\r\n            options.beginHours = 0;\r\n            options.beginMinutes = 0;\r\n        }else {\r\n            options.beginYear =  now.getFullYear() - 5;\r\n        }\r\n\r\n        var endDate = options.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            options.endYear = endDate.y;\r\n            options.endMonth = endDate.m;\r\n            options.endDay = endDate.d;\r\n            options.endHours = endDate.h;\r\n            options.endMinutes = endDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.endYear =  now.getFullYear();\r\n            options.endMonth = now.getMonth() + 1;\r\n            options.endDay = now.getDate();\r\n            options.endHours = 24;\r\n            options.endMinutes = 59;\r\n        }else {\r\n            options.endYear =  options.beginYear + 10 ;\r\n        }\r\n\r\n        //生成\r\n        self._createYear();\r\n        self._createMonth();\r\n        self._createDay();\r\n        self._createHours();\r\n        self._createMinutes();\r\n    };\r\n\r\n    // 更新选择框,更新当前值\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.options.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    // 判断最大最小值合理性\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.options.endDate = date;\r\n        this._create();\r\n    };\r\n\r\n    DtPicker.prototype.dispose = function () {\r\n        var self = this;\r\n        self.hide();\r\n        setTimeout(function () {\r\n            self.ui.picker.parentNode.removeChild(self.ui.picker);\r\n            for (var name in self) {\r\n                self[name] = null;\r\n                delete self[name];\r\n            }\r\n            self.disposed = true;\r\n        }, 300);\r\n    };\r\n\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    DtPicker.prototype.clickCall = function(index){\r\n        var self = this;\r\n        var sltDate = self.getSelected();\r\n        var rs = self.options.callBack.call(this , sltDate, index);\r\n        if (rs !== false) {\r\n            if(index == 1){ // 假定确认按钮在第二个位置,传回true则存储当前值\r\n                self.value = sltDate.value;\r\n            }else if(index == 2){\r\n                self.value = null;\r\n            }\r\n            self.hide();\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    DtPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.clickCall(0);\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.dtPicker = function(options){\r\n        return new DtPicker(options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","// 支持非循环\r\n// size命名用的有点混淆。。\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n\r\n(function (ipu, $, Hammer) {\r\n    function HammerCarousel(navSlt, options) {\r\n        this.options = options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(navSlt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    // 直接替换掉了prototype对象,可能不是个好选择\r\n    HammerCarousel.prototype = {\r\n        defaultOptions: {\r\n            index: null,        // 默认显示第几个项,其实挺没用的,默认显示第一个,用户再调用一下显示第几个,作用一样现在。\r\n            autoPlay: false,    // 是否自动轮播\r\n            duration: 3000,     // 轮播间隔\r\n            indicator: false,  //是否生成指示器,即小点点\r\n            callBack: null,  // 轮播后回调函数\r\n            clickBack: null   // 各子项用户点击事件\r\n            //indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\r\n\r\n\r\n            this.showSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n            this.carouselItemSizes = [];\r\n            this.currentIndex = 0;\r\n            this.moveLen = 0;\r\n            this.lastItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来判断是复制项\r\n\r\n            // 这里假设每个元素都是相等的\r\n            this.carouselItems.slice(0, this.showSize).clone().appendTo(this.wrapper); // 如果做无限循环则要这样处理\r\n            this.size = this.carouselItems.size();\r\n\r\n            var self = this;\r\n            if(this.options.clickBack){\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        self.options.clickBack.call(this, i%self.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this.sizeCount();\r\n            var that = this;\r\n\r\n            this.hammer = new Hammer.Manager(this.el); // 避免因为li里面的内容高度不够,而不能触发相关事件\r\n            this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_HORIZONTAL, threshold: 10}));\r\n            this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this.onPan, this));\r\n\r\n            $(window).resize(function () { // 在尺寸变化时,处理,是否可以考虑只在宽度变化时处理,横屏事件?\r\n                that.refresh();\r\n            });\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.options.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.options.index);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.options.autoPlay = false;\r\n        },\r\n        _pause: function () {\r\n            if (this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            if (index == this.size - 1) {\r\n                this._show(this.size, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        next: function () {//下一张\r\n            var index = this.currentIndex == this.size ? 1 : this.currentIndex + 1;\r\n            if (index == 1) {\r\n                this._show(0, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % size;\r\n            if(index < 0 ){\r\n                index = size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        play: function () {\r\n            this.options.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.options.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    that.timeoutId = null;//清空这个timeoutId,代表该次处理已经执行了\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {//移动结束时调用\r\n            var currentIndex = this.currentIndex;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n\r\n            this._play();//处理自动播放\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        sizeCount: function () {\r\n            this.wrapperSize = this.wrapper.outerWidth(true);\r\n            this.itemSize = this.carouselItems.eq(0).outerWidth(true);\r\n            this.mostSize = this.size * this.itemSize; // 宽度*数量\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\").width();\r\n\r\n            var that = this;\r\n            $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n                that.carouselItemSizes[index] = $(this).position().left;\r\n            });\r\n        },\r\n        refresh: function () {\r\n            if (this.wrapperSize != this.wrapper.outerWidth(true)) {\r\n                this.sizeCount();\r\n                this._show(this.currentIndex, true); //新的位置\r\n            }\r\n        },\r\n        move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\");\r\n            var move = (this.moveLen - moveLen) % this.mostSize;\r\n            move = (move + this.mostSize) % this.mostSize;\r\n            this.displayMoveLen = move;\r\n\r\n            move = -move + \"px\";\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        },\r\n        _show: function (index, animate) { // 知道最终移动到的项时,调用\r\n            if (animate !== false) { // 默认值为true\r\n                animate = true;\r\n            }\r\n\r\n            this._pause();\r\n            $(this.wrapper).toggleClass(\"ui-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            //this.currentIndex = index;\r\n            this.lastItem = index == this.size;\r\n            var move = this.carouselItemSizes[index];\r\n            this.moveLen = move;\r\n            move = -move + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n            if (animate) {\r\n                this._end();\r\n            }\r\n        },\r\n        onPan: function (ev) {\r\n            var delta = ev.deltaX;\r\n            // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n            if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n                var value = delta / this.itemSize;\r\n                var intValue = parseInt(Math.abs(value));               // 取整数\r\n                var decimal = Math.abs(value) % 1;                   // 取小数\r\n\r\n                if (decimal > 0.2) { // 滑动超过页面宽20%;\r\n                    intValue = intValue + 1;\r\n                }\r\n                if (value > 0) {\r\n                    intValue = -intValue;\r\n                }\r\n\r\n                var index = (this.currentIndex + intValue) % this.size;\r\n                index = (index + this.size) % this.size; // 因为可能是个负值,转换成正值\r\n\r\n                // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n                if (index == 0 && this.displayMoveLen > this.itemSize) {\r\n                    index = this.size;\r\n                }\r\n                this._show(index);\r\n            } else if (ev.type == 'panmove'){\r\n                this.move(delta);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.hammerCarousel = function (slt, options) {\r\n        return new HammerCarousel(slt, options);\r\n    };\r\n})(ipu || window, jQuery,  Hammer);\r\n","(function (ipu, $) {\r\n    //$ extends\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        // console.log('__dealCssEvent');\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            /*jshint validthis:true */\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.transitionEnd = function (callback) {\r\n        // console.log('transitionEnd');\r\n        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalStack: true,\r\n        modalButtonOk: '确定',\r\n        modalButtonCancel: '取消',\r\n        modalPreloaderTitle: '加载中',\r\n        modalContainer: document.body ? document.body : 'body'\r\n    };\r\n\r\n    ipu.modalStack = [];\r\n\r\n    ipu.modalStackClearQueue = function () {\r\n        if (ipu.modalStack.length) {\r\n            (ipu.modalStack.shift())();\r\n        }\r\n    };\r\n    ipu.modal = function (params) {\r\n        params = params || {};\r\n        var modalHTML = '';\r\n        var buttonsHTML = '';\r\n        if (params.buttons && params.buttons.length > 0) {\r\n            for (var i = 0; i < params.buttons.length; i++) {\r\n                buttonsHTML += '<span class=\"ui-modal-button' + (params.buttons[i].bold ? ' ui-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\r\n            }\r\n        }\r\n        var extraClass = params.extraClass || '';\r\n        var titleHTML = params.title ? '<div class=\"ui-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ui-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ui-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ui-modal-buttons-vertical' : '';\r\n        modalHTML = '<div class=\"ui-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ui-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ui-modal-buttons ' + verticalButtons + '\">' + buttonsHTML + '</div></div>';\r\n\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n\r\n        var modal = $(_modalTemplateTempDiv).children();\r\n\r\n        $(defaults.modalContainer).append(modal[0]);\r\n\r\n        // Add events on buttons\r\n        modal.find('.ui-modal-button').each(function (index, el) {\r\n            $(el).on('click', function (e) {\r\n                if (params.buttons[index].close !== false) ipu.closeModal(modal);\r\n                if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\r\n                if (params.onClick) params.onClick(modal, index);\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n    ipu.alert = function (text, title, callbackOk) {\r\n        if (typeof title === 'function') {\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\r\n        });\r\n    };\r\n    ipu.confirm = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [\r\n                {text: defaults.modalButtonCancel, omodalButtonCancelnClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n    ipu.prompt = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            afterText: '<input type=\"text\" class=\"ui-modal-text-input\">',\r\n            buttons: [\r\n                {\r\n                    text: defaults.modalButtonCancel\r\n                },\r\n                {\r\n                    text: defaults.modalButtonOk,\r\n                    bold: true\r\n                }\r\n            ],\r\n            onClick: function (modal, index) {\r\n                if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ui-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ui-modal-text-input').val());\r\n            }\r\n        });\r\n    };\r\n\r\n    var minLoad = false;        // 是否最小时间调用方式\r\n    var loadOverTime = false;   // 是否超过最小调用时间\r\n    var loadEnd = false;        // 是否调用结束\r\n    var loadTimeOut = null;     // 延时调用ID\r\n\r\n    ipu.showPreloader = function (title, minTime) {\r\n        ipu.hidePreloader(true);\r\n\r\n        ipu.showPreloader.preloaderModal = ipu.modal({\r\n            title: title || defaults.modalPreloaderTitle,\r\n            text: '<div class=\"ui-preloader\"></div>'\r\n        });\r\n\r\n        if(minTime){\r\n            minLoad = true;\r\n            loadTimeOut = setTimeout(function () {\r\n                loadOverTime = true;\r\n                if(loadEnd){\r\n                    ipu.hidePreloader();\r\n                }\r\n            }, minTime);\r\n        }\r\n\r\n        return ipu.showPreloader.preloaderModal;\r\n    };\r\n    ipu.hidePreloader = function (force) {\r\n        if(force || !minLoad || (minLoad && loadOverTime)){\r\n            if(force && loadTimeOut){\r\n                window.clearTimeout(loadTimeOut);\r\n            }\r\n            ipu.showPreloader.preloaderModal && ipu.closeModal(ipu.showPreloader.preloaderModal);\r\n            minLoad = false; // 重置各标志位\r\n            loadOverTime = false;\r\n            loadEnd = false;\r\n            loadTimeOut = null;\r\n        }else{\r\n            loadEnd = true;\r\n        }\r\n    };\r\n    ipu.showIndicator = function () {\r\n        if ($('.ui-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ui-preloader-indicator-overlay\"></div><div class=\"ui-preloader-indicator-modal\"><span class=\"ui-preloader ui-preloader-white\"></span></div>');\r\n    };\r\n    ipu.hideIndicator = function () {\r\n        $('.ui-preloader-indicator-overlay, .ui-preloader-indicator-modal').remove();\r\n    };\r\n    // Action Sheet\r\n    ipu.actions = function (params) {\r\n        var modal, groupSelector, buttonSelector;\r\n        params = params || [];\r\n\r\n        if (params.length > 0 && !$.isArray(params[0])) {\r\n            params = [params];\r\n        }\r\n        var modalHTML;\r\n        var buttonsHTML = '';\r\n        for (var i = 0; i < params.length; i++) {\r\n            for (var j = 0; j < params[i].length; j++) {\r\n                if (j === 0) buttonsHTML += '<div class=\"ui-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ui-actions-modal-label' : 'ui-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ui-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ui-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ui-bg-' + button.bg;\r\n                if (button.disabled) buttonClass += ' disabled';\r\n                buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\r\n                if (j === params[i].length - 1) buttonsHTML += '</div>';\r\n            }\r\n        }\r\n        modalHTML = '<div class=\"ui-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ui-actions-modal-group';\r\n        buttonSelector = '.ui-actions-modal-button';\r\n\r\n        var groups = modal.find(groupSelector);\r\n        groups.each(function (index, el) {\r\n            var groupIndex = index;\r\n            $(el).children().each(function (index, el) {\r\n                var buttonIndex = index;\r\n                var buttonParams = params[groupIndex][buttonIndex];\r\n                var clickTarget;\r\n                if ($(el).is(buttonSelector)) clickTarget = $(el);\r\n                // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\r\n\r\n                if (clickTarget) {\r\n                    clickTarget.on('click', function (e) {\r\n                        if (buttonParams.close !== false) ipu.closeModal(modal);\r\n                        if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n                    });\r\n                }\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n\r\n    //显示一个消息,会在2秒钟后自动消失\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ui-modal ui-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n        ipu.openModal($toast, function () {\r\n            setTimeout(function () {\r\n                ipu.closeModal($toast);\r\n            }, duration || 2000);\r\n        });\r\n    };\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isNotToast = !modal.hasClass('ui-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n        if ($('.ui-modal.ui-modal-in:not(.ui-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\r\n            ipu.modalStack.push(function () {\r\n                ipu.openModal(modal, cb);\r\n            });\r\n            return;\r\n        }\r\n        var isPopup = modal.hasClass('ui-popup');\r\n        var isLoginScreen = modal.hasClass('ui-login-screen');\r\n        var isPickerModal = modal.hasClass('ui-picker-modal');\r\n        var isToast = modal.hasClass('ui-toast');\r\n        if (isModal) {\r\n            modal.show();\r\n            modal.css({\r\n                marginTop: -Math.round(modal.outerHeight() / 2) + 'px'\r\n            });\r\n        }\r\n        if (isToast) {\r\n            modal.css({\r\n                marginLeft: -Math.round(modal.outerWidth() / 2 ) + 'px' //1.185 是初始化时候的放大效果\r\n            });\r\n        }\r\n\r\n        var overlay;\r\n        if (!isLoginScreen && !isPickerModal && !isToast) {\r\n            if ($('.ui-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ui-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        }\r\n\r\n        //Make sure that styles are applied, trigger relayout;\r\n        var clientLeft = modal[0].clientLeft;\r\n\r\n        // Trugger open event\r\n        modal.trigger('open');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).addClass('ui-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('ui-modal-overlay-visible');\r\n        modal.removeClass('ui-modal-out').addClass('ui-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n        });\r\n        // excute callback\r\n        if (typeof cb === 'function') {\r\n            cb.call(this);\r\n        }\r\n        return true;\r\n    };\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ui-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isPopup = modal.hasClass('ui-popup'),\r\n            isToast = modal.hasClass('ui-toast'),\r\n            isLoginScreen = modal.hasClass('ui-login-screen'),\r\n            isPickerModal = modal.hasClass('ui-picker-modal'),\r\n            removeOnClose = modal.hasClass('ui-remove-on-close'),\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ui-popup.ui-modal-in').length) {\r\n                overlay.removeClass('ui-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ui-modal-overlay-visible');\r\n        }\r\n        modal.trigger('close');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).removeClass('ui-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ui-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ui-modal-in').addClass('ui-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ui-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ui-modal-out').hide();\r\n                if (removeOnClose && modal.length > 0) {\r\n                    modal.remove();\r\n                }\r\n            }\r\n            else {\r\n                modal.remove();\r\n            }\r\n        });\r\n        if (isModal && defaults.modalStack) {\r\n            ipu.modalStackClearQueue();\r\n        }\r\n\r\n        return true;\r\n    };\r\n    function handleClicks(e) {\r\n        /*jshint validthis:true */\r\n        var clicked = $(this);\r\n        var url = clicked.attr('href');\r\n\r\n\r\n        //Collect Clicked data- attributes\r\n       /* var clickedData = clicked.dataset();\r\n\r\n        // Popup\r\n        var popup;\r\n        if (clicked.hasClass('ui-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ui-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ui-modal-overlay')) {\r\n            if ($('.ui-modal.ui-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ui-modal.ui-modal-in');\r\n            if ($('.ui-actions-modal.ui-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ui-actions-modal.ui-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ui-popup-overlay')) {\r\n            if ($('.ui-popup.ui-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ui-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ui-modal-overlay, .ui-popup-overlay, .ui-close-popup, .ui-open-popup, .ui-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n    NavBar.prototype.defaultOpt = {\r\n        animate: false,           // 默认有动画\r\n        contentSlt: \".ui-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) { // currentIndex: 当前索引,lastIndex上一次索引(第一次时为null)\r\n        }\r\n    };\r\n\r\n    function NavBar(slt, options) {\r\n        this.options = $.extend({}, this.defaultOpt, options);\r\n        this.content = $(this.options.contentSlt);\r\n        this.nav = $(slt);\r\n        this.wrapper = $(\">ul\", this.content);\r\n        this.contents = $(\">li\", this.wrapper);\r\n        this.navs = $(\">a\", this.nav);\r\n        var me = this;\r\n\r\n        var activeIndex = this.navs.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.options.animate) {\r\n            this.wrapper.addClass(\"ui-no-animation\")\r\n        }\r\n\r\n        this.navs.each(function (index, i) {\r\n            $(this).click(function () {\r\n                me.show(index);\r\n            });\r\n        });\r\n\r\n        this.lastIndex = null;\r\n        this.currentIndex = null;\r\n        me.show(this.options.index);\r\n    }\r\n\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            var currentContent = $(this.contents[index]).addClass(\"ui-show\");\r\n\r\n            if (this.options.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ui-show\"); // 隐藏上上个元素\r\n                }\r\n\r\n                if (this.currentIndex != null) {        // 非第一次需要动画效果\r\n                    if (this.currentIndex < index) {   // 需要内容为往左走,显示右边的内容\r\n                        if (this.lastIndex != null && this.lastIndex < this.currentIndex) {  // 内容已经左走过了,则需要移除动画复原位置,再通过width()方法强制生效\r\n                            this.wrapper.addClass(\"ui-no-animation\").removeClass(\"ui-nav-content-right\").width(); // 可以强制刷新,默认jquery应该会将这些dom上的修改延时处理?\r\n                        }\r\n                    } else {\r\n                        if (this.lastIndex == null || this.lastIndex > this.currentIndex) { // 类似同上\r\n                            this.wrapper.addClass(\"ui-no-animation\").addClass(\"ui-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ui-no-animation\").toggleClass(\"ui-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ui-show\");\r\n            }\r\n\r\n            // 更新class,ui-current状态\r\n            $(this.contents[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n            $(this.navs[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.navBar = function (slt, options) {\r\n        return new NavBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.animationEnd = function (callback) {\r\n        __dealCssEvent.call(this, ['webkitAnimationEnd', 'animationend'], callback);\r\n        return this;\r\n    };\r\n\r\n    function submitForm(doc, url ,params){\r\n        var form = doc.createElement(\"form\");\r\n        form.action = url;\r\n        form.method = \"post\";\r\n        form.style.display = \"none\";\r\n\r\n        for (var x in params) {\r\n            var ele = doc.createElement(\"input\");\r\n            ele.type=\"hidden\";\r\n            ele.name = x;\r\n            ele.value =  params[x];\r\n            form.appendChild(ele);\r\n        }\r\n\r\n        doc.body.appendChild(form);\r\n        form.submit();\r\n    }\r\n\r\n    // 检查是否有ui-pages的结构\r\n    function checkPages() {\r\n        if(!hasPages){\r\n            pagesObj = $(\".ui-pages\"); // pagesObj为空则进行jquery取值\r\n            if(pagesObj.size() == 0){\r\n                pagesObj =  $(\"<div class='ui-pages'><div class='ui-page ui-show \"+zeroPageClass+\"' id='\"+pageIdPrefix+\"0'></div>\").appendTo(\"body\");\r\n            }\r\n            hasPages = true;\r\n        }\r\n    }\r\n\r\n    // 站位页面\r\n    function isZeroPage(page) {\r\n        return $(page).hasClass(zeroPageClass);\r\n    }\r\n\r\n    var page = {};\r\n    var hasPages = false;\r\n    var maps = {};\r\n    var pageNo = 1; // 编号0留给主页面或当前页面,或没有\r\n    var pageIdPrefix = \"ipuPage-\";\r\n    var pagesObj = null;\r\n    var animateInClass = \"ui-anim ui-slideRightIn\";\r\n    var animateOutClass  = \"ui-anim ui-slideRightOut\";\r\n    var eventName = \"ipuUIPageBack\";\r\n    var zeroPageClass = 'ui-page-zero';   // 占位页面,对于为当前页面\r\n    var zeroPagesClass = 'ui-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\r\n\r\n\r\n\r\n    page.options = {     // 那个窗口执行open,默认父窗口\r\n        target: window.parent, // 默认执行父窗口,方法:all\r\n        backIndex: -1,    // 默认回退一页         方法:back\r\n        closeIndex: -1,   // 默认关闭最近一个页面 方法:close\r\n        params:{},        // post的传参            方法:post\r\n        animate: true,     // 是否动画效果        方法:open post\r\n        showLoading: true,   // 是否显示加载消息  方法:open post\r\n        loadingMessage: '正在加载中',  //          方法:open post\r\n        method : null,     // 请求方式,内置参数,方法自己设置,用户不需要设置  方法:无\r\n        minMessageTime: 500, // 最小显示加载时间,避免出现闪现的情况 方法:open post\r\n        data: null,         // 回退时,回传参数, 方法:back\r\n        pageName: '',     // 给打开的页面命名,以便根据此页面名称来切换页面 方法:open post back close\r\n        callBack:function () { // 事件回调       方法:open post close back\r\n        }\r\n    };\r\n\r\n    // 当前页面加载,针对顶层父窗口\r\n    page.openPage = function (url, options) {\r\n        var newPage = null;\r\n        var nowPageNo = pageIdPrefix + (pageNo++);\r\n        maps[nowPageNo] = url;\r\n\r\n        checkPages();\r\n\r\n        if(options.showLoading){\r\n            ipu.showPreloader(options.loadingMessage, options.minMessageTime);\r\n        }\r\n\r\n        if(options.method == 'post'){\r\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe'></iframe></div>\");\r\n        }else{\r\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe' src='\"+url+\"'></iframe></div>\");\r\n        }\r\n\r\n        var zeroPage = isZeroPage($(\".ui-page:last\", pagesObj));\r\n        var animatePage = newPage;\r\n        if(zeroPage){\r\n            animatePage = pagesObj.addClass(zeroPagesClass);\r\n        }\r\n\r\n        function end() {\r\n            if(options.showLoading) {\r\n                ipu.hidePreloader();\r\n            }\r\n\r\n            if(options.animate) {\r\n                animatePage.removeClass(animateInClass);\r\n            }\r\n\r\n            newPage.siblings(\".ui-show\").removeClass('ui-show');\r\n            if(options.callBack){\r\n                options.callBack();\r\n            }\r\n        }\r\n\r\n        $(\".ui-page-iframe\", newPage).one('load', function () {\r\n            newPage.addClass(\"ui-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\r\n\r\n            if(zeroPage){\r\n                animatePage.removeClass(zeroPagesClass);\r\n            }\r\n            if(options.animate){\r\n                animatePage.addClass(animateInClass).animationEnd(end);\r\n            }else{\r\n                end();\r\n            }\r\n        });\r\n\r\n        newPage.appendTo(pagesObj);\r\n        if(options.method == 'post') {\r\n            var pageDoc = $(\".ui-page-iframe\", newPage)[0].contentDocument;\r\n            submitForm(pageDoc, url, options.params);\r\n        }\r\n    };\r\n\r\n    // post方式加载页面\r\n    page.postPage = function (url, options) {\r\n        options.method = 'post';\r\n        page.openPage(url, options);\r\n    };\r\n\r\n    // 当前页面后退,针对顶层父窗口\r\n    page.backPage = function (options) {\r\n        var backIndex = options.backIndex;\r\n        var page = null;\r\n        var nowPage = $(\".ui-page.ui-show\", pagesObj);\r\n\r\n        if(options.pageName){\r\n            page =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj);\r\n        }else if(backIndex == 0){\r\n            page = $(\".ui-page:first\", pagesObj);\r\n        }else { // 越界的情况\r\n            var prevPage = nowPage.prevAll(\".ui-page\");\r\n            if(backIndex < 0){\r\n                page= $(prevPage[-backIndex - 1]);\r\n            }else{\r\n                page= $(prevPage[prevPage.size() - backIndex]);\r\n            }\r\n        }\r\n\r\n        var animatePage = nowPage;\r\n        var zeroPage = isZeroPage(page);\r\n\r\n        // 主页面模式时\r\n        if(zeroPage){\r\n            animatePage = pagesObj;\r\n        }else{\r\n            page.addClass(\"ui-show\"); //显示前一个\r\n        }\r\n\r\n        function end (){\r\n            $(this).removeClass(animateOutClass);\r\n            page.nextAll(\".ui-page\").remove();\r\n\r\n            var iframe = $(\".ui-page-iframe\", page);\r\n            var nowDoc;\r\n\r\n            if(iframe.size() == 0){ // 找不到子窗口就当是返回了主页面,在当前窗口触发\r\n                nowDoc = window.document;\r\n            }else{\r\n                nowDoc = iframe[0].contentDocument;\r\n            }\r\n\r\n            if(zeroPage){\r\n                pagesObj.addClass(zeroPagesClass);\r\n            }\r\n\r\n            var evt = nowDoc.createEvent('Event');\r\n            evt.initEvent(eventName, true, true);\r\n            if(options.data){\r\n                evt.data = options.data;\r\n            }\r\n            nowDoc.body.dispatchEvent(evt);\r\n            if(options.callBack){\r\n                options.callBack();\r\n            }\r\n        }\r\n\r\n        if(options.animate){\r\n            animatePage.addClass(animateOutClass).animationEnd(end);\r\n        }else{\r\n            end();\r\n        }\r\n    };\r\n\r\n    // 往前关闭窗口\r\n    page.closePage = function (options) {\r\n        var closeIndex = options.closeIndex;\r\n        var prevPage = $(\".ui-page.ui-show\", pagesObj).prevAll(\".ui-page\");\r\n\r\n        if(options.pageName){\r\n            closeIndex =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj).index();\r\n        }else if(closeIndex < 0){\r\n            closeIndex = -closeIndex -1;\r\n        }else{\r\n            closeIndex = prevPage.size() - closeIndex;\r\n        }\r\n\r\n        $(prevPage[closeIndex]).remove();\r\n        if(options.callBack){\r\n            options.callBack();\r\n        }\r\n    };\r\n\r\n    // 调用父窗口打开页面\r\n    page.open = function (url, options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.openPage(url, options);\r\n    };\r\n\r\n    // post方法\r\n    page.post = function (url, options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.method = 'post';\r\n        options.target.ipu.page.openPage(url, options);\r\n    };\r\n\r\n    // 调用父窗口,回退\r\n    page.back = function (options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.backPage(options);\r\n    };\r\n\r\n    // 返回首页\r\n    page.backHome = function (options) {\r\n        options = options || {};\r\n        options.backIndex = 0;\r\n        page.back(options);\r\n    };\r\n\r\n    // 子窗口,待确认\r\n    page.close = function (options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.closePage(options);\r\n    };\r\n\r\n    // 添加回调事件\r\n    page.onBack = function (back) {\r\n        $(\"body\").on(eventName, function (e) {\r\n            var data = e.originalEvent.data;\r\n            back(data);\r\n        });\r\n    };\r\n\r\n    // 提供一个关闭一群窗口的方法\r\n    ipu.page = page;\r\n})(ipu || window, jQuery);\r\n","// picker\r\n(function (ipu, $, Hammer) {\r\n    var showItemSize = 9;   // 显示的子项数量,\r\n    var r = 90;             // 计算旋转的圆半径,结果应该缩小,是为了r不要距离容器太近\r\n    var itemAngle = 180 / showItemSize;   // 每项对应的角度是 180/9 = 20\r\n    var maxExceed = itemAngle;         // 滚动时允许超出边界的最大角度\r\n    // itemHeight = 40px;       // 需要给出r=89是怎么计算出来的,是根据 40/2/Math.tan(40/2/180*Math.PI)=113,直接太大不好看\r\n\r\n    function Picker(slt, options) {\r\n        this.el = $(slt)[0];\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this._init();\r\n    }\r\n\r\n    // 默认参数\r\n    Picker.prototype.defaultOptions = {\r\n        onChange: function () {       // 子项选中事件\r\n        },\r\n        listen: true,                  // 默认已开记监听变化\r\n        data: []\r\n    };\r\n\r\n    Picker.prototype._init = function () {\r\n        var self = this;\r\n        this.wrap = $(\">ul\", this.el);\r\n        this.index = null;\r\n        this.listen = !!this.options.listen;\r\n\r\n        this.beginAngle = 0;\r\n        this.beginExceed = this.beginAngle - maxExceed;       // 最小角度值\r\n        this.stopInertiaMove = false;\r\n        this.lastAngle = null; // 保存滑动前的角度\r\n        this.empty = this.options.data.length == 0;\r\n\r\n        // 如果是ios,则ul的旋转中心点,有变化\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+r+\"px\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n        this.hammer = new Hammer.Manager(this.el);\r\n        this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_VERTICAL, threshold: 5}));\r\n        this.hammer.add(new Hammer.Press({threshold: 4}));  //\r\n        this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this._onPan, this));\r\n\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\r\n           // console.log('press');\r\n            if(this.empty){\r\n                return ;\r\n            }\r\n\r\n            self.stopInertiaMove = true;\r\n            if (e.type == 'pressup') {\r\n                self.endScroll();\r\n            }\r\n        });\r\n\r\n        this.setItems(this.options.data);\r\n    };\r\n\r\n    Picker.prototype.setItems = function (data, textName) {\r\n        this.wrap.empty(); // 清空历史数据\r\n        this.data = data = data || [];\r\n        this.empty = data.length == 0; // 数据是否为空\r\n\r\n        this.newData = true; // 表示设置了新数据,触发change回调,但第一次设置时,不需要触发\r\n        var self = this;\r\n        var lis = \"\";\r\n        textName = textName || 'text';\r\n\r\n        for (var i = 0, j = data.length; i < j; i++) {\r\n            lis = lis + \"<li>\" + data[i][textName] + \"</li>\";\r\n        }\r\n\r\n        $(lis).appendTo(this.wrap);\r\n\r\n        this.items = $(\">li\", this.wrap);\r\n        this.itemsSize = this.items.size();\r\n\r\n        this.endAngle = (this.empty ? 0 : this.itemsSize - 1) * itemAngle;\r\n        this.endExceed = this.endAngle + maxExceed;  // 最大旋转角度值\r\n\r\n        // 初始化各子项角度\r\n        this.items.each(function (i) {\r\n            $(this).css({\r\n                \"transform\": \"translateZ(\" + r + \"px) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + r + \"px\"\r\n            });\r\n            $(this).click(function () {\r\n                self.stopInertiaMove = true;\r\n                self.setAngle(i * itemAngle, true);\r\n            })\r\n        });\r\n\r\n        var newAngle ;\r\n        if(this.empty || this.index == null){\r\n            newAngle = 0;\r\n        }else {\r\n            if(this.index > this.itemsSize - 1){\r\n                newAngle = (this.itemsSize - 1) * itemAngle;\r\n            }else{\r\n                newAngle = this.index * itemAngle;\r\n            }\r\n        }\r\n        this.setAngle(newAngle, true);\r\n\r\n        /*if (this.index !== null) { // 当前已经旋转则,保留当前的索引\r\n         if (this.index > this.itemsSize - 1 && !this.empty) {\r\n         this.index = this.itemsSize - 1;\r\n         }\r\n         this.setAngle(this.index * itemAngle, true);\r\n         } else { // 第一次初始数据,不触发change事件\r\n         this.index = 0;     // 被调用后,不能再使用null值了\r\n         this.setAngle(0, false); // 第一次设置初始化时,不触发change事件\r\n         }*/\r\n    };\r\n\r\n    Picker.prototype._onPan = function (ev) {\r\n        if(this.empty){\r\n            return ;\r\n        }\r\n\r\n        //console.log(ev.deltaX + \"==\"+ ev.deltaY);\r\n        if (ev.type == 'panstart') { // 好像一定要移动才有startg事件\r\n            self.stopInertiaMove = true;\r\n            this.lastAngle = this.angle;\r\n            this.wrap.addClass(\"ui-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\r\n           // console.log('panstart');\r\n\r\n        } else if (ev.type == 'panmove') {\r\n            var moveAngle = this.calcAngle(ev.deltaY);\r\n            var newAngle = this.lastAngle - moveAngle;   //最新的角度\r\n            //console.log('=='+newAngle);\r\n            // 一个可以转动的最小值和最大值过滤\r\n            if (newAngle < this.beginExceed) {\r\n                newAngle = this.beginExceed;\r\n            }\r\n            if (newAngle > this.endExceed) {\r\n                newAngle = this.endExceed;\r\n            }\r\n            this.setAngle(newAngle);\r\n\r\n        } else { // end or cancel事件\r\n            // console.log('end or cancel:' + ev.type);\r\n            var v = ev.overallVelocityY;    // 滑动的速度\r\n            var dir = v > 0 ? -1 : 1; //加速度方向\r\n            var deceleration = dir * 0.0006 * -1;\r\n            var duration = Math.abs(v / deceleration); // 速度消减至0所需时间\r\n            var dist = v * duration / 2; //最终移动多少\r\n\r\n            var startAngle = this.angle;\r\n            var distAngle = -this.calcAngle(dist);\r\n           //  console.log(\"dist=\" + dist + \", distAngle\" + distAngle);\r\n\r\n            //----\r\n            var srcDistAngle = distAngle;\r\n            if (startAngle + distAngle < this.beginExceed) {\r\n                distAngle = this.beginExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n            if (startAngle + distAngle > this.endExceed) {\r\n                distAngle = this.endExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n\r\n            if (distAngle == 0) {\r\n                this.endScroll();\r\n                return;\r\n            }\r\n            this.scrollDistAngle(startAngle, distAngle, duration);\r\n        }\r\n    };\r\n\r\n    // 计算移动的角度,转动的角度,就是移动的距离对应相关圆周\r\n    // 2*r*PI = 360,  angle = 360*c/(2*r*PI)\r\n    var ca = 360 / (2 * r * Math.PI);\r\n    Picker.prototype.calcAngle = function (c) {\r\n        return c * ca;\r\n    };\r\n\r\n    // endScroll 是否为结束的滚动结束,滚动结束需要调用结束事件\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(1000px) rotateY(0deg) rotateX(\" + newAngle + \"deg)\");\r\n        this.calcItemVisable(newAngle);\r\n\r\n        if (endScroll) {\r\n            var index = newAngle / itemAngle;\r\n            var oldIndex = this.index;\r\n            this.index = this.empty ? null : index; // 这里可以做一个判断,如果是empty,则index值可以不改变\r\n\r\n            // 这个地方要判断下,数据更新或索引更新都要触发\r\n            if (oldIndex != index || this.newData) {\r\n                this.newData = false;\r\n               // console.log('change');\r\n                if (this.options.onChange && this.listen) {\r\n                    // console.log('changed call');\r\n                    this.options.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n            }\r\n        }\r\n    };\r\n\r\n    // 计算子项的显示情况\r\n    Picker.prototype.calcItemVisable = function (angle) {\r\n        this.items.each(function (index) {\r\n            var difference = Math.abs(index * itemAngle - angle);\r\n\r\n            if (difference < itemAngle / 2) {\r\n                $(this).addClass(\"ui-highlight ui-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ui-highlight ui-visible\");\r\n            } else {\r\n                $(this).addClass(\"ui-visible\").removeClass(\"ui-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ui-noanimate\");\r\n        var endAngle;\r\n\r\n        if (this.angle < this.beginAngle) {\r\n            endAngle = this.beginAngle;\r\n        } else if (this.angle > this.endAngle) {\r\n            endAngle = this.endAngle;\r\n        } else {\r\n            var index = parseInt((this.angle / itemAngle).toFixed(0));\r\n            endAngle = (itemAngle * index);\r\n        }\r\n\r\n        this.setAngle(endAngle, true);\r\n    };\r\n\r\n    // 进行惯性滚动\r\n    Picker.prototype.scrollDistAngle = function (startAngle, distAngle, duration) {\r\n        var self = this;\r\n        var nowTime = new Date().getTime();\r\n        this.stopInertiaMove = false;\r\n        duration = 1 * duration; // 滚动时长控制修改\r\n\r\n        // hammer调用的惯性函数\r\n        (function (nowTime, startAngle, distAngle, duration) {\r\n            var frameInterval = 13;\r\n            var stepCount = duration / frameInterval;\r\n            var stepIndex = 0;\r\n\r\n            (function inertiaMove() {\r\n                if (self.stopInertiaMove) return;\r\n                var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);\r\n                self.setAngle(newAngle);\r\n                stepIndex++;\r\n\r\n                if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {\r\n                    self.endScroll();\r\n                    return;\r\n                }\r\n\r\n                setTimeout(inertiaMove, frameInterval);\r\n            })();\r\n\r\n        })(nowTime, startAngle, distAngle, duration);\r\n    };\r\n\r\n    Picker.prototype.setListen = function (bool) {\r\n        this.listen = !!bool;\r\n    };\r\n\r\n    Picker.prototype.quartEaseOut = function (t, b, c, d) {\r\n        return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n    };\r\n\r\n    Picker.prototype.setSelectedValue = function (value) {\r\n        var self = this;\r\n        for (var index in self.data) {\r\n            var item = self.data[index];\r\n            if (item.value == value) {\r\n                self.setAngle(index* itemAngle, true);\r\n                return;\r\n            }\r\n        }\r\n    };\r\n\r\n    // 获取当前选中的值\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    Picker.prototype.getSelectedIndex = function () {\r\n        return this.index;\r\n    };\r\n\r\n    ipu.Picker = Picker;\r\n\r\n})(ipu || window, jQuery, Hammer);\r\n","// popPicker\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n\r\n    function PopPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                        </div>\\\r\n                    </div>',\r\n        pickerTemplate: '<div class=\"ui-picker\">\\\r\n                            <div class=\"ui-picker-selectbox\"></div>\\\r\n                            <ul></ul>\\\r\n                          </div>',\r\n        data: [],    // 数据\r\n        layer: 1,   // 数据层级\r\n        btns: ['取消', '确认'],\r\n        callBack: function () { // 选择数据时的回调函数\r\n\r\n        }\r\n    };\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.options.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ui-poppicker-body\", this.holder);\r\n\r\n        var layer = this.options.layer;\r\n        var width = (100 / layer) + \"%\";\r\n        this.pickers = new Array(layer);\r\n        var self = this;\r\n        var pickerHtml;\r\n        this.mask = this.createMask();\r\n\r\n        // 先初始化最底层picerk,再上面来\r\n        for (var i = layer -1; i >=0; i--) {\r\n            pickerHtml = $(this.options.pickerTemplate).prependTo(bodyHtml).css({width: width});\r\n\r\n            this.pickers[i] = new  Picker(pickerHtml, {\r\n                onChange: (function (i) {\r\n                    return function (item, index) { // 更新底部的值\r\n                        if (i != layer - 1) {\r\n                            self.pickers[i + 1].setItems(item.data);\r\n                        }\r\n                    };\r\n                })(i)\r\n            });\r\n        }\r\n\r\n        $(\".ui-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.options.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.options.btns[1]);\r\n\r\n        $(\".ui-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.options.btns[0]);\r\n    };\r\n\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 获取相关值\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.options.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.options.layer; i++) {\r\n                rs.push(this.pickers[i].getSelectedItem());\r\n            }\r\n            return rs;\r\n        }\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    PopPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.hide();\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.popPicker = function (options) {\r\n        return new PopPicker(options);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n\r\n    /**\r\n     *进度条\r\n     */\r\n    function progressBar(id, options) {\r\n        this.id = id;\r\n        this.level = options.level;\r\n        this.progress = options.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (options.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (options.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    progressBar.prototype.setProgress = function (pro) {\r\n        if (pro < 0 || pro > 100) return;\r\n\r\n        $(this.progressBar.find(\".ipu-progressbar\")).css(\"transform\", \"translate3d(\" + (-(100 - pro)) + \"%, 0px, 0px)\");\r\n        this.progress = pro;\r\n    };\r\n\r\n    progressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    progressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-hightlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-highlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    ipu.progressBar = function (slt, options) {\r\n        return new progressBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $, iScroll) {\r\n\r\n    // 扩展参数,iscroll组件的参数选项\r\n    // 扩展参数,用户直接在页面上自定好,顶端和底部加载html\r\n    // 设置上下条件长度,或计算函数\r\n    // 处理resize的问题,用户主动调用refresh??\r\n    // 底部启用或停用时,应该刷新组件iscroll高度\r\n    // 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n    Refresh.prototype.defaultOptions = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ui-refresh-bottom\"><span class=\"ui-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ui-refresh-top\"><span class=\"ui-refresh-loading\"></span><div class=\"ui-refresh-arrow\"></div></div>',\r\n                // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n                // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ui-refresh-top-loading\r\n                // 拖动达到加载距离,则增加class:ui-refresh-toload\r\n                // 加载中,则增加class:ui-refresh-top-loading,移除class:ui-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOptions:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    function Refresh(slt, options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOptions = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ui-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ui-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ui-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ui-refresh-toload');\r\n                    }\r\n                }\r\n\r\n                me._checkBottomLoading(); // 底部加载条件和顶部条件不一样,只要滚动离底部一定高度就开始加载\r\n                me.goTop = this.y > me.topPullOffset; // 记录是否位于顶部位置,以便刷新后可以回到此位置\r\n            },\r\n            onBeforeScrollEnd: function () {    // 一定是用户拖动触发,在滚动结束前应该触发\r\n                me._checkTopLoading();\r\n                me._checkBottomLoading();\r\n            },\r\n            onScrollEnd: function () { // 这个事件可能由非用户拖动时触发,可能是拖动惯性导致,所有顶部不应该处理,但顶部不管是否惯性,位置条件满足即触发\r\n                if (me.topLoading && this.y < this.minScrollY && me.goTop) {\r\n                    me.iScroll.scrollTo(0, this.minScrollY, 0);\r\n                }\r\n                me._checkBottomLoading(); // 在beforend执行还不够,还在要end执行\r\n            },\r\n            onRefresh: function () { // 刷新时,若顶部加载还在进行,且当前显示的顶部加载,则继续显示,否则刷新后会消失顶部加载,这里代码没有考虑重用了,应该可以做一步提取\r\n                if (me.topLoading) { // 如果顶部在加载,则刷新的时候,设置最小顶部距离,显示顶部加载状态\r\n                    this.minScrollY = this.minScrollY + me.topPullOffset;\r\n                }\r\n            }\r\n        };\r\n\r\n        this.iScrollOptions = $.extend({}, this.options.iScrollOptions, this.iScrollOptions);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOptions);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ui-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.options.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.options.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.options.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        this.topLoading = false;        // 顶部正在载加载\r\n        this.bottomLoading = false;     // 底部正在加载\r\n        this.bottomEnable = this.options.initEnableBottom && !!this.options.bottomLoadFun;\r\n        this.topEnable = this.options.initEnableTop && !!this.options.topLoadFun;\r\n        this.goTop = false;         // 用来处理,因为iScroll使用momentum(惯性), 导致有时顶部显示不正确问题,true表示顶部显示加载条\r\n\r\n        this.enableBottom(this.bottomEnable);\r\n        this.enableTop(this.topEnable);\r\n    };\r\n\r\n    // 检查是否需要底部加载\r\n    Refresh.prototype._checkBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            if (this.iScroll.y < this.iScroll.maxScrollY + this.bottomPullOffset) {\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    Refresh.prototype._checkTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            if (this.topEl.hasClass('ui-refresh-toload')) {\r\n                this._startTopLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 检查内容是否超出容器高度,未超出时,自动调用底部加载\r\n    Refresh.prototype._checkContentLoading = function () {\r\n        if(this.iScroll.maxScrollY >= -this.bottomPullOffset){ // 此处要计算底端的高度\r\n            this._startBottomLoading();\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.options.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ui-refresh-toload').addClass('ui-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.options.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 结束底部加载\r\n    Refresh.prototype.endBottomLoading = function () {\r\n        this.bottomLoading = false;\r\n        this.refresh();\r\n    };\r\n\r\n    // 结束顶部加载\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ui-refresh-top-loading');\r\n        this.topLoading = false;\r\n        // this.iScroll.scrollTo(0, 0); // 刷新加载则应该回到顶部,待测试确认\r\n        this.refresh();\r\n    };\r\n\r\n    // 设置顶部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableTop = function (enable) {\r\n        this.topEnable = enable;\r\n        if (enable) {\r\n            this.topEl.show();\r\n        } else {\r\n            this.topEl.hide();\r\n        }\r\n    };\r\n\r\n    // 设置底部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableBottom = function (enable) {\r\n        this.bottomEnable = enable;\r\n        if (enable) {\r\n            this.bottomEl.show();\r\n        } else {\r\n            this.bottomEl.hide();\r\n        }\r\n    };\r\n\r\n    // 只有在内容发生变更时,但是又没有触发调用end相关方法时,使用此方法更新高度信息\r\n    // 或者组件在一开始未显示??\r\n    // 刷新会移除拖动中状态\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n    ipu.refresh = function (slt, optoins) {\r\n        return new Refresh(slt, optoins);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n","// Tab\r\n(function (ipu, $) {\r\n    function Tab(holder, options) {\r\n        this.el = $(holder).get(0);\r\n        this.titleItems = $(\".ui-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ui-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ui-tab-fixed\"); // 是否为固定高度的\r\n\r\n        var that = this;\r\n        this.titleItems.each(function (index) {\r\n            $(this).click(function () {\r\n                that.show(index);\r\n            });\r\n        });\r\n\r\n        var index = this.titleItems.filter(\".ui-current\").index();\r\n        if (index == -1) {\r\n            index = 0;\r\n        }\r\n\r\n        this.show(index);\r\n    }\r\n\r\n    Tab.prototype.defaultOptions = {\r\n        callBack: null  // 回调函数,tab切换时回调函数\r\n    };\r\n\r\n    Tab.prototype.show = function (index) {\r\n        if (this.fixed) {\r\n            var move = -index * 100 + \"%\";\r\n            this.bodyWrapper.css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        }\r\n        this.contentItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this.titleItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this._end(index);\r\n    };\r\n\r\n    Tab.prototype._end = function (index) {\r\n        this.lastIndex = this.currentIndex;\r\n        this.currentIndex = index;\r\n\r\n        if (this.options.callBack) {\r\n            this.options.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, options) {\r\n        return new Tab(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\r\n","// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipu, $) {\r\n    var active = {};\r\n\r\n    var options = defaultOptions = {\r\n        distanceAllow: 10,   // 最大移动距离,超过移除效果\r\n        displayDelay: 100,  // 延时显示时间,以防止是滚动操作\r\n        hideDelay: 120,     // 隐藏延时时间\r\n        eventName: 'click', // 事件处理是click\r\n        activeClass: 'ui-active',   // 激活时的class\r\n        getHandleNode: function (node) {  // 找到最先一级处理此click事件的元素\r\n            if (!node || !node.nodeType) return;\r\n\r\n            var distNode = null;\r\n            var nodeArray = [];\r\n\r\n            // 还有其它情形考虑,如a标签的跳转,或在原生元素添加事件属性的\r\n            function findHander(inNode) {\r\n                // 此方法适用于jquery, 1.12.4, 2.2.4, 3.2.1版本,_data方法以后可能会被移除。$.data是一些老版本写法\r\n                var eventHandlers = ($._data || $.data)(inNode, 'events');\r\n\r\n                if (eventHandlers) {\r\n                    eventHandlers = eventHandlers[options.eventName];\r\n                }\r\n\r\n                if (!eventHandlers) {\r\n                    return;\r\n                }\r\n\r\n                var thisNode = false;\r\n                $.each(eventHandlers, function (index, handler) {\r\n                    if (handler.selector) {\r\n                        var objs = $(handler.selector, inNode);\r\n                        $.each(nodeArray, function (tIndex, tNode) {\r\n                            if (objs.is(tNode)) {\r\n                                distNode = tNode;\r\n                                return false;\r\n                            }\r\n                        });\r\n\r\n                        if (distNode) {\r\n                            return false; //\r\n                        }\r\n                    } else {\r\n                        thisNode = true;  // 保存distNode,有可能有子节点满足条件,所以只保存此值为默认值\r\n                    }\r\n                });\r\n\r\n                if (thisNode && distNode == null) { // 如果没在子节点找到click事件,而当前节点又有click事件,就使用当前节点\r\n                    distNode = inNode;\r\n                }\r\n\r\n                return distNode;\r\n            }\r\n\r\n            while (!(\"tagName\" in node) || !findHander(node)) {\r\n                if (!node.parentNode || node.parentNode.nodeType != 1) {\r\n                    break;\r\n                }\r\n                nodeArray.push(node);\r\n                node = node.parentNode;\r\n            }\r\n\r\n            return distNode;\r\n        }\r\n    };\r\n\r\n    function getOriginalEvent(e) {\r\n        return e.originalEvent || e;\r\n    }\r\n\r\n    function getXY(e) {\r\n        var x = e.touches ? e.touches[0].pageX : e.clientX;\r\n        var y = e.touches ? e.touches[0].pageY : e.clientY;\r\n        return [x, y];\r\n    }\r\n\r\n    //根据不同浏览器获取不同原生事件event\r\n    var hasTouch = \"ontouchstart\" in window,\r\n        START_EVENT = hasTouch ? 'touchstart' : 'mousedown',\r\n        MOVE_EVENT = hasTouch ? 'touchmove' : 'mousemove',\r\n        END_EVENT = hasTouch ? 'touchend' : 'mouseup',\r\n        CANCEL_EVENT = hasTouch ? 'touchcancel' : '';\r\n\r\n    $(function () {\r\n        var startXY, tapEl, timeOutID;\r\n        var dom = document.body;\r\n\r\n        // force为false的时候,不用管timeOutID,在老的timeOutID未移除的情况下,有可能又产生了新的,\r\n        // 导致else代码未被执行,导致老的点击元素class未被移除\r\n        function removeClass(dom, force) {\r\n            if (force && timeOutID) {\r\n                window.clearTimeout(timeOutID);\r\n            } else {\r\n                $(dom).removeClass(options.activeClass);\r\n            }\r\n        }\r\n\r\n        function removeActive(force) {\r\n            if (force) {\r\n                removeClass(tapEl, force);\r\n            } else {\r\n                window.setTimeout(removeClass, options.hideDelay, tapEl, force);\r\n            }\r\n            startXY = null;\r\n            tapEl = null;\r\n        }\r\n\r\n        $(dom).bind(START_EVENT, function (e) {\r\n            if (tapEl) {    // 多点接触时处理\r\n                removeActive(true);\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n            startXY = getXY(e);\r\n            tapEl = options.getHandleNode(e.target);\r\n\r\n            if (tapEl) {\r\n                timeOutID = window.setTimeout(function (dom) {\r\n                    timeOutID = null;\r\n                    $(dom).addClass(options.activeClass);\r\n                }, options.displayDelay, tapEl);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(MOVE_EVENT, function (e) {\r\n            if (!tapEl) {\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n\r\n            var xy = getXY(e);\r\n            if (startXY && (Math.abs(xy[0] - startXY[0]) > options.distanceAllow || Math.abs(xy[1] - startXY[1]) > options.distanceAllow)) {\r\n                removeActive(true);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(END_EVENT, function (e) {\r\n            if (tapEl) {\r\n                removeActive();\r\n            }\r\n        });\r\n\r\n        // 手机来电等非用户取消操作时触发事件\r\n        if (CANCEL_EVENT) {\r\n            $(dom).bind(CANCEL_EVENT, function (e) {\r\n                if (tapEl) {\r\n                    removeActive();\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    // 更新默认值\r\n    active.setOptions = function (opts) {\r\n        options = this.options = $.extend({}, defaultOptions, opts);\r\n    };\r\n    ipu.active = active;\r\n})(ipu || window, jQuery);\r\n\r\n","/*===========================\r\nDevice/OS Detection\r\n===========================*/\r\n// from sui,但IPU框架的ua不是这样的\r\n;(function (ipu, $) {\r\n    \"use strict\";\r\n    var device = {};  // Classes\r\n    var classNames = [];\r\n    var ua = navigator.userAgent\r\n    \r\n    // 这中针对ipu框架的情况,待测试\r\n    if(ua.match(/ipumobile/i)){\r\n        device.ios =  !!ua.match(/ios/i);\r\n        device.android = !!ua.match(/android/i);\r\n    }else{\r\n        var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\r\n        var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\r\n        var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\r\n        var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\r\n\r\n        device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\r\n\r\n        // Android\r\n        if (android) {\r\n            device.os = 'android';\r\n            device.osVersion = android[2];\r\n            device.android = true;\r\n            device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\r\n        }\r\n        if (ipad || iphone || ipod) {\r\n            device.os = 'ios';\r\n            device.ios = true;\r\n        }\r\n        // iOS\r\n        if (iphone && !ipod) {\r\n            device.osVersion = iphone[2].replace(/_/g, '.');\r\n            device.iphone = true;\r\n        }\r\n        if (ipad) {\r\n            device.osVersion = ipad[2].replace(/_/g, '.');\r\n            device.ipad = true;\r\n        }\r\n        if (ipod) {\r\n            device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\r\n            device.iphone = true;\r\n        }\r\n        // iOS 8+ changed UA\r\n        if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\r\n            if (device.osVersion.split('.')[0] === '10') {\r\n                device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\r\n            }\r\n        }\r\n\r\n        // Webview\r\n        device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\r\n\r\n        // Minimal UI\r\n        if (device.os && device.os === 'ios') {\r\n            var osVersionArr = device.osVersion.split('.');\r\n            device.minimalUi = !device.webView &&\r\n                (ipod || iphone) &&\r\n                (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\r\n                $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\r\n        }\r\n\r\n        // Check for status bar and fullscreen app mode\r\n        var windowWidth = $(window).width();\r\n        var windowHeight = $(window).height();\r\n        device.statusBar = false;\r\n        if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\r\n            device.statusBar = true;\r\n        }\r\n        else {\r\n            device.statusBar = false;\r\n        }\r\n\r\n\r\n        // Pixel Ratio\r\n        device.pixelRatio = window.devicePixelRatio || 1;\r\n        classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\r\n        if (device.pixelRatio >= 2) {\r\n            classNames.push('retina');\r\n        }\r\n\r\n        // OS classes\r\n        if (device.os) {\r\n            classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\r\n            if (device.os === 'ios') {\r\n                var major = parseInt(device.osVersion.split('.')[0], 10);\r\n                for (var i = major - 1; i >= 6; i--) {\r\n                    classNames.push('ios-gt-' + i);\r\n                }\r\n            }\r\n\r\n        }\r\n        // Status bar classes\r\n        if (device.statusBar) {\r\n            classNames.push('with-statusbar-overlay');\r\n        }\r\n        else {\r\n            $('html').removeClass('with-statusbar-overlay');\r\n        }\r\n\r\n\r\n        // keng..\r\n        device.isWeixin = /MicroMessenger/i.test(ua);\r\n    }\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0){\r\n        $('html').addClass(classNames.join(' '));\r\n    }\r\n\r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n","\r\n        // 初始化代码\r\n        jQuery(function () {\r\n            FastClick.attach(document.body);\r\n        });\r\n\r\n        return ipu;\r\n    }\r\n\r\n    // todo:可以添加一个和其它库的适配处理,\r\n    // 这里假设第三方库,jquery,iScroll,Hammer的史称已经固定\r\n    if ( typeof define === \"function\" && define.amd ) {\r\n        define(['jquery', 'iScroll', 'Hammer', 'FastClick'], function (jQuery, iScroll, Hammer, FastClick) {\r\n            return window.ipu = setup(jQuery, iScroll, Hammer, FastClick);\r\n        });\r\n    } else {\r\n        window.ipu = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n    }\r\n})();\r\n"]}

+ 1 - 1
ipuui/ipu/dist/js/ipu.min.js.map

@ -1 +1 @@
1
{"version":3,"sources":["ipu.js"],"names":["setup","jQuery","iScroll","Hammer","FastClick","ipu","$","iscroll","Carousel","slt","options","this","extend","defaultOpt","el","eq","autoPlay","hasIndicator","indicator","callBack","currentIndex","_init","play","prototype","index","duration","indicatorPosition","wrapper","carouselItems","size","that","activeIndex","filter","_addIndicator","window","resize","refresh","scrollOpt","snap","momentum","scrollX","scrollY","hScrollbar","onScrollStart","_pause","onTouchEnd","onScrollEnd","_end","get","show","stop","timeoutId","clearTimeout","prev","next","time","scrollToPage","_play","setTimeout","currPageX","indicatorIndexs","addClass","siblings","removeClass","html","i","appendTo","destroy","carousel","DtPicker","defaultOptions","Picker","defaultPickerDate","Date","template","buttons","labels","type","customData","hasClear","self","mask","createMask","_picker","holder","ui","picker","ok","cancel","clear","listen","h","onChange","item","beginMonth","endMonth","_createMinutes","d","_createHours","m","_createDay","y","_createMonth","_create","_setLabels","_setButtons","attr","_setSelectedValue","value","getSelected","selected","getSelectedItem","toString","text","getFullYear","getMonth","getDate","getHours","getMinutes","parsedValue","_parseSetValue","setListen","setSelectedValue","isLeapYear","year","_inArray","array","_item","getDayNum","month","_fill","num","length","_isBeginYear","beginYear","parseInt","getSelectedValue","_isBeginMonth","_isBeginDay","beginDay","_isBeginHours","beginHours","_isEndYear","endYear","_isEndMonth","_isEndDay","endDay","_isEndHours","endHours","_createYear","current","yArray","yBegin","yEnd","push","setItems","mArray","maxMonth","val","dArray","maxDay","hArray","maxHours","iArray","beginMinutes","maxMinutes","endMinutes","each","label","innerText","hide","click","clickCall","now","rs","valu","parts","replace","split","j","beginDate","endDate","setBeginDate","date","setEndDate","dispose","parentNode","removeChild","name","disposed","sltDate","call","close","callback","element","document","createElement","classList","add","addEventListener","_show","setAttribute","body","appendChild","_remove","dtPicker","HammerCarousel","navSlt","clickBack","showSize","carouselItemSizes","moveLen","lastItem","slice","clone","sizeCount","hammer","Manager","Pan","direction","DIRECTION_HORIZONTAL","threshold","on","bindFn","onPan","width","wrapperSize","outerWidth","itemSize","mostSize","dom","position","left","move","displayMoveLen","css","animate","toggleClass","ev","delta","deltaX","intValue","Math","abs","decimal","hammerCarousel","__dealCssEvent","eventNameArr","fireCallBack","e","target","events","off","handleClicks","clicked","hasClass","defaults","modalCloseByOutside","closeModal","actionsCloseByOutside","popupCloseByOutside","fn","transitionEnd","_modalTemplateTempDiv","modalStack","modalButtonOk","modalButtonCancel","modalPreloaderTitle","modalContainer","modalStackClearQueue","shift","modal","params","modalHTML","buttonsHTML","bold","extraClass","titleHTML","title","textHTML","afterTextHTML","afterText","noButtons","verticalButtons","innerHTML","children","append","find","onClick","openModal","alert","callbackOk","arguments","undefined","modalTitle","confirm","callbackCancel","omodalButtonCancelnClick","prompt","minLoad","loadOverTime","loadEnd","loadTimeOut","showPreloader","minTime","hidePreloader","preloaderModal","force","showIndicator","hideIndicator","remove","actions","groupSelector","buttonSelector","isArray","button","buttonClass","color","bg","disabled","groups","groupIndex","clickTarget","buttonIndex","buttonParams","is","toast","msg","extraclass","$toast","cb","isModal","isNotToast","isPopup","isLoginScreen","isPickerModal","isToast","marginTop","round","outerHeight","marginLeft","overlay","clientLeft","trigger","removeOnClose","NavBar","content","contentSlt","nav","contents","navs","me","lastIndex","navBar","submitForm","doc","url","form","action","method","style","display","x","ele","submit","checkPages","hasPages","pagesObj","zeroPageClass","pageIdPrefix","isZeroPage","page","animationEnd","maps","pageNo","animateInClass","animateOutClass","eventName","zeroPagesClass","parent","backIndex","closeIndex","showLoading","loadingMessage","minMessageTime","data","pageName","openPage","end","animatePage","newPage","nowPageNo","zeroPage","one","pageDoc","contentDocument","postPage","backPage","nextAll","nowDoc","iframe","evt","createEvent","initEvent","dispatchEvent","nowPage","prevPage","prevAll","closePage","open","post","back","backHome","onBack","originalEvent","showItemSize","r","itemAngle","maxExceed","wrap","beginAngle","beginExceed","stopInertiaMove","lastAngle","empty","device","ios","DIRECTION_VERTICAL","Press","_onPan","endScroll","textName","newData","lis","items","itemsSize","endAngle","endExceed","transform","transform-origin","setAngle","newAngle","angle","moveAngle","calcAngle","deltaY","v","overallVelocityY","dir","deceleration","dist","startAngle","distAngle","srcDistAngle","scrollDistAngle","ca","PI","c","calcItemVisable","oldIndex","difference","toFixed","nowTime","getTime","frameInterval","stepCount","stepIndex","inertiaMove","quartEaseOut","bool","t","b","getSelectedText","getSelectedIndex","PopPicker","pickerTemplate","layer","btns","bodyHtml","pickers","Array","pickerHtml","prependTo","getSelectItems","setData","popPicker","progressBar","id","level","progress","setProgress","setLevel","pro","getProgress","Refresh","_initBottomAndTop","iScrollOptions","onScrollMove","topEnable","topLoading","topPullOffset","topEl","_checkBottomLoading","goTop","onBeforeScrollEnd","_checkTopLoading","minScrollY","scrollTo","onRefresh","_checkContentLoading","bottomLoadFun","topLoadFun","initEnableTop","initEnableBottom","bottomLoadHtml","topLoadHtml","bottomAddLen","scrollEl","bottomEl","bottomPullOffset","bottomLoading","bottomEnable","enableBottom","enableTop","maxScrollY","_startBottomLoading","_startTopLoading","endBottomLoading","endTopLoading","enable","optoins","Tab","titleItems","bodyWrapper","contentItems","fixed","tab","getOriginalEvent","getXY","touches","pageX","clientX","pageY","clientY","active","distanceAllow","displayDelay","hideDelay","activeClass","getHandleNode","node","findHander","inNode","eventHandlers","_data","thisNode","handler","selector","objs","nodeArray","tIndex","tNode","distNode","nodeType","hasTouch","START_EVENT","MOVE_EVENT","END_EVENT","CANCEL_EVENT","timeOutID","removeActive","tapEl","startXY","bind","xy","setOptions","opts","classNames","ua","navigator","userAgent","match","android","ipad","ipod","iphone","androidChrome","os","osVersion","toLowerCase","indexOf","webView","osVersionArr","minimalUi","windowWidth","windowHeight","height","statusBar","screen","pixelRatio","devicePixelRatio","floor","major","isWeixin","test","join","attach","define","amd"],"mappings":"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","file":"ipu.min.js","sourcesContent":["(function () {\r\n    function setup(jQuery, iScroll, Hammer, FastClick) {\r\n        var ipu = {};\r\n\n// Carousel\r\n(function (ipu, $, iscroll) {\r\n// carouselSlt应该是唯一的,否则怎么支撑多个回调,如果用户不需要多个回调,也不主动调用,则可以,先不管吧???\r\n    function Carousel(slt, options) {\r\n        this.options = options = $.extend({}, this.defaultOpt, options);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = options.autoPlay;\r\n         this.hasIndicator = options.indicator;\r\n        this.callBack = options.callBack;\r\n        this.currentIndex = null;\r\n\r\n        this._init();\r\n        this.play();\r\n    }\r\n\r\n    Carousel.prototype = {\r\n        defaultOpt: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            that = this;\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.hasIndicator) {\r\n                this._addIndicator();\r\n            }\r\n            $(window).resize(function () {\r\n                that.refresh();\r\n            });\r\n            var scrollOpt = {\r\n                snap: \"li\",          // carousel效果\r\n                momentum: false,     // 移除惯性处理\r\n                scrollX: true,       // X轴移动\r\n                scrollY:false,\r\n                hScrollbar: false,   // 没有纵向滚动条\r\n                onScrollStart: function () {\r\n                    that._pause();\r\n                },\r\n                onTouchEnd: function () {\r\n                    // 后面优化\r\n                    /*\r\n                     if (that.iscroll.currPageX == that.size - 1) {\r\n                     that.show(that.size - 2);\r\n                     }\r\n                     */\r\n                },\r\n                onScrollEnd: function () {\r\n                    that._end();\r\n                }\r\n            };\r\n            this.iscroll = new iscroll(this.el.get(0), scrollOpt);\r\n            this.show(this.options.index, 0);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.autoPlay=false;\r\n        },\r\n        _pause: function () {\r\n            if (this.autoPlay && this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            this.show(index);\r\n        },\r\n        next: function () {\r\n            var index = this.currentIndex == this.size - 1 ? 0 : this.currentIndex + 1;\r\n            this.show(index);\r\n        },\r\n        show: function (index, time) {\r\n            this._pause();\r\n            this.iscroll.scrollToPage(index, 0, time);\r\n        },\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        refresh: function () {\r\n            var that = this;\r\n            that.show(this.currentIndex);\r\n        },\r\n        _play: function () {\r\n            if (this.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    this.timeoutId = null;\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {\r\n            var currentIndex = this.iscroll.currPageX;\r\n            if (currentIndex != this.currentIndex) {\r\n                if (this.callBack) {\r\n                    this.callBack(currentIndex, this.currentIndex);\r\n                }\r\n                this.currentIndex = currentIndex;\r\n\r\n                if (this.hasIndicator) {\r\n                    this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this._play();\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        destroy: function () {\r\n            // 自己怎么销毁,相关事件移除??\r\n            this.iscroll.destroy();\r\n        }\r\n    };\r\n\r\n    ipu.carousel =  function (slt, options) {\r\n        return new Carousel(slt, options);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来运算\r\n\r\n\r\n    // show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n    // 日期范围的选择处理\r\n    function DtPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    DtPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker ui-dtpicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-clear\">清除</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-title\">\\\r\n                            <label class=\"ui-dtpicker-y\"></label>\\\r\n                            <label class=\"ui-dtpicker-m\"></label>\\\r\n                            <label class=\"ui-dtpicker-d\"></label>\\\r\n                            <label class=\"ui-dtpicker-h\"></label>\\\r\n                            <label class=\"ui-dtpicker-mi\"></label>\\\r\n                        </div>\\\r\n                        <div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                            <div class=\"ui-picker\" data-id=\"picker-y\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-m\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-d\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-h\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-mi\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                        </div>\\\r\n                    </div>',\r\n        buttons: ['取消', '确认', '清除'],\r\n        labels: ['年', '月', '日', '时', '分'],\r\n        type: 'datetime',       // date, time, datetime, hour, month\r\n        customData: {},  // 自定义数据\r\n        hasClear: false,    // 是否显示清除按钮\r\n        callBack: function () { // 选择数据时的回调函数\r\n        }\r\n        // beginDate: Date类型,或毫秒值\r\n        // endDate: 同上\r\n    };\r\n\r\n    DtPicker.prototype._init = function () {\r\n        var self = this;\r\n        this.mask = this.createMask();\r\n\r\n        var _picker = this.holder = $(this.options.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ui-poppicker-btn-ok', _picker),\r\n            cancel: $('.ui-poppicker-btn-cancel', _picker),\r\n            clear: $('.ui-poppicker-btn-clear', _picker),\r\n            buttons: $('.ui-poppicker-header .ui-btn', _picker),\r\n            labels: $('.ui-poppicker-title label', _picker)\r\n        };\r\n\r\n\r\n        ui.i = new Picker($('[data-id=\"picker-mi\"]', _picker), {listen: false}); // 分钟变更无需要处理\r\n\r\n        ui.h = new Picker($('[data-id=\"picker-h\"]', _picker), {         // 小时变更,有最小值或最大值,需要变更分钟\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createMinutes();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.d = new Picker($('[data-id=\"picker-d\"]', _picker), { //仅提供了beginDate时,触发day,hours,minutes的change\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createHours();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.m = new Picker($('[data-id=\"picker-m\"]', _picker), { // 月变更时,总要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null) {\r\n                    self._createDay();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.y = new Picker($('[data-id=\"picker-y\"]', _picker), { // 年发生变更,如果没有结束月,此时有所有的月,是不需要变更月的,只需要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index != null) {\r\n                    if (self.options.beginMonth || self.options.endMonth) {\r\n                        self._createMonth();\r\n                    } else {\r\n                        self._createDay();\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n\r\n\r\n\r\n        self._create();\r\n\r\n        var ui = self.ui;\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.options.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.options.value);\r\n\r\n        //防止滚动穿透 TODO:待确认情况\r\n        /* self.ui.picker.addEventListener($.EVENT_START, function (event) {\r\n         event.preventDefault();\r\n         }, false);\r\n         self.ui.picker.addEventListener($.EVENT_MOVE, function (event) {\r\n         event.preventDefault();\r\n         }, false);*/\r\n    };\r\n\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.options.type;\r\n        var selected = {\r\n            type: type,\r\n            y: ui.y.getSelectedItem(),\r\n            m: ui.m.getSelectedItem(),\r\n            d: ui.d.getSelectedItem(),\r\n            h: ui.h.getSelectedItem(),\r\n            i: ui.i.getSelectedItem(),\r\n            toString: function () {\r\n                return this.value;\r\n            }\r\n        };\r\n        switch (type) {\r\n            case 'datetime':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'date':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text;\r\n                break;\r\n            case 'time':\r\n                selected.value = selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'month':\r\n                selected.value = selected.y.value + '-' + selected.m.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text;\r\n                break;\r\n            case 'hour':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text;\r\n                break;\r\n        }\r\n        return selected;\r\n    };\r\n\r\n    DtPicker.prototype._setSelectedValue = function (value) {\r\n        var self = this;\r\n        var ui = self.ui;\r\n\r\n        if(!value){\r\n            if(this.options.type == 'time'){\r\n                value = '00:00';\r\n            }else{\r\n                value = defaultPickerDate.getFullYear()+'-'+(defaultPickerDate.getMonth()+1)+'-'+defaultPickerDate.getDate()+' '\r\n                    + defaultPickerDate.getHours() + ':' + defaultPickerDate.getMinutes();\r\n            }\r\n        }\r\n        var parsedValue = self._parseSetValue(value);\r\n\r\n        ui.y.setListen(true);\r\n        ui.m.setListen(false);\r\n        ui.d.setListen(false);\r\n        ui.h.setListen(false);\r\n        ui.i.setListen(false);\r\n        ui.y.setSelectedValue(parsedValue.y);\r\n\r\n        ui.m.setListen(true);\r\n        ui.m.setSelectedValue(parsedValue.m);\r\n\r\n        ui.d.setListen(true);\r\n        ui.d.setSelectedValue(parsedValue.d);\r\n\r\n        ui.h.setListen(true);\r\n        ui.h.setSelectedValue(parsedValue.h);\r\n\r\n        ui.i.setListen(true);\r\n        ui.i.setSelectedValue(parsedValue.i);\r\n\r\n        this.value = this.getSelected().value;\r\n    };\r\n\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    DtPicker.prototype.isLeapYear = function (year) {\r\n        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);\r\n    };\r\n\r\n    DtPicker.prototype._inArray = function (array, item) {\r\n        for (var index in array) {\r\n            var _item = array[index];\r\n            if (_item === item) return true;\r\n        }\r\n        return false;\r\n    };\r\n\r\n    DtPicker.prototype.getDayNum = function (year, month) {\r\n        var self = this;\r\n        if (self._inArray([1, 3, 5, 7, 8, 10, 12], month)) {\r\n            return 31;\r\n        } else if (self._inArray([4, 6, 9, 11], month)) {\r\n            return 30;\r\n        } else if (self.isLeapYear(year)) {\r\n            return 29;\r\n        } else {\r\n            return 28;\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype._fill = function (num) {\r\n        num = num.toString();\r\n        if (num.length < 2) {\r\n            num = 0 + num;\r\n        }\r\n        return num;\r\n    };\r\n\r\n    DtPicker.prototype._isBeginYear = function () {\r\n        return this.options.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.options.beginMonth && this._isBeginYear() && this.options.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.options.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.options.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.options.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.options.endMonth && this._isEndYear() && this.options.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.options.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.options.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (options.customData.y) {\r\n            yArray = options.customData.y;\r\n        } else {\r\n            var yBegin = options.beginYear;\r\n            var yEnd = options.endYear;\r\n            for (var y = yBegin; y <= yEnd; y++) {\r\n                yArray.push({\r\n                    text: y + '',\r\n                    value: y\r\n                });\r\n            }\r\n        }\r\n        ui.y.setItems(yArray);\r\n        //ui.y.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMonth = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (options.customData.m) {\r\n            mArray = options.customData.m;\r\n        } else {\r\n            var m = options.beginMonth && self._isBeginYear() ? options.beginMonth : 1;\r\n            var maxMonth = options.endMonth && self._isEndYear() ? options.endMonth : 12;\r\n            for (; m <= maxMonth; m++) {\r\n                var val = self._fill(m);\r\n                mArray.push({\r\n                    text: val,\r\n                    value: m\r\n                });\r\n            }\r\n        }\r\n        ui.m.setItems(mArray);\r\n        //ui.m.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createDay = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (options.customData.d) {\r\n            dArray = options.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? options.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? options.endDay : self.getDayNum(parseInt(this.ui.y.getSelectedValue()), parseInt(this.ui.m.getSelectedValue()));\r\n            for (; d <= maxDay; d++) {\r\n                var val = self._fill(d);\r\n                dArray.push({\r\n                    text: val,\r\n                    value: d\r\n                });\r\n            }\r\n        }\r\n        ui.d.setItems(dArray);\r\n        //current = current || ui.d.getSelectedValue();\r\n        //ui.d.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createHours = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (options.customData.h) {\r\n            hArray = options.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? options.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? options.endHours : 23;\r\n            for (; h <= maxHours; h++) {\r\n                var val = self._fill(h);\r\n                hArray.push({\r\n                    text: val,\r\n                    value: h\r\n                });\r\n            }\r\n        }\r\n        ui.h.setItems(hArray);\r\n        //ui.h.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMinutes = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (options.customData.i) {\r\n            iArray = options.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? options.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? options.endMinutes : 59;\r\n            for (; i <= maxMinutes; i++) {\r\n                var val = self._fill(i);\r\n                iArray.push({\r\n                    text: val,\r\n                    value: i\r\n                });\r\n            }\r\n        }\r\n        ui.i.setItems(iArray);\r\n        //ui.i.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._setLabels = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = options.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.cancel.text(options.buttons[0]);\r\n        ui.ok.text(options.buttons[1]);\r\n\r\n        if(options.hasClear){\r\n            ui.clear.text(options.buttons[2])\r\n        }else{\r\n            ui.clear.hide();\r\n        }\r\n\r\n        ui.buttons.each(function (index) {\r\n            $(this).click(function () {\r\n                self.clickCall(index);\r\n            })\r\n        })\r\n    };\r\n\r\n    // 解析设置的值,目前是字符串,完整日期格式 2012-12-12 12:21\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.options.type;\r\n\r\n        var rs = {\r\n            y: now.getFullYear(),\r\n            m: now.getMonth()+1,\r\n            d: now.getDate(),\r\n            h: now.getHours(),\r\n            i: now.getMinutes()\r\n        };\r\n\r\n        if(value instanceof Date){\r\n            if( type == 'time'){\r\n                valu= +value.getHours()+\":\"+value.getMinutes();\r\n            }else{\r\n                value = value.getFullYear()+'-'+(value.getMonth()+1)+'-'+value.getDate()+ ' '\r\n                    +value.getHours()+\":\"+value.getMinutes();\r\n            }\r\n        }\r\n\r\n        var parts = value.replace(\":\", \"-\").replace(\" \", \"-\").split(\"-\");\r\n        for(var i=0, j=parts.length; i<j; i++){\r\n            parts[i] = parseInt(parts[i]);\r\n        }\r\n\r\n        if(type == 'datetime'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = parts[4];\r\n        }else if(type == 'date'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }else if(type == 'time'){\r\n            rs.h = parts[0];    //\r\n            rs.i = parts[1];\r\n        }else if(type == 'hour'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = 0;\r\n        }else if(type == 'month'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = 1;    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }\r\n\r\n        return rs;\r\n    };\r\n\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var options = this.options;\r\n        var now = defaultPickerDate;\r\n\r\n        var beginDate = options.beginDate;\r\n        if(beginDate){\r\n            beginDate = this._parseSetValue(beginDate);\r\n            options.beginYear = beginDate.y;\r\n            options.beginMonth = beginDate.m;\r\n            options.beginDay = beginDate.d;\r\n            options.beginHours = beginDate.h;\r\n            options.beginMinutes = beginDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.beginYear =  now.getFullYear();\r\n            options.beginMonth = now.getMonth() + 1;\r\n            options.beginDay = now.getDate();\r\n            options.beginHours = 0;\r\n            options.beginMinutes = 0;\r\n        }else {\r\n            options.beginYear =  now.getFullYear() - 5;\r\n        }\r\n\r\n        var endDate = options.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            options.endYear = endDate.y;\r\n            options.endMonth = endDate.m;\r\n            options.endDay = endDate.d;\r\n            options.endHours = endDate.h;\r\n            options.endMinutes = endDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.endYear =  now.getFullYear();\r\n            options.endMonth = now.getMonth() + 1;\r\n            options.endDay = now.getDate();\r\n            options.endHours = 24;\r\n            options.endMinutes = 59;\r\n        }else {\r\n            options.endYear =  options.beginYear + 10 ;\r\n        }\r\n\r\n        //生成\r\n        self._createYear();\r\n        self._createMonth();\r\n        self._createDay();\r\n        self._createHours();\r\n        self._createMinutes();\r\n    };\r\n\r\n    // 更新选择框,更新当前值\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.options.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    // 判断最大最小值合理性\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.options.endDate = date;\r\n        this._create();\r\n    };\r\n\r\n    DtPicker.prototype.dispose = function () {\r\n        var self = this;\r\n        self.hide();\r\n        setTimeout(function () {\r\n            self.ui.picker.parentNode.removeChild(self.ui.picker);\r\n            for (var name in self) {\r\n                self[name] = null;\r\n                delete self[name];\r\n            }\r\n            self.disposed = true;\r\n        }, 300);\r\n    };\r\n\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    DtPicker.prototype.clickCall = function(index){\r\n        var self = this;\r\n        var sltDate = self.getSelected();\r\n        var rs = self.options.callBack.call(this , sltDate, index);\r\n        if (rs !== false) {\r\n            if(index == 1){ // 假定确认按钮在第二个位置,传回true则存储当前值\r\n                self.value = sltDate.value;\r\n            }else if(index == 2){\r\n                self.value = null;\r\n            }\r\n            self.hide();\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    DtPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.clickCall(0);\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.dtPicker = function(options){\r\n        return new DtPicker(options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n// 支持非循环\r\n// size命名用的有点混淆。。\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n\r\n(function (ipu, $, Hammer) {\r\n    function HammerCarousel(navSlt, options) {\r\n        this.options = options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(navSlt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    // 直接替换掉了prototype对象,可能不是个好选择\r\n    HammerCarousel.prototype = {\r\n        defaultOptions: {\r\n            index: null,        // 默认显示第几个项,其实挺没用的,默认显示第一个,用户再调用一下显示第几个,作用一样现在。\r\n            autoPlay: false,    // 是否自动轮播\r\n            duration: 3000,     // 轮播间隔\r\n            indicator: false,  //是否生成指示器,即小点点\r\n            callBack: null,  // 轮播后回调函数\r\n            clickBack: null   // 各子项用户点击事件\r\n            //indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\r\n\r\n\r\n            this.showSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n            this.carouselItemSizes = [];\r\n            this.currentIndex = 0;\r\n            this.moveLen = 0;\r\n            this.lastItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来判断是复制项\r\n\r\n            // 这里假设每个元素都是相等的\r\n            this.carouselItems.slice(0, this.showSize).clone().appendTo(this.wrapper); // 如果做无限循环则要这样处理\r\n            this.size = this.carouselItems.size();\r\n\r\n            var self = this;\r\n            if(this.options.clickBack){\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        self.options.clickBack.call(this, i%self.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this.sizeCount();\r\n            var that = this;\r\n\r\n            this.hammer = new Hammer.Manager(this.el); // 避免因为li里面的内容高度不够,而不能触发相关事件\r\n            this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_HORIZONTAL, threshold: 10}));\r\n            this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this.onPan, this));\r\n\r\n            $(window).resize(function () { // 在尺寸变化时,处理,是否可以考虑只在宽度变化时处理,横屏事件?\r\n                that.refresh();\r\n            });\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.options.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.options.index);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.options.autoPlay = false;\r\n        },\r\n        _pause: function () {\r\n            if (this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            if (index == this.size - 1) {\r\n                this._show(this.size, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        next: function () {//下一张\r\n            var index = this.currentIndex == this.size ? 1 : this.currentIndex + 1;\r\n            if (index == 1) {\r\n                this._show(0, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % size;\r\n            if(index < 0 ){\r\n                index = size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        play: function () {\r\n            this.options.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.options.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    that.timeoutId = null;//清空这个timeoutId,代表该次处理已经执行了\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {//移动结束时调用\r\n            var currentIndex = this.currentIndex;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n\r\n            this._play();//处理自动播放\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        sizeCount: function () {\r\n            this.wrapperSize = this.wrapper.outerWidth(true);\r\n            this.itemSize = this.carouselItems.eq(0).outerWidth(true);\r\n            this.mostSize = this.size * this.itemSize; // 宽度*数量\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\").width();\r\n\r\n            var that = this;\r\n            $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n                that.carouselItemSizes[index] = $(this).position().left;\r\n            });\r\n        },\r\n        refresh: function () {\r\n            if (this.wrapperSize != this.wrapper.outerWidth(true)) {\r\n                this.sizeCount();\r\n                this._show(this.currentIndex, true); //新的位置\r\n            }\r\n        },\r\n        move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\");\r\n            var move = (this.moveLen - moveLen) % this.mostSize;\r\n            move = (move + this.mostSize) % this.mostSize;\r\n            this.displayMoveLen = move;\r\n\r\n            move = -move + \"px\";\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        },\r\n        _show: function (index, animate) { // 知道最终移动到的项时,调用\r\n            if (animate !== false) { // 默认值为true\r\n                animate = true;\r\n            }\r\n\r\n            this._pause();\r\n            $(this.wrapper).toggleClass(\"ui-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            //this.currentIndex = index;\r\n            this.lastItem = index == this.size;\r\n            var move = this.carouselItemSizes[index];\r\n            this.moveLen = move;\r\n            move = -move + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n            if (animate) {\r\n                this._end();\r\n            }\r\n        },\r\n        onPan: function (ev) {\r\n            var delta = ev.deltaX;\r\n            // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n            if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n                var value = delta / this.itemSize;\r\n                var intValue = parseInt(Math.abs(value));               // 取整数\r\n                var decimal = Math.abs(value) % 1;                   // 取小数\r\n\r\n                if (decimal > 0.2) { // 滑动超过页面宽20%;\r\n                    intValue = intValue + 1;\r\n                }\r\n                if (value > 0) {\r\n                    intValue = -intValue;\r\n                }\r\n\r\n                var index = (this.currentIndex + intValue) % this.size;\r\n                index = (index + this.size) % this.size; // 因为可能是个负值,转换成正值\r\n\r\n                // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n                if (index == 0 && this.displayMoveLen > this.itemSize) {\r\n                    index = this.size;\r\n                }\r\n                this._show(index);\r\n            } else if (ev.type == 'panmove'){\r\n                this.move(delta);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.hammerCarousel = function (slt, options) {\r\n        return new HammerCarousel(slt, options);\r\n    };\r\n})(ipu || window, jQuery,  Hammer);\r\n\n(function (ipu, $) {\r\n    //$ extends\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        // console.log('__dealCssEvent');\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            /*jshint validthis:true */\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.transitionEnd = function (callback) {\r\n        // console.log('transitionEnd');\r\n        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalStack: true,\r\n        modalButtonOk: '确定',\r\n        modalButtonCancel: '取消',\r\n        modalPreloaderTitle: '加载中',\r\n        modalContainer: document.body ? document.body : 'body'\r\n    };\r\n\r\n    ipu.modalStack = [];\r\n\r\n    ipu.modalStackClearQueue = function () {\r\n        if (ipu.modalStack.length) {\r\n            (ipu.modalStack.shift())();\r\n        }\r\n    };\r\n    ipu.modal = function (params) {\r\n        params = params || {};\r\n        var modalHTML = '';\r\n        var buttonsHTML = '';\r\n        if (params.buttons && params.buttons.length > 0) {\r\n            for (var i = 0; i < params.buttons.length; i++) {\r\n                buttonsHTML += '<span class=\"ui-modal-button' + (params.buttons[i].bold ? ' ui-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\r\n            }\r\n        }\r\n        var extraClass = params.extraClass || '';\r\n        var titleHTML = params.title ? '<div class=\"ui-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ui-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ui-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ui-modal-buttons-vertical' : '';\r\n        modalHTML = '<div class=\"ui-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ui-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ui-modal-buttons ' + verticalButtons + '\">' + buttonsHTML + '</div></div>';\r\n\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n\r\n        var modal = $(_modalTemplateTempDiv).children();\r\n\r\n        $(defaults.modalContainer).append(modal[0]);\r\n\r\n        // Add events on buttons\r\n        modal.find('.ui-modal-button').each(function (index, el) {\r\n            $(el).on('click', function (e) {\r\n                if (params.buttons[index].close !== false) ipu.closeModal(modal);\r\n                if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\r\n                if (params.onClick) params.onClick(modal, index);\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n    ipu.alert = function (text, title, callbackOk) {\r\n        if (typeof title === 'function') {\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\r\n        });\r\n    };\r\n    ipu.confirm = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [\r\n                {text: defaults.modalButtonCancel, omodalButtonCancelnClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n    ipu.prompt = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            afterText: '<input type=\"text\" class=\"ui-modal-text-input\">',\r\n            buttons: [\r\n                {\r\n                    text: defaults.modalButtonCancel\r\n                },\r\n                {\r\n                    text: defaults.modalButtonOk,\r\n                    bold: true\r\n                }\r\n            ],\r\n            onClick: function (modal, index) {\r\n                if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ui-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ui-modal-text-input').val());\r\n            }\r\n        });\r\n    };\r\n\r\n    var minLoad = false;        // 是否最小时间调用方式\r\n    var loadOverTime = false;   // 是否超过最小调用时间\r\n    var loadEnd = false;        // 是否调用结束\r\n    var loadTimeOut = null;     // 延时调用ID\r\n\r\n    ipu.showPreloader = function (title, minTime) {\r\n        ipu.hidePreloader(true);\r\n\r\n        ipu.showPreloader.preloaderModal = ipu.modal({\r\n            title: title || defaults.modalPreloaderTitle,\r\n            text: '<div class=\"ui-preloader\"></div>'\r\n        });\r\n\r\n        if(minTime){\r\n            minLoad = true;\r\n            loadTimeOut = setTimeout(function () {\r\n                loadOverTime = true;\r\n                if(loadEnd){\r\n                    ipu.hidePreloader();\r\n                }\r\n            }, minTime);\r\n        }\r\n\r\n        return ipu.showPreloader.preloaderModal;\r\n    };\r\n    ipu.hidePreloader = function (force) {\r\n        if(force || !minLoad || (minLoad && loadOverTime)){\r\n            if(force && loadTimeOut){\r\n                window.clearTimeout(loadTimeOut);\r\n            }\r\n            ipu.showPreloader.preloaderModal && ipu.closeModal(ipu.showPreloader.preloaderModal);\r\n            minLoad = false; // 重置各标志位\r\n            loadOverTime = false;\r\n            loadEnd = false;\r\n            loadTimeOut = null;\r\n        }else{\r\n            loadEnd = true;\r\n        }\r\n    };\r\n    ipu.showIndicator = function () {\r\n        if ($('.ui-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ui-preloader-indicator-overlay\"></div><div class=\"ui-preloader-indicator-modal\"><span class=\"ui-preloader ui-preloader-white\"></span></div>');\r\n    };\r\n    ipu.hideIndicator = function () {\r\n        $('.ui-preloader-indicator-overlay, .ui-preloader-indicator-modal').remove();\r\n    };\r\n    // Action Sheet\r\n    ipu.actions = function (params) {\r\n        var modal, groupSelector, buttonSelector;\r\n        params = params || [];\r\n\r\n        if (params.length > 0 && !$.isArray(params[0])) {\r\n            params = [params];\r\n        }\r\n        var modalHTML;\r\n        var buttonsHTML = '';\r\n        for (var i = 0; i < params.length; i++) {\r\n            for (var j = 0; j < params[i].length; j++) {\r\n                if (j === 0) buttonsHTML += '<div class=\"ui-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ui-actions-modal-label' : 'ui-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ui-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ui-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ui-bg-' + button.bg;\r\n                if (button.disabled) buttonClass += ' disabled';\r\n                buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\r\n                if (j === params[i].length - 1) buttonsHTML += '</div>';\r\n            }\r\n        }\r\n        modalHTML = '<div class=\"ui-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ui-actions-modal-group';\r\n        buttonSelector = '.ui-actions-modal-button';\r\n\r\n        var groups = modal.find(groupSelector);\r\n        groups.each(function (index, el) {\r\n            var groupIndex = index;\r\n            $(el).children().each(function (index, el) {\r\n                var buttonIndex = index;\r\n                var buttonParams = params[groupIndex][buttonIndex];\r\n                var clickTarget;\r\n                if ($(el).is(buttonSelector)) clickTarget = $(el);\r\n                // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\r\n\r\n                if (clickTarget) {\r\n                    clickTarget.on('click', function (e) {\r\n                        if (buttonParams.close !== false) ipu.closeModal(modal);\r\n                        if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n                    });\r\n                }\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n\r\n    //显示一个消息,会在2秒钟后自动消失\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ui-modal ui-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n        ipu.openModal($toast, function () {\r\n            setTimeout(function () {\r\n                ipu.closeModal($toast);\r\n            }, duration || 2000);\r\n        });\r\n    };\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isNotToast = !modal.hasClass('ui-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n        if ($('.ui-modal.ui-modal-in:not(.ui-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\r\n            ipu.modalStack.push(function () {\r\n                ipu.openModal(modal, cb);\r\n            });\r\n            return;\r\n        }\r\n        var isPopup = modal.hasClass('ui-popup');\r\n        var isLoginScreen = modal.hasClass('ui-login-screen');\r\n        var isPickerModal = modal.hasClass('ui-picker-modal');\r\n        var isToast = modal.hasClass('ui-toast');\r\n        if (isModal) {\r\n            modal.show();\r\n            modal.css({\r\n                marginTop: -Math.round(modal.outerHeight() / 2) + 'px'\r\n            });\r\n        }\r\n        if (isToast) {\r\n            modal.css({\r\n                marginLeft: -Math.round(modal.outerWidth() / 2 ) + 'px' //1.185 是初始化时候的放大效果\r\n            });\r\n        }\r\n\r\n        var overlay;\r\n        if (!isLoginScreen && !isPickerModal && !isToast) {\r\n            if ($('.ui-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ui-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        }\r\n\r\n        //Make sure that styles are applied, trigger relayout;\r\n        var clientLeft = modal[0].clientLeft;\r\n\r\n        // Trugger open event\r\n        modal.trigger('open');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).addClass('ui-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('ui-modal-overlay-visible');\r\n        modal.removeClass('ui-modal-out').addClass('ui-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n        });\r\n        // excute callback\r\n        if (typeof cb === 'function') {\r\n            cb.call(this);\r\n        }\r\n        return true;\r\n    };\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ui-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isPopup = modal.hasClass('ui-popup'),\r\n            isToast = modal.hasClass('ui-toast'),\r\n            isLoginScreen = modal.hasClass('ui-login-screen'),\r\n            isPickerModal = modal.hasClass('ui-picker-modal'),\r\n            removeOnClose = modal.hasClass('ui-remove-on-close'),\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ui-popup.ui-modal-in').length) {\r\n                overlay.removeClass('ui-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ui-modal-overlay-visible');\r\n        }\r\n        modal.trigger('close');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).removeClass('ui-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ui-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ui-modal-in').addClass('ui-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ui-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ui-modal-out').hide();\r\n                if (removeOnClose && modal.length > 0) {\r\n                    modal.remove();\r\n                }\r\n            }\r\n            else {\r\n                modal.remove();\r\n            }\r\n        });\r\n        if (isModal && defaults.modalStack) {\r\n            ipu.modalStackClearQueue();\r\n        }\r\n\r\n        return true;\r\n    };\r\n    function handleClicks(e) {\r\n        /*jshint validthis:true */\r\n        var clicked = $(this);\r\n        var url = clicked.attr('href');\r\n\r\n\r\n        //Collect Clicked data- attributes\r\n       /* var clickedData = clicked.dataset();\r\n\r\n        // Popup\r\n        var popup;\r\n        if (clicked.hasClass('ui-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ui-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ui-modal-overlay')) {\r\n            if ($('.ui-modal.ui-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ui-modal.ui-modal-in');\r\n            if ($('.ui-actions-modal.ui-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ui-actions-modal.ui-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ui-popup-overlay')) {\r\n            if ($('.ui-popup.ui-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ui-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ui-modal-overlay, .ui-popup-overlay, .ui-close-popup, .ui-open-popup, .ui-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n    NavBar.prototype.defaultOpt = {\r\n        animate: false,           // 默认有动画\r\n        contentSlt: \".ui-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) { // currentIndex: 当前索引,lastIndex上一次索引(第一次时为null)\r\n        }\r\n    };\r\n\r\n    function NavBar(slt, options) {\r\n        this.options = $.extend({}, this.defaultOpt, options);\r\n        this.content = $(this.options.contentSlt);\r\n        this.nav = $(slt);\r\n        this.wrapper = $(\">ul\", this.content);\r\n        this.contents = $(\">li\", this.wrapper);\r\n        this.navs = $(\">a\", this.nav);\r\n        var me = this;\r\n\r\n        var activeIndex = this.navs.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.options.animate) {\r\n            this.wrapper.addClass(\"ui-no-animation\")\r\n        }\r\n\r\n        this.navs.each(function (index, i) {\r\n            $(this).click(function () {\r\n                me.show(index);\r\n            });\r\n        });\r\n\r\n        this.lastIndex = null;\r\n        this.currentIndex = null;\r\n        me.show(this.options.index);\r\n    }\r\n\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            var currentContent = $(this.contents[index]).addClass(\"ui-show\");\r\n\r\n            if (this.options.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ui-show\"); // 隐藏上上个元素\r\n                }\r\n\r\n                if (this.currentIndex != null) {        // 非第一次需要动画效果\r\n                    if (this.currentIndex < index) {   // 需要内容为往左走,显示右边的内容\r\n                        if (this.lastIndex != null && this.lastIndex < this.currentIndex) {  // 内容已经左走过了,则需要移除动画复原位置,再通过width()方法强制生效\r\n                            this.wrapper.addClass(\"ui-no-animation\").removeClass(\"ui-nav-content-right\").width(); // 可以强制刷新,默认jquery应该会将这些dom上的修改延时处理?\r\n                        }\r\n                    } else {\r\n                        if (this.lastIndex == null || this.lastIndex > this.currentIndex) { // 类似同上\r\n                            this.wrapper.addClass(\"ui-no-animation\").addClass(\"ui-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ui-no-animation\").toggleClass(\"ui-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ui-show\");\r\n            }\r\n\r\n            // 更新class,ui-current状态\r\n            $(this.contents[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n            $(this.navs[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.navBar = function (slt, options) {\r\n        return new NavBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\n    function __dealCssEvent(eventNameArr, callback) {\n        var events = eventNameArr,\n            i, dom = this;// jshint ignore:line\n\n        function fireCallBack(e) {\n            if (e.target !== this) return;\n            callback.call(this, e);\n            for (i = 0; i < events.length; i++) {\n                dom.off(events[i], fireCallBack);\n            }\n        }\n\n        if (callback) {\n            for (i = 0; i < events.length; i++) {\n                dom.on(events[i], fireCallBack);\n            }\n        }\n    }\n\n    $.fn.animationEnd = function (callback) {\n        __dealCssEvent.call(this, ['webkitAnimationEnd', 'animationend'], callback);\n        return this;\n    };\n\n    function submitForm(doc, url ,params){\n        var form = doc.createElement(\"form\");\n        form.action = url;\n        form.method = \"post\";\n        form.style.display = \"none\";\n\n        for (var x in params) {\n            var ele = doc.createElement(\"input\");\n            ele.type=\"hidden\";\n            ele.name = x;\n            ele.value =  params[x];\n            form.appendChild(ele);\n        }\n\n        doc.body.appendChild(form);\n        form.submit();\n    }\n\n    // 检查是否有ui-pages的结构\n    function checkPages() {\n        if(!hasPages){\n            pagesObj = $(\".ui-pages\"); // pagesObj为空则进行jquery取值\n            if(pagesObj.size() == 0){\n                pagesObj =  $(\"<div class='ui-pages'><div class='ui-page ui-show \"+zeroPageClass+\"' id='\"+pageIdPrefix+\"0'></div>\").appendTo(\"body\");\n            }\n            hasPages = true;\n        }\n    }\n\n    // 站位页面\n    function isZeroPage(page) {\n        return $(page).hasClass(zeroPageClass);\n    }\n\n    var page = {};\n    var hasPages = false;\n    var maps = {};\n    var pageNo = 1; // 编号0留给主页面或当前页面,或没有\n    var pageIdPrefix = \"ipuPage-\";\n    var pagesObj = null;\n    var animateInClass = \"ui-anim ui-slideRightIn\";\n    var animateOutClass  = \"ui-anim ui-slideRightOut\";\n    var eventName = \"ipuUIPageBack\";\n    var zeroPageClass = 'ui-page-zero';   // 占位页面,对于为当前页面\n    var zeroPagesClass = 'ui-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\n\n\n\n    page.options = {     // 那个窗口执行open,默认父窗口\n        target: window.parent, // 默认执行父窗口,方法:all\n        backIndex: -1,    // 默认回退一页         方法:back\n        closeIndex: -1,   // 默认关闭最近一个页面 方法:close\n        params:{},        // post的传参            方法:post\n        animate: true,     // 是否动画效果        方法:open post\n        showLoading: true,   // 是否显示加载消息  方法:open post\n        loadingMessage: '正在加载中',  //          方法:open post\n        method : null,     // 请求方式,内置参数,方法自己设置,用户不需要设置  方法:无\n        minMessageTime: 500, // 最小显示加载时间,避免出现闪现的情况 方法:open post\n        data: null,         // 回退时,回传参数, 方法:back\n        pageName: '',     // 给打开的页面命名,以便根据此页面名称来切换页面 方法:open post back close\n        callBack:function () { // 事件回调       方法:open post close back\n        }\n    };\n\n    // 当前页面加载,针对顶层父窗口\n    page.openPage = function (url, options) {\n        var newPage = null;\n        var nowPageNo = pageIdPrefix + (pageNo++);\n        maps[nowPageNo] = url;\n\n        checkPages();\n\n        if(options.showLoading){\n            ipu.showPreloader(options.loadingMessage, options.minMessageTime);\n        }\n\n        if(options.method == 'post'){\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe'></iframe></div>\");\n        }else{\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe' src='\"+url+\"'></iframe></div>\");\n        }\n\n        var zeroPage = isZeroPage($(\".ui-page:last\", pagesObj));\n        var animatePage = newPage;\n        if(zeroPage){\n            animatePage = pagesObj.addClass(zeroPagesClass);\n        }\n\n        function end() {\n            if(options.showLoading) {\n                ipu.hidePreloader();\n            }\n\n            if(options.animate) {\n                animatePage.removeClass(animateInClass);\n            }\n\n            newPage.siblings(\".ui-show\").removeClass('ui-show');\n            if(options.callBack){\n                options.callBack();\n            }\n        }\n\n        $(\".ui-page-iframe\", newPage).one('load', function () {\n            newPage.addClass(\"ui-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\n\n            if(zeroPage){\n                animatePage.removeClass(zeroPagesClass);\n            }\n            if(options.animate){\n                animatePage.addClass(animateInClass).animationEnd(end);\n            }else{\n                end();\n            }\n        });\n\n        newPage.appendTo(pagesObj);\n        if(options.method == 'post') {\n            var pageDoc = $(\".ui-page-iframe\", newPage)[0].contentDocument;\n            submitForm(pageDoc, url, options.params);\n        }\n    };\n\n    // post方式加载页面\n    page.postPage = function (url, options) {\n        options.method = 'post';\n        page.openPage(url, options);\n    };\n\n    // 当前页面后退,针对顶层父窗口\n    page.backPage = function (options) {\n        var backIndex = options.backIndex;\n        var page = null;\n        var nowPage = $(\".ui-page.ui-show\", pagesObj);\n\n        if(options.pageName){\n            page =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj);\n        }else if(backIndex == 0){\n            page = $(\".ui-page:first\", pagesObj);\n        }else { // 越界的情况\n            var prevPage = nowPage.prevAll(\".ui-page\");\n            if(backIndex < 0){\n                page= $(prevPage[-backIndex - 1]);\n            }else{\n                page= $(prevPage[prevPage.size() - backIndex]);\n            }\n        }\n\n        var animatePage = nowPage;\n        var zeroPage = isZeroPage(page);\n\n        // 主页面模式时\n        if(zeroPage){\n            animatePage = pagesObj;\n        }else{\n            page.addClass(\"ui-show\"); //显示前一个\n        }\n\n        function end (){\n            $(this).removeClass(animateOutClass);\n            page.nextAll(\".ui-page\").remove();\n\n            var iframe = $(\".ui-page-iframe\", page);\n            var nowDoc;\n\n            if(iframe.size() == 0){ // 找不到子窗口就当是返回了主页面,在当前窗口触发\n                nowDoc = window.document;\n            }else{\n                nowDoc = iframe[0].contentDocument;\n            }\n\n            if(zeroPage){\n                pagesObj.addClass(zeroPagesClass);\n            }\n\n            var evt = nowDoc.createEvent('Event');\n            evt.initEvent(eventName, true, true);\n            if(options.data){\n                evt.data = options.data;\n            }\n            nowDoc.body.dispatchEvent(evt);\n            if(options.callBack){\n                options.callBack();\n            }\n        }\n\n        if(options.animate){\n            animatePage.addClass(animateOutClass).animationEnd(end);\n        }else{\n            end();\n        }\n    };\n\n    // 往前关闭窗口\n    page.closePage = function (options) {\n        var closeIndex = options.closeIndex;\n        var prevPage = $(\".ui-page.ui-show\", pagesObj).prevAll(\".ui-page\");\n\n        if(options.pageName){\n            closeIndex =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj).index();\n        }else if(closeIndex < 0){\n            closeIndex = -closeIndex -1;\n        }else{\n            closeIndex = prevPage.size() - closeIndex;\n        }\n\n        $(prevPage[closeIndex]).remove();\n        if(options.callBack){\n            options.callBack();\n        }\n    };\n\n    // 调用父窗口打开页面\n    page.open = function (url, options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.openPage(url, options);\n    };\n\n    // post方法\n    page.post = function (url, options) {\n        options = $.extend({}, this.options, options);\n        options.method = 'post';\n        options.target.ipu.page.openPage(url, options);\n    };\n\n    // 调用父窗口,回退\n    page.back = function (options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.backPage(options);\n    };\n\n    // 返回首页\n    page.backHome = function (options) {\n        options = options || {};\n        options.backIndex = 0;\n        page.back(options);\n    };\n\n    // 子窗口,待确认\n    page.close = function (options) {\n        options = $.extend({}, this.options, options);\n        options.target.ipu.page.closePage(options);\n    };\n\n    // 添加回调事件\n    page.onBack = function (back) {\n        $(\"body\").on(eventName, function (e) {\n            var data = e.originalEvent.data;\n            back(data);\n        });\n    };\n\n    // 提供一个关闭一群窗口的方法\n    ipu.page = page;\n})(ipu || window, jQuery);\n\n// picker\r\n(function (ipu, $, Hammer) {\r\n    var showItemSize = 9;   // 显示的子项数量,\r\n    var r = 90;             // 计算旋转的圆半径,结果应该缩小,是为了r不要距离容器太近\r\n    var itemAngle = 180 / showItemSize;   // 每项对应的角度是 180/9 = 20\r\n    var maxExceed = itemAngle;         // 滚动时允许超出边界的最大角度\r\n    // itemHeight = 40px;       // 需要给出r=89是怎么计算出来的,是根据 40/2/Math.tan(40/2/180*Math.PI)=113,直接太大不好看\r\n\r\n    function Picker(slt, options) {\r\n        this.el = $(slt)[0];\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this._init();\r\n    }\r\n\r\n    // 默认参数\r\n    Picker.prototype.defaultOptions = {\r\n        onChange: function () {       // 子项选中事件\r\n        },\r\n        listen: true,                  // 默认已开记监听变化\r\n        data: []\r\n    };\r\n\r\n    Picker.prototype._init = function () {\r\n        var self = this;\r\n        this.wrap = $(\">ul\", this.el);\r\n        this.index = null;\r\n        this.listen = !!this.options.listen;\r\n\r\n        this.beginAngle = 0;\r\n        this.beginExceed = this.beginAngle - maxExceed;       // 最小角度值\r\n        this.stopInertiaMove = false;\r\n        this.lastAngle = null; // 保存滑动前的角度\r\n        this.empty = this.options.data.length == 0;\r\n\r\n        // 如果是ios,则ul的旋转中心点,有变化\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+r+\"px\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n        this.hammer = new Hammer.Manager(this.el);\r\n        this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_VERTICAL, threshold: 5}));\r\n        this.hammer.add(new Hammer.Press({threshold: 4}));  //\r\n        this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this._onPan, this));\r\n\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\r\n           // console.log('press');\r\n            if(this.empty){\r\n                return ;\r\n            }\r\n\r\n            self.stopInertiaMove = true;\r\n            if (e.type == 'pressup') {\r\n                self.endScroll();\r\n            }\r\n        });\r\n\r\n        this.setItems(this.options.data);\r\n    };\r\n\r\n    Picker.prototype.setItems = function (data, textName) {\r\n        this.wrap.empty(); // 清空历史数据\r\n        this.data = data = data || [];\r\n        this.empty = data.length == 0; // 数据是否为空\r\n\r\n        this.newData = true; // 表示设置了新数据,触发change回调,但第一次设置时,不需要触发\r\n        var self = this;\r\n        var lis = \"\";\r\n        textName = textName || 'text';\r\n\r\n        for (var i = 0, j = data.length; i < j; i++) {\r\n            lis = lis + \"<li>\" + data[i][textName] + \"</li>\";\r\n        }\r\n\r\n        $(lis).appendTo(this.wrap);\r\n\r\n        this.items = $(\">li\", this.wrap);\r\n        this.itemsSize = this.items.size();\r\n\r\n        this.endAngle = (this.empty ? 0 : this.itemsSize - 1) * itemAngle;\r\n        this.endExceed = this.endAngle + maxExceed;  // 最大旋转角度值\r\n\r\n        // 初始化各子项角度\r\n        this.items.each(function (i) {\r\n            $(this).css({\r\n                \"transform\": \"translateZ(\" + r + \"px) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + r + \"px\"\r\n            });\r\n            $(this).click(function () {\r\n                self.stopInertiaMove = true;\r\n                self.setAngle(i * itemAngle, true);\r\n            })\r\n        });\r\n\r\n        var newAngle ;\r\n        if(this.empty || this.index == null){\r\n            newAngle = 0;\r\n        }else {\r\n            if(this.index > this.itemsSize - 1){\r\n                newAngle = (this.itemsSize - 1) * itemAngle;\r\n            }else{\r\n                newAngle = this.index * itemAngle;\r\n            }\r\n        }\r\n        this.setAngle(newAngle, true);\r\n\r\n        /*if (this.index !== null) { // 当前已经旋转则,保留当前的索引\r\n         if (this.index > this.itemsSize - 1 && !this.empty) {\r\n         this.index = this.itemsSize - 1;\r\n         }\r\n         this.setAngle(this.index * itemAngle, true);\r\n         } else { // 第一次初始数据,不触发change事件\r\n         this.index = 0;     // 被调用后,不能再使用null值了\r\n         this.setAngle(0, false); // 第一次设置初始化时,不触发change事件\r\n         }*/\r\n    };\r\n\r\n    Picker.prototype._onPan = function (ev) {\r\n        if(this.empty){\r\n            return ;\r\n        }\r\n\r\n        //console.log(ev.deltaX + \"==\"+ ev.deltaY);\r\n        if (ev.type == 'panstart') { // 好像一定要移动才有startg事件\r\n            self.stopInertiaMove = true;\r\n            this.lastAngle = this.angle;\r\n            this.wrap.addClass(\"ui-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\r\n           // console.log('panstart');\r\n\r\n        } else if (ev.type == 'panmove') {\r\n            var moveAngle = this.calcAngle(ev.deltaY);\r\n            var newAngle = this.lastAngle - moveAngle;   //最新的角度\r\n            //console.log('=='+newAngle);\r\n            // 一个可以转动的最小值和最大值过滤\r\n            if (newAngle < this.beginExceed) {\r\n                newAngle = this.beginExceed;\r\n            }\r\n            if (newAngle > this.endExceed) {\r\n                newAngle = this.endExceed;\r\n            }\r\n            this.setAngle(newAngle);\r\n\r\n        } else { // end or cancel事件\r\n            // console.log('end or cancel:' + ev.type);\r\n            var v = ev.overallVelocityY;    // 滑动的速度\r\n            var dir = v > 0 ? -1 : 1; //加速度方向\r\n            var deceleration = dir * 0.0006 * -1;\r\n            var duration = Math.abs(v / deceleration); // 速度消减至0所需时间\r\n            var dist = v * duration / 2; //最终移动多少\r\n\r\n            var startAngle = this.angle;\r\n            var distAngle = -this.calcAngle(dist);\r\n           //  console.log(\"dist=\" + dist + \", distAngle\" + distAngle);\r\n\r\n            //----\r\n            var srcDistAngle = distAngle;\r\n            if (startAngle + distAngle < this.beginExceed) {\r\n                distAngle = this.beginExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n            if (startAngle + distAngle > this.endExceed) {\r\n                distAngle = this.endExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n\r\n            if (distAngle == 0) {\r\n                this.endScroll();\r\n                return;\r\n            }\r\n            this.scrollDistAngle(startAngle, distAngle, duration);\r\n        }\r\n    };\r\n\r\n    // 计算移动的角度,转动的角度,就是移动的距离对应相关圆周\r\n    // 2*r*PI = 360,  angle = 360*c/(2*r*PI)\r\n    var ca = 360 / (2 * r * Math.PI);\r\n    Picker.prototype.calcAngle = function (c) {\r\n        return c * ca;\r\n    };\r\n\r\n    // endScroll 是否为结束的滚动结束,滚动结束需要调用结束事件\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(1000px) rotateY(0deg) rotateX(\" + newAngle + \"deg)\");\r\n        this.calcItemVisable(newAngle);\r\n\r\n        if (endScroll) {\r\n            var index = newAngle / itemAngle;\r\n            var oldIndex = this.index;\r\n            this.index = this.empty ? null : index; // 这里可以做一个判断,如果是empty,则index值可以不改变\r\n\r\n            // 这个地方要判断下,数据更新或索引更新都要触发\r\n            if (oldIndex != index || this.newData) {\r\n                this.newData = false;\r\n               // console.log('change');\r\n                if (this.options.onChange && this.listen) {\r\n                    // console.log('changed call');\r\n                    this.options.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n            }\r\n        }\r\n    };\r\n\r\n    // 计算子项的显示情况\r\n    Picker.prototype.calcItemVisable = function (angle) {\r\n        this.items.each(function (index) {\r\n            var difference = Math.abs(index * itemAngle - angle);\r\n\r\n            if (difference < itemAngle / 2) {\r\n                $(this).addClass(\"ui-highlight ui-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ui-highlight ui-visible\");\r\n            } else {\r\n                $(this).addClass(\"ui-visible\").removeClass(\"ui-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ui-noanimate\");\r\n        var endAngle;\r\n\r\n        if (this.angle < this.beginAngle) {\r\n            endAngle = this.beginAngle;\r\n        } else if (this.angle > this.endAngle) {\r\n            endAngle = this.endAngle;\r\n        } else {\r\n            var index = parseInt((this.angle / itemAngle).toFixed(0));\r\n            endAngle = (itemAngle * index);\r\n        }\r\n\r\n        this.setAngle(endAngle, true);\r\n    };\r\n\r\n    // 进行惯性滚动\r\n    Picker.prototype.scrollDistAngle = function (startAngle, distAngle, duration) {\r\n        var self = this;\r\n        var nowTime = new Date().getTime();\r\n        this.stopInertiaMove = false;\r\n        duration = 1 * duration; // 滚动时长控制修改\r\n\r\n        // hammer调用的惯性函数\r\n        (function (nowTime, startAngle, distAngle, duration) {\r\n            var frameInterval = 13;\r\n            var stepCount = duration / frameInterval;\r\n            var stepIndex = 0;\r\n\r\n            (function inertiaMove() {\r\n                if (self.stopInertiaMove) return;\r\n                var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);\r\n                self.setAngle(newAngle);\r\n                stepIndex++;\r\n\r\n                if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {\r\n                    self.endScroll();\r\n                    return;\r\n                }\r\n\r\n                setTimeout(inertiaMove, frameInterval);\r\n            })();\r\n\r\n        })(nowTime, startAngle, distAngle, duration);\r\n    };\r\n\r\n    Picker.prototype.setListen = function (bool) {\r\n        this.listen = !!bool;\r\n    };\r\n\r\n    Picker.prototype.quartEaseOut = function (t, b, c, d) {\r\n        return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n    };\r\n\r\n    Picker.prototype.setSelectedValue = function (value) {\r\n        var self = this;\r\n        for (var index in self.data) {\r\n            var item = self.data[index];\r\n            if (item.value == value) {\r\n                self.setAngle(index* itemAngle, true);\r\n                return;\r\n            }\r\n        }\r\n    };\r\n\r\n    // 获取当前选中的值\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    Picker.prototype.getSelectedIndex = function () {\r\n        return this.index;\r\n    };\r\n\r\n    ipu.Picker = Picker;\r\n\r\n})(ipu || window, jQuery, Hammer);\r\n\n// popPicker\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n\r\n    function PopPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                        </div>\\\r\n                    </div>',\r\n        pickerTemplate: '<div class=\"ui-picker\">\\\r\n                            <div class=\"ui-picker-selectbox\"></div>\\\r\n                            <ul></ul>\\\r\n                          </div>',\r\n        data: [],    // 数据\r\n        layer: 1,   // 数据层级\r\n        btns: ['取消', '确认'],\r\n        callBack: function () { // 选择数据时的回调函数\r\n\r\n        }\r\n    };\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.options.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ui-poppicker-body\", this.holder);\r\n\r\n        var layer = this.options.layer;\r\n        var width = (100 / layer) + \"%\";\r\n        this.pickers = new Array(layer);\r\n        var self = this;\r\n        var pickerHtml;\r\n        this.mask = this.createMask();\r\n\r\n        // 先初始化最底层picerk,再上面来\r\n        for (var i = layer -1; i >=0; i--) {\r\n            pickerHtml = $(this.options.pickerTemplate).prependTo(bodyHtml).css({width: width});\r\n\r\n            this.pickers[i] = new  Picker(pickerHtml, {\r\n                onChange: (function (i) {\r\n                    return function (item, index) { // 更新底部的值\r\n                        if (i != layer - 1) {\r\n                            self.pickers[i + 1].setItems(item.data);\r\n                        }\r\n                    };\r\n                })(i)\r\n            });\r\n        }\r\n\r\n        $(\".ui-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.options.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.options.btns[1]);\r\n\r\n        $(\".ui-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.options.btns[0]);\r\n    };\r\n\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 获取相关值\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.options.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.options.layer; i++) {\r\n                rs.push(this.pickers[i].getSelectedItem());\r\n            }\r\n            return rs;\r\n        }\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    PopPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.hide();\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.popPicker = function (options) {\r\n        return new PopPicker(options);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n\r\n    /**\r\n     *进度条\r\n     */\r\n    function progressBar(id, options) {\r\n        this.id = id;\r\n        this.level = options.level;\r\n        this.progress = options.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (options.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (options.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    progressBar.prototype.setProgress = function (pro) {\r\n        if (pro < 0 || pro > 100) return;\r\n\r\n        $(this.progressBar.find(\".ipu-progressbar\")).css(\"transform\", \"translate3d(\" + (-(100 - pro)) + \"%, 0px, 0px)\");\r\n        this.progress = pro;\r\n    };\r\n\r\n    progressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    progressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-hightlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-highlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    ipu.progressBar = function (slt, options) {\r\n        return new progressBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $, iScroll) {\r\n\r\n    // 扩展参数,iscroll组件的参数选项\r\n    // 扩展参数,用户直接在页面上自定好,顶端和底部加载html\r\n    // 设置上下条件长度,或计算函数\r\n    // 处理resize的问题,用户主动调用refresh??\r\n    // 底部启用或停用时,应该刷新组件iscroll高度\r\n    // 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n    Refresh.prototype.defaultOptions = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ui-refresh-bottom\"><span class=\"ui-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ui-refresh-top\"><span class=\"ui-refresh-loading\"></span><div class=\"ui-refresh-arrow\"></div></div>',\r\n                // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n                // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ui-refresh-top-loading\r\n                // 拖动达到加载距离,则增加class:ui-refresh-toload\r\n                // 加载中,则增加class:ui-refresh-top-loading,移除class:ui-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOptions:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    function Refresh(slt, options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOptions = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ui-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ui-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ui-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ui-refresh-toload');\r\n                    }\r\n                }\r\n\r\n                me._checkBottomLoading(); // 底部加载条件和顶部条件不一样,只要滚动离底部一定高度就开始加载\r\n                me.goTop = this.y > me.topPullOffset; // 记录是否位于顶部位置,以便刷新后可以回到此位置\r\n            },\r\n            onBeforeScrollEnd: function () {    // 一定是用户拖动触发,在滚动结束前应该触发\r\n                me._checkTopLoading();\r\n                me._checkBottomLoading();\r\n            },\r\n            onScrollEnd: function () { // 这个事件可能由非用户拖动时触发,可能是拖动惯性导致,所有顶部不应该处理,但顶部不管是否惯性,位置条件满足即触发\r\n                if (me.topLoading && this.y < this.minScrollY && me.goTop) {\r\n                    me.iScroll.scrollTo(0, this.minScrollY, 0);\r\n                }\r\n                me._checkBottomLoading(); // 在beforend执行还不够,还在要end执行\r\n            },\r\n            onRefresh: function () { // 刷新时,若顶部加载还在进行,且当前显示的顶部加载,则继续显示,否则刷新后会消失顶部加载,这里代码没有考虑重用了,应该可以做一步提取\r\n                if (me.topLoading) { // 如果顶部在加载,则刷新的时候,设置最小顶部距离,显示顶部加载状态\r\n                    this.minScrollY = this.minScrollY + me.topPullOffset;\r\n                }\r\n            }\r\n        };\r\n\r\n        this.iScrollOptions = $.extend({}, this.options.iScrollOptions, this.iScrollOptions);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOptions);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ui-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.options.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.options.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.options.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        this.topLoading = false;        // 顶部正在载加载\r\n        this.bottomLoading = false;     // 底部正在加载\r\n        this.bottomEnable = this.options.initEnableBottom && !!this.options.bottomLoadFun;\r\n        this.topEnable = this.options.initEnableTop && !!this.options.topLoadFun;\r\n        this.goTop = false;         // 用来处理,因为iScroll使用momentum(惯性), 导致有时顶部显示不正确问题,true表示顶部显示加载条\r\n\r\n        this.enableBottom(this.bottomEnable);\r\n        this.enableTop(this.topEnable);\r\n    };\r\n\r\n    // 检查是否需要底部加载\r\n    Refresh.prototype._checkBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            if (this.iScroll.y < this.iScroll.maxScrollY + this.bottomPullOffset) {\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    Refresh.prototype._checkTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            if (this.topEl.hasClass('ui-refresh-toload')) {\r\n                this._startTopLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 检查内容是否超出容器高度,未超出时,自动调用底部加载\r\n    Refresh.prototype._checkContentLoading = function () {\r\n        if(this.iScroll.maxScrollY >= -this.bottomPullOffset){ // 此处要计算底端的高度\r\n            this._startBottomLoading();\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.options.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ui-refresh-toload').addClass('ui-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.options.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 结束底部加载\r\n    Refresh.prototype.endBottomLoading = function () {\r\n        this.bottomLoading = false;\r\n        this.refresh();\r\n    };\r\n\r\n    // 结束顶部加载\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ui-refresh-top-loading');\r\n        this.topLoading = false;\r\n        // this.iScroll.scrollTo(0, 0); // 刷新加载则应该回到顶部,待测试确认\r\n        this.refresh();\r\n    };\r\n\r\n    // 设置顶部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableTop = function (enable) {\r\n        this.topEnable = enable;\r\n        if (enable) {\r\n            this.topEl.show();\r\n        } else {\r\n            this.topEl.hide();\r\n        }\r\n    };\r\n\r\n    // 设置底部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableBottom = function (enable) {\r\n        this.bottomEnable = enable;\r\n        if (enable) {\r\n            this.bottomEl.show();\r\n        } else {\r\n            this.bottomEl.hide();\r\n        }\r\n    };\r\n\r\n    // 只有在内容发生变更时,但是又没有触发调用end相关方法时,使用此方法更新高度信息\r\n    // 或者组件在一开始未显示??\r\n    // 刷新会移除拖动中状态\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n    ipu.refresh = function (slt, optoins) {\r\n        return new Refresh(slt, optoins);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// Tab\r\n(function (ipu, $) {\r\n    function Tab(holder, options) {\r\n        this.el = $(holder).get(0);\r\n        this.titleItems = $(\".ui-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ui-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ui-tab-fixed\"); // 是否为固定高度的\r\n\r\n        var that = this;\r\n        this.titleItems.each(function (index) {\r\n            $(this).click(function () {\r\n                that.show(index);\r\n            });\r\n        });\r\n\r\n        var index = this.titleItems.filter(\".ui-current\").index();\r\n        if (index == -1) {\r\n            index = 0;\r\n        }\r\n\r\n        this.show(index);\r\n    }\r\n\r\n    Tab.prototype.defaultOptions = {\r\n        callBack: null  // 回调函数,tab切换时回调函数\r\n    };\r\n\r\n    Tab.prototype.show = function (index) {\r\n        if (this.fixed) {\r\n            var move = -index * 100 + \"%\";\r\n            this.bodyWrapper.css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        }\r\n        this.contentItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this.titleItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this._end(index);\r\n    };\r\n\r\n    Tab.prototype._end = function (index) {\r\n        this.lastIndex = this.currentIndex;\r\n        this.currentIndex = index;\r\n\r\n        if (this.options.callBack) {\r\n            this.options.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, options) {\r\n        return new Tab(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\r\n\n// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipu, $) {\r\n    var active = {};\r\n\r\n    var options = defaultOptions = {\r\n        distanceAllow: 10,   // 最大移动距离,超过移除效果\r\n        displayDelay: 100,  // 延时显示时间,以防止是滚动操作\r\n        hideDelay: 120,     // 隐藏延时时间\r\n        eventName: 'click', // 事件处理是click\r\n        activeClass: 'ui-active',   // 激活时的class\r\n        getHandleNode: function (node) {  // 找到最先一级处理此click事件的元素\r\n            if (!node || !node.nodeType) return;\r\n\r\n            var distNode = null;\r\n            var nodeArray = [];\r\n\r\n            // 还有其它情形考虑,如a标签的跳转,或在原生元素添加事件属性的\r\n            function findHander(inNode) {\r\n                // 此方法适用于jquery, 1.12.4, 2.2.4, 3.2.1版本,_data方法以后可能会被移除。$.data是一些老版本写法\r\n                var eventHandlers = ($._data || $.data)(inNode, 'events');\r\n\r\n                if (eventHandlers) {\r\n                    eventHandlers = eventHandlers[options.eventName];\r\n                }\r\n\r\n                if (!eventHandlers) {\r\n                    return;\r\n                }\r\n\r\n                var thisNode = false;\r\n                $.each(eventHandlers, function (index, handler) {\r\n                    if (handler.selector) {\r\n                        var objs = $(handler.selector, inNode);\r\n                        $.each(nodeArray, function (tIndex, tNode) {\r\n                            if (objs.is(tNode)) {\r\n                                distNode = tNode;\r\n                                return false;\r\n                            }\r\n                        });\r\n\r\n                        if (distNode) {\r\n                            return false; //\r\n                        }\r\n                    } else {\r\n                        thisNode = true;  // 保存distNode,有可能有子节点满足条件,所以只保存此值为默认值\r\n                    }\r\n                });\r\n\r\n                if (thisNode && distNode == null) { // 如果没在子节点找到click事件,而当前节点又有click事件,就使用当前节点\r\n                    distNode = inNode;\r\n                }\r\n\r\n                return distNode;\r\n            }\r\n\r\n            while (!(\"tagName\" in node) || !findHander(node)) {\r\n                if (!node.parentNode || node.parentNode.nodeType != 1) {\r\n                    break;\r\n                }\r\n                nodeArray.push(node);\r\n                node = node.parentNode;\r\n            }\r\n\r\n            return distNode;\r\n        }\r\n    };\r\n\r\n    function getOriginalEvent(e) {\r\n        return e.originalEvent || e;\r\n    }\r\n\r\n    function getXY(e) {\r\n        var x = e.touches ? e.touches[0].pageX : e.clientX;\r\n        var y = e.touches ? e.touches[0].pageY : e.clientY;\r\n        return [x, y];\r\n    }\r\n\r\n    //根据不同浏览器获取不同原生事件event\r\n    var hasTouch = \"ontouchstart\" in window,\r\n        START_EVENT = hasTouch ? 'touchstart' : 'mousedown',\r\n        MOVE_EVENT = hasTouch ? 'touchmove' : 'mousemove',\r\n        END_EVENT = hasTouch ? 'touchend' : 'mouseup',\r\n        CANCEL_EVENT = hasTouch ? 'touchcancel' : '';\r\n\r\n    $(function () {\r\n        var startXY, tapEl, timeOutID;\r\n        var dom = document.body;\r\n\r\n        // force为false的时候,不用管timeOutID,在老的timeOutID未移除的情况下,有可能又产生了新的,\r\n        // 导致else代码未被执行,导致老的点击元素class未被移除\r\n        function removeClass(dom, force) {\r\n            if (force && timeOutID) {\r\n                window.clearTimeout(timeOutID);\r\n            } else {\r\n                $(dom).removeClass(options.activeClass);\r\n            }\r\n        }\r\n\r\n        function removeActive(force) {\r\n            if (force) {\r\n                removeClass(tapEl, force);\r\n            } else {\r\n                window.setTimeout(removeClass, options.hideDelay, tapEl, force);\r\n            }\r\n            startXY = null;\r\n            tapEl = null;\r\n        }\r\n\r\n        $(dom).bind(START_EVENT, function (e) {\r\n            if (tapEl) {    // 多点接触时处理\r\n                removeActive(true);\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n            startXY = getXY(e);\r\n            tapEl = options.getHandleNode(e.target);\r\n\r\n            if (tapEl) {\r\n                timeOutID = window.setTimeout(function (dom) {\r\n                    timeOutID = null;\r\n                    $(dom).addClass(options.activeClass);\r\n                }, options.displayDelay, tapEl);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(MOVE_EVENT, function (e) {\r\n            if (!tapEl) {\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n\r\n            var xy = getXY(e);\r\n            if (startXY && (Math.abs(xy[0] - startXY[0]) > options.distanceAllow || Math.abs(xy[1] - startXY[1]) > options.distanceAllow)) {\r\n                removeActive(true);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(END_EVENT, function (e) {\r\n            if (tapEl) {\r\n                removeActive();\r\n            }\r\n        });\r\n\r\n        // 手机来电等非用户取消操作时触发事件\r\n        if (CANCEL_EVENT) {\r\n            $(dom).bind(CANCEL_EVENT, function (e) {\r\n                if (tapEl) {\r\n                    removeActive();\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    // 更新默认值\r\n    active.setOptions = function (opts) {\r\n        options = this.options = $.extend({}, defaultOptions, opts);\r\n    };\r\n    ipu.active = active;\r\n})(ipu || window, jQuery);\r\n\r\n\n/*===========================\r\nDevice/OS Detection\r\n===========================*/\r\n// from sui,但IPU框架的ua不是这样的\r\n;(function (ipu, $) {\r\n    \"use strict\";\r\n    var device = {};  // Classes\r\n    var classNames = [];\r\n    var ua = navigator.userAgent\r\n    \r\n    // 这中针对ipu框架的情况,待测试\r\n    if(ua.match(/ipumobile/i)){\r\n        device.ios =  !!ua.match(/ios/i);\r\n        device.android = !!ua.match(/android/i);\r\n    }else{\r\n        var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\r\n        var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\r\n        var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\r\n        var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\r\n\r\n        device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\r\n\r\n        // Android\r\n        if (android) {\r\n            device.os = 'android';\r\n            device.osVersion = android[2];\r\n            device.android = true;\r\n            device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\r\n        }\r\n        if (ipad || iphone || ipod) {\r\n            device.os = 'ios';\r\n            device.ios = true;\r\n        }\r\n        // iOS\r\n        if (iphone && !ipod) {\r\n            device.osVersion = iphone[2].replace(/_/g, '.');\r\n            device.iphone = true;\r\n        }\r\n        if (ipad) {\r\n            device.osVersion = ipad[2].replace(/_/g, '.');\r\n            device.ipad = true;\r\n        }\r\n        if (ipod) {\r\n            device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\r\n            device.iphone = true;\r\n        }\r\n        // iOS 8+ changed UA\r\n        if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\r\n            if (device.osVersion.split('.')[0] === '10') {\r\n                device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\r\n            }\r\n        }\r\n\r\n        // Webview\r\n        device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\r\n\r\n        // Minimal UI\r\n        if (device.os && device.os === 'ios') {\r\n            var osVersionArr = device.osVersion.split('.');\r\n            device.minimalUi = !device.webView &&\r\n                (ipod || iphone) &&\r\n                (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\r\n                $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\r\n        }\r\n\r\n        // Check for status bar and fullscreen app mode\r\n        var windowWidth = $(window).width();\r\n        var windowHeight = $(window).height();\r\n        device.statusBar = false;\r\n        if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\r\n            device.statusBar = true;\r\n        }\r\n        else {\r\n            device.statusBar = false;\r\n        }\r\n\r\n\r\n        // Pixel Ratio\r\n        device.pixelRatio = window.devicePixelRatio || 1;\r\n        classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\r\n        if (device.pixelRatio >= 2) {\r\n            classNames.push('retina');\r\n        }\r\n\r\n        // OS classes\r\n        if (device.os) {\r\n            classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\r\n            if (device.os === 'ios') {\r\n                var major = parseInt(device.osVersion.split('.')[0], 10);\r\n                for (var i = major - 1; i >= 6; i--) {\r\n                    classNames.push('ios-gt-' + i);\r\n                }\r\n            }\r\n\r\n        }\r\n        // Status bar classes\r\n        if (device.statusBar) {\r\n            classNames.push('with-statusbar-overlay');\r\n        }\r\n        else {\r\n            $('html').removeClass('with-statusbar-overlay');\r\n        }\r\n\r\n\r\n        // keng..\r\n        device.isWeixin = /MicroMessenger/i.test(ua);\r\n    }\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0){\r\n        $('html').addClass(classNames.join(' '));\r\n    }\r\n\r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n\n\r\n        // 初始化代码\r\n        jQuery(function () {\r\n            FastClick.attach(document.body);\r\n        });\r\n\r\n        return ipu;\r\n    }\r\n\r\n    // todo:可以添加一个和其它库的适配处理,\r\n    // 这里假设第三方库,jquery,iScroll,Hammer的史称已经固定\r\n    if ( typeof define === \"function\" && define.amd ) {\r\n        define(['jquery', 'iScroll', 'Hammer', 'FastClick'], function (jQuery, iScroll, Hammer, FastClick) {\r\n            return window.ipu = setup(jQuery, iScroll, Hammer, FastClick);\r\n        });\r\n    } else {\r\n        window.ipu = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n    }\r\n})();\r\n\r\n//# sourceMappingURL=ipu.js.map\r\n"]}
1
{"version":3,"sources":["ipu.js"],"names":["setup","jQuery","iScroll","Hammer","FastClick","ipu","$","iscroll","Carousel","slt","options","this","extend","defaultOpt","el","eq","autoPlay","hasIndicator","indicator","callBack","currentIndex","_init","play","prototype","index","duration","indicatorPosition","wrapper","carouselItems","size","that","activeIndex","filter","_addIndicator","window","resize","refresh","scrollOpt","snap","momentum","scrollX","scrollY","hScrollbar","onScrollStart","_pause","onTouchEnd","onScrollEnd","_end","get","show","stop","timeoutId","clearTimeout","prev","next","time","scrollToPage","_play","setTimeout","currPageX","indicatorIndexs","addClass","siblings","removeClass","html","i","appendTo","destroy","carousel","DtPicker","defaultOptions","Picker","defaultPickerDate","Date","template","buttons","labels","type","customData","hasClear","self","mask","createMask","_picker","holder","ui","picker","ok","cancel","clear","listen","h","onChange","item","beginMonth","endMonth","_createMinutes","d","_createHours","m","_createDay","y","_createMonth","_create","_setLabels","_setButtons","attr","_setSelectedValue","value","getSelected","selected","getSelectedItem","toString","text","getFullYear","getMonth","getDate","getHours","getMinutes","parsedValue","_parseSetValue","setListen","setSelectedValue","isLeapYear","year","_inArray","array","_item","getDayNum","month","_fill","num","length","_isBeginYear","beginYear","parseInt","getSelectedValue","_isBeginMonth","_isBeginDay","beginDay","_isBeginHours","beginHours","_isEndYear","endYear","_isEndMonth","_isEndDay","endDay","_isEndHours","endHours","_createYear","current","yArray","yBegin","yEnd","push","setItems","mArray","maxMonth","val","dArray","maxDay","hArray","maxHours","iArray","beginMinutes","maxMinutes","endMinutes","each","label","innerText","hide","click","clickCall","now","rs","valu","parts","replace","split","j","beginDate","endDate","setBeginDate","date","setEndDate","dispose","parentNode","removeChild","name","disposed","sltDate","call","close","callback","element","document","createElement","classList","add","addEventListener","_show","setAttribute","body","appendChild","_remove","dtPicker","HammerCarousel","navSlt","clickBack","showSize","carouselItemSizes","moveLen","lastItem","slice","clone","sizeCount","hammer","Manager","Pan","direction","DIRECTION_HORIZONTAL","threshold","on","bindFn","onPan","width","wrapperSize","outerWidth","itemSize","mostSize","dom","position","left","move","displayMoveLen","css","animate","toggleClass","ev","delta","deltaX","intValue","Math","abs","decimal","hammerCarousel","__dealCssEvent","eventNameArr","fireCallBack","e","target","events","off","handleClicks","clicked","hasClass","defaults","modalCloseByOutside","closeModal","actionsCloseByOutside","popupCloseByOutside","fn","transitionEnd","_modalTemplateTempDiv","modalStack","modalButtonOk","modalButtonCancel","modalPreloaderTitle","modalContainer","modalStackClearQueue","shift","modal","params","modalHTML","buttonsHTML","bold","extraClass","titleHTML","title","textHTML","afterTextHTML","afterText","noButtons","verticalButtons","innerHTML","children","append","find","onClick","openModal","alert","callbackOk","arguments","undefined","modalTitle","confirm","callbackCancel","omodalButtonCancelnClick","prompt","minLoad","loadOverTime","loadEnd","loadTimeOut","showPreloader","minTime","hidePreloader","preloaderModal","force","showIndicator","hideIndicator","remove","actions","groupSelector","buttonSelector","isArray","button","buttonClass","color","bg","disabled","groups","groupIndex","clickTarget","buttonIndex","buttonParams","is","toast","msg","extraclass","$toast","cb","isModal","isNotToast","isPopup","isLoginScreen","isPickerModal","isToast","marginTop","round","outerHeight","marginLeft","overlay","clientLeft","trigger","removeOnClose","NavBar","content","contentSlt","nav","contents","navs","me","lastIndex","navBar","submitForm","doc","url","form","action","method","style","display","x","ele","submit","checkPages","hasPages","pagesObj","zeroPageClass","pageIdPrefix","isZeroPage","page","animationEnd","maps","pageNo","animateInClass","animateOutClass","eventName","zeroPagesClass","parent","backIndex","closeIndex","showLoading","loadingMessage","minMessageTime","data","pageName","openPage","end","animatePage","newPage","nowPageNo","zeroPage","one","pageDoc","contentDocument","postPage","backPage","nextAll","nowDoc","iframe","evt","createEvent","initEvent","dispatchEvent","nowPage","prevPage","prevAll","closePage","open","post","back","backHome","onBack","originalEvent","showItemSize","r","itemAngle","maxExceed","wrap","beginAngle","beginExceed","stopInertiaMove","lastAngle","empty","device","ios","DIRECTION_VERTICAL","Press","_onPan","endScroll","textName","newData","lis","items","itemsSize","endAngle","endExceed","transform","transform-origin","setAngle","newAngle","angle","moveAngle","calcAngle","deltaY","v","overallVelocityY","dir","deceleration","dist","startAngle","distAngle","srcDistAngle","scrollDistAngle","ca","PI","c","calcItemVisable","oldIndex","difference","toFixed","nowTime","getTime","frameInterval","stepCount","stepIndex","inertiaMove","quartEaseOut","bool","t","b","getSelectedText","getSelectedIndex","PopPicker","pickerTemplate","layer","btns","bodyHtml","pickers","Array","pickerHtml","prependTo","getSelectItems","setData","popPicker","progressBar","id","level","progress","setProgress","setLevel","pro","getProgress","Refresh","_initBottomAndTop","iScrollOptions","onScrollMove","topEnable","topLoading","topPullOffset","topEl","_checkBottomLoading","goTop","onBeforeScrollEnd","_checkTopLoading","minScrollY","scrollTo","onRefresh","_checkContentLoading","bottomLoadFun","topLoadFun","initEnableTop","initEnableBottom","bottomLoadHtml","topLoadHtml","bottomAddLen","scrollEl","bottomEl","bottomPullOffset","bottomLoading","bottomEnable","enableBottom","enableTop","maxScrollY","_startBottomLoading","_startTopLoading","endBottomLoading","endTopLoading","enable","optoins","Tab","titleItems","bodyWrapper","contentItems","fixed","tab","getOriginalEvent","getXY","touches","pageX","clientX","pageY","clientY","active","distanceAllow","displayDelay","hideDelay","activeClass","getHandleNode","node","findHander","inNode","eventHandlers","_data","thisNode","handler","selector","objs","nodeArray","tIndex","tNode","distNode","nodeType","hasTouch","START_EVENT","MOVE_EVENT","END_EVENT","CANCEL_EVENT","timeOutID","removeActive","tapEl","startXY","bind","xy","setOptions","opts","classNames","ua","navigator","userAgent","match","android","ipad","ipod","iphone","androidChrome","os","osVersion","toLowerCase","indexOf","webView","osVersionArr","minimalUi","windowWidth","windowHeight","height","statusBar","screen","pixelRatio","devicePixelRatio","floor","major","isWeixin","test","join","attach","define","amd"],"mappings":"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","file":"ipu.min.js","sourcesContent":["(function () {\r\n    function setup(jQuery, iScroll, Hammer, FastClick) {\r\n        var ipu = {};\r\n\n// Carousel\r\n(function (ipu, $, iscroll) {\r\n// carouselSlt应该是唯一的,否则怎么支撑多个回调,如果用户不需要多个回调,也不主动调用,则可以,先不管吧???\r\n    function Carousel(slt, options) {\r\n        this.options = options = $.extend({}, this.defaultOpt, options);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = options.autoPlay;\r\n         this.hasIndicator = options.indicator;\r\n        this.callBack = options.callBack;\r\n        this.currentIndex = null;\r\n\r\n        this._init();\r\n        this.play();\r\n    }\r\n\r\n    Carousel.prototype = {\r\n        defaultOpt: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            that = this;\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.hasIndicator) {\r\n                this._addIndicator();\r\n            }\r\n            $(window).resize(function () {\r\n                that.refresh();\r\n            });\r\n            var scrollOpt = {\r\n                snap: \"li\",          // carousel效果\r\n                momentum: false,     // 移除惯性处理\r\n                scrollX: true,       // X轴移动\r\n                scrollY:false,\r\n                hScrollbar: false,   // 没有纵向滚动条\r\n                onScrollStart: function () {\r\n                    that._pause();\r\n                },\r\n                onTouchEnd: function () {\r\n                    // 后面优化\r\n                    /*\r\n                     if (that.iscroll.currPageX == that.size - 1) {\r\n                     that.show(that.size - 2);\r\n                     }\r\n                     */\r\n                },\r\n                onScrollEnd: function () {\r\n                    that._end();\r\n                }\r\n            };\r\n            this.iscroll = new iscroll(this.el.get(0), scrollOpt);\r\n            this.show(this.options.index, 0);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.autoPlay=false;\r\n        },\r\n        _pause: function () {\r\n            if (this.autoPlay && this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            this.show(index);\r\n        },\r\n        next: function () {\r\n            var index = this.currentIndex == this.size - 1 ? 0 : this.currentIndex + 1;\r\n            this.show(index);\r\n        },\r\n        show: function (index, time) {\r\n            this._pause();\r\n            this.iscroll.scrollToPage(index, 0, time);\r\n        },\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        refresh: function () {\r\n            var that = this;\r\n            that.show(this.currentIndex);\r\n        },\r\n        _play: function () {\r\n            if (this.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    this.timeoutId = null;\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {\r\n            var currentIndex = this.iscroll.currPageX;\r\n            if (currentIndex != this.currentIndex) {\r\n                if (this.callBack) {\r\n                    this.callBack(currentIndex, this.currentIndex);\r\n                }\r\n                this.currentIndex = currentIndex;\r\n\r\n                if (this.hasIndicator) {\r\n                    this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this._play();\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        destroy: function () {\r\n            // 自己怎么销毁,相关事件移除??\r\n            this.iscroll.destroy();\r\n        }\r\n    };\r\n\r\n    ipu.carousel =  function (slt, options) {\r\n        return new Carousel(slt, options);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来运算\r\n\r\n\r\n    // show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n    // 日期范围的选择处理\r\n    function DtPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    DtPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker ui-dtpicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-clear\">清除</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-title\">\\\r\n                            <label class=\"ui-dtpicker-y\"></label>\\\r\n                            <label class=\"ui-dtpicker-m\"></label>\\\r\n                            <label class=\"ui-dtpicker-d\"></label>\\\r\n                            <label class=\"ui-dtpicker-h\"></label>\\\r\n                            <label class=\"ui-dtpicker-mi\"></label>\\\r\n                        </div>\\\r\n                        <div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                            <div class=\"ui-picker\" data-id=\"picker-y\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-m\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-d\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-h\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                             <div class=\"ui-picker\" data-id=\"picker-mi\">\\\r\n                                <div class=\"ui-picker-selectbox\"></div>\\\r\n                                <ul></ul>\\\r\n                            </div>\\\r\n                        </div>\\\r\n                    </div>',\r\n        buttons: ['取消', '确认', '清除'],\r\n        labels: ['年', '月', '日', '时', '分'],\r\n        type: 'datetime',       // date, time, datetime, hour, month\r\n        customData: {},  // 自定义数据\r\n        hasClear: false,    // 是否显示清除按钮\r\n        callBack: function () { // 选择数据时的回调函数\r\n        }\r\n        // beginDate: Date类型,或毫秒值\r\n        // endDate: 同上\r\n    };\r\n\r\n    DtPicker.prototype._init = function () {\r\n        var self = this;\r\n        this.mask = this.createMask();\r\n\r\n        var _picker = this.holder = $(this.options.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ui-poppicker-btn-ok', _picker),\r\n            cancel: $('.ui-poppicker-btn-cancel', _picker),\r\n            clear: $('.ui-poppicker-btn-clear', _picker),\r\n            buttons: $('.ui-poppicker-header .ui-btn', _picker),\r\n            labels: $('.ui-poppicker-title label', _picker)\r\n        };\r\n\r\n\r\n        ui.i = new Picker($('[data-id=\"picker-mi\"]', _picker), {listen: false}); // 分钟变更无需要处理\r\n\r\n        ui.h = new Picker($('[data-id=\"picker-h\"]', _picker), {         // 小时变更,有最小值或最大值,需要变更分钟\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createMinutes();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.d = new Picker($('[data-id=\"picker-d\"]', _picker), { //仅提供了beginDate时,触发day,hours,minutes的change\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null && (self.options.beginMonth || self.options.endMonth)) {\r\n                    self._createHours();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.m = new Picker($('[data-id=\"picker-m\"]', _picker), { // 月变更时,总要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index !== null) {\r\n                    self._createDay();\r\n                }\r\n            }\r\n        });\r\n\r\n        ui.y = new Picker($('[data-id=\"picker-y\"]', _picker), { // 年发生变更,如果没有结束月,此时有所有的月,是不需要变更月的,只需要变更day\r\n            listen: false,\r\n            onChange: function (item, index) {\r\n                if (index != null) {\r\n                    if (self.options.beginMonth || self.options.endMonth) {\r\n                        self._createMonth();\r\n                    } else {\r\n                        self._createDay();\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n\r\n\r\n\r\n        self._create();\r\n\r\n        var ui = self.ui;\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.options.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.options.value);\r\n\r\n        //防止滚动穿透 TODO:待确认情况\r\n        /* self.ui.picker.addEventListener($.EVENT_START, function (event) {\r\n         event.preventDefault();\r\n         }, false);\r\n         self.ui.picker.addEventListener($.EVENT_MOVE, function (event) {\r\n         event.preventDefault();\r\n         }, false);*/\r\n    };\r\n\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.options.type;\r\n        var selected = {\r\n            type: type,\r\n            y: ui.y.getSelectedItem(),\r\n            m: ui.m.getSelectedItem(),\r\n            d: ui.d.getSelectedItem(),\r\n            h: ui.h.getSelectedItem(),\r\n            i: ui.i.getSelectedItem(),\r\n            toString: function () {\r\n                return this.value;\r\n            }\r\n        };\r\n        switch (type) {\r\n            case 'datetime':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'date':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text;\r\n                break;\r\n            case 'time':\r\n                selected.value = selected.h.value + ':' + selected.i.value;\r\n                selected.text = selected.h.text + ':' + selected.i.text;\r\n                break;\r\n            case 'month':\r\n                selected.value = selected.y.value + '-' + selected.m.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text;\r\n                break;\r\n            case 'hour':\r\n                selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value;\r\n                selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text;\r\n                break;\r\n        }\r\n        return selected;\r\n    };\r\n\r\n    DtPicker.prototype._setSelectedValue = function (value) {\r\n        var self = this;\r\n        var ui = self.ui;\r\n\r\n        if(!value){\r\n            if(this.options.type == 'time'){\r\n                value = '00:00';\r\n            }else{\r\n                value = defaultPickerDate.getFullYear()+'-'+(defaultPickerDate.getMonth()+1)+'-'+defaultPickerDate.getDate()+' '\r\n                    + defaultPickerDate.getHours() + ':' + defaultPickerDate.getMinutes();\r\n            }\r\n        }\r\n        var parsedValue = self._parseSetValue(value);\r\n\r\n        ui.y.setListen(true);\r\n        ui.m.setListen(false);\r\n        ui.d.setListen(false);\r\n        ui.h.setListen(false);\r\n        ui.i.setListen(false);\r\n        ui.y.setSelectedValue(parsedValue.y);\r\n\r\n        ui.m.setListen(true);\r\n        ui.m.setSelectedValue(parsedValue.m);\r\n\r\n        ui.d.setListen(true);\r\n        ui.d.setSelectedValue(parsedValue.d);\r\n\r\n        ui.h.setListen(true);\r\n        ui.h.setSelectedValue(parsedValue.h);\r\n\r\n        ui.i.setListen(true);\r\n        ui.i.setSelectedValue(parsedValue.i);\r\n\r\n        this.value = this.getSelected().value;\r\n    };\r\n\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    DtPicker.prototype.isLeapYear = function (year) {\r\n        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);\r\n    };\r\n\r\n    DtPicker.prototype._inArray = function (array, item) {\r\n        for (var index in array) {\r\n            var _item = array[index];\r\n            if (_item === item) return true;\r\n        }\r\n        return false;\r\n    };\r\n\r\n    DtPicker.prototype.getDayNum = function (year, month) {\r\n        var self = this;\r\n        if (self._inArray([1, 3, 5, 7, 8, 10, 12], month)) {\r\n            return 31;\r\n        } else if (self._inArray([4, 6, 9, 11], month)) {\r\n            return 30;\r\n        } else if (self.isLeapYear(year)) {\r\n            return 29;\r\n        } else {\r\n            return 28;\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype._fill = function (num) {\r\n        num = num.toString();\r\n        if (num.length < 2) {\r\n            num = 0 + num;\r\n        }\r\n        return num;\r\n    };\r\n\r\n    DtPicker.prototype._isBeginYear = function () {\r\n        return this.options.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.options.beginMonth && this._isBeginYear() && this.options.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.options.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.options.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.options.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.options.endMonth && this._isEndYear() && this.options.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.options.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.options.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (options.customData.y) {\r\n            yArray = options.customData.y;\r\n        } else {\r\n            var yBegin = options.beginYear;\r\n            var yEnd = options.endYear;\r\n            for (var y = yBegin; y <= yEnd; y++) {\r\n                yArray.push({\r\n                    text: y + '',\r\n                    value: y\r\n                });\r\n            }\r\n        }\r\n        ui.y.setItems(yArray);\r\n        //ui.y.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMonth = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (options.customData.m) {\r\n            mArray = options.customData.m;\r\n        } else {\r\n            var m = options.beginMonth && self._isBeginYear() ? options.beginMonth : 1;\r\n            var maxMonth = options.endMonth && self._isEndYear() ? options.endMonth : 12;\r\n            for (; m <= maxMonth; m++) {\r\n                var val = self._fill(m);\r\n                mArray.push({\r\n                    text: val,\r\n                    value: m\r\n                });\r\n            }\r\n        }\r\n        ui.m.setItems(mArray);\r\n        //ui.m.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createDay = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (options.customData.d) {\r\n            dArray = options.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? options.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? options.endDay : self.getDayNum(parseInt(this.ui.y.getSelectedValue()), parseInt(this.ui.m.getSelectedValue()));\r\n            for (; d <= maxDay; d++) {\r\n                var val = self._fill(d);\r\n                dArray.push({\r\n                    text: val,\r\n                    value: d\r\n                });\r\n            }\r\n        }\r\n        ui.d.setItems(dArray);\r\n        //current = current || ui.d.getSelectedValue();\r\n        //ui.d.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createHours = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (options.customData.h) {\r\n            hArray = options.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? options.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? options.endHours : 23;\r\n            for (; h <= maxHours; h++) {\r\n                var val = self._fill(h);\r\n                hArray.push({\r\n                    text: val,\r\n                    value: h\r\n                });\r\n            }\r\n        }\r\n        ui.h.setItems(hArray);\r\n        //ui.h.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._createMinutes = function (current) {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (options.customData.i) {\r\n            iArray = options.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? options.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? options.endMinutes : 59;\r\n            for (; i <= maxMinutes; i++) {\r\n                var val = self._fill(i);\r\n                iArray.push({\r\n                    text: val,\r\n                    value: i\r\n                });\r\n            }\r\n        }\r\n        ui.i.setItems(iArray);\r\n        //ui.i.setSelectedValue(current);\r\n    };\r\n\r\n    DtPicker.prototype._setLabels = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = options.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var options = self.options;\r\n        var ui = self.ui;\r\n        ui.cancel.text(options.buttons[0]);\r\n        ui.ok.text(options.buttons[1]);\r\n\r\n        if(options.hasClear){\r\n            ui.clear.text(options.buttons[2])\r\n        }else{\r\n            ui.clear.hide();\r\n        }\r\n\r\n        ui.buttons.each(function (index) {\r\n            $(this).click(function () {\r\n                self.clickCall(index);\r\n            })\r\n        })\r\n    };\r\n\r\n    // 解析设置的值,目前是字符串,完整日期格式 2012-12-12 12:21\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.options.type;\r\n\r\n        var rs = {\r\n            y: now.getFullYear(),\r\n            m: now.getMonth()+1,\r\n            d: now.getDate(),\r\n            h: now.getHours(),\r\n            i: now.getMinutes()\r\n        };\r\n\r\n        if(value instanceof Date){\r\n            if( type == 'time'){\r\n                valu= +value.getHours()+\":\"+value.getMinutes();\r\n            }else{\r\n                value = value.getFullYear()+'-'+(value.getMonth()+1)+'-'+value.getDate()+ ' '\r\n                    +value.getHours()+\":\"+value.getMinutes();\r\n            }\r\n        }\r\n\r\n        var parts = value.replace(\":\", \"-\").replace(\" \", \"-\").split(\"-\");\r\n        for(var i=0, j=parts.length; i<j; i++){\r\n            parts[i] = parseInt(parts[i]);\r\n        }\r\n\r\n        if(type == 'datetime'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = parts[4];\r\n        }else if(type == 'date'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }else if(type == 'time'){\r\n            rs.h = parts[0];    //\r\n            rs.i = parts[1];\r\n        }else if(type == 'hour'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = parts[2];    //\r\n            rs.h = parts[3];    //\r\n            rs.i = 0;\r\n        }else if(type == 'month'){\r\n            rs.y = parts[0];\r\n            rs.m = parts[1];\r\n            rs.d = 1;    //\r\n            rs.h = 0;    //\r\n            rs.i = 0;\r\n        }\r\n\r\n        return rs;\r\n    };\r\n\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var options = this.options;\r\n        var now = defaultPickerDate;\r\n\r\n        var beginDate = options.beginDate;\r\n        if(beginDate){\r\n            beginDate = this._parseSetValue(beginDate);\r\n            options.beginYear = beginDate.y;\r\n            options.beginMonth = beginDate.m;\r\n            options.beginDay = beginDate.d;\r\n            options.beginHours = beginDate.h;\r\n            options.beginMinutes = beginDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.beginYear =  now.getFullYear();\r\n            options.beginMonth = now.getMonth() + 1;\r\n            options.beginDay = now.getDate();\r\n            options.beginHours = 0;\r\n            options.beginMinutes = 0;\r\n        }else {\r\n            options.beginYear =  now.getFullYear() - 5;\r\n        }\r\n\r\n        var endDate = options.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            options.endYear = endDate.y;\r\n            options.endMonth = endDate.m;\r\n            options.endDay = endDate.d;\r\n            options.endHours = endDate.h;\r\n            options.endMinutes = endDate.i;\r\n        }else if(options.type == 'time'){\r\n            options.endYear =  now.getFullYear();\r\n            options.endMonth = now.getMonth() + 1;\r\n            options.endDay = now.getDate();\r\n            options.endHours = 24;\r\n            options.endMinutes = 59;\r\n        }else {\r\n            options.endYear =  options.beginYear + 10 ;\r\n        }\r\n\r\n        //生成\r\n        self._createYear();\r\n        self._createMonth();\r\n        self._createDay();\r\n        self._createHours();\r\n        self._createMinutes();\r\n    };\r\n\r\n    // 更新选择框,更新当前值\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.options.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    // 判断最大最小值合理性\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.options.endDate = date;\r\n        this._create();\r\n    };\r\n\r\n    DtPicker.prototype.dispose = function () {\r\n        var self = this;\r\n        self.hide();\r\n        setTimeout(function () {\r\n            self.ui.picker.parentNode.removeChild(self.ui.picker);\r\n            for (var name in self) {\r\n                self[name] = null;\r\n                delete self[name];\r\n            }\r\n            self.disposed = true;\r\n        }, 300);\r\n    };\r\n\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    DtPicker.prototype.clickCall = function(index){\r\n        var self = this;\r\n        var sltDate = self.getSelected();\r\n        var rs = self.options.callBack.call(this , sltDate, index);\r\n        if (rs !== false) {\r\n            if(index == 1){ // 假定确认按钮在第二个位置,传回true则存储当前值\r\n                self.value = sltDate.value;\r\n            }else if(index == 2){\r\n                self.value = null;\r\n            }\r\n            self.hide();\r\n        }\r\n    };\r\n\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    DtPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.clickCall(0);\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.dtPicker = function(options){\r\n        return new DtPicker(options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n// 支持非循环\r\n// size命名用的有点混淆。。\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n\r\n(function (ipu, $, Hammer) {\r\n    function HammerCarousel(navSlt, options) {\r\n        this.options = options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(navSlt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    // 直接替换掉了prototype对象,可能不是个好选择\r\n    HammerCarousel.prototype = {\r\n        defaultOptions: {\r\n            index: null,        // 默认显示第几个项,其实挺没用的,默认显示第一个,用户再调用一下显示第几个,作用一样现在。\r\n            autoPlay: false,    // 是否自动轮播\r\n            duration: 3000,     // 轮播间隔\r\n            indicator: false,  //是否生成指示器,即小点点\r\n            callBack: null,  // 轮播后回调函数\r\n            clickBack: null   // 各子项用户点击事件\r\n            //indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\r\n\r\n\r\n            this.showSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n            this.carouselItemSizes = [];\r\n            this.currentIndex = 0;\r\n            this.moveLen = 0;\r\n            this.lastItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来判断是复制项\r\n\r\n            // 这里假设每个元素都是相等的\r\n            this.carouselItems.slice(0, this.showSize).clone().appendTo(this.wrapper); // 如果做无限循环则要这样处理\r\n            this.size = this.carouselItems.size();\r\n\r\n            var self = this;\r\n            if(this.options.clickBack){\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        self.options.clickBack.call(this, i%self.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this.sizeCount();\r\n            var that = this;\r\n\r\n            this.hammer = new Hammer.Manager(this.el); // 避免因为li里面的内容高度不够,而不能触发相关事件\r\n            this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_HORIZONTAL, threshold: 10}));\r\n            this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this.onPan, this));\r\n\r\n            $(window).resize(function () { // 在尺寸变化时,处理,是否可以考虑只在宽度变化时处理,横屏事件?\r\n                that.refresh();\r\n            });\r\n\r\n            if (this.options.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ui-current\").index();\r\n                this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.options.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.options.index);\r\n        },\r\n        stop: function () {\r\n            this._pause();\r\n            this.options.autoPlay = false;\r\n        },\r\n        _pause: function () {\r\n            if (this.timeoutId) {\r\n                clearTimeout(this.timeoutId);\r\n                this.timeoutId = null;\r\n            }\r\n        },\r\n        prev: function () {\r\n            var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n            if (index == this.size - 1) {\r\n                this._show(this.size, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        next: function () {//下一张\r\n            var index = this.currentIndex == this.size ? 1 : this.currentIndex + 1;\r\n            if (index == 1) {\r\n                this._show(0, false);\r\n                this.wrapper.width();\r\n            }\r\n            this._show(index, true);\r\n        },\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % size;\r\n            if(index < 0 ){\r\n                index = size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        play: function () {\r\n            this.options.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.options.autoPlay && !this.timeoutId) {\r\n                var that = this;\r\n                this.timeoutId = setTimeout(function () {\r\n                    that.timeoutId = null;//清空这个timeoutId,代表该次处理已经执行了\r\n                    that.next();\r\n                }, that.options.duration);\r\n            }\r\n        },\r\n        _end: function () {//移动结束时调用\r\n            var currentIndex = this.currentIndex;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n\r\n            this._play();//处理自动播放\r\n        },\r\n        _addIndicator: function () {\r\n            var html = \"\";\r\n            for (var i = 0; i < this.size; i++) {\r\n                html += \"<li></li>\";\r\n            }\r\n            html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n            this.indicator = $(html).appendTo(this.el);\r\n            this.indicatorIndexs = $(\"li\", this.indicator);\r\n        },\r\n        sizeCount: function () {\r\n            this.wrapperSize = this.wrapper.outerWidth(true);\r\n            this.itemSize = this.carouselItems.eq(0).outerWidth(true);\r\n            this.mostSize = this.size * this.itemSize; // 宽度*数量\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\").width();\r\n\r\n            var that = this;\r\n            $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n                that.carouselItemSizes[index] = $(this).position().left;\r\n            });\r\n        },\r\n        refresh: function () {\r\n            if (this.wrapperSize != this.wrapper.outerWidth(true)) {\r\n                this.sizeCount();\r\n                this._show(this.currentIndex, true); //新的位置\r\n            }\r\n        },\r\n        move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ui-carousel-animate\");\r\n            var move = (this.moveLen - moveLen) % this.mostSize;\r\n            move = (move + this.mostSize) % this.mostSize;\r\n            this.displayMoveLen = move;\r\n\r\n            move = -move + \"px\";\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        },\r\n        _show: function (index, animate) { // 知道最终移动到的项时,调用\r\n            if (animate !== false) { // 默认值为true\r\n                animate = true;\r\n            }\r\n\r\n            this._pause();\r\n            $(this.wrapper).toggleClass(\"ui-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            //this.currentIndex = index;\r\n            this.lastItem = index == this.size;\r\n            var move = this.carouselItemSizes[index];\r\n            this.moveLen = move;\r\n            move = -move + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n            if (animate) {\r\n                this._end();\r\n            }\r\n        },\r\n        onPan: function (ev) {\r\n            var delta = ev.deltaX;\r\n            // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n            if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n                var value = delta / this.itemSize;\r\n                var intValue = parseInt(Math.abs(value));               // 取整数\r\n                var decimal = Math.abs(value) % 1;                   // 取小数\r\n\r\n                if (decimal > 0.2) { // 滑动超过页面宽20%;\r\n                    intValue = intValue + 1;\r\n                }\r\n                if (value > 0) {\r\n                    intValue = -intValue;\r\n                }\r\n\r\n                var index = (this.currentIndex + intValue) % this.size;\r\n                index = (index + this.size) % this.size; // 因为可能是个负值,转换成正值\r\n\r\n                // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n                if (index == 0 && this.displayMoveLen > this.itemSize) {\r\n                    index = this.size;\r\n                }\r\n                this._show(index);\r\n            } else if (ev.type == 'panmove'){\r\n                this.move(delta);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.hammerCarousel = function (slt, options) {\r\n        return new HammerCarousel(slt, options);\r\n    };\r\n})(ipu || window, jQuery,  Hammer);\r\n\n(function (ipu, $) {\r\n    //$ extends\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        // console.log('__dealCssEvent');\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            /*jshint validthis:true */\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.transitionEnd = function (callback) {\r\n        // console.log('transitionEnd');\r\n        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalStack: true,\r\n        modalButtonOk: '确定',\r\n        modalButtonCancel: '取消',\r\n        modalPreloaderTitle: '加载中',\r\n        modalContainer: document.body ? document.body : 'body'\r\n    };\r\n\r\n    ipu.modalStack = [];\r\n\r\n    ipu.modalStackClearQueue = function () {\r\n        if (ipu.modalStack.length) {\r\n            (ipu.modalStack.shift())();\r\n        }\r\n    };\r\n    ipu.modal = function (params) {\r\n        params = params || {};\r\n        var modalHTML = '';\r\n        var buttonsHTML = '';\r\n        if (params.buttons && params.buttons.length > 0) {\r\n            for (var i = 0; i < params.buttons.length; i++) {\r\n                buttonsHTML += '<span class=\"ui-modal-button' + (params.buttons[i].bold ? ' ui-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\r\n            }\r\n        }\r\n        var extraClass = params.extraClass || '';\r\n        var titleHTML = params.title ? '<div class=\"ui-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ui-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ui-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ui-modal-buttons-vertical' : '';\r\n        modalHTML = '<div class=\"ui-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ui-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ui-modal-buttons ' + verticalButtons + '\">' + buttonsHTML + '</div></div>';\r\n\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n\r\n        var modal = $(_modalTemplateTempDiv).children();\r\n\r\n        $(defaults.modalContainer).append(modal[0]);\r\n\r\n        // Add events on buttons\r\n        modal.find('.ui-modal-button').each(function (index, el) {\r\n            $(el).on('click', function (e) {\r\n                if (params.buttons[index].close !== false) ipu.closeModal(modal);\r\n                if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\r\n                if (params.onClick) params.onClick(modal, index);\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n    ipu.alert = function (text, title, callbackOk) {\r\n        if (typeof title === 'function') {\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\r\n        });\r\n    };\r\n    ipu.confirm = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            buttons: [\r\n                {text: defaults.modalButtonCancel, omodalButtonCancelnClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n    ipu.prompt = function (text, title, callbackOk, callbackCancel) {\r\n        if (typeof title === 'function') {\r\n            callbackCancel = arguments[2];\r\n            callbackOk = arguments[1];\r\n            title = undefined;\r\n        }\r\n        return ipu.modal({\r\n            text: text || '',\r\n            title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n            afterText: '<input type=\"text\" class=\"ui-modal-text-input\">',\r\n            buttons: [\r\n                {\r\n                    text: defaults.modalButtonCancel\r\n                },\r\n                {\r\n                    text: defaults.modalButtonOk,\r\n                    bold: true\r\n                }\r\n            ],\r\n            onClick: function (modal, index) {\r\n                if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ui-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ui-modal-text-input').val());\r\n            }\r\n        });\r\n    };\r\n\r\n    var minLoad = false;        // 是否最小时间调用方式\r\n    var loadOverTime = false;   // 是否超过最小调用时间\r\n    var loadEnd = false;        // 是否调用结束\r\n    var loadTimeOut = null;     // 延时调用ID\r\n\r\n    ipu.showPreloader = function (title, minTime) {\r\n        ipu.hidePreloader(true);\r\n\r\n        ipu.showPreloader.preloaderModal = ipu.modal({\r\n            title: title || defaults.modalPreloaderTitle,\r\n            text: '<div class=\"ui-preloader\"></div>'\r\n        });\r\n\r\n        if(minTime){\r\n            minLoad = true;\r\n            loadTimeOut = setTimeout(function () {\r\n                loadOverTime = true;\r\n                if(loadEnd){\r\n                    ipu.hidePreloader();\r\n                }\r\n            }, minTime);\r\n        }\r\n\r\n        return ipu.showPreloader.preloaderModal;\r\n    };\r\n    ipu.hidePreloader = function (force) {\r\n        if(force || !minLoad || (minLoad && loadOverTime)){\r\n            if(force && loadTimeOut){\r\n                window.clearTimeout(loadTimeOut);\r\n            }\r\n            ipu.showPreloader.preloaderModal && ipu.closeModal(ipu.showPreloader.preloaderModal);\r\n            minLoad = false; // 重置各标志位\r\n            loadOverTime = false;\r\n            loadEnd = false;\r\n            loadTimeOut = null;\r\n        }else{\r\n            loadEnd = true;\r\n        }\r\n    };\r\n    ipu.showIndicator = function () {\r\n        if ($('.ui-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ui-preloader-indicator-overlay\"></div><div class=\"ui-preloader-indicator-modal\"><span class=\"ui-preloader ui-preloader-white\"></span></div>');\r\n    };\r\n    ipu.hideIndicator = function () {\r\n        $('.ui-preloader-indicator-overlay, .ui-preloader-indicator-modal').remove();\r\n    };\r\n    // Action Sheet\r\n    ipu.actions = function (params) {\r\n        var modal, groupSelector, buttonSelector;\r\n        params = params || [];\r\n\r\n        if (params.length > 0 && !$.isArray(params[0])) {\r\n            params = [params];\r\n        }\r\n        var modalHTML;\r\n        var buttonsHTML = '';\r\n        for (var i = 0; i < params.length; i++) {\r\n            for (var j = 0; j < params[i].length; j++) {\r\n                if (j === 0) buttonsHTML += '<div class=\"ui-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ui-actions-modal-label' : 'ui-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ui-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ui-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ui-bg-' + button.bg;\r\n                if (button.disabled) buttonClass += ' disabled';\r\n                buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\r\n                if (j === params[i].length - 1) buttonsHTML += '</div>';\r\n            }\r\n        }\r\n        modalHTML = '<div class=\"ui-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ui-actions-modal-group';\r\n        buttonSelector = '.ui-actions-modal-button';\r\n\r\n        var groups = modal.find(groupSelector);\r\n        groups.each(function (index, el) {\r\n            var groupIndex = index;\r\n            $(el).children().each(function (index, el) {\r\n                var buttonIndex = index;\r\n                var buttonParams = params[groupIndex][buttonIndex];\r\n                var clickTarget;\r\n                if ($(el).is(buttonSelector)) clickTarget = $(el);\r\n                // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\r\n\r\n                if (clickTarget) {\r\n                    clickTarget.on('click', function (e) {\r\n                        if (buttonParams.close !== false) ipu.closeModal(modal);\r\n                        if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n                    });\r\n                }\r\n            });\r\n        });\r\n        ipu.openModal(modal);\r\n        return modal[0];\r\n    };\r\n\r\n    //显示一个消息,会在2秒钟后自动消失\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ui-modal ui-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n        ipu.openModal($toast, function () {\r\n            setTimeout(function () {\r\n                ipu.closeModal($toast);\r\n            }, duration || 2000);\r\n        });\r\n    };\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isNotToast = !modal.hasClass('ui-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n        if ($('.ui-modal.ui-modal-in:not(.ui-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\r\n            ipu.modalStack.push(function () {\r\n                ipu.openModal(modal, cb);\r\n            });\r\n            return;\r\n        }\r\n        var isPopup = modal.hasClass('ui-popup');\r\n        var isLoginScreen = modal.hasClass('ui-login-screen');\r\n        var isPickerModal = modal.hasClass('ui-picker-modal');\r\n        var isToast = modal.hasClass('ui-toast');\r\n        if (isModal) {\r\n            modal.show();\r\n            modal.css({\r\n                marginTop: -Math.round(modal.outerHeight() / 2) + 'px'\r\n            });\r\n        }\r\n        if (isToast) {\r\n            modal.css({\r\n                marginLeft: -Math.round(modal.outerWidth() / 2 ) + 'px' //1.185 是初始化时候的放大效果\r\n            });\r\n        }\r\n\r\n        var overlay;\r\n        if (!isLoginScreen && !isPickerModal && !isToast) {\r\n            if ($('.ui-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ui-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ui-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        }\r\n\r\n        //Make sure that styles are applied, trigger relayout;\r\n        var clientLeft = modal[0].clientLeft;\r\n\r\n        // Trugger open event\r\n        modal.trigger('open');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).addClass('ui-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('ui-modal-overlay-visible');\r\n        modal.removeClass('ui-modal-out').addClass('ui-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n        });\r\n        // excute callback\r\n        if (typeof cb === 'function') {\r\n            cb.call(this);\r\n        }\r\n        return true;\r\n    };\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ui-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ui-modal'),\r\n            isPopup = modal.hasClass('ui-popup'),\r\n            isToast = modal.hasClass('ui-toast'),\r\n            isLoginScreen = modal.hasClass('ui-login-screen'),\r\n            isPickerModal = modal.hasClass('ui-picker-modal'),\r\n            removeOnClose = modal.hasClass('ui-remove-on-close'),\r\n            overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ui-popup.ui-modal-in').length) {\r\n                overlay.removeClass('ui-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ui-modal-overlay-visible');\r\n        }\r\n        modal.trigger('close');\r\n\r\n        // Picker modal body class\r\n        if (isPickerModal) {\r\n            $(defaults.modalContainer).removeClass('ui-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ui-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ui-modal-in').addClass('ui-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ui-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ui-modal-out').hide();\r\n                if (removeOnClose && modal.length > 0) {\r\n                    modal.remove();\r\n                }\r\n            }\r\n            else {\r\n                modal.remove();\r\n            }\r\n        });\r\n        if (isModal && defaults.modalStack) {\r\n            ipu.modalStackClearQueue();\r\n        }\r\n\r\n        return true;\r\n    };\r\n    function handleClicks(e) {\r\n        /*jshint validthis:true */\r\n        var clicked = $(this);\r\n        var url = clicked.attr('href');\r\n\r\n\r\n        //Collect Clicked data- attributes\r\n       /* var clickedData = clicked.dataset();\r\n\r\n        // Popup\r\n        var popup;\r\n        if (clicked.hasClass('ui-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ui-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ui-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ui-modal-overlay')) {\r\n            if ($('.ui-modal.ui-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ui-modal.ui-modal-in');\r\n            if ($('.ui-actions-modal.ui-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ui-actions-modal.ui-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ui-popup-overlay')) {\r\n            if ($('.ui-popup.ui-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ui-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ui-modal-overlay, .ui-popup-overlay, .ui-close-popup, .ui-open-popup, .ui-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n    NavBar.prototype.defaultOpt = {\r\n        animate: false,           // 默认有动画\r\n        contentSlt: \".ui-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) { // currentIndex: 当前索引,lastIndex上一次索引(第一次时为null)\r\n        }\r\n    };\r\n\r\n    function NavBar(slt, options) {\r\n        this.options = $.extend({}, this.defaultOpt, options);\r\n        this.content = $(this.options.contentSlt);\r\n        this.nav = $(slt);\r\n        this.wrapper = $(\">ul\", this.content);\r\n        this.contents = $(\">li\", this.wrapper);\r\n        this.navs = $(\">a\", this.nav);\r\n        var me = this;\r\n\r\n        var activeIndex = this.navs.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ui-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.options.animate) {\r\n            this.wrapper.addClass(\"ui-no-animation\")\r\n        }\r\n\r\n        this.navs.each(function (index, i) {\r\n            $(this).click(function () {\r\n                me.show(index);\r\n            });\r\n        });\r\n\r\n        this.lastIndex = null;\r\n        this.currentIndex = null;\r\n        me.show(this.options.index);\r\n    }\r\n\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            var currentContent = $(this.contents[index]).addClass(\"ui-show\");\r\n\r\n            if (this.options.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ui-show\"); // 隐藏上上个元素\r\n                }\r\n\r\n                if (this.currentIndex != null) {        // 非第一次需要动画效果\r\n                    if (this.currentIndex < index) {   // 需要内容为往左走,显示右边的内容\r\n                        if (this.lastIndex != null && this.lastIndex < this.currentIndex) {  // 内容已经左走过了,则需要移除动画复原位置,再通过width()方法强制生效\r\n                            this.wrapper.addClass(\"ui-no-animation\").removeClass(\"ui-nav-content-right\").width(); // 可以强制刷新,默认jquery应该会将这些dom上的修改延时处理?\r\n                        }\r\n                    } else {\r\n                        if (this.lastIndex == null || this.lastIndex > this.currentIndex) { // 类似同上\r\n                            this.wrapper.addClass(\"ui-no-animation\").addClass(\"ui-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ui-no-animation\").toggleClass(\"ui-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ui-show\");\r\n            }\r\n\r\n            // 更新class,ui-current状态\r\n            $(this.contents[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n            $(this.navs[index]).addClass(\"ui-current\").siblings(\".ui-current\").removeClass(\"ui-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.options.callBack) {\r\n                this.options.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    ipu.navBar = function (slt, options) {\r\n        return new NavBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n    function __dealCssEvent(eventNameArr, callback) {\r\n        var events = eventNameArr,\r\n            i, dom = this;// jshint ignore:line\r\n\r\n        function fireCallBack(e) {\r\n            if (e.target !== this) return;\r\n            callback.call(this, e);\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.off(events[i], fireCallBack);\r\n            }\r\n        }\r\n\r\n        if (callback) {\r\n            for (i = 0; i < events.length; i++) {\r\n                dom.on(events[i], fireCallBack);\r\n            }\r\n        }\r\n    }\r\n\r\n    $.fn.animationEnd = function (callback) {\r\n        __dealCssEvent.call(this, ['webkitAnimationEnd', 'animationend'], callback);\r\n        return this;\r\n    };\r\n\r\n    function submitForm(doc, url ,params){\r\n        var form = doc.createElement(\"form\");\r\n        form.action = url;\r\n        form.method = \"post\";\r\n        form.style.display = \"none\";\r\n\r\n        for (var x in params) {\r\n            var ele = doc.createElement(\"input\");\r\n            ele.type=\"hidden\";\r\n            ele.name = x;\r\n            ele.value =  params[x];\r\n            form.appendChild(ele);\r\n        }\r\n\r\n        doc.body.appendChild(form);\r\n        form.submit();\r\n    }\r\n\r\n    // 检查是否有ui-pages的结构\r\n    function checkPages() {\r\n        if(!hasPages){\r\n            pagesObj = $(\".ui-pages\"); // pagesObj为空则进行jquery取值\r\n            if(pagesObj.size() == 0){\r\n                pagesObj =  $(\"<div class='ui-pages'><div class='ui-page ui-show \"+zeroPageClass+\"' id='\"+pageIdPrefix+\"0'></div>\").appendTo(\"body\");\r\n            }\r\n            hasPages = true;\r\n        }\r\n    }\r\n\r\n    // 站位页面\r\n    function isZeroPage(page) {\r\n        return $(page).hasClass(zeroPageClass);\r\n    }\r\n\r\n    var page = {};\r\n    var hasPages = false;\r\n    var maps = {};\r\n    var pageNo = 1; // 编号0留给主页面或当前页面,或没有\r\n    var pageIdPrefix = \"ipuPage-\";\r\n    var pagesObj = null;\r\n    var animateInClass = \"ui-anim ui-slideRightIn\";\r\n    var animateOutClass  = \"ui-anim ui-slideRightOut\";\r\n    var eventName = \"ipuUIPageBack\";\r\n    var zeroPageClass = 'ui-page-zero';   // 占位页面,对于为当前页面\r\n    var zeroPagesClass = 'ui-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\r\n\r\n\r\n\r\n    page.options = {     // 那个窗口执行open,默认父窗口\r\n        target: window.parent, // 默认执行父窗口,方法:all\r\n        backIndex: -1,    // 默认回退一页         方法:back\r\n        closeIndex: -1,   // 默认关闭最近一个页面 方法:close\r\n        params:{},        // post的传参            方法:post\r\n        animate: true,     // 是否动画效果        方法:open post\r\n        showLoading: true,   // 是否显示加载消息  方法:open post\r\n        loadingMessage: '正在加载中',  //          方法:open post\r\n        method : null,     // 请求方式,内置参数,方法自己设置,用户不需要设置  方法:无\r\n        minMessageTime: 500, // 最小显示加载时间,避免出现闪现的情况 方法:open post\r\n        data: null,         // 回退时,回传参数, 方法:back\r\n        pageName: '',     // 给打开的页面命名,以便根据此页面名称来切换页面 方法:open post back close\r\n        callBack:function () { // 事件回调       方法:open post close back\r\n        }\r\n    };\r\n\r\n    // 当前页面加载,针对顶层父窗口\r\n    page.openPage = function (url, options) {\r\n        var newPage = null;\r\n        var nowPageNo = pageIdPrefix + (pageNo++);\r\n        maps[nowPageNo] = url;\r\n\r\n        checkPages();\r\n\r\n        if(options.showLoading){\r\n            ipu.showPreloader(options.loadingMessage, options.minMessageTime);\r\n        }\r\n\r\n        if(options.method == 'post'){\r\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe'></iframe></div>\");\r\n        }else{\r\n            newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"' data-name='\"+options.pageName+\"'><iframe class='ui-page-iframe' src='\"+url+\"'></iframe></div>\");\r\n        }\r\n\r\n        var zeroPage = isZeroPage($(\".ui-page:last\", pagesObj));\r\n        var animatePage = newPage;\r\n        if(zeroPage){\r\n            animatePage = pagesObj.addClass(zeroPagesClass);\r\n        }\r\n\r\n        function end() {\r\n            if(options.showLoading) {\r\n                ipu.hidePreloader();\r\n            }\r\n\r\n            if(options.animate) {\r\n                animatePage.removeClass(animateInClass);\r\n            }\r\n\r\n            newPage.siblings(\".ui-show\").removeClass('ui-show');\r\n            if(options.callBack){\r\n                options.callBack();\r\n            }\r\n        }\r\n\r\n        $(\".ui-page-iframe\", newPage).one('load', function () {\r\n            newPage.addClass(\"ui-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\r\n\r\n            if(zeroPage){\r\n                animatePage.removeClass(zeroPagesClass);\r\n            }\r\n            if(options.animate){\r\n                animatePage.addClass(animateInClass).animationEnd(end);\r\n            }else{\r\n                end();\r\n            }\r\n        });\r\n\r\n        newPage.appendTo(pagesObj);\r\n        if(options.method == 'post') {\r\n            var pageDoc = $(\".ui-page-iframe\", newPage)[0].contentDocument;\r\n            submitForm(pageDoc, url, options.params);\r\n        }\r\n    };\r\n\r\n    // post方式加载页面\r\n    page.postPage = function (url, options) {\r\n        options.method = 'post';\r\n        page.openPage(url, options);\r\n    };\r\n\r\n    // 当前页面后退,针对顶层父窗口\r\n    page.backPage = function (options) {\r\n        var backIndex = options.backIndex;\r\n        var page = null;\r\n        var nowPage = $(\".ui-page.ui-show\", pagesObj);\r\n\r\n        if(options.pageName){\r\n            page =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj);\r\n        }else if(backIndex == 0){\r\n            page = $(\".ui-page:first\", pagesObj);\r\n        }else { // 越界的情况\r\n            var prevPage = nowPage.prevAll(\".ui-page\");\r\n            if(backIndex < 0){\r\n                page= $(prevPage[-backIndex - 1]);\r\n            }else{\r\n                page= $(prevPage[prevPage.size() - backIndex]);\r\n            }\r\n        }\r\n\r\n        var animatePage = nowPage;\r\n        var zeroPage = isZeroPage(page);\r\n\r\n        // 主页面模式时\r\n        if(zeroPage){\r\n            animatePage = pagesObj;\r\n        }else{\r\n            page.addClass(\"ui-show\"); //显示前一个\r\n        }\r\n\r\n        function end (){\r\n            $(this).removeClass(animateOutClass);\r\n            page.nextAll(\".ui-page\").remove();\r\n\r\n            var iframe = $(\".ui-page-iframe\", page);\r\n            var nowDoc;\r\n\r\n            if(iframe.size() == 0){ // 找不到子窗口就当是返回了主页面,在当前窗口触发\r\n                nowDoc = window.document;\r\n            }else{\r\n                nowDoc = iframe[0].contentDocument;\r\n            }\r\n\r\n            if(zeroPage){\r\n                pagesObj.addClass(zeroPagesClass);\r\n            }\r\n\r\n            var evt = nowDoc.createEvent('Event');\r\n            evt.initEvent(eventName, true, true);\r\n            if(options.data){\r\n                evt.data = options.data;\r\n            }\r\n            nowDoc.body.dispatchEvent(evt);\r\n            if(options.callBack){\r\n                options.callBack();\r\n            }\r\n        }\r\n\r\n        if(options.animate){\r\n            animatePage.addClass(animateOutClass).animationEnd(end);\r\n        }else{\r\n            end();\r\n        }\r\n    };\r\n\r\n    // 往前关闭窗口\r\n    page.closePage = function (options) {\r\n        var closeIndex = options.closeIndex;\r\n        var prevPage = $(\".ui-page.ui-show\", pagesObj).prevAll(\".ui-page\");\r\n\r\n        if(options.pageName){\r\n            closeIndex =  $(\".ui-page[data-name='\"+options.pageName+\"']:first\", pagesObj).index();\r\n        }else if(closeIndex < 0){\r\n            closeIndex = -closeIndex -1;\r\n        }else{\r\n            closeIndex = prevPage.size() - closeIndex;\r\n        }\r\n\r\n        $(prevPage[closeIndex]).remove();\r\n        if(options.callBack){\r\n            options.callBack();\r\n        }\r\n    };\r\n\r\n    // 调用父窗口打开页面\r\n    page.open = function (url, options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.openPage(url, options);\r\n    };\r\n\r\n    // post方法\r\n    page.post = function (url, options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.method = 'post';\r\n        options.target.ipu.page.openPage(url, options);\r\n    };\r\n\r\n    // 调用父窗口,回退\r\n    page.back = function (options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.backPage(options);\r\n    };\r\n\r\n    // 返回首页\r\n    page.backHome = function (options) {\r\n        options = options || {};\r\n        options.backIndex = 0;\r\n        page.back(options);\r\n    };\r\n\r\n    // 子窗口,待确认\r\n    page.close = function (options) {\r\n        options = $.extend({}, this.options, options);\r\n        options.target.ipu.page.closePage(options);\r\n    };\r\n\r\n    // 添加回调事件\r\n    page.onBack = function (back) {\r\n        $(\"body\").on(eventName, function (e) {\r\n            var data = e.originalEvent.data;\r\n            back(data);\r\n        });\r\n    };\r\n\r\n    // 提供一个关闭一群窗口的方法\r\n    ipu.page = page;\r\n})(ipu || window, jQuery);\r\n\n// picker\r\n(function (ipu, $, Hammer) {\r\n    var showItemSize = 9;   // 显示的子项数量,\r\n    var r = 90;             // 计算旋转的圆半径,结果应该缩小,是为了r不要距离容器太近\r\n    var itemAngle = 180 / showItemSize;   // 每项对应的角度是 180/9 = 20\r\n    var maxExceed = itemAngle;         // 滚动时允许超出边界的最大角度\r\n    // itemHeight = 40px;       // 需要给出r=89是怎么计算出来的,是根据 40/2/Math.tan(40/2/180*Math.PI)=113,直接太大不好看\r\n\r\n    function Picker(slt, options) {\r\n        this.el = $(slt)[0];\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this._init();\r\n    }\r\n\r\n    // 默认参数\r\n    Picker.prototype.defaultOptions = {\r\n        onChange: function () {       // 子项选中事件\r\n        },\r\n        listen: true,                  // 默认已开记监听变化\r\n        data: []\r\n    };\r\n\r\n    Picker.prototype._init = function () {\r\n        var self = this;\r\n        this.wrap = $(\">ul\", this.el);\r\n        this.index = null;\r\n        this.listen = !!this.options.listen;\r\n\r\n        this.beginAngle = 0;\r\n        this.beginExceed = this.beginAngle - maxExceed;       // 最小角度值\r\n        this.stopInertiaMove = false;\r\n        this.lastAngle = null; // 保存滑动前的角度\r\n        this.empty = this.options.data.length == 0;\r\n\r\n        // 如果是ios,则ul的旋转中心点,有变化\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+r+\"px\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n        this.hammer = new Hammer.Manager(this.el);\r\n        this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_VERTICAL, threshold: 5}));\r\n        this.hammer.add(new Hammer.Press({threshold: 4}));  //\r\n        this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this._onPan, this));\r\n\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\r\n           // console.log('press');\r\n            if(this.empty){\r\n                return ;\r\n            }\r\n\r\n            self.stopInertiaMove = true;\r\n            if (e.type == 'pressup') {\r\n                self.endScroll();\r\n            }\r\n        });\r\n\r\n        this.setItems(this.options.data);\r\n    };\r\n\r\n    Picker.prototype.setItems = function (data, textName) {\r\n        this.wrap.empty(); // 清空历史数据\r\n        this.data = data = data || [];\r\n        this.empty = data.length == 0; // 数据是否为空\r\n\r\n        this.newData = true; // 表示设置了新数据,触发change回调,但第一次设置时,不需要触发\r\n        var self = this;\r\n        var lis = \"\";\r\n        textName = textName || 'text';\r\n\r\n        for (var i = 0, j = data.length; i < j; i++) {\r\n            lis = lis + \"<li>\" + data[i][textName] + \"</li>\";\r\n        }\r\n\r\n        $(lis).appendTo(this.wrap);\r\n\r\n        this.items = $(\">li\", this.wrap);\r\n        this.itemsSize = this.items.size();\r\n\r\n        this.endAngle = (this.empty ? 0 : this.itemsSize - 1) * itemAngle;\r\n        this.endExceed = this.endAngle + maxExceed;  // 最大旋转角度值\r\n\r\n        // 初始化各子项角度\r\n        this.items.each(function (i) {\r\n            $(this).css({\r\n                \"transform\": \"translateZ(\" + r + \"px) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + r + \"px\"\r\n            });\r\n            $(this).click(function () {\r\n                self.stopInertiaMove = true;\r\n                self.setAngle(i * itemAngle, true);\r\n            })\r\n        });\r\n\r\n        var newAngle ;\r\n        if(this.empty || this.index == null){\r\n            newAngle = 0;\r\n        }else {\r\n            if(this.index > this.itemsSize - 1){\r\n                newAngle = (this.itemsSize - 1) * itemAngle;\r\n            }else{\r\n                newAngle = this.index * itemAngle;\r\n            }\r\n        }\r\n        this.setAngle(newAngle, true);\r\n\r\n        /*if (this.index !== null) { // 当前已经旋转则,保留当前的索引\r\n         if (this.index > this.itemsSize - 1 && !this.empty) {\r\n         this.index = this.itemsSize - 1;\r\n         }\r\n         this.setAngle(this.index * itemAngle, true);\r\n         } else { // 第一次初始数据,不触发change事件\r\n         this.index = 0;     // 被调用后,不能再使用null值了\r\n         this.setAngle(0, false); // 第一次设置初始化时,不触发change事件\r\n         }*/\r\n    };\r\n\r\n    Picker.prototype._onPan = function (ev) {\r\n        if(this.empty){\r\n            return ;\r\n        }\r\n\r\n        //console.log(ev.deltaX + \"==\"+ ev.deltaY);\r\n        if (ev.type == 'panstart') { // 好像一定要移动才有startg事件\r\n            self.stopInertiaMove = true;\r\n            this.lastAngle = this.angle;\r\n            this.wrap.addClass(\"ui-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\r\n           // console.log('panstart');\r\n\r\n        } else if (ev.type == 'panmove') {\r\n            var moveAngle = this.calcAngle(ev.deltaY);\r\n            var newAngle = this.lastAngle - moveAngle;   //最新的角度\r\n            //console.log('=='+newAngle);\r\n            // 一个可以转动的最小值和最大值过滤\r\n            if (newAngle < this.beginExceed) {\r\n                newAngle = this.beginExceed;\r\n            }\r\n            if (newAngle > this.endExceed) {\r\n                newAngle = this.endExceed;\r\n            }\r\n            this.setAngle(newAngle);\r\n\r\n        } else { // end or cancel事件\r\n            // console.log('end or cancel:' + ev.type);\r\n            var v = ev.overallVelocityY;    // 滑动的速度\r\n            var dir = v > 0 ? -1 : 1; //加速度方向\r\n            var deceleration = dir * 0.0006 * -1;\r\n            var duration = Math.abs(v / deceleration); // 速度消减至0所需时间\r\n            var dist = v * duration / 2; //最终移动多少\r\n\r\n            var startAngle = this.angle;\r\n            var distAngle = -this.calcAngle(dist);\r\n           //  console.log(\"dist=\" + dist + \", distAngle\" + distAngle);\r\n\r\n            //----\r\n            var srcDistAngle = distAngle;\r\n            if (startAngle + distAngle < this.beginExceed) {\r\n                distAngle = this.beginExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n            if (startAngle + distAngle > this.endExceed) {\r\n                distAngle = this.endExceed - startAngle;\r\n                duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n            }\r\n\r\n            if (distAngle == 0) {\r\n                this.endScroll();\r\n                return;\r\n            }\r\n            this.scrollDistAngle(startAngle, distAngle, duration);\r\n        }\r\n    };\r\n\r\n    // 计算移动的角度,转动的角度,就是移动的距离对应相关圆周\r\n    // 2*r*PI = 360,  angle = 360*c/(2*r*PI)\r\n    var ca = 360 / (2 * r * Math.PI);\r\n    Picker.prototype.calcAngle = function (c) {\r\n        return c * ca;\r\n    };\r\n\r\n    // endScroll 是否为结束的滚动结束,滚动结束需要调用结束事件\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(1000px) rotateY(0deg) rotateX(\" + newAngle + \"deg)\");\r\n        this.calcItemVisable(newAngle);\r\n\r\n        if (endScroll) {\r\n            var index = newAngle / itemAngle;\r\n            var oldIndex = this.index;\r\n            this.index = this.empty ? null : index; // 这里可以做一个判断,如果是empty,则index值可以不改变\r\n\r\n            // 这个地方要判断下,数据更新或索引更新都要触发\r\n            if (oldIndex != index || this.newData) {\r\n                this.newData = false;\r\n               // console.log('change');\r\n                if (this.options.onChange && this.listen) {\r\n                    // console.log('changed call');\r\n                    this.options.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n            }\r\n        }\r\n    };\r\n\r\n    // 计算子项的显示情况\r\n    Picker.prototype.calcItemVisable = function (angle) {\r\n        this.items.each(function (index) {\r\n            var difference = Math.abs(index * itemAngle - angle);\r\n\r\n            if (difference < itemAngle / 2) {\r\n                $(this).addClass(\"ui-highlight ui-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ui-highlight ui-visible\");\r\n            } else {\r\n                $(this).addClass(\"ui-visible\").removeClass(\"ui-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ui-noanimate\");\r\n        var endAngle;\r\n\r\n        if (this.angle < this.beginAngle) {\r\n            endAngle = this.beginAngle;\r\n        } else if (this.angle > this.endAngle) {\r\n            endAngle = this.endAngle;\r\n        } else {\r\n            var index = parseInt((this.angle / itemAngle).toFixed(0));\r\n            endAngle = (itemAngle * index);\r\n        }\r\n\r\n        this.setAngle(endAngle, true);\r\n    };\r\n\r\n    // 进行惯性滚动\r\n    Picker.prototype.scrollDistAngle = function (startAngle, distAngle, duration) {\r\n        var self = this;\r\n        var nowTime = new Date().getTime();\r\n        this.stopInertiaMove = false;\r\n        duration = 1 * duration; // 滚动时长控制修改\r\n\r\n        // hammer调用的惯性函数\r\n        (function (nowTime, startAngle, distAngle, duration) {\r\n            var frameInterval = 13;\r\n            var stepCount = duration / frameInterval;\r\n            var stepIndex = 0;\r\n\r\n            (function inertiaMove() {\r\n                if (self.stopInertiaMove) return;\r\n                var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);\r\n                self.setAngle(newAngle);\r\n                stepIndex++;\r\n\r\n                if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {\r\n                    self.endScroll();\r\n                    return;\r\n                }\r\n\r\n                setTimeout(inertiaMove, frameInterval);\r\n            })();\r\n\r\n        })(nowTime, startAngle, distAngle, duration);\r\n    };\r\n\r\n    Picker.prototype.setListen = function (bool) {\r\n        this.listen = !!bool;\r\n    };\r\n\r\n    Picker.prototype.quartEaseOut = function (t, b, c, d) {\r\n        return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n    };\r\n\r\n    Picker.prototype.setSelectedValue = function (value) {\r\n        var self = this;\r\n        for (var index in self.data) {\r\n            var item = self.data[index];\r\n            if (item.value == value) {\r\n                self.setAngle(index* itemAngle, true);\r\n                return;\r\n            }\r\n        }\r\n    };\r\n\r\n    // 获取当前选中的值\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    Picker.prototype.getSelectedIndex = function () {\r\n        return this.index;\r\n    };\r\n\r\n    ipu.Picker = Picker;\r\n\r\n})(ipu || window, jQuery, Hammer);\r\n\n// popPicker\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n\r\n    function PopPicker(options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype.defaultOptions = {\r\n        template: '<div class=\"ui-poppicker\">\\\r\n                        <div class=\"ui-poppicker-header\">\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n                            <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n                        </div>\\\r\n                        <div class=\"ui-poppicker-body\">\\\r\n                        </div>\\\r\n                    </div>',\r\n        pickerTemplate: '<div class=\"ui-picker\">\\\r\n                            <div class=\"ui-picker-selectbox\"></div>\\\r\n                            <ul></ul>\\\r\n                          </div>',\r\n        data: [],    // 数据\r\n        layer: 1,   // 数据层级\r\n        btns: ['取消', '确认'],\r\n        callBack: function () { // 选择数据时的回调函数\r\n\r\n        }\r\n    };\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.options.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ui-poppicker-body\", this.holder);\r\n\r\n        var layer = this.options.layer;\r\n        var width = (100 / layer) + \"%\";\r\n        this.pickers = new Array(layer);\r\n        var self = this;\r\n        var pickerHtml;\r\n        this.mask = this.createMask();\r\n\r\n        // 先初始化最底层picerk,再上面来\r\n        for (var i = layer -1; i >=0; i--) {\r\n            pickerHtml = $(this.options.pickerTemplate).prependTo(bodyHtml).css({width: width});\r\n\r\n            this.pickers[i] = new  Picker(pickerHtml, {\r\n                onChange: (function (i) {\r\n                    return function (item, index) { // 更新底部的值\r\n                        if (i != layer - 1) {\r\n                            self.pickers[i + 1].setItems(item.data);\r\n                        }\r\n                    };\r\n                })(i)\r\n            });\r\n        }\r\n\r\n        $(\".ui-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.options.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.options.btns[1]);\r\n\r\n        $(\".ui-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.options.btns[0]);\r\n    };\r\n\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.options.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ui-current\");\r\n    };\r\n\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ui-current\");\r\n    };\r\n\r\n    // 获取相关值\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.options.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.options.layer; i++) {\r\n                rs.push(this.pickers[i].getSelectedItem());\r\n            }\r\n            return rs;\r\n        }\r\n    };\r\n\r\n    // 应该移除callback参数,提取出业成一个工具方法\r\n    PopPicker.prototype.createMask = function(callback) {\r\n        var self = this;\r\n        var element = document.createElement('div');\r\n        element.classList.add(\"ui-picker-backup\");\r\n        //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n        element.addEventListener('click', function() {\r\n            self.hide();\r\n        });\r\n        var mask = [element];\r\n        mask._show = false;\r\n        mask.show = function() {\r\n            mask._show = true;\r\n            element.setAttribute('style', 'opacity:1');\r\n            document.body.appendChild(element);\r\n            return mask;\r\n        };\r\n        mask._remove = function() {\r\n            if (mask._show) {\r\n                mask._show = false;\r\n                element.setAttribute('style', 'opacity:0');\r\n                setTimeout(function() {\r\n                    var body = document.body;\r\n                    element.parentNode === body && body.removeChild(element);\r\n                }, 350);\r\n            }\r\n            return mask;\r\n        };\r\n        mask.close = function() {\r\n            if(mask._show){\r\n                if (callback) {\r\n                    if (callback() !== false) {\r\n                        mask._remove();\r\n                    }\r\n                } else {\r\n                    mask._remove();\r\n                }\r\n            }\r\n        };\r\n        return mask;\r\n    };\r\n\r\n    ipu.popPicker = function (options) {\r\n        return new PopPicker(options);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n\r\n    /**\r\n     *进度条\r\n     */\r\n    function progressBar(id, options) {\r\n        this.id = id;\r\n        this.level = options.level;\r\n        this.progress = options.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (options.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (options.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    progressBar.prototype.setProgress = function (pro) {\r\n        if (pro < 0 || pro > 100) return;\r\n\r\n        $(this.progressBar.find(\".ipu-progressbar\")).css(\"transform\", \"translate3d(\" + (-(100 - pro)) + \"%, 0px, 0px)\");\r\n        this.progress = pro;\r\n    };\r\n\r\n    progressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    progressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-hightlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-highlight ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ui-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    ipu.progressBar = function (slt, options) {\r\n        return new progressBar(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $, iScroll) {\r\n\r\n    // 扩展参数,iscroll组件的参数选项\r\n    // 扩展参数,用户直接在页面上自定好,顶端和底部加载html\r\n    // 设置上下条件长度,或计算函数\r\n    // 处理resize的问题,用户主动调用refresh??\r\n    // 底部启用或停用时,应该刷新组件iscroll高度\r\n    // 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n    Refresh.prototype.defaultOptions = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ui-refresh-bottom\"><span class=\"ui-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ui-refresh-top\"><span class=\"ui-refresh-loading\"></span><div class=\"ui-refresh-arrow\"></div></div>',\r\n                // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n                // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ui-refresh-top-loading\r\n                // 拖动达到加载距离,则增加class:ui-refresh-toload\r\n                // 加载中,则增加class:ui-refresh-top-loading,移除class:ui-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOptions:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    function Refresh(slt, options) {\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOptions = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ui-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ui-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ui-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ui-refresh-toload');\r\n                    }\r\n                }\r\n\r\n                me._checkBottomLoading(); // 底部加载条件和顶部条件不一样,只要滚动离底部一定高度就开始加载\r\n                me.goTop = this.y > me.topPullOffset; // 记录是否位于顶部位置,以便刷新后可以回到此位置\r\n            },\r\n            onBeforeScrollEnd: function () {    // 一定是用户拖动触发,在滚动结束前应该触发\r\n                me._checkTopLoading();\r\n                me._checkBottomLoading();\r\n            },\r\n            onScrollEnd: function () { // 这个事件可能由非用户拖动时触发,可能是拖动惯性导致,所有顶部不应该处理,但顶部不管是否惯性,位置条件满足即触发\r\n                if (me.topLoading && this.y < this.minScrollY && me.goTop) {\r\n                    me.iScroll.scrollTo(0, this.minScrollY, 0);\r\n                }\r\n                me._checkBottomLoading(); // 在beforend执行还不够,还在要end执行\r\n            },\r\n            onRefresh: function () { // 刷新时,若顶部加载还在进行,且当前显示的顶部加载,则继续显示,否则刷新后会消失顶部加载,这里代码没有考虑重用了,应该可以做一步提取\r\n                if (me.topLoading) { // 如果顶部在加载,则刷新的时候,设置最小顶部距离,显示顶部加载状态\r\n                    this.minScrollY = this.minScrollY + me.topPullOffset;\r\n                }\r\n            }\r\n        };\r\n\r\n        this.iScrollOptions = $.extend({}, this.options.iScrollOptions, this.iScrollOptions);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOptions);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ui-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.options.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.options.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.options.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        this.topLoading = false;        // 顶部正在载加载\r\n        this.bottomLoading = false;     // 底部正在加载\r\n        this.bottomEnable = this.options.initEnableBottom && !!this.options.bottomLoadFun;\r\n        this.topEnable = this.options.initEnableTop && !!this.options.topLoadFun;\r\n        this.goTop = false;         // 用来处理,因为iScroll使用momentum(惯性), 导致有时顶部显示不正确问题,true表示顶部显示加载条\r\n\r\n        this.enableBottom(this.bottomEnable);\r\n        this.enableTop(this.topEnable);\r\n    };\r\n\r\n    // 检查是否需要底部加载\r\n    Refresh.prototype._checkBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            if (this.iScroll.y < this.iScroll.maxScrollY + this.bottomPullOffset) {\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    Refresh.prototype._checkTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            if (this.topEl.hasClass('ui-refresh-toload')) {\r\n                this._startTopLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 检查内容是否超出容器高度,未超出时,自动调用底部加载\r\n    Refresh.prototype._checkContentLoading = function () {\r\n        if(this.iScroll.maxScrollY >= -this.bottomPullOffset){ // 此处要计算底端的高度\r\n            this._startBottomLoading();\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (this.bottomEnable && !this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.options.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (this.topEnable && !this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ui-refresh-toload').addClass('ui-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.options.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 结束底部加载\r\n    Refresh.prototype.endBottomLoading = function () {\r\n        this.bottomLoading = false;\r\n        this.refresh();\r\n    };\r\n\r\n    // 结束顶部加载\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ui-refresh-top-loading');\r\n        this.topLoading = false;\r\n        // this.iScroll.scrollTo(0, 0); // 刷新加载则应该回到顶部,待测试确认\r\n        this.refresh();\r\n    };\r\n\r\n    // 设置顶部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableTop = function (enable) {\r\n        this.topEnable = enable;\r\n        if (enable) {\r\n            this.topEl.show();\r\n        } else {\r\n            this.topEl.hide();\r\n        }\r\n    };\r\n\r\n    // 设置底部加载是否可用,true可用,否则不可用\r\n    Refresh.prototype.enableBottom = function (enable) {\r\n        this.bottomEnable = enable;\r\n        if (enable) {\r\n            this.bottomEl.show();\r\n        } else {\r\n            this.bottomEl.hide();\r\n        }\r\n    };\r\n\r\n    // 只有在内容发生变更时,但是又没有触发调用end相关方法时,使用此方法更新高度信息\r\n    // 或者组件在一开始未显示??\r\n    // 刷新会移除拖动中状态\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n    ipu.refresh = function (slt, optoins) {\r\n        return new Refresh(slt, optoins);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// Tab\r\n(function (ipu, $) {\r\n    function Tab(holder, options) {\r\n        this.el = $(holder).get(0);\r\n        this.titleItems = $(\".ui-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ui-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.options = $.extend({}, this.defaultOptions, options);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ui-tab-fixed\"); // 是否为固定高度的\r\n\r\n        var that = this;\r\n        this.titleItems.each(function (index) {\r\n            $(this).click(function () {\r\n                that.show(index);\r\n            });\r\n        });\r\n\r\n        var index = this.titleItems.filter(\".ui-current\").index();\r\n        if (index == -1) {\r\n            index = 0;\r\n        }\r\n\r\n        this.show(index);\r\n    }\r\n\r\n    Tab.prototype.defaultOptions = {\r\n        callBack: null  // 回调函数,tab切换时回调函数\r\n    };\r\n\r\n    Tab.prototype.show = function (index) {\r\n        if (this.fixed) {\r\n            var move = -index * 100 + \"%\";\r\n            this.bodyWrapper.css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n        }\r\n        this.contentItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this.titleItems.eq(index).addClass(\"ui-current\").siblings().removeClass(\"ui-current\");\r\n        this._end(index);\r\n    };\r\n\r\n    Tab.prototype._end = function (index) {\r\n        this.lastIndex = this.currentIndex;\r\n        this.currentIndex = index;\r\n\r\n        if (this.options.callBack) {\r\n            this.options.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, options) {\r\n        return new Tab(slt, options);\r\n    };\r\n})(ipu || window, jQuery);\r\n\r\n\n// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipu, $) {\r\n    var active = {};\r\n\r\n    var options = defaultOptions = {\r\n        distanceAllow: 10,   // 最大移动距离,超过移除效果\r\n        displayDelay: 100,  // 延时显示时间,以防止是滚动操作\r\n        hideDelay: 120,     // 隐藏延时时间\r\n        eventName: 'click', // 事件处理是click\r\n        activeClass: 'ui-active',   // 激活时的class\r\n        getHandleNode: function (node) {  // 找到最先一级处理此click事件的元素\r\n            if (!node || !node.nodeType) return;\r\n\r\n            var distNode = null;\r\n            var nodeArray = [];\r\n\r\n            // 还有其它情形考虑,如a标签的跳转,或在原生元素添加事件属性的\r\n            function findHander(inNode) {\r\n                // 此方法适用于jquery, 1.12.4, 2.2.4, 3.2.1版本,_data方法以后可能会被移除。$.data是一些老版本写法\r\n                var eventHandlers = ($._data || $.data)(inNode, 'events');\r\n\r\n                if (eventHandlers) {\r\n                    eventHandlers = eventHandlers[options.eventName];\r\n                }\r\n\r\n                if (!eventHandlers) {\r\n                    return;\r\n                }\r\n\r\n                var thisNode = false;\r\n                $.each(eventHandlers, function (index, handler) {\r\n                    if (handler.selector) {\r\n                        var objs = $(handler.selector, inNode);\r\n                        $.each(nodeArray, function (tIndex, tNode) {\r\n                            if (objs.is(tNode)) {\r\n                                distNode = tNode;\r\n                                return false;\r\n                            }\r\n                        });\r\n\r\n                        if (distNode) {\r\n                            return false; //\r\n                        }\r\n                    } else {\r\n                        thisNode = true;  // 保存distNode,有可能有子节点满足条件,所以只保存此值为默认值\r\n                    }\r\n                });\r\n\r\n                if (thisNode && distNode == null) { // 如果没在子节点找到click事件,而当前节点又有click事件,就使用当前节点\r\n                    distNode = inNode;\r\n                }\r\n\r\n                return distNode;\r\n            }\r\n\r\n            while (!(\"tagName\" in node) || !findHander(node)) {\r\n                if (!node.parentNode || node.parentNode.nodeType != 1) {\r\n                    break;\r\n                }\r\n                nodeArray.push(node);\r\n                node = node.parentNode;\r\n            }\r\n\r\n            return distNode;\r\n        }\r\n    };\r\n\r\n    function getOriginalEvent(e) {\r\n        return e.originalEvent || e;\r\n    }\r\n\r\n    function getXY(e) {\r\n        var x = e.touches ? e.touches[0].pageX : e.clientX;\r\n        var y = e.touches ? e.touches[0].pageY : e.clientY;\r\n        return [x, y];\r\n    }\r\n\r\n    //根据不同浏览器获取不同原生事件event\r\n    var hasTouch = \"ontouchstart\" in window,\r\n        START_EVENT = hasTouch ? 'touchstart' : 'mousedown',\r\n        MOVE_EVENT = hasTouch ? 'touchmove' : 'mousemove',\r\n        END_EVENT = hasTouch ? 'touchend' : 'mouseup',\r\n        CANCEL_EVENT = hasTouch ? 'touchcancel' : '';\r\n\r\n    $(function () {\r\n        var startXY, tapEl, timeOutID;\r\n        var dom = document.body;\r\n\r\n        // force为false的时候,不用管timeOutID,在老的timeOutID未移除的情况下,有可能又产生了新的,\r\n        // 导致else代码未被执行,导致老的点击元素class未被移除\r\n        function removeClass(dom, force) {\r\n            if (force && timeOutID) {\r\n                window.clearTimeout(timeOutID);\r\n            } else {\r\n                $(dom).removeClass(options.activeClass);\r\n            }\r\n        }\r\n\r\n        function removeActive(force) {\r\n            if (force) {\r\n                removeClass(tapEl, force);\r\n            } else {\r\n                window.setTimeout(removeClass, options.hideDelay, tapEl, force);\r\n            }\r\n            startXY = null;\r\n            tapEl = null;\r\n        }\r\n\r\n        $(dom).bind(START_EVENT, function (e) {\r\n            if (tapEl) {    // 多点接触时处理\r\n                removeActive(true);\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n            startXY = getXY(e);\r\n            tapEl = options.getHandleNode(e.target);\r\n\r\n            if (tapEl) {\r\n                timeOutID = window.setTimeout(function (dom) {\r\n                    timeOutID = null;\r\n                    $(dom).addClass(options.activeClass);\r\n                }, options.displayDelay, tapEl);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(MOVE_EVENT, function (e) {\r\n            if (!tapEl) {\r\n                return;\r\n            }\r\n\r\n            e = getOriginalEvent(e);\r\n\r\n            var xy = getXY(e);\r\n            if (startXY && (Math.abs(xy[0] - startXY[0]) > options.distanceAllow || Math.abs(xy[1] - startXY[1]) > options.distanceAllow)) {\r\n                removeActive(true);\r\n            }\r\n        });\r\n\r\n        $(dom).bind(END_EVENT, function (e) {\r\n            if (tapEl) {\r\n                removeActive();\r\n            }\r\n        });\r\n\r\n        // 手机来电等非用户取消操作时触发事件\r\n        if (CANCEL_EVENT) {\r\n            $(dom).bind(CANCEL_EVENT, function (e) {\r\n                if (tapEl) {\r\n                    removeActive();\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    // 更新默认值\r\n    active.setOptions = function (opts) {\r\n        options = this.options = $.extend({}, defaultOptions, opts);\r\n    };\r\n    ipu.active = active;\r\n})(ipu || window, jQuery);\r\n\r\n\n/*===========================\r\nDevice/OS Detection\r\n===========================*/\r\n// from sui,但IPU框架的ua不是这样的\r\n;(function (ipu, $) {\r\n    \"use strict\";\r\n    var device = {};  // Classes\r\n    var classNames = [];\r\n    var ua = navigator.userAgent\r\n    \r\n    // 这中针对ipu框架的情况,待测试\r\n    if(ua.match(/ipumobile/i)){\r\n        device.ios =  !!ua.match(/ios/i);\r\n        device.android = !!ua.match(/android/i);\r\n    }else{\r\n        var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\r\n        var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\r\n        var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\r\n        var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\r\n\r\n        device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\r\n\r\n        // Android\r\n        if (android) {\r\n            device.os = 'android';\r\n            device.osVersion = android[2];\r\n            device.android = true;\r\n            device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\r\n        }\r\n        if (ipad || iphone || ipod) {\r\n            device.os = 'ios';\r\n            device.ios = true;\r\n        }\r\n        // iOS\r\n        if (iphone && !ipod) {\r\n            device.osVersion = iphone[2].replace(/_/g, '.');\r\n            device.iphone = true;\r\n        }\r\n        if (ipad) {\r\n            device.osVersion = ipad[2].replace(/_/g, '.');\r\n            device.ipad = true;\r\n        }\r\n        if (ipod) {\r\n            device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\r\n            device.iphone = true;\r\n        }\r\n        // iOS 8+ changed UA\r\n        if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\r\n            if (device.osVersion.split('.')[0] === '10') {\r\n                device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\r\n            }\r\n        }\r\n\r\n        // Webview\r\n        device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\r\n\r\n        // Minimal UI\r\n        if (device.os && device.os === 'ios') {\r\n            var osVersionArr = device.osVersion.split('.');\r\n            device.minimalUi = !device.webView &&\r\n                (ipod || iphone) &&\r\n                (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\r\n                $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\r\n        }\r\n\r\n        // Check for status bar and fullscreen app mode\r\n        var windowWidth = $(window).width();\r\n        var windowHeight = $(window).height();\r\n        device.statusBar = false;\r\n        if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\r\n            device.statusBar = true;\r\n        }\r\n        else {\r\n            device.statusBar = false;\r\n        }\r\n\r\n\r\n        // Pixel Ratio\r\n        device.pixelRatio = window.devicePixelRatio || 1;\r\n        classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\r\n        if (device.pixelRatio >= 2) {\r\n            classNames.push('retina');\r\n        }\r\n\r\n        // OS classes\r\n        if (device.os) {\r\n            classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\r\n            if (device.os === 'ios') {\r\n                var major = parseInt(device.osVersion.split('.')[0], 10);\r\n                for (var i = major - 1; i >= 6; i--) {\r\n                    classNames.push('ios-gt-' + i);\r\n                }\r\n            }\r\n\r\n        }\r\n        // Status bar classes\r\n        if (device.statusBar) {\r\n            classNames.push('with-statusbar-overlay');\r\n        }\r\n        else {\r\n            $('html').removeClass('with-statusbar-overlay');\r\n        }\r\n\r\n\r\n        // keng..\r\n        device.isWeixin = /MicroMessenger/i.test(ua);\r\n    }\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0){\r\n        $('html').addClass(classNames.join(' '));\r\n    }\r\n\r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n\n\r\n        // 初始化代码\r\n        jQuery(function () {\r\n            FastClick.attach(document.body);\r\n        });\r\n\r\n        return ipu;\r\n    }\r\n\r\n    // todo:可以添加一个和其它库的适配处理,\r\n    // 这里假设第三方库,jquery,iScroll,Hammer的史称已经固定\r\n    if ( typeof define === \"function\" && define.amd ) {\r\n        define(['jquery', 'iScroll', 'Hammer', 'FastClick'], function (jQuery, iScroll, Hammer, FastClick) {\r\n            return window.ipu = setup(jQuery, iScroll, Hammer, FastClick);\r\n        });\r\n    } else {\r\n        window.ipu = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n    }\r\n})();\r\n\r\n//# sourceMappingURL=ipu.js.map\r\n"]}