
var utlCalender = Class.create();

utlCalender.prototype = {
	
	/**
	 * @param current_id 今月のカレンダーのID 
	 */
	initialize: function(docroot, current_id, callback, y, m, linkbase){
		this.linkbase = "";
		if(linkbase != "" && linkbase != undefined ){
			this.linkbase = linkbase;
		}
		this.current_url = "";

		this.parent_elem = null;
		this.current_calendar_id = current_id;
//		this.callback = callback;
		this.docroot = docroot;
		if(this.docroot == "" || this.docroot == undefined ){
			this.docroot = "/";
		}
		
		// 非表示処理
		$(this.current_calendar_id).style.display="none";
		
		if(y != undefined && m != undefined){
			m+="";
			if( m.substr(0,1) == "0" ){
				m = m.substr(1,1);
			}
			m--;
			this.current_date = new Date(y, m, 1);
		}else{
			// this month 1st day
			this.current_date = new Date(new Date().getFullYear(), new Date().getMonth(), 1);
		}
	},
	
	load: function(){

		// cell days
		this._putCells(this.current_calendar_id, this.current_date.getFullYear(), this.current_date.getMonth());
		
		// year
		this._putYearMonth(this.current_calendar_id, this.current_date.getFullYear(), this.current_date.getMonth());
		
		// 表示処理
		$(this.current_calendar_id).style.display="";
	},
	
	next: function(){
		var new_date = new Date();
		new_date.setTime(this.current_date.getTime() + (32 * 86400000));
		new_date.setDate(1);

		var y = new_date.getFullYear();
		var m = ( new_date.getMonth()+1 ) + "";
		if(m.length == 1){
			m = "0"+m;
		}

		var monthly_page = "";
		if(this.linkbase != "" ){
			monthly_page = this.linkbase+y+"/"+m+"/";
		}else{
			monthly_page = this.docroot+y+"/"+m+"/";
		}
		var monthly_page = this.docroot+y+"/"+m+"/";
		if( this._check_page(monthly_page) ){
			document.location = monthly_page;
		}
	},
	
	prev: function(){
		this.current_date.setDate(1);
		var new_date = new Date();
		new_date.setTime(this.current_date.getTime() - (1 * 86400000));
		new_date.setDate(1);
		
		var y = new_date.getFullYear();
		var m = ( new_date.getMonth()+1 ) + "";
		if(m.length == 1){
			m = "0"+m;
		}

		var monthly_page = "";
		if(this.linkbase != "" ){
			monthly_page = this.linkbase+y+"/"+m+"/";
		}else{
			monthly_page = this.docroot+y+"/"+m+"/";
		}
		if( this._check_page(monthly_page) ){
			document.location = monthly_page;
		}
	},
	
	_clearCells: function(calendar_id){
		var class_name = "";

		for(var i=0; i<6; i++){
			for(var j=0; j<7; j++){
				class_name = ".calendar_" + i + "_" + j;
				var elem = $(calendar_id).select(class_name)[0].innerHTML = '&nbsp;';
			}
		}
	},
	
	_putCells: function(calendar_id, year, month){
		var date = this._getStartDate(year, month);
		var class_name = "";
		var cell = null;
		var parent_elem = this.parent_elem;
		
		var year_month = (month+1)+"";
		if(year_month.length == 1){
			year_month = "0"+year_month;
		}

		year_month = year+year_month;
		var monthly_xml = this.docroot+'carender/'+year_month+".xml";
		var doc;
		var dailys;
		var is_xml = false;
		var prev_page = null;
		var next_page = null;
		var current_page = null;

		new Ajax.Request(monthly_xml, {
			method: "get",
			parameters: "",
			asynchronous: false,
			onSuccess: function(transport){
				is_xml = true;
				notify_templates = new Object();
				doc = transport.responseXML;
				dailys = doc.getElementsByTagName('daily');
				prev_page = doc.getElementsByTagName('next-year-month');
				next_page = doc.getElementsByTagName('prev-year-month');
				current_page = doc.getElementsByTagName('current-year-month');

				if(! prev_page.item(0)){
					prev_page=null;
				}
				if(! next_page.item(0)){
					next_page=null;
				}
				if(! current_page.item(0)){
					current_page=null;
				}
			},
			onFailure: function(transport){
				// xmlのロードエラー時
//				alert(monthly_xml + " カレンダーの読み込みに失敗しました。");
			},
			onException: function(transport){
				// xmlのロードエラー時
//				alert("timeout? "+ transport.responseText);
			}
		});

		if( current_page ){
			this.current_url = current_page.item(0).getAttribute('link');
		}
		if(next_page){
			$(calendar_id).select(".calendar_next")[0].href = next_page.item(0).getAttribute('link');
		}else{
			//next 非表示
			$(calendar_id).select(".calendar_next")[0].style.display = "none";
		}
		if(prev_page){
			$(calendar_id).select(".calendar_prev")[0].href = prev_page.item(0).getAttribute('link');
		}else{
			//prev 非表示
			$(calendar_id).select(".calendar_prev")[0].style.display = "none";
		}

		for(var i=0; i<6; i++){
			for(var j=0; j<7; j++){
				class_name = ".calendar_" + i + "_" + j;
			
				if(date.getMonth() != month){
					$(calendar_id).select(class_name)[0].innerHTML = '&nbsp;';
				}
				else{
					var date_string = this._formatDate(date);

					cell = $(calendar_id).select(class_name)[0];
					cell.innerHTML = '';
					
					var day_html = "";
					
					if(is_xml){
						for(var k=0; k<dailys.length; k++){
							var daily = dailys.item(k);
							var day = daily.getAttribute('day');
							var link = daily.getAttribute('link');
							
							if(day == date.getDate() ){
								day_html = link;
							}
						}
					}
					
					var elem_a;
					if(day_html != ""){
						elem_a = document.createElement('a');
						elem_a.setAttribute('href', day_html);
					}else{
						elem_a = document.createElement('span');
					}
					
					elem_a.appendChild(document.createTextNode(date.getDate()));
					cell.appendChild(elem_a);
					
					// add event
					$(elem_a).observe('click', function(event){
						if(parent_elem){
							parent_elem.value = event.element().getAttribute('_date');
						}
//						callback();
					}); 
				}
				date = this._getNextDay(date);
			}
		}
		
		if( $(calendar_id).select(".calendar_5_0")[0].innerHTML == "&nbsp;" ){
			if($(calendar_id).select(".calendar_5")[0]){
				$(calendar_id).select(".calendar_5")[0].style.display = "none";
			}
		}
		if( $(calendar_id).select(".calendar_4_0")[0].innerHTML == "&nbsp;" ){
			if($(calendar_id).select(".calendar_4")[0]){
				$(calendar_id).select(".calendar_4")[0].style.display = "none";
			}
		}
	},
	
	_putYearMonth: function(calendar_id, year, month){
		
		$(calendar_id).select(".calendar_year")[0].innerHTML = year;

		var month_jp = (month+1)+"";
		if(month_jp.length == 1){
			month_jp = "0"+month_jp;
		}
		$(calendar_id).select(".calendar_month")[0].innerHTML = month_jp;

		if( $(calendar_id).select(".calendar_yearmonth")[0] ){
			$(calendar_id).select(".calendar_yearmonth")[0].href = this.current_url;
		}
	},
	
	_getNextDay: function(date){
		var new_date = new Date();
		new_date.setTime(date.getTime() + 86400000);
		return new_date;
	},
	
	_getStartDate: function(year, month){
		var date = new Date(year, month, 1);
		date.setTime(date.getTime() - (date.getDay() * 86400000));
		return date;
	},
	
	_formatDate: function(date){
		var yyyy = date.getFullYear();
		var mm = "" + ( date.getMonth() + 1 );
		var dd = "" + date.getDate();
		if(mm.length==1){mm="0"+mm;}
		if(dd.length==1){dd="0"+dd;}
		return yyyy + "/" + mm + "/" + dd;	
	},

	_check_page: function(url){
		var ret = false;

		new Ajax.Request(url, {
			method: "get",
			parameters: "",
			asynchronous: false,
			onFailure: function(transport){
				// xmlのロードエラー時
			},
			onSuccess: function(transport){
				ret = true;
			}
		});
		
		return ret;
	},
	
	dummy: "dummy"
};