isu-elements
Version:
Polymer components for building web apps.
939 lines (923 loc) • 84.3 kB
JavaScript
/**
@Name : jeDate v6.5.0 日期控件
@Author: chen guojun
@Date: 2018-04-30
@QQ群:516754269
@官网:http://www.jemui.com/ 或 https://github.com/singod/jeDate
*/
;(function(window, factory) {
//amd
if (typeof define === 'function' && define.amd) {
define(factory);
} else if (typeof exports === 'object') { //umd
module.exports = factory();
} else {
window.jeDate = factory();
}
})(window, function() {
var doc = document, win = window;
var jet = {}, doc = document, regymdzz = "YYYY|MM|DD|hh|mm|ss|zz", gr = /\-/g,
regymd = "YYYY|MM|DD|hh|mm|ss|zz".replace("|zz",""), parseInt = function (n) { return window.parseInt(n, 10);};
var $Q = function (selector,content) {
content = content || document;
return selector.nodeType ? selector : content.querySelector(selector);
};
var jeDate = function(elem,options){
var opts = typeof (options) === "function" ? options() : options;
return new jeDatePick(elem,opts);
};
//日期控件版本
jeDate.dateVer = "V6.5.0";
//用一个或多个其他对象来扩展一个对象,返回被扩展的对象
jeDate.extend = jet.extend = function () {
var options, name, src, copy,deep = false, target = arguments[0], i = 1, length = arguments.length;
if (typeof (target) === "boolean") deep = target, target = arguments[1] || {}, i = 2;
if (typeof (target) !== "object" && typeof (target) !== "function") target = {};
if (length === i) target = this, --i;
for (; i < length; i++) {
if ((options = arguments[i]) != null) {
for (name in options) {
src = target[name], copy = options[name];
if (target === copy) continue;
if (copy !== undefined) target[name] = copy;
}
}
}
return target;
};
//返回指定日期
jeDate.nowDate = function (val,format) {
format = format || 'YYYY-MM-DD hh:mm:ss';
if (!isNaN(val)) val = {DD: val};
return jet.parse(jet.getDateTime(val),format);
};
//日期转换
jeDate.convert = function (obj) {
obj.format = obj.format || 'YYYY-MM-DD hh:mm:ss';
obj.addval = obj.addval || [];
var mats = jet.reMatch(obj.format),objVal = {};
jet.each(jet.reMatch(obj.val),function (i,cval) {
objVal[mats[i]] = parseInt(cval);
});
var result = new DateTime(obj.addval,objVal), redate = {
YYYY:result.GetYear(), MM:result.GetMonth(), DD:result.GetDate(),
hh:result.GetHours(), mm:result.GetMinutes(), ss:result.GetSeconds()
};
return redate;
};
jeDate.valText = function (elem,value) {
return jet.valText(elem,value);
}
//日期时间戳相互转换
jeDate.timeStampDate = function (date,format) {
format = format || 'YYYY-MM-DD hh:mm:ss';
var dateTest = (/^(-)?\d{1,10}$/.test(date) || /^(-)?\d{1,13}$/.test(date));
if(/^[1-9]*[1-9][0-9]*$/.test(date) && dateTest){
var vdate = parseInt(date);
if (/^(-)?\d{1,10}$/.test(vdate)) {
vdate = vdate * 1000;
} else if (/^(-)?\d{1,13}$/.test(vdate)) {
vdate = vdate * 1000;
} else if (/^(-)?\d{1,14}$/.test(vdate)) {
vdate = vdate * 100;
} else {
alert("时间戳格式不正确");
return;
}
var setdate = new Date(vdate);
return jet.parse({
YYYY:setdate.getFullYear(), MM:jet.digit(setdate.getMonth()+1), DD:jet.digit(setdate.getDate()) ,
hh:jet.digit(setdate.getHours()), mm:jet.digit(setdate.getMinutes()), ss:jet.digit(setdate.getSeconds())
}, format);
}else {
//将日期转换成时间戳
var arrs = jet.reMatch(date),
newdate = new Date(arrs[0],arrs[1]-1,arrs[2],arrs[3]||0,arrs[4]||0,arrs[5]||0),
timeStr = Math.round(newdate.getTime() / 1000);
return timeStr;
}
};
//获取年月日星期
jeDate.getLunar = function(obj){
//如果为数字类型的日期对获取到日期的进行替换
var lunars = jeLunar(obj.YYYY, parseInt(obj.MM) - 1, obj.DD);
return{
nM: lunars.lnongMonth, //农历月
nD: lunars.lnongDate, //农历日
cY: parseInt(lunars.solarYear), //阳历年
cM: parseInt(lunars.solarMonth), //阳历月
cD: parseInt(lunars.solarDate), //阳历日
cW: lunars.inWeekDays, //汉字星期几
nW: lunars.solarWeekDay //数字星期几
};
};
//转换日期格式
jeDate.parse = jet.parse = function(ymdhms, format) {
return format.replace(new RegExp(regymdzz,"g"), function(str, index) {
return str == "zz" ? "00":jet.digit(ymdhms[str]);
});
}
//返回日期
function DateTime(arr,valObj) {
var that = this,newdate = new Date(), narr = ["FullYear","Month","Date","Hours","Minutes","Seconds"];
var vb = jet.extend({YYYY:null,MM:null,DD:null,hh:newdate.getHours(),mm:newdate.getMinutes(),ss:newdate.getSeconds()},valObj);
var ND = valObj == undefined ? newdate : new Date(vb.YYYY,vb.MM,vb.DD,vb.hh,vb.mm,vb.ss);
if((arr||[]).length>0) jet.each(arr,function (i,par) {
ND["set"+narr[i]](narr[i] == "Month" ? parseInt(par)-1:parseInt(par));
});
//返回一个数值相同的新DateTime对象
that.reDate = function () {
return new DateTime();
};
//返回此实例的Date值
that.GetValue = function () {
return ND;
};
//获取此实例所表示日期的年份部分。
that.GetYear = function () {
return ND.getFullYear();
};
//获取此实例所表示日期的月份部分。
that.GetMonth = function () {
return ND.getMonth() + 1;
};
//获取此实例所表示的日期为该月中的第几天。
that.GetDate = function () {
return ND.getDate();
};
//获取此实例所表示日期的小时部分。
that.GetHours = function () {
return ND.getHours();
};
//获取此实例所表示日期的分钟部分。
that.GetMinutes = function () {
return ND.getMinutes();
};
//获取此实例所表示日期的秒部分。
that.GetSeconds = function () {
return ND.getSeconds();
};
};
jet.extend(jet,{
isType : function (obj,type) {
var firstUper = function (str) {
str = str.toLowerCase();
return str.replace(/\b(\w)|\s(\w)/g, function (m) {
return m.toUpperCase();
});
}
return Object.prototype.toString.call(obj) == "[object " + firstUper(type) + "]";
},
each : function (obj, callback, args) {
var name, i = 0, length = obj.length, iselem = (length === undefined || obj === "function");
if (iselem) {
for (name in obj) { if (callback.call(obj[name], name, obj[name]) === false) { break } }
} else {
for (; i < length;) { if (callback.call(obj[i], i, obj[i++]) === false) { break } }
}
return obj;
},
on : function (elm, type, fn) {
if (elm.addEventListener) {
elm.addEventListener(type, fn, false);//DOM2.0
return true;
}else if (elm.attachEvent) {
return elm.attachEvent("on" + type, fn);//IE5+
}else {
elm["on" + type] = fn;//DOM 0
}
},
isObj : function (obj){
for(var i in obj){return true;}
return false;
},
trim : function (str){ return str.replace(/(^\s*)|(\s*$)/g, ""); },
reMatch : function (str) {
var smarr = [],maStr = "", parti = /(^\w{4}|\w{2}\B)/g;
if(jet.isNum(str)){
maStr = str.replace(parti,"$1-");
}else{
maStr = /^[A-Za-z]+$/.test(str) ? str.replace(parti,"$1-") : str;
}
jet.each(maStr.match(/\w+|d+/g),function (i,val) {
smarr.push(jet.isNum(val) ? parseInt(val):val);
});
return smarr;
},
equals : function (arrA,arrB) {
if (!arrB) return false;
if (arrA.length != arrB.length) return false;
for (var i = 0, l = arrA.length; i < l; i++) {
if (arrA[i] instanceof Array && arrB[i] instanceof Array) {
if (!arrA[i].equals(arrB[i])) return false;
} else if (arrA[i] != arrB[i]) {
return false;
}
}
return true;
},
docScroll : function(type) {
type = type ? "scrollLeft" :"scrollTop";
return document.body[type] | document.documentElement[type];
},
docArea : function(type) {
return document.documentElement[type ? "clientWidth" :"clientHeight"];
},
//补齐数位
digit : function(num) {
return num < 10 ? "0" + (num | 0) :num;
},
//判断是否为数字
isNum : function(value){
return /^[+-]?\d*\.?\d*$/.test(value) ? true : false;
},
//获取本月的总天数
getDaysNum : function(y, m) {
var num = 31,isLeap = (y % 100 !== 0 && y % 4 === 0) || (y % 400 === 0);
switch (parseInt(m)) {
case 2: num = isLeap ? 29 : 28; break;
case 4: case 6: case 9: case 11: num = 30; break;
}
return num;
},
//获取月与年
getYM : function(y, m, n) {
var nd = new Date(y, m - 1);
nd.setMonth(m - 1 + n);
return {
y: nd.getFullYear(),
m: nd.getMonth() + 1
};
},
//获取上个月
prevMonth : function(y, m, n) {
return jet.getYM(y, m, 0 - (n || 1));
},
//获取下个月
nextMonth : function(y, m, n) {
return jet.getYM(y, m, n || 1);
},
setCss:function(elem,obj) {
for (var x in obj) elem.style[x] = obj[x];
},
html : function (elem,html) {
return typeof html === "undefined" ? elem && elem.nodeType === 1 ? elem.innerHTML :undefined :typeof html !== "undefined" && html == true ? elem && elem.nodeType === 1 ? elem.outerHTML :undefined : elem.innerHTML = html;
},
// 读取设置节点文本内容
text : function(elem,value) {
var innText = document.all ? "innerText" :"textContent";
return typeof value === "undefined" ? elem && elem.nodeType === 1 ? elem[innText] :undefined : elem[innText] = value;
},
//设置值
val : function (elem,value) {
if (typeof value === "undefined") {
return elem && elem.nodeType === 1 && typeof elem.value !== "undefined" ? elem.value :undefined;
}
// 将value转化为string
value = value == null ? "" :value + "";
elem.value = value;
},
attr : function(elem,value){
return elem.getAttribute(value);
},
hasClass : function (obj, cls) {
return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
},
stopPropagation : function (ev) {
(ev && ev.stopPropagation) ? ev.stopPropagation() : window.event.cancelBubble = true;
},
template : function (str, data) {
var strCell = !/[^\w\-\.:]/.test(str) ? document.getElementById(str).innerHTML : str;
var keys = function (obj){
var arr = [];
for(arr[arr.length] in obj);
return arr ;
}, dataVar = function (obj) {
var vars = '';
for (var key in obj) {
vars += 'var ' + key + '= $D["' + key + '"];';
}
return vars;
}, compile = function (source,data) {
var code = "var $out='" + source.replace(/[\r\n]/g, '').replace(/^(.+?)\{\%|\%\}(.+?)\{\%|\%\}(.+?)$/g, function (val) {
return val.replace(/(['"])/g, '\\\$1');
}).replace(/\{\%\s*=\s*(.+?)\%\}/g, "';$out+=$1;$out+='").replace(/\{\%(.+?)\%\}/g, "';$1;$out+='") + "';return new String($out);";
var vars = dataVar(data), Render = new Function('$D',vars + code);
return new Render(data) + '';
};
return compile(strCell,data);
},
//判断元素类型
isValDiv : function(elem) {
return /textarea|input/.test(elem.tagName.toLocaleLowerCase());
},
valText : function (elem,value) {
var cell = $Q(elem) ,type = jet.isValDiv(cell) ? "val" : "text";
if(value != undefined){
jet[type](cell,value);
}else{
return jet[type](cell);
}
},
isBool : function(obj){ return (obj == undefined || obj == true ? true : false); },
//获取返回的日期
getDateTime : function (obj) {
var result = new DateTime(), objVal = jet.extend({YYYY:null,MM:null,DD:null,hh:0,mm:0,ss:0},obj),
matArr = {YYYY:"FullYear",MM:"Month",DD:"Date",hh:"Hours",mm:"Minutes",ss:"Seconds"};
jet.each(["ss","mm","hh","DD","MM","YYYY"],function (i,mat) {
if (!jet.isNum(parseInt(objVal[mat]))) return null;
var reVal = result.GetValue();
if (parseInt(objVal[mat]) || parseInt(objVal[mat]) == 0){
reVal["set"+matArr[mat]](result["Get"+matArr[mat]]() + (mat == "MM" ? -1 : 0) + parseInt(objVal[mat]));
}
});
//获取格式化后的日期
var redate = {
YYYY:result.GetYear(), MM:result.GetMonth(), DD:result.GetDate(),
hh:result.GetHours(), mm:result.GetMinutes(), ss:result.GetSeconds()
};
return redate;
}
});
function jeDatePick(elem, options){
var config = {
language:{
name : "cn",
month : ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"],
weeks : [ "日", "一", "二", "三", "四", "五", "六" ],
times : ["小时","分钟","秒数"],
timetxt: ["时间选择","开始时间","结束时间"],
backtxt:"返回日期",
clear : "清空",
today : "现在",
yes : "确定"
},
format:"YYYY-MM-DD hh:mm:ss", //日期格式
minDate:"1900-01-01 00:00:00", //最小日期
maxDate:"2099-12-31 23:59:59", //最大日期
isShow:true, //是否显示为固定日历,为false的时候固定显示
multiPane:true, //是否为双面板,为false是展示双面板
onClose:true, //是否为选中日期后关闭弹层,为false时选中日期后关闭弹层
range:false, //如果不为空且不为false,则会进行区域选择,例如 " 至 "," ~ "," To "
trigger:"click", //是否为内部触发事件,默认为内部触发事件
position:[], //自定义日期弹层的偏移位置,长度为0,弹层自动查找位置
valiDate:[], //有效日期与非有效日期,例如 ["0[4-7]$,1[1-5]$,2[58]$",true]
isinitVal:false, //是否初始化时间,默认不初始化时间
initDate:{}, //初始化时间,加减 天 时 分
isTime:true, //是否开启时间选择
isClear:true, //是否显示清空按钮
isToday:true, //是否显示今天或本月按钮
isYes:true, //是否显示确定按钮
festival:false, //是否显示农历节日
fixed:true, //是否静止定位,为true时定位在输入框,为false时居中定位
zIndex:2099, //弹出层的层级高度
method:{}, //自定义方法
theme:{}, //自定义主题色
shortcut:[], //日期选择的快捷方式
donefun:null, //选中日期完成的回调
before:null, //在界面加载之前执行
succeed:null //在界面加载之后执行
};
this.$opts = jet.extend(config,options||{});
this.valCell = $Q(elem);
this.format = this.$opts.format;
this.valCell != null ? this.init() : alert(elem+" ID\u6216\u7C7B\u540D\u4E0D\u5B58\u5728!");
jet.extend(this,this.$opts.method);
delete this.$opts.method;
}
var searandom = function (){
var str = "",arr = [1,2,3,4,5,6,7,8,9,0];
for(var i=0; i<8; i++) str += arr[Math.round(Math.random() * (arr.length-1))];
return str;
};
var jefix = "jefixed",ymdzArr = jet.reMatch(regymdzz),elx = "#jedate";
jet.extend(jeDatePick.prototype,{
init : function () {
var that = this, opts = that.$opts, newDate = new Date(), shortArr = [],
trigges = opts.trigger,ndate = opts.initDate || [], inVal, range = opts.range,
zIndex = opts.zIndex == undefined ? 10000 : opts.zIndex,isShow = jet.isBool(opts.isShow),
isinitVal = (opts.isinitVal == undefined || opts.isinitVal == false) ? false : true;
that.setDatas();
opts.before && opts.before(that.valCell);
//为开启初始化的时间设置值
if (isinitVal && trigges && isShow) {
if (ndate[1]){
var addval = jet.getDateTime(ndate[0]);
inVal = [{
YYYY:addval.YYYY, MM:jet.digit(addval.MM), DD:jet.digit(addval.DD) ,
hh:jet.digit(addval.hh), mm:jet.digit(addval.mm), ss:jet.digit(addval.ss)
}];
}else {
inVal = that.getValue(jet.isObj(ndate[0]) ? ndate[0] : {});
}
if(!range) that.setValue([inVal[0]],opts.format,true);
}
var getCurrValue = function () {
var mats = jet.reMatch(that.format), isEmpty = that.getValue() != "",curVal = [],
parmat = that.dlen == 7 ? "hh:mm:ss" : "YYYY-MM"+ (that.dlen <= 2 ? "":"-DD");
that.selectValue = [jet.parse(jet.getDateTime({}), parmat)];
if(isEmpty && isShow){
var getVal = that.getValue().split(range);
jet.each(new Array(range ? 2 : 1),function (a) {
curVal[a] = {};
jet.each(jet.reMatch(getVal[a]),function (i,val) {
curVal[a][mats[i]] = parseInt(val);
});
});
if(range) that.selectValue = getVal;
}else{
var parr = that.getValue({})[0], nmVal = jet.nextMonth(parr.YYYY,parr.MM||jet.getDateTime({}).MM),
narr = (that.dlen>2 && that.dlen <=6) ? {YYYY:nmVal.y,MM:nmVal.m} : {};
curVal = [parr];
}
that.selectDate = curVal;
return curVal;
},ymarr = [];
that.minDate = ""; that.maxDate = "";
if(!isShow || !trigges) ymarr = getCurrValue();
if(!isShow || !trigges){
that.minDate = jet.isType(opts.minDate,"function") ? opts.minDate(that) : opts.minDate;
that.maxDate = jet.isType(opts.maxDate,"function") ? opts.maxDate(that) : opts.maxDate;
that.storeData(ymarr[0],ymarr[1]);
that.renderDate();
opts.succeed && opts.succeed(that.dateCell);
}else{
if (trigges) {
jet.on(that.valCell,trigges,function(){
if (document.querySelectorAll(elx).length > 0) return;
var gvarr = getCurrValue();
that.minDate = jet.isType(opts.minDate,"function") ? opts.minDate(that) : opts.minDate;
that.maxDate = jet.isType(opts.maxDate,"function") ? opts.maxDate(that) : opts.maxDate;
that.storeData(gvarr[0],gvarr[1]);
that.renderDate();
});
}
}
},
setDatas : function(){
var that = this, opts = that.$opts,range = opts.range,shortArr = [],isShow = jet.isBool(opts.isShow),multi = opts.multiPane;
that.$data = jet.extend({year:false,month:false,day:true,time:false,timebtn:false},{
shortcut:[],lang:opts.language,yaerlist:[],monthlist:[[],[]],ymlist:[[],[]], daylist:[[],[]],
clear:opts.isClear,today:range ? false:opts.isToday,yes:opts.isYes,pane:multi ? 1:2
});
if(opts.shortcut.length>0){
jet.each(opts.shortcut,function (i,short) {
var tarr = [], shval = jet.isType(short.val,"function") ? short.val() : short.val;
if(jet.isType(shval,"object")){
for (var s in shval) tarr.push(s + ':' + shval[s]);
shortArr.push(jet.extend({},{name:short.name,val:"{" + tarr.join('#') + "}"}));
}
});
that.$data.shortcut = shortArr;
}
that.dlen = (function () {
var mats = jet.reMatch(that.format),marr = [];
jet.each(ymdzArr,function(i,val){
jet.each(mats,function(m,mval){
if(val == mval) marr.push(mval);
});
});
var matlen = marr.length, lens = (marr[0] == "hh")&&matlen<=3 ? 7 : matlen;
return lens;
})();
that.$data.dlen = that.dlen;
that.timeInspect = false;
if(that.dlen == 1){
jet.extend(that.$data,{year:true,day:false});
}else if(that.dlen == 2){
jet.extend(that.$data,{month:true,day:false});
}else if(that.dlen>3 && that.dlen <=6){
that.$data.timebtn = true;
}else if(that.dlen == 7){
jet.extend(that.$data,{day:false,time:true});
}
if(!isShow){
that.$data.clear = false;
that.$data.yes = false;
}
},
renderDate : function () {
var that= this, opts = that.$opts,isShow = jet.isBool(opts.isShow),
elxID = !isShow ? elx+searandom() : elx, setzin = {"zIndex": (opts.zIndex == undefined ? 10000 : opts.zIndex)};
if(that.dateCell == undefined){
that.dateCell = document.createElement("div");
that.dateCell.id = elxID.replace(/\#/g,"");
that.dateCell.className = elx.replace(/\#/g,"")+" "+(opts.shortcut.length>0?" leftmenu":"");
that.dateCell.setAttribute("author","chen guojun");
}
jet.html(that.dateCell,jet.template(that.dateTemplate(),that.$data));
//自定义主题色
if(jet.isObj(opts.theme)){
var styleDiv = document.createElement("style"),stCell = ".jedate"+searandom(), t = opts.theme,
BG = "background-color:"+t.bgcolor, WC = "color:"+(t.color == undefined ? "#FFFFFF":t.color),
OTH = (t.pnColor == undefined ? "":"color:"+t.pnColor+";");
that.dateCell.className = that.dateCell.className+" "+stCell.replace(/^./g,""); styleDiv.setAttribute("type","text/css");
styleDiv.innerHTML = stCell+" .jedate-menu p:hover{"+BG+";"+WC+";}"+stCell+" .jedate-header em{"+WC+";}"+
stCell+" .jedate-content .yeartable td.action span,"+stCell+" .jedate-content .monthtable td.action span,"+
stCell+" .jedate-content .yeartable td.action span:hover,"+stCell+" .jedate-content .monthtable td.action span:hover{"+BG+";border:1px "+t.bgcolor+" solid;"+WC+";}"+stCell+" .jedate-content .daystable td.action,"+stCell+" .jedate-content .daystable td.action:hover,"+
stCell+" .jedate-content .daystable td.action .lunar,"+stCell+" .jedate-header,"+stCell+" .jedate-time .timeheader,"+
stCell+" .jedate-time .hmslist ul li.action,"+stCell+" .jedate-time .hmslist ul li.action:hover,"+
stCell+" .jedate-time .hmslist ul li.disabled.action,"+stCell+" .jedate-footbtn .timecon,"+stCell+" .jedate-footbtn .btnscon span{"+BG+";"+WC+";}"+
stCell+" .jedate-content .daystable td.other,"+stCell+" .jedate-content .daystable td.other .nolunar,"+stCell+" .jedate-content .daystable td.other .lunar{"+OTH+"}"+stCell+" .jedate-content .daystable td.contain,"+stCell+" .jedate-content .daystable td.contain:hover{background-"+OTH+"}";
that.dateCell.appendChild(styleDiv);
}
that.compileBindNode(that.dateCell);
if (document.querySelectorAll(elxID).length > 0) document.body.removeChild($Q(elxID));
!isShow ? that.valCell.appendChild(that.dateCell) : document.body.appendChild(that.dateCell);
jet.setCss(that.dateCell,jet.extend({position:(!isShow ? "relative" : (opts.fixed == true ? "absolute" :"fixed"))},isShow ? setzin:{}));
that.methodEventBind();
if(that.dlen == 7 || (that.dlen>3 && that.dlen <=6)) that.locateScroll();
if(opts.festival && opts.language.name == "cn") that.showFestival();
if(isShow){
that.dateOrien(that.dateCell,that.valCell);
that.blankArea();
}
},
//设置日期值
setValue : function (fnStr,matStr,bool) {
var that = this, valCell = that.valCell,strVal;
matStr = matStr || that.format;
if((typeof fnStr=='string')&&fnStr!=''){
var sprange = fnStr.split(that.$opts.range), inArr=[];
jet.each(sprange,function (i,sval) {
var reVal = jet.reMatch(sval), inObj={};
jet.each(jet.reMatch(matStr),function (r,val) {
inObj[val] = reVal[r];
});
inArr.push(inObj);
});
strVal = inArr;
}else {
strVal = fnStr;
}
var vals = that.parseValue(strVal,matStr);
if (bool != false) jet.valText(valCell,vals);
return vals;
},
//获取日期值
getValue : function (valobj) {
var that = this, valCell = that.valCell,
opts = that.$opts, reObj, result = new DateTime().reDate(),
dateY = result.GetYear(),dateM = result.GetMonth(),dateD = result.GetDate(),
timeh = result.GetHours(),timem = result.GetMinutes(),times = result.GetSeconds();
if (valobj == undefined && jet.isBool(opts.isShow)){
reObj = jet.valText(valCell);
}else {
var isValShow = jet.isBool(opts.isShow) ? (jet.valText(valCell) == "") : !jet.isBool(opts.isShow),
objarr = jet.extend({YYYY:null,MM:null,DD:null},valobj||{}),
ranMat = [],newArr = new Array(2),unObj = function (obj) {
return [(objarr[obj] == undefined || objarr[obj] == null),objarr[obj]];
}, defObj = [{ YYYY:dateY,MM:dateM,DD:dateD, hh:timeh,mm:timem,ss:times,zz:'00'},
{ YYYY:dateY,MM:dateM,DD:dateD, hh:timeh,mm:timem,ss:times,zz:'00'}];
if (isValShow) {
//目标为空值则获取当前日期时间
jet.each(newArr,function (i) {
var inObj = {};
jet.each(ymdzArr, function (r, val) {
inObj[val] = parseInt(unObj(val)[0] ? defObj[i][val] : unObj(val)[1]);
});
ranMat.push(jet.extend(defObj[i], inObj));
});
} else {
var isunRange = opts.range != false, initVal = that.getValue(),
spVal = initVal.split(opts.range), reMat = jet.reMatch(that.format);
jet.each(newArr,function (i) {
var inObj = {}, reVal = isunRange ? jet.reMatch(spVal[i]) : jet.reMatch(initVal);
jet.each(reMat,function (r,val) {
inObj[val] = reVal[r];
});
var exVal = jet.extend(inObj,valobj||{});
ranMat.push(jet.extend(defObj[i],exVal));
});
}
reObj = ranMat;
}
return reObj;
},
storeData:function (curr,next) {
next = next || {};
var that = this, opts = that.$opts,multi = opts.multiPane,valCell = that.valCell,
days = new Date().getDate(), DTS = that.$data,isnext = jet.isObj(next),
RES = {yearlist:[],monthlist:[[],[]],daylist:[],daytit:[],timelist:[]},seltime,
cday = curr.DD == null ? days : curr.DD, nday = next.DD == null ? days : next.DD,
timeA = {hh:curr.hh,mm:curr.mm,ss:curr.ss}, timeB = {hh:next.hh||0,mm:next.mm||0,ss:next.ss||0};
//设置年的数据
RES.yearlist.push(that.eachYear(parseInt(curr.YYYY),1));
if(multi == false){
var yearNext = isnext ? next.YYYY : curr.YYYY;
RES.yearlist.push(that.eachYear(parseInt(yearNext),2));
}
//设置月的数据
RES.monthlist[0] = that.eachMonth(curr.YYYY,0);
if(multi == false){
var monthNext = isnext ? next.YYYY : curr.YYYY+1;
RES.monthlist[1] = that.eachMonth(curr.YYYY+1,1);
}
//设置天的数据
RES.daylist.push(that.eachDays(curr.YYYY,curr.MM,cday,0));
RES.daytit.push({YYYY:curr.YYYY,MM:curr.MM});
if(multi == false){
var dayNext = jet.nextMonth(curr.YYYY,curr.MM);
RES.daylist.push(that.eachDays(dayNext.y,dayNext.m,nday,1));
RES.daytit.push({YYYY:dayNext.y,MM:dayNext.m});
}
//设置时间数据
that.selectTime = [timeA,timeB];
RES.timelist.push(that.eachTime(timeA,1));
if(multi == false){
seltime = that.dlen == 7 && opts.range && !isnext ? timeA : timeB;
if(that.dlen == 7 && opts.range && jet.valText(valCell) == ""){
that.selectTime[1] = jet.extend(timeB,timeA);
}
RES.timelist.push(that.eachTime(seltime,2));
}
//最后将数据合并于总数据中
jet.extend(that.$data,RES);
},
dateTemplate : function() {
var that = this, opts = that.$opts, multi = opts.multiPane,YMDStr = "",hmsStr = "",lang = opts.language,
ytxt = lang.name == "cn" ? "年":"", mtxt = lang.name == "cn" ? "月":"";
var ymvals = multi ? '{%=ymlist[0].YYYY%}-{%=ymlist[0].MM%}':'{%=ymlist[0].YYYY%}-{%=ymlist[0].MM%}#{%=ymlist[ynidx].YYYY%}-{%=ymlist[ynidx].MM%}';
var aowArr = (function () {
var butArr = [], ismu = multi ? "11":"23";
if(that.dlen == 1){
butArr = ['{%=yearlist[i][0].y-'+ismu+'%}','{%=yearlist[i][yearlist[i].length-1].y%}'];
}else if(that.dlen == 2){
butArr = multi ? ['{%=yearlist[0][0].y-1%}','{%=yearlist[0][0].y+1%}']:['{%=yearlist[i][0].y-'+ismu+'%}','{%=yearlist[i][yearlist[i].length-1].y%}'];
}else if(that.dlen>2 && that.dlen <=6){
butArr = ['{%=yearlist[0][0].y-1%}','{%=yearlist[0][0].y+1%}'];
}
return butArr;
})();
var lyPrev = '<em class="yearprev yprev jedatefont" @on="yearBtn(lprev,'+aowArr[0]+')">󭛂</em>',
lyNext = '<em class="yearnext ynext jedatefont" on="yearBtn(lnext,'+aowArr[2]+')">󭛅</em>',
ryPrev = '<em class="yearprev yprev jedatefont" on="yearBtn(rprev,'+aowArr[3]+')">󭛂</em>',
ryNext = '<em class="yearnext ynext jedatefont" @on="yearBtn(rnext,'+aowArr[1]+')">󭛅</em>',
mPrev = '{% if(dlen>2){ %}<em class="monthprev mprev jedatefont" @on="monthBtn(mprev,{%=daytit[i].YYYY%}-{%=daytit[i].MM%})">󭘂</em>{% } %}',
mNext = '{% if(dlen>2){ %}<em class="monthnext mnext jedatefont" @on="monthBtn(mnext,{%=daytit[i].YYYY%}-{%=daytit[i].MM%})">󭘅</em>{% } %}';
//循环年的模板
var yaerHtml = '<table class="yeartable year{%= i==0 ? "left":"right"%}" style="display:{%=year ? "block":"none"%};"><tbody><tr>'+
'{% for(var y=0;y<=11;y++){ %}<td class="{%=yearlist[i][y].style%}" @on="yearClick({%=yearlist[i][y].y%})"><span>{%=yearlist[i][y].y%}'+ytxt+'</span></td>{% if((y+1)%3==0){ %} </tr>{% } %} {% } %} </tbody></table>';
//循环月的模板
var monthHtml = '<table class="monthtable month{%= i==0 ? "left":"right"%}" style="display:{%=month ? "block":"none"%};"><tbody><tr>'+
'{% for(var m=0;m<=11;m++){ %}<td class="{%=monthlist[i][m].style%}" ym="{%=monthlist[i][m].y%}-{%=monthlist[i][m].m%}" @on="monthClick({%=monthlist[i][m].y%}-{%=monthlist[i][m].m%})"><span>{%=monthlist[i][m].m%}'+mtxt+'</span></td>{% if((m+1)%3==0){ %} </tr>{% } %} {% } %} </tbody></table>';
//循环天的模板
var daysHtml = '<table class="daystable days{%= i==0 ? "left":"right"%}" style="display:{%=day ? "block":"none"%};"><thead><tr>'+
'{% for(var w=0;w<lang.weeks.length;w++){ %} <th>{%=lang.weeks[w]%}</th> {% } %}</tr></thead><tbody>'+
'<tr>{% for(var d=0;d<=41;d++){ %}<td class="{%=daylist[i][d].style%}" ymd="{%=daylist[i][d].ymd%}" @on="daysClick({%=daylist[i][d].ymd%})">{%=daylist[i][d].day%}</td>{% if((d+1)%7==0){ %} </tr>{% } %} {% } %} </tbody></table>';
//循环时间模板
var hmsHtml = '<div class="jedate-time">{% for(var h=0;h<timelist.length;h++){ %}<div class="timepane"><div class="timeheader">{%= timelist.length == 1 ? lang.timetxt[0]:lang.timetxt[h+1]%}</div><div class="timecontent">'+
'<div class="hmstitle"><p>{%=lang.times[0]%}</p><p>{%=lang.times[1]%}</p><p>{%=lang.times[2]%}</p></div>'+
'<div class="hmslist">{% for(var t=0;t<3;t++){ %}<div class="hmsauto"><ul>{% for(var s=0;s<timelist[h][t].length;s++){ %}<li class="{%=timelist[h][t][s].style%}" @on="hmsClick({%= h %},{%= h>0?3+t:t %})">{%= timelist[h][t][s].hms < 10 ? "0" + timelist[h][t][s].hms :timelist[h][t][s].hms %}</li>{% } %}</ul></div>{% } %}</div></div>'+'</div>{% } %}</div>';
//左边选择模板
var shortHtml = opts.shortcut.length > 0 ? "{% for(var s=0;s<shortcut.length;s++){ %}<p @on=shortClick({%= shortcut[s].val %})>{%=shortcut[s].name%}</p>{% } %}":'';
var ymtitHtml = (function () {
var ymtitStr = "";
if(that.dlen == 1){
ymtitStr = '<span class="ymbtn">{%=yearlist[i][0].y%}'+ytxt+' ~ {%=yearlist[i][yearlist[i].length-1].y%}'+ytxt+'</span>';
}else if(that.dlen == 2){
ymtitStr = '<span class="ymbtn" @on="yearShow({%=yearlist[0][i].y%})">{%=yearlist[0][i].y%}'+ytxt+'</span>';
}else if(that.dlen>2 && that.dlen <=6){
ymtitStr = '<span class="ymbtn" @on="monthShow({%=daytit[i].MM%})">{%=daytit[i].MM%}'+mtxt+'</span>'+
'<span class="ymbtn" @on="yearShow({%=daytit[i].YYYY%})">{%=daytit[i].YYYY%}'+ytxt+'</span>';
}
return ymtitStr;
})();
var ymButton = (function () {
var titStrBut = "";
if(that.dlen==1){
titStrBut = multi ? [lyPrev+ryNext]:[lyPrev,ryNext];
}else if(that.dlen==2){
titStrBut = multi ? [lyPrev+ryNext] : [lyPrev,ryNext];
}else if(that.dlen>2 && that.dlen <=6){
titStrBut = multi ? [lyPrev+mPrev+mNext+ryNext] : [lyPrev+mPrev,mNext+ryNext];
}else if(that.dlen==7){
titStrBut = "";
}
return titStrBut;
})();
if(that.dlen == 1){
YMDStr = yaerHtml;
}else if(that.dlen == 2){
YMDStr = yaerHtml + monthHtml;
}else if(that.dlen == 3){
YMDStr = yaerHtml + monthHtml + daysHtml;
}else if(that.dlen > 3 && that.dlen <= 6){
YMDStr = yaerHtml + monthHtml + daysHtml;
hmsStr = hmsHtml;
}else if(that.dlen == 7){
hmsStr = hmsHtml;
}
var paneHtml = '{% for(var i=0;i<pane;i++){ %}<div class="jedate-pane">'+
'<div class="jedate-header">{% if(i==0){ %}'+ymButton[0]+'{% }else{ %}'+ymButton[1]+'{% } %}'+ymtitHtml+'</div>'+
'<div class="jedate-content{%= i==1?" bordge":"" %}">'+YMDStr+'</div>'+
'</div>{% } %}';
var btnStr = '{% if(timebtn){%}<div class="timecon" style="cursor: pointer;" @on="timeBtn">{%=lang.timetxt[0]%}</div>{% } %}<div class="btnscon">{% if(clear){ %}<span class="clear" @on="clearBtn">{%=lang.clear%}</span>{% } %}{% if(today){ %}<span class="today" @on="nowBtn">{%=lang.today%}</span>{% } %}{% if(yes){ %}<span class="setok" @on="sureBtn">{%=lang.yes%}</span>{% } %}</div>';
return '<div class="jedate-menu" style="display:{%=shortcut.length>0 ? "block":"none"%};">'+shortHtml+'</div><div class="jedate-wrap">'+paneHtml+'</div>'+hmsStr+'<div class="jedate-footbtn">'+btnStr+'</div><div class="jedate-tips"></div>';
},
//递归绑定事件
compileBindNode : function (dom) {
var self = this, aton = "@on";
var acquireAttr = function (atVal){
var args=/\(.*\)/.exec(atVal);
if(args) { //如果函数带参数,将参数字符串转换为参数数组
args = args[0];
atVal = atVal.replace(args,"");
args = args.replace(/[\(\)\'\"]/g,'').split(",");
}else args = [];
return [atVal,args];
};
jet.each(dom.childNodes,function (i,node) {
if (node.nodeType === 1) {
if(!self.$opts.festival) node.removeAttribute("ymd");
self.compileBindNode(node);
var geton = node.getAttribute(aton);
if(geton != null){
var onarr = acquireAttr(geton);
jet.on(node,"click",function () {
self[onarr[0]] && self[onarr[0]].apply(node,onarr[1]);
});
node.removeAttribute(aton);
}
}
});
},
methodEventBind : function() {
var that = this, opts = that.$opts, multi = opts.multiPane, DTS = that.$data, exarr = [],
result = new DateTime().reDate(),dateY = result.GetYear(),dateM = result.GetMonth(),dateD = result.GetDate(),
range = opts.range,elCell = that.dateCell;
jet.extend(that,{
yearBtn:function (type,val) {
var yarr = val.split("#"), pval = jet.reMatch(yarr[0]), tmval = that.selectTime;
exarr = [jet.extend({YYYY:parseInt(val),MM:dateM,DD:dateD},tmval[0]),{}];
var dateVal = that.parseValue([exarr[0]],that.format);
that.storeData(exarr[0],exarr[1]);
that.renderDate();
opts.toggle && opts.toggle({elem:that.valCell,val:dateVal,date:exarr[0]});
},
yearShow:function (val) {
DTS.year = DTS.year ? false : true;
DTS.month = that.dlen < 3 ? true : false;
if(that.dlen > 2 && that.dlen <= 6){
var dayCell = $Q(".daystable",elCell);
DTS.day = dayCell.style.display == "none" ? true : false;
}
that.renderDate();
},
monthBtn:function (type,val) {
var ymarr = jet.reMatch(val),tmval = that.selectTime, exarr=[], PrevYM , NextYM,
year = parseInt(ymarr[0]),month = parseInt(ymarr[1]);
if(range){
if(type == "mprev"){
PrevYM = jet.prevMonth(year, month);
NextYM = jet.nextMonth(PrevYM.y, PrevYM.m);
}else{
NextYM = jet.nextMonth(year, month);
PrevYM = jet.prevMonth(NextYM.y, NextYM.m);
}
exarr = [jet.extend({YYYY:PrevYM.y,MM:PrevYM.m,DD:dateD},tmval[0]),{YYYY:NextYM.y,MM:NextYM.m,DD:dateD}];
}else{
var PNYM = (type == "mprev") ? jet.prevMonth(year, month) : jet.nextMonth(year, month);
exarr = [jet.extend({YYYY:PNYM.y,MM:PNYM.m,DD:dateD},tmval[0]),{}];
}
var dateVal = that.parseValue([exarr[0]],that.format);
that.storeData(exarr[0],exarr[1]);
that.renderDate();
opts.toggle && opts.toggle({elem:that.valCell,val:dateVal,date:exarr[0]});
},
monthShow:function (val) {
DTS.year = false;
DTS.month = DTS.month ? false : true;
if(that.dlen > 2 && that.dlen <= 6){
var dayCell = $Q(".daystable",elCell);
DTS.day = dayCell.style.display == "none" ? true : false;
}
that.renderDate();
},
shortClick:function (val) {
var reval = val.replace(/\#/g,','),evobj = eval("("+reval+")"),
gval = jet.getDateTime(evobj),tmval = that.selectTime;
that.selectValue = [jet.parse(gval,"YYYY-MM-DD")];
that.selectDate = [{YYYY:gval.YYYY,MM:gval.MM,DD:gval.DD}];
if(opts.onClose){
var nYM = jet.nextMonth(gval.YYYY,gval.MM),
ymarr = [{YYYY:gval.YYYY,MM:gval.MM,DD:gval.DD},{YYYY:nYM.y,MM:nYM.m,DD:null}];
that.storeData(jet.extend(ymarr[0],tmval[0]),jet.extend(ymarr[1],tmval[1]));
that.renderDate();
}else{
that.setValue(gval,that.format);
that.closeDate();
}
},
yearClick:function (val) {
if(jet.hasClass(this,"disabled")) return;
var yearVal = "",lens = that.dlen;
if(range && lens == 1){
var ylen = that.selectValue.length;
that.selectDate = (ylen == 2) ? [{YYYY:parseInt(val),MM:dateM}] :
[{YYYY:that.selectDate[0].YYYY,MM:that.selectDate[0].MM},{YYYY:parseInt(val),MM:dateM}];
that.selectValue = (ylen == 2) ? [val+"-"+jet.digit(dateM)] : [that.selectValue[0],val+"-"+jet.digit(dateM)];
if(that.selectValue.length == 2){
var svalarr = [that.selectValue[0],that.selectValue[1]],newArr = [{},{}];
svalarr.sort(function(a, b){ return a > b ? 1 : -1; });
that.selectValue = svalarr;
jet.each(svalarr,function(i,strval) {
jet.each(jet.reMatch(strval),function(s,dval) {
newArr[i][ymdzArr[s]] = dval;
});
});
that.selectDate = newArr;
}
}else if(lens>1 && lens <=6){
yearVal = parseInt(val);
}else{
that.selectValue = [val+"-"+jet.digit(dateM)];
that.selectDate = [{YYYY:parseInt(val),MM:dateM}];
}
DTS.year = (lens == 1) ? true : false;
DTS.month = (lens < 3) ? true : false;
DTS.day = (lens > 2 && lens <= 6) ? true : false;
var electVal = (lens>1 && lens <=6) ? yearVal : parseInt(that.selectDate[0].YYYY);
that.storeData(jet.extend({YYYY:electVal,MM:dateM,DD:dateD},that.selectTime[0]),{});
that.renderDate();
},
monthClick:function (val) {
if(jet.hasClass(this,"disabled")) return;
var ymval = jet.reMatch(val),newArr = [{},{}],mlen = that.selectValue.length ;
if(range){
that.selectDate = (mlen == 2) ? [{YYYY:ymval[0],MM:ymval[1]}] :
[{YYYY:that.selectDate[0].YYYY,MM:that.selectDate[0].MM},{YYYY:parseInt(val),MM:ymval[1]}];
that.selectValue = (mlen == 2) ? [val] : [that.selectValue[0],val];
if(that.selectValue.length == 2){
var svalarr = [that.selectValue[0],that.selectValue[1]];
svalarr.sort(function(a, b){ return a > b ? 1 : -1; });
that.selectValue = svalarr;
jet.each(svalarr,function(i,strval) {
jet.each(jet.reMatch(strval),function(s,dval) {
newArr[i][ymdzArr[s]] = dval;
});
});
that.selectDate = newArr;
}
}else{
that.selectValue = [val];
that.selectDate = [{YYYY:ymval[0],MM:ymval[1]}];
}
if(that.dlen > 2){
DTS.year = false;
DTS.month = false;
}
DTS.day = (that.dlen > 2 && that.dlen <= 6) ? true : false;
that.storeData(jet.extend({
YYYY:parseInt(that.selectDate[0].YYYY),
MM:parseInt(that.selectDate[0].MM),
DD:dateD
},that.selectTime[0]),{});
that.renderDate();
},
daysClick:function (val) {
if(jet.hasClass(this,"disabled")) return;
var tmval = that.selectTime, matVal = jet.reMatch(val),
slen = that.selectValue.length,dateVal = "",
newArr = [{},{}],sday,nYM,ymarr;
if(range){
if(slen == 1){
var svalarr = [that.selectValue[0],val];
svalarr.sort(function(a, b){ return a > b ? 1 : -1; });
that.selectValue = svalarr;
jet.each(svalarr,function(i,strval) {
jet.each(jet.reMatch(strval),function(s,dval) {
newArr[i][ymdzArr[s]] = dval;
});
});
that.selectDate = newArr;
}else{
that.selectValue = [val];
newArr = [{YYYY:matVal[0],MM:matVal[1],DD:matVal[2]}];
that.selectDate = [{YYYY:matVal[0],MM:matVal[1],DD:matVal[2]},{}];
}
nYM = jet.nextMonth(newArr[0].YYYY,newArr[0].MM);
ymarr = [{YYYY:newArr[0].YYYY,MM:newArr[0].MM,DD:newArr[0].DD},{YYYY:nYM.y,MM:nYM.m,DD:null}];
that.storeData(jet.extend(ymarr[0],tmval[0]),jet.extend(ymarr[1],tmval[1]));
that.renderDate();
}else{
that.selectValue = [val];
that.selectDate = [{YYYY:matVal[0],MM:matVal[1],DD:matVal[2]},{YYYY:matVal[0],MM:matVal[1],DD:matVal[2]}];
jet.each(new Array(range == false ? 1 : 2),function (a) {
jet.each(matVal,function (i,val) {
newArr[a][ymdzArr[i]] = val;
});
jet.extend(newArr[a],tmval[a]);
});
if(opts.onClose){
that.storeData(jet.extend(newArr[0],tmval[0]),jet.extend(newArr[1],tmval[1]));
that.renderDate();
}else{
dateVal = that.setValue(newArr,that.format);
that.closeDate();
opts.donefun && opts.donefun.call(that,{elem:that.valCell,val:dateVal,date:newArr});
}
}
},
hmsClick:function(idx,num) {
var pidx = parseInt(num), vals = parseInt(jet.text(this)),