// Ajaxカレンダー 
//(c) 2008 ArfaethaLab http://arfaetha.com/

// Calendarオブジェクト＝共通変数、処理
// normalClendar＝普通のカレンダー。時間クリックでエントリーページへ
// entryCalendar＝エントリーページ用。時間クリックで入力値置換え




var Calendar={
	//プロパティと関数の集まり
	
	//設定値
	URLBASE:"/phpcalendar.php",//カレンダ生成プログラムの場所
	
	ENTRYPHP:"/entry/index.php",
	
	//プロパティ
	getwindowObj:function(){	Calendar.windowObj=document.getElementsByTagName("body")[0];},
	getwrapperObj:function(){	
		if($("wrapper_index")) Calendar.wrapperObj= $("wrapper_index");
		if($("wrapper")) Calendar.wrapperObj= $("wrapper");
	},
	tsWRAPPER:"tSelect_wrapper",
	
	
	//関数
	initialize:function(){

		addLoadEvent.add(function(){
			Calendar.getwindowObj();
			Calendar.getwrapperObj();
			setCurrentDate();
		});
		document.write("<style>table.calendar .hidden{visibility:hidden}<\/style>"); 
		
		var preloads=["/images/cal_none.gif","/images/cal1000.gif","/images/cal1400.gif","/images/cal1900.gif"];
		preloads.each(function(preload){
			new Image().src=preload;
		});
		
	},
	loadCalendar:function(calendarURL,endProcess,errorProcess){
		if(!errorProcess) errorProcess=function(){return null};
		new Ajax.Request(calendarURL, {
							 method: 'get',
							 onComplete: function(httpObj){
								 endProcess(httpObj);
							 },
							 onFailure: errorProcess
						 });
		return false;
	},
	modDate:function(targetObj,y,m){
	  try{
		var date=new Date();
		if ((date.getFullYear()==(y-0)) && (date.getMonth()==(m-1))){
			ifThismonth=true;
		} else {
			ifThismonth=false;
		}
		
		var elements = targetObj.getElementsByTagName("table");
		for (var j = 0, len = elements.length; j < len; j++) {
			var element = elements[j].getAttribute("summary");
			if(element == null){
				return;
			}
			var year = element.split("/")[0];
			var month = element.split("/")[1];
			if(!(year == y && month == m)){
				return;
			}
			
			var spans = elements[j].getElementsByTagName("span");
			var day;
			for (i = 0; i < spans.length; i++) {
				if (spans[i].parentNode.nodeName == "TD") {
					var atags=spans[i].getElementsByTagName("a");
					if(atags.length>0){
						Event.observe(atags[0],"click",function(event){event.cancelBubble=true;},true);
						day = atags[0].innerHTML;
					} else {
						day=spans[i].innerHTML;
					}
					
					//mod start
					
					//休日判定
					if (isToday(year, month, day)) {
						Element.addClassName(spans[i].parentNode, "today");
					}
					if (isHoliday(year, month, day)) {
						var tdObj=spans[i].parentNode;
						Element.addClassName(tdObj, "sun");
						var divs=tdObj.getElementsByTagName("div");
						if(divs[0]) divs[0].style.visibility="hidden";
						spans[i].innerHTML=day;
						
					} else if(isSaturday(year, month, day)) {
						Element.addClassName(spans[i].parentNode, "sat");
					} 
				}
			}
		}
	  } catch(e){alert(e)}
	},
	tsRestart:function(){
		if($(Calendar.tsWRAPPER)) return false;
		var wrapper=document.createElement("div");
		wrapper.setAttribute("id",Calendar.tsWRAPPER);			
		
		Calendar.windowObj.appendChild(wrapper);
	},
	tsPreFunction:function(e){
	
		if(!$(Calendar.tsWRAPPER)) return false;
		var targ=Event.element(e);
		var year=Number(targ.id.substr(4,4));var month=Number(targ.id.substr(8,2))-1;var day=Number(targ.id.substr(10,2));
		
		return Calendar.tsGetStimes(year,month,day);
		
	},
	
	tsPostFunction:function(targ){
		targ.parentNode.parentNode.appendChild($(Calendar.tsWRAPPER));
		$(Calendar.tsWRAPPER).style.display="block";
		Event.observe($(Calendar.tsWRAPPER),"click",function(event){event.cancelBubble=true;},true);	
		Event.observe(Calendar.windowObj,"click",Calendar.tsClose,false);
	},
	tsClose:function(){
		$(Calendar.tsWRAPPER).style.display="none";
		
		Event.stopObserving(Calendar.windowObj,"click",Calendar.tsClose,false);
	},
	zeroPad:function(value){
		var num=Number(value);
		return String((num<10) ? "0"+""+num:num);
	},
	debugOut:function(e){
		var string;var cou=0;
		for ( key in e){
			string[cou++]=key;
			string[cou++]=" : ";
			string[cou++]=e[key];
			string[cou++]="\n";
		}
		alert(string);
	}
}

var normalCalendar={
	WRAPPER:"calendar",
	start:function(){
		addLoadEvent.add(function(){
			var tswrapper=document.createElement("div");
			tswrapper.setAttribute("id",Calendar.tsWRAPPER);			
			Calendar.windowObj.appendChild(tswrapper);
		});
		Event.observe($(normalCalendar.WRAPPER),"click",function(event){event.cancelBubble=true;},true);	
		
		var date=new Date();
		var year=date.getFullYear();
		var _month=date.getMonth()+1;
		var month=Calendar.zeroPad(_month);
		normalCalendar.change(year+""+month);
		
	},
	change:function(yearmonth){
	
		var url =Calendar.URLBASE+ "?mode=normal&yearmonth="+yearmonth+"&cache=" + (new Date()).getTime();	
		Event.observe($(normalCalendar.WRAPPER),"click",Calendar.tsClose,false);
		var endprocess=function(httpObj){
			$(normalCalendar.WRAPPER).innerHTML=httpObj.responseText;
			var summaryText = $(normalCalendar.WRAPPER).getElementsByTagName('table')[0].getAttribute('summary');

			Calendar.modDate($(normalCalendar.WRAPPER), summaryText.split("/")[0], summaryText.split("/")[1]);
			new Effect.Appear($(normalCalendar.WRAPPER),{duration:0.1});
			Calendar.tsRestart();
		}
		var fade_option={from:1,to:0.2,duration:0.2,
			afterFinish:function(){
				Calendar.loadCalendar(url,endprocess);
			}
		};
		new Effect.Fade($(normalCalendar.WRAPPER),fade_option);
	  
	},
	timeSelect:function(targ,_yearmonthday,stimes){
		var yearmonthday=String(_yearmonthday);
		var _que=[yearmonthday.substr(0,4),yearmonthday.substr(4,2),yearmonthday.substr(6,2)];
		var que=_que.join("_")+"_";
		
		var strings=[];var count=0;
		stimes.each(function(_time){
							 
			var time=String(_time);
			strings[count++]="<a href='";
			strings[count++]=Calendar.ENTRYPHP;
			strings[count++]="?reserve=";
			strings[count++]=que;
			strings[count++]=time;
			strings[count++]="'>";
			var time_divider=(time.length==3)?1:2;
			strings[count++]=time.substr(0,time_divider);
			strings[count++]=":";
			strings[count++]=time.substr(time_divider);
			strings[count++]="</a>";
		});
		
		$(Calendar.tsWRAPPER).innerHTML=strings.join("");
		
		Calendar.tsPostFunction(targ);
	}
}

var entryCalendar={
	WRAPPER:"entry_calendar",
	INPUTID:"reservedate",

	initialize:function(){

		addLoadEvent.add(function(){
			Event.observe($(entryCalendar.WRAPPER),"click",function(event){event.cancelBubble=true;},true);
			$(entryCalendar.INPUTID).setAttribute("disabled","disabled");
			Event.observe($("entryForm"),"submit",function(){
				$(entryCalendar.INPUTID).removeAttribute("disabled");
			},false);
			entryCalendar.start();
		});
	},
	start:function(){

		var yearmonth;
		if ($(entryCalendar.INPUTID).value){
			var reg=new RegExp(/^([0-9]{4})年([0-9]{1,2})月/);
			if(reg.exec($(entryCalendar.INPUTID).value)){ 
				var year =Number(RegExp.$1);
				var month=Number(RegExp.$2);
				month = (month < 10 ) ? "0" + "" + month :month;
				
				yearmonth=year+""+month;
			}
		}
		if(!yearmonth) {
			var date=new Date();
			var _month=date.getMonth()+1;
			month=Calendar.zeroPad(_month);
			yearmonth=date.getFullYear()+""+month;
		}
		entryCalendar.change(yearmonth);
	},
	change:function(yearmonth){
	  try{
		
		var url =Calendar.URLBASE+ "?mode=entry&yearmonth="+yearmonth+"&cache=" + (new Date()).getTime();		
		var endprocess=function(httpObj){
			$(entryCalendar.WRAPPER).innerHTML=httpObj.responseText;
			var summaryText = $(entryCalendar.WRAPPER).getElementsByTagName('table')[0].getAttribute('summary');
			Calendar.modDate($(entryCalendar.WRAPPER), summaryText.split("/")[0], summaryText.split("/")[1]);
			new Effect.Appear($(entryCalendar.WRAPPER),{duration:0.1});
		}
		var fade_option={from:1,to:0.2,duration:0.2,
			afterFinish:function(){
				Calendar.loadCalendar(url,endprocess);
			}
		};
		new Effect.Fade($(entryCalendar.WRAPPER),fade_option);
		
	  } catch(e){Calendar.debugOut(e);}
	},
	Close:function(){
		$(entryCalendar.WRAPPER).style.display="none";
		Event.stopObserving(Calendar.wrapperObj,"click",entryCalendar.Close,false);
	},
	setInput:function (_yearmonthday,_stime){
		var string=[];var cou=0;
		var yearmonthday=String(_yearmonthday);
		var stime=String(_stime);
		string[cou++]=yearmonthday.substr(0,4);
		string[cou++]="年";
		string[cou++]=yearmonthday.substr(4,2)
		string[cou++]="月";
		string[cou++]=yearmonthday.substr(6,8)
		string[cou++]="日 ";
		var time_divider=(stime.length==3)?1:2;
		string[cou++]=stime.substr(0,time_divider);
		string[cou++]="時";
		string[cou++]=stime.substr(time_divider);
		string[cou++]="分";
		
		$(entryCalendar.INPUTID).value=string.join("");
		$(entryCalendar.INPUTID).style.backgroundColor="#FFFFFF";
		$(entryCalendar.INPUTID).style.borderColor="#FFCC33";
		new Effect.Highlight(entryCalendar.INPUTID,{afterFinish:function(){
				$(entryCalendar.INPUTID).style.borderColor="#666666";	 
		}});
	}
}



Calendar.initialize();
