The multiColumns view

This commit is contained in:
Alexandre Cloutier 2014-06-20 13:16:55 -04:00
parent ce07695a55
commit eb3cc8916d
14 changed files with 696 additions and 318 deletions

View file

@ -542,6 +542,12 @@ vtodo_class2 = "(Confidential task)";
"tagWasRemoved" = "If you remove this calendar from synchronization, you'll need to reload the data on your mobile device.\nContinue?"; "tagWasRemoved" = "If you remove this calendar from synchronization, you'll need to reload the data on your mobile device.\nContinue?";
"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; "DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar.";
"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; "EventCopyError" = "The copy failed. Please try to copy to a difference calendar.";
"Please select at least one calendar" = "Please select at least one calendar";
"notice:" = "notice:";
"error:" = "error:";
"success:" = "success:";
"warning:" = "warning:";
"Open Task..." = "Open Task..."; "Open Task..." = "Open Task...";
"Mark Completed" = "Mark Completed"; "Mark Completed" = "Mark Completed";

View file

@ -21,12 +21,11 @@
onclick = "return onDayOverview();"; onclick = "return onDayOverview();";
image = "day-view.png"; image = "day-view.png";
tooltip = "Switch to day view"; }, tooltip = "Switch to day view"; },
/* disabled until we fix the view */ { link = "#";
/* { link = "#"; label="Multi-Columns View";
label="Multicolumn Day View";
onclick = "return onMulticolumnDayOverview();"; onclick = "return onMulticolumnDayOverview();";
image = "day-view-multicolumn.png"; image = "day-view-multicolumn.png";
tooltip = ""; }, */ tooltip = "Switch to multi-columns day view"; },
{ link = "#"; { link = "#";
label="Week View"; label="Week View";
onclick = "return onWeekOverview();"; onclick = "return onWeekOverview();";

View file

@ -35,27 +35,27 @@
@interface UIxCalDayTable : UIxCalView @interface UIxCalDayTable : UIxCalView
{ {
unsigned int numberOfDays;
NSCalendarDate *startDate;
NSCalendarDate *currentTableDay;
NSString *currentTableHour;
NSMutableArray *daysToDisplay;
NSMutableArray *hoursToDisplay;
NSArray *weekDays;
SOGoDateFormatter *dateFormatter; SOGoDateFormatter *dateFormatter;
NSString *timeFormat; NSArray *weekDays;
NSString *currentView, *timeFormat, *currentTableHour;
NSCalendarDate *startDate, *currentTableDay;
NSMutableArray *daysToDisplay, *calendarsToDisplay, *currentCalendar, *hoursToDisplay;
unsigned int numberOfDays;
} }
- (void) setNumberOfDays: (NSNumber *) aNumber; - (void) setNumberOfDays: (NSNumber *) aNumber;
- (NSNumber *) numberOfDays; - (NSNumber *) numberOfDays;
- (NSString *) currentView;
- (void) setStartDate: (NSCalendarDate *) aStartDate; - (void) setStartDate: (NSCalendarDate *) aStartDate;
- (NSCalendarDate *) startDate; - (NSCalendarDate *) startDate;
- (NSCalendarDate *) endDate; - (NSCalendarDate *) endDate;
- (NSArray *) daysToDisplay; - (NSArray *) daysToDisplay;
- (NSArray *) calendarsToDisplay;
- (void) setCurrentTableDay: (NSCalendarDate *) aTableDay; - (void) setCurrentTableDay: (NSCalendarDate *) aTableDay;
- (NSCalendarDate *) currentTableDay; - (NSCalendarDate *) currentTableDay;
- (NSMutableArray *) currentCalendar;
@end @end

View file

@ -55,9 +55,12 @@
ASSIGN (timeFormat, [ud timeFormat]); ASSIGN (timeFormat, [ud timeFormat]);
daysToDisplay = nil; daysToDisplay = nil;
calendarsToDisplay = nil;
hoursToDisplay = nil; hoursToDisplay = nil;
numberOfDays = 1; numberOfDays = 1;
startDate = nil; startDate = nil;
currentView = nil;
currentCalendar = nil;
currentTableDay = nil; currentTableDay = nil;
currentTableHour = nil; currentTableHour = nil;
weekDays = [locale objectForKey: NSShortWeekDayNameArray]; weekDays = [locale objectForKey: NSShortWeekDayNameArray];
@ -75,6 +78,9 @@
// [allAppointments release]; // [allAppointments release];
[weekDays release]; [weekDays release];
[daysToDisplay release]; [daysToDisplay release];
[calendarsToDisplay release];
[currentView release];
[currentCalendar release];
[hoursToDisplay release]; [hoursToDisplay release];
[dateFormatter release]; [dateFormatter release];
[timeFormat release]; [timeFormat release];
@ -119,6 +125,16 @@
return [endDate endOfDay]; return [endDate endOfDay];
} }
- (void) setCurrentView: (NSString *) aView
{
currentView = [NSString stringWithString:aView];
}
- (NSString *) currentView
{
return currentView;
}
- (NSArray *) hoursToDisplay - (NSArray *) hoursToDisplay
{ {
unsigned int currentHour, lastHour; unsigned int currentHour, lastHour;
@ -154,6 +170,7 @@
daysToDisplay = [NSMutableArray new]; daysToDisplay = [NSMutableArray new];
currentDate = [[self startDate] hour: [self dayStartHour] currentDate = [[self startDate] hour: [self dayStartHour]
minute: 0]; minute: 0];
for (count = 0; count < numberOfDays; count++) for (count = 0; count < numberOfDays; count++)
{ {
[daysToDisplay addObject: currentDate]; [daysToDisplay addObject: currentDate];
@ -164,6 +181,50 @@
return daysToDisplay; return daysToDisplay;
} }
- (NSArray *) calendarsToDisplay
{
if (!calendarsToDisplay) {
int max=0, i;
NSArray *folders;
SOGoAppointmentFolders *co;
SOGoAppointmentFolder *folder;
NSMutableDictionary *calendar;
unsigned int count, foldersCount;
NSString *folderName, *fDisplayName;
NSNumber *isActive;
co = [self clientObject];
folders = [co subFolders];
foldersCount = [folders count];
calendarsToDisplay = [[NSMutableArray alloc] initWithCapacity: foldersCount];
for (count = 0; count < foldersCount; count++)
{
folder = [folders objectAtIndex: count];
isActive = [NSNumber numberWithBool: [folder isActive]];
if ([isActive intValue] != 0) {
calendar = [NSMutableDictionary dictionary];
folderName = [folder nameInContainer];
fDisplayName = [folder displayName];
if (fDisplayName == nil)
fDisplayName = @"";
if ([fDisplayName isEqualToString: [co defaultFolderName]])
fDisplayName = [self labelForKey: fDisplayName];
[calendar setObject: [NSString stringWithFormat: @"/%@", folderName]
forKey: @"id"];
[calendar setObject: fDisplayName forKey: @"displayName"];
[calendar setObject: folderName forKey: @"folder"];
[calendar setObject: [folder calendarColor] forKey: @"color"];
[calendar setObject: isActive forKey: @"active"];
[calendar setObject: [folder ownerInContext: context]
forKey: @"owner"];
[calendarsToDisplay addObject: calendar];
}
}
}
return calendarsToDisplay;
}
- (void) setCurrentTableDay: (NSCalendarDate *) aTableDay - (void) setCurrentTableDay: (NSCalendarDate *) aTableDay
{ {
currentTableDay = aTableDay; currentTableDay = aTableDay;
@ -174,6 +235,16 @@
return currentTableDay; return currentTableDay;
} }
- (void) setCurrentCalendar: (NSMutableArray *) aCalendar
{
currentCalendar = aCalendar;
}
- (NSMutableArray *) currentCalendar
{
return currentCalendar;
}
- (void) setCurrentTableHour: (NSString *) aTableHour - (void) setCurrentTableHour: (NSString *) aTableHour
{ {
currentTableHour = aTableHour; currentTableHour = aTableHour;
@ -226,6 +297,16 @@
return [dateFormatter shortFormattedDate: currentTableDay]; return [dateFormatter shortFormattedDate: currentTableDay];
} }
- (NSString *) labelForCalendar
{
return [NSString stringWithFormat:[currentCalendar objectForKey:@"displayName"]];
}
- (NSString *) colorForCalendar
{
return [NSString stringWithFormat:[currentCalendar objectForKey:@"color"]];
}
// - (NSDictionary *) _adjustedAppointment: (NSDictionary *) anAppointment // - (NSDictionary *) _adjustedAppointment: (NSDictionary *) anAppointment
// forStart: (NSCalendarDate *) start // forStart: (NSCalendarDate *) start
// andEnd: (NSCalendarDate *) end // andEnd: (NSCalendarDate *) end
@ -318,7 +399,15 @@
- (NSString *) daysViewClasses - (NSString *) daysViewClasses
{ {
return [NSString stringWithFormat: @"daysView daysViewFor%dDays", numberOfDays]; NSString *daysView;
if ([currentView isEqualToString:@"multicolumndayview"])
daysView = @"daysView daysViewForMultipleDays";
else
daysView = [NSString stringWithFormat: @"daysView daysViewFor%dDays", numberOfDays];
return daysView;
} }
- (NSString *) dayClasses - (NSString *) dayClasses
@ -326,11 +415,16 @@
NSMutableString *classes; NSMutableString *classes;
unsigned int currentDayNbr, realDayOfWeek; unsigned int currentDayNbr, realDayOfWeek;
classes = [NSMutableString string];
if ([currentView isEqualToString:@"multicolumndayview"])
[classes appendFormat:@"day dayColumn"];
else {
currentDayNbr = [daysToDisplay indexOfObject: currentTableDay]; currentDayNbr = [daysToDisplay indexOfObject: currentTableDay];
realDayOfWeek = [currentTableDay dayOfWeek]; realDayOfWeek = [currentTableDay dayOfWeek];
classes = [NSMutableString string];
[classes appendFormat: @"day day%d", currentDayNbr]; [classes appendFormat: @"day day%d", currentDayNbr];
if (numberOfDays > 1) if (numberOfDays > 1)
{ {
if (realDayOfWeek == 0 || realDayOfWeek == 6) if (realDayOfWeek == 0 || realDayOfWeek == 6)
@ -338,6 +432,7 @@
if ([currentTableDay isToday]) if ([currentTableDay isToday])
[classes appendString: @" dayOfToday"]; [classes appendString: @" dayOfToday"];
} }
}
return classes; return classes;
} }
@ -358,4 +453,24 @@
return cellClass; return cellClass;
} }
- (BOOL) isMultiColumnView
{
BOOL flag = NO;
if ([currentView isEqualToString:@"multicolumndayview"])
flag = YES;
return flag;
}
- (BOOL) isNotMultiColumnView
{
BOOL flag = NO;
if ([currentView isEqualToString:@"dayview"] || [currentView isEqualToString:@"weekview"])
flag = YES;
return flag;
}
@end @end

View file

@ -43,6 +43,7 @@
NSString *value; NSString *value;
NSString *criteria; NSString *criteria;
NSString *userLogin; NSString *userLogin;
NSString *currentView;
BOOL dayBasedView; BOOL dayBasedView;
WORequest *request; WORequest *request;
SOGoDateFormatter *dateFormatter; SOGoDateFormatter *dateFormatter;

View file

@ -78,6 +78,8 @@ static NSArray *tasksFields = nil;
#define maxBlocks (offsetBlocks * 2) // maximum number of blocks to search #define maxBlocks (offsetBlocks * 2) // maximum number of blocks to search
// for a free slot (10 days) // for a free slot (10 days)
@class SOGoAppointment;
@implementation UIxCalListingActions @implementation UIxCalListingActions
+ (void) initialize + (void) initialize
@ -121,6 +123,7 @@ static NSArray *tasksFields = nil;
ASSIGN (dateFormatter, [user dateFormatterInContext: context]); ASSIGN (dateFormatter, [user dateFormatterInContext: context]);
ASSIGN (userTimeZone, [[user userDefaults] timeZone]); ASSIGN (userTimeZone, [[user userDefaults] timeZone]);
dayBasedView = NO; dayBasedView = NO;
currentView = nil;
} }
return self; return self;
@ -239,6 +242,7 @@ static NSArray *tasksFields = nil;
endDate = nil; endDate = nil;
param = [request formValueForKey: @"view"]; param = [request formValueForKey: @"view"];
currentView = param;
dayBasedView = ![param isEqualToString: @"monthview"]; dayBasedView = ![param isEqualToString: @"monthview"];
} }
} }
@ -1044,19 +1048,89 @@ _computeBlocksPosition (NSArray *blocks)
/* ... _computeBlocksMultiplier() ... */ /* ... _computeBlocksMultiplier() ... */
} }
- (NSArray *) _selectedCalendars {
SOGoAppointmentFolders *co;
SOGoAppointmentFolder *folder;
NSMutableArray *selectedCalendars;
NSArray *folders;
NSString *fDisplayName;
NSNumber *isActive;
unsigned int count, foldersCount;
int max=0, i;
co = [self clientObject];
folders = [co subFolders];
foldersCount = [folders count];
selectedCalendars = [[NSMutableArray alloc] initWithCapacity: foldersCount];
for (count = 0; count < foldersCount; count++)
{
folder = [folders objectAtIndex: count];
isActive = [NSNumber numberWithBool: [folder isActive]];
if ([isActive intValue] != 0) {
fDisplayName = [folder displayName];
if (fDisplayName == nil)
fDisplayName = @"";
if ([fDisplayName isEqualToString: [co defaultFolderName]])
fDisplayName = [self labelForKey: fDisplayName];
[selectedCalendars addObject: fDisplayName];
}
}
return selectedCalendars;
}
- (WOResponse *) eventsBlocksAction - (WOResponse *) eventsBlocksAction
{ {
int count, max; int count, max;
NSArray *events, *event, *eventsBlocks; NSArray *events, *event, *eventsBlocks;
NSMutableArray *allDayBlocks, *blocks, *currentDay; NSMutableArray *allDayBlocks, *blocks, *currentDay, *calendars, *eventsByCalendars, *eventsForCalendar;
NSNumber *eventNbr; NSNumber *eventNbr;
BOOL isAllDay; BOOL isAllDay;
int i, j;
[self _setupContext]; [self _setupContext];
events = [self _fetchFields: eventsFields forComponentOfType: @"vevent"];
if ([currentView isEqualToString: @"multicolumndayview"])
{
calendars = [self _selectedCalendars];
eventsByCalendars = [NSMutableArray arrayWithCapacity:[calendars count]];
for (i = 0; i < [calendars count]; i++) // For each calendar
{
eventsForCalendar = [NSMutableArray array];
[self _prepareEventBlocks: &blocks withAllDays: &allDayBlocks];
for (j = 0; j < [events count]; j++) {
if ([[[events objectAtIndex:j] objectAtIndex:2] isEqualToString:[calendars objectAtIndex:i]]) {
[eventsForCalendar addObject: [events objectAtIndex:j]];
}
}
eventsBlocks = [NSArray arrayWithObjects:eventsForCalendar, allDayBlocks, blocks, nil];
max = [eventsForCalendar count];
for (count = 0; count < max; count++)
{
event = [eventsForCalendar objectAtIndex: count];
eventNbr = [NSNumber numberWithUnsignedInt: count];
isAllDay = [[event objectAtIndex: eventIsAllDayIndex] boolValue];
if (dayBasedView && isAllDay)
[self _fillBlocks: allDayBlocks withEvent: event withNumber: eventNbr];
else
[self _fillBlocks: blocks withEvent: event withNumber: eventNbr];
}
max = [blocks count];
for (count = 0; count < max; count++)
{
currentDay = [blocks objectAtIndex: count];
[currentDay sortUsingSelector: @selector (compareEventByStart:)];
[self _addBlocksWidth: currentDay];
}
[eventsByCalendars insertObject:eventsBlocks atIndex:i];
}
return [self _responseWithData: eventsByCalendars];
}
else
{
[self _prepareEventBlocks: &blocks withAllDays: &allDayBlocks]; [self _prepareEventBlocks: &blocks withAllDays: &allDayBlocks];
events = [self _fetchFields: eventsFields
forComponentOfType: @"vevent"];
eventsBlocks = [NSArray arrayWithObjects: events, allDayBlocks, blocks, nil]; eventsBlocks = [NSArray arrayWithObjects: events, allDayBlocks, blocks, nil];
max = [events count]; max = [events count];
for (count = 0; count < max; count++) for (count = 0; count < max; count++)
@ -1082,9 +1156,8 @@ _computeBlocksPosition (NSArray *blocks)
[currentDay sortUsingSelector: @selector (compareEventByStart:)]; [currentDay sortUsingSelector: @selector (compareEventByStart:)];
[self _addBlocksWidth: currentDay]; [self _addBlocksWidth: currentDay];
} }
return [self _responseWithData: eventsBlocks]; return [self _responseWithData: eventsBlocks];
// timeIntervalSinceDate: }
} }
- (NSString *) _getStatusClassForStatusCode: (int) statusCode - (NSString *) _getStatusClassForStatusCode: (int) statusCode

View file

@ -40,13 +40,13 @@
{ {
if ((self = [super init])) if ((self = [super init]))
{ {
// allAppointments = nil; // allAppointments = nil;
subscriptionUsers = nil; subscriptionUsers = nil;
hoursToDisplay = nil; hoursToDisplay = nil;
currentTableUser = nil; currentTableUser = nil;
currentTableHour = nil; currentTableHour = nil;
// dateFormatter = [[SOGoDateFormatter alloc] // dateFormatter = [[SOGoDateFormatter alloc]
// initWithLocale: [self locale]]; // initWithLocale: [self locale]];
} }
return self; return self;
@ -54,10 +54,10 @@
- (void) dealloc - (void) dealloc
{ {
// [allAppointments release]; // [allAppointments release];
[subscriptionUsers release]; [subscriptionUsers release];
[hoursToDisplay release]; [hoursToDisplay release];
// [dateFormatter release]; // [dateFormatter release];
[super dealloc]; [super dealloc];
} }
@ -188,16 +188,6 @@
/* fetching */ /* fetching */
// - (NSCalendarDate *) startDate
// {
// return [[self selectedDate] beginOfDay];
// }
// - (NSCalendarDate *) endDate
// {
// return [[self selectedDate] endOfDay];
// }
// - (NSArray *) appointmentsForCurrentUser // - (NSArray *) appointmentsForCurrentUser
// { // {
// NSMutableArray *filteredAppointments; // NSMutableArray *filteredAppointments;
@ -292,4 +282,11 @@
* (100.0 / [users count]))]; * (100.0 / [users count]))];
} }
- (id <WOActionResults>) defaultAction
{
[super setCurrentView: @"multicolumndayview"];
return self;
}
@end @end

View file

@ -7,51 +7,105 @@
xmlns:rsrc="OGo:url" xmlns:rsrc="OGo:url"
xmlns:label="OGo:label"> xmlns:label="OGo:label">
<div id="calendarHeader" var:class="daysViewClasses"> <div id="calendarHeader" var:class="daysViewClasses">
<div class="dayLabels"
><var:foreach list="daysToDisplay" item="currentTableDay"
><div var:class="dayClasses"
><var:string value="labelForDate"/><br
/><span class="dayOfWeek"><var:string value="labelForDay"/></span
></div
></var:foreach>
</div>
<div class="days"
><var:foreach list="daysToDisplay" item="currentTableDay"
><div var:class="dayClasses"
var:day="currentTableDay.shortDateString"
var:id="currentAllDayId"
hour="allday"
><!-- space --></div
></var:foreach
></div>
</div>
<div id="daysView" var:class="daysViewClasses"> <!-- MultiColumnView -->
<div class="hours" <!-- Display the name of the calendar -->
><var:foreach list="hoursToDisplay" item="currentTableHour" <var:if condition="isMultiColumnView">
><div class="hour" var:id="currentHourId" <div class="calendarLabels">
><var:string value="currentTableHour"/></div <var:foreach list="calendarsToDisplay" item="currentCalendar">
></var:foreach> <div class="calendarsToDisplay">
</div> <var:string value="labelForCalendar"/>
<div class="days">
<var:foreach list="daysToDisplay" item="currentTableDay"
><div var:class="dayClasses"
var:id="currentDayId"
var:day-number="currentDayNumber"
var:day="currentTableDay.shortDateString">
<div class="hourCells">
<var:foreach list="hoursToDisplay" item="currentTableHour"
><div var:class="clickableHourCellClass"
var:day="currentTableDay.shortDateString"
var:hour="currentAppointmentHour">
<span class="minutes15"><!-- space --></span>
<span class="minutes30"><!-- space --></span>
<span class="minutes45"><!-- space --></span>
</div></var:foreach></div>
<div class="events"><!-- space --></div>
</div> </div>
</var:foreach> </var:foreach>
</div> </div>
<!-- Display today abreviation and date -->
<div class="dayLabels">
<var:foreach list="daysToDisplay" item="currentTableDay">
<div var:class="dayClasses">
<var:string value="labelForDate"/><br/>
<span class="dayOfWeek"><var:string value="labelForDay"/></span>
</div>
</var:foreach>
</div>
<!-- All day cells -->
<div class="days">
<var:foreach list="calendarsToDisplay" item="currentCalendar">
<var:foreach list="daysToDisplay" item="currentTableDay">
<div var:class="dayClasses" var:day="currentTableDay.shortDateString" var:id="currentAllDayId" hour="allday"><!-- space --></div>
</var:foreach>
</var:foreach>
</div>
</var:if>
<!-- DayView or WeekView -->
<var:if condition="isNotMultiColumnView">
<!-- Display today abreviation and date -->
<div class="dayLabels">
<var:foreach list="daysToDisplay" item="currentTableDay">
<div var:class="dayClasses">
<var:string value="labelForDate"/><br/>
<span class="dayOfWeek"><var:string value="labelForDay"/></span>
</div>
</var:foreach>
</div>
<!-- All day cells -->
<div class="days">
<var:foreach list="daysToDisplay" item="currentTableDay">
<div var:class="dayClasses" var:day="currentTableDay.shortDateString" var:id="currentAllDayId" hour="allday"><!-- space --></div>
</var:foreach>
</div>
</var:if>
</div>
<!-- The hours cells -->
<div id="daysView" var:class="daysViewClasses">
<div class="hours">
<var:foreach list="hoursToDisplay" item="currentTableHour">
<div class="hour" var:id="currentHourId">
<var:string value="currentTableHour"/>
</div>
</var:foreach>
</div>
<div class="days">
<!-- MultiColumnView -->
<var:if condition="isMultiColumnView">
<var:foreach list="calendarsToDisplay" item="currentCalendar">
<var:foreach list="daysToDisplay" item="currentTableDay">
<div var:class="dayClasses" var:id="currentDayId" var:day-number="currentDayNumber" var:day="currentTableDay.shortDateString">
<div class="hourCells">
<var:foreach list="hoursToDisplay" item="currentTableHour">
<div var:class="clickableHourCellClass" var:day="currentTableDay.shortDateString" var:hour="currentAppointmentHour">
<span class="minutes15"><!-- space --></span>
<span class="minutes30"><!-- space --></span>
<span class="minutes45"><!-- space --></span>
</div>
</var:foreach>
</div>
<div class="events"><!-- space --></div>
</div>
</var:foreach>
</var:foreach>
</var:if>
<var:if condition="isNotMultiColumnView">
<var:foreach list="daysToDisplay" item="currentTableDay">
<div var:class="dayClasses" var:id="currentDayId" var:day-number="currentDayNumber" var:day="currentTableDay.shortDateString">
<div class="hourCells">
<var:foreach list="hoursToDisplay" item="currentTableHour">
<div var:class="clickableHourCellClass" var:day="currentTableDay.shortDateString" var:hour="currentAppointmentHour">
<span class="minutes15"><!-- space --></span>
<span class="minutes30"><!-- space --></span>
<span class="minutes45"><!-- space --></span>
</div>
</var:foreach>
</div>
<div class="events"><!-- space --></div>
</div>
</var:foreach>
</var:if>
</div>
</div> </div>
</container> </container>

View file

@ -40,6 +40,7 @@
className="UIxCalDayTable" className="UIxCalDayTable"
startDate="startDate" startDate="startDate"
const:CSSClass="dayOverview" const:CSSClass="dayOverview"
const:numberOfDays="1" /> const:numberOfDays="1"
const:currentView="dayview"/>
</div> </div>
</container> </container>

View file

@ -5,40 +5,33 @@
xmlns:const="http://www.skyrix.com/od/constant" xmlns:const="http://www.skyrix.com/od/constant"
xmlns:rsrc="OGo:url" xmlns:rsrc="OGo:url"
xmlns:label="OGo:label"> xmlns:label="OGo:label">
<a href="#"
id="leftNavigationArrow"
var:date="prevDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><img rsrc:src="arrow-left.png"/></a>
<span class="daysHeader">
<span class="day2"><a href="#"
var:date="dayBeforePrevDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="dayBeforeYesterdayName"
/></a></span
><span class="day1"><a href="#"
var:date="prevDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="yesterdayName"
/></a></span
><span class="day0"><var:string value="currentDayName" /></span
><span class="day1"><a href="#"
var:date="nextDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="tomorrowName"
/></a></span
><span class="day2"><a href="#"
var:date="dayAfterNextDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="dayAfterTomorrowName"
/></a></span
></span>
<a href="#"
id="rightNavigationArrow"
var:date="nextDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><img rsrc:src="arrow-right.png"/></a>
<div class="menu" id="currentViewMenu">
<ul>
<li><var:string label:value="New Event..."/></li>
<li><var:string label:value="New Task..."/></li>
<li><!-- separator --></li>
<li><var:string label:value="Previous Day"/></li>
<li><var:string label:value="Next Day"/></li>
<li><!-- separator --></li>
<li><var:string label:value="Delete Event"/></li>
<li><var:string label:value="Copy event to my calendar"/></li>
<li><var:string label:value="View Raw Source"/></li>
</ul>
</div>
<!-- Navigation header -->
<span class="daysHeader">
<span class="day1">
<a href="#" id="leftNavigationArrow" var:date="prevDayQueryParameters.day" onclick="return onCalendarGotoDay(this);">
<img rsrc:src="arrow-left.png"/></a></span>
<span class="day0"><var:string value="currentDayName" /></span>
<span class="day1">
<a href="#" id="rightNavigationArrow" var:date="nextDayQueryParameters.day" onclick="return onCalendarGotoDay(this);">
<img rsrc:src="arrow-right.png"/></a></span>
<a href="#" id="listCollapse"><img var:class="collapseBtnClass" rsrc:src="collapse.png"/></a>
</span>
<!-- TODO : Move this inside the schedulerUI.css -->
<style type="text/css"> <style type="text/css">
DIV.day DIV.day
{ {
@ -52,68 +45,12 @@
</var:foreach> </var:foreach>
</style> </style>
<!-- Display the calendar header and the table view -->
<div id="calendarContent"> <div id="calendarContent">
<div id="daysView" class="daysView multicolumnDayView"> <var:component
<div class="hours"> className="UIxCalDayTable"
<var:foreach list="hoursToDisplay" item="currentTableHour" startDate="startDate"
><div class="hour"><var:string value="currentTableHour" />:00</div const:CSSClass="dayOverview"
></var:foreach> const:currentView="multicolumndayview"/>
</div>
<div class="hourLines">
<div class="hourLine hourLine0"><!-- space --></div
><div class="hourLine hourLine1"><!-- space --></div
><div class="hourLine hourLine2"><!-- space --></div
><div class="hourLine hourLine3"><!-- space --></div
><div class="hourLine hourLine4"><!-- space --></div
><div class="hourLine hourLine5"><!-- space --></div
><div class="hourLine hourLine6"><!-- space --></div
><div class="hourLine hourLine7"><!-- space --></div
><div class="hourLine hourLine8"><!-- space --></div
><div class="hourLine hourLine9"><!-- space --></div
><div class="hourLine hourLine10"><!-- space --></div
><div class="hourLine hourLine11"><!-- space --></div
><div class="hourLine hourLine12"><!-- space --></div
><div class="hourLine hourLine13"><!-- space --></div
><div class="hourLine hourLine14"><!-- space --></div
><div class="hourLine hourLine15"><!-- space --></div
><div class="hourLine hourLine16"><!-- space --></div
><div class="hourLine hourLine17"><!-- space --></div
><div class="hourLine hourLine18"><!-- space --></div
><div class="hourLine hourLine19"><!-- space --></div
><div class="hourLine hourLine20"><!-- space --></div
><div class="hourLine hourLine21"><!-- space --></div
><div class="hourLine hourLine22"><!-- space --></div
><div class="hourLine hourLine23"><!-- space --></div>
</div>
<div class="days" var:day="selectedDate.shortDateString">
<var:foreach list="subscriptionUsers" item="currentTableUser"
><div var:class="currentUserClasses"
var:user="currentTableUser"
><div class="header"><var:string value="currentTableUser" /></div>
<div class="appointments">
<var:foreach list="hoursToDisplay" item="currentTableHour"
><div var:class="clickableHourCellClass"
var:hour="currentAppointmentHour">
</div></var:foreach>
<var:foreach list="appointmentsForCurrentUser" item="currentAppointment"
><var:component className="UIxCalInlineAptView"
dayStartHour="dayStartHour"
dayEndHour="dayEndHour"
appointment="currentAppointment"
formatter="aptFormatter"
tooltipFormatter="aptTooltipFormatter"
url="appointmentViewURL"
const:style="dayoverview"
queryDictionary="currentDateQueryParameters"
referenceDate="selectedDate"
canAccess="canAccessApt"
/></var:foreach
>
</div>
</div>
</var:foreach>
</div>
</div>
</div> </div>
</container> </container>

View file

@ -40,6 +40,7 @@
className="UIxCalDayTable" className="UIxCalDayTable"
startDate="startDate" startDate="startDate"
const:CSSClass="weekOverview" const:CSSClass="weekOverview"
const:numberOfDays="7" /> const:numberOfDays="7"
const:currentView="weekview"/>
</div> </div>
</container> </container>

View file

@ -392,7 +392,7 @@ DIV#daysView
left: 0px; } left: 0px; }
DIV#daysView DIV#daysView
{ top: 120px; { top: 97px;
bottom: 0px; bottom: 0px;
border-top: 1px solid #ccc; border-top: 1px solid #ccc;
overflow: auto; overflow: auto;
@ -400,11 +400,12 @@ DIV#daysView
right: 0px;} right: 0px;}
DIV#calendarHeader DIV#calendarHeader
{ top: 50px; { top: 25px;
border: 0px; border: 0px;
height: 100px; height: 85px;
right: 0px; } right: 0px; }
DIV#calendarHeader DIV.calendarLabels,
DIV#calendarHeader DIV.dayLabels, DIV#calendarHeader DIV.dayLabels,
DIV#calendarHeader DIV.days DIV#calendarHeader DIV.days
{ position: absolute; { position: absolute;
@ -414,8 +415,16 @@ DIV#calendarHeader DIV.days
/* 'right' is computed from JS code when daysView is first drawn */ /* 'right' is computed from JS code when daysView is first drawn */
overflow: hidden; } overflow: hidden; }
DIV#calendarHeader DIV.calendarLabels
{ top: 11px;
height: 20px;
border-left: 1px solid #ccc;
text-align: center;
font-style:italic;
font-size:150%;
}
DIV#calendarHeader DIV.dayLabels DIV#calendarHeader DIV.dayLabels
{ top: 0px; { top: 32px;
height: 35px; } height: 35px; }
DIV#calendarHeader DIV.dayLabels DIV.day DIV#calendarHeader DIV.dayLabels DIV.day
@ -432,7 +441,11 @@ DIV#calendarHeader DIV.dayLabels
DIV#calendarHeader DIV.days DIV#calendarHeader DIV.days
{ cursor: pointer; { cursor: pointer;
bottom: 0px; bottom: 0px;
top: 35px; } top: 67px;
z-index:0;
border-bottom:1px solid #ccc;
background:white;
}
DIV#calendarHeader DIV.day, DIV#calendarHeader DIV.day,
DIV#daysView DIV.day DIV#daysView DIV.day
@ -530,7 +543,8 @@ DIV.monthView DIV.dayHeader
text-align: right; text-align: right;
cursor: pointer; cursor: pointer;
color: #666; color: #666;
-moz-user-select: none; } -moz-user-select: none;
}
DIV#monthDaysView DIV.selectedDay DIV.dayHeader DIV#monthDaysView DIV.selectedDay DIV.dayHeader
{ font-weight: bold; } { font-weight: bold; }
@ -540,7 +554,8 @@ DIV.monthView DIV.days
cursor: pointer; cursor: pointer;
bottom: 0px; bottom: 0px;
left: 0px; left: 0px;
right: 0px; } right: 0px;
}
DIV.monthView DIV.day DIV.monthView DIV.day
{ position: absolute; { position: absolute;
@ -1471,7 +1486,7 @@ DIV.event.draggable:hover DIV.rightDragGrip
#ghostEndHour #ghostEndHour
{ bottom: -14px; } { bottom: -14px; }
DIV#nowLineDisplay DIV.nowLineDisplay
{ position: relative; { position: relative;
width: 100%; width: 100%;
height: 2px; height: 2px;
@ -1486,3 +1501,38 @@ DIV#freeBusyReplicas DIV
{ display: inline-block; height: 2em; } { display: inline-block; height: 2em; }
TD.attendees A.button TD.attendees A.button
{ float: left; left: 19px; margin-top: 5px; } { float: left; left: 19px; margin-top: 5px; }
DIV#calendarContent .alert-box {
color:#555;
border-radius:10px;
font-family:Tahoma,Geneva,Arial,sans-serif;font-size:11px;
padding:10px 10px 10px 36px;
margin:10px;
}
DIV#calendarContent .alert-box span {
font-weight:bold;
text-transform:uppercase;
}
.error {
background:#ffecec url('error.png') no-repeat 10px 50%;
border:1px solid #f5aca6;
}
.success {
background:#e9ffd9 url('success.png') no-repeat 10px 50%;
border:1px solid #a6ca8a;
}
.warning {
background:#fff8c4 url('warning.png') no-repeat 10px 50%;
border:1px solid #f2c779;
}
.notice {
background:#e3f7fc url('notice.png') no-repeat 10px 50%;
border:1px solid #8ed9f6;
}

View file

@ -34,6 +34,8 @@ var categoriesStyleSheet = null;
var clipboard = null; var clipboard = null;
var eventsToCopy = []; var eventsToCopy = [];
// This should probably go in the generic.js
function printView() { function printView() {
window.open("printView","","width=660,height=470"); window.open("printView","","width=660,height=470");
@ -43,6 +45,9 @@ function printView() {
function newEvent(type, day, hour, duration) { function newEvent(type, day, hour, duration) {
var folder = null; var folder = null;
/* if (currentView == "multicolumndayview") {
Need to find where the click register is saved
}*/
if (UserDefaults['SOGoDefaultCalendar'] == 'personal') if (UserDefaults['SOGoDefaultCalendar'] == 'personal')
folder = $("calendarList").down("li"); folder = $("calendarList").down("li");
else if (UserDefaults['SOGoDefaultCalendar'] == 'first') { else if (UserDefaults['SOGoDefaultCalendar'] == 'first') {
@ -911,8 +916,8 @@ function onDaySelect(node) {
&& day != currentDay); && day != currentDay);
var td = $(node).getParentWithTagName("td"); var td = $(node).getParentWithTagName("td");
var table = $(td).getParentWithTagName("table");
// var table = $(td).getParentWithTagName("table");
// log ("table.selected: " + table.selected); // log ("table.selected: " + table.selected);
if (document.selectedDate) if (document.selectedDate)
@ -1589,7 +1594,7 @@ function refreshCalendarEvents(scrollEvent) {
if (!currentDay) if (!currentDay)
currentDay = todayDate.getDayString(); currentDay = todayDate.getDayString();
if (currentView == "dayview") { if (currentView == "dayview" || currentView == "multicolumndayview") {
sd = currentDay; sd = currentDay;
ed = sd; ed = sd;
} }
@ -1627,9 +1632,34 @@ function refreshCalendarEvents(scrollEvent) {
"scrollEvent": scrollEvent}); "scrollEvent": scrollEvent});
} }
function _parseEvents(list) { function _parseEvents(list, calendars) {
var newCalendarEvents = {}; var newCalendarEvents = {};
if (currentView == "multicolumndayview") {
var list;
for (var i = 0; i < calendars.length; i++) {
list = calendars[i][0];
for (var j = 0; j < list.length; j++) {
var event = list[j];
var cname = event[0];
var calendar = event[1];
// log("parsed cname: " + cname + "; calendar: " + calendar);
var calendarDict = newCalendarEvents[calendar];
if (!calendarDict) {
calendarDict = {};
newCalendarEvents[calendar] = calendarDict;
}
var occurences = calendarDict[cname];
if (!occurences) {
occurences = [];
calendarDict[cname] = occurences;
}
event.blocks = [];
occurences.push(event);
}
}
}
else {
for (var i = 0; i < list.length; i++) { for (var i = 0; i < list.length; i++) {
var event = list[i]; var event = list[i];
var cname = event[0]; var cname = event[0];
@ -1649,6 +1679,7 @@ function _parseEvents(list) {
occurences.push(event); occurences.push(event);
} }
}
return newCalendarEvents; return newCalendarEvents;
} }
@ -1681,14 +1712,27 @@ function refreshCalendarEventsCallback(http) {
&& http.status == 200) { && http.status == 200) {
if (http.responseText.length > 0) { if (http.responseText.length > 0) {
var eventsBlocks = http.responseText.evalJSON(true); var eventsBlocks = http.responseText.evalJSON(true);
calendarEvents = _parseEvents(eventsBlocks[0]);
if (currentView == "monthview") if (currentView == "multicolumndayview") {
_drawMonthCalendarEvents(eventsBlocks[2], eventsBlocks[0]); calendarEvents = _parseEvents(null, eventsBlocks);
_drawCalendarAllDayEvents(null, null, eventsBlocks);
_drawCalendarEvents(null, null, eventsBlocks);
for (var i = 0 ; i < eventsBlocks.length; i++) {
_setupEventsDragAndDrop(eventsBlocks[i][0]);
}
}
else { else {
_drawCalendarAllDayEvents(eventsBlocks[1], eventsBlocks[0]); calendarEvents = _parseEvents(eventsBlocks[0], null);
_drawCalendarEvents(eventsBlocks[2], eventsBlocks[0]); allDayEventsList = eventsBlocks[1];
eventsList = eventsBlocks[2];
if (currentView == "monthview")
_drawMonthCalendarEvents(eventsList, eventsBlocks[0], null);
else {
_drawCalendarAllDayEvents(allDayEventsList, eventsBlocks[0], null);
_drawCalendarEvents(eventsList, eventsBlocks[0], null);
} }
_setupEventsDragAndDrop(eventsBlocks[0]); _setupEventsDragAndDrop(eventsBlocks[0]);
}
resetCategoriesStyles(); resetCategoriesStyles();
onWindowResize(null); onWindowResize(null);
} }
@ -1851,9 +1895,26 @@ function newBaseEventDIV(eventRep, event, eventText) {
return eventCell; return eventCell;
} }
function _drawCalendarAllDayEvents(events, eventsData) { function _drawCalendarAllDayEvents(events, eventsData, columnsData) {
var headerView = $("calendarHeader"); var headerView = $("calendarHeader");
var subdivs = headerView.childNodesWithTag("div"); var subdivs = headerView.childNodesWithTag("div");
if (currentView == "multicolumndayview"){
var days = subdivs[2].childNodesWithTag("div");
for (var i = 0; i < days.length; i++) {
var parentDiv = days[i];
var calendar = columnsData[i];
var calendarAllDayEvents = calendar[1][0];
var calendarAllDayEventsData = calendar[0];
for (var j = 0; j < calendarAllDayEvents.length; j++) {
var eventRep = calendarAllDayEvents[j];
var nbr = eventRep.nbr;
var eventCell = newAllDayEventDIV(eventRep, calendarAllDayEventsData[nbr]);
parentDiv.appendChild(eventCell);
}
}
}
else {
var days = subdivs[1].childNodesWithTag("div"); var days = subdivs[1].childNodesWithTag("div");
for (var i = 0; i < days.length; i++) { for (var i = 0; i < days.length; i++) {
var parentDiv = days[i]; var parentDiv = days[i];
@ -1864,7 +1925,7 @@ function _drawCalendarAllDayEvents(events, eventsData) {
parentDiv.appendChild(eventCell); parentDiv.appendChild(eventCell);
} }
} }
}
resizeCalendarHeaderDIV(); resizeCalendarHeaderDIV();
} }
@ -1876,14 +1937,16 @@ function resizeCalendarHeaderDIV() {
var daysView = $("daysView"); var daysView = $("daysView");
if (headerView && daysView) { if (headerView && daysView) {
/* consts */ /* consts */
var headerViewBaseHeight = 70; var headerViewBaseHeight = 90;
var daysViewBaseTop = 120; var daysViewBaseTop = 95;
var maxDelta = 80;
/* /consts */ /* /consts */
var maxEventPerDay = 0; var maxEventPerDay = 0;
var subdivs = headerView.childNodesWithTag("div"); var subdivs = headerView.childNodesWithTag("div");
if (currentView == "multicolumndayview")
var days = subdivs[2].childNodesWithTag("div");
else
var days = subdivs[1].childNodesWithTag("div"); var days = subdivs[1].childNodesWithTag("div");
for (var i = 0; i < days.length; i++) { for (var i = 0; i < days.length; i++) {
var parentDiv = days[i]; var parentDiv = days[i];
@ -1892,16 +1955,31 @@ function resizeCalendarHeaderDIV() {
maxEventPerDay = divs.length; maxEventPerDay = divs.length;
} }
} }
if (maxEventPerDay > 0 && maxEventPerDay <= 4) {
if (maxEventPerDay > 2) { var moveDaysView = (maxEventPerDay * 19.5);
var delta = ((maxEventPerDay - 2) * 22) + 10; var expendHeaderHeight = ((maxEventPerDay - 1) * 20);
if (delta > maxDelta) { var deltaMax = 60;
delta = maxDelta; if (expendHeaderHeight > deltaMax){
expendHeaderHeight = deltaMax;
moveDaysView = deltaMax;
} }
daysView.style.top = String(delta + daysViewBaseTop) + "px"; daysView.style.top = String(daysViewBaseTop + moveDaysView) + "px";
headerView.style.height = String(delta + headerViewBaseHeight) + "px"; headerView.style.height = String(headerViewBaseHeight + expendHeaderHeight) + "px";
}
else if (maxEventPerDay > 4) {
var deltaMax = 60;
daysView.style.top = String(daysViewBaseTop + deltaMax + 19) + "px";
headerView.style.height = String(headerViewBaseHeight + deltaMax) + "px";
} }
else { else {
var headerDays = document.getElementsByClassName("days")[0];
headerDays.observe("mouseenter", function(event){
headerDays.style.zIndex = "1";
});
headerDays.observe("mouseleave", function(event){
headerDays.style.zIndex = "0";
});
daysView.style.top = null; daysView.style.top = null;
headerView.style.height = null; headerView.style.height = null;
} }
@ -1916,13 +1994,28 @@ function newAllDayEventDIV(eventRep, event) {
return eventCell; return eventCell;
} }
function _drawCalendarEvents(events, eventsData) { function _drawCalendarEvents(events, eventsData, columnsData) {
var daysView = $("daysView"); var daysView = $("daysView");
var subdivs = daysView.childNodesWithTag("div"); var subdivs = daysView.childNodesWithTag("div");
for (var i = 0; i < subdivs.length; i++) { for (var i = 0; i < subdivs.length; i++) {
var subdiv = subdivs[i]; var subdiv = subdivs[i];
if (subdiv.hasClassName("days")) { if (subdiv.hasClassName("days")) {
var days = subdiv.childNodesWithTag("div"); var days = subdiv.childNodesWithTag("div");
if (currentView == "multicolumndayview") {
for (var j = 0; j < days.length; j++) {
var parentDiv = days[j].childNodesWithTag("div")[0];
var calendar = columnsData[j];
var calendarEvents = calendar[2][0];
var calendarEventsData = calendar[0];
for (var k = 0; k < calendarEvents.length; k++) {
var eventRep = calendarEvents[k];
var nbr = eventRep.nbr;
var eventCell = newEventDIV(eventRep, calendarEventsData[nbr]);
parentDiv.appendChild(eventCell);
}
}
}
else {
for (var j = 0; j < days.length; j++) { for (var j = 0; j < days.length; j++) {
var parentDiv = days[j].childNodesWithTag("div")[0]; var parentDiv = days[j].childNodesWithTag("div")[0];
for (var k = 0; k < events[j].length; k++) { for (var k = 0; k < events[j].length; k++) {
@ -1934,6 +2027,7 @@ function _drawCalendarEvents(events, eventsData) {
} }
} }
} }
}
} }
function newEventDIV(eventRep, event) { function newEventDIV(eventRep, event) {
@ -2009,7 +2103,8 @@ function adjustCalendarHeaderDIV() {
var delta = ch.clientWidth - dv.clientWidth - 1; var delta = ch.clientWidth - dv.clientWidth - 1;
var styleElement = document.createElement("style"); var styleElement = document.createElement("style");
styleElement.type = "text/css"; styleElement.type = "text/css";
var selectors = ["DIV#calendarHeader DIV.dayLabels", var selectors = ["DIV#calendarHeader DIV.calendarLabels",
"DIV#calendarHeader DIV.dayLabels",
"DIV#calendarHeader DIV.days"]; "DIV#calendarHeader DIV.days"];
var rule = ("right: " + delta + "px"); var rule = ("right: " + delta + "px");
if (styleElement.styleSheet && styleElement.styleSheet.addRule) { if (styleElement.styleSheet && styleElement.styleSheet.addRule) {
@ -2026,6 +2121,37 @@ function adjustCalendarHeaderDIV() {
} }
} }
function adjustMultiColumnCalendarHeaderDIV() {
var ch = $("calendarHeader");
var calendarLabels = ch.getElementsByClassName("calendarLabels")[0];
var calendarsToDisplay = calendarLabels.getElementsByClassName("calendarsToDisplay");
var dayLabels = ch.getElementsByClassName("dayLabels")[0].getElementsByClassName("dayColumn")[0];
var days = ch.getElementsByClassName("days")[0].getElementsByClassName("dayColumn");
var daysView = $("daysView").getElementsByClassName("dayColumn");
var nbCalendars = calendarsToDisplay.length;
if (nbCalendars > 0) {
var width = 100/nbCalendars;
var left = 0;
var position = "absolute";
for(var i=0; i < nbCalendars; i++){
calendarsToDisplay[i].setStyle({ width: width + '%', left: left + '%', position: position}).show();
days[i].setStyle({ width: width + '%', left: left + '%'}).show();
daysView[i].setStyle({ width: width + '%', left: left + '%'}).show();
left += width;
}
dayLabels.setStyle({ width: '100%'}).show();
}
else {
$("calendarHeader").remove();
$("daysView").remove();
var htmlText = "<div class='alert-box notice'><span>" + _("notice:") + "</span>"+_("Please go ahead and select calendars")+"</div>";
$("calendarContent").innerHTML = htmlText;
}
}
function calendarDisplayCallback(http) { function calendarDisplayCallback(http) {
var div = $("calendarView"); var div = $("calendarView");
var daysView = $("daysView"); var daysView = $("daysView");
@ -2055,6 +2181,9 @@ function calendarDisplayCallback(http) {
if (http.callbackData["day"]) if (http.callbackData["day"])
currentDay = http.callbackData["day"]; currentDay = http.callbackData["day"];
if (currentView == "multicolumndayview")
adjustMultiColumnCalendarHeaderDIV();
// Initialize contextual menu // Initialize contextual menu
var menu = new Array(onMenuNewEventClick, var menu = new Array(onMenuNewEventClick,
onMenuNewTaskClick, onMenuNewTaskClick,
@ -2067,10 +2196,7 @@ function calendarDisplayCallback(http) {
onMenuRawEvent onMenuRawEvent
); );
var observer; var observer;
if (currentView == 'dayview') { if (currentView == 'dayview' || currentView == 'weekview' || currentView == 'multicolumndayview') {
observer = $("daysView");
}
else if (currentView == 'weekview') {
observer = $("daysView"); observer = $("daysView");
} }
else { else {
@ -3367,25 +3493,43 @@ function drawNowLine() {
d = "0" + d; d = "0" + d;
var day = today.getFullYear() + "" + m + "" + d; var day = today.getFullYear() + "" + m + "" + d;
var targets = $$("DIV#daysView DIV.days DIV.day[day=" + day var targets = $$("DIV#daysView DIV.days DIV.day[day=" + day
+ "] DIV.clickableHourCell"); + "] DIV.hourCells");
}
else if (currentView == "multicolumndayview") {
var targets = $$("DIV#daysView DIV.hourCells");
} }
else if (currentView == "weekview") else if (currentView == "weekview")
var targets = $$("DIV#daysView DIV.days DIV.dayOfToday DIV.clickableHourCell"); var targets = $$("DIV#daysView DIV.days DIV.dayOfToday DIV.hourCells");
if (targets) { if (targets[0]) {
var target = targets[hours]; if (currentView == "multicolumndayview") {
var nbCalendars = targets.length;
for(var i = 0; i < nbCalendars; i++){
var target = targets[i].getElementsByClassName("clickableHourCell")[hours];
if (target) { if (target) {
var div = $("nowLineDisplay"); var div = targets[i].getElementsByClassName("nowLineDisplay")[0];
if (!div) if (!div)
div = new Element("div", {'id': 'nowLineDisplay'}); div = new Element("div", {'class': 'nowLineDisplay'});
div.style.top = parseInt((minutes * target.offsetHeight / 60) - 1) + "px"; div.style.top = parseInt((minutes * target.offsetHeight / 60) - 1) + "px";
target.insertBefore(div, target.firstChild); target.insertBefore(div, target.firstChild);
setTimeout("drawNowLine ();", 60000); // 1 min.
} }
} }
}
else {
var target = targets[0].getElementsByClassName("clickableHourCell")[hours];
if (target) {
var div = targets[0].getElementsByClassName("nowLineDisplay")[0];
if (!div)
div = new Element("div", {'class': 'nowLineDisplay'});
div.style.top = parseInt((minutes * target.offsetHeight / 60) - 1) + "px";
target.insertBefore(div, target.firstChild);
}
}
setTimeout("drawNowLine ();", 60000); // 1 min.
}
} }
function onListCollapse(event, element) { function onListCollapse(event, element) {