/** * * @authors Nat Liu (fliu@sudytech.com) * @date 2014-08-25 11:01:41 * @version 2014-08-25 11:01:41 */ (function($){ /* 默认配置项 */ var defaultSetting = { dateFormat: "yyyy-MM-dd", // 日历格式 weeksCN: ["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d"], // 中文日历星期 weeksEN: ["SUN","MON","TUE","WED","THU","FRI","SAT"], // 英文日历星期 language:"cn", // 日历语言默认为中文 rows: 6, // 日历默认为6行 eventTitle: "News Event", // 日历标题 eventMoreUrl: 'http://www.sudytech.com', // 日历更多链接 eventWrap:'.event-news-list', // 用于显示事件内容的容器,如果存在,那么事件显示在此处 eventTpl:'

{{ d.title }}

Locale:{{ d.locale }}

Time:{{ d.time }}

', eventWrapDate:true, 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){ val.date = val.date.substring(0,10); 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+"\u573a\u8bb2\u5ea7"; } html += '
    '+d+'
    '; }; 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){ if(events.length<1){ return $eventWrap.empty().hide(); } $(".xshd_list_new").hide(); $(".xshd_list_day .d").html(year+'-'+month+'-'+day); $(".xshd_list_day").show(); $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+'
  • '; html += '
  • '+val.title+'
  • '; }); return html; }); $(".clndr-days",el).stop().animate({}, this.setting.eventsSpeed); $(".clndr-events",el).stop().animate({left:"0"}, this.setting.eventsSpeed); } } /* 格式化日期 (new Date()).Format("yyyy-MM-dd 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);