(function($){
/*
默认配置项
*/
var defaultSetting = {
dateFormat: "yyyy-MM-dd", // 日历格式
weeksCN: ["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d"], // 中文日历星期
weeksEN: ["一","二","三","四","五","六","日"], // 英文日历星期
language:"en", // 日历语言默认为中文
rows: 6, // 日历默认为6行
eventTitle: "News Event", // 日历标题
eventMoreUrl: 'http://www.sudytech.com', // 日历更多链接
eventWrap:'.event-news-list', // 用于显示事件内容的容器,如果存在,那么事件显示在此处
eventTpl:'
Locale:{{ d.locale }}
Time:{{ d.time }}
',
eventWrapDate:true,
noShow:'',
gotoday:false, // 指定默认跳到哪一天
ajaxUrl: null, // ajax 请求地址
ajaxData: {}, // ajax 参数
isSingle:true, // 当日只有一个文章时,是否点击日历当天直接访问这篇文章
eventsSpeed:300, // 文章拉出动画速度
json:[] // 前台模板构造json
};
var Clndr = function(element, setting){
this.element = element;
this.setting = $.extend(true, {}, defaultSetting, setting);
this.curday = null;
this.events = {};
this.setup();
}
// javascript模板
if(!window.laytpl){
;!function(){"use strict";var f,b={open:"{{",close:"}}"},c={exp:function(a){return new RegExp(a,"g")},query:function(a,c,e){var f=["#([\\s\\S])+?","([^{#}])*?"][a||0];return d((c||"")+b.open+f+b.close+(e||""))},escape:function(a){return String(a||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(a,b){var c="tpl Error:";return"object"==typeof console&&console.error(c+a+"\n"+(b||"")),c+a}},d=c.exp,e=function(a){this.tpl=a};e.pt=e.prototype,e.pt.parse=function(a,e){var f=this,g=a,h=d("^"+b.open+"#",""),i=d(b.close+"$","");a=a.replace(/[\r\t\n]/g," ").replace(d(b.open+"#"),b.open+"# ").replace(d(b.close+"}"),"} "+b.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(c.query(),function(a){return a=a.replace(h,"").replace(i,""),'";'+a.replace(/\\/g,"")+'; view+="'}).replace(c.query(1),function(a){var c='"+(';return a.replace(/\s/g,"")===b.open+b.close?"":(a=a.replace(d(b.open+"|"+b.close),""),/^=/.test(a)&&(a=a.replace(/^=/,""),c='"+_escape_('),c+a.replace(/\\/g,"")+')+"')}),a='"use strict";var view = "'+a+'";return view;';try{return f.cache=a=new Function("d, _escape_",a),a(e,c.escape)}catch(j){return delete f.cache,c.error(j,g)}},e.pt.render=function(a,b){var e,d=this;return a?(e=d.cache?d.cache(a,c.escape):d.parse(d.tpl,a),b?(b(e),void 0):e):c.error("no data")},f=function(a){return"string"!=typeof a?c.error("Template not found"):new e(a)},f.config=function(a){a=a||{};for(var c in a)b[c]=a[c]},f.v="1.1","function"==typeof define?define(function(){return f}):"undefined"!=typeof exports?module.exports=f:window.laytpl=f}();
}
/*
初始化日历设置
*/
Clndr.prototype.setup = function(){
var _this = this, el = this.element;
if(/cn/gi.test(this.setting.language)){
this.setting.weeks = this.setting.weeksCN;
datesep = ["\u5e74","\u6708","\u65e5"];
}else{
this.setting.weeks = this.setting.weeksEN;
datesep = [".",".",""];
};
var template = '';
$(el).html(template);
$(".clndr-days-week", el).html(function(){
var html = "";
$.each(_this.setting.weeks, function(index, val) {
/* iterate through array or object */
html += ''+val+' | ';
});
return html;
});
this.curday = this.setting.gotoday ? this.setting.gotoday : new Date();
if(this.setting.json.length>0){
this.events = this.jsonToEvents(this.setting.json);
}
this.getEvents();
$(el).on("click",".clndr-prev",function(e){
e.preventDefault();
_this.curday = _this.getPrevMonth(_this.Format(_this.curday)).date;
_this.getEvents();
});
$(el).on("click",".clndr-next",function(e){
e.preventDefault();
_this.curday = _this.getNextMonth(_this.Format(_this.curday)).date;
_this.getEvents();
});
$(el).on("click",".clndr-day",function(e){
e.preventDefault();
var datestr = $(this).find("[data-date]").attr("data-date"),
date = datestr.split("-"),
dateIndex = date[0]+"-"+date[1];
_this.curday = new Date(parseInt(date[0],10),parseInt(date[1],10)-1,parseInt(date[2],10));
_this.getEvents();
var events = _this.events[dateIndex]||{};
events = events[datestr]||[];
if(_this.setting.isSingle&&events.length==1){
window.open(events[0].url,"_blank");
}else{
_this.loadEvents(datestr,events);
}
});
$(el).on("click",".clndr-events-close",function(e){
e.preventDefault();
$(".clndr-days", el).stop().animate({left:0}, _this.setting.eventsSpeed);
$(".clndr-events", el).stop().animate({left:"100%"}, _this.setting.eventsSpeed);
});
};
Clndr.prototype.jsonToEvents = function(json){
var _this = this, el = this.element, events = {};
if(json.length>0){
$.each(json, function(index, val) {
/* iterate through array or object */
if(val.date){
var date = val.date.split("-"),
dateIndex = date[0]+"-"+date[1];
if(!events[dateIndex])
events[dateIndex] = {};
if(!events[dateIndex][val.date])
events[dateIndex][val.date] = [];
events[dateIndex][val.date].push(val);
}
});
}
return events;
}
Clndr.prototype.getEvents = function(){
var _this = this, eventsIndex = this.Format(this.curday,"yyyy-MM");
if(this.setting.ajaxUrl!=null && !_this.events[eventsIndex]){
$.ajax({
url: this.setting.ajaxUrl,
type: 'GET',
dataType: 'json',
data: $.extend(true, {}, {date: eventsIndex}, this.setting.ajaxData)
})
.done(function(json) {
_this.events[eventsIndex] = _this.jsonToEvents(json)[eventsIndex];
_this.loadDates();
})
.fail(function() {
_this.loadDates();
});
}else{
this.loadDates();
}
}
/*
加载日期,创建日历
*/
Clndr.prototype.loadDates = function(){
var _this = this, el = this.element, curmonth = this.curday, today = new Date(),
prevmonth = this.getPrevMonth(this.Format(this.curday,"yyyy-MM-dd"));
nextmonth = this.getNextMonth(this.Format(this.curday,"yyyy-MM-dd"));
var day1 = new Date(this.curday.getFullYear(),this.curday.getMonth(),1).getDay();
var days = new Date(this.curday.getFullYear(),this.curday.getMonth()+1,0).getDate();
$(".clndr-select-year", el).html(this.Format(this.curday,"yyyy"));
$(".clndr-select-month", el).html(this.Format(this.curday,"MM"));
$(".clndr-select-day", el).html(this.Format(this.curday,"dd"));
var events = this.events[this.Format(this.curday,"yyyy-MM")] || {};
$(".clndr-days-table", el).html(function(){
var html = "",date;
for(var k = 0; k < _this.setting.rows; k++) {
/* iterate through array or object */
html += '';
for(var i =0; i < 7; i++) {
/* iterate through array or object */
var index = k*7+i, y, m, d, n = "", c = "", t = "";
if(indexday1+days-1){
d = index+1-day1-days;
c =" clndr-day-out";
y = nextmonth.date.getFullYear();
m = nextmonth.date.getMonth();
}else{
d = index+1-day1;
y = _this.curday.getFullYear();
m = _this.curday.getMonth();
if(d==_this.curday.getDate()){
c = " clndr-day-cur";
}
if(y==today.getFullYear()&&m==today.getMonth()&&d==today.getDate()){
c = " clndr-today";
}
}
date = _this.Format(new Date(y,m,d));
if(events[date]){
n = " clndr-has-events";
t = date+"\u6709"+events[date].length+"\u7bc7\u6587\u7ae0";
}
html += ' | ';
};
html +='
';
};
return html;
});
var height = $(".clndr-days", el).outerHeight(),
theight = $(".clndr-events-head", el).outerHeight();
$(".clndr-container", el).height(height);
$(".clndr-events-list", el).height(height-theight);
}
/*
加载事件,创建事件列表
*/
Clndr.prototype.loadEvents = function(datestr, events){
var _this = this, el = this.element,
title = this.setting.eventTitle,
titleUrl = $.trim(this.setting.eventMoreUrl),
$eventWrap = $(this.setting.eventWrap);
var date = new Date(Date.parse(datestr.replace(/-/g,"/")));
var year = date.getFullYear(),
month = date.getMonth()+1,
day = date.getDate(),
week = this.setting.weeksCN[date.getDay()];
if($eventWrap.length>0){
$(this.setting.noShow).hide();
if(events.length<1){
return $eventWrap.html('当前没有检索到信息!
');
//return $eventWrap.empty().hide();
}
$eventWrap.addClass('sudyclndr-event-wrap').html(function(html){
var html = "";
if(_this.setting.eventWrapDate){
html += ''+year+'年'+month+'月'+day+'日'+' 星期'+week+'
';
}
$.each(events, function(index, val) {
/* iterate through array or object */
html += laytpl(_this.setting.eventTpl).render(val);
});
return html;
}).show();
}else{
if(events.length<1){
return false;
};
if(titleUrl!==""&&titleUrl!=="#")
title = ''+title+'';
$(".clndr-events-title", el).html(title);
$(".clndr-events-list", el).html(function(){
var html ="";
$.each(events, function(index, val) {
/* iterate through array or object */
html += ''+val.title+'';
});
return html;
});
$(".clndr-days",el).stop().animate({left:"-100%"}, this.setting.eventsSpeed);
$(".clndr-events",el).stop().animate({left:"0"}, this.setting.eventsSpeed);
}
}
/*
格式化日期
(new Date()).Format("yyyy-M-d hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
(new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
*/
Clndr.prototype.Format = function(date,fmt){
if(!date)var date = new Date();
if(!fmt)var fmt = this.setting.dateFormat;
var o = {
"M+" : date.getMonth()+1,
"d+" : date.getDate(),
"h+" : date.getHours(),
"m+" : date.getMinutes(),
"s+" : date.getSeconds(),
"q+" : Math.floor((date.getMonth()+3)/3),
"S" : date.getMilliseconds()
};
if(/(y+)/.test(fmt))
fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)
if(new RegExp("("+ k +")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
return fmt;
}
/*
获取上一个月份日期
*/
Clndr.prototype.getPrevMonth = function(date) {
var arr = date.split('-');
var year = parseInt(arr[0],10);
var month = parseInt(arr[1],10);
var day = parseInt(arr[2],10);
var days = new Date(year, month, 0);
days = days.getDate();
var year2 = year;
var month2 = month - 1;
if (month2 == 0) {
year2 = year2 - 1;
month2 = 12;
}
var day2 = day;
var days2 = new Date(year2, month2, 0);
days2 = days2.getDate();
if (day2 > days2) {
day2 = days2;
}
var prevMonth = new Date(year2,month2-1,day2);
return {
date:prevMonth,
days: days2
};
}
/*
获取下一个月份日期
*/
Clndr.prototype.getNextMonth = function(date){
var arr = date.split('-');
var year = parseInt(arr[0],10);
var month = parseInt(arr[1],10);
var day = parseInt(arr[2],10);
var days = new Date(year, month, 0);
days = days.getDate();
var year2 = year;
var month2 = month + 1;
if (month2 == 13) {
year2 = year2 + 1;
month2 = 1;
}
var day2 = day;
var days2 = new Date(year2, month2, 0);
days2 = days2.getDate();
if (day2 > days2) {
day2 = days2;
}
var nextMonth = new Date(year2,month2-1,day2);
return {
date: nextMonth,
days: days2
};
}
/*
注册sudyclndr插件
*/
$.fn.sudyclndr = function(setting){
var clndrs = [];
this.each(function() {
clndrs.push(new Clndr(this, setting));
});
return clndrs;
}
})(jQuery);