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;a=this.table.rows[2].offsetTop) {
// e.preventDefault();
// e.stopPropagation();
// var row=Math.floor((ey-this.table.rows[2].offsetTop)/this.table.rows[3].offsetHeight);
// var col=Math.floor(ex/this.table.offsetWidth*7);
// this.day=this.startDate;
// for(var a=0;athis.selectableUntil.getTime()) {selectable=false;this.day=this.selectableUntil}
// if(this.eb>-1) {
// if(this.selectRange && this.day1) this.Select(this.day1,this.day); else this.Select(this.day);
// }else if(!selectable) this.day=null;
//}else this.day=null;
//}
KCalendar.prototype.MouseWheel = function(e) {
var raw=e.detail?e.detail:e.wheelDelta;
var d=e.detail ? e.detail * -1 : e.wheelDelta/40;
if(d>0) d=1; else if(d<0) d=-1;
e.preventDefault();
e.stopPropagation();
return d;
};
KCalendar.prototype.StripTime = function(date) {
return new Date(date.getFullYear(),date.getMonth(),date.getDate());
};
KCalendar.prototype.AssignTime = function(date,hour,min) {
return new Date(date.getFullYear(),date.getMonth(),date.getDate(),hour,min,0);
};
KCalendar.prototype.DateAdd = function(date, days) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days, date.getHours(), date.getMinutes(), date.getSeconds());
};
KCalendar.prototype.DateAddMonth = function(date, months) {
return new Date(date.getFullYear(), date.getMonth() + months, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
};
KCalendar.prototype.DateDiff = function(date1, date2) {
var a = 0;
var d1 = this.StripTime(date1);
var d2 = this.StripTime(date2);
if(d2.getTime() > d1.getTime())
while(d2.getTime() > d1.getTime()) { d1 = this.DateAdd(d1, 1); a++; }
else
while(d2.getTime() < d1.getTime()) { d1 = this.DateAdd(d1, -1); a--; }
return a;
};
KCalendar.prototype.GetDay = function(d) {
d = d.getDay();
if(d == 0) d = 7;
return d;
};
KCalendar.prototype.ParseDate = function(s, time) {
var t=s.split(" ");
if(!time && t.length>1) 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