PHP-Code:
/* DatePicker by Arian Stolwijk, <http://mootools.net/forge/p/mootools_datepicker>, MIT license */
var Picker=new Class({Implements:[Options,Events],options:{pickerClass:"datepicker",inject:null,animationDuration:400,useFadeInOut:!0,positionOffset:{x:0,y:0},pickerPosition:"bottom",draggable:!0,showOnInit:!0,columns:1,footer:!1},initialize:function(a){this.setOptions(a),this.constructPicker(),this.options.showOnInit&&this.show()},constructPicker:function(){var a=this.options,b=this.picker=(new Element("div",{"class":a.pickerClass,styles:{left:0,top:0,display:"none",opacity:0}})).inject(a.inject||document.body);b.addClass("column_"+a.columns),a.useFadeInOut&&b.set("tween",{duration:a.animationDuration,link:"cancel"});var c=this.header=(new Element("div.header")).inject(b),d=this.title=(new Element("div.title")).inject(c),e=this.titleID="pickertitle-"+String.uniqueID();this.titleText=(new Element("div",{role:"heading","class":"titleText",id:e,"aria-live":"assertive","aria-atomic":"true"})).inject(d),this.closeButton=(new Element("div.closeButton[text=x][role=button]")).addEvent("click",this.close.pass(!1,this)).inject(c);var f=this.body=(new Element("div.body")).inject(b);a.footer&&(this.footer=(new Element("div.footer")).inject(b),b.addClass("footer"));var g=this.slider=(new Element("div.slider",{styles:{position:"absolute",top:0,left:0}})).set("tween",{duration:a.animationDuration,transition:Fx.Transitions.Quad.easeInOut}).inject(f);this.newContents=(new Element("div",{styles:{position:"absolute",top:0,left:0}})).inject(g),this.oldContents=(new Element("div",{styles:{position:"absolute",top:0}})).inject(g),this.originalColumns=a.columns,this.setColumns(a.columns);var h=this.shim=window.IframeShim?new IframeShim(b):null;a.draggable&&typeOf(b.makeDraggable)=="function"&&(this.dragger=b.makeDraggable(h?{onDrag:h.position.bind(h)}:null),b.setStyle("cursor","move"))},open:function(a){if(this.opened==1)return this;this.opened=!0;var b=this.picker.setStyle("display","block").set("aria-hidden","false");return this.shim&&this.shim.show(),this.fireEvent("open"),this.options.useFadeInOut&&!a?b.fade("in").get("tween").chain(this.fireEvent.pass("show",this)):(b.setStyle("opacity",1),this.fireEvent("show")),this},show:function(){return this.open(!0)},close:function(a){if(this.opened==0)return this;this.opened=!1,this.fireEvent("close");var b=this,c=this.picker,d=function(){c.setStyle("display","none").set("aria-hidden","true"),b.shim&&b.shim.hide(),b.fireEvent("hide")};return this.options.useFadeInOut&&!a?c.fade("out").get("tween").chain(d):(c.setStyle("opacity",0),d()),this},hide:function(){return this.close(!0)},toggle:function(){return this[this.opened==1?"close":"open"]()},destroy:function(){this.picker.destroy(),this.shim&&this.shim.destroy()},position:function(a,b){var c=this.options.positionOffset,d=document.getScroll(),e=document.getSize(),f=this.picker.getSize();if(typeOf(a)=="element"){var g=a,h=b||this.options.pickerPosition,i=g.getCoordinates();a=h=="left"?i.left-f.x:h=="bottom"||h=="top"?i.left:i.right,b=h=="bottom"?i.bottom:h=="top"?i.top-f.y:i.top}return a+=c.x*(h&&h=="left"?-1:1),b+=c.y*(h&&h=="top"?-1:1),a+f.x>e.x+d.x&&(a=e.x+d.x-f.x),b+f.y>e.y+d.y&&(b=e.y+d.y-f.y),a<0&&(a=0),b<0&&(b=0),this.picker.setStyles({left:a,top:b}),this.shim&&this.shim.position(),this},setBodySize:function(){var a=this.bodysize=this.body.getSize();this.slider.setStyles({width:2*a.x,height:a.y}),this.oldContents.setStyles({left:a.x,width:a.x,height:a.y}),this.newContents.setStyles({width:a.x,height:a.y})},setColumnContent:function(a,b){var c=this.columns[a];if(!c)return this;var d=typeOf(b);return["string","number"].contains(d)?c.set("text",b):c.empty().adopt(b),this},setColumnsContent:function(a,b){var c=this.columns;return this.columns=this.newColumns,this.newColumns=c,a.forEach(function(a,b){this.setColumnContent(b,a)},this),this.setContent(null,b)},setColumns:function(a){var b=this.columns=new Elements,c=this.newColumns=new Elements;for(var d=a;d--;)b.push((new Element("div.column")).addClass("column_"+(a-d))),c.push((new Element("div.column")).addClass("column_"+(a-d)));var e="column_"+this.options.columns,f="column_"+a;return this.picker.removeClass(e).addClass(f),this.options.columns=a,this},setContent:function(a,b){if(a)return this.setColumnsContent([a],b);var c=this.oldContents;return this.oldContents=this.newContents,this.newContents=c,this.newContents.empty(),this.newContents.adopt(this.columns),this.setBodySize(),b?this.fx(b):(this.slider.setStyle("left",0),this.oldContents.setStyles({left:0,opacity:0}),this.newContents.setStyles({left:0,opacity:1})),this},fx:function(a){var b=this.oldContents,c=this.newContents,d=this.slider,e=this.bodysize;a=="right"?(b.setStyles({left:0,opacity:1}),c.setStyles({left:e.x,opacity:1}),d.setStyle("left",0).tween("left",0,-e.x)):a=="left"?(b.setStyles({left:e.x,opacity:1}),c.setStyles({left:0,opacity:1}),d.setStyle("left",-e.x).tween("left",-e.x,0)):a=="fade"&&(d.setStyle("left",0),b.setStyle("left",0).set("tween",{duration:this.options.animationDuration/2}).tween("opacity",1,0).get("tween").chain(function(){b.setStyle("left",e.x)}),c.setStyles({opacity:0,left:0}).set("tween",{duration:this.options.animationDuration}).tween("opacity",0,1))},toElement:function(){return this.picker},setTitle:function(a,b){return b||(b=Function.from),this.titleText.empty().adopt(Array.from(a).map(function(a,c){return typeOf(a)=="element"?a:(new Element("div.column",{text:b(a,this.options)})).addClass("column_"+(c+1))},this)),this},setTitleEvent:function(a){return this.titleText.removeEvents("click"),a&&this.titleText.addEvent("click",a),this.titleText.setStyle("cursor",a?"pointer":""),this}});Picker.Attach=new Class({Extends:Picker,options:{togglesOnly:!0,showOnInit:!1,blockKeydown:!0},initialize:function(a,b){this.parent(b),this.attachedEvents=[],this.attachedElements=[],this.toggles=[],this.inputs=[];var c=function(a){if(this.attachedElements.contains(a.target))return;this.close()}.bind(this),d=this.picker.getDocument().addEvent("click",c),e=function(a){return a.stopPropagation(),!1};this.picker.addEvent("click",e),this.options.toggleElements&&(this.options.toggle=d.getElements(this.options.toggleElements)),this.attach(a,this.options.toggle)},attach:function(a,b){typeOf(a)=="string"&&(a=document.id(a)),typeOf(b)=="string"&&(b=document.id(b));var c=Array.from(a),d=Array.from(b),e=[].append(c).combine(d),f=this,g=function(a){var b=f.options.blockKeydown&&a.type=="keydown"&&!["tab","esc"].contains(a.key),c=a.type=="keydown"&&["tab","esc"].contains(a.key),d=a.target.get("tag")=="a";(b||d)&&a.preventDefault(),(c||d)&&f.close()},h=function(a){return function(b){var c=b.target.get("tag");if(c=="input"&&b.type=="click"&&!a.match(":focus")||f.opened&&f.input==a)return;c=="a"&&b.stop(),f.position(a),f.open(),f.fireEvent("attached",[b,a])}},i=function(a,b){return function(c){f.opened?b(c):a(c)}};return e.each(function(a){if(f.attachedElements.contains(a))return;var b={},c=a.get("tag"),e=h(a),j=i(e,g);if(c=="input"){if(!f.options.togglesOnly||!d.length)b={focus:e,click:e,keydown:g};f.inputs.push(a)}else d.contains(a)?(f.toggles.push(a),b.click=j):b.click=e;a.addEvents(b),f.attachedElements.push(a),f.attachedEvents.push(b)}),this},detach:function(a,b){typeOf(a)=="string"&&(a=document.id(a)),typeOf(b)=="string"&&(b=document.id(b));var c=Array.from(a),d=Array.from(b),e=[].append(c).combine(d),f=this;return e.length||(e=f.attachedElements),e.each(function(a){var b=f.attachedElements.indexOf(a);if(b<0)return;var c=f.attachedEvents[b];a.removeEvents(c),delete f.attachedEvents[b],delete f.attachedElements[b];var d=f.toggles.indexOf(a);d!=-1&&delete f.toggles[d];var e=f.inputs.indexOf(a);d!=-1&&delete f.inputs[e]}),this},destroy:function(){return this.detach(),this.parent()}});(function(){this.DatePicker=Picker.Date=new Class({Extends:Picker.Attach,options:{timePicker:!1,timePickerOnly:!1,timeWheelStep:1,yearPicker:!0,yearsPerPage:20,startDay:1,rtl:!1,startView:"days",openLastView:!1,pickOnly:!1,canAlwaysGoUp:["months","days"],updateAll:!1,weeknumbers:!1,titleFormat:"%d %B, %Y",months_abbr:null,days_abbr:null,years_title:function(a,b){var c=a.get("year");return c+"-"+(c+b.yearsPerPage-1)},months_title:function(a,b){return a.get("year")},days_title:function(a,b){return a.format("%B %Y")},time_title:function(a,b){return b.pickOnly=="time"?Locale.get("DatePicker.select_a_time"):a.format(b.titleFormat)}},initialize:function(a,b){this.parent(a,b),this.setOptions(b),b=this.options,["year","month","day","time"].some(function(a){return b[a+"PickerOnly"]?(b.pickOnly=a,!0):!1}),b.pickOnly&&(b[b.pickOnly+"Picker"]=!0,b.startView=b.pickOnly);var d=["days","months","years"];["month","year","decades"].some(function(a,c){return b.startView==a&&(b.startView=d[c])}),b.canAlwaysGoUp=b.canAlwaysGoUp?Array.from(b.canAlwaysGoUp):[],b.minDate&&(b.minDate instanceof Date||(b.minDate=Date.parse(b.minDate)),b.minDate.clearTime()),b.maxDate&&(b.maxDate instanceof Date||(b.maxDate=Date.parse(b.maxDate)),b.maxDate.clearTime()),b.format||(b.format=b.pickOnly!="time"?Locale.get("Date.shortDate"):"",b.timePicker&&(b.format=b.format+(b.format?" ":"")+Locale.get("Date.shortTime"))),this.addEvent("attached",function(a,d){if(!this.currentView||!b.openLastView)this.currentView=b.startView;this.date=c(new Date,b.minDate,b.maxDate);var e=d.get("tag"),f;if(e=="input")f=d;else{var g=this.toggles.indexOf(d);this.inputs[g]&&(f=this.inputs[g])}this.getInputDate(f),this.input=f,this.setColumns(this.originalColumns)}.bind(this),!0)},getInputDate:function(a){this.date=new Date;if(!a)return;var b=Date.parse(a.get("value"));if(b==null||!b.isValid()){var c=a.retrieve("datepicker:value");c&&(b=Date.parse(c))}b!=null&&b.isValid()&&(this.date=b)},constructPicker:function(){this.parent(),this.options.rtl?(this.next=(new Element("div.previous[html=«]")).inject(this.header),this.previous=(new Element("div.next[html=»]")).inject(this.header)):(this.previous=(new Element("div.previous[html=«]")).inject(this.header),this.next=(new Element("div.next[html=»]")).inject(this.header))},hidePrevious:function(a,b){return this[a?"next":"previous"].setStyle("display",b?"block":"none"),this},showPrevious:function(a){return this.hidePrevious(a,!0)},setPreviousEvent:function(a,b){return this[b?"next":"previous"].removeEvents("click"),a&&this[b?"next":"previous"].addEvent("click",a),this},hideNext:function(){return this.hidePrevious(!0)},showNext:function(){return this.showPrevious(!0)},setNextEvent:function(a){return this.setPreviousEvent(a,!0)},setColumns:function(a,b,c,d){var e=this.parent(a),f;return(b||this.currentView)&&(f="render"+(b||this.currentView).capitalize())&&this[f]&&this[f](c||this.date.clone(),d),e},renderYears:function(c,d){var e=this.options,f=e.columns,g=e.yearsPerPage,h=[],i=[];this.dateElements=[],c=c.clone().decrement("year",c.get("year")%g);var j=c.clone().decrement("year",Math.floor((f-1)/2)*g);for(var k=f;k--;){var l=j.clone();i.push(l),h.push(b.years(a.years(e,l.clone()),e,this.date.clone(),this.dateElements,function(a){e.pickOnly=="years"?this.select(a):this.renderMonths(a,"fade"),this.date=a}.bind(this))),j.increment("year",g)}this.setColumnsContent(h,d),this.setTitle(i,e.years_title);var m=e.minDate&&c.get("year")<=e.minDate.get("year"),n=e.maxDate&&c.get("year")+e.yearsPerPage>=e.maxDate.get("year");this[(m?"hide":"show")+"Previous"](),this[(n?"hide":"show")+"Next"](),this.setPreviousEvent(function(){this.renderYears(c.decrement("year",g),"left")}.bind(this)),this.setNextEvent(function(){this.renderYears(c.increment("year",g),"right")}.bind(this)),this.setTitleEvent(null),this.currentView="years"},renderMonths:function(c,d){var e=this.options,f=e.columns,g=[],h=[],i=c.clone().decrement("year",Math.floor((f-1)/2));this.dateElements=[];for(var j=f;j--;){var k=i.clone();h.push(k),g.push(b.months(a.months(e,k.clone()),e,this.date.clone(),this.dateElements,function(a){e.pickOnly=="months"?this.select(a):this.renderDays(a,"fade"),this.date=a}.bind(this))),i.increment("year",1)}this.setColumnsContent(g,d),this.setTitle(h,e.months_title);var l=c.get("year"),m=e.minDate&&l<=e.minDate.get("year"),n=e.maxDate&&l>=e.maxDate.get("year");this[(m?"hide":"show")+"Previous"](),this[(n?"hide":"show")+"Next"](),this.setPreviousEvent(function(){this.renderMonths(c.decrement("year",f),"left")}.bind(this)),this.setNextEvent(function(){this.renderMonths(c.increment("year",f),"right")}.bind(this));var o=e.yearPicker&&(e.pickOnly!="months"||e.canAlwaysGoUp.contains("months")),p=o?function(){this.renderYears(c,"fade")}.bind(this):null;this.setTitleEvent(p),this.currentView="months"},renderDays:function(c,d){var e=this.options,f=e.columns,g=[],h=[],i=c.clone().decrement("month",Math.floor((f-1)/2));this.dateElements=[];for(var j=f;j--;)_date=i.clone(),h.push(_date),g.push(b.days(a.days(e,_date.clone()),e,this.date.clone(),this.dateElements,function(a){e.pickOnly=="days"||!e.timePicker?this.select(a):this.renderTime(a,"fade"),this.date=a}.bind(this))),i.increment("month",1);this.setColumnsContent(g,d),this.setTitle(h,e.days_title);var k=c.format("%Y%m").toInt(),l=e.minDate&&k<=e.minDate.format("%Y%m"),m=e.maxDate&&k>=e.maxDate.format("%Y%m");this[(l?"hide":"show")+"Previous"](),this[(m?"hide":"show")+"Next"](),this.setPreviousEvent(function(){this.renderDays(c.decrement("month",f),"left")}.bind(this)),this.setNextEvent(function(){this.renderDays(c.increment("month",f),"right")}.bind(this));var n=e.pickOnly!="days"||e.canAlwaysGoUp.contains("days"),o=n?function(){this.renderMonths(c,"fade")}.bind(this):null;this.setTitleEvent(o),this.currentView="days"},renderTime:function(a,c){var d=this.options;this.setTitle(a,d.time_title);var e=this.originalColumns=d.columns;this.currentView=null,e!=1&&this.setColumns(1),this.setContent(b.time(d,a.clone(),function(a){this.select(a)}.bind(this)),c),this.hidePrevious().hideNext().setPreviousEvent(null).setNextEvent(null);var f=d.pickOnly!="time"||d.canAlwaysGoUp.contains("time"),g=f?function(){this.setColumns(e,"days",a,"fade")}.bind(this):null;this.setTitleEvent(g),this.currentView="time"},select:function(a,b){this.date=a;var c=a.format(this.options.format),d=a.strftime(),e=!this.options.updateAll&&!b&&this.input?[this.input]:this.inputs;return e.each(function(a){a.set("value",c).store("datepicker:value",d).fireEvent("change")},this),this.fireEvent("select",[a].concat(e)),this.close(),this}});var a={years:function(a,b){var c=[];for(var d=0;d<a.yearsPerPage;d++)c.push(+b),b.increment("year",1);return c},months:function(a,b){var c=[];b.set("month",0);for(var d=0;d<=11;d++)c.push(+b),b.increment("month",1);return c},days:function(a,b){var c=[];b.set("date",1);while(b.get("day")!=a.startDay)b.set("date",b.get("date")-1);for(var d=0;d<42;d++)c.push(+b),b.increment("day",1);return c}},b={years:function(a,b,c,e,f){var g=new Element("div.years"),h=new Date,i,j;return a.each(function(a,k){var l=new Date(a),m=l.get("year");j=".year.year"+k,m==h.get("year")&&(j+=".today"),m==c.get("year")&&(j+=".selected"),i=(new Element("div"+j,{text:m})).inject(g),e.push({element:i,time:a}),d("year",l,b)?i.addClass("unavailable"):i.addEvent("click",f.pass(l))}),g},months:function(a,b,c,e,f){var g=new Date,h=g.get("month"),i=g.get("year"),j=c.get("year"),k=new Element("div.months"),l=b.months_abbr||Locale.get("Date.months_abbr"),m,n;return a.each(function(a,g){var o=new Date(a),p=o.get("year");n=".month.month"+(g+1),g==h&&p==i&&(n+=".today"),g==c.get("month")&&p==j&&(n+=".selected"),m=(new Element("div"+n,{text:l[g]})).inject(k),e.push({element:m,time:a}),d("month",o,b)?m.addClass("unavailable"):m.addEvent("click",f.pass(o))}),k},days:function(a,b,c,e,f){var g=(new Date(a[14])).get("month"),h=(new Date).toDateString(),i=c.toDateString(),j=b.weeknumbers,k=new Element("table.days"+(j?".weeknumbers":""),{role:"grid","aria-labelledby":this.titleID}),l=(new Element("thead")).inject(k),m=(new Element("tbody")).inject(k),n=(new Element("tr.titles")).inject(l),o=b.days_abbr||Locale.get("Date.days_abbr"),p,q,r,s,t,u=b.rtl?"top":"bottom";j&&(new Element("th.title.day.weeknumber",{text:Locale.get("DatePicker.week")})).inject(n);for(p=b.startDay;p<b.startDay+7;p++)(new Element("th.title.day.day"+p%7,{text:o[p%7],role:"columnheader"})).inject(n,u);return a.each(function(a,c){var k=new Date(a);c%7==0&&(s=(new Element("tr.week.week"+Math.floor(c/7))).set("role","row").inject(m),j&&(new Element("th.day.weeknumber",{text:k.get("week"),scope:"row",role:"rowheader"})).inject(s)),t=k.toDateString(),q=".day.day"+k.get("day"),t==h&&(q+=".today"),k.get("month")!=g&&(q+=".otherMonth"),r=(new Element("td"+q,{text:k.getDate(),role:"gridcell"})).inject(s,u),t==i?r.addClass("selected").set("aria-selected","true"):r.set("aria-selected","false"),e.push({element:r,time:a}),d("date",k,b)?r.addClass("unavailable"):r.addEvent("click",f.pass(k.clone()))}),k},time:function(a,b,c){var d=new Element("div.time"),e=(b.get("minutes")/a.timeWheelStep).round()*a.timeWheelStep;e>=60&&(e=0),b.set("minutes",e);var f=(new Element("input.hour[type=text]",{title:Locale.get("DatePicker.use_mouse_wheel"),value:b.format("%H"),events:{click:function(a){a.target.focus(),a.stop()},mousewheel:function(a){a.stop(),f.focus();var c=f.get("value").toInt();c=a.wheel>0?c<23?c+1:0:c>0?c-1:23,b.set("hours",c),f.set("value",b.format("%H"))}.bind(this)},maxlength:2})).inject(d),g=(new Element("input.minutes[type=text]",{title:Locale.get("DatePicker.use_mouse_wheel"),value:b.format("%M"),events:{click:function(a){a.target.focus(),a.stop()},mousewheel:function(c){c.stop(),g.focus();var d=g.get("value").toInt();d=c.wheel>0?d<59?d+a.timeWheelStep:0:d>0?d-a.timeWheelStep:60-a.timeWheelStep,d>=60&&(d=0),b.set("minutes",d),g.set("value",b.format("%M"))}.bind(this)},maxlength:2})).inject(d);return(new Element("div.separator[text=:]")).inject(d),(new Element("input.ok[type=submit]",{value:Locale.get("DatePicker.time_confirm_button"),events:{click:function(a){a.stop(),b.set({hours:f.get("value").toInt(),minutes:g.get("value").toInt()}),c(b.clone())}}})).inject(d),d}};Picker.Date.defineRenderer=function(a,c){return b[a]=c,this};var c=function(a,b,c){return b&&a<b?b:c&&a>c?c:a},d=function(a,b,c){var d=c.minDate,e=c.maxDate,f=c.availableDates,g,h,i,j;if(!d&&!e&&!f)return!1;b.clearTime();if(a=="year")return g=b.get("year"),d&&g<d.get("year")||e&&g>e.get("year")||f!=null&&!c.invertAvailable&&(f[g]==null||Object.getLength(f[g])==0||Object.getLength(Object.filter(f[g],function(a){return a.length>0}))==0);if(a=="month")return g=b.get("year"),h=b.get("month")+1,j=b.format("%Y%m").toInt(),d&&j<d.format("%Y%m").toInt()||e&&j>e.format("%Y%m").toInt()||f!=null&&!c.invertAvailable&&(f[g]==null||f[g][h]==null||f[g][h].length==0);g=b.get("year"),h=b.get("month")+1,i=b.get("date");var k=d&&b<d||d&&b>e;return f!=null&&(k=k||f[g]==null||f[g][h]==null||!f[g][h].contains(i),c.invertAvailable&&(k=!k)),k}})();