js 日期控件 无插件,支持中英文,设置起止日期

/**
* 格式化日期
* @param   d the delimiter
* @param   p the pattern of your date
* @author meizz
*/
 Date.prototype.format = function(format)
 {
     var o ={
            'M+' : this.getMonth()+1, //month
            'd+' : this.getDate(),    //day
            'h+' : this.getHours(),   //hour
            's+' : this.getSeconds(), //second
            'm+' : this.getMinutes(), //minute
            'q+' : Math.floor((this.getMonth()+3)/3),  //quarter
            'S' : this.getMilliseconds() //millisecond    
        };
       if(/(y+)/.test(format)){format=format.replace(RegExp.$1,(this.getFullYear()+'').substr(4 - RegExp.$1.length));}
      for(var k in o){    
             if(new RegExp('('+ k +')').test(format)){format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ('00'+ o[k]).substr((''+ o[k]).length));}}
     return format;
 };
/**
* 返回日期
* @param d the delimiter
* @param p the pattern of your date
*/
String.prototype.toDate = function(x, p)
{
    if(x == null){ x = '-';}
    if(p == null) {p = 'ymd';}
    var a = this.split(x);
    var y = parseInt(a[p.indexOf('y')]);
    //remember to change this next century ;)
    if(y.toString().length <= 2) {y += 2000;}
    if(isNaN(y)){ y = new Date().getFullYear();}
   
    var m = parseToInt(a[p.indexOf('m')]) - 1;
    var d = parseToInt(a[p.indexOf('d')]);
    if(isNaN(d)){ d = 1;}
    return new Date(y, m, d);
};

function  parseToInt(str)
{
    if(str.indexOf('0') == 0)
    {
        str = str.substr(1);
    }
    return parseInt(str);
};
/**
* 日历类
* @param   beginYear 1990
* @param   endYear   2010
* @param   lang      0(中文)|1(英语) 可自由扩充
* @param   dateFormatStyle 'yyyy-MM-dd";
* @version 2006-04-01
* @author KimSoft (jinqinghua [at] gmail.com)
* @update
*/
function Calendar(beginYear, endYear, lang, dateFormatStyle)
{
    this.beginYear = 1990;
    this.endYear = 2200;
    this.lang = 0;            //0(中文) | 1(英文)
    this.dateFormatStyle = 'yyyy-MM-dd';
    if (beginYear != null && endYear != null)
    {
        this.beginYear = beginYear;
        this.endYear = endYear;
    }
    if (lang != null)
    {
        this.lang = lang;
    }

    if (dateFormatStyle != null)
    {
        this.dateFormatStyle = dateFormatStyle;
    }

    this.dateControl = null;
    this.panel = this.getElementById('calendarPanel');
    this.form = null;

    this.date = new Date();
    this.year = this.date.getFullYear();
    this.month = this.date.getMonth();
    this.colors =
        {
            'cur_word'      : '#FFFFFF', //当日日期文字颜色
            'cur_bg'        : '#00FF00', //当日日期单元格背影色
            'sun_word'      : '#FF0000', //星期天文字颜色
            'sat_word'      : '#0000FF', //星期六文字颜色
            'td_word_light' : '#333333', //单元格文字颜色
            'td_word_dark' : '#CCCCCC', //单元格文字暗色
            'td_bg_out'     : '#EFEFEF', //单元格背影色
            'td_bg_over'    : '#FFCC00', //单元格背影色
            'tr_word'       : '#FFFFFF', //日历头文字颜色
            'tr_bg'         : '#666666', //日历头背影色
            'input_border' : '#CCCCCC', //input控件的边框颜色
            'input_bg'      : '#EFEFEF'   //input控件的背影色

        };

    this.draw();
    this.bindYear();
    this.bindMonth();
    this.changeSelect();
    this.bindData();
}

