var Calendar=Class.create();Calendar.prototype={divObj:null,iframeObj:null,spliter:'/',date:null,select:null,minData:null,maxData:null,mode:null,targetObj:null,oldClassName:null,initialize:function(){var css=new Element('link',{'type':'text/css','rel':'stylesheet','href':'/css/calendar.css'});Element.wrap(css,$$('head')[0]);var list=$$('input');list.each((function(obj){if(obj.id.match('calendar')){if(obj.type=='text'){Event.observe(obj,'focus',(function(e){this.showCalendar(e);}).bind(this));}else if($(obj.id+'_year')&&$(obj.id+'_month')&&$(obj.id+'_day')){Element.setStyle(obj,{'display':'inline','width':'18px','height':'16px','border':'0px','background':'url(/img/calendar.gif) no-repeat 0 0'});Event.observe(obj,'click',(function(e){this.showCalendar(e);}).bind(this));}}}).bind(this));Event.observe(document,"mouseup",(function(e){this.removeCalendar(e,false);}).bind(this),false);},showCalendar:function(e){this.targetObj=Event.element(e);if(this.targetObj.type=='text'){this.mode='text';this.minData=null;this.maxData=null;}else if(this.targetObj.type=='button'){this.mode='select';eval('var set={'+this.targetObj.name.gsub(/:/,":'").gsub(/,/,"',")+"'}");if(set.min){var min=set.min.split(this.spliter);this.minData=new Date(min[0],min[1]-1,min[2]);}if(set.max){var max=set.max.split(this.spliter);this.maxData=new Date(max[0],max[1]-1,max[2]);}}if(!this.divObj){this.iframeObj=Ie6.showLayer('calendar_canvas_iframe');this.divObj=new Element('div',{'id':'calendar_canvas'});Element.setStyle(this.divObj,{'position':'absolute'});Element.wrap(this.divObj,document.body);}else{this.divObj.style.display='';}var pos=Position.cumulativeOffset(this.targetObj);var x=pos[0];var y =(pos[1]+this.targetObj.offsetHeight);Element.setStyle(this.divObj,{'top':y+'px','left':x+'px'});if(this.iframeObj){this.iframeObj.style.display='';Element.setStyle(this.iframeObj,{'top':y+'px','left':x+'px'});}this.getFormValue(this.targetObj);this.setCalendar();},removeCalendar:function(e,remove){var item=Event.findElement(e,$('document'));if(!remove){if((item.tagName=='TH'||item.tagName=='TD')&&item.parentNode.parentNode.parentNode){if(!item.parentNode.parentNode.parentNode.id.match('calendar')){remove=true;}} else if(!(item.tagName=='INPUT'&&item.id.match('calendar'))){remove=true;}}if(remove){if(this.divObj){this.divObj.style.display='none';}if(this.iframeObj){this.iframeObj.style.display='none';}}},getToday:function(){var date=new Date();return new Date(date.getFullYear(),date.getMonth(),date.getDate());},getFormValue:function(obj){this.date=this.getToday();var date=null;if(this.mode=='text'&&$(obj.id).value.length==10){date=$(obj.id).value.split(this.spliter);}else if(this.mode=='select'){date=[$(obj.id+'_year').value,$(obj.id+'_month').value,$(obj.id+'_day').value];}if(date&&date[0]>0&&date[1]>=1&&date[1]<=12&&date[2]>=1&&date[2]<=31){this.date.setFullYear(date[0]);this.date.setMonth(date[1]-1);this.date.setDate(date[2]);}this.select=new Date(this.date.getTime());},resetCalendar:function(e){var target=Event.element(e);if(this.mode=='text'){this.targetObj.value='';}else if(this.mode=='select'){$(this.targetObj.id+'_year').selectedIndex=0;$(this.targetObj.id+'_month').selectedIndex=0;$(this.targetObj.id+'_day').selectedIndex=0;}this.removeCalendar(e,true);},prevCalendar:function(){this.date.setMonth(this.date.getMonth()-1);this.setCalendar();},nextCalendar:function(){this.date.setMonth(this.date.getMonth()+1);this.setCalendar();},setCalendar:function(){var startDate=new Date(this.date);startDate.setDate(1);var currentDate=new Date(startDate.getTime());var endDate=new Date(startDate);endDate.setMonth(startDate.getMonth()+1);endDate.setTime(endDate.getTime()-86400000);var max=startDate.getDay()+endDate.getDate();var yMax=Math.ceil(max/7);var cal='<table id="calendar" class="calendar">'+'<tr>'+'<th style="cursor: pointer;" id="btn_reset" title="リセット">R</th>'+'<th style="cursor: pointer;" id="btn_prev" title="前月">&lt;</th>'+'<th colspan="3">'+startDate.getFullYear()+this.spliter+String(startDate.getMonth()+1).replace(/^([0-9]?)$/,'0$1')+'</th>'+'<th style="cursor: pointer;" id="btn_next" title="次月">&gt;</th>'+'<th style="cursor: pointer;" id="btn_close" title="閉じる">×</th>'+'</tr>'+'<tr>'+'<th class="sun">日</th>'+'<th class="normal">月</th>'+'<th class="normal">火</th>'+'<th class="normal">水</th>'+'<th class="normal">木</th>'+'<th class="normal">金</th>'+'<th class="sat">土</th>'+'</tr>';var d,cls,option,time=0;for(var y=0,cnt=0;y<yMax;y++){cal+='<tr>';for(var x=0;x<7;x++,cnt++){time=currentDate.getTime();cls='';if(x==0){cls=' class="sun"';} else if(x==6){cls=' class="sat"';}d='&nbsp;';option='';if(currentDate.getDay()<=cnt&&time<=endDate.getTime()){if(time==this.select.getTime()){cls=' class="select"';}d=currentDate.getDate();if((this.minData==null||time>this.minData.getTime())&&(this.maxData==null||time<=this.maxData.getTime())){option=' id="btn_day'+d+'" style="cursor: pointer;"';}else{cls=' class="disable"';}currentDate.setTime(time+86400000);}cal+='<td'+cls+option+'>'+d+'</td>';}cal+='</tr>';}cal+='</table>';Element.update(this.divObj,cal);var size=$('calendar').getDimensions();Element.setStyle(this.divObj,{'width':(size.width+4)+'px','height':size.height+'px'});if(this.iframeObj){Ie6.resize('calendar_canvas_iframe',this.divObj);}Event.observe($('btn_reset'),'click',(function(e){this.resetCalendar(e);}).bind(this),false);Event.observe($('btn_reset'),'mouseover',(function(e){this.onMouseOverEvent(e);}).bind(this),false);Event.observe($('btn_reset'),'mouseout',(function(e){this.onMouseOutEvent(e);}).bind(this),false);if(this.minData==null||startDate.getTime()>this.minData.getTime()){Event.observe($('btn_prev'),'click',(function(e){this.prevCalendar(e);}).bind(this),false);Event.observe($('btn_prev'),'mouseover',(function(e){this.onMouseOverEvent(e);}).bind(this),false);Event.observe($('btn_prev'),'mouseout',(function(e){this.onMouseOutEvent(e);}).bind(this),false);}else{Element.update($('btn_prev'),'&nbsp;');$('btn_prev').style.cursor='default';}if(this.maxData==null||endDate.getTime()<this.maxData.getTime()){Event.observe($('btn_next'),'click',(function(e){this.nextCalendar(e);}).bind(this),false);Event.observe($('btn_next'),'mouseover',(function(e){this.onMouseOverEvent(e);}).bind(this),false);Event.observe($('btn_next'),'mouseout',(function(e){this.onMouseOutEvent(e);}).bind(this),false);}else{Element.update($('btn_next'),'&nbsp;');$('btn_next').style.cursor='default';}Event.observe($('btn_close'),'click',(function(e){this.removeCalendar(e,true);}).bind(this),false);Event.observe($('btn_close'),'mouseover',(function(e){this.onMouseOverEvent(e);}).bind(this),false);Event.observe($('btn_close'),'mouseout',(function(e){this.onMouseOutEvent(e);}).bind(this),false);for(d=1;d<=endDate.getDate();d++){if($('btn_day'+d)){Event.observe($('btn_day'+d),'click',(function(e){this.onClickEvent(e);}).bind(this),false);Event.observe($('btn_day'+d),'mouseover',(function(e){this.onMouseOverEvent(e);}).bind(this),false);Event.observe($('btn_day'+d),'mouseout',(function(e){this.onMouseOutEvent(e);}).bind(this),false);}}},onClickEvent:function(e){var target=Event.element(e);if(this.mode=='text'){var date=this.date.getFullYear()+this.spliter+String(this.date.getMonth()+1).replace(/^([0-9]?)$/,'0$1')+this.spliter+target.innerHTML.replace(/^([0-9]?)$/,'0$1');this.targetObj.value=date;}else if(this.mode=='select'){var mon=this.date.getMonth()+1;var day=target.innerHTML;if(mon<10){mon='0'+mon;}if(day<10){day='0'+day;}$(this.targetObj.id+'_year').value=this.date.getFullYear();$(this.targetObj.id+'_month').value=mon;$(this.targetObj.id+'_day').value=day;}this.removeCalendar(e,true);},onMouseOverEvent:function(e){this.oldClassName=Event.element(e).className;Event.element(e).className='over';},onMouseOutEvent:function(e){Event.element(e).className=this.oldClassName;}};Event.observe(document,'dom:loaded',function(){new Calendar();},false);
