JS日历控件 (兼容IE firefox) 可选择时间

js代码如下:

View Code
   1 <!--   
   2 var cal;   
   3 var isFocus=false; //是否为焦点   
   4 var pickMode ={   
   5     "second":1,   
   6     "minute":2,   
   7     "hour":3,   
   8     "day":4,   
   9     "month":5,   
  10     "year":6  };   
  11        
  12 var topY=0,leftX=0;  //自定义定位偏移量 2007-02-11 由 寒羽枫添加   
  13 //选择日期 → 由 寒羽枫 2007-06-10 添加,通过 ID 来选日期   
  14 function SelectDateById(id,strFormat,x,y)   
  15 {   
  16     var obj = document.getElementById(id);   
  17     if(obj == null){return false;}   
  18     obj.focus();   
  19     if(obj.onclick != null){obj.onclick();}   
  20     else if(obj.click != null){obj.click();}   
  21     else{SelectDate(obj,strFormat,x,y)}   
  22 }   
  23   
  24 //选择日期 → 由 寒羽枫 2006-06-25 添加   
  25 function SelectDate(obj,strFormat,x,y)   
  26 {   
  27   
  28     leftX =(x == null) ? leftX : x;   
  29     topY  =(y == null) ? topY : y;//自定义定位偏移量 2007-02-11 由 寒羽枫添加    
  30     if(document.getElementById("ContainerPanel")==null){InitContainerPanel();}   
  31     var date = new Date();   
  32     var by = date.getFullYear()-50;  //最小值 → 50 年前   
  33     var ey = date.getFullYear()+50;  //最大值 → 50 年后   
  34     //cal = new Calendar(by, ey,1,strFormat);    //初始化英文版,0 为中文版   
  35     cal = (cal==null) ? new Calendar(by, ey, 0) : cal;    //不用每次都初始化 2006-12-03 修正   
  36     cal.DateMode =pickMode["second"]; //复位   
  37       if(strFormat.indexOf('s')< 0) {cal.DateMode =pickMode["minute"];}//精度为分   
  38       if(strFormat.indexOf('m')< 0) {cal.DateMode =pickMode["hour"];}//精度为时   
  39       if(strFormat.indexOf('h')< 0) {cal.DateMode =pickMode["day"];}//精度为日   
  40       if(strFormat.indexOf('d')< 0) {cal.DateMode =pickMode["month"];}//精度为月   
  41       if(strFormat.indexOf('M')< 0) {cal.DateMode =pickMode["year"];}//精度为年   
  42       if(strFormat.indexOf('y')< 0) {cal.DateMode =pickMode["second"];}//默认精度为秒   
  43     cal.dateFormatStyleOld = cal.dateFormatStyle;   
  44     cal.dateFormatStyle = strFormat;   
  45     cal.show(obj);   
  46 }   
  47 /**//**//**//**//**//**//**//**  
  48  * 返回日期  
  49  * @param d the delimiter  
  50  * @param p the pattern of your date  
  51  2006-06-25 由 寒羽枫 修改为根据用户指定的 style 来确定;  
  52  */  
  53 String.prototype.toDate = function(style) {   
  54   var y = this.substring(style.indexOf('y'),style.lastIndexOf('y')+1);//
  55   var M = this.substring(style.indexOf('M'),style.lastIndexOf('M')+1);//
  56   var d = this.substring(style.indexOf('d'),style.lastIndexOf('d')+1);//
  57   var h = this.substring(style.indexOf('h'),style.lastIndexOf('h')+1);//
  58   var m = this.substring(style.indexOf('m'),style.lastIndexOf('m')+1);//
  59   var s = this.substring(style.indexOf('s'),style.lastIndexOf('s')+1);//
  60   
  61   if(s == null ||s == "" || isNaN(s)) {s = new Date().getSeconds();}   
  62   if(m == null ||m == "" || isNaN(m)) {m = new Date().getMinutes();}   
  63   if(h == null ||h == "" || isNaN(h)) {h = new Date().getHours();}   
  64   if(d == null ||d == "" || isNaN(d)) {d = new Date().getDate();}   
  65   if(M == null ||M == "" || isNaN(M)) {M = new Date().getMonth()+1;}   
  66   if(y == null ||y == "" || isNaN(y)) {y = new Date().getFullYear();}   
  67   var dt ;   
  68   eval ("dt = new Date('"+ y+"', '"+(M-1)+"','"+ d+"','"+ h+"','"+ m+"','"+ s +"')");   
  69   return dt;   
  70 }   
  71   
  72 /**//**//**//**//**//**//**//**  
  73  * 格式化日期  
  74  * @param   d the delimiter  
  75  * @param   p the pattern of your date  
  76  * @author  meizz  
  77  */  
  78 Date.prototype.format = function(style) {   
  79   var o = {   
  80     "M+" : this.getMonth() + 1, //month   
  81     "d+" : this.getDate(),      //day   
  82     "h+" : this.getHours(),     //hour   
  83     "m+" : this.getMinutes(),   //minute   
  84     "s+" : this.getSeconds(),   //second   
  85     "w+" : "天一二三四五六".charAt(this.getDay()),   //week   
  86     "q+" : Math.floor((this.getMonth() + 3) / 3),  //quarter   
  87     "S"  : this.getMilliseconds() //millisecond   
  88   }   
  89   if(/(y+)/.test(style)) {   
  90     style = style.replace(RegExp.$1,   
  91     (this.getFullYear() + "").substr(4 - RegExp.$1.length));   
  92   }   
  93   for(var k in o){   
  94     if(new RegExp("("+ k +")").test(style)){   
  95       style = style.replace(RegExp.$1,   
  96         RegExp.$1.length == 1 ? o[k] :   
  97         ("00" + o[k]).substr(("" + o[k]).length));   
  98     }   
  99   }   
 100   return style;   
 101 }   
 102   
 103 //2007-09-14  由寒羽枫添加返回所选日期   
 104 Calendar.prototype.ReturnDate = function(dt) {   
 105     if (this.dateControl != null){this.dateControl.value = dt;}   
 106     calendar.hide();   
 107     if(this.dateControl.onchange == null){return;}     
 108     //将 onchange 转成其它函数,以免触发验证事件   
 109     var ev = this.dateControl.onchange.toString(); //找出函数的字串   
 110     ev = ev.substring(   
 111             ((ev.indexOf("ValidatorOnChange();")> 0) ? ev.indexOf("ValidatorOnChange();") + 20 : ev.indexOf("{") + 1)   
 112                 , ev.lastIndexOf("}"));//去除验证函数 ValidatorOnChange();   
 113     var fun = new Function(ev);     //重新定义函数   
 114     this.dateControl.changeEvent = fun;    
 115     this.dateControl.changeEvent();//触发自定义 changeEvent 函数   
 116 }   
 117   
 118 /**//**//**//**//**//**//**//**  
 119  * 日历类  
 120  * @param   beginYear 1990  
 121  * @param   endYear   2010  
 122  * @param   lang      0(中文)|1(英语) 可自由扩充  
 123  * @param   dateFormatStyle  "yyyy-MM-dd";  
 124  * @version 2006-04-01  
 125  * @author  KimSoft (jinqinghua [at] gmail.com)  
 126  * @update  
 127  */  
 128 function Calendar(beginYear, endYear, lang, dateFormatStyle) {   
 129   this.beginYear = 1950;   
 130   this.endYear = 2050;   
 131   this.lang = 0;            //0(中文) | 1(英文)   
 132   this.dateFormatStyle = "yyyy-MM-dd hh:mm:ss";   
 133   
 134   if (beginYear != null && endYear != null){   
 135     this.beginYear = beginYear;   
 136     this.endYear = endYear;   
 137   }   
 138   if (lang != null){   
 139     this.lang = lang   
 140   }   
 141   
 142   if (dateFormatStyle != null){   
 143     this.dateFormatStyle = dateFormatStyle   
 144   }   
 145   
 146   this.dateControl = null;   
 147   this.panel = this.getElementById("calendarPanel");   
 148   this.container = this.getElementById("ContainerPanel");   
 149   this.form  = null;   
 150   
 151   this.date = new Date();   
 152   this.year = this.date.getFullYear();   
 153   this.month = this.date.getMonth();   
 154      
 155   this.day = this.date.getDate();   
 156   this.hour = this.date.getHours();   
 157   this.minute = this.date.getMinutes();   
 158   this.second = this.date.getSeconds();   
 159   
 160   this.colors = {   
 161   "cur_word"      : "#FFFFFF",  //当日日期文字颜色   
 162   "cur_bg"        : "#00FF00",  //当日日期单元格背影色   
 163   "sel_bg"        : "#FFCCCC",  //已被选择的日期单元格背影色 2006-12-03 寒羽枫添加     
 164   "sun_word"      : "#FF0000",  //星期天文字颜色     
 165   "sat_word"      : "#0000FF",  //星期六文字颜色     
 166   "td_word_light" : "#333333",  //单元格文字颜色     
 167   "td_word_dark"  : "#CCCCCC",  //单元格文字暗色     
 168   "td_bg_out"     : "#EFEFEF",  //单元格背影色   
 169   "td_bg_over"    : "#FFCC00",  //单元格背影色   
 170   "tr_word"       : "#FFFFFF",  //日历头文字颜色     
 171   "tr_bg"         : "#666666",  //日历头背影色   
 172   "input_border"  : "#CCCCCC",  //input控件的边框颜色     
 173   "input_bg"      : "#EFEFEF"   //input控件的背影色   
 174   }   
 175 /* //2008-01-29 放到了 show ,因为要做 pickMode 判断  
 176   this.draw();  
 177   this.bindYear();  
 178   this.bindMonth();  
 179   */  
 180   //this.changeSelect();   
 181   //this.bindData(); //2006-12-30 由民工.砖家注释   
 182 }   
 183   
 184 /**//**//**//**//**//**//**//**  
 185  * 日历类属性(语言包,可自由扩展)  
 186  */  
 187 Calendar.language = {   
 188   "year"   : [[""], [""]],   
 189   "months" : [["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],   
 190         ["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]   
 191          ],   
 192   "weeks"  : [["日","一","二","三","四","五","六"],   
 193         ["SUN","MON","TUR","WED","THU","FRI","SAT"]   
 194          ],   
 195   "hour"  : [["时"], ["H"]],   
 196   "minute"  : [["分"], ["M"]],   
 197   "second"  : [["秒"], ["S"]],   
 198   "clear"  : [["清空"], ["CLS"]],   
 199   "today"  : [["今天"], ["TODAY"]],   
 200   "pickTxt"  : [["确定"], ["OK"]],//pickMode 精确到年、月时把今天变成“确定”   
 201   "close"  : [["关闭"], ["CLOSE"]]   
 202 }   
 203   
 204 Calendar.prototype.draw = function() {   
 205   calendar = this;   
 206   
 207   var mvAry = [];   
 208   //mvAry[mvAry.length]  = '  <form name="calendarForm" style="margin: 0px;">'; //因 <form> 不能嵌套, 2006-12-01 由寒羽枫改用 Div   
 209   mvAry[mvAry.length]  = '  <div name="calendarForm" style="margin: 0px;">';   
 210   mvAry[mvAry.length]  = '    <table width="100%" border="0" cellpadding="0" cellspacing="1" style="font-size:12px;">';   
 211   mvAry[mvAry.length]  = '      <tr>';   
 212   mvAry[mvAry.length]  = '        <th align="left" width="1%"><input style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:16px;height:20px;';   
 213   if(calendar.DateMode > pickMode["month"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到年时隐藏“月”   
 214   mvAry[mvAry.length]  ='" name="prevMonth" type="button" id="prevMonth" value="&lt;" /></th>';   
 215   mvAry[mvAry.length]  = '        <th align="center" width="98%" nowrap="nowrap"><select name="calendarYear" id="calendarYear" style="font-size:12px;"></select><select name="calendarMonth" id="calendarMonth" style="font-size:12px;';   
 216   if(calendar.DateMode > pickMode["month"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到年时隐藏“月”   
 217   mvAry[mvAry.length]  = '"></select></th>';   
 218   mvAry[mvAry.length]  = '        <th align="right" width="1%"><input style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:16px;height:20px;';   
 219   if(calendar.DateMode > pickMode["month"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到年时隐藏“月”   
 220   mvAry[mvAry.length]  ='" name="nextMonth" type="button" id="nextMonth" value="&gt;" /></th>';   
 221   mvAry[mvAry.length]  = '      </tr>';   
 222   mvAry[mvAry.length]  = '    </table>';   
 223   mvAry[mvAry.length]  = '    <table id="calendarTable" width="100%" style="border:0px solid #CCCCCC;background-color:#FFFFFF;font-size:12px;';   
 224   if(calendar.DateMode >= pickMode["month"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到年、月时隐藏“天”   
 225   mvAry[mvAry.length]  = '" border="0" cellpadding="3" cellspacing="1">';   
 226   mvAry[mvAry.length]  = '      <tr>';   
 227   for(var i = 0; i < 7; i++) {   
 228     mvAry[mvAry.length]  = '      <th style="font-weight:normal;background-color:' + calendar.colors["tr_bg"] + ';color:' + calendar.colors["tr_word"] + ';">' + Calendar.language["weeks"][this.lang][i] + '</th>';   
 229   }   
 230   mvAry[mvAry.length]  = '      </tr>';   
 231   for(var i = 0; i < 6;i++){   
 232     mvAry[mvAry.length]  = '    <tr align="center">';   
 233     for(var j = 0; j < 7; j++) {   
 234       if (j == 0){   
 235         mvAry[mvAry.length]  = '  <td style="cursor:default;color:' + calendar.colors["sun_word"] + ';"></td>';   
 236       } else if(j == 6) {   
 237         mvAry[mvAry.length]  = '  <td style="cursor:default;color:' + calendar.colors["sat_word"] + ';"></td>';   
 238       } else {   
 239         mvAry[mvAry.length]  = '  <td style="cursor:default;"></td>';   
 240       }   
 241     }   
 242     mvAry[mvAry.length]  = '    </tr>';   
 243   }   
 244   
 245 //2009-03-03 添加的代码,放置时间的行   
 246   mvAry[mvAry.length]  = '      <tr style="';   
 247     if(calendar.DateMode >= pickMode["day"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到时日隐藏“时间”   
 248     mvAry[mvAry.length]  = '"><td align="center" colspan="7">';   
 249   mvAry[mvAry.length]  = '      <select name="calendarHour" id="calendarHour" style="font-size:12px;"></select>' + Calendar.language["hour"][this.lang];   
 250   mvAry[mvAry.length]  = '<span style="'  
 251     if(calendar.DateMode >= pickMode["hour"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到小时时隐藏“分”   
 252   mvAry[mvAry.length]  = '"><select name="calendarMinute" id="calendarMinute" style="font-size:12px;"></select>' + Calendar.language["minute"][this.lang]+'</span>';   
 253     mvAry[mvAry.length]  = '<span style="'  
 254     if(calendar.DateMode >= pickMode["minute"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到小时、分时隐藏“秒”   
 255    mvAry[mvAry.length]  = '"><select name="calendarSecond" id="calendarSecond" style="font-size:12px;"></select>'+ Calendar.language["second"][this.lang]+'</span>';   
 256   mvAry[mvAry.length]  = '      </td></tr>';   
 257      
 258   mvAry[mvAry.length]  = '    </table>';   
 259   //mvAry[mvAry.length]  = '  </from>';   
 260   mvAry[mvAry.length]  = '      <div align="center" style="padding:4px 4px 4px 4px;background-color:' + calendar.colors["input_bg"] + ';">';   
 261   mvAry[mvAry.length]  = '        <input name="calendarClear" type="button" id="calendarClear" value="' + Calendar.language["clear"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:40px;height:20px;font-size:12px;cursor:pointer;"/>';   
 262   mvAry[mvAry.length]  = '        <input name="calendarToday" type="button" id="calendarToday" value="'    
 263   mvAry[mvAry.length]  = (calendar.DateMode == pickMode["day"]) ? Calendar.language["today"][this.lang] : Calendar.language["pickTxt"][this.lang];   
 264   mvAry[mvAry.length]  = '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:60px;height:20px;font-size:12px;cursor:pointer"/>';   
 265   mvAry[mvAry.length]  = '        <input name="calendarClose" type="button" id="calendarClose" value="' + Calendar.language["close"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:40px;height:20px;font-size:12px;cursor:pointer"/>';   
 266   mvAry[mvAry.length]  = '      </div>';   
 267      
 268   mvAry[mvAry.length]  = '  </div>';   
 269   this.panel.innerHTML = mvAry.join("");   
 270      
 271   /**//**//**//******** 以下代码由寒羽枫 2006-12-01 添加 **********/  
 272   var obj = this.getElementById("prevMonth");   
 273   obj.onclick = function () {calendar.goPrevMonth(calendar);}   
 274   obj.onblur = function () {calendar.onblur();}   
 275   this.prevMonth= obj;   
 276      
 277   obj = this.getElementById("nextMonth");   
 278   obj.onclick = function () {calendar.goNextMonth(calendar);}   
 279   obj.onblur = function () {calendar.onblur();}   
 280   this.nextMonth= obj;     
 281   
 282   obj = this.getElementById("calendarClear");   
 283   obj.onclick = function ()    
 284   { calendar.ReturnDate(""); /*calendar.dateControl.value = "";calendar.hide();*///2007-09-14 由寒羽枫注释   
 285   }   
 286   this.calendarClear = obj;   
 287      
 288   obj = this.getElementById("calendarClose");   
 289   obj.onclick = function () {calendar.hide();}   
 290   this.calendarClose = obj;   
 291      
 292   obj = this.getElementById("calendarYear");   
 293   obj.onchange = function () {calendar.update(calendar);}   
 294   obj.onblur = function () {calendar.onblur();}   
 295   this.calendarYear = obj;   
 296      
 297   obj = this.getElementById("calendarMonth");   
 298   with(obj)   
 299   {   
 300     onchange = function () {calendar.update(calendar);}   
 301     onblur = function () {calendar.onblur();}   
 302   }this.calendarMonth = obj;   
 303      
 304   obj = this.getElementById("calendarHour");   
 305   obj.onchange = function () {calendar.hour = this.options[this.selectedIndex].value;}   
 306   obj.onblur = function () {calendar.onblur();}   
 307   this.calendarHour = obj;   
 308       
 309   obj = this.getElementById("calendarMinute");   
 310   obj.onchange = function () {calendar.minute = this.options[this.selectedIndex].value;}   
 311   obj.onblur = function () {calendar.onblur();}   
 312   this.calendarMinute = obj;   
 313      
 314   obj = this.getElementById("calendarSecond");   
 315   obj.onchange = function () {calendar.second = this.options[this.selectedIndex].value;}   
 316   obj.onblur = function () {calendar.onblur();}   
 317   this.calendarSecond = obj;   
 318   
 319   obj = this.getElementById("calendarToday");   
 320   obj.onclick = function () {   
 321   var today = (calendar.DateMode != pickMode["day"]) ?   
 322                     new Date(calendar.year,calendar.month,calendar.day,calendar.hour,calendar.minute,calendar.second)   
 323                     : new Date();//2008-01-29   
 324     calendar.ReturnDate(today.format(calendar.dateFormatStyle));   
 325   }   
 326   this.calendarToday = obj;   
 327 }   
 328   
 329 //年份下拉框绑定数据   
 330 Calendar.prototype.bindYear = function() {   
 331   var cy = this.calendarYear;//2006-12-01 由寒羽枫修改   
 332   cy.length = 0;   
 333   for (var i = this.beginYear; i <= this.endYear; i++){   
 334     cy.options[cy.length] = new Option(i + Calendar.language["year"][this.lang], i);   
 335   }   
 336 }   
 337   
 338 //月份下拉框绑定数据   
 339 Calendar.prototype.bindMonth = function() {   
 340   var cm = this.calendarMonth;//2006-12-01 由寒羽枫修改   
 341   cm.length = 0;   
 342   for (var i = 0; i < 12; i++){   
 343     cm.options[cm.length] = new Option(Calendar.language["months"][this.lang][i], i);   
 344   }   
 345 }   
 346   
 347 //小时下拉框绑定数据   
 348 Calendar.prototype.bindHour = function() {   
 349   var ch = this.calendarHour;   
 350   if(ch.length > 0){return;}//2009-03-03 不需要重新绑定,提高性能   
 351   //ch.length = 0;   
 352   var h;   
 353   for (var i = 0; i < 24; i++){   
 354     h = ("00" + i +"").substr(("" + i).length);   
 355     ch.options[ch.length] = new Option(h, h);   
 356   }   
 357 }   
 358   
 359 //分钟下拉框绑定数据   
 360 Calendar.prototype.bindMinute = function() {   
 361   var cM = this.calendarMinute;   
 362   if(cM.length > 0){return;}//2009-03-03 不需要重新绑定,提高性能   
 363   //cM.length = 0;   
 364   var M;   
 365   for (var i = 0; i < 60; i++){   
 366     M = ("00" + i +"").substr(("" + i).length);   
 367     cM.options[cM.length] = new Option(M, M);   
 368   }   
 369 }   
 370   
 371 //秒钟下拉框绑定数据   
 372 Calendar.prototype.bindSecond = function() {   
 373   var cs = this.calendarSecond;   
 374   if(cs.length > 0){return;}//2009-03-03 不需要重新绑定,提高性能   
 375   //cs.length = 0;   
 376   var s;   
 377   for (var i = 0; i < 60; i++){   
 378     s = ("00" + i +"").substr(("" + i).length);   
 379     cs.options[cs.length] = new Option(s, s);   
 380   }   
 381 }   
 382   
 383 //向前一月   
 384 Calendar.prototype.goPrevMonth = function(e){   
 385   if (this.year == this.beginYear && this.month == 0){return;}   
 386   this.month--;   
 387   if (this.month == -1) {   
 388     this.year--;   
 389     this.month = 11;   
 390   }   
 391   this.date = new Date(this.year, this.month, 1);   
 392   this.changeSelect();   
 393   this.bindData();   
 394 }   
 395   
 396 //向后一月   
 397 Calendar.prototype.goNextMonth = function(e){   
 398   if (this.year == this.endYear && this.month == 11){return;}   
 399   this.month++;   
 400   if (this.month == 12) {   
 401     this.year++;   
 402     this.month = 0;   
 403   }   
 404   this.date = new Date(this.year, this.month, 1);   
 405   this.changeSelect();   
 406   this.bindData();   
 407 }   
 408   

 409 //改变SELECT选中状态   
 410 Calendar.prototype.changeSelect = function() {   
 411   var cy = this.calendarYear;//2006-12-01 由寒羽枫修改   
 412   var cm = this.calendarMonth;   
 413   var ch = this.calendarHour;   
 414   var cM = this.calendarMinute;   
 415   var cs = this.calendarSecond;   
 416 //2006-12-30 由民工.砖家修改,减少运算次数   
 417   cy[this.date.getFullYear()-this.beginYear].selected = true;   
 418   cm[this.date.getMonth()].selected =true;   
 419      
 420 //2009-03-03 添加,初始化时间的值   
 421   ch[this.hour].selected =true;   
 422   cM[this.minute].selected =true;   
 423   cs[this.second].selected =true;   
 424 }   
 425   
 426 //更新年、月   
 427 Calendar.prototype.update = function (e){   
 428   this.year  = e.calendarYear.options[e.calendarYear.selectedIndex].value;//2006-12-01 由寒羽枫修改   
 429   this.month = e.calendarMonth.options[e.calendarMonth.selectedIndex].value;   
 430   this.date = new Date(this.year, this.month, 1);   
 431   //this.changeSelect();   
 432   this.bindData();   
 433 }   
 434   
 435 //绑定数据到月视图   
 436 Calendar.prototype.bindData = function () {   
 437   var calendar = this;   
 438     if(calendar.DateMode >= pickMode["month"]){return;}//2008-01-29   
 439  // var dateArray = this.getMonthViewArray(this.date.getYear(), this.date.getMonth());   
 440   //2006-12-30 由民工.砖家修改 在Firefox 下年份错误   
 441   var dateArray = this.getMonthViewArray(this.date.getFullYear(), this.date.getMonth());   
 442  var tds = this.getElementById("calendarTable").getElementsByTagName("td");   
 443   for(var i = 0; i < tds.length; i++) {   
 444   tds[i].style.backgroundColor = calendar.colors["td_bg_out"];   
 445     tds[i].onclick = function () {return;}   
 446     tds[i].onmouseover = function () {return;}   
 447     tds[i].onmouseout = function () {return;}   
 448     if (i > dateArray.length - 1) break;   
 449     tds[i].innerHTML = dateArray[i];   
 450     if (dateArray[i] != "&nbsp;"){   
 451       tds[i].bgColorTxt = "td_bg_out"; //2009-03-03 保存背景色的class   
 452         var cur = new Date();   
 453         tds[i].isToday = false;   
 454       if (cur.getFullYear() == calendar.date.getFullYear() && cur.getMonth() == calendar.date.getMonth() && cur.getDate() == dateArray[i]) {   
 455       //是今天的单元格   
 456         tds[i].style.backgroundColor = calendar.colors["cur_bg"];   
 457         tds[i].bgColorTxt = "cur_bg";   
 458         tds[i].isToday = true;   
 459         }   
 460     if(calendar.dateControl != null )   
 461     {   
 462       cur = calendar.dateControl.value.toDate(calendar.dateFormatStyle);   
 463       if (cur.getFullYear() == calendar.date.getFullYear() && cur.getMonth() == calendar.date.getMonth()&& cur.getDate() == dateArray[i]) {   
 464       //是已被选中的单元格   
 465         calendar.selectedDayTD = tds[i];   
 466         tds[i].style.backgroundColor = calendar.colors["sel_bg"];   
 467         tds[i].bgColorTxt = "sel_bg";   
 468       }   
 469     }   
 470       tds[i].onclick = function () {   
 471             if(calendar.DateMode == pickMode["day"]) //2009-03-03 当选择日期时,点击格子即返回值   
 472             {   
 473                 calendar.ReturnDate(new Date(calendar.date.getFullYear(),   
 474                                                     calendar.date.getMonth(),   
 475                                                     this.innerHTML).format(calendar.dateFormatStyle));   
 476             }   
 477             else  
 478             {   
 479                 if(calendar.selectedDayTD != null) //2009-03-03 清除已选中的背景色   
 480                 {   
 481                     calendar.selectedDayTD.style.backgroundColor =(calendar.selectedDayTD.isToday)? calendar.colors["cur_bg"] : calendar.colors["td_bg_out"];   
 482                 }   
 483                 this.style.backgroundColor = calendar.colors["sel_bg"];   
 484                 calendar.day = this.innerHTML;   
 485                 calendar.selectedDayTD = this; //2009-03-03 记录已选中的日子   
 486             }   
 487           }   
 488       tds[i].style.cursor ="pointer"; //2007-08-06 由寒羽枫添加,鼠标变成手指状   
 489       tds[i].onmouseover = function () {   
 490         this.style.backgroundColor = calendar.colors["td_bg_over"];   
 491       }   
 492       tds[i].onmouseout = function () {   
 493         if(calendar.selectedDayTD != this) {   
 494         this.style.backgroundColor = calendar.colors[this.bgColorTxt];}   
 495       }   
 496       tds[i].onblur = function () {calendar.onblur();}   
 497     }   
 498   }   
 499 }   
 500   
 501 //根据年、月得到月视图数据(数组形式)   
 502 Calendar.prototype.getMonthViewArray = function (y, m) {   
 503   var mvArray = [];   
 504   var dayOfFirstDay = new Date(y, m, 1).getDay();   
 505   var daysOfMonth = new Date(y, m + 1, 0).getDate();   
 506   for (var i = 0; i < 42; i++) {   
 507     mvArray[i] = "&nbsp;";   
 508   }   
 509   for (var i = 0; i < daysOfMonth; i++){   
 510     mvArray[i + dayOfFirstDay] = i + 1;   
 511   }   
 512   return mvArray;   
 513 }   
 514   
 515 //扩展 document.getElementById(id) 多浏览器兼容性 from meizz tree source   
 516 Calendar.prototype.getElementById = function(id){   
 517   if (typeof(id) != "string" || id == "") return null;   
 518   if (document.getElementById) return document.getElementById(id);   
 519   if (document.all) return document.all(id);   
 520   try {return eval(id);} catch(e){ return null;}   
 521 }   
 522   
 523 //扩展 object.getElementsByTagName(tagName)   
 524 Calendar.prototype.getElementsByTagName = function(object, tagName){   
 525   if (document.getElementsByTagName) return document.getElementsByTagName(tagName);   
 526   if (document.all) return document.all.tags(tagName);   
 527 }   
 528   
 529 //取得HTML控件绝对位置   
 530 Calendar.prototype.getAbsPoint = function (e){   
 531   var x = e.offsetLeft;   
 532   var y = e.offsetTop;   
 533   while(e = e.offsetParent){   
 534     x += e.offsetLeft;   
 535     y += e.offsetTop;   
 536   }   
 537   return {"x": x, "y": y};   
 538 }   
 539   
 540 //显示日历   
 541 Calendar.prototype.show = function (dateObj, popControl) {   
 542   if (dateObj == null){   
 543     throw new Error("arguments[0] is necessary")   
 544   }   
 545   this.dateControl = dateObj;   
 546   var now =  new Date();   
 547   this.date = (dateObj.value.length > 0) ? new Date(dateObj.value.toDate(this.dateFormatStyle)) : now.format(this.dateFormatStyle).toDate(this.dateFormatStyle) ;//2008-01-29 寒羽枫添加 → 若为空则根据dateFormatStyle初始化日期   
 548   
 549   if(this.panel.innerHTML==""||cal.dateFormatStyleOld != cal.dateFormatStyle)//2008-01-29 把构造表格放在此处,2009-03-03 若请示的样式改变,则重新初始化   
 550   {   
 551     this.draw();   
 552     this.bindYear();   
 553     this.bindMonth();   
 554     this.bindHour();   
 555     this.bindMinute();   
 556     this.bindSecond();   
 557   }   
 558   this.year = this.date.getFullYear();   
 559   this.month = this.date.getMonth();   
 560   this.day = this.date.getDate();   
 561   this.hour = this.date.getHours();   
 562   this.minute = this.date.getMinutes();   
 563   this.second = this.date.getSeconds();   
 564   this.changeSelect();   
 565   this.bindData();   
 566   
 567   if (popControl == null){   
 568     popControl = dateObj;   
 569   }   
 570   var xy = this.getAbsPoint(popControl);   
 571   //this.panel.style.left = xy.x + "px";   
 572   //this.panel.style.top = (xy.y + dateObj.offsetHeight) + "px";   
 573   this.panel.style.left = (xy.x + leftX)+ "px"; //由寒羽枫 2007-02-11 修改 → 加入自定义偏移量   
 574   this.panel.style.top = (xy.y + topY + dateObj.offsetHeight) + "px";   
 575      
 576   //由寒羽枫 2006-06-25 修改 → 把 visibility 变为 display,并添加失去焦点的事件  //this.setDisplayStyle("select", "hidden");   
 577   //this.panel.style.visibility = "visible";   
 578   //this.container.style.visibility = "visible";   
 579   this.panel.style.display = "";   
 580   this.container.style.display = "";   
 581      
 582   if( !this.dateControl.isTransEvent)   
 583   {   
 584     this.dateControl.isTransEvent = true;   
 585     /* 已写在返回值的时候  ReturnDate 函数中,去除验证事件的函数  
 586     this.dateControl.changeEvent = this.dateControl.onchange;//将 onchange 转成其它函数,以免触发验证事件  
 587     this.dateControl.onchange = function()  
 588     {if(typeof(this.changeEvent) =='function'){this.changeEvent();}}*/  
 589     if(this.dateControl.onblur != null){   
 590     this.dateControl.blurEvent = this.dateControl.onblur;}//2007-09-14 保存主文本框的 onblur ,使其原本的事件不被覆盖   
 591     this.dateControl.onblur = function()   
 592     {calendar.onblur();if(typeof(this.blurEvent) =='function'){this.blurEvent();}   
 593     }   
 594   }   
 595      
 596   this.container.onmouseover = function(){isFocus=true;}   
 597   this.container.onmouseout = function(){isFocus=false;}   
 598 }   
 599   
 600 //隐藏日历   
 601 Calendar.prototype.hide = function() {   
 602   //this.setDisplayStyle("select", "visible");   
 603   //this.panel.style.visibility = "hidden";   
 604   //this.container.style.visibility = "hidden";   
 605   this.panel.style.display = "none";   
 606   this.container.style.display = "none";   
 607   isFocus=false;   
 608 }   
 609   
 610 //焦点转移时隐藏日历 → 由寒羽枫 2006-06-25 添加   
 611 Calendar.prototype.onblur = function() {   
 612     if(!isFocus){this.hide();}   
 613 }   
 614   
 615 //以下由寒羽枫 2007-07-26 修改 → 确保日历容器节点在 body 最后,否则 FireFox 中不能出现在最上方   
 616 function InitContainerPanel() //初始化容器   
 617 {   
 618     var str = '<div id="calendarPanel" style="position: absolute;display: none;z-index:9999; background-color: #FFFFFF;border: 1px solid #CCCCCC;width:175px;font-size:12px;"></div>';   
 619     if(document.all)   
 620     {   
 621         str += '<iframe style="position:absolute;z-index:2000;width:expression(this.previousSibling.offsetWidth);';   
 622         str += 'height:expression(this.previousSibling.offsetHeight);';   
 623         str += 'left:expression(this.previousSibling.offsetLeft);top:expression(this.previousSibling.offsetTop);';   
 624         str += 'display:expression(this.previousSibling.style.display);" scrolling="no" frameborder="no"></iframe>';   
 625     }   
 626     var div = document.createElement("div");   
 627     div.innerHTML = str;   
 628     div.id = "ContainerPanel";   
 629     div.style.display ="none";   
 630     document.body.appendChild(div);   
 631 }//调用calendar.show(dateControl, popControl);   
 632 //-->  
 633 <!--
 634 var cal;
 635 var isFocus=false; //是否为焦点
 636 var pickMode ={
 637     "second":1,
 638     "minute":2,
 639     "hour":3,
 640     "day":4,
 641     "month":5,
 642     "year":6  };
 643     
 644 var topY=0,leftX=0;  //自定义定位偏移量 2007-02-11 由 寒羽枫添加
 645 //选择日期 → 由 寒羽枫 2007-06-10 添加,通过 ID 来选日期
 646 function SelectDateById(id,strFormat,x,y)
 647 {
 648  var obj = document.getElementById(id);
 649  if(obj == null){return false;}
 650  obj.focus();
 651  if(obj.onclick != null){obj.onclick();}
 652  else if(obj.click != null){obj.click();}
 653  else{SelectDate(obj,strFormat,x,y)}
 654 }
 655  
 656 //选择日期 → 由 寒羽枫 2006-06-25 添加
 657 function SelectDate(obj,strFormat,x,y)
 658 {
 659  
 660  leftX =(x == null) ? leftX : x;
 661  topY  =(y == null) ? topY : y;//自定义定位偏移量 2007-02-11 由 寒羽枫添加 
 662  if(document.getElementById("ContainerPanel")==null){InitContainerPanel();}
 663     var date = new Date();
 664     var by = date.getFullYear()-50;  //最小值 → 50 年前
 665     var ey = date.getFullYear()+50;  //最大值 → 50 年后
 666     //cal = new Calendar(by, ey,1,strFormat);    //初始化英文版,0 为中文版
 667     cal = (cal==null) ? new Calendar(by, ey, 0) : cal;    //不用每次都初始化 2006-12-03 修正
 668     cal.DateMode =pickMode["second"]; //复位
 669       if(strFormat.indexOf('s')< 0) {cal.DateMode =pickMode["minute"];}//精度为分
 670       if(strFormat.indexOf('m')< 0) {cal.DateMode =pickMode["hour"];}//精度为时
 671       if(strFormat.indexOf('h')< 0) {cal.DateMode =pickMode["day"];}//精度为日
 672       if(strFormat.indexOf('d')< 0) {cal.DateMode =pickMode["month"];}//精度为月
 673       if(strFormat.indexOf('M')< 0) {cal.DateMode =pickMode["year"];}//精度为年
 674       if(strFormat.indexOf('y')< 0) {cal.DateMode =pickMode["second"];}//默认精度为秒
 675     cal.dateFormatStyleOld = cal.dateFormatStyle;
 676     cal.dateFormatStyle = strFormat;
 677     cal.show(obj);
 678 }
 679 /**//**//**//**//**//**//**//**
 680  * 返回日期
 681  * @param d the delimiter
 682  * @param p the pattern of your date
 683  2006-06-25 由 寒羽枫 修改为根据用户指定的 style 来确定;
 684  */
 685 String.prototype.toDate = function(style) {
 686   var y = this.substring(style.indexOf('y'),style.lastIndexOf('y')+1);//
 687   var M = this.substring(style.indexOf('M'),style.lastIndexOf('M')+1);//
 688   var d = this.substring(style.indexOf('d'),style.lastIndexOf('d')+1);//
 689   var h = this.substring(style.indexOf('h'),style.lastIndexOf('h')+1);//
 690   var m = this.substring(style.indexOf('m'),style.lastIndexOf('m')+1);//
 691   var s = this.substring(style.indexOf('s'),style.lastIndexOf('s')+1);//
 692  
 693   if(s == null ||s == "" || isNaN(s)) {s = new Date().getSeconds();}
 694   if(m == null ||m == "" || isNaN(m)) {m = new Date().getMinutes();}
 695   if(h == null ||h == "" || isNaN(h)) {h = new Date().getHours();}
 696   if(d == null ||d == "" || isNaN(d)) {d = new Date().getDate();}
 697   if(M == null ||M == "" || isNaN(M)) {M = new Date().getMonth()+1;}
 698   if(y == null ||y == "" || isNaN(y)) {y = new Date().getFullYear();}
 699   var dt ;
 700   eval ("dt = new Date('"+ y+"', '"+(M-1)+"','"+ d+"','"+ h+"','"+ m+"','"+ s +"')");
 701   return dt;
 702 }
 703  
 704 /**//**//**//**//**//**//**//**
 705  * 格式化日期
 706  * @param   d the delimiter
 707  * @param   p the pattern of your date
 708  * @author  meizz
 709  */
 710 Date.prototype.format = function(style) {
 711   var o = {
 712     "M+" : this.getMonth() + 1, //month
 713     "d+" : this.getDate(),      //day
 714     "h+" : this.getHours(),     //hour
 715     "m+" : this.getMinutes(),   //minute
 716     "s+" : this.getSeconds(),   //second
 717     "w+" : "天一二三四五六".charAt(this.getDay()),   //week
 718     "q+" : Math.floor((this.getMonth() + 3) / 3),  //quarter
 719     "S"  : this.getMilliseconds() //millisecond
 720   }
 721   if(/(y+)/.test(style)) {
 722     style = style.replace(RegExp.$1,
 723     (this.getFullYear() + "").substr(4 - RegExp.$1.length));
 724   }
 725   for(var k in o){
 726     if(new RegExp("("+ k +")").test(style)){
 727       style = style.replace(RegExp.$1,
 728         RegExp.$1.length == 1 ? o[k] :
 729         ("00" + o[k]).substr(("" + o[k]).length));
 730     }
 731   }
 732   return style;
 733 }
 734  
 735 //2007-09-14  由寒羽枫添加返回所选日期
 736 Calendar.prototype.ReturnDate = function(dt) {
 737     if (this.dateControl != null){this.dateControl.value = dt;}
 738     calendar.hide();
 739  if(this.dateControl.onchange == null){return;} 
 740  //将 onchange 转成其它函数,以免触发验证事件
 741     var ev = this.dateControl.onchange.toString(); //找出函数的字串
 742     ev = ev.substring(
 743    ((ev.indexOf("ValidatorOnChange();")> 0) ? ev.indexOf("ValidatorOnChange();") + 20 : ev.indexOf("{") + 1)
 744     , ev.lastIndexOf("}"));//去除验证函数 ValidatorOnChange();
 745  var fun = new Function(ev);  //重新定义函数
 746  this.dateControl.changeEvent = fun; 
 747     this.dateControl.changeEvent();//触发自定义 changeEvent 函数
 748 }
 749  
 750 /**//**//**//**//**//**//**//**
 751  * 日历类
 752  * @param   beginYear 1990
 753  * @param   endYear   2010
 754  * @param   lang      0(中文)|1(英语) 可自由扩充
 755  * @param   dateFormatStyle  "yyyy-MM-dd";
 756  * @version 2006-04-01
 757  * @author  KimSoft (jinqinghua [at] gmail.com)
 758  * @update
 759  */
 760 function Calendar(beginYear, endYear, lang, dateFormatStyle) {
 761   this.beginYear = 1950;
 762   this.endYear = 2050;
 763   this.lang = 0;            //0(中文) | 1(英文)
 764   this.dateFormatStyle = "yyyy-MM-dd hh:mm:ss";
 765  
 766   if (beginYear != null && endYear != null){
 767     this.beginYear = beginYear;
 768     this.endYear = endYear;
 769   }
 770   if (lang != null){
 771     this.lang = lang
 772   }
 773  
 774   if (dateFormatStyle != null){
 775     this.dateFormatStyle = dateFormatStyle
 776   }
 777  
 778   this.dateControl = null;
 779   this.panel = this.getElementById("calendarPanel");
 780   this.container = this.getElementById("ContainerPanel");
 781   this.form  = null;
 782  
 783   this.date = new Date();
 784   this.year = this.date.getFullYear();
 785   this.month = this.date.getMonth();
 786   
 787   this.day = this.date.getDate();
 788   this.hour = this.date.getHours();
 789   this.minute = this.date.getMinutes();
 790   this.second = this.date.getSeconds();
 791  
 792   this.colors = {
 793   "cur_word"      : "#FFFFFF",  //当日日期文字颜色
 794   "cur_bg"        : "#00FF00",  //当日日期单元格背影色
 795   "sel_bg"        : "#FFCCCC",  //已被选择的日期单元格背影色 2006-12-03 寒羽枫添加  
 796   "sun_word"      : "#FF0000",  //星期天文字颜色  
 797   "sat_word"      : "#0000FF",  //星期六文字颜色  
 798   "td_word_light" : "#333333",  //单元格文字颜色  
 799   "td_word_dark"  : "#CCCCCC",  //单元格文字暗色  
 800   "td_bg_out"     : "#EFEFEF",  //单元格背影色
 801   "td_bg_over"    : "#FFCC00",  //单元格背影色
 802   "tr_word"       : "#FFFFFF",  //日历头文字颜色  
 803   "tr_bg"         : "#666666",  //日历头背影色
 804   "input_border"  : "#CCCCCC",  //input控件的边框颜色  
 805   "input_bg"      : "#EFEFEF"   //input控件的背影色
 806   }
 807 /* //2008-01-29 放到了 show ,因为要做 pickMode 判断
 808   this.draw();
 809   this.bindYear();
 810   this.bindMonth();
 811   */
 812   //this.changeSelect();
 813   //this.bindData(); //2006-12-30 由民工.砖家注释
 814 }
 815  
 816 /**//**//**//**//**//**//**//**
 817  * 日历类属性(语言包,可自由扩展)
 818  */
 819 Calendar.language = {
 820   "year"   : [[""], [""]],
 821   "months" : [["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
 822         ["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]
 823          ],
 824   "weeks"  : [["日","一","二","三","四","五","六"],
 825         ["SUN","MON","TUR","WED","THU","FRI","SAT"]
 826          ],
 827   "hour"  : [["时"], ["H"]],
 828   "minute"  : [["分"], ["M"]],
 829   "second"  : [["秒"], ["S"]],
 830   "clear"  : [["清空"], ["CLS"]],
 831   "today"  : [["今天"], ["TODAY"]],
 832   "pickTxt"  : [["确定"], ["OK"]],//pickMode 精确到年、月时把今天变成“确定”
 833   "close"  : [["关闭"], ["CLOSE"]]
 834 }
 835  
 836 Calendar.prototype.draw = function() {
 837   calendar = this;
 838  
 839   var mvAry = [];
 840   //mvAry[mvAry.length]  = '  <form name="calendarForm" style="margin: 0px;">'; //因 <form> 不能嵌套, 2006-12-01 由寒羽枫改用 Div
 841   mvAry[mvAry.length]  = '  <div name="calendarForm" style="margin: 0px;">';
 842   mvAry[mvAry.length]  = '    <table width="100%" border="0" cellpadding="0" cellspacing="1" style="font-size:12px;">';
 843   mvAry[mvAry.length]  = '      <tr>';
 844   mvAry[mvAry.length]  = '        <th align="left" width="1%"><input style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:16px;height:20px;';
 845   if(calendar.DateMode > pickMode["month"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到年时隐藏“月”
 846   mvAry[mvAry.length]  ='" name="prevMonth" type="button" id="prevMonth" value="&lt;" /></th>';
 847   mvAry[mvAry.length]  = '        <th align="center" width="98%" nowrap="nowrap"><select name="calendarYear" id="calendarYear" style="font-size:12px;"></select><select name="calendarMonth" id="calendarMonth" style="font-size:12px;';
 848   if(calendar.DateMode > pickMode["month"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到年时隐藏“月”
 849   mvAry[mvAry.length]  = '"></select></th>';
 850   mvAry[mvAry.length]  = '        <th align="right" width="1%"><input style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:16px;height:20px;';
 851   if(calendar.DateMode > pickMode["month"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到年时隐藏“月”
 852   mvAry[mvAry.length]  ='" name="nextMonth" type="button" id="nextMonth" value="&gt;" /></th>';
 853   mvAry[mvAry.length]  = '      </tr>';
 854   mvAry[mvAry.length]  = '    </table>';
 855   mvAry[mvAry.length]  = '    <table id="calendarTable" width="100%" style="border:0px solid #CCCCCC;background-color:#FFFFFF;font-size:12px;';
 856   if(calendar.DateMode >= pickMode["month"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到年、月时隐藏“天”
 857   mvAry[mvAry.length]  = '" border="0" cellpadding="3" cellspacing="1">';
 858   mvAry[mvAry.length]  = '      <tr>';
 859   for(var i = 0; i < 7; i++) {
 860     mvAry[mvAry.length]  = '      <th style="font-weight:normal;background-color:' + calendar.colors["tr_bg"] + ';color:' + calendar.colors["tr_word"] + ';">' + Calendar.language["weeks"][this.lang][i] + '</th>';
 861   }
 862   mvAry[mvAry.length]  = '      </tr>';
 863   for(var i = 0; i < 6;i++){
 864     mvAry[mvAry.length]  = '    <tr align="center">';
 865     for(var j = 0; j < 7; j++) {
 866       if (j == 0){
 867         mvAry[mvAry.length]  = '  <td style="cursor:default;color:' + calendar.colors["sun_word"] + ';"></td>';
 868       } else if(j == 6) {
 869         mvAry[mvAry.length]  = '  <td style="cursor:default;color:' + calendar.colors["sat_word"] + ';"></td>';
 870       } else {
 871         mvAry[mvAry.length]  = '  <td style="cursor:default;"></td>';
 872       }
 873     }
 874     mvAry[mvAry.length]  = '    </tr>';
 875   }
 876  
 877 //2009-03-03 添加的代码,放置时间的行
 878   mvAry[mvAry.length]  = '      <tr style="';
 879     if(calendar.DateMode >= pickMode["day"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到时日隐藏“时间”
 880     mvAry[mvAry.length]  = '"><td align="center" colspan="7">';
 881   mvAry[mvAry.length]  = '      <select name="calendarHour" id="calendarHour" style="font-size:12px;"></select>' + Calendar.language["hour"][this.lang];
 882   mvAry[mvAry.length]  = '<span style="'
 883     if(calendar.DateMode >= pickMode["hour"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到小时时隐藏“分”
 884   mvAry[mvAry.length]  = '"><select name="calendarMinute" id="calendarMinute" style="font-size:12px;"></select>' + Calendar.language["minute"][this.lang]+'</span>';
 885     mvAry[mvAry.length]  = '<span style="'
 886     if(calendar.DateMode >= pickMode["minute"]){mvAry[mvAry.length]  = 'display:none;';}//pickMode 精确到小时、分时隐藏“秒”
 887    mvAry[mvAry.length]  = '"><select name="calendarSecond" id="calendarSecond" style="font-size:12px;"></select>'+ Calendar.language["second"][this.lang]+'</span>';
 888   mvAry[mvAry.length]  = '      </td></tr>';
 889   
 890   mvAry[mvAry.length]  = '    </table>';
 891   //mvAry[mvAry.length]  = '  </from>';
 892   mvAry[mvAry.length]  = '      <div align="center" style="padding:4px 4px 4px 4px;background-color:' + calendar.colors["input_bg"] + ';">';
 893   mvAry[mvAry.length]  = '        <input name="calendarClear" type="button" id="calendarClear" value="' + Calendar.language["clear"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:40px;height:20px;font-size:12px;cursor:pointer;"/>';
 894   mvAry[mvAry.length]  = '        <input name="calendarToday" type="button" id="calendarToday" value="' 
 895   mvAry[mvAry.length]  = (calendar.DateMode == pickMode["day"]) ? Calendar.language["today"][this.lang] : Calendar.language["pickTxt"][this.lang];
 896   mvAry[mvAry.length]  = '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:60px;height:20px;font-size:12px;cursor:pointer"/>';
 897   mvAry[mvAry.length]  = '        <input name="calendarClose" type="button" id="calendarClose" value="' + Calendar.language["close"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:40px;height:20px;font-size:12px;cursor:pointer"/>';
 898   mvAry[mvAry.length]  = '      </div>';
 899   
 900   mvAry[mvAry.length]  = '  </div>';
 901   this.panel.innerHTML = mvAry.join("");
 902   
 903   /**//**//**//******** 以下代码由寒羽枫 2006-12-01 添加 **********/
 904   var obj = this.getElementById("prevMonth");
 905   obj.onclick = function () {calendar.goPrevMonth(calendar);}
 906   obj.onblur = function () {calendar.onblur();}
 907   this.prevMonth= obj;
 908   
 909   obj = this.getElementById("nextMonth");
 910   obj.onclick = function () {calendar.goNextMonth(calendar);}
 911   obj.onblur = function () {calendar.onblur();}
 912   this.nextMonth= obj;  
 913 
 914   obj = this.getElementById("calendarClear");
 915   obj.onclick = function () 
 916   { calendar.ReturnDate(""); /*calendar.dateControl.value = "";calendar.hide();*///2007-09-14 由寒羽枫注释
 917   }
 918   this.calendarClear = obj;
 919   
 920   obj = this.getElementById("calendarClose");
 921   obj.onclick = function () {calendar.hide();}
 922   this.calendarClose = obj;
 923   
 924   obj = this.getElementById("calendarYear");
 925   obj.onchange = function () {calendar.update(calendar);}
 926   obj.onblur = function () {calendar.onblur();}
 927   this.calendarYear = obj;
 928   
 929   obj = this.getElementById("calendarMonth");
 930   with(obj)
 931   {
 932     onchange = function () {calendar.update(calendar);}
 933     onblur = function () {calendar.onblur();}
 934   }this.calendarMonth = obj;
 935   
 936   obj = this.getElementById("calendarHour");
 937   obj.onchange = function () {calendar.hour = this.options[this.selectedIndex].value;}
 938   obj.onblur = function () {calendar.onblur();}
 939   this.calendarHour = obj;
 940    
 941   obj = this.getElementById("calendarMinute");
 942   obj.onchange = function () {calendar.minute = this.options[this.selectedIndex].value;}
 943   obj.onblur = function () {calendar.onblur();}
 944   this.calendarMinute = obj;
 945   
 946   obj = this.getElementById("calendarSecond");
 947   obj.onchange = function () {calendar.second = this.options[this.selectedIndex].value;}
 948   obj.onblur = function () {calendar.onblur();}
 949   this.calendarSecond = obj;
 950  
 951   obj = this.getElementById("calendarToday");
 952   obj.onclick = function () {
 953   var today = (calendar.DateMode != pickMode["day"]) ?
 954                     new Date(calendar.year,calendar.month,calendar.day,calendar.hour,calendar.minute,calendar.second)
 955                     : new Date();//2008-01-29
 956     calendar.ReturnDate(today.format(calendar.dateFormatStyle));
 957   }
 958   this.calendarToday = obj;
 959 }
 960  
 961 //年份下拉框绑定数据
 962 Calendar.prototype.bindYear = function() {
 963   var cy = this.calendarYear;//2006-12-01 由寒羽枫修改
 964   cy.length = 0;
 965   for (var i = this.beginYear; i <= this.endYear; i++){
 966     cy.options[cy.length] = new Option(i + Calendar.language["year"][this.lang], i);
 967   }
 968 }
 969  
 970 //月份下拉框绑定数据
 971 Calendar.prototype.bindMonth = function() {
 972   var cm = this.calendarMonth;//2006-12-01 由寒羽枫修改
 973   cm.length = 0;
 974   for (var i = 0; i < 12; i++){
 975     cm.options[cm.length] = new Option(Calendar.language["months"][this.lang][i], i);
 976   }
 977 }
 978  
 979 //小时下拉框绑定数据
 980 Calendar.prototype.bindHour = function() {
 981   var ch = this.calendarHour;
 982   if(ch.length > 0){return;}//2009-03-03 不需要重新绑定,提高性能
 983   //ch.length = 0;
 984   var h;
 985   for (var i = 0; i < 24; i++){
 986     h = ("00" + i +"").substr(("" + i).length);
 987     ch.options[ch.length] = new Option(h, h);
 988   }
 989 }
 990  
 991 //分钟下拉框绑定数据
 992 Calendar.prototype.bindMinute = function() {
 993   var cM = this.calendarMinute;
 994   if(cM.length > 0){return;}//2009-03-03 不需要重新绑定,提高性能
 995   //cM.length = 0;
 996   var M;
 997   for (var i = 0; i < 60; i++){
 998     M = ("00" + i +"").substr(("" + i).length);
 999     cM.options[cM.length] = new Option(M, M);
1000   }
1001 }
1002  
1003 //秒钟下拉框绑定数据
1004 Calendar.prototype.bindSecond = function() {
1005   var cs = this.calendarSecond;
1006   if(cs.length > 0){return;}//2009-03-03 不需要重新绑定,提高性能
1007   //cs.length = 0;
1008   var s;
1009   for (var i = 0; i < 60; i++){
1010     s = ("00" + i +"").substr(("" + i).length);
1011     cs.options[cs.length] = new Option(s, s);
1012   }
1013 }
1014  
1015 //向前一月
1016 Calendar.prototype.goPrevMonth = function(e){
1017   if (this.year == this.beginYear && this.month == 0){return;}
1018   this.month--;
1019   if (this.month == -1) {
1020     this.year--;
1021     this.month = 11;
1022   }
1023   this.date = new Date(this.year, this.month, 1);
1024   this.changeSelect();
1025   this.bindData();
1026 }
1027  
1028 //向后一月
1029 Calendar.prototype.goNextMonth = function(e){
1030   if (this.year == this.endYear && this.month == 11){return;}
1031   this.month++;
1032   if (this.month == 12) {
1033     this.year++;
1034     this.month = 0;
1035   }
1036   this.date = new Date(this.year, this.month, 1);
1037   this.changeSelect();
1038   this.bindData();
1039 }
1040  
1041 //改变SELECT选中状态
1042 Calendar.prototype.changeSelect = function() {
1043   var cy = this.calendarYear;//2006-12-01 由寒羽枫修改
1044   var cm = this.calendarMonth;
1045   var ch = this.calendarHour;
1046   var cM = this.calendarMinute;
1047   var cs = this.calendarSecond;
1048 //2006-12-30 由民工.砖家修改,减少运算次数
1049   cy[this.date.getFullYear()-this.beginYear].selected = true;
1050   cm[this.date.getMonth()].selected =true;
1051   
1052 //2009-03-03 添加,初始化时间的值
1053   ch[this.hour].selected =true;
1054   cM[this.minute].selected =true;
1055   cs[this.second].selected =true;
1056 }
1057  
1058 //更新年、月
1059 Calendar.prototype.update = function (e){
1060   this.year  = e.calendarYear.options[e.calendarYear.selectedIndex].value;//2006-12-01 由寒羽枫修改
1061   this.month = e.calendarMonth.options[e.calendarMonth.selectedIndex].value;
1062   this.date = new Date(this.year, this.month, 1);
1063   //this.changeSelect();
1064   this.bindData();
1065 }
1066  
1067 //绑定数据到月视图
1068 Calendar.prototype.bindData = function () {
1069   var calendar = this;
1070  if(calendar.DateMode >= pickMode["month"]){return;}//2008-01-29
1071  // var dateArray = this.getMonthViewArray(this.date.getYear(), this.date.getMonth());
1072   //2006-12-30 由民工.砖家修改 在Firefox 下年份错误
1073   var dateArray = this.getMonthViewArray(this.date.getFullYear(), this.date.getMonth());
1074  var tds = this.getElementById("calendarTable").getElementsByTagName("td");
1075   for(var i = 0; i < tds.length; i++) {
1076   tds[i].style.backgroundColor = calendar.colors["td_bg_out"];
1077     tds[i].onclick = function () {return;}
1078     tds[i].onmouseover = function () {return;}
1079     tds[i].onmouseout = function () {return;}
1080     if (i > dateArray.length - 1) break;
1081     tds[i].innerHTML = dateArray[i];
1082     if (dateArray[i] != "&nbsp;"){
1083       tds[i].bgColorTxt = "td_bg_out"; //2009-03-03 保存背景色的class
1084         var cur = new Date();
1085         tds[i].isToday = false;
1086       if (cur.getFullYear() == calendar.date.getFullYear() && cur.getMonth() == calendar.date.getMonth() && cur.getDate() == dateArray[i]) {
1087       //是今天的单元格
1088         tds[i].style.backgroundColor = calendar.colors["cur_bg"];
1089         tds[i].bgColorTxt = "cur_bg";
1090         tds[i].isToday = true;
1091         }
1092     if(calendar.dateControl != null )
1093     {
1094       cur = calendar.dateControl.value.toDate(calendar.dateFormatStyle);
1095       if (cur.getFullYear() == calendar.date.getFullYear() && cur.getMonth() == calendar.date.getMonth()&& cur.getDate() == dateArray[i]) {
1096       //是已被选中的单元格
1097         calendar.selectedDayTD = tds[i];
1098         tds[i].style.backgroundColor = calendar.colors["sel_bg"];
1099         tds[i].bgColorTxt = "sel_bg";
1100       }
1101     }
1102       tds[i].onclick = function () {
1103             if(calendar.DateMode == pickMode["day"]) //2009-03-03 当选择日期时,点击格子即返回值
1104             {
1105                 calendar.ReturnDate(new Date(calendar.date.getFullYear(),
1106                                                     calendar.date.getMonth(),
1107                                                     this.innerHTML).format(calendar.dateFormatStyle));
1108             }
1109             else
1110             {
1111                 if(calendar.selectedDayTD != null) //2009-03-03 清除已选中的背景色
1112                 {
1113                     calendar.selectedDayTD.style.backgroundColor =(calendar.selectedDayTD.isToday)? calendar.colors["cur_bg"] : calendar.colors["td_bg_out"];
1114                 }
1115                 this.style.backgroundColor = calendar.colors["sel_bg"];
1116                 calendar.day = this.innerHTML;
1117                 calendar.selectedDayTD = this; //2009-03-03 记录已选中的日子
1118             }
1119           }
1120       tds[i].style.cursor ="pointer"; //2007-08-06 由寒羽枫添加,鼠标变成手指状
1121       tds[i].onmouseover = function () {
1122         this.style.backgroundColor = calendar.colors["td_bg_over"];
1123       }
1124       tds[i].onmouseout = function () {
1125         if(calendar.selectedDayTD != this) {
1126         this.style.backgroundColor = calendar.colors[this.bgColorTxt];}
1127       }
1128       tds[i].onblur = function () {calendar.onblur();}
1129     }
1130   }
1131 }
1132  
1133 //根据年、月得到月视图数据(数组形式)
1134 Calendar.prototype.getMonthViewArray = function (y, m) {
1135   var mvArray = [];
1136   var dayOfFirstDay = new Date(y, m, 1).getDay();
1137   var daysOfMonth = new Date(y, m + 1, 0).getDate();
1138   for (var i = 0; i < 42; i++) {
1139     mvArray[i] = "&nbsp;";
1140   }
1141   for (var i = 0; i < daysOfMonth; i++){
1142     mvArray[i + dayOfFirstDay] = i + 1;
1143   }
1144   return mvArray;
1145 }
1146  
1147 //扩展 document.getElementById(id) 多浏览器兼容性 from meizz tree source
1148 Calendar.prototype.getElementById = function(id){
1149   if (typeof(id) != "string" || id == "") return null;
1150   if (document.getElementById) return document.getElementById(id);
1151   if (document.all) return document.all(id);
1152   try {return eval(id);} catch(e){ return null;}
1153 }
1154  
1155 //扩展 object.getElementsByTagName(tagName)
1156 Calendar.prototype.getElementsByTagName = function(object, tagName){
1157   if (document.getElementsByTagName) return document.getElementsByTagName(tagName);
1158   if (document.all) return document.all.tags(tagName);
1159 }
1160  
1161 //取得HTML控件绝对位置
1162 Calendar.prototype.getAbsPoint = function (e){
1163   var x = e.offsetLeft;
1164   var y = e.offsetTop;
1165   while(e = e.offsetParent){
1166     x += e.offsetLeft;
1167     y += e.offsetTop;
1168   }
1169   return {"x": x, "y": y};
1170 }
1171  
1172 //显示日历
1173 Calendar.prototype.show = function (dateObj, popControl) {
1174   if (dateObj == null){
1175     throw new Error("arguments[0] is necessary")
1176   }
1177   this.dateControl = dateObj;
1178   var now =  new Date();
1179   this.date = (dateObj.value.length > 0) ? new Date(dateObj.value.toDate(this.dateFormatStyle)) : now.format(this.dateFormatStyle).toDate(this.dateFormatStyle) ;//2008-01-29 寒羽枫添加 → 若为空则根据dateFormatStyle初始化日期
1180  
1181   if(this.panel.innerHTML==""||cal.dateFormatStyleOld != cal.dateFormatStyle)//2008-01-29 把构造表格放在此处,2009-03-03 若请示的样式改变,则重新初始化
1182   {
1183  this.draw();
1184  this.bindYear();
1185  this.bindMonth();
1186  this.bindHour();
1187  this.bindMinute();
1188  this.bindSecond();
1189   }
1190   this.year = this.date.getFullYear();
1191   this.month = this.date.getMonth();
1192   this.day = this.date.getDate();
1193   this.hour = this.date.getHours();
1194   this.minute = this.date.getMinutes();
1195   this.second = this.date.getSeconds();
1196   this.changeSelect();
1197   this.bindData();
1198  
1199   if (popControl == null){
1200     popControl = dateObj;
1201   }
1202   var xy = this.getAbsPoint(popControl);
1203   //this.panel.style.left = xy.x + "px";
1204   //this.panel.style.top = (xy.y + dateObj.offsetHeight) + "px";
1205   this.panel.style.left = (xy.x + leftX)+ "px"; //由寒羽枫 2007-02-11 修改 → 加入自定义偏移量
1206   this.panel.style.top = (xy.y + topY + dateObj.offsetHeight) + "px";
1207   
1208   //由寒羽枫 2006-06-25 修改 → 把 visibility 变为 display,并添加失去焦点的事件  //this.setDisplayStyle("select", "hidden");
1209   //this.panel.style.visibility = "visible";
1210   //this.container.style.visibility = "visible";
1211   this.panel.style.display = "";
1212   this.container.style.display = "";
1213   
1214   if( !this.dateControl.isTransEvent)
1215   {
1216  this.dateControl.isTransEvent = true;
1217  /* 已写在返回值的时候  ReturnDate 函数中,去除验证事件的函数
1218  this.dateControl.changeEvent = this.dateControl.onchange;//将 onchange 转成其它函数,以免触发验证事件
1219  this.dateControl.onchange = function()
1220  {if(typeof(this.changeEvent) =='function'){this.changeEvent();}}*/
1221  if(this.dateControl.onblur != null){
1222  this.dateControl.blurEvent = this.dateControl.onblur;}//2007-09-14 保存主文本框的 onblur ,使其原本的事件不被覆盖
1223  this.dateControl.onblur = function()
1224  {calendar.onblur();if(typeof(this.blurEvent) =='function'){this.blurEvent();}

1225  }
1226   }
1227   
1228   this.container.onmouseover = function(){isFocus=true;}
1229   this.container.onmouseout = function(){isFocus=false;}
1230 }
1231  
1232 //隐藏日历
1233 Calendar.prototype.hide = function() {
1234   //this.setDisplayStyle("select", "visible");
1235   //this.panel.style.visibility = "hidden";
1236   //this.container.style.visibility = "hidden";
1237   this.panel.style.display = "none";
1238   this.container.style.display = "none";
1239   isFocus=false;
1240 }
1241  
1242 //焦点转移时隐藏日历 → 由寒羽枫 2006-06-25 添加
1243 Calendar.prototype.onblur = function() {
1244     if(!isFocus){this.hide();}
1245 }
1246  
1247 //以下由寒羽枫 2007-07-26 修改 → 确保日历容器节点在 body 最后,否则 FireFox 中不能出现在最上方
1248 function InitContainerPanel() //初始化容器
1249 {
1250  var str = '<div id="calendarPanel" style="position: absolute;display: none;z-index:9999; background-color: #FFFFFF;border: 1px solid #CCCCCC;width:175px;font-size:12px;"></div>';
1251  if(document.all)
1252  {
1253   str += '<iframe style="position:absolute;z-index:2000;width:expression(this.previousSibling.offsetWidth);';
1254   str += 'height:expression(this.previousSibling.offsetHeight);';
1255   str += 'left:expression(this.previousSibling.offsetLeft);top:expression(this.previousSibling.offsetTop);';
1256   str += 'display:expression(this.previousSibling.style.display);" scrolling="no" frameborder="no"></iframe>';
1257  }
1258  var div = document.createElement("div");
1259  div.innerHTML = str;
1260  div.id = "ContainerPanel";
1261  div.style.display ="none";
1262  document.body.appendChild(div);
1263 }//调用calendar.show(dateControl, popControl);
1264 //--> 

html代码如下:

View Code
 1 <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
 3 <html xmlns="http://www.w3.org/1999/xhtml" >  
 4 <head id="Head1">  
 5         <script src="js/WebCalendar.js" type="text/javascript"></script>  
 6 </head>  
 7 <body>  
 8     <form name="form1" method="post" action="WebForm1.aspx" id="form1">  
 9 <input type="text" value="" maxlength="100" id="Txt_CreateDateST01"  onclick="SelectDate(this,'yyyy 年')" readonly="true" style="width:265px;cursor:pointer" /><br />  
10 <input type="text" value="" maxlength="100" id="Txt_CreateDateST02"  onclick="SelectDate(this,'yyyy 年 MM 月')" readonly="true" style="width:265px;cursor:pointer" /><br />  
11 <input type="text" value="" maxlength="100" id="Txt_CreateDateST03"  onclick="SelectDate(this,'yyyy-MM-dd')" readonly="true" style="width:265px;cursor:pointer" /><br />  
12 <input type="text" value="" maxlength="100" id="Text1"  onclick="SelectDate(this,'yyyy-MM-dd hh时')" readonly="true" style="width:265px;cursor:pointer" /><br />  
13 <input type="text" value="" maxlength="100" id="Text3"  onclick="SelectDate(this,'yyyy-MM-dd hh:mm')" readonly="true" style="width:265px;cursor:pointer" /><br />  
14 <input type="text" value="" maxlength="100" id="Text4"  onclick="SelectDate(this,'yyyy年MM月dd日 hh时mm分ss秒',0,-150)" readonly="true" style="width:265px;cursor:pointer" /><br />  
15 </form>  
16 </body>  
17 </html>  

 

posted @ 2012-11-14 13:08  zdp072  阅读(486)  评论(0编辑  收藏  举报