/**
* 日历类属性(语言包,可自由扩展)
*/
Calendar.language =
    {
        'year'   : [[''], ['']],
        'months' : [['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'],
                ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']
                 ],
        'weeks' : [['日','一','二','三','四','五','六'],
                ['SUN','MON','TUR','WED','THU','FRI','SAT']
                 ],
        'clear' : [['清空'], ['CLS']],
        'today' : [['今天'], ['TODAY']],
        'close' : [['关闭'], ['CLOSE']]
    };

Calendar.prototype.draw = function()
{
    calendar = this;

    var mvAry = [];
    mvAry[mvAry.length] = " <form name=/'calendarForm/' style='margin: 0px;'>";
    mvAry[mvAry.length] ="    <table width='100%' border='0' cellpadding='0' cellspacing='1'>";
    mvAry[mvAry.length] ="      <tr>";
    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;' name='prevMonth' type='button' id='prevMonth' value='&lt;' /></th>";
    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;'></select></th>";
    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;' name='nextMonth' type='button' id='nextMonth' value='&gt;' /></th>";
    mvAry[mvAry.length] ="      </tr>";
    mvAry[mvAry.length] ="    </table>";
    mvAry[mvAry.length] ="    <table id='calendarTable' width='100%' style='border:0px solid #CCCCCC;background-color:#FFFFFF' border='0' cellpadding='3' cellspacing='1'>";
    mvAry[mvAry.length] ="      <tr>";
    for(var i = 0; i < 7; i++)
    {
        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>";
    }
    mvAry[mvAry.length] ="      </tr>";
    for(var i = 0; i < 6;i++)
    {
        mvAry[mvAry.length] ="    <tr align='center'>";
        for(var j = 0; j < 7; j++)
        {
              if (j == 0)
              {
                mvAry[mvAry.length] =" <td style='cursor:default;color:"+ calendar.colors['sun_word'] + ";'></td>";
              } else if(j == 6)
              {
                mvAry[mvAry.length] =" <td style='cursor:default;color:"+ calendar.colors['sat_word'] + ";'></td>";
              }
              else
              {
                mvAry[mvAry.length] =" <td style='cursor:default;'></td>";
              }
        }
        mvAry[mvAry.length] ="    </tr>";
    }
    mvAry[mvAry.length] ="      <tr style='background-color:" + calendar.colors['input_bg'] + ";'>";
    mvAry[mvAry.length] ="        <th colspan='2'><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:100%;height:20px;font-size:12px;'/></th>";
    mvAry[mvAry.length] ="        <th colspan='3'><input name='calendarToday' type='button' id='calendarToday' value='"+ Calendar.language['today'][this.lang] + "' style='border: 1px solid "+ calendar.colors['input_border'] + ";background-color:"+ calendar.colors['input_bg'] + ";width:100%;height:20px;font-size:12px;'/></th>";
    mvAry[mvAry.length] ="        <th colspan='2'><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:100%;height:20px;font-size:12px;'/></th>";
    mvAry[mvAry.length] ="      </tr>";
    mvAry[mvAry.length] ="    </table>";
    mvAry[mvAry.length] =" </form>";
    if(this.panel != 'undefined')
    {
        this.panel.innerHTML = mvAry.join('');
    }
    this.form = document.forms['calendarForm'];
    if(this.form == 'undefined'){ return;}
    this.form.prevMonth.onclick = function () {calendar.goPrevMonth(this);};
    this.form.nextMonth.onclick = function () {calendar.goNextMonth(this);};
    this.form.calendarClear.onclick = function () {calendar.dateControl.value = '';calendar.hide();};
    this.form.calendarClose.onclick = function () {calendar.hide();};
    this.form.calendarYear.onchange = function () {calendar.update(this);};
    this.form.calendarMonth.onchange = function () {calendar.update(this);};
    this.form.calendarToday.onclick = function ()
    {
        var today = new Date();
        calendar.date = today;
        calendar.year = today.getFullYear();
        calendar.month = today.getMonth();
        calendar.changeSelect();
        calendar.bindData();
        calendar.dateControl.value = today.format(calendar.dateFormatStyle);
        calendar.hide();
    };

};

