﻿Calendar = function(DayTime){
    this.Format = 'yyyy-mm-dd';
    
    this.CurrentDayTime = DayTime;
    
    this.IsLeapYear = function()
    {
        var y = this.CurrentDayTime.getFullYear();
		return (y%4==0 && y%100!=0) || y%400==0;
    }
    
    this.GetDaysInMonth = function(date)
    {
        var day = date || this.CurrentDayTime;
        return [31,(this.IsLeapYear() ? 29:28),31,30,31,30,31,31,30,31,30,31][day.getMonth()];
    }
    
    this.AddMonths = function(date,m)
    {
        var day = date || this.CurrentDayTime;
        var tmpdtm = day.getDate();
		day.setMonth(day.getMonth() + m);
		if (tmpdtm > day.getDate())
			this.AddDays(day,-day.getDate());
		return day;
    }
    
    this.AddDays = function(date,d)
    {
        var day = date || this.CurrentDayTime;
        day.setTime(day.getTime() + (d*86400000) );
		return day;
    }
    
    this.ToString = function(date,format)
    {
        var r = format || this.Format;
        var d = date || this.CurrentDayTime;
		return r
			.split('yyyy').join(d.getFullYear())
			.split('yy').join((d.getFullYear() + '').substring(2))
			.split('mm').join(this.ZeroPad(d.getMonth()+1))
			.split('dd').join(this.ZeroPad(d.getDate()))
			.split('hh').join(this.ZeroPad(d.getHours()))
			.split('min').join(this.ZeroPad(d.getMinutes()))
			.split('ss').join(this.ZeroPad(d.getSeconds()));
    }
    
    this.GetDayArray = function()
    {
        var array = [];
        //本月
        var first_day_of_month = new Date(this.CurrentDayTime.getFullYear(),this.CurrentDayTime.getMonth(),1);//当月第一天日期
        var days_of_month = this.GetDaysInMonth();
        for(var i = 0;i<days_of_month;i++)
        {
            var temp_day = this.AddDays(first_day_of_month,i==0?0:1);
            array.push({date:this.ToString(temp_day,"yyyy-mm-dd"),day:temp_day.getDate(),week:temp_day.getDay(),type:0});
        }
        //上个月日期
        first_day_of_month = new Date(this.CurrentDayTime.getFullYear(),this.CurrentDayTime.getMonth(),1);
        var pre_month_day = this.AddDays(first_day_of_month,-1);
        day_of_month = this.GetDaysInMonth(pre_month_day);
        
        var pre_month_days = array[0].week == 0 ? 7 : array[0].week;
        for(var i=0;i<pre_month_days;i++)
        {
            var temp_day = this.AddDays(pre_month_day,i==0?0:-1);
            array.unshift({date:this.ToString(temp_day,"yyyy-mm-dd"),day:temp_day.getDate(),week:temp_day.getDay(),type:-1}); 
        }
        //下个月日期
        var last_day_of_month = new Date(this.CurrentDayTime.getFullYear(),this.CurrentDayTime.getMonth(),this.GetDaysInMonth());//当月第一天日期
        var next_month_day = this.AddDays(last_day_of_month,1);
        var next_month_days = 42-array.length;
        for(var i =0;i< next_month_days;i++)
        {
            var temp_day = this.AddDays(next_month_day,i==0?0:1);
            array.push({date:this.ToString(temp_day,"yyyy-mm-dd"),day:temp_day.getDate(),week:temp_day.getDay(),type:1});
        }
        
        return array;
    }
    
    this.ZeroPad = function(num) {
		var s = '0'+num;
		return s.substring(s.length-2)
	};
}


