dtpicker_wev8.js
17.2 KB
!function(e,t,i,n){var s=navigator.platform.toLowerCase(),a=navigator.userAgent.toLowerCase(),r=(-1<a.indexOf("iphone")||-1<a.indexOf("ipad")||-1<a.indexOf("ipod"))&&(-1<s.indexOf("iphone")||-1<s.indexOf("ipad")||-1<s.indexOf("ipod")),c=e.Picker=function(e,t){var i=this;i.holder=e,i.options=t||{},i.init(),i.initInertiaParams(),i.calcElementItemPostion(!0),i.bindEvent()};c.prototype.findElementItems=function(){var e=this;return e.elementItems=[].slice.call(e.holder.querySelectorAll("li")),e.elementItems},c.prototype.init=function(){var e=this;e.list=e.holder.querySelector("ul"),e.findElementItems(),e.height=e.holder.offsetHeight,e.r=e.height/2-10,e.d=2*e.r,e.itemHeight=0<e.elementItems.length?e.elementItems[0].offsetHeight:40,e.itemAngle=parseInt(e.calcAngle(.8*e.itemHeight)),e.hightlightRange=e.itemAngle/2,e.visibleRange=90,e.beginAngle=0,e.beginExceed=e.beginAngle-30,e.list.angle=e.beginAngle,r&&(e.list.style.webkitTransformOrigin="center center "+e.r+"px")},c.prototype.calcElementItemPostion=function(n){var s=this;n&&(s.items=[]),s.elementItems.forEach(function(e){var t=s.elementItems.indexOf(e);if(s.endAngle=s.itemAngle*t,e.angle=s.endAngle,e.style.webkitTransformOrigin="center center -"+s.r+"px",e.style.webkitTransform="translateZ("+s.r+"px) rotateX("+-s.endAngle+"deg)",n){var i={};i.text=e.innerHTML||"",i.value=e.getAttribute("data-value")||i.text,s.items.push(i)}}),s.endExceed=s.endAngle+30,s.calcElementItemVisibility(s.beginAngle)},c.prototype.calcAngle=function(e){var t=this,i=b=parseFloat(t.r);e=Math.abs(e);var n=180*parseInt(e/t.d);e%=t.d;var s=(i*i+b*b-e*e)/(2*i*b);return n+Math.acos(s)/(Math.PI/180)},c.prototype.calcElementItemVisibility=function(i){var n=this;n.elementItems.forEach(function(e){var t=Math.abs(e.angle-i);t<n.hightlightRange?e.classList.add("highlight"):t<n.visibleRange?(e.classList.add("visible"),e.classList.remove("highlight")):(e.classList.remove("highlight"),e.classList.remove("visible"))})},c.prototype.setAngle=function(e){var t=this;t.list.angle=e,t.list.style.webkitTransform="perspective(1000px) rotateY(0deg) rotateX("+e+"deg)",t.calcElementItemVisibility(e)},c.prototype.bindEvent=function(){var s=this,a=0,r=null,c=!1;s.holder.addEventListener("touchstart",function(e){c=!0,e.preventDefault(),s.list.style.webkitTransition="",r=(e.changedTouches?e.changedTouches[0]:e).pageY,a=s.list.angle,s.updateInertiaParams(e,!0)},!1),s.holder.addEventListener("touchend",function(e){c=!1,e.preventDefault(),s.startInertiaScroll(e)},!1),s.holder.addEventListener("touchcancel",function(e){c=!1,e.preventDefault(),s.startInertiaScroll(e)},!1),s.holder.addEventListener("touchmove",function(e){if(c){e.preventDefault();var t=(e.changedTouches?e.changedTouches[0]:e).pageY-r,i=s.calcAngle(t),n=0<t?a-i:a+i;n>s.endExceed&&(n=s.endExceed),n<s.beginExceed&&(n=s.beginExceed),s.setAngle(n),s.updateInertiaParams(e)}},!1),s.list.addEventListener("click",function(e){elementItem=e.target,"LI"==elementItem.tagName&&s.setSelectedIndex(s.elementItems.indexOf(elementItem),200)},!1)},c.prototype.initInertiaParams=function(){var e=this;e.lastMoveTime=0,e.lastMoveStart=0,e.stopInertiaMove=!1},c.prototype.updateInertiaParams=function(e,t){var i=this,n=e.changedTouches?e.changedTouches[0]:e;if(t)i.lastMoveStart=n.pageY,i.lastMoveTime=e.timeStamp||Date.now(),i.startAngle=i.list.angle;else{var s=e.timeStamp||Date.now();300<s-i.lastMoveTime&&(i.lastMoveTime=s,i.lastMoveStart=n.pageY)}i.stopInertiaMove=!0},c.prototype.startInertiaScroll=function(e){var t=this,i=e.changedTouches?e.changedTouches[0]:e,n=e.timeStamp||Date.now(),s=(i.pageY-t.lastMoveStart)/(n-t.lastMoveTime),a=0<s?-1:1,r=6e-4*a*-1,c=Math.abs(s/r),l=s*c/2,o=t.list.angle,u=t.calcAngle(l)*a,d=u;o+u<t.beginExceed&&(c=c*((u=t.beginExceed-o)/d)*.6),o+u>t.endExceed&&(c=c*((u=t.endExceed-o)/d)*.6),0!=u?t.scrollDistAngle(n,o,u,c):t.endScroll()},c.prototype.scrollDistAngle=function(e,t,i,n){var s,a,r,c,l=this;l.stopInertiaMove=!1,s=t,a=i,r=n/13,c=0,function e(){if(!l.stopInertiaMove){var t=l.quartEaseOut(c,s,a,r);l.setAngle(t),r-1<++c||t<l.beginExceed||t>l.endExceed?l.endScroll():setTimeout(e,13)}}()},c.prototype.quartEaseOut=function(e,t,i,n){return-i*((e=e/n-1)*e*e*e-1)+t},c.prototype.endScroll=function(){var e=this;if(e.list.angle<e.beginAngle)e.list.style.webkitTransition="150ms ease-out",e.setAngle(e.beginAngle);else if(e.list.angle>e.endAngle)e.list.style.webkitTransition="150ms ease-out",e.setAngle(e.endAngle);else{var t=parseInt((e.list.angle/e.itemAngle).toFixed(0));e.list.style.webkitTransition="100ms ease-out",e.setAngle(e.itemAngle*t)}e.triggerChange()};c.prototype.triggerChange=function(a){var r=this;setTimeout(function(){var e,t,i,n=r.getSelectedIndex(),s=r.items[n];n==r.lastIndex&&!0!==a||(e=r.holder,t="change",i={index:n,item:s},e.dispatchEvent(new CustomEvent(t,{detail:i,bubbles:!0,cancelable:!0}))),r.lastIndex=n,"function"==typeof a&&a()},0)},c.prototype.correctAngle=function(e){return e<this.beginAngle?this.beginAngle:e>this.endAngle?this.endAngle:e},c.prototype.setItems=function(e){var t=this;t.items=e||[];var i=[];t.items.forEach(function(e){null!==e&&e!==n&&i.push("<li>"+(e.text||e)+"</li>")}),t.list.innerHTML=i.join(""),t.findElementItems(),t.calcElementItemPostion(),t.setAngle(t.correctAngle(t.list.angle)),t.triggerChange(!0)},c.prototype.getItems=function(){return this.items},c.prototype.getSelectedIndex=function(){return parseInt((this.list.angle/this.itemAngle).toFixed(0))},c.prototype.setSelectedIndex=function(e,t,i){var n=this;n.list.style.webkitTransition="";var s=n.correctAngle(n.itemAngle*e);if(t&&0<t){var a=s-n.list.angle;n.scrollDistAngle(Date.now(),n.list.angle,a,t)}else n.setAngle(s);n.triggerChange(i)},c.prototype.getSelectedItem=function(){return this.items[this.getSelectedIndex()]},c.prototype.getSelectedValue=function(){return(this.items[this.getSelectedIndex()]||{}).value},c.prototype.getSelectedText=function(){return(this.items[this.getSelectedIndex()]||{}).text},c.prototype.setSelectedValue=function(e,t,i){for(var n in this.items){if(this.items[n].value==e)return void this.setSelectedIndex(n,t,i)}},e.fn.picker=function(s){return this.each(function(e,t){if(!t.picker)if(s)t.picker=new c(t,s);else{var i=t.getAttribute("data-picker-options"),n=i?JSON.parse(i):{};t.picker=new c(t,n)}}),this[0]?this[0].picker:null}}(Zepto,window,document,void 0),function(a,r){var c="",e={7:{year:"年",month:"月",day:"日",hour:"时",minute:"分",second:"秒",ensure:"确定",cancel:"取消"},8:{year:"Year",month:"Month",day:"Day",hour:"Hour",minute:"Min",second:"Sec",ensure:"Sure",cancel:"Cancel"},9:{year:"年",month:"月",day:"日",hour:"時",minute:"分",second:"秒",ensure:"確定",cancel:"取消"}},t=require("mUtil").getUserLanguage(),l=e[t];l||(l=e[t]);var o='<div class="wev-dtpicker" data-type="datetime">\t\t<div class="wev-dtpicker-header">\t\t\t<button data-id="btn-cancel" class="wev-btn">'+l.cancel+'</button>\t\t\t<button data-id="btn-ok" class="wev-btn wev-btn-blue">'+l.ensure+'</button>\t\t</div>\t\t<div class="wev-dtpicker-title"><h5 data-id="title-y">'+l.year+'</h5><h5 data-id="title-m">'+l.month+'</h5><h5 data-id="title-d">'+l.day+'</h5><h5 data-id="title-h">'+l.hour+'</h5><h5 data-id="title-i">'+l.minute+'</h5><h5 data-id="title-s">'+l.second+'</h5></div>\t\t<div class="wev-dtpicker-body">\t\t\t<div data-id="picker-y" class="wev-picker">\t\t\t\t<div class="wev-picker-inner">\t\t\t\t\t<div class="wev-pciker-rule wev-pciker-rule-ft"></div>\t\t\t\t\t<ul class="wev-pciker-list">\t\t\t\t\t</ul>\t\t\t\t\t<div class="wev-pciker-rule wev-pciker-rule-bg"></div>\t\t\t\t</div>\t\t\t</div>\t\t\t<div data-id="picker-m" class="wev-picker">\t\t\t\t<div class="wev-picker-inner">\t\t\t\t\t<div class="wev-pciker-rule wev-pciker-rule-ft"></div>\t\t\t\t\t<ul class="wev-pciker-list">\t\t\t\t\t</ul>\t\t\t\t\t<div class="wev-pciker-rule wev-pciker-rule-bg"></div>\t\t\t\t</div>\t\t\t</div>\t\t\t<div data-id="picker-d" class="wev-picker">\t\t\t\t<div class="wev-picker-inner">\t\t\t\t\t<div class="wev-pciker-rule wev-pciker-rule-ft"></div>\t\t\t\t\t<ul class="wev-pciker-list">\t\t\t\t\t</ul>\t\t\t\t\t<div class="wev-pciker-rule wev-pciker-rule-bg"></div>\t\t\t\t</div>\t\t\t</div>\t\t\t<div data-id="picker-h" class="wev-picker">\t\t\t\t<div class="wev-picker-inner">\t\t\t\t\t<div class="wev-pciker-rule wev-pciker-rule-ft"></div>\t\t\t\t\t<ul class="wev-pciker-list">\t\t\t\t\t</ul>\t\t\t\t\t<div class="wev-pciker-rule wev-pciker-rule-bg"></div>\t\t\t\t</div>\t\t\t</div>\t\t\t<div data-id="picker-i" class="wev-picker">\t\t\t\t<div class="wev-picker-inner">\t\t\t\t\t<div class="wev-pciker-rule wev-pciker-rule-ft"></div>\t\t\t\t\t<ul class="wev-pciker-list">\t\t\t\t\t</ul>\t\t\t\t\t<div class="wev-pciker-rule wev-pciker-rule-bg"></div>\t\t\t\t</div>\t\t\t</div>\t\t\t<div data-id="picker-s" class="wev-picker"> <div class="wev-picker-inner"> <div class="wev-pciker-rule wev-pciker-rule-ft"></div> <ul class="wev-pciker-list"> </ul> <div class="wev-pciker-rule wev-pciker-rule-bg"></div> </div> </div>\t\t</div>\t</div>',u=!1,d=/xyz/.test(function(){xyz})?/\b_super\b/:/.*/,i=function(){};i.extend=function(e){var s=this.prototype;u=!0;var t=new this;for(var i in u=!1,e)t[i]="function"==typeof e[i]&&"function"==typeof s[i]&&d.test(e[i])?function(i,n){return function(){var e=this._super;this._super=s[i];var t=n.apply(this,arguments);return this._super=e,t}}(i,e[i]):e[i];function n(){!u&&this.init&&this.init.apply(this,arguments)}return((n.prototype=t).constructor=n).extend=arguments.callee,n};var n=function(e){return"wev-"+e};a.DtPicker=i.extend({init:function(e){var t,i=this,n=(t=o,"string"!=typeof t?t instanceof Array||t[0]&&t.length?[].slice.call(t):[t]:(c||(c=r.createElement("div")),c.innerHTML=t,[].slice.call(c.childNodes)))[0];r.body.appendChild(n),a('[data-id*="picker"]',n).picker();var s=i.ui={picker:n,mask:function(e){var t=r.createElement("div");t.classList.add("wev-backdrop"),t.addEventListener("touchmove",function(e){e.preventDefault()}),t.addEventListener("click",function(){i.close()});var i=[t];return i._show=!1,i.show=function(){return i._show=!0,t.setAttribute("style","opacity:1"),r.body.appendChild(t),i},i._remove=function(){return i._show&&(i._show=!1,t.setAttribute("style","opacity:0"),setTimeout(function(){var e=r.body;t.parentNode===e&&e.removeChild(t)},350)),i},i.close=function(){e?!1!==e()&&i._remove():i._remove()},i}(),ok:a('[data-id="btn-ok"]',n)[0],cancel:a('[data-id="btn-cancel"]',n)[0],y:a('[data-id="picker-y"]',n)[0],m:a('[data-id="picker-m"]',n)[0],d:a('[data-id="picker-d"]',n)[0],h:a('[data-id="picker-h"]',n)[0],i:a('[data-id="picker-i"]',n)[0],s:a('[data-id="picker-s"]',n)[0],labels:a('[data-id*="title-"]',n)};s.cancel.addEventListener("click",function(){i.hide()},!1),s.ok.addEventListener("click",function(){!1!==i.callback(i.getSelected())&&i.hide()},!1),s.y.addEventListener("change",function(e){i.options.beginMonth||i.options.endMonth?i._createMonth():i._createDay()},!1),s.m.addEventListener("change",function(e){i._createDay()},!1),s.d.addEventListener("change",function(e){(i.options.beginMonth||i.options.endMonth)&&i._createHours()},!1),s.h.addEventListener("change",function(e){(i.options.beginMonth||i.options.endMonth)&&i._createMinutes()},!1),s.mask[0].addEventListener("click",function(){i.hide()},!1),i._create(e),i.ui.picker.addEventListener("touchmove",function(e){e.preventDefault()},!1)},getSelected:function(){var e=this.ui,t=this.options.type,i={type:t,y:e.y.picker.getSelectedItem(),m:e.m.picker.getSelectedItem(),d:e.d.picker.getSelectedItem(),h:e.h.picker.getSelectedItem(),i:e.i.picker.getSelectedItem(),s:e.s.picker.getSelectedItem(),toString:function(){return this.value}};switch(t){case"datetime":i.value=i.y.value+"-"+i.m.value+"-"+i.d.value+" "+i.h.value+":"+i.i.value+":"+i.s.value,i.text=i.y.text+"-"+i.m.text+"-"+i.d.text+" "+i.h.text+":"+i.i.text+":"+i.s.text;break;case"date":i.value=i.y.value+"-"+i.m.value+"-"+i.d.value,i.text=i.y.text+"-"+i.m.text+"-"+i.d.text;break;case"time":i.value=i.h.value+":"+i.i.value,i.text=i.h.text+":"+i.i.text;break;case"month":i.value=i.y.value+"-"+i.m.value,i.text=i.y.text+"-"+i.m.text;break;case"hour":i.value=i.y.value+"-"+i.m.value+"-"+i.d.value+" "+i.h.value,i.text=i.y.text+"-"+i.m.text+"-"+i.d.text+" "+i.h.text}return i},setSelectedValue:function(e){var t=this.ui,i=this._parseValue(e);t.y.picker.setSelectedValue(i.y,0,function(){t.m.picker.setSelectedValue(i.m,0,function(){t.d.picker.setSelectedValue(i.d,0,function(){t.h.picker.setSelectedValue(i.h,0,function(){t.i.picker.setSelectedValue(i.i,0,function(){t.s.picker.setSelectedValue(i.s,0)})})})})})},isLeapYear:function(e){return e%4==0&&e%100!=0||e%400==0},_inArray:function(e,t){for(var i in e){if(e[i]===t)return!0}return!1},getDayNum:function(e,t){return this._inArray([1,3,5,7,8,10,12],t)?31:this._inArray([4,6,9,11],t)?30:this.isLeapYear(e)?29:28},_fill:function(e){return(e=e.toString()).length<2&&(e=0+e),e},_isBeginYear:function(){return this.options.beginYear===parseInt(this.ui.y.picker.getSelectedValue())},_isBeginMonth:function(){return this.options.beginMonth&&this._isBeginYear()&&this.options.beginMonth===parseInt(this.ui.m.picker.getSelectedValue())},_isBeginDay:function(){return this._isBeginMonth()&&this.options.beginDay===parseInt(this.ui.d.picker.getSelectedValue())},_isBeginHours:function(){return this._isBeginDay()&&this.options.beginHours===parseInt(this.ui.h.picker.getSelectedValue())},_isEndYear:function(){return this.options.endYear===parseInt(this.ui.y.picker.getSelectedValue())},_isEndMonth:function(){return this.options.endMonth&&this._isEndYear()&&this.options.endMonth===parseInt(this.ui.m.picker.getSelectedValue())},_isEndDay:function(){return this._isEndMonth()&&this.options.endDay===parseInt(this.ui.d.picker.getSelectedValue())},_isEndHours:function(){return this._isEndDay()&&this.options.endHours===parseInt(this.ui.h.picker.getSelectedValue())},_createYear:function(e){var t=this.options,i=this.ui,n=[];if(t.customData.y)n=t.customData.y;else for(var s=t.beginYear,a=t.endYear,r=s;r<=a;r++)n.push({text:r+"",value:r});i.y.picker.setItems(n)},_createMonth:function(e){var t=this,i=t.options,n=t.ui,s=[];if(i.customData.m)s=i.customData.m;else for(var a=i.beginMonth&&t._isBeginYear()?i.beginMonth:1,r=i.endMonth&&t._isEndYear()?i.endMonth:12;a<=r;a++){var c=t._fill(a);s.push({text:c,value:c})}n.m.picker.setItems(s)},_createDay:function(e){var t=this,i=t.options,n=t.ui,s=[];if(i.customData.d)s=i.customData.d;else for(var a=t._isBeginMonth()?i.beginDay:1,r=t._isEndMonth()?i.endDay:t.getDayNum(parseInt(this.ui.y.picker.getSelectedValue()),parseInt(this.ui.m.picker.getSelectedValue()));a<=r;a++){var c=t._fill(a);s.push({text:c,value:c})}n.d.picker.setItems(s),e=e||n.d.picker.getSelectedValue()},_createHours:function(e){var t=this,i=t.options,n=t.ui,s=[];if(i.customData.h)s=i.customData.h;else for(var a=t._isBeginDay()?i.beginHours:0,r=t._isEndDay()?i.endHours:23;a<=r;a++){var c=t._fill(a);s.push({text:c,value:c})}n.h.picker.setItems(s)},_createMinutes:function(e){var t=this,i=t.options,n=t.ui,s=[];if(i.customData.i)s=i.customData.i;else for(var a=t._isBeginHours()?i.beginMinutes:0,r=t._isEndHours()?i.endMinutes:59;a<=r;a++){var c=t._fill(a);s.push({text:c,value:c})}n.i.picker.setItems(s)},_createSeconds:function(e){var t=this.options,i=this.ui,n=[];if(t.customData.s)n=t.customData.s;else for(var s=0;s<=59;s++){var a=this._fill(s);n.push({text:a,value:a})}i.s.picker.setItems(n)},_setLabels:function(){var i=this.options;this.ui.labels.each(function(e,t){t.innerText=i.labels[e]})},_setButtons:function(){var e=this.options,t=this.ui;t.cancel.innerText=e.buttons[0],t.ok.innerText=e.buttons[1]},_parseValue:function(e){var t=new Date,i={y:t.getFullYear(),m:t.getMonth()+1,d:t.getDate(),h:t.getHours(),i:t.getMinutes(),s:t.getSeconds()};if(!e)return i;var n=e.replace(/:/g,"-").replace(" ","-").split("-"),s={y:n[0],m:n[1],d:n[2],h:n[3],i:n[4],s:n[5]};return"time"==this.options.type&&2==n.length?(i.h=n[0],i.i=n[1]):i=s,i},_create:function(e){var t=this;(e=e||{}).labels=e.labels||[l.year,l.month,l.day,l.hour,l.minute,l.second],e.buttons=e.buttons||[l.cancel,l.ensure],e.type=e.type||"datetime",e.customData=e.customData||{},t.options=e;var i=new Date,n=e.beginDate;n instanceof Date&&!isNaN(n.valueOf())&&(e.beginYear=n.getFullYear(),e.beginMonth=n.getMonth()+1,e.beginDay=n.getDate(),e.beginHours=n.getHours(),e.beginMinutes=n.getMinutes());var s=e.endDate;s instanceof Date&&!isNaN(s.valueOf())&&(e.endYear=s.getFullYear(),e.endMonth=s.getMonth()+1,e.endDay=s.getDate(),e.endHours=s.getHours(),e.endMinutes=s.getMinutes()),e.beginYear=e.beginYear||i.getFullYear()-5,e.endYear=e.endYear||i.getFullYear()+5;var a=t.ui;t._setLabels(),t._setButtons(),a.picker.setAttribute("data-type",e.type),t._createYear(),t._createMonth(),t._createDay(),t._createHours(),t._createMinutes(),t._createSeconds(),t.setSelectedValue(e.value)},show:function(e){var t=this.ui;this.callback=e||function(){},t.mask.show(),r.body.classList.add(n("dtpicker-active-for-page")),t.picker.classList.add(n("active"))},hide:function(){if(!this.disposed){var e=this.ui;e.picker.classList.remove(n("active")),e.mask.close(),r.body.classList.remove(n("dtpicker-active-for-page")),this.options.close&&this.options.close()}},dispose:function(){var t=this;t.hide(),setTimeout(function(){for(var e in t.ui.picker.parentNode.removeChild(t.ui.picker),t)t[e]=null,delete t[e];t.disposed=!0},300),t.options.close&&t.options.close()}})}(Zepto,document);