﻿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"  align="center" 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:100%;"><iframe id="divtime1" style="position:absolute;z-index:-1;width:140px;height:114px;top:0;left:0;scrolling:no;" frameborder="0" src="about:blank"></iframe>'; 
   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() 
{     
	return "";      
}; 
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;" onmouseout="' + this.Obj + '.hideMenu();">0</td>\n'; //去掉年份选择 onclick="' + this.Obj + '.showMenu(true);"
	str += '<td onmouseover="this.className=\'headerOver\'" onmouseout="this.className=\'\'" id="currentMonth" onmouseout="' + this.Obj + '.hideMenu();">0</td>\n'; //去掉月份选择 onclick="' + this.Obj + '.showMenu(false);"
	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="0" 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-40; 
	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.onblur = function(obj) 
{
	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();  
} 


Calendar.prototype.GetPosition=function(input)
{
	var l = input.offsetLeft;
	var t = input.offsetTop;
	var w = input.offsetWidth;
	var h = input.offsetHeight;
	while( input=input.offsetParent )
	{
		if(input.nodeName == "FIELDSET")
		{
			l +=2;
			t +=2;
		}
		l += input.offsetLeft;
		t += input.offsetTop;
	}
	return {left:l,top:t,width:w,height:h};
}

Calendar.prototype.onblurHidden=function (){
	var posDiv = this.GetPosition(document.getElementById("Calendar"));
	var x = event.clientX;
	var y = event.clientY;		
	if(x<posDiv.left || x>posDiv.left+posDiv.width || y <posDiv.top || y >posDiv.top+posDiv.height){
		this.hide();
	}		
}
