/* AUTHOR : ELEANOR MAO EMAIL : danningmao@outlook.com 2016-02-5 */ +(function($){ 'use strict'; //↓可选参数 var CALENDAR_OPTION = { type : 'normal',//'normal','weekly','monthly' id : '',//日历的id className : '',//日历的样式 dayNames : ['日', '一', '二', '三', '四', '五', '六'],//周名 numbers : ['一', '二', '三', '四', '五', '六'],//数字标示 today : true,//是否标志今天 select : true,//是否单击选中 multi : false,//是否单击可多选 disOtherMonth : false,//其他月日期是否可选 setMonth : null,//设定月 setYear : null,//设定年 selectDate : null, //format 'yyyy-mm-dd' or 'yyyy-mm-weekn' every element can be set to 'each'; allowDate : null, //format [yyyy-mm-dd,yyyy-mm-dd] prev: 'icon-arrow-left',//向前的按钮 next: 'icon-arrow-right',//向后的按钮 onselect: function(){},//当选中的回调函数 ongoprev: function(){},//当往前翻的回调函数 ongonext: function(){} //当往后翻的回调函数 } var Calendar = function( element, options){ this.el = $(element); this.opt = null; this.date = null; this.type = null; this.calendar = ''; this.init(element, options); } Calendar.prototype.init = function(element, options){ this.date = this.getDate(); var options = this.opt = this.getOptions( options, this.date ); this.type = options.type; options.target = $(element); this.calendar = ''; this.calendar += this.bulidCH(options); if( this.type == 'normal' ){ this.calendar += this.bulidWeekBar(options); this.calendar += ''; this.calendar += ''; this.calendar += this.bulidFull(options); } else if(this.type == 'weekly' ){ this.calendar += ''; this.calendar += this.bulidWeekly(options); } else if(this.type == 'monthly' ){ this.calendar += ''; this.calendar += this.bulidMonthly(options); } this.calendar +='
'; $(element).append(this.calendar).trigger('click'); $(element).on('click', ".prev, .next", options, function(){ var month = $(this).data('month').split('-')[1]; var year = $(this).data('month').split('-')[0]; var allowDate = options.allowDate; var calendar = ''; if ( $.isArray(allowDate) && (( year == allowDate[0].split('-')[0] && month == allowDate[0].split('-')[1] ) || ( year == allowDate[1].split('-')[0] && month == allowDate[1].split('-')[1])) ) return; if(options.type == 'normal'){ calendar = Calendar.prototype.bulidFull(options, year, month); } else if(options.type == 'monthly'){ calendar = Calendar.prototype.bulidMonthly(options, year, month); } else if(options.type == 'weekly'){ calendar = Calendar.prototype.bulidWeekly(options, year, month); } $(options.target).find('table.flexoCalendar tbody').empty().append(calendar).trigger('el.create'); Calendar.prototype.changeCH(this,options); if( this.className == 'prev' && options.ongoprev ){ options.ongoprev.call(options.target, $(this).next('.current-year').data('year'), $(this).data('month')); } if( this.className == 'next' && options.ongonext ){ options.ongonext.call(options.target, $(this).next('.current-year').data('year'), $(this).data('month')); } }) if( options.select ){ $(element).on('click', 'table>tbody>tr>td', options, function(){ if( !options.multi ){ $(this).parents("tbody").find("td.selected").removeClass('selected'); } if( options.disOtherMonth ){ if( this.className.split(' ')[0] != 'other-month'){ $(this).addClass('selected'); }; } else{ $(this).addClass('selected'); } if( options.onselect ){ options.onselect.call(options.target, $(this).data('time')); } }) } } Calendar.prototype.bulidCH = function(options){ var calendar=''; var year = options.setYear; var month = options.setMonth; var prevdate = this.getPrev(year, month, this.type); var nextdate = this.getNext(year, month, this.type); var prev = options.prev; var next = options.next; if( this.type == 'normal' ){ calendar +=''+year+'年'+this.dispose(month)+'月'; } else if(this.type == 'weekly' ){ var prevMonth = prevdate.split('-')[1]; var prevYear = prevdate.split('-')[0]; var nextMonth = nextdate.split('-')[1]; var nextYear = nextdate.split('-')[0]; var prevWeek = this.forWeek(prevYear ,prevMonth); var nextWeek = this.forWeek(nextYear ,nextMonth); calendar +=''+year+'年'+this.dispose(month)+'月'; } else if(this.type == 'monthly' ){ calendar +=''+year+'年'; } return calendar; } Calendar.prototype.changeCH = function(element,options){ var month = $(element).data('month').split('-')[1]; var year = $(element).data('month').split('-')[0]; month = parseInt(month); year = parseInt(year); var type = options.type; var prevdate = this.getPrev(year, month, type); var nextdate = this.getNext(year, month, type); var crtdate = year + '-' + this.dispose(month); var header = $(options.target).find(".current-year"); if(type == 'weekly'){ var prevMonth = prevdate.split('-')[1]; var prevYear = prevdate.split('-')[0]; var nextMonth = nextdate.split('-')[1]; var nextYear = nextdate.split('-')[0]; var prevWeek = this.forWeek(prevYear ,prevMonth); var nextWeek = this.forWeek(nextYear ,nextMonth); $(options.target).find(".prev").data('month', prevdate).attr('data-month', prevdate).data('week', prevWeek).attr('data-week', prevWeek); $(options.target).find(".next").data('month', nextdate).attr('data-month', nextdate).data('week', nextWeek).attr('data-week', nextWeek); }else{ $(options.target).find(".prev").data('month', prevdate).attr('data-month', prevdate); $(options.target).find(".next").data('month', nextdate).attr('data-month', nextdate); } $(options.target).find(".current-year").data('year', crtdate).attr('data-year', crtdate); if(type == 'monthly' ){ header.text(year+'年'); }else{ header.text(year+'年'+ this.dispose(month) +'月'); } } Calendar.prototype.bulidWeekBar = function(options){ var calendar = ''; for(var i = 0; i < 7; i++){ calendar += ''+options.dayNames[i]+''; } calendar += ''; return calendar; } Calendar.prototype.bulidFull = function(options, year, month){ var calendar = ''; var month = month ? parseInt(month) : parseInt(options.setMonth); var year = year ? parseInt(year) : parseInt(options.setYear); var prevdate = this.getPrev(year, month, 'normal'); var nextdate = this.getNext(year, month, 'normal'); var monthLen = eli.getMonthLen(year, month); var prevMonthLen = eli.getMonthLen(prevdate.split('-')[0], prevdate.split('-')[1]); var firDay = new Date(year,month-1,1).getDay(); var selectDate = options.selectDate; selectDate = typeof selectDate == 'string' ? selectDate.indexOf('-') != -1 ? selectDate.split('-') : null : null; if( selectDate ){ selectDate[0] = selectDate[0] == 'each' ? year : parseInt(selectDate[0]); selectDate[1] = selectDate[1] == 'each' ? month : parseInt(selectDate[1]); selectDate[2] = selectDate[2] == 'each' ? 1 : parseInt(selectDate[2]); } for(var j = 0; j < 42; j++){ if( j % 7 == 0 && j != 41 ){ if( j != 0){ calendar +=""; } else{ calendar +=""; } } //当前月 if( j >= firDay && ( j < (firDay + monthLen)) ){ if( options.today ){ if( j == parseInt(options.crtdate) + firDay - 1 && options.realyear == year && parseInt(options.realmonth) == month){ if( selectDate && selectDate[0] == year && selectDate[1] == month && selectDate[2] == parseInt(options.crtdate) ){ calendar += ''+(j-firDay+1)+''; }else{ calendar += ''+(j-firDay+1)+''; } }else{ if( selectDate && selectDate[0] == year && selectDate[1] == month && selectDate[2] == ( j -firDay + 1 )){ calendar +=''+(j-firDay+1)+''; }else{ calendar +=''+(j-firDay+1)+''; } } }else{ if( selectDate && selectDate[0] == year && selectDate[1] == month && selectDate[2] == ( j -firDay + 1 )){ calendar +=''+(j-firDay+1)+''; }else{ calendar +=''+(j-firDay+1)+''; } } } //上个月 else if( j < firDay ){ if( selectDate && ( selectDate[0] + '-' + selectDate[1] ) == prevdate && selectDate[2] == (prevMonthLen - (firDay - j - 1)) ){ calendar +=''+(prevMonthLen - (firDay - j - 1))+''; }else{ calendar +=''+(prevMonthLen - (firDay - j - 1))+''; } } //下个月 else if( j >= (firDay + monthLen)){ if( selectDate && ( selectDate[0] + '-' + selectDate[1] ) == nextdate && selectDate[2] == (j - monthLen - firDay + 1) ){ calendar += ''+(j - monthLen - firDay + 1)+''; }else{ calendar += ''+(j - monthLen - firDay + 1)+''; } } } calendar +=''; return calendar; } Calendar.prototype.bulidWeekly = function(options, year ,month){ var calendar = ''; var numbers = options.numbers; var month = month ? parseInt(month) : parseInt(options.setMonth); var year = year ? parseInt(year) : parseInt(options.setYear); var prevdate = this.getPrev(year, month, 'weekly'); var nextdate = this.getNext(year, month, 'weekly'); var monthLen = eli.getMonthLen(year, month); var prevMonth = prevdate.split('-')[1]; var nextMonth = nextdate.split('-')[1]; var prevMonthLen = eli.getMonthLen(prevdate.split('-')[0], prevMonth); var firDay = new Date(year,month-1,1).getDay(); firDay = firDay == 0 ? 7 : firDay; var startDay = firDay != 1 ? prevMonthLen - firDay + 2 : 1 ; var startMonth = startDay != 1? prevMonth : month ; var endDay = parseInt(startDay) + 6 > parseInt(prevMonthLen)? parseInt(startDay) + 6 - parseInt(prevMonthLen) : parseInt(startDay) + 6; var startYear = startMonth > month ? year - 1 : year ; var endYear = startMonth == 12 ? startYear + 1 : startYear ; var selectDate = options.selectDate; selectDate = typeof selectDate == 'string' ? selectDate.indexOf('-') != -1 ? selectDate.split('-') : null : null; if( selectDate ){ selectDate[0] = selectDate[0] == 'each' ? year : parseInt(selectDate[0]); selectDate[1] = selectDate[1] == 'each' ? month : parseInt(selectDate[1]); selectDate[2] = selectDate[2] == 'each' ? 'week1' : selectDate[2].indexOf('week') != -1 ? selectDate[2] : parseInt(selectDate[2]); if( typeof selectDate[2] == 'number'){ selectDate[2] = eli.getMonthWeek(selectDate[0], selectDate[1], selectDate[2])} } var crt; for(var j = 0; j < 5; j++ ){ if( j != 0 && parseInt(startDay) >= parseInt(endDay) ){ if( selectDate ){ crt = 'week' + ( j + 1 ); if( ($.isArray(selectDate[2]) && (year == selectDate[2][0][0] && month == selectDate[2][0][1] && selectDate[2][0][2] == crt)) || ( year == selectDate[0] && month == selectDate[1] && selectDate[2] == crt ) ){ calendar += '
第'+ numbers[j] +'周'+this.dispose(startMonth)+'/'+this.dispose(startDay)+'~'+this.dispose(nextMonth)+'/'+this.dispose(endDay)+'
'; } else{ calendar += '
第'+ numbers[j] +'周'+this.dispose(startMonth)+'/'+this.dispose(startDay)+'~'+this.dispose(nextMonth)+'/'+this.dispose(endDay)+'
'; } }else{ calendar += '
第'+ numbers[j] +'周'+this.dispose(startMonth)+'/'+this.dispose(startDay)+'~'+this.dispose(nextMonth)+'/'+this.dispose(endDay)+'
'; } } else if( options.today && ( (parseInt(options.realmonth) == startMonth && startDay <= parseInt(options.crtdate)) || ( parseInt(options.realmonth) != startMonth && startDay >= parseInt(options.crtdate)) ) && parseInt(options.crtdate) <= endDay && options.realyear == year && options.realmonth == month){ if( selectDate ){ crt = 'week' + ( j + 1 ); if( ($.isArray(selectDate[2]) && ((year == selectDate[2][0][0] && month == selectDate[2][0][1] && selectDate[2][0][2] == crt) || ( selectDate[2][1] && year == selectDate[2][1][0] && month == selectDate[2][1][1] && selectDate[2][1][2] == crt))) || ( year == selectDate[0] && month == selectDate[1] && selectDate[2] == crt ) ){ calendar += '
第'+ numbers[j] +'周'+this.dispose(startMonth)+'/'+this.dispose(startDay)+'~'+this.dispose(month)+'/'+this.dispose(endDay)+'
'; }else{ calendar += '
第'+ numbers[j] +'周'+this.dispose(startMonth)+'/'+this.dispose(startDay)+'~'+this.dispose(month)+'/'+this.dispose(endDay)+'
'; } }else{ calendar += '
第'+ numbers[j] +'周'+this.dispose(startMonth)+'/'+this.dispose(startDay)+'~'+this.dispose(month)+'/'+this.dispose(endDay)+'
'; } } else if( selectDate ){ crt = 'week' + ( j + 1 ); if( ($.isArray(selectDate[2]) && ((year == selectDate[2][0][0] && month == selectDate[2][0][1] && selectDate[2][0][2] == crt) || ( selectDate[2][1] && year == selectDate[2][1][0] && month == selectDate[2][1][1] && selectDate[2][1][2] == crt))) || ( year == selectDate[0] && month == selectDate[1] && selectDate[2] == crt ) ){ calendar += '
第'+ numbers[j] +'周'+this.dispose(startMonth)+'/'+this.dispose(startDay)+'~'+this.dispose(month)+'/'+this.dispose(endDay)+'
'; }else{ calendar += '
第'+ numbers[j] +'周'+this.dispose(startMonth)+'/'+this.dispose(startDay)+'~'+this.dispose(month)+'/'+this.dispose(endDay)+'
'; } } else{ calendar += '
第'+ numbers[j] +'周'+this.dispose(startMonth)+'/'+this.dispose(startDay)+'~'+this.dispose(month)+'/'+this.dispose(endDay)+'
'; } if( j == 0 && firDay != 1){ startMonth = parseInt(startMonth) + 1 > 12 ? '1' : parseInt(startMonth) + 1 ; startDay = parseInt(endDay) + 1; }else{ startDay += 7; } endDay = startDay + 6 > monthLen ? startDay + 6 - monthLen : startDay + 6; startYear = startMonth > month ? year - 1 : year ; endYear = startMonth == 12 && parseInt(endDay)<7? startYear +1 : startYear ; } return calendar; } Calendar.prototype.forWeek = function (year ,month){ var endMonth = parseInt(month) ; var year = parseInt(year) ; var prevdate = this.getPrev(year, month, 'weekly'); var monthLen = eli.getMonthLen(year, month); var prevMonth = prevdate.split('-')[1]; var prevMonthLen = eli.getMonthLen(prevdate.split('-')[0], prevMonth); var firDay = new Date(year, month - 1, 1).getDay(); firDay = firDay == 0 ? 7 : firDay; var startDay = firDay != 1 ? prevMonthLen - firDay + 2 : 1 ; var startMonth = startDay != 1? prevMonth : month ; var endDay = parseInt(startDay) + 6 > parseInt(prevMonthLen)? parseInt(startDay) + 6 - parseInt(prevMonthLen) : parseInt(startDay) + 6; var startYear = parseInt(startMonth) > month ? year - 1 : year ; var endYear = startMonth == 12 ? startYear + 1 : startYear ; var data = startYear +'-'+ this.dispose(startMonth) + '-' +this.dispose(startDay) +',' + endYear +'-' + this.dispose(month) + '-'+ this.dispose(endDay); return data; } Calendar.prototype.bulidMonthly = function(options, year ,month){ var calendar = ''; var month = month ? parseInt(month) : parseInt(options.setMonth); var year = year ? parseInt(year) : parseInt(options.setYear); var selectDate = options.selectDate; selectDate = typeof selectDate == 'string' ? selectDate.indexOf('-') != -1 && selectDate.indexOf('week') == -1 ? selectDate.split('-') : null : null; if(selectDate){ selectDate[0] = selectDate[0] == 'each' ? year : parseInt(selectDate[0]); selectDate[1] = selectDate[1] == 'each' ? 1 : parseInt(selectDate[1]); } for(var j = 0; j < 12; j++){ if( j % 4 == 0 && j !=12 ){ if( j != 0){ calendar +=""; } else{ calendar +=""; } } if( options.today && (j + 1) == options.realmonth && options.realyear == year){ if( selectDate && selectDate[0] == year && selectDate[1] == (j + 1)){ calendar += ''+(j + 1)+'月'; }else{ calendar += ''+(j + 1)+'月'; } }else if( selectDate && selectDate[0] == year && selectDate[1] == (j + 1)){ calendar += ''+(j + 1)+'月' }else{ calendar += ''+(j + 1)+'月' } } calendar +=''; return calendar; } Calendar.prototype.getNext = function(year, month, type){ var nextdate; if(type == 'monthly'){ nextdate = parseInt(year) + 1 + '-'; }else{ nextdate = parseInt(month) == 12 ? parseInt(year) + 1 + '-01' : year + '-' + this.dispose((parseInt(month) + 1)); } return nextdate; } Calendar.prototype.getPrev = function(year, month, type){ var prevdate; if(type == 'monthly'){ prevdate = parseInt(year) - 1 + '-'; }else{ prevdate = parseInt(month) == 1 ? parseInt(year) - 1 + '-12' : year + '-' + this.dispose((parseInt(month) - 1)); } return prevdate; } Calendar.prototype.getDate = function(){ var now = new Date(); var crtdate = now.getDate(); var setMonth = now.getMonth() + 1 ; var setYear = now.getYear() + 1900; crtdate = this.dispose(crtdate); setMonth = this.dispose(setMonth); var date = { crtdate : crtdate, realmonth : setMonth, setMonth : setMonth, realyear : setYear, setYear : setYear } return date; } Calendar.prototype.dispose = function(val){ var value = (parseInt(val)+100); value=value.toString(); value=value.substring(1); return value; } Calendar.prototype.getOptions = function(options, date){ if(options && typeof options == 'object'){ $.each(options , function(key, value){ if(value == void 0){ delete options[key]; } }) } var option = $.extend({target : null }, CALENDAR_OPTION, date, options); return option; } var Plugin = function( option ){ return this.each(function(){ var $this = $(this); var data = $this.data( 'ellie.calendar' ); var options = typeof option == 'object' && option; if( !data ) $this.data( 'ellie.calendar', ( data = new Calendar(this, option) ) ) }) } $.fn.flexoCalendar = Plugin; $.fn.flexoCalendar.Constructor = Calendar; var old = $.fn.flexoCalendar; // calendarWidget no conflict $.fn.flexoCalendar.noConflict = function () { $.fn.flexoCalendar = old; return this; } })(jQuery) +(function($){ var root=this; var eli = function(obj) { if (obj instanceof eli) return obj; if (!(this instanceof eli)) return new eli(obj); this.eliwrapped = obj; }; root.eli = eli; eli.getMonthLen = function(year, month){ var year = parseInt(year); var month = parseInt(month); var monthLen=[,31,28,31,30,31,30,31,31,30,31,30,31]; if ((month == 2)&&(year % 4 == 0)&&((year % 100 != 0)||(year % 400 == 0))){ return 29; }else{ return monthLen[month]; } } eli.getMonthWeek = function(year, month, day){ var year = parseInt(year), month = parseInt(month), day = parseInt(day); var that = [year, month,], firDay = new Date(year, month - 1, 1).getDay(), start = 1, next = 8, monthLen = eli.getMonthLen(year, month), nextfirDay = new Date(year , month, 1 ).getDay(), another; firDay = firDay == 0 ? 7 : firDay; next = firDay == 1 ? next : ( 9 - firDay ); for ( var i = 0; i < 5 ; i++){ if( start <= day && day < next){ that[2] = 'week' + ( i + 1 ); } start = next ; next += 7; next = next > monthLen ? monthLen : next; } if( nextfirDay !=1 ){ another = [,,'week1']; another[1] = month + 1 == 13 ? 1 : month + 1; another[0] = another[1] == 1 ? year + 1 : year; } var output = [that, another]; return output } })(jQuery)