//年份下拉框绑定数据
Calendar.prototype.bindYear = function()
{
    if(this.form == 'undefined'){ return;}
    var cy = this.form.calendarYear;
    cy.length = 0;
    for (var i = this.beginYear; i <= this.endYear; i++)
    {
        cy.options[cy.length] = new Option(i + Calendar.language['year'][this.lang], i);
    }
};

//月份下拉框绑定数据
Calendar.prototype.bindMonth = function()
{
    if(this.form == 'undefined'){ return;}
    var cm = this.form.calendarMonth;
    cm.length = 0;
    for (var i = 0; i < 12; i++)
    {
        cm.options[cm.length] = new Option(Calendar.language['months'][this.lang][i], i);
    }
};

//向前一月
Calendar.prototype.goPrevMonth = function(e)
{
    if (this.year == this.beginYear && this.month == 0){return;}
    this.month--;
    if (this.month == -1)
    {
        this.year--;
        this.month = 11;
    }
    this.date = new Date(this.year, this.month, 1);
    this.changeSelect();
    this.bindData();
};

//向后一月
Calendar.prototype.goNextMonth = function(e)
{
    if (this.year == this.endYear && this.month == 11){return;}
    this.month++;
    if (this.month == 12)
    {
        this.year++;
        this.month = 0;
    }
    this.date = new Date(this.year, this.month, 1);
    this.changeSelect();
    this.bindData();
};

//改变SELECT选中状态
Calendar.prototype.changeSelect = function()
{
    if(this.form == undefined){return;}
    var cy = this.form.calendarYear;
    var cm = this.form.calendarMonth;
    for (var i= 0; i < cy.length; i++)
    {
        if (cy.options[i].value == this.date.getFullYear())
        {
          cy[i].selected = true;
          break;
        }
    }
    for (var i= 0; i < cm.length; i++)
    {
        if (cm.options[i].value == this.date.getMonth())
        {
            cm[i].selected = true;
            break;
        }
    }
};

//更新年、月
Calendar.prototype.update = function (e)
{
    this.year = e.form.calendarYear.options[e.form.calendarYear.selectedIndex].value;
    this.month = e.form.calendarMonth.options[e.form.calendarMonth.selectedIndex].value;
    this.date = new Date(this.year, this.month, 1);
    this.changeSelect();
    this.bindData();
};

//绑定数据到月视图
Calendar.prototype.bindData = function ()
{  
    if(this.panel == undefined){ return ;}
    var calendar = this;
    var dateArray = this.getMonthViewArray(this.date.getYear(), this.date.getMonth());
    var tds = this.getElementById('calendarTable').getElementsByTagName('td');
    for(var i = 0; i < tds.length; i++)
    {
        //tds[i].style.color = calendar.colors['td_word_light'];
        tds[i].style.backgroundColor = calendar.colors['td_bg_out'];
        tds[i].onclick = function () {return;};
        tds[i].onmouseover = function () {return;};
        tds[i].onmouseout = function () {return;};
        if (i > dateArray.length - 1){ break;}
        tds[i].innerHTML = dateArray[i];
        if (dateArray[i] != '&nbsp;')
        {
              tds[i].onclick = function ()
                {
                    if (calendar.dateControl != null)
                    {
                      calendar.dateControl.value = new Date(calendar.date.getFullYear(),calendar.date.getMonth(),this.innerHTML).format(calendar.dateFormatStyle);
                    }
                    calendar.hide();
                };
              tds[i].onmouseover = function ()
              {
                this.style.backgroundColor = calendar.colors['td_bg_over'];
              };
              tds[i].onmouseout = function ()
              {
                this.style.backgroundColor = calendar.colors['td_bg_out'];
              };
              if (new Date().format(calendar.dateFormatStyle) ==
                  new Date(calendar.date.getFullYear(),
                           calendar.date.getMonth(),
                           dateArray[i]).format(calendar.dateFormatStyle))
                {
                    //tds[i].style.color = calendar.colors['cur_word'];
                    tds[i].style.backgroundColor = calendar.colors['cur_bg'];
                    tds[i].onmouseover = function ()
                    {
                      this.style.backgroundColor = calendar.colors['td_bg_over'];
                    };
                    tds[i].onmouseout = function ()
                    {
                      this.style.backgroundColor = calendar.colors['cur_bg'];
                    };
                }//end if
            }
    }
};

//根据年、月得到月视图数据(数组形式)
Calendar.prototype.getMonthViewArray = function (y, m)
{
    var mvArray = [];
    var dayOfFirstDay = new Date(y, m, 1).getDay();
    var daysOfMonth = new Date(y, m + 1, 0).getDate();
    for (var i = 0; i < 42; i++)
    {
        mvArray[i] = '&nbsp;';
    }
    for (var i = 0; i < daysOfMonth; i++)
    {
        mvArray[i + dayOfFirstDay] = i + 1;
    }
    return mvArray;
};

//扩展 document.getElementById(id) 多浏览器兼容性 from meizz tree source
Calendar.prototype.getElementById = function(id)
{
    if (typeof(id) != 'string' || id == '') {return null;}
    if (document.getElementById){ return document.getElementById(id);}
    if (document.all){ return document.all(id);}
    try {return eval(id);} catch(e){ return null;}
};

//扩展 object.getElementsByTagName(tagName)
Calendar.prototype.getElementsByTagName = function(object, tagName)
{
    if (document.getElementsByTagName) {return document.getElementsByTagName(tagName);}
    if (document.all){ return document.all.tags(tagName);}
};

//取得HTML控件绝对位置
Calendar.prototype.getAbsPoint = function (e)
{
    var x = e.offsetLeft;
    var y = e.offsetTop;
    while(e = e.offsetParent)
    {
        x += e.offsetLeft;
        y += e.offsetTop;
    }
    return {'x': x, 'y': y};
};

//显示日历
Calendar.prototype.show = function (dateControl, popControl)
{
    if (dateControl == null)
    {
        throw new Error('arguments[0] is necessary');
    }
    this.dateControl = dateControl;
  
    if (dateControl.value.length > 0)
    {
        this.date = dateControl.value.toDate();
        this.year = this.date.getFullYear();
        this.month = this.date.getMonth();
        this.changeSelect();
        this.bindData();
    }
    if (popControl == null)
    {
        popControl = dateControl;
    }
    var xy = this.getAbsPoint(popControl);
    this.panel.style.left = xy.x + 'px';
    this.panel.style.top = (xy.y + dateControl.offsetHeight) + 'px';
    this.setDisplayStyle('select', 'hidden');
    this.panel.style.visibility = 'visible';
};

//隐藏日历
Calendar.prototype.hide = function()
{
    this.setDisplayStyle('select', 'visible');
    this.panel.style.visibility = 'hidden';
};

//设置控件显示或隐藏
Calendar.prototype.setDisplayStyle = function(tagName, style)
{
    var tags = this.getElementsByTagName(null, tagName);
    for(var i = 0; i < tags.length; i++)
    {
        if (tagName.toLowerCase() == 'select' &&(tags[i].name == 'calendarYear' ||tags[i].name == 'calendarMonth'))
        {
          continue;
        }
        tags[i].style.visibility = style;
    }
};

document.write("<div id='calendarPanel' style='position: absolute;visibility: hidden;z-index: 9999;background-color: #FFFFFF;border: 1px solid #CCCCCC;width:175px;font-size:12px;'></div>");
//var calendar = new Calendar();
//调用calendar.show(dateControl, popControl);
//--> // 0 中文 1英文
// <input  οnclick="new Calendar(2000 ,2100,0).show(this);"/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值