Przeglądaj źródła

修改模拟框action的代码错误

guohh 6 lat temu
rodzic
commit
015509e58e

+ 8 - 8
ipuui/dist/js/ipuUI.js

@ -1799,7 +1799,7 @@
1799 1799
   * @param {Function} actions.Object.onClick 点击时回调函数
1800 1800
   */
1801 1801
  modal.actions = function (params) {
1802
    var modal, groupSelector, buttonSelector;
1802
    var modalObj, groupSelector, buttonSelector;
1803 1803
    params = params || [];
1804 1804
1805 1805
    if (params.length > 0 && !$.isArray(params[0])) {
@ -1822,12 +1822,12 @@
1822 1822
    }
1823 1823
    modalHTML = '<div class="ipu-actions-modal">' + buttonsHTML + '</div>';
1824 1824
    _modalTemplateTempDiv.innerHTML = modalHTML;
1825
    modal = $(_modalTemplateTempDiv).children();
1826
    $(defaults.modalContainer).append(modal[0]);
1825
    modalObj = $(_modalTemplateTempDiv).children();
1826
    $(defaults.modalContainer).append(modalObj[0]);
1827 1827
    groupSelector = '.ipu-actions-modal-group';
1828 1828
    buttonSelector = '.ipu-actions-modal-button';
1829 1829
1830
    var groups = modal.find(groupSelector);
1830
    var groups = modalObj.find(groupSelector);
1831 1831
    groups.each(function (index, el) {
1832 1832
      var groupIndex = index;
1833 1833
      $(el).children().each(function (index, el) {
@ -1839,14 +1839,14 @@
1839 1839
1840 1840
        if (clickTarget) {
1841 1841
          clickTarget.on('click', function (e) {
1842
            if (buttonParams.close !== false) modal.closeModal(modal);
1843
            if (buttonParams.onClick) buttonParams.onClick(modal, e);
1842
            if (buttonParams.close !== false) modal.closeModal(modalObj);
1843
            if (buttonParams.onClick) buttonParams.onClick(modalObj, e);
1844 1844
          });
1845 1845
        }
1846 1846
      });
1847 1847
    });
1848
    modal.openModal(modal);
1849
    return modal[0];
1848
    modal.openModal(modalObj);
1849
    return modalObj[0];
1850 1850
  };
1851 1851
1852 1852
  //显示一个消息,会在2秒钟后自动消失

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

