/** * GCalendar Holidays - Googleカレンダーから予定を取得 * @see http://0-oo.net/sbox/javascript/google-calendar-holidays * @version 0.3.1 beta 1a * @copyright 2008-2011 dgbadmin@gmail.com * @license http://0-oo.net/pryn/MIT_license.txt (The MIT license) * * See also * @see http://code.google.com/intl/ja/apis/calendar/data/2.0/reference.html * @see http://code.google.com/intl/ja/apis/gdata/docs/json.html */ var GCalEvents = { /** GoogleカレンダーのID(複数でも可) */ userIds: [ "ryokuyou.events@gmail.com" //イベントカレンダー ], /** 取得するイベント(スケジュール)の最大件数 */ maxResults: 200, /** イベント割引用へ遷移する用ページURL */ eventURL: 'https://twitter.com/', // @see http://code.google.com/intl/ja/apis/calendar/data/2.0/reference.html#Visibility visibility: [ "private-0391dbc0a753529e2c9bc684cc956bba" //イベントカレンダー //Summeryを利用したいので、限定公開 ], // @see http://code.google.com/intl/ja/apis/calendar/data/2.0/reference.html#Projection projection: "full-noattendees" }; (function($){ /** * 祝日を取得する * @param Function callback データ取得時に呼び出されるfunction * @param Number fromYear (optional) 年(指定しなければ今年) * @param Number fromMonth (optional) 月(1~12 指定しなければ1年の全て) * @param Number toYear (optional) 年(指定しなければ今年) * @param Number toMonth (optional) 月(1~12 指定しなければ1年の全て) */ GCalEvents.get = function(callback, fromYear, fromMonth, toYear, toMonth) { //日付範囲 var padZero = function(value) { return ("0" + value).slice(-2); }; var y = fromYear || new Date().getFullYear(); var m = fromMonth || 12; var y2 = toYear || new Date().getFullYear(); var m2 = toMonth *1 || 12; var start = [y, padZero(m || 1), "01"].join("-"); var end = [y2, padZero(m2), padZero(new Date(y2, m2, 0).getDate())].join("-"); this._caches = (this._caches || {}); this._userCallback = callback; for (var i = 0, len = this.userIds.length; i < len; i++) { //取得済みの場合はそれを使う var cache = this._caches[i + ":" + start + ".." + end]; if (cache) { callback(cache, i, this.eventURL); continue; } //URL作成 var url = location.protocol + "//www.google.com/calendar/feeds/"; url += encodeURIComponent(this.userIds[i]) + "/"; url += this.visibility[i] + "/" + this.projection; url += "?alt=json-in-script&callback=GCalEvents.decode"; url += "&max-results=" + this.maxResults; url += "&start-min=" + start + "&start-max=" + end + "T23:59:59"; //scriptタグ生成 var script = document.createElement("script"); script.type = "text/javascript"; script.src = url; script.charset = "UTF-8"; document.body.appendChild(script); } }; /** * JSONPによりGoogle Calendar API経由で呼び出されるfunction * @param Object gdata カレンダーデータ */ GCalEvents.decode = function(gdata) { var days = GCalEvents._entries2days(gdata.feed.entry); var links = gdata.feed.link; var href; for (var j = 0, len2 = links.length; j < len2; j++) { if (links[j].rel == "self") { href = links[j].href; } } //どのカレンダーか特定する var userId = decodeURIComponent(href.split("/")[5]); var index; for (var i = 0, len = this.userIds.length; i < len; i++) { if (this.userIds[i] == userId) { index = i; break; } } //キャッシュする var range = href.match(/\d{4}-\d{2}-\d{2}/g); //日付範囲の最初の日と最後の日 this._caches[index + ":" + range[0] + ".." + range[1]] = days; //コールバック this._userCallback(days, index, this.eventURL); }; /** * JSONPで取得したデータから日付情報を取り出す * @param Array entries スケジュール * @return Array 日付情報(year, month, date, title) */ GCalEvents._entries2days = function(entries) { if (!entries) { return []; } //日付順にソート entries.sort(function(a, b) { return (a.gd$when[0].startTime > b.gd$when[0].startTime) ? 1 : -1; }); var d; var days = []; var week = ["日","月","火","水","木","金","土"]; for (var i = 0, len = entries.length; i < len; i++) { var ymd = entries[i].gd$when[0].startTime; try{ d = new Date(ymd.replace(/-/g,'/')); if(d.getMonth()){ ymd = (d.getMonth() + 1) + "/" + d.getDate() + "
(" +week[d.getDay()] + ")"; } }catch( e ){ ymd = ""; } var title = entries[i].title.$t; var events = entries[i].gd$where[0].valueString.split('|||'); //日付が入っている場合は加工 try{ d = new Date(events[1]); if(d.getMonth()){ events[1] = (d.getMonth() + 1) + "/" + d.getDate() + "
(" +week[d.getDay()] + ")"; } d = new Date(events[2]); if(d.getMonth()){ events[2] = (d.getMonth() + 1) + "/" + d.getDate() + "
(" +week[d.getDay()] + ")"; } }catch( e ){ } var locations = entries[i].content.$t.replace(/\u003c/g, '<'); locations = locations.replace(/\u003d/g, '='); locations = locations.replace(/\u003e/g, '>'); var contents = locations.split('|||'); //年月日 イベント名 イベントリンク バックアップ等 男性向け・女性向け・一般 ジャンル・カップリング 直接搬入 通常〆切 1日本〆切 1日本割引 days[i] = { eventdate: ymd, title: title, eventUrl:contents[0], backupFlg:contents[1], onlyFlg:contents[2], genre:contents[3], delivery:events[0], closedate:events[1], oneclosedate:events[2] , oneoff:events[3] }; } return days; }; //1行のデータを作成してStringを帰す function generateData(eventday, checks, eventURL){ //該当するオンリーかどうかを判定するフラグ。チェックが0の場合は全部通す var returnFlg=false; if(checks.length !=0){ var returnFlg=true; for (var i = 0, len = checks.length; i < len; i++) { if(checks[i] == "womenOnly"){ if(eventday.onlyFlg == 2){ returnFlg= false; break; } } else if (checks[i] == "menOnly"){ if(eventday.onlyFlg == 1){ returnFlg= false; break; } } else if (checks[i] == "petitOnly"){ if(eventday.backupFlg == 3){ returnFlg= false; break; } } else if (checks[i] == "studioUOnly"){ if(eventday.backupFlg == 4){ returnFlg= false; break; } } else if (checks[i] == "normalBackUp"){ if(eventday.backupFlg == 1){ returnFlg= false; break; } } else if (checks[i] == "specialBackUp"){ if(eventday.backupFlg == 2){ returnFlg= false; break; } } } } //対象のイベントじゃない場合は終了 if(returnFlg) return ""; //イベント日時 var str= "" + eventday.eventdate + "\n"; //バナーとリンク str= str + "" + eventday.eventUrl + "\n"; //種別とタイトルと説明 var span =" 常時バックアップ" ; } else if(eventday.backupFlg == 2){ span = span + " class='special' > 特別バックアップ" ; } else if(eventday.backupFlg == 3){ span = span + " class='petit' > C.CITYプチ" ; } else if(eventday.backupFlg == 4){ span = span + " class='studio' > スタジオYOU" ; } span = span + " "; var contents= ""; //男性向け if(eventday.onlyFlg == 1){ contents = "" + eventday.genre + "" ; //女性向け } else if(eventday.onlyFlg == 2){ contents = "" + eventday.genre + "" ; //共通 } else { contents = "" + eventday.genre + "" ; } //説明 str= str + "" + span + eventday.title + "
" + contents + "\n"; //直接搬入 str= str + "" + eventday.delivery + "\n"; //通常〆切 str= str + "" + eventday.closedate + "\n"; //1日本〆切 str= str + "" + eventday.oneclosedate + "\n"; //1日本割引 str= str + "" + eventday.oneoff + "\n"; return str; } /** * カレンダーからイベント一覧を取得しテーブルに表示 */ GCalEvents.getEvents = function(fromYear, fromMonth, toYear, toMonth, div, checks ) { setTimeout(function() { //処理後に対象のdivが再構築されるケースを回避 GCalEvents.get(function(eventdays, index, eventURL) { $('#' + div).empty(); var header= ""; header= header +""; var innerHtmlString=""; var record=0; if( eventdays.length > this.maxResults){ innerHtmlString="" }else{ //テーブルの下にデータを生成 for (var i = 0, len = eventdays.length; i < len; i++) { var dataString = generateData(eventdays[i], checks, eventURL); if(dataString !=""){ var className =(record %2==0) ? "even": "odd"; innerHtmlString = innerHtmlString+ ""; innerHtmlString = innerHtmlString+ dataString; innerHtmlString = innerHtmlString+ ""; record++; } } } //1件も無かったら何かする必要はある? if(innerHtmlString == ""){ innerHtmlString="" } innerHtmlString = header + innerHtmlString + "
開催日
(曜日)
イベント種別/イベント名
ジャンル・カップリング
直接
搬入
通常
〆切
一日本
〆切
一日本
割引
件数が多すぎます。条件を絞るか、年月を小さいものにしてください。
対象のイベントはありません。
"; $('#' + div).append(innerHtmlString); }, fromYear, fromMonth, toYear, toMonth); }, 1); }; })(jQuery);