<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>日历</title>

<script language="javascript">
/*******************************************************************************************
 
 * 创建对象   var c = new Calendar("c"); document.write(c);
 * 调用方法  c.show(arg1,arg2,arg3)
 * 参数1: 文本输入框(必填). 如 onfocus="c.show(this)";
 * 参数2: 按钮或其它可用单击事件的HTML元素(如果使用按钮方式则必填). 
          如 onclick="c.show(this,document.all.*)"  *=文本输入框名称
 * 参数3: 如果没有文本框没有值则使用该值初始化日历(选填). 
          如 onfocus="c.show(this,'2006-01-01')
   
 * 注: 参数顺序不分先后.  MSIE6/Opera8/FireFox1.5 下测试通过
   
   
************************如果您使用本日历控件 请保留该信息 谢谢! ***************************   
 * http://2lin.net
 * Email:caoailin@gmail.com 
 * QQ:38062022 
 * Creation date: 2006-10-29 
********************************************************************************************
*/


function Calendar(objName)  
{        
    
this.style = {
    
       borderColor               : 
"#909eff"//边框颜色
       headerBackColor            : "#909EFF"//表头背景颜色
       headerFontColor            : "#ffffff"//表头字体颜色
       bodyBarBackColor        : "#f4f4f4"//日历标题背景色
       bodyBarFontColor          : "#000000"//日历标题字体色
       bodyBackColor             : "#ffffff"//日历背景色
       bodyFontColor                           : "#000000"//日历字体色 
       bodyHolidayFontColor                : "#ff0000"//假日字体色
       watermarkColor         : "#d4d4d4"  //背景水印色
       
    }
;
    
    
this.Obj = objName;        
    
this.date = null;
    
    
this.mouseOffset = null;
    
this.dateInput = null;
    
this.timer = null;
    
    
this.drag = false;    
}
;

Calendar.prototype.toString 
= function()
{   
   
var str = this.getStyle();
   str 
+= '<div class="calendar" style="display:none;" onselectstart="return false" oncontextmenu="return false" id="Calendar">\n';
   str 
+= '<div class="cdrWatermark" id="cdrWatermark"></div><div style="position:absolute;left:0px;top:0px;z-index:2;width:140px;">';
   str 
+= this.getHeader();
   str 
+= this.getBody();   
   str 
+= '</div><div id="cdrMenu" style="position:absolute;left:0px;top:0px;z-index:3;display:none;"  onmouseover="' + this.Obj + '.showMenu(null);" onmouseout="' + this.Obj + '.hideMenu();"></div></div>';
   
return str;
}
;

Calendar.prototype.getStyle 
= function()
{
    
var str = '<style type="text/css">\n';
    str 
+= '.calendar{position:absolute;width:142px;height:174px;background-color:'+this.style.bodyBackColor+';border:1px solid ' + this.style.borderColor + ';left:0px;top:0px;z-index:9999;}\n';
    str 
+= '.cdrHeader{background-color:'+ this.style.headerBackColor +';width:140px;height:22px;font-size:12px;color:'+this.style.headerFontColor+';}\n';
    str 
+= '.cdrWatermark{position:absolute;left:0px;top:55px;width:140px;font-family: Arial Black;font-size:50px;color:'+this.style.watermarkColor+';z-index:1;text-align:center;}\n';
    str 
+= '.cdrBodyBar{background-color:' + this.style.bodyBarBackColor + ';font-size:12px;color:' + this.style.bodyBarFontColor + ';width:140px;height:20px;}\n';
    str 
+= '.cdrBody{width:140px;font-size:12px;cursor:pointer;color:' + this.style.bodyFontColor + ';}\n';
    str 
+= '.dayOver{border:1px solid black;background-color:#f4f4f4;}\n';
    str 
+= '.menuOver{background-color:'+this.style.headerBackColor+';color:'+this.style.headerFontColor+';font-size:12px;}\n';
    str 
+= '.headerOver{border:1px solid black;background-color:#f4f4f4;color:black;cursor:default;}\n';
    str 
+= '.cdrMenu{font-size:12px;border:1px solid #000000;background-color:#ffffff;cursor:default;width:100%}\n';
    str 
+= '</style>\n';    
    
return str;
    
}
;

Calendar.prototype.getHeader 
= function()
{
    
var str = '<table class="cdrHeader" cellSpacing="2" cellPadding="0"><tr align="center">\n';
    str 
+= '<td onmouseover="this.className=\'headerOver\'" onmouseout="this.className=\'\'" id="previousYear" title="上一年份" style="cursor:pointer;width:10px;" onclick="'+this.Obj+'.onChangeYear(false);"><<</td>\n';
    str 
+= '<td onmouseover="this.className=\'headerOver\'" onmouseout="this.className=\'\'" id="previousMonth" title="上一月份" style="cursor:pointer;width:10px;" onclick="'+this.Obj+'.onChangeMonth(false);"><</td>\n';
    str 
+= '<td onmouseover="this.className=\'headerOver\'" onmouseout="this.className=\'\'" id="currentYear" style="width:50px;" onclick="' + this.Obj + '.showMenu(true);" onmouseout="' + this.Obj + '.hideMenu();">0</td>\n';
    str 
+= '<td onmouseover="this.className=\'headerOver\'" onmouseout="this.className=\'\'" id="currentMonth" onclick="' + this.Obj + '.showMenu(false);" onmouseout="' + this.Obj + '.hideMenu();">0</td>\n';
    str 
+= '<td onmouseover="this.className=\'headerOver\'" onmouseout="this.className=\'\'" id="nextMonth" title="下一月份" style="cursor:pointer;width:10px;" onclick="'+this.Obj+'.onChangeMonth(true);">></td>\n';
    str 
+= '<td onmouseover="this.className=\'headerOver\'" onmouseout="this.className=\'\'" id="nextYear" title="下一年份" style="cursor:pointer;width:10px;" onclick="'+this.Obj+'.onChangeYear(true);">>></td></tr>\n';
    str 
+= '</table>\n';
    
return str;
}
;

Calendar.prototype.getBody 
= function()
{
   
var n = 0;
   
var str = '<table id="cdrBodyBar" class="cdrBodyBar" onmousedown="'+this.Obj+'.onDragStart()" onmousemove="'+this.Obj+'.onMouseMove()" style="cursor:move;" cellSpacing="2" cellPadding="0">\n';
   str 
+= '<tr align="middle"><td></td><td></td><td></td><td></TD><td></td><td></td><td></td></tr></table>\n';
   str 
+= '<table class="cdrBody" cellSpacing="2" cellPadding="0">\n';
   
for(i = 0; i < 6; i++)
    
{      
        str 
+= '<tr align="center">';
        
for(j = 0; j < 7; j++)
        
{
             str 
+= '<td id="cdrDay'+(n++)+'" width="13%" height="16"></td>\n';
        }

        str 
+= '</tr>';
    }

   str 
+= '</table>\n';
   str 
+= '<table class="cdrBodyBar" cellSpacing="2" cellPadding="0"><tr align="middle"><td style="cursor:pointer;" onclick="'+this.Obj+'.getToday();">今天</td></tr></table>\n';
   
return str;
}
;

Calendar.prototype.getYearMenu 
= function(year)
{
 
   
var str = '<table cellSpacing="0" class="cdrMenu" cellPadding="0">\n';
   
for(i = 0; i < 10; i++)
    
{      
        
var _year = year + i;
        
var _date = new Date(_year,this.date.getMonth(),this.date.getDate());
        
        str 
+= '<tr align="center"><td width="13%" height="16" ';
        
if(this.date.getFullYear() != _year)
        
{
            str 
+= 'onmouseover="this.className=\'menuOver\'" onmouseout="this.className=\'\'" ';
        }

        
else
        
{
           str 
+= 'class="menuOver"';
        }

        str 
+= 'onclick="' + this.Obj + '.bindDate(\'' + _date.toFormatString("-") + '\')">+ _year + '年</td>\n';        
        str 
+= '</tr>';
    }


   str 
+= '<tr align="center"><td><table style="font-size:12px;width:100%;" cellSpacing="0" cellPadding="0">\n';
   str 
+= '<tr align="center"><td onmouseover="this.className=\'menuOver\'" onmouseout="this.className=\'\'" onclick="'+this.Obj+'.getYearMenu('+ (year - 10) + ')"><<</td>\n';
   str 
+= '<td onmouseover="this.className=\'menuOver\'" onmouseout="this.className=\'\'" onclick="'+this.Obj+'.getYearMenu('+ (year + 10) +')">>></td><tr>\n';
   str 
+= '</table></td></tr>\n';
   str 
+= '</table>';
   
   
var _menu = this.getObjById("cdrMenu");
    _menu.innerHTML 
= str;
   
}
;

Calendar.prototype.getMonthMenu 
= function()
{
   
   
var str = '<table cellSpacing="0" class="cdrMenu" cellPadding="0">\n';
   
for(i = 1; i <= 12; i++)
    
{   
        
var _date = new Date(this.date.getFullYear(),i-1,this.date.getDate());        
            
        str 
+= '</tr><tr align="center"><td height="16" ';
        
if(this.date.getMonth() + 1 != i)
        
{
            str 
+= 'onmouseover="this.className=\'menuOver\'" onmouseout="this.className=\'\'" ';
        }

        
else
        
{
           str 
+= 'class="menuOver"';
        }

        str 
+= 'onclick="' + this.Obj + '.bindDate(\'' + _date.toFormatString("-") + '\')">'+i+'月</td></tr>\n';
    }

   str 
+= '</table>';
   
   
var _menu = this.getObjById("cdrMenu");
    _menu.innerHTML 
= str;   
}
;

Calendar.prototype.show 
= function(arg1, arg2 , arg3)
{
   
if (arguments.length >  3  || arguments.length == 0)
   
{
      alert(
"对不起!传入参数不对!" );
      
return;
    }
   
    
   
var _date = null;
   
var _evObj = null;
   
var _initValue = null  
    
   
for(i = 0; i < arguments.length; i++)
   
{
      
if(typeof(arguments[i]) == "object" && arguments[i].type == "text")
       
{_date = arguments[i];}
      
else if(typeof(arguments[i]) == "object")
       
{_evObj = arguments[i];}
      
else if(typeof(arguments[i]) == "string")
       
{_initValue = arguments[i];}  
   }

    _evObj 
= _evObj || _date;
    
    
if(!_date){alert("传入参数错误!"); return;}
    
   
this.dateInput = _date;
   
   _date 
= _date.value;
   
   
if(_date == "" && _initValue) _date = _initValue;   
   
   
this.bindDate(_date);        
   
   
var _target = this.getPosition(_evObj);   
   
var _obj = this.getObjById("Calendar");
   _obj.style.display 
= ""
   
   _obj.style.left 
= _target.x;
   
if((document.body.clientHeight - (_target.y + _evObj.clientHeight)) >= _obj.clientHeight)
   
{        
      _obj.style.top 
= _target.y + _evObj.clientHeight;
    }

    
else
    
{      
       _obj.style.top 
= _target.y - _obj.clientHeight;
    }

        
}
;


Calendar.prototype.hide 
= function()
{
    
var obj = this.getObjById("Calendar");
    obj.style.display 
= "none";   
}
;

Calendar.prototype.bindDate 
= function(date)
{
   
    
var _monthDays = new Array(31,30,31,30,31,30,31,31,30,31,30,31);        
    
var _day = 1;    
    
var _arr = date.split('-');        
    
var _date = new Date(_arr[0],_arr[1]-1,_arr[2]);    
    
if(isNaN(_date)) _date = new Date();    
    
this.date = _date;
    
this.bindHeader();    
    
var _year = _date.getFullYear();
    
var _month = _date.getMonth();
   
     _monthDays[
1= ((_year%4==0)&&(_year%100!=0)||(_year%400==0))?29:28;

    
for(i = 0; i < 42; i++)
    
{
        
var _dayElement = this.getObjById("cdrDay" + i);
        
        _dayElement.onmouseover 
= Function(this.Obj + ".onMouseOver(this)");
        _dayElement.onmouseout 
= Function(this.Obj + ".onMouseOut(this)");
        _dayElement.onclick 
= Function(this.Obj + ".onClick(this)");
        
this.onMouseOut(_dayElement);        
        
        
if(i >= new Date(_year,_month,1).getDay() && _day <= _monthDays[_month])
        
{
           _dayElement.innerHTML 
= _day;
           
           
if(_day == _date.getDate())
           
{
              
this.onMouseOver(_dayElement);
              _dayElement.onmouseover 
= Function("");   
              _dayElement.onmouseout 
= Function("");                                       
           }

                
            
           
if(this.isHoliday(_year,_month,_day))
           
{
              _dayElement.style.color 
= this.style.bodyHolidayFontColor;              
           }

           
           _dayElement.title 
= _year + '年' + (_month + 1)  + '月' + _day + '日';
           _dayElement.value 
= _year + '-+ (_month + 1+ '-+ _day;    
           
           _day
++;
           
        }

        
else
        
{
           _dayElement.innerHTML 
= "";
           _dayElement.title 
= "";
        }
    
          
    }

    
    
var _menu = this.getObjById("cdrMenu");
    _menu.style.display 
= "none";    
    
}
;

Calendar.prototype.bindHeader 
= function()
{
   
var _curYear = this.getObjById("currentYear");
   
var _curMonth = this.getObjById("currentMonth");
   
var _watermark = this.getObjById("cdrWatermark");

   _curYear.innerHTML 
= this.date.getFullYear() + "";
   _curMonth.innerHTML 
=  (this.date.getMonth() + 1+ "";
   _watermark.innerHTML 
= this.date.getFullYear();     

}
;    

Calendar.prototype.getObjById 
= function(obj)
{
   
if(document.getElementById)
   
{
     
return document.getElementById(obj);
   }

   
else
   
{
     alert(
"浏览器不支持!");
   }

}
;

Calendar.prototype.getToday 
= function()
{
   
var _date = new Date();
   
this.bindDate(_date.toFormatString("-"));
}
;    

Calendar.prototype.isHoliday 
= function(year,month,date)
{
   
var _date = new Date(year,month,date);
   
return (_date.getDay() == 6 || _date.getDay() == 0);
}
;

Calendar.prototype.onMouseOver 
= function(obj)
{
   obj.className 
= "dayOver";
}
;


Calendar.prototype.onMouseOut 
= function(obj)
{
   obj.className 
= "";
}
;    

Calendar.prototype.onClick 
= function(obj)
{
  
if(obj.innerHTML != "")  this.dateInput.value = obj.value;
  
this.hide();
}
;

Calendar.prototype.onChangeYear 
= function(isnext)
{
   
var _year = this.date.getFullYear();
   
var _month = this.date.getMonth() + 1;
   
var _date = this.date.getDate();
      
   
if(_year > 999 && _year <10000)
   
{
        
if(isnext){_year++;}else{ _year --;}
   }

   
else
   
{
     alert(
"年份超出范围(1000-9999)!");
   }

   
this.bindDate(_year + '-+ _month + '-+ _date);
}
;

Calendar.prototype.onChangeMonth 
= function(isnext)
{
   
var _year = this.date.getFullYear();
   
var _month = this.date.getMonth() + 1;
   
var _date = this.date.getDate();
   
   
if(isnext){ _month ++;} else {_month--;}
   
   
if(_year > 999 && _year <10000)
   

        
if(_month < 1{_month = 12; _year--;}
        
if(_month > 12{_month = 1; _year++;}
   }

   
else
   
{
     alert(
"年份超出范围(1000-9999)!");
   }
  
   
   
this.bindDate(_year + '-+ _month + '-+ _date);
}
;

Calendar.prototype.onMouseMove 
= function (evt)
{
    evt 
=  evt || window.event;    
    
    
if(this.drag && evt.button == 1)
    
{
      
var obj = this.getObjById("Calendar");
      
var mousePos = this.mouseCoords(evt); 
      obj.style.left 
= mousePos.x - this.mouseOffset.x;
      obj.style.top  
= mousePos.y - this.mouseOffset.y;      
    }

}


Calendar.prototype.onDragStart 
= function (evt)
{
    evt 
= evt || window.event;
    
    
var obj = this.getObjById("Calendar");
    
this.mouseOffset = this.getMouseOffset(obj,evt);
    
this.drag = true;
}


Calendar.prototype.onDragEnd 
= function (evt)
{
    
this.drag = false;
}



Calendar.prototype.mouseCoords 
= function(ev)
{
    
if(ev.pageX || ev.pageY){
        
return {x:ev.pageX, y:ev.pageY};
    }

    
return {
        x:ev.clientX 
+ document.body.scrollLeft - document.body.clientLeft,
        y:ev.clientY 
+ document.body.scrollTop  - document.body.clientTop
    }
;
}


Calendar.prototype.getPosition 
= function(e)
{
    
var left = 0;
    
var top  = 0;
    
while (e.offsetParent){
        left 
+= e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
        top  
+= e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
        e     
= e.offsetParent;
    }


    left 
+= e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
    top  
+= e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);

    
return {x:left, y:top};
}


Calendar.prototype.getMouseOffset 
= function(target, ev)
{
    ev 
= ev || window.event;
    
var docPos    = this.getPosition(target);
    
var mousePos  = this.mouseCoords(ev);
    
return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}



Calendar.prototype.showMenu 
= function(isyear)
{
  
var _menu = this.getObjById("cdrMenu");
  
  
if(isyear != null)
  
{
    
    
var _obj = (isyear)? this.getObjById("currentYear") : this.getObjById("currentMonth");
    
    
if(isyear)
    
{
       
this.getYearMenu(this.date.getFullYear() - 5);       
    }

     
else
    
{
       
this.getMonthMenu();       
    }

    
    _menu.style.top 
= _obj.offsetTop + _obj.offsetHeight;
    _menu.style.left 
= _obj.offsetLeft;    
    _menu.style.width 
= _obj.offsetWidth;
    
   }

    
    
if (this.timer != null) clearTimeout(this.timer);
    
    _menu.style.display
="";
    
}


Calendar.prototype.hideMenu 
= function()
{
    
var _obj = this.getObjById("cdrMenu");
    
this.timer = window.setTimeout(function(){_obj.style.display='none';},500);    
}


Number.prototype.NaN0 
= function()
{
    
return isNaN(this? 0 : this;
}


Date.prototype.toFormatString 
= function(fs)
{
    
return this.getFullYear() + fs + (this.getMonth() + 1+ fs + this.getDate(); 
}



/*****************************************************结束************************************************************/
</script>

</head>

<body>




<form id="Form1">

<script>
  
var c = new Calendar("c");
  document.write(c);
</script>



<br />
<br />



    普通调用:
<input type="text" name="txt"  onfocus="c.show(this,'1980-01-01');"/>
    

             
<input type="text" name="txt1"  onfocus="c.show('1981-01-01',this);"/>
             

             
<input type="text" name="txt2"  onfocus="c.show(this);"/>
            
<br />
            
<div style="height:300px"></div>
   
    按钮调用:
<input type="text" name="btntxt" /><input name="button" value="*" id="button" type="button" onclick="c.show(this,document.all.btntxt,'1982-1-1')"/> 


             
<input type="text" name="btntxt1" id="btntxt1" /><input name="button1"  value="*"  id="button1" type="button" onclick="c.show(document.all.btntxt1,this,'1983-1-1')"/>
<br />

<br />
<br />

             
<input type="text" name="btntxt2" /><input name="button2" value="*"  id="button2" type="button" onclick="c.show('1984-1-1',this,document.all.btntxt2)"/>


             
<input type="text" name="btntxt3" /><input name="button3" value="*"  id="button3" type="button" onclick="c.show(this,document.all.btntxt3)"/>


</form></body>
</html>
posted on 2007-02-08 15:53  mbskys  阅读(127)  评论(0)    收藏  举报