@ -1 +1 @@
1
{"version":3,"sources":["ipuUI-prefix.js","active.js","carousel.js","device.js","dtPicker.js","hammerCarousel.js","jquery-extend.js","modal.js","navBar.js","pages.js","picker.js","popPicker.js","progressBar.js","refresh.js","tab.js","ipuUI-suffix.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AC3tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACneA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AC3OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChGA;AACA;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":"ipuUI.js","sourcesContent":["(function () {\r\n  \"use strict\";\r\n\r\n  function setup(jQuery, iScroll, Hammer, FastClick) {\r\n\r\n    /**\r\n     * @class ipuUI对象,通过此对象实例UI组件\r\n     *\r\n     */\r\n\r\n    var ipuUI = {\r\n      version: '0.2.2'\r\n    };\r\n","// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipuUI, $) {\r\n  var active = {};\r\n\r\n  var defaultOption = {\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[option.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  var option = defaultOption;\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(option.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, option.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 = option.getHandleNode(e.target);\r\n\r\n      if (tapEl) {\r\n        timeOutID = window.setTimeout(function (dom) {\r\n          timeOutID = null;\r\n          $(dom).addClass(option.activeClass);\r\n        }, option.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]) > option.distanceAllow || Math.abs(xy[1] - startXY[1]) > option.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.setOption = function (opts) {\r\n    option = this.option = $.extend({}, defaultOption, opts);\r\n  };\r\n  ipuUI.active = active;\r\n})(ipuUI || window, jQuery);\r\n\r\n","(function (ipuUI, $, iscroll) {\r\n\r\n  /**\r\n   * @uses IScroll.js\r\n   * @class 简单封装IScroll.js的snap功能,实现banner功能\r\n   * @private 可以使用hammerCarousel代替\r\n   *\r\n   *     @example\r\n   *     <!-- 组件html结构如下,li里的内容用户可自定义  -->\r\n   *     <div class=\"ipu-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 不能直接访问该类,使用ipuUI.carousel(slt, option)生成实例 {@link ipuUI#carousel}\r\n   * @param {Dom|JqueryObj|String} slt jquery对象或者jquery选择器或Dom元素\r\n   * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n   *\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\r\n      $(window).resize(function () {\r\n        that.refresh();\r\n        that.show(that.currentIndex, 0);\r\n      });\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 ipuUI\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  ipuUI.carousel = function (slt, option) {\r\n    return new Carousel(slt, option);\r\n  };\r\n\r\n})(ipuUI || window, jQuery, iScroll);\r\n","// todo:添加判断平台如mobile ,tablet, pc,参考其它类似功能库,添加webview判断\r\n(function (ipuUI, $) {\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\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  ipuUI.device = device;\r\n})(ipuUI || window, jQuery);\r\n","// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n// show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n// 日期范围的选择处理\r\n// 不选择字符串连接符,合并后占空间\r\n\r\n(function (ipuUI, $) {\r\n  var Picker = ipuUI.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 ipuUI#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 = ipuUI.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: ''\r\n    + '<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 ipuUI\r\n   * 生成DtPicker实例,参数信息见{@link DtPicker#method-constructor}\r\n   *\r\n   * @param {Object} option\r\n   * @returns {DtPicker}\r\n   */\r\n  ipuUI.dtPicker = function (option) {\r\n    return new DtPicker(option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n","// 更新方法和属性命名\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容同时显示\r\n// 支持类似snap实现\r\n// 上下移动?\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n// indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n\r\n(function (ipuUI, $, 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  $.extend(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.loop 是否循环切换,只有轮播切换时,才能自动轮播\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      loop: true,\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      this.itemSize = this.carouselItems.size();  // 子项数量\r\n\r\n      this.showItemSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n      this.carouselItemWides = []; // 子项宽度尺寸\r\n\r\n      /** @property {Number} 当前显示子项索引,从0开始 */\r\n      this.currentIndex = 0; // 当前显示子项索引\r\n      this.moveLen = 0;      // 当前滚动移动距离\r\n\r\n      /** @type {Boolean} 循环展示时,第一项会被复制,显示项是第一项时,是否为第一项的复制项 */\r\n      this.cloneItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来标记是否复制项\r\n\r\n      if (this.option.indicator) {\r\n        this._addIndicator();\r\n      }\r\n\r\n      // 如果做循环展示,则要复制起始展示项到最后面\r\n      if (this.option.loop) {\r\n        this.carouselItems.slice(0, this.showItemSize).clone().appendTo(this.wrapper);  // 这里假设每个元素宽度都是相等的\r\n      }\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.hammer = new Hammer.Manager(this.el);\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      this._sizeCount();\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.currentIndex = activeIndex != -1 ? activeIndex : 0;\r\n      }\r\n\r\n      this.show(this.currentIndex, 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;\r\n      if (this.option.loop) {\r\n        index = this.currentIndex == 0 ? this.itemSize - 1 : this.currentIndex - 1;\r\n        if (index == this.itemSize - 1) {\r\n          this._show(this.itemSize, false);\r\n          this.wrapper.width();\r\n        }\r\n      } else {\r\n        index = (this.currentIndex - 1 + this.itemSize) % this.itemSize;\r\n      }\r\n\r\n      this._show(index);\r\n    },\r\n    /**\r\n     * 切换到下一项\r\n     */\r\n    next: function () {//下一张\r\n      var index\r\n      if (this.option.loop) {\r\n        index = this.currentIndex == this.itemSize ? 1 : this.currentIndex + 1;\r\n        if (index == 1) {\r\n          this._show(0, false);\r\n          this.wrapper.width();\r\n        }\r\n      } else {\r\n        index = (this.currentIndex + 1) % this.itemSize;\r\n      }\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.itemSize;\r\n      if (index < 0) {\r\n        index = this.itemSize + 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.option.loop && !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.itemSize; 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.wrapperWidth = this.wrapper.outerWidth(true);\r\n      this.itemWidth = this.carouselItems.eq(0).outerWidth(true);\r\n      this.mostSize = this.itemSize * this.itemWidth; // 宽度*数量\r\n      $(this.wrapper).removeClass(\"ipu-carousel-animate\").width();\r\n      this.carouselItemWides = [];\r\n\r\n      var that = this;\r\n      $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n        that.carouselItemWides[index] = $(this).position().left;\r\n      });\r\n    },\r\n    /**\r\n     * 宽度信息或尺寸信息发生变更时,进行刷新计算\r\n     * 判断是否需要重新计算尺寸,若宽度尺寸发生变化,进行重新尺寸计算\r\n     */\r\n    refresh: function () {\r\n      if (this.wrapperWidth != this.wrapper.outerWidth(true)) {\r\n        this._sizeCount();\r\n        this._show(this.currentIndex, false); //新的位置\r\n      }\r\n    },\r\n    _move: function (moveLen) { // 拖动时的处理\r\n      this._pause();\r\n      $(this.wrapper).removeClass(\"ipu-carousel-animate\");\r\n\r\n      if (this.option.loop) {\r\n        var move = (this.moveLen - moveLen) % this.mostSize;\r\n        move = (move + this.mostSize) % this.mostSize;\r\n\r\n      } else {\r\n        var move = this.moveLen - moveLen;\r\n        if (move < 0) {\r\n          move = move / 2;\r\n        } else if (move > this.mostSize) {\r\n          move = this.mostSize + (move - this.mostSize) / 2;\r\n        }\r\n      }\r\n\r\n      this.displayMoveLen = move;\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.itemSize;\r\n      this.cloneItem = index == this.itemSize;\r\n\r\n      this.moveLen = this.carouselItemWides[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.cloneItem);//返回当前索引,以及是滞最后一项参数\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\r\n      this._play();//处理自动播放\r\n    },\r\n    _onPan: function (ev) {\r\n      var delta = ev.deltaX;  // 内容往左,deltaX为正值\r\n\r\n      // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n      if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n        var value = delta / this.itemWidth;\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 (delta > 0) {\r\n          intValue = -intValue;\r\n        }\r\n        var index;\r\n\r\n        if (this.option.loop) {\r\n          index = (this.currentIndex + intValue) % this.itemSize;\r\n          index = (index + this.itemSize) % this.itemSize; // 因为可能是个负值,转换成正值\r\n\r\n          // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n          if (index == 0 && this.displayMoveLen > this.itemWidth) {\r\n            index = this.itemSize;\r\n          }\r\n        } else { // 非循环时\r\n          index = this.currentIndex + intValue;\r\n          if (index < 0) {\r\n            index = 0;\r\n          } else if (index > this.itemSize - 1) {\r\n            index = this.itemSize - 1;\r\n          }\r\n        }\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 ipuUI\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  ipuUI.hammerCarousel = function (slt, option) {\r\n    return new HammerCarousel(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery, Hammer);\r\n","// 添加一些jquery扩展\r\n(function (ipuUI, $) {\r\n  // 在android部分手机上,部分窗体,在jqurey的ready函数执行时,宽度值还未确认,会导致部分UI或依赖宽度计算的代码出现问题\r\n  // 皮函数用来处理此问题,等宽度明确或等待最多6s后,执行相关函数\r\n  var readyBacks = [];\r\n  var isSizeReady = false; // 需要记录状态\r\n\r\n  $.extend({ // 扩展jquery工具方法\r\n    sizeReady: function (callBack) {\r\n      if (isSizeReady) {\r\n        callBack();\r\n      } else {\r\n        readyBacks.push(callBack);\r\n      }\r\n    }\r\n  });\r\n\r\n  $(function () { // 添加监听页面ready函数\r\n    var count = 0;\r\n    var delayTime = 40; // 间隔时间ms\r\n    var totalTime = 6000; // 最高等待6s=6000ms\r\n\r\n    function checkSizeReady() {\r\n      if (window.innerHeight != 0 || delayTime * count >= totalTime) {\r\n        isSizeReady = true;\r\n        for (var i = 0, j = readyBacks.length; i < j; i++) {\r\n          readyBacks[i]();\r\n        }\r\n      } else {\r\n        count++;\r\n        setTimeout(checkSizeReady, delayTime);\r\n      }\r\n    }\r\n\r\n    checkSizeReady();\r\n  });\r\n\r\n\r\n})(ipuUI || window, jQuery);\r\n","(function (ipuUI, $) {\r\n\r\n  /**\r\n   * @class modal,模拟框实现对象,所有方法可直接通过ipuUI调用\r\n   *\r\n   */\r\n  var modal = {};\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  modal.modalStack = [];\r\n\r\n  modal.modalStackClearQueue = function () {\r\n    if (ipuUI.modalStack.length) {\r\n      (ipu.modalStack.shift())();\r\n    }\r\n  };\r\n\r\n  modal.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 modalObj = $(_modalTemplateTempDiv).children();\r\n\r\n    $(defaults.modalContainer).append(modalObj[0]);\r\n\r\n    // Add events on buttons\r\n    modalObj.find('.ipu-modal-button').each(function (index, el) {\r\n      $(el).on('click', function (e) {\r\n        if (params.buttons[index].close !== false) modal.closeModal(modalObj);\r\n        if (params.buttons[index].onClick) params.buttons[index].onClick(modalObj, e);\r\n        if (params.onClick) params.onClick(modalObj, index);\r\n      });\r\n    });\r\n    modal.openModal(modalObj);\r\n    return modalObj[0];\r\n  };\r\n\r\n  /**\r\n   * @member modal\r\n   * 弹出警告消息\r\n   *\r\n   * @param {String} text 警句文本\r\n   * @param {String} title 警告标题,可选参数\r\n   * @param {Function} callbackOk 用户确认后的回调函数,可选参数\r\n   */\r\n  modal.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 modal.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 modal\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  modal.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 modal.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 modal\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  modal.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 modal.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 modal\r\n   * 弹出加载消息提示\r\n   *\r\n   * @param {String} title 加载提示文本\r\n   * @param {Number} minTime 消息最小显示时间,单位ms,可选参数\r\n   */\r\n  modal.showPreloader = function (title, minTime) {\r\n    modal.hidePreloader(true);\r\n\r\n    modal.showPreloader.preloaderModal = modal.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          modal.hidePreloader();\r\n        }\r\n      }, minTime);\r\n    }\r\n\r\n    return modal.showPreloader.preloaderModal;\r\n  };\r\n\r\n  /**\r\n   * @member modal\r\n   * 隐藏加载消息提示\r\n   *\r\n   * @param {Boolean} force 是否强制隐藏,不管最小提示时间,可选\r\n   */\r\n  modal.hidePreloader = function (force) {\r\n    if (force || !minLoad || (minLoad && loadOverTime)) {\r\n      if (force && loadTimeOut) {\r\n        window.clearTimeout(loadTimeOut);\r\n      }\r\n      modal.showPreloader.preloaderModal && modal.closeModal(modal.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 modal\r\n   * 显示加载状态\r\n   */\r\n  modal.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 modal\r\n   * 隐藏加载状态\r\n   */\r\n  modal.hideIndicator = function () {\r\n    $('.ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal').remove();\r\n  };\r\n\r\n  /**\r\n   * @member modal\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  modal.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) modal.closeModal(modalj);\r\n            if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n          });\r\n        }\r\n      });\r\n    });\r\n    modal.openModal(modalj);\r\n    return modal[0];\r\n  };\r\n\r\n  //显示一个消息,会在2秒钟后自动消失\r\n  /**\r\n   * @member modal\r\n   * 悬浮提示消息\r\n   *\r\n   * @param {String} msg 消息文本\r\n   * @param {Number} duration=2000 消息显示时间,单位ms\r\n   */\r\n  modal.toast = function (msg, duration, extraclass) {\r\n    var $toast = $('<div class=\"ipu-modal ipu-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n    modal.openModal($toast, function () {\r\n      setTimeout(function () {\r\n        modal.closeModal($toast);\r\n      }, duration || 2000);\r\n    });\r\n  };\r\n\r\n  modal.openModal = function (modalObj, cb) {\r\n    modalObj = $(modalObj);\r\n    var isModal = modalObj.hasClass('ipu-modal'),\r\n      isNotToast = !modalObj.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      modalObj.modalStack.push(function () {\r\n        modal.openModal(modalObj, cb);\r\n      });\r\n      return;\r\n    }\r\n\r\n    var isPopup = modalObj.hasClass('ipu-popup');\r\n    var isLoginScreen = modalObj.hasClass('ipu-login-screen');\r\n    var isPickerModal = modalObj.hasClass('ipu-picker-modal');\r\n    var isToast = modalObj.hasClass('ipu-toast');\r\n\r\n    if (isModal) {\r\n      modalObj.show();\r\n      modalObj.css({\r\n        marginTop: -Math.round(modalObj.outerHeight() / 2) + 'px'\r\n      });\r\n    }\r\n\r\n    if (isToast) {\r\n      modalObj.css({\r\n        marginLeft: -Math.round(modalObj.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 = modalObj[0].clientLeft;\r\n\r\n    // Trugger open event\r\n    modalObj.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    modalObj.removeClass('ipu-modal-out').addClass('ipu-modal-in').transitionEnd(function (e) {\r\n      if (modalObj.hasClass('ipu-modal-out')) modalObj.trigger('closed');\r\n      else modalObj.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  modal.closeModal = function (modalObj) {\r\n    modalObj = $(modalObj || '.ipu-modal-in');\r\n    if (typeof modalObj !== 'undefined' && modalObj.length === 0) {\r\n      return;\r\n    }\r\n    var isModal = modalObj.hasClass('ipu-modal'),\r\n      isPopup = modalObj.hasClass('ipu-popup'),\r\n      isToast = modalObj.hasClass('ipu-toast'),\r\n      isLoginScreen = modalObj.hasClass('ipu-login-screen'),\r\n      isPickerModal = modalObj.hasClass('ipu-picker-modal'),\r\n      removeOnClose = modalObj.hasClass('ipu-remove-on-close'),\r\n      overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-modal-overlay');\r\n    if (isPopup) {\r\n      if (modalObj.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    modalObj.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    modalObj.removeClass('ipu-modal-in').addClass('ipu-modal-out').transitionEnd(function (e) {\r\n      if (modalObj.hasClass('ipu-modal-out')) modalObj.trigger('closed');\r\n      else modalObj.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        modalObj.removeClass('ipu-modal-out').hide();\r\n        if (removeOnClose && modalObj.length > 0) {\r\n          modalObj.remove();\r\n        }\r\n      }\r\n      else {\r\n        modalObj.remove();\r\n      }\r\n    });\r\n    if (isModal && defaults.modalStack) {\r\n      modal.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        modal.closeModal('.ipu-modal.ipu-modal-in');\r\n      if ($('.ipu-actions-modal.ipu-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n        modal.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        modal.closeModal('.ipu-popup.modal-in');\r\n    }\r\n  }\r\n\r\n  $.extend(ipuUI, modal);\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})(ipuUI || window, jQuery);\r\n","(function (ipuUI, $) {\r\n  /**\r\n   * @class 导航切换组件\r\n   *\r\n   *      @example\r\n   *\r\n   *      <!-- 组件的html分成导航和内容两部分,一般与flex栅格配合布局-->\r\n   *\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   * @constructor  不能直接访问该类,调用{@link ipu#navBar ipuUI.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 ipuUI\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  ipuUI.navBar = function (slt, option) {\r\n    return new NavBar(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n","(function (ipuUI, $) {\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 {Number} defaultOption.pageMax=''  保留的最大页面数,大于2\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    pageMax: 8,        // 允许的最大打开页面数\r\n    callBack: function () { // 事件回调       方法:open post close back\r\n    }\r\n  };\r\n\r\n  // 新增限制最大页面数\r\n  page.limitPages = function () {\r\n    var pageMax = this.defaultOption.pageMax - 2; //\r\n    $(\".ipu-page.ipu-show\").prevAll(\".ipu-page:gt(\" + pageMax + \")\").remove();\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      ipuUI.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        ipuUI.hidePreloader();\r\n      }\r\n\r\n      if (option.animate) {\r\n        console.log(\"--\" + nowPageNo);\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      page.limitPages();\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.ipuUI.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.ipuUI.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.ipuUI.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.ipuUI.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  ipuUI.page = page;\r\n})(ipuUI || window, jQuery);\r\n","// picker\r\n(function (ipuUI, $, 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 (ipuUI.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  ipuUI.Picker = Picker;\r\n\r\n})(ipuUI || window, jQuery, Hammer);\r\n","// popPicker\r\n(function (ipuUI, $) {\r\n  var Picker = ipuUI.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   *      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 ipuUI.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 = ipuUI.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 ipuUI\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  ipuUI.popPicker = function (option) {\r\n    return new PopPicker(option);\r\n  };\r\n\r\n})(ipuUI || window, jQuery);\r\n","(function (ipuUI, $) {\r\n\r\n  /**\r\n   * @class\r\n   * 进度条\r\n   *\r\n   *      @example\r\n   *       <!-- 组件html -->\r\n   *       <div class=\"ipu-progress \">\r\n   *         <span class=\"ipu-progressbar\"></span>\r\n   *       </div>\r\n   *\r\n   *\r\n   * @constructor  不能直接访问该类,调用 {@link ipuUI#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 ipuUI\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  ipuUI.progressBar = function (slt, option) {\r\n    return new ProgressBar(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n","// 设置上下条件长度,或计算函数\r\n// 处理resize的问题,用户主动调用refresh??\r\n// 底部启用或停用时,应该刷新组件iscroll高度\r\n// 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n(function (ipuUI, $, 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  不能直接访问该类,调用ipuUI.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   *\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 ipuUI\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  ipuUI.refresh = function (slt, optoins) {\r\n    return new Refresh(slt, optoins);\r\n  };\r\n\r\n})(ipuUI || window, jQuery, iScroll);\r\n","// Tab\r\n(function (ipuUI, $) {\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>自定义内容</li>\r\n   *            <li class=\"\">选项2内容</li>\r\n   *            <li class=\"\">选项3内容</li>\r\n   *            <li class=\"\">选项4内容</li>\r\n   *          </ul>\r\n   *        </div>\r\n   *      </div>\r\n   *\r\n   *\r\n   * @constructor  不能直接访问该类,调用ipuUI.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   * 显示第几项内容\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  ipuUI.tab = function (slt, option) {\r\n    return new Tab(slt, option);\r\n  };\r\n})(ipuUI || 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 ipuUI;\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.ipuUI = setup(jQuery, iScroll, Hammer, FastClick);\r\n    });\r\n  } else {\r\n    window.ipuUI = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n  }\r\n\r\n})();\r\n"]}
1
{"version":3,"sources":["ipuUI-prefix.js","active.js","carousel.js","device.js","dtPicker.js","hammerCarousel.js","jquery-extend.js","modal.js","navBar.js","pages.js","picker.js","popPicker.js","progressBar.js","refresh.js","tab.js","ipuUI-suffix.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AC3tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACneA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AC3OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChGA;AACA;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":"ipuUI.js","sourcesContent":["(function () {\r\n  \"use strict\";\r\n\r\n  function setup(jQuery, iScroll, Hammer, FastClick) {\r\n\r\n    /**\r\n     * @class ipuUI对象,通过此对象实例UI组件\r\n     *\r\n     */\r\n\r\n    var ipuUI = {\r\n      version: '0.2.2'\r\n    };\r\n","// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipuUI, $) {\r\n  var active = {};\r\n\r\n  var defaultOption = {\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[option.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  var option = defaultOption;\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(option.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, option.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 = option.getHandleNode(e.target);\r\n\r\n      if (tapEl) {\r\n        timeOutID = window.setTimeout(function (dom) {\r\n          timeOutID = null;\r\n          $(dom).addClass(option.activeClass);\r\n        }, option.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]) > option.distanceAllow || Math.abs(xy[1] - startXY[1]) > option.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.setOption = function (opts) {\r\n    option = this.option = $.extend({}, defaultOption, opts);\r\n  };\r\n  ipuUI.active = active;\r\n})(ipuUI || window, jQuery);\r\n\r\n","(function (ipuUI, $, iscroll) {\r\n\r\n  /**\r\n   * @uses IScroll.js\r\n   * @class 简单封装IScroll.js的snap功能,实现banner功能\r\n   * @private 可以使用hammerCarousel代替\r\n   *\r\n   *     @example\r\n   *     <!-- 组件html结构如下,li里的内容用户可自定义  -->\r\n   *     <div class=\"ipu-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 不能直接访问该类,使用ipuUI.carousel(slt, option)生成实例 {@link ipuUI#carousel}\r\n   * @param {Dom|JqueryObj|String} slt jquery对象或者jquery选择器或Dom元素\r\n   * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n   *\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\r\n      $(window).resize(function () {\r\n        that.refresh();\r\n        that.show(that.currentIndex, 0);\r\n      });\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 ipuUI\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  ipuUI.carousel = function (slt, option) {\r\n    return new Carousel(slt, option);\r\n  };\r\n\r\n})(ipuUI || window, jQuery, iScroll);\r\n","// todo:添加判断平台如mobile ,tablet, pc,参考其它类似功能库,添加webview判断\r\n(function (ipuUI, $) {\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\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  ipuUI.device = device;\r\n})(ipuUI || window, jQuery);\r\n","// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n// show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n// 日期范围的选择处理\r\n// 不选择字符串连接符,合并后占空间\r\n\r\n(function (ipuUI, $) {\r\n  var Picker = ipuUI.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 ipuUI#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 = ipuUI.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: ''\r\n    + '<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 ipuUI\r\n   * 生成DtPicker实例,参数信息见{@link DtPicker#method-constructor}\r\n   *\r\n   * @param {Object} option\r\n   * @returns {DtPicker}\r\n   */\r\n  ipuUI.dtPicker = function (option) {\r\n    return new DtPicker(option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n","// 更新方法和属性命名\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容同时显示\r\n// 支持类似snap实现\r\n// 上下移动?\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n// indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n\r\n(function (ipuUI, $, 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  $.extend(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.loop 是否循环切换,只有轮播切换时,才能自动轮播\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      loop: true,\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      this.itemSize = this.carouselItems.size();  // 子项数量\r\n\r\n      this.showItemSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n      this.carouselItemWides = []; // 子项宽度尺寸\r\n\r\n      /** @property {Number} 当前显示子项索引,从0开始 */\r\n      this.currentIndex = 0; // 当前显示子项索引\r\n      this.moveLen = 0;      // 当前滚动移动距离\r\n\r\n      /** @type {Boolean} 循环展示时,第一项会被复制,显示项是第一项时,是否为第一项的复制项 */\r\n      this.cloneItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来标记是否复制项\r\n\r\n      if (this.option.indicator) {\r\n        this._addIndicator();\r\n      }\r\n\r\n      // 如果做循环展示,则要复制起始展示项到最后面\r\n      if (this.option.loop) {\r\n        this.carouselItems.slice(0, this.showItemSize).clone().appendTo(this.wrapper);  // 这里假设每个元素宽度都是相等的\r\n      }\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.hammer = new Hammer.Manager(this.el);\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      this._sizeCount();\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.currentIndex = activeIndex != -1 ? activeIndex : 0;\r\n      }\r\n\r\n      this.show(this.currentIndex, 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;\r\n      if (this.option.loop) {\r\n        index = this.currentIndex == 0 ? this.itemSize - 1 : this.currentIndex - 1;\r\n        if (index == this.itemSize - 1) {\r\n          this._show(this.itemSize, false);\r\n          this.wrapper.width();\r\n        }\r\n      } else {\r\n        index = (this.currentIndex - 1 + this.itemSize) % this.itemSize;\r\n      }\r\n\r\n      this._show(index);\r\n    },\r\n    /**\r\n     * 切换到下一项\r\n     */\r\n    next: function () {//下一张\r\n      var index\r\n      if (this.option.loop) {\r\n        index = this.currentIndex == this.itemSize ? 1 : this.currentIndex + 1;\r\n        if (index == 1) {\r\n          this._show(0, false);\r\n          this.wrapper.width();\r\n        }\r\n      } else {\r\n        index = (this.currentIndex + 1) % this.itemSize;\r\n      }\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.itemSize;\r\n      if (index < 0) {\r\n        index = this.itemSize + 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.option.loop && !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.itemSize; 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.wrapperWidth = this.wrapper.outerWidth(true);\r\n      this.itemWidth = this.carouselItems.eq(0).outerWidth(true);\r\n      this.mostSize = this.itemSize * this.itemWidth; // 宽度*数量\r\n      $(this.wrapper).removeClass(\"ipu-carousel-animate\").width();\r\n      this.carouselItemWides = [];\r\n\r\n      var that = this;\r\n      $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n        that.carouselItemWides[index] = $(this).position().left;\r\n      });\r\n    },\r\n    /**\r\n     * 宽度信息或尺寸信息发生变更时,进行刷新计算\r\n     * 判断是否需要重新计算尺寸,若宽度尺寸发生变化,进行重新尺寸计算\r\n     */\r\n    refresh: function () {\r\n      if (this.wrapperWidth != this.wrapper.outerWidth(true)) {\r\n        this._sizeCount();\r\n        this._show(this.currentIndex, false); //新的位置\r\n      }\r\n    },\r\n    _move: function (moveLen) { // 拖动时的处理\r\n      this._pause();\r\n      $(this.wrapper).removeClass(\"ipu-carousel-animate\");\r\n\r\n      if (this.option.loop) {\r\n        var move = (this.moveLen - moveLen) % this.mostSize;\r\n        move = (move + this.mostSize) % this.mostSize;\r\n\r\n      } else {\r\n        var move = this.moveLen - moveLen;\r\n        if (move < 0) {\r\n          move = move / 2;\r\n        } else if (move > this.mostSize) {\r\n          move = this.mostSize + (move - this.mostSize) / 2;\r\n        }\r\n      }\r\n\r\n      this.displayMoveLen = move;\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.itemSize;\r\n      this.cloneItem = index == this.itemSize;\r\n\r\n      this.moveLen = this.carouselItemWides[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.cloneItem);//返回当前索引,以及是滞最后一项参数\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\r\n      this._play();//处理自动播放\r\n    },\r\n    _onPan: function (ev) {\r\n      var delta = ev.deltaX;  // 内容往左,deltaX为正值\r\n\r\n      // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n      if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n        var value = delta / this.itemWidth;\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 (delta > 0) {\r\n          intValue = -intValue;\r\n        }\r\n        var index;\r\n\r\n        if (this.option.loop) {\r\n          index = (this.currentIndex + intValue) % this.itemSize;\r\n          index = (index + this.itemSize) % this.itemSize; // 因为可能是个负值,转换成正值\r\n\r\n          // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n          if (index == 0 && this.displayMoveLen > this.itemWidth) {\r\n            index = this.itemSize;\r\n          }\r\n        } else { // 非循环时\r\n          index = this.currentIndex + intValue;\r\n          if (index < 0) {\r\n            index = 0;\r\n          } else if (index > this.itemSize - 1) {\r\n            index = this.itemSize - 1;\r\n          }\r\n        }\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 ipuUI\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  ipuUI.hammerCarousel = function (slt, option) {\r\n    return new HammerCarousel(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery, Hammer);\r\n","// 添加一些jquery扩展\r\n(function (ipuUI, $) {\r\n  // 在android部分手机上,部分窗体,在jqurey的ready函数执行时,宽度值还未确认,会导致部分UI或依赖宽度计算的代码出现问题\r\n  // 皮函数用来处理此问题,等宽度明确或等待最多6s后,执行相关函数\r\n  var readyBacks = [];\r\n  var isSizeReady = false; // 需要记录状态\r\n\r\n  $.extend({ // 扩展jquery工具方法\r\n    sizeReady: function (callBack) {\r\n      if (isSizeReady) {\r\n        callBack();\r\n      } else {\r\n        readyBacks.push(callBack);\r\n      }\r\n    }\r\n  });\r\n\r\n  $(function () { // 添加监听页面ready函数\r\n    var count = 0;\r\n    var delayTime = 40; // 间隔时间ms\r\n    var totalTime = 6000; // 最高等待6s=6000ms\r\n\r\n    function checkSizeReady() {\r\n      if (window.innerHeight != 0 || delayTime * count >= totalTime) {\r\n        isSizeReady = true;\r\n        for (var i = 0, j = readyBacks.length; i < j; i++) {\r\n          readyBacks[i]();\r\n        }\r\n      } else {\r\n        count++;\r\n        setTimeout(checkSizeReady, delayTime);\r\n      }\r\n    }\r\n\r\n    checkSizeReady();\r\n  });\r\n\r\n\r\n})(ipuUI || window, jQuery);\r\n","(function (ipuUI, $) {\n\n  /**\n   * @class modal,模拟框实现对象,所有方法可直接通过ipuUI调用\n   *\n   */\n  var modal = {};\n\n  function __dealCssEvent(eventNameArr, callback) {\n    var events = eventNameArr,\n      i, dom = this;// jshint ignore:line\n\n    function fireCallBack(e) {\n      /*jshint validthis:true */\n      if (e.target !== this) return;\n      callback.call(this, e);\n      for (i = 0; i < events.length; i++) {\n        dom.off(events[i], fireCallBack);\n      }\n    }\n\n    if (callback) {\n      for (i = 0; i < events.length; i++) {\n        dom.on(events[i], fireCallBack);\n      }\n    }\n  }\n\n  $.fn.transitionEnd = function (callback) {\n    __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\n    return this;\n  };\n\n  var _modalTemplateTempDiv = document.createElement('div');\n\n  var defaults = {\n    modalTitle: '',\n    modalStack: true,\n    modalButtonOk: '确定',\n    modalButtonCancel: '取消',\n    modalPreloaderTitle: '加载中',\n    modalContainer: document.body ? document.body : 'body'\n  };\n\n  modal.modalStack = [];\n\n  modal.modalStackClearQueue = function () {\n    if (ipuUI.modalStack.length) {\n      (ipu.modalStack.shift())();\n    }\n  };\n\n  modal.modal = function (params) {\n    params = params || {};\n    var buttonsHTML = '';\n    if (params.buttons && params.buttons.length > 0) {\n      for (var i = 0; i < params.buttons.length; i++) {\n        buttonsHTML += '<span class=\"ipu-modal-button' + (params.buttons[i].bold ? ' ipu-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\n      }\n    }\n    var extraClass = params.extraClass || '';\n    var titleHTML = params.title ? '<div class=\"ipu-modal-title\">' + params.title + '</div>' : '';\n    var textHTML = params.text ? '<div class=\"ipu-modal-text\">' + params.text + '</div>' : '';\n    var afterTextHTML = params.afterText ? params.afterText : '';\n    var noButtons = !params.buttons || params.buttons.length === 0 ? 'ipu-modal-no-buttons' : '';\n    var verticalButtons = params.verticalButtons ? 'ipu-modal-buttons-vertical' : '';\n\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>';\n\n    _modalTemplateTempDiv.innerHTML = modalHTML;\n\n    var modalObj = $(_modalTemplateTempDiv).children();\n\n    $(defaults.modalContainer).append(modalObj[0]);\n\n    // Add events on buttons\n    modalObj.find('.ipu-modal-button').each(function (index, el) {\n      $(el).on('click', function (e) {\n        if (params.buttons[index].close !== false) modal.closeModal(modalObj);\n        if (params.buttons[index].onClick) params.buttons[index].onClick(modalObj, e);\n        if (params.onClick) params.onClick(modalObj, index);\n      });\n    });\n    modal.openModal(modalObj);\n    return modalObj[0];\n  };\n\n  /**\n   * @member modal\n   * 弹出警告消息\n   *\n   * @param {String} text 警句文本\n   * @param {String} title 警告标题,可选参数\n   * @param {Function} callbackOk 用户确认后的回调函数,可选参数\n   */\n  modal.alert = function (text, title, callbackOk) {\n    if (typeof title === 'function') {\n      callbackOk = arguments[1];\n      title = undefined;\n    }\n    return modal.modal({\n      text: text || '',\n      title: typeof title === 'undefined' ? defaults.modalTitle : title,\n      buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\n    });\n  };\n\n  /**\n   * @member modal\n   * 弹出确认消息\n   *\n   * @param {String} text 确认文本\n   * @param {String} title 确认标题,可选参数\n   * @param {Function} callbackOk 用户确认后的回调函数,可选参数\n   * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\n   */\n  modal.confirm = function (text, title, callbackOk, callbackCancel) {\n    if (typeof title === 'function') {\n      callbackCancel = arguments[2];\n      callbackOk = arguments[1];\n      title = undefined;\n    }\n    return modal.modal({\n      text: text || '',\n      title: typeof title === 'undefined' ? defaults.modalTitle : title,\n      buttons: [\n        {text: defaults.modalButtonCancel, bold: true, onClick: callbackCancel},\n        {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\n      ]\n    });\n  };\n\n  /**\n   * @member modal\n   * 弹出输入框\n   *\n   * @param {String} text 输入提示文本\n   * @param {String} title 输入提示标题,可选参数\n   * @param {Function} callbackOk 用户确认后的回调函数,可选参数\n   * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\n   */\n  modal.prompt = function (text, title, callbackOk, callbackCancel) {\n    if (typeof title === 'function') {\n      callbackCancel = arguments[2];\n      callbackOk = arguments[1];\n      title = undefined;\n    }\n    return modal.modal({\n      text: text || '',\n      title: typeof title === 'undefined' ? defaults.modalTitle : title,\n      afterText: '<input type=\"text\" class=\"ipu-modal-text-input\">',\n      buttons: [\n        {\n          text: defaults.modalButtonCancel\n        },\n        {\n          text: defaults.modalButtonOk,\n          bold: true\n        }\n      ],\n      onClick: function (modal, index) {\n        if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ipu-modal-text-input').val());\n        if (index === 1 && callbackOk) callbackOk($(modal).find('.ipu-modal-text-input').val());\n      }\n    });\n  };\n\n  var minLoad = false;        // 是否最小时间调用方式\n  var loadOverTime = false;   // 是否超过最小调用时间\n  var loadEnd = false;        // 是否调用结束\n  var loadTimeOut = null;     // 延时调用ID\n\n  /**\n   *  @member modal\n   * 弹出加载消息提示\n   *\n   * @param {String} title 加载提示文本\n   * @param {Number} minTime 消息最小显示时间,单位ms,可选参数\n   */\n  modal.showPreloader = function (title, minTime) {\n    modal.hidePreloader(true);\n\n    modal.showPreloader.preloaderModal = modal.modal({\n      title: title || defaults.modalPreloaderTitle,\n      text: '<div class=\"ipu-preloader\"></div>'\n    });\n\n    if (minTime) {\n      minLoad = true;\n      loadTimeOut = setTimeout(function () {\n        loadOverTime = true;\n        if (loadEnd) {\n          modal.hidePreloader();\n        }\n      }, minTime);\n    }\n\n    return modal.showPreloader.preloaderModal;\n  };\n\n  /**\n   * @member modal\n   * 隐藏加载消息提示\n   *\n   * @param {Boolean} force 是否强制隐藏,不管最小提示时间,可选\n   */\n  modal.hidePreloader = function (force) {\n    if (force || !minLoad || (minLoad && loadOverTime)) {\n      if (force && loadTimeOut) {\n        window.clearTimeout(loadTimeOut);\n      }\n      modal.showPreloader.preloaderModal && modal.closeModal(modal.showPreloader.preloaderModal);\n      minLoad = false; // 重置各标志位\n      loadOverTime = false;\n      loadEnd = false;\n      loadTimeOut = null;\n    } else {\n      loadEnd = true;\n    }\n  };\n\n  /**\n   * @member modal\n   * 显示加载状态\n   */\n  modal.showIndicator = function () {\n    if ($('.ipu-preloader-indicator-modal')[0]) return;\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>');\n  };\n\n  /**\n   * @member modal\n   * 隐藏加载状态\n   */\n  modal.hideIndicator = function () {\n    $('.ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal').remove();\n  };\n\n  /**\n   * @member modal\n   * 显示操作选项\n   *\n   * @param{[[Object]]} actions\n   * @param {Object} actions.Object\n   * @param {String} actions.Object.text 操作名称\n   * @param {Boolean} actions.Object.label 是否标签,非标签就是操作项,操作项有后续的配置,标签项无须后续配置项\n   * @param {String:warning} actions.Object.color 样式,可选\n   * @param {String:warning} actions.Object.bg 背景样式,可选\n   * @param {Function} actions.Object.onClick 点击时回调函数\n   */\n  modal.actions = function (params) {\n    var modalObj, groupSelector, buttonSelector;\n    params = params || [];\n\n    if (params.length > 0 && !$.isArray(params[0])) {\n      params = [params];\n    }\n    var modalHTML;\n    var buttonsHTML = '';\n    for (var i = 0; i < params.length; i++) {\n      for (var j = 0; j < params[i].length; j++) {\n        if (j === 0) buttonsHTML += '<div class=\"ipu-actions-modal-group\">';\n        var button = params[i][j];\n        var buttonClass = button.label ? 'ipu-actions-modal-label' : 'ipu-actions-modal-button';\n        if (button.bold) buttonClass += ' ipu-actions-modal-button-bold';\n        if (button.color) buttonClass += ' ipu-color-' + button.color;\n        if (button.bg) buttonClass += ' ipu-bg-' + button.bg;\n        if (button.disabled) buttonClass += ' disabled';\n        buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\n        if (j === params[i].length - 1) buttonsHTML += '</div>';\n      }\n    }\n    modalHTML = '<div class=\"ipu-actions-modal\">' + buttonsHTML + '</div>';\n    _modalTemplateTempDiv.innerHTML = modalHTML;\n    modalObj = $(_modalTemplateTempDiv).children();\n    $(defaults.modalContainer).append(modalObj[0]);\n    groupSelector = '.ipu-actions-modal-group';\n    buttonSelector = '.ipu-actions-modal-button';\n\n    var groups = modalObj.find(groupSelector);\n    groups.each(function (index, el) {\n      var groupIndex = index;\n      $(el).children().each(function (index, el) {\n        var buttonIndex = index;\n        var buttonParams = params[groupIndex][buttonIndex];\n        var clickTarget;\n        if ($(el).is(buttonSelector)) clickTarget = $(el);\n        // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\n\n        if (clickTarget) {\n          clickTarget.on('click', function (e) {\n            if (buttonParams.close !== false) modal.closeModal(modalObjj);\n            if (buttonParams.onClick) buttonParams.onClick(modalObj, e);\n          });\n        }\n      });\n    });\n    modal.openModal(modalObjj);\n    return modalObj[0];\n  };\n\n  //显示一个消息,会在2秒钟后自动消失\n  /**\n   * @member modal\n   * 悬浮提示消息\n   *\n   * @param {String} msg 消息文本\n   * @param {Number} duration=2000 消息显示时间,单位ms\n   */\n  modal.toast = function (msg, duration, extraclass) {\n    var $toast = $('<div class=\"ipu-modal ipu-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\n    modal.openModal($toast, function () {\n      setTimeout(function () {\n        modal.closeModal($toast);\n      }, duration || 2000);\n    });\n  };\n\n  modal.openModal = function (modalObj, cb) {\n    modalObj = $(modalObj);\n    var isModal = modalObj.hasClass('ipu-modal'),\n      isNotToast = !modalObj.hasClass('ipu-toast');\n    isNotToast = false; // 强制打开新窗口\n\n    if ($('.ipu-modal.ipu-modal-in:not(.ipu-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\n      modalObj.modalStack.push(function () {\n        modal.openModal(modalObj, cb);\n      });\n      return;\n    }\n\n    var isPopup = modalObj.hasClass('ipu-popup');\n    var isLoginScreen = modalObj.hasClass('ipu-login-screen');\n    var isPickerModal = modalObj.hasClass('ipu-picker-modal');\n    var isToast = modalObj.hasClass('ipu-toast');\n\n    if (isModal) {\n      modalObj.show();\n      modalObj.css({\n        marginTop: -Math.round(modalObj.outerHeight() / 2) + 'px'\n      });\n    }\n\n    if (isToast) {\n      modalObj.css({\n        marginLeft: -Math.round(modalObj.outerWidth() / 2) + 'px' //1.185 是初始化时候的放大效果\n      });\n    }\n\n    var overlay;\n    if (!isLoginScreen && !isPickerModal && !isToast) {\n      if ($('.ipu-modal-overlay').length === 0 && !isPopup) {\n        $(defaults.modalContainer).append('<div class=\"ipu-modal-overlay\"></div>');\n      }\n      if ($('.ipu-popup-overlay').length === 0 && isPopup) {\n        $(defaults.modalContainer).append('<div class=\"ipu-popup-overlay\"></div>');\n      }\n      overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-modal-overlay');\n    }\n\n    //Make sure that styles are applied, trigger relayout;\n    var clientLeft = modalObj[0].clientLeft;\n\n    // Trugger open event\n    modalObj.trigger('open');\n\n    // Picker modal body class\n    if (isPickerModal) {\n      $(defaults.modalContainer).addClass('ipu-with-picker-modal');\n    }\n\n    // Classes for transition in\n    if (!isLoginScreen && !isPickerModal && !isToast) {\n      overlay.addClass('ipu-modal-overlay-visible');\n    }\n    modalObj.removeClass('ipu-modal-out').addClass('ipu-modal-in').transitionEnd(function (e) {\n      if (modalObj.hasClass('ipu-modal-out')) modalObj.trigger('closed');\n      else modalObj.trigger('opened');\n    });\n    // excute callback\n    if (typeof cb === 'function') {\n      cb.call(this);\n    }\n    return true;\n  };\n\n  modal.closeModal = function (modalObj) {\n    modalObj = $(modalObj || '.ipu-modal-in');\n    if (typeof modalObj !== 'undefined' && modalObj.length === 0) {\n      return;\n    }\n    var isModal = modalObj.hasClass('ipu-modal'),\n      isPopup = modalObj.hasClass('ipu-popup'),\n      isToast = modalObj.hasClass('ipu-toast'),\n      isLoginScreen = modalObj.hasClass('ipu-login-screen'),\n      isPickerModal = modalObj.hasClass('ipu-picker-modal'),\n      removeOnClose = modalObj.hasClass('ipu-remove-on-close'),\n      overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-modal-overlay');\n    if (isPopup) {\n      if (modalObj.length === $('.ipu-popup.ipu-modal-in').length) {\n        overlay.removeClass('ipu-modal-overlay-visible');\n      }\n    }\n    else if (!(isPickerModal || isToast)) {\n      overlay.removeClass('ipu-modal-overlay-visible');\n    }\n    modalObj.trigger('close');\n\n    // Picker modal body class\n    if (isPickerModal) {\n      $(defaults.modalContainer).removeClass('ipu-with-picker-modal');\n      $(defaults.modalContainer).addClass('ipu-picker-modal-closing');\n    }\n\n    modalObj.removeClass('ipu-modal-in').addClass('ipu-modal-out').transitionEnd(function (e) {\n      if (modalObj.hasClass('ipu-modal-out')) modalObj.trigger('closed');\n      else modalObj.trigger('opened');\n\n      if (isPickerModal) {\n        $(defaults.modalContainer).removeClass('ipu-picker-modal-closing');\n      }\n      if (isPopup || isLoginScreen || isPickerModal) {\n        modalObj.removeClass('ipu-modal-out').hide();\n        if (removeOnClose && modalObj.length > 0) {\n          modalObj.remove();\n        }\n      }\n      else {\n        modalObj.remove();\n      }\n    });\n    if (isModal && defaults.modalStack) {\n      modal.modalStackClearQueue();\n    }\n\n    return true;\n  };\n\n  function handleClicks(e) {\n    /*jshint validthis:true */\n    var clicked = $(this);\n    var url = clicked.attr('href');\n\n\n    //Collect Clicked data- attributes\n    /* var clickedData = clicked.dataset();\n\n     // Popup\n     var popup;\n     if (clicked.hasClass('ipu-open-popup')) {\n     if (clickedData.popup) {\n     popup = clickedData.popup;\n     }\n     else popup = '.ipu-popup';\n     ipu.popup(popup);\n     }\n     if (clicked.hasClass('ipu-close-popup')) {\n     if (clickedData.popup) {\n     popup = clickedData.popup;\n     }\n     else popup = '.ipu-popup.modal-in';\n     ipu.closeModal(popup);\n     }*/\n\n    // Close Modal\n    if (clicked.hasClass('ipu-modal-overlay')) {\n      if ($('.ipu-modal.ipu-modal-in').length > 0 && defaults.modalCloseByOutside)\n        modal.closeModal('.ipu-modal.ipu-modal-in');\n      if ($('.ipu-actions-modal.ipu-modal-in').length > 0 && defaults.actionsCloseByOutside)\n        modal.closeModal('.ipu-actions-modal.ipu-modal-in');\n\n    }\n    if (clicked.hasClass('ipu-popup-overlay')) {\n      if ($('.ipu-popup.ipu-modal-in').length > 0 && defaults.popupCloseByOutside)\n        modal.closeModal('.ipu-popup.modal-in');\n    }\n  }\n\n  $.extend(ipuUI, modal);\n\n\n  $(document).on('click', ' .ipu-modal-overlay, .ipu-popup-overlay, .ipu-close-popup, .ipu-open-popup, .ipu-close-picker', handleClicks);\n})(ipuUI || window, jQuery);\n","(function (ipuUI, $) {\r\n  /**\r\n   * @class 导航切换组件\r\n   *\r\n   *      @example\r\n   *\r\n   *      <!-- 组件的html分成导航和内容两部分,一般与flex栅格配合布局-->\r\n   *\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   * @constructor  不能直接访问该类,调用{@link ipu#navBar ipuUI.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 ipuUI\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  ipuUI.navBar = function (slt, option) {\r\n    return new NavBar(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n","(function (ipuUI, $) {\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 {Number} defaultOption.pageMax=''  保留的最大页面数,大于2\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    pageMax: 8,        // 允许的最大打开页面数\r\n    callBack: function () { // 事件回调       方法:open post close back\r\n    }\r\n  };\r\n\r\n  // 新增限制最大页面数\r\n  page.limitPages = function () {\r\n    var pageMax = this.defaultOption.pageMax - 2; //\r\n    $(\".ipu-page.ipu-show\").prevAll(\".ipu-page:gt(\" + pageMax + \")\").remove();\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      ipuUI.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        ipuUI.hidePreloader();\r\n      }\r\n\r\n      if (option.animate) {\r\n        console.log(\"--\" + nowPageNo);\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      page.limitPages();\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.ipuUI.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.ipuUI.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.ipuUI.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.ipuUI.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  ipuUI.page = page;\r\n})(ipuUI || window, jQuery);\r\n","// picker\r\n(function (ipuUI, $, 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 (ipuUI.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  ipuUI.Picker = Picker;\r\n\r\n})(ipuUI || window, jQuery, Hammer);\r\n","// popPicker\r\n(function (ipuUI, $) {\r\n  var Picker = ipuUI.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   *      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 ipuUI.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 = ipuUI.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 ipuUI\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  ipuUI.popPicker = function (option) {\r\n    return new PopPicker(option);\r\n  };\r\n\r\n})(ipuUI || window, jQuery);\r\n","(function (ipuUI, $) {\r\n\r\n  /**\r\n   * @class\r\n   * 进度条\r\n   *\r\n   *      @example\r\n   *       <!-- 组件html -->\r\n   *       <div class=\"ipu-progress \">\r\n   *         <span class=\"ipu-progressbar\"></span>\r\n   *       </div>\r\n   *\r\n   *\r\n   * @constructor  不能直接访问该类,调用 {@link ipuUI#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 ipuUI\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  ipuUI.progressBar = function (slt, option) {\r\n    return new ProgressBar(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n","// 设置上下条件长度,或计算函数\r\n// 处理resize的问题,用户主动调用refresh??\r\n// 底部启用或停用时,应该刷新组件iscroll高度\r\n// 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n(function (ipuUI, $, 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  不能直接访问该类,调用ipuUI.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   *\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 ipuUI\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  ipuUI.refresh = function (slt, optoins) {\r\n    return new Refresh(slt, optoins);\r\n  };\r\n\r\n})(ipuUI || window, jQuery, iScroll);\r\n","// Tab\r\n(function (ipuUI, $) {\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>自定义内容</li>\r\n   *            <li class=\"\">选项2内容</li>\r\n   *            <li class=\"\">选项3内容</li>\r\n   *            <li class=\"\">选项4内容</li>\r\n   *          </ul>\r\n   *        </div>\r\n   *      </div>\r\n   *\r\n   *\r\n   * @constructor  不能直接访问该类,调用ipuUI.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   * 显示第几项内容\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  ipuUI.tab = function (slt, option) {\r\n    return new Tab(slt, option);\r\n  };\r\n})(ipuUI || 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 ipuUI;\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.ipuUI = setup(jQuery, iScroll, Hammer, FastClick);\r\n    });\r\n  } else {\r\n    window.ipuUI = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n  }\r\n\r\n})();\r\n"]}

+ 1 - 1
ipuui/dist/js/ipuUI.min.js

@ -1,3 +1,3 @@
1
!function(){"use strict";function t(t,e,i,o){var n={version:"0.2.2"};return 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={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[a.eventName]),i){var s=!1;return e.each(i,function(i,a){if(a.selector){var r=e(a.selector,t);if(e.each(n,function(t,e){if(r.is(e))return o=e,!1}),o)return!1}else s=!0}),s&&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=s,r="ontouchstart"in window,l=r?"touchstart":"mousedown",p=r?"touchmove":"mousemove",u=r?"touchend":"mouseup",d=r?"touchcancel":"";e(function(){function t(t,i){i&&c?window.clearTimeout(c):e(t).removeClass(a.activeClass)}function n(e){e?t(r,e):window.setTimeout(t,a.hideDelay,r,e),s=null,r=null}var s,r,c,h=document.body;e(h).bind(l,function(t){return r?void n(!0):(t=i(t),s=o(t),r=a.getHandleNode(t.target),void(r&&(c=window.setTimeout(function(t){c=null,e(t).addClass(a.activeClass)},a.displayDelay,r))))}),e(h).bind(p,function(t){if(r){t=i(t);var e=o(t);s&&(Math.abs(e[0]-s[0])>a.distanceAllow||Math.abs(e[1]-s[1])>a.distanceAllow)&&n(!0)}}),e(h).bind(u,function(t){r&&n()}),d&&e(h).bind(d,function(t){r&&n()})}),n.setOption=function(t){a=this.option=e.extend({},s,t)},t.active=n}(n||window,t),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(),n.show(n.currentIndex,0)});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){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()}e.extend(o.prototype,{defaultOption:{index:null,loop:!0,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.itemSize=this.carouselItems.size(),this.showItemSize=1,this.carouselItemWides=[],this.currentIndex=0,this.moveLen=0,this.cloneItem=!1,this.option.indicator&&this._addIndicator(),this.option.loop&&this.carouselItems.slice(0,this.showItemSize).clone().appendTo(this.wrapper);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.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)),this._sizeCount(),e(window).resize(function(){t.refresh()}),null==this.option.index){var o=this.carouselItems.filter(".ipu-current").index();this.currentIndex=o!=-1?o:0}this.show(this.currentIndex,!1)},stop:function(){this._pause(),this.option.autoPlay=!1},_pause:function(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null)},prev:function(){var t;this.option.loop?(t=0==this.currentIndex?this.itemSize-1:this.currentIndex-1,t==this.itemSize-1&&(this._show(this.itemSize,!1),this.wrapper.width())):t=(this.currentIndex-1+this.itemSize)%this.itemSize,this._show(t)},next:function(){var t;this.option.loop?(t=this.currentIndex==this.itemSize?1:this.currentIndex+1,1==t&&(this._show(0,!1),this.wrapper.width())):t=(this.currentIndex+1)%this.itemSize,this._show(t)},show:function(t){var t=t%this.itemSize;t<0&&(t=this.itemSize+t),this._show(t)},play:function(){this.option.autoPlay=!0,this._play()},_play:function(){if(this.option.autoPlay&&this.option.loop&&!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.itemSize;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.wrapperWidth=this.wrapper.outerWidth(!0),this.itemWidth=this.carouselItems.eq(0).outerWidth(!0),this.mostSize=this.itemSize*this.itemWidth,e(this.wrapper).removeClass("ipu-carousel-animate").width(),this.carouselItemWides=[];var t=this;e(">li",this.wrapper).each(function(i,o){t.carouselItemWides[i]=e(this).position().left})},refresh:function(){this.wrapperWidth!=this.wrapper.outerWidth(!0)&&(this._sizeCount(),this._show(this.currentIndex,!1))},_move:function(t){if(this._pause(),e(this.wrapper).removeClass("ipu-carousel-animate"),this.option.loop){var i=(this.moveLen-t)%this.mostSize;i=(i+this.mostSize)%this.mostSize}else{var i=this.moveLen-t;i<0?i/=2:i>this.mostSize&&(i=this.mostSize+(i-this.mostSize)/2)}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.itemSize,this.cloneItem=t==this.itemSize,this.moveLen=this.carouselItemWides[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.cloneItem),this.indicator&&this.indicatorIndexs.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.itemWidth,o=parseInt(Math.abs(i)),n=Math.abs(i)%1;n>.2&&(o+=1),e>0&&(o=-o);var s;this.option.loop?(s=(this.currentIndex+o)%this.itemSize,s=(s+this.itemSize)%this.itemSize,0==s&&this.displayMoveLen>this.itemWidth&&(s=this.itemSize)):(s=this.currentIndex+o,s<0?s=0:s>this.itemSize-1&&(s=this.itemSize-1)),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){var i=[],o=!1;e.extend({sizeReady:function(t){o?t():i.push(t)}}),e(function(){function t(){if(0!=window.innerHeight||n*e>=s){o=!0;for(var a=0,r=i.length;a<r;a++)i[a]()}else e++,setTimeout(t,n)}var e=0,n=40,s=6e3;t()})}(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){var i=e(this);i.attr("href");i.hasClass("ipu-modal-overlay")&&(e(".ipu-modal.ipu-modal-in").length>0&&a.modalCloseByOutside&&n.closeModal(".ipu-modal.ipu-modal-in"),e(".ipu-actions-modal.ipu-modal-in").length>0&&a.actionsCloseByOutside&&n.closeModal(".ipu-actions-modal.ipu-modal-in")),i.hasClass("ipu-popup-overlay")&&e(".ipu-popup.ipu-modal-in").length>0&&a.popupCloseByOutside&&n.closeModal(".ipu-popup.modal-in")}var n={};e.fn.transitionEnd=function(t){return i.call(this,["webkitTransitionEnd","transitionend"],t),this};var s=document.createElement("div"),a={modalTitle:"",modalStack:!0,modalButtonOk:"确定",modalButtonCancel:"取消",modalPreloaderTitle:"加载中",modalContainer:document.body?document.body:"body"};n.modalStack=[],n.modalStackClearQueue=function(){t.modalStack.length&&ipu.modalStack.shift()()},n.modal=function(t){t=t||{};var i="";if(t.buttons&&t.buttons.length>0)for(var o=0;o<t.buttons.length;o++)i+='<span class="ipu-modal-button'+(t.buttons[o].bold?" ipu-modal-button-bold":"")+'">'+t.buttons[o].text+"</span>";var r=t.extraClass||"",l=t.title?'<div class="ipu-modal-title">'+t.title+"</div>":"",p=t.text?'<div class="ipu-modal-text">'+t.text+"</div>":"",u=t.afterText?t.afterText:"",d=t.buttons&&0!==t.buttons.length?"":"ipu-modal-no-buttons",c=t.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+'">'+i+"</div></div>";s.innerHTML=h;var m=e(s).children();return e(a.modalContainer).append(m[0]),m.find(".ipu-modal-button").each(function(i,o){e(o).on("click",function(e){t.buttons[i].close!==!1&&n.closeModal(m),t.buttons[i].onClick&&t.buttons[i].onClick(m,e),t.onClick&&t.onClick(m,i)})}),n.openModal(m),m[0]},n.alert=function(t,e,i){return"function"==typeof e&&(i=arguments[1],e=void 0),n.modal({text:t||"",title:"undefined"==typeof e?a.modalTitle:e,buttons:[{text:a.modalButtonOk,bold:!0,onClick:i}]})},n.confirm=function(t,e,i,o){return"function"==typeof e&&(o=arguments[2],i=arguments[1],e=void 0),n.modal({text:t||"",title:"undefined"==typeof e?a.modalTitle:e,buttons:[{text:a.modalButtonCancel,bold:!0,onClick:o},{text:a.modalButtonOk,bold:!0,onClick:i}]})},n.prompt=function(t,i,o,s){return"function"==typeof i&&(s=arguments[2],o=arguments[1],i=void 0),n.modal({text:t||"",title:"undefined"==typeof i?a.modalTitle:i,afterText:'<input type="text" class="ipu-modal-text-input">',buttons:[{text:a.modalButtonCancel},{text:a.modalButtonOk,bold:!0}],onClick:function(t,i){0===i&&s&&s(e(t).find(".ipu-modal-text-input").val()),1===i&&o&&o(e(t).find(".ipu-modal-text-input").val())}})};var r=!1,l=!1,p=!1,u=null;n.showPreloader=function(t,e){return n.hidePreloader(!0),n.showPreloader.preloaderModal=n.modal({title:t||a.modalPreloaderTitle,text:'<div class="ipu-preloader"></div>'}),e&&(r=!0,u=setTimeout(function(){l=!0,p&&n.hidePreloader()},e)),n.showPreloader.preloaderModal},n.hidePreloader=function(t){t||!r||r&&l?(t&&u&&window.clearTimeout(u),n.showPreloader.preloaderModal&&n.closeModal(n.showPreloader.preloaderModal),r=!1,l=!1,p=!1,u=null):p=!0},n.showIndicator=function(){e(".ipu-preloader-indicator-modal")[0]||e(a.modalContainer).append('<div class="ipu-preloader-indicator-overlay"></div><div class="ipu-preloader-indicator-modal"><span class="ipu-preloader ipu-preloader-white"></span></div>')},n.hideIndicator=function(){e(".ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal").remove()},n.actions=function(t){var i,o,n;t=t||[],t.length>0&&!e.isArray(t[0])&&(t=[t]);for(var r,l="",p=0;p<t.length;p++)for(var u=0;u<t[p].length;u++){0===u&&(l+='<div class="ipu-actions-modal-group">');var d=t[p][u],c=d.label?"ipu-actions-modal-label":"ipu-actions-modal-button";d.bold&&(c+=" ipu-actions-modal-button-bold"),d.color&&(c+=" ipu-color-"+d.color),d.bg&&(c+=" ipu-bg-"+d.bg),d.disabled&&(c+=" disabled"),l+='<span class="'+c+'">'+d.text+"</span>",u===t[p].length-1&&(l+="</div>")}r='<div class="ipu-actions-modal">'+l+"</div>",s.innerHTML=r,i=e(s).children(),e(a.modalContainer).append(i[0]),o=".ipu-actions-modal-group",n=".ipu-actions-modal-button";var h=i.find(o);return h.each(function(o,s){var a=o;e(s).children().each(function(o,s){var r,l=o,p=t[a][l];e(s).is(n)&&(r=e(s)),r&&r.on("click",function(t){p.close!==!1&&i.closeModal(i),p.onClick&&p.onClick(i,t)})})}),i.openModal(i),i[0]},n.toast=function(t,i,o){var s=e('<div class="ipu-modal ipu-toast '+(o||"")+'">'+t+"</div>").appendTo(document.body);n.openModal(s,function(){setTimeout(function(){n.closeModal(s)},i||2e3)})},n.openModal=function(t,i){t=e(t);var o=t.hasClass("ipu-modal"),s=!t.hasClass("ipu-toast");if(s=!1,e(".ipu-modal.ipu-modal-in:not(.ipu-modal-out)").length&&a.modalStack&&o&&s)return void t.modalStack.push(function(){n.openModal(t,i)});var r=t.hasClass("ipu-popup"),l=t.hasClass("ipu-login-screen"),p=t.hasClass("ipu-picker-modal"),u=t.hasClass("ipu-toast");o&&(t.show(),t.css({marginTop:-Math.round(t.outerHeight()/2)+"px"})),u&&t.css({marginLeft:-Math.round(t.outerWidth()/2)+"px"});var d;l||p||u||(0!==e(".ipu-modal-overlay").length||r||e(a.modalContainer).append('<div class="ipu-modal-overlay"></div>'),0===e(".ipu-popup-overlay").length&&r&&e(a.modalContainer).append('<div class="ipu-popup-overlay"></div>'),d=e(r?".ipu-popup-overlay":".ipu-modal-overlay"));t[0].clientLeft;return t.trigger("open"),p&&e(a.modalContainer).addClass("ipu-with-picker-modal"),l||p||u||d.addClass("ipu-modal-overlay-visible"),t.removeClass("ipu-modal-out").addClass("ipu-modal-in").transitionEnd(function(e){t.hasClass("ipu-modal-out")?t.trigger("closed"):t.trigger("opened")}),"function"==typeof i&&i.call(this),!0},n.closeModal=function(t){if(t=e(t||".ipu-modal-in"),"undefined"==typeof t||0!==t.length){var i=t.hasClass("ipu-modal"),o=t.hasClass("ipu-popup"),s=t.hasClass("ipu-toast"),r=t.hasClass("ipu-login-screen"),l=t.hasClass("ipu-picker-modal"),p=t.hasClass("ipu-remove-on-close"),u=e(o?".ipu-popup-overlay":".ipu-modal-overlay");return o?t.length===e(".ipu-popup.ipu-modal-in").length&&u.removeClass("ipu-modal-overlay-visible"):l||s||u.removeClass("ipu-modal-overlay-visible"),t.trigger("close"),l&&(e(a.modalContainer).removeClass("ipu-with-picker-modal"),e(a.modalContainer).addClass("ipu-picker-modal-closing")),t.removeClass("ipu-modal-in").addClass("ipu-modal-out").transitionEnd(function(i){t.hasClass("ipu-modal-out")?t.trigger("closed"):t.trigger("opened"),l&&e(a.modalContainer).removeClass("ipu-picker-modal-closing"),o||r||l?(t.removeClass("ipu-modal-out").hide(),p&&t.length>0&&t.remove()):t.remove()}),i&&a.modalStack&&n.modalStackClearQueue(),!0}},e.extend(t,n),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:"",pageMax:8,callBack:function(){}},a.limitPages=function(){var t=this.defaultOption.pageMax-2;e(".ipu-page.ipu-show").prevAll(".ipu-page:gt("+t+")").remove()},a.openPage=function(i,r){function h(){r.showLoading&&t.hidePreloader(),r.animate&&(console.log("--"+f),b.removeClass(c)),m.siblings(".ipu-show").removeClass("ipu-show"),r.callBack&&r.callBack(),a.limitPages()}var m=null,f=u+p++;l[f]=i,n(),r.showLoading&&t.showPreloader(r.loadingMessage,r.minMessageTime),m=e("post"==r.method?"<div class='ipu-page' id='"+f+"' data-name='"+r.pageName+"'><iframe class='ipu-page-iframe'></iframe></div>":"<div class='ipu-page' id='"+f+"' data-name='"+r.pageName+"'><iframe class='ipu-page-iframe' src='"+i+"'></iframe></div>");var g=s(e(".ipu-page:last",d)),b=m;if(g&&(b=d.addClass(v)),e(".ipu-page-iframe",m).one("load",function(){m.addClass("ipu-show").width(),g&&b.removeClass(v),r.animate?b.addClass(c).animationEnd(h):h()}),m.appendTo(d),"post"==r.method){var y=e(".ipu-page-iframe",m)[0].contentDocument;o(y,i,r.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.ipuUI.page.openPage(t,i)},a.post=function(t,i){i=e.extend({},this.defaultOption,i),i.method="post",i.target.ipuUI.page.openPage(t,i)},a.back=function(t){t=e.extend({},this.defaultOption,t),t.target.ipuUI.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.ipuUI.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)),
1
!function(){"use strict";function t(t,e,i,o){var n={version:"0.2.2"};return 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={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[a.eventName]),i){var s=!1;return e.each(i,function(i,a){if(a.selector){var r=e(a.selector,t);if(e.each(n,function(t,e){if(r.is(e))return o=e,!1}),o)return!1}else s=!0}),s&&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=s,r="ontouchstart"in window,l=r?"touchstart":"mousedown",p=r?"touchmove":"mousemove",u=r?"touchend":"mouseup",d=r?"touchcancel":"";e(function(){function t(t,i){i&&c?window.clearTimeout(c):e(t).removeClass(a.activeClass)}function n(e){e?t(r,e):window.setTimeout(t,a.hideDelay,r,e),s=null,r=null}var s,r,c,h=document.body;e(h).bind(l,function(t){return r?void n(!0):(t=i(t),s=o(t),r=a.getHandleNode(t.target),void(r&&(c=window.setTimeout(function(t){c=null,e(t).addClass(a.activeClass)},a.displayDelay,r))))}),e(h).bind(p,function(t){if(r){t=i(t);var e=o(t);s&&(Math.abs(e[0]-s[0])>a.distanceAllow||Math.abs(e[1]-s[1])>a.distanceAllow)&&n(!0)}}),e(h).bind(u,function(t){r&&n()}),d&&e(h).bind(d,function(t){r&&n()})}),n.setOption=function(t){a=this.option=e.extend({},s,t)},t.active=n}(n||window,t),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(),n.show(n.currentIndex,0)});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){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()}e.extend(o.prototype,{defaultOption:{index:null,loop:!0,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.itemSize=this.carouselItems.size(),this.showItemSize=1,this.carouselItemWides=[],this.currentIndex=0,this.moveLen=0,this.cloneItem=!1,this.option.indicator&&this._addIndicator(),this.option.loop&&this.carouselItems.slice(0,this.showItemSize).clone().appendTo(this.wrapper);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.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)),this._sizeCount(),e(window).resize(function(){t.refresh()}),null==this.option.index){var o=this.carouselItems.filter(".ipu-current").index();this.currentIndex=o!=-1?o:0}this.show(this.currentIndex,!1)},stop:function(){this._pause(),this.option.autoPlay=!1},_pause:function(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null)},prev:function(){var t;this.option.loop?(t=0==this.currentIndex?this.itemSize-1:this.currentIndex-1,t==this.itemSize-1&&(this._show(this.itemSize,!1),this.wrapper.width())):t=(this.currentIndex-1+this.itemSize)%this.itemSize,this._show(t)},next:function(){var t;this.option.loop?(t=this.currentIndex==this.itemSize?1:this.currentIndex+1,1==t&&(this._show(0,!1),this.wrapper.width())):t=(this.currentIndex+1)%this.itemSize,this._show(t)},show:function(t){var t=t%this.itemSize;t<0&&(t=this.itemSize+t),this._show(t)},play:function(){this.option.autoPlay=!0,this._play()},_play:function(){if(this.option.autoPlay&&this.option.loop&&!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.itemSize;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.wrapperWidth=this.wrapper.outerWidth(!0),this.itemWidth=this.carouselItems.eq(0).outerWidth(!0),this.mostSize=this.itemSize*this.itemWidth,e(this.wrapper).removeClass("ipu-carousel-animate").width(),this.carouselItemWides=[];var t=this;e(">li",this.wrapper).each(function(i,o){t.carouselItemWides[i]=e(this).position().left})},refresh:function(){this.wrapperWidth!=this.wrapper.outerWidth(!0)&&(this._sizeCount(),this._show(this.currentIndex,!1))},_move:function(t){if(this._pause(),e(this.wrapper).removeClass("ipu-carousel-animate"),this.option.loop){var i=(this.moveLen-t)%this.mostSize;i=(i+this.mostSize)%this.mostSize}else{var i=this.moveLen-t;i<0?i/=2:i>this.mostSize&&(i=this.mostSize+(i-this.mostSize)/2)}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.itemSize,this.cloneItem=t==this.itemSize,this.moveLen=this.carouselItemWides[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.cloneItem),this.indicator&&this.indicatorIndexs.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.itemWidth,o=parseInt(Math.abs(i)),n=Math.abs(i)%1;n>.2&&(o+=1),e>0&&(o=-o);var s;this.option.loop?(s=(this.currentIndex+o)%this.itemSize,s=(s+this.itemSize)%this.itemSize,0==s&&this.displayMoveLen>this.itemWidth&&(s=this.itemSize)):(s=this.currentIndex+o,s<0?s=0:s>this.itemSize-1&&(s=this.itemSize-1)),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){var i=[],o=!1;e.extend({sizeReady:function(t){o?t():i.push(t)}}),e(function(){function t(){if(0!=window.innerHeight||n*e>=s){o=!0;for(var a=0,r=i.length;a<r;a++)i[a]()}else e++,setTimeout(t,n)}var e=0,n=40,s=6e3;t()})}(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){var i=e(this);i.attr("href");i.hasClass("ipu-modal-overlay")&&(e(".ipu-modal.ipu-modal-in").length>0&&a.modalCloseByOutside&&n.closeModal(".ipu-modal.ipu-modal-in"),e(".ipu-actions-modal.ipu-modal-in").length>0&&a.actionsCloseByOutside&&n.closeModal(".ipu-actions-modal.ipu-modal-in")),i.hasClass("ipu-popup-overlay")&&e(".ipu-popup.ipu-modal-in").length>0&&a.popupCloseByOutside&&n.closeModal(".ipu-popup.modal-in")}var n={};e.fn.transitionEnd=function(t){return i.call(this,["webkitTransitionEnd","transitionend"],t),this};var s=document.createElement("div"),a={modalTitle:"",modalStack:!0,modalButtonOk:"确定",modalButtonCancel:"取消",modalPreloaderTitle:"加载中",modalContainer:document.body?document.body:"body"};n.modalStack=[],n.modalStackClearQueue=function(){t.modalStack.length&&ipu.modalStack.shift()()},n.modal=function(t){t=t||{};var i="";if(t.buttons&&t.buttons.length>0)for(var o=0;o<t.buttons.length;o++)i+='<span class="ipu-modal-button'+(t.buttons[o].bold?" ipu-modal-button-bold":"")+'">'+t.buttons[o].text+"</span>";var r=t.extraClass||"",l=t.title?'<div class="ipu-modal-title">'+t.title+"</div>":"",p=t.text?'<div class="ipu-modal-text">'+t.text+"</div>":"",u=t.afterText?t.afterText:"",d=t.buttons&&0!==t.buttons.length?"":"ipu-modal-no-buttons",c=t.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+'">'+i+"</div></div>";s.innerHTML=h;var m=e(s).children();return e(a.modalContainer).append(m[0]),m.find(".ipu-modal-button").each(function(i,o){e(o).on("click",function(e){t.buttons[i].close!==!1&&n.closeModal(m),t.buttons[i].onClick&&t.buttons[i].onClick(m,e),t.onClick&&t.onClick(m,i)})}),n.openModal(m),m[0]},n.alert=function(t,e,i){return"function"==typeof e&&(i=arguments[1],e=void 0),n.modal({text:t||"",title:"undefined"==typeof e?a.modalTitle:e,buttons:[{text:a.modalButtonOk,bold:!0,onClick:i}]})},n.confirm=function(t,e,i,o){return"function"==typeof e&&(o=arguments[2],i=arguments[1],e=void 0),n.modal({text:t||"",title:"undefined"==typeof e?a.modalTitle:e,buttons:[{text:a.modalButtonCancel,bold:!0,onClick:o},{text:a.modalButtonOk,bold:!0,onClick:i}]})},n.prompt=function(t,i,o,s){return"function"==typeof i&&(s=arguments[2],o=arguments[1],i=void 0),n.modal({text:t||"",title:"undefined"==typeof i?a.modalTitle:i,afterText:'<input type="text" class="ipu-modal-text-input">',buttons:[{text:a.modalButtonCancel},{text:a.modalButtonOk,bold:!0}],onClick:function(t,i){0===i&&s&&s(e(t).find(".ipu-modal-text-input").val()),1===i&&o&&o(e(t).find(".ipu-modal-text-input").val())}})};var r=!1,l=!1,p=!1,u=null;n.showPreloader=function(t,e){return n.hidePreloader(!0),n.showPreloader.preloaderModal=n.modal({title:t||a.modalPreloaderTitle,text:'<div class="ipu-preloader"></div>'}),e&&(r=!0,u=setTimeout(function(){l=!0,p&&n.hidePreloader()},e)),n.showPreloader.preloaderModal},n.hidePreloader=function(t){t||!r||r&&l?(t&&u&&window.clearTimeout(u),n.showPreloader.preloaderModal&&n.closeModal(n.showPreloader.preloaderModal),r=!1,l=!1,p=!1,u=null):p=!0},n.showIndicator=function(){e(".ipu-preloader-indicator-modal")[0]||e(a.modalContainer).append('<div class="ipu-preloader-indicator-overlay"></div><div class="ipu-preloader-indicator-modal"><span class="ipu-preloader ipu-preloader-white"></span></div>')},n.hideIndicator=function(){e(".ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal").remove()},n.actions=function(t){var i,o,r;t=t||[],t.length>0&&!e.isArray(t[0])&&(t=[t]);for(var l,p="",u=0;u<t.length;u++)for(var d=0;d<t[u].length;d++){0===d&&(p+='<div class="ipu-actions-modal-group">');var c=t[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===t[u].length-1&&(p+="</div>")}l='<div class="ipu-actions-modal">'+p+"</div>",s.innerHTML=l,i=e(s).children(),e(a.modalContainer).append(i[0]),o=".ipu-actions-modal-group",r=".ipu-actions-modal-button";var m=i.find(o);return m.each(function(o,s){var a=o;e(s).children().each(function(o,s){var l,p=o,u=t[a][p];e(s).is(r)&&(l=e(s)),l&&l.on("click",function(t){u.close!==!1&&n.closeModal(i),u.onClick&&u.onClick(i,t)})})}),n.openModal(i),i[0]},n.toast=function(t,i,o){var s=e('<div class="ipu-modal ipu-toast '+(o||"")+'">'+t+"</div>").appendTo(document.body);n.openModal(s,function(){setTimeout(function(){n.closeModal(s)},i||2e3)})},n.openModal=function(t,i){t=e(t);var o=t.hasClass("ipu-modal"),s=!t.hasClass("ipu-toast");if(s=!1,e(".ipu-modal.ipu-modal-in:not(.ipu-modal-out)").length&&a.modalStack&&o&&s)return void t.modalStack.push(function(){n.openModal(t,i)});var r=t.hasClass("ipu-popup"),l=t.hasClass("ipu-login-screen"),p=t.hasClass("ipu-picker-modal"),u=t.hasClass("ipu-toast");o&&(t.show(),t.css({marginTop:-Math.round(t.outerHeight()/2)+"px"})),u&&t.css({marginLeft:-Math.round(t.outerWidth()/2)+"px"});var d;l||p||u||(0!==e(".ipu-modal-overlay").length||r||e(a.modalContainer).append('<div class="ipu-modal-overlay"></div>'),0===e(".ipu-popup-overlay").length&&r&&e(a.modalContainer).append('<div class="ipu-popup-overlay"></div>'),d=e(r?".ipu-popup-overlay":".ipu-modal-overlay"));t[0].clientLeft;return t.trigger("open"),p&&e(a.modalContainer).addClass("ipu-with-picker-modal"),l||p||u||d.addClass("ipu-modal-overlay-visible"),t.removeClass("ipu-modal-out").addClass("ipu-modal-in").transitionEnd(function(e){t.hasClass("ipu-modal-out")?t.trigger("closed"):t.trigger("opened")}),"function"==typeof i&&i.call(this),!0},n.closeModal=function(t){if(t=e(t||".ipu-modal-in"),"undefined"==typeof t||0!==t.length){var i=t.hasClass("ipu-modal"),o=t.hasClass("ipu-popup"),s=t.hasClass("ipu-toast"),r=t.hasClass("ipu-login-screen"),l=t.hasClass("ipu-picker-modal"),p=t.hasClass("ipu-remove-on-close"),u=e(o?".ipu-popup-overlay":".ipu-modal-overlay");return o?t.length===e(".ipu-popup.ipu-modal-in").length&&u.removeClass("ipu-modal-overlay-visible"):l||s||u.removeClass("ipu-modal-overlay-visible"),t.trigger("close"),l&&(e(a.modalContainer).removeClass("ipu-with-picker-modal"),e(a.modalContainer).addClass("ipu-picker-modal-closing")),t.removeClass("ipu-modal-in").addClass("ipu-modal-out").transitionEnd(function(i){t.hasClass("ipu-modal-out")?t.trigger("closed"):t.trigger("opened"),l&&e(a.modalContainer).removeClass("ipu-picker-modal-closing"),o||r||l?(t.removeClass("ipu-modal-out").hide(),p&&t.length>0&&t.remove()):t.remove()}),i&&a.modalStack&&n.modalStackClearQueue(),!0}},e.extend(t,n),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:"",pageMax:8,callBack:function(){}},a.limitPages=function(){var t=this.defaultOption.pageMax-2;e(".ipu-page.ipu-show").prevAll(".ipu-page:gt("+t+")").remove()},a.openPage=function(i,r){function h(){r.showLoading&&t.hidePreloader(),r.animate&&(console.log("--"+f),b.removeClass(c)),m.siblings(".ipu-show").removeClass("ipu-show"),r.callBack&&r.callBack(),a.limitPages()}var m=null,f=u+p++;l[f]=i,n(),r.showLoading&&t.showPreloader(r.loadingMessage,r.minMessageTime),m=e("post"==r.method?"<div class='ipu-page' id='"+f+"' data-name='"+r.pageName+"'><iframe class='ipu-page-iframe'></iframe></div>":"<div class='ipu-page' id='"+f+"' data-name='"+r.pageName+"'><iframe class='ipu-page-iframe' src='"+i+"'></iframe></div>");var g=s(e(".ipu-page:last",d)),b=m;if(g&&(b=d.addClass(v)),e(".ipu-page-iframe",m).one("load",function(){m.addClass("ipu-show").width(),g&&b.removeClass(v),r.animate?b.addClass(c).animationEnd(h):h()}),m.appendTo(d),"post"==r.method){var y=e(".ipu-page-iframe",m)[0].contentDocument;o(y,i,r.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.ipuUI.page.openPage(t,i)},a.post=function(t,i){i=e.extend({},this.defaultOption,i),i.method="post",i.target.ipuUI.page.openPage(t,i)},a.back=function(t){t=e.extend({},this.defaultOption,t),t.target.ipuUI.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.ipuUI.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)),
2 2
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();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),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.ipuUI=t(e,i,o,n)}):window.ipuUI=t(window.jQuery,window.iScroll,window.Hammer,window.FastClick)}();
3 3
//# sourceMappingURL=ipuUI.min.js.map

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

@ -1 +1 @@
1
{"version":3,"sources":["ipuUI.js"],"names":["setup","jQuery","iScroll","Hammer","FastClick","ipuUI","version","$","getOriginalEvent","e","originalEvent","getXY","x","touches","pageX","clientX","y","pageY","clientY","active","defaultOption","distanceAllow","displayDelay","hideDelay","eventName","activeClass","getHandleNode","node","findHander","inNode","eventHandlers","_data","data","option","thisNode","each","index","handler","selector","objs","nodeArray","tIndex","tNode","is","distNode","nodeType","parentNode","push","hasTouch","window","START_EVENT","MOVE_EVENT","END_EVENT","CANCEL_EVENT","removeClass","dom","force","timeOutID","clearTimeout","removeActive","tapEl","setTimeout","startXY","document","body","bind","target","addClass","xy","Math","abs","setOption","opts","this","extend","iscroll","Carousel","slt","el","eq","autoPlay","hasIndicator","indicator","callBack","currentIndex","_init","play","prototype","duration","wrapper","carouselItems","size","that","activeIndex","filter","_addIndicator","resize","refresh","show","scrollOpt","snap","momentum","scrollX","scrollY","hScrollbar","onScrollStart","_pause","onTouchEnd","onScrollEnd","_end","get","stop","timeoutId","prev","next","time","scrollToPage","_play","currPageX","indicatorIndexs","siblings","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","floor","major","parseInt","wx","test","ipu","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","_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","label","innerText","hide","click","clickCall","now","rs","parts","j","setDateRange","setBeginDate","date","setEndDate","dispose","removeChild","name","disposed","sltDate","call","close","callback","element","createElement","classList","add","addEventListener","_show","setAttribute","appendChild","_remove","dtPicker","HammerCarousel","loop","clickBack","itemSize","showItemSize","carouselItemWides","moveLen","cloneItem","slice","clone","hammer","Manager","Pan","direction","DIRECTION_HORIZONTAL","threshold","on","bindFn","_onPan","_sizeCount","width","wrapperWidth","outerWidth","itemWidth","mostSize","position","left","_move","move","displayMoveLen","css","animate","toggleClass","ev","delta","deltaX","intValue","decimal","hammerCarousel","readyBacks","isSizeReady","sizeReady","checkSizeReady","innerHeight","delayTime","count","totalTime","__dealCssEvent","eventNameArr","fireCallBack","events","off","handleClicks","clicked","hasClass","defaults","modalCloseByOutside","modal","closeModal","actionsCloseByOutside","popupCloseByOutside","fn","transitionEnd","_modalTemplateTempDiv","modalTitle","modalStack","modalButtonOk","modalButtonCancel","modalPreloaderTitle","modalContainer","modalStackClearQueue","shift","params","buttonsHTML","bold","extraClass","titleHTML","title","textHTML","afterTextHTML","afterText","noButtons","verticalButtons","modalHTML","innerHTML","modalObj","children","append","find","onClick","openModal","alert","callbackOk","arguments","undefined","confirm","callbackCancel","prompt","minLoad","loadOverTime","loadEnd","loadTimeOut","showPreloader","minTime","hidePreloader","preloaderModal","showIndicator","hideIndicator","remove","actions","groupSelector","buttonSelector","isArray","button","buttonClass","color","bg","disabled","groups","groupIndex","clickTarget","buttonIndex","buttonParams","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","ele","submit","checkPages","hasPages","pagesObj","zeroPageClass","pageIdPrefix","isZeroPage","page","animationEnd","maps","pageNo","animateInClass","animateOutClass","zeroPagesClass","parent","backIndex","closeIndex","showLoading","loadingMessage","minMessageTime","pageName","pageMax","limitPages","prevAll","openPage","end","console","log","nowPageNo","animatePage","newPage","zeroPage","one","pageDoc","contentDocument","postPage","backPage","nextAll","nowDoc","iframe","evt","createEvent","initEvent","dispatchEvent","nowPage","prevPage","closePage","open","post","back","backHome","onBack","toRem","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","attach","define","amd"],"mappings":"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","file":"ipuUI.min.js","sourcesContent":["(function () {\r\n  \"use strict\";\r\n\r\n  function setup(jQuery, iScroll, Hammer, FastClick) {\r\n\r\n    /**\r\n     * @class ipuUI对象,通过此对象实例UI组件\r\n     *\r\n     */\r\n\r\n    var ipuUI = {\r\n      version: '0.2.2'\r\n    };\r\n\n// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipuUI, $) {\r\n  var active = {};\r\n\r\n  var defaultOption = {\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[option.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  var option = defaultOption;\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(option.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, option.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 = option.getHandleNode(e.target);\r\n\r\n      if (tapEl) {\r\n        timeOutID = window.setTimeout(function (dom) {\r\n          timeOutID = null;\r\n          $(dom).addClass(option.activeClass);\r\n        }, option.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]) > option.distanceAllow || Math.abs(xy[1] - startXY[1]) > option.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.setOption = function (opts) {\r\n    option = this.option = $.extend({}, defaultOption, opts);\r\n  };\r\n  ipuUI.active = active;\r\n})(ipuUI || window, jQuery);\r\n\r\n\n(function (ipuUI, $, iscroll) {\r\n\r\n  /**\r\n   * @uses IScroll.js\r\n   * @class 简单封装IScroll.js的snap功能,实现banner功能\r\n   * @private 可以使用hammerCarousel代替\r\n   *\r\n   *     @example\r\n   *     <!-- 组件html结构如下,li里的内容用户可自定义  -->\r\n   *     <div class=\"ipu-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 不能直接访问该类,使用ipuUI.carousel(slt, option)生成实例 {@link ipuUI#carousel}\r\n   * @param {Dom|JqueryObj|String} slt jquery对象或者jquery选择器或Dom元素\r\n   * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n   *\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\r\n      $(window).resize(function () {\r\n        that.refresh();\r\n        that.show(that.currentIndex, 0);\r\n      });\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 ipuUI\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  ipuUI.carousel = function (slt, option) {\r\n    return new Carousel(slt, option);\r\n  };\r\n\r\n})(ipuUI || window, jQuery, iScroll);\r\n\n// todo:添加判断平台如mobile ,tablet, pc,参考其它类似功能库,添加webview判断\r\n(function (ipuUI, $) {\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\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  ipuUI.device = device;\r\n})(ipuUI || window, jQuery);\r\n\n// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n// show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n// 日期范围的选择处理\r\n// 不选择字符串连接符,合并后占空间\r\n\r\n(function (ipuUI, $) {\r\n  var Picker = ipuUI.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 ipuUI#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 = ipuUI.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: ''\r\n    + '<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 ipuUI\r\n   * 生成DtPicker实例,参数信息见{@link DtPicker#method-constructor}\r\n   *\r\n   * @param {Object} option\r\n   * @returns {DtPicker}\r\n   */\r\n  ipuUI.dtPicker = function (option) {\r\n    return new DtPicker(option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n\n// 更新方法和属性命名\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容同时显示\r\n// 支持类似snap实现\r\n// 上下移动?\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n// indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n\r\n(function (ipuUI, $, 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  $.extend(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.loop 是否循环切换,只有轮播切换时,才能自动轮播\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      loop: true,\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      this.itemSize = this.carouselItems.size();  // 子项数量\r\n\r\n      this.showItemSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n      this.carouselItemWides = []; // 子项宽度尺寸\r\n\r\n      /** @property {Number} 当前显示子项索引,从0开始 */\r\n      this.currentIndex = 0; // 当前显示子项索引\r\n      this.moveLen = 0;      // 当前滚动移动距离\r\n\r\n      /** @type {Boolean} 循环展示时,第一项会被复制,显示项是第一项时,是否为第一项的复制项 */\r\n      this.cloneItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来标记是否复制项\r\n\r\n      if (this.option.indicator) {\r\n        this._addIndicator();\r\n      }\r\n\r\n      // 如果做循环展示,则要复制起始展示项到最后面\r\n      if (this.option.loop) {\r\n        this.carouselItems.slice(0, this.showItemSize).clone().appendTo(this.wrapper);  // 这里假设每个元素宽度都是相等的\r\n      }\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.hammer = new Hammer.Manager(this.el);\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      this._sizeCount();\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.currentIndex = activeIndex != -1 ? activeIndex : 0;\r\n      }\r\n\r\n      this.show(this.currentIndex, 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;\r\n      if (this.option.loop) {\r\n        index = this.currentIndex == 0 ? this.itemSize - 1 : this.currentIndex - 1;\r\n        if (index == this.itemSize - 1) {\r\n          this._show(this.itemSize, false);\r\n          this.wrapper.width();\r\n        }\r\n      } else {\r\n        index = (this.currentIndex - 1 + this.itemSize) % this.itemSize;\r\n      }\r\n\r\n      this._show(index);\r\n    },\r\n    /**\r\n     * 切换到下一项\r\n     */\r\n    next: function () {//下一张\r\n      var index\r\n      if (this.option.loop) {\r\n        index = this.currentIndex == this.itemSize ? 1 : this.currentIndex + 1;\r\n        if (index == 1) {\r\n          this._show(0, false);\r\n          this.wrapper.width();\r\n        }\r\n      } else {\r\n        index = (this.currentIndex + 1) % this.itemSize;\r\n      }\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.itemSize;\r\n      if (index < 0) {\r\n        index = this.itemSize + 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.option.loop && !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.itemSize; 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.wrapperWidth = this.wrapper.outerWidth(true);\r\n      this.itemWidth = this.carouselItems.eq(0).outerWidth(true);\r\n      this.mostSize = this.itemSize * this.itemWidth; // 宽度*数量\r\n      $(this.wrapper).removeClass(\"ipu-carousel-animate\").width();\r\n      this.carouselItemWides = [];\r\n\r\n      var that = this;\r\n      $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n        that.carouselItemWides[index] = $(this).position().left;\r\n      });\r\n    },\r\n    /**\r\n     * 宽度信息或尺寸信息发生变更时,进行刷新计算\r\n     * 判断是否需要重新计算尺寸,若宽度尺寸发生变化,进行重新尺寸计算\r\n     */\r\n    refresh: function () {\r\n      if (this.wrapperWidth != this.wrapper.outerWidth(true)) {\r\n        this._sizeCount();\r\n        this._show(this.currentIndex, false); //新的位置\r\n      }\r\n    },\r\n    _move: function (moveLen) { // 拖动时的处理\r\n      this._pause();\r\n      $(this.wrapper).removeClass(\"ipu-carousel-animate\");\r\n\r\n      if (this.option.loop) {\r\n        var move = (this.moveLen - moveLen) % this.mostSize;\r\n        move = (move + this.mostSize) % this.mostSize;\r\n\r\n      } else {\r\n        var move = this.moveLen - moveLen;\r\n        if (move < 0) {\r\n          move = move / 2;\r\n        } else if (move > this.mostSize) {\r\n          move = this.mostSize + (move - this.mostSize) / 2;\r\n        }\r\n      }\r\n\r\n      this.displayMoveLen = move;\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.itemSize;\r\n      this.cloneItem = index == this.itemSize;\r\n\r\n      this.moveLen = this.carouselItemWides[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.cloneItem);//返回当前索引,以及是滞最后一项参数\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\r\n      this._play();//处理自动播放\r\n    },\r\n    _onPan: function (ev) {\r\n      var delta = ev.deltaX;  // 内容往左,deltaX为正值\r\n\r\n      // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n      if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n        var value = delta / this.itemWidth;\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 (delta > 0) {\r\n          intValue = -intValue;\r\n        }\r\n        var index;\r\n\r\n        if (this.option.loop) {\r\n          index = (this.currentIndex + intValue) % this.itemSize;\r\n          index = (index + this.itemSize) % this.itemSize; // 因为可能是个负值,转换成正值\r\n\r\n          // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n          if (index == 0 && this.displayMoveLen > this.itemWidth) {\r\n            index = this.itemSize;\r\n          }\r\n        } else { // 非循环时\r\n          index = this.currentIndex + intValue;\r\n          if (index < 0) {\r\n            index = 0;\r\n          } else if (index > this.itemSize - 1) {\r\n            index = this.itemSize - 1;\r\n          }\r\n        }\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 ipuUI\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  ipuUI.hammerCarousel = function (slt, option) {\r\n    return new HammerCarousel(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery, Hammer);\r\n\n// 添加一些jquery扩展\r\n(function (ipuUI, $) {\r\n  // 在android部分手机上,部分窗体,在jqurey的ready函数执行时,宽度值还未确认,会导致部分UI或依赖宽度计算的代码出现问题\r\n  // 皮函数用来处理此问题,等宽度明确或等待最多6s后,执行相关函数\r\n  var readyBacks = [];\r\n  var isSizeReady = false; // 需要记录状态\r\n\r\n  $.extend({ // 扩展jquery工具方法\r\n    sizeReady: function (callBack) {\r\n      if (isSizeReady) {\r\n        callBack();\r\n      } else {\r\n        readyBacks.push(callBack);\r\n      }\r\n    }\r\n  });\r\n\r\n  $(function () { // 添加监听页面ready函数\r\n    var count = 0;\r\n    var delayTime = 40; // 间隔时间ms\r\n    var totalTime = 6000; // 最高等待6s=6000ms\r\n\r\n    function checkSizeReady() {\r\n      if (window.innerHeight != 0 || delayTime * count >= totalTime) {\r\n        isSizeReady = true;\r\n        for (var i = 0, j = readyBacks.length; i < j; i++) {\r\n          readyBacks[i]();\r\n        }\r\n      } else {\r\n        count++;\r\n        setTimeout(checkSizeReady, delayTime);\r\n      }\r\n    }\r\n\r\n    checkSizeReady();\r\n  });\r\n\r\n\r\n})(ipuUI || window, jQuery);\r\n\n(function (ipuUI, $) {\r\n\r\n  /**\r\n   * @class modal,模拟框实现对象,所有方法可直接通过ipuUI调用\r\n   *\r\n   */\r\n  var modal = {};\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  modal.modalStack = [];\r\n\r\n  modal.modalStackClearQueue = function () {\r\n    if (ipuUI.modalStack.length) {\r\n      (ipu.modalStack.shift())();\r\n    }\r\n  };\r\n\r\n  modal.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 modalObj = $(_modalTemplateTempDiv).children();\r\n\r\n    $(defaults.modalContainer).append(modalObj[0]);\r\n\r\n    // Add events on buttons\r\n    modalObj.find('.ipu-modal-button').each(function (index, el) {\r\n      $(el).on('click', function (e) {\r\n        if (params.buttons[index].close !== false) modal.closeModal(modalObj);\r\n        if (params.buttons[index].onClick) params.buttons[index].onClick(modalObj, e);\r\n        if (params.onClick) params.onClick(modalObj, index);\r\n      });\r\n    });\r\n    modal.openModal(modalObj);\r\n    return modalObj[0];\r\n  };\r\n\r\n  /**\r\n   * @member modal\r\n   * 弹出警告消息\r\n   *\r\n   * @param {String} text 警句文本\r\n   * @param {String} title 警告标题,可选参数\r\n   * @param {Function} callbackOk 用户确认后的回调函数,可选参数\r\n   */\r\n  modal.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 modal.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 modal\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  modal.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 modal.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 modal\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  modal.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 modal.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 modal\r\n   * 弹出加载消息提示\r\n   *\r\n   * @param {String} title 加载提示文本\r\n   * @param {Number} minTime 消息最小显示时间,单位ms,可选参数\r\n   */\r\n  modal.showPreloader = function (title, minTime) {\r\n    modal.hidePreloader(true);\r\n\r\n    modal.showPreloader.preloaderModal = modal.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          modal.hidePreloader();\r\n        }\r\n      }, minTime);\r\n    }\r\n\r\n    return modal.showPreloader.preloaderModal;\r\n  };\r\n\r\n  /**\r\n   * @member modal\r\n   * 隐藏加载消息提示\r\n   *\r\n   * @param {Boolean} force 是否强制隐藏,不管最小提示时间,可选\r\n   */\r\n  modal.hidePreloader = function (force) {\r\n    if (force || !minLoad || (minLoad && loadOverTime)) {\r\n      if (force && loadTimeOut) {\r\n        window.clearTimeout(loadTimeOut);\r\n      }\r\n      modal.showPreloader.preloaderModal && modal.closeModal(modal.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 modal\r\n   * 显示加载状态\r\n   */\r\n  modal.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 modal\r\n   * 隐藏加载状态\r\n   */\r\n  modal.hideIndicator = function () {\r\n    $('.ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal').remove();\r\n  };\r\n\r\n  /**\r\n   * @member modal\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  modal.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) modal.closeModal(modalj);\r\n            if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n          });\r\n        }\r\n      });\r\n    });\r\n    modal.openModal(modalj);\r\n    return modal[0];\r\n  };\r\n\r\n  //显示一个消息,会在2秒钟后自动消失\r\n  /**\r\n   * @member modal\r\n   * 悬浮提示消息\r\n   *\r\n   * @param {String} msg 消息文本\r\n   * @param {Number} duration=2000 消息显示时间,单位ms\r\n   */\r\n  modal.toast = function (msg, duration, extraclass) {\r\n    var $toast = $('<div class=\"ipu-modal ipu-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n    modal.openModal($toast, function () {\r\n      setTimeout(function () {\r\n        modal.closeModal($toast);\r\n      }, duration || 2000);\r\n    });\r\n  };\r\n\r\n  modal.openModal = function (modalObj, cb) {\r\n    modalObj = $(modalObj);\r\n    var isModal = modalObj.hasClass('ipu-modal'),\r\n      isNotToast = !modalObj.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      modalObj.modalStack.push(function () {\r\n        modal.openModal(modalObj, cb);\r\n      });\r\n      return;\r\n    }\r\n\r\n    var isPopup = modalObj.hasClass('ipu-popup');\r\n    var isLoginScreen = modalObj.hasClass('ipu-login-screen');\r\n    var isPickerModal = modalObj.hasClass('ipu-picker-modal');\r\n    var isToast = modalObj.hasClass('ipu-toast');\r\n\r\n    if (isModal) {\r\n      modalObj.show();\r\n      modalObj.css({\r\n        marginTop: -Math.round(modalObj.outerHeight() / 2) + 'px'\r\n      });\r\n    }\r\n\r\n    if (isToast) {\r\n      modalObj.css({\r\n        marginLeft: -Math.round(modalObj.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 = modalObj[0].clientLeft;\r\n\r\n    // Trugger open event\r\n    modalObj.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    modalObj.removeClass('ipu-modal-out').addClass('ipu-modal-in').transitionEnd(function (e) {\r\n      if (modalObj.hasClass('ipu-modal-out')) modalObj.trigger('closed');\r\n      else modalObj.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  modal.closeModal = function (modalObj) {\r\n    modalObj = $(modalObj || '.ipu-modal-in');\r\n    if (typeof modalObj !== 'undefined' && modalObj.length === 0) {\r\n      return;\r\n    }\r\n    var isModal = modalObj.hasClass('ipu-modal'),\r\n      isPopup = modalObj.hasClass('ipu-popup'),\r\n      isToast = modalObj.hasClass('ipu-toast'),\r\n      isLoginScreen = modalObj.hasClass('ipu-login-screen'),\r\n      isPickerModal = modalObj.hasClass('ipu-picker-modal'),\r\n      removeOnClose = modalObj.hasClass('ipu-remove-on-close'),\r\n      overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-modal-overlay');\r\n    if (isPopup) {\r\n      if (modalObj.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    modalObj.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    modalObj.removeClass('ipu-modal-in').addClass('ipu-modal-out').transitionEnd(function (e) {\r\n      if (modalObj.hasClass('ipu-modal-out')) modalObj.trigger('closed');\r\n      else modalObj.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        modalObj.removeClass('ipu-modal-out').hide();\r\n        if (removeOnClose && modalObj.length > 0) {\r\n          modalObj.remove();\r\n        }\r\n      }\r\n      else {\r\n        modalObj.remove();\r\n      }\r\n    });\r\n    if (isModal && defaults.modalStack) {\r\n      modal.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        modal.closeModal('.ipu-modal.ipu-modal-in');\r\n      if ($('.ipu-actions-modal.ipu-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n        modal.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        modal.closeModal('.ipu-popup.modal-in');\r\n    }\r\n  }\r\n\r\n  $.extend(ipuUI, modal);\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})(ipuUI || window, jQuery);\r\n\n(function (ipuUI, $) {\r\n  /**\r\n   * @class 导航切换组件\r\n   *\r\n   *      @example\r\n   *\r\n   *      <!-- 组件的html分成导航和内容两部分,一般与flex栅格配合布局-->\r\n   *\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   * @constructor  不能直接访问该类,调用{@link ipu#navBar ipuUI.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 ipuUI\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  ipuUI.navBar = function (slt, option) {\r\n    return new NavBar(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n\n(function (ipuUI, $) {\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 {Number} defaultOption.pageMax=''  保留的最大页面数,大于2\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    pageMax: 8,        // 允许的最大打开页面数\r\n    callBack: function () { // 事件回调       方法:open post close back\r\n    }\r\n  };\r\n\r\n  // 新增限制最大页面数\r\n  page.limitPages = function () {\r\n    var pageMax = this.defaultOption.pageMax - 2; //\r\n    $(\".ipu-page.ipu-show\").prevAll(\".ipu-page:gt(\" + pageMax + \")\").remove();\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      ipuUI.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        ipuUI.hidePreloader();\r\n      }\r\n\r\n      if (option.animate) {\r\n        console.log(\"--\" + nowPageNo);\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      page.limitPages();\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.ipuUI.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.ipuUI.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.ipuUI.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.ipuUI.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  ipuUI.page = page;\r\n})(ipuUI || window, jQuery);\r\n\n// picker\r\n(function (ipuUI, $, 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 (ipuUI.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  ipuUI.Picker = Picker;\r\n\r\n})(ipuUI || window, jQuery, Hammer);\r\n\n// popPicker\r\n(function (ipuUI, $) {\r\n  var Picker = ipuUI.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   *      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 ipuUI.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 = ipuUI.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 ipuUI\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  ipuUI.popPicker = function (option) {\r\n    return new PopPicker(option);\r\n  };\r\n\r\n})(ipuUI || window, jQuery);\r\n\n(function (ipuUI, $) {\r\n\r\n  /**\r\n   * @class\r\n   * 进度条\r\n   *\r\n   *      @example\r\n   *       <!-- 组件html -->\r\n   *       <div class=\"ipu-progress \">\r\n   *         <span class=\"ipu-progressbar\"></span>\r\n   *       </div>\r\n   *\r\n   *\r\n   * @constructor  不能直接访问该类,调用 {@link ipuUI#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 ipuUI\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  ipuUI.progressBar = function (slt, option) {\r\n    return new ProgressBar(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n\n// 设置上下条件长度,或计算函数\r\n// 处理resize的问题,用户主动调用refresh??\r\n// 底部启用或停用时,应该刷新组件iscroll高度\r\n// 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n(function (ipuUI, $, 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  不能直接访问该类,调用ipuUI.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   *\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 ipuUI\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  ipuUI.refresh = function (slt, optoins) {\r\n    return new Refresh(slt, optoins);\r\n  };\r\n\r\n})(ipuUI || window, jQuery, iScroll);\r\n\n// Tab\r\n(function (ipuUI, $) {\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>自定义内容</li>\r\n   *            <li class=\"\">选项2内容</li>\r\n   *            <li class=\"\">选项3内容</li>\r\n   *            <li class=\"\">选项4内容</li>\r\n   *          </ul>\r\n   *        </div>\r\n   *      </div>\r\n   *\r\n   *\r\n   * @constructor  不能直接访问该类,调用ipuUI.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   * 显示第几项内容\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  ipuUI.tab = function (slt, option) {\r\n    return new Tab(slt, option);\r\n  };\r\n})(ipuUI || 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 ipuUI;\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.ipuUI = setup(jQuery, iScroll, Hammer, FastClick);\r\n    });\r\n  } else {\r\n    window.ipuUI = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n  }\r\n\r\n})();\r\n\r\n//# sourceMappingURL=ipuUI.js.map\r\n"]}
1
{"version":3,"sources":["ipuUI.js"],"names":["setup","jQuery","iScroll","Hammer","FastClick","ipuUI","version","$","getOriginalEvent","e","originalEvent","getXY","x","touches","pageX","clientX","y","pageY","clientY","active","defaultOption","distanceAllow","displayDelay","hideDelay","eventName","activeClass","getHandleNode","node","findHander","inNode","eventHandlers","_data","data","option","thisNode","each","index","handler","selector","objs","nodeArray","tIndex","tNode","is","distNode","nodeType","parentNode","push","hasTouch","window","START_EVENT","MOVE_EVENT","END_EVENT","CANCEL_EVENT","removeClass","dom","force","timeOutID","clearTimeout","removeActive","tapEl","setTimeout","startXY","document","body","bind","target","addClass","xy","Math","abs","setOption","opts","this","extend","iscroll","Carousel","slt","el","eq","autoPlay","hasIndicator","indicator","callBack","currentIndex","_init","play","prototype","duration","wrapper","carouselItems","size","that","activeIndex","filter","_addIndicator","resize","refresh","show","scrollOpt","snap","momentum","scrollX","scrollY","hScrollbar","onScrollStart","_pause","onTouchEnd","onScrollEnd","_end","get","stop","timeoutId","prev","next","time","scrollToPage","_play","currPageX","indicatorIndexs","siblings","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","floor","major","parseInt","wx","test","ipu","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","_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","label","innerText","hide","click","clickCall","now","rs","parts","j","setDateRange","setBeginDate","date","setEndDate","dispose","removeChild","name","disposed","sltDate","call","close","callback","element","createElement","classList","add","addEventListener","_show","setAttribute","appendChild","_remove","dtPicker","HammerCarousel","loop","clickBack","itemSize","showItemSize","carouselItemWides","moveLen","cloneItem","slice","clone","hammer","Manager","Pan","direction","DIRECTION_HORIZONTAL","threshold","on","bindFn","_onPan","_sizeCount","width","wrapperWidth","outerWidth","itemWidth","mostSize","position","left","_move","move","displayMoveLen","css","animate","toggleClass","ev","delta","deltaX","intValue","decimal","hammerCarousel","readyBacks","isSizeReady","sizeReady","checkSizeReady","innerHeight","delayTime","count","totalTime","__dealCssEvent","eventNameArr","fireCallBack","events","off","handleClicks","clicked","hasClass","defaults","modalCloseByOutside","modal","closeModal","actionsCloseByOutside","popupCloseByOutside","fn","transitionEnd","_modalTemplateTempDiv","modalTitle","modalStack","modalButtonOk","modalButtonCancel","modalPreloaderTitle","modalContainer","modalStackClearQueue","shift","params","buttonsHTML","bold","extraClass","titleHTML","title","textHTML","afterTextHTML","afterText","noButtons","verticalButtons","modalHTML","innerHTML","modalObj","children","append","find","onClick","openModal","alert","callbackOk","arguments","undefined","confirm","callbackCancel","prompt","minLoad","loadOverTime","loadEnd","loadTimeOut","showPreloader","minTime","hidePreloader","preloaderModal","showIndicator","hideIndicator","remove","actions","groupSelector","buttonSelector","isArray","button","buttonClass","color","bg","disabled","groups","groupIndex","clickTarget","buttonIndex","buttonParams","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","ele","submit","checkPages","hasPages","pagesObj","zeroPageClass","pageIdPrefix","isZeroPage","page","animationEnd","maps","pageNo","animateInClass","animateOutClass","zeroPagesClass","parent","backIndex","closeIndex","showLoading","loadingMessage","minMessageTime","pageName","pageMax","limitPages","prevAll","openPage","end","console","log","nowPageNo","animatePage","newPage","zeroPage","one","pageDoc","contentDocument","postPage","backPage","nextAll","nowDoc","iframe","evt","createEvent","initEvent","dispatchEvent","nowPage","prevPage","closePage","open","post","back","backHome","onBack","toRem","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","attach","define","amd"],"mappings":"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","file":"ipuUI.min.js","sourcesContent":["(function () {\r\n  \"use strict\";\r\n\r\n  function setup(jQuery, iScroll, Hammer, FastClick) {\r\n\r\n    /**\r\n     * @class ipuUI对象,通过此对象实例UI组件\r\n     *\r\n     */\r\n\r\n    var ipuUI = {\r\n      version: '0.2.2'\r\n    };\r\n\n// tap点击效果处理,只针对jquery上面的click事件,依赖touch事件\r\n(function (ipuUI, $) {\r\n  var active = {};\r\n\r\n  var defaultOption = {\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[option.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  var option = defaultOption;\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(option.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, option.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 = option.getHandleNode(e.target);\r\n\r\n      if (tapEl) {\r\n        timeOutID = window.setTimeout(function (dom) {\r\n          timeOutID = null;\r\n          $(dom).addClass(option.activeClass);\r\n        }, option.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]) > option.distanceAllow || Math.abs(xy[1] - startXY[1]) > option.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.setOption = function (opts) {\r\n    option = this.option = $.extend({}, defaultOption, opts);\r\n  };\r\n  ipuUI.active = active;\r\n})(ipuUI || window, jQuery);\r\n\r\n\n(function (ipuUI, $, iscroll) {\r\n\r\n  /**\r\n   * @uses IScroll.js\r\n   * @class 简单封装IScroll.js的snap功能,实现banner功能\r\n   * @private 可以使用hammerCarousel代替\r\n   *\r\n   *     @example\r\n   *     <!-- 组件html结构如下,li里的内容用户可自定义  -->\r\n   *     <div class=\"ipu-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 不能直接访问该类,使用ipuUI.carousel(slt, option)生成实例 {@link ipuUI#carousel}\r\n   * @param {Dom|JqueryObj|String} slt jquery对象或者jquery选择器或Dom元素\r\n   * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n   *\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\r\n      $(window).resize(function () {\r\n        that.refresh();\r\n        that.show(that.currentIndex, 0);\r\n      });\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 ipuUI\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  ipuUI.carousel = function (slt, option) {\r\n    return new Carousel(slt, option);\r\n  };\r\n\r\n})(ipuUI || window, jQuery, iScroll);\r\n\n// todo:添加判断平台如mobile ,tablet, pc,参考其它类似功能库,添加webview判断\r\n(function (ipuUI, $) {\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\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  ipuUI.device = device;\r\n})(ipuUI || window, jQuery);\r\n\n// dtPicker  此版本最大值与最小值,存在问题,当时间跨过一天时\r\n// show方法调用时,若没有值,则为当前值,还是有值就不变动了,点了确认按钮后,就不再变动了\r\n// 日期范围的选择处理\r\n// 不选择字符串连接符,合并后占空间\r\n\r\n(function (ipuUI, $) {\r\n  var Picker = ipuUI.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 ipuUI#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 = ipuUI.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: ''\r\n    + '<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 ipuUI\r\n   * 生成DtPicker实例,参数信息见{@link DtPicker#method-constructor}\r\n   *\r\n   * @param {Object} option\r\n   * @returns {DtPicker}\r\n   */\r\n  ipuUI.dtPicker = function (option) {\r\n    return new DtPicker(option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n\n// 更新方法和属性命名\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容同时显示\r\n// 支持类似snap实现\r\n// 上下移动?\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n// indicatorPosition: 'center',  // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n\r\n(function (ipuUI, $, 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  $.extend(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.loop 是否循环切换,只有轮播切换时,才能自动轮播\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      loop: true,\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      this.itemSize = this.carouselItems.size();  // 子项数量\r\n\r\n      this.showItemSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n      this.carouselItemWides = []; // 子项宽度尺寸\r\n\r\n      /** @property {Number} 当前显示子项索引,从0开始 */\r\n      this.currentIndex = 0; // 当前显示子项索引\r\n      this.moveLen = 0;      // 当前滚动移动距离\r\n\r\n      /** @type {Boolean} 循环展示时,第一项会被复制,显示项是第一项时,是否为第一项的复制项 */\r\n      this.cloneItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来标记是否复制项\r\n\r\n      if (this.option.indicator) {\r\n        this._addIndicator();\r\n      }\r\n\r\n      // 如果做循环展示,则要复制起始展示项到最后面\r\n      if (this.option.loop) {\r\n        this.carouselItems.slice(0, this.showItemSize).clone().appendTo(this.wrapper);  // 这里假设每个元素宽度都是相等的\r\n      }\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.hammer = new Hammer.Manager(this.el);\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      this._sizeCount();\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.currentIndex = activeIndex != -1 ? activeIndex : 0;\r\n      }\r\n\r\n      this.show(this.currentIndex, 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;\r\n      if (this.option.loop) {\r\n        index = this.currentIndex == 0 ? this.itemSize - 1 : this.currentIndex - 1;\r\n        if (index == this.itemSize - 1) {\r\n          this._show(this.itemSize, false);\r\n          this.wrapper.width();\r\n        }\r\n      } else {\r\n        index = (this.currentIndex - 1 + this.itemSize) % this.itemSize;\r\n      }\r\n\r\n      this._show(index);\r\n    },\r\n    /**\r\n     * 切换到下一项\r\n     */\r\n    next: function () {//下一张\r\n      var index\r\n      if (this.option.loop) {\r\n        index = this.currentIndex == this.itemSize ? 1 : this.currentIndex + 1;\r\n        if (index == 1) {\r\n          this._show(0, false);\r\n          this.wrapper.width();\r\n        }\r\n      } else {\r\n        index = (this.currentIndex + 1) % this.itemSize;\r\n      }\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.itemSize;\r\n      if (index < 0) {\r\n        index = this.itemSize + 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.option.loop && !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.itemSize; 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.wrapperWidth = this.wrapper.outerWidth(true);\r\n      this.itemWidth = this.carouselItems.eq(0).outerWidth(true);\r\n      this.mostSize = this.itemSize * this.itemWidth; // 宽度*数量\r\n      $(this.wrapper).removeClass(\"ipu-carousel-animate\").width();\r\n      this.carouselItemWides = [];\r\n\r\n      var that = this;\r\n      $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n        that.carouselItemWides[index] = $(this).position().left;\r\n      });\r\n    },\r\n    /**\r\n     * 宽度信息或尺寸信息发生变更时,进行刷新计算\r\n     * 判断是否需要重新计算尺寸,若宽度尺寸发生变化,进行重新尺寸计算\r\n     */\r\n    refresh: function () {\r\n      if (this.wrapperWidth != this.wrapper.outerWidth(true)) {\r\n        this._sizeCount();\r\n        this._show(this.currentIndex, false); //新的位置\r\n      }\r\n    },\r\n    _move: function (moveLen) { // 拖动时的处理\r\n      this._pause();\r\n      $(this.wrapper).removeClass(\"ipu-carousel-animate\");\r\n\r\n      if (this.option.loop) {\r\n        var move = (this.moveLen - moveLen) % this.mostSize;\r\n        move = (move + this.mostSize) % this.mostSize;\r\n\r\n      } else {\r\n        var move = this.moveLen - moveLen;\r\n        if (move < 0) {\r\n          move = move / 2;\r\n        } else if (move > this.mostSize) {\r\n          move = this.mostSize + (move - this.mostSize) / 2;\r\n        }\r\n      }\r\n\r\n      this.displayMoveLen = move;\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.itemSize;\r\n      this.cloneItem = index == this.itemSize;\r\n\r\n      this.moveLen = this.carouselItemWides[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.cloneItem);//返回当前索引,以及是滞最后一项参数\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\r\n      this._play();//处理自动播放\r\n    },\r\n    _onPan: function (ev) {\r\n      var delta = ev.deltaX;  // 内容往左,deltaX为正值\r\n\r\n      // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n      if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n        var value = delta / this.itemWidth;\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 (delta > 0) {\r\n          intValue = -intValue;\r\n        }\r\n        var index;\r\n\r\n        if (this.option.loop) {\r\n          index = (this.currentIndex + intValue) % this.itemSize;\r\n          index = (index + this.itemSize) % this.itemSize; // 因为可能是个负值,转换成正值\r\n\r\n          // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n          if (index == 0 && this.displayMoveLen > this.itemWidth) {\r\n            index = this.itemSize;\r\n          }\r\n        } else { // 非循环时\r\n          index = this.currentIndex + intValue;\r\n          if (index < 0) {\r\n            index = 0;\r\n          } else if (index > this.itemSize - 1) {\r\n            index = this.itemSize - 1;\r\n          }\r\n        }\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 ipuUI\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  ipuUI.hammerCarousel = function (slt, option) {\r\n    return new HammerCarousel(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery, Hammer);\r\n\n// 添加一些jquery扩展\r\n(function (ipuUI, $) {\r\n  // 在android部分手机上,部分窗体,在jqurey的ready函数执行时,宽度值还未确认,会导致部分UI或依赖宽度计算的代码出现问题\r\n  // 皮函数用来处理此问题,等宽度明确或等待最多6s后,执行相关函数\r\n  var readyBacks = [];\r\n  var isSizeReady = false; // 需要记录状态\r\n\r\n  $.extend({ // 扩展jquery工具方法\r\n    sizeReady: function (callBack) {\r\n      if (isSizeReady) {\r\n        callBack();\r\n      } else {\r\n        readyBacks.push(callBack);\r\n      }\r\n    }\r\n  });\r\n\r\n  $(function () { // 添加监听页面ready函数\r\n    var count = 0;\r\n    var delayTime = 40; // 间隔时间ms\r\n    var totalTime = 6000; // 最高等待6s=6000ms\r\n\r\n    function checkSizeReady() {\r\n      if (window.innerHeight != 0 || delayTime * count >= totalTime) {\r\n        isSizeReady = true;\r\n        for (var i = 0, j = readyBacks.length; i < j; i++) {\r\n          readyBacks[i]();\r\n        }\r\n      } else {\r\n        count++;\r\n        setTimeout(checkSizeReady, delayTime);\r\n      }\r\n    }\r\n\r\n    checkSizeReady();\r\n  });\r\n\r\n\r\n})(ipuUI || window, jQuery);\r\n\n(function (ipuUI, $) {\n\n  /**\n   * @class modal,模拟框实现对象,所有方法可直接通过ipuUI调用\n   *\n   */\n  var modal = {};\n\n  function __dealCssEvent(eventNameArr, callback) {\n    var events = eventNameArr,\n      i, dom = this;// jshint ignore:line\n\n    function fireCallBack(e) {\n      /*jshint validthis:true */\n      if (e.target !== this) return;\n      callback.call(this, e);\n      for (i = 0; i < events.length; i++) {\n        dom.off(events[i], fireCallBack);\n      }\n    }\n\n    if (callback) {\n      for (i = 0; i < events.length; i++) {\n        dom.on(events[i], fireCallBack);\n      }\n    }\n  }\n\n  $.fn.transitionEnd = function (callback) {\n    __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\n    return this;\n  };\n\n  var _modalTemplateTempDiv = document.createElement('div');\n\n  var defaults = {\n    modalTitle: '',\n    modalStack: true,\n    modalButtonOk: '确定',\n    modalButtonCancel: '取消',\n    modalPreloaderTitle: '加载中',\n    modalContainer: document.body ? document.body : 'body'\n  };\n\n  modal.modalStack = [];\n\n  modal.modalStackClearQueue = function () {\n    if (ipuUI.modalStack.length) {\n      (ipu.modalStack.shift())();\n    }\n  };\n\n  modal.modal = function (params) {\n    params = params || {};\n    var buttonsHTML = '';\n    if (params.buttons && params.buttons.length > 0) {\n      for (var i = 0; i < params.buttons.length; i++) {\n        buttonsHTML += '<span class=\"ipu-modal-button' + (params.buttons[i].bold ? ' ipu-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\n      }\n    }\n    var extraClass = params.extraClass || '';\n    var titleHTML = params.title ? '<div class=\"ipu-modal-title\">' + params.title + '</div>' : '';\n    var textHTML = params.text ? '<div class=\"ipu-modal-text\">' + params.text + '</div>' : '';\n    var afterTextHTML = params.afterText ? params.afterText : '';\n    var noButtons = !params.buttons || params.buttons.length === 0 ? 'ipu-modal-no-buttons' : '';\n    var verticalButtons = params.verticalButtons ? 'ipu-modal-buttons-vertical' : '';\n\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>';\n\n    _modalTemplateTempDiv.innerHTML = modalHTML;\n\n    var modalObj = $(_modalTemplateTempDiv).children();\n\n    $(defaults.modalContainer).append(modalObj[0]);\n\n    // Add events on buttons\n    modalObj.find('.ipu-modal-button').each(function (index, el) {\n      $(el).on('click', function (e) {\n        if (params.buttons[index].close !== false) modal.closeModal(modalObj);\n        if (params.buttons[index].onClick) params.buttons[index].onClick(modalObj, e);\n        if (params.onClick) params.onClick(modalObj, index);\n      });\n    });\n    modal.openModal(modalObj);\n    return modalObj[0];\n  };\n\n  /**\n   * @member modal\n   * 弹出警告消息\n   *\n   * @param {String} text 警句文本\n   * @param {String} title 警告标题,可选参数\n   * @param {Function} callbackOk 用户确认后的回调函数,可选参数\n   */\n  modal.alert = function (text, title, callbackOk) {\n    if (typeof title === 'function') {\n      callbackOk = arguments[1];\n      title = undefined;\n    }\n    return modal.modal({\n      text: text || '',\n      title: typeof title === 'undefined' ? defaults.modalTitle : title,\n      buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\n    });\n  };\n\n  /**\n   * @member modal\n   * 弹出确认消息\n   *\n   * @param {String} text 确认文本\n   * @param {String} title 确认标题,可选参数\n   * @param {Function} callbackOk 用户确认后的回调函数,可选参数\n   * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\n   */\n  modal.confirm = function (text, title, callbackOk, callbackCancel) {\n    if (typeof title === 'function') {\n      callbackCancel = arguments[2];\n      callbackOk = arguments[1];\n      title = undefined;\n    }\n    return modal.modal({\n      text: text || '',\n      title: typeof title === 'undefined' ? defaults.modalTitle : title,\n      buttons: [\n        {text: defaults.modalButtonCancel, bold: true, onClick: callbackCancel},\n        {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\n      ]\n    });\n  };\n\n  /**\n   * @member modal\n   * 弹出输入框\n   *\n   * @param {String} text 输入提示文本\n   * @param {String} title 输入提示标题,可选参数\n   * @param {Function} callbackOk 用户确认后的回调函数,可选参数\n   * @param {Function} callbackCancel 用户确认后的回调函数,可选参数\n   */\n  modal.prompt = function (text, title, callbackOk, callbackCancel) {\n    if (typeof title === 'function') {\n      callbackCancel = arguments[2];\n      callbackOk = arguments[1];\n      title = undefined;\n    }\n    return modal.modal({\n      text: text || '',\n      title: typeof title === 'undefined' ? defaults.modalTitle : title,\n      afterText: '<input type=\"text\" class=\"ipu-modal-text-input\">',\n      buttons: [\n        {\n          text: defaults.modalButtonCancel\n        },\n        {\n          text: defaults.modalButtonOk,\n          bold: true\n        }\n      ],\n      onClick: function (modal, index) {\n        if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ipu-modal-text-input').val());\n        if (index === 1 && callbackOk) callbackOk($(modal).find('.ipu-modal-text-input').val());\n      }\n    });\n  };\n\n  var minLoad = false;        // 是否最小时间调用方式\n  var loadOverTime = false;   // 是否超过最小调用时间\n  var loadEnd = false;        // 是否调用结束\n  var loadTimeOut = null;     // 延时调用ID\n\n  /**\n   *  @member modal\n   * 弹出加载消息提示\n   *\n   * @param {String} title 加载提示文本\n   * @param {Number} minTime 消息最小显示时间,单位ms,可选参数\n   */\n  modal.showPreloader = function (title, minTime) {\n    modal.hidePreloader(true);\n\n    modal.showPreloader.preloaderModal = modal.modal({\n      title: title || defaults.modalPreloaderTitle,\n      text: '<div class=\"ipu-preloader\"></div>'\n    });\n\n    if (minTime) {\n      minLoad = true;\n      loadTimeOut = setTimeout(function () {\n        loadOverTime = true;\n        if (loadEnd) {\n          modal.hidePreloader();\n        }\n      }, minTime);\n    }\n\n    return modal.showPreloader.preloaderModal;\n  };\n\n  /**\n   * @member modal\n   * 隐藏加载消息提示\n   *\n   * @param {Boolean} force 是否强制隐藏,不管最小提示时间,可选\n   */\n  modal.hidePreloader = function (force) {\n    if (force || !minLoad || (minLoad && loadOverTime)) {\n      if (force && loadTimeOut) {\n        window.clearTimeout(loadTimeOut);\n      }\n      modal.showPreloader.preloaderModal && modal.closeModal(modal.showPreloader.preloaderModal);\n      minLoad = false; // 重置各标志位\n      loadOverTime = false;\n      loadEnd = false;\n      loadTimeOut = null;\n    } else {\n      loadEnd = true;\n    }\n  };\n\n  /**\n   * @member modal\n   * 显示加载状态\n   */\n  modal.showIndicator = function () {\n    if ($('.ipu-preloader-indicator-modal')[0]) return;\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>');\n  };\n\n  /**\n   * @member modal\n   * 隐藏加载状态\n   */\n  modal.hideIndicator = function () {\n    $('.ipu-preloader-indicator-overlay, .ipu-preloader-indicator-modal').remove();\n  };\n\n  /**\n   * @member modal\n   * 显示操作选项\n   *\n   * @param{[[Object]]} actions\n   * @param {Object} actions.Object\n   * @param {String} actions.Object.text 操作名称\n   * @param {Boolean} actions.Object.label 是否标签,非标签就是操作项,操作项有后续的配置,标签项无须后续配置项\n   * @param {String:warning} actions.Object.color 样式,可选\n   * @param {String:warning} actions.Object.bg 背景样式,可选\n   * @param {Function} actions.Object.onClick 点击时回调函数\n   */\n  modal.actions = function (params) {\n    var modalObj, groupSelector, buttonSelector;\n    params = params || [];\n\n    if (params.length > 0 && !$.isArray(params[0])) {\n      params = [params];\n    }\n    var modalHTML;\n    var buttonsHTML = '';\n    for (var i = 0; i < params.length; i++) {\n      for (var j = 0; j < params[i].length; j++) {\n        if (j === 0) buttonsHTML += '<div class=\"ipu-actions-modal-group\">';\n        var button = params[i][j];\n        var buttonClass = button.label ? 'ipu-actions-modal-label' : 'ipu-actions-modal-button';\n        if (button.bold) buttonClass += ' ipu-actions-modal-button-bold';\n        if (button.color) buttonClass += ' ipu-color-' + button.color;\n        if (button.bg) buttonClass += ' ipu-bg-' + button.bg;\n        if (button.disabled) buttonClass += ' disabled';\n        buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\n        if (j === params[i].length - 1) buttonsHTML += '</div>';\n      }\n    }\n    modalHTML = '<div class=\"ipu-actions-modal\">' + buttonsHTML + '</div>';\n    _modalTemplateTempDiv.innerHTML = modalHTML;\n    modalObj = $(_modalTemplateTempDiv).children();\n    $(defaults.modalContainer).append(modalObj[0]);\n    groupSelector = '.ipu-actions-modal-group';\n    buttonSelector = '.ipu-actions-modal-button';\n\n    var groups = modalObj.find(groupSelector);\n    groups.each(function (index, el) {\n      var groupIndex = index;\n      $(el).children().each(function (index, el) {\n        var buttonIndex = index;\n        var buttonParams = params[groupIndex][buttonIndex];\n        var clickTarget;\n        if ($(el).is(buttonSelector)) clickTarget = $(el);\n        // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\n\n        if (clickTarget) {\n          clickTarget.on('click', function (e) {\n            if (buttonParams.close !== false) modal.closeModal(modalObjj);\n            if (buttonParams.onClick) buttonParams.onClick(modalObj, e);\n          });\n        }\n      });\n    });\n    modal.openModal(modalObjj);\n    return modalObj[0];\n  };\n\n  //显示一个消息,会在2秒钟后自动消失\n  /**\n   * @member modal\n   * 悬浮提示消息\n   *\n   * @param {String} msg 消息文本\n   * @param {Number} duration=2000 消息显示时间,单位ms\n   */\n  modal.toast = function (msg, duration, extraclass) {\n    var $toast = $('<div class=\"ipu-modal ipu-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\n    modal.openModal($toast, function () {\n      setTimeout(function () {\n        modal.closeModal($toast);\n      }, duration || 2000);\n    });\n  };\n\n  modal.openModal = function (modalObj, cb) {\n    modalObj = $(modalObj);\n    var isModal = modalObj.hasClass('ipu-modal'),\n      isNotToast = !modalObj.hasClass('ipu-toast');\n    isNotToast = false; // 强制打开新窗口\n\n    if ($('.ipu-modal.ipu-modal-in:not(.ipu-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\n      modalObj.modalStack.push(function () {\n        modal.openModal(modalObj, cb);\n      });\n      return;\n    }\n\n    var isPopup = modalObj.hasClass('ipu-popup');\n    var isLoginScreen = modalObj.hasClass('ipu-login-screen');\n    var isPickerModal = modalObj.hasClass('ipu-picker-modal');\n    var isToast = modalObj.hasClass('ipu-toast');\n\n    if (isModal) {\n      modalObj.show();\n      modalObj.css({\n        marginTop: -Math.round(modalObj.outerHeight() / 2) + 'px'\n      });\n    }\n\n    if (isToast) {\n      modalObj.css({\n        marginLeft: -Math.round(modalObj.outerWidth() / 2) + 'px' //1.185 是初始化时候的放大效果\n      });\n    }\n\n    var overlay;\n    if (!isLoginScreen && !isPickerModal && !isToast) {\n      if ($('.ipu-modal-overlay').length === 0 && !isPopup) {\n        $(defaults.modalContainer).append('<div class=\"ipu-modal-overlay\"></div>');\n      }\n      if ($('.ipu-popup-overlay').length === 0 && isPopup) {\n        $(defaults.modalContainer).append('<div class=\"ipu-popup-overlay\"></div>');\n      }\n      overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-modal-overlay');\n    }\n\n    //Make sure that styles are applied, trigger relayout;\n    var clientLeft = modalObj[0].clientLeft;\n\n    // Trugger open event\n    modalObj.trigger('open');\n\n    // Picker modal body class\n    if (isPickerModal) {\n      $(defaults.modalContainer).addClass('ipu-with-picker-modal');\n    }\n\n    // Classes for transition in\n    if (!isLoginScreen && !isPickerModal && !isToast) {\n      overlay.addClass('ipu-modal-overlay-visible');\n    }\n    modalObj.removeClass('ipu-modal-out').addClass('ipu-modal-in').transitionEnd(function (e) {\n      if (modalObj.hasClass('ipu-modal-out')) modalObj.trigger('closed');\n      else modalObj.trigger('opened');\n    });\n    // excute callback\n    if (typeof cb === 'function') {\n      cb.call(this);\n    }\n    return true;\n  };\n\n  modal.closeModal = function (modalObj) {\n    modalObj = $(modalObj || '.ipu-modal-in');\n    if (typeof modalObj !== 'undefined' && modalObj.length === 0) {\n      return;\n    }\n    var isModal = modalObj.hasClass('ipu-modal'),\n      isPopup = modalObj.hasClass('ipu-popup'),\n      isToast = modalObj.hasClass('ipu-toast'),\n      isLoginScreen = modalObj.hasClass('ipu-login-screen'),\n      isPickerModal = modalObj.hasClass('ipu-picker-modal'),\n      removeOnClose = modalObj.hasClass('ipu-remove-on-close'),\n      overlay = isPopup ? $('.ipu-popup-overlay') : $('.ipu-modal-overlay');\n    if (isPopup) {\n      if (modalObj.length === $('.ipu-popup.ipu-modal-in').length) {\n        overlay.removeClass('ipu-modal-overlay-visible');\n      }\n    }\n    else if (!(isPickerModal || isToast)) {\n      overlay.removeClass('ipu-modal-overlay-visible');\n    }\n    modalObj.trigger('close');\n\n    // Picker modal body class\n    if (isPickerModal) {\n      $(defaults.modalContainer).removeClass('ipu-with-picker-modal');\n      $(defaults.modalContainer).addClass('ipu-picker-modal-closing');\n    }\n\n    modalObj.removeClass('ipu-modal-in').addClass('ipu-modal-out').transitionEnd(function (e) {\n      if (modalObj.hasClass('ipu-modal-out')) modalObj.trigger('closed');\n      else modalObj.trigger('opened');\n\n      if (isPickerModal) {\n        $(defaults.modalContainer).removeClass('ipu-picker-modal-closing');\n      }\n      if (isPopup || isLoginScreen || isPickerModal) {\n        modalObj.removeClass('ipu-modal-out').hide();\n        if (removeOnClose && modalObj.length > 0) {\n          modalObj.remove();\n        }\n      }\n      else {\n        modalObj.remove();\n      }\n    });\n    if (isModal && defaults.modalStack) {\n      modal.modalStackClearQueue();\n    }\n\n    return true;\n  };\n\n  function handleClicks(e) {\n    /*jshint validthis:true */\n    var clicked = $(this);\n    var url = clicked.attr('href');\n\n\n    //Collect Clicked data- attributes\n    /* var clickedData = clicked.dataset();\n\n     // Popup\n     var popup;\n     if (clicked.hasClass('ipu-open-popup')) {\n     if (clickedData.popup) {\n     popup = clickedData.popup;\n     }\n     else popup = '.ipu-popup';\n     ipu.popup(popup);\n     }\n     if (clicked.hasClass('ipu-close-popup')) {\n     if (clickedData.popup) {\n     popup = clickedData.popup;\n     }\n     else popup = '.ipu-popup.modal-in';\n     ipu.closeModal(popup);\n     }*/\n\n    // Close Modal\n    if (clicked.hasClass('ipu-modal-overlay')) {\n      if ($('.ipu-modal.ipu-modal-in').length > 0 && defaults.modalCloseByOutside)\n        modal.closeModal('.ipu-modal.ipu-modal-in');\n      if ($('.ipu-actions-modal.ipu-modal-in').length > 0 && defaults.actionsCloseByOutside)\n        modal.closeModal('.ipu-actions-modal.ipu-modal-in');\n\n    }\n    if (clicked.hasClass('ipu-popup-overlay')) {\n      if ($('.ipu-popup.ipu-modal-in').length > 0 && defaults.popupCloseByOutside)\n        modal.closeModal('.ipu-popup.modal-in');\n    }\n  }\n\n  $.extend(ipuUI, modal);\n\n\n  $(document).on('click', ' .ipu-modal-overlay, .ipu-popup-overlay, .ipu-close-popup, .ipu-open-popup, .ipu-close-picker', handleClicks);\n})(ipuUI || window, jQuery);\n\n(function (ipuUI, $) {\r\n  /**\r\n   * @class 导航切换组件\r\n   *\r\n   *      @example\r\n   *\r\n   *      <!-- 组件的html分成导航和内容两部分,一般与flex栅格配合布局-->\r\n   *\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   * @constructor  不能直接访问该类,调用{@link ipu#navBar ipuUI.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 ipuUI\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  ipuUI.navBar = function (slt, option) {\r\n    return new NavBar(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n\n(function (ipuUI, $) {\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 {Number} defaultOption.pageMax=''  保留的最大页面数,大于2\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    pageMax: 8,        // 允许的最大打开页面数\r\n    callBack: function () { // 事件回调       方法:open post close back\r\n    }\r\n  };\r\n\r\n  // 新增限制最大页面数\r\n  page.limitPages = function () {\r\n    var pageMax = this.defaultOption.pageMax - 2; //\r\n    $(\".ipu-page.ipu-show\").prevAll(\".ipu-page:gt(\" + pageMax + \")\").remove();\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      ipuUI.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        ipuUI.hidePreloader();\r\n      }\r\n\r\n      if (option.animate) {\r\n        console.log(\"--\" + nowPageNo);\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      page.limitPages();\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.ipuUI.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.ipuUI.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.ipuUI.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.ipuUI.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  ipuUI.page = page;\r\n})(ipuUI || window, jQuery);\r\n\n// picker\r\n(function (ipuUI, $, 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 (ipuUI.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  ipuUI.Picker = Picker;\r\n\r\n})(ipuUI || window, jQuery, Hammer);\r\n\n// popPicker\r\n(function (ipuUI, $) {\r\n  var Picker = ipuUI.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   *      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 ipuUI.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 = ipuUI.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 ipuUI\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  ipuUI.popPicker = function (option) {\r\n    return new PopPicker(option);\r\n  };\r\n\r\n})(ipuUI || window, jQuery);\r\n\n(function (ipuUI, $) {\r\n\r\n  /**\r\n   * @class\r\n   * 进度条\r\n   *\r\n   *      @example\r\n   *       <!-- 组件html -->\r\n   *       <div class=\"ipu-progress \">\r\n   *         <span class=\"ipu-progressbar\"></span>\r\n   *       </div>\r\n   *\r\n   *\r\n   * @constructor  不能直接访问该类,调用 {@link ipuUI#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 ipuUI\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  ipuUI.progressBar = function (slt, option) {\r\n    return new ProgressBar(slt, option);\r\n  };\r\n})(ipuUI || window, jQuery);\r\n\n// 设置上下条件长度,或计算函数\r\n// 处理resize的问题,用户主动调用refresh??\r\n// 底部启用或停用时,应该刷新组件iscroll高度\r\n// 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n(function (ipuUI, $, 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  不能直接访问该类,调用ipuUI.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   *\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 ipuUI\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  ipuUI.refresh = function (slt, optoins) {\r\n    return new Refresh(slt, optoins);\r\n  };\r\n\r\n})(ipuUI || window, jQuery, iScroll);\r\n\n// Tab\r\n(function (ipuUI, $) {\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>自定义内容</li>\r\n   *            <li class=\"\">选项2内容</li>\r\n   *            <li class=\"\">选项3内容</li>\r\n   *            <li class=\"\">选项4内容</li>\r\n   *          </ul>\r\n   *        </div>\r\n   *      </div>\r\n   *\r\n   *\r\n   * @constructor  不能直接访问该类,调用ipuUI.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   * 显示第几项内容\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  ipuUI.tab = function (slt, option) {\r\n    return new Tab(slt, option);\r\n  };\r\n})(ipuUI || 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 ipuUI;\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.ipuUI = setup(jQuery, iScroll, Hammer, FastClick);\r\n    });\r\n  } else {\r\n    window.ipuUI = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n  }\r\n\r\n})();\r\n\r\n//# sourceMappingURL=ipuUI.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 Mon 10 Sep 2018 15:12:47 by <a href='https://github.com/senchalabs/jsduck'>JSDuck</a> 5.3.4.</div>
64
  <div id='footer-content' style='display: none'>Generated on Tue 11 Sep 2018 10:50:36 by <a href='https://github.com/senchalabs/jsduck'>JSDuck</a> 5.3.4.</div>
65 65
66 66
  
67 67

+ 8 - 8
ipuui/docs/source/ipuUI.html

@ -1816,7 +1816,7 @@
1816 1816
   * @param {Function} actions.Object.onClick 点击时回调函数
1817 1817
   */
1818 1818
  modal.actions = function (params) {
1819
    var modal, groupSelector, buttonSelector;
1819
    var modalObj, groupSelector, buttonSelector;
1820 1820
    params = params || [];
1821 1821
1822 1822
    if (params.length &gt; 0 &amp;&amp; !$.isArray(params[0])) {
@ -1839,12 +1839,12 @@
1839 1839
    }
1840 1840
    modalHTML = &#39;&lt;div class=&quot;ipu-actions-modal&quot;&gt;&#39; + buttonsHTML + &#39;&lt;/div&gt;&#39;;
1841 1841
    _modalTemplateTempDiv.innerHTML = modalHTML;
1842
    modal = $(_modalTemplateTempDiv).children();
1843
    $(defaults.modalContainer).append(modal[0]);
1842
    modalObj = $(_modalTemplateTempDiv).children();
1843
    $(defaults.modalContainer).append(modalObj[0]);
1844 1844
    groupSelector = &#39;.ipu-actions-modal-group&#39;;
1845 1845
    buttonSelector = &#39;.ipu-actions-modal-button&#39;;
1846 1846
1847
    var groups = modal.find(groupSelector);
1847
    var groups = modalObj.find(groupSelector);
1848 1848
    groups.each(function (index, el) {
1849 1849
      var groupIndex = index;
1850 1850
      $(el).children().each(function (index, el) {
@ -1856,14 +1856,14 @@
1856 1856
1857 1857
        if (clickTarget) {
1858 1858
          clickTarget.on(&#39;click&#39;, function (e) {
1859
            if (buttonParams.close !== false) modal.closeModal(modal);
1860
            if (buttonParams.onClick) buttonParams.onClick(modal, e);
1859
            if (buttonParams.close !== false) modal.closeModal(modalObj);
1860
            if (buttonParams.onClick) buttonParams.onClick(modalObj, e);
1861 1861
          });
1862 1862
        }
1863 1863
      });
1864 1864
    });
1865
    modal.openModal(modal);
1866
    return modal[0];
1865
    modal.openModal(modalObj);
1866
    return modalObj[0];
1867 1867
  };
1868 1868
1869 1869
  //显示一个消息,会在2秒钟后自动消失

+ 8 - 8
ipuui/src/js/modal.js

@ -249,7 +249,7 @@
249 249
   * @param {Function} actions.Object.onClick 点击时回调函数
250 250
   */
251 251
  modal.actions = function (params) {
252
    var modal, groupSelector, buttonSelector;
252
    var modalObj, groupSelector, buttonSelector;
253 253
    params = params || [];
254 254
255 255
    if (params.length > 0 && !$.isArray(params[0])) {
@ -272,12 +272,12 @@
272 272
    }
273 273
    modalHTML = '<div class="ipu-actions-modal">' + buttonsHTML + '</div>';
274 274
    _modalTemplateTempDiv.innerHTML = modalHTML;
275
    modal = $(_modalTemplateTempDiv).children();
276
    $(defaults.modalContainer).append(modal[0]);
275
    modalObj = $(_modalTemplateTempDiv).children();
276
    $(defaults.modalContainer).append(modalObj[0]);
277 277
    groupSelector = '.ipu-actions-modal-group';
278 278
    buttonSelector = '.ipu-actions-modal-button';
279 279
280
    var groups = modal.find(groupSelector);
280
    var groups = modalObj.find(groupSelector);
281 281
    groups.each(function (index, el) {
282 282
      var groupIndex = index;
283 283
      $(el).children().each(function (index, el) {
@ -289,14 +289,14 @@
289 289
290 290
        if (clickTarget) {
291 291
          clickTarget.on('click', function (e) {
292
            if (buttonParams.close !== false) modal.closeModal(modal);
293
            if (buttonParams.onClick) buttonParams.onClick(modal, e);
292
            if (buttonParams.close !== false) modal.closeModal(modalObj);
293
            if (buttonParams.onClick) buttonParams.onClick(modalObj, e);
294 294
          });
295 295
        }
296 296
      });
297 297
    });
298
    modal.openModal(modal);
299
    return modal[0];
298
    modal.openModal(modalObj);
299
    return modalObj[0];
300 300
  };
301 301
302 302
  //显示一个消息,会在2秒钟后自动消失