/**
* 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= "
| 開催日 (曜日) | イベントバナー | イベント種別/イベント名 ジャンル・カップリング | 直接 搬入 | 通常 〆切 | 一日本 〆切 | 一日本 割引 |
|---|---|---|---|---|---|---|
| 件数が多すぎます。条件を絞るか、年月を小さいものにしてください。 | ||||||
| 対象のイベントはありません。 | ||||||