var calarray = new Array(); var cal; var isFocus=false; //是否为焦点 var pickMode ={ "second":1, "minute":2, "hour":3, "day":4, "month":5, "year":6 }; var topY=0,leftX=0; //自定义定位偏移量 /** * 选择日期通过 ID 来选日期 * @param id HtmlElement编号id * @param strFormat 日期格式化字符串 * @param x 相对于HtmlElement横轴偏移量 * @param y 相对于HtmlElement纵轴偏移量 */ function SelectDateById(id,strFormat,x,y){ var obj = document.getElementById(id); if(obj == null){return false;} obj.focus(); if(obj.onclick != null){obj.onclick();} else if(obj.click != null){obj.click();} else{SelectDate(obj,strFormat,undefined,undefined,postEvent,x,y);} } function getCal(obj, by, ey, lang, strFormat){ if(calarray.length==0){ calarray[0] = [obj,new Calendar(by, ey, lang, strFormat)]; return calarray[0][1]; } for(var i=0;ithis.endDate)return;//比最晚时间还晚则直接返回 if (this.dateControl != null){this.dateControl.value = dt;} calendar.hide(); calendar.dayValue = dt; if(this.dateControl.onchange == null){return;} //将 onchange 转成其它函数,以免触发验证事件 //var ev = this.dateControl.onchange.toString(); //找出函数的字串 //ev = ev.substring( //((ev.indexOf("ValidatorOnChange();")> 0) ? ev.indexOf("ValidatorOnChange();") + 20 : ev.indexOf("{") + 1) //, ev.lastIndexOf("}"));//去除验证函数 ValidatorOnChange(); //var fun = new Function(ev); //重新定义函数 //this.dateControl.onchange = fun; this.dateControl.onchange();//触发自定义 changeEvent 函数 }; //返回最大日期 Calendar.prototype.ReturnMaxDate = function(datevalue,dt) { if (this.dateControl != null){this.dateControl.value = dt;} calendar.hide(); calendar.dayValue = dt; if(this.dateControl.onchange == null){return;} this.dateControl.onchange();//触发自定义 changeEvent 函数 }; /* * 日历类 * @param beginYear 1990 * @param endYear 2010 * @param lang 0(中文)|1(英语) 可自由扩充 * @param dateFormatStyle "yyyy-MM-dd"; * @update */ function Calendar(beginDate, endDate, lang, dateFormatStyle) { var date = new Date(); this.beginYear = date.getFullYear() - 50; this.endYear = date.getFullYear() + 50; this.lang = 0; //0(中文) | 1(英文) this.dateFormatStyle = "yyyy/MM/dd"; this.beginDate; this.endDate; if (dateFormatStyle){ this.dateFormatStyle = dateFormatStyle; } this.DateMode =pickMode["second"]; if(this.dateFormatStyle.indexOf('s')< 0) {this.DateMode =pickMode["minute"];}//精度为分 if(this.dateFormatStyle.indexOf('m')< 0) {this.DateMode =pickMode["hour"];}//精度为时 if(this.dateFormatStyle.indexOf('h')< 0) {this.DateMode =pickMode["day"];}//精度为日 if(this.dateFormatStyle.indexOf('d')< 0) {this.DateMode =pickMode["month"];}//精度为月 if(this.dateFormatStyle.indexOf('M')< 0) {this.DateMode =pickMode["year"];}//精度为年 if(this.dateFormatStyle.indexOf('y')< 0) {this.DateMode =pickMode["second"];}//默认精度为秒 if(beginDate){ if(typeof beginDate=="number") this.beginDate = new Date(beginDate,0,1).format(this.dateFormatStyle).toDate(this.dateFormatStyle); else if(beginDate.constructor==Date) this.beginDate = beginDate.format(this.dateFormatStyle).toDate(this.dateFormatStyle); else this.beginDate = beginDate.toDate(this.dateFormatStyle); this.beginYear = this.beginDate.getFullYear(); } if(endDate){ if(typeof(endDate)=="number") this.endDate = new Date(endDate,11,31,23,59,59).format(this.dateFormatStyle).toDate(this.dateFormatStyle); else if(endDate.constructor==Date) this.endDate = endDate.format(this.dateFormatStyle).toDate(this.dateFormatStyle); else this.endDate = endDate.toDate(this.dateFormatStyle); this.endYear = this.endDate.getFullYear(); } //alert("beginDate=" + this.beginDate); //alert("endYear=" + this.endYear); /* if (beginYear != null && endYear != null){ this.beginYear = beginYear; this.endYear = endYear; } */ if (lang != null){ this.lang = lang; } this.dateControl = null; this.panel = this.getElementById("calendarPanel"); this.container = this.getElementById("ContainerPanel"); this.form = null; this.date = new Date().format(this.dateFormatStyle).toDate(this.dateFormatStyle); this.year = this.date.getFullYear(); this.month = this.date.getMonth(); this.day = this.date.getDate(); this.hour = this.date.getHours(); this.minute = this.date.getMinutes(); this.second = this.date.getSeconds(); this.colors = { "cur_word" : "#FFFFFF", //当日日期文字颜色 "cur_bg" : "#0e84ff", //当日日期单元格背影色 "sel_bg" : "#81cbff", //已被选择的日期单元格背影色 "sun_word" : "#FF0000", //星期天文字颜色 "sat_word" : "#0000FF", //星期六文字颜色 "td_word_light" : "#333333", //单元格文字颜色 "td_word_dark" : "#CCCCCC", //单元格文字暗色 "td_bg_out" : "#fff", //单元格背影色 "td_bg_over" : "#cceaff", //鼠标悬浮单元格背影色 "tr_word" : "#666", //日历头文字颜色 "tr_bg" : "#fff", //日历头背影色 "input_border" : "#d8d8d8", //input控件的边框颜色 "input_bg" : "#fff" //input控件的背影色 }; /*放到了 show ,因为要做 pickMode 判断 this.draw(); this.bindYear(); this.bindMonth(); */ //this.changeSelect(); //this.bindData(); } /* * 日历类属性(语言包,可自由扩展) */ /*Calendar.language = { "year" : [""], "months" : ["1","2","3","4","5","6","7","8","9","10","11","12"], "weeks" : ["日","一","二","三","四","五","六"], "hour" : ["时"], "minute" : ["分"], "second" : ["秒"], "clear" : ["清空"], "today" : ["今天"], "pickTxt" : ["确定"], "close" : ["关闭"], "max" : ["最大值"], };*/ Calendar.language = null; Calendar.getLanguage = function(){ if(!Calendar.language) Calendar.language = AsControl.RunJavaMethod("com.amarsoft.awe.res.LanguageManager", "getWebLanguages",""); return Calendar.language; } Calendar.prototype.draw = function() { calendar = this; var mvAry = []; //mvAry[mvAry.length] = '
'; //因 不能嵌套 mvAry[mvAry.length] = '
'; mvAry[mvAry.length] = ' '; mvAry[mvAry.length] = ' ';//标题行,左按钮 | 日期选择 | 右按钮 mvAry[mvAry.length] = ' ';//向左input mvAry[mvAry.length] = ''; mvAry[mvAry.length] = ''; mvAry[mvAry.length] = ' '; mvAry[mvAry.length] = '
'; mvAry[mvAry.length] = ' pickMode["month"]){mvAry[mvAry.length] = 'display:none;';}//pickMode 精确到年时隐藏“月” mvAry[mvAry.length] ='" name="prevMonth" type="button" id="prevMonth" value="<" />'; mvAry[mvAry.length] = '';//向右input mvAry[mvAry.length] = '
'; mvAry[mvAry.length] = ' ' + Calendar.getLanguage()["weeks"][i] + ''; } mvAry[mvAry.length] = ' '; for(var i = 0; i < 6;i++){ mvAry[mvAry.length] = ' '; for(var j = 0; j < 7; j++) { if (j == 0){ mvAry[mvAry.length] = ' '; } else if(j == 6) { mvAry[mvAry.length] = ' '; } else { mvAry[mvAry.length] = ' '; } } mvAry[mvAry.length] = ' '; } //添加的代码,放置时间的行 mvAry[mvAry.length] = ' = pickMode["hour"]){mvAry[mvAry.length] = 'display:none;';}//pickMode 精确到小时时隐藏“分” mvAry[mvAry.length] = '">' + Calendar.getLanguage()["minute"]+''; mvAry[mvAry.length] = ''; mvAry[mvAry.length] = ' '; mvAry[mvAry.length] = '
'; //mvAry[mvAry.length] = ' '; mvAry[mvAry.length] = '
'; mvAry[mvAry.length] = ' '; mvAry[mvAry.length] = ' '; mvAry[mvAry.length] = ' '; mvAry[mvAry.length] = ' '; mvAry[mvAry.length] = '
'; mvAry[mvAry.length] = '
'; this.panel.innerHTML = mvAry.join(""); var obj = this.getElementById("prevYear"); obj.onclick = function () {calendar.goPrevYear(calendar);}; obj.onblur = function () {calendar.onblur();}; obj = this.getElementById("nextYear"); obj.onclick = function () {calendar.goNextYear(calendar);}; obj.onblur = function () {calendar.onblur();}; obj = this.getElementById("prevMonth"); obj.onclick = function () {calendar.goPrevMonth(calendar);}; obj.onblur = function () {calendar.onblur();}; this.prevMonth= obj; obj = this.getElementById("nextMonth"); obj.onclick = function () {calendar.goNextMonth(calendar);}; obj.onblur = function () {calendar.onblur();}; this.nextMonth= obj; obj = this.getElementById("calendarClear"); obj.onclick = function (){ calendar.ReturnDate(undefined,""); /*calendar.dateControl.value = "";calendar.hide();*/ calendar.postEvent(); }; this.calendarClear = obj; obj = this.getElementById("calendarClose"); obj.onclick = function () {calendar.hide();}; this.calendarClose = obj; obj = this.getElementById("calendarYear"); obj.onchange = function () {calendar.update(calendar);}; obj.onblur = function () {calendar.onblur();}; this.calendarYear = obj; obj = this.getElementById("calendarMonth"); with(obj){ onchange = function () {calendar.update(calendar);}; onblur = function () {calendar.onblur();}; }this.calendarMonth = obj; obj = this.getElementById("calendarHour"); obj.onchange = function () {calendar.hour = this.options[this.selectedIndex].value;}; obj.onblur = function () {calendar.onblur();}; this.calendarHour = obj; obj = this.getElementById("calendarMinute"); obj.onchange = function () {calendar.minute = this.options[this.selectedIndex].value;}; obj.onblur = function () {calendar.onblur();}; this.calendarMinute = obj; obj = this.getElementById("calendarSecond"); obj.onchange = function () {calendar.second = this.options[this.selectedIndex].value;}; obj.onblur = function () {calendar.onblur();}; this.calendarSecond = obj; obj = this.getElementById("calendarToday"); obj.onclick = function () { var today = (calendar.DateMode != pickMode["day"]) ? new Date(calendar.year,calendar.month,calendar.day,calendar.hour,calendar.minute,calendar.second) : new Date().format(calendar.dateFormatStyle).toDate(calendar.dateFormatStyle); calendar.ReturnDate(today,today.format(calendar.dateFormatStyle)); calendar.postEvent(); }; this.calendarToday = obj; }; function setMaxDate(){ calendar.ReturnDate(calendar.endDate,calendar.endDate.format(calendar.dateFormatStyle)); calendar.postEvent(); } //年份下拉框绑定数据 Calendar.prototype.bindYear = function() { var cy = this.calendarYear; cy.length = 0; for (var i = this.beginYear; i <= this.endYear; i++){ cy.options[cy.length] = new Option(i + Calendar.getLanguage()["year"], i); } }; //月份下拉框绑定数据 Calendar.prototype.bindMonth = function() { var cm = this.calendarMonth; cm.length = 0; for (var i = 0; i < 12; i++){ cm.options[cm.length] = new Option(Calendar.getLanguage()["months"][i], i); } }; //小时下拉框绑定数据 Calendar.prototype.bindHour = function() { var ch = this.calendarHour; if(ch.length > 0){return;}// 不需要重新绑定,提高性能 //ch.length = 0; var h; for (var i = 0; i < 24; i++){ h = ("00" + i +"").substr(("" + i).length); ch.options[ch.length] = new Option(h, h); } }; //分钟下拉框绑定数据 Calendar.prototype.bindMinute = function() { var cM = this.calendarMinute; if(cM.length > 0){return;}//不需要重新绑定,提高性能 //cM.length = 0; var M; for (var i = 0; i < 60; i++){ M = ("00" + i +"").substr(("" + i).length); cM.options[cM.length] = new Option(M, M); } }; //秒钟下拉框绑定数据 Calendar.prototype.bindSecond = function() { var cs = this.calendarSecond; if(cs.length > 0){return;}//不需要重新绑定,提高性能 //cs.length = 0; var s; for (var i = 0; i < 60; i++){ s = ("00" + i +"").substr(("" + i).length); cs.options[cs.length] = new Option(s, s); } }; //向前一年 Calendar.prototype.goPrevYear = function(e){ if (this.year == this.beginYear){return;} this.year--; this.date = new Date(this.year, this.month, 1); if(this.datethis.endDate){ this.date = this.endDate; this.year = this.date.getFullYear(); this.month = this.date.getMonth(); } this.day = this.date.getDate(); this.changeSelect(); this.bindData(); }; //向后一年 Calendar.prototype.goNextYear = function(e){ if (this.year == this.endYear){return;} this.year++; this.date = new Date(this.year, this.month, 1); if(this.date>this.endDate){ this.date = this.endDate; this.year = this.date.getFullYear(); this.month = this.date.getMonth(); } this.day = this.date.getDate(); this.changeSelect(); this.bindData(); }; //改变SELECT选中状态 Calendar.prototype.changeSelect = function() { var cy = this.calendarYear; var cm = this.calendarMonth; var ch = this.calendarHour; var cM = this.calendarMinute; var cs = this.calendarSecond; //减少运算次数 if(this.date.getFullYear()this.endYear || (this.date.getFullYear()==this.endYear && this.date.getMonth()>this.endDate.getMonth())){ cy[cy.length-1].selected = true; cm[this.endDate.getMonth()].selected =true; this.date = new Date(this.endYear, this.endDate.getMonth(), 1); }else{ cy[this.date.getFullYear()-this.beginYear].selected = true; cm[this.date.getMonth()].selected =true; } //初始化时间的值 ch[this.hour].selected =true; cM[this.minute].selected =true; cs[this.second].selected =true; }; //更新年、月 Calendar.prototype.update = function (e){ this.year = e.calendarYear.options[e.calendarYear.selectedIndex].value; this.month = e.calendarMonth.options[e.calendarMonth.selectedIndex].value; this.date = new Date(this.year, this.month, 1); if(this.date > this.endDate){ this.date = this.endDate; this.year = this.endDate.getFullYear(); this.month = this.endDate.getMonth(); } if(this.date < this.beginDate){ this.date = this.beginDate; this.year = this.beginDate.getFullYear(); this.month = this.beginDate.getMonth(); } this.day = this.date.getDate(); this.changeSelect(); this.bindData(); }; Calendar.prototype.isValidDate = function(datevalue){ if(this.beginDate && datevaluenew Date(this.endDate.getFullYear(), this.endDate.getMonth(), this.endDate.getDate())) return false; return true; }; Calendar.prototype.postEvent = function() {}; Calendar.prototype.dayValue = function() {}; // 绑定数据到月视图 Calendar.prototype.bindData = function () { var calendar = this; if(calendar.DateMode >= pickMode["month"]){return;} // var dateArray = this.getMonthViewArray(this.date.getYear(), // this.date.getMonth()); // 修改 在Firefox 下年份错误 var dateArray = this.getMonthViewArray(this.date.getFullYear(), this.date.getMonth()); var tds = this.getElementById("calendarTable").getElementsByTagName("td"); for(var i = 0; i < tds.length; i++) { tds[i].style.backgroundColor = calendar.colors["td_bg_out"]; tds[i].onclick = function () {return;}; tds[i].onmouseover = function () {return;}; tds[i].onmouseout = function () {return;}; if (i > dateArray.length - 1) break; tds[i].innerHTML = dateArray[i]; if(calendar.isValidDate(new Date(calendar.date.getFullYear(),calendar.date.getMonth(),dateArray[i]))==false){ tds[i].style.textDecoration = "line-through"; tds[i].style.color="#cccccc"; }else{ tds[i].style.textDecoration = "none"; tds[i].style.color="#000000"; } if (dateArray[i] != " "){ tds[i].bgColorTxt = "td_bg_out"; // 保存背景色的class var cur = new Date(); tds[i].isToday = false; if (cur.getFullYear() == calendar.date.getFullYear() && cur.getMonth() == calendar.date.getMonth() && cur.getDate() == dateArray[i]) { // 是今天的单元格 tds[i].style.backgroundColor = calendar.colors["cur_bg"]; tds[i].bgColorTxt = "cur_bg"; tds[i].isToday = true; } if(calendar.dateControl != null ){ if (calendar.date.getDate() == dateArray[i]) { // 是已被选中的单元格 calendar.selectedDayTD = tds[i]; tds[i].style.backgroundColor = calendar.colors["sel_bg"]; tds[i].bgColorTxt = "sel_bg"; } } tds[i].onclick = function () { if(calendar.DateMode == pickMode["day"]){ // 当选择日期时,点击格子即返回值 var dReturnDate = new Date(calendar.date.getFullYear(),calendar.date.getMonth(),this.innerHTML); calendar.ReturnDate(dReturnDate,dReturnDate.format(calendar.dateFormatStyle)); }else{ if(calendar.selectedDayTD != null){ // 清除已选中的背景色 calendar.selectedDayTD.style.backgroundColor =(calendar.selectedDayTD.isToday)? calendar.colors["cur_bg"] : calendar.colors["td_bg_out"]; calendar.selectedDayTD.bgColorTxt = "td_bg_out"; } this.style.backgroundColor = calendar.colors["sel_bg"]; calendar.day = this.innerHTML; calendar.selectedDayTD = this; // 记录已选中的日子 } calendar.postEvent(); }; if(calendar.isValidDate(new Date(calendar.date.getFullYear(),calendar.date.getMonth(),this.innerHTML))){ tds[i].style.cursor ="pointer"; // 鼠标变成手指状 }else{ tds[i].style.cursor ="default"; } tds[i].onmouseover = function () { if(calendar.isValidDate(new Date(calendar.date.getFullYear(),calendar.date.getMonth(),this.innerHTML))) this.style.backgroundColor = calendar.colors["td_bg_over"]; }; tds[i].onmouseout = function () { if(calendar.selectedDayTD != this) { if(calendar.isValidDate(new Date(calendar.date.getFullYear(),calendar.date.getMonth(),this.innerHTML))) this.style.backgroundColor = calendar.colors[this.bgColorTxt]; } }; tds[i].onblur = function () {calendar.onblur();}; } } }; //根据年、月得到月视图数据(数组形式) Calendar.prototype.getMonthViewArray = function (y, m) { var mvArray = []; var dayOfFirstDay = new Date(y, m, 1).getDay(); var daysOfMonth = new Date(y, m + 1, 0).getDate(); for (var i = 0; i < 42; i++) { mvArray[i] = " "; } for (var i = 0; i < daysOfMonth; i++){ mvArray[i + dayOfFirstDay] = i + 1; } return mvArray; }; //扩展 document.getElementById(id) 多浏览器兼容性 from meizz tree source Calendar.prototype.getElementById = function(id){ if (typeof(id) != "string" || id == "") return null; if (document.getElementById) return document.getElementById(id); if (document.all) return document.all(id); try {return eval(id);} catch(e){ return null;} }; //扩展 object.getElementsByTagName(tagName) Calendar.prototype.getElementsByTagName = function(object, tagName){ if (document.getElementsByTagName) return document.getElementsByTagName(tagName); if (document.all) return document.all.tags(tagName); }; //取得HTML控件绝对位置 Calendar.prototype.getAbsPoint = function (e){ var x = e.offsetLeft; var y = e.offsetTop; //alert(e.offsetParent.outerHTML+x+','+y); var e1 = e; while(e1 = e1.offsetParent){ x += e1.offsetLeft; y += e1.offsetTop; } var iScrollTop = 0; var iScrollLeft = 0; var e2 = e; while(e2 = e2.parentNode){ if(e2.scrollTop) iScrollTop += e2.scrollTop; if(e2.scrollLeft) iScrollLeft += e2.scrollLeft; } //alert("iScrollTop="+ iScrollTop); return {"x": x-iScrollLeft, "y": y-iScrollTop}; }; //显示日历 Calendar.prototype.show = function (dateObj, popControl) { if(this.isInlist==undefined)this.isInlist=true; if (dateObj == null){ //throw new Error("arguments[0] is necessary"); } this.dateControl = dateObj; this.date = new Date().format(this.dateFormatStyle).toDate(this.dateFormatStyle); if(dateObj.value.length > 0) this.date = new Date(dateObj.value.toDate(this.dateFormatStyle)); if(this.date < this.beginDate) this.date = this.beginDate; if(this.date > this.endDate) this.date = this.endDate; this.draw(); this.bindYear(); this.bindMonth(); this.bindHour(); this.bindMinute(); this.bindSecond(); this.year = this.date.getFullYear(); this.month = this.date.getMonth(); this.day = this.date.getDate(); this.hour = this.date.getHours(); this.minute = this.date.getMinutes(); this.second = this.date.getSeconds(); this.changeSelect(); this.bindData(); if (popControl == null){ popControl = dateObj; } // 把 visibility 变为 display,并添加失去焦点的事件 //this.setDisplayStyle("select", "hidden"); //this.panel.style.visibility = "visible"; //this.container.style.visibility = "visible"; this.panel.style.display = ""; this.container.style.display = ""; var xy = this.getAbsPoint(popControl); //this.panel.style.left = xy.x + "px"; //this.panel.style.top = (xy.y + dateObj.offsetHeight) + "px"; this.panel.style.left = (xy.x + leftX)+ "px"; //alert("document.dateObj.scrollTop=" + (document.body.scrollHeight - document.body.clientHeight)); //alert(document.body.outerHTML); var top = (xy.y + topY + dateObj.offsetHeight); if(top + this.panel.offsetHeight > document.body.offsetHeight - document.body.scrollTop){ top = top - this.panel.offsetHeight - dateObj.offsetHeight; if(top < 0) top = document.body.scrollTop; } this.panel.style.top = top + "px"; if( !this.dateControl.isTransEvent){ this.dateControl.isTransEvent = true; /* 已写在返回值的时候 ReturnDate 函数中,去除验证事件的函数 this.dateControl.changeEvent = this.dateControl.onchange;//将 onchange 转成其它函数,以免触发验证事件 this.dateControl.onchange = function() {if(typeof(this.changeEvent) =='function'){this.changeEvent();}}*/ if(this.dateControl.onblur != null){ this.dateControl.blurEvent = this.dateControl.onblur;}//保存主文本框的 onblur ,使其原本的事件不被覆盖 this.dateControl.onblur = function(){ calendar.onblur();if(typeof(this.blurEvent) =='function'){this.blurEvent();} }; } this.container.onmouseover = function(){isFocus=true;}; this.container.onmouseout = function(){isFocus=false;}; }; //隐藏日历 Calendar.prototype.hide = function() { //this.setDisplayStyle("select", "visible"); //this.panel.style.visibility = "hidden"; //this.container.style.visibility = "hidden"; this.panel.style.display = "none"; this.container.style.display = "none"; isFocus=false; }; //焦点转移时隐藏日历 → 由寒羽枫 2006-06-25 添加 Calendar.prototype.onblur = function() { if(!isFocus){this.hide();} }; // 确保日历容器节点在 body 最后,否则 FireFox 中不能出现在最上方 function InitContainerPanel(){ //初始化容器 var str = ''; if(document.all){ str += ''; } var div = document.createElement("div"); div.innerHTML = str; div.id = "ContainerPanel"; div.style.display ="none"; document.body.appendChild(div); }//调用calendar.show(dateControl, popControl); Date.prototype.Format = function (fmt) { //author: meizz var o = { "M+": this.getMonth() + 1, "d+": this.getDate(), "h+": this.getHours(), "m+": this.getMinutes(), "s+": this.getSeconds(), "q+": Math.floor((this.getMonth() + 3) / 3), "S": this.getMilliseconds() }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; }