From: znek Date: Sun, 15 Aug 2004 14:50:22 +0000 (+0000) Subject: new components X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=95ba7976b6c385d6332c1b0b4e50c6584cfe3020;p=scalable-opengroupware.org new components git-svn-id: http://svn.opengroupware.org/SOGo/trunk@223 d1b88da0-ebda-0310-925b-ed51d893ca5b --- diff --git a/SOGo/UI/Scheduler/ChangeLog b/SOGo/UI/Scheduler/ChangeLog index ed7c13fa..78c3f490 100644 --- a/SOGo/UI/Scheduler/ChangeLog +++ b/SOGo/UI/Scheduler/ChangeLog @@ -1,3 +1,25 @@ +2004-08-15 Marcus Mueller + + * v0.9.41 + + * images/*: new images for UIxDatePicker and skycalendar.html. + + * French.lproj/skycalendar.*, English.lproj/skycalendar.*: new js + based date picker taken from OGo. + NOTE: these files are currently NOT used/installed due to a bug + in SOPE. Instead, the non-localized versions are used. This will + go away as soon as the bug in SOPE is fixed. + + * skycalendar.js, skycalendar.html: the non-localized versions as a + workaround to the problem described above. + + * product.plist: added new images and the non-localized js date picker + as public resources. + + * UIxDatePicker.[m,wox], UIxDatePickerScript.[m,wox]: new reusable + component for picking a date fancy style. ;-) Use UIxDatePickerScript + to load the necessary js code once in your component. + 2004-08-15 Helge Hess * v0.9.40 @@ -12,7 +34,7 @@ * UIxAppointmentView.wox, UIxCalWeekOverview.wox: minor cleanups -2004-08-14 Marcus Mueller +2004-08-15 Marcus Mueller * v0.9.38 diff --git a/SOGo/UI/Scheduler/English.lproj/skycalendar.html b/SOGo/UI/Scheduler/English.lproj/skycalendar.html new file mode 100644 index 00000000..f6767f4e --- /dev/null +++ b/SOGo/UI/Scheduler/English.lproj/skycalendar.html @@ -0,0 +1,160 @@ + + + +Select Date, Please. + + + + + + +
+ + + + +
+ + + +
+ + + diff --git a/SOGo/UI/Scheduler/English.lproj/skycalendar.js b/SOGo/UI/Scheduler/English.lproj/skycalendar.js new file mode 100644 index 00000000..897aa236 --- /dev/null +++ b/SOGo/UI/Scheduler/English.lproj/skycalendar.js @@ -0,0 +1,190 @@ +// Title: Tigra Calendar +// Description: See the demo at url +// URL: http://www.softcomplex.com/products/tigra_calendar/ +// Version: 3.1 (European date format) +// Date: 08-08-2002 (mm-dd-yyyy) +// Feedback: feedback@softcomplex.com (specify product title in the subject) +// Note: Permission given to use this script in ANY kind of applications if +// header lines are left unchanged. +// Note: Script consists of two files: calendar?.js and calendar.html +// About us: Our company provides offshore IT consulting services. +// Contact us at sales@softcomplex.com if you have any programming task you +// want to be handled by professionals. Our typical hourly rate is $20. + +// modified by Martin Hoerning, mh@skyrix.com, 2002-12-05 +// 2003-01-23 added date format support (Martin Hoerning) + +// if two digit year input dates after this year considered 20 century. +var NUM_CENTYEAR = 30; +// are year scrolling buttons required by default +var BUL_YEARSCROLL = true; +var DEF_CALPAGE = 'skycalendar.html'; + +var calendars = []; +var RE_NUM = /^\-?\d+$/; +var dateFormat = "yyyy-mm-dd"; + +function skycalendar(obj_target) { + // assing methods + this.gen_date = cal_gen_date1; + this.gen_tsmp = cal_gen_tsmp1; + this.prs_date = cal_prs_date1; + this.prs_tsmp = cal_prs_tsmp1; + this.popup = cal_popup1; + this.setCalendarPage = cal_setcalpage1; + this.setDateFormat = cal_setdateformat1; + + // validate input parameters + if (!obj_target) + return cal_error("Error calling the calendar: no target control specified"); + if (obj_target.value == null) + return cal_error("Error calling the calendar: parameter specified is not valid tardet control"); + this.target = obj_target; + this.year_scroll = BUL_YEARSCROLL; + this.calpage = DEF_CALPAGE; + + // register in global collections + this.id = calendars.length; + calendars[this.id] = this; +} + +function cal_setcalpage1(str_page) { + this.calpage = str_page; +} + +function cal_setdateformat1(str_dateformat) { + this.dateFormat = str_dateformat; +} + +function cal_popup1(str_datetime) { + this.dt_current = this.prs_tsmp(str_datetime ? str_datetime : this.target.value); + if (!this.dt_current) return; + + var obj_calwindow = window.open( + this.calpage+'?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id, + 'Calendar', 'width=200,height=190'+ + ',status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes' + ); + obj_calwindow.opener = window; + obj_calwindow.focus(); +} + +// timestamp generating function +function cal_gen_tsmp1(dt_datetime) { + return this.gen_date(dt_datetime); +} + +// date generating function +function cal_gen_date1(dt_datetime) { + var out = this.dateFormat; + var idx; + if (out.indexOf("yyyy") != 1) { + t = out.split("yyyy"); + out = t.join(dt_datetime.getFullYear()); + } + else { + return cal_error("Missing year-part 'yyyy' in format: '"+this.dateFormat); + } + if (out.indexOf("mm") != 1) { + t = out.split("mm"); + out = t.join((dt_datetime.getMonth() < 9 ? '0' : '')+ + (dt_datetime.getMonth()+1)); + } + else { + return cal_error("Missing month-part 'mm' in format: '"+this.dateFormat); + } + if (out.indexOf("dd") != 1) { + t = out.split("dd"); + out = t.join((dt_datetime.getDate() < 10 ? '0' : '')+ + dt_datetime.getDate()); + } + else { + return cal_error("Missing day-part 'dd' in format: '"+this.dateFormat); + } + + return out; +} + +// timestamp parsing function +function cal_prs_tsmp1(str_datetime) { + // if no parameter specified return current timestamp + if (!str_datetime) + return (new Date()); + + // if positive integer treat as milliseconds from epoch + if (RE_NUM.exec(str_datetime)) + return new Date(str_datetime); + + return this.prs_date(str_datetime); +} + +// date parsing function +function cal_prs_date1(str_date) { + var idx; + var year = null; + var month = null; + var day = null; + + if (str_date.length != this.dateFormat.length) { + return cal_error ("Invalid date format: '"+str_date+ + "'.\nFormat accepted is '"+this.dateFormat+"'."); + } + + if ((idx = this.dateFormat.indexOf("yyyy")) != 1) { + year = str_date.substring(idx, idx+4); + } + else { + return cal_error("Missing year-part 'yyyy' in format: '"+this.dateFormat); + } + if ((idx = this.dateFormat.indexOf("mm")) != 1) { + month = str_date.substring(idx, idx+2); + } + else { + return cal_error("Missing month-part 'mm' in format: '"+this.dateFormat); + } + if ((idx = this.dateFormat.indexOf("dd")) != 1) { + day = str_date.substring(idx, idx+2); + } + else { + return cal_error("Missing day-part 'dd' in format: '"+this.dateFormat); + } + + if (!day) return cal_error("Invalid date format: '"+str_date+ + "'.\nNo day of month value can be found."); + if (!RE_NUM.exec(day)) + return cal_error("Invalid day of month value: '"+day+ + "'.\nAllowed values are unsigned integers."); + + if (!month) return cal_error("Invalid date format: '"+str_date+ + "'.\nNo month of year value can be found."); + if (!RE_NUM.exec(month)) + return cal_error("Invalid month of year value: '"+month+ + "'.\nAllowed values are unsigned integers."); + + if (!year) return cal_error("Invalid date format: '"+str_date+ + "'.\nNo year value can be found."); + if (!RE_NUM.exec(year)) + return cal_error("Invalid year value: '"+year+ + "'.\nAllowed values are unsigned integers."); + + + var dt_date = new Date(); + dt_date.setDate(1); + if (month < 1 || month > 12) + return cal_error("Invalid month value: '"+month+ + "'.\nAllowed range is 01-12."); + dt_date.setMonth(month-1); + if (year < 100) year = Number(year)+(year < NUM_CENTYEAR ? 2000 : 1900); + dt_date.setFullYear(year); + var dt_numdays = new Date(year, month, 0); + dt_date.setDate(day); + if (dt_date.getMonth() != (month-1)) + return cal_error("Invalid day of month value: '"+day+ + "'.\nAllowed range is 01-"+dt_numdays.getDate()+"."); + return (dt_date); +} + +function cal_error(str_message) { + alert (str_message); + return null; +} diff --git a/SOGo/UI/Scheduler/French.lproj/skycalendar.html b/SOGo/UI/Scheduler/French.lproj/skycalendar.html new file mode 100644 index 00000000..f6767f4e --- /dev/null +++ b/SOGo/UI/Scheduler/French.lproj/skycalendar.html @@ -0,0 +1,160 @@ + + + +Select Date, Please. + + + + + + +
+ + + + +
+ + + +
+ + + diff --git a/SOGo/UI/Scheduler/French.lproj/skycalendar.js b/SOGo/UI/Scheduler/French.lproj/skycalendar.js new file mode 100644 index 00000000..897aa236 --- /dev/null +++ b/SOGo/UI/Scheduler/French.lproj/skycalendar.js @@ -0,0 +1,190 @@ +// Title: Tigra Calendar +// Description: See the demo at url +// URL: http://www.softcomplex.com/products/tigra_calendar/ +// Version: 3.1 (European date format) +// Date: 08-08-2002 (mm-dd-yyyy) +// Feedback: feedback@softcomplex.com (specify product title in the subject) +// Note: Permission given to use this script in ANY kind of applications if +// header lines are left unchanged. +// Note: Script consists of two files: calendar?.js and calendar.html +// About us: Our company provides offshore IT consulting services. +// Contact us at sales@softcomplex.com if you have any programming task you +// want to be handled by professionals. Our typical hourly rate is $20. + +// modified by Martin Hoerning, mh@skyrix.com, 2002-12-05 +// 2003-01-23 added date format support (Martin Hoerning) + +// if two digit year input dates after this year considered 20 century. +var NUM_CENTYEAR = 30; +// are year scrolling buttons required by default +var BUL_YEARSCROLL = true; +var DEF_CALPAGE = 'skycalendar.html'; + +var calendars = []; +var RE_NUM = /^\-?\d+$/; +var dateFormat = "yyyy-mm-dd"; + +function skycalendar(obj_target) { + // assing methods + this.gen_date = cal_gen_date1; + this.gen_tsmp = cal_gen_tsmp1; + this.prs_date = cal_prs_date1; + this.prs_tsmp = cal_prs_tsmp1; + this.popup = cal_popup1; + this.setCalendarPage = cal_setcalpage1; + this.setDateFormat = cal_setdateformat1; + + // validate input parameters + if (!obj_target) + return cal_error("Error calling the calendar: no target control specified"); + if (obj_target.value == null) + return cal_error("Error calling the calendar: parameter specified is not valid tardet control"); + this.target = obj_target; + this.year_scroll = BUL_YEARSCROLL; + this.calpage = DEF_CALPAGE; + + // register in global collections + this.id = calendars.length; + calendars[this.id] = this; +} + +function cal_setcalpage1(str_page) { + this.calpage = str_page; +} + +function cal_setdateformat1(str_dateformat) { + this.dateFormat = str_dateformat; +} + +function cal_popup1(str_datetime) { + this.dt_current = this.prs_tsmp(str_datetime ? str_datetime : this.target.value); + if (!this.dt_current) return; + + var obj_calwindow = window.open( + this.calpage+'?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id, + 'Calendar', 'width=200,height=190'+ + ',status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes' + ); + obj_calwindow.opener = window; + obj_calwindow.focus(); +} + +// timestamp generating function +function cal_gen_tsmp1(dt_datetime) { + return this.gen_date(dt_datetime); +} + +// date generating function +function cal_gen_date1(dt_datetime) { + var out = this.dateFormat; + var idx; + if (out.indexOf("yyyy") != 1) { + t = out.split("yyyy"); + out = t.join(dt_datetime.getFullYear()); + } + else { + return cal_error("Missing year-part 'yyyy' in format: '"+this.dateFormat); + } + if (out.indexOf("mm") != 1) { + t = out.split("mm"); + out = t.join((dt_datetime.getMonth() < 9 ? '0' : '')+ + (dt_datetime.getMonth()+1)); + } + else { + return cal_error("Missing month-part 'mm' in format: '"+this.dateFormat); + } + if (out.indexOf("dd") != 1) { + t = out.split("dd"); + out = t.join((dt_datetime.getDate() < 10 ? '0' : '')+ + dt_datetime.getDate()); + } + else { + return cal_error("Missing day-part 'dd' in format: '"+this.dateFormat); + } + + return out; +} + +// timestamp parsing function +function cal_prs_tsmp1(str_datetime) { + // if no parameter specified return current timestamp + if (!str_datetime) + return (new Date()); + + // if positive integer treat as milliseconds from epoch + if (RE_NUM.exec(str_datetime)) + return new Date(str_datetime); + + return this.prs_date(str_datetime); +} + +// date parsing function +function cal_prs_date1(str_date) { + var idx; + var year = null; + var month = null; + var day = null; + + if (str_date.length != this.dateFormat.length) { + return cal_error ("Invalid date format: '"+str_date+ + "'.\nFormat accepted is '"+this.dateFormat+"'."); + } + + if ((idx = this.dateFormat.indexOf("yyyy")) != 1) { + year = str_date.substring(idx, idx+4); + } + else { + return cal_error("Missing year-part 'yyyy' in format: '"+this.dateFormat); + } + if ((idx = this.dateFormat.indexOf("mm")) != 1) { + month = str_date.substring(idx, idx+2); + } + else { + return cal_error("Missing month-part 'mm' in format: '"+this.dateFormat); + } + if ((idx = this.dateFormat.indexOf("dd")) != 1) { + day = str_date.substring(idx, idx+2); + } + else { + return cal_error("Missing day-part 'dd' in format: '"+this.dateFormat); + } + + if (!day) return cal_error("Invalid date format: '"+str_date+ + "'.\nNo day of month value can be found."); + if (!RE_NUM.exec(day)) + return cal_error("Invalid day of month value: '"+day+ + "'.\nAllowed values are unsigned integers."); + + if (!month) return cal_error("Invalid date format: '"+str_date+ + "'.\nNo month of year value can be found."); + if (!RE_NUM.exec(month)) + return cal_error("Invalid month of year value: '"+month+ + "'.\nAllowed values are unsigned integers."); + + if (!year) return cal_error("Invalid date format: '"+str_date+ + "'.\nNo year value can be found."); + if (!RE_NUM.exec(year)) + return cal_error("Invalid year value: '"+year+ + "'.\nAllowed values are unsigned integers."); + + + var dt_date = new Date(); + dt_date.setDate(1); + if (month < 1 || month > 12) + return cal_error("Invalid month value: '"+month+ + "'.\nAllowed range is 01-12."); + dt_date.setMonth(month-1); + if (year < 100) year = Number(year)+(year < NUM_CENTYEAR ? 2000 : 1900); + dt_date.setFullYear(year); + var dt_numdays = new Date(year, month, 0); + dt_date.setDate(day); + if (dt_date.getMonth() != (month-1)) + return cal_error("Invalid day of month value: '"+day+ + "'.\nAllowed range is 01-"+dt_numdays.getDate()+"."); + return (dt_date); +} + +function cal_error(str_message) { + alert (str_message); + return null; +} diff --git a/SOGo/UI/Scheduler/GNUmakefile b/SOGo/UI/Scheduler/GNUmakefile index 49b2c924..7a0c86a8 100644 --- a/SOGo/UI/Scheduler/GNUmakefile +++ b/SOGo/UI/Scheduler/GNUmakefile @@ -42,6 +42,8 @@ SchedulerUI_OBJC_FILES = \ UIxCalDateLabel.m \ UIxCalBackForthNavView.m \ UIxAppointmentProposal.m \ + UIxDatePicker.m \ + UIxDatePickerScript.m \ SchedulerUI_RESOURCE_FILES += \ Version \ @@ -67,7 +69,9 @@ SchedulerUI_RESOURCE_FILES += \ UIxCalSelectTab.wox \ UIxCalDateLabel.wox \ UIxCalBackForthNavView.wox \ - UIxAppointmentProposal.wox + UIxAppointmentProposal.wox \ + UIxDatePicker.wox \ + UIxDatePickerScript.wox \ SchedulerUI_RESOURCE_FILES += \ images/next_week.gif \ @@ -79,10 +83,21 @@ SchedulerUI_RESOURCE_FILES += \ images/icon_view_list.gif \ images/icon_view_list_inactive.gif \ images/icon_view_columns.gif \ - images/icon_view_columns_inactive.gif + images/icon_view_columns_inactive.gif \ + images/icon_popupcalendar.gif \ + images/first.gif \ + images/previous.gif \ + images/next.gif \ + images/last.gif \ SchedulerUI_LOCALIZED_RESOURCE_FILES += \ - default.strings + default.strings \ + +# if SoProduct is fixed to enable localized resources, add this to +# SchedulerUI_LOCALIZED_RESOURCE_FILES instead +SchedulerUI_RESOURCE_FILES += \ + skycalendar.html \ + skycalendar.js \ ADDITIONAL_INCLUDE_DIRS += \ -I.. -I../.. -I../../.. diff --git a/SOGo/UI/Scheduler/UIxDatePicker.m b/SOGo/UI/Scheduler/UIxDatePicker.m new file mode 100644 index 00000000..66849b99 --- /dev/null +++ b/SOGo/UI/Scheduler/UIxDatePicker.m @@ -0,0 +1,129 @@ +/* + Copyright (C) 2000-2004 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id$ + + +#include + + +@interface UIxDatePicker : WOComponent +{ + NSString *dateID; + NSCalendarDate *date; + NSString *label; +} + +- (NSString *)dateID; +- (NSString *)dateFormat; + +@end + +@implementation UIxDatePicker + +- (void)dealloc { + [self->dateID release]; + [self->date release]; + [self->label release]; + [super dealloc]; +} + +/* Accessors */ + +- (void)setDateID:(NSString *)_dateID { + ASSIGN(self->dateID, _dateID); +} +- (NSString *)dateID { + return self->dateID; +} + +- (void)setDate:(NSCalendarDate *)_date { + ASSIGN(self->date, _date); +} +- (NSCalendarDate *)date { + return self->date; +} + +- (void)setLabel:(NSString *)_label { + ASSIGN(self->label, _label); +} +- (NSString *)label { + return self->label; +} + +- (NSString *)formattedDateString { + return [date descriptionWithCalendarFormat:@"%Y-%m-%d"]; +} + +- (NSString *)dateFormat { + return @"yyyy-mm-dd"; +} + +- (NSString *)calendarPageURL { + WOResourceManager *rm; + WOContext *ctx; + NSArray *languages; + + if ((rm = [self resourceManager]) == nil) + rm = [[WOApplication application] resourceManager]; + if (rm == nil) + [self debugWithFormat:@"WARNING: missing resource manager!"]; + + /* lookup languages */ + + ctx = [self context]; +#if 0 + languages = [ctx hasSession] + ? [[ctx session] languages] + : [[ctx request] browserLanguages]; +#else +#warning !! FIX SoProduct to enable localizable resource, then disable this! + languages = nil; +#endif + + return [rm urlForResourceNamed:@"skycalendar.html" + inFramework:nil + languages:languages + request:[ctx request]]; +} + +/* JavaScript */ + +- (NSString *)jsPopup { + return [NSString stringWithFormat:@"javascript:calendar_%@.popup()", + [self dateID]]; +} + +- (NSString *)jsCode { + static NSString *code = \ + @"var calendar_%@ = new skycalendar(document.getElementById('%@'));\n" + @"calendar_%@.setCalendarPage('%@');\n" + @"calendar_%@.setDateFormat('%@');\n"; + + return [NSString stringWithFormat:code, + self->dateID, + self->dateID, + self->dateID, + [self calendarPageURL], + self->dateID, + [self dateFormat]]; +} + +@end diff --git a/SOGo/UI/Scheduler/UIxDatePicker.wox b/SOGo/UI/Scheduler/UIxDatePicker.wox new file mode 100644 index 00000000..0fdad861 --- /dev/null +++ b/SOGo/UI/Scheduler/UIxDatePicker.wox @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/SOGo/UI/Scheduler/UIxDatePickerScript.m b/SOGo/UI/Scheduler/UIxDatePickerScript.m new file mode 100644 index 00000000..8ea4d129 --- /dev/null +++ b/SOGo/UI/Scheduler/UIxDatePickerScript.m @@ -0,0 +1,37 @@ +/* + Copyright (C) 2000-2004 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id$ + + +#include + + +@interface UIxDatePickerScript : WOComponent +{ + +} + +@end + + +@implementation UIxDatePickerScript + +@end diff --git a/SOGo/UI/Scheduler/UIxDatePickerScript.wox b/SOGo/UI/Scheduler/UIxDatePickerScript.wox new file mode 100644 index 00000000..afcd672b --- /dev/null +++ b/SOGo/UI/Scheduler/UIxDatePickerScript.wox @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/SOGo/UI/Scheduler/Version b/SOGo/UI/Scheduler/Version index 0093eef0..ca2e7269 100644 --- a/SOGo/UI/Scheduler/Version +++ b/SOGo/UI/Scheduler/Version @@ -1,6 +1,7 @@ # $Id$ -SUBMINOR_VERSION:=40 +SUBMINOR_VERSION:=41 +# v0.9.41 requires libNGObjWeb v4.2.431 # v0.9.31 requires libWEExtensions v4.2.52 # v0.9.29 requires libWEExtensions v4.2.51 diff --git a/SOGo/UI/Scheduler/images/first.gif b/SOGo/UI/Scheduler/images/first.gif new file mode 100644 index 00000000..66d4c6ed Binary files /dev/null and b/SOGo/UI/Scheduler/images/first.gif differ diff --git a/SOGo/UI/Scheduler/images/icon_popupcalendar.gif b/SOGo/UI/Scheduler/images/icon_popupcalendar.gif new file mode 100644 index 00000000..a85d3984 Binary files /dev/null and b/SOGo/UI/Scheduler/images/icon_popupcalendar.gif differ diff --git a/SOGo/UI/Scheduler/images/last.gif b/SOGo/UI/Scheduler/images/last.gif new file mode 100644 index 00000000..5412ed01 Binary files /dev/null and b/SOGo/UI/Scheduler/images/last.gif differ diff --git a/SOGo/UI/Scheduler/images/next.gif b/SOGo/UI/Scheduler/images/next.gif new file mode 100644 index 00000000..d827ea1a Binary files /dev/null and b/SOGo/UI/Scheduler/images/next.gif differ diff --git a/SOGo/UI/Scheduler/images/previous.gif b/SOGo/UI/Scheduler/images/previous.gif new file mode 100644 index 00000000..4590633d Binary files /dev/null and b/SOGo/UI/Scheduler/images/previous.gif differ diff --git a/SOGo/UI/Scheduler/product.plist b/SOGo/UI/Scheduler/product.plist index 048493dc..0810af84 100644 --- a/SOGo/UI/Scheduler/product.plist +++ b/SOGo/UI/Scheduler/product.plist @@ -11,7 +11,14 @@ icon_view_list.gif, icon_view_list_inactive.gif, icon_view_columns.gif, - icon_view_columns_inactive.gif + icon_view_columns_inactive.gif, + icon_popupcalendar.gif, + first.gif, + previous.gif, + next.gif, + last.gif, + skycalendar.html, + skycalendar.js ); factories = { diff --git a/SOGo/UI/Scheduler/skycalendar.html b/SOGo/UI/Scheduler/skycalendar.html new file mode 100644 index 00000000..f6767f4e --- /dev/null +++ b/SOGo/UI/Scheduler/skycalendar.html @@ -0,0 +1,160 @@ + + + +Select Date, Please. + + + + + + +
+ + + + +
+ + + +
+ + + diff --git a/SOGo/UI/Scheduler/skycalendar.js b/SOGo/UI/Scheduler/skycalendar.js new file mode 100644 index 00000000..897aa236 --- /dev/null +++ b/SOGo/UI/Scheduler/skycalendar.js @@ -0,0 +1,190 @@ +// Title: Tigra Calendar +// Description: See the demo at url +// URL: http://www.softcomplex.com/products/tigra_calendar/ +// Version: 3.1 (European date format) +// Date: 08-08-2002 (mm-dd-yyyy) +// Feedback: feedback@softcomplex.com (specify product title in the subject) +// Note: Permission given to use this script in ANY kind of applications if +// header lines are left unchanged. +// Note: Script consists of two files: calendar?.js and calendar.html +// About us: Our company provides offshore IT consulting services. +// Contact us at sales@softcomplex.com if you have any programming task you +// want to be handled by professionals. Our typical hourly rate is $20. + +// modified by Martin Hoerning, mh@skyrix.com, 2002-12-05 +// 2003-01-23 added date format support (Martin Hoerning) + +// if two digit year input dates after this year considered 20 century. +var NUM_CENTYEAR = 30; +// are year scrolling buttons required by default +var BUL_YEARSCROLL = true; +var DEF_CALPAGE = 'skycalendar.html'; + +var calendars = []; +var RE_NUM = /^\-?\d+$/; +var dateFormat = "yyyy-mm-dd"; + +function skycalendar(obj_target) { + // assing methods + this.gen_date = cal_gen_date1; + this.gen_tsmp = cal_gen_tsmp1; + this.prs_date = cal_prs_date1; + this.prs_tsmp = cal_prs_tsmp1; + this.popup = cal_popup1; + this.setCalendarPage = cal_setcalpage1; + this.setDateFormat = cal_setdateformat1; + + // validate input parameters + if (!obj_target) + return cal_error("Error calling the calendar: no target control specified"); + if (obj_target.value == null) + return cal_error("Error calling the calendar: parameter specified is not valid tardet control"); + this.target = obj_target; + this.year_scroll = BUL_YEARSCROLL; + this.calpage = DEF_CALPAGE; + + // register in global collections + this.id = calendars.length; + calendars[this.id] = this; +} + +function cal_setcalpage1(str_page) { + this.calpage = str_page; +} + +function cal_setdateformat1(str_dateformat) { + this.dateFormat = str_dateformat; +} + +function cal_popup1(str_datetime) { + this.dt_current = this.prs_tsmp(str_datetime ? str_datetime : this.target.value); + if (!this.dt_current) return; + + var obj_calwindow = window.open( + this.calpage+'?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id, + 'Calendar', 'width=200,height=190'+ + ',status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes' + ); + obj_calwindow.opener = window; + obj_calwindow.focus(); +} + +// timestamp generating function +function cal_gen_tsmp1(dt_datetime) { + return this.gen_date(dt_datetime); +} + +// date generating function +function cal_gen_date1(dt_datetime) { + var out = this.dateFormat; + var idx; + if (out.indexOf("yyyy") != 1) { + t = out.split("yyyy"); + out = t.join(dt_datetime.getFullYear()); + } + else { + return cal_error("Missing year-part 'yyyy' in format: '"+this.dateFormat); + } + if (out.indexOf("mm") != 1) { + t = out.split("mm"); + out = t.join((dt_datetime.getMonth() < 9 ? '0' : '')+ + (dt_datetime.getMonth()+1)); + } + else { + return cal_error("Missing month-part 'mm' in format: '"+this.dateFormat); + } + if (out.indexOf("dd") != 1) { + t = out.split("dd"); + out = t.join((dt_datetime.getDate() < 10 ? '0' : '')+ + dt_datetime.getDate()); + } + else { + return cal_error("Missing day-part 'dd' in format: '"+this.dateFormat); + } + + return out; +} + +// timestamp parsing function +function cal_prs_tsmp1(str_datetime) { + // if no parameter specified return current timestamp + if (!str_datetime) + return (new Date()); + + // if positive integer treat as milliseconds from epoch + if (RE_NUM.exec(str_datetime)) + return new Date(str_datetime); + + return this.prs_date(str_datetime); +} + +// date parsing function +function cal_prs_date1(str_date) { + var idx; + var year = null; + var month = null; + var day = null; + + if (str_date.length != this.dateFormat.length) { + return cal_error ("Invalid date format: '"+str_date+ + "'.\nFormat accepted is '"+this.dateFormat+"'."); + } + + if ((idx = this.dateFormat.indexOf("yyyy")) != 1) { + year = str_date.substring(idx, idx+4); + } + else { + return cal_error("Missing year-part 'yyyy' in format: '"+this.dateFormat); + } + if ((idx = this.dateFormat.indexOf("mm")) != 1) { + month = str_date.substring(idx, idx+2); + } + else { + return cal_error("Missing month-part 'mm' in format: '"+this.dateFormat); + } + if ((idx = this.dateFormat.indexOf("dd")) != 1) { + day = str_date.substring(idx, idx+2); + } + else { + return cal_error("Missing day-part 'dd' in format: '"+this.dateFormat); + } + + if (!day) return cal_error("Invalid date format: '"+str_date+ + "'.\nNo day of month value can be found."); + if (!RE_NUM.exec(day)) + return cal_error("Invalid day of month value: '"+day+ + "'.\nAllowed values are unsigned integers."); + + if (!month) return cal_error("Invalid date format: '"+str_date+ + "'.\nNo month of year value can be found."); + if (!RE_NUM.exec(month)) + return cal_error("Invalid month of year value: '"+month+ + "'.\nAllowed values are unsigned integers."); + + if (!year) return cal_error("Invalid date format: '"+str_date+ + "'.\nNo year value can be found."); + if (!RE_NUM.exec(year)) + return cal_error("Invalid year value: '"+year+ + "'.\nAllowed values are unsigned integers."); + + + var dt_date = new Date(); + dt_date.setDate(1); + if (month < 1 || month > 12) + return cal_error("Invalid month value: '"+month+ + "'.\nAllowed range is 01-12."); + dt_date.setMonth(month-1); + if (year < 100) year = Number(year)+(year < NUM_CENTYEAR ? 2000 : 1900); + dt_date.setFullYear(year); + var dt_numdays = new Date(year, month, 0); + dt_date.setDate(day); + if (dt_date.getMonth() != (month-1)) + return cal_error("Invalid day of month value: '"+day+ + "'.\nAllowed range is 01-"+dt_numdays.getDate()+"."); + return (dt_date); +} + +function cal_error(str_message) { + alert (str_message); + return null; +}