Pārlūkot izejas kodu

js中添加版本字段信息

guohh 7 gadi atpakaļ
vecāks
revīzija
c4c707c4fc

+ 3 - 3
ipuui/dist/js/ipu.js

@ -1,4 +1,3 @@
1
// v0.2.1 2018-04-11
2 1
(function () {
3 2
    function setup(jQuery, iScroll, Hammer, FastClick) {
4 3
@ -7,8 +6,9 @@
7 6
         *
8 7
         */
9 8
10
11
        var ipu = {};
9
        var ipu = {
10
            version: '0.2.1'
11
        };
12 12
13 13
(function (ipu, $, iscroll) {
14 14

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

@ -1 +1 @@
1
{"version":3,"sources":["ipu-prefix.js","carousel.js","device.js","dtPicker.js","hammerCarousel.js","modal.js","navBar.js","pages.js","picker.js","popPicker.js","progressBar.js","refresh.js","tab.js","tap.js","ipu-suffix.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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","file":"ipu.js","sourcesContent":["// v0.2.1 2018-04-11\n(function () {\n    function setup(jQuery, iScroll, Hammer, FastClick) {\n\n        /**\n         * @class ipu UI的主对象,通过此对象实例UI组件\n         *\n         */\n\n\n        var ipu = {};\n","(function (ipu, $, iscroll) {\r\n\r\n    /**\r\n     * @deprecated 推荐使用 {@link HammerCarousel}\r\n     * @uses IScroll.js\r\n     * @class 简单封装IScroll.js的snap功能,实现banner功能\r\n     *\r\n     *      @example\r\n     *      <!-- 组件html结构如下,li里内容可自定义 -->\r\n            <div class=\"ipu-carousel ipu-hammer-carousel\">\r\n                <ul class=\"ipu-carousel-wrapper\">\r\n                    <li ><img src=\"../../biz/img/01.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/02.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/03.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/04.jpg\" alt=\"\"></li>\r\n                </ul>\r\n            </div>\r\n     *\r\n     * @constructor 不能直接访问该类,使用ipu.carousel(slt, option)生成实例 {@link ipu#carousel}\r\n     * @param {Dom|JqueryObj|String} slt jquery对象或者jquery选择器或Dom元素\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function Carousel(slt, option) {\r\n        this.option = option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = option.autoPlay;\r\n        this.hasIndicator = option.indicator;\r\n        this.callBack = option.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        /**\r\n         * 组件默认配置项\r\n         *\r\n         * @cfg {Object} defaultOption\r\n         * @cfg {Number} defaultOption.index 默认显示的项\r\n         * @cfg {Boolean} defaultOption.autoPlay 是否自动播放\r\n         * @cfg {Number} defaultOption.duration 自动播放间隔,单位ms\r\n         * @cfg {Boolean} defaultOption.indicator 是否生成指示器\r\n         * @cfg {Function} defaultOption.callBack 切换显示时的回调函数\r\n         * @cfg {Number} defaultOption.callBack.index 当前显示项索引\r\n         *\r\n         */\r\n        defaultOption: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ipu-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            var that = this;\r\n\r\n            if (this.option.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ipu-current\").index();\r\n                this.option.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                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.option.index, 0);\r\n        },\r\n        /**\r\n         * 停止自动播放\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        /**\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        /**\r\n         * 显示下一项\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        /**\r\n         * 显示索引index对应的索\r\n         *\r\n         * @param {Number} 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        /**\r\n         * 开始自动播放\r\n         */\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        /**\r\n         * 若窗口发生大小变更,调用此方法更新位移\r\n         */\r\n        refresh: function () {\r\n            this.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                    that.timeoutId = null;\r\n                    that.next();\r\n                }, that.option.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(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-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='ipu-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    /**\r\n     * @member ipu\r\n     * 生成Carousel实例,参数信息见{@link Carousel#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {Carousel}\r\n     */\r\n    ipu.carousel =  function (slt, option) {\r\n        return new Carousel(slt, option);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n","// todo:添加判断平台如mobile ,tablet, pc,参考其它类似功能库,添加webview判断\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    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    // 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    device.wx = /MicroMessenger/i.test(ua);  // 是否微信\r\n    device.ipu = /ipumobile/i.test(ua);         // 是否ipu环境运行\r\n\r\n    if (device.wx) {\r\n        classNames.push('wx');\r\n    }\r\n    if (device.ipu) {\r\n        classNames.push('ipu');\r\n    }\r\n\r\n    var classPrev = \"ipu-\";\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0) {\r\n        $('html').addClass(classPrev+classNames.join(' '+classPrev));\r\n    }\r\n    \r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n","// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n// show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n// 日期范围的选择处理\r\n// 不选择字符串连接符,合并后占空间\r\n\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来协助运算\r\n\r\n    /**\r\n     * @class 日期选择器,替代默认的web日历选择,日期格式如下<br>\r\n     * type=datetime:yyyy-mm-dd hh:mi<br>\r\n     * type=date:yyyy-mm-dd<br>\r\n     * type=time: hh:mi<br>\r\n     * type=month: yyyy-mm<br>\r\n     * type=hour: yyyy-mm-dd hh<br>\r\n     *\r\n     * @constructor 不能直接访问该,调用{@link ipu#dtPicker}生成实例\r\n     * @param {object} option 组件参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function DtPicker(option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n\r\n        if (!Picker) {\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption=\r\n     * @cfg {String} defaultOption.template 组件模板html,不建议变更\r\n     * @cfg {[String]} defaultOption.buttons=['取消', '确认', '清除'] 按钮名称\r\n     * @cfg {[String]} defaultOption.labels=['年', '月', '日', '时', '分'] 年月日标签\r\n     * @cfg {datetime|time|date|hour|month} defaultOption.type='datetime' 日期类型\r\n     * @cfg {Boolean} defaultOption.hasClear=false 是否显示清除按钮\r\n     * @cfg {Date} defaultOption.beginDate=null 日期开始时间,默认设置为当时间前5年\r\n     * @cfg {Date} defaultOption.endDate=null 日期结束时间,默认设置为开始时间后10年\r\n     * @cfg {Function} defaultOption.callBack=null 点击按钮时的回调函数,回调的参数同{@link #show show()}法设置 的回调\r\n     */\r\n    DtPicker.prototype.defaultOption = {\r\n        template: '<div class=\"ipu-poppicker ipu-dtpicker\">'\r\n        + '<div class=\"ipu-poppicker-header\">'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-cancel\">取消</button>'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-ok\">确定</button>'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-clear\">清除</button>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-poppicker-title\">'\r\n        + '<label class=\"ipu-dtpicker-y\"></label>'\r\n        + '<label class=\"ipu-dtpicker-m\"></label>'\r\n        + '<label class=\"ipu-dtpicker-d\"></label>'\r\n        + '<label class=\"ipu-dtpicker-h\"></label>'\r\n        + '<label class=\"ipu-dtpicker-mi\"></label>'\r\n        + '</div>'\r\n        + '<div>'\r\n        + '<div class=\"ipu-poppicker-body\">'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-y\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-m\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-d\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-h\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-mi\">'\r\n        + '<div class=\"ipu-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',\r\n        customData: {},\r\n        hasClear: false,\r\n        beginDate: null,\r\n        endDate: null,\r\n        callBack: null\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.option.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ipu-poppicker-btn-ok', _picker),\r\n            cancel: $('.ipu-poppicker-btn-cancel', _picker),\r\n            clear: $('.ipu-poppicker-btn-clear', _picker),\r\n            buttons: $('.ipu-poppicker-header .ipu-btn', _picker),\r\n            labels: $('.ipu-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.option.beginMonth || self.option.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.option.beginMonth || self.option.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.option.beginMonth || self.option.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        self._create();\r\n\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.option.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.option.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    /**\r\n     * 返回当前选中的日期,只有在点确认时,返回的才是正确的值,在点清除、或取消后,调用此方法返回的值不可控\r\n     *\r\n     * @return 选择的日期信息\r\n     * @return {datetime|time|date|hour|month} return.type 日期类型\r\n     * @return {String} return.text  日期文本(text字段)拼接,格式yyyy-mm-dd hh:mi 根据上面的日期类型返回对应字符串\r\n     * @return {String} return.value 日期项值(value字段)拼接\r\n     * @return {Object} return.y 选择的年项\r\n     * @return {Object} return.m 选择的月项\r\n     * @return {Object} return.d 选择的日项\r\n     * @return {Object} return.h 选择的时项\r\n     * @return {Object} return.i 选择的分项\r\n     * @return {Function} return.toString 返回value字段的值\r\n     */\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.option.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.option.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    /**\r\n     * 设置日期值,value为字符串时,格式请参照 yyyy-mm-dd hh:mi具体格式与配置项type相关\r\n     *\r\n     * @param {String|Date} value\r\n     */\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    /**\r\n     * 是否润年\r\n     *\r\n     * @param {Number} year 年份\r\n     * @returns {Boolean}\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.option.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.option.beginMonth && this._isBeginYear() && this.option.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.option.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.option.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.option.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.option.endMonth && this._isEndYear() && this.option.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.option.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.option.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (option.customData.y) {\r\n            yArray = option.customData.y;\r\n        } else {\r\n            var yBegin = option.beginYear;\r\n            var yEnd = option.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    };\r\n\r\n    DtPicker.prototype._createMonth = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (option.customData.m) {\r\n            mArray = option.customData.m;\r\n        } else {\r\n            var m = option.beginMonth && self._isBeginYear() ? option.beginMonth : 1;\r\n            var maxMonth = option.endMonth && self._isEndYear() ? option.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    };\r\n\r\n    DtPicker.prototype._createDay = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (option.customData.d) {\r\n            dArray = option.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? option.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? option.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 () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (option.customData.h) {\r\n            hArray = option.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? option.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? option.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 () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (option.customData.i) {\r\n            iArray = option.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? option.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? option.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 option = self.option;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = option.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n        ui.cancel.text(option.buttons[0]);\r\n        ui.ok.text(option.buttons[1]);\r\n\r\n        if (option.hasClear) {\r\n            ui.clear.text(option.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    // 对于time类型时,或未完整的时间值,使用defaultPickerDate来填充\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.option.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                value = 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    // 生成日期数据\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var option = this.option;\r\n        var now = defaultPickerDate;\r\n        var beginDate = option.beginDate;\r\n\r\n        if (beginDate) {  // 若有设置开始日期\r\n            beginDate = this._parseSetValue(beginDate);\r\n            option.beginYear = beginDate.y;\r\n            option.beginMonth = beginDate.m;\r\n            option.beginDay = beginDate.d;\r\n            option.beginHours = beginDate.h;\r\n            option.beginMinutes = beginDate.i;\r\n        } else if (option.type == 'time') { // 未设置开始日期,但日期格式是time\r\n            option.beginYear = now.getFullYear();\r\n            option.beginMonth = now.getMonth() + 1;\r\n            option.beginDay = now.getDate();\r\n            option.beginHours = 0;\r\n            option.beginMinutes = 0;\r\n        } else {\r\n            option.beginYear = now.getFullYear() - 5;   // 其它,未设置开始日期,type也不为time,设置默认起始时间\r\n        }\r\n\r\n        var endDate = option.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            option.endYear = endDate.y;\r\n            option.endMonth = endDate.m;\r\n            option.endDay = endDate.d;\r\n            option.endHours = endDate.h;\r\n            option.endMinutes = endDate.i;\r\n        } else if (option.type == 'time') {\r\n            option.endYear = now.getFullYear();\r\n            option.endMonth = now.getMonth() + 1;\r\n            option.endDay = now.getDate();\r\n            option.endHours = 23;\r\n            option.endMinutes = 59;\r\n        } else {\r\n            option.endYear = option.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     * 设置组件日期范围\r\n     *\r\n     * @param {String|Date} beginDate 开始时间\r\n     * @param {Stirng|Date} endDate 结束时间\r\n     */\r\n    DtPicker.prototype.setDateRange = function (beginDate, endDate) {\r\n        this.option.beginDate = beginDate;\r\n        this.option.endDate = endDate;\r\n        this._create();\r\n    };\r\n\r\n    /**\r\n     * 设置开始组件的开始据时间\r\n     * @param {String|Date} date\r\n     */\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.option.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    /**\r\n     * 设置组件的结束时间\r\n     *\r\n     * @param {String|Date} date\r\n     */\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.option.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    /**\r\n     * 显示组件\r\n     *\r\n     * @param {Function} callBack 点击按钮时的回调函数,设置此参数会覆盖初始化时的回调函数\r\n     * @param {Object} callBack.sltDate 当前选中的日期信息,具体格式,见方法{@link #getSelected getSelected()}的返回\r\n     * @param {Number} callBack.index 被点击的按钮索引,0取消,1确认,2清除\r\n     */\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.option.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ipu-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.option.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    /**\r\n     * 隐藏组件\r\n     */\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ipu-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(\"ipu-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    /**\r\n     * @member ipu\r\n     * 生成DtPicker实例,参数信息见{@link DtPicker#method-constructor}\r\n     *\r\n     * @param {Object} option\r\n     * @returns {DtPicker}\r\n     */\r\n    ipu.dtPicker = function (option) {\r\n        return new DtPicker(option);\r\n    };\r\n})(ipu || window, jQuery);\r\n","// 支持非循环\r\n// 更新方法和属性命名\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容同时显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n// 理想用户不操作时,永远不显示最后复制项,或者各项独立,也可实现类似功能\r\n//indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n// 直接替换掉了prototype对象,可能不是个好选择\r\n\r\n(function (ipu, $, Hammer) {\r\n    /**\r\n     * @class\r\n     * @uses Hammer.js\r\n     * 通过hammer.js实现的banner功能组件,\r\n     * 因为实现轮播,显示第一项后,再显示第一项,所以第一项有被复制到添加到最后\r\n     *\r\n     *      @example\r\n     *      <!-- 组件html结构如下,li里的内容用户可自定义  -->\r\n     *      <div class=\"ipu-carousel ipu-hammer-carousel\">\r\n     *          <ul class=\"ipu-carousel-wrapper\">\r\n     *              <li ><img src=\"../../biz/img/01.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/02.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/03.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/04.jpg\" alt=\"\"></li>\r\n     *          </ul>\r\n     *      </div>\r\n     *\r\n     * @constructor  不能直接访问该类,调用 {@link ipu#hammerCarousel}生成实例\r\n     * @param {String|JqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function HammerCarousel(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    HammerCarousel.prototype = {\r\n        /**\r\n         * 组件默认配置项\r\n         *\r\n         * @cfg {Object} defaultOption\r\n         * @cfg {Number} defaultOption.index 初始化时显示第几项,用户未指定时,会查找子项内容上有ipu-current的项显示,没有则显示第一项\r\n         * @cfg {Boolean} defaultOption.autoPlay 是否自动轮播\r\n         * @cfg {Number} defaultOption.duration 自动轮播时的间隔时间,单位ms\r\n         * @cfg {Boolean} defaultOption.indicator 是否生成banner提示器,true右下角出现小点\r\n         * @cfg {Function} defaultOption.callBack 轮播显示某项时的回调函数\r\n         * @cfg {Number} defaultOption.callBack.index 当前显示的项索引\r\n         * @cfg {Function} defaultOption.clickBack\r\n         *          切换项时被点击时的回调函数,此处主要是为了处理复制项与第一项的点击事件进行处理,\r\n         *          让用户不关注点周是第一项或是复制项,回调作用域为组件对象\r\n         * @cfg {Number} defaultOption.clickBack.index 点击的项索引\r\n         */\r\n        defaultOption: {\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        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ipu-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\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 that = this;\r\n            if (this.option.clickBack) {\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        that.option.clickBack.call(this, i % that.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this._sizeCount();\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.option.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ipu-current\").index();\r\n                this.option.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.option.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.option.index, false);\r\n        },\r\n        /**\r\n         * 停止自动滚动\r\n         */\r\n        stop: function () {\r\n            this._pause();\r\n            this.option.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        /**\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);\r\n        },\r\n        /**\r\n         * 切换到下一项\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);\r\n        },\r\n        /**\r\n         * 切换显示指定项\r\n         *\r\n         * @param {Number} index 要切换到的项索引\r\n         *\r\n         */\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % this.size;\r\n            if (index < 0) {\r\n                index = this.size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        /**\r\n         * 自动轮播\r\n         */\r\n        play: function () {\r\n            this.option.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.option.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.option.duration);\r\n            }\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='ipu-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(\"ipu-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        /**\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, false); //新的位置\r\n            }\r\n        },\r\n        _move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ipu-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(\"ipu-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            this.lastItem = index == this.size;\r\n\r\n            this.moveLen = this.carouselItemSizes[index];\r\n            var move = - this.moveLen + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n\r\n            var currentIndex = this.currentIndex;\r\n            if (animate && this.option.callBack) {\r\n                this.option.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n\r\n            this._play();//处理自动播放\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    /**\r\n     * @member ipu\r\n     * 生成HammerCarousel实例,参数信息见{@link HammerCarousel#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {HammerCarousel}\r\n     */\r\n    ipu.hammerCarousel = function (slt, option) {\r\n        return new HammerCarousel(slt, option);\r\n    };\r\n})(ipu || window, jQuery, Hammer);\r\n","(function (ipu, $) {\r\n\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            /*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        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalTitle: '',\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\r\n    ipu.modal = function (params) {\r\n        params = params || {};\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=\"ipu-modal-button' + (params.buttons[i].bold ? ' ipu-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=\"ipu-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ipu-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ipu-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ipu-modal-buttons-vertical' : '';\r\n\r\n        var modalHTML = '<div class=\"ipu-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ipu-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ipu-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('.ipu-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\r\n    /**\r\n     * @member ipu\r\n     * 弹出警告消息\r\n     *\r\n     * @param {String} text 警句文本\r\n     * @param {String} title 警告标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\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\r\n    /**\r\n     * @member ipu\r\n     * 弹出确认消息\r\n     *\r\n     * @param {String} text 确认文本\r\n     * @param {String} title 确认标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\r\n     * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\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, bold: true, onClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 弹出输入框\r\n     *\r\n     * @param {String} text 输入提示文本\r\n     * @param {String} title 输入提示标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\r\n     * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\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=\"ipu-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('.ipu-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ipu-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    /**\r\n     *  @member ipu\r\n     * 弹出加载消息提示\r\n     *\r\n     * @param {String} title 加载提示文本\r\n     * @param {Number} minTime 消息最小显示时间,单位ms,可选参数\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=\"ipu-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\r\n    /**\r\n     * @member ipu\r\n     * 隐藏加载消息提示\r\n     *\r\n     * @param {Boolean} force 是否强制隐藏,不管最小提示时间,可选\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\r\n    /**\r\n     * @member ipu\r\n     * 显示加载状态\r\n     */\r\n    ipu.showIndicator = function () {\r\n        if ($('.ipu-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ipu-preloader-indicator-overlay\"></div><div class=\"ipu-preloader-indicator-modal\"><span class=\"ipu-preloader ipu-preloader-white\"></span></div>');\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 隐藏加载状态\r\n     */\r\n    ipu.hideIndicator = function () {\r\n        $('.ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal').remove();\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 显示操作选项\r\n     *\r\n     * @param{[[Object]]} actions\r\n     * @param {Object} actions.Object\r\n     * @param {String} actions.Object.text 操作名称\r\n     * @param {Boolean} actions.Object.label 是否标签,非标签就是操作项,操作项有后续的配置,标签项无须后续配置项\r\n     * @param {String:warning} actions.Object.color 样式,可选\r\n     * @param {String:warning} actions.Object.bg 背景样式,可选\r\n     * @param {Function} actions.Object.onClick 点击时回调函数\r\n     */\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=\"ipu-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ipu-actions-modal-label' : 'ipu-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ipu-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ipu-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ipu-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=\"ipu-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ipu-actions-modal-group';\r\n        buttonSelector = '.ipu-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    /**\r\n     * @member ipu\r\n     * 悬浮提示消息\r\n     *\r\n     * @param {String} msg 消息文本\r\n     * @param {Number} duration=2000 消息显示时间,单位ms\r\n     */\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ipu-modal ipu-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\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ipu-modal'),\r\n            isNotToast = !modal.hasClass('ipu-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n\r\n        if ($('.ipu-modal.ipu-modal-in:not(.ipu-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\r\n        var isPopup = modal.hasClass('ipu-popup');\r\n        var isLoginScreen = modal.hasClass('ipu-login-screen');\r\n        var isPickerModal = modal.hasClass('ipu-picker-modal');\r\n        var isToast = modal.hasClass('ipu-toast');\r\n\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\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 ($('.ipu-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ipu-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ipu-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ipu-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-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('ipu-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast){\r\n            overlay.addClass('ipu-modal-overlay-visible');\r\n        }\r\n        modal.removeClass('ipu-modal-out').addClass('ipu-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ipu-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\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ipu-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ipu-modal'),\r\n            isPopup = modal.hasClass('ipu-popup'),\r\n            isToast = modal.hasClass('ipu-toast'),\r\n            isLoginScreen = modal.hasClass('ipu-login-screen'),\r\n            isPickerModal = modal.hasClass('ipu-picker-modal'),\r\n            removeOnClose = modal.hasClass('ipu-remove-on-close'),\r\n            overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ipu-popup.ipu-modal-in').length) {\r\n                overlay.removeClass('ipu-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ipu-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('ipu-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ipu-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ipu-modal-in').addClass('ipu-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ipu-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ipu-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ipu-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\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('ipu-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ipu-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ipu-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ipu-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ipu-modal-overlay')) {\r\n            if ($('.ipu-modal.ipu-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ipu-modal.ipu-modal-in');\r\n            if ($('.ipu-actions-modal.ipu-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ipu-actions-modal.ipu-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ipu-popup-overlay')) {\r\n            if ($('.ipu-popup.ipu-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ipu-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ipu-modal-overlay, .ipu-popup-overlay, .ipu-close-popup, .ipu-open-popup, .ipu-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n    /**\r\n     * @class 导航切换组件\r\n     *\r\n     *      @example\r\n\r\n            <!-- 组件的html分成导航和内容两部分,一般与flex栅格配合布局-->\r\n            <!--  组件导航部分 -->\r\n            <nav class=\"ipu-navbar \">\r\n                <a class=\"ipu-navbar-item \" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-home\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">插件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item \" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-dashcube\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">JS组件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item ipu-current\" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-map\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">静态组件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item\" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-mortar-board\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">更多</span>\r\n                </a>\r\n            </nav>\r\n\r\n            <!-- 内容部分 -->\r\n            <div class=\"ipu-nav-content\">\r\n                <ul>\r\n                    <li>\r\n                        自定义内容1\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                </ul>\r\n            </div>\r\n\r\n     *\r\n     * \r\n     * @constructor  不能直接访问该类,调用{@link ipu#navBar ipu.navBar(slt, option)}生成实例\r\n     * @param {String|jqueryObj} slt jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function NavBar(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.content = $(this.option.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(\".ipu-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ipu-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.option.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.option.animate) {\r\n            this.wrapper.addClass(\"ipu-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.option.index);\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption\r\n     * @cfg {Boolean} defaultOption.animate=false 切换时是否添加动画效果\r\n     * @cfg {Dom|String|JqueryObj} defaultOption.contentSlt='.ipu-nav-content' 内容dom选择器,页面有多个navBar组件时,需要设置此值\r\n     * @cfg {Function} defaultOption.callBack 切换时的回调函数\r\n     * @cfg {Number} defaultOption.callBack.index 当前显示项索引\r\n     */\r\n    NavBar.prototype.defaultOption = {\r\n        animate: false,\r\n        contentSlt: \".ipu-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) {\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 显示第几项内容\r\n     * @param {Number} index 显示内容项索引\r\n     */\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            $(this.contents[index]).addClass(\"ipu-show\");\r\n\r\n            if (this.option.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ipu-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(\"ipu-no-animation\").removeClass(\"ipu-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(\"ipu-no-animation\").addClass(\"ipu-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ipu-no-animation\").toggleClass(\"ipu-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ipu-show\");\r\n            }\r\n\r\n            // 更新class,ipu-current状态\r\n            $(this.contents[index]).addClass(\"ipu-current\").siblings(\".ipu-current\").removeClass(\"ipu-current\");\r\n            $(this.navs[index]).addClass(\"ipu-current\").siblings(\".ipu-current\").removeClass(\"ipu-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.option.callBack) {\r\n                this.option.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成NavBar实例,参数信息见{@link NavBar#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {NavBar}\r\n     */\r\n    ipu.navBar = function (slt, option) {\r\n        return new NavBar(slt, option);\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    // 检查是否有ipu-pages的结构\r\n    function checkPages() {\r\n        if(!hasPages){\r\n            pagesObj = $(\".ipu-pages\"); // pagesObj为空则进行jquery取值\r\n            if(pagesObj.size() == 0){\r\n                pagesObj =  $(\"<div class='ipu-pages'><div class='ipu-page ipu-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 = \"ipu-anim ipu-slideRightIn\";\r\n    var animateOutClass  = \"ipu-anim ipu-slideRightOut\";\r\n    var eventName = \"ipuUIPageBack\";\r\n    var zeroPageClass = 'ipu-page-zero';   // 占位页面,对于为当前页面\r\n    var zeroPagesClass = 'ipu-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\r\n\r\n    /**\r\n     * @private\r\n     * @class page 单页面实现功能对象\r\n     * 以iframe加载子页面的方式,页面后退(后退时,后退到a页面,所有在a页面后打开的页面全都关闭)\r\n     * ipu框架在浏览器运行时,使用此对象实现与客户端运行类似的效果\r\n     * 大致实现是当前页面进行处理,所有的后续页面加载都放在一个iframe中,所有页面按加载顺序排序,关闭或后退按页面打开的顺序处理\r\n     */\r\n\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption page组件默认配置项\r\n     * @cfg {Window} defaultOption.target = window.parent 默认执行的窗口对象,子页面调用相关方法,默认都都是在parent窗口执行,需要指定此参数,如顶层父窗口\r\n     * @cfg {Number} defaultOption.backIndex=-1 回退索引,大于0时,正序计算,小于0时,倒序计算,-1即为当页面的上一个页面\r\n     * @cfg {Number} defaultOption.closeIndex 关闭页面索引,参数说明同上\r\n     * @cfg {Object} defaultOption.params Json格式参数,POST方式打开页面时,使用此参数传递参数,暂不支持数组格式参数\r\n     * @cfg {Boolean} defaultOption.animate=true 是否使用动画,打开或回退页面时有效参数\r\n     * @cfg {Boolean} defaultOption.showLoading=true 是否显示加载提示,打开或回退页面时有效参数\r\n     * @cfg {Boolean} defaultOption.loadingMessage='正在加载中' 是否显示加载提示,打开或回退页面时有效参数\r\n     * @cfg defaultOption.data=null 回退页面时,传递给回退到的页面的参数,回退到的页面有设置监听函数时,监听函数可以接收此参数\r\n     * @cfg {String} defaultOption.pageName='' 页面的名称,打开或回退页面时有效参数\r\n     * @cfg {Function} defaultOption.callBack 方法执行结束时的回调函数\r\n     */\r\n    page.defaultOption = {     // 那个窗口执行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, option) {\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(option.showLoading){\r\n            ipu.showPreloader(option.loadingMessage, option.minMessageTime);\r\n        }\r\n\r\n        if(option.method == 'post'){\r\n            newPage = $(\"<div class='ipu-page' id='\"+nowPageNo+\"' data-name='\"+option.pageName+\"'><iframe class='ipu-page-iframe'></iframe></div>\");\r\n        }else{\r\n            newPage = $(\"<div class='ipu-page' id='\"+nowPageNo+\"' data-name='\"+option.pageName+\"'><iframe class='ipu-page-iframe' src='\"+url+\"'></iframe></div>\");\r\n        }\r\n\r\n        var zeroPage = isZeroPage($(\".ipu-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(option.showLoading) {\r\n                ipu.hidePreloader();\r\n            }\r\n\r\n            if(option.animate) {\r\n                animatePage.removeClass(animateInClass);\r\n            }\r\n\r\n            newPage.siblings(\".ipu-show\").removeClass('ipu-show');\r\n            if(option.callBack){\r\n                option.callBack();\r\n            }\r\n        }\r\n\r\n        $(\".ipu-page-iframe\", newPage).one('load', function () {\r\n            newPage.addClass(\"ipu-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\r\n\r\n            if(zeroPage){\r\n                animatePage.removeClass(zeroPagesClass);\r\n            }\r\n            if(option.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(option.method == 'post') {\r\n            var pageDoc = $(\".ipu-page-iframe\", newPage)[0].contentDocument;\r\n            submitForm(pageDoc, url, option.params);\r\n        }\r\n    };\r\n\r\n    // post方式加载页面\r\n    page.postPage = function (url, option) {\r\n        option.method = 'post';\r\n        page.openPage(url, option);\r\n    };\r\n\r\n    // 当前页面后退,针对顶层父窗口\r\n    page.backPage = function (option) {\r\n        var backIndex = option.backIndex;\r\n        var page = null;\r\n        var nowPage = $(\".ipu-page.ipu-show\", pagesObj);\r\n\r\n        if(option.pageName){\r\n            page =  $(\".ipu-page[data-name='\"+option.pageName+\"']:first\", pagesObj);\r\n        }else if(backIndex == 0){\r\n            page = $(\".ipu-page:first\", pagesObj);\r\n        }else { // 越界的情况\r\n            var prevPage = nowPage.prevAll(\".ipu-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(\"ipu-show\"); //显示前一个\r\n        }\r\n\r\n        function end (){\r\n            $(this).removeClass(animateOutClass);\r\n            page.nextAll(\".ipu-page\").remove();\r\n\r\n            var iframe = $(\".ipu-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(option.data){\r\n                evt.data = option.data;\r\n            }\r\n            nowDoc.body.dispatchEvent(evt);\r\n            if(option.callBack){\r\n                option.callBack();\r\n            }\r\n        }\r\n\r\n        if(option.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 (option) {\r\n        var closeIndex = option.closeIndex;\r\n        var prevPage = $(\".ipu-page.ipu-show\", pagesObj).prevAll(\".ipu-page\");\r\n\r\n        if(option.pageName){\r\n            closeIndex =  $(\".ipu-page[data-name='\"+option.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(option.callBack){\r\n            option.callBack();\r\n        }\r\n    };\r\n\r\n    /**\r\n     * get请求的方式加载页面\r\n     *\r\n     * @param {String} url\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.open = function (url, option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.openPage(url, option);\r\n    };\r\n\r\n    /**\r\n     * 使用post方式加载一个新页面\r\n     *\r\n     * @param {String} url 要打开的页面地址\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.post = function (url, option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.method = 'post';\r\n        option.target.ipu.page.openPage(url, option);\r\n    };\r\n\r\n    /**\r\n     * 回退到某个历史页面,可以根据pageName回退,也可根据backIndex回退,默认回退上一个页面\r\n     *\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.back = function (option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.backPage(option);\r\n    };\r\n\r\n    /**\r\n     * 回退到首页\r\n     *\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.backHome = function (option) {\r\n        option = option || {};\r\n        option.backIndex = 0;\r\n        page.back(option);\r\n    };\r\n\r\n    // 子窗口,待确认\r\n    page.close = function (option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.closePage(option);\r\n    };\r\n\r\n    /**\r\n     * 给页面增加一个监听,从其它页面回退到此页面,调用此函数,可以接收其它页面传来的数据\r\n     *\r\n     * @param {Function} back 监听函数\r\n     * @param back.data 其它页面传过来的参数,推荐字符串或Json对象\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不要距离容器太近,是否不应该设置px,使用rem\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\r\n    function toRem(num){\r\n        return num/100;\r\n    }\r\n\r\n    /**\r\n     * @private \r\n     * @class 选择器,被DtPicker和PopPicker使用,实现选择与滚动等基础功能\r\n     *\r\n     * @constructor  初始化方法\r\n     * @param {String|DOM|JQueryObj} slt\r\n     * @param {object} option 组件参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function Picker(slt, option) {\r\n        this.el = $(slt)[0];\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this._init();\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption=\r\n     * @cfg {Boolean} defaultOption.listen=true 是否需要监听变化\r\n     * @cfg {[Object]} defaultOption.data=[] 可选择项数组,每个项须有text属性\r\n     * @cfg {String} defaultOption.data.text 子项展示文本\r\n     * @cfg {Function} defaultOption.onChange=null 选择变化时的回调函数\r\n     * @cfg {Object} defaultOption.onChange.sltItem  选中项\r\n     * @cfg {Number} defaultOption.onChange.newIndex 新的选中项索引\r\n     * @cfg {Number} defaultOption.onChange.oldIndex 旧的选中项索引\r\n     * @cfg {Boolean} defaultOption.onChange.newData 是否为调用setItem()方法触发\r\n     */\r\n    Picker.prototype.defaultOption = {\r\n        listen: true,\r\n        data: [],\r\n        onChange: null\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.option.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\r\n        // 如果是ios,则ul的旋转中心点,样式不同于android\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+toRem(r)+\"rem\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n\r\n        this.setItems(this.option.data);\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        // 处理滚动中,用户点中某项,停止\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\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\r\n    /**\r\n     * 设置选择项\r\n     *\r\n     * @param {[Object]} data 设置项数组\r\n     */\r\n    Picker.prototype.setItems = function (data, textName) {  // textNam字体暂不支持\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; //  是否为新设置数据标记\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(\" + toRem(r) + \"rem) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + toRem(r) + \"rem\"\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\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(\"ipu-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\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    /**\r\n     * 为组件设置新的滚动角度\r\n     *\r\n     * @param {Number} newAngle 新的滚动角度\r\n     * @param {Boolean} endScroll 是否为最终滚动角度,为最终滚动角度时,若索引更新可以触发onChange的回调\r\n     */\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(\"+toRem(1000)+\"rem) 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                if (this.option.onChange && this.listen) {\r\n                    this.option.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n                this.newData = false;\r\n            }\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 计算各子项滚动角度与新的滚动角度的值差异来决定显示的情况\r\n     * 角度大于 90-(itemAngle/2)时,隐藏\r\n     * 角度小于itemAngle/2表示最中心的项,显示并高亮\r\n     * 其它值则表示此项为显示\r\n     *\r\n     * @param {Number} angle 新的滚动角度\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(\"ipu-highlight ipu-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ipu-highlight ipu-visible\");\r\n            } else {\r\n                $(this).addClass(\"ipu-visible\").removeClass(\"ipu-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ipu-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    /**\r\n     * 设置是否监听触发onChange回调\r\n     *\r\n     * @param {Boolean} listen\r\n     */\r\n    Picker.prototype.setListen = function (listen) {\r\n        this.listen = !!listen;\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    /**\r\n     * 设置选中项,若子项的value属性为value,则设置该项为选中项\r\n     *\r\n     * @param value\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     * 获取选中的子项,若子项集为空时,返回空对象\r\n     *\r\n     * @returns {Object}\r\n     */\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    /**\r\n     * 获取选中的子项的value属性\r\n     * @returns\r\n     */\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    /**\r\n     * 返回选中项的text属性\r\n     * @return {String}\r\n     */\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    /**\r\n     * 获取选中项的索引,若子项集为空则返回null\r\n     * @returns {Number}\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    /**\r\n     * @class\r\n     * 原生select的替代实现,适应数据较多或级联的情况\r\n     *\r\n     *      @example\r\n            // 配置项data的数据结构\r\n            var data = [{text:'显示名称', value:''}...];\r\n\r\n            // layer=1的数据结构\r\n            var data-1 = [{text:'湖南', value:'HN'}, {text:'湖北', value:'HB'}];\r\n\r\n            // layer=2时的数据结构,有额外data属性存放下一层级数据\r\n            var data-1 = [\r\n                {\r\n                    text:'湖南',value:'HN', data:[{text:'长沙', value:'CS'}, {text:'湘谭', value:'XT'}]\r\n                },{\r\n                    text:'湖北',value:'HB', data:[{text:'武汉', value:'WH'}, {text:'天门', value:'TM'}]\r\n                }\r\n            ];\r\n\r\n     *\r\n     * @constructor  不能直接访问该类,调用{@link ipu#navBar ipu.popPicker(slt, option)}生成实例\r\n     * @param {String|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function PopPicker(option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.option.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ipu-poppicker-body\", this.holder);\r\n\r\n        var layer = this.option.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.option.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) { // 更新底部的值\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        $(\".ipu-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.option.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.option.btns[1]);\r\n\r\n        $(\".ipu-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.option.btns[0]);\r\n    };\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption\r\n     * @cfg {String} defaultOption.template html结构\r\n     * @cfg {String} defaultOption.pickerTemplate 内容dom选择器\r\n     * @cfg {Object[]} defaultOption.data 选择项数据\r\n     * @cfg {String} defaultOption.data.text 子项展示文本\r\n     * @cfg {*} defaultOption.data.value 子项值\r\n     * @cfg {Object[]} defaultOption.data.data 有更多层级时,此属性存放下一层级的数据\r\n     * @cfg {Number} defaultOption.layer=1 数据层数\r\n     * @cfg {String[]} defaultOption.btns=['取消', '确认'] 按钮文本\r\n     * @cfg {Function} defaultOption.callBack=null 回调函数\r\n     */\r\n    PopPicker.prototype.defaultOption = {\r\n        template: '<div class=\"ipu-poppicker\">'\r\n                        +'<div class=\"ipu-poppicker-header\">'\r\n                            +'<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-cancel\">取消</button>'\r\n                            +'<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-ok\">确定</button>'\r\n                        +'</div>'\r\n                        +'<div class=\"ipu-poppicker-body\">'\r\n                        +'</div>'\r\n                        +'</div>',\r\n        pickerTemplate: '<div class=\"ipu-picker\">'\r\n                            +'<div class=\"ipu-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    /**\r\n     * 设置选择项数据\r\n     *\r\n     * @param{[Object]} data 选择项数组\r\n     * @param {String} data.text 每个选择项的文本\r\n     * @param {[Object]} data.data 如果有多层选择的话,应该有一个data属性\r\n     */\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    /**\r\n     * 显示选择器\r\n     *\r\n     * @param callBack\r\n     */\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.option.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ipu-current\");\r\n    };\r\n\r\n    /**\r\n     * 隐藏选择器\r\n     */\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ipu-current\");\r\n    };\r\n\r\n    /**\r\n     * 获取用户选择的项,如果配置项layer为1,则直接返回选择项,\r\n     * 否则返回一个数组返回每层选中的项\r\n     *\r\n     */\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.option.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.option.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(\"ipu-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    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link PopPicker#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {PopPicker}\r\n     */\r\n    ipu.popPicker = function (option) {\r\n        return new PopPicker(option);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n\r\n    /**\r\n     * @class\r\n     * 进度条\r\n     *\r\n     *      @example\r\n            <!-- 组件html -->\r\n             <div class=\"ipu-ipu-progress \">\r\n                <span class=\"ipu-progressbar\"></span>\r\n             </div>\r\n     *\r\n     *\r\n     * @constructor  不能直接访问该类,调用 {@link ipu#progressBar}生成实例\r\n     * @param {String|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function ProgressBar(id, option) {\r\n        this.id = id;\r\n        this.level = option.level;\r\n        this.progress = option.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (option.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (option.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @cfg defaultOption 刷新组件默认配置\r\n     * @cfg {default|warning|highlight|success} defaultOption.level='default' 级别,显示颜色\r\n     * @cfg {Number} defaultOption.progress=null    当前进度百分比\r\n     *\r\n     */\r\n\r\n    /**\r\n     * 设置百分进度\r\n     *\r\n     * @param {Number} pro\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    /**\r\n     * 获取百分进度\r\n     *\r\n     * @returns {Number|*}\r\n     */\r\n    ProgressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    /**\r\n     * 设置进度条级别\r\n     *\r\n     * @param {default | success | highlight | warning} level\r\n     */\r\n    ProgressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-hightlight ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-highlight ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link ProgressBar#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {ProgressBar}\r\n     */\r\n    ipu.progressBar = function (slt, option) {\r\n        return new ProgressBar(slt, option);\r\n    };\r\n})(ipu || window, jQuery);\r\n","// 设置上下条件长度,或计算函数\r\n// 处理resize的问题,用户主动调用refresh??\r\n// 底部启用或停用时,应该刷新组件iscroll高度\r\n// 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n(function (ipu, $, iScroll) {\r\n    /**\r\n     * @class\r\n     * 通过IScroll.js实现上拉下拉加载\r\n     *\r\n     *      @example\r\n            <!-- 组件html结构,最外层div应有一个固定的高度,会在此元素上初始化iScroll -->\r\n             <div>\r\n                 <div class=\"ipu-refresh-wrapper\">\r\n                    <!-- 此处组件初始化后,会添加上拉html -->\r\n                     <div class=\"refresh-content\">\r\n                        内容区...\r\n                     </div>\r\n                    <!-- 此处组件初始化后,会添加下拉html -->\r\n                 </div>\r\n             </div>\r\n     *\r\n     * @uses IScroll.js\r\n     *\r\n     * @constructor  不能直接访问该类,调用ipu.refresh(slt, option)生成实例\r\n     * @param {String|JqueryObj|Dom} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option\r\n     *      组件参数\r\n     */\r\n    function Refresh(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOption = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ipu-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ipu-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ipu-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ipu-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.iScrollOption = $.extend({}, this.option.iScrollOption, this.iScrollOption);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOption);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    /**\r\n     * @cfg defaultOption 刷新组件默认配置\r\n     * @cfg {Function} defaultOption.bottomLoadFun=null 上拉时,触发底加载的响应函数\r\n     * @cfg {Function} defaultOption.topLoadFun=null    下拉时,触发顶部加载的响应函数\r\n     * @cfg {Boolean} defaultOption.initEnableTop=true   初始化时,是否启用顶部加载功能\r\n     * @cfg {Boolean} defaultOption.initEnableBottom=true   初始化时,是否启用底部加载功能\r\n     * @cfg {String} defaultOption.bottomLoadHtml=...   底部加载时显示的html片段,不建议变动\r\n     * @cfg {String} defaultOption.topLoadHtml=...   顶部加载时显示的html片段,不建议变动\r\n     * @cfg {Number} defaultOption.bottomAddLen=0   距离底部多远时,触发底部加载\r\n     * @cfg {Object} defaultOption.iScrollOption={}   上下拉使用的是IScroll组件,通过此参数配置IScroll初始化的参数\r\n     *\r\n     */\r\n    Refresh.prototype.defaultOption = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ipu-refresh-bottom\"><span class=\"ipu-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ipu-refresh-top\"><span class=\"ipu-refresh-loading\"></span><div class=\"ipu-refresh-arrow\"></div></div>',\r\n        // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n        // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ipu-refresh-top-loading\r\n        // 拖动达到加载距离,则增加class:ipu-refresh-toload\r\n        // 加载中,则增加class:ipu-refresh-top-loading,移除class:ipu-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOption:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ipu-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.option.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.option.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.option.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        /** @property {Boolean} 顶部是否加载中 */\r\n        this.topLoading = false;        // 顶部正在载加载\r\n\r\n        /** @property {Boolean} 底部是否加载中 */\r\n        this.bottomLoading = false;     // 底部正在加载\r\n\r\n        /** @property {Boolean} 底部是否可加载 */\r\n        this.bottomEnable = this.option.initEnableBottom && !!this.option.bottomLoadFun;\r\n\r\n        /** @property {Boolean} 顶部是否可加载 */\r\n        this.topEnable = this.option.initEnableTop && !!this.option.topLoadFun;\r\n\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) {\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) {\r\n            if (this.topEl.hasClass('ipu-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.bottomEnable) {\r\n            if (this.iScroll.maxScrollY >= -this.bottomPullOffset) { // 此处要计算底端的高度\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (!this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.option.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (!this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ipu-refresh-toload').addClass('ipu-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.option.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 结束底部加载,defaultOption.bottomLoadFun中处理完加载后,最后调用此方法\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     * 结束顶部加载,defaultOption.topLoadFun中处理完加载后,最后调用此方法\r\n     */\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ipu-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    /**\r\n     * 是否启动顶部加载功能\r\n     *\r\n     * @param {Boolean} enable\r\n     */\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    /**\r\n     * 是否启用底部加载功能\r\n     *\r\n     * @param {Boolean} enable\r\n     */\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    /**\r\n     * 在内容发生变化时,但是又不是因为顶部加载或底部加载导致的,此时调用此方法刷新IScroll\r\n     */\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link Refresh#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {Refresh}\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\r\n    /**\r\n     * @class\r\n     * tab切换组件功能实现\r\n     *\r\n     *      @example\r\n            <!-- html结构 -->\r\n            <div class=\"ipu-tab\">  <!-- 如果class中添加 ipu-tab-fixed,则可固定头部,此时需要父元素的高度是确定的 -->\r\n                <ul class=\"ipu-tab-title ipu-tab-title-link\"> <!-- 页头有 ipu-tab-title-link 和 ipu-tab-title-button两种样式 -->\r\n                    <li>热门推荐</li>\r\n                    <li class=\"ipu-current\">全部表情</li>  <!-- class为ipu-current为默认选中项 -->\r\n                    <li>表情</li>\r\n                    <li>表情</li>\r\n                </ul>\r\n                <div class=\"ipu-tab-body\">\r\n                    <ul class=\"ipu-tab-body-wrapper\">\r\n                        <li>\r\n                            自定义内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项2内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项3内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项4内容\r\n                        </li>\r\n                    </ul>\r\n                </div>\r\n            </div>\r\n     *\r\n     *\r\n     *\r\n     * @constructor  不能直接访问该类,调用ipu.tab(slt, option)生成实例\r\n     * @param {string|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {object} option\r\n     *      组件参数\r\n     */\r\n    function Tab(slt, option) {\r\n        this.el = $(slt).get(0);\r\n        this.titleItems = $(\".ipu-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ipu-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ipu-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(\".ipu-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    /**\r\n     * 默认配置项\r\n     * @cfg defaultOption = { callBack: function (index) {}};\r\n     * @cfg defaultOption.callBack 切换tab项时的回调函数,参数为显示的项索引\r\n     */\r\n    Tab.prototype.defaultOption = {\r\n        callBack: function (index) {}\r\n    };\r\n\r\n    /**\r\n     * 显示第几项内容\r\n     * @param {number} index 要显示的项索引\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(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n        this.titleItems.eq(index).addClass(\"ipu-current\").siblings().removeClass(\"ipu-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.option.callBack) {\r\n            this.option.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, option) {\r\n        return new Tab(slt, option);\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: 'ipu-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\n        // 初始化代码\r\n        jQuery(function () {\r\n            // 添加一个touchstart空函数,让:active样式可以在ios上生效\r\n            // 新版默认不需要事件好像也可生效\r\n            jQuery(\"body\").on(\"touchstart\",function (e) {});\r\n\r\n            // 处理ios点击延迟问题\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","device.js","dtPicker.js","hammerCarousel.js","modal.js","navBar.js","pages.js","picker.js","popPicker.js","progressBar.js","refresh.js","tab.js","tap.js","ipu-suffix.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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","file":"ipu.js","sourcesContent":["(function () {\n    function setup(jQuery, iScroll, Hammer, FastClick) {\n\n        /**\n         * @class ipu UI的主对象,通过此对象实例UI组件\n         *\n         */\n\n        var ipu = {\n            version: '0.2.1'\n        };\n","(function (ipu, $, iscroll) {\r\n\r\n    /**\r\n     * @deprecated 推荐使用 {@link HammerCarousel}\r\n     * @uses IScroll.js\r\n     * @class 简单封装IScroll.js的snap功能,实现banner功能\r\n     *\r\n     *      @example\r\n     *      <!-- 组件html结构如下,li里内容可自定义 -->\r\n            <div class=\"ipu-carousel ipu-hammer-carousel\">\r\n                <ul class=\"ipu-carousel-wrapper\">\r\n                    <li ><img src=\"../../biz/img/01.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/02.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/03.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/04.jpg\" alt=\"\"></li>\r\n                </ul>\r\n            </div>\r\n     *\r\n     * @constructor 不能直接访问该类,使用ipu.carousel(slt, option)生成实例 {@link ipu#carousel}\r\n     * @param {Dom|JqueryObj|String} slt jquery对象或者jquery选择器或Dom元素\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function Carousel(slt, option) {\r\n        this.option = option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = option.autoPlay;\r\n        this.hasIndicator = option.indicator;\r\n        this.callBack = option.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        /**\r\n         * 组件默认配置项\r\n         *\r\n         * @cfg {Object} defaultOption\r\n         * @cfg {Number} defaultOption.index 默认显示的项\r\n         * @cfg {Boolean} defaultOption.autoPlay 是否自动播放\r\n         * @cfg {Number} defaultOption.duration 自动播放间隔,单位ms\r\n         * @cfg {Boolean} defaultOption.indicator 是否生成指示器\r\n         * @cfg {Function} defaultOption.callBack 切换显示时的回调函数\r\n         * @cfg {Number} defaultOption.callBack.index 当前显示项索引\r\n         *\r\n         */\r\n        defaultOption: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ipu-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            var that = this;\r\n\r\n            if (this.option.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ipu-current\").index();\r\n                this.option.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                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.option.index, 0);\r\n        },\r\n        /**\r\n         * 停止自动播放\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        /**\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        /**\r\n         * 显示下一项\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        /**\r\n         * 显示索引index对应的索\r\n         *\r\n         * @param {Number} 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        /**\r\n         * 开始自动播放\r\n         */\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        /**\r\n         * 若窗口发生大小变更,调用此方法更新位移\r\n         */\r\n        refresh: function () {\r\n            this.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                    that.timeoutId = null;\r\n                    that.next();\r\n                }, that.option.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(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-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='ipu-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    /**\r\n     * @member ipu\r\n     * 生成Carousel实例,参数信息见{@link Carousel#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {Carousel}\r\n     */\r\n    ipu.carousel =  function (slt, option) {\r\n        return new Carousel(slt, option);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n","// todo:添加判断平台如mobile ,tablet, pc,参考其它类似功能库,添加webview判断\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    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    // 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    device.wx = /MicroMessenger/i.test(ua);  // 是否微信\r\n    device.ipu = /ipumobile/i.test(ua);         // 是否ipu环境运行\r\n\r\n    if (device.wx) {\r\n        classNames.push('wx');\r\n    }\r\n    if (device.ipu) {\r\n        classNames.push('ipu');\r\n    }\r\n\r\n    var classPrev = \"ipu-\";\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0) {\r\n        $('html').addClass(classPrev+classNames.join(' '+classPrev));\r\n    }\r\n    \r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n","// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n// show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n// 日期范围的选择处理\r\n// 不选择字符串连接符,合并后占空间\r\n\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来协助运算\r\n\r\n    /**\r\n     * @class 日期选择器,替代默认的web日历选择,日期格式如下<br>\r\n     * type=datetime:yyyy-mm-dd hh:mi<br>\r\n     * type=date:yyyy-mm-dd<br>\r\n     * type=time: hh:mi<br>\r\n     * type=month: yyyy-mm<br>\r\n     * type=hour: yyyy-mm-dd hh<br>\r\n     *\r\n     * @constructor 不能直接访问该,调用{@link ipu#dtPicker}生成实例\r\n     * @param {object} option 组件参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function DtPicker(option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n\r\n        if (!Picker) {\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption=\r\n     * @cfg {String} defaultOption.template 组件模板html,不建议变更\r\n     * @cfg {[String]} defaultOption.buttons=['取消', '确认', '清除'] 按钮名称\r\n     * @cfg {[String]} defaultOption.labels=['年', '月', '日', '时', '分'] 年月日标签\r\n     * @cfg {datetime|time|date|hour|month} defaultOption.type='datetime' 日期类型\r\n     * @cfg {Boolean} defaultOption.hasClear=false 是否显示清除按钮\r\n     * @cfg {Date} defaultOption.beginDate=null 日期开始时间,默认设置为当时间前5年\r\n     * @cfg {Date} defaultOption.endDate=null 日期结束时间,默认设置为开始时间后10年\r\n     * @cfg {Function} defaultOption.callBack=null 点击按钮时的回调函数,回调的参数同{@link #show show()}法设置 的回调\r\n     */\r\n    DtPicker.prototype.defaultOption = {\r\n        template: '<div class=\"ipu-poppicker ipu-dtpicker\">'\r\n        + '<div class=\"ipu-poppicker-header\">'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-cancel\">取消</button>'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-ok\">确定</button>'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-clear\">清除</button>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-poppicker-title\">'\r\n        + '<label class=\"ipu-dtpicker-y\"></label>'\r\n        + '<label class=\"ipu-dtpicker-m\"></label>'\r\n        + '<label class=\"ipu-dtpicker-d\"></label>'\r\n        + '<label class=\"ipu-dtpicker-h\"></label>'\r\n        + '<label class=\"ipu-dtpicker-mi\"></label>'\r\n        + '</div>'\r\n        + '<div>'\r\n        + '<div class=\"ipu-poppicker-body\">'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-y\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-m\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-d\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-h\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-mi\">'\r\n        + '<div class=\"ipu-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',\r\n        customData: {},\r\n        hasClear: false,\r\n        beginDate: null,\r\n        endDate: null,\r\n        callBack: null\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.option.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ipu-poppicker-btn-ok', _picker),\r\n            cancel: $('.ipu-poppicker-btn-cancel', _picker),\r\n            clear: $('.ipu-poppicker-btn-clear', _picker),\r\n            buttons: $('.ipu-poppicker-header .ipu-btn', _picker),\r\n            labels: $('.ipu-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.option.beginMonth || self.option.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.option.beginMonth || self.option.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.option.beginMonth || self.option.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        self._create();\r\n\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.option.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.option.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    /**\r\n     * 返回当前选中的日期,只有在点确认时,返回的才是正确的值,在点清除、或取消后,调用此方法返回的值不可控\r\n     *\r\n     * @return 选择的日期信息\r\n     * @return {datetime|time|date|hour|month} return.type 日期类型\r\n     * @return {String} return.text  日期文本(text字段)拼接,格式yyyy-mm-dd hh:mi 根据上面的日期类型返回对应字符串\r\n     * @return {String} return.value 日期项值(value字段)拼接\r\n     * @return {Object} return.y 选择的年项\r\n     * @return {Object} return.m 选择的月项\r\n     * @return {Object} return.d 选择的日项\r\n     * @return {Object} return.h 选择的时项\r\n     * @return {Object} return.i 选择的分项\r\n     * @return {Function} return.toString 返回value字段的值\r\n     */\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.option.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.option.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    /**\r\n     * 设置日期值,value为字符串时,格式请参照 yyyy-mm-dd hh:mi具体格式与配置项type相关\r\n     *\r\n     * @param {String|Date} value\r\n     */\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    /**\r\n     * 是否润年\r\n     *\r\n     * @param {Number} year 年份\r\n     * @returns {Boolean}\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.option.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.option.beginMonth && this._isBeginYear() && this.option.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.option.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.option.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.option.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.option.endMonth && this._isEndYear() && this.option.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.option.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.option.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (option.customData.y) {\r\n            yArray = option.customData.y;\r\n        } else {\r\n            var yBegin = option.beginYear;\r\n            var yEnd = option.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    };\r\n\r\n    DtPicker.prototype._createMonth = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (option.customData.m) {\r\n            mArray = option.customData.m;\r\n        } else {\r\n            var m = option.beginMonth && self._isBeginYear() ? option.beginMonth : 1;\r\n            var maxMonth = option.endMonth && self._isEndYear() ? option.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    };\r\n\r\n    DtPicker.prototype._createDay = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (option.customData.d) {\r\n            dArray = option.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? option.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? option.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 () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (option.customData.h) {\r\n            hArray = option.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? option.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? option.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 () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (option.customData.i) {\r\n            iArray = option.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? option.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? option.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 option = self.option;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = option.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n        ui.cancel.text(option.buttons[0]);\r\n        ui.ok.text(option.buttons[1]);\r\n\r\n        if (option.hasClear) {\r\n            ui.clear.text(option.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    // 对于time类型时,或未完整的时间值,使用defaultPickerDate来填充\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.option.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                value = 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    // 生成日期数据\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var option = this.option;\r\n        var now = defaultPickerDate;\r\n        var beginDate = option.beginDate;\r\n\r\n        if (beginDate) {  // 若有设置开始日期\r\n            beginDate = this._parseSetValue(beginDate);\r\n            option.beginYear = beginDate.y;\r\n            option.beginMonth = beginDate.m;\r\n            option.beginDay = beginDate.d;\r\n            option.beginHours = beginDate.h;\r\n            option.beginMinutes = beginDate.i;\r\n        } else if (option.type == 'time') { // 未设置开始日期,但日期格式是time\r\n            option.beginYear = now.getFullYear();\r\n            option.beginMonth = now.getMonth() + 1;\r\n            option.beginDay = now.getDate();\r\n            option.beginHours = 0;\r\n            option.beginMinutes = 0;\r\n        } else {\r\n            option.beginYear = now.getFullYear() - 5;   // 其它,未设置开始日期,type也不为time,设置默认起始时间\r\n        }\r\n\r\n        var endDate = option.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            option.endYear = endDate.y;\r\n            option.endMonth = endDate.m;\r\n            option.endDay = endDate.d;\r\n            option.endHours = endDate.h;\r\n            option.endMinutes = endDate.i;\r\n        } else if (option.type == 'time') {\r\n            option.endYear = now.getFullYear();\r\n            option.endMonth = now.getMonth() + 1;\r\n            option.endDay = now.getDate();\r\n            option.endHours = 23;\r\n            option.endMinutes = 59;\r\n        } else {\r\n            option.endYear = option.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     * 设置组件日期范围\r\n     *\r\n     * @param {String|Date} beginDate 开始时间\r\n     * @param {Stirng|Date} endDate 结束时间\r\n     */\r\n    DtPicker.prototype.setDateRange = function (beginDate, endDate) {\r\n        this.option.beginDate = beginDate;\r\n        this.option.endDate = endDate;\r\n        this._create();\r\n    };\r\n\r\n    /**\r\n     * 设置开始组件的开始据时间\r\n     * @param {String|Date} date\r\n     */\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.option.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    /**\r\n     * 设置组件的结束时间\r\n     *\r\n     * @param {String|Date} date\r\n     */\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.option.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    /**\r\n     * 显示组件\r\n     *\r\n     * @param {Function} callBack 点击按钮时的回调函数,设置此参数会覆盖初始化时的回调函数\r\n     * @param {Object} callBack.sltDate 当前选中的日期信息,具体格式,见方法{@link #getSelected getSelected()}的返回\r\n     * @param {Number} callBack.index 被点击的按钮索引,0取消,1确认,2清除\r\n     */\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.option.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ipu-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.option.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    /**\r\n     * 隐藏组件\r\n     */\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ipu-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(\"ipu-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    /**\r\n     * @member ipu\r\n     * 生成DtPicker实例,参数信息见{@link DtPicker#method-constructor}\r\n     *\r\n     * @param {Object} option\r\n     * @returns {DtPicker}\r\n     */\r\n    ipu.dtPicker = function (option) {\r\n        return new DtPicker(option);\r\n    };\r\n})(ipu || window, jQuery);\r\n","// 支持非循环\r\n// 更新方法和属性命名\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容同时显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n// 理想用户不操作时,永远不显示最后复制项,或者各项独立,也可实现类似功能\r\n//indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n// 直接替换掉了prototype对象,可能不是个好选择\r\n\r\n(function (ipu, $, Hammer) {\r\n    /**\r\n     * @class\r\n     * @uses Hammer.js\r\n     * 通过hammer.js实现的banner功能组件,\r\n     * 因为实现轮播,显示第一项后,再显示第一项,所以第一项有被复制到添加到最后\r\n     *\r\n     *      @example\r\n     *      <!-- 组件html结构如下,li里的内容用户可自定义  -->\r\n     *      <div class=\"ipu-carousel ipu-hammer-carousel\">\r\n     *          <ul class=\"ipu-carousel-wrapper\">\r\n     *              <li ><img src=\"../../biz/img/01.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/02.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/03.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/04.jpg\" alt=\"\"></li>\r\n     *          </ul>\r\n     *      </div>\r\n     *\r\n     * @constructor  不能直接访问该类,调用 {@link ipu#hammerCarousel}生成实例\r\n     * @param {String|JqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function HammerCarousel(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    HammerCarousel.prototype = {\r\n        /**\r\n         * 组件默认配置项\r\n         *\r\n         * @cfg {Object} defaultOption\r\n         * @cfg {Number} defaultOption.index 初始化时显示第几项,用户未指定时,会查找子项内容上有ipu-current的项显示,没有则显示第一项\r\n         * @cfg {Boolean} defaultOption.autoPlay 是否自动轮播\r\n         * @cfg {Number} defaultOption.duration 自动轮播时的间隔时间,单位ms\r\n         * @cfg {Boolean} defaultOption.indicator 是否生成banner提示器,true右下角出现小点\r\n         * @cfg {Function} defaultOption.callBack 轮播显示某项时的回调函数\r\n         * @cfg {Number} defaultOption.callBack.index 当前显示的项索引\r\n         * @cfg {Function} defaultOption.clickBack\r\n         *          切换项时被点击时的回调函数,此处主要是为了处理复制项与第一项的点击事件进行处理,\r\n         *          让用户不关注点周是第一项或是复制项,回调作用域为组件对象\r\n         * @cfg {Number} defaultOption.clickBack.index 点击的项索引\r\n         */\r\n        defaultOption: {\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        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ipu-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\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 that = this;\r\n            if (this.option.clickBack) {\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        that.option.clickBack.call(this, i % that.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this._sizeCount();\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.option.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ipu-current\").index();\r\n                this.option.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.option.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.option.index, false);\r\n        },\r\n        /**\r\n         * 停止自动滚动\r\n         */\r\n        stop: function () {\r\n            this._pause();\r\n            this.option.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        /**\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);\r\n        },\r\n        /**\r\n         * 切换到下一项\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);\r\n        },\r\n        /**\r\n         * 切换显示指定项\r\n         *\r\n         * @param {Number} index 要切换到的项索引\r\n         *\r\n         */\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % this.size;\r\n            if (index < 0) {\r\n                index = this.size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        /**\r\n         * 自动轮播\r\n         */\r\n        play: function () {\r\n            this.option.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.option.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.option.duration);\r\n            }\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='ipu-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(\"ipu-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        /**\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, false); //新的位置\r\n            }\r\n        },\r\n        _move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ipu-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(\"ipu-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            this.lastItem = index == this.size;\r\n\r\n            this.moveLen = this.carouselItemSizes[index];\r\n            var move = - this.moveLen + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n\r\n            var currentIndex = this.currentIndex;\r\n            if (animate && this.option.callBack) {\r\n                this.option.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n\r\n            this._play();//处理自动播放\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    /**\r\n     * @member ipu\r\n     * 生成HammerCarousel实例,参数信息见{@link HammerCarousel#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {HammerCarousel}\r\n     */\r\n    ipu.hammerCarousel = function (slt, option) {\r\n        return new HammerCarousel(slt, option);\r\n    };\r\n})(ipu || window, jQuery, Hammer);\r\n","(function (ipu, $) {\r\n\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            /*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        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalTitle: '',\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\r\n    ipu.modal = function (params) {\r\n        params = params || {};\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=\"ipu-modal-button' + (params.buttons[i].bold ? ' ipu-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=\"ipu-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ipu-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ipu-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ipu-modal-buttons-vertical' : '';\r\n\r\n        var modalHTML = '<div class=\"ipu-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ipu-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ipu-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('.ipu-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\r\n    /**\r\n     * @member ipu\r\n     * 弹出警告消息\r\n     *\r\n     * @param {String} text 警句文本\r\n     * @param {String} title 警告标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\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\r\n    /**\r\n     * @member ipu\r\n     * 弹出确认消息\r\n     *\r\n     * @param {String} text 确认文本\r\n     * @param {String} title 确认标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\r\n     * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\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, bold: true, onClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 弹出输入框\r\n     *\r\n     * @param {String} text 输入提示文本\r\n     * @param {String} title 输入提示标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\r\n     * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\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=\"ipu-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('.ipu-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ipu-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    /**\r\n     *  @member ipu\r\n     * 弹出加载消息提示\r\n     *\r\n     * @param {String} title 加载提示文本\r\n     * @param {Number} minTime 消息最小显示时间,单位ms,可选参数\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=\"ipu-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\r\n    /**\r\n     * @member ipu\r\n     * 隐藏加载消息提示\r\n     *\r\n     * @param {Boolean} force 是否强制隐藏,不管最小提示时间,可选\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\r\n    /**\r\n     * @member ipu\r\n     * 显示加载状态\r\n     */\r\n    ipu.showIndicator = function () {\r\n        if ($('.ipu-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ipu-preloader-indicator-overlay\"></div><div class=\"ipu-preloader-indicator-modal\"><span class=\"ipu-preloader ipu-preloader-white\"></span></div>');\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 隐藏加载状态\r\n     */\r\n    ipu.hideIndicator = function () {\r\n        $('.ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal').remove();\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 显示操作选项\r\n     *\r\n     * @param{[[Object]]} actions\r\n     * @param {Object} actions.Object\r\n     * @param {String} actions.Object.text 操作名称\r\n     * @param {Boolean} actions.Object.label 是否标签,非标签就是操作项,操作项有后续的配置,标签项无须后续配置项\r\n     * @param {String:warning} actions.Object.color 样式,可选\r\n     * @param {String:warning} actions.Object.bg 背景样式,可选\r\n     * @param {Function} actions.Object.onClick 点击时回调函数\r\n     */\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=\"ipu-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ipu-actions-modal-label' : 'ipu-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ipu-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ipu-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ipu-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=\"ipu-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ipu-actions-modal-group';\r\n        buttonSelector = '.ipu-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    /**\r\n     * @member ipu\r\n     * 悬浮提示消息\r\n     *\r\n     * @param {String} msg 消息文本\r\n     * @param {Number} duration=2000 消息显示时间,单位ms\r\n     */\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ipu-modal ipu-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\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ipu-modal'),\r\n            isNotToast = !modal.hasClass('ipu-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n\r\n        if ($('.ipu-modal.ipu-modal-in:not(.ipu-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\r\n        var isPopup = modal.hasClass('ipu-popup');\r\n        var isLoginScreen = modal.hasClass('ipu-login-screen');\r\n        var isPickerModal = modal.hasClass('ipu-picker-modal');\r\n        var isToast = modal.hasClass('ipu-toast');\r\n\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\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 ($('.ipu-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ipu-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ipu-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ipu-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-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('ipu-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast){\r\n            overlay.addClass('ipu-modal-overlay-visible');\r\n        }\r\n        modal.removeClass('ipu-modal-out').addClass('ipu-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ipu-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\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ipu-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ipu-modal'),\r\n            isPopup = modal.hasClass('ipu-popup'),\r\n            isToast = modal.hasClass('ipu-toast'),\r\n            isLoginScreen = modal.hasClass('ipu-login-screen'),\r\n            isPickerModal = modal.hasClass('ipu-picker-modal'),\r\n            removeOnClose = modal.hasClass('ipu-remove-on-close'),\r\n            overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ipu-popup.ipu-modal-in').length) {\r\n                overlay.removeClass('ipu-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ipu-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('ipu-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ipu-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ipu-modal-in').addClass('ipu-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ipu-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ipu-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ipu-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\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('ipu-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ipu-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ipu-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ipu-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ipu-modal-overlay')) {\r\n            if ($('.ipu-modal.ipu-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ipu-modal.ipu-modal-in');\r\n            if ($('.ipu-actions-modal.ipu-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ipu-actions-modal.ipu-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ipu-popup-overlay')) {\r\n            if ($('.ipu-popup.ipu-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ipu-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ipu-modal-overlay, .ipu-popup-overlay, .ipu-close-popup, .ipu-open-popup, .ipu-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n    /**\r\n     * @class 导航切换组件\r\n     *\r\n     *      @example\r\n\r\n            <!-- 组件的html分成导航和内容两部分,一般与flex栅格配合布局-->\r\n            <!--  组件导航部分 -->\r\n            <nav class=\"ipu-navbar \">\r\n                <a class=\"ipu-navbar-item \" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-home\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">插件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item \" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-dashcube\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">JS组件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item ipu-current\" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-map\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">静态组件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item\" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-mortar-board\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">更多</span>\r\n                </a>\r\n            </nav>\r\n\r\n            <!-- 内容部分 -->\r\n            <div class=\"ipu-nav-content\">\r\n                <ul>\r\n                    <li>\r\n                        自定义内容1\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                </ul>\r\n            </div>\r\n\r\n     *\r\n     * \r\n     * @constructor  不能直接访问该类,调用{@link ipu#navBar ipu.navBar(slt, option)}生成实例\r\n     * @param {String|jqueryObj} slt jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function NavBar(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.content = $(this.option.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(\".ipu-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ipu-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.option.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.option.animate) {\r\n            this.wrapper.addClass(\"ipu-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.option.index);\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption\r\n     * @cfg {Boolean} defaultOption.animate=false 切换时是否添加动画效果\r\n     * @cfg {Dom|String|JqueryObj} defaultOption.contentSlt='.ipu-nav-content' 内容dom选择器,页面有多个navBar组件时,需要设置此值\r\n     * @cfg {Function} defaultOption.callBack 切换时的回调函数\r\n     * @cfg {Number} defaultOption.callBack.index 当前显示项索引\r\n     */\r\n    NavBar.prototype.defaultOption = {\r\n        animate: false,\r\n        contentSlt: \".ipu-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) {\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 显示第几项内容\r\n     * @param {Number} index 显示内容项索引\r\n     */\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            $(this.contents[index]).addClass(\"ipu-show\");\r\n\r\n            if (this.option.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ipu-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(\"ipu-no-animation\").removeClass(\"ipu-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(\"ipu-no-animation\").addClass(\"ipu-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ipu-no-animation\").toggleClass(\"ipu-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ipu-show\");\r\n            }\r\n\r\n            // 更新class,ipu-current状态\r\n            $(this.contents[index]).addClass(\"ipu-current\").siblings(\".ipu-current\").removeClass(\"ipu-current\");\r\n            $(this.navs[index]).addClass(\"ipu-current\").siblings(\".ipu-current\").removeClass(\"ipu-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.option.callBack) {\r\n                this.option.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成NavBar实例,参数信息见{@link NavBar#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {NavBar}\r\n     */\r\n    ipu.navBar = function (slt, option) {\r\n        return new NavBar(slt, option);\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    // 检查是否有ipu-pages的结构\r\n    function checkPages() {\r\n        if(!hasPages){\r\n            pagesObj = $(\".ipu-pages\"); // pagesObj为空则进行jquery取值\r\n            if(pagesObj.size() == 0){\r\n                pagesObj =  $(\"<div class='ipu-pages'><div class='ipu-page ipu-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 = \"ipu-anim ipu-slideRightIn\";\r\n    var animateOutClass  = \"ipu-anim ipu-slideRightOut\";\r\n    var eventName = \"ipuUIPageBack\";\r\n    var zeroPageClass = 'ipu-page-zero';   // 占位页面,对于为当前页面\r\n    var zeroPagesClass = 'ipu-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\r\n\r\n    /**\r\n     * @private\r\n     * @class page 单页面实现功能对象\r\n     * 以iframe加载子页面的方式,页面后退(后退时,后退到a页面,所有在a页面后打开的页面全都关闭)\r\n     * ipu框架在浏览器运行时,使用此对象实现与客户端运行类似的效果\r\n     * 大致实现是当前页面进行处理,所有的后续页面加载都放在一个iframe中,所有页面按加载顺序排序,关闭或后退按页面打开的顺序处理\r\n     */\r\n\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption page组件默认配置项\r\n     * @cfg {Window} defaultOption.target = window.parent 默认执行的窗口对象,子页面调用相关方法,默认都都是在parent窗口执行,需要指定此参数,如顶层父窗口\r\n     * @cfg {Number} defaultOption.backIndex=-1 回退索引,大于0时,正序计算,小于0时,倒序计算,-1即为当页面的上一个页面\r\n     * @cfg {Number} defaultOption.closeIndex 关闭页面索引,参数说明同上\r\n     * @cfg {Object} defaultOption.params Json格式参数,POST方式打开页面时,使用此参数传递参数,暂不支持数组格式参数\r\n     * @cfg {Boolean} defaultOption.animate=true 是否使用动画,打开或回退页面时有效参数\r\n     * @cfg {Boolean} defaultOption.showLoading=true 是否显示加载提示,打开或回退页面时有效参数\r\n     * @cfg {Boolean} defaultOption.loadingMessage='正在加载中' 是否显示加载提示,打开或回退页面时有效参数\r\n     * @cfg defaultOption.data=null 回退页面时,传递给回退到的页面的参数,回退到的页面有设置监听函数时,监听函数可以接收此参数\r\n     * @cfg {String} defaultOption.pageName='' 页面的名称,打开或回退页面时有效参数\r\n     * @cfg {Function} defaultOption.callBack 方法执行结束时的回调函数\r\n     */\r\n    page.defaultOption = {     // 那个窗口执行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, option) {\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(option.showLoading){\r\n            ipu.showPreloader(option.loadingMessage, option.minMessageTime);\r\n        }\r\n\r\n        if(option.method == 'post'){\r\n            newPage = $(\"<div class='ipu-page' id='\"+nowPageNo+\"' data-name='\"+option.pageName+\"'><iframe class='ipu-page-iframe'></iframe></div>\");\r\n        }else{\r\n            newPage = $(\"<div class='ipu-page' id='\"+nowPageNo+\"' data-name='\"+option.pageName+\"'><iframe class='ipu-page-iframe' src='\"+url+\"'></iframe></div>\");\r\n        }\r\n\r\n        var zeroPage = isZeroPage($(\".ipu-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(option.showLoading) {\r\n                ipu.hidePreloader();\r\n            }\r\n\r\n            if(option.animate) {\r\n                animatePage.removeClass(animateInClass);\r\n            }\r\n\r\n            newPage.siblings(\".ipu-show\").removeClass('ipu-show');\r\n            if(option.callBack){\r\n                option.callBack();\r\n            }\r\n        }\r\n\r\n        $(\".ipu-page-iframe\", newPage).one('load', function () {\r\n            newPage.addClass(\"ipu-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\r\n\r\n            if(zeroPage){\r\n                animatePage.removeClass(zeroPagesClass);\r\n            }\r\n            if(option.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(option.method == 'post') {\r\n            var pageDoc = $(\".ipu-page-iframe\", newPage)[0].contentDocument;\r\n            submitForm(pageDoc, url, option.params);\r\n        }\r\n    };\r\n\r\n    // post方式加载页面\r\n    page.postPage = function (url, option) {\r\n        option.method = 'post';\r\n        page.openPage(url, option);\r\n    };\r\n\r\n    // 当前页面后退,针对顶层父窗口\r\n    page.backPage = function (option) {\r\n        var backIndex = option.backIndex;\r\n        var page = null;\r\n        var nowPage = $(\".ipu-page.ipu-show\", pagesObj);\r\n\r\n        if(option.pageName){\r\n            page =  $(\".ipu-page[data-name='\"+option.pageName+\"']:first\", pagesObj);\r\n        }else if(backIndex == 0){\r\n            page = $(\".ipu-page:first\", pagesObj);\r\n        }else { // 越界的情况\r\n            var prevPage = nowPage.prevAll(\".ipu-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(\"ipu-show\"); //显示前一个\r\n        }\r\n\r\n        function end (){\r\n            $(this).removeClass(animateOutClass);\r\n            page.nextAll(\".ipu-page\").remove();\r\n\r\n            var iframe = $(\".ipu-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(option.data){\r\n                evt.data = option.data;\r\n            }\r\n            nowDoc.body.dispatchEvent(evt);\r\n            if(option.callBack){\r\n                option.callBack();\r\n            }\r\n        }\r\n\r\n        if(option.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 (option) {\r\n        var closeIndex = option.closeIndex;\r\n        var prevPage = $(\".ipu-page.ipu-show\", pagesObj).prevAll(\".ipu-page\");\r\n\r\n        if(option.pageName){\r\n            closeIndex =  $(\".ipu-page[data-name='\"+option.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(option.callBack){\r\n            option.callBack();\r\n        }\r\n    };\r\n\r\n    /**\r\n     * get请求的方式加载页面\r\n     *\r\n     * @param {String} url\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.open = function (url, option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.openPage(url, option);\r\n    };\r\n\r\n    /**\r\n     * 使用post方式加载一个新页面\r\n     *\r\n     * @param {String} url 要打开的页面地址\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.post = function (url, option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.method = 'post';\r\n        option.target.ipu.page.openPage(url, option);\r\n    };\r\n\r\n    /**\r\n     * 回退到某个历史页面,可以根据pageName回退,也可根据backIndex回退,默认回退上一个页面\r\n     *\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.back = function (option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.backPage(option);\r\n    };\r\n\r\n    /**\r\n     * 回退到首页\r\n     *\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.backHome = function (option) {\r\n        option = option || {};\r\n        option.backIndex = 0;\r\n        page.back(option);\r\n    };\r\n\r\n    // 子窗口,待确认\r\n    page.close = function (option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.closePage(option);\r\n    };\r\n\r\n    /**\r\n     * 给页面增加一个监听,从其它页面回退到此页面,调用此函数,可以接收其它页面传来的数据\r\n     *\r\n     * @param {Function} back 监听函数\r\n     * @param back.data 其它页面传过来的参数,推荐字符串或Json对象\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不要距离容器太近,是否不应该设置px,使用rem\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\r\n    function toRem(num){\r\n        return num/100;\r\n    }\r\n\r\n    /**\r\n     * @private \r\n     * @class 选择器,被DtPicker和PopPicker使用,实现选择与滚动等基础功能\r\n     *\r\n     * @constructor  初始化方法\r\n     * @param {String|DOM|JQueryObj} slt\r\n     * @param {object} option 组件参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function Picker(slt, option) {\r\n        this.el = $(slt)[0];\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this._init();\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption=\r\n     * @cfg {Boolean} defaultOption.listen=true 是否需要监听变化\r\n     * @cfg {[Object]} defaultOption.data=[] 可选择项数组,每个项须有text属性\r\n     * @cfg {String} defaultOption.data.text 子项展示文本\r\n     * @cfg {Function} defaultOption.onChange=null 选择变化时的回调函数\r\n     * @cfg {Object} defaultOption.onChange.sltItem  选中项\r\n     * @cfg {Number} defaultOption.onChange.newIndex 新的选中项索引\r\n     * @cfg {Number} defaultOption.onChange.oldIndex 旧的选中项索引\r\n     * @cfg {Boolean} defaultOption.onChange.newData 是否为调用setItem()方法触发\r\n     */\r\n    Picker.prototype.defaultOption = {\r\n        listen: true,\r\n        data: [],\r\n        onChange: null\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.option.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\r\n        // 如果是ios,则ul的旋转中心点,样式不同于android\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+toRem(r)+\"rem\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n\r\n        this.setItems(this.option.data);\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        // 处理滚动中,用户点中某项,停止\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\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\r\n    /**\r\n     * 设置选择项\r\n     *\r\n     * @param {[Object]} data 设置项数组\r\n     */\r\n    Picker.prototype.setItems = function (data, textName) {  // textNam字体暂不支持\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; //  是否为新设置数据标记\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(\" + toRem(r) + \"rem) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + toRem(r) + \"rem\"\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\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(\"ipu-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\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    /**\r\n     * 为组件设置新的滚动角度\r\n     *\r\n     * @param {Number} newAngle 新的滚动角度\r\n     * @param {Boolean} endScroll 是否为最终滚动角度,为最终滚动角度时,若索引更新可以触发onChange的回调\r\n     */\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(\"+toRem(1000)+\"rem) 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                if (this.option.onChange && this.listen) {\r\n                    this.option.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n                this.newData = false;\r\n            }\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 计算各子项滚动角度与新的滚动角度的值差异来决定显示的情况\r\n     * 角度大于 90-(itemAngle/2)时,隐藏\r\n     * 角度小于itemAngle/2表示最中心的项,显示并高亮\r\n     * 其它值则表示此项为显示\r\n     *\r\n     * @param {Number} angle 新的滚动角度\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(\"ipu-highlight ipu-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ipu-highlight ipu-visible\");\r\n            } else {\r\n                $(this).addClass(\"ipu-visible\").removeClass(\"ipu-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ipu-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    /**\r\n     * 设置是否监听触发onChange回调\r\n     *\r\n     * @param {Boolean} listen\r\n     */\r\n    Picker.prototype.setListen = function (listen) {\r\n        this.listen = !!listen;\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    /**\r\n     * 设置选中项,若子项的value属性为value,则设置该项为选中项\r\n     *\r\n     * @param value\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     * 获取选中的子项,若子项集为空时,返回空对象\r\n     *\r\n     * @returns {Object}\r\n     */\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    /**\r\n     * 获取选中的子项的value属性\r\n     * @returns\r\n     */\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    /**\r\n     * 返回选中项的text属性\r\n     * @return {String}\r\n     */\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    /**\r\n     * 获取选中项的索引,若子项集为空则返回null\r\n     * @returns {Number}\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    /**\r\n     * @class\r\n     * 原生select的替代实现,适应数据较多或级联的情况\r\n     *\r\n     *      @example\r\n            // 配置项data的数据结构\r\n            var data = [{text:'显示名称', value:''}...];\r\n\r\n            // layer=1的数据结构\r\n            var data-1 = [{text:'湖南', value:'HN'}, {text:'湖北', value:'HB'}];\r\n\r\n            // layer=2时的数据结构,有额外data属性存放下一层级数据\r\n            var data-1 = [\r\n                {\r\n                    text:'湖南',value:'HN', data:[{text:'长沙', value:'CS'}, {text:'湘谭', value:'XT'}]\r\n                },{\r\n                    text:'湖北',value:'HB', data:[{text:'武汉', value:'WH'}, {text:'天门', value:'TM'}]\r\n                }\r\n            ];\r\n\r\n     *\r\n     * @constructor  不能直接访问该类,调用{@link ipu#navBar ipu.popPicker(slt, option)}生成实例\r\n     * @param {String|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function PopPicker(option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.option.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ipu-poppicker-body\", this.holder);\r\n\r\n        var layer = this.option.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.option.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) { // 更新底部的值\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        $(\".ipu-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.option.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.option.btns[1]);\r\n\r\n        $(\".ipu-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.option.btns[0]);\r\n    };\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption\r\n     * @cfg {String} defaultOption.template html结构\r\n     * @cfg {String} defaultOption.pickerTemplate 内容dom选择器\r\n     * @cfg {Object[]} defaultOption.data 选择项数据\r\n     * @cfg {String} defaultOption.data.text 子项展示文本\r\n     * @cfg {*} defaultOption.data.value 子项值\r\n     * @cfg {Object[]} defaultOption.data.data 有更多层级时,此属性存放下一层级的数据\r\n     * @cfg {Number} defaultOption.layer=1 数据层数\r\n     * @cfg {String[]} defaultOption.btns=['取消', '确认'] 按钮文本\r\n     * @cfg {Function} defaultOption.callBack=null 回调函数\r\n     */\r\n    PopPicker.prototype.defaultOption = {\r\n        template: '<div class=\"ipu-poppicker\">'\r\n                        +'<div class=\"ipu-poppicker-header\">'\r\n                            +'<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-cancel\">取消</button>'\r\n                            +'<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-ok\">确定</button>'\r\n                        +'</div>'\r\n                        +'<div class=\"ipu-poppicker-body\">'\r\n                        +'</div>'\r\n                        +'</div>',\r\n        pickerTemplate: '<div class=\"ipu-picker\">'\r\n                            +'<div class=\"ipu-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    /**\r\n     * 设置选择项数据\r\n     *\r\n     * @param{[Object]} data 选择项数组\r\n     * @param {String} data.text 每个选择项的文本\r\n     * @param {[Object]} data.data 如果有多层选择的话,应该有一个data属性\r\n     */\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    /**\r\n     * 显示选择器\r\n     *\r\n     * @param callBack\r\n     */\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.option.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ipu-current\");\r\n    };\r\n\r\n    /**\r\n     * 隐藏选择器\r\n     */\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ipu-current\");\r\n    };\r\n\r\n    /**\r\n     * 获取用户选择的项,如果配置项layer为1,则直接返回选择项,\r\n     * 否则返回一个数组返回每层选中的项\r\n     *\r\n     */\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.option.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.option.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(\"ipu-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    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link PopPicker#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {PopPicker}\r\n     */\r\n    ipu.popPicker = function (option) {\r\n        return new PopPicker(option);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n","(function (ipu, $) {\r\n\r\n    /**\r\n     * @class\r\n     * 进度条\r\n     *\r\n     *      @example\r\n            <!-- 组件html -->\r\n             <div class=\"ipu-ipu-progress \">\r\n                <span class=\"ipu-progressbar\"></span>\r\n             </div>\r\n     *\r\n     *\r\n     * @constructor  不能直接访问该类,调用 {@link ipu#progressBar}生成实例\r\n     * @param {String|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function ProgressBar(id, option) {\r\n        this.id = id;\r\n        this.level = option.level;\r\n        this.progress = option.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (option.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (option.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @cfg defaultOption 刷新组件默认配置\r\n     * @cfg {default|warning|highlight|success} defaultOption.level='default' 级别,显示颜色\r\n     * @cfg {Number} defaultOption.progress=null    当前进度百分比\r\n     *\r\n     */\r\n\r\n    /**\r\n     * 设置百分进度\r\n     *\r\n     * @param {Number} pro\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    /**\r\n     * 获取百分进度\r\n     *\r\n     * @returns {Number|*}\r\n     */\r\n    ProgressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    /**\r\n     * 设置进度条级别\r\n     *\r\n     * @param {default | success | highlight | warning} level\r\n     */\r\n    ProgressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-hightlight ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-highlight ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link ProgressBar#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {ProgressBar}\r\n     */\r\n    ipu.progressBar = function (slt, option) {\r\n        return new ProgressBar(slt, option);\r\n    };\r\n})(ipu || window, jQuery);\r\n","// 设置上下条件长度,或计算函数\r\n// 处理resize的问题,用户主动调用refresh??\r\n// 底部启用或停用时,应该刷新组件iscroll高度\r\n// 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n(function (ipu, $, iScroll) {\r\n    /**\r\n     * @class\r\n     * 通过IScroll.js实现上拉下拉加载\r\n     *\r\n     *      @example\r\n            <!-- 组件html结构,最外层div应有一个固定的高度,会在此元素上初始化iScroll -->\r\n             <div>\r\n                 <div class=\"ipu-refresh-wrapper\">\r\n                    <!-- 此处组件初始化后,会添加上拉html -->\r\n                     <div class=\"refresh-content\">\r\n                        内容区...\r\n                     </div>\r\n                    <!-- 此处组件初始化后,会添加下拉html -->\r\n                 </div>\r\n             </div>\r\n     *\r\n     * @uses IScroll.js\r\n     *\r\n     * @constructor  不能直接访问该类,调用ipu.refresh(slt, option)生成实例\r\n     * @param {String|JqueryObj|Dom} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option\r\n     *      组件参数\r\n     */\r\n    function Refresh(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOption = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ipu-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ipu-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ipu-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ipu-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.iScrollOption = $.extend({}, this.option.iScrollOption, this.iScrollOption);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOption);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    /**\r\n     * @cfg defaultOption 刷新组件默认配置\r\n     * @cfg {Function} defaultOption.bottomLoadFun=null 上拉时,触发底加载的响应函数\r\n     * @cfg {Function} defaultOption.topLoadFun=null    下拉时,触发顶部加载的响应函数\r\n     * @cfg {Boolean} defaultOption.initEnableTop=true   初始化时,是否启用顶部加载功能\r\n     * @cfg {Boolean} defaultOption.initEnableBottom=true   初始化时,是否启用底部加载功能\r\n     * @cfg {String} defaultOption.bottomLoadHtml=...   底部加载时显示的html片段,不建议变动\r\n     * @cfg {String} defaultOption.topLoadHtml=...   顶部加载时显示的html片段,不建议变动\r\n     * @cfg {Number} defaultOption.bottomAddLen=0   距离底部多远时,触发底部加载\r\n     * @cfg {Object} defaultOption.iScrollOption={}   上下拉使用的是IScroll组件,通过此参数配置IScroll初始化的参数\r\n     *\r\n     */\r\n    Refresh.prototype.defaultOption = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ipu-refresh-bottom\"><span class=\"ipu-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ipu-refresh-top\"><span class=\"ipu-refresh-loading\"></span><div class=\"ipu-refresh-arrow\"></div></div>',\r\n        // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n        // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ipu-refresh-top-loading\r\n        // 拖动达到加载距离,则增加class:ipu-refresh-toload\r\n        // 加载中,则增加class:ipu-refresh-top-loading,移除class:ipu-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOption:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ipu-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.option.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.option.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.option.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        /** @property {Boolean} 顶部是否加载中 */\r\n        this.topLoading = false;        // 顶部正在载加载\r\n\r\n        /** @property {Boolean} 底部是否加载中 */\r\n        this.bottomLoading = false;     // 底部正在加载\r\n\r\n        /** @property {Boolean} 底部是否可加载 */\r\n        this.bottomEnable = this.option.initEnableBottom && !!this.option.bottomLoadFun;\r\n\r\n        /** @property {Boolean} 顶部是否可加载 */\r\n        this.topEnable = this.option.initEnableTop && !!this.option.topLoadFun;\r\n\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) {\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) {\r\n            if (this.topEl.hasClass('ipu-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.bottomEnable) {\r\n            if (this.iScroll.maxScrollY >= -this.bottomPullOffset) { // 此处要计算底端的高度\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (!this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.option.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (!this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ipu-refresh-toload').addClass('ipu-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.option.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 结束底部加载,defaultOption.bottomLoadFun中处理完加载后,最后调用此方法\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     * 结束顶部加载,defaultOption.topLoadFun中处理完加载后,最后调用此方法\r\n     */\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ipu-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    /**\r\n     * 是否启动顶部加载功能\r\n     *\r\n     * @param {Boolean} enable\r\n     */\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    /**\r\n     * 是否启用底部加载功能\r\n     *\r\n     * @param {Boolean} enable\r\n     */\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    /**\r\n     * 在内容发生变化时,但是又不是因为顶部加载或底部加载导致的,此时调用此方法刷新IScroll\r\n     */\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link Refresh#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {Refresh}\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\r\n    /**\r\n     * @class\r\n     * tab切换组件功能实现\r\n     *\r\n     *      @example\r\n            <!-- html结构 -->\r\n            <div class=\"ipu-tab\">  <!-- 如果class中添加 ipu-tab-fixed,则可固定头部,此时需要父元素的高度是确定的 -->\r\n                <ul class=\"ipu-tab-title ipu-tab-title-link\"> <!-- 页头有 ipu-tab-title-link 和 ipu-tab-title-button两种样式 -->\r\n                    <li>热门推荐</li>\r\n                    <li class=\"ipu-current\">全部表情</li>  <!-- class为ipu-current为默认选中项 -->\r\n                    <li>表情</li>\r\n                    <li>表情</li>\r\n                </ul>\r\n                <div class=\"ipu-tab-body\">\r\n                    <ul class=\"ipu-tab-body-wrapper\">\r\n                        <li>\r\n                            自定义内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项2内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项3内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项4内容\r\n                        </li>\r\n                    </ul>\r\n                </div>\r\n            </div>\r\n     *\r\n     *\r\n     *\r\n     * @constructor  不能直接访问该类,调用ipu.tab(slt, option)生成实例\r\n     * @param {string|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {object} option\r\n     *      组件参数\r\n     */\r\n    function Tab(slt, option) {\r\n        this.el = $(slt).get(0);\r\n        this.titleItems = $(\".ipu-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ipu-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ipu-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(\".ipu-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    /**\r\n     * 默认配置项\r\n     * @cfg defaultOption = { callBack: function (index) {}};\r\n     * @cfg defaultOption.callBack 切换tab项时的回调函数,参数为显示的项索引\r\n     */\r\n    Tab.prototype.defaultOption = {\r\n        callBack: function (index) {}\r\n    };\r\n\r\n    /**\r\n     * 显示第几项内容\r\n     * @param {number} index 要显示的项索引\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(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n        this.titleItems.eq(index).addClass(\"ipu-current\").siblings().removeClass(\"ipu-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.option.callBack) {\r\n            this.option.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, option) {\r\n        return new Tab(slt, option);\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: 'ipu-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\n        // 初始化代码\r\n        jQuery(function () {\r\n            // 添加一个touchstart空函数,让:active样式可以在ios上生效\r\n            // 新版默认不需要事件好像也可生效\r\n            jQuery(\"body\").on(\"touchstart\",function (e) {});\r\n\r\n            // 处理ios点击延迟问题\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

@ -1,3 +1,3 @@
1
!function(){function t(t,e,i,o){var n={};return function(t,e,i){function o(t,i){this.option=i=e.extend({},this.defaultOption,i),this.el=e(t).eq(0),this.autoPlay=i.autoPlay,this.hasIndicator=i.indicator,this.callBack=i.callBack,this.currentIndex=null,this._init(),this.play()}o.prototype={defaultOption:{index:null,autoPlay:!1,duration:3e3,indicator:!1,callBack:null},_init:function(){var t=e(">.ipu-carousel-wrapper",this.el),o=e(">li",t);this.carouselItems=o,this.size=o.size();var n=this;if(null==this.option.index){var s=o.filter(".ipu-current").index();this.option.index=s!=-1?s:0}this.hasIndicator&&this._addIndicator(),e(window).resize(function(){n.refresh()});var a={snap:"li",momentum:!1,scrollX:!0,scrollY:!1,hScrollbar:!1,onScrollStart:function(){n._pause()},onTouchEnd:function(){},onScrollEnd:function(){n._end()}};this.iscroll=new i(this.el.get(0),a),this.show(this.option.index,0)},stop:function(){this._pause(),this.autoPlay=!1},_pause:function(){this.autoPlay&&this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null)},prev:function(){var t=0==this.currentIndex?this.size-1:this.currentIndex-1;this.show(t)},next:function(){var t=this.currentIndex==this.size-1?0:this.currentIndex+1;this.show(t)},show:function(t,e){this._pause(),this.iscroll.scrollToPage(t,0,e)},play:function(){this.autoPlay=!0,this._play()},refresh:function(){this.show(this.currentIndex)},_play:function(){if(this.autoPlay&&!this.timeoutId){var t=this;this.timeoutId=setTimeout(function(){t.timeoutId=null,t.next()},t.option.duration)}},_end:function(){var t=this.iscroll.currPageX;t!=this.currentIndex&&(this.callBack&&this.callBack(t,this.currentIndex),this.currentIndex=t,this.hasIndicator&&this.indicatorIndexs.eq(t).addClass("ipu-current").siblings().removeClass("ipu-current"),this.carouselItems.eq(t).addClass("ipu-current").siblings().removeClass("ipu-current")),this._play()},_addIndicator:function(){for(var t="",i=0;i<this.size;i++)t+="<li></li>";t="<ul class='ipu-carousel-indicator'>"+t+"</ul>",this.indicator=e(t).appendTo(this.el),this.indicatorIndexs=e("li",this.indicator)},destroy:function(){this.iscroll.destroy()}},t.carousel=function(t,e){return new o(t,e)}}(n||window,t,e),function(t,e){"use strict";var i={},o=[],n=navigator.userAgent,s=n.match(/(Android);?[\s\/]+([\d.]+)?/),a=n.match(/(iPad).*OS\s([\d_]+)/),r=n.match(/(iPod)(.*OS\s([\d_]+))?/),l=!a&&n.match(/(iPhone\sOS)\s([\d_]+)/);if(i.ios=i.android=i.iphone=i.ipad=i.androidChrome=!1,s&&(i.os="android",i.osVersion=s[2],i.android=!0,i.androidChrome=n.toLowerCase().indexOf("chrome")>=0),(a||l||r)&&(i.os="ios",i.ios=!0),l&&!r&&(i.osVersion=l[2].replace(/_/g,"."),i.iphone=!0),a&&(i.osVersion=a[2].replace(/_/g,"."),i.ipad=!0),r&&(i.osVersion=r[3]?r[3].replace(/_/g,"."):null,i.iphone=!0),i.ios&&i.osVersion&&n.indexOf("Version/")>=0&&"10"===i.osVersion.split(".")[0]&&(i.osVersion=n.toLowerCase().split("version/")[1].split(" ")[0]),i.pixelRatio=window.devicePixelRatio||1,o.push("pixel-ratio-"+Math.floor(i.pixelRatio)),i.pixelRatio>=2&&o.push("retina"),i.os&&(o.push(i.os,i.os+"-"+i.osVersion.split(".")[0],i.os+"-"+i.osVersion.replace(/\./g,"-")),"ios"===i.os))for(var p=parseInt(i.osVersion.split(".")[0],10),u=p-1;u>=6;u--)o.push("ios-gt-"+u);i.wx=/MicroMessenger/i.test(n),i.ipu=/ipumobile/i.test(n),i.wx&&o.push("wx"),i.ipu&&o.push("ipu");var d="ipu-";o.length>0&&e("html").addClass(d+o.join(" "+d)),t.device=i}(n||window,t),function(t,e){function i(i){this.option=e.extend({},this.defaultOption,i),o||(o=t.Picker),this._init()}var o=t.Picker,n=new Date;i.prototype.defaultOption={template:'<div class="ipu-poppicker ipu-dtpicker"><div class="ipu-poppicker-header"><button class="ipu-btn ipu-btn-s ipu-poppicker-btn-cancel">取消</button><button class="ipu-btn ipu-btn-s ipu-poppicker-btn-ok">确定</button><button class="ipu-btn ipu-btn-s ipu-poppicker-btn-clear">清除</button></div><div class="ipu-poppicker-title"><label class="ipu-dtpicker-y"></label><label class="ipu-dtpicker-m"></label><label class="ipu-dtpicker-d"></label><label class="ipu-dtpicker-h"></label><label class="ipu-dtpicker-mi"></label></div><div><div class="ipu-poppicker-body"><div class="ipu-picker" data-id="picker-y"><div class="ipu-picker-selectbox"></div><ul></ul></div><div class="ipu-picker" data-id="picker-m"><div class="ipu-picker-selectbox"></div><ul></ul></div><div class="ipu-picker" data-id="picker-d"><div class="ipu-picker-selectbox"></div><ul></ul></div><div class="ipu-picker" data-id="picker-h"><div class="ipu-picker-selectbox"></div><ul></ul></div><div class="ipu-picker" data-id="picker-mi"><div class="ipu-picker-selectbox"></div><ul></ul></div></div></div>',buttons:["取消","确认","清除"],labels:["年","月","日","时","分"],type:"datetime",customData:{},hasClear:!1,beginDate:null,endDate:null,callBack:null},i.prototype._init=function(){var t=this;this.mask=this.createMask();var i=this.holder=e(this.option.template).appendTo("body"),n=t.ui={picker:this.holder,ok:e(".ipu-poppicker-btn-ok",i),cancel:e(".ipu-poppicker-btn-cancel",i),clear:e(".ipu-poppicker-btn-clear",i),buttons:e(".ipu-poppicker-header .ipu-btn",i),labels:e(".ipu-poppicker-title label",i)};n.i=new o(e('[data-id="picker-mi"]',i),{listen:!1}),n.h=new o(e('[data-id="picker-h"]',i),{listen:!1,onChange:function(e,i){null!==i&&(t.option.beginMonth||t.option.endMonth)&&t._createMinutes()}}),n.d=new o(e('[data-id="picker-d"]',i),{listen:!1,onChange:function(e,i){null!==i&&(t.option.beginMonth||t.option.endMonth)&&t._createHours()}}),n.m=new o(e('[data-id="picker-m"]',i),{listen:!1,onChange:function(e,i){null!==i&&t._createDay()}}),n.y=new o(e('[data-id="picker-y"]',i),{listen:!1,onChange:function(e,i){null!=i&&(t.option.beginMonth||t.option.endMonth?t._createMonth():t._createDay())}}),t._create(),t._setLabels(),t._setButtons(),n.picker.attr("data-type",this.option.type),t._setSelectedValue(this.option.value)},i.prototype.getSelected=function(){var t=this,e=t.ui,i=t.option.type,o={type:i,y:e.y.getSelectedItem(),m:e.m.getSelectedItem(),d:e.d.getSelectedItem(),h:e.h.getSelectedItem(),i:e.i.getSelectedItem(),toString:function(){return this.value}};switch(i){case"datetime":o.value=o.y.value+"-"+o.m.value+"-"+o.d.value+" "+o.h.value+":"+o.i.value,o.text=o.y.text+"-"+o.m.text+"-"+o.d.text+" "+o.h.text+":"+o.i.text;break;case"date":o.value=o.y.value+"-"+o.m.value+"-"+o.d.value,o.text=o.y.text+"-"+o.m.text+"-"+o.d.text;break;case"time":o.value=o.h.value+":"+o.i.value,o.text=o.h.text+":"+o.i.text;break;case"month":o.value=o.y.value+"-"+o.m.value,o.text=o.y.text+"-"+o.m.text;break;case"hour":o.value=o.y.value+"-"+o.m.value+"-"+o.d.value+" "+o.h.value,o.text=o.y.text+"-"+o.m.text+"-"+o.d.text+" "+o.h.text}return o},i.prototype._setSelectedValue=function(t){var e=this,i=e.ui;t||(t="time"==this.option.type?"00:00":n.getFullYear()+"-"+(n.getMonth()+1)+"-"+n.getDate()+" "+n.getHours()+":"+n.getMinutes());var o=e._parseSetValue(t);i.y.setListen(!0),i.m.setListen(!1),i.d.setListen(!1),i.h.setListen(!1),i.i.setListen(!1),i.y.setSelectedValue(o.y),i.m.setListen(!0),i.m.setSelectedValue(o.m),i.d.setListen(!0),i.d.setSelectedValue(o.d),i.h.setListen(!0),i.h.setSelectedValue(o.h),i.i.setListen(!0),i.i.setSelectedValue(o.i),this.value=this.getSelected().value},i.prototype.setSelectedValue=function(t){this._setSelectedValue(t)},i.prototype.isLeapYear=function(t){return t%4==0&&t%100!=0||t%400==0},i.prototype._inArray=function(t,e){for(var i in t){var o=t[i];if(o===e)return!0}return!1},i.prototype.getDayNum=function(t,e){var i=this;return i._inArray([1,3,5,7,8,10,12],e)?31:i._inArray([4,6,9,11],e)?30:i.isLeapYear(t)?29:28},i.prototype._fill=function(t){return t=t.toString(),t.length<2&&(t=0+t),t},i.prototype._isBeginYear=function(){return this.option.beginYear===parseInt(this.ui.y.getSelectedValue())},i.prototype._isBeginMonth=function(){return this.option.beginMonth&&this._isBeginYear()&&this.option.beginMonth===parseInt(this.ui.m.getSelectedValue())},i.prototype._isBeginDay=function(){return this._isBeginMonth()&&this.option.beginDay===parseInt(this.ui.d.getSelectedValue())},i.prototype._isBeginHours=function(){return this._isBeginDay()&&this.option.beginHours===parseInt(this.ui.h.getSelectedValue())},i.prototype._isEndYear=function(){return this.option.endYear===parseInt(this.ui.y.getSelectedValue())},i.prototype._isEndMonth=function(){return this.option.endMonth&&this._isEndYear()&&this.option.endMonth===parseInt(this.ui.m.getSelectedValue())},i.prototype._isEndDay=function(){return this._isEndMonth()&&this.option.endDay===parseInt(this.ui.d.getSelectedValue())},i.prototype._isEndHours=function(){return this._isEndDay()&&this.option.endHours===parseInt(this.ui.h.getSelectedValue())},i.prototype._createYear=function(){var t=this,e=t.option,i=t.ui,o=[];if(e.customData.y)o=e.customData.y;else for(var n=e.beginYear,s=e.endYear,a=n;a<=s;a++)o.push({text:a+"",value:a});i.y.setItems(o)},i.prototype._createMonth=function(){var t=this,e=t.option,i=t.ui,o=[];if(e.customData.m)o=e.customData.m;else for(var n=e.beginMonth&&t._isBeginYear()?e.beginMonth:1,s=e.endMonth&&t._isEndYear()?e.endMonth:12;n<=s;n++){var a=t._fill(n);o.push({text:a,value:n})}i.m.setItems(o)},i.prototype._createDay=function(){var t=this,e=t.option,i=t.ui,o=[];if(e.customData.d)o=e.customData.d;else for(var n=t._isBeginMonth()?e.beginDay:1,s=t._isEndMonth()?e.endDay:t.getDayNum(parseInt(this.ui.y.getSelectedValue()),parseInt(this.ui.m.getSelectedValue()));n<=s;n++){var a=t._fill(n);o.push({text:a,value:n})}i.d.setItems(o)},i.prototype._createHours=function(){var t=this,e=t.option,i=t.ui,o=[];if(e.customData.h)o=e.customData.h;else for(var n=t._isBeginDay()?e.beginHours:0,s=t._isEndDay()?e.endHours:23;n<=s;n++){var a=t._fill(n);o.push({text:a,value:n})}i.h.setItems(o)},i.prototype._createMinutes=function(){var t=this,e=t.option,i=t.ui,o=[];if(e.customData.i)o=e.customData.i;else for(var n=t._isBeginHours()?e.beginMinutes:0,s=t._isEndHours()?e.endMinutes:59;n<=s;n++){var a=t._fill(n);o.push({text:a,value:n})}i.i.setItems(o)},i.prototype._setLabels=function(){var t=this,e=t.option,i=t.ui;i.labels.each(function(t,i){i.innerText=e.labels[t]})},i.prototype._setButtons=function(){var t=this,i=t.option,o=t.ui;o.cancel.text(i.buttons[0]),o.ok.text(i.buttons[1]),i.hasClear?o.clear.text(i.buttons[2]):o.clear.hide(),o.buttons.each(function(i){e(this).click(function(){t.clickCall(i)})})},i.prototype._parseSetValue=function(t){var e=n,i=this.option.type,o={y:e.getFullYear(),m:e.getMonth()+1,d:e.getDate(),h:e.getHours(),i:e.getMinutes()};t instanceof Date&&(t="time"==i?t.getHours()+":"+t.getMinutes():t.getFullYear()+"-"+(t.getMonth()+1)+"-"+t.getDate()+" "+t.getHours()+":"+t.getMinutes());for(var s=t.replace(":","-").replace(" ","-").split("-"),a=0,r=s.length;a<r;a++)s[a]=parseInt(s[a]);return"datetime"==i?(o.y=s[0],o.m=s[1],o.d=s[2],o.h=s[3],o.i=s[4]):"date"==i?(o.y=s[0],o.m=s[1],o.d=s[2],o.h=0,o.i=0):"time"==i?(o.h=s[0],o.i=s[1]):"hour"==i?(o.y=s[0],o.m=s[1],o.d=s[2],o.h=s[3],o.i=0):"month"==i&&(o.y=s[0],o.m=s[1],o.d=1,o.h=0,o.i=0),o},i.prototype._create=function(){var t=this,e=this.option,i=n,o=e.beginDate;o?(o=this._parseSetValue(o),e.beginYear=o.y,e.beginMonth=o.m,e.beginDay=o.d,e.beginHours=o.h,e.beginMinutes=o.i):"time"==e.type?(e.beginYear=i.getFullYear(),e.beginMonth=i.getMonth()+1,e.beginDay=i.getDate(),e.beginHours=0,e.beginMinutes=0):e.beginYear=i.getFullYear()-5;var s=e.endDate;s?(s=this._parseSetValue(s),e.endYear=s.y,e.endMonth=s.m,e.endDay=s.d,e.endHours=s.h,e.endMinutes=s.i):"time"==e.type?(e.endYear=i.getFullYear(),e.endMonth=i.getMonth()+1,e.endDay=i.getDate(),e.endHours=23,e.endMinutes=59):e.endYear=e.beginYear+10,t._createYear(),t._createMonth(),t._createDay(),t._createHours(),t._createMinutes()},i.prototype.setDateRange=function(t,e){this.option.beginDate=t,this.option.endDate=e,this._create()},i.prototype.setBeginDate=function(t){this.option.beginDate=t,this._create()},i.prototype.setEndDate=function(t){this.option.endDate=t,this._create()},i.prototype.dispose=function(){var t=this;t.hide(),setTimeout(function(){t.ui.picker.parentNode.removeChild(t.ui.picker);for(var e in t)t[e]=null,delete t[e];t.disposed=!0},300)},i.prototype.show=function(t){t&&(this.option.callBack=t),this.mask.show(),this.setSelectedValue(this.value),this.holder.addClass("ipu-current")},i.prototype.clickCall=function(t){var e=this,i=e.getSelected(),o=e.option.callBack.call(this,i,t);o!==!1&&(1==t?e.value=i.value:2==t&&(e.value=null),e.hide())},i.prototype.hide=function(){this.mask.close(),this.holder.removeClass("ipu-current")},i.prototype.createMask=function(t){var e=this,i=document.createElement("div");i.classList.add("ipu-picker-backup"),i.addEventListener("click",function(){e.clickCall(0)});var o=[i];return o._show=!1,o.show=function(){return o._show=!0,i.setAttribute("style","opacity:1"),document.body.appendChild(i),o},o._remove=function(){return o._show&&(o._show=!1,i.setAttribute("style","opacity:0"),setTimeout(function(){var t=document.body;i.parentNode===t&&t.removeChild(i)},350)),o},o.close=function(){o._show&&(t?t()!==!1&&o._remove():o._remove())},o},t.dtPicker=function(t){return new i(t)}}(n||window,t),function(t,e,i){function o(t,i){this.option=e.extend({},this.defaultOption,i),this.el=e(t).get(0),this._init()}o.prototype={defaultOption:{index:null,autoPlay:!1,duration:3e3,indicator:!1,callBack:null,clickBack:null},_init:function(){this.wrapper=e(">.ipu-carousel-wrapper",this.el),this.carouselItems=e(">li",this.wrapper),this.showSize=1,this.carouselItemSizes=[],this.currentIndex=0,this.moveLen=0,this.lastItem=!1,this.carouselItems.slice(0,this.showSize).clone().appendTo(this.wrapper),this.size=this.carouselItems.size();var t=this;if(this.option.clickBack&&e(">li",this.wrapper).each(function(i){e(this).click(function(){t.option.clickBack.call(this,i%t.size)})}),this._sizeCount(),this.hammer=new i.Manager(this.el),this.hammer.add(new i.Pan({direction:i.DIRECTION_HORIZONTAL,threshold:10})),this.hammer.on("panstart panmove panend pancancel",i.bindFn(this._onPan,this)),e(window).resize(function(){t.refresh()}),null==this.option.index){var o=this.carouselItems.filter(".ipu-current").index();this.option.index=o!=-1?o:0}this.option.indicator&&this._addIndicator(),this.show(this.option.index,!1)},stop:function(){this._pause(),this.option.autoPlay=!1},_pause:function(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null)},prev:function(){var t=0==this.currentIndex?this.size-1:this.currentIndex-1;t==this.size-1&&(this._show(this.size,!1),this.wrapper.width()),this._show(t)},next:function(){var t=this.currentIndex==this.size?1:this.currentIndex+1;1==t&&(this._show(0,!1),this.wrapper.width()),this._show(t)},show:function(t){var t=t%this.size;t<0&&(t=this.size+t),this._show(t)},play:function(){this.option.autoPlay=!0,this._play()},_play:function(){if(this.option.autoPlay&&!this.timeoutId){var t=this;this.timeoutId=setTimeout(function(){t.timeoutId=null,t.next()},t.option.duration)}},_addIndicator:function(){for(var t="",i=0;i<this.size;i++)t+="<li></li>";t="<ul class='ipu-carousel-indicator'>"+t+"</ul>",this.indicator=e(t).appendTo(this.el),this.indicatorIndexs=e("li",this.indicator)},_sizeCount:function(){this.wrapperSize=this.wrapper.outerWidth(!0),this.itemSize=this.carouselItems.eq(0).outerWidth(!0),this.mostSize=this.size*this.itemSize,e(this.wrapper).removeClass("ipu-carousel-animate").width();var t=this;e(">li",this.wrapper).each(function(i,o){t.carouselItemSizes[i]=e(this).position().left})},refresh:function(){this.wrapperSize!=this.wrapper.outerWidth(!0)&&(this._sizeCount(),this._show(this.currentIndex,!1))},_move:function(t){this._pause(),e(this.wrapper).removeClass("ipu-carousel-animate");var i=(this.moveLen-t)%this.mostSize;i=(i+this.mostSize)%this.mostSize,this.displayMoveLen=i,i=-i+"px",e(this.wrapper).css("transform","translate3d("+i+", 0, 0)")},_show:function(t,i){i!==!1&&(i=!0),this._pause(),e(this.wrapper).toggleClass("ipu-carousel-animate",i),this.currentIndex=t%this.size,this.lastItem=t==this.size,this.moveLen=this.carouselItemSizes[t];var o=-this.moveLen+"px";e(this.wrapper).css("transform","translate3d("+o+", 0, 0)");var n=this.currentIndex;i&&this.option.callBack&&this.option.callBack(n,this.lastItem),this.indicator&&this.indicatorIndexs.eq(n).addClass("ipu-current").siblings().removeClass("ipu-current"),this.carouselItems.eq(n).addClass("ipu-current").siblings().removeClass("ipu-current"),this._play()},_onPan:function(t){var e=t.deltaX;if("panend"==t.type||"pancancel"==t.type){var i=e/this.itemSize,o=parseInt(Math.abs(i)),n=Math.abs(i)%1;n>.2&&(o+=1),i>0&&(o=-o);var s=(this.currentIndex+o)%this.size;s=(s+this.size)%this.size,0==s&&this.displayMoveLen>this.itemSize&&(s=this.size),this._show(s)}else"panmove"==t.type&&this._move(e)}},t.hammerCarousel=function(t,e){return new o(t,e)}}(n||window,t,i),function(t,e){function i(t,e){function i(t){if(t.target===this)for(e.call(this,t),o=0;o<n.length;o++)s.off(n[o],i)}var o,n=t,s=this;if(e)for(o=0;o<n.length;o++)s.on(n[o],i)}function o(i){var o=e(this);o.attr("href");o.hasClass("ipu-modal-overlay")&&(e(".ipu-modal.ipu-modal-in").length>0&&s.modalCloseByOutside&&t.closeModal(".ipu-modal.ipu-modal-in"),e(".ipu-actions-modal.ipu-modal-in").length>0&&s.actionsCloseByOutside&&t.closeModal(".ipu-actions-modal.ipu-modal-in")),o.hasClass("ipu-popup-overlay")&&e(".ipu-popup.ipu-modal-in").length>0&&s.popupCloseByOutside&&t.closeModal(".ipu-popup.modal-in")}e.fn.transitionEnd=function(t){return i.call(this,["webkitTransitionEnd","transitionend"],t),this};var n=document.createElement("div"),s={modalTitle:"",modalStack:!0,modalButtonOk:"确定",modalButtonCancel:"取消",modalPreloaderTitle:"加载中",modalContainer:document.body?document.body:"body"};t.modalStack=[],t.modalStackClearQueue=function(){t.modalStack.length&&t.modalStack.shift()()},t.modal=function(i){i=i||{};var o="";if(i.buttons&&i.buttons.length>0)for(var a=0;a<i.buttons.length;a++)o+='<span class="ipu-modal-button'+(i.buttons[a].bold?" ipu-modal-button-bold":"")+'">'+i.buttons[a].text+"</span>";var r=i.extraClass||"",l=i.title?'<div class="ipu-modal-title">'+i.title+"</div>":"",p=i.text?'<div class="ipu-modal-text">'+i.text+"</div>":"",u=i.afterText?i.afterText:"",d=i.buttons&&0!==i.buttons.length?"":"ipu-modal-no-buttons",c=i.verticalButtons?"ipu-modal-buttons-vertical":"",h='<div class="ipu-modal '+r+" "+d+'"><div class="ipu-modal-inner">'+(l+p+u)+'</div><div class="ipu-modal-buttons '+c+'">'+o+"</div></div>";n.innerHTML=h;var m=e(n).children();return e(s.modalContainer).append(m[0]),m.find(".ipu-modal-button").each(function(o,n){e(n).on("click",function(e){i.buttons[o].close!==!1&&t.closeModal(m),i.buttons[o].onClick&&i.buttons[o].onClick(m,e),i.onClick&&i.onClick(m,o)})}),t.openModal(m),m[0]},t.alert=function(e,i,o){return"function"==typeof i&&(o=arguments[1],i=void 0),t.modal({text:e||"",title:"undefined"==typeof i?s.modalTitle:i,buttons:[{text:s.modalButtonOk,bold:!0,onClick:o}]})},t.confirm=function(e,i,o,n){return"function"==typeof i&&(n=arguments[2],o=arguments[1],i=void 0),t.modal({text:e||"",title:"undefined"==typeof i?s.modalTitle:i,buttons:[{text:s.modalButtonCancel,bold:!0,onClick:n},{text:s.modalButtonOk,bold:!0,onClick:o}]})},t.prompt=function(i,o,n,a){return"function"==typeof o&&(a=arguments[2],n=arguments[1],o=void 0),t.modal({text:i||"",title:"undefined"==typeof o?s.modalTitle:o,afterText:'<input type="text" class="ipu-modal-text-input">',buttons:[{text:s.modalButtonCancel},{text:s.modalButtonOk,bold:!0}],onClick:function(t,i){0===i&&a&&a(e(t).find(".ipu-modal-text-input").val()),1===i&&n&&n(e(t).find(".ipu-modal-text-input").val())}})};var a=!1,r=!1,l=!1,p=null;t.showPreloader=function(e,i){return t.hidePreloader(!0),t.showPreloader.preloaderModal=t.modal({title:e||s.modalPreloaderTitle,text:'<div class="ipu-preloader"></div>'}),i&&(a=!0,p=setTimeout(function(){r=!0,l&&t.hidePreloader()},i)),t.showPreloader.preloaderModal},t.hidePreloader=function(e){e||!a||a&&r?(e&&p&&window.clearTimeout(p),t.showPreloader.preloaderModal&&t.closeModal(t.showPreloader.preloaderModal),a=!1,r=!1,l=!1,p=null):l=!0},t.showIndicator=function(){e(".ipu-preloader-indicator-modal")[0]||e(s.modalContainer).append('<div class="ipu-preloader-indicator-overlay"></div><div class="ipu-preloader-indicator-modal"><span class="ipu-preloader ipu-preloader-white"></span></div>')},t.hideIndicator=function(){e(".ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal").remove()},t.actions=function(i){var o,a,r;i=i||[],i.length>0&&!e.isArray(i[0])&&(i=[i]);for(var l,p="",u=0;u<i.length;u++)for(var d=0;d<i[u].length;d++){0===d&&(p+='<div class="ipu-actions-modal-group">');var c=i[u][d],h=c.label?"ipu-actions-modal-label":"ipu-actions-modal-button";c.bold&&(h+=" ipu-actions-modal-button-bold"),c.color&&(h+=" ipu-color-"+c.color),c.bg&&(h+=" ipu-bg-"+c.bg),c.disabled&&(h+=" disabled"),p+='<span class="'+h+'">'+c.text+"</span>",d===i[u].length-1&&(p+="</div>")}l='<div class="ipu-actions-modal">'+p+"</div>",n.innerHTML=l,o=e(n).children(),e(s.modalContainer).append(o[0]),a=".ipu-actions-modal-group",r=".ipu-actions-modal-button";var m=o.find(a);return m.each(function(n,s){var a=n;e(s).children().each(function(n,s){var l,p=n,u=i[a][p];e(s).is(r)&&(l=e(s)),l&&l.on("click",function(e){u.close!==!1&&t.closeModal(o),u.onClick&&u.onClick(o,e)})})}),t.openModal(o),o[0]},t.toast=function(i,o,n){var s=e('<div class="ipu-modal ipu-toast '+(n||"")+'">'+i+"</div>").appendTo(document.body);t.openModal(s,function(){setTimeout(function(){t.closeModal(s)},o||2e3)})},t.openModal=function(i,o){i=e(i);var n=i.hasClass("ipu-modal"),a=!i.hasClass("ipu-toast");if(a=!1,e(".ipu-modal.ipu-modal-in:not(.ipu-modal-out)").length&&s.modalStack&&n&&a)return void t.modalStack.push(function(){t.openModal(i,o)});var r=i.hasClass("ipu-popup"),l=i.hasClass("ipu-login-screen"),p=i.hasClass("ipu-picker-modal"),u=i.hasClass("ipu-toast");n&&(i.show(),i.css({marginTop:-Math.round(i.outerHeight()/2)+"px"})),u&&i.css({marginLeft:-Math.round(i.outerWidth()/2)+"px"});var d;l||p||u||(0!==e(".ipu-modal-overlay").length||r||e(s.modalContainer).append('<div class="ipu-modal-overlay"></div>'),0===e(".ipu-popup-overlay").length&&r&&e(s.modalContainer).append('<div class="ipu-popup-overlay"></div>'),d=e(r?".ipu-popup-overlay":".ipu-modal-overlay"));i[0].clientLeft;return i.trigger("open"),p&&e(s.modalContainer).addClass("ipu-with-picker-modal"),l||p||u||d.addClass("ipu-modal-overlay-visible"),i.removeClass("ipu-modal-out").addClass("ipu-modal-in").transitionEnd(function(t){i.hasClass("ipu-modal-out")?i.trigger("closed"):i.trigger("opened")}),"function"==typeof o&&o.call(this),!0},t.closeModal=function(i){if(i=e(i||".ipu-modal-in"),"undefined"==typeof i||0!==i.length){var o=i.hasClass("ipu-modal"),n=i.hasClass("ipu-popup"),a=i.hasClass("ipu-toast"),r=i.hasClass("ipu-login-screen"),l=i.hasClass("ipu-picker-modal"),p=i.hasClass("ipu-remove-on-close"),u=e(n?".ipu-popup-overlay":".ipu-modal-overlay");return n?i.length===e(".ipu-popup.ipu-modal-in").length&&u.removeClass("ipu-modal-overlay-visible"):l||a||u.removeClass("ipu-modal-overlay-visible"),i.trigger("close"),l&&(e(s.modalContainer).removeClass("ipu-with-picker-modal"),e(s.modalContainer).addClass("ipu-picker-modal-closing")),i.removeClass("ipu-modal-in").addClass("ipu-modal-out").transitionEnd(function(t){i.hasClass("ipu-modal-out")?i.trigger("closed"):i.trigger("opened"),l&&e(s.modalContainer).removeClass("ipu-picker-modal-closing"),n||r||l?(i.removeClass("ipu-modal-out").hide(),p&&i.length>0&&i.remove()):i.remove()}),o&&s.modalStack&&t.modalStackClearQueue(),!0}},e(document).on("click"," .ipu-modal-overlay, .ipu-popup-overlay, .ipu-close-popup, .ipu-open-popup, .ipu-close-picker",o)}(n||window,t),function(t,e){function i(t,i){this.option=e.extend({},this.defaultOption,i),this.content=e(this.option.contentSlt),this.nav=e(t),this.wrapper=e(">ul",this.content),this.contents=e(">li",this.wrapper),this.navs=e(">a",this.nav);var o=this,n=this.navs.filter(".ipu-current").index();n==-1&&(n=this.contents.filter(".ipu-current").index()),this.option.index=n!=-1?n:0,this.option.animate||this.wrapper.addClass("ipu-no-animation"),this.navs.each(function(t,i){e(this).click(function(){o.show(t)})}),this.lastIndex=null,this.currentIndex=null,o.show(this.option.index)}i.prototype.defaultOption={animate:!1,contentSlt:".ipu-nav-content",callBack:function(t,e){}},i.prototype.show=function(t){this.currentIndex!=t&&(e(this.contents[t]).addClass("ipu-show"),this.option.animate?(null!=this.lastIndex&&this.lastIndex!=t&&e(this.contents[this.lastIndex]).removeClass("ipu-show"),null!=this.currentIndex&&(this.currentIndex<t?null!=this.lastIndex&&this.lastIndex<this.currentIndex&&this.wrapper.addClass("ipu-no-animation").removeClass("ipu-nav-content-right").width():(null==this.lastIndex||this.lastIndex>this.currentIndex)&&this.wrapper.addClass("ipu-no-animation").addClass("ipu-nav-content-right").width(),this.wrapper.removeClass("ipu-no-animation").toggleClass("ipu-nav-content-right"))):e(this.contents[this.currentIndex]).removeClass("ipu-show"),e(this.contents[t]).addClass("ipu-current").siblings(".ipu-current").removeClass("ipu-current"),e(this.navs[t]).addClass("ipu-current").siblings(".ipu-current").removeClass("ipu-current"),this.lastIndex=this.currentIndex,this.currentIndex=t,this.option.callBack&&this.option.callBack(this.currentIndex,this.lastIndex))},t.navBar=function(t,e){return new i(t,e)}}(n||window,t),function(t,e){function i(t,e){function i(t){if(t.target===this)for(e.call(this,t),o=0;o<n.length;o++)s.off(n[o],i)}var o,n=t,s=this;if(e)for(o=0;o<n.length;o++)s.on(n[o],i)}function o(t,e,i){var o=t.createElement("form");o.action=e,o.method="post",o.style.display="none";for(var n in i){var s=t.createElement("input");s.type="hidden",s.name=n,s.value=i[n],o.appendChild(s)}t.body.appendChild(o),o.submit()}function n(){r||(d=e(".ipu-pages"),0==d.size()&&(d=e("<div class='ipu-pages'><div class='ipu-page ipu-show "+f+"' id='"+u+"0'></div>").appendTo("body")),r=!0)}function s(t){return e(t).hasClass(f)}e.fn.animationEnd=function(t){return i.call(this,["webkitAnimationEnd","animationend"],t),this};var a={},r=!1,l={},p=1,u="ipuPage-",d=null,c="ipu-anim ipu-slideRightIn",h="ipu-anim ipu-slideRightOut",m="ipuUIPageBack",f="ipu-page-zero",v="ipu-pages-zero";a.defaultOption={target:window.parent,backIndex:-1,closeIndex:-1,params:{},animate:!0,showLoading:!0,loadingMessage:"正在加载中",method:null,minMessageTime:500,data:null,pageName:"",callBack:function(){}},a.openPage=function(i,a){function r(){a.showLoading&&t.hidePreloader(),a.animate&&g.removeClass(c),h.siblings(".ipu-show").removeClass("ipu-show"),a.callBack&&a.callBack()}var h=null,m=u+p++;l[m]=i,n(),a.showLoading&&t.showPreloader(a.loadingMessage,a.minMessageTime),h=e("post"==a.method?"<div class='ipu-page' id='"+m+"' data-name='"+a.pageName+"'><iframe class='ipu-page-iframe'></iframe></div>":"<div class='ipu-page' id='"+m+"' data-name='"+a.pageName+"'><iframe class='ipu-page-iframe' src='"+i+"'></iframe></div>");var f=s(e(".ipu-page:last",d)),g=h;if(f&&(g=d.addClass(v)),e(".ipu-page-iframe",h).one("load",function(){h.addClass("ipu-show").width(),f&&g.removeClass(v),a.animate?g.addClass(c).animationEnd(r):r()}),h.appendTo(d),"post"==a.method){var b=e(".ipu-page-iframe",h)[0].contentDocument;o(b,i,a.params)}},a.postPage=function(t,e){e.method="post",a.openPage(t,e)},a.backPage=function(t){function i(){e(this).removeClass(h),n.nextAll(".ipu-page").remove();var i,o=e(".ipu-page-iframe",n);i=0==o.size()?window.document:o[0].contentDocument,p&&d.addClass(v);var s=i.createEvent("Event");s.initEvent(m,!0,!0),t.data&&(s.data=t.data),i.body.dispatchEvent(s),t.callBack&&t.callBack()}var o=t.backIndex,n=null,a=e(".ipu-page.ipu-show",d);if(t.pageName)n=e(".ipu-page[data-name='"+t.pageName+"']:first",d);else if(0==o)n=e(".ipu-page:first",d);else{var r=a.prevAll(".ipu-page");n=e(o<0?r[-o-1]:r[r.size()-o])}var l=a,p=s(n);p?l=d:n.addClass("ipu-show"),t.animate?l.addClass(h).animationEnd(i):i()},a.closePage=function(t){var i=t.closeIndex,o=e(".ipu-page.ipu-show",d).prevAll(".ipu-page");i=t.pageName?e(".ipu-page[data-name='"+t.pageName+"']:first",d).index():i<0?-i-1:o.size()-i,e(o[i]).remove(),t.callBack&&t.callBack()},a.open=function(t,i){i=e.extend({},this.defaultOption,i),i.target.ipu.page.openPage(t,i)},a.post=function(t,i){i=e.extend({},this.defaultOption,i),i.method="post",i.target.ipu.page.openPage(t,i)},a.back=function(t){t=e.extend({},this.defaultOption,t),t.target.ipu.page.backPage(t)},a.backHome=function(t){t=t||{},t.backIndex=0,a.back(t)},a.close=function(t){t=e.extend({},this.defaultOption,t),t.target.ipu.page.closePage(t)},a.onBack=function(t){e("body").on(m,function(e){var i=e.originalEvent.data;t(i)})},t.page=a}(n||window,t),function(t,e,i){function o(t){return t/100}function n(t,i){this.el=e(t)[0],this.option=e.extend({},this.defaultOption,i),this._init()}var s=9,a=90,r=180/s,l=r;n.prototype.defaultOption={listen:!0,data:[],onChange:null},n.prototype._init=function(){var n=this;this.wrap=e(">ul",this.el),this.index=null,this.listen=!!this.option.listen,this.beginAngle=0,this.beginExceed=this.beginAngle-l,this.stopInertiaMove=!1,this.lastAngle=null,t.device.ios&&this.wrap.css("transform-origin","center center "+o(a)+"rem"),this.setItems(this.option.data),this.hammer=new i.Manager(this.el),this.hammer.add(new i.Pan({direction:i.DIRECTION_VERTICAL,threshold:5})),this.hammer.add(new i.Press({threshold:4})),this.hammer.on("panstart panmove panend pancancel",i.bindFn(this._onPan,this)),this.hammer.on("press pressup",function(t){this.empty||(n.stopInertiaMove=!0,"pressup"==t.type&&n.endScroll())})},n.prototype.setItems=function(t,i){this.wrap.empty(),this.data=t=t||[],this.empty=0==t.length,this.newData=!0;var n=this,s="";i=i||"text";for(var p=0,u=t.length;p<u;p++)s=s+"<li>"+t[p][i]+"</li>";e(s).appendTo(this.wrap),this.items=e(">li",this.wrap),this.itemsSize=this.items.size(),this.endAngle=(this.empty?0:this.itemsSize-1)*r,this.endExceed=this.endAngle+l,this.items.each(function(t){e(this).css({transform:"translateZ("+o(a)+"rem) rotateX(-"+t*r+"deg)","transform-origin":"center center -"+o(a)+"rem"}),e(this).click(function(){n.stopInertiaMove=!0,n.setAngle(t*r,!0)})});var d;d=this.empty||null==this.index?0:this.index>this.itemsSize-1?(this.itemsSize-1)*r:this.index*r,this.setAngle(d,!0)},n.prototype._onPan=function(t){if(!this.empty)if("panstart"==t.type)self.stopInertiaMove=!0,this.lastAngle=this.angle,this.wrap.addClass("ipu-noanimate"),this.stopInertiaMove=!0;else if("panmove"==t.type){var e=this.calcAngle(t.deltaY),i=this.lastAngle-e;i<this.beginExceed&&(i=this.beginExceed),i>this.endExceed&&(i=this.endExceed),this.setAngle(i)}else{var o=t.overallVelocityY,n=o>0?-1:1,s=6e-4*n*-1,a=Math.abs(o/s),r=o*a/2,l=this.angle,p=-this.calcAngle(r),u=p;if(l+p<this.beginExceed&&(p=this.beginExceed-l,a=a*(p/u)*.6),l+p>this.endExceed&&(p=this.endExceed-l,a=a*(p/u)*.6),0==p)return void this.endScroll();this.scrollDistAngle(l,p,a)}};var p=360/(2*a*Math.PI);n.prototype.calcAngle=function(t){return t*p},n.prototype.setAngle=function(t,e){if(this.angle=t,this.wrap.css("transform","perspective("+o(1e3)+"rem) rotateY(0deg) rotateX("+t+"deg)"),this.calcItemVisable(t),e){var i=t/r,n=this.index;this.index=this.empty?null:i,(n!=i||this.newData)&&(this.option.onChange&&this.listen&&this.option.onChange(this.getSelectedItem(),this.index,n,this.newData),this.newData=!1)}},n.prototype.calcItemVisable=function(t){this.items.each(function(i){var o=Math.abs(i*r-t);o<r/2?e(this).addClass("ipu-highlight ipu-visible"):o>=90-r/2?e(this).removeClass("ipu-highlight ipu-visible"):e(this).addClass("ipu-visible").removeClass("ipu-highlight")})},n.prototype.endScroll=function(){this.wrap.removeClass("ipu-noanimate");var t;if(this.angle<this.beginAngle)t=this.beginAngle;else if(this.angle>this.endAngle)t=this.endAngle;else{var e=parseInt((this.angle/r).toFixed(0));t=r*e}this.setAngle(t,!0)},n.prototype.scrollDistAngle=function(t,e,i){var o=this,n=(new Date).getTime();
1
!function(){function t(t,e,i,o){var n={version:"0.2.1"};return function(t,e,i){function o(t,i){this.option=i=e.extend({},this.defaultOption,i),this.el=e(t).eq(0),this.autoPlay=i.autoPlay,this.hasIndicator=i.indicator,this.callBack=i.callBack,this.currentIndex=null,this._init(),this.play()}o.prototype={defaultOption:{index:null,autoPlay:!1,duration:3e3,indicator:!1,callBack:null},_init:function(){var t=e(">.ipu-carousel-wrapper",this.el),o=e(">li",t);this.carouselItems=o,this.size=o.size();var n=this;if(null==this.option.index){var s=o.filter(".ipu-current").index();this.option.index=s!=-1?s:0}this.hasIndicator&&this._addIndicator(),e(window).resize(function(){n.refresh()});var a={snap:"li",momentum:!1,scrollX:!0,scrollY:!1,hScrollbar:!1,onScrollStart:function(){n._pause()},onTouchEnd:function(){},onScrollEnd:function(){n._end()}};this.iscroll=new i(this.el.get(0),a),this.show(this.option.index,0)},stop:function(){this._pause(),this.autoPlay=!1},_pause:function(){this.autoPlay&&this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null)},prev:function(){var t=0==this.currentIndex?this.size-1:this.currentIndex-1;this.show(t)},next:function(){var t=this.currentIndex==this.size-1?0:this.currentIndex+1;this.show(t)},show:function(t,e){this._pause(),this.iscroll.scrollToPage(t,0,e)},play:function(){this.autoPlay=!0,this._play()},refresh:function(){this.show(this.currentIndex)},_play:function(){if(this.autoPlay&&!this.timeoutId){var t=this;this.timeoutId=setTimeout(function(){t.timeoutId=null,t.next()},t.option.duration)}},_end:function(){var t=this.iscroll.currPageX;t!=this.currentIndex&&(this.callBack&&this.callBack(t,this.currentIndex),this.currentIndex=t,this.hasIndicator&&this.indicatorIndexs.eq(t).addClass("ipu-current").siblings().removeClass("ipu-current"),this.carouselItems.eq(t).addClass("ipu-current").siblings().removeClass("ipu-current")),this._play()},_addIndicator:function(){for(var t="",i=0;i<this.size;i++)t+="<li></li>";t="<ul class='ipu-carousel-indicator'>"+t+"</ul>",this.indicator=e(t).appendTo(this.el),this.indicatorIndexs=e("li",this.indicator)},destroy:function(){this.iscroll.destroy()}},t.carousel=function(t,e){return new o(t,e)}}(n||window,t,e),function(t,e){"use strict";var i={},o=[],n=navigator.userAgent,s=n.match(/(Android);?[\s\/]+([\d.]+)?/),a=n.match(/(iPad).*OS\s([\d_]+)/),r=n.match(/(iPod)(.*OS\s([\d_]+))?/),l=!a&&n.match(/(iPhone\sOS)\s([\d_]+)/);if(i.ios=i.android=i.iphone=i.ipad=i.androidChrome=!1,s&&(i.os="android",i.osVersion=s[2],i.android=!0,i.androidChrome=n.toLowerCase().indexOf("chrome")>=0),(a||l||r)&&(i.os="ios",i.ios=!0),l&&!r&&(i.osVersion=l[2].replace(/_/g,"."),i.iphone=!0),a&&(i.osVersion=a[2].replace(/_/g,"."),i.ipad=!0),r&&(i.osVersion=r[3]?r[3].replace(/_/g,"."):null,i.iphone=!0),i.ios&&i.osVersion&&n.indexOf("Version/")>=0&&"10"===i.osVersion.split(".")[0]&&(i.osVersion=n.toLowerCase().split("version/")[1].split(" ")[0]),i.pixelRatio=window.devicePixelRatio||1,o.push("pixel-ratio-"+Math.floor(i.pixelRatio)),i.pixelRatio>=2&&o.push("retina"),i.os&&(o.push(i.os,i.os+"-"+i.osVersion.split(".")[0],i.os+"-"+i.osVersion.replace(/\./g,"-")),"ios"===i.os))for(var p=parseInt(i.osVersion.split(".")[0],10),u=p-1;u>=6;u--)o.push("ios-gt-"+u);i.wx=/MicroMessenger/i.test(n),i.ipu=/ipumobile/i.test(n),i.wx&&o.push("wx"),i.ipu&&o.push("ipu");var d="ipu-";o.length>0&&e("html").addClass(d+o.join(" "+d)),t.device=i}(n||window,t),function(t,e){function i(i){this.option=e.extend({},this.defaultOption,i),o||(o=t.Picker),this._init()}var o=t.Picker,n=new Date;i.prototype.defaultOption={template:'<div class="ipu-poppicker ipu-dtpicker"><div class="ipu-poppicker-header"><button class="ipu-btn ipu-btn-s ipu-poppicker-btn-cancel">取消</button><button class="ipu-btn ipu-btn-s ipu-poppicker-btn-ok">确定</button><button class="ipu-btn ipu-btn-s ipu-poppicker-btn-clear">清除</button></div><div class="ipu-poppicker-title"><label class="ipu-dtpicker-y"></label><label class="ipu-dtpicker-m"></label><label class="ipu-dtpicker-d"></label><label class="ipu-dtpicker-h"></label><label class="ipu-dtpicker-mi"></label></div><div><div class="ipu-poppicker-body"><div class="ipu-picker" data-id="picker-y"><div class="ipu-picker-selectbox"></div><ul></ul></div><div class="ipu-picker" data-id="picker-m"><div class="ipu-picker-selectbox"></div><ul></ul></div><div class="ipu-picker" data-id="picker-d"><div class="ipu-picker-selectbox"></div><ul></ul></div><div class="ipu-picker" data-id="picker-h"><div class="ipu-picker-selectbox"></div><ul></ul></div><div class="ipu-picker" data-id="picker-mi"><div class="ipu-picker-selectbox"></div><ul></ul></div></div></div>',buttons:["取消","确认","清除"],labels:["年","月","日","时","分"],type:"datetime",customData:{},hasClear:!1,beginDate:null,endDate:null,callBack:null},i.prototype._init=function(){var t=this;this.mask=this.createMask();var i=this.holder=e(this.option.template).appendTo("body"),n=t.ui={picker:this.holder,ok:e(".ipu-poppicker-btn-ok",i),cancel:e(".ipu-poppicker-btn-cancel",i),clear:e(".ipu-poppicker-btn-clear",i),buttons:e(".ipu-poppicker-header .ipu-btn",i),labels:e(".ipu-poppicker-title label",i)};n.i=new o(e('[data-id="picker-mi"]',i),{listen:!1}),n.h=new o(e('[data-id="picker-h"]',i),{listen:!1,onChange:function(e,i){null!==i&&(t.option.beginMonth||t.option.endMonth)&&t._createMinutes()}}),n.d=new o(e('[data-id="picker-d"]',i),{listen:!1,onChange:function(e,i){null!==i&&(t.option.beginMonth||t.option.endMonth)&&t._createHours()}}),n.m=new o(e('[data-id="picker-m"]',i),{listen:!1,onChange:function(e,i){null!==i&&t._createDay()}}),n.y=new o(e('[data-id="picker-y"]',i),{listen:!1,onChange:function(e,i){null!=i&&(t.option.beginMonth||t.option.endMonth?t._createMonth():t._createDay())}}),t._create(),t._setLabels(),t._setButtons(),n.picker.attr("data-type",this.option.type),t._setSelectedValue(this.option.value)},i.prototype.getSelected=function(){var t=this,e=t.ui,i=t.option.type,o={type:i,y:e.y.getSelectedItem(),m:e.m.getSelectedItem(),d:e.d.getSelectedItem(),h:e.h.getSelectedItem(),i:e.i.getSelectedItem(),toString:function(){return this.value}};switch(i){case"datetime":o.value=o.y.value+"-"+o.m.value+"-"+o.d.value+" "+o.h.value+":"+o.i.value,o.text=o.y.text+"-"+o.m.text+"-"+o.d.text+" "+o.h.text+":"+o.i.text;break;case"date":o.value=o.y.value+"-"+o.m.value+"-"+o.d.value,o.text=o.y.text+"-"+o.m.text+"-"+o.d.text;break;case"time":o.value=o.h.value+":"+o.i.value,o.text=o.h.text+":"+o.i.text;break;case"month":o.value=o.y.value+"-"+o.m.value,o.text=o.y.text+"-"+o.m.text;break;case"hour":o.value=o.y.value+"-"+o.m.value+"-"+o.d.value+" "+o.h.value,o.text=o.y.text+"-"+o.m.text+"-"+o.d.text+" "+o.h.text}return o},i.prototype._setSelectedValue=function(t){var e=this,i=e.ui;t||(t="time"==this.option.type?"00:00":n.getFullYear()+"-"+(n.getMonth()+1)+"-"+n.getDate()+" "+n.getHours()+":"+n.getMinutes());var o=e._parseSetValue(t);i.y.setListen(!0),i.m.setListen(!1),i.d.setListen(!1),i.h.setListen(!1),i.i.setListen(!1),i.y.setSelectedValue(o.y),i.m.setListen(!0),i.m.setSelectedValue(o.m),i.d.setListen(!0),i.d.setSelectedValue(o.d),i.h.setListen(!0),i.h.setSelectedValue(o.h),i.i.setListen(!0),i.i.setSelectedValue(o.i),this.value=this.getSelected().value},i.prototype.setSelectedValue=function(t){this._setSelectedValue(t)},i.prototype.isLeapYear=function(t){return t%4==0&&t%100!=0||t%400==0},i.prototype._inArray=function(t,e){for(var i in t){var o=t[i];if(o===e)return!0}return!1},i.prototype.getDayNum=function(t,e){var i=this;return i._inArray([1,3,5,7,8,10,12],e)?31:i._inArray([4,6,9,11],e)?30:i.isLeapYear(t)?29:28},i.prototype._fill=function(t){return t=t.toString(),t.length<2&&(t=0+t),t},i.prototype._isBeginYear=function(){return this.option.beginYear===parseInt(this.ui.y.getSelectedValue())},i.prototype._isBeginMonth=function(){return this.option.beginMonth&&this._isBeginYear()&&this.option.beginMonth===parseInt(this.ui.m.getSelectedValue())},i.prototype._isBeginDay=function(){return this._isBeginMonth()&&this.option.beginDay===parseInt(this.ui.d.getSelectedValue())},i.prototype._isBeginHours=function(){return this._isBeginDay()&&this.option.beginHours===parseInt(this.ui.h.getSelectedValue())},i.prototype._isEndYear=function(){return this.option.endYear===parseInt(this.ui.y.getSelectedValue())},i.prototype._isEndMonth=function(){return this.option.endMonth&&this._isEndYear()&&this.option.endMonth===parseInt(this.ui.m.getSelectedValue())},i.prototype._isEndDay=function(){return this._isEndMonth()&&this.option.endDay===parseInt(this.ui.d.getSelectedValue())},i.prototype._isEndHours=function(){return this._isEndDay()&&this.option.endHours===parseInt(this.ui.h.getSelectedValue())},i.prototype._createYear=function(){var t=this,e=t.option,i=t.ui,o=[];if(e.customData.y)o=e.customData.y;else for(var n=e.beginYear,s=e.endYear,a=n;a<=s;a++)o.push({text:a+"",value:a});i.y.setItems(o)},i.prototype._createMonth=function(){var t=this,e=t.option,i=t.ui,o=[];if(e.customData.m)o=e.customData.m;else for(var n=e.beginMonth&&t._isBeginYear()?e.beginMonth:1,s=e.endMonth&&t._isEndYear()?e.endMonth:12;n<=s;n++){var a=t._fill(n);o.push({text:a,value:n})}i.m.setItems(o)},i.prototype._createDay=function(){var t=this,e=t.option,i=t.ui,o=[];if(e.customData.d)o=e.customData.d;else for(var n=t._isBeginMonth()?e.beginDay:1,s=t._isEndMonth()?e.endDay:t.getDayNum(parseInt(this.ui.y.getSelectedValue()),parseInt(this.ui.m.getSelectedValue()));n<=s;n++){var a=t._fill(n);o.push({text:a,value:n})}i.d.setItems(o)},i.prototype._createHours=function(){var t=this,e=t.option,i=t.ui,o=[];if(e.customData.h)o=e.customData.h;else for(var n=t._isBeginDay()?e.beginHours:0,s=t._isEndDay()?e.endHours:23;n<=s;n++){var a=t._fill(n);o.push({text:a,value:n})}i.h.setItems(o)},i.prototype._createMinutes=function(){var t=this,e=t.option,i=t.ui,o=[];if(e.customData.i)o=e.customData.i;else for(var n=t._isBeginHours()?e.beginMinutes:0,s=t._isEndHours()?e.endMinutes:59;n<=s;n++){var a=t._fill(n);o.push({text:a,value:n})}i.i.setItems(o)},i.prototype._setLabels=function(){var t=this,e=t.option,i=t.ui;i.labels.each(function(t,i){i.innerText=e.labels[t]})},i.prototype._setButtons=function(){var t=this,i=t.option,o=t.ui;o.cancel.text(i.buttons[0]),o.ok.text(i.buttons[1]),i.hasClear?o.clear.text(i.buttons[2]):o.clear.hide(),o.buttons.each(function(i){e(this).click(function(){t.clickCall(i)})})},i.prototype._parseSetValue=function(t){var e=n,i=this.option.type,o={y:e.getFullYear(),m:e.getMonth()+1,d:e.getDate(),h:e.getHours(),i:e.getMinutes()};t instanceof Date&&(t="time"==i?t.getHours()+":"+t.getMinutes():t.getFullYear()+"-"+(t.getMonth()+1)+"-"+t.getDate()+" "+t.getHours()+":"+t.getMinutes());for(var s=t.replace(":","-").replace(" ","-").split("-"),a=0,r=s.length;a<r;a++)s[a]=parseInt(s[a]);return"datetime"==i?(o.y=s[0],o.m=s[1],o.d=s[2],o.h=s[3],o.i=s[4]):"date"==i?(o.y=s[0],o.m=s[1],o.d=s[2],o.h=0,o.i=0):"time"==i?(o.h=s[0],o.i=s[1]):"hour"==i?(o.y=s[0],o.m=s[1],o.d=s[2],o.h=s[3],o.i=0):"month"==i&&(o.y=s[0],o.m=s[1],o.d=1,o.h=0,o.i=0),o},i.prototype._create=function(){var t=this,e=this.option,i=n,o=e.beginDate;o?(o=this._parseSetValue(o),e.beginYear=o.y,e.beginMonth=o.m,e.beginDay=o.d,e.beginHours=o.h,e.beginMinutes=o.i):"time"==e.type?(e.beginYear=i.getFullYear(),e.beginMonth=i.getMonth()+1,e.beginDay=i.getDate(),e.beginHours=0,e.beginMinutes=0):e.beginYear=i.getFullYear()-5;var s=e.endDate;s?(s=this._parseSetValue(s),e.endYear=s.y,e.endMonth=s.m,e.endDay=s.d,e.endHours=s.h,e.endMinutes=s.i):"time"==e.type?(e.endYear=i.getFullYear(),e.endMonth=i.getMonth()+1,e.endDay=i.getDate(),e.endHours=23,e.endMinutes=59):e.endYear=e.beginYear+10,t._createYear(),t._createMonth(),t._createDay(),t._createHours(),t._createMinutes()},i.prototype.setDateRange=function(t,e){this.option.beginDate=t,this.option.endDate=e,this._create()},i.prototype.setBeginDate=function(t){this.option.beginDate=t,this._create()},i.prototype.setEndDate=function(t){this.option.endDate=t,this._create()},i.prototype.dispose=function(){var t=this;t.hide(),setTimeout(function(){t.ui.picker.parentNode.removeChild(t.ui.picker);for(var e in t)t[e]=null,delete t[e];t.disposed=!0},300)},i.prototype.show=function(t){t&&(this.option.callBack=t),this.mask.show(),this.setSelectedValue(this.value),this.holder.addClass("ipu-current")},i.prototype.clickCall=function(t){var e=this,i=e.getSelected(),o=e.option.callBack.call(this,i,t);o!==!1&&(1==t?e.value=i.value:2==t&&(e.value=null),e.hide())},i.prototype.hide=function(){this.mask.close(),this.holder.removeClass("ipu-current")},i.prototype.createMask=function(t){var e=this,i=document.createElement("div");i.classList.add("ipu-picker-backup"),i.addEventListener("click",function(){e.clickCall(0)});var o=[i];return o._show=!1,o.show=function(){return o._show=!0,i.setAttribute("style","opacity:1"),document.body.appendChild(i),o},o._remove=function(){return o._show&&(o._show=!1,i.setAttribute("style","opacity:0"),setTimeout(function(){var t=document.body;i.parentNode===t&&t.removeChild(i)},350)),o},o.close=function(){o._show&&(t?t()!==!1&&o._remove():o._remove())},o},t.dtPicker=function(t){return new i(t)}}(n||window,t),function(t,e,i){function o(t,i){this.option=e.extend({},this.defaultOption,i),this.el=e(t).get(0),this._init()}o.prototype={defaultOption:{index:null,autoPlay:!1,duration:3e3,indicator:!1,callBack:null,clickBack:null},_init:function(){this.wrapper=e(">.ipu-carousel-wrapper",this.el),this.carouselItems=e(">li",this.wrapper),this.showSize=1,this.carouselItemSizes=[],this.currentIndex=0,this.moveLen=0,this.lastItem=!1,this.carouselItems.slice(0,this.showSize).clone().appendTo(this.wrapper),this.size=this.carouselItems.size();var t=this;if(this.option.clickBack&&e(">li",this.wrapper).each(function(i){e(this).click(function(){t.option.clickBack.call(this,i%t.size)})}),this._sizeCount(),this.hammer=new i.Manager(this.el),this.hammer.add(new i.Pan({direction:i.DIRECTION_HORIZONTAL,threshold:10})),this.hammer.on("panstart panmove panend pancancel",i.bindFn(this._onPan,this)),e(window).resize(function(){t.refresh()}),null==this.option.index){var o=this.carouselItems.filter(".ipu-current").index();this.option.index=o!=-1?o:0}this.option.indicator&&this._addIndicator(),this.show(this.option.index,!1)},stop:function(){this._pause(),this.option.autoPlay=!1},_pause:function(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null)},prev:function(){var t=0==this.currentIndex?this.size-1:this.currentIndex-1;t==this.size-1&&(this._show(this.size,!1),this.wrapper.width()),this._show(t)},next:function(){var t=this.currentIndex==this.size?1:this.currentIndex+1;1==t&&(this._show(0,!1),this.wrapper.width()),this._show(t)},show:function(t){var t=t%this.size;t<0&&(t=this.size+t),this._show(t)},play:function(){this.option.autoPlay=!0,this._play()},_play:function(){if(this.option.autoPlay&&!this.timeoutId){var t=this;this.timeoutId=setTimeout(function(){t.timeoutId=null,t.next()},t.option.duration)}},_addIndicator:function(){for(var t="",i=0;i<this.size;i++)t+="<li></li>";t="<ul class='ipu-carousel-indicator'>"+t+"</ul>",this.indicator=e(t).appendTo(this.el),this.indicatorIndexs=e("li",this.indicator)},_sizeCount:function(){this.wrapperSize=this.wrapper.outerWidth(!0),this.itemSize=this.carouselItems.eq(0).outerWidth(!0),this.mostSize=this.size*this.itemSize,e(this.wrapper).removeClass("ipu-carousel-animate").width();var t=this;e(">li",this.wrapper).each(function(i,o){t.carouselItemSizes[i]=e(this).position().left})},refresh:function(){this.wrapperSize!=this.wrapper.outerWidth(!0)&&(this._sizeCount(),this._show(this.currentIndex,!1))},_move:function(t){this._pause(),e(this.wrapper).removeClass("ipu-carousel-animate");var i=(this.moveLen-t)%this.mostSize;i=(i+this.mostSize)%this.mostSize,this.displayMoveLen=i,i=-i+"px",e(this.wrapper).css("transform","translate3d("+i+", 0, 0)")},_show:function(t,i){i!==!1&&(i=!0),this._pause(),e(this.wrapper).toggleClass("ipu-carousel-animate",i),this.currentIndex=t%this.size,this.lastItem=t==this.size,this.moveLen=this.carouselItemSizes[t];var o=-this.moveLen+"px";e(this.wrapper).css("transform","translate3d("+o+", 0, 0)");var n=this.currentIndex;i&&this.option.callBack&&this.option.callBack(n,this.lastItem),this.indicator&&this.indicatorIndexs.eq(n).addClass("ipu-current").siblings().removeClass("ipu-current"),this.carouselItems.eq(n).addClass("ipu-current").siblings().removeClass("ipu-current"),this._play()},_onPan:function(t){var e=t.deltaX;if("panend"==t.type||"pancancel"==t.type){var i=e/this.itemSize,o=parseInt(Math.abs(i)),n=Math.abs(i)%1;n>.2&&(o+=1),i>0&&(o=-o);var s=(this.currentIndex+o)%this.size;s=(s+this.size)%this.size,0==s&&this.displayMoveLen>this.itemSize&&(s=this.size),this._show(s)}else"panmove"==t.type&&this._move(e)}},t.hammerCarousel=function(t,e){return new o(t,e)}}(n||window,t,i),function(t,e){function i(t,e){function i(t){if(t.target===this)for(e.call(this,t),o=0;o<n.length;o++)s.off(n[o],i)}var o,n=t,s=this;if(e)for(o=0;o<n.length;o++)s.on(n[o],i)}function o(i){var o=e(this);o.attr("href");o.hasClass("ipu-modal-overlay")&&(e(".ipu-modal.ipu-modal-in").length>0&&s.modalCloseByOutside&&t.closeModal(".ipu-modal.ipu-modal-in"),e(".ipu-actions-modal.ipu-modal-in").length>0&&s.actionsCloseByOutside&&t.closeModal(".ipu-actions-modal.ipu-modal-in")),o.hasClass("ipu-popup-overlay")&&e(".ipu-popup.ipu-modal-in").length>0&&s.popupCloseByOutside&&t.closeModal(".ipu-popup.modal-in")}e.fn.transitionEnd=function(t){return i.call(this,["webkitTransitionEnd","transitionend"],t),this};var n=document.createElement("div"),s={modalTitle:"",modalStack:!0,modalButtonOk:"确定",modalButtonCancel:"取消",modalPreloaderTitle:"加载中",modalContainer:document.body?document.body:"body"};t.modalStack=[],t.modalStackClearQueue=function(){t.modalStack.length&&t.modalStack.shift()()},t.modal=function(i){i=i||{};var o="";if(i.buttons&&i.buttons.length>0)for(var a=0;a<i.buttons.length;a++)o+='<span class="ipu-modal-button'+(i.buttons[a].bold?" ipu-modal-button-bold":"")+'">'+i.buttons[a].text+"</span>";var r=i.extraClass||"",l=i.title?'<div class="ipu-modal-title">'+i.title+"</div>":"",p=i.text?'<div class="ipu-modal-text">'+i.text+"</div>":"",u=i.afterText?i.afterText:"",d=i.buttons&&0!==i.buttons.length?"":"ipu-modal-no-buttons",c=i.verticalButtons?"ipu-modal-buttons-vertical":"",h='<div class="ipu-modal '+r+" "+d+'"><div class="ipu-modal-inner">'+(l+p+u)+'</div><div class="ipu-modal-buttons '+c+'">'+o+"</div></div>";n.innerHTML=h;var m=e(n).children();return e(s.modalContainer).append(m[0]),m.find(".ipu-modal-button").each(function(o,n){e(n).on("click",function(e){i.buttons[o].close!==!1&&t.closeModal(m),i.buttons[o].onClick&&i.buttons[o].onClick(m,e),i.onClick&&i.onClick(m,o)})}),t.openModal(m),m[0]},t.alert=function(e,i,o){return"function"==typeof i&&(o=arguments[1],i=void 0),t.modal({text:e||"",title:"undefined"==typeof i?s.modalTitle:i,buttons:[{text:s.modalButtonOk,bold:!0,onClick:o}]})},t.confirm=function(e,i,o,n){return"function"==typeof i&&(n=arguments[2],o=arguments[1],i=void 0),t.modal({text:e||"",title:"undefined"==typeof i?s.modalTitle:i,buttons:[{text:s.modalButtonCancel,bold:!0,onClick:n},{text:s.modalButtonOk,bold:!0,onClick:o}]})},t.prompt=function(i,o,n,a){return"function"==typeof o&&(a=arguments[2],n=arguments[1],o=void 0),t.modal({text:i||"",title:"undefined"==typeof o?s.modalTitle:o,afterText:'<input type="text" class="ipu-modal-text-input">',buttons:[{text:s.modalButtonCancel},{text:s.modalButtonOk,bold:!0}],onClick:function(t,i){0===i&&a&&a(e(t).find(".ipu-modal-text-input").val()),1===i&&n&&n(e(t).find(".ipu-modal-text-input").val())}})};var a=!1,r=!1,l=!1,p=null;t.showPreloader=function(e,i){return t.hidePreloader(!0),t.showPreloader.preloaderModal=t.modal({title:e||s.modalPreloaderTitle,text:'<div class="ipu-preloader"></div>'}),i&&(a=!0,p=setTimeout(function(){r=!0,l&&t.hidePreloader()},i)),t.showPreloader.preloaderModal},t.hidePreloader=function(e){e||!a||a&&r?(e&&p&&window.clearTimeout(p),t.showPreloader.preloaderModal&&t.closeModal(t.showPreloader.preloaderModal),a=!1,r=!1,l=!1,p=null):l=!0},t.showIndicator=function(){e(".ipu-preloader-indicator-modal")[0]||e(s.modalContainer).append('<div class="ipu-preloader-indicator-overlay"></div><div class="ipu-preloader-indicator-modal"><span class="ipu-preloader ipu-preloader-white"></span></div>')},t.hideIndicator=function(){e(".ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal").remove()},t.actions=function(i){var o,a,r;i=i||[],i.length>0&&!e.isArray(i[0])&&(i=[i]);for(var l,p="",u=0;u<i.length;u++)for(var d=0;d<i[u].length;d++){0===d&&(p+='<div class="ipu-actions-modal-group">');var c=i[u][d],h=c.label?"ipu-actions-modal-label":"ipu-actions-modal-button";c.bold&&(h+=" ipu-actions-modal-button-bold"),c.color&&(h+=" ipu-color-"+c.color),c.bg&&(h+=" ipu-bg-"+c.bg),c.disabled&&(h+=" disabled"),p+='<span class="'+h+'">'+c.text+"</span>",d===i[u].length-1&&(p+="</div>")}l='<div class="ipu-actions-modal">'+p+"</div>",n.innerHTML=l,o=e(n).children(),e(s.modalContainer).append(o[0]),a=".ipu-actions-modal-group",r=".ipu-actions-modal-button";var m=o.find(a);return m.each(function(n,s){var a=n;e(s).children().each(function(n,s){var l,p=n,u=i[a][p];e(s).is(r)&&(l=e(s)),l&&l.on("click",function(e){u.close!==!1&&t.closeModal(o),u.onClick&&u.onClick(o,e)})})}),t.openModal(o),o[0]},t.toast=function(i,o,n){var s=e('<div class="ipu-modal ipu-toast '+(n||"")+'">'+i+"</div>").appendTo(document.body);t.openModal(s,function(){setTimeout(function(){t.closeModal(s)},o||2e3)})},t.openModal=function(i,o){i=e(i);var n=i.hasClass("ipu-modal"),a=!i.hasClass("ipu-toast");if(a=!1,e(".ipu-modal.ipu-modal-in:not(.ipu-modal-out)").length&&s.modalStack&&n&&a)return void t.modalStack.push(function(){t.openModal(i,o)});var r=i.hasClass("ipu-popup"),l=i.hasClass("ipu-login-screen"),p=i.hasClass("ipu-picker-modal"),u=i.hasClass("ipu-toast");n&&(i.show(),i.css({marginTop:-Math.round(i.outerHeight()/2)+"px"})),u&&i.css({marginLeft:-Math.round(i.outerWidth()/2)+"px"});var d;l||p||u||(0!==e(".ipu-modal-overlay").length||r||e(s.modalContainer).append('<div class="ipu-modal-overlay"></div>'),0===e(".ipu-popup-overlay").length&&r&&e(s.modalContainer).append('<div class="ipu-popup-overlay"></div>'),d=e(r?".ipu-popup-overlay":".ipu-modal-overlay"));i[0].clientLeft;return i.trigger("open"),p&&e(s.modalContainer).addClass("ipu-with-picker-modal"),l||p||u||d.addClass("ipu-modal-overlay-visible"),i.removeClass("ipu-modal-out").addClass("ipu-modal-in").transitionEnd(function(t){i.hasClass("ipu-modal-out")?i.trigger("closed"):i.trigger("opened")}),"function"==typeof o&&o.call(this),!0},t.closeModal=function(i){if(i=e(i||".ipu-modal-in"),"undefined"==typeof i||0!==i.length){var o=i.hasClass("ipu-modal"),n=i.hasClass("ipu-popup"),a=i.hasClass("ipu-toast"),r=i.hasClass("ipu-login-screen"),l=i.hasClass("ipu-picker-modal"),p=i.hasClass("ipu-remove-on-close"),u=e(n?".ipu-popup-overlay":".ipu-modal-overlay");return n?i.length===e(".ipu-popup.ipu-modal-in").length&&u.removeClass("ipu-modal-overlay-visible"):l||a||u.removeClass("ipu-modal-overlay-visible"),i.trigger("close"),l&&(e(s.modalContainer).removeClass("ipu-with-picker-modal"),e(s.modalContainer).addClass("ipu-picker-modal-closing")),i.removeClass("ipu-modal-in").addClass("ipu-modal-out").transitionEnd(function(t){i.hasClass("ipu-modal-out")?i.trigger("closed"):i.trigger("opened"),l&&e(s.modalContainer).removeClass("ipu-picker-modal-closing"),n||r||l?(i.removeClass("ipu-modal-out").hide(),p&&i.length>0&&i.remove()):i.remove()}),o&&s.modalStack&&t.modalStackClearQueue(),!0}},e(document).on("click"," .ipu-modal-overlay, .ipu-popup-overlay, .ipu-close-popup, .ipu-open-popup, .ipu-close-picker",o)}(n||window,t),function(t,e){function i(t,i){this.option=e.extend({},this.defaultOption,i),this.content=e(this.option.contentSlt),this.nav=e(t),this.wrapper=e(">ul",this.content),this.contents=e(">li",this.wrapper),this.navs=e(">a",this.nav);var o=this,n=this.navs.filter(".ipu-current").index();n==-1&&(n=this.contents.filter(".ipu-current").index()),this.option.index=n!=-1?n:0,this.option.animate||this.wrapper.addClass("ipu-no-animation"),this.navs.each(function(t,i){e(this).click(function(){o.show(t)})}),this.lastIndex=null,this.currentIndex=null,o.show(this.option.index)}i.prototype.defaultOption={animate:!1,contentSlt:".ipu-nav-content",callBack:function(t,e){}},i.prototype.show=function(t){this.currentIndex!=t&&(e(this.contents[t]).addClass("ipu-show"),this.option.animate?(null!=this.lastIndex&&this.lastIndex!=t&&e(this.contents[this.lastIndex]).removeClass("ipu-show"),null!=this.currentIndex&&(this.currentIndex<t?null!=this.lastIndex&&this.lastIndex<this.currentIndex&&this.wrapper.addClass("ipu-no-animation").removeClass("ipu-nav-content-right").width():(null==this.lastIndex||this.lastIndex>this.currentIndex)&&this.wrapper.addClass("ipu-no-animation").addClass("ipu-nav-content-right").width(),this.wrapper.removeClass("ipu-no-animation").toggleClass("ipu-nav-content-right"))):e(this.contents[this.currentIndex]).removeClass("ipu-show"),e(this.contents[t]).addClass("ipu-current").siblings(".ipu-current").removeClass("ipu-current"),e(this.navs[t]).addClass("ipu-current").siblings(".ipu-current").removeClass("ipu-current"),this.lastIndex=this.currentIndex,this.currentIndex=t,this.option.callBack&&this.option.callBack(this.currentIndex,this.lastIndex))},t.navBar=function(t,e){return new i(t,e)}}(n||window,t),function(t,e){function i(t,e){function i(t){if(t.target===this)for(e.call(this,t),o=0;o<n.length;o++)s.off(n[o],i)}var o,n=t,s=this;if(e)for(o=0;o<n.length;o++)s.on(n[o],i)}function o(t,e,i){var o=t.createElement("form");o.action=e,o.method="post",o.style.display="none";for(var n in i){var s=t.createElement("input");s.type="hidden",s.name=n,s.value=i[n],o.appendChild(s)}t.body.appendChild(o),o.submit()}function n(){r||(d=e(".ipu-pages"),0==d.size()&&(d=e("<div class='ipu-pages'><div class='ipu-page ipu-show "+f+"' id='"+u+"0'></div>").appendTo("body")),r=!0)}function s(t){return e(t).hasClass(f)}e.fn.animationEnd=function(t){return i.call(this,["webkitAnimationEnd","animationend"],t),this};var a={},r=!1,l={},p=1,u="ipuPage-",d=null,c="ipu-anim ipu-slideRightIn",h="ipu-anim ipu-slideRightOut",m="ipuUIPageBack",f="ipu-page-zero",v="ipu-pages-zero";a.defaultOption={target:window.parent,backIndex:-1,closeIndex:-1,params:{},animate:!0,showLoading:!0,loadingMessage:"正在加载中",method:null,minMessageTime:500,data:null,pageName:"",callBack:function(){}},a.openPage=function(i,a){function r(){a.showLoading&&t.hidePreloader(),a.animate&&g.removeClass(c),h.siblings(".ipu-show").removeClass("ipu-show"),a.callBack&&a.callBack()}var h=null,m=u+p++;l[m]=i,n(),a.showLoading&&t.showPreloader(a.loadingMessage,a.minMessageTime),h=e("post"==a.method?"<div class='ipu-page' id='"+m+"' data-name='"+a.pageName+"'><iframe class='ipu-page-iframe'></iframe></div>":"<div class='ipu-page' id='"+m+"' data-name='"+a.pageName+"'><iframe class='ipu-page-iframe' src='"+i+"'></iframe></div>");var f=s(e(".ipu-page:last",d)),g=h;if(f&&(g=d.addClass(v)),e(".ipu-page-iframe",h).one("load",function(){h.addClass("ipu-show").width(),f&&g.removeClass(v),a.animate?g.addClass(c).animationEnd(r):r()}),h.appendTo(d),"post"==a.method){var b=e(".ipu-page-iframe",h)[0].contentDocument;o(b,i,a.params)}},a.postPage=function(t,e){e.method="post",a.openPage(t,e)},a.backPage=function(t){function i(){e(this).removeClass(h),n.nextAll(".ipu-page").remove();var i,o=e(".ipu-page-iframe",n);i=0==o.size()?window.document:o[0].contentDocument,p&&d.addClass(v);var s=i.createEvent("Event");s.initEvent(m,!0,!0),t.data&&(s.data=t.data),i.body.dispatchEvent(s),t.callBack&&t.callBack()}var o=t.backIndex,n=null,a=e(".ipu-page.ipu-show",d);if(t.pageName)n=e(".ipu-page[data-name='"+t.pageName+"']:first",d);else if(0==o)n=e(".ipu-page:first",d);else{var r=a.prevAll(".ipu-page");n=e(o<0?r[-o-1]:r[r.size()-o])}var l=a,p=s(n);p?l=d:n.addClass("ipu-show"),t.animate?l.addClass(h).animationEnd(i):i()},a.closePage=function(t){var i=t.closeIndex,o=e(".ipu-page.ipu-show",d).prevAll(".ipu-page");i=t.pageName?e(".ipu-page[data-name='"+t.pageName+"']:first",d).index():i<0?-i-1:o.size()-i,e(o[i]).remove(),t.callBack&&t.callBack()},a.open=function(t,i){i=e.extend({},this.defaultOption,i),i.target.ipu.page.openPage(t,i)},a.post=function(t,i){i=e.extend({},this.defaultOption,i),i.method="post",i.target.ipu.page.openPage(t,i)},a.back=function(t){t=e.extend({},this.defaultOption,t),t.target.ipu.page.backPage(t)},a.backHome=function(t){t=t||{},t.backIndex=0,a.back(t)},a.close=function(t){t=e.extend({},this.defaultOption,t),t.target.ipu.page.closePage(t)},a.onBack=function(t){e("body").on(m,function(e){var i=e.originalEvent.data;t(i)})},t.page=a}(n||window,t),function(t,e,i){function o(t){return t/100}function n(t,i){this.el=e(t)[0],this.option=e.extend({},this.defaultOption,i),this._init()}var s=9,a=90,r=180/s,l=r;n.prototype.defaultOption={listen:!0,data:[],onChange:null},n.prototype._init=function(){var n=this;this.wrap=e(">ul",this.el),this.index=null,this.listen=!!this.option.listen,this.beginAngle=0,this.beginExceed=this.beginAngle-l,this.stopInertiaMove=!1,this.lastAngle=null,t.device.ios&&this.wrap.css("transform-origin","center center "+o(a)+"rem"),this.setItems(this.option.data),this.hammer=new i.Manager(this.el),this.hammer.add(new i.Pan({direction:i.DIRECTION_VERTICAL,threshold:5})),this.hammer.add(new i.Press({threshold:4})),this.hammer.on("panstart panmove panend pancancel",i.bindFn(this._onPan,this)),this.hammer.on("press pressup",function(t){this.empty||(n.stopInertiaMove=!0,"pressup"==t.type&&n.endScroll())})},n.prototype.setItems=function(t,i){this.wrap.empty(),this.data=t=t||[],this.empty=0==t.length,this.newData=!0;var n=this,s="";i=i||"text";for(var p=0,u=t.length;p<u;p++)s=s+"<li>"+t[p][i]+"</li>";e(s).appendTo(this.wrap),this.items=e(">li",this.wrap),this.itemsSize=this.items.size(),this.endAngle=(this.empty?0:this.itemsSize-1)*r,this.endExceed=this.endAngle+l,this.items.each(function(t){e(this).css({transform:"translateZ("+o(a)+"rem) rotateX(-"+t*r+"deg)","transform-origin":"center center -"+o(a)+"rem"}),e(this).click(function(){n.stopInertiaMove=!0,n.setAngle(t*r,!0)})});var d;d=this.empty||null==this.index?0:this.index>this.itemsSize-1?(this.itemsSize-1)*r:this.index*r,this.setAngle(d,!0)},n.prototype._onPan=function(t){if(!this.empty)if("panstart"==t.type)self.stopInertiaMove=!0,this.lastAngle=this.angle,this.wrap.addClass("ipu-noanimate"),this.stopInertiaMove=!0;else if("panmove"==t.type){var e=this.calcAngle(t.deltaY),i=this.lastAngle-e;i<this.beginExceed&&(i=this.beginExceed),i>this.endExceed&&(i=this.endExceed),this.setAngle(i)}else{var o=t.overallVelocityY,n=o>0?-1:1,s=6e-4*n*-1,a=Math.abs(o/s),r=o*a/2,l=this.angle,p=-this.calcAngle(r),u=p;if(l+p<this.beginExceed&&(p=this.beginExceed-l,a=a*(p/u)*.6),l+p>this.endExceed&&(p=this.endExceed-l,a=a*(p/u)*.6),0==p)return void this.endScroll();this.scrollDistAngle(l,p,a)}};var p=360/(2*a*Math.PI);n.prototype.calcAngle=function(t){return t*p},n.prototype.setAngle=function(t,e){if(this.angle=t,this.wrap.css("transform","perspective("+o(1e3)+"rem) rotateY(0deg) rotateX("+t+"deg)"),this.calcItemVisable(t),e){var i=t/r,n=this.index;this.index=this.empty?null:i,(n!=i||this.newData)&&(this.option.onChange&&this.listen&&this.option.onChange(this.getSelectedItem(),this.index,n,this.newData),this.newData=!1)}},n.prototype.calcItemVisable=function(t){this.items.each(function(i){var o=Math.abs(i*r-t);o<r/2?e(this).addClass("ipu-highlight ipu-visible"):o>=90-r/2?e(this).removeClass("ipu-highlight ipu-visible"):e(this).addClass("ipu-visible").removeClass("ipu-highlight")})},n.prototype.endScroll=function(){this.wrap.removeClass("ipu-noanimate");var t;if(this.angle<this.beginAngle)t=this.beginAngle;else if(this.angle>this.endAngle)t=this.endAngle;else{var e=parseInt((this.angle/r).toFixed(0));t=r*e}this.setAngle(t,!0)},n.prototype.scrollDistAngle=function(t,e,i){var o=this,n=(new Date).getTime();
2 2
this.stopInertiaMove=!1,i=1*i,function(t,e,i,n){var s=13,a=n/s,r=0;!function l(){if(!o.stopInertiaMove){var t=o.quartEaseOut(r,e,i,a);return o.setAngle(t),r++,r>a-1||t<o.beginExceed||t>o.endExceed?void o.endScroll():void setTimeout(l,s)}}()}(n,t,e,i)},n.prototype.setListen=function(t){this.listen=!!t},n.prototype.quartEaseOut=function(t,e,i,o){return-i*((t=t/o-1)*t*t*t-1)+e},n.prototype.setSelectedValue=function(t){var e=this;for(var i in e.data){var o=e.data[i];if(o.value==t)return void e.setAngle(i*r,!0)}},n.prototype.getSelectedItem=function(){return this.empty?{}:this.data[this.index]},n.prototype.getSelectedValue=function(){return this.getSelectedItem().value},n.prototype.getSelectedText=function(){return this.getSelectedItem().text},n.prototype.getSelectedIndex=function(){return this.index},t.Picker=n}(n||window,t,i),function(t,e){function i(i){this.option=e.extend({},this.defaultOption,i),o||(o=t.Picker),this._init()}var o=t.Picker;i.prototype._init=function(){this.holder=e(this.option.template).appendTo("body");var t=e(".ipu-poppicker-body",this.holder),i=this.option.layer,n=100/i+"%";this.pickers=new Array(i);var s,a=this;this.mask=this.createMask();for(var r=i-1;r>=0;r--)s=e(this.option.pickerTemplate).prependTo(t).css({width:n}),this.pickers[r]=new o(s,{onChange:function(t){return function(e){t!=i-1&&a.pickers[t+1].setItems(e.data)}}(r)});e(".ipu-poppicker-btn-ok",this.holder).click(function(){var t=a.getSelectItems();a.option.callBack(t)!==!1&&a.hide()}).text(this.option.btns[1]),e(".ipu-poppicker-btn-cancel",this.holder).click(function(){a.hide()}).text(this.option.btns[0])},i.prototype.defaultOption={template:'<div class="ipu-poppicker"><div class="ipu-poppicker-header"><button class="ipu-btn ipu-btn-s ipu-poppicker-btn-cancel">取消</button><button class="ipu-btn ipu-btn-s ipu-poppicker-btn-ok">确定</button></div><div class="ipu-poppicker-body"></div></div>',pickerTemplate:'<div class="ipu-picker"><div class="ipu-picker-selectbox"></div><ul></ul></div>',data:[],layer:1,btns:["取消","确认"],callBack:function(){}},i.prototype.setData=function(t){this.pickers[0].setItems(t)},i.prototype.show=function(t){t&&(this.option.callBack=t),this.mask.show(),this.holder.addClass("ipu-current")},i.prototype.hide=function(){this.mask.close(),this.holder.removeClass("ipu-current")},i.prototype.getSelectItems=function(){if(1==this.option.layer)return this.pickers[0].getSelectedItem();for(var t=[],e=0;e<this.option.layer;e++)t.push(this.pickers[e].getSelectedItem());return t},i.prototype.createMask=function(t){var e=this,i=document.createElement("div");i.classList.add("ipu-picker-backup"),i.addEventListener("click",function(){e.hide()});var o=[i];return o._show=!1,o.show=function(){return o._show=!0,i.setAttribute("style","opacity:1"),document.body.appendChild(i),o},o._remove=function(){return o._show&&(o._show=!1,i.setAttribute("style","opacity:0"),setTimeout(function(){var t=document.body;i.parentNode===t&&t.removeChild(i)},350)),o},o.close=function(){o._show&&(t?t()!==!1&&o._remove():o._remove())},o},t.popPicker=function(t){return new i(t)}}(n||window,t),function(t,e){function i(t,i){this.id=t,this.level=i.level,this.progress=i.progress,this.progressBar=e(t).eq(0),null!=i.progress&&this.setProgress(this.progress),null!=i.level&&this.setLevel(this.level)}i.prototype.setProgress=function(t){t<0||t>100||(e(this.progressBar.find(".ipu-progressbar")).css("transform","translate3d("+-(100-t)+"%, 0px, 0px)"),this.progress=t)},i.prototype.getProgress=function(){return this.progress},i.prototype.setLevel=function(t){"default"==t?(e(this.progressBar).removeClass("ipu-progressbar-success ipu-progressbar-hightlight ipu-progressbar-warning"),e(this.progressBar).addClass("ipu-progress")):"success"==t?(e(this.progressBar).removeClass("ipu-progressbar-highlight ipu-progressbar-warning"),e(this.progressBar).addClass("ipu-progressbar-success")):"highlight"==t?(e(this.progressBar).removeClass("ipu-progressbar-success ipu-progressbar-warning"),e(this.progressBar).addClass("ipu-progressbar-highlight")):"warning"==t&&(e(this.progressBar).removeClass("ipu-progressbar-success ipu-progressbar-highlight"),e(this.progressBar).addClass("ipu-progressbar-warning"))},t.progressBar=function(t,e){return new i(t,e)}}(n||window,t),function(t,e,i){function o(t,o){this.option=e.extend({},this.defaultOption,o),this.el=e(t).get(0),this._initBottomAndTop();var n=this;this.iScrollOption={onScrollMove:function(t){n.topEnable&&!n.topLoading&&(this.y>=n.topPullOffset&&!n.topEl.hasClass("ipu-refresh-toload")?n.topEl.addClass("ipu-refresh-toload"):this.y<n.topPullOffset&&n.topEl.hasClass("ipu-refresh-toload")&&n.topEl.removeClass("ipu-refresh-toload")),n._checkBottomLoading(),n.goTop=this.y>n.topPullOffset},onBeforeScrollEnd:function(){n._checkTopLoading(),n._checkBottomLoading()},onScrollEnd:function(){n.topLoading&&this.y<this.minScrollY&&n.goTop&&n.iScroll.scrollTo(0,this.minScrollY,0),n._checkBottomLoading()},onRefresh:function(){n.topLoading&&(this.minScrollY=this.minScrollY+n.topPullOffset)}},this.iScrollOption=e.extend({},this.option.iScrollOption,this.iScrollOption),this.iScroll=new i(this.el,this.iScrollOption),this._checkContentLoading()}o.prototype.defaultOption={bottomLoadFun:null,topLoadFun:null,initEnableTop:!0,initEnableBottom:!0,bottomLoadHtml:'<div class="ipu-refresh-bottom"><span class="ipu-refresh-loading"></span></div>',topLoadHtml:'<div class="ipu-refresh-top"><span class="ipu-refresh-loading"></span><div class="ipu-refresh-arrow"></div></div>',bottomAddLen:0,iScrollOption:{}},o.prototype._initBottomAndTop=function(){this.scrollEl=e(">.ipu-refresh-wrapper",this.el),this.bottomEl=e(this.option.bottomLoadHtml).appendTo(this.scrollEl),this.topEl=e(this.option.topLoadHtml).prependTo(this.scrollEl),this.topPullOffset=this.topEl.outerHeight(),this.bottomPullOffset=this.bottomEl.outerHeight()+this.option.bottomAddLen,this.topLoading=!1,this.bottomLoading=!1,this.bottomEnable=this.option.initEnableBottom&&!!this.option.bottomLoadFun,this.topEnable=this.option.initEnableTop&&!!this.option.topLoadFun,this.goTop=!1,this.enableBottom(this.bottomEnable),this.enableTop(this.topEnable)},o.prototype._checkBottomLoading=function(){this.bottomEnable&&this.iScroll.y<this.iScroll.maxScrollY+this.bottomPullOffset&&this._startBottomLoading()},o.prototype._checkTopLoading=function(){this.topEnable&&this.topEl.hasClass("ipu-refresh-toload")&&this._startTopLoading()},o.prototype._checkContentLoading=function(){this.bottomEnable&&this.iScroll.maxScrollY>=-this.bottomPullOffset&&this._startBottomLoading()},o.prototype._startBottomLoading=function(){this.bottomLoading||(this.bottomLoading=!0,this.option.bottomLoadFun())},o.prototype._startTopLoading=function(){this.topLoading||(this.topLoading=!0,this.topEl.removeClass("ipu-refresh-toload").addClass("ipu-refresh-top-loading"),this.iScroll.minScrollY=this.iScroll.minScrollY+this.topPullOffset,this.option.topLoadFun())},o.prototype.endBottomLoading=function(){this.bottomLoading=!1,this.refresh()},o.prototype.endTopLoading=function(){this.topEl.removeClass("ipu-refresh-top-loading"),this.topLoading=!1,this.refresh()},o.prototype.enableTop=function(t){this.topEnable=t,t?this.topEl.show():this.topEl.hide()},o.prototype.enableBottom=function(t){this.bottomEnable=t,t?this.bottomEl.show():this.bottomEl.hide()},o.prototype.refresh=function(){this.iScroll.refresh(),this._checkContentLoading()},t.refresh=function(t,e){return new o(t,e)}}(n||window,t,e),function(t,e){function i(t,i){this.el=e(t).get(0),this.titleItems=e(".ipu-tab-title:first>li",this.el),this.bodyWrapper=e(".ipu-tab-body-wrapper:first",this.el),this.contentItems=e(">li",this.bodyWrapper),this.option=e.extend({},this.defaultOption,i),this.itemSize=this.contentItems.size(),this.fixed=e(this.el).is(".ipu-tab-fixed");var o=this;this.titleItems.each(function(t){e(this).click(function(){o.show(t)})});var n=this.titleItems.filter(".ipu-current").index();n==-1&&(n=0),this.show(n)}i.prototype.defaultOption={callBack:function(t){}},i.prototype.show=function(t){if(this.fixed){var e=100*-t+"%";this.bodyWrapper.css("transform","translate3d("+e+", 0, 0)")}this.contentItems.eq(t).addClass("ipu-current").siblings().removeClass("ipu-current"),this.titleItems.eq(t).addClass("ipu-current").siblings().removeClass("ipu-current"),this._end(t)},i.prototype._end=function(t){this.lastIndex=this.currentIndex,this.currentIndex=t,this.option.callBack&&this.option.callBack(t,this.lastIndex)},t.tab=function(t,e){return new i(t,e)}}(n||window,t),function(t,e){function i(t){return t.originalEvent||t}function o(t){var e=t.touches?t.touches[0].pageX:t.clientX,i=t.touches?t.touches[0].pageY:t.clientY;return[e,i]}var n={},s=defaultOptions={distanceAllow:10,displayDelay:100,hideDelay:120,eventName:"click",activeClass:"ipu-active",getHandleNode:function(t){function i(t){var i=(e._data||e.data)(t,"events");if(i&&(i=i[s.eventName]),i){var a=!1;return e.each(i,function(i,s){if(s.selector){var r=e(s.selector,t);if(e.each(n,function(t,e){if(r.is(e))return o=e,!1}),o)return!1}else a=!0}),a&&null==o&&(o=t),o}}if(t&&t.nodeType){for(var o=null,n=[];!("tagName"in t&&i(t))&&t.parentNode&&1==t.parentNode.nodeType;)n.push(t),t=t.parentNode;return o}}},a="ontouchstart"in window,r=a?"touchstart":"mousedown",l=a?"touchmove":"mousemove",p=a?"touchend":"mouseup",u=a?"touchcancel":"";e(function(){function t(t,i){i&&c?window.clearTimeout(c):e(t).removeClass(s.activeClass)}function n(e){e?t(d,e):window.setTimeout(t,s.hideDelay,d,e),a=null,d=null}var a,d,c,h=document.body;e(h).bind(r,function(t){return d?void n(!0):(t=i(t),a=o(t),d=s.getHandleNode(t.target),void(d&&(c=window.setTimeout(function(t){c=null,e(t).addClass(s.activeClass)},s.displayDelay,d))))}),e(h).bind(l,function(t){if(d){t=i(t);var e=o(t);a&&(Math.abs(e[0]-a[0])>s.distanceAllow||Math.abs(e[1]-a[1])>s.distanceAllow)&&n(!0)}}),e(h).bind(p,function(t){d&&n()}),u&&e(h).bind(u,function(t){d&&n()})}),n.setOptions=function(t){s=this.options=e.extend({},defaultOptions,t)},t.active=n}(n||window,t),t(function(){t("body").on("touchstart",function(t){}),o.attach(document.body)}),n}"function"==typeof define&&define.amd?define(["jquery","iScroll","Hammer","FastClick"],function(e,i,o,n){return window.ipu=t(e,i,o,n)}):window.ipu=t(window.jQuery,window.iScroll,window.Hammer,window.FastClick)}();
3 3
//# sourceMappingURL=ipu.min.js.map

+ 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","option","this","extend","defaultOption","el","eq","autoPlay","hasIndicator","indicator","callBack","currentIndex","_init","play","prototype","index","duration","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","device","classNames","ua","navigator","userAgent","android","match","ipad","ipod","iphone","ios","androidChrome","os","osVersion","toLowerCase","indexOf","replace","split","pixelRatio","devicePixelRatio","push","Math","floor","major","parseInt","wx","test","classPrev","length","join","DtPicker","Picker","defaultPickerDate","Date","template","buttons","labels","type","customData","hasClear","beginDate","endDate","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","_isBeginYear","beginYear","getSelectedValue","_isBeginMonth","_isBeginDay","beginDay","_isBeginHours","beginHours","_isEndYear","endYear","_isEndMonth","_isEndDay","endDay","_isEndHours","endHours","_createYear","yArray","yBegin","yEnd","setItems","mArray","maxMonth","val","dArray","maxDay","hArray","maxHours","iArray","beginMinutes","maxMinutes","endMinutes","each","label","innerText","hide","click","clickCall","now","rs","parts","j","setDateRange","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","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","move","displayMoveLen","css","animate","toggleClass","ev","delta","deltaX","intValue","abs","decimal","hammerCarousel","__dealCssEvent","eventNameArr","fireCallBack","e","target","events","off","handleClicks","clicked","hasClass","defaults","modalCloseByOutside","closeModal","actionsCloseByOutside","popupCloseByOutside","fn","transitionEnd","_modalTemplateTempDiv","modalTitle","modalStack","modalButtonOk","modalButtonCancel","modalPreloaderTitle","modalContainer","modalStackClearQueue","shift","modal","params","buttonsHTML","bold","extraClass","titleHTML","title","textHTML","afterTextHTML","afterText","noButtons","verticalButtons","modalHTML","innerHTML","children","append","find","onClick","openModal","alert","callbackOk","arguments","undefined","confirm","callbackCancel","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","toRem","showItemSize","r","itemAngle","maxExceed","wrap","beginAngle","beginExceed","stopInertiaMove","lastAngle","DIRECTION_VERTICAL","Press","empty","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","t","b","getSelectedText","getSelectedIndex","PopPicker","bodyHtml","layer","pickers","Array","pickerHtml","pickerTemplate","prependTo","getSelectItems","btns","setData","popPicker","ProgressBar","id","level","progress","progressBar","setProgress","setLevel","pro","getProgress","Refresh","_initBottomAndTop","iScrollOption","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","options","defaultOptions","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","attach","define","amd"],"mappings":"CACA,WACI,QAASA,GAAMC,EAAQC,EAASC,EAAQC,GAQpC,GAAIC,KAi2GJ,OA/1GR,UAAWA,EAAKC,EAAGC,GAsBf,QAASC,GAASC,EAAKC,GACnBC,KAAKD,OAASA,EAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GACxDC,KAAKG,GAAKR,EAAEG,GAAKM,GAAG,GACpBJ,KAAKK,SAAWN,EAAOM,SACvBL,KAAKM,aAAeP,EAAOQ,UAC3BP,KAAKQ,SAAWT,EAAOS,SACvBR,KAAKS,aAAe,KAEpBT,KAAKU,QACLV,KAAKW,OAGTd,EAASe,WAaLV,eACIW,MAAO,KACPR,UAAU,EACVS,SAAU,IACVP,WAAW,EACXC,SAAU,MAEdE,MAAO,WACH,GAAIK,GAAUpB,EAAE,yBAA0BK,KAAKG,IAC3Ca,EAAgBrB,EAAE,MAAOoB,EAC7Bf,MAAKgB,cAAgBA,EACrBhB,KAAKiB,KAAOD,EAAcC,MAC1B,IAAIC,GAAOlB,IAEX,IAAyB,MAArBA,KAAKD,OAAOc,MAAe,CAC3B,GAAIM,GAAcH,EAAcI,OAAO,gBAAgBP,OACvDb,MAAKD,OAAOc,MAAQM,MAAoBA,EAAc,EAGtDnB,KAAKM,cACLN,KAAKqB,gBAET1B,EAAE2B,QAAQC,OAAO,WACbL,EAAKM,WAET,IAAIC,IACAC,KAAM,KACNC,UAAU,EACVC,SAAS,EACTC,SAAQ,EACRC,YAAY,EACZC,cAAe,WACXb,EAAKc,UAETC,WAAY,aAEZC,YAAa,WACThB,EAAKiB,QAGbnC,MAAKJ,QAAU,GAAIA,GAAQI,KAAKG,GAAGiC,IAAI,GAAIX,GAC3CzB,KAAKqC,KAAKrC,KAAKD,OAAOc,MAAO,IAKjCyB,KAAM,WACFtC,KAAKgC,SACLhC,KAAKK,UAAS,GAElB2B,OAAQ,WACAhC,KAAKK,UAAYL,KAAKuC,YACtBC,aAAaxC,KAAKuC,WAClBvC,KAAKuC,UAAY,OAMzBE,KAAM,WACF,GAAI5B,GAA6B,GAArBb,KAAKS,aAAoBT,KAAKiB,KAAO,EAAIjB,KAAKS,aAAe,CACzET,MAAKqC,KAAKxB,IAKd6B,KAAM,WACF,GAAI7B,GAAQb,KAAKS,cAAgBT,KAAKiB,KAAO,EAAI,EAAIjB,KAAKS,aAAe,CACzET,MAAKqC,KAAKxB,IAOdwB,KAAM,SAAUxB,EAAO8B,GACnB3C,KAAKgC,SACLhC,KAAKJ,QAAQgD,aAAa/B,EAAO,EAAG8B,IAKxChC,KAAM,WACFX,KAAKK,UAAS,EACdL,KAAK6C,SAKTrB,QAAS,WACLxB,KAAKqC,KAAKrC,KAAKS,eAEnBoC,MAAO,WACH,GAAI7C,KAAKK,WAAaL,KAAKuC,UAAW,CAClC,GAAIrB,GAAOlB,IACXA,MAAKuC,UAAYO,WAAW,WACxB5B,EAAKqB,UAAY,KACjBrB,EAAKwB,QACNxB,EAAKnB,OAAOe,YAGvBqB,KAAM,WACF,GAAI1B,GAAeT,KAAKJ,QAAQmD,SAC5BtC,IAAgBT,KAAKS,eACjBT,KAAKQ,UACLR,KAAKQ,SAASC,EAAcT,KAAKS,cAErCT,KAAKS,aAAeA,EAEhBT,KAAKM,cACLN,KAAKgD,gBAAgB5C,GAAGK,GAAcwC,SAAS,eAAeC,WAAWC,YAAY,eAEzFnD,KAAKgB,cAAcZ,GAAGK,GAAcwC,SAAS,eAAeC,WAAWC,YAAY,gBAEvFnD,KAAK6C,SAETxB,cAAe,WAEX,IAAK,GADD+B,GAAO,GACFC,EAAI,EAAGA,EAAIrD,KAAKiB,KAAMoC,IAC3BD,GAAQ,WAEZA,GAAO,sCAAwCA,EAAO,QACtDpD,KAAKO,UAAYZ,EAAEyD,GAAME,SAAStD,KAAKG,IACvCH,KAAKgD,gBAAkBrD,EAAE,KAAMK,KAAKO,YAExCgD,QAAS,WAELvD,KAAKJ,QAAQ2D,YAYrB7D,EAAI8D,SAAY,SAAU1D,EAAKC,GAC3B,MAAO,IAAIF,GAASC,EAAKC,KAG9BL,GAAO4B,OAAQhC,EAAQC,GAGzB,SAAWG,EAAKC,GACb,YACA,IAAI8D,MACAC,KACAC,EAAKC,UAAUC,UAEfC,EAAUH,EAAGI,MAAM,+BACnBC,EAAOL,EAAGI,MAAM,wBAChBE,EAAON,EAAGI,MAAM,2BAChBG,GAAUF,GAAQL,EAAGI,MAAM,yBA2C/B,IAzCAN,EAAOU,IAAMV,EAAOK,QAAUL,EAAOS,OAAST,EAAOO,KAAOP,EAAOW,eAAgB,EAG/EN,IACAL,EAAOY,GAAK,UACZZ,EAAOa,UAAYR,EAAQ,GAC3BL,EAAOK,SAAU,EACjBL,EAAOW,cAAgBT,EAAGY,cAAcC,QAAQ,WAAa,IAE7DR,GAAQE,GAAUD,KAClBR,EAAOY,GAAK,MACZZ,EAAOU,KAAM,GAGbD,IAAWD,IACXR,EAAOa,UAAYJ,EAAO,GAAGO,QAAQ,KAAM,KAC3ChB,EAAOS,QAAS,GAEhBF,IACAP,EAAOa,UAAYN,EAAK,GAAGS,QAAQ,KAAM,KACzChB,EAAOO,MAAO,GAEdC,IACAR,EAAOa,UAAYL,EAAK,GAAKA,EAAK,GAAGQ,QAAQ,KAAM,KAAO,KAC1DhB,EAAOS,QAAS,GAGhBT,EAAOU,KAAOV,EAAOa,WAAaX,EAAGa,QAAQ,aAAe,GACrB,OAAnCf,EAAOa,UAAUI,MAAM,KAAK,KAC5BjB,EAAOa,UAAYX,EAAGY,cAAcG,MAAM,YAAY,GAAGA,MAAM,KAAK,IAK5EjB,EAAOkB,WAAarD,OAAOsD,kBAAoB,EAC/ClB,EAAWmB,KAAK,eAAiBC,KAAKC,MAAMtB,EAAOkB,aAC/ClB,EAAOkB,YAAc,GACrBjB,EAAWmB,KAAK,UAIhBpB,EAAOY,KACPX,EAAWmB,KAAKpB,EAAOY,GAAIZ,EAAOY,GAAK,IAAMZ,EAAOa,UAAUI,MAAM,KAAK,GAAIjB,EAAOY,GAAK,IAAMZ,EAAOa,UAAUG,QAAQ,MAAO,MAC7G,QAAdhB,EAAOY,IAEP,IAAK,GADDW,GAAQC,SAASxB,EAAOa,UAAUI,MAAM,KAAK,GAAI,IAC5CrB,EAAI2B,EAAQ,EAAG3B,GAAK,EAAGA,IAC5BK,EAAWmB,KAAK,UAAYxB,EAKxCI,GAAOyB,GAAK,kBAAkBC,KAAKxB,GACnCF,EAAO/D,IAAM,aAAayF,KAAKxB,GAE3BF,EAAOyB,IACPxB,EAAWmB,KAAK,MAEhBpB,EAAO/D,KACPgE,EAAWmB,KAAK,MAGpB,IAAIO,GAAY,MAGZ1B,GAAW2B,OAAS,GACpB1F,EAAE,QAAQsD,SAASmC,EAAU1B,EAAW4B,KAAK,IAAIF,IAGrD1F,EAAI+D,OAASA,GACd/D,GAAO4B,OAAQhC,GAOlB,SAAWI,EAAKC,GAeZ,QAAS4F,GAASxF,GACdC,KAAKD,OAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAE1CyF,IACDA,EAAS9F,EAAI8F,QAEjBxF,KAAKU,QApBT,GAAI8E,GAAS9F,EAAI8F,OACbC,EAAoB,GAAIC,KAmC5BH,GAAS3E,UAAUV,eACfyF,SAAU,kiCAqCVC,SAAU,KAAM,KAAM,MACtBC,QAAS,IAAK,IAAK,IAAK,IAAK,KAC7BC,KAAM,WACNC,cACAC,UAAU,EACVC,UAAW,KACXC,QAAS,KACT1F,SAAU,MAGd+E,EAAS3E,UAAUF,MAAQ,WACvB,GAAIyF,GAAOnG,IACXA,MAAKoG,KAAOpG,KAAKqG,YAEjB,IAAIC,GAAUtG,KAAKuG,OAAS5G,EAAEK,KAAKD,OAAO4F,UAAUrC,SAAS,QACzDkD,EAAKL,EAAKK,IACVC,OAAQzG,KAAKuG,OACbG,GAAI/G,EAAE,wBAAyB2G,GAC/BK,OAAQhH,EAAE,4BAA6B2G,GACvCM,MAAOjH,EAAE,2BAA4B2G,GACrCV,QAASjG,EAAE,iCAAkC2G,GAC7CT,OAAQlG,EAAE,6BAA8B2G,GAI5CE,GAAGnD,EAAI,GAAImC,GAAO7F,EAAE,wBAAyB2G,IAAWO,QAAQ,IAEhEL,EAAGM,EAAI,GAAItB,GAAO7F,EAAE,uBAAwB2G,IACxCO,QAAQ,EACRE,SAAU,SAAUC,EAAMnG,GACR,OAAVA,IAAmBsF,EAAKpG,OAAOkH,YAAcd,EAAKpG,OAAOmH,WACzDf,EAAKgB,oBAKjBX,EAAGY,EAAI,GAAI5B,GAAO7F,EAAE,uBAAwB2G,IACxCO,QAAQ,EACRE,SAAU,SAAUC,EAAMnG,GACR,OAAVA,IAAmBsF,EAAKpG,OAAOkH,YAAcd,EAAKpG,OAAOmH,WACzDf,EAAKkB,kBAKjBb,EAAGc,EAAI,GAAI9B,GAAO7F,EAAE,uBAAwB2G,IACxCO,QAAQ,EACRE,SAAU,SAAUC,EAAMnG,GACR,OAAVA,GACAsF,EAAKoB,gBAKjBf,EAAGgB,EAAI,GAAIhC,GAAO7F,EAAE,uBAAwB2G,IACxCO,QAAQ,EACRE,SAAU,SAAUC,EAAMnG,GACT,MAATA,IACIsF,EAAKpG,OAAOkH,YAAcd,EAAKpG,OAAOmH,SACtCf,EAAKsB,eAELtB,EAAKoB,iBAOrBpB,EAAKuB,UAGLvB,EAAKwB,aACLxB,EAAKyB,cAELpB,EAAGC,OAAOoB,KAAK,YAAa7H,KAAKD,OAAO+F,MAIxCK,EAAK2B,kBAAkB9H,KAAKD,OAAOgI,QAyBvCxC,EAAS3E,UAAUoH,YAAc,WAC7B,GAAI7B,GAAOnG,KACPwG,EAAKL,EAAKK,GACVV,EAAOK,EAAKpG,OAAO+F,KACnBmC,GACAnC,KAAMA,EACN0B,EAAGhB,EAAGgB,EAAEU,kBACRZ,EAAGd,EAAGc,EAAEY,kBACRd,EAAGZ,EAAGY,EAAEc,kBACRpB,EAAGN,EAAGM,EAAEoB,kBACR7E,EAAGmD,EAAGnD,EAAE6E,kBACRC,SAAU,WACN,MAAOnI,MAAK+H,OAGpB,QAAQjC,GACJ,IAAK,WACDmC,EAASF,MAAQE,EAAST,EAAEO,MAAQ,IAAME,EAASX,EAAES,MAAQ,IAAME,EAASb,EAAEW,MAAQ,IAAME,EAASnB,EAAEiB,MAAQ,IAAME,EAAS5E,EAAE0E,MAChIE,EAASG,KAAOH,EAAST,EAAEY,KAAO,IAAMH,EAASX,EAAEc,KAAO,IAAMH,EAASb,EAAEgB,KAAO,IAAMH,EAASnB,EAAEsB,KAAO,IAAMH,EAAS5E,EAAE+E,IAC3H,MACJ,KAAK,OACDH,EAASF,MAAQE,EAAST,EAAEO,MAAQ,IAAME,EAASX,EAAES,MAAQ,IAAME,EAASb,EAAEW,MAC9EE,EAASG,KAAOH,EAAST,EAAEY,KAAO,IAAMH,EAASX,EAAEc,KAAO,IAAMH,EAASb,EAAEgB,IAC3E,MACJ,KAAK,OACDH,EAASF,MAAQE,EAASnB,EAAEiB,MAAQ,IAAME,EAAS5E,EAAE0E,MACrDE,EAASG,KAAOH,EAASnB,EAAEsB,KAAO,IAAMH,EAAS5E,EAAE+E,IACnD,MACJ,KAAK,QACDH,EAASF,MAAQE,EAAST,EAAEO,MAAQ,IAAME,EAASX,EAAES,MACrDE,EAASG,KAAOH,EAAST,EAAEY,KAAO,IAAMH,EAASX,EAAEc,IACnD,MACJ,KAAK,OACDH,EAASF,MAAQE,EAAST,EAAEO,MAAQ,IAAME,EAASX,EAAES,MAAQ,IAAME,EAASb,EAAEW,MAAQ,IAAME,EAASnB,EAAEiB,MACvGE,EAASG,KAAOH,EAAST,EAAEY,KAAO,IAAMH,EAASX,EAAEc,KAAO,IAAMH,EAASb,EAAEgB,KAAO,IAAMH,EAASnB,EAAEsB,KAG3G,MAAOH,IAGX1C,EAAS3E,UAAUkH,kBAAoB,SAAUC,GAC7C,GAAI5B,GAAOnG,KACPwG,EAAKL,EAAKK,EAETuB,KAEGA,EADoB,QAApB/H,KAAKD,OAAO+F,KACJ,QAEAL,EAAkB4C,cAAgB,KAAO5C,EAAkB6C,WAAa,GAAK,IAAM7C,EAAkB8C,UAAY,IACnH9C,EAAkB+C,WAAa,IAAM/C,EAAkBgD,aAGrE,IAAIC,GAAcvC,EAAKwC,eAAeZ,EAEtCvB,GAAGgB,EAAEoB,WAAU,GACfpC,EAAGc,EAAEsB,WAAU,GACfpC,EAAGY,EAAEwB,WAAU,GACfpC,EAAGM,EAAE8B,WAAU,GACfpC,EAAGnD,EAAEuF,WAAU,GACfpC,EAAGgB,EAAEqB,iBAAiBH,EAAYlB,GAElChB,EAAGc,EAAEsB,WAAU,GACfpC,EAAGc,EAAEuB,iBAAiBH,EAAYpB,GAElCd,EAAGY,EAAEwB,WAAU,GACfpC,EAAGY,EAAEyB,iBAAiBH,EAAYtB,GAElCZ,EAAGM,EAAE8B,WAAU,GACfpC,EAAGM,EAAE+B,iBAAiBH,EAAY5B,GAElCN,EAAGnD,EAAEuF,WAAU,GACfpC,EAAGnD,EAAEwF,iBAAiBH,EAAYrF,GAElCrD,KAAK+H,MAAQ/H,KAAKgI,cAAcD,OAQpCxC,EAAS3E,UAAUiI,iBAAmB,SAAUd,GAC5C/H,KAAK8H,kBAAkBC,IAS3BxC,EAAS3E,UAAUkI,WAAa,SAAUC,GACtC,MAAQA,GAAO,GAAK,GAAKA,EAAO,KAAO,GAAOA,EAAO,KAAO,GAGhExD,EAAS3E,UAAUoI,SAAW,SAAUC,EAAOjC,GAC3C,IAAK,GAAInG,KAASoI,GAAO,CACrB,GAAIC,GAAQD,EAAMpI,EAClB,IAAIqI,IAAUlC,EAAM,OAAO,EAE/B,OAAO,GAGXzB,EAAS3E,UAAUuI,UAAY,SAAUJ,EAAMK,GAC3C,GAAIjD,GAAOnG,IACX,OAAImG,GAAK6C,UAAU,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAKI,GAChC,GACAjD,EAAK6C,UAAU,EAAG,EAAG,EAAG,IAAKI,GAC7B,GACAjD,EAAK2C,WAAWC,GAChB,GAEA,IAIfxD,EAAS3E,UAAUyI,MAAQ,SAAUC,GAKjC,MAJAA,GAAMA,EAAInB,WACNmB,EAAIjE,OAAS,IACbiE,EAAM,EAAIA,GAEPA,GAGX/D,EAAS3E,UAAU2I,aAAe,WAC9B,MAAOvJ,MAAKD,OAAOyJ,YAAcvE,SAASjF,KAAKwG,GAAGgB,EAAEiC,qBAGxDlE,EAAS3E,UAAU8I,cAAgB,WAC/B,MAAO1J,MAAKD,OAAOkH,YAAcjH,KAAKuJ,gBAAkBvJ,KAAKD,OAAOkH,aAAehC,SAASjF,KAAKwG,GAAGc,EAAEmC,qBAG1GlE,EAAS3E,UAAU+I,YAAc,WAC7B,MAAO3J,MAAK0J,iBAAmB1J,KAAKD,OAAO6J,WAAa3E,SAASjF,KAAKwG,GAAGY,EAAEqC,qBAG/ElE,EAAS3E,UAAUiJ,cAAgB,WAC/B,MAAO7J,MAAK2J,eAAiB3J,KAAKD,OAAO+J,aAAe7E,SAASjF,KAAKwG,GAAGM,EAAE2C,qBAG/ElE,EAAS3E,UAAUmJ,WAAa,WAC5B,MAAO/J,MAAKD,OAAOiK,UAAY/E,SAASjF,KAAKwG,GAAGgB,EAAEiC,qBAGtDlE,EAAS3E,UAAUqJ,YAAc,WAC7B,MAAOjK,MAAKD,OAAOmH,UAAYlH,KAAK+J,cAAgB/J,KAAKD,OAAOmH,WAAajC,SAASjF,KAAKwG,GAAGc,EAAEmC,qBAGpGlE,EAAS3E,UAAUsJ,UAAY,WAC3B,MAAOlK,MAAKiK,eAAiBjK,KAAKD,OAAOoK,SAAWlF,SAASjF,KAAKwG,GAAGY,EAAEqC,qBAG3ElE,EAAS3E,UAAUwJ,YAAc,WAC7B,MAAOpK,MAAKkK,aAAelK,KAAKD,OAAOsK,WAAapF,SAASjF,KAAKwG,GAAGM,EAAE2C,qBAG3ElE,EAAS3E,UAAU0J,YAAc,WAC7B,GAAInE,GAAOnG,KACPD,EAASoG,EAAKpG,OACdyG,EAAKL,EAAKK,GAGV+D,IACJ,IAAIxK,EAAOgG,WAAWyB,EAClB+C,EAASxK,EAAOgG,WAAWyB,MAI3B,KAAK,GAFDgD,GAASzK,EAAOyJ,UAChBiB,EAAO1K,EAAOiK,QACTxC,EAAIgD,EAAQhD,GAAKiD,EAAMjD,IAC5B+C,EAAO1F,MACHuD,KAAMZ,EAAI,GACVO,MAAOP,GAInBhB,GAAGgB,EAAEkD,SAASH,IAGlBhF,EAAS3E,UAAU6G,aAAe,WAC9B,GAAItB,GAAOnG,KACPD,EAASoG,EAAKpG,OACdyG,EAAKL,EAAKK,GAGVmE,IACJ,IAAI5K,EAAOgG,WAAWuB,EAClBqD,EAAS5K,EAAOgG,WAAWuB,MAI3B,KAFA,GAAIA,GAAIvH,EAAOkH,YAAcd,EAAKoD,eAAiBxJ,EAAOkH,WAAa,EACnE2D,EAAW7K,EAAOmH,UAAYf,EAAK4D,aAAehK,EAAOmH,SAAW,GACjEI,GAAKsD,EAAUtD,IAAK,CACvB,GAAIuD,GAAM1E,EAAKkD,MAAM/B,EACrBqD,GAAO9F,MACHuD,KAAMyC,EACN9C,MAAOT,IAInBd,EAAGc,EAAEoD,SAASC,IAGlBpF,EAAS3E,UAAU2G,WAAa,WAC5B,GAAIpB,GAAOnG,KACPD,EAASoG,EAAKpG,OACdyG,EAAKL,EAAKK,GAGVsE,IACJ,IAAI/K,EAAOgG,WAAWqB,EAClB0D,EAAS/K,EAAOgG,WAAWqB,MAI3B,KAFA,GAAIA,GAAIjB,EAAKuD,gBAAkB3J,EAAO6J,SAAW,EAC7CmB,EAAS5E,EAAK8D,cAAgBlK,EAAOoK,OAAShE,EAAKgD,UAAUlE,SAASjF,KAAKwG,GAAGgB,EAAEiC,oBAAqBxE,SAASjF,KAAKwG,GAAGc,EAAEmC,qBACrHrC,GAAK2D,EAAQ3D,IAAK,CACrB,GAAIyD,GAAM1E,EAAKkD,MAAMjC,EACrB0D,GAAOjG,MACHuD,KAAMyC,EACN9C,MAAOX,IAInBZ,EAAGY,EAAEsD,SAASI,IAKlBvF,EAAS3E,UAAUyG,aAAe,WAC9B,GAAIlB,GAAOnG,KACPD,EAASoG,EAAKpG,OACdyG,EAAKL,EAAKK,GAEVwE,IACJ,IAAIjL,EAAOgG,WAAWe,EAClBkE,EAASjL,EAAOgG,WAAWe,MAI3B,KAFA,GAAIA,GAAIX,EAAKwD,cAAgB5J,EAAO+J,WAAa,EAC7CmB,EAAW9E,EAAK+D,YAAcnK,EAAOsK,SAAW,GAC7CvD,GAAKmE,EAAUnE,IAAK,CACvB,GAAI+D,GAAM1E,EAAKkD,MAAMvC,EACrBkE,GAAOnG,MACHuD,KAAMyC,EACN9C,MAAOjB,IAInBN,EAAGM,EAAE4D,SAASM,IAIlBzF,EAAS3E,UAAUuG,eAAiB,WAChC,GAAIhB,GAAOnG,KACPD,EAASoG,EAAKpG,OACdyG,EAAKL,EAAKK,GAGV0E,IACJ,IAAInL,EAAOgG,WAAW1C,EAClB6H,EAASnL,EAAOgG,WAAW1C,MAI3B,KAFA,GAAIA,GAAI8C,EAAK0D,gBAAkB9J,EAAOoL,aAAe,EACjDC,EAAajF,EAAKiE,cAAgBrK,EAAOsL,WAAa,GACnDhI,GAAK+H,EAAY/H,IAAK,CACzB,GAAIwH,GAAM1E,EAAKkD,MAAMhG,EACrB6H,GAAOrG,MACHuD,KAAMyC,EACN9C,MAAO1E,IAInBmD,EAAGnD,EAAEqH,SAASQ,IAIlB3F,EAAS3E,UAAU+G,WAAa,WAC5B,GAAIxB,GAAOnG,KACPD,EAASoG,EAAKpG,OACdyG,EAAKL,EAAKK,EACdA,GAAGX,OAAOyF,KAAK,SAAUjI,EAAGkI,GACxBA,EAAMC,UAAYzL,EAAO8F,OAAOxC,MAIxCkC,EAAS3E,UAAUgH,YAAc,WAC7B,GAAIzB,GAAOnG,KACPD,EAASoG,EAAKpG,OACdyG,EAAKL,EAAKK,EACdA,GAAGG,OAAOyB,KAAKrI,EAAO6F,QAAQ,IAC9BY,EAAGE,GAAG0B,KAAKrI,EAAO6F,QAAQ,IAEtB7F,EAAOiG,SACPQ,EAAGI,MAAMwB,KAAKrI,EAAO6F,QAAQ,IAE7BY,EAAGI,MAAM6E,OAGbjF,EAAGZ,QAAQ0F,KAAK,SAAUzK,GACtBlB,EAAEK,MAAM0L,MAAM,WACVvF,EAAKwF,UAAU9K,QAO3B0E,EAAS3E,UAAU+H,eAAiB,SAAUZ,GAC1C,GAAI6D,GAAMnG,EACNK,EAAO9F,KAAKD,OAAO+F,KAEnB+F,GACArE,EAAGoE,EAAIvD,cACPf,EAAGsE,EAAItD,WAAa,EACpBlB,EAAGwE,EAAIrD,UACPzB,EAAG8E,EAAIpD,WACPnF,EAAGuI,EAAInD,aAGPV,aAAiBrC,QAEbqC,EADQ,QAARjC,EACQiC,EAAMS,WAAa,IAAMT,EAAMU,aAE/BV,EAAMM,cAAgB,KAAON,EAAMO,WAAa,GAAK,IAAMP,EAAMQ,UAAY,IAC/ER,EAAMS,WAAa,IAAMT,EAAMU,aAK7C,KAAK,GADDqD,GAAQ/D,EAAMtD,QAAQ,IAAK,KAAKA,QAAQ,IAAK,KAAKC,MAAM,KACnDrB,EAAI,EAAG0I,EAAID,EAAMzG,OAAQhC,EAAI0I,EAAG1I,IACrCyI,EAAMzI,GAAK4B,SAAS6G,EAAMzI,GAgC9B,OA7BY,YAARyC,GACA+F,EAAGrE,EAAIsE,EAAM,GACbD,EAAGvE,EAAIwE,EAAM,GACbD,EAAGzE,EAAI0E,EAAM,GACbD,EAAG/E,EAAIgF,EAAM,GACbD,EAAGxI,EAAIyI,EAAM,IACE,QAARhG,GACP+F,EAAGrE,EAAIsE,EAAM,GACbD,EAAGvE,EAAIwE,EAAM,GACbD,EAAGzE,EAAI0E,EAAM,GACbD,EAAG/E,EAAI,EACP+E,EAAGxI,EAAI,GACQ,QAARyC,GACP+F,EAAG/E,EAAIgF,EAAM,GACbD,EAAGxI,EAAIyI,EAAM,IACE,QAARhG,GACP+F,EAAGrE,EAAIsE,EAAM,GACbD,EAAGvE,EAAIwE,EAAM,GACbD,EAAGzE,EAAI0E,EAAM,GACbD,EAAG/E,EAAIgF,EAAM,GACbD,EAAGxI,EAAI,GACQ,SAARyC,IACP+F,EAAGrE,EAAIsE,EAAM,GACbD,EAAGvE,EAAIwE,EAAM,GACbD,EAAGzE,EAAI,EACPyE,EAAG/E,EAAI,EACP+E,EAAGxI,EAAI,GAGJwI,GAIXtG,EAAS3E,UAAU8G,QAAU,WACzB,GAAIvB,GAAOnG,KACPD,EAASC,KAAKD,OACd6L,EAAMnG,EACNQ,EAAYlG,EAAOkG,SAEnBA,IACAA,EAAYjG,KAAK2I,eAAe1C,GAChClG,EAAOyJ,UAAYvD,EAAUuB,EAC7BzH,EAAOkH,WAAahB,EAAUqB,EAC9BvH,EAAO6J,SAAW3D,EAAUmB,EAC5BrH,EAAO+J,WAAa7D,EAAUa,EAC9B/G,EAAOoL,aAAelF,EAAU5C,GACV,QAAftD,EAAO+F,MACd/F,EAAOyJ,UAAYoC,EAAIvD,cACvBtI,EAAOkH,WAAa2E,EAAItD,WAAa,EACrCvI,EAAO6J,SAAWgC,EAAIrD,UACtBxI,EAAO+J,WAAa,EACpB/J,EAAOoL,aAAe,GAEtBpL,EAAOyJ,UAAYoC,EAAIvD,cAAgB,CAG3C,IAAInC,GAAUnG,EAAOmG,OACjBA,IACAA,EAAUlG,KAAK2I,eAAezC,GAC9BnG,EAAOiK,QAAU9D,EAAQsB,EACzBzH,EAAOmH,SAAWhB,EAAQoB,EAC1BvH,EAAOoK,OAASjE,EAAQkB,EACxBrH,EAAOsK,SAAWnE,EAAQY,EAC1B/G,EAAOsL,WAAanF,EAAQ7C,GACN,QAAftD,EAAO+F,MACd/F,EAAOiK,QAAU4B,EAAIvD,cACrBtI,EAAOmH,SAAW0E,EAAItD,WAAa,EACnCvI,EAAOoK,OAASyB,EAAIrD,UACpBxI,EAAOsK,SAAW,GAClBtK,EAAOsL,WAAa,IAEpBtL,EAAOiK,QAAUjK,EAAOyJ,UAAY,GAIxCrD,EAAKmE,cACLnE,EAAKsB,eACLtB,EAAKoB,aACLpB,EAAKkB,eACLlB,EAAKgB,kBAST5B,EAAS3E,UAAUoL,aAAe,SAAU/F,EAAWC,GACnDlG,KAAKD,OAAOkG,UAAYA,EACxBjG,KAAKD,OAAOmG,QAAUA,EACtBlG,KAAK0H,WAOTnC,EAAS3E,UAAUqL,aAAe,SAAUC,GACxClM,KAAKD,OAAOkG,UAAYiG,EACxBlM,KAAK0H,WAQTnC,EAAS3E,UAAUuL,WAAa,SAAUD,GACtClM,KAAKD,OAAOmG,QAAUgG,EACtBlM,KAAK0H,WAGTnC,EAAS3E,UAAUwL,QAAU,WACzB,GAAIjG,GAAOnG,IACXmG,GAAKsF,OACL3I,WAAW,WACPqD,EAAKK,GAAGC,OAAO4F,WAAWC,YAAYnG,EAAKK,GAAGC,OAC9C,KAAK,GAAI8F,KAAQpG,GACbA,EAAKoG,GAAQ,WACNpG,GAAKoG,EAEhBpG,GAAKqG,UAAW,GACjB,MAUPjH,EAAS3E,UAAUyB,KAAO,SAAU7B,GAC5BA,IACAR,KAAKD,OAAOS,SAAWA,GAE3BR,KAAKoG,KAAK/D,OACVrC,KAAK6I,iBAAiB7I,KAAK+H,OAC3B/H,KAAKuG,OAAOtD,SAAS,gBAGzBsC,EAAS3E,UAAU+K,UAAY,SAAU9K,GACrC,GAAIsF,GAAOnG,KACPyM,EAAUtG,EAAK6B,cACf6D,EAAK1F,EAAKpG,OAAOS,SAASkM,KAAK1M,KAAMyM,EAAS5L,EAC9CgL,MAAO,IACM,GAAThL,EACAsF,EAAK4B,MAAQ0E,EAAQ1E,MACL,GAATlH,IACPsF,EAAK4B,MAAQ,MAEjB5B,EAAKsF,SAOblG,EAAS3E,UAAU6K,KAAO,WACtBzL,KAAKoG,KAAKuG,QACV3M,KAAKuG,OAAOpD,YAAY,gBAI5BoC,EAAS3E,UAAUyF,WAAa,SAAUuG,GACtC,GAAIzG,GAAOnG,KACP6M,EAAUC,SAASC,cAAc,MACrCF,GAAQG,UAAUC,IAAI,qBAEtBJ,EAAQK,iBAAiB,QAAS,WAC9B/G,EAAKwF,UAAU,IAEnB,IAAIvF,IAAQyG,EA8BZ,OA7BAzG,GAAK+G,OAAQ,EACb/G,EAAK/D,KAAO,WAIR,MAHA+D,GAAK+G,OAAQ,EACbN,EAAQO,aAAa,QAAS,aAC9BN,SAASO,KAAKC,YAAYT,GACnBzG,GAEXA,EAAKmH,QAAU,WASX,MARInH,GAAK+G,QACL/G,EAAK+G,OAAQ,EACbN,EAAQO,aAAa,QAAS,aAC9BtK,WAAW,WACP,GAAIuK,GAAOP,SAASO,IACpBR,GAAQR,aAAegB,GAAQA,EAAKf,YAAYO,IACjD,MAEAzG,GAEXA,EAAKuG,MAAQ,WACLvG,EAAK+G,QACDP,EACIA,OAAe,GACfxG,EAAKmH,UAGTnH,EAAKmH,YAIVnH,GAUX1G,EAAI8N,SAAW,SAAUzN,GACrB,MAAO,IAAIwF,GAASxF,KAEzBL,GAAO4B,OAAQhC,GAYlB,SAAWI,EAAKC,EAAGH,GAuBf,QAASiO,GAAe3N,EAAKC,GACzBC,KAAKD,OAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAC/CC,KAAKG,GAAKR,EAAEG,GAAKsC,IAAI,GACrBpC,KAAKU,QAGT+M,EAAe7M,WAgBXV,eACIW,MAAO,KACPR,UAAU,EACVS,SAAU,IACVP,WAAW,EACXC,SAAU,KACVkN,UAAW,MAEfhN,MAAO,WACHV,KAAKe,QAAUpB,EAAE,yBAA0BK,KAAKG,IAChDH,KAAKgB,cAAgBrB,EAAE,MAAOK,KAAKe,SAEnCf,KAAK2N,SAAW,EAChB3N,KAAK4N,qBACL5N,KAAKS,aAAe,EACpBT,KAAK6N,QAAU,EACf7N,KAAK8N,UAAW,EAGhB9N,KAAKgB,cAAc+M,MAAM,EAAG/N,KAAK2N,UAAUK,QAAQ1K,SAAStD,KAAKe,SACjEf,KAAKiB,KAAOjB,KAAKgB,cAAcC,MAE/B,IAAIC,GAAOlB,IAmBX,IAlBIA,KAAKD,OAAO2N,WACZ/N,EAAE,MAAOK,KAAKe,SAASuK,KAAK,SAAUjI,GAClC1D,EAAEK,MAAM0L,MAAM,WACVxK,EAAKnB,OAAO2N,UAAUhB,KAAK1M,KAAMqD,EAAInC,EAAKD,UAKtDjB,KAAKiO,aAELjO,KAAKkO,OAAS,GAAI1O,GAAO2O,QAAQnO,KAAKG,IACtCH,KAAKkO,OAAOjB,IAAI,GAAIzN,GAAO4O,KAAKC,UAAW7O,EAAO8O,qBAAsBC,UAAW,MACnFvO,KAAKkO,OAAOM,GAAG,oCAAqChP,EAAOiP,OAAOzO,KAAK0O,OAAQ1O,OAE/EL,EAAE2B,QAAQC,OAAO,WACbL,EAAKM,YAGgB,MAArBxB,KAAKD,OAAOc,MAAe,CAC3B,GAAIM,GAAcnB,KAAKgB,cAAcI,OAAO,gBAAgBP,OAC5Db,MAAKD,OAAOc,MAAQM,MAAoBA,EAAc,EAGtDnB,KAAKD,OAAOQ,WACZP,KAAKqB,gBAGTrB,KAAKqC,KAAKrC,KAAKD,OAAOc,OAAO,IAKjCyB,KAAM,WACFtC,KAAKgC,SACLhC,KAAKD,OAAOM,UAAW,GAE3B2B,OAAQ,WACAhC,KAAKuC,YACLC,aAAaxC,KAAKuC,WAClBvC,KAAKuC,UAAY,OAMzBE,KAAM,WACF,GAAI5B,GAA6B,GAArBb,KAAKS,aAAoBT,KAAKiB,KAAO,EAAIjB,KAAKS,aAAe,CACrEI,IAASb,KAAKiB,KAAO,IACrBjB,KAAKmN,MAAMnN,KAAKiB,MAAM,GACtBjB,KAAKe,QAAQ4N,SAEjB3O,KAAKmN,MAAMtM,IAKf6B,KAAM,WACF,GAAI7B,GAAQb,KAAKS,cAAgBT,KAAKiB,KAAO,EAAIjB,KAAKS,aAAe,CACxD,IAATI,IACAb,KAAKmN,MAAM,GAAG,GACdnN,KAAKe,QAAQ4N,SAEjB3O,KAAKmN,MAAMtM,IAQfwB,KAAM,SAAUxB,GACZ,GAAIA,GAAQA,EAAQb,KAAKiB,IACrBJ,GAAQ,IACRA,EAAQb,KAAKiB,KAAOJ,GAExBb,KAAKmN,MAAMtM,IAKfF,KAAM,WACFX,KAAKD,OAAOM,UAAW,EACvBL,KAAK6C,SAETA,MAAO,WACH,GAAI7C,KAAKD,OAAOM,WAAaL,KAAKuC,UAAW,CACzC,GAAIrB,GAAOlB,IACXA,MAAKuC,UAAYO,WAAW,WACxB5B,EAAKqB,UAAY,KACjBrB,EAAKwB,QACNxB,EAAKnB,OAAOe,YAGvBO,cAAe,WAEX,IAAK,GADD+B,GAAO,GACFC,EAAI,EAAGA,EAAIrD,KAAKiB,KAAMoC,IAC3BD,GAAQ,WAEZA,GAAO,sCAAwCA,EAAO,QACtDpD,KAAKO,UAAYZ,EAAEyD,GAAME,SAAStD,KAAKG,IACvCH,KAAKgD,gBAAkBrD,EAAE,KAAMK,KAAKO,YAExC0N,WAAY,WACRjO,KAAK4O,YAAc5O,KAAKe,QAAQ8N,YAAW,GAC3C7O,KAAK8O,SAAW9O,KAAKgB,cAAcZ,GAAG,GAAGyO,YAAW,GACpD7O,KAAK+O,SAAW/O,KAAKiB,KAAOjB,KAAK8O,SACjCnP,EAAEK,KAAKe,SAASoC,YAAY,wBAAwBwL,OAEpD,IAAIzN,GAAOlB,IACXL,GAAE,MAAOK,KAAKe,SAASuK,KAAK,SAAUzK,EAAOmO,GACzC9N,EAAK0M,kBAAkB/M,GAASlB,EAAEK,MAAMiP,WAAWC,QAM3D1N,QAAS,WACDxB,KAAK4O,aAAe5O,KAAKe,QAAQ8N,YAAW,KAC5C7O,KAAKiO,aACLjO,KAAKmN,MAAMnN,KAAKS,cAAc,KAGtC0O,MAAO,SAAUtB,GACb7N,KAAKgC,SACLrC,EAAEK,KAAKe,SAASoC,YAAY,uBAC5B,IAAIiM,IAAQpP,KAAK6N,QAAUA,GAAW7N,KAAK+O,QAC3CK,IAAQA,EAAOpP,KAAK+O,UAAY/O,KAAK+O,SACrC/O,KAAKqP,eAAiBD,EAEtBA,GAAQA,EAAO,KACfzP,EAAEK,KAAKe,SAASuO,IAAI,YAAa,eAAiBF,EAAO,YAE7DjC,MAAO,SAAUtM,EAAO0O,GAChBA,KAAY,IACZA,GAAU,GAGdvP,KAAKgC,SACLrC,EAAEK,KAAKe,SAASyO,YAAY,uBAAwBD,GACpDvP,KAAKS,aAAeI,EAAQb,KAAKiB,KACjCjB,KAAK8N,SAAWjN,GAASb,KAAKiB,KAE9BjB,KAAK6N,QAAU7N,KAAK4N,kBAAkB/M,EACtC,IAAIuO,IAASpP,KAAK6N,QAAU,IAE5BlO,GAAEK,KAAKe,SAASuO,IAAI,YAAa,eAAiBF,EAAO,UAEzD,IAAI3O,GAAeT,KAAKS,YACpB8O,IAAWvP,KAAKD,OAAOS,UACvBR,KAAKD,OAAOS,SAASC,EAAcT,KAAK8N,UAGxC9N,KAAKO,WACLP,KAAKgD,gBAAgB5C,GAAGK,GAAcwC,SAAS,eAAeC,WAAWC,YAAY,eAEzFnD,KAAKgB,cAAcZ,GAAGK,GAAcwC,SAAS,eAAeC,WAAWC,YAAY,eAEnFnD,KAAK6C,SAET6L,OAAQ,SAAUe,GACd,GAAIC,GAAQD,EAAGE,MAEf,IAAe,UAAXF,EAAG3J,MAA+B,aAAX2J,EAAG3J,KAAqB,CAC/C,GAAIiC,GAAQ2H,EAAQ1P,KAAK8O,SACrBc,EAAW3K,SAASH,KAAK+K,IAAI9H,IAC7B+H,EAAUhL,KAAK+K,IAAI9H,GAAS,CAE5B+H,GAAU,KACVF,GAAsB,GAEtB7H,EAAQ,IACR6H,GAAYA,EAGhB,IAAI/O,IAASb,KAAKS,aAAemP,GAAY5P,KAAKiB,IAClDJ,IAASA,EAAQb,KAAKiB,MAAQjB,KAAKiB,KAGtB,GAATJ,GAAcb,KAAKqP,eAAiBrP,KAAK8O,WACzCjO,EAAQb,KAAKiB,MAEjBjB,KAAKmN,MAAMtM,OACO,WAAX4O,EAAG3J,MACV9F,KAAKmP,MAAMO,KAavBhQ,EAAIqQ,eAAiB,SAAUjQ,EAAKC,GAChC,MAAO,IAAI0N,GAAe3N,EAAKC,KAEpCL,GAAO4B,OAAQhC,EAAQE,GAE1B,SAAWE,EAAKC,GAEZ,QAASqQ,GAAeC,EAAcrD,GAIlC,QAASsD,GAAaC,GAElB,GAAIA,EAAEC,SAAWpQ,KAEjB,IADA4M,EAASF,KAAK1M,KAAMmQ,GACf9M,EAAI,EAAGA,EAAIgN,EAAOhL,OAAQhC,IAC3B2L,EAAIsB,IAAID,EAAOhN,GAAI6M,GAR3B,GACI7M,GADAgN,EAASJ,EACNjB,EAAMhP,IAWb,IAAI4M,EACA,IAAKvJ,EAAI,EAAGA,EAAIgN,EAAOhL,OAAQhC,IAC3B2L,EAAIR,GAAG6B,EAAOhN,GAAI6M,GA+Z9B,QAASK,GAAaJ,GAElB,GAAIK,GAAU7Q,EAAEK,KACNwQ,GAAQ3I,KAAK,OAwBnB2I,GAAQC,SAAS,uBACb9Q,EAAE,2BAA2B0F,OAAS,GAAKqL,EAASC,qBACpDjR,EAAIkR,WAAW,2BACfjR,EAAE,mCAAmC0F,OAAS,GAAKqL,EAASG,uBAC5DnR,EAAIkR,WAAW,oCAGnBJ,EAAQC,SAAS,sBACb9Q,EAAE,2BAA2B0F,OAAS,GAAKqL,EAASI,qBACpDpR,EAAIkR,WAAW,uBA9b3BjR,EAAEoR,GAAGC,cAAgB,SAAUpE,GAE3B,MADAoD,GAAetD,KAAK1M,MAAO,sBAAuB,iBAAkB4M,GAC7D5M,KAGX,IAAIiR,GAAwBnE,SAASC,cAAc,OAE/C2D,GACAQ,WAAY,GACZC,YAAY,EACZC,cAAe,KACfC,kBAAmB,KACnBC,oBAAqB,MACrBC,eAAgBzE,SAASO,KAAOP,SAASO,KAAO,OAGpD3N,GAAIyR,cAEJzR,EAAI8R,qBAAuB,WACnB9R,EAAIyR,WAAW9L,QACd3F,EAAIyR,WAAWM,WAIxB/R,EAAIgS,MAAQ,SAAUC,GAClBA,EAASA,KACT,IAAIC,GAAc,EAClB,IAAID,EAAO/L,SAAW+L,EAAO/L,QAAQP,OAAS,EAC1C,IAAK,GAAIhC,GAAI,EAAGA,EAAIsO,EAAO/L,QAAQP,OAAQhC,IACvCuO,GAAe,iCAAmCD,EAAO/L,QAAQvC,GAAGwO,KAAO,yBAA2B,IAAM,KAAOF,EAAO/L,QAAQvC,GAAG+E,KAAO,SAGpJ,IAAI0J,GAAaH,EAAOG,YAAc,GAClCC,EAAYJ,EAAOK,MAAQ,gCAAkCL,EAAOK,MAAQ,SAAW,GACvFC,EAAWN,EAAOvJ,KAAO,+BAAiCuJ,EAAOvJ,KAAO,SAAW,GACnF8J,EAAgBP,EAAOQ,UAAYR,EAAOQ,UAAY,GACtDC,EAAaT,EAAO/L,SAAqC,IAA1B+L,EAAO/L,QAAQP,OAAwC,GAAzB,uBAC7DgN,EAAkBV,EAAOU,gBAAkB,6BAA+B,GAE1EC,EAAY,yBAA2BR,EAAa,IAAMM,EAAY,mCAAqCL,EAAYE,EAAWC,GAAiB,uCAAyCG,EAAkB,KAAOT,EAAc,cAEvOX,GAAsBsB,UAAYD,CAElC,IAAIZ,GAAQ/R,EAAEsR,GAAuBuB,UAarC,OAXA7S,GAAE+Q,EAASa,gBAAgBkB,OAAOf,EAAM,IAGxCA,EAAMgB,KAAK,qBAAqBpH,KAAK,SAAUzK,EAAOV,GAClDR,EAAEQ,GAAIqO,GAAG,QAAS,SAAU2B,GACpBwB,EAAO/L,QAAQ/E,GAAO8L,SAAU,GAAOjN,EAAIkR,WAAWc,GACtDC,EAAO/L,QAAQ/E,GAAO8R,SAAShB,EAAO/L,QAAQ/E,GAAO8R,QAAQjB,EAAOvB,GACpEwB,EAAOgB,SAAShB,EAAOgB,QAAQjB,EAAO7Q,OAGlDnB,EAAIkT,UAAUlB,GACPA,EAAM,IAWjBhS,EAAImT,MAAQ,SAAUzK,EAAM4J,EAAOc,GAK/B,MAJqB,kBAAVd,KACPc,EAAaC,UAAU,GACvBf,EAAQgB,QAELtT,EAAIgS,OACPtJ,KAAMA,GAAQ,GACd4J,MAAwB,mBAAVA,GAAwBtB,EAASQ,WAAac,EAC5DpM,UAAWwC,KAAMsI,EAASU,cAAeS,MAAM,EAAMc,QAASG,OAatEpT,EAAIuT,QAAU,SAAU7K,EAAM4J,EAAOc,EAAYI,GAM7C,MALqB,kBAAVlB,KACPkB,EAAiBH,UAAU,GAC3BD,EAAaC,UAAU,GACvBf,EAAQgB,QAELtT,EAAIgS,OACPtJ,KAAMA,GAAQ,GACd4J,MAAwB,mBAAVA,GAAwBtB,EAASQ,WAAac,EAC5DpM,UACKwC,KAAMsI,EAASW,kBAAmBQ,MAAM,EAAMc,QAASO,IACvD9K,KAAMsI,EAASU,cAAeS,MAAM,EAAMc,QAASG,OAchEpT,EAAIyT,OAAS,SAAU/K,EAAM4J,EAAOc,EAAYI,GAM5C,MALqB,kBAAVlB,KACPkB,EAAiBH,UAAU,GAC3BD,EAAaC,UAAU,GACvBf,EAAQgB,QAELtT,EAAIgS,OACPtJ,KAAMA,GAAQ,GACd4J,MAAwB,mBAAVA,GAAwBtB,EAASQ,WAAac,EAC5DG,UAAW,mDACXvM,UAEQwC,KAAMsI,EAASW,oBAGfjJ,KAAMsI,EAASU,cACfS,MAAM,IAGdc,QAAS,SAAUjB,EAAO7Q,GACR,IAAVA,GAAeqS,GAAgBA,EAAevT,EAAE+R,GAAOgB,KAAK,yBAAyB7H,OAC3E,IAAVhK,GAAeiS,GAAYA,EAAWnT,EAAE+R,GAAOgB,KAAK,yBAAyB7H,UAK7F,IAAIuI,IAAU,EACVC,GAAe,EACfC,GAAU,EACVC,EAAc,IASlB7T,GAAI8T,cAAgB,SAAUxB,EAAOyB,GAkBjC,MAjBA/T,GAAIgU,eAAc,GAElBhU,EAAI8T,cAAcG,eAAiBjU,EAAIgS,OACnCM,MAAOA,GAAStB,EAASY,oBACzBlJ,KAAM,sCAGPqL,IACCL,GAAU,EACVG,EAAczQ,WAAW,WACrBuQ,GAAe,EACZC,GACC5T,EAAIgU,iBAETD,IAGA/T,EAAI8T,cAAcG,gBAS7BjU,EAAIgU,cAAgB,SAAUE,GACvBA,IAAUR,GAAYA,GAAWC,GAC7BO,GAASL,GACRjS,OAAOkB,aAAa+Q,GAExB7T,EAAI8T,cAAcG,gBAAkBjU,EAAIkR,WAAWlR,EAAI8T,cAAcG,gBACrEP,GAAU,EACVC,GAAe,EACfC,GAAU,EACVC,EAAc,MAEdD,GAAU,GAQlB5T,EAAImU,cAAgB,WACZlU,EAAE,kCAAkC,IACxCA,EAAE+Q,EAASa,gBAAgBkB,OAAO,gKAOtC/S,EAAIoU,cAAgB,WAChBnU,EAAE,oEAAoEoU,UAe1ErU,EAAIsU,QAAU,SAAUrC,GACpB,GAAID,GAAOuC,EAAeC,CAC1BvC,GAASA,MAELA,EAAOtM,OAAS,IAAM1F,EAAEwU,QAAQxC,EAAO,MACvCA,GAAUA,GAId,KAAK,GAFDW,GACAV,EAAc,GACTvO,EAAI,EAAGA,EAAIsO,EAAOtM,OAAQhC,IAC/B,IAAK,GAAI0I,GAAI,EAAGA,EAAI4F,EAAOtO,GAAGgC,OAAQ0G,IAAK,CAC7B,IAANA,IAAS6F,GAAe,wCAC5B,IAAIwC,GAASzC,EAAOtO,GAAG0I,GACnBsI,EAAcD,EAAO7I,MAAQ,0BAA4B,0BACzD6I,GAAOvC,OAAMwC,GAAe,kCAC5BD,EAAOE,QAAOD,GAAe,cAAgBD,EAAOE,OACpDF,EAAOG,KAAIF,GAAe,WAAaD,EAAOG,IAC9CH,EAAOI,WAAUH,GAAe,aACpCzC,GAAe,gBAAkByC,EAAc,KAAOD,EAAOhM,KAAO,UAChE2D,IAAM4F,EAAOtO,GAAGgC,OAAS,IAAGuM,GAAe,UAGvDU,EAAY,kCAAoCV,EAAc,SAC9DX,EAAsBsB,UAAYD,EAClCZ,EAAQ/R,EAAEsR,GAAuBuB,WACjC7S,EAAE+Q,EAASa,gBAAgBkB,OAAOf,EAAM,IACxCuC,EAAgB,2BAChBC,EAAiB,2BAEjB,IAAIO,GAAS/C,EAAMgB,KAAKuB,EAmBxB,OAlBAQ,GAAOnJ,KAAK,SAAUzK,EAAOV,GACzB,GAAIuU,GAAa7T,CACjBlB,GAAEQ,GAAIqS,WAAWlH,KAAK,SAAUzK,EAAOV,GACnC,GAEIwU,GAFAC,EAAc/T,EACdgU,EAAelD,EAAO+C,GAAYE,EAElCjV,GAAEQ,GAAI2U,GAAGZ,KAAiBS,EAAchV,EAAEQ,IAG1CwU,GACAA,EAAYnG,GAAG,QAAS,SAAU2B,GAC1B0E,EAAalI,SAAU,GAAOjN,EAAIkR,WAAWc,GAC7CmD,EAAalC,SAASkC,EAAalC,QAAQjB,EAAOvB,SAKtEzQ,EAAIkT,UAAUlB,GACPA,EAAM,IAWjBhS,EAAIqV,MAAQ,SAAUC,EAAKlU,EAAUmU,GACjC,GAAIC,GAASvV,EAAE,oCAAsCsV,GAAc,IAAM,KAAOD,EAAM,UAAU1R,SAASwJ,SAASO,KAClH3N,GAAIkT,UAAUsC,EAAQ,WAClBpS,WAAW,WACPpD,EAAIkR,WAAWsE,IAChBpU,GAAY,QAIvBpB,EAAIkT,UAAY,SAAUlB,EAAOyD,GAC7BzD,EAAQ/R,EAAE+R,EACV,IAAI0D,GAAU1D,EAAMjB,SAAS,aACzB4E,GAAc3D,EAAMjB,SAAS,YAGjC,IAFI4E,GAAa,EAEb1V,EAAE,+CAA+C0F,QAAUqL,EAASS,YAAciE,GAAWC,EAI7F,WAHA3V,GAAIyR,WAAWtM,KAAK,WAChBnF,EAAIkT,UAAUlB,EAAOyD,IAK7B,IAAIG,GAAU5D,EAAMjB,SAAS,aACzB8E,EAAgB7D,EAAMjB,SAAS,oBAC/B+E,EAAgB9D,EAAMjB,SAAS,oBAC/BgF,EAAU/D,EAAMjB,SAAS,YAEzB2E,KACA1D,EAAMrP,OACNqP,EAAMpC,KACFoG,WAAY5Q,KAAK6Q,MAAMjE,EAAMkE,cAAgB,GAAK,QAItDH,GACA/D,EAAMpC,KACFuG,YAAa/Q,KAAK6Q,MAAMjE,EAAM7C,aAAe,GAAM,MAI3D,IAAIiH,EACCP,IAAkBC,GAAkBC,IACE,IAAnC9V,EAAE,sBAAsB0F,QAAiBiQ,GACzC3V,EAAE+Q,EAASa,gBAAgBkB,OAAO,yCAEC,IAAnC9S,EAAE,sBAAsB0F,QAAgBiQ,GACxC3V,EAAE+Q,EAASa,gBAAgBkB,OAAO,yCAEtCqD,EAAoBnW,EAAV2V,EAAY,qBAA0B,sBAInC5D,GAAM,GAAGqE,UAsB1B,OAnBArE,GAAMsE,QAAQ,QAGVR,GACA7V,EAAE+Q,EAASa,gBAAgBtO,SAAS,yBAInCsS,GAAkBC,GAAkBC,GACrCK,EAAQ7S,SAAS,6BAErByO,EAAMvO,YAAY,iBAAiBF,SAAS,gBAAgB+N,cAAc,SAAUb,GAC5EuB,EAAMjB,SAAS,iBAAkBiB,EAAMsE,QAAQ,UAC9CtE,EAAMsE,QAAQ,YAGL,kBAAPb,IACPA,EAAGzI,KAAK1M,OAEL,GAGXN,EAAIkR,WAAa,SAAUc,GAEvB,GADAA,EAAQ/R,EAAE+R,GAAS,iBACE,mBAAVA,IAA0C,IAAjBA,EAAMrM,OAA1C,CAGA,GAAI+P,GAAU1D,EAAMjB,SAAS,aACzB6E,EAAU5D,EAAMjB,SAAS,aACzBgF,EAAU/D,EAAMjB,SAAS,aACzB8E,EAAgB7D,EAAMjB,SAAS,oBAC/B+E,EAAgB9D,EAAMjB,SAAS,oBAC/BwF,EAAgBvE,EAAMjB,SAAS,uBAC/BqF,EAAoBnW,EAAV2V,EAAY,qBAA0B,qBAsCpD,OArCIA,GACI5D,EAAMrM,SAAW1F,EAAE,2BAA2B0F,QAC9CyQ,EAAQ3S,YAAY,6BAGjBqS,GAAiBC,GACxBK,EAAQ3S,YAAY,6BAExBuO,EAAMsE,QAAQ,SAGVR,IACA7V,EAAE+Q,EAASa,gBAAgBpO,YAAY,yBACvCxD,EAAE+Q,EAASa,gBAAgBtO,SAAS,6BAGxCyO,EAAMvO,YAAY,gBAAgBF,SAAS,iBAAiB+N,cAAc,SAAUb,GAC5EuB,EAAMjB,SAAS,iBAAkBiB,EAAMsE,QAAQ,UAC9CtE,EAAMsE,QAAQ,UAEfR,GACA7V,EAAE+Q,EAASa,gBAAgBpO,YAAY,4BAEvCmS,GAAWC,GAAiBC,GAC5B9D,EAAMvO,YAAY,iBAAiBsI,OAC/BwK,GAAiBvE,EAAMrM,OAAS,GAChCqM,EAAMqC,UAIVrC,EAAMqC,WAGVqB,GAAW1E,EAASS,YACpBzR,EAAI8R,wBAGD,IA2CX7R,EAAEmN,UAAU0B,GAAG,QAAS,gGAAiG+B,IAC1H7Q,GAAO4B,OAAQhC,GAElB,SAAWI,EAAKC,GAmDZ,QAASuW,GAAOpW,EAAKC,GACjBC,KAAKD,OAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAC/CC,KAAKmW,QAAUxW,EAAEK,KAAKD,OAAOqW,YAC7BpW,KAAKqW,IAAM1W,EAAEG,GACbE,KAAKe,QAAUpB,EAAE,MAAOK,KAAKmW,SAC7BnW,KAAKsW,SAAW3W,EAAE,MAAOK,KAAKe,SAC9Bf,KAAKuW,KAAO5W,EAAE,KAAMK,KAAKqW,IACzB,IAAIG,GAAKxW,KAELmB,EAAcnB,KAAKuW,KAAKnV,OAAO,gBAAgBP,OAC/CM,SACAA,EAAcnB,KAAKsW,SAASlV,OAAO,gBAAgBP,SAEvDb,KAAKD,OAAOc,MAAQM,MAAoBA,EAAc,EAEjDnB,KAAKD,OAAOwP,SACbvP,KAAKe,QAAQkC,SAAS,oBAG1BjD,KAAKuW,KAAKjL,KAAK,SAAUzK,EAAOwC,GAC5B1D,EAAEK,MAAM0L,MAAM,WACV8K,EAAGnU,KAAKxB,OAIhBb,KAAKyW,UAAY,KACjBzW,KAAKS,aAAe,KACpB+V,EAAGnU,KAAKrC,KAAKD,OAAOc,OAYxBqV,EAAOtV,UAAUV,eACbqP,SAAS,EACT6G,WAAY,mBACZ5V,SAAU,SAAUC,EAAcgW,MAQtCP,EAAOtV,UAAUyB,KAAO,SAAUxB,GAC1Bb,KAAKS,cAAgBI,IACrBlB,EAAEK,KAAKsW,SAASzV,IAAQoC,SAAS,YAE7BjD,KAAKD,OAAOwP,SACU,MAAlBvP,KAAKyW,WAAqBzW,KAAKyW,WAAa5V,GAC5ClB,EAAEK,KAAKsW,SAAStW,KAAKyW,YAAYtT,YAAY,YAGxB,MAArBnD,KAAKS,eACDT,KAAKS,aAAeI,EACE,MAAlBb,KAAKyW,WAAqBzW,KAAKyW,UAAYzW,KAAKS,cAChDT,KAAKe,QAAQkC,SAAS,oBAAoBE,YAAY,yBAAyBwL,SAG7D,MAAlB3O,KAAKyW,WAAqBzW,KAAKyW,UAAYzW,KAAKS,eAChDT,KAAKe,QAAQkC,SAAS,oBAAoBA,SAAS,yBAAyB0L,QAGpF3O,KAAKe,QAAQoC,YAAY,oBAAoBqM,YAAY,2BAG7D7P,EAAEK,KAAKsW,SAAStW,KAAKS,eAAe0C,YAAY,YAIpDxD,EAAEK,KAAKsW,SAASzV,IAAQoC,SAAS,eAAeC,SAAS,gBAAgBC,YAAY,eACrFxD,EAAEK,KAAKuW,KAAK1V,IAAQoC,SAAS,eAAeC,SAAS,gBAAgBC,YAAY,eAEjFnD,KAAKyW,UAAYzW,KAAKS,aACtBT,KAAKS,aAAeI,EAEhBb,KAAKD,OAAOS,UACZR,KAAKD,OAAOS,SAASR,KAAKS,aAAcT,KAAKyW,aAazD/W,EAAIgX,OAAS,SAAU5W,EAAKC,GACxB,MAAO,IAAImW,GAAOpW,EAAKC,KAE5BL,GAAO4B,OAAQhC,GAElB,SAAWI,EAAKC,GACZ,QAASqQ,GAAeC,EAAcrD,GAIlC,QAASsD,GAAaC,GAClB,GAAIA,EAAEC,SAAWpQ,KAEjB,IADA4M,EAASF,KAAK1M,KAAMmQ,GACf9M,EAAI,EAAGA,EAAIgN,EAAOhL,OAAQhC,IAC3B2L,EAAIsB,IAAID,EAAOhN,GAAI6M,GAP3B,GACI7M,GADAgN,EAASJ,EACNjB,EAAMhP,IAUb,IAAI4M,EACA,IAAKvJ,EAAI,EAAGA,EAAIgN,EAAOhL,OAAQhC,IAC3B2L,EAAIR,GAAG6B,EAAOhN,GAAI6M,GAU9B,QAASyG,GAAWC,EAAKC,EAAKlF,GAC1B,GAAImF,GAAOF,EAAI7J,cAAc,OAC7B+J,GAAKC,OAASF,EACdC,EAAKE,OAAS,OACdF,EAAKG,MAAMC,QAAU,MAErB,KAAK,GAAIC,KAAKxF,GAAQ,CAClB,GAAIyF,GAAMR,EAAI7J,cAAc,QAC5BqK,GAAItR,KAAK,SACTsR,EAAI7K,KAAO4K,EACXC,EAAIrP,MAAS4J,EAAOwF,GACpBL,EAAKxJ,YAAY8J,GAGrBR,EAAIvJ,KAAKC,YAAYwJ,GACrBA,EAAKO,SAIT,QAASC,KACDC,IACAC,EAAW7X,EAAE,cACS,GAAnB6X,EAASvW,SACRuW,EAAY7X,EAAE,wDAAwD8X,EAAc,SAASC,EAAa,aAAapU,SAAS,SAEpIiU,GAAW,GAKnB,QAASI,GAAWC,GAChB,MAAOjY,GAAEiY,GAAMnH,SAASgH,GApC5B9X,EAAEoR,GAAG8G,aAAe,SAAUjL,GAE1B,MADAoD,GAAetD,KAAK1M,MAAO,qBAAsB,gBAAiB4M,GAC3D5M,KAqCX,IAAI4X,MACAL,GAAW,EACXO,KACAC,EAAS,EACTL,EAAe,WACfF,EAAW,KACXQ,EAAiB,4BACjBC,EAAmB,6BACnBC,EAAY,gBACZT,EAAgB,gBAChBU,EAAiB,gBA0BrBP,GAAK1X,eACDkQ,OAAQ9O,OAAO8W,OACfC,aACAC,cACA3G,UACApC,SAAS,EACTgJ,aAAa,EACbC,eAAgB,QAChBxB,OAAS,KACTyB,eAAgB,IAChBC,KAAM,KACNC,SAAU,GACVnY,SAAS,cAKboX,EAAKgB,SAAW,SAAU/B,EAAK9W,GAuB3B,QAAS8Y,KACF9Y,EAAOwY,aACN7Y,EAAIgU,gBAGL3T,EAAOwP,SACNuJ,EAAY3V,YAAY6U,GAG5Be,EAAQ7V,SAAS,aAAaC,YAAY,YACvCpD,EAAOS,UACNT,EAAOS,WAjCf,GAAIuY,GAAU,KACVC,EAAYtB,EAAgBK,GAChCD,GAAKkB,GAAanC,EAElBS,IAEGvX,EAAOwY,aACN7Y,EAAI8T,cAAczT,EAAOyY,eAAgBzY,EAAO0Y,gBAIhDM,EAAUpZ,EADM,QAAjBI,EAAOiX,OACM,6BAA6BgC,EAAU,gBAAgBjZ,EAAO4Y,SAAS,oDAEvE,6BAA6BK,EAAU,gBAAgBjZ,EAAO4Y,SAAS,0CAA0C9B,EAAI,oBAGrI,IAAIoC,GAAWtB,EAAWhY,EAAE,iBAAkB6X,IAC1CsB,EAAcC,CAkClB,IAjCGE,IACCH,EAActB,EAASvU,SAASkV,IAkBpCxY,EAAE,mBAAoBoZ,GAASG,IAAI,OAAQ,WACvCH,EAAQ9V,SAAS,YAAY0L,QAE1BsK,GACCH,EAAY3V,YAAYgV,GAEzBpY,EAAOwP,QACNuJ,EAAY7V,SAAS+U,GAAgBH,aAAagB,GAElDA,MAIRE,EAAQzV,SAASkU,GACG,QAAjBzX,EAAOiX,OAAkB,CACxB,GAAImC,GAAUxZ,EAAE,mBAAoBoZ,GAAS,GAAGK,eAChDzC,GAAWwC,EAAStC,EAAK9W,EAAO4R,UAKxCiG,EAAKyB,SAAW,SAAUxC,EAAK9W,GAC3BA,EAAOiX,OAAS,OAChBY,EAAKgB,SAAS/B,EAAK9W,IAIvB6X,EAAK0B,SAAW,SAAUvZ,GA4BtB,QAAS8Y,KACLlZ,EAAEK,MAAMmD,YAAY8U,GACpBL,EAAK2B,QAAQ,aAAaxF,QAE1B,IACIyF,GADAC,EAAS9Z,EAAE,mBAAoBiY,EAI/B4B,GADgB,GAAjBC,EAAOxY,OACGK,OAAOwL,SAEP2M,EAAO,GAAGL,gBAGpBH,GACCzB,EAASvU,SAASkV,EAGtB,IAAIuB,GAAMF,EAAOG,YAAY,QAC7BD,GAAIE,UAAU1B,GAAW,GAAM,GAC5BnY,EAAO2Y,OACNgB,EAAIhB,KAAO3Y,EAAO2Y,MAEtBc,EAAOnM,KAAKwM,cAAcH,GACvB3Z,EAAOS,UACNT,EAAOS,WAnDf,GAAI6X,GAAYtY,EAAOsY,UACnBT,EAAO,KACPkC,EAAUna,EAAE,qBAAsB6X,EAEtC,IAAGzX,EAAO4Y,SACNf,EAAQjY,EAAE,wBAAwBI,EAAO4Y,SAAS,WAAYnB,OAC5D,IAAgB,GAAba,EACLT,EAAOjY,EAAE,kBAAmB6X,OAC1B,CACF,GAAIuC,GAAWD,EAAQE,QAAQ,YAE3BpC,GAAMjY,EADP0Y,EAAY,EACH0B,GAAU1B,EAAY,GAEtB0B,EAASA,EAAS9Y,OAASoX,IAI3C,GAAIS,GAAcgB,EACdb,EAAWtB,EAAWC,EAGvBqB,GACCH,EAActB,EAEdI,EAAK3U,SAAS,YA+BflD,EAAOwP,QACNuJ,EAAY7V,SAASgV,GAAiBJ,aAAagB,GAEnDA,KAKRjB,EAAKqC,UAAY,SAAUla,GACvB,GAAIuY,GAAavY,EAAOuY,WACpByB,EAAWpa,EAAE,qBAAsB6X,GAAUwC,QAAQ,YAGrD1B,GADDvY,EAAO4Y,SACQhZ,EAAE,wBAAwBI,EAAO4Y,SAAS,WAAYnB,GAAU3W,QACzEyX,EAAa,GACJA,EAAY,EAEbyB,EAAS9Y,OAASqX,EAGnC3Y,EAAEoa,EAASzB,IAAavE,SACrBhU,EAAOS,UACNT,EAAOS,YAUfoX,EAAKsC,KAAO,SAAUrD,EAAK9W,GACvBA,EAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAC1CA,EAAOqQ,OAAO1Q,IAAIkY,KAAKgB,SAAS/B,EAAK9W,IASzC6X,EAAKuC,KAAO,SAAUtD,EAAK9W,GACvBA,EAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAC1CA,EAAOiX,OAAS,OAChBjX,EAAOqQ,OAAO1Q,IAAIkY,KAAKgB,SAAS/B,EAAK9W,IAQzC6X,EAAKwC,KAAO,SAAUra,GAClBA,EAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAC1CA,EAAOqQ,OAAO1Q,IAAIkY,KAAK0B,SAASvZ,IAQpC6X,EAAKyC,SAAW,SAAUta,GACtBA,EAASA,MACTA,EAAOsY,UAAY,EACnBT,EAAKwC,KAAKra,IAId6X,EAAKjL,MAAQ,SAAU5M,GACnBA,EAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAC1CA,EAAOqQ,OAAO1Q,IAAIkY,KAAKqC,UAAUla,IASrC6X,EAAK0C,OAAS,SAAUF,GACpBza,EAAE,QAAQ6O,GAAG0J,EAAW,SAAU/H,GAC9B,GAAIuI,GAAOvI,EAAEoK,cAAc7B,IAC3B0B,GAAK1B,MAKbhZ,EAAIkY,KAAOA,GACZlY,GAAO4B,OAAQhC,GAGlB,SAAWI,EAAKC,EAAGH,GAQf,QAASgb,GAAMlR,GACX,MAAOA,GAAI,IAWf,QAAS9D,GAAO1F,EAAKC,GACjBC,KAAKG,GAAKR,EAAEG,GAAK,GACjBE,KAAKD,OAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAC/CC,KAAKU,QAtBT,GAAI+Z,GAAe,EACfC,EAAI,GACJC,EAAY,IAAMF,EAClBG,EAAYD,CAmChBnV,GAAO5E,UAAUV,eACb2G,QAAQ,EACR6R,QACA3R,SAAU,MAGdvB,EAAO5E,UAAUF,MAAQ,WACrB,GAAIyF,GAAOnG,IACXA,MAAK6a,KAAOlb,EAAE,MAAOK,KAAKG,IAC1BH,KAAKa,MAAQ,KACbb,KAAK6G,SAAW7G,KAAKD,OAAO8G,OAE5B7G,KAAK8a,WAAa,EAClB9a,KAAK+a,YAAc/a,KAAK8a,WAAaF,EACrC5a,KAAKgb,iBAAkB,EACvBhb,KAAKib,UAAY,KAGdvb,EAAI+D,OAAOU,KACVnE,KAAK6a,KAAKvL,IAAI,mBAAoB,iBAAiBkL,EAAME,GAAG,OAIhE1a,KAAK0K,SAAS1K,KAAKD,OAAO2Y,MAE1B1Y,KAAKkO,OAAS,GAAI1O,GAAO2O,QAAQnO,KAAKG,IACtCH,KAAKkO,OAAOjB,IAAI,GAAIzN,GAAO4O,KAAKC,UAAW7O,EAAO0b,mBAAoB3M,UAAW,KACjFvO,KAAKkO,OAAOjB,IAAI,GAAIzN,GAAO2b,OAAO5M,UAAW,KAC7CvO,KAAKkO,OAAOM,GAAG,oCAAqChP,EAAOiP,OAAOzO,KAAK0O,OAAQ1O,OAG/EA,KAAKkO,OAAOM,GAAG,gBAAiB,SAAU2B,GACnCnQ,KAAKob,QAIRjV,EAAK6U,iBAAkB,EACT,WAAV7K,EAAErK,MACFK,EAAKkV,gBAUjB7V,EAAO5E,UAAU8J,SAAW,SAAUgO,EAAM4C,GACxCtb,KAAK6a,KAAKO,QACVpb,KAAK0Y,KAAOA,EAAOA,MACnB1Y,KAAKob,MAAuB,GAAf1C,EAAKrT,OAElBrF,KAAKub,SAAU,CACf,IAAIpV,GAAOnG,KACPwb,EAAM,EACVF,GAAWA,GAAY,MAEvB,KAAK,GAAIjY,GAAI,EAAG0I,EAAI2M,EAAKrT,OAAQhC,EAAI0I,EAAG1I,IACpCmY,EAAMA,EAAM,OAAS9C,EAAKrV,GAAGiY,GAAY,OAG7C3b,GAAE6b,GAAKlY,SAAStD,KAAK6a,MAErB7a,KAAKyb,MAAQ9b,EAAE,MAAOK,KAAK6a,MAC3B7a,KAAK0b,UAAY1b,KAAKyb,MAAMxa,OAE5BjB,KAAK2b,UAAY3b,KAAKob,MAAQ,EAAIpb,KAAK0b,UAAY,GAAKf,EACxD3a,KAAK4b,UAAY5b,KAAK2b,SAAWf,EAGjC5a,KAAKyb,MAAMnQ,KAAK,SAAUjI,GACtB1D,EAAEK,MAAMsP,KACJuM,UAAa,cAAgBrB,EAAME,GAAK,iBAAoBrX,EAAIsX,EAAa,OAC7EmB,mBAAoB,kBAAoBtB,EAAME,GAAK,QAEvD/a,EAAEK,MAAM0L,MAAM,WACVvF,EAAK6U,iBAAkB,EACvB7U,EAAK4V,SAAS1Y,EAAIsX,GAAW,MAIrC,IAAIqB,EAEAA,GADDhc,KAAKob,OAAuB,MAAdpb,KAAKa,MACP,EAERb,KAAKa,MAAQb,KAAK0b,UAAY,GACjB1b,KAAK0b,UAAY,GAAKf,EAEvB3a,KAAKa,MAAQ8Z,EAGhC3a,KAAK+b,SAASC,GAAU,IAG5BxW,EAAO5E,UAAU8N,OAAS,SAAUe,GAChC,IAAGzP,KAAKob,MAKR,GAAe,YAAX3L,EAAG3J,KACHK,KAAK6U,iBAAkB,EACvBhb,KAAKib,UAAYjb,KAAKic,MACtBjc,KAAK6a,KAAK5X,SAAS,iBACnBjD,KAAKgb,iBAAkB,MAEpB,IAAe,WAAXvL,EAAG3J,KAAmB,CAC7B,GAAIoW,GAAYlc,KAAKmc,UAAU1M,EAAG2M,QAC9BJ,EAAWhc,KAAKib,UAAYiB,CAG5BF,GAAWhc,KAAK+a,cAChBiB,EAAWhc,KAAK+a,aAEhBiB,EAAWhc,KAAK4b,YAChBI,EAAWhc,KAAK4b,WAEpB5b,KAAK+b,SAASC,OAEX,CAEH,GAAIK,GAAI5M,EAAG6M,iBACPC,EAAMF,EAAI,KAAS,EACnBG,EAAqB,KAAND,KACfzb,EAAWgE,KAAK+K,IAAIwM,EAAIG,GACxBC,EAAOJ,EAAIvb,EAAW,EAEtB4b,EAAa1c,KAAKic,MAClBU,GAAa3c,KAAKmc,UAAUM,GAI5BG,EAAeD,CAUnB,IATID,EAAaC,EAAY3c,KAAK+a,cAC9B4B,EAAY3c,KAAK+a,YAAc2B,EAC/B5b,EAAWA,GAAY6b,EAAYC,GAAgB,IAEnDF,EAAaC,EAAY3c,KAAK4b,YAC9Be,EAAY3c,KAAK4b,UAAYc,EAC7B5b,EAAWA,GAAY6b,EAAYC,GAAgB,IAGtC,GAAbD,EAEA,WADA3c,MAAKqb,WAGTrb,MAAK6c,gBAAgBH,EAAYC,EAAW7b,IAMpD,IAAIgc,GAAK,KAAO,EAAIpC,EAAI5V,KAAKiY,GAC7BvX,GAAO5E,UAAUub,UAAY,SAAUa,GACnC,MAAOA,GAAIF,GASftX,EAAO5E,UAAUmb,SAAW,SAAUC,EAAUX,GAK5C,GAJArb,KAAKic,MAAQD,EACbhc,KAAK6a,KAAKvL,IAAI,YAAa,eAAekL,EAAM,KAAM,8BAAgCwB,EAAW,QACjGhc,KAAKid,gBAAgBjB,GAEjBX,EAAW,CACX,GAAIxa,GAAQmb,EAAWrB,EACnBuC,EAAWld,KAAKa,KACpBb,MAAKa,MAAQb,KAAKob,MAAQ,KAAOva,GAG7Bqc,GAAYrc,GAASb,KAAKub,WACtBvb,KAAKD,OAAOgH,UAAY/G,KAAK6G,QAC7B7G,KAAKD,OAAOgH,SAAS/G,KAAKkI,kBAAmBlI,KAAKa,MAAOqc,EAAUld,KAAKub,SAE5Evb,KAAKub,SAAU,KAa3B/V,EAAO5E,UAAUqc,gBAAkB,SAAUhB,GACzCjc,KAAKyb,MAAMnQ,KAAK,SAAUzK,GACtB,GAAIsc,GAAarY,KAAK+K,IAAIhP,EAAQ8Z,EAAYsB,EAE1CkB,GAAaxC,EAAY,EACzBhb,EAAEK,MAAMiD,SAAS,6BACVka,GAAe,GAAKxC,EAAY,EACvChb,EAAEK,MAAMmD,YAAY,6BAEpBxD,EAAEK,MAAMiD,SAAS,eAAeE,YAAY,oBAMxDqC,EAAO5E,UAAUya,UAAY,WACzBrb,KAAK6a,KAAK1X,YAAY,gBACtB,IAAIwY,EAEJ,IAAI3b,KAAKic,MAAQjc,KAAK8a,WAClBa,EAAW3b,KAAK8a,eACb,IAAI9a,KAAKic,MAAQjc,KAAK2b,SACzBA,EAAW3b,KAAK2b,aACb,CACH,GAAI9a,GAAQoE,UAAUjF,KAAKic,MAAQtB,GAAWyC,QAAQ,GACtDzB,GAAYhB,EAAY9Z,EAG5Bb,KAAK+b,SAASJ,GAAU,IAI5BnW,EAAO5E,UAAUic,gBAAkB,SAAUH,EAAYC,EAAW7b,GAChE,GAAIqF,GAAOnG,KACPqd,GAAU,GAAI3X,OAAO4X;AACzBtd,KAAKgb,iBAAkB,EACvBla,EAAW,EAAIA,EAGf,SAAWuc,EAASX,EAAYC,EAAW7b,GACvC,GAAIyc,GAAgB,GAChBC,EAAY1c,EAAWyc,EACvBE,EAAY,GAEhB,QAAUC,KACN,IAAIvX,EAAK6U,gBAAT,CACA,GAAIgB,GAAW7V,EAAKwX,aAAaF,EAAWf,EAAYC,EAAWa,EAInE,OAHArX,GAAK4V,SAASC,GACdyB,IAEIA,EAAYD,EAAY,GAAKxB,EAAW7V,EAAK4U,aAAeiB,EAAW7V,EAAKyV,cAC5EzV,GAAKkV,gBAITvY,YAAW4a,EAAaH,QAG7BF,EAASX,EAAYC,EAAW7b,IAQvC0E,EAAO5E,UAAUgI,UAAY,SAAU/B,GACnC7G,KAAK6G,SAAWA,GAGpBrB,EAAO5E,UAAU+c,aAAe,SAAUC,EAAGC,EAAGb,EAAG5V,GAC/C,OAAQ4V,IAAMY,EAAIA,EAAIxW,EAAI,GAAKwW,EAAIA,EAAIA,EAAI,GAAKC,GAQpDrY,EAAO5E,UAAUiI,iBAAmB,SAAUd,GAC1C,GAAI5B,GAAOnG,IACX,KAAK,GAAIa,KAASsF,GAAKuS,KAAM,CACzB,GAAI1R,GAAOb,EAAKuS,KAAK7X,EACrB,IAAImG,EAAKe,OAASA,EAEd,WADA5B,GAAK4V,SAASlb,EAAO8Z,GAAW,KAW5CnV,EAAO5E,UAAUsH,gBAAkB,WAC/B,MAAOlI,MAAKob,SAAYpb,KAAK0Y,KAAK1Y,KAAKa,QAO3C2E,EAAO5E,UAAU6I,iBAAmB,WAChC,MAAOzJ,MAAKkI,kBAAkBH,OAOlCvC,EAAO5E,UAAUkd,gBAAkB,WAC/B,MAAO9d,MAAKkI,kBAAkBE,MAOlC5C,EAAO5E,UAAUmd,iBAAmB,WAChC,MAAO/d,MAAKa,OAGhBnB,EAAI8F,OAASA,GAEd9F,GAAO4B,OAAQhC,EAAQE,GAG1B,SAAWE,EAAKC,GA6BZ,QAASqe,GAAUje,GACfC,KAAKD,OAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAC3CyF,IACAA,EAAS9F,EAAI8F,QAEjBxF,KAAKU,QAjCT,GAAI8E,GAAS9F,EAAI8F,MAoCjBwY,GAAUpd,UAAUF,MAAQ,WACxBV,KAAKuG,OAAS5G,EAAEK,KAAKD,OAAO4F,UAAUrC,SAAS,OAC/C,IAAI2a,GAAWte,EAAE,sBAAuBK,KAAKuG,QAEzC2X,EAAQle,KAAKD,OAAOme,MACpBvP,EAAS,IAAMuP,EAAS,GAC5Ble,MAAKme,QAAU,GAAIC,OAAMF,EACzB,IACIG,GADAlY,EAAOnG,IAEXA,MAAKoG,KAAOpG,KAAKqG,YAGjB,KAAK,GAAIhD,GAAI6a,EAAO,EAAG7a,GAAI,EAAGA,IAC1Bgb,EAAa1e,EAAEK,KAAKD,OAAOue,gBAAgBC,UAAUN,GAAU3O,KAAKX,MAAOA,IAE3E3O,KAAKme,QAAQ9a,GAAK,GAAKmC,GAAO6Y,GAC1BtX,SAAU,SAAW1D,GACjB,MAAO,UAAU2D,GACT3D,GAAK6a,EAAQ,GACb/X,EAAKgY,QAAQ9a,EAAI,GAAGqH,SAAS1D,EAAK0R,QAG3CrV,IAIX1D,GAAE,wBAAyBK,KAAKuG,QAAQmF,MAAM,WAC1C,GAAIG,GAAK1F,EAAKqY,gBACVrY,GAAKpG,OAAOS,SAASqL,MAAQ,GAC7B1F,EAAKsF,SAEVrD,KAAKpI,KAAKD,OAAO0e,KAAK,IAEzB9e,EAAE,4BAA6BK,KAAKuG,QAAQmF,MAAM,WAC9CvF,EAAKsF,SACNrD,KAAKpI,KAAKD,OAAO0e,KAAK,KAiB7BT,EAAUpd,UAAUV,eAChByF,SAAU,0PAQV2Y,eAAgB,kFAIhB5F,QACAwF,MAAO,EACPO,MAAO,KAAM,MACbje,SAAU,cAYdwd,EAAUpd,UAAU8d,QAAU,SAAUhG,GACpC1Y,KAAKme,QAAQ,GAAGzT,SAASgO,IAQ7BsF,EAAUpd,UAAUyB,KAAO,SAAU7B,GAC7BA,IACAR,KAAKD,OAAOS,SAAWA,GAE3BR,KAAKoG,KAAK/D,OACVrC,KAAKuG,OAAOtD,SAAS,gBAMzB+a,EAAUpd,UAAU6K,KAAO,WACvBzL,KAAKoG,KAAKuG,QACV3M,KAAKuG,OAAOpD,YAAY,gBAQ5B6a,EAAUpd,UAAU4d,eAAiB,WACjC,GAAyB,GAArBxe,KAAKD,OAAOme,MACZ,MAAOle,MAAKme,QAAQ,GAAGjW,iBAGvB,KAAK,GADD2D,MACKxI,EAAI,EAAGA,EAAIrD,KAAKD,OAAOme,MAAO7a,IACnCwI,EAAGhH,KAAK7E,KAAKme,QAAQ9a,GAAG6E,kBAE5B,OAAO2D,IAKfmS,EAAUpd,UAAUyF,WAAa,SAASuG,GACtC,GAAIzG,GAAOnG,KACP6M,EAAUC,SAASC,cAAc,MACrCF,GAAQG,UAAUC,IAAI,qBAEtBJ,EAAQK,iBAAiB,QAAS,WAC9B/G,EAAKsF,QAET,IAAIrF,IAAQyG,EA8BZ,OA7BAzG,GAAK+G,OAAQ,EACb/G,EAAK/D,KAAO,WAIR,MAHA+D,GAAK+G,OAAQ,EACbN,EAAQO,aAAa,QAAS,aAC9BN,SAASO,KAAKC,YAAYT,GACnBzG,GAEXA,EAAKmH,QAAU,WASX,MARInH,GAAK+G,QACL/G,EAAK+G,OAAQ,EACbN,EAAQO,aAAa,QAAS,aAC9BtK,WAAW,WACP,GAAIuK,GAAOP,SAASO,IACpBR,GAAQR,aAAegB,GAAQA,EAAKf,YAAYO,IACjD,MAEAzG,GAEXA,EAAKuG,MAAQ,WACNvG,EAAK+G,QACAP,EACIA,OAAe,GACfxG,EAAKmH,UAGTnH,EAAKmH,YAIVnH,GAWX1G,EAAIif,UAAY,SAAU5e,GACtB,MAAO,IAAIie,GAAUje,KAG1BL,GAAO4B,OAAQhC,GAElB,SAAWI,EAAKC,GAkBZ,QAASif,GAAYC,EAAI9e,GACrBC,KAAK6e,GAAKA,EACV7e,KAAK8e,MAAQ/e,EAAO+e,MACpB9e,KAAK+e,SAAWhf,EAAOgf,SACvB/e,KAAKgf,YAAcrf,EAAEkf,GAAIze,GAAG,GAEL,MAAnBL,EAAOgf,UACP/e,KAAKif,YAAYjf,KAAK+e,UAEN,MAAhBhf,EAAO+e,OACP9e,KAAKkf,SAASlf,KAAK8e,OAgB3BF,EAAYhe,UAAUqe,YAAc,SAAUE,GACtCA,EAAM,GAAKA,EAAM,MAErBxf,EAAEK,KAAKgf,YAAYtM,KAAK,qBAAqBpD,IAAI,YAAa,iBAAoB,IAAM6P,GAAQ,gBAChGnf,KAAK+e,SAAWI,IAQpBP,EAAYhe,UAAUwe,YAAc,WAChC,MAAOpf,MAAK+e,UAQhBH,EAAYhe,UAAUse,SAAW,SAAUJ,GAC1B,WAATA,GACAnf,EAAEK,KAAKgf,aAAa7b,YAAY,8EAChCxD,EAAEK,KAAKgf,aAAa/b,SAAS,iBACb,WAAT6b,GACPnf,EAAEK,KAAKgf,aAAa7b,YAAY,qDAChCxD,EAAEK,KAAKgf,aAAa/b,SAAS,4BACb,aAAT6b,GACPnf,EAAEK,KAAKgf,aAAa7b,YAAY,mDAChCxD,EAAEK,KAAKgf,aAAa/b,SAAS,8BACb,WAAT6b,IACPnf,EAAEK,KAAKgf,aAAa7b,YAAY,qDAChCxD,EAAEK,KAAKgf,aAAa/b,SAAS,6BAYrCvD,EAAIsf,YAAc,SAAUlf,EAAKC,GAC7B,MAAO,IAAI6e,GAAY9e,EAAKC,KAEjCL,GAAO4B,OAAQhC,GAOlB,SAAWI,EAAKC,EAAGJ,GAyBf,QAAS8f,GAAQvf,EAAKC,GAClBC,KAAKD,OAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAC/CC,KAAKG,GAAKR,EAAEG,GAAKsC,IAAI,GACrBpC,KAAKsf,mBACL,IAAI9I,GAAKxW,IAETA,MAAKuf,eACDC,aAAc,SAAUrP,GAChBqG,EAAGiJ,YAAcjJ,EAAGkJ,aAChB1f,KAAKwH,GAAKgP,EAAGmJ,gBAAkBnJ,EAAGoJ,MAAMnP,SAAS,sBACjD+F,EAAGoJ,MAAM3c,SAAS,sBACXjD,KAAKwH,EAAIgP,EAAGmJ,eAAiBnJ,EAAGoJ,MAAMnP,SAAS,uBACtD+F,EAAGoJ,MAAMzc,YAAY,uBAI7BqT,EAAGqJ,sBACHrJ,EAAGsJ,MAAQ9f,KAAKwH,EAAIgP,EAAGmJ,eAE3BI,kBAAmB,WACfvJ,EAAGwJ,mBACHxJ,EAAGqJ,uBAEP3d,YAAa,WACLsU,EAAGkJ,YAAc1f,KAAKwH,EAAIxH,KAAKigB,YAAczJ,EAAGsJ,OAChDtJ,EAAGjX,QAAQ2gB,SAAS,EAAGlgB,KAAKigB,WAAY,GAE5CzJ,EAAGqJ,uBAEPM,UAAW,WACH3J,EAAGkJ,aACH1f,KAAKigB,WAAajgB,KAAKigB,WAAazJ,EAAGmJ,iBAKnD3f,KAAKuf,cAAgB5f,EAAEM,UAAWD,KAAKD,OAAOwf,cAAevf,KAAKuf,eAClEvf,KAAKT,QAAU,GAAIA,GAAQS,KAAKG,GAAIH,KAAKuf,eACzCvf,KAAKogB,uBAeTf,EAAQze,UAAUV,eACdmgB,cAAe,KACfC,WAAY,KACZC,eAAe,EACfC,kBAAkB,EAClBC,eAAgB,kFAChBC,YAAa,oHAKbC,aAAc,EACdpB,kBAGJF,EAAQze,UAAU0e,kBAAoB,WAClCtf,KAAK4gB,SAAWjhB,EAAE,wBAAyBK,KAAKG,IAChDH,KAAK6gB,SAAWlhB,EAAEK,KAAKD,OAAO0gB,gBAAgBnd,SAAStD,KAAK4gB,UAC5D5gB,KAAK4f,MAAQjgB,EAAEK,KAAKD,OAAO2gB,aAAanC,UAAUve,KAAK4gB,UAEvD5gB,KAAK2f,cAAgB3f,KAAK4f,MAAMhK,cAChC5V,KAAK8gB,iBAAmB9gB,KAAK6gB,SAASjL,cAAgB5V,KAAKD,OAAO4gB,aAGlE3gB,KAAK0f,YAAa,EAGlB1f,KAAK+gB,eAAgB,EAGrB/gB,KAAKghB,aAAehhB,KAAKD,OAAOygB,oBAAsBxgB,KAAKD,OAAOsgB,cAGlErgB,KAAKyf,UAAYzf,KAAKD,OAAOwgB,iBAAmBvgB,KAAKD,OAAOugB,WAE5DtgB,KAAK8f,OAAQ,EAEb9f,KAAKihB,aAAajhB,KAAKghB,cACvBhhB,KAAKkhB,UAAUlhB,KAAKyf,YAIxBJ,EAAQze,UAAUif,oBAAsB,WAChC7f,KAAKghB,cACDhhB,KAAKT,QAAQiI,EAAIxH,KAAKT,QAAQ4hB,WAAanhB,KAAK8gB,kBAChD9gB,KAAKohB,uBAKjB/B,EAAQze,UAAUof,iBAAmB,WAC7BhgB,KAAKyf,WACDzf,KAAK4f,MAAMnP,SAAS,uBACpBzQ,KAAKqhB,oBAMjBhC,EAAQze,UAAUwf,qBAAuB,WACjCpgB,KAAKghB,cACDhhB,KAAKT,QAAQ4hB,aAAenhB,KAAK8gB,kBACjC9gB,KAAKohB,uBAMjB/B,EAAQze,UAAUwgB,oBAAsB,WAC/BphB,KAAK+gB,gBACN/gB,KAAK+gB,eAAgB,EACrB/gB,KAAKD,OAAOsgB,kBAKpBhB,EAAQze,UAAUygB,iBAAmB,WAC5BrhB,KAAK0f,aACN1f,KAAK0f,YAAa,EAClB1f,KAAK4f,MAAMzc,YAAY,sBAAsBF,SAAS,2BACtDjD,KAAKT,QAAQ0gB,WAAajgB,KAAKT,QAAQ0gB,WAAajgB,KAAK2f,cACzD3f,KAAKD,OAAOugB,eAOpBjB,EAAQze,UAAU0gB,iBAAmB,WACjCthB,KAAK+gB,eAAgB,EACrB/gB,KAAKwB,WAMT6d,EAAQze,UAAU2gB,cAAgB,WAC9BvhB,KAAK4f,MAAMzc,YAAY,2BACvBnD,KAAK0f,YAAa,EAElB1f,KAAKwB,WAQT6d,EAAQze,UAAUsgB,UAAY,SAAUM,GACpCxhB,KAAKyf,UAAY+B,EACbA,EACAxhB,KAAK4f,MAAMvd,OAEXrC,KAAK4f,MAAMnU,QASnB4T,EAAQze,UAAUqgB,aAAe,SAAUO,GACvCxhB,KAAKghB,aAAeQ,EAChBA,EACAxhB,KAAK6gB,SAASxe,OAEdrC,KAAK6gB,SAASpV,QAOtB4T,EAAQze,UAAUY,QAAU,WACxBxB,KAAKT,QAAQiC,UACbxB,KAAKogB,wBAYT1gB,EAAI8B,QAAU,SAAU1B,EAAK2hB,GACzB,MAAO,IAAIpC,GAAQvf,EAAK2hB,KAG7B/hB,GAAO4B,OAAQhC,EAAQC,GAG1B,SAAWG,EAAKC,GAyCZ,QAAS+hB,GAAI5hB,EAAKC,GACdC,KAAKG,GAAKR,EAAEG,GAAKsC,IAAI,GACrBpC,KAAK2hB,WAAahiB,EAAE,0BAA2BK,KAAKG,IACpDH,KAAK4hB,YAAcjiB,EAAE,8BAA+BK,KAAKG,IACzDH,KAAK6hB,aAAeliB,EAAE,MAAOK,KAAK4hB,aAElC5hB,KAAKD,OAASJ,EAAEM,UAAWD,KAAKE,cAAeH,GAC/CC,KAAK8O,SAAW9O,KAAK6hB,aAAa5gB,OAClCjB,KAAK8hB,MAAQniB,EAAEK,KAAKG,IAAI2U,GAAG,iBAE3B,IAAI5T,GAAOlB,IACXA,MAAK2hB,WAAWrW,KAAK,SAAUzK,GAC3BlB,EAAEK,MAAM0L,MAAM,WACVxK,EAAKmB,KAAKxB,MAIlB,IAAIA,GAAQb,KAAK2hB,WAAWvgB,OAAO,gBAAgBP,OAC/CA,SACAA,EAAQ,GAGZb,KAAKqC,KAAKxB,GAQd6gB,EAAI9gB,UAAUV,eACVM,SAAU,SAAUK,MAOxB6gB,EAAI9gB,UAAUyB,KAAO,SAAUxB,GAC3B,GAAIb,KAAK8hB,MAAO,CACZ,GAAI1S,GAAgB,KAARvO,EAAc,GAC1Bb,MAAK4hB,YAAYtS,IAAI,YAAa,eAAiBF,EAAO,WAE9DpP,KAAK6hB,aAAazhB,GAAGS,GAAOoC,SAAS,eAAeC,WAAWC,YAAY,eAC3EnD,KAAK2hB,WAAWvhB,GAAGS,GAAOoC,SAAS,eAAeC,WAAWC,YAAY,eACzEnD,KAAKmC,KAAKtB,IAGd6gB,EAAI9gB,UAAUuB,KAAO,SAAUtB,GAC3Bb,KAAKyW,UAAYzW,KAAKS,aACtBT,KAAKS,aAAeI,EAEhBb,KAAKD,OAAOS,UACZR,KAAKD,OAAOS,SAASK,EAAOb,KAAKyW,YAIzC/W,EAAIqiB,IAAM,SAAUjiB,EAAKC,GACrB,MAAO,IAAI2hB,GAAI5hB,EAAKC,KAEzBL,GAAO4B,OAAQhC,GAIlB,SAAWI,EAAKC,GAkEZ,QAASqiB,GAAiB7R,GACtB,MAAOA,GAAEoK,eAAiBpK,EAG9B,QAAS8R,GAAM9R,GACX,GAAIgH,GAAIhH,EAAE+R,QAAU/R,EAAE+R,QAAQ,GAAGC,MAAQhS,EAAEiS,QACvC5a,EAAI2I,EAAE+R,QAAU/R,EAAE+R,QAAQ,GAAGG,MAAQlS,EAAEmS,OAC3C,QAAQnL,EAAG3P,GAxEf,GAAI+a,MAEAC,EAAUC,gBACVC,cAAe,GACfC,aAAc,IACdC,UAAW,IACX1K,UAAW,QACX2K,YAAa,aACbC,cAAe,SAAUC,GAOrB,QAASC,GAAWC,GAEhB,GAAIC,IAAiBvjB,EAAEwjB,OAASxjB,EAAE+Y,MAAMuK,EAAQ,SAMhD,IAJIC,IACAA,EAAgBA,EAAcV,EAAQtK,YAGrCgL,EAAL,CAIA,GAAIE,IAAW,CAuBf,OAtBAzjB,GAAE2L,KAAK4X,EAAe,SAAUriB,EAAOwiB,GACnC,GAAIA,EAAQC,SAAU,CAClB,GAAIC,GAAO5jB,EAAE0jB,EAAQC,SAAUL,EAQ/B,IAPAtjB,EAAE2L,KAAKkY,EAAW,SAAUC,EAAQC,GAChC,GAAIH,EAAKzO,GAAG4O,GAER,MADAC,GAAWD,GACJ,IAIXC,EACA,OAAO,MAGXP,IAAW,IAIfA,GAAwB,MAAZO,IACZA,EAAWV,GAGRU,GAzCX,GAAKZ,GAASA,EAAKa,SAAnB,CA4CA,IA1CA,GAAID,GAAW,KACXH,OAyCK,WAAaT,IAAUC,EAAWD,KAClCA,EAAK1W,YAA0C,GAA5B0W,EAAK1W,WAAWuX,UAGxCJ,EAAU3e,KAAKke,GACfA,EAAOA,EAAK1W,UAGhB,OAAOsX,MAeXE,EAAW,gBAAkBviB,QAC7BwiB,EAAcD,EAAW,aAAe,YACxCE,EAAaF,EAAW,YAAc,YACtCG,EAAYH,EAAW,WAAa,UACpCI,EAAeJ,EAAW,cAAgB,EAE9ClkB,GAAE,WAME,QAASwD,GAAY6L,EAAK4E,GAClBA,GAASsQ,EACT5iB,OAAOkB,aAAa0hB,GAEpBvkB,EAAEqP,GAAK7L,YAAYqf,EAAQK,aAInC,QAASsB,GAAavQ,GACdA,EACAzQ,EAAYihB,EAAOxQ,GAEnBtS,OAAOwB,WAAWK,EAAaqf,EAAQI,UAAWwB,EAAOxQ,GAE7DyQ,EAAU,KACVD,EAAQ,KApBZ,GAAIC,GAASD,EAAOF,EAChBlV,EAAMlC,SAASO,IAsBnB1N,GAAEqP,GAAKsV,KAAKR,EAAa,SAAU3T,GAC/B,MAAIiU,OACAD,IAAa,IAIjBhU,EAAI6R,EAAiB7R,GACrBkU,EAAUpC,EAAM9R,GAChBiU,EAAQ5B,EAAQM,cAAc3S,EAAEC,aAE5BgU,IACAF,EAAY5iB,OAAOwB,WAAW,SAAUkM,GACpCkV,EAAY,KACZvkB,EAAEqP,GAAK/L,SAASuf,EAAQK,cACzBL,EAAQG,aAAcyB,QAIjCzkB,EAAEqP,GAAKsV,KAAKP,EAAY,SAAU5T,GAC9B,GAAKiU,EAAL,CAIAjU,EAAI6R,EAAiB7R,EAErB,IAAIoU,GAAKtC,EAAM9R,EACXkU,KAAYvf,KAAK+K,IAAI0U,EAAG,GAAKF,EAAQ,IAAM7B,EAAQE,eAAiB5d,KAAK+K,IAAI0U,EAAG,GAAKF,EAAQ,IAAM7B,EAAQE,gBAC3GyB,GAAa,MAIrBxkB,EAAEqP,GAAKsV,KAAKN,EAAW,SAAU7T,GACzBiU,GACAD,MAKJF,GACAtkB,EAAEqP,GAAKsV,KAAKL,EAAc,SAAU9T,GAC5BiU,GACAD,QAOhB5B,EAAOiC,WAAa,SAAUC,GAC1BjC,EAAUxiB,KAAKwiB,QAAU7iB,EAAEM,UAAWwiB,eAAgBgC,IAE1D/kB,EAAI6iB,OAASA,GACd7iB,GAAO4B,OAAQhC,GAKVA,EAAO,WAGHA,EAAO,QAAQkP,GAAG,aAAa,SAAU2B,MAGzC1Q,EAAUilB,OAAO5X,SAASO,QAGvB3N,EAKY,kBAAXilB,SAAyBA,OAAOC,IACxCD,QAAQ,SAAU,UAAW,SAAU,aAAc,SAAUrlB,EAAQC,EAASC,EAAQC,GACpF,MAAO6B,QAAO5B,IAAML,EAAMC,EAAQC,EAASC,EAAQC,KAGvD6B,OAAO5B,IAAML,EAAMiC,OAAOhC,OAAQgC,OAAO/B,QAAS+B,OAAO9B,OAAQ8B,OAAO7B","file":"ipu.min.js","sourcesContent":["// v0.2.1 2018-04-11\n(function () {\n    function setup(jQuery, iScroll, Hammer, FastClick) {\n\n        /**\n         * @class ipu UI的主对象,通过此对象实例UI组件\n         *\n         */\n\n\n        var ipu = {};\n\n(function (ipu, $, iscroll) {\r\n\r\n    /**\r\n     * @deprecated 推荐使用 {@link HammerCarousel}\r\n     * @uses IScroll.js\r\n     * @class 简单封装IScroll.js的snap功能,实现banner功能\r\n     *\r\n     *      @example\r\n     *      <!-- 组件html结构如下,li里内容可自定义 -->\r\n            <div class=\"ipu-carousel ipu-hammer-carousel\">\r\n                <ul class=\"ipu-carousel-wrapper\">\r\n                    <li ><img src=\"../../biz/img/01.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/02.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/03.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/04.jpg\" alt=\"\"></li>\r\n                </ul>\r\n            </div>\r\n     *\r\n     * @constructor 不能直接访问该类,使用ipu.carousel(slt, option)生成实例 {@link ipu#carousel}\r\n     * @param {Dom|JqueryObj|String} slt jquery对象或者jquery选择器或Dom元素\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function Carousel(slt, option) {\r\n        this.option = option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = option.autoPlay;\r\n        this.hasIndicator = option.indicator;\r\n        this.callBack = option.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        /**\r\n         * 组件默认配置项\r\n         *\r\n         * @cfg {Object} defaultOption\r\n         * @cfg {Number} defaultOption.index 默认显示的项\r\n         * @cfg {Boolean} defaultOption.autoPlay 是否自动播放\r\n         * @cfg {Number} defaultOption.duration 自动播放间隔,单位ms\r\n         * @cfg {Boolean} defaultOption.indicator 是否生成指示器\r\n         * @cfg {Function} defaultOption.callBack 切换显示时的回调函数\r\n         * @cfg {Number} defaultOption.callBack.index 当前显示项索引\r\n         *\r\n         */\r\n        defaultOption: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ipu-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            var that = this;\r\n\r\n            if (this.option.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ipu-current\").index();\r\n                this.option.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                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.option.index, 0);\r\n        },\r\n        /**\r\n         * 停止自动播放\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        /**\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        /**\r\n         * 显示下一项\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        /**\r\n         * 显示索引index对应的索\r\n         *\r\n         * @param {Number} 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        /**\r\n         * 开始自动播放\r\n         */\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        /**\r\n         * 若窗口发生大小变更,调用此方法更新位移\r\n         */\r\n        refresh: function () {\r\n            this.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                    that.timeoutId = null;\r\n                    that.next();\r\n                }, that.option.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(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-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='ipu-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    /**\r\n     * @member ipu\r\n     * 生成Carousel实例,参数信息见{@link Carousel#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {Carousel}\r\n     */\r\n    ipu.carousel =  function (slt, option) {\r\n        return new Carousel(slt, option);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// todo:添加判断平台如mobile ,tablet, pc,参考其它类似功能库,添加webview判断\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    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    // 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    device.wx = /MicroMessenger/i.test(ua);  // 是否微信\r\n    device.ipu = /ipumobile/i.test(ua);         // 是否ipu环境运行\r\n\r\n    if (device.wx) {\r\n        classNames.push('wx');\r\n    }\r\n    if (device.ipu) {\r\n        classNames.push('ipu');\r\n    }\r\n\r\n    var classPrev = \"ipu-\";\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0) {\r\n        $('html').addClass(classPrev+classNames.join(' '+classPrev));\r\n    }\r\n    \r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n\n// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n// show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n// 日期范围的选择处理\r\n// 不选择字符串连接符,合并后占空间\r\n\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来协助运算\r\n\r\n    /**\r\n     * @class 日期选择器,替代默认的web日历选择,日期格式如下<br>\r\n     * type=datetime:yyyy-mm-dd hh:mi<br>\r\n     * type=date:yyyy-mm-dd<br>\r\n     * type=time: hh:mi<br>\r\n     * type=month: yyyy-mm<br>\r\n     * type=hour: yyyy-mm-dd hh<br>\r\n     *\r\n     * @constructor 不能直接访问该,调用{@link ipu#dtPicker}生成实例\r\n     * @param {object} option 组件参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function DtPicker(option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n\r\n        if (!Picker) {\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption=\r\n     * @cfg {String} defaultOption.template 组件模板html,不建议变更\r\n     * @cfg {[String]} defaultOption.buttons=['取消', '确认', '清除'] 按钮名称\r\n     * @cfg {[String]} defaultOption.labels=['年', '月', '日', '时', '分'] 年月日标签\r\n     * @cfg {datetime|time|date|hour|month} defaultOption.type='datetime' 日期类型\r\n     * @cfg {Boolean} defaultOption.hasClear=false 是否显示清除按钮\r\n     * @cfg {Date} defaultOption.beginDate=null 日期开始时间,默认设置为当时间前5年\r\n     * @cfg {Date} defaultOption.endDate=null 日期结束时间,默认设置为开始时间后10年\r\n     * @cfg {Function} defaultOption.callBack=null 点击按钮时的回调函数,回调的参数同{@link #show show()}法设置 的回调\r\n     */\r\n    DtPicker.prototype.defaultOption = {\r\n        template: '<div class=\"ipu-poppicker ipu-dtpicker\">'\r\n        + '<div class=\"ipu-poppicker-header\">'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-cancel\">取消</button>'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-ok\">确定</button>'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-clear\">清除</button>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-poppicker-title\">'\r\n        + '<label class=\"ipu-dtpicker-y\"></label>'\r\n        + '<label class=\"ipu-dtpicker-m\"></label>'\r\n        + '<label class=\"ipu-dtpicker-d\"></label>'\r\n        + '<label class=\"ipu-dtpicker-h\"></label>'\r\n        + '<label class=\"ipu-dtpicker-mi\"></label>'\r\n        + '</div>'\r\n        + '<div>'\r\n        + '<div class=\"ipu-poppicker-body\">'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-y\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-m\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-d\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-h\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-mi\">'\r\n        + '<div class=\"ipu-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',\r\n        customData: {},\r\n        hasClear: false,\r\n        beginDate: null,\r\n        endDate: null,\r\n        callBack: null\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.option.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ipu-poppicker-btn-ok', _picker),\r\n            cancel: $('.ipu-poppicker-btn-cancel', _picker),\r\n            clear: $('.ipu-poppicker-btn-clear', _picker),\r\n            buttons: $('.ipu-poppicker-header .ipu-btn', _picker),\r\n            labels: $('.ipu-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.option.beginMonth || self.option.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.option.beginMonth || self.option.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.option.beginMonth || self.option.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        self._create();\r\n\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.option.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.option.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    /**\r\n     * 返回当前选中的日期,只有在点确认时,返回的才是正确的值,在点清除、或取消后,调用此方法返回的值不可控\r\n     *\r\n     * @return 选择的日期信息\r\n     * @return {datetime|time|date|hour|month} return.type 日期类型\r\n     * @return {String} return.text  日期文本(text字段)拼接,格式yyyy-mm-dd hh:mi 根据上面的日期类型返回对应字符串\r\n     * @return {String} return.value 日期项值(value字段)拼接\r\n     * @return {Object} return.y 选择的年项\r\n     * @return {Object} return.m 选择的月项\r\n     * @return {Object} return.d 选择的日项\r\n     * @return {Object} return.h 选择的时项\r\n     * @return {Object} return.i 选择的分项\r\n     * @return {Function} return.toString 返回value字段的值\r\n     */\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.option.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.option.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    /**\r\n     * 设置日期值,value为字符串时,格式请参照 yyyy-mm-dd hh:mi具体格式与配置项type相关\r\n     *\r\n     * @param {String|Date} value\r\n     */\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    /**\r\n     * 是否润年\r\n     *\r\n     * @param {Number} year 年份\r\n     * @returns {Boolean}\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.option.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.option.beginMonth && this._isBeginYear() && this.option.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.option.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.option.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.option.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.option.endMonth && this._isEndYear() && this.option.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.option.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.option.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (option.customData.y) {\r\n            yArray = option.customData.y;\r\n        } else {\r\n            var yBegin = option.beginYear;\r\n            var yEnd = option.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    };\r\n\r\n    DtPicker.prototype._createMonth = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (option.customData.m) {\r\n            mArray = option.customData.m;\r\n        } else {\r\n            var m = option.beginMonth && self._isBeginYear() ? option.beginMonth : 1;\r\n            var maxMonth = option.endMonth && self._isEndYear() ? option.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    };\r\n\r\n    DtPicker.prototype._createDay = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (option.customData.d) {\r\n            dArray = option.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? option.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? option.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 () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (option.customData.h) {\r\n            hArray = option.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? option.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? option.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 () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (option.customData.i) {\r\n            iArray = option.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? option.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? option.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 option = self.option;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = option.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n        ui.cancel.text(option.buttons[0]);\r\n        ui.ok.text(option.buttons[1]);\r\n\r\n        if (option.hasClear) {\r\n            ui.clear.text(option.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    // 对于time类型时,或未完整的时间值,使用defaultPickerDate来填充\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.option.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                value = 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    // 生成日期数据\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var option = this.option;\r\n        var now = defaultPickerDate;\r\n        var beginDate = option.beginDate;\r\n\r\n        if (beginDate) {  // 若有设置开始日期\r\n            beginDate = this._parseSetValue(beginDate);\r\n            option.beginYear = beginDate.y;\r\n            option.beginMonth = beginDate.m;\r\n            option.beginDay = beginDate.d;\r\n            option.beginHours = beginDate.h;\r\n            option.beginMinutes = beginDate.i;\r\n        } else if (option.type == 'time') { // 未设置开始日期,但日期格式是time\r\n            option.beginYear = now.getFullYear();\r\n            option.beginMonth = now.getMonth() + 1;\r\n            option.beginDay = now.getDate();\r\n            option.beginHours = 0;\r\n            option.beginMinutes = 0;\r\n        } else {\r\n            option.beginYear = now.getFullYear() - 5;   // 其它,未设置开始日期,type也不为time,设置默认起始时间\r\n        }\r\n\r\n        var endDate = option.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            option.endYear = endDate.y;\r\n            option.endMonth = endDate.m;\r\n            option.endDay = endDate.d;\r\n            option.endHours = endDate.h;\r\n            option.endMinutes = endDate.i;\r\n        } else if (option.type == 'time') {\r\n            option.endYear = now.getFullYear();\r\n            option.endMonth = now.getMonth() + 1;\r\n            option.endDay = now.getDate();\r\n            option.endHours = 23;\r\n            option.endMinutes = 59;\r\n        } else {\r\n            option.endYear = option.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     * 设置组件日期范围\r\n     *\r\n     * @param {String|Date} beginDate 开始时间\r\n     * @param {Stirng|Date} endDate 结束时间\r\n     */\r\n    DtPicker.prototype.setDateRange = function (beginDate, endDate) {\r\n        this.option.beginDate = beginDate;\r\n        this.option.endDate = endDate;\r\n        this._create();\r\n    };\r\n\r\n    /**\r\n     * 设置开始组件的开始据时间\r\n     * @param {String|Date} date\r\n     */\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.option.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    /**\r\n     * 设置组件的结束时间\r\n     *\r\n     * @param {String|Date} date\r\n     */\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.option.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    /**\r\n     * 显示组件\r\n     *\r\n     * @param {Function} callBack 点击按钮时的回调函数,设置此参数会覆盖初始化时的回调函数\r\n     * @param {Object} callBack.sltDate 当前选中的日期信息,具体格式,见方法{@link #getSelected getSelected()}的返回\r\n     * @param {Number} callBack.index 被点击的按钮索引,0取消,1确认,2清除\r\n     */\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.option.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ipu-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.option.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    /**\r\n     * 隐藏组件\r\n     */\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ipu-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(\"ipu-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    /**\r\n     * @member ipu\r\n     * 生成DtPicker实例,参数信息见{@link DtPicker#method-constructor}\r\n     *\r\n     * @param {Object} option\r\n     * @returns {DtPicker}\r\n     */\r\n    ipu.dtPicker = function (option) {\r\n        return new DtPicker(option);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n// 支持非循环\r\n// 更新方法和属性命名\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容同时显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n// 理想用户不操作时,永远不显示最后复制项,或者各项独立,也可实现类似功能\r\n//indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n// 直接替换掉了prototype对象,可能不是个好选择\r\n\r\n(function (ipu, $, Hammer) {\r\n    /**\r\n     * @class\r\n     * @uses Hammer.js\r\n     * 通过hammer.js实现的banner功能组件,\r\n     * 因为实现轮播,显示第一项后,再显示第一项,所以第一项有被复制到添加到最后\r\n     *\r\n     *      @example\r\n     *      <!-- 组件html结构如下,li里的内容用户可自定义  -->\r\n     *      <div class=\"ipu-carousel ipu-hammer-carousel\">\r\n     *          <ul class=\"ipu-carousel-wrapper\">\r\n     *              <li ><img src=\"../../biz/img/01.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/02.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/03.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/04.jpg\" alt=\"\"></li>\r\n     *          </ul>\r\n     *      </div>\r\n     *\r\n     * @constructor  不能直接访问该类,调用 {@link ipu#hammerCarousel}生成实例\r\n     * @param {String|JqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function HammerCarousel(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    HammerCarousel.prototype = {\r\n        /**\r\n         * 组件默认配置项\r\n         *\r\n         * @cfg {Object} defaultOption\r\n         * @cfg {Number} defaultOption.index 初始化时显示第几项,用户未指定时,会查找子项内容上有ipu-current的项显示,没有则显示第一项\r\n         * @cfg {Boolean} defaultOption.autoPlay 是否自动轮播\r\n         * @cfg {Number} defaultOption.duration 自动轮播时的间隔时间,单位ms\r\n         * @cfg {Boolean} defaultOption.indicator 是否生成banner提示器,true右下角出现小点\r\n         * @cfg {Function} defaultOption.callBack 轮播显示某项时的回调函数\r\n         * @cfg {Number} defaultOption.callBack.index 当前显示的项索引\r\n         * @cfg {Function} defaultOption.clickBack\r\n         *          切换项时被点击时的回调函数,此处主要是为了处理复制项与第一项的点击事件进行处理,\r\n         *          让用户不关注点周是第一项或是复制项,回调作用域为组件对象\r\n         * @cfg {Number} defaultOption.clickBack.index 点击的项索引\r\n         */\r\n        defaultOption: {\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        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ipu-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\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 that = this;\r\n            if (this.option.clickBack) {\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        that.option.clickBack.call(this, i % that.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this._sizeCount();\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.option.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ipu-current\").index();\r\n                this.option.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.option.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.option.index, false);\r\n        },\r\n        /**\r\n         * 停止自动滚动\r\n         */\r\n        stop: function () {\r\n            this._pause();\r\n            this.option.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        /**\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);\r\n        },\r\n        /**\r\n         * 切换到下一项\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);\r\n        },\r\n        /**\r\n         * 切换显示指定项\r\n         *\r\n         * @param {Number} index 要切换到的项索引\r\n         *\r\n         */\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % this.size;\r\n            if (index < 0) {\r\n                index = this.size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        /**\r\n         * 自动轮播\r\n         */\r\n        play: function () {\r\n            this.option.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.option.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.option.duration);\r\n            }\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='ipu-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(\"ipu-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        /**\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, false); //新的位置\r\n            }\r\n        },\r\n        _move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ipu-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(\"ipu-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            this.lastItem = index == this.size;\r\n\r\n            this.moveLen = this.carouselItemSizes[index];\r\n            var move = - this.moveLen + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n\r\n            var currentIndex = this.currentIndex;\r\n            if (animate && this.option.callBack) {\r\n                this.option.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n\r\n            this._play();//处理自动播放\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    /**\r\n     * @member ipu\r\n     * 生成HammerCarousel实例,参数信息见{@link HammerCarousel#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {HammerCarousel}\r\n     */\r\n    ipu.hammerCarousel = function (slt, option) {\r\n        return new HammerCarousel(slt, option);\r\n    };\r\n})(ipu || window, jQuery, Hammer);\r\n\n(function (ipu, $) {\r\n\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            /*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        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalTitle: '',\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\r\n    ipu.modal = function (params) {\r\n        params = params || {};\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=\"ipu-modal-button' + (params.buttons[i].bold ? ' ipu-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=\"ipu-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ipu-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ipu-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ipu-modal-buttons-vertical' : '';\r\n\r\n        var modalHTML = '<div class=\"ipu-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ipu-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ipu-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('.ipu-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\r\n    /**\r\n     * @member ipu\r\n     * 弹出警告消息\r\n     *\r\n     * @param {String} text 警句文本\r\n     * @param {String} title 警告标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\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\r\n    /**\r\n     * @member ipu\r\n     * 弹出确认消息\r\n     *\r\n     * @param {String} text 确认文本\r\n     * @param {String} title 确认标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\r\n     * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\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, bold: true, onClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 弹出输入框\r\n     *\r\n     * @param {String} text 输入提示文本\r\n     * @param {String} title 输入提示标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\r\n     * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\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=\"ipu-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('.ipu-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ipu-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    /**\r\n     *  @member ipu\r\n     * 弹出加载消息提示\r\n     *\r\n     * @param {String} title 加载提示文本\r\n     * @param {Number} minTime 消息最小显示时间,单位ms,可选参数\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=\"ipu-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\r\n    /**\r\n     * @member ipu\r\n     * 隐藏加载消息提示\r\n     *\r\n     * @param {Boolean} force 是否强制隐藏,不管最小提示时间,可选\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\r\n    /**\r\n     * @member ipu\r\n     * 显示加载状态\r\n     */\r\n    ipu.showIndicator = function () {\r\n        if ($('.ipu-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ipu-preloader-indicator-overlay\"></div><div class=\"ipu-preloader-indicator-modal\"><span class=\"ipu-preloader ipu-preloader-white\"></span></div>');\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 隐藏加载状态\r\n     */\r\n    ipu.hideIndicator = function () {\r\n        $('.ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal').remove();\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 显示操作选项\r\n     *\r\n     * @param{[[Object]]} actions\r\n     * @param {Object} actions.Object\r\n     * @param {String} actions.Object.text 操作名称\r\n     * @param {Boolean} actions.Object.label 是否标签,非标签就是操作项,操作项有后续的配置,标签项无须后续配置项\r\n     * @param {String:warning} actions.Object.color 样式,可选\r\n     * @param {String:warning} actions.Object.bg 背景样式,可选\r\n     * @param {Function} actions.Object.onClick 点击时回调函数\r\n     */\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=\"ipu-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ipu-actions-modal-label' : 'ipu-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ipu-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ipu-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ipu-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=\"ipu-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ipu-actions-modal-group';\r\n        buttonSelector = '.ipu-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    /**\r\n     * @member ipu\r\n     * 悬浮提示消息\r\n     *\r\n     * @param {String} msg 消息文本\r\n     * @param {Number} duration=2000 消息显示时间,单位ms\r\n     */\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ipu-modal ipu-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\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ipu-modal'),\r\n            isNotToast = !modal.hasClass('ipu-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n\r\n        if ($('.ipu-modal.ipu-modal-in:not(.ipu-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\r\n        var isPopup = modal.hasClass('ipu-popup');\r\n        var isLoginScreen = modal.hasClass('ipu-login-screen');\r\n        var isPickerModal = modal.hasClass('ipu-picker-modal');\r\n        var isToast = modal.hasClass('ipu-toast');\r\n\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\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 ($('.ipu-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ipu-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ipu-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ipu-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-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('ipu-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast){\r\n            overlay.addClass('ipu-modal-overlay-visible');\r\n        }\r\n        modal.removeClass('ipu-modal-out').addClass('ipu-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ipu-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\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ipu-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ipu-modal'),\r\n            isPopup = modal.hasClass('ipu-popup'),\r\n            isToast = modal.hasClass('ipu-toast'),\r\n            isLoginScreen = modal.hasClass('ipu-login-screen'),\r\n            isPickerModal = modal.hasClass('ipu-picker-modal'),\r\n            removeOnClose = modal.hasClass('ipu-remove-on-close'),\r\n            overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ipu-popup.ipu-modal-in').length) {\r\n                overlay.removeClass('ipu-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ipu-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('ipu-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ipu-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ipu-modal-in').addClass('ipu-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ipu-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ipu-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ipu-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\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('ipu-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ipu-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ipu-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ipu-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ipu-modal-overlay')) {\r\n            if ($('.ipu-modal.ipu-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ipu-modal.ipu-modal-in');\r\n            if ($('.ipu-actions-modal.ipu-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ipu-actions-modal.ipu-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ipu-popup-overlay')) {\r\n            if ($('.ipu-popup.ipu-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ipu-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ipu-modal-overlay, .ipu-popup-overlay, .ipu-close-popup, .ipu-open-popup, .ipu-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n    /**\r\n     * @class 导航切换组件\r\n     *\r\n     *      @example\r\n\r\n            <!-- 组件的html分成导航和内容两部分,一般与flex栅格配合布局-->\r\n            <!--  组件导航部分 -->\r\n            <nav class=\"ipu-navbar \">\r\n                <a class=\"ipu-navbar-item \" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-home\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">插件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item \" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-dashcube\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">JS组件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item ipu-current\" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-map\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">静态组件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item\" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-mortar-board\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">更多</span>\r\n                </a>\r\n            </nav>\r\n\r\n            <!-- 内容部分 -->\r\n            <div class=\"ipu-nav-content\">\r\n                <ul>\r\n                    <li>\r\n                        自定义内容1\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                </ul>\r\n            </div>\r\n\r\n     *\r\n     * \r\n     * @constructor  不能直接访问该类,调用{@link ipu#navBar ipu.navBar(slt, option)}生成实例\r\n     * @param {String|jqueryObj} slt jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function NavBar(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.content = $(this.option.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(\".ipu-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ipu-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.option.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.option.animate) {\r\n            this.wrapper.addClass(\"ipu-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.option.index);\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption\r\n     * @cfg {Boolean} defaultOption.animate=false 切换时是否添加动画效果\r\n     * @cfg {Dom|String|JqueryObj} defaultOption.contentSlt='.ipu-nav-content' 内容dom选择器,页面有多个navBar组件时,需要设置此值\r\n     * @cfg {Function} defaultOption.callBack 切换时的回调函数\r\n     * @cfg {Number} defaultOption.callBack.index 当前显示项索引\r\n     */\r\n    NavBar.prototype.defaultOption = {\r\n        animate: false,\r\n        contentSlt: \".ipu-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) {\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 显示第几项内容\r\n     * @param {Number} index 显示内容项索引\r\n     */\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            $(this.contents[index]).addClass(\"ipu-show\");\r\n\r\n            if (this.option.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ipu-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(\"ipu-no-animation\").removeClass(\"ipu-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(\"ipu-no-animation\").addClass(\"ipu-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ipu-no-animation\").toggleClass(\"ipu-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ipu-show\");\r\n            }\r\n\r\n            // 更新class,ipu-current状态\r\n            $(this.contents[index]).addClass(\"ipu-current\").siblings(\".ipu-current\").removeClass(\"ipu-current\");\r\n            $(this.navs[index]).addClass(\"ipu-current\").siblings(\".ipu-current\").removeClass(\"ipu-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.option.callBack) {\r\n                this.option.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成NavBar实例,参数信息见{@link NavBar#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {NavBar}\r\n     */\r\n    ipu.navBar = function (slt, option) {\r\n        return new NavBar(slt, option);\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    // 检查是否有ipu-pages的结构\r\n    function checkPages() {\r\n        if(!hasPages){\r\n            pagesObj = $(\".ipu-pages\"); // pagesObj为空则进行jquery取值\r\n            if(pagesObj.size() == 0){\r\n                pagesObj =  $(\"<div class='ipu-pages'><div class='ipu-page ipu-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 = \"ipu-anim ipu-slideRightIn\";\r\n    var animateOutClass  = \"ipu-anim ipu-slideRightOut\";\r\n    var eventName = \"ipuUIPageBack\";\r\n    var zeroPageClass = 'ipu-page-zero';   // 占位页面,对于为当前页面\r\n    var zeroPagesClass = 'ipu-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\r\n\r\n    /**\r\n     * @private\r\n     * @class page 单页面实现功能对象\r\n     * 以iframe加载子页面的方式,页面后退(后退时,后退到a页面,所有在a页面后打开的页面全都关闭)\r\n     * ipu框架在浏览器运行时,使用此对象实现与客户端运行类似的效果\r\n     * 大致实现是当前页面进行处理,所有的后续页面加载都放在一个iframe中,所有页面按加载顺序排序,关闭或后退按页面打开的顺序处理\r\n     */\r\n\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption page组件默认配置项\r\n     * @cfg {Window} defaultOption.target = window.parent 默认执行的窗口对象,子页面调用相关方法,默认都都是在parent窗口执行,需要指定此参数,如顶层父窗口\r\n     * @cfg {Number} defaultOption.backIndex=-1 回退索引,大于0时,正序计算,小于0时,倒序计算,-1即为当页面的上一个页面\r\n     * @cfg {Number} defaultOption.closeIndex 关闭页面索引,参数说明同上\r\n     * @cfg {Object} defaultOption.params Json格式参数,POST方式打开页面时,使用此参数传递参数,暂不支持数组格式参数\r\n     * @cfg {Boolean} defaultOption.animate=true 是否使用动画,打开或回退页面时有效参数\r\n     * @cfg {Boolean} defaultOption.showLoading=true 是否显示加载提示,打开或回退页面时有效参数\r\n     * @cfg {Boolean} defaultOption.loadingMessage='正在加载中' 是否显示加载提示,打开或回退页面时有效参数\r\n     * @cfg defaultOption.data=null 回退页面时,传递给回退到的页面的参数,回退到的页面有设置监听函数时,监听函数可以接收此参数\r\n     * @cfg {String} defaultOption.pageName='' 页面的名称,打开或回退页面时有效参数\r\n     * @cfg {Function} defaultOption.callBack 方法执行结束时的回调函数\r\n     */\r\n    page.defaultOption = {     // 那个窗口执行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, option) {\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(option.showLoading){\r\n            ipu.showPreloader(option.loadingMessage, option.minMessageTime);\r\n        }\r\n\r\n        if(option.method == 'post'){\r\n            newPage = $(\"<div class='ipu-page' id='\"+nowPageNo+\"' data-name='\"+option.pageName+\"'><iframe class='ipu-page-iframe'></iframe></div>\");\r\n        }else{\r\n            newPage = $(\"<div class='ipu-page' id='\"+nowPageNo+\"' data-name='\"+option.pageName+\"'><iframe class='ipu-page-iframe' src='\"+url+\"'></iframe></div>\");\r\n        }\r\n\r\n        var zeroPage = isZeroPage($(\".ipu-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(option.showLoading) {\r\n                ipu.hidePreloader();\r\n            }\r\n\r\n            if(option.animate) {\r\n                animatePage.removeClass(animateInClass);\r\n            }\r\n\r\n            newPage.siblings(\".ipu-show\").removeClass('ipu-show');\r\n            if(option.callBack){\r\n                option.callBack();\r\n            }\r\n        }\r\n\r\n        $(\".ipu-page-iframe\", newPage).one('load', function () {\r\n            newPage.addClass(\"ipu-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\r\n\r\n            if(zeroPage){\r\n                animatePage.removeClass(zeroPagesClass);\r\n            }\r\n            if(option.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(option.method == 'post') {\r\n            var pageDoc = $(\".ipu-page-iframe\", newPage)[0].contentDocument;\r\n            submitForm(pageDoc, url, option.params);\r\n        }\r\n    };\r\n\r\n    // post方式加载页面\r\n    page.postPage = function (url, option) {\r\n        option.method = 'post';\r\n        page.openPage(url, option);\r\n    };\r\n\r\n    // 当前页面后退,针对顶层父窗口\r\n    page.backPage = function (option) {\r\n        var backIndex = option.backIndex;\r\n        var page = null;\r\n        var nowPage = $(\".ipu-page.ipu-show\", pagesObj);\r\n\r\n        if(option.pageName){\r\n            page =  $(\".ipu-page[data-name='\"+option.pageName+\"']:first\", pagesObj);\r\n        }else if(backIndex == 0){\r\n            page = $(\".ipu-page:first\", pagesObj);\r\n        }else { // 越界的情况\r\n            var prevPage = nowPage.prevAll(\".ipu-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(\"ipu-show\"); //显示前一个\r\n        }\r\n\r\n        function end (){\r\n            $(this).removeClass(animateOutClass);\r\n            page.nextAll(\".ipu-page\").remove();\r\n\r\n            var iframe = $(\".ipu-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(option.data){\r\n                evt.data = option.data;\r\n            }\r\n            nowDoc.body.dispatchEvent(evt);\r\n            if(option.callBack){\r\n                option.callBack();\r\n            }\r\n        }\r\n\r\n        if(option.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 (option) {\r\n        var closeIndex = option.closeIndex;\r\n        var prevPage = $(\".ipu-page.ipu-show\", pagesObj).prevAll(\".ipu-page\");\r\n\r\n        if(option.pageName){\r\n            closeIndex =  $(\".ipu-page[data-name='\"+option.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(option.callBack){\r\n            option.callBack();\r\n        }\r\n    };\r\n\r\n    /**\r\n     * get请求的方式加载页面\r\n     *\r\n     * @param {String} url\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.open = function (url, option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.openPage(url, option);\r\n    };\r\n\r\n    /**\r\n     * 使用post方式加载一个新页面\r\n     *\r\n     * @param {String} url 要打开的页面地址\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.post = function (url, option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.method = 'post';\r\n        option.target.ipu.page.openPage(url, option);\r\n    };\r\n\r\n    /**\r\n     * 回退到某个历史页面,可以根据pageName回退,也可根据backIndex回退,默认回退上一个页面\r\n     *\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.back = function (option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.backPage(option);\r\n    };\r\n\r\n    /**\r\n     * 回退到首页\r\n     *\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.backHome = function (option) {\r\n        option = option || {};\r\n        option.backIndex = 0;\r\n        page.back(option);\r\n    };\r\n\r\n    // 子窗口,待确认\r\n    page.close = function (option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.closePage(option);\r\n    };\r\n\r\n    /**\r\n     * 给页面增加一个监听,从其它页面回退到此页面,调用此函数,可以接收其它页面传来的数据\r\n     *\r\n     * @param {Function} back 监听函数\r\n     * @param back.data 其它页面传过来的参数,推荐字符串或Json对象\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不要距离容器太近,是否不应该设置px,使用rem\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\r\n    function toRem(num){\r\n        return num/100;\r\n    }\r\n\r\n    /**\r\n     * @private \r\n     * @class 选择器,被DtPicker和PopPicker使用,实现选择与滚动等基础功能\r\n     *\r\n     * @constructor  初始化方法\r\n     * @param {String|DOM|JQueryObj} slt\r\n     * @param {object} option 组件参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function Picker(slt, option) {\r\n        this.el = $(slt)[0];\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this._init();\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption=\r\n     * @cfg {Boolean} defaultOption.listen=true 是否需要监听变化\r\n     * @cfg {[Object]} defaultOption.data=[] 可选择项数组,每个项须有text属性\r\n     * @cfg {String} defaultOption.data.text 子项展示文本\r\n     * @cfg {Function} defaultOption.onChange=null 选择变化时的回调函数\r\n     * @cfg {Object} defaultOption.onChange.sltItem  选中项\r\n     * @cfg {Number} defaultOption.onChange.newIndex 新的选中项索引\r\n     * @cfg {Number} defaultOption.onChange.oldIndex 旧的选中项索引\r\n     * @cfg {Boolean} defaultOption.onChange.newData 是否为调用setItem()方法触发\r\n     */\r\n    Picker.prototype.defaultOption = {\r\n        listen: true,\r\n        data: [],\r\n        onChange: null\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.option.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\r\n        // 如果是ios,则ul的旋转中心点,样式不同于android\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+toRem(r)+\"rem\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n\r\n        this.setItems(this.option.data);\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        // 处理滚动中,用户点中某项,停止\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\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\r\n    /**\r\n     * 设置选择项\r\n     *\r\n     * @param {[Object]} data 设置项数组\r\n     */\r\n    Picker.prototype.setItems = function (data, textName) {  // textNam字体暂不支持\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; //  是否为新设置数据标记\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(\" + toRem(r) + \"rem) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + toRem(r) + \"rem\"\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\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(\"ipu-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\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    /**\r\n     * 为组件设置新的滚动角度\r\n     *\r\n     * @param {Number} newAngle 新的滚动角度\r\n     * @param {Boolean} endScroll 是否为最终滚动角度,为最终滚动角度时,若索引更新可以触发onChange的回调\r\n     */\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(\"+toRem(1000)+\"rem) 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                if (this.option.onChange && this.listen) {\r\n                    this.option.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n                this.newData = false;\r\n            }\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 计算各子项滚动角度与新的滚动角度的值差异来决定显示的情况\r\n     * 角度大于 90-(itemAngle/2)时,隐藏\r\n     * 角度小于itemAngle/2表示最中心的项,显示并高亮\r\n     * 其它值则表示此项为显示\r\n     *\r\n     * @param {Number} angle 新的滚动角度\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(\"ipu-highlight ipu-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ipu-highlight ipu-visible\");\r\n            } else {\r\n                $(this).addClass(\"ipu-visible\").removeClass(\"ipu-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ipu-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    /**\r\n     * 设置是否监听触发onChange回调\r\n     *\r\n     * @param {Boolean} listen\r\n     */\r\n    Picker.prototype.setListen = function (listen) {\r\n        this.listen = !!listen;\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    /**\r\n     * 设置选中项,若子项的value属性为value,则设置该项为选中项\r\n     *\r\n     * @param value\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     * 获取选中的子项,若子项集为空时,返回空对象\r\n     *\r\n     * @returns {Object}\r\n     */\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    /**\r\n     * 获取选中的子项的value属性\r\n     * @returns\r\n     */\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    /**\r\n     * 返回选中项的text属性\r\n     * @return {String}\r\n     */\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    /**\r\n     * 获取选中项的索引,若子项集为空则返回null\r\n     * @returns {Number}\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    /**\r\n     * @class\r\n     * 原生select的替代实现,适应数据较多或级联的情况\r\n     *\r\n     *      @example\r\n            // 配置项data的数据结构\r\n            var data = [{text:'显示名称', value:''}...];\r\n\r\n            // layer=1的数据结构\r\n            var data-1 = [{text:'湖南', value:'HN'}, {text:'湖北', value:'HB'}];\r\n\r\n            // layer=2时的数据结构,有额外data属性存放下一层级数据\r\n            var data-1 = [\r\n                {\r\n                    text:'湖南',value:'HN', data:[{text:'长沙', value:'CS'}, {text:'湘谭', value:'XT'}]\r\n                },{\r\n                    text:'湖北',value:'HB', data:[{text:'武汉', value:'WH'}, {text:'天门', value:'TM'}]\r\n                }\r\n            ];\r\n\r\n     *\r\n     * @constructor  不能直接访问该类,调用{@link ipu#navBar ipu.popPicker(slt, option)}生成实例\r\n     * @param {String|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function PopPicker(option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.option.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ipu-poppicker-body\", this.holder);\r\n\r\n        var layer = this.option.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.option.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) { // 更新底部的值\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        $(\".ipu-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.option.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.option.btns[1]);\r\n\r\n        $(\".ipu-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.option.btns[0]);\r\n    };\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption\r\n     * @cfg {String} defaultOption.template html结构\r\n     * @cfg {String} defaultOption.pickerTemplate 内容dom选择器\r\n     * @cfg {Object[]} defaultOption.data 选择项数据\r\n     * @cfg {String} defaultOption.data.text 子项展示文本\r\n     * @cfg {*} defaultOption.data.value 子项值\r\n     * @cfg {Object[]} defaultOption.data.data 有更多层级时,此属性存放下一层级的数据\r\n     * @cfg {Number} defaultOption.layer=1 数据层数\r\n     * @cfg {String[]} defaultOption.btns=['取消', '确认'] 按钮文本\r\n     * @cfg {Function} defaultOption.callBack=null 回调函数\r\n     */\r\n    PopPicker.prototype.defaultOption = {\r\n        template: '<div class=\"ipu-poppicker\">'\r\n                        +'<div class=\"ipu-poppicker-header\">'\r\n                            +'<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-cancel\">取消</button>'\r\n                            +'<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-ok\">确定</button>'\r\n                        +'</div>'\r\n                        +'<div class=\"ipu-poppicker-body\">'\r\n                        +'</div>'\r\n                        +'</div>',\r\n        pickerTemplate: '<div class=\"ipu-picker\">'\r\n                            +'<div class=\"ipu-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    /**\r\n     * 设置选择项数据\r\n     *\r\n     * @param{[Object]} data 选择项数组\r\n     * @param {String} data.text 每个选择项的文本\r\n     * @param {[Object]} data.data 如果有多层选择的话,应该有一个data属性\r\n     */\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    /**\r\n     * 显示选择器\r\n     *\r\n     * @param callBack\r\n     */\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.option.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ipu-current\");\r\n    };\r\n\r\n    /**\r\n     * 隐藏选择器\r\n     */\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ipu-current\");\r\n    };\r\n\r\n    /**\r\n     * 获取用户选择的项,如果配置项layer为1,则直接返回选择项,\r\n     * 否则返回一个数组返回每层选中的项\r\n     *\r\n     */\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.option.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.option.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(\"ipu-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    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link PopPicker#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {PopPicker}\r\n     */\r\n    ipu.popPicker = function (option) {\r\n        return new PopPicker(option);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n\r\n    /**\r\n     * @class\r\n     * 进度条\r\n     *\r\n     *      @example\r\n            <!-- 组件html -->\r\n             <div class=\"ipu-ipu-progress \">\r\n                <span class=\"ipu-progressbar\"></span>\r\n             </div>\r\n     *\r\n     *\r\n     * @constructor  不能直接访问该类,调用 {@link ipu#progressBar}生成实例\r\n     * @param {String|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function ProgressBar(id, option) {\r\n        this.id = id;\r\n        this.level = option.level;\r\n        this.progress = option.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (option.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (option.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @cfg defaultOption 刷新组件默认配置\r\n     * @cfg {default|warning|highlight|success} defaultOption.level='default' 级别,显示颜色\r\n     * @cfg {Number} defaultOption.progress=null    当前进度百分比\r\n     *\r\n     */\r\n\r\n    /**\r\n     * 设置百分进度\r\n     *\r\n     * @param {Number} pro\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    /**\r\n     * 获取百分进度\r\n     *\r\n     * @returns {Number|*}\r\n     */\r\n    ProgressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    /**\r\n     * 设置进度条级别\r\n     *\r\n     * @param {default | success | highlight | warning} level\r\n     */\r\n    ProgressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-hightlight ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-highlight ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link ProgressBar#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {ProgressBar}\r\n     */\r\n    ipu.progressBar = function (slt, option) {\r\n        return new ProgressBar(slt, option);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n// 设置上下条件长度,或计算函数\r\n// 处理resize的问题,用户主动调用refresh??\r\n// 底部启用或停用时,应该刷新组件iscroll高度\r\n// 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n(function (ipu, $, iScroll) {\r\n    /**\r\n     * @class\r\n     * 通过IScroll.js实现上拉下拉加载\r\n     *\r\n     *      @example\r\n            <!-- 组件html结构,最外层div应有一个固定的高度,会在此元素上初始化iScroll -->\r\n             <div>\r\n                 <div class=\"ipu-refresh-wrapper\">\r\n                    <!-- 此处组件初始化后,会添加上拉html -->\r\n                     <div class=\"refresh-content\">\r\n                        内容区...\r\n                     </div>\r\n                    <!-- 此处组件初始化后,会添加下拉html -->\r\n                 </div>\r\n             </div>\r\n     *\r\n     * @uses IScroll.js\r\n     *\r\n     * @constructor  不能直接访问该类,调用ipu.refresh(slt, option)生成实例\r\n     * @param {String|JqueryObj|Dom} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option\r\n     *      组件参数\r\n     */\r\n    function Refresh(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOption = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ipu-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ipu-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ipu-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ipu-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.iScrollOption = $.extend({}, this.option.iScrollOption, this.iScrollOption);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOption);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    /**\r\n     * @cfg defaultOption 刷新组件默认配置\r\n     * @cfg {Function} defaultOption.bottomLoadFun=null 上拉时,触发底加载的响应函数\r\n     * @cfg {Function} defaultOption.topLoadFun=null    下拉时,触发顶部加载的响应函数\r\n     * @cfg {Boolean} defaultOption.initEnableTop=true   初始化时,是否启用顶部加载功能\r\n     * @cfg {Boolean} defaultOption.initEnableBottom=true   初始化时,是否启用底部加载功能\r\n     * @cfg {String} defaultOption.bottomLoadHtml=...   底部加载时显示的html片段,不建议变动\r\n     * @cfg {String} defaultOption.topLoadHtml=...   顶部加载时显示的html片段,不建议变动\r\n     * @cfg {Number} defaultOption.bottomAddLen=0   距离底部多远时,触发底部加载\r\n     * @cfg {Object} defaultOption.iScrollOption={}   上下拉使用的是IScroll组件,通过此参数配置IScroll初始化的参数\r\n     *\r\n     */\r\n    Refresh.prototype.defaultOption = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ipu-refresh-bottom\"><span class=\"ipu-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ipu-refresh-top\"><span class=\"ipu-refresh-loading\"></span><div class=\"ipu-refresh-arrow\"></div></div>',\r\n        // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n        // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ipu-refresh-top-loading\r\n        // 拖动达到加载距离,则增加class:ipu-refresh-toload\r\n        // 加载中,则增加class:ipu-refresh-top-loading,移除class:ipu-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOption:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ipu-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.option.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.option.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.option.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        /** @property {Boolean} 顶部是否加载中 */\r\n        this.topLoading = false;        // 顶部正在载加载\r\n\r\n        /** @property {Boolean} 底部是否加载中 */\r\n        this.bottomLoading = false;     // 底部正在加载\r\n\r\n        /** @property {Boolean} 底部是否可加载 */\r\n        this.bottomEnable = this.option.initEnableBottom && !!this.option.bottomLoadFun;\r\n\r\n        /** @property {Boolean} 顶部是否可加载 */\r\n        this.topEnable = this.option.initEnableTop && !!this.option.topLoadFun;\r\n\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) {\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) {\r\n            if (this.topEl.hasClass('ipu-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.bottomEnable) {\r\n            if (this.iScroll.maxScrollY >= -this.bottomPullOffset) { // 此处要计算底端的高度\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (!this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.option.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (!this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ipu-refresh-toload').addClass('ipu-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.option.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 结束底部加载,defaultOption.bottomLoadFun中处理完加载后,最后调用此方法\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     * 结束顶部加载,defaultOption.topLoadFun中处理完加载后,最后调用此方法\r\n     */\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ipu-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    /**\r\n     * 是否启动顶部加载功能\r\n     *\r\n     * @param {Boolean} enable\r\n     */\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    /**\r\n     * 是否启用底部加载功能\r\n     *\r\n     * @param {Boolean} enable\r\n     */\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    /**\r\n     * 在内容发生变化时,但是又不是因为顶部加载或底部加载导致的,此时调用此方法刷新IScroll\r\n     */\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link Refresh#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {Refresh}\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\r\n    /**\r\n     * @class\r\n     * tab切换组件功能实现\r\n     *\r\n     *      @example\r\n            <!-- html结构 -->\r\n            <div class=\"ipu-tab\">  <!-- 如果class中添加 ipu-tab-fixed,则可固定头部,此时需要父元素的高度是确定的 -->\r\n                <ul class=\"ipu-tab-title ipu-tab-title-link\"> <!-- 页头有 ipu-tab-title-link 和 ipu-tab-title-button两种样式 -->\r\n                    <li>热门推荐</li>\r\n                    <li class=\"ipu-current\">全部表情</li>  <!-- class为ipu-current为默认选中项 -->\r\n                    <li>表情</li>\r\n                    <li>表情</li>\r\n                </ul>\r\n                <div class=\"ipu-tab-body\">\r\n                    <ul class=\"ipu-tab-body-wrapper\">\r\n                        <li>\r\n                            自定义内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项2内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项3内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项4内容\r\n                        </li>\r\n                    </ul>\r\n                </div>\r\n            </div>\r\n     *\r\n     *\r\n     *\r\n     * @constructor  不能直接访问该类,调用ipu.tab(slt, option)生成实例\r\n     * @param {string|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {object} option\r\n     *      组件参数\r\n     */\r\n    function Tab(slt, option) {\r\n        this.el = $(slt).get(0);\r\n        this.titleItems = $(\".ipu-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ipu-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ipu-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(\".ipu-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    /**\r\n     * 默认配置项\r\n     * @cfg defaultOption = { callBack: function (index) {}};\r\n     * @cfg defaultOption.callBack 切换tab项时的回调函数,参数为显示的项索引\r\n     */\r\n    Tab.prototype.defaultOption = {\r\n        callBack: function (index) {}\r\n    };\r\n\r\n    /**\r\n     * 显示第几项内容\r\n     * @param {number} index 要显示的项索引\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(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n        this.titleItems.eq(index).addClass(\"ipu-current\").siblings().removeClass(\"ipu-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.option.callBack) {\r\n            this.option.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, option) {\r\n        return new Tab(slt, option);\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: 'ipu-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\n        // 初始化代码\r\n        jQuery(function () {\r\n            // 添加一个touchstart空函数,让:active样式可以在ios上生效\r\n            // 新版默认不需要事件好像也可生效\r\n            jQuery(\"body\").on(\"touchstart\",function (e) {});\r\n\r\n            // 处理ios点击延迟问题\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","version","$","iscroll","Carousel","slt","option","this","extend","defaultOption","el","eq","autoPlay","hasIndicator","indicator","callBack","currentIndex","_init","play","prototype","index","duration","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","device","classNames","ua","navigator","userAgent","android","match","ipad","ipod","iphone","ios","androidChrome","os","osVersion","toLowerCase","indexOf","replace","split","pixelRatio","devicePixelRatio","push","Math","floor","major","parseInt","wx","test","classPrev","length","join","DtPicker","Picker","defaultPickerDate","Date","template","buttons","labels","type","customData","hasClear","beginDate","endDate","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","_isBeginYear","beginYear","getSelectedValue","_isBeginMonth","_isBeginDay","beginDay","_isBeginHours","beginHours","_isEndYear","endYear","_isEndMonth","_isEndDay","endDay","_isEndHours","endHours","_createYear","yArray","yBegin","yEnd","setItems","mArray","maxMonth","val","dArray","maxDay","hArray","maxHours","iArray","beginMinutes","maxMinutes","endMinutes","each","label","innerText","hide","click","clickCall","now","rs","parts","j","setDateRange","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","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","move","displayMoveLen","css","animate","toggleClass","ev","delta","deltaX","intValue","abs","decimal","hammerCarousel","__dealCssEvent","eventNameArr","fireCallBack","e","target","events","off","handleClicks","clicked","hasClass","defaults","modalCloseByOutside","closeModal","actionsCloseByOutside","popupCloseByOutside","fn","transitionEnd","_modalTemplateTempDiv","modalTitle","modalStack","modalButtonOk","modalButtonCancel","modalPreloaderTitle","modalContainer","modalStackClearQueue","shift","modal","params","buttonsHTML","bold","extraClass","titleHTML","title","textHTML","afterTextHTML","afterText","noButtons","verticalButtons","modalHTML","innerHTML","children","append","find","onClick","openModal","alert","callbackOk","arguments","undefined","confirm","callbackCancel","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","toRem","showItemSize","r","itemAngle","maxExceed","wrap","beginAngle","beginExceed","stopInertiaMove","lastAngle","DIRECTION_VERTICAL","Press","empty","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","t","b","getSelectedText","getSelectedIndex","PopPicker","bodyHtml","layer","pickers","Array","pickerHtml","pickerTemplate","prependTo","getSelectItems","btns","setData","popPicker","ProgressBar","id","level","progress","progressBar","setProgress","setLevel","pro","getProgress","Refresh","_initBottomAndTop","iScrollOption","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","options","defaultOptions","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","attach","define","amd"],"mappings":"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","file":"ipu.min.js","sourcesContent":["(function () {\n    function setup(jQuery, iScroll, Hammer, FastClick) {\n\n        /**\n         * @class ipu UI的主对象,通过此对象实例UI组件\n         *\n         */\n\n        var ipu = {\n            version: '0.2.1'\n        };\n\n(function (ipu, $, iscroll) {\r\n\r\n    /**\r\n     * @deprecated 推荐使用 {@link HammerCarousel}\r\n     * @uses IScroll.js\r\n     * @class 简单封装IScroll.js的snap功能,实现banner功能\r\n     *\r\n     *      @example\r\n     *      <!-- 组件html结构如下,li里内容可自定义 -->\r\n            <div class=\"ipu-carousel ipu-hammer-carousel\">\r\n                <ul class=\"ipu-carousel-wrapper\">\r\n                    <li ><img src=\"../../biz/img/01.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/02.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/03.jpg\" alt=\"\"></li>\r\n                    <li ><img src=\"../../biz/img/04.jpg\" alt=\"\"></li>\r\n                </ul>\r\n            </div>\r\n     *\r\n     * @constructor 不能直接访问该类,使用ipu.carousel(slt, option)生成实例 {@link ipu#carousel}\r\n     * @param {Dom|JqueryObj|String} slt jquery对象或者jquery选择器或Dom元素\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function Carousel(slt, option) {\r\n        this.option = option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).eq(0);  // 一次只能实例化一个\r\n        this.autoPlay = option.autoPlay;\r\n        this.hasIndicator = option.indicator;\r\n        this.callBack = option.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        /**\r\n         * 组件默认配置项\r\n         *\r\n         * @cfg {Object} defaultOption\r\n         * @cfg {Number} defaultOption.index 默认显示的项\r\n         * @cfg {Boolean} defaultOption.autoPlay 是否自动播放\r\n         * @cfg {Number} defaultOption.duration 自动播放间隔,单位ms\r\n         * @cfg {Boolean} defaultOption.indicator 是否生成指示器\r\n         * @cfg {Function} defaultOption.callBack 切换显示时的回调函数\r\n         * @cfg {Number} defaultOption.callBack.index 当前显示项索引\r\n         *\r\n         */\r\n        defaultOption: {\r\n            index: null,            // 默认显示索引,未设置时先查找对就active,未找到时是0\r\n            autoPlay: false,       //  是否自动播放\r\n            duration: 3000,         //  自动播放延时\r\n            indicator: false,       // 是否生成指示器\r\n            callBack: null           // 变更时回调函数\r\n        },\r\n        _init: function () {\r\n            var wrapper = $(\">.ipu-carousel-wrapper\", this.el);\r\n            var carouselItems = $(\">li\", wrapper);\r\n            this.carouselItems = carouselItems;\r\n            this.size = carouselItems.size();\r\n            var that = this;\r\n\r\n            if (this.option.index == null) {\r\n                var activeIndex = carouselItems.filter(\".ipu-current\").index();\r\n                this.option.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                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.option.index, 0);\r\n        },\r\n        /**\r\n         * 停止自动播放\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        /**\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        /**\r\n         * 显示下一项\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        /**\r\n         * 显示索引index对应的索\r\n         *\r\n         * @param {Number} 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        /**\r\n         * 开始自动播放\r\n         */\r\n        play: function () {\r\n            this.autoPlay=true;\r\n            this._play();\r\n        },\r\n        /**\r\n         * 若窗口发生大小变更,调用此方法更新位移\r\n         */\r\n        refresh: function () {\r\n            this.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                    that.timeoutId = null;\r\n                    that.next();\r\n                }, that.option.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(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n                }\r\n                this.carouselItems.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-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='ipu-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    /**\r\n     * @member ipu\r\n     * 生成Carousel实例,参数信息见{@link Carousel#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {Carousel}\r\n     */\r\n    ipu.carousel =  function (slt, option) {\r\n        return new Carousel(slt, option);\r\n    };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// todo:添加判断平台如mobile ,tablet, pc,参考其它类似功能库,添加webview判断\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    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    // 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    device.wx = /MicroMessenger/i.test(ua);  // 是否微信\r\n    device.ipu = /ipumobile/i.test(ua);         // 是否ipu环境运行\r\n\r\n    if (device.wx) {\r\n        classNames.push('wx');\r\n    }\r\n    if (device.ipu) {\r\n        classNames.push('ipu');\r\n    }\r\n\r\n    var classPrev = \"ipu-\";\r\n\r\n    // Add html classes\r\n    if (classNames.length > 0) {\r\n        $('html').addClass(classPrev+classNames.join(' '+classPrev));\r\n    }\r\n    \r\n    ipu.device = device;\r\n})(ipu || window, jQuery);\r\n\n// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n// show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n// 日期范围的选择处理\r\n// 不选择字符串连接符,合并后占空间\r\n\r\n(function (ipu, $) {\r\n    var Picker = ipu.Picker;\r\n    var defaultPickerDate = new Date();   // 有些时间不齐全。如time,需要一个默认日期来协助运算\r\n\r\n    /**\r\n     * @class 日期选择器,替代默认的web日历选择,日期格式如下<br>\r\n     * type=datetime:yyyy-mm-dd hh:mi<br>\r\n     * type=date:yyyy-mm-dd<br>\r\n     * type=time: hh:mi<br>\r\n     * type=month: yyyy-mm<br>\r\n     * type=hour: yyyy-mm-dd hh<br>\r\n     *\r\n     * @constructor 不能直接访问该,调用{@link ipu#dtPicker}生成实例\r\n     * @param {object} option 组件参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function DtPicker(option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n\r\n        if (!Picker) {\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption=\r\n     * @cfg {String} defaultOption.template 组件模板html,不建议变更\r\n     * @cfg {[String]} defaultOption.buttons=['取消', '确认', '清除'] 按钮名称\r\n     * @cfg {[String]} defaultOption.labels=['年', '月', '日', '时', '分'] 年月日标签\r\n     * @cfg {datetime|time|date|hour|month} defaultOption.type='datetime' 日期类型\r\n     * @cfg {Boolean} defaultOption.hasClear=false 是否显示清除按钮\r\n     * @cfg {Date} defaultOption.beginDate=null 日期开始时间,默认设置为当时间前5年\r\n     * @cfg {Date} defaultOption.endDate=null 日期结束时间,默认设置为开始时间后10年\r\n     * @cfg {Function} defaultOption.callBack=null 点击按钮时的回调函数,回调的参数同{@link #show show()}法设置 的回调\r\n     */\r\n    DtPicker.prototype.defaultOption = {\r\n        template: '<div class=\"ipu-poppicker ipu-dtpicker\">'\r\n        + '<div class=\"ipu-poppicker-header\">'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-cancel\">取消</button>'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-ok\">确定</button>'\r\n        + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-clear\">清除</button>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-poppicker-title\">'\r\n        + '<label class=\"ipu-dtpicker-y\"></label>'\r\n        + '<label class=\"ipu-dtpicker-m\"></label>'\r\n        + '<label class=\"ipu-dtpicker-d\"></label>'\r\n        + '<label class=\"ipu-dtpicker-h\"></label>'\r\n        + '<label class=\"ipu-dtpicker-mi\"></label>'\r\n        + '</div>'\r\n        + '<div>'\r\n        + '<div class=\"ipu-poppicker-body\">'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-y\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-m\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-d\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-h\">'\r\n        + '<div class=\"ipu-picker-selectbox\"></div>'\r\n        + '<ul></ul>'\r\n        + '</div>'\r\n        + '<div class=\"ipu-picker\" data-id=\"picker-mi\">'\r\n        + '<div class=\"ipu-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',\r\n        customData: {},\r\n        hasClear: false,\r\n        beginDate: null,\r\n        endDate: null,\r\n        callBack: null\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.option.template).appendTo(\"body\");\r\n        var ui = self.ui = {\r\n            picker: this.holder,\r\n            ok: $('.ipu-poppicker-btn-ok', _picker),\r\n            cancel: $('.ipu-poppicker-btn-cancel', _picker),\r\n            clear: $('.ipu-poppicker-btn-clear', _picker),\r\n            buttons: $('.ipu-poppicker-header .ipu-btn', _picker),\r\n            labels: $('.ipu-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.option.beginMonth || self.option.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.option.beginMonth || self.option.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.option.beginMonth || self.option.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        self._create();\r\n\r\n        //设定label\r\n        self._setLabels();\r\n        self._setButtons();\r\n        //设定类型\r\n        ui.picker.attr('data-type', this.option.type);\r\n\r\n        //设定默认值\r\n\r\n        self._setSelectedValue(this.option.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    /**\r\n     * 返回当前选中的日期,只有在点确认时,返回的才是正确的值,在点清除、或取消后,调用此方法返回的值不可控\r\n     *\r\n     * @return 选择的日期信息\r\n     * @return {datetime|time|date|hour|month} return.type 日期类型\r\n     * @return {String} return.text  日期文本(text字段)拼接,格式yyyy-mm-dd hh:mi 根据上面的日期类型返回对应字符串\r\n     * @return {String} return.value 日期项值(value字段)拼接\r\n     * @return {Object} return.y 选择的年项\r\n     * @return {Object} return.m 选择的月项\r\n     * @return {Object} return.d 选择的日项\r\n     * @return {Object} return.h 选择的时项\r\n     * @return {Object} return.i 选择的分项\r\n     * @return {Function} return.toString 返回value字段的值\r\n     */\r\n    DtPicker.prototype.getSelected = function () {\r\n        var self = this;\r\n        var ui = self.ui;\r\n        var type = self.option.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.option.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    /**\r\n     * 设置日期值,value为字符串时,格式请参照 yyyy-mm-dd hh:mi具体格式与配置项type相关\r\n     *\r\n     * @param {String|Date} value\r\n     */\r\n    DtPicker.prototype.setSelectedValue = function (value) {\r\n        this._setSelectedValue(value);\r\n    };\r\n\r\n    /**\r\n     * 是否润年\r\n     *\r\n     * @param {Number} year 年份\r\n     * @returns {Boolean}\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.option.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginMonth = function () {\r\n        return this.option.beginMonth && this._isBeginYear() && this.option.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginDay = function () {\r\n        return this._isBeginMonth() && this.option.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isBeginHours = function () {\r\n        return this._isBeginDay() && this.option.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndYear = function () {\r\n        return this.option.endYear === parseInt(this.ui.y.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndMonth = function () {\r\n        return this.option.endMonth && this._isEndYear() && this.option.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndDay = function () {\r\n        return this._isEndMonth() && this.option.endDay === parseInt(this.ui.d.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._isEndHours = function () {\r\n        return this._isEndDay() && this.option.endHours === parseInt(this.ui.h.getSelectedValue());\r\n    };\r\n\r\n    DtPicker.prototype._createYear = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成年列表\r\n        var yArray = [];\r\n        if (option.customData.y) {\r\n            yArray = option.customData.y;\r\n        } else {\r\n            var yBegin = option.beginYear;\r\n            var yEnd = option.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    };\r\n\r\n    DtPicker.prototype._createMonth = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成月列表\r\n        var mArray = [];\r\n        if (option.customData.m) {\r\n            mArray = option.customData.m;\r\n        } else {\r\n            var m = option.beginMonth && self._isBeginYear() ? option.beginMonth : 1;\r\n            var maxMonth = option.endMonth && self._isEndYear() ? option.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    };\r\n\r\n    DtPicker.prototype._createDay = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成日列表\r\n        var dArray = [];\r\n        if (option.customData.d) {\r\n            dArray = option.customData.d;\r\n        } else {\r\n            var d = self._isBeginMonth() ? option.beginDay : 1;\r\n            var maxDay = self._isEndMonth() ? option.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 () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n        //生成时列表\r\n        var hArray = [];\r\n        if (option.customData.h) {\r\n            hArray = option.customData.h;\r\n        } else {\r\n            var h = self._isBeginDay() ? option.beginHours : 0;\r\n            var maxHours = self._isEndDay() ? option.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 () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n\r\n        //生成分列表\r\n        var iArray = [];\r\n        if (option.customData.i) {\r\n            iArray = option.customData.i;\r\n        } else {\r\n            var i = self._isBeginHours() ? option.beginMinutes : 0;\r\n            var maxMinutes = self._isEndHours() ? option.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 option = self.option;\r\n        var ui = self.ui;\r\n        ui.labels.each(function (i, label) {\r\n            label.innerText = option.labels[i];\r\n        });\r\n    };\r\n\r\n    DtPicker.prototype._setButtons = function () {\r\n        var self = this;\r\n        var option = self.option;\r\n        var ui = self.ui;\r\n        ui.cancel.text(option.buttons[0]);\r\n        ui.ok.text(option.buttons[1]);\r\n\r\n        if (option.hasClear) {\r\n            ui.clear.text(option.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    // 对于time类型时,或未完整的时间值,使用defaultPickerDate来填充\r\n    DtPicker.prototype._parseSetValue = function (value) {\r\n        var now = defaultPickerDate;\r\n        var type = this.option.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                value = 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    // 生成日期数据\r\n    DtPicker.prototype._create = function () {\r\n        var self = this;\r\n        var option = this.option;\r\n        var now = defaultPickerDate;\r\n        var beginDate = option.beginDate;\r\n\r\n        if (beginDate) {  // 若有设置开始日期\r\n            beginDate = this._parseSetValue(beginDate);\r\n            option.beginYear = beginDate.y;\r\n            option.beginMonth = beginDate.m;\r\n            option.beginDay = beginDate.d;\r\n            option.beginHours = beginDate.h;\r\n            option.beginMinutes = beginDate.i;\r\n        } else if (option.type == 'time') { // 未设置开始日期,但日期格式是time\r\n            option.beginYear = now.getFullYear();\r\n            option.beginMonth = now.getMonth() + 1;\r\n            option.beginDay = now.getDate();\r\n            option.beginHours = 0;\r\n            option.beginMinutes = 0;\r\n        } else {\r\n            option.beginYear = now.getFullYear() - 5;   // 其它,未设置开始日期,type也不为time,设置默认起始时间\r\n        }\r\n\r\n        var endDate = option.endDate;\r\n        if (endDate) { //设定了结束日期\r\n            endDate = this._parseSetValue(endDate);\r\n            option.endYear = endDate.y;\r\n            option.endMonth = endDate.m;\r\n            option.endDay = endDate.d;\r\n            option.endHours = endDate.h;\r\n            option.endMinutes = endDate.i;\r\n        } else if (option.type == 'time') {\r\n            option.endYear = now.getFullYear();\r\n            option.endMonth = now.getMonth() + 1;\r\n            option.endDay = now.getDate();\r\n            option.endHours = 23;\r\n            option.endMinutes = 59;\r\n        } else {\r\n            option.endYear = option.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     * 设置组件日期范围\r\n     *\r\n     * @param {String|Date} beginDate 开始时间\r\n     * @param {Stirng|Date} endDate 结束时间\r\n     */\r\n    DtPicker.prototype.setDateRange = function (beginDate, endDate) {\r\n        this.option.beginDate = beginDate;\r\n        this.option.endDate = endDate;\r\n        this._create();\r\n    };\r\n\r\n    /**\r\n     * 设置开始组件的开始据时间\r\n     * @param {String|Date} date\r\n     */\r\n    DtPicker.prototype.setBeginDate = function (date) {\r\n        this.option.beginDate = date;\r\n        this._create();\r\n    };\r\n\r\n    /**\r\n     * 设置组件的结束时间\r\n     *\r\n     * @param {String|Date} date\r\n     */\r\n    DtPicker.prototype.setEndDate = function (date) {\r\n        this.option.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    /**\r\n     * 显示组件\r\n     *\r\n     * @param {Function} callBack 点击按钮时的回调函数,设置此参数会覆盖初始化时的回调函数\r\n     * @param {Object} callBack.sltDate 当前选中的日期信息,具体格式,见方法{@link #getSelected getSelected()}的返回\r\n     * @param {Number} callBack.index 被点击的按钮索引,0取消,1确认,2清除\r\n     */\r\n    DtPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.option.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.setSelectedValue(this.value);\r\n        this.holder.addClass(\"ipu-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.option.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    /**\r\n     * 隐藏组件\r\n     */\r\n    DtPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ipu-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(\"ipu-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    /**\r\n     * @member ipu\r\n     * 生成DtPicker实例,参数信息见{@link DtPicker#method-constructor}\r\n     *\r\n     * @param {Object} option\r\n     * @returns {DtPicker}\r\n     */\r\n    ipu.dtPicker = function (option) {\r\n        return new DtPicker(option);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n// 支持非循环\r\n// 更新方法和属性命名\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容同时显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n// 理想用户不操作时,永远不显示最后复制项,或者各项独立,也可实现类似功能\r\n//indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n// 直接替换掉了prototype对象,可能不是个好选择\r\n\r\n(function (ipu, $, Hammer) {\r\n    /**\r\n     * @class\r\n     * @uses Hammer.js\r\n     * 通过hammer.js实现的banner功能组件,\r\n     * 因为实现轮播,显示第一项后,再显示第一项,所以第一项有被复制到添加到最后\r\n     *\r\n     *      @example\r\n     *      <!-- 组件html结构如下,li里的内容用户可自定义  -->\r\n     *      <div class=\"ipu-carousel ipu-hammer-carousel\">\r\n     *          <ul class=\"ipu-carousel-wrapper\">\r\n     *              <li ><img src=\"../../biz/img/01.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/02.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/03.jpg\" alt=\"\"></li>\r\n     *              <li ><img src=\"../../biz/img/04.jpg\" alt=\"\"></li>\r\n     *          </ul>\r\n     *      </div>\r\n     *\r\n     * @constructor  不能直接访问该类,调用 {@link ipu#hammerCarousel}生成实例\r\n     * @param {String|JqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function HammerCarousel(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).get(0);\r\n        this._init();\r\n    }\r\n\r\n    HammerCarousel.prototype = {\r\n        /**\r\n         * 组件默认配置项\r\n         *\r\n         * @cfg {Object} defaultOption\r\n         * @cfg {Number} defaultOption.index 初始化时显示第几项,用户未指定时,会查找子项内容上有ipu-current的项显示,没有则显示第一项\r\n         * @cfg {Boolean} defaultOption.autoPlay 是否自动轮播\r\n         * @cfg {Number} defaultOption.duration 自动轮播时的间隔时间,单位ms\r\n         * @cfg {Boolean} defaultOption.indicator 是否生成banner提示器,true右下角出现小点\r\n         * @cfg {Function} defaultOption.callBack 轮播显示某项时的回调函数\r\n         * @cfg {Number} defaultOption.callBack.index 当前显示的项索引\r\n         * @cfg {Function} defaultOption.clickBack\r\n         *          切换项时被点击时的回调函数,此处主要是为了处理复制项与第一项的点击事件进行处理,\r\n         *          让用户不关注点周是第一项或是复制项,回调作用域为组件对象\r\n         * @cfg {Number} defaultOption.clickBack.index 点击的项索引\r\n         */\r\n        defaultOption: {\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        },\r\n        _init: function () {\r\n            this.wrapper = $(\">.ipu-carousel-wrapper\", this.el);\r\n            this.carouselItems = $(\">li\", this.wrapper);\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 that = this;\r\n            if (this.option.clickBack) {\r\n                $(\">li\", this.wrapper).each(function (i) {\r\n                    $(this).click(function () {\r\n                        that.option.clickBack.call(this, i % that.size);\r\n                    });\r\n                })\r\n            }\r\n\r\n            this._sizeCount();\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.option.index == null) {\r\n                var activeIndex = this.carouselItems.filter(\".ipu-current\").index();\r\n                this.option.index = activeIndex != -1 ? activeIndex : 0;\r\n            }\r\n\r\n            if (this.option.indicator) {\r\n                this._addIndicator();\r\n            }\r\n\r\n            this.show(this.option.index, false);\r\n        },\r\n        /**\r\n         * 停止自动滚动\r\n         */\r\n        stop: function () {\r\n            this._pause();\r\n            this.option.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        /**\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);\r\n        },\r\n        /**\r\n         * 切换到下一项\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);\r\n        },\r\n        /**\r\n         * 切换显示指定项\r\n         *\r\n         * @param {Number} index 要切换到的项索引\r\n         *\r\n         */\r\n        show: function (index) {//跳到指定索引处\r\n            var index = index % this.size;\r\n            if (index < 0) {\r\n                index = this.size + index;\r\n            }\r\n            this._show(index); // 默认追加动画\r\n        },\r\n        /**\r\n         * 自动轮播\r\n         */\r\n        play: function () {\r\n            this.option.autoPlay = true;\r\n            this._play();\r\n        },\r\n        _play: function () {\r\n            if (this.option.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.option.duration);\r\n            }\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='ipu-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(\"ipu-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        /**\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, false); //新的位置\r\n            }\r\n        },\r\n        _move: function (moveLen) { // 类似mouseMove时的处理函数\r\n            this._pause();\r\n            $(this.wrapper).removeClass(\"ipu-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(\"ipu-carousel-animate\", animate);\r\n            this.currentIndex = index % this.size;\r\n            this.lastItem = index == this.size;\r\n\r\n            this.moveLen = this.carouselItemSizes[index];\r\n            var move = - this.moveLen + \"px\";\r\n\r\n            $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n\r\n            var currentIndex = this.currentIndex;\r\n            if (animate && this.option.callBack) {\r\n                this.option.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n            }\r\n\r\n            if (this.indicator) {\r\n                this.indicatorIndexs.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n            }\r\n            this.carouselItems.eq(currentIndex).addClass(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n\r\n            this._play();//处理自动播放\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    /**\r\n     * @member ipu\r\n     * 生成HammerCarousel实例,参数信息见{@link HammerCarousel#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {HammerCarousel}\r\n     */\r\n    ipu.hammerCarousel = function (slt, option) {\r\n        return new HammerCarousel(slt, option);\r\n    };\r\n})(ipu || window, jQuery, Hammer);\r\n\n(function (ipu, $) {\r\n\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            /*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        __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n        return this;\r\n    };\r\n\r\n    var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n    var defaults = {\r\n        modalTitle: '',\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\r\n    ipu.modal = function (params) {\r\n        params = params || {};\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=\"ipu-modal-button' + (params.buttons[i].bold ? ' ipu-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=\"ipu-modal-title\">' + params.title + '</div>' : '';\r\n        var textHTML = params.text ? '<div class=\"ipu-modal-text\">' + params.text + '</div>' : '';\r\n        var afterTextHTML = params.afterText ? params.afterText : '';\r\n        var noButtons = !params.buttons || params.buttons.length === 0 ? 'ipu-modal-no-buttons' : '';\r\n        var verticalButtons = params.verticalButtons ? 'ipu-modal-buttons-vertical' : '';\r\n\r\n        var modalHTML = '<div class=\"ipu-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ipu-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ipu-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('.ipu-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\r\n    /**\r\n     * @member ipu\r\n     * 弹出警告消息\r\n     *\r\n     * @param {String} text 警句文本\r\n     * @param {String} title 警告标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\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\r\n    /**\r\n     * @member ipu\r\n     * 弹出确认消息\r\n     *\r\n     * @param {String} text 确认文本\r\n     * @param {String} title 确认标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\r\n     * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\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, bold: true, onClick: callbackCancel},\r\n                {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n            ]\r\n        });\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 弹出输入框\r\n     *\r\n     * @param {String} text 输入提示文本\r\n     * @param {String} title 输入提示标题,可选参数\r\n     * @param {Function} callbackOk 用户确认后的回调函数,可选参数\r\n     * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\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=\"ipu-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('.ipu-modal-text-input').val());\r\n                if (index === 1 && callbackOk) callbackOk($(modal).find('.ipu-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    /**\r\n     *  @member ipu\r\n     * 弹出加载消息提示\r\n     *\r\n     * @param {String} title 加载提示文本\r\n     * @param {Number} minTime 消息最小显示时间,单位ms,可选参数\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=\"ipu-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\r\n    /**\r\n     * @member ipu\r\n     * 隐藏加载消息提示\r\n     *\r\n     * @param {Boolean} force 是否强制隐藏,不管最小提示时间,可选\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\r\n    /**\r\n     * @member ipu\r\n     * 显示加载状态\r\n     */\r\n    ipu.showIndicator = function () {\r\n        if ($('.ipu-preloader-indicator-modal')[0]) return;\r\n        $(defaults.modalContainer).append('<div class=\"ipu-preloader-indicator-overlay\"></div><div class=\"ipu-preloader-indicator-modal\"><span class=\"ipu-preloader ipu-preloader-white\"></span></div>');\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 隐藏加载状态\r\n     */\r\n    ipu.hideIndicator = function () {\r\n        $('.ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal').remove();\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 显示操作选项\r\n     *\r\n     * @param{[[Object]]} actions\r\n     * @param {Object} actions.Object\r\n     * @param {String} actions.Object.text 操作名称\r\n     * @param {Boolean} actions.Object.label 是否标签,非标签就是操作项,操作项有后续的配置,标签项无须后续配置项\r\n     * @param {String:warning} actions.Object.color 样式,可选\r\n     * @param {String:warning} actions.Object.bg 背景样式,可选\r\n     * @param {Function} actions.Object.onClick 点击时回调函数\r\n     */\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=\"ipu-actions-modal-group\">';\r\n                var button = params[i][j];\r\n                var buttonClass = button.label ? 'ipu-actions-modal-label' : 'ipu-actions-modal-button';\r\n                if (button.bold) buttonClass += ' ipu-actions-modal-button-bold';\r\n                if (button.color) buttonClass += ' ipu-color-' + button.color;\r\n                if (button.bg) buttonClass += ' ipu-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=\"ipu-actions-modal\">' + buttonsHTML + '</div>';\r\n        _modalTemplateTempDiv.innerHTML = modalHTML;\r\n        modal = $(_modalTemplateTempDiv).children();\r\n        $(defaults.modalContainer).append(modal[0]);\r\n        groupSelector = '.ipu-actions-modal-group';\r\n        buttonSelector = '.ipu-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    /**\r\n     * @member ipu\r\n     * 悬浮提示消息\r\n     *\r\n     * @param {String} msg 消息文本\r\n     * @param {Number} duration=2000 消息显示时间,单位ms\r\n     */\r\n    ipu.toast = function (msg, duration, extraclass) {\r\n        var $toast = $('<div class=\"ipu-modal ipu-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\r\n    ipu.openModal = function (modal, cb) {\r\n        modal = $(modal);\r\n        var isModal = modal.hasClass('ipu-modal'),\r\n            isNotToast = !modal.hasClass('ipu-toast');\r\n            isNotToast = false; // 强制打开新窗口\r\n\r\n        if ($('.ipu-modal.ipu-modal-in:not(.ipu-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\r\n        var isPopup = modal.hasClass('ipu-popup');\r\n        var isLoginScreen = modal.hasClass('ipu-login-screen');\r\n        var isPickerModal = modal.hasClass('ipu-picker-modal');\r\n        var isToast = modal.hasClass('ipu-toast');\r\n\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\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 ($('.ipu-modal-overlay').length === 0 && !isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ipu-modal-overlay\"></div>');\r\n            }\r\n            if ($('.ipu-popup-overlay').length === 0 && isPopup) {\r\n                $(defaults.modalContainer).append('<div class=\"ipu-popup-overlay\"></div>');\r\n            }\r\n            overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-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('ipu-with-picker-modal');\r\n        }\r\n\r\n        // Classes for transition in\r\n        if (!isLoginScreen && !isPickerModal && !isToast){\r\n            overlay.addClass('ipu-modal-overlay-visible');\r\n        }\r\n        modal.removeClass('ipu-modal-out').addClass('ipu-modal-in').transitionEnd(function (e) {\r\n            if (modal.hasClass('ipu-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\r\n    ipu.closeModal = function (modal) {\r\n        modal = $(modal || '.ipu-modal-in');\r\n        if (typeof modal !== 'undefined' && modal.length === 0) {\r\n            return;\r\n        }\r\n        var isModal = modal.hasClass('ipu-modal'),\r\n            isPopup = modal.hasClass('ipu-popup'),\r\n            isToast = modal.hasClass('ipu-toast'),\r\n            isLoginScreen = modal.hasClass('ipu-login-screen'),\r\n            isPickerModal = modal.hasClass('ipu-picker-modal'),\r\n            removeOnClose = modal.hasClass('ipu-remove-on-close'),\r\n            overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-modal-overlay');\r\n        if (isPopup) {\r\n            if (modal.length === $('.ipu-popup.ipu-modal-in').length) {\r\n                overlay.removeClass('ipu-modal-overlay-visible');\r\n            }\r\n        }\r\n        else if (!(isPickerModal || isToast)) {\r\n            overlay.removeClass('ipu-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('ipu-with-picker-modal');\r\n            $(defaults.modalContainer).addClass('ipu-picker-modal-closing');\r\n        }\r\n\r\n        modal.removeClass('ipu-modal-in').addClass('ipu-modal-out').transitionEnd(function (e) {\r\n            if (modal.hasClass('ipu-modal-out')) modal.trigger('closed');\r\n            else modal.trigger('opened');\r\n\r\n            if (isPickerModal) {\r\n                $(defaults.modalContainer).removeClass('ipu-picker-modal-closing');\r\n            }\r\n            if (isPopup || isLoginScreen || isPickerModal) {\r\n                modal.removeClass('ipu-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\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('ipu-open-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ipu-popup';\r\n            ipu.popup(popup);\r\n        }\r\n        if (clicked.hasClass('ipu-close-popup')) {\r\n            if (clickedData.popup) {\r\n                popup = clickedData.popup;\r\n            }\r\n            else popup = '.ipu-popup.modal-in';\r\n            ipu.closeModal(popup);\r\n        }*/\r\n\r\n        // Close Modal\r\n        if (clicked.hasClass('ipu-modal-overlay')) {\r\n            if ($('.ipu-modal.ipu-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n                ipu.closeModal('.ipu-modal.ipu-modal-in');\r\n            if ($('.ipu-actions-modal.ipu-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n                ipu.closeModal('.ipu-actions-modal.ipu-modal-in');\r\n\r\n        }\r\n        if (clicked.hasClass('ipu-popup-overlay')) {\r\n            if ($('.ipu-popup.ipu-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n                ipu.closeModal('.ipu-popup.modal-in');\r\n        }\r\n    }\r\n\r\n    $(document).on('click', ' .ipu-modal-overlay, .ipu-popup-overlay, .ipu-close-popup, .ipu-open-popup, .ipu-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n    /**\r\n     * @class 导航切换组件\r\n     *\r\n     *      @example\r\n\r\n            <!-- 组件的html分成导航和内容两部分,一般与flex栅格配合布局-->\r\n            <!--  组件导航部分 -->\r\n            <nav class=\"ipu-navbar \">\r\n                <a class=\"ipu-navbar-item \" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-home\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">插件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item \" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-dashcube\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">JS组件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item ipu-current\" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-map\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">静态组件</span>\r\n                </a>\r\n                <a class=\"ipu-navbar-item\" href=\"javascript:;\">\r\n                    <span class=\"ipu-icon fa fa-mortar-board\"></span>\r\n                    <span class=\"ipu-navbar-item-label\">更多</span>\r\n                </a>\r\n            </nav>\r\n\r\n            <!-- 内容部分 -->\r\n            <div class=\"ipu-nav-content\">\r\n                <ul>\r\n                    <li>\r\n                        自定义内容1\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                    <li>\r\n                        自定义内容\r\n                    </li>\r\n                </ul>\r\n            </div>\r\n\r\n     *\r\n     * \r\n     * @constructor  不能直接访问该类,调用{@link ipu#navBar ipu.navBar(slt, option)}生成实例\r\n     * @param {String|jqueryObj} slt jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function NavBar(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.content = $(this.option.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(\".ipu-current\").index(); // 查找默认有active的索引\r\n        if (activeIndex == -1) {\r\n            activeIndex = this.contents.filter(\".ipu-current\").index(); // 查找默认有active的索引\r\n        }\r\n        this.option.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n        if (!this.option.animate) {\r\n            this.wrapper.addClass(\"ipu-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.option.index);\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption\r\n     * @cfg {Boolean} defaultOption.animate=false 切换时是否添加动画效果\r\n     * @cfg {Dom|String|JqueryObj} defaultOption.contentSlt='.ipu-nav-content' 内容dom选择器,页面有多个navBar组件时,需要设置此值\r\n     * @cfg {Function} defaultOption.callBack 切换时的回调函数\r\n     * @cfg {Number} defaultOption.callBack.index 当前显示项索引\r\n     */\r\n    NavBar.prototype.defaultOption = {\r\n        animate: false,\r\n        contentSlt: \".ipu-nav-content\",\r\n        callBack: function (currentIndex, lastIndex) {\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 显示第几项内容\r\n     * @param {Number} index 显示内容项索引\r\n     */\r\n    NavBar.prototype.show = function (index) {\r\n        if (this.currentIndex != index) {\r\n            $(this.contents[index]).addClass(\"ipu-show\");\r\n\r\n            if (this.option.animate) {\r\n                if (this.lastIndex != null && this.lastIndex != index) {\r\n                    $(this.contents[this.lastIndex]).removeClass(\"ipu-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(\"ipu-no-animation\").removeClass(\"ipu-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(\"ipu-no-animation\").addClass(\"ipu-nav-content-right\").width(); // 可以强制刷新不?\r\n                        }\r\n                    }\r\n                    this.wrapper.removeClass(\"ipu-no-animation\").toggleClass(\"ipu-nav-content-right\");\r\n                }\r\n            } else {\r\n                $(this.contents[this.currentIndex]).removeClass(\"ipu-show\");\r\n            }\r\n\r\n            // 更新class,ipu-current状态\r\n            $(this.contents[index]).addClass(\"ipu-current\").siblings(\".ipu-current\").removeClass(\"ipu-current\");\r\n            $(this.navs[index]).addClass(\"ipu-current\").siblings(\".ipu-current\").removeClass(\"ipu-current\");\r\n\r\n            this.lastIndex = this.currentIndex;\r\n            this.currentIndex = index;\r\n\r\n            if (this.option.callBack) {\r\n                this.option.callBack(this.currentIndex, this.lastIndex);\r\n            }\r\n        }\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成NavBar实例,参数信息见{@link NavBar#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {NavBar}\r\n     */\r\n    ipu.navBar = function (slt, option) {\r\n        return new NavBar(slt, option);\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    // 检查是否有ipu-pages的结构\r\n    function checkPages() {\r\n        if(!hasPages){\r\n            pagesObj = $(\".ipu-pages\"); // pagesObj为空则进行jquery取值\r\n            if(pagesObj.size() == 0){\r\n                pagesObj =  $(\"<div class='ipu-pages'><div class='ipu-page ipu-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 = \"ipu-anim ipu-slideRightIn\";\r\n    var animateOutClass  = \"ipu-anim ipu-slideRightOut\";\r\n    var eventName = \"ipuUIPageBack\";\r\n    var zeroPageClass = 'ipu-page-zero';   // 占位页面,对于为当前页面\r\n    var zeroPagesClass = 'ipu-pages-zero';   // 占位页面的特殊class,作用已忘记,应该是用来标记显示用\r\n\r\n    /**\r\n     * @private\r\n     * @class page 单页面实现功能对象\r\n     * 以iframe加载子页面的方式,页面后退(后退时,后退到a页面,所有在a页面后打开的页面全都关闭)\r\n     * ipu框架在浏览器运行时,使用此对象实现与客户端运行类似的效果\r\n     * 大致实现是当前页面进行处理,所有的后续页面加载都放在一个iframe中,所有页面按加载顺序排序,关闭或后退按页面打开的顺序处理\r\n     */\r\n\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption page组件默认配置项\r\n     * @cfg {Window} defaultOption.target = window.parent 默认执行的窗口对象,子页面调用相关方法,默认都都是在parent窗口执行,需要指定此参数,如顶层父窗口\r\n     * @cfg {Number} defaultOption.backIndex=-1 回退索引,大于0时,正序计算,小于0时,倒序计算,-1即为当页面的上一个页面\r\n     * @cfg {Number} defaultOption.closeIndex 关闭页面索引,参数说明同上\r\n     * @cfg {Object} defaultOption.params Json格式参数,POST方式打开页面时,使用此参数传递参数,暂不支持数组格式参数\r\n     * @cfg {Boolean} defaultOption.animate=true 是否使用动画,打开或回退页面时有效参数\r\n     * @cfg {Boolean} defaultOption.showLoading=true 是否显示加载提示,打开或回退页面时有效参数\r\n     * @cfg {Boolean} defaultOption.loadingMessage='正在加载中' 是否显示加载提示,打开或回退页面时有效参数\r\n     * @cfg defaultOption.data=null 回退页面时,传递给回退到的页面的参数,回退到的页面有设置监听函数时,监听函数可以接收此参数\r\n     * @cfg {String} defaultOption.pageName='' 页面的名称,打开或回退页面时有效参数\r\n     * @cfg {Function} defaultOption.callBack 方法执行结束时的回调函数\r\n     */\r\n    page.defaultOption = {     // 那个窗口执行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, option) {\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(option.showLoading){\r\n            ipu.showPreloader(option.loadingMessage, option.minMessageTime);\r\n        }\r\n\r\n        if(option.method == 'post'){\r\n            newPage = $(\"<div class='ipu-page' id='\"+nowPageNo+\"' data-name='\"+option.pageName+\"'><iframe class='ipu-page-iframe'></iframe></div>\");\r\n        }else{\r\n            newPage = $(\"<div class='ipu-page' id='\"+nowPageNo+\"' data-name='\"+option.pageName+\"'><iframe class='ipu-page-iframe' src='\"+url+\"'></iframe></div>\");\r\n        }\r\n\r\n        var zeroPage = isZeroPage($(\".ipu-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(option.showLoading) {\r\n                ipu.hidePreloader();\r\n            }\r\n\r\n            if(option.animate) {\r\n                animatePage.removeClass(animateInClass);\r\n            }\r\n\r\n            newPage.siblings(\".ipu-show\").removeClass('ipu-show');\r\n            if(option.callBack){\r\n                option.callBack();\r\n            }\r\n        }\r\n\r\n        $(\".ipu-page-iframe\", newPage).one('load', function () {\r\n            newPage.addClass(\"ipu-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\r\n\r\n            if(zeroPage){\r\n                animatePage.removeClass(zeroPagesClass);\r\n            }\r\n            if(option.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(option.method == 'post') {\r\n            var pageDoc = $(\".ipu-page-iframe\", newPage)[0].contentDocument;\r\n            submitForm(pageDoc, url, option.params);\r\n        }\r\n    };\r\n\r\n    // post方式加载页面\r\n    page.postPage = function (url, option) {\r\n        option.method = 'post';\r\n        page.openPage(url, option);\r\n    };\r\n\r\n    // 当前页面后退,针对顶层父窗口\r\n    page.backPage = function (option) {\r\n        var backIndex = option.backIndex;\r\n        var page = null;\r\n        var nowPage = $(\".ipu-page.ipu-show\", pagesObj);\r\n\r\n        if(option.pageName){\r\n            page =  $(\".ipu-page[data-name='\"+option.pageName+\"']:first\", pagesObj);\r\n        }else if(backIndex == 0){\r\n            page = $(\".ipu-page:first\", pagesObj);\r\n        }else { // 越界的情况\r\n            var prevPage = nowPage.prevAll(\".ipu-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(\"ipu-show\"); //显示前一个\r\n        }\r\n\r\n        function end (){\r\n            $(this).removeClass(animateOutClass);\r\n            page.nextAll(\".ipu-page\").remove();\r\n\r\n            var iframe = $(\".ipu-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(option.data){\r\n                evt.data = option.data;\r\n            }\r\n            nowDoc.body.dispatchEvent(evt);\r\n            if(option.callBack){\r\n                option.callBack();\r\n            }\r\n        }\r\n\r\n        if(option.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 (option) {\r\n        var closeIndex = option.closeIndex;\r\n        var prevPage = $(\".ipu-page.ipu-show\", pagesObj).prevAll(\".ipu-page\");\r\n\r\n        if(option.pageName){\r\n            closeIndex =  $(\".ipu-page[data-name='\"+option.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(option.callBack){\r\n            option.callBack();\r\n        }\r\n    };\r\n\r\n    /**\r\n     * get请求的方式加载页面\r\n     *\r\n     * @param {String} url\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.open = function (url, option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.openPage(url, option);\r\n    };\r\n\r\n    /**\r\n     * 使用post方式加载一个新页面\r\n     *\r\n     * @param {String} url 要打开的页面地址\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.post = function (url, option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.method = 'post';\r\n        option.target.ipu.page.openPage(url, option);\r\n    };\r\n\r\n    /**\r\n     * 回退到某个历史页面,可以根据pageName回退,也可根据backIndex回退,默认回退上一个页面\r\n     *\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.back = function (option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.backPage(option);\r\n    };\r\n\r\n    /**\r\n     * 回退到首页\r\n     *\r\n     * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n     */\r\n    page.backHome = function (option) {\r\n        option = option || {};\r\n        option.backIndex = 0;\r\n        page.back(option);\r\n    };\r\n\r\n    // 子窗口,待确认\r\n    page.close = function (option) {\r\n        option = $.extend({}, this.defaultOption, option);\r\n        option.target.ipu.page.closePage(option);\r\n    };\r\n\r\n    /**\r\n     * 给页面增加一个监听,从其它页面回退到此页面,调用此函数,可以接收其它页面传来的数据\r\n     *\r\n     * @param {Function} back 监听函数\r\n     * @param back.data 其它页面传过来的参数,推荐字符串或Json对象\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不要距离容器太近,是否不应该设置px,使用rem\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\r\n    function toRem(num){\r\n        return num/100;\r\n    }\r\n\r\n    /**\r\n     * @private \r\n     * @class 选择器,被DtPicker和PopPicker使用,实现选择与滚动等基础功能\r\n     *\r\n     * @constructor  初始化方法\r\n     * @param {String|DOM|JQueryObj} slt\r\n     * @param {object} option 组件参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function Picker(slt, option) {\r\n        this.el = $(slt)[0];\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this._init();\r\n    }\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption=\r\n     * @cfg {Boolean} defaultOption.listen=true 是否需要监听变化\r\n     * @cfg {[Object]} defaultOption.data=[] 可选择项数组,每个项须有text属性\r\n     * @cfg {String} defaultOption.data.text 子项展示文本\r\n     * @cfg {Function} defaultOption.onChange=null 选择变化时的回调函数\r\n     * @cfg {Object} defaultOption.onChange.sltItem  选中项\r\n     * @cfg {Number} defaultOption.onChange.newIndex 新的选中项索引\r\n     * @cfg {Number} defaultOption.onChange.oldIndex 旧的选中项索引\r\n     * @cfg {Boolean} defaultOption.onChange.newData 是否为调用setItem()方法触发\r\n     */\r\n    Picker.prototype.defaultOption = {\r\n        listen: true,\r\n        data: [],\r\n        onChange: null\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.option.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\r\n        // 如果是ios,则ul的旋转中心点,样式不同于android\r\n        if(ipu.device.ios){\r\n            this.wrap.css(\"transform-origin\", \"center center \"+toRem(r)+\"rem\"); //如果是ios,要变更旋转的中心点\r\n        }\r\n\r\n\r\n        this.setItems(this.option.data);\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        // 处理滚动中,用户点中某项,停止\r\n        this.hammer.on(\"press pressup\", function (e) {  // 如果用户点击了,是停止自动滚动\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\r\n    /**\r\n     * 设置选择项\r\n     *\r\n     * @param {[Object]} data 设置项数组\r\n     */\r\n    Picker.prototype.setItems = function (data, textName) {  // textNam字体暂不支持\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; //  是否为新设置数据标记\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(\" + toRem(r) + \"rem) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n                \"transform-origin\": \"center center -\" + toRem(r) + \"rem\"\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\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(\"ipu-noanimate\");    // 移除动画\r\n            this.stopInertiaMove = true; //  停止自动减速滚动\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    /**\r\n     * 为组件设置新的滚动角度\r\n     *\r\n     * @param {Number} newAngle 新的滚动角度\r\n     * @param {Boolean} endScroll 是否为最终滚动角度,为最终滚动角度时,若索引更新可以触发onChange的回调\r\n     */\r\n    Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n        this.angle = newAngle; // 存储最新值\r\n        this.wrap.css(\"transform\", \"perspective(\"+toRem(1000)+\"rem) 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                if (this.option.onChange && this.listen) {\r\n                    this.option.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n                }\r\n                this.newData = false;\r\n            }\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 计算各子项滚动角度与新的滚动角度的值差异来决定显示的情况\r\n     * 角度大于 90-(itemAngle/2)时,隐藏\r\n     * 角度小于itemAngle/2表示最中心的项,显示并高亮\r\n     * 其它值则表示此项为显示\r\n     *\r\n     * @param {Number} angle 新的滚动角度\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(\"ipu-highlight ipu-visible\");\r\n            } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n                $(this).removeClass(\"ipu-highlight ipu-visible\");\r\n            } else {\r\n                $(this).addClass(\"ipu-visible\").removeClass(\"ipu-highlight\");\r\n            }\r\n        });\r\n    };\r\n\r\n    // 设置最后回归位置\r\n    Picker.prototype.endScroll = function () {\r\n        this.wrap.removeClass(\"ipu-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    /**\r\n     * 设置是否监听触发onChange回调\r\n     *\r\n     * @param {Boolean} listen\r\n     */\r\n    Picker.prototype.setListen = function (listen) {\r\n        this.listen = !!listen;\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    /**\r\n     * 设置选中项,若子项的value属性为value,则设置该项为选中项\r\n     *\r\n     * @param value\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     * 获取选中的子项,若子项集为空时,返回空对象\r\n     *\r\n     * @returns {Object}\r\n     */\r\n    Picker.prototype.getSelectedItem = function () {\r\n        return this.empty ? {}: this.data[this.index];\r\n    };\r\n\r\n    /**\r\n     * 获取选中的子项的value属性\r\n     * @returns\r\n     */\r\n    Picker.prototype.getSelectedValue = function () {\r\n        return this.getSelectedItem().value;\r\n    };\r\n\r\n    /**\r\n     * 返回选中项的text属性\r\n     * @return {String}\r\n     */\r\n    Picker.prototype.getSelectedText = function () {\r\n        return this.getSelectedItem().text;\r\n    };\r\n\r\n    /**\r\n     * 获取选中项的索引,若子项集为空则返回null\r\n     * @returns {Number}\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    /**\r\n     * @class\r\n     * 原生select的替代实现,适应数据较多或级联的情况\r\n     *\r\n     *      @example\r\n            // 配置项data的数据结构\r\n            var data = [{text:'显示名称', value:''}...];\r\n\r\n            // layer=1的数据结构\r\n            var data-1 = [{text:'湖南', value:'HN'}, {text:'湖北', value:'HB'}];\r\n\r\n            // layer=2时的数据结构,有额外data属性存放下一层级数据\r\n            var data-1 = [\r\n                {\r\n                    text:'湖南',value:'HN', data:[{text:'长沙', value:'CS'}, {text:'湘谭', value:'XT'}]\r\n                },{\r\n                    text:'湖北',value:'HB', data:[{text:'武汉', value:'WH'}, {text:'天门', value:'TM'}]\r\n                }\r\n            ];\r\n\r\n     *\r\n     * @constructor  不能直接访问该类,调用{@link ipu#navBar ipu.popPicker(slt, option)}生成实例\r\n     * @param {String|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function PopPicker(option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        if(!Picker){\r\n            Picker = ipu.Picker;\r\n        }\r\n        this._init();\r\n    }\r\n\r\n    PopPicker.prototype._init = function () {\r\n        this.holder = $(this.option.template).appendTo(\"body\");\r\n        var bodyHtml = $(\".ipu-poppicker-body\", this.holder);\r\n\r\n        var layer = this.option.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.option.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) { // 更新底部的值\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        $(\".ipu-poppicker-btn-ok\", this.holder).click(function () {\r\n            var rs = self.getSelectItems();\r\n            if (self.option.callBack(rs) !== false) {\r\n                self.hide();\r\n            }\r\n        }).text(this.option.btns[1]);\r\n\r\n        $(\".ipu-poppicker-btn-cancel\", this.holder).click(function () {\r\n            self.hide();\r\n        }).text(this.option.btns[0]);\r\n    };\r\n\r\n    /**\r\n     * 组件默认配置项\r\n     *\r\n     * @cfg {Object} defaultOption\r\n     * @cfg {String} defaultOption.template html结构\r\n     * @cfg {String} defaultOption.pickerTemplate 内容dom选择器\r\n     * @cfg {Object[]} defaultOption.data 选择项数据\r\n     * @cfg {String} defaultOption.data.text 子项展示文本\r\n     * @cfg {*} defaultOption.data.value 子项值\r\n     * @cfg {Object[]} defaultOption.data.data 有更多层级时,此属性存放下一层级的数据\r\n     * @cfg {Number} defaultOption.layer=1 数据层数\r\n     * @cfg {String[]} defaultOption.btns=['取消', '确认'] 按钮文本\r\n     * @cfg {Function} defaultOption.callBack=null 回调函数\r\n     */\r\n    PopPicker.prototype.defaultOption = {\r\n        template: '<div class=\"ipu-poppicker\">'\r\n                        +'<div class=\"ipu-poppicker-header\">'\r\n                            +'<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-cancel\">取消</button>'\r\n                            +'<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-ok\">确定</button>'\r\n                        +'</div>'\r\n                        +'<div class=\"ipu-poppicker-body\">'\r\n                        +'</div>'\r\n                        +'</div>',\r\n        pickerTemplate: '<div class=\"ipu-picker\">'\r\n                            +'<div class=\"ipu-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    /**\r\n     * 设置选择项数据\r\n     *\r\n     * @param{[Object]} data 选择项数组\r\n     * @param {String} data.text 每个选择项的文本\r\n     * @param {[Object]} data.data 如果有多层选择的话,应该有一个data属性\r\n     */\r\n    PopPicker.prototype.setData = function (data) {\r\n        this.pickers[0].setItems(data);\r\n    };\r\n\r\n    /**\r\n     * 显示选择器\r\n     *\r\n     * @param callBack\r\n     */\r\n    PopPicker.prototype.show = function (callBack) {\r\n        if (callBack) {\r\n            this.option.callBack = callBack;\r\n        }\r\n        this.mask.show();\r\n        this.holder.addClass(\"ipu-current\");\r\n    };\r\n\r\n    /**\r\n     * 隐藏选择器\r\n     */\r\n    PopPicker.prototype.hide = function () {\r\n        this.mask.close();\r\n        this.holder.removeClass(\"ipu-current\");\r\n    };\r\n\r\n    /**\r\n     * 获取用户选择的项,如果配置项layer为1,则直接返回选择项,\r\n     * 否则返回一个数组返回每层选中的项\r\n     *\r\n     */\r\n    PopPicker.prototype.getSelectItems = function () {\r\n        if (this.option.layer == 1) {\r\n            return this.pickers[0].getSelectedItem();\r\n        } else {\r\n            var rs = [];\r\n            for (var i = 0; i < this.option.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(\"ipu-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    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link PopPicker#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {PopPicker}\r\n     */\r\n    ipu.popPicker = function (option) {\r\n        return new PopPicker(option);\r\n    };\r\n\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n\r\n    /**\r\n     * @class\r\n     * 进度条\r\n     *\r\n     *      @example\r\n            <!-- 组件html -->\r\n             <div class=\"ipu-ipu-progress \">\r\n                <span class=\"ipu-progressbar\"></span>\r\n             </div>\r\n     *\r\n     *\r\n     * @constructor  不能直接访问该类,调用 {@link ipu#progressBar}生成实例\r\n     * @param {String|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n     */\r\n    function ProgressBar(id, option) {\r\n        this.id = id;\r\n        this.level = option.level;\r\n        this.progress = option.progress;\r\n        this.progressBar = $(id).eq(0);\r\n\r\n        if (option.progress != null) {\r\n            this.setProgress(this.progress);\r\n        }\r\n        if (option.level != null) {\r\n            this.setLevel(this.level);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @cfg defaultOption 刷新组件默认配置\r\n     * @cfg {default|warning|highlight|success} defaultOption.level='default' 级别,显示颜色\r\n     * @cfg {Number} defaultOption.progress=null    当前进度百分比\r\n     *\r\n     */\r\n\r\n    /**\r\n     * 设置百分进度\r\n     *\r\n     * @param {Number} pro\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    /**\r\n     * 获取百分进度\r\n     *\r\n     * @returns {Number|*}\r\n     */\r\n    ProgressBar.prototype.getProgress = function () {\r\n        return this.progress;\r\n    };\r\n\r\n    /**\r\n     * 设置进度条级别\r\n     *\r\n     * @param {default | success | highlight | warning} level\r\n     */\r\n    ProgressBar.prototype.setLevel = function (level) {\r\n        if (level == \"default\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-hightlight ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progress\");\r\n        } else if (level == \"success\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-highlight ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-success\");\r\n        } else if (level == \"highlight\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-warning\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-highlight\");\r\n        } else if (level == \"warning\") {\r\n            $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-highlight\");\r\n            $(this.progressBar).addClass(\"ipu-progressbar-warning\");\r\n        }\r\n    };\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link ProgressBar#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {ProgressBar}\r\n     */\r\n    ipu.progressBar = function (slt, option) {\r\n        return new ProgressBar(slt, option);\r\n    };\r\n})(ipu || window, jQuery);\r\n\n// 设置上下条件长度,或计算函数\r\n// 处理resize的问题,用户主动调用refresh??\r\n// 底部启用或停用时,应该刷新组件iscroll高度\r\n// 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n(function (ipu, $, iScroll) {\r\n    /**\r\n     * @class\r\n     * 通过IScroll.js实现上拉下拉加载\r\n     *\r\n     *      @example\r\n            <!-- 组件html结构,最外层div应有一个固定的高度,会在此元素上初始化iScroll -->\r\n             <div>\r\n                 <div class=\"ipu-refresh-wrapper\">\r\n                    <!-- 此处组件初始化后,会添加上拉html -->\r\n                     <div class=\"refresh-content\">\r\n                        内容区...\r\n                     </div>\r\n                    <!-- 此处组件初始化后,会添加下拉html -->\r\n                 </div>\r\n             </div>\r\n     *\r\n     * @uses IScroll.js\r\n     *\r\n     * @constructor  不能直接访问该类,调用ipu.refresh(slt, option)生成实例\r\n     * @param {String|JqueryObj|Dom} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {Object} option\r\n     *      组件参数\r\n     */\r\n    function Refresh(slt, option) {\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.el = $(slt).get(0);\r\n        this._initBottomAndTop();\r\n        var me = this;\r\n\r\n        this.iScrollOption = {\r\n            onScrollMove: function (e) {\r\n                if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n                    if (this.y >= me.topPullOffset && !me.topEl.hasClass('ipu-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n                        me.topEl.addClass('ipu-refresh-toload');\r\n                    } else if (this.y < me.topPullOffset && me.topEl.hasClass('ipu-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n                        me.topEl.removeClass('ipu-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.iScrollOption = $.extend({}, this.option.iScrollOption, this.iScrollOption);\r\n        this.iScroll = new iScroll(this.el, this.iScrollOption);\r\n        this._checkContentLoading();\r\n    }\r\n\r\n    /**\r\n     * @cfg defaultOption 刷新组件默认配置\r\n     * @cfg {Function} defaultOption.bottomLoadFun=null 上拉时,触发底加载的响应函数\r\n     * @cfg {Function} defaultOption.topLoadFun=null    下拉时,触发顶部加载的响应函数\r\n     * @cfg {Boolean} defaultOption.initEnableTop=true   初始化时,是否启用顶部加载功能\r\n     * @cfg {Boolean} defaultOption.initEnableBottom=true   初始化时,是否启用底部加载功能\r\n     * @cfg {String} defaultOption.bottomLoadHtml=...   底部加载时显示的html片段,不建议变动\r\n     * @cfg {String} defaultOption.topLoadHtml=...   顶部加载时显示的html片段,不建议变动\r\n     * @cfg {Number} defaultOption.bottomAddLen=0   距离底部多远时,触发底部加载\r\n     * @cfg {Object} defaultOption.iScrollOption={}   上下拉使用的是IScroll组件,通过此参数配置IScroll初始化的参数\r\n     *\r\n     */\r\n    Refresh.prototype.defaultOption = {\r\n        bottomLoadFun: null,           // 底部加载处理函数\r\n        topLoadFun: null,               // 顶部加载处理函数\r\n        initEnableTop: true,            // 初始时启用刷新,有时用户并不想启用\r\n        initEnableBottom: true,         // 初始时启用加载更多,用时用户并不想启用\r\n        bottomLoadHtml: '<div class=\"ipu-refresh-bottom\"><span class=\"ipu-refresh-loading\"></span></div>',  // 默认底部加载显示内容\r\n        topLoadHtml: '<div class=\"ipu-refresh-top\"><span class=\"ipu-refresh-loading\"></span><div class=\"ipu-refresh-arrow\"></div></div>',\r\n        // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n        // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ipu-refresh-top-loading\r\n        // 拖动达到加载距离,则增加class:ipu-refresh-toload\r\n        // 加载中,则增加class:ipu-refresh-top-loading,移除class:ipu-refresh-toload\r\n        bottomAddLen: 0,  // 底部提前加载距离,单位px\r\n        iScrollOption:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n    };\r\n\r\n    Refresh.prototype._initBottomAndTop = function () {\r\n        this.scrollEl = $(\">.ipu-refresh-wrapper\" ,this.el);\r\n        this.bottomEl = $(this.option.bottomLoadHtml).appendTo(this.scrollEl);\r\n        this.topEl = $(this.option.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n        this.topPullOffset = this.topEl.outerHeight();\r\n        this.bottomPullOffset = this.bottomEl.outerHeight() + this.option.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n        /** @property {Boolean} 顶部是否加载中 */\r\n        this.topLoading = false;        // 顶部正在载加载\r\n\r\n        /** @property {Boolean} 底部是否加载中 */\r\n        this.bottomLoading = false;     // 底部正在加载\r\n\r\n        /** @property {Boolean} 底部是否可加载 */\r\n        this.bottomEnable = this.option.initEnableBottom && !!this.option.bottomLoadFun;\r\n\r\n        /** @property {Boolean} 顶部是否可加载 */\r\n        this.topEnable = this.option.initEnableTop && !!this.option.topLoadFun;\r\n\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) {\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) {\r\n            if (this.topEl.hasClass('ipu-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.bottomEnable) {\r\n            if (this.iScroll.maxScrollY >= -this.bottomPullOffset) { // 此处要计算底端的高度\r\n                this._startBottomLoading();\r\n            }\r\n        }\r\n    };\r\n\r\n    // 开始底部加载\r\n    Refresh.prototype._startBottomLoading = function () {\r\n        if (!this.bottomLoading) {\r\n            this.bottomLoading = true;\r\n            this.option.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    // 开始顶部加载\r\n    Refresh.prototype._startTopLoading = function () {\r\n        if (!this.topLoading) {\r\n            this.topLoading = true;\r\n            this.topEl.removeClass('ipu-refresh-toload').addClass('ipu-refresh-top-loading');\r\n            this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n            this.option.topLoadFun(); // 刷新当前索引加载更多的数据\r\n        }\r\n    };\r\n\r\n    /**\r\n     * 结束底部加载,defaultOption.bottomLoadFun中处理完加载后,最后调用此方法\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     * 结束顶部加载,defaultOption.topLoadFun中处理完加载后,最后调用此方法\r\n     */\r\n    Refresh.prototype.endTopLoading = function () {\r\n        this.topEl.removeClass('ipu-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    /**\r\n     * 是否启动顶部加载功能\r\n     *\r\n     * @param {Boolean} enable\r\n     */\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    /**\r\n     * 是否启用底部加载功能\r\n     *\r\n     * @param {Boolean} enable\r\n     */\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    /**\r\n     * 在内容发生变化时,但是又不是因为顶部加载或底部加载导致的,此时调用此方法刷新IScroll\r\n     */\r\n    Refresh.prototype.refresh = function () {\r\n        this.iScroll.refresh();\r\n        this._checkContentLoading();\r\n    };\r\n\r\n\r\n    /**\r\n     * @member ipu\r\n     * 生成PopPicker实例,参数信息见{@link Refresh#method-constructor}\r\n     *\r\n     * @param {String} slt\r\n     * @param {Object} option\r\n     * @returns {Refresh}\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\r\n    /**\r\n     * @class\r\n     * tab切换组件功能实现\r\n     *\r\n     *      @example\r\n            <!-- html结构 -->\r\n            <div class=\"ipu-tab\">  <!-- 如果class中添加 ipu-tab-fixed,则可固定头部,此时需要父元素的高度是确定的 -->\r\n                <ul class=\"ipu-tab-title ipu-tab-title-link\"> <!-- 页头有 ipu-tab-title-link 和 ipu-tab-title-button两种样式 -->\r\n                    <li>热门推荐</li>\r\n                    <li class=\"ipu-current\">全部表情</li>  <!-- class为ipu-current为默认选中项 -->\r\n                    <li>表情</li>\r\n                    <li>表情</li>\r\n                </ul>\r\n                <div class=\"ipu-tab-body\">\r\n                    <ul class=\"ipu-tab-body-wrapper\">\r\n                        <li>\r\n                            自定义内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项2内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项3内容\r\n                        </li>\r\n                        <li class=\"\">\r\n                            选项4内容\r\n                        </li>\r\n                    </ul>\r\n                </div>\r\n            </div>\r\n     *\r\n     *\r\n     *\r\n     * @constructor  不能直接访问该类,调用ipu.tab(slt, option)生成实例\r\n     * @param {string|jqueryObj} slt\r\n     *      jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n     * @param {object} option\r\n     *      组件参数\r\n     */\r\n    function Tab(slt, option) {\r\n        this.el = $(slt).get(0);\r\n        this.titleItems = $(\".ipu-tab-title:first>li\", this.el);\r\n        this.bodyWrapper = $(\".ipu-tab-body-wrapper:first\", this.el);\r\n        this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n        this.option = $.extend({}, this.defaultOption, option);\r\n        this.itemSize = this.contentItems.size();\r\n        this.fixed = $(this.el).is(\".ipu-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(\".ipu-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    /**\r\n     * 默认配置项\r\n     * @cfg defaultOption = { callBack: function (index) {}};\r\n     * @cfg defaultOption.callBack 切换tab项时的回调函数,参数为显示的项索引\r\n     */\r\n    Tab.prototype.defaultOption = {\r\n        callBack: function (index) {}\r\n    };\r\n\r\n    /**\r\n     * 显示第几项内容\r\n     * @param {number} index 要显示的项索引\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(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n        this.titleItems.eq(index).addClass(\"ipu-current\").siblings().removeClass(\"ipu-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.option.callBack) {\r\n            this.option.callBack(index, this.lastIndex);\r\n        }\r\n    };\r\n\r\n    ipu.tab = function (slt, option) {\r\n        return new Tab(slt, option);\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: 'ipu-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\n        // 初始化代码\r\n        jQuery(function () {\r\n            // 添加一个touchstart空函数,让:active样式可以在ios上生效\r\n            // 新版默认不需要事件好像也可生效\r\n            jQuery(\"body\").on(\"touchstart\",function (e) {});\r\n\r\n            // 处理ios点击延迟问题\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/docs/index.html

@ -61,7 +61,7 @@
61 61
</ul>
62 62
        </div>
63 63
64
  <div id='footer-content' style='display: none'>Generated on Wed 11 Apr 2018 10:34:16 by <a href='https://github.com/senchalabs/jsduck'>JSDuck</a> 5.3.4.</div>
64
  <div id='footer-content' style='display: none'>Generated on Wed 11 Apr 2018 10:45:59 by <a href='https://github.com/senchalabs/jsduck'>JSDuck</a> 5.3.4.</div>
65 65
66 66
  
67 67

+ 4 - 4
ipuui/docs/source/ipu.html

@ -15,8 +15,7 @@
15 15
  </script>
16 16
</head>
17 17
<body onload="prettyPrint(); highlight();">
18
  <pre class="prettyprint lang-js">// v0.2.1 2018-04-11
19
(function () {
18
  <pre class="prettyprint lang-js">(function () {
20 19
    function setup(jQuery, iScroll, Hammer, FastClick) {
21 20
22 21
<span id='ipu'>        /**
@ -24,8 +23,9 @@
24 23
         *
25 24
         */
26 25
27
28
        var ipu = {};
26
        var ipu = {
27
            version: &#39;0.2.1&#39;
28
        };
29 29
30 30
(function (ipu, $, iscroll) {
31 31

+ 3 - 3
ipuui/src/js/ipu-prefix.js

@ -1,4 +1,3 @@
1
// v0.2.1 2018-04-11
2 1
(function () {
3 2
    function setup(jQuery, iScroll, Hammer, FastClick) {
4 3
@ -7,5 +6,6 @@
7 6
         *
8 7
         */
9 8
10
11
        var ipu = {};
9
        var ipu = {
10
            version: '0.2.1'
11
        };