var KUrl="https://www.kig.gmbh/libs/"; if(typeof KRes=="undefined") KRes={}; KRes.d1={de:"Montag",en:"Monday",pl:"Poniedziałek"} KRes.d2={de:"Dienstag",en:"Tuesday",pl:"Wtorek"} KRes.d3={de:"Mittwoch",en:"Wednesdey",pl:"Środa"} KRes.d4={de:"Donnerstag",en:"Thuesday",pl:"Czwartek"} KRes.d5={de:"Freitag",en:"Friday",pl:"Piątek"} KRes.d6={de:"Samstag",en:"Saturday",pl:"Sobota"} KRes.d0={de:"Sonntag",en:"Sunday",pl:"Niedziela"} KRes.ds1={de:"Mo",en:"Mon",pl:"pon."} KRes.ds2={de:"Di",en:"Tue",pl:"wt."} KRes.ds3={de:"Mi",en:"Wed",pl:"śr."} KRes.ds4={de:"Do",en:"Thu",pl:"czw."} KRes.ds5={de:"Fr",en:"Fri",pl:"pt."} KRes.ds6={de:"Sa",en:"Sat",pl:"sob."} KRes.ds0={de:"So",en:"Sun",pl:"neidz."} KRes.dxs1={de:"Mo",en:"M",pl:"P"} KRes.dxs2={de:"Di",en:"T",pl:"W"} KRes.dxs3={de:"Mi",en:"W",pl:"Ś"} KRes.dxs4={de:"Do",en:"T",pl:"C"} KRes.dxs5={de:"Fr",en:"F",pl:"P"} KRes.dxs6={de:"Sa",en:"S",pl:"S"} KRes.dxs0={de:"So",en:"S",pl:"N"} KRes.m1={de:"Januar",en:"January",pl:"Styczeń"} KRes.m2={de:"Februar",en:"February",pl:"Luty"} KRes.m3={de:"März",en:"March",pl:"Marzec"} KRes.m4={de:"April",en:"April",pl:"Kwiecień"} KRes.m5={de:"Mai",en:"May",pl:"Maj"} KRes.m6={de:"Juni",en:"June",pl:"Czerwiec"} KRes.m7={de:"Juli",en:"July",pl:"Lipiec"} KRes.m8={de:"August",en:"August",pl:"Sierpień"} KRes.m9={de:"September",en:"September",pl:"Wrzesień"} KRes.m10={de:"Oktober",en:"October",pl:"Październik"} KRes.m11={de:"November",en:"November",pl:"Listopad"} KRes.m12={de:"Dezember",en:"December",pl:"Grudzień"} KRes.ms1={de:"Januar",en:"Jan",pl:"sty"} KRes.ms2={de:"Februar",en:"Feb",pl:"lut"} KRes.ms3={de:"März",en:"Mar",pl:"Marzec"} KRes.ms4={de:"April",en:"Apr",pl:"kwi"} KRes.ms5={de:"Mai",en:"May",pl:"maj"} KRes.ms6={de:"Juni",en:"Jun",pl:"cze"} KRes.ms7={de:"Juli",en:"Jul",pl:"lip"} KRes.ms8={de:"August",en:"Aug",pl:"sie"} KRes.ms9={de:"September",en:"Sep",pl:"wrz"} KRes.ms10={de:"Oktober",en:"Oct",pl:"paź"} KRes.ms11={de:"November",en:"Nov",pl:"lis"} KRes.ms12={de:"Dezember",en:"Dec",pl:"gru"} KRes.Today={de:"Heute",en:"Today",pl:"Dzisiaj"} KRes.DateShort={de:"{d}. {mm}",en:"{mm} {d}",pl:"{mm} {d}"} KRes.DateShortDow={de:"{w} {d}. {mm}",en:"{w}, {mm} {d}",pl:"{w}, {mm} {d}"} KRes.DateShortDM={de:"{d}.{m}.",en:"{m}/{d}",pl:"{m}/{d}"} KRes.DateSingle={de:"{d}. {mm} {y}",en:"{mm} {d}, {y}",pl:"{d} {mm} {y}"} KRes.DateSpanD={de:"{d}. – {d2}. {mm} {y}",en:"{mm} {d} – {d2}, {y}",pl:"{d} – {d2} {mm} {y}"} KRes.DateSpanDM={de:"{d}. {mm} – {d2}. {mm2} {y}",en:"{mm} {d} – {mm2} {d2}, {y}",pl:"{d} {mm} – {d2} {mm2} {y}"} KRes.DateSpanDMY={de:"{d}. {mm} {y} – {d2}. {mm2} {y2}",en:"{mm} {d} {y} – {mm2} {d2}, {y2}",pl:"{d} {mm} {y} – {d2} {mm2} {y2}"} KRes.DateInput={de:"{d}.{m}.{y}",en:"{m}/{d}/{y}",pl:"{y}-{M}-{D}"} KRes.ModeDay={de:"Tag",en:"Day",pl:"Dzień"} KRes.ModeWeek={de:"Woche",en:"Week",pl:"Tydzień"} KRes.ModeMonth={de:"Monat",en:"Month",pl:"Miesiąc"} KRes.NewEvent={de:"Neuer Termin",en:"Create",pl:"Utwórz"} KRes.Clock={de:"{H}:{i}",en:"{h}:{i}{A}",pl:"{H}:{i}"} KRes.ClockO={de:"{H}:00",en:"{h}{A}",pl:"{H}:00"} KRes.Edit={de:"Bearbeiten",en:"Edit",pl:"Edytuj"} KRes.EditEvent={de:"Termin bearbeiten",en:"Edit event",pl:"Edytuj wydarzenie"} KRes.CreateEvent={de:"Termin erstellen",en:"Create event",pl:"Utwórz wydarzenie"} KRes.UnnamedEvent={de:"Unbenannter Termin",en:"Untitled event",pl:"Wydarzenie bez tytułu"} KRes.Location={de:"Ort",en:"Location",pl:"Gdzie"} KRes.Description={de:"Beschreibung",en:"Description",pl:"Opis"} KRes.Apply={de:"Übernehmen",en:"Apply",pl:"Zastosować"} KRes.Cancel={de:"Abbruch",en:"Cancel",pl:"Anuluj"} KRes.Close={de:"Schließen",en:"Close",pl:"Zamknąć"} KRes.NewScheme={de:"weiteres Schema",en:"new scheme",pl:"nowy schemat"} KRes.to={de:"bis",en:"to",pl:"do"} KRes.allday={de:"ganztägig",en:"all-day",pl:"cały dzień"} KRes.DateType1={de:"Einmalig",en:"Singular",pl:"Jednorazowo"} KRes.DateType2={de:"Täglich",en:"Daily",pl:"Codziennie"} KRes.DateType3={de:"Wöchentlich",en:"Weekly",pl:"Co tydzień"} KRes.DateType4={de:"Monatlich",en:"Monthly",pl:"Co miesiąc"} KRes.DateType5={de:"Jährlich",en:"Yearly",pl:"Co rok"} KRes.every={de:"alle",en:"every",pl:"co"} KRes.Interval1={de:"",en:"",pl:""} KRes.Interval2={de:"Tage",en:"days",pl:"dni"} KRes.Interval3={de:"Wochen",en:"weeks",pl:"tyg."} KRes.Interval4={de:"Monate",en:"months",pl:"mies."} KRes.Interval5={de:"Jahre",en:"years",pl:"lata"} KRes.Infinite={de:"Endet nie",en:"Infinite",pl:"Nigdy się nie kończy"} KRes.NumAppearances={de:"Bestimmte Anzahl",en:"Number of appearances",pl:"Liczba wystąpień"} KRes.EndsOnDate={de:"Endet zum Datum",en:"Ends on the date",pl:"Kończy się w dniu"} KRes.DayOfMonth={de:"Tag des Monats",en:"day of the month",pl:"dzień miesiąca"} KRes.DayOfWeek={de:"Wochentag",en:"day of the week",pl:"dzień tygodnia"} KRes.DayOfMonth={de:"am {d}.",en:"on the day {d} of the month",pl:"w dniu {d}"} KRes.DayOfWeek1={de:"am ersten {d}",en:"on the first {d}",pl:"w pierwszym {d}"} KRes.DayOfWeek2={de:"am zweiten {d}",en:"on the second {d}",pl:"w drugim {d}"} KRes.DayOfWeek3={de:"am dritten {d}",en:"on the third {d}",pl:"w trzecim {d}"} KRes.DayOfWeek4={de:"am vierten {d}",en:"on the fourth {d}",pl:"w czwarty {d}"} KRes.DayOfWeekL={de:"am letzten {d}",en:"on the last {d}",pl:"w ostatnim {d}"} KRes.Scheme2={de:"täglich",en:"daily",pl:"codziennie"} KRes.Scheme2i={de:"alle {i} Tage",en:"every {i} days",pl:"co {i} dni"} KRes.Scheme3={de:"wöchentlich am {d}",en:"weekly on {d}",pl:"co tydzień w {d}"} KRes.Scheme3i={de:"alle {i} Wochen am {d}",en:"every {i} weeks on {d}",pl:"co {i} tygodnie w {d}"} KRes.Scheme40={de:"monatlich am {d}.",en:"monthly on day {d}",pl:"co miesiąc w dniu {d}"} KRes.Scheme40i={de:"alle {i} Monate am {d}",en:"every {i} months on day {d}",pl:"co {i} miesiące w dniu {d}"} KRes.Scheme41={de:"monatlich {d}",en:"monthly {d}",pl:"co miesiąc {d}"} KRes.Scheme41i={de:"alle {i} Monate {d}",en:"every {i} months {d}",pl:"co {i} miesiące {d}"} KRes.Scheme5={de:"jährlich am {d}",en:"annually on {d}",pl:"co roku w dniu {d}"} KRes.Scheme5i={de:"alle {i} Jahre am {d}",en:"every {i} years on {d}",pl:"co {i} lata w dniu {d}"} KRes.BeginFrom={de:"ab {d}",en:"as of {d}",pl:"od {d}"} KRes.EndUntil={de:"bis {d}",en:"until {d}",pl:"do {d}"} KRes.EndTimes={de:"{n} mal",en:"{n} times",pl:"{n} razy"} KRes.Days={de:" Tage",en:" days",pl:" dni"} KRes.Hours={de:"h",en:"h",pl:"h"} KRes.Minutes={de:"min",en:"min",pl:"min"} KRes.ExceptionDates={de:"Ausnahmen (Datum)",en:"Exception dates",pl:"Daty wyjątków"} KRes.Remove={de:"Entfernen",en:"Remove",pl:"Wyjąć"} KRes.Delete={de:"Löschen",en:"Delete",pl:"Usunąć"} KRes.ConfirmDelete={de:"Diesen Termin wirklich löschen?",en:"Really delete this event?",pl:"Pewno usunąć to wydarzenie?"} KRes.ErrSchemesOverlapSelf={de:"Dieses Schema erzeugt sich überlappende Zeitspannen!",en:"This scheme results in overlapping time spans!",pl:"Ten schemat generuje nakładających okresów!"} KRes.ErrSchemesOverlap={de:"Dieses Schema überlappt sich mit anderen Schemen!",en:"This scheme overlaps with other schemes!",pl:"Ten schemat pokrywa się z innych schematy!"} KRes.DeleteEventDlgTitle={de:"Wiederkehrenden Termin löschen",en:"Delete recurring event",pl:"Usuń wydarzenie cykliczne"} KRes.DeleteEventDlgOpt1={de:"Nur diesen Termin",en:"This instance only",pl:"Tylko to wystąpienie"} KRes.DeleteEventDlgOpt1Cmt={de:"Alle anderen Instanzen des Termins bleiben unverändert.",en:"All other instances of the event remain unchanged.",pl:"Żadne inne wydarzenia w serii nie zostaną usunięte."} KRes.DeleteEventDlgOpt2={de:"Dieses Schema",en:"This scheme",pl:"Ten schemat"} KRes.DeleteEventDlgOpt3={de:"Alle folgenden",en:"All following",pl:"Wszystkie następne"} KRes.DeleteEventDlgOpt3Cmt={de:"Dieser und alle folgenden Termine des Schemas werden gelöscht.",en:"This and all the following events of the scheme will be deleted.",pl:"Ten i wszystkie kolejne wydarzenia z schematu do usunięcia."} KRes.DeleteEventDlgOpt4={de:"Komplett löschen",en:"Delete completely",pl:"Usuń kompletne"} KRes.DeleteEventDlgOpt4Cmt={de:"Der wiederkehrende Termin wird insgesamt gelöscht.",en:"The recurring event will be completely deleted.",pl:"Cykliczne wydarzenie zostanie całkowicie usunięte."} KCalendar.prototype.firstDayOfWeek=1; KCalendar.prototype.DefaultLang="en"; KCalendar.prototype.Lang="en"; KCalendar.prototype.mode="week"; // days, week, month KCalendar.prototype.modeLastTimeSpan={}; KCalendar.prototype.from=null; KCalendar.prototype.until=null; //KCalendar.prototype.calendarColors=[[55,58,215],[77,184,16],[80,182,142],[21,135,189],[117,72,30],[208,36,36]]; KCalendar.prototype.calendarColors=[[154,156,255],[66,214,146],[250,87,60],[159,198,231],[123,209,72],[172,114,94],[202,189,191],[246,145,178],[205,116,230],[250,209,101]]; KCalendar.prototype.calendarColorOffset=0; //KCalendar.prototype.fontSize="11pt"; KCalendar.prototype.paddingHorizontal=3; KCalendar.prototype.paddingVertical=1; KCalendar.prototype.calendarSwitchSize="12"; KCalendar.prototype.calendarSwitchBorderColor="#DCDCDC"; KCalendar.prototype.padding="9"; KCalendar.prototype.calendarNameMaxWidth="200"; KCalendar.prototype.timelineWidth="50"; KCalendar.prototype.halfHourHeight="21"; KCalendar.prototype.color="#000000"; KCalendar.prototype.daysColor="#000000"; KCalendar.prototype.dayOfCurrentMonthColor="#000000"; KCalendar.prototype.dayOffCurrentMonthColor="#999999"; KCalendar.prototype.inselectableColor="#999999"; KCalendar.prototype.dayBorderColor="#DDDDDD"; KCalendar.prototype.todayBorderColor="#999999"; KCalendar.prototype.todayBgColor="#EEEEEE"; //KCalendar.prototype.hooverColor="#FFEE55"; KCalendar.prototype.editSchemeBgColor="#FFF6C3"; KCalendar.prototype.editInvalidBgColor="#FFCDCD"; KCalendar.prototype.inputBorder="#CCC solid 1px"; KCalendar.prototype.Template={ button:"
{caption}
", buttonSelected:"
{caption}
", buttonDisabled:"
{caption}
", }; function KCalendar(o,adapterUrl,from,until,config) { this.groups=[]; this.dateSelector=null; this.win=new KWin(); this.outerO=o; this.eb=-1; if(adapterUrl) this.SetAdapterURL(adapterUrl); this.config=config?config:{}; // TODO (kiglib) calendar hight is 2 pixel too many, so changed 100% into calc(100% - 2px) var t=document.createElement("table");this.outerO.appendChild(t);t.style.borderSpacing="0";t.style.borderCollapse="collapse";t.style.width="100%";t.style.height="calc(100% - 2px)"; var m=this; var tr=t.insertRow(0); m.edge=tr.insertCell(0);m.edge.style.padding=m.padding+"px"; m.navi=tr.insertCell(1);m.navi.style.width="*";m.navi.style.padding=m.padding+"px"; tr=t.insertRow(1);tr.style.height="99%"; m.menuTD=tr.insertCell(0);m.menuTD.style.padding=m.padding+"px";m.menuTD.style.paddingTop="0"; m.menu=document.createElement("div");m.menuTD.appendChild(m.menu);m.menu.style.overflowY="auto"; m.o=tr.insertCell(1);m.o.style.padding=m.padding+"px";m.o.style.paddingTop="0"; // top navigation: var n=document.createElement("table");m.navi.appendChild(n);n.style.borderCollapse="collapse";n.style.width="100%"; tr=n.insertRow(0); m.navLeft=tr.insertCell(0);m.navLeft.style.textAlign="left";m.navLeft.style.cssFloat="left"; m.navRight=tr.insertCell(1);m.navRight.style.textAlign="right";m.navRight.style.cssFloat="right"; // menu: m.tGroups=document.createElement("table");m.menu.appendChild(this.tGroups);m.tGroups.style.borderSpacing="0";m.tGroups.style.borderCollapse="collapse"; tr=this.tGroups.insertRow(0); var td=tr.insertCell(0);td.colSpan="2"; m.datePicker=new KDatePicker(td,0,0,null,true); m.datePicker.selectRange=true; m.datePicker.Selected = function(from,until,ready) { m.blockSetPicker=!ready; m.SetTimespan(from,until); } var m=this; //t.onmousemove = function(e) {m.MouseMove(e)}; //t.onmousedown = function(e) {m.MouseDown(e)}; //this.table.onmouseup = function(e) {m.MouseUp(e)}; //document.body.addEventListener("mouseup",function(e) {m.MouseUp(e)}); //if("onmousewheel" in document) // t.onmousewheel = function(e) {m.MouseWheel(e)}; //else // t.addEventListener('DOMMouseScroll',function(e) {m.MouseWheel(e)}); document.body.addEventListener("mousedown",function() {m.CloseDateSelector()}); this.SetTimespan(from,until,true); }; KCalendar.prototype.Destroy = function() { this.CloseDateSelector(); }; KCalendar.prototype.s = function(id) { var r=KRes[id]; if(r && Object.keys(r).length) return r[this.Lang] || r[this.DefaultLang] || r[Object.keys(r)[0]]; else return "["+id+"]"; }; KCalendar.prototype.LangChange = function(l) { this.Lang=l; this.datePicker.LangChange(l); this.Refresh(); }; KCalendar.prototype.SetAdapterURL = function(url) { if(url.substr(url.length-1,1)!="?" && url.substr(url.length-1,1)!="&") if(url.indexOf("?")>-1) url+="&"; else url+="?"; this.adapterUrl=url; }; KCalendar.prototype.Resize = function(w,h) { if(w>0 && h>0) { this.outerO.style.width=w+"px";this.outerO.style.height=h+"px"; this.win.Resize(this.win.Find("event")); this.Refresh(); } }; KCalendar.prototype.SetTimespan = function(from,until,keepMode) { var lastDayOfWeek=0;if(this.firstDayOfWeek==0) lastDayOfWeek=6;else if(this.firstDayOfWeek==6) lastDayOfWeek=5; if(from) from=KDatePicker.ParseDate(from); if(until) until=KDatePicker.ParseDate(until); if(String(from)==String(until)) until=null; if(!from) from=new Date(); from=this.StripTime(from); if(!keepMode && until) { if(this.DateDiff(from,until)>6) this.mode="month"; else this.mode="days"; } if(this.mode=="month") { if(until || keepMode) from=new Date(from.getFullYear(),from.getMonth(),1); else this.mode="week"; } if(this.mode=="week") while(from.getDay()!=this.firstDayOfWeek) from=this.DateAdd(from,-1); if(!until) { // || (this.mode=="month" && !this.blockSetPicker) if(this.mode=="week") until=this.DateAdd(from,6); else if(this.mode=="days") until=this.DateAdd(from,this.from && this.until ? this.DateDiff(this.from,this.until):6); else if(this.mode=="month") until=new Date(from.getFullYear(),from.getMonth()+1,0); }else{ until=this.StripTime(until); if(this.mode=="month") until=new Date(from.getFullYear(),from.getMonth()+1,0); //if(!keepMode) this.mode="days"; } if(!this.blockSetPicker && this.mode=="days" && !keepMode) { if(from.getDate()==1 && until.getDate()==(new Date(until.getFullYear(),until.getMonth()+1,0)).getDate()) this.mode="month"; else if(from.getDay()==this.firstDayOfWeek && until.getDay()==lastDayOfWeek) this.mode="week"; } this.from=from; this.until=until; this.startDate=from; this.endDate=until; if(this.mode=="month") { while(this.startDate.getDay()!=this.firstDayOfWeek) this.startDate=this.DateAdd(this.startDate,-1); while(this.endDate.getDay()!=lastDayOfWeek) this.endDate=this.DateAdd(this.endDate,1); } if(!this.blockSetPicker) { if(this.mode=="days") this.datePicker.EnsureVisible(from,until); else{ var m=new Date((this.from.getTime()+this.until.getTime())/2); this.datePicker.SetCurrentMonth(m.getFullYear(),m.getMonth()+1); } this.datePicker.Select(this.startDate,this.endDate,true,true); } this.Refresh(); }; KCalendar.prototype.Forwards = function() { if(this.mode=="week" || this.mode=="days") { var d=this.DateDiff(this.from,this.until)+1; this.SetTimespan(this.DateAdd(this.from,d),this.DateAdd(this.until,d)); }else if(this.mode=="month") { this.SetTimespan(new Date(this.from.getFullYear(),this.from.getMonth()+1,1),new Date(this.from.getFullYear(),this.from.getMonth()+2,0)); } }; KCalendar.prototype.Backwards = function() { if(this.mode=="week" || this.mode=="days") { var d=this.DateDiff(this.from,this.until)+1; this.SetTimespan(this.DateAdd(this.from,-d),this.DateAdd(this.until,-d)); }else if(this.mode=="month") { this.SetTimespan(new Date(this.from.getFullYear(),this.from.getMonth()-1,1),new Date(this.from.getFullYear(),this.from.getMonth(),0)); } }; KCalendar.prototype.SetMode = function(mode) { if(mode!=this.mode) { this.modeLastTimeSpan[this.mode]=[this.from.getTime(),this.until.getTime()]; this.mode=mode; if(this.modeLastTimeSpan[mode] && this.modeLastTimeSpan[mode][1]>=this.from.getTime() && this.modeLastTimeSpan[mode][0]<=this.until.getTime()) this.SetTimespan(new Date(this.modeLastTimeSpan[mode][0]),new Date(this.modeLastTimeSpan[mode][1]),true); else this.SetTimespan(this.from,null,true); } }; KCalendar.prototype.Reload = function() { for(var a=0;a=m.from.getTime() && today.getTime()<=m.until.getTime()? m.Template.buttonDisabled:m.Template.button; d=m.Html2Object(templ.replace(/{caption}/g,m.s("Today")).replace(/{font}/g,m.outerO.font).replace(/{fontSize}/g,m.outerO.fontSize));td.appendChild(d); d.onclick = function() {m.SetTimespan(new Date(),null,true)}; td=tr.insertCell(1); d=m.Html2Object(m.Template.button.replace(/{caption}/g,"◀").replace(/{font}/g,m.outerO.font).replace(/{fontSize}/g,m.outerO.fontSize));td.appendChild(d); d.style.marginLeft="-1px"; d.onclick = function() {m.Backwards()}; td=tr.insertCell(2); d=m.Html2Object(m.Template.button.replace(/{caption}/g,"▶").replace(/{font}/g,m.outerO.font).replace(/{fontSize}/g,m.outerO.fontSize));td.appendChild(d); d.style.marginLeft="-1px"; d.onclick = function() {m.Forwards()}; td=tr.insertCell(3); td.style.paddingLeft="8px";td.style.verticalAlign="middle"; var s; if(m.from.getTime()==m.until.getTime()) s=m.s("DateSingle").replace(/{y}/g,m.from.getFullYear()).replace(/{m}/g,m.s("m"+(m.from.getMonth()+1))).replace(/{d}/g,m.from.getDate()); else if(m.mode=="month") s=m.s("m"+(m.from.getMonth()+1))+" "+m.from.getFullYear(); else s=m.FormatDateSpan(m.from,m.until); td.innerHTML=s; // top right navigation: m.navRight.innerHTML=""; tt=document.createElement("table");m.navRight.appendChild(tt);tt.style.display="inline";tt.style.borderSpacing="0";tt.style.borderCollapse="collapse"; tr=tt.insertRow(0); td=tr.insertCell(0); templ=m.mode=="week"? m.Template.buttonSelected:m.Template.button; d=m.Html2Object(templ.replace(/{caption}/g,m.s("ModeWeek")).replace(/{font}/g,m.outerO.font).replace(/{fontSize}/g,m.outerO.fontSize));td.appendChild(d); d.onclick = function() {m.SetMode("week")}; td=tr.insertCell(1); templ=m.mode=="month"? m.Template.buttonSelected:m.Template.button; d=m.Html2Object(templ.replace(/{caption}/g,m.s("ModeMonth")).replace(/{font}/g,m.outerO.font).replace(/{fontSize}/g,m.outerO.fontSize));td.appendChild(d); d.onclick = function() {m.SetMode("month")}; // plot: switch(m.mode) { case "month":m.DrawMonth();break; case "week":case "days":m.DrawDays();break; } }; KCalendar.prototype.DrawDays = function() { this.o.innerHTML=""; // master table: var mt=document.createElement("table");this.o.appendChild(mt);mt.style.borderSpacing="0";mt.style.borderCollapse="collapse";mt.style.width="100%";mt.style.height="100%"; var tr=mt.insertRow(0); var fullday=tr.insertCell(0);fullday.style.height="1%"; tr=mt.insertRow(1); var main=tr.insertCell(0);main.style.height="99%"; // draw day names: var ht=document.createElement("table");fullday.appendChild(ht);ht.style.tableLayout="fixed";ht.style.borderSpacing="0";ht.style.borderCollapse="collapse";ht.style.width="100%";ht.style.marginBottom=this.halfHourHeight+"px"; tr=ht.insertRow(0); var numDays=this.DateDiff(this.from,this.until)+1; var day=this.from; var today=this.StripTime(new Date()); var days=[day]; var items=this.FindOverlappingEvents(day,this.DateAdd(day,numDays)); td=tr.insertCell(0);td.style.width=this.timelineWidth+"px";td.style.padding="0 "+this.paddingHorizontal+"px";td.style.borderLeft="1px solid transparent"; do{ td=tr.insertCell(tr.cells.length);td.style.font=this.outerO.font;td.style.color=this.daysColor;td.style.textAlign="center";td.style.width=(100/numDays)+"%";td.style.borderBottom="1px solid "+this.dayBorderColor;td.style.padding=this.paddingVertical+"px 0";td.style.cursor="default";td.style.MozUserSelect="none";td.style.webkitUserSelect="none";td.style.msUserSelect="none";td.style.userSelect="none"; td.innerHTML=this.s("ds"+day.getDay())+" "+this.s("DateShortDM").replace(/{m}/g,day.getMonth()+1).replace(/{d}/g,day.getDate()); if(day.getTime()==today.getTime()) { td.style.backgroundColor=this.todayBgColor; td.style.border="1px solid "+this.dayBorderColor; td.style.fontWeight="bold"; } day=this.DateAdd(day,1); days.push(day); }while(day.getTime()<=this.until.getTime()); var fulldayRightGap=tr.insertCell(tr.cells.length); // full-day events: var grid=this.MakeGrid(items,numDays,days,"fullday"); for(var i=0;i"+item.date.time+" ":"")+(item.event.title?item.event.title:""); if(item.event.id) {KCalendar.HookEvent(d,"click",this,"ShowEvent",item);d.style.cursor="pointer"} if(item.fullday) { d.style.cssFloat="left";d.style.color=this.color;d.style.backgroundColor=this.Color(col);d.style.border="1px solid "+this.Color(col,-50,.5);d.style.padding="0px "+this.paddingHorizontal+"px"; if(c==0 && item.date.begin.getTime()=86400000 || this.DateAdd(item.date.begin,1).getTime()==item.date.end.getTime())) { // skip full-day events item.h=0;if(item.date.begin.getTime()>days[d]) item.h=item.date.begin.getHours()+item.date.begin.getMinutes()/60; item.h2=24;if(item.date.end.getTime()"+(small?" ":"
"); s+=item.event.title?item.event.title:""; e.innerHTML=s; if(item.event.id) {KCalendar.HookEvent(e,"click",this,"ShowEvent",item);e.style.cursor="pointer"} } } } } //if(navigator.userAgent.toLowerCase().indexOf("chrome")>-1) for(i=0;i6) dow=0; }while(dow!=this.firstDayOfWeek); var fulldayRightGap=tr.insertCell(tr.cells.length); // draw plot: var m=this; var maindiv=document.createElement("div");main.appendChild(maindiv);maindiv.style.overflowY="auto";maindiv.style.height=main.clientHeight+"px"; var t=document.createElement("table");maindiv.appendChild(t);t.style.borderSpacing="0";t.style.borderCollapse="collapse";t.style.width="100%";t.style.height="100%"; var today=this.StripTime(new Date()); var day=this.startDate; do{ tr=t.insertRow();tr.style.height=height=(100/(this.DateDiff(this.startDate,this.endDate)+1)*7)+"%"; td=tr.insertCell(0);td.style.border="1px solid "+this.dayBorderColor; var tt=document.createElement("table");td.appendChild(tt);tt.style.tableLayout="fixed";tt.style.borderSpacing="0";tt.style.borderCollapse="collapse";tt.style.width="100%";tt.style.height="100%"; tr=tt.insertRow(0); a=0; var days=[day]; var items=this.FindOverlappingEvents(day,this.DateAdd(day,7)); do{ var col=day.getTime()>=this.from.getTime() && day.getTime()<=this.until.getTime() ? this.dayOfCurrentMonthColor:this.dayOffCurrentMonthColor; td=tr.insertCell(a);td.style.color=col;textAlign="left";td.style.width=(100/7)+"%";td.style.MozUserSelect="none";td.style.webkitUserSelect="none";td.style.msUserSelect="none";td.style.userSelect="none"; if(a<6) td.style.borderRight="1px solid "+this.dayBorderColor; if(this.fontSize) td.style.fontSize=this.fontSize; KCalendar.HookEvent(td,"click",this,"EditEvent",false,day); var d=document.createElement("div");td.appendChild(d);d.style.padding=this.paddingVertical+"px "+this.paddingHorizontal+"px"; d.innerHTML=day.getDate(); if(day.getTime()==today.getTime()) {td.style.backgroundColor=this.todayBgColor;td.style.borderTop="1px solid "+this.todayBorderColor;d.style.fontWeight="bold";} a++; day=this.DateAdd(day,1); //new Date(day.getFullYear(),day.getMonth(),day.getDate()+1); days.push(day); }while(day.getDay()!=this.firstDayOfWeek); // events: var grid=this.MakeGrid(items,7,days,""); for(var i=0;i"+this.FormatTime(item.date.begin,true)+" ":"")+(item.event.title?item.event.title:""); if(item.event.id) {KCalendar.HookEvent(td,"click",this,"ShowEvent",item);d.style.cursor="pointer"} if(item.fullday) { d.style.cssFloat="left";d.style.color=this.color;d.style.backgroundColor=this.Color(col);d.style.border="1px solid "+this.Color(col,-50,.5);d.style.padding="0px "+this.paddingHorizontal+"px"; if(c==0 && item.date.begin.getTime()0) m.Backwards(); else m.Forwards()}; else t.addEventListener('DOMMouseScroll',function(e) {if(m.MouseWheel(e)>0) m.Backwards(); else m.Forwards()}); }; KCalendar.prototype.MakeGrid = function(items,numDays,days,mode) { var grid=new KCalendarGrid(); for(var i=0;i=days[c+1].getTime()) c++; var r=0;while(grid.Get(c,r)!==null) r++; if(item.date.end.getTime()-item.date.begin.getTime()>=86400000 || this.DateAdd(item.date.begin,1).getTime()==item.date.end.getTime()) { if(mode!="short") { item.fullday=true; item.span=this.DateDiff(days[c],item.date.end); if(item.date.time) item.span++; if(item.span>numDays-c) item.span=numDays-c; grid.Set(c,r,item); for(var j=c+1;jstartDate.getTime()) items.push({date:date,event:event,calendar:calendar}); } } } } } items.sort(KCalendar.ItemSort); return items; }; KCalendar.ItemSort = function(a, b) { if(b.date.begin.getTime() == a.date.begin.getTime()) return 0; return b.date.begin.getTime() < a.date.begin.getTime()? 1 : -1; }; KCalendar.prototype.Color = function(c,brightness,gamma) { if(!brightness) brightness=0; if(gamma) gamma=1/gamma; else gamma=1; var r=c[0]+brightness; var g=c[1]+brightness; var b=c[2]+brightness; if(gamma!=1) { r=Math.round(255*(Math.pow(r/255,gamma))); g=Math.round(255*(Math.pow(g/255,gamma))); b=Math.round(255*(Math.pow(b/255,gamma))); } //alert("rgb("+Math.max(0,Math.min(255,r))+","+Math.max(0,Math.min(255,g))+","+Math.max(0,Math.min(255,b))+")"); return "rgb("+Math.max(0,Math.min(255,r))+","+Math.max(0,Math.min(255,g))+","+Math.max(0,Math.min(255,b))+")"; }; KCalendar.prototype.RedrawGroups = function() { var t=this.tGroups; for(var a=t.rows.length-1;a>0;a--) t.deleteRow(a); for(var a=0;a1) { tr=t.insertRow(); td=tr.insertCell(0);td.style.padding="4px"; b=document.createElement("button");b.style.width="100%";b.style.fontWeight="bold";b.innerHTML=m.s("DeleteEventDlgOpt2");td.appendChild(b); b.onclick = function(e) { for(var a=0;athis.startDate.getTime() && today.getTime()s[a].begin.getTime()) return m.s("ErrSchemesOverlapSelf"); // find overlappings with other schemes for(a=0;as[a].begin.getTime()) return m.s("ErrSchemesOverlap"); return false; } packScheme = function() { var begin=m.ParseDate(iDate1.value);if(!begin) return null; var scheme={type:Number(iType.value),begin:m.FormatDateISO(begin)}; var end; if(iAllDay.checked) { end=m.ParseDate(iDate2.value);if(!end) return null; end=m.DateAdd(end,1); }else{ begin=m.ParseDate(iDate1.value,iTime1.value);if(!begin) return null; end=m.ParseDate(iDate2.value,iTime2.value);if(!end) return null; scheme.time=m.FormatTimeISO(m.ParseTime(iTime1.value)); } if(begin.getTime()>=end.getTime()) return null; scheme.duration=(end.getTime()-begin.getTime())/60000; if(iType.value>1) { if(iInterval.value>1) scheme.interval=Number(iInterval.value); if(iType.value==3) { scheme.daysofweek="";for(var a=1;a<8;a++) if(dOW[a].checked) scheme.daysofweek+=""+a; if(scheme.daysofweek=="") return null; }else if(iType.value==4) { if(iMonth.value==0) scheme.dayofmonth=begin.getDate(); else{scheme.dayofweek=m.GetDay(begin);scheme.daynum=Number(iMonth.value)} } if(iEndType.value==1) { if(iEnd.value>1) {scheme.num=Number(iEnd.value);if(isNaN(scheme.num)) return null} }else if(iEndType.value==2) { scheme.end=m.ParseDate(iEnd.value);if(!scheme.end || scheme.end.getTime()1); for(var a=iMonth.length-1;a>=0;a--) iMonth.remove(a); iMonth.add(new Option(m.s("DayOfMonth").replace(/{d}/g,begin.getDate()),0,false,schemes[curScheme].dayofmonth?true:false)); if(wDOM<5) iMonth.add(new Option(m.s("DayOfWeek"+wDOM).replace(/{d}/g,m.s("d"+begin.getDay())),wDOM,false,schemes[curScheme].dayofweek && schemes[curScheme].dayofweek>0)); if(wDOM==lastWDOM) iMonth.add(new Option(m.s("DayOfWeekL").replace(/{d}/g,m.s("d"+begin.getDay())),-1,false,schemes[curScheme].dayofweek && schemes[curScheme].dayofweek<0)); }; var modified=false,blocked=true checkScheme = function() { if(m.currentCalendar.preventOverlap) { var e=checkOverlap(); lErrorR.style.display=e?"":"none"; if(e) lError.innerHTML=e; else{ bOK.disabled=false; bOK.style.cursor=""; } }else{ bOK.disabled=false; bOK.style.cursor=""; } } setModified = function() { if(blocked) return; modified=true; var s=packScheme(); bOK.disabled=true; bOK.style.cursor="not-allowed"; if(s) { schemes[curScheme]=s; iScheme.options[curScheme].text=m.Scheme2Cleartext(s); if(iType.value==4) mRFunc(); checkScheme(); } } loadScheme = function() { blocked=true; if(curScheme==schemes.length) schemes.push(newScheme()); for(var a=iScheme.length-1;a>=0;a--) iScheme.remove(a); for(a=0;a1?"":"none"; var s=schemes[curScheme]; iScheme.options[curScheme].text=m.Scheme2Cleartext(s); var allday=!s.time; var begin=m.ParseDate(s.begin,s.time); iDate1.value=m.FormatDate(begin); iTime1.value=m.FormatTime(begin); var end=new Date(begin.getTime()+(s.duration?s.duration:0)*60000); if(!s.time) end=m.DateAdd(end,-1); iDate2.value=m.FormatDate(end); iTime2.value=m.FormatTime(end); if(allday) {iTime1.style.display="none";iTime2.style.display="none"} iAllDay.checked=!s.time iAllDay.onchange(); iType.selectedIndex=s.type-1; iType.onchange(); iInterval.value=s.interval?s.interval:1; for(a=1;a<8;a++) dOW[a].checked=(s.daysofweek && s.daysofweek.indexOf(a)>-1) || (!s.daysofweek && a==m.GetDay(begin)); mRFunc(); iEndType.selectedIndex=0; if(s.num) iEndType.selectedIndex=1; if(s.end) iEndType.selectedIndex=2; iEndType.onchange(); for(a=iExcept.length-1;a>=0;a--) iExcept.remove(a); if(s.except) { iExceptR.style.display=""; for(a=0;a7) a=1; }while(a!=ws); // end date or number of appearences var iEndR=main.insertRow();td=iEndR.insertCell(0);td.colSpan=2;td.style.backgroundColor=this.editSchemeBgColor;td.style.padding="4px"; var iEndType=document.createElement("select");iEndType.style.border=this.inputBorder;td.appendChild(iEndType); iEndType.add(new Option(this.s("Infinite"),0)); iEndType.add(new Option(this.s("NumAppearances"),1)); iEndType.add(new Option(this.s("EndsOnDate"),2)); var iEnd=document.createElement("input");iEnd.style.border=this.inputBorder;iEnd.style.width="80px";td.appendChild(iEnd); iEnd.onfocus = function() { if(tods) window.clearTimeout(tods);tods=null; if(!m.dateSelector && iEndType.value==2) m.ShowDateSelector(iEnd,iDate1.value); } iEnd.onclick = function(e) { e.stopPropagation(); if(iEndType.value==2) m.ShowDateSelector(iEnd,iDate1.value); } iEnd.onblur = function() { tods=window.setTimeout(function() {m.CloseDateSelector();tods=null},50); } iEnd.onchange = function() { setModified(); iEnd.style.backgroundColor=iEndType.value==1 || (m.ParseDate(iEnd.value) && m.ParseDate(iEnd.value).getTime()>=m.ParseDate(schemes[curScheme].begin).getTime())?"":m.editInvalidBgColor; } iEnd.onkeyup = function() {this.onchange()}; iEndType.onchange = function() { iEnd.style.display=this.value>0?"":"none"; if(this.value==1) {iEnd.type="number";iEnd.min="2";iEnd.value=schemes[curScheme].num?schemes[curScheme].num:2} if(this.value==2) {iEnd.type="";iEnd.min="";iEnd.value=schemes[curScheme].end?m.FormatDate(m.ParseDate(schemes[curScheme].end)):""} setModified(); } iEndType.onchange(); // exception dates var iExceptR=main.insertRow(); td=iExceptR.insertCell(0);td.style.backgroundColor=this.editSchemeBgColor;td.style.padding="4px";td.innerHTML=this.s("ExceptionDates"); td=iExceptR.insertCell(1);td.style.backgroundColor=this.editSchemeBgColor;td.style.padding="4px"; var iExcept=document.createElement("select");iExcept.size="3";iExcept.style.border=this.inputBorder;td.appendChild(iExcept); var bDelExcept=document.createElement("button");bDelExcept.innerHTML=this.s("Remove");bDelExcept.style.marginLeft="2px";bDelExcept.style.verticalAlign="top";td.appendChild(bDelExcept); bDelExcept.onclick = function() {iExcept.remove(iExcept.selectedIndex);if(iExcept.length==0) iExceptR.style.display="none";setModified()} // event type iType.onchange = function() { cInterval.style.display=this.value>1?"":"none"; iInterval.style.display=this.value>1?"":"none"; lInterval.style.display=this.value>1?"":"none"; lInterval.innerHTML=m.s("Interval"+this.value); iWeekdaysS.style.display=this.value==3?"inline-flex":"none"; iMonth.style.display=this.value==4?"":"none"; if(this.value==4) mRFunc(); iEndR.style.display=this.value>1?"":"none"; setModified(); m.win.Resize(w); } // event location and description var iLocationR=main.insertRow(); td=iLocationR.insertCell(0);td.style.padding="4px";td.innerHTML=this.s("Location"); td=iLocationR.insertCell(1);td.style.padding="4px"; var iLocation=document.createElement("input");iLocation.style.border=this.inputBorder;iLocation.style.width="300px";td.appendChild(iLocation); var iDescR=main.insertRow(); td=iDescR.insertCell(0);td.style.padding="4px";td.innerHTML=this.s("Description"); td=iDescR.insertCell(1);td.style.padding="4px"; var iDesc=document.createElement("textarea");iDesc.rows="3";iDesc.style.border=this.inputBorder;iDesc.style.width="300px";td.appendChild(iDesc); // buttons tr=main.insertRow();td=tr.insertCell(0);td.style.padding="4px"; var bOK=document.createElement("button");bOK.innerHTML=this.s("Apply");bOK.style.fontWeight="bold";bOK.disabled=true;td.appendChild(bOK); bOK.onclick = function() { var e={schemes:schemes}; if(id) e.id=id; if(m.currentCalendar.features.title) e.title=iTitle.value; if(m.currentCalendar.features.location) e.location=iLocation.value; if(m.currentCalendar.features.desc) e.desc=iDesc.value; m.SaveEvent(m.currentCalendar,e,false,function() {m.win.Close(w)}); } td=tr.insertCell(1);td.style.padding="4px";td.style.textAlign="right"; var bDel=document.createElement("button");bDel.innerHTML=this.s("Delete");bDel.style.marginRight="4px";td.appendChild(bDel); bDel.onclick = function() { if(confirm(m.s("ConfirmDelete"))) m.SaveEvent(m.currentCalendar,{"id":id},true,function() {m.win.Close(w)}); } var bCancel=document.createElement("button");bCancel.innerHTML=this.s("Cancel");bCancel.style.fontWeight="bold";td.appendChild(bCancel); bCancel.onclick = function() {m.win.Close(w)} // load event var id,schemes,curScheme; loadEvent = function(e,scheme) { if(e) id=e.id; else id=null; bDel.style.display=e?"":"none"; if(e && (m.currentCalendar.readonly || e.readonly)) { bOK.style.display="none";bCancel.innerHTML=m.s("Close"); }else{ bOK.style.display="";bCancel.innerHTML=m.s("Cancel"); } iTitle.value=e && e.title?e.title:m.s("UnnamedEvent"); iLocation.value=e && e.location?e.location:""; iDesc.value=e && e.desc?e.desc:""; schemes=[];curScheme=0; if(e) { if(e.schemes instanceof Array) schemes=JSON.parse(JSON.stringify(e.schemes)); // clone if(scheme) { for(var a=0;a1) s=this.s("Scheme2i").replace(/{i}/g,scheme.interval);else s=this.s("Scheme2");break; case 3: var d=[]; var ws=scheme.weekstart?scheme.weekstart:1; var a=ws;do{if(scheme.daysofweek.indexOf(a)>-1) d.push(this.s("d"+(a<7?a:0)));a++;if(a>7) a=1;}while(a!=ws); if(scheme.interval && scheme.interval>1) s=this.s("Scheme3i").replace(/{i}/g,scheme.interval);else s=this.s("Scheme3"); s=s.replace(/{d}/g,d.join(", "));break; case 4: if(scheme.dayofmonth) { if(scheme.interval && scheme.interval>1) s=this.s("Scheme40i").replace(/{i}/g,scheme.interval);else s=this.s("Scheme40"); s=s.replace(/{d}/g,date.getDate()); }else{ if(scheme.interval && scheme.interval>1) s=this.s("Scheme41i").replace(/{i}/g,scheme.interval);else s=this.s("Scheme41"); var d=this.s("DayOfWeek"+(scheme.daynum<0?"L":scheme.daynum)).replace(/{d}/g,this.s("d"+date.getDay())); s=s.replace(/{d}/g,d); } break; case 5: if(scheme.interval && scheme.interval>1) s=this.s("Scheme5i").replace(/{i}/g,scheme.interval);else s=this.s("Scheme5"); s=s.replace(/{d}/g,this.FormatDate(this.ParseDate(scheme.begin),"DateShort")); break; } if(scheme.type>1) { if(scheme.num) s+=", "+this.s("EndTimes").replace(/{n}/g,scheme.num); var from=scheme.num || this.ParseDate(scheme.begin)>new Date().getTime()?this.ParseDate(scheme.begin):null; var until=scheme.end?this.ParseDate(scheme.end):null; if(from || until) s=this.FormatDateSpan(from,until)+", "+s; } if(scheme.time) { var t=this.ParseDate(scheme.begin,scheme.time); s+=", "+this.FormatTimeSpan(t,scheme.duration?new Date(t.getTime()+scheme.duration*60000):null); } return s; }; KCalendar.prototype.ToggleRow = function(e,group,tr,ctrl) { group.minimized=!group.minimized; tr.style.display=group.minimized?"none":""; ctrl.innerHTML=group.minimized?"▶":"▼"; }; KCalendar.prototype.ToggleCalendar = function(e,calendar,d) { calendar.on=!calendar.on; if(calendar.on) { d.style.backgroundColor=this.Color(calendar.color);d.style.borderColor=this.Color(calendar.color); this.LoadCalendar(calendar); this.currentCalendar=calendar; }else d.style.background="";d.style.borderColor=this.calendarSwitchBorderColor; this.Refresh(); }; KCalendar.prototype.SwitchCalendar = function(id,on,exclusive) { var calendar=this.FindCalendar(id); if(!calendar) return; calendar.on=on?true:false; if(on) { this.LoadCalendar(calendar); this.currentCalendar=calendar; if(exclusive) for(var a=0;a1) time=t[1]; var h; if(time) h=this.ParseTime(time); if(!h) h=[0,0]; var y,m,d; if(t[0].indexOf("-")>-1) { t=t[0].split("-");if(t.length!=3) return null;y=t[0];m=t[1];d=t[2]; }else if(t[0].indexOf(".")>-1) { t=t[0].split(".");if(t.length!=3) return null;y=t[2];m=t[1];d=t[0]; }else if(t[0].indexOf("/")>-1) { t=t[0].split("/");if(t.length!=3) return null;y=t[2];m=t[0];d=t[1]; } y=Number(y);if(isNaN(y)) return null; m=Number(m);if(isNaN(m) || m<1 || m>12) return null; d=Number(d);if(isNaN(d) || d<1 || d>31) return null; d=new Date(y,m-1,d,h[0],h[1],0); return isNaN(d.getTime())?null:d; }; KCalendar.prototype.ParseTime = function(s) { if(typeof s!="string") return null; s=s.toLowerCase().replace(/ /g,""); var m=""; if(s.indexOf("p")>-1) m="pm"; if(s.indexOf("a")>-1) m="am"; s=s.replace(/a/g,"").replace(/p/g,"").replace(/m/g,""); var h=s.split(":"); if(h.length>3) return null; if(h.length==3) h.pop(); if(h.length==1) h.push(0); h[0]=Number(h[0]);if(isNaN(h[0]) || h[0]<0 || h[0]>23) return null; h[1]=Number(h[1]);if(isNaN(h[1]) || h[1]<0 || h[1]>59) return null; if(m=="am") { if(h[0]==12) h[0]=0; }else if(m=="pm") { if(h[0]<12) h[0]+=12; } return h; }; KCalendar.prototype.FormatDateISO = function(d) { return d.getFullYear()+"-"+this.TwoDigits(d.getMonth()+1)+"-"+(d.getDate()<10?"0"+d.getDate():d.getDate()); }; KCalendar.prototype.FormatDate = function(d,template) { if(typeof template=="undefined") template="DateInput"; return this.s(template).replace(/{y}/g,d.getFullYear()).replace(/{m}/g,d.getMonth()+1).replace(/{mm}/g,this.s("m"+(d.getMonth()+1))).replace(/{M}/g,this.TwoDigits(d.getMonth()+1)).replace(/{d}/g,d.getDate()).replace(/{D}/g,this.TwoDigits(d.getDate())); }; KCalendar.prototype.FormatDateSpan = function(begin,until) { if(begin && until) { var s=this.s("DateSpanD"); if(begin.getMonth()!=until.getMonth()) s=this.s("DateSpanDM"); if(begin.getFullYear()!=until.getFullYear()) s=this.s("DateSpanDMY"); return s.replace(/{y}/g,begin.getFullYear()).replace(/{mm}/g,this.s("ms"+(begin.getMonth()+1))).replace(/{d}/g,begin.getDate()).replace(/{y2}/g,until.getFullYear()).replace(/{mm2}/g,this.s("ms"+(until.getMonth()+1))).replace(/{d2}/g,until.getDate()); }else if(begin) { return this.s("BeginFrom").replace(/{d}/g,this.FormatDate(begin)); }else{ return this.s("EndUntil").replace(/{d}/g,this.FormatDate(until)); } }; KCalendar.prototype.FormatTimeISO = function(d) { if(d instanceof Date) d=[d.getHours(),d.getMinutes()]; if(d instanceof Array) return this.TwoDigits(d[0])+":"+this.TwoDigits(d[1]);else return "00:00"; }; KCalendar.prototype.FormatTime = function(d,short) { if(d instanceof Array) d=new Date(2000,1,1,d[0],d[1],0); if(!(d instanceof Date)) return ""; var s=d.getMinutes()?this.s("Clock"):this.s("ClockO"); return s.replace(/{H}/g,d.getHours()).replace(/{h}/g,this.GetHours12(d.getHours())[0]).replace(/{i}/g,this.TwoDigits(d.getMinutes())).replace(/{A}/g,this.GetHours12(d.getHours(),short)[1]); }; KCalendar.prototype.FormatTimeSpan = function(begin,until) { var s=this.FormatTime(begin); if(until) { var minutes=(until.getTime()-begin.getTime())/60000; if(minutes>18*60) { var hours=Math.floor(minutes/60);minutes-=hours*60; var days=Math.floor(hours/24);hours-=days*24; s+=","; if(days) s+=" "+days+this.s("Days"); if(hours) s+=" "+hours+this.s("Hours"); if(minutes) s+=" "+minutes+this.s("Minutes"); }else s+=" – "+this.FormatTime(until); } return s; }; KCalendar.prototype.GetHours12 = function(h,short) { var m=short?"":"am";if(h>11) m=short?"p":"pm" if(h==0) h=12;else if(h>12) h=h%12; return [h,m]; }; KCalendar.prototype.TwoDigits = function(a) { a=""+a; if(a.length<2) a="0"+a; return a; }; KCalendar.prototype.CalcDates = function(exDateSchema) { if(!(exDateSchema instanceof Object)) exDateSchema = {"apply":[]}; var dates = this.CalcDatesFromSchemata(exDateSchema.apply); var prevents = exDateSchema.prevent? this.CalcDatesFromSchemata(exDateSchema.prevent) : []; // substract dates of "prevent" from "apply": var result = []; for(var a = 0; a < dates.length; a++) { var begin = dates[a].begin.getTime(); var end = dates[a].end.getTime(); var use = true; for(var b = 0; b < prevents.length; b++) { var begin2 = prevents[b].begin.getTime(); var end2 = prevents[b].end.getTime(); if((begin2 < end && end2 > begin) || (begin == end && begin2 <= end && end2 > begin)) { use = false; break; } // timespans overlap } if(use) result.push(dates[a]); } return result; }; KCalendar.prototype.CalcDatesFromSchemata = function(schemes) { if(!(schemes instanceof Array)) schemes = []; var maxTime = new Date((new Date()).getFullYear() + 10, 0, 1); var dates = []; for(var a = 0; a < schemes.length; a++) { var rec = schemes[a]; // explode multiple start times: var tds = []; if(!rec.time) { tds.push({hour:0, minute:0, duration:null}); } else if(rec.time instanceof Array) { for(var b = 0; b < rec.time.length; b++) tds.push({hour:parseInt(rec.time[b].split(":")[0]), minute:parseInt(rec.time[b].split(":")[1]), duration:rec.duration? (rec.duration instanceof Array? rec.duration[b] : rec.duration) : null}); } else tds.push({hour:parseInt(rec.time.split(":")[0]), minute:parseInt(rec.time.split(":")[1]), duration:rec.duration? rec.duration : null}); var endTime = (rec.end? this.ParseDate(rec.end, rec.time) : maxTime).getTime(); var useTime = !!rec.time; var maxNum = rec.num? rec.num : Number.MAX_VALUE; var num = 0; var interval = rec.interval && rec.interval > 0? rec.interval : 1; var t = this.ParseDate(rec.begin); switch(rec.type) { case 1: // one time this.CalcDatesFromSchemataAdd(dates, t, tds, useTime, rec); break; case 2: // daily do { if(!rec.daysofweek || rec.daysofweek.indexOf(this.GetDay(t)) > -1) { this.CalcDatesFromSchemataAdd(dates, t, tds, useTime, rec); num++; } t = this.DateAdd(t, interval); } while(t.getTime() <= endTime && num < maxNum); break; case 3: // weekly do { if(rec.daysofweek.indexOf(this.GetDay(t)) > -1) { this.CalcDatesFromSchemataAdd(dates, t, tds, useTime, rec); num++; } t = this.DateAdd(t, 1); if(interval > 1 && (rec.weekstart? rec.weekstart : 1) == this.GetDay(t)) t = this.DateAdd(t, (interval - 1) * 7); } while(t.getTime() <= endTime && num < maxNum); break; case 4: // monthly var startTime = new Date(t.getTime()); if(rec.dayofmonth) { startTime.setDate(rec.dayofmonth); if(startTime.getTime() < t.getTime()) startTime = this.DateAddMonth(startTime, 1); } else { t.setDate(1); if(!rec.daynum) rec.daynum = 1; if(rec.daynum < 0) t = new Date(t.getFullYear(), t.getMonth() + 1, 0, t.getHours(), t.getMinutes(), t.getSeconds()); } var i = 0; do { if(rec.dayofmonth) { this.CalcDatesFromSchemataAdd(dates, t, tds, useTime, rec); num++; i += interval; t = this.DateAddMonth(startTime, i); } else { var tm = t.getMonth(); while(this.GetDay(t) != rec.dayofweek) t = this.DateAdd(t, rec.daynum < 0? -1 : 1); // find first day if(rec.daynum < -1) { t = this.DateAdd(t, (rec.daynum + 1) * 7); } else { t = this.DateAdd(t, (rec.daynum - 1) * 7); if(t.getMonth() != tm) t = this.DateAdd(t, -7); } if(t.getTime() >= startTime.getTime() && (!rec.daysofweek || rec.daysofweek.indexOf(this.GetDay(t)) > -1)) { this.CalcDatesFromSchemataAdd(dates, t, tds, useTime, rec); num++; } t.setDate(1); t = this.DateAddMonth(t, interval); if(rec.daynum < 0) t = new Date(t.getFullYear(), t.getMonth() + 1, 0, t.getHours(), t.getMinutes(), t.getSeconds()); } } while(t.getTime() <= endTime && num < maxNum); break; case 5: // yearly var startT = new Date(t.getTime()); var month = t.getMonth(); var i = 0; do { if(!rec.daysofweek || rec.daysofweek.indexOf(this.GetDay(t)) > -1) { this.CalcDatesFromSchemataAdd(dates, t, tds, useTime, rec); num++; } i += interval; t = new Date(startT.getFullYear() + i, startT.getMonth(), startT.getDate(), startT.getHours(), startT.getMinutes(), startT.getSeconds()); if(t.getMonth() > month) t.setDate(0); // handle february 29 } while(t.getTime() <= endTime && num < maxNum); break; } } dates.sort(KCalendar.DateSort); return dates; }; KCalendar.prototype.CalcDatesFromSchemataAdd = function(dates, t, tds, useTime, rec) { for(var a = 0; a < tds.length; a++) { var ts = new Date(t.getTime()); ts.setHours(tds[a].hour, tds[a].minute, 0); var te = new Date(ts.getTime()); switch(typeof td.duration) { case "string": if(td.duration.slice(-1) == "D") te = this.DateAdd(te, parseInt(td.duration.substr(0, td.duration.length - 1))); else console.error("unknown period format"); break; case "number": te = new Date(te.getTime() + td.duration * 60000); break; //default: // te = this.DateAdd(te, 1); } dates.push({begin:ts, end:te, time:useTime, scheme:rec}); } }; KCalendar.DateSort = function(a, b) { if(a.begin.getTime() == b.begin.getTime()) return 0; return a.begin.getTime() < b.begin.getTime()? -1 : 1; }; KCalendar.prototype.Html2Object = function(html) { var p=document.createElement("div");p.innerHTML=html; return p.firstChild; }; KCalendar.HookEvent = function(o,eventName,target,funcName,funcParam,funcParam2,funcParam3) { o.addEventListener(eventName,function(e) {target[funcName](e,funcParam,funcParam2,funcParam3)}); }; function KCalendarGrid() { this.data=[]; this.numRows=0; this.numCols=0; this.Get = function(col,row) { if(col=this.numCols || row>=this.numRows) this.Expand(col+1,row+1); this.data[row][col]=value; }; this.Expand = function(cols,rows) { if(rows>this.numRows) { var n=[]; for(var a=0;athis.numCols) { var n=[]; for(var a=this.numCols;a