function isDate(obj){
	return obj instanceof Date;
}
var Activity = Class.create();
Object.extend(Activity.prototype, {
initialize: function(a){
	this.a = {};
	this.m = {};
	this.update(a);
}
,rank_from_date : function(date){
	return ( typeof this.a[date] != 'undefined' ) ? this.a[date] :
	(this.unchecked_month(date)) ? -1 : 0;
}
,class_from_rank : function(rank){
	return (rank<1) ? "" : (rank<5) ? "little" : (rank<10) ? "normal" : (rank<15) ? "large" : "huge";
}
,class_from_date : function(date){
	var rank = this.rank_from_date(date);
	return this.class_from_rank(rank);
}
,unchecked_month : function(date){
	var month = date.toString().substr(0, 6);
	return typeof this.m[month] == 'undefined';
}
,check_month : function(date){
	var month = date.toString().substr(0, 6);
	this.m[month] = true;
}
,update : function(json){
	for( var i=0; i<json.length; i++ ){
		var val = json[i];
		var date = val.bm_day.toString();
		this.a[date] = val.num;
		if( this.unchecked_month(date) ){
			this.check_month(date);
		}
	}
}
});

var ActivitySubject = Class.create();
Object.extend(ActivitySubject.prototype, {
initialize:function(){
	this.observers = [];
}
,clear : function(){
	this.observers = [];
}
,attach : function(o){
	this.observers.push(o);
}
,notify : function(){
	this.observers.map( function(o){ if( typeof o == "function" ){ o(); } } );
}
});

function customConfigJapanese(){
	this.Config.Locale.MONTHS_SHORT = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"];
	this.Config.Locale.MONTHS_LONG  = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"];
	this.Config.Locale.WEEKDAYS_1CHAR = ["日", "月", "火", "水", "木", "金", "土"];
	this.Config.Locale.WEEKDAYS_SHORT = ["日", "月", "火", "水", "木", "金", "土"];
	this.Config.Locale.WEEKDAYS_MEDIUM= ["日", "月", "火", "水", "木", "金", "土"];
	this.Config.Locale.WEEKDAYS_LONG  = ["日", "月", "火", "水", "木", "金", "土"];
	//this.Config.Options.START_WEEKDAY = 1;
	//日曜日を赤くする
	var renderSunday = function(cal,cell) { YAHOO.util.Dom.addClass(cell, "sunday"); };
	this.addWeekdayRenderer(1, renderSunday);
}
function yyyymmdd(){
	return	( isArray (arguments[0]) ) ? _ymd_from_array(arguments[0]) :
			( isDate  (arguments[0]) ) ? _ymd_from_date(arguments[0]) :
			( isNumber(arguments[0]) && isNumber(arguments[1]) && isNumber(arguments[2]) ) ? _ymd_from_array(arguments) : "";
}
function _ymd_from_date(date){
	return _ymd_from_array( [ date.getFullYear(), date.getMonth()+1, date.getDate() ] );
}
function _ymd_from_array(a){
	var zeropad =  function(val) { return (val.toString().length>1) ? val : "0"+val; };
	return a.slice(0, 3).map(zeropad).join("");
}

function calendar_init(home, cal, activity, today) {
	var calendar = (today) ?
		new YAHOO.widget.Calendar("calendar", cal, today.m+"/"+today.y, today.m+"/"+today.d+"/"+today.y) :
		new YAHOO.widget.Calendar("calendar", cal);
	//日本語化
	calendar.customConfig = customConfigJapanese;
	//日付選択時に該当日付にリンク
	calendar.onSelect = function(selected){ location.href="/user/"+home+"/calendar/"+yyyymmdd(selected[0]); };
	//ヘッダ描画(月へのリンクにする)
	calendar.renderHeader = renderHeader(home);

	var act = new Activity(activity);
	var sbj = new ActivitySubject();
	//月送り時
	var onChangePage_default = calendar.onChangePage;
	calendar.onChangePage = function(){
		onChangePage_default.apply(this);
		if( act.unchecked_month(yyyymmdd(this.pageDate)) ){
			sbj.clear();
			var cb = function(json){
				act.update(json);
				sbj.notify();
			};
			var json = { y:this.pageDate.getFullYear(), m:this.pageDate.getMonth()+1 };
			var api = new API("/user/"+home+"/activity");
			api.get(json, cb);
		}
	};
	//セル描画
	calendar.renderCellDefault = function(workingDate, cell) {
		cell.innerHTML = "";
		var link = document.createElement("a");
		var date = yyyymmdd(workingDate);
		link.href="/user/"+home+"/calendar/"+date;
		YAHOO.util.Dom.addClass(link, "day_link");
		var observer =  function(){
			YAHOO.util.Dom.addClass(link, act.class_from_date(date));
		};
		( act.unchecked_month(date) ) ? sbj.attach(observer) : observer();
		link.appendChild(document.createTextNode(this.buildDayLabel(workingDate)));
		cell.appendChild(link);
	};
	//設定反映、描画実行
	calendar.setupConfig();
	calendar.render();
}

function renderHeader(home){
	return function(){
		this.headerCell.innerHTML = "";
		
		var headerContainer = document.createElement("DIV");
		headerContainer.className = this.Style.CSS_HEADER;
		
		if (this.linkLeft) {
			YAHOO.util.Event.removeListener(this.linkLeft, "mousedown", this.previousMonth);
		}
		this.linkLeft = document.createElement("A");
		this.linkLeft.innerHTML = "&nbsp;";
		YAHOO.util.Event.addListener(this.linkLeft, "mousedown", this.previousMonth, this, true);
		this.linkLeft.style.backgroundImage =  "url(" + this.Options.NAV_ARROW_LEFT + ")";
		this.linkLeft.className = this.Style.CSS_NAV_LEFT;
		
		if (this.linkRight) {
			YAHOO.util.Event.removeListener(this.linkRight, "mousedown", this.nextMonth);
		}
		this.linkRight = document.createElement("A");
		this.linkRight.innerHTML = "&nbsp;";
		YAHOO.util.Event.addListener(this.linkRight, "mousedown", this.nextMonth, this, true);
		this.linkRight.style.backgroundImage = "url(" + this.Options.NAV_ARROW_RIGHT + ")";
		this.linkRight.className = this.Style.CSS_NAV_RIGHT;

		var month = document.createElement("A");
		var yyyymm = yyyymmdd(this.pageDate).substr(0,6);
		month.href = "/user/"+home+"/calendar/"+yyyymm;
		month.appendChild(document.createTextNode(this.buildMonthLabel()));
		
		headerContainer.appendChild(this.linkLeft);
		headerContainer.appendChild(month);
		headerContainer.appendChild(this.linkRight);
		
		this.headerCell.appendChild(headerContainer);
	};
}
