Merge pull request #36 from alexcloutier/feat/calendarPrint

New print option in Calendar module
pull/40/head
Francis Lachapelle 2014-05-16 16:56:51 -04:00
commit 2df5887eec
14 changed files with 1712 additions and 223 deletions

View File

@ -35,7 +35,7 @@
{
NSArray *toolbarConfig;
NSArray *toolbarGroup;
NSString *toolbar;
NSString *toolbar;
NSDictionary *buttonInfo;
}
@ -60,7 +60,7 @@
[toolbarGroup release];
[toolbarConfig release];
[buttonInfo release];
[toolbar release];
[toolbar release];
[super dealloc];
}

View File

@ -5,6 +5,7 @@
"Create a new event" = "Create a new event";
"Create a new task" = "Create a new task";
"Edit this event or task" = "Edit this event or task";
"Print the current calendar view" = "Print the current calendar view";
"Delete this event or task" = "Delete this event or task";
"Go to today" = "Go to today";
"Switch to day view" = "Switch to day view";
@ -117,7 +118,7 @@
"Name of the Calendar" = "Name of the Calendar";
"new" = "New";
"printview" = "Print View";
"Print view" = "Print view";
"edit" = "Edit";
"delete" = "Delete";
"proposal" = "Proposal";
@ -145,6 +146,27 @@
"Hide already accepted and rejected appointments" = "Hide already accepted and rejected appointments";
"Show already accepted and rejected appointments" = "Show already accepted and rejected appointments";
/* Print view */
"LIST" = "List";
"Print Settings" = "Print Settings";
"Title:" = "Title:";
"Layout:" = "Layout:";
"What to Print" = "What to Print";
"Events" = "Events";
"Tasks" = "Tasks";
"Current view" = "Current View";
"Selected events and tasks" = "Selected events and tasks";
"Custom Date Range" = "Custom Date Range";
"From:" = "From:";
"To:" = "To:";
"Options" = "Options";
"Locale" = "Locale";
"GMT" = "GMT";
"Tasks with no due date" = "Tasks with no due date";
"Completed tasks" = "Completed Tasks";
"Display time:" = "Display Time:";
"Calendar:" = "Calendar:";
/* Appointments */

View File

@ -23,6 +23,7 @@ SchedulerUI_OBJC_FILES = \
UIxCalFolderActions.m \
\
UIxCalView.m \
UIxCalViewPrint.m \
UIxCalDayView.m \
UIxCalMulticolumnDayView.m \
UIxCalWeekView.m \

View File

@ -37,6 +37,12 @@
onclick = "return onMonthOverview();";
image = "month-view.png";
tooltip = "Switch to month view"; } ),
( { link = "#";
onclick = "return printView();";
cssClass = "tbicon_print single-window-not-conditional";
image = "tb-mail-print-flat-24x24.png";
label = "Print view";
tooltip = "Print the current calendar view"; } ),
( { link = "#";
label="Delete";
onclick = "return deleteEvent(this);";

View File

@ -0,0 +1,30 @@
/* UIxCalViewPrint.h - this file is part of SOGo
*
* Copyright (C) 2006-2014 Inverse inc.
*
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <SOGoUI/UIxComponent.h>
@interface UIxCalViewPrint : UIxComponent
{
id item;
}
@end

View File

@ -0,0 +1,82 @@
/* UIxCalViewPrint.m - this file is part of SOGo
*
* Copyright (C) 2006-2014 Inverse inc.
*
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSString.h>
#import <Foundation/NSArray.h>
#import <UIxCalViewPrint.h>
static NSArray *layoutItems = nil;
@implementation UIxCalViewPrint
+ (void) initialize
{
if (!layoutItems)
{
layoutItems = [NSArray arrayWithObjects: @"LIST", @"Daily", @"Weekly", nil];
[layoutItems retain];
}
}
- (id) init
{
item = nil;
return [super init];
}
- (void) dealloc
{
[item release];
[super dealloc];
}
/****************************************************************/
/* Interfacing; populating the popup list for the print layouts */
- (void) setItem: (NSString *) newItem
{
ASSIGN (item, newItem);
}
- (NSString *) item
{
return item;
}
- (NSArray *) printLayoutList
{
return layoutItems;
}
- (NSString *) itemPrintLayoutText
{
return [self labelForKey: [NSString stringWithFormat: item]];
}
- (NSString *) layoutSelectedByUser
{
return nil;
}
/******************************************************************/
/* */
@end

View File

@ -40,6 +40,11 @@
protectedBy = "View";
pageName = "UIxCalMainView";
};
printView = {
protectedBy = "<public>";
pageName = "UIxCalViewPrint";
actionClass = "UIxCalViewPrint";
};
addWebCalendar = {
protectedBy = "View";
actionClass = "UIxCalMainActions";

View File

@ -0,0 +1,109 @@
<?xml version='1.0'?>
<!DOCTYPE var:component>
<var:component
xmlns="http://www.w3.org/1999/xhtml"
xmlns:var="http://www.skyrix.com/od/binding"
xmlns:const="http://www.skyrix.com/od/constant"
xmlns:uix="OGo:uix"
xmlns:label="OGo:label"
className="UIxPageFrame"
const:popup="YES">
<div id="leftSide" class="no-print">
<!-- Print settings -->
<span class="caption"><var:string label:value="Print Settings" /></span>
<table class="frame">
<tr>
<td style="width: 30%;">
<label id="labelTitle"><var:string label:value="Title:" /></label></td>
<td>
<input type="text" id="inputFieldTitle" value="" /></td>
</tr>
<tr>
<td>
<label><var:string label:value="Layout:" /></label></td>
<td>
<var:popup list="printLayoutList" item="item"
const:id="printLayoutList"
string="itemPrintLayoutText" /></td>
</tr>
</table>
<!-- What to print -->
<span class="caption"><var:string label:value="What to Print" /></span>
<table class="frame">
<tr>
<td>
<label>
<input type="checkbox" id="printEvents" value="eventsSelected" checked="true" onChange="onEventsCheck(this);"/>
<var:string label:value="Events"/></label>
<label>
<input type="checkbox" id ="printTasks" value="tasksSelected" checked="true" onChange="onTasksCheck(this);"/>
<var:string label:value="Tasks"/></label></td></tr>
<!-- TODO
<tr>
<td>
<label>
<input type="radio" name="printView" id="currentView" value="currentViewSelected" checked="true" onChange="onPrintDateCheck();"/>
<var:string label:value="Current view" /></label></td></tr>
<tr>
<td>
<label>
<input type="radio" name="printView" id="eventsTasks" value="eventsTasksSelected" onChange="onPrintDateCheck();"/>
<var:string label:value="Selected events and tasks" /></label></td></tr>
<tr>
<td>
<label>
<input type="radio" name="printView" id="customDate" value="customDateSelected" onChange="onPrintDateCheck();" />
<var:string label:value="Custom date range" /></label></td></tr>
<tr>
<td id="dateRangeFrom" name="dateRange">
<label id="labelFrom"><var:string label:value="From:" /></label>
<var:component className="UIxDatePicker"
const:dateID="startingDate"
day="startDay"
month="startMonth"
year="startYear"
label:label="Select starting date"/></td></tr>
<tr>
<td id="dateRangeTo" name="dateRange">
<label id="labelTo"><var:string label:value="To:" /></label>
<var:component className="UIxDatePicker"
const:dateID="endingDate"
day="endDay"
month="endMonth"
year="endYear"
label:label="Select ending date"/></td></tr>
-->
</table>
<!-- Options -->
<span class="caption"><var:string label:value="Options" /></span>
<table class="frame">
<tr>
<td>
<label>
<input type="checkbox" name="printOptions" id="selectNoDueDateTasks" checked="true" onChange="onPrintNoDueDateTasksCheck(this);" />
<var:string label:value="Tasks with no due date" /></label></td></tr>
<tr>
<td>
<label>
<input type="checkbox" name="printOptions" id="selectCompletedTasks" checked="true" onChange="onPrintCompletedTasksCheck(this);" />
<var:string label:value="Completed tasks" /></label></td></tr>
</table>
</div>
<div id="rightSide">
<div id="rightFrame">
<div id="rightFrameTitle"><!-- Spacer --></div>
<div id="rightFrameEvents"><!-- Spacer --></div>
<div id="rightFrameTasks"><!-- Spacer --></div>
</div>
<div id="printButtons" class="no-print">
<a class="button" name="print" id="printButton">
<span><var:string label:value="Print" /></span></a>
<a class="button" name="cancel" id="cancelButton">
<span><var:string label:value="Cancel"/></span></a>
</div>
</div>
</var:component>

View File

@ -6,195 +6,155 @@
xmlns:var="http://www.skyrix.com/od/binding"
xmlns:const="http://www.skyrix.com/od/constant"
xmlns:rsrc="OGo:url"
xmlns:label="OGo:label"
><var:string var:value="doctype" const:escapeHTML="NO" />
<var:if condition="hideFrame" const:negate="YES"
><html const:xmlns="http://www.w3.org/1999/xhtml"
xml:lang="en" const:lang="en">
xmlns:label="OGo:label">
<var:string var:value="doctype" const:escapeHTML="NO" />
<var:if condition="hideFrame" const:negate="YES">
<html const:xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" const:lang="en">
<!-- head -->
<head>
<title>
<var:string value="title"/>
</title>
<meta name="hideFrame" var:content="hideFrame" />
<meta name="description" content="SOGo Web Interface" />
<meta name="author" content="SKYRIX Software AG/Inverse inc." />
<meta name="robots" content="stop" />
<meta name="build" var:content="buildDate" />
<link href="mailto:support@inverse.ca" rev="made" />
<link rel="shortcut icon" var:href="siteFavicon" type="image/x-icon" />
<link type="text/css" rel="stylesheet" rsrc:href="generic.css" />
<link type="text/css" rel="stylesheet" rsrc:href="dtree.css" />
<var:if condition="hasProductSpecificCSS"
><link type="text/css" rel="stylesheet" var:href="productCSSURL"
/></var:if>
<var:if condition="hasPageSpecificCSS"
><link type="text/css" rel="stylesheet" var:href="pageCSSURL"
/></var:if>
<var:foreach list="additionalCSSFiles" item="item"
><link type="text/css" rel="stylesheet" var:href="item"
/>
</var:foreach>
<var:if-ie const:lte="9"
><link type="text/css" rel="stylesheet" rsrc:href="iefixes.css"/>
<title>
<var:string value="title"/></title>
<meta name="hideFrame" var:content="hideFrame" />
<meta name="description" content="SOGo Web Interface" />
<meta name="author" content="SKYRIX Software AG/Inverse inc." />
<meta name="robots" content="stop" />
<meta name="build" var:content="buildDate" />
<link href="mailto:support@inverse.ca" rev="made" />
<link rel="shortcut icon" var:href="siteFavicon" type="image/x-icon" />
<link type="text/css" rel="stylesheet" rsrc:href="generic.css" />
<link type="text/css" rel="stylesheet" rsrc:href="dtree.css" />
<var:if condition="hasProductSpecificCSS">
<link type="text/css" rel="stylesheet" var:href="productCSSURL"/></var:if>
<var:if condition="hasPageSpecificCSS">
<link type="text/css" rel="stylesheet" var:href="pageCSSURL"/></var:if>
<var:foreach list="additionalCSSFiles" item="item">
<link type="text/css" rel="stylesheet" var:href="item"/></var:foreach>
<var:if-ie const:lte="9">
<link type="text/css" rel="stylesheet" rsrc:href="iefixes.css"/>
<script type="text/javascript" rsrc:src="XMLHttpRequest.js"><!-- space --></script>
</var:if-ie>
</var:if-ie>
</head>
<body var:class="bodyClasses"
><var:if condition="isCompatibleBrowser"
><var:if condition="singleWindowModeEnabled"
><div id="popupFrame" style="display: none;"><iframe width="100%" height="100%" src="/SOGo/loading"><!-- space --></iframe></div></var:if
><var:if condition="shortUserNameForDisplay" const:value="anonymous"
const:negate="YES"><var:if condition="hasUserSettingsKeys"
><script type="text/javascript">
var UserSettings = <var:string value="userSettings" const:escapeHTML="NO"/>;
</script
></var:if><var:if condition="hasUserDefaultsKeys">
<!-- Body -->
<body var:class="bodyClasses">
<var:if condition="isCompatibleBrowser">
<var:if condition="singleWindowModeEnabled">
<div id="popupFrame" style="display: none;">
<iframe width="100%" height="100%" src="/SOGo/loading"><!-- space --></iframe></div></var:if>
<var:if condition="shortUserNameForDisplay" const:value="anonymous" const:negate="YES">
<var:if condition="hasUserSettingsKeys">
<script type="text/javascript">
var UserDefaults = <var:string value="userDefaults" const:escapeHTML="NO"/>;
</script
></var:if
></var:if
><var:if condition="isPopup" const:negate="YES"
><var:if condition="isUIxDebugEnabled"
><div id="logConsole"><!-- space --></div></var:if>
var UserSettings = <var:string value="userSettings" const:escapeHTML="NO"/>;</script></var:if>
<var:if condition="hasUserDefaultsKeys">
<script type="text/javascript">
var UserDefaults = <var:string value="userDefaults" const:escapeHTML="NO"/>;</script></var:if></var:if>
<var:if condition="isPopup" const:negate="YES">
<var:if condition="isUIxDebugEnabled">
<div id="logConsole"><!-- space --></div></var:if>
<!-- Link banner -->
<div id="linkBanner" class="linkbanner">
<var:if condition="canLogoff"
><a id="logoff" var:href="logoffPath"
><var:string label:value="Disconnect"/> </a
><span id="userIdentificationDisplay">
<var:if condition="userHasVacationEnabled"><img rsrc:src="status.vacation-msg.png" label:title="Vacation message is enabled" /></var:if>
<var:string var:value="userIdentification"/></span
></var:if>
<var:if condition="userHasCalendarAccess">
<var:if condition="isCalendar">
<span class="active"><var:string label:value="Calendar"
/></span>
</var:if>
<var:if condition="isCalendar" const:negate="YES">
<a id="calendarBannerLink"
var:href="relativeCalendarPath"
><var:string label:value="Calendar" /></a>
</var:if>
<var:if condition="canLogoff">
<a id="logoff" var:href="logoffPath">
<var:string label:value="Disconnect"/></a>
<span id="userIdentificationDisplay">
<var:if condition="userHasVacationEnabled">
<img rsrc:src="status.vacation-msg.png" label:title="Vacation message is enabled" /></var:if>
<var:string var:value="userIdentification"/></span></var:if>
<var:if condition="userHasCalendarAccess">
<var:if condition="isCalendar">
<span class="active"><var:string label:value="Calendar"/><!-- space --></span></var:if>
<var:if condition="isCalendar" const:negate="YES">
<a id="calendarBannerLink" var:href="relativeCalendarPath">
<var:string label:value="Calendar" /></a></var:if></var:if>
<var:if condition="isContacts">
<span class="active"><var:string label:value="Address Book"/><!-- space --></span></var:if>
<var:if condition="isContacts" const:negate="YES">
<a id="contactsBannerLink" var:href="relativeContactsPath">
<var:string label:value="Address Book" /></a></var:if>
<var:if condition="userHasMailAccess">
<var:if condition="isMail">
<span class="active"><var:string label:value="Mail"/><!-- space --></span></var:if>
<var:if condition="isMail" const:negate="YES">
<a id="mailBannerLink" var:href="relativeMailPath">
<var:string label:value="Mail" /></a></var:if></var:if>
<a id="preferencesBannerLink" var:href="relativePreferencesPath">
<var:string label:value="Preferences" /></a>
<var:if condition="isSuperUser">
<var:if condition="isAdministration">
<span class="active"><var:string label:value="Administration"/></span></var:if>
<var:if condition="isAdministration" const:negate="YES">
<a id="administrationBannerLink" var:href="relativeAdministrationPath">
<var:string label:value="Administration" /></a></var:if></var:if>
<var:if condition="isUIxDebugEnabled">
<a id="consoleBannerLink" href="#">
<var:string label:value="Log Console (dev.)" /></a></var:if></div></var:if>
<!-- ToolBar -->
<var:component className="UIxToolbar" var:toolbar="toolbar" />
</var:if>
<var:if condition="isContacts">
<span class="active"><var:string label:value="Address Book"
/></span>
</var:if>
<var:if condition="isContacts" const:negate="YES">
<a id="contactsBannerLink"
var:href="relativeContactsPath"
><var:string label:value="Address Book" /></a>
</var:if>
<var:if condition="userHasMailAccess">
<var:if condition="isMail">
<span class="active"><var:string label:value="Mail"
/></span>
</var:if>
<var:if condition="isMail" const:negate="YES">
<a id="mailBannerLink" var:href="relativeMailPath"
><var:string label:value="Mail" /></a>
</var:if>
</var:if>
<a id="preferencesBannerLink"
var:href="relativePreferencesPath"
><var:string label:value="Preferences" /></a>
<var:if condition="isSuperUser">
<var:if condition="isAdministration">
<span class="active"><var:string label:value="Administration"
/></span>
</var:if>
<var:if condition="isAdministration" const:negate="YES">
<a id="administrationBannerLink" var:href="relativeAdministrationPath"
><var:string label:value="Administration" /></a>
</var:if>
</var:if>
<var:if condition="isUIxDebugEnabled"
> <a id="consoleBannerLink"
href="#"><var:string
label:value="Log Console (dev.)" /></a
></var:if>
</div>
</var:if
><var:component className="UIxToolbar" var:toolbar="toolbar"
/>
<div id="pageContent"><var:component-content/></div>
<div id="javascriptSafetyNet"><!-- space --></div>
<script type="text/javascript">
var ApplicationBaseURL = '<var:string value="modulePath"/>';
var ResourcesURL = '<var:string value="applicationPath"/>.woa/WebServerResources';
var minimumSearchLength = <var:string value="minimumSearchLength"/>;
<var:if condition="isSuperUser"
>var IsSuperUser = true;
</var:if>
<var:if condition="isSuperUser" const:negate="YES"
>var IsSuperUser = false;
</var:if>
<var:if condition="usesCASAuthentication"
>var usesCASAuthentication = true;
</var:if>
<var:if condition="usesCASAuthentication" const:negate="YES"
>var usesCASAuthentication = false;
</var:if>
<var:if condition="shortUserNameForDisplay" const:value="anonymous"
const:negate="YES"
>var UserFolderURL = '<var:string value="userFolderPath" const:escapeHTML="NO"/>';
var UserLogin = '<var:string value="shortUserNameForDisplay" const:escapeHTML="NO"/>';
var UserLanguage = '<var:string value="userLanguage" const:escapeHTML="NO"/>';
</var:if>
<var:string value="commonLocalizableStrings" const:escapeHTML="NO"/>
<var:string value="productLocalizableStrings" const:escapeHTML="NO"/>
</script>
<script type="text/javascript" rsrc:src="prototype.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="jquery.js"><!-- space --></script>
<!-- Page Content -->
<div id="pageContent"><var:component-content/><!-- space --></div>
<div id="javascriptSafetyNet"><!-- space --></div>
<script type="text/javascript">
var ApplicationBaseURL = '<var:string value="modulePath"/>';
var ResourcesURL = '<var:string value="applicationPath"/>.woa/WebServerResources';
var minimumSearchLength = <var:string value="minimumSearchLength"/>;
<var:if condition="isSuperUser">
var IsSuperUser = true;</var:if>
<var:if condition="isSuperUser" const:negate="YES">
var IsSuperUser = false;</var:if>
<var:if condition="usesCASAuthentication">
var usesCASAuthentication = true;</var:if>
<var:if condition="usesCASAuthentication" const:negate="YES">
var usesCASAuthentication = false;</var:if>
<var:if condition="shortUserNameForDisplay" const:value="anonymous" const:negate="YES">
var UserFolderURL = '<var:string value="userFolderPath" const:escapeHTML="NO"/>';
var UserLogin = '<var:string value="shortUserNameForDisplay" const:escapeHTML="NO"/>';
var UserLanguage = '<var:string value="userLanguage" const:escapeHTML="NO"/>'; </var:if>
<var:string value="commonLocalizableStrings" const:escapeHTML="NO"/>
<var:string value="productLocalizableStrings" const:escapeHTML="NO"/></script>
<script type="text/javascript" rsrc:src="prototype.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="jquery.js"><!-- space --></script>
<script>jQuery.noConflict();</script>
<script type="text/javascript" rsrc:src="tablekit.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="tablekit-trueresize.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="tablekit-sogo.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="JavascriptAPIExtensions.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="HTMLElement.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="HTMLInputElement.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="HTMLTableElement.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="generic.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="SOGoDragHandles.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="SOGoTabsController.js"><!-- space --></script>
<var:if condition="hasProductSpecificJavaScript"><script type="text/javascript"
var:src="productJavaScriptURL"><!-- space --></script></var:if>
<var:if condition="hasPageSpecificJavaScript"><script type="text/javascript"
var:src="pageJavaScriptURL"><!-- space --></script></var:if>
<var:foreach list="additionalJSFiles" item="item"
><script type="text/javascript" var:src="item"><!-- space --></script>
</var:foreach>
<var:foreach list="systemAdditionalJSFiles" item="item"
><script type="text/javascript" var:src="item"><!-- space --></script>
</var:foreach>
</var:if>
<var:if condition="isCompatibleBrowser" const:negate="YES"
><var:component className="SOGoBrowsersPanel"
/></var:if>
<noscript>
<div class="javascriptPopupBackground">
</div>
<div class="javascriptMessagePseudoWindow noJavascriptErrorMessage">
<var:string label:value="noJavascriptError"
/><br /><br
/><a class="button" var:href="page.context.uri"
><var:string label:value="noJavascriptRetry"
/></a>
</div>
</noscript>
<script type="text/javascript" rsrc:src="tablekit.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="tablekit-trueresize.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="tablekit-sogo.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="JavascriptAPIExtensions.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="HTMLElement.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="HTMLInputElement.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="HTMLTableElement.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="generic.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="SOGoDragHandles.js"><!-- space --></script>
<script type="text/javascript" rsrc:src="SOGoTabsController.js"><!-- space --></script>
<var:if condition="hasProductSpecificJavaScript">
<script type="text/javascript" var:src="productJavaScriptURL"><!-- space --></script></var:if>
<var:if condition="hasPageSpecificJavaScript">
<script type="text/javascript" var:src="pageJavaScriptURL"><!-- space --></script></var:if>
<var:foreach list="additionalJSFiles" item="item">
<script type="text/javascript" var:src="item"><!-- space --></script></var:foreach>
<var:foreach list="systemAdditionalJSFiles" item="item">
<script type="text/javascript" var:src="item"><!-- space --></script></var:foreach></var:if>
<var:if condition="isCompatibleBrowser" const:negate="YES">
<var:component className="SOGoBrowsersPanel"/></var:if>
<noscript>
<div class="javascriptPopupBackground"><!-- space --></div>
<div class="javascriptMessagePseudoWindow noJavascriptErrorMessage">
<var:string label:value="noJavascriptError"/><br /><br/>
<a class="button" var:href="page.context.uri">
<var:string label:value="noJavascriptRetry"/></a></div></noscript>
</body>
</html>
</var:if>
<var:if condition="hideFrame">
<var:component-content />
</var:if>
<var:component-content /></var:if>
</container>

View File

@ -7,45 +7,36 @@
xmlns:label="OGo:label"
xmlns:so="http://www.skyrix.com/od/so-lookup">
<div id="toolbar" class="toolbar">
<var:foreach list="toolbarConfig" item="toolbarGroup"
><var:foreach list="toolbarGroup" item="buttonInfo"
><var:if condition="isButtonEnabled"
><a var:class="cssClasses"
<var:foreach list="toolbarConfig" item="toolbarGroup">
<var:foreach list="toolbarGroup" item="buttonInfo">
<var:if condition="isButtonEnabled">
<a var:class="cssClasses"
var:href="buttonInfo.link"
var:target="buttonInfo.target"
var:onclick="buttonInfo.onclick"
var:title="buttonTooltip"
><span><img class="buttonImage"
var:src="buttonImage"
var:alt="buttonTooltip"
/><var:if condition="hasMenu"
><img class="buttonMenuArrow"
rsrc:src="arrow-dwn-sharp.gif"
var:alt="buttonTooltip"
/></var:if
><br/><var:string value="buttonLabel"
/></span>
</a></var:if
><var:if condition="isButtonEnabled"
const:negate="YES"
><span var:class="cssClasses"
><img class="buttonImage"
var:title="buttonTooltip">
<span><img class="buttonImage"
var:src="buttonImage"
var:alt="buttonTooltip"
/><br
/><span class="buttonLabel"
><var:string
value="buttonLabel"
/></span
></span
></var:if
></var:foreach>
<var:if condition="isLastGroup" const:negate="YES"
><span class="toolbarSeparator"
><var:entity const:name="nbsp"
/></span
></var:if>
</var:foreach>
<img id="progressIndicator" rsrc:src="busy.gif" />
var:alt="buttonTooltip"/>
<var:if condition="hasMenu">
<img class="buttonMenuArrow"
rsrc:src="arrow-dwn-sharp.gif"
var:alt="buttonTooltip"/></var:if><br/>
<var:string value="buttonLabel"/></span></a></var:if>
<var:if condition="isButtonEnabled" const:negate="YES">
<span var:class="cssClasses">
<img class="buttonImage"
var:src="buttonImage"
var:alt="buttonTooltip"/><br/>
<span class="buttonLabel">
<var:string value="buttonLabel"/></span></span></var:if></var:foreach>
<var:if condition="isLastGroup" const:negate="YES">
<span class="toolbarSeparator">
<var:entity const:name="nbsp"/></span></var:if></var:foreach>
<img id="progressIndicator" rsrc:src="busy.gif" />
</div>
</var:if>

View File

@ -464,9 +464,11 @@ DIV.eventView
/* new draggable presentation */
DIV#daysView DIV.hours
{ position: absolute;
{ display: inline-block;
position: relative;
float: left;
top: 0px;
left: 0px;
left: 0;
height: 960px;
width: 50px; }
@ -484,6 +486,9 @@ DIV#daysView DIV.hour
DIV#daysView DIV.days
{ position: relative;
left: 0;
right: 0;
top: 0;
margin-left: 50px; }
DIV.multicolumnDayView DIV.lastDayUser
@ -684,8 +689,7 @@ DIV.daysViewFor7Days DIV.day5
DIV.monthView DIV.day6,
DIV.daysViewFor7Days DIV.day6
{ left: 85.7142%;
border-right: 1px solid #909090; }
{ left: 85.7142%; }
/* "left" and "width" for #daysView DIV.event are computed in JS code */
#daysView DIV.event

View File

@ -34,6 +34,13 @@ var categoriesStyleSheet = null;
var clipboard = null;
var eventsToCopy = [];
function printView() {
window.open("printView","","width=660,height=470");
return false; /* stop following the link */
}
function newEvent(type, day, hour, duration) {
var folder = null;
if (UserDefaults['SOGoDefaultCalendar'] == 'personal')

View File

@ -0,0 +1,605 @@
/********** Window & layouts **********/
BODY {
top: 1em;
bottom: 1em;
right: 1em;
left: 1em;
overflow:auto;
}
.toolbar {
display:none;
}
DIV#leftSide {
position: absolute;
top:0;
bottom:0;
left:0;
right:0;
max-width:220px;
overflow-y:auto;
}
DIV.colorBox {
display: inline-block;
}
TD DIV.colorBox, TD DIV.colorBox:hover {
border-color: #fff;
}
TABLE#eventsList .colorBox {
margin-right: 4px;
}
/********** Print settings **********/
INPUT#inputFieldTitle {
width:120px;
}
DIV#rightFrameTitle {
font-size:20px;
text-decoration:underline;
}
/********** What to print **********/
/********** Buttons **********/
#printButtons {
position:absolute;
bottom:0;
right:0;
}
#printButton {
font-weight:bold;
}
/********** RightSide **********/
.divEventsPreview, .divTasksPreview {
border:solid black 2px;
border-radius:5px;
margin-top:3px;
}
.eventsTitle, .tasksTitle {
text-align:center;
}
.overdueTasks {
color:red;
text-align:center;
}
.completedTasks {
font-style:italic;
text-align:center;
}
DIV#rightSide {
position: absolute;
left:230px;
top:0;
bottom:0;
right:0;
}
DIV#rightFrame {
position:absolute;
right:0;
left:0;
top:12px;
bottom:30px;
background-color:#FFFFFF;
border-radius:5px;
border-top: 1px solid #909090;
border-left: 1px solid #909090;
border-bottom: 1px solid #FFFFFF;
border-right: 1px solid #FFFFFF;
padding-left:5px;
padding-right:5px;
overflow-y:auto;
}
#rightFrameEvents {
width:49.5%;
float:left;
}
#rightFrameTasks {
width:49.5%;
float:right;
}
DIV#rightFrame TH {
text-align: left;
}
DIV#rightFrame TD.label {
color: #666;
text-align: right;
width: 30%;
}
/********** Overriding SchedulerUI.css **********/
DIV#calendarHeader {
position:relative;
top:0;
height:70px;
right: 0px;
}
DIV#calendarHeader DIV.dayLabels,
DIV#calendarHeader DIV.days {
position:relative;
left: 0;
margin-left:50px;
}
DIV#calendarHeader DIV.days {
top: 0;
height: 33px;
left: 0;
right: 0;
}
DIV#daysView {
position: relative;
top: 0;
right: 8px;
border-right: 1px solid #ccc;
}
DIV#daysView DIV.hours {
height: auto;
}
DIV#daysView DIV.day DIV.clickableHourCell {
height: 29px;
}
DIV#daysView DIV.hour {
height: 27px;
}
.minutes15, .minutes30, .minutes45 {
height: 25%;
}
DIV.event {
z-index:1;
border:solid black 1px;
background-color:white;
border-radius:5px;
}
DIV#daysView DIV.event.starts0
{ top: 0px; }
DIV#daysView DIV.event.lasts0
{ height: 0px; }
DIV#daysView DIV.event.starts1
{ top: 7.5px; }
DIV#daysView DIV.event.lasts1
{ height: 7.25px; }
DIV#daysView DIV.event.starts2
{ top: 15.0px; }
DIV#daysView DIV.event.lasts2
{ height: 14.5px; }
DIV#daysView DIV.event.starts3
{ top: 22.5px; }
DIV#daysView DIV.event.lasts3
{ height: 21.75px; }
DIV#daysView DIV.event.starts4
{ top: 30.0px; }
DIV#daysView DIV.event.lasts4
{ height: 29.0px; }
DIV#daysView DIV.event.starts5
{ top: 37.5px; }
DIV#daysView DIV.event.lasts5
{ height: 36.25px; }
DIV#daysView DIV.event.starts6
{ top: 45.0px; }
DIV#daysView DIV.event.lasts6
{ height: 43.5px; }
DIV#daysView DIV.event.starts7
{ top: 52.5px; }
DIV#daysView DIV.event.lasts7
{ height: 50.75px; }
DIV#daysView DIV.event.starts8
{ top: 60.0px; }
DIV#daysView DIV.event.lasts8
{ height: 58.0px; }
DIV#daysView DIV.event.starts9
{ top: 67.5px; }
DIV#daysView DIV.event.lasts9
{ height: 65.25px; }
DIV#daysView DIV.event.starts10
{ top: 75.0px; }
DIV#daysView DIV.event.lasts10
{ height: 72.5px; }
DIV#daysView DIV.event.starts11
{ top: 82.5px; }
DIV#daysView DIV.event.lasts11
{ height: 79.75px; }
DIV#daysView DIV.event.starts12
{ top: 90.0px; }
DIV#daysView DIV.event.lasts12
{ height: 87.0px; }
DIV#daysView DIV.event.starts13
{ top: 97.5px; }
DIV#daysView DIV.event.lasts13
{ height: 94.25px; }
DIV#daysView DIV.event.starts14
{ top: 105.0px; }
DIV#daysView DIV.event.lasts14
{ height: 101.5px; }
DIV#daysView DIV.event.starts15
{ top: 112.5px; }
DIV#daysView DIV.event.lasts15
{ height: 108.75px; }
DIV#daysView DIV.event.starts16
{ top: 120.0px; }
DIV#daysView DIV.event.lasts16
{ height: 116.0px; }
DIV#daysView DIV.event.starts17
{ top: 127.5px; }
DIV#daysView DIV.event.lasts17
{ height: 123.25px; }
DIV#daysView DIV.event.starts18
{ top: 135.0px; }
DIV#daysView DIV.event.lasts18
{ height: 130.5px; }
DIV#daysView DIV.event.starts19
{ top: 142.5px; }
DIV#daysView DIV.event.lasts19
{ height: 137.75px; }
DIV#daysView DIV.event.starts20
{ top: 150.0px; }
DIV#daysView DIV.event.lasts20
{ height: 145.0px; }
DIV#daysView DIV.event.starts21
{ top: 157.5px; }
DIV#daysView DIV.event.lasts21
{ height: 152.25px; }
DIV#daysView DIV.event.starts22
{ top: 165.0px; }
DIV#daysView DIV.event.lasts22
{ height: 159.5px; }
DIV#daysView DIV.event.starts23
{ top: 172.5px; }
DIV#daysView DIV.event.lasts23
{ height: 166.75px; }
DIV#daysView DIV.event.starts24
{ top: 180.0px; }
DIV#daysView DIV.event.lasts24
{ height: 174.0px; }
DIV#daysView DIV.event.starts25
{ top: 187.5px; }
DIV#daysView DIV.event.lasts25
{ height: 181.25px; }
DIV#daysView DIV.event.starts26
{ top: 195.0px; }
DIV#daysView DIV.event.lasts26
{ height: 188.5px; }
DIV#daysView DIV.event.starts27
{ top: 202.5px; }
DIV#daysView DIV.event.lasts27
{ height: 195.75px; }
DIV#daysView DIV.event.starts28
{ top: 210.0px; }
DIV#daysView DIV.event.lasts28
{ height: 203.0px; }
DIV#daysView DIV.event.starts29
{ top: 217.5px; }
DIV#daysView DIV.event.lasts29
{ height: 210.25px; }
DIV#daysView DIV.event.starts30
{ top: 225.0px; }
DIV#daysView DIV.event.lasts30
{ height: 217.5px; }
DIV#daysView DIV.event.starts31
{ top: 232.5px; }
DIV#daysView DIV.event.lasts31
{ height: 224.75px; }
DIV#daysView DIV.event.starts32
{ top: 240.0px; }
DIV#daysView DIV.event.lasts32
{ height: 232.0px; }
DIV#daysView DIV.event.starts33
{ top: 247.5px; }
DIV#daysView DIV.event.lasts33
{ height: 239.25px; }
DIV#daysView DIV.event.starts34
{ top: 255.0px; }
DIV#daysView DIV.event.lasts34
{ height: 246.5px; }
DIV#daysView DIV.event.starts35
{ top: 262.5px; }
DIV#daysView DIV.event.lasts35
{ height: 253.75px; }
DIV#daysView DIV.event.starts36
{ top: 270.0px; }
DIV#daysView DIV.event.lasts36
{ height: 261.0px; }
DIV#daysView DIV.event.starts37
{ top: 277.5px; }
DIV#daysView DIV.event.lasts37
{ height: 268.25px; }
DIV#daysView DIV.event.starts38
{ top: 285.0px; }
DIV#daysView DIV.event.lasts38
{ height: 275.5px; }
DIV#daysView DIV.event.starts39
{ top: 292.5px; }
DIV#daysView DIV.event.lasts39
{ height: 282.75px; }
DIV#daysView DIV.event.starts40
{ top: 300.0px; }
DIV#daysView DIV.event.lasts40
{ height: 290.0px; }
DIV#daysView DIV.event.starts41
{ top: 307.5px; }
DIV#daysView DIV.event.lasts41
{ height: 297.25px; }
DIV#daysView DIV.event.starts42
{ top: 315.0px; }
DIV#daysView DIV.event.lasts42
{ height: 304.5px; }
DIV#daysView DIV.event.starts43
{ top: 322.5px; }
DIV#daysView DIV.event.lasts43
{ height: 311.75px; }
DIV#daysView DIV.event.starts44
{ top: 330.0px; }
DIV#daysView DIV.event.lasts44
{ height: 319.0px; }
DIV#daysView DIV.event.starts45
{ top: 337.5px; }
DIV#daysView DIV.event.lasts45
{ height: 326.25px; }
DIV#daysView DIV.event.starts46
{ top: 345.0px; }
DIV#daysView DIV.event.lasts46
{ height: 333.5px; }
DIV#daysView DIV.event.starts47
{ top: 352.5px; }
DIV#daysView DIV.event.lasts47
{ height: 340.75px; }
DIV#daysView DIV.event.starts48
{ top: 360.0px; }
DIV#daysView DIV.event.lasts48
{ height: 348.0px; }
DIV#daysView DIV.event.starts49
{ top: 367.5px; }
DIV#daysView DIV.event.lasts49
{ height: 355.25px; }
DIV#daysView DIV.event.starts50
{ top: 375.0px; }
DIV#daysView DIV.event.lasts50
{ height: 362.5px; }
DIV#daysView DIV.event.starts51
{ top: 382.5px; }
DIV#daysView DIV.event.lasts51
{ height: 369.75px; }
DIV#daysView DIV.event.starts52
{ top: 390.0px; }
DIV#daysView DIV.event.lasts52
{ height: 377.0px; }
DIV#daysView DIV.event.starts53
{ top: 397.5px; }
DIV#daysView DIV.event.lasts53
{ height: 384.25px; }
DIV#daysView DIV.event.starts54
{ top: 405.0px; }
DIV#daysView DIV.event.lasts54
{ height: 391.5px; }
DIV#daysView DIV.event.starts55
{ top: 412.5px; }
DIV#daysView DIV.event.lasts55
{ height: 398.75px; }
DIV#daysView DIV.event.starts56
{ top: 420.0px; }
DIV#daysView DIV.event.lasts56
{ height: 406.0px; }
DIV#daysView DIV.event.starts57
{ top: 427.5px; }
DIV#daysView DIV.event.lasts57
{ height: 413.25px; }
DIV#daysView DIV.event.starts58
{ top: 435.0px; }
DIV#daysView DIV.event.lasts58
{ height: 420.5px; }
DIV#daysView DIV.event.starts59
{ top: 442.5px; }
DIV#daysView DIV.event.lasts59
{ height: 427.75px; }
DIV#daysView DIV.event.starts60
{ top: 450.0px; }
DIV#daysView DIV.event.lasts60
{ height: 435.0px; }
DIV#daysView DIV.event.starts61
{ top: 457.5px; }
DIV#daysView DIV.event.lasts61
{ height: 442.25px; }
DIV#daysView DIV.event.starts62
{ top: 465.0px; }
DIV#daysView DIV.event.lasts62
{ height: 449.5px; }
DIV#daysView DIV.event.starts63
{ top: 472.5px; }
DIV#daysView DIV.event.lasts63
{ height: 456.75px; }
DIV#daysView DIV.event.starts64
{ top: 480.0px; }
DIV#daysView DIV.event.lasts64
{ height: 464.0px; }
DIV#daysView DIV.event.starts65
{ top: 487.5px; }
DIV#daysView DIV.event.lasts65
{ height: 471.25px; }
DIV#daysView DIV.event.starts66
{ top: 495.0px; }
DIV#daysView DIV.event.lasts66
{ height: 478.5px; }
DIV#daysView DIV.event.starts67
{ top: 502.5px; }
DIV#daysView DIV.event.lasts67
{ height: 485.75px; }
DIV#daysView DIV.event.starts68
{ top: 510.0px; }
DIV#daysView DIV.event.lasts68
{ height: 493.0px; }
DIV#daysView DIV.event.starts69
{ top: 517.5px; }
DIV#daysView DIV.event.lasts69
{ height: 500.25px; }
DIV#daysView DIV.event.starts70
{ top: 525.0px; }
DIV#daysView DIV.event.lasts70
{ height: 507.5px; }
DIV#daysView DIV.event.starts71
{ top: 532.5px; }
DIV#daysView DIV.event.lasts71
{ height: 514.75px; }
DIV#daysView DIV.event.starts72
{ top: 540.0px; }
DIV#daysView DIV.event.lasts72
{ height: 522.0px; }
DIV#daysView DIV.event.starts73
{ top: 547.5px; }
DIV#daysView DIV.event.lasts73
{ height: 529.25px; }
DIV#daysView DIV.event.starts74
{ top: 555.0px; }
DIV#daysView DIV.event.lasts74
{ height: 536.5px; }
DIV#daysView DIV.event.starts75
{ top: 562.5px; }
DIV#daysView DIV.event.lasts75
{ height: 543.75px; }
DIV#daysView DIV.event.starts76
{ top: 570.0px; }
DIV#daysView DIV.event.lasts76
{ height: 551.0px; }
DIV#daysView DIV.event.starts77
{ top: 577.5px; }
DIV#daysView DIV.event.lasts77
{ height: 558.25px; }
DIV#daysView DIV.event.starts78
{ top: 585.0px; }
DIV#daysView DIV.event.lasts78
{ height: 565.5px; }
DIV#daysView DIV.event.starts79
{ top: 592.5px; }
DIV#daysView DIV.event.lasts79
{ height: 572.75px; }
DIV#daysView DIV.event.starts80
{ top: 600.0px; }
DIV#daysView DIV.event.lasts80
{ height: 580.0px; }
DIV#daysView DIV.event.starts81
{ top: 607.5px; }
DIV#daysView DIV.event.lasts81
{ height: 587.25px; }
DIV#daysView DIV.event.starts82
{ top: 615.0px; }
DIV#daysView DIV.event.lasts82
{ height: 594.5px; }
DIV#daysView DIV.event.starts83
{ top: 622.5px; }
DIV#daysView DIV.event.lasts83
{ height: 601.75px; }
DIV#daysView DIV.event.starts84
{ top: 630.0px; }
DIV#daysView DIV.event.lasts84
{ height: 609.0px; }
DIV#daysView DIV.event.starts85
{ top: 637.5px; }
DIV#daysView DIV.event.lasts85
{ height: 616.25px; }
DIV#daysView DIV.event.starts86
{ top: 645.0px; }
DIV#daysView DIV.event.lasts86
{ height: 623.5px; }
DIV#daysView DIV.event.starts87
{ top: 652.5px; }
DIV#daysView DIV.event.lasts87
{ height: 630.75px; }
DIV#daysView DIV.event.starts88
{ top: 660.0px; }
DIV#daysView DIV.event.lasts88
{ height: 638.0px; }
DIV#daysView DIV.event.starts89
{ top: 667.5px; }
DIV#daysView DIV.event.lasts89
{ height: 645.25px; }
DIV#daysView DIV.event.starts90
{ top: 675.0px; }
DIV#daysView DIV.event.lasts90
{ height: 652.5px; }
DIV#daysView DIV.event.starts91
{ top: 682.5px; }
DIV#daysView DIV.event.lasts91
{ height: 659.75px; }
DIV#daysView DIV.event.starts92
{ top: 690.0px; }
DIV#daysView DIV.event.lasts92
{ height: 667.0px; }
DIV#daysView DIV.event.starts93
{ top: 697.5px; }
DIV#daysView DIV.event.lasts93
{ height: 674.25px; }
DIV#daysView DIV.event.starts94
{ top: 705.0px; }
DIV#daysView DIV.event.lasts94
{ height: 681.5px; }
DIV#daysView DIV.event.starts95
{ top: 712.5px; }
DIV#daysView DIV.event.lasts95
{ height: 688.75px; }
DIV#daysView DIV.event.starts96
{ top: 720.0px; }
DIV#daysView DIV.event.lasts96
{ height: 696.0px; }
/********** Overriding generic.css **********/
TABLE.frame {
width:97%;
text-align: left;
background:#dddddd;
border-radius:8px;
display:table;
}
SPAN.caption {
background: -webkit-linear-gradient(bottom, #E6E7E6, #dddddd); /* For Safari 5.1 to 6.0 */
background: -o-linear-gradient(bottom, #E6E7E6, #dddddd); /* For Opera 11.1 to 12.0 */
background: -moz-linear-gradient(bottom, #E6E7E6, #dddddd); /* For Firefox 3.6 to 15 */
background: linear-gradient(to bottom, #E6E7E6, #dddddd); /* Standard syntax (must be last) */
}
LABEL {
margin-left:0;
}
/********** Calling print(); from the browser **********/
@media print{
.no-print, SPAN.caption, SPAN.weeksHeader, SPAN.daysHeader {
display:none;
}
DIV#rightSide {
position:static;
top:5px;
left:5px;
}
DIV#rightFrame {
border:none;
overflow:visible;
}
}

View File

@ -0,0 +1,667 @@
/* -*- Mode: js2-mode; tab-width: 4; c-label-minimum-indentation: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2006-2014 Inverse
This file is part of SOGo
SOGo 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.
SOGo 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 SOGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
/******************************** Global variables *******************************************/
var firstDayOfWeek = window.opener.firstDayOfWeek;
var printCompletedTasks=1;
var printNoDueDateTasks=1;
var eventsBlocks;
var currentView;
var currentDay = window.parentvar("currentDay");
var sd, ed;
/****************************************** Ajax Requests, callbacks & events/tasks drawings ***************************************************/
function refreshContent() {
refreshEvents(); // Get the eventBlocks and draw them
refreshTasks(); // Get the taskLists and draw them
}
function updateDisplayView(data, newView) {
newView = ((newView) ? newView : currentView);
var url = ApplicationBaseURL + "/" + newView;
var day = null;
if (data) {
day = data['day'];
}
if (!day)
day = currentDay;
if (day) {
if (data) {
var dayDiv = $("day"+day);
if (dayDiv) {
// Don't reload the view if the event is present in current view
// Deselect day in date selector
if (document.selectedDate)
document.selectedDate.deselect();
// Select day in date selector
var selectedLink = $$('table#dateSelectorTable span[day='+day+']');
if (selectedLink.length > 0) {
selectedCell = selectedLink[0].getParentWithTagName("td");
$(selectedCell).selectElement();
document.selectedDate = selectedCell;
} else
document.selectedDate = null;
setSelectedDayDate(day);
return false;
}
else if (day.length == 6) {
day += "01";
}
}
url += "?day=" + day;
}
selectedCalendarCell = null;
if (document.dayDisplayAjaxRequest) {
document.dayDisplayAjaxRequest.aborted = true;
document.dayDisplayAjaxRequest.abort();
}
document.dayDisplayAjaxRequest
= triggerAjaxRequest(url, previewDisplayCallback,
{ "view": newView,
"day": day});
}
function previewDisplayCallback(http) {
if (http.readyState == 4
&& http.status == 200) {
$("rightFrameEvents").innerHTML = http.responseText;
$("currentViewMenu").remove();
$("listCollapse").remove();
// TODO : Month
_drawAllDayEvents(eventsBlocks[1], eventsBlocks[0]);
_drawEvents(eventsBlocks[2], eventsBlocks[0]);
}
else
log ("calendarDisplayCallback Ajax error ("+ http.readyState + "/" + http.status + ")");
return false;
}
function refreshEvents() {
var todayDate = new Date();
if (!currentDay)
currentDay = todayDate.getDayString();
if (currentView == "dayview") {
sd = currentDay;
ed = sd;
}
else if (currentView == "weekview") {
var startDate;
startDate = currentDay.asDate();
startDate = startDate.beginOfWeek();
sd = startDate.getDayString();
var endDate = new Date();
endDate.setTime(startDate.getTime());
endDate.addDays(6);
ed = endDate.getDayString();
}
else {
var monthDate;
monthDate = currentDay.asDate();
monthDate.setDate(1);
sd = monthDate.beginOfWeek().getDayString();
var lastMonthDate = new Date();
lastMonthDate.setTime(monthDate.getTime());
lastMonthDate.setMonth(monthDate.getMonth() + 1);
lastMonthDate.addDays(-1);
ed = lastMonthDate.endOfWeek().getDayString();
}
if (document.refreshEventsAjaxRequest) {
document.refreshEventsAjaxRequest.aborted = true;
document.refreshEventsAjaxRequest.abort();
}
var url = (ApplicationBaseURL + "/eventsblocks?sd=" + sd + "&ed=" + ed
+ "&view=" + currentView);
document.refreshEventsAjaxRequest
= triggerAjaxRequest(url, refreshEventsCallback,
{"startDate": sd, "endDate": ed});
}
function refreshTasks(){
if (document.tasksListAjaxRequest) {
document.tasksListAjaxRequest.aborted = true;
document.tasksListAjaxRequest.abort();
}
url = window.parentvar("ApplicationBaseURL") + "/" + "taskslist?show-completed=" + printCompletedTasks
+ "&asc=" + sorting["task-ascending"]
+ "&sort=" + sorting["task-attribute"];
var tasksList = window.parent$("tasksList");
var selectedIds;
if (tasksList)
selectedIds = tasksList.getSelectedNodesId();
else
selectedIds = null;
document.tasksListAjaxRequest = triggerAjaxRequest(url, refreshTasksListCallback, selectedIds);
}
function refreshEventsCallback(http) {
if (http.readyState == 4
&& http.status == 200) {
if (http.responseText.length > 0) {
eventsBlocks = http.responseText.evalJSON(true);
$("rightFrameEvents").innerHTML = "";
if ($("printLayoutList").value == "0")
_drawEventsCells(eventsBlocks);
else {
updateDisplayView(null, currentView);
}
}
}
else
log("AJAX error when refreshing calendar events");
}
function refreshTasksListCallback(http) {
if (http.readyState == 4
&& http.status == 200) {
if (http.responseText.length > 0) {
var tasksBlocks = http.responseText.evalJSON(true);
$("rightFrameTasks").innerHTML = "";
var layout = $("printLayoutList").value;
_drawTasksCells(tasksBlocks);
}
}
else
log("AJAX error when refreshing calendar events");
}
function _drawEventsCells(eventsBlocks) {
var events = _("Events");
$("rightFrameEvents").insert("<h3>"+events+"</h3>");
for(var i=0; i < eventsBlocks[0].length; i++)
{
var event = _parseEvent(eventsBlocks[0][i]);
$("rightFrameEvents").insert(event);
}
}
function _drawTasksCells(tasksBlocks) {
var task = _("Tasks");
$("rightFrameTasks").insert("<h3>"+task+"</h3>");
for(var i=0; i < tasksBlocks.length; i++)
{
if (!(printNoDueDateTasks == 0 && tasksBlocks[i][5] == null)) {
var task = _parseTask(tasksBlocks[i]);
$("rightFrameTasks").insert(task);
}
}
}
// TODO : Maybe use the drawfunction from the schedulerUI.js
function _drawEvents(events, eventsData) {
var daysView = $("daysView");
var subdivs = daysView.childNodesWithTag("div");
for (var i = 0; i < subdivs.length; i++) {
var subdiv = subdivs[i];
if (subdiv.hasClassName("days")) {
var days = subdiv.childNodesWithTag("div");
for (var j = 0; j < days.length; j++) {
var parentDiv = days[j].childNodesWithTag("div")[0];
for (var k = 0; k < events[j].length; k++) {
var eventRep = events[j][k];
var nbr = eventRep.nbr;
var eventCell = newEventDIV(eventRep, eventsData[nbr]);
parentDiv.appendChild(eventCell);
}
}
}
}
}
function _drawAllDayEvents(events, eventsData) {
var headerView = $("calendarHeader");
var subdivs = headerView.childNodesWithTag("div");
var days = subdivs[1].childNodesWithTag("div");
for (var i = 0; i < days.length; i++) {
var parentDiv = days[i];
for (var j = 0; j < events[i].length; j++) {
var eventRep = events[i][j];
var nbr = eventRep.nbr;
var eventCell = newAllDayEventDIV(eventRep, eventsData[nbr]);
parentDiv.appendChild(eventCell);
}
}
}
// todo : month
function newEventDIV(eventRep, event) {
var eventCell = newBaseEventDIV(eventRep, event, event[4]);
var pc = 100 / eventRep.siblings;
var left = Math.floor(eventRep.position * pc);
eventCell.style.left = left + "%";
var right = Math.floor(100 - (eventRep.position + 1) * pc);
eventCell.style.right = right + "%";
eventCell.addClassName("starts" + eventRep.start);
eventCell.addClassName("lasts" + eventRep.length);
if (event[7]) {
var inside = eventCell.childNodesWithTag("div")[0];
var textDiv = inside.childNodesWithTag("div")[1];
textDiv.appendChild(createElement("br"));
var span = createElement("span", null, "location");
var text = _("Location:") + " " + event[7];
span.update(text);
textDiv.appendChild(span);
}
return eventCell;
}
function newBaseEventDIV(eventRep, event, eventText) {
// log ("0 cname = " + event[0]);
// log ("1 calendar = " + event[1]);
// log ("2 calendar name = " + event[2]);
// log ("3 status = " + event[3]);
// log ("4 title = " + event[4]);
// log ("5 start = " + event[5]);
// log ("6 end = " + event[6]);
// log ("7 location = " + event[7]);
// log ("8 isallday = " + event[8]);
// log ("9 classification = " + event[9]); // 0 = public, 1 = private, 2 = confidential
// log ("10 category = " + event[10]);
// log ("11 participants emails = " + event[11]);
// log ("12 participants states = " + event[12]);
// log ("13 owner = " + event[13]);
// log ("14 iscycle = " + event[14]);
// log ("15 nextalarm = " + event[15]);
// log ("16 recurrenceid = " + event[16]);
// log ("17 isexception = " + event[17]);
// log ("18 editable = " + event[18]);
// log ("19 erasable = " + event[19]);
// log ("20 ownerisorganizer = " + event[20]);
var eventCell = createElement("div");
eventCell.cname = event[0];
eventCell.calendar = event[1];
var startDate = new Date(event[5]*1000);
if (startDate) {
eventCell.startDate = event[5];
eventCell.writeAttribute('day', startDate.getDayString());
eventCell.writeAttribute('hour', event[8]? 'allday' : startDate.getHourString());
}
// if (event[8] == 1)
// eventCell.addClassName("private");
// else if (event[8] == 2)
// eventCell.addClassName("confidential");
if (eventRep.recurrenceTime)
eventCell.recurrenceTime = eventRep.recurrenceTime;
//eventCell.owner = event[12];
eventCell.isException = event[17];
eventCell.editable = event[18];
eventCell.erasable = event[19] || IsSuperUser;
eventCell.ownerIsOrganizer = event[20];
eventCell.addClassName("event");
// if (event[14] > 0)
// eventCell.addClassName("alarm");
var innerDiv = createElement("div");
eventCell.appendChild(innerDiv);
innerDiv.addClassName("eventInside");
innerDiv.addClassName("calendarFolder" + event[1]);
if (eventRep.userState >= 0 && userStates[eventRep.userState])
innerDiv.addClassName(userStates[eventRep.userState]);
var gradientDiv = createElement("div");
innerDiv.appendChild(gradientDiv);
gradientDiv.addClassName("gradient");
var gradientImg = createElement("img");
gradientDiv.appendChild(gradientImg);
gradientImg.src = ResourcesURL + "/event-gradient.png";
var textDiv = createElement("div");
innerDiv.appendChild(textDiv);
textDiv.addClassName("text");
var iconSpan = createElement("span", null, "icons");
textDiv.update(eventText.replace(/(\\r)?\\n/g, "<BR/>"));
textDiv.appendChild(iconSpan);
// Add alarm and classification icons
if (event[9] == 1)
createElement("img", null, null, {src: ResourcesURL + "/private.png"}, null, iconSpan);
else if (event[9] == 2)
createElement("img", null, null, {src: ResourcesURL + "/confidential.png"}, null, iconSpan);
if (event[15] > 0)
createElement("img", null, null, {src: ResourcesURL + "/alarm.png"}, null, iconSpan);
if (event[10] != null) {
var category = event[10].decodeEntities();
var categoryStyle = categoriesStyles.get(category);
if (!categoryStyle) {
categoryStyle = 'category_' + categoriesStyles.keys().length;
categoriesStyles.set([category], categoryStyle);
}
innerDiv.addClassName(categoryStyle);
}
return eventCell;
}
function _parseEvent(event) {
// Localized strings :
var start = _("Start:");
var end = _("End:");
var Location = _("Location:");
var Calendar = _("Calendar:");
var parsedEvent;
var startDate = new Date(event[5] *1000);
var endDate = new Date(event[6] *1000);
parsedEvent = "<div class=\"divEventsPreview\"><table>";
parsedEvent += "<tr><th></th><th>"+ event[4] +"</th></tr>";
parsedEvent += "<tr><td class=\"label\">" + start + "</td><td>" + startDate.toLocaleString() + "</td></tr>";
parsedEvent += "<tr><td class=\"label\">" + end + "</td><td>" + endDate.toLocaleString() + "</td></tr>";
if (event[7] != "")
parsedEvent += "<tr><td class=\"label\">"+ Location +"</td><td>" + event[7] + "</td></tr>";
parsedEvent += "<tr><td class=\"label\">"+ Calendar +"</td><td>" + event[2] + "</td></tr>";
parsedEvent += "</table></div>";
return parsedEvent;
}
function _parseTask(task) {
var parsedTask;
var end = _("Due Date:");
var Calendar = _("Calendar:");
var Location = _("Location:");
parsedTask = "<div class=\"divTasksPreview\"><table>";
if (task[12] == "overdue")
parsedTask += "<tr><th></th><th class=\"overdueTasks\">"+ task[4] +"</th></tr>";
else if (task[12] == "completed") {
parsedTask += "<tr><th></th><th class=\"completedTasks\">"+ task[4] +"</th></tr>";
}
else
parsedTask += "<tr class=\"tasksTitle\"><th></th><th>"+ task[4] +"</th></tr>";
if (task[5] != null) {
var endDate = new Date(task[5] *1000);
parsedTask += "<tr><td class=\"label\">"+ end +"</td><td>"+ endDate.toLocaleString() + "</td></tr>";
}
if (task[7] != "") {
parsedTask += "<tr><td class=\"label\">"+ Location +"</td><td>" + task[7] + "</td></tr>";
}
parsedTask += "<tr><td class=\"label\">" + Calendar + "</td><td>" + task[2] + "</td></tr>";
parsedTask += "</table></div>";
return parsedTask;
}
/************************************** Preview Navigation *****************************************/
function onCalendarGotoDay(node) {
var day = node.getAttribute("date");
var needRefresh = (listFilter == 'view_selectedday' && day != currentDay);
changeDateSelectorDisplay(day);
updateDisplayView({ "day": day });
refreshEvents();
return false;
}
function changeDateSelectorDisplay(day, keepCurrentDay) {
var url = ApplicationBaseURL + "/dateselector";
if (day) {
if (day.length < 8)
day += "01";
url += "?day=" + day;
}
if (!keepCurrentDay)
currentDay = day;
var month = day.substr(0, 6);
if (cachedDateSelectors[month]) {
// log ("restoring cached selector for month: " + month);
setDateSelectorContent(cachedDateSelectors[month]);
}
else {
// log ("loading selector for month: " + month);
if (document.dateSelectorAjaxRequest) {
document.dateSelectorAjaxRequest.aborted = true;
document.dateSelectorAjaxRequest.abort();
}
document.dateSelectorAjaxRequest
= triggerAjaxRequest(url,
dateSelectorCallback,
month);
}
}
function dateSelectorCallback(http) {
if (http.readyState == 4
&& http.status == 200) {
document.dateSelectorAjaxRequest = null;
var content = http.responseText;
setDateSelectorContent(content);
cachedDateSelectors[http.callbackData] = content;
}
else
log ("dateSelectorCallback Ajax error");
return false;
}
/*********************** Input Field, Checkboxes, Radio and listMenu *********************************/
function onInputTitleChange(event){
var inputFieldTitle = $("inputFieldTitle").value;
if (inputFieldTitle)
document.getElementById("rightFrameTitle").innerHTML = inputFieldTitle + "<br />";
else
document.getElementById("rightFrameTitle").innerHTML = inputFieldTitle;
}
function onPrintLayoutListChange() {
var selectedLayout = $("printLayoutList").value;
var parentView = window.parentvar("currentView");
switch(selectedLayout) {
case "0": // List view
window.resizeTo(700,500);
currentView = parentView;
ajustFrames();
break;
case "1": // Day view
window.resizeTo(1010,500);
currentView = "dayview";
ajustFrames(currentView);
break;
case "2": // Week view
window.resizeTo(1010,500);
currentView = "weekview";
ajustFrames(currentView);
break;
//todo : month
}
refreshContent();
}
function ajustFrames(view) {
if (view == "dayview" || view == "weekview") {
document.getElementById("rightFrameEvents").style.width = '100%';
document.getElementById("rightFrameTasks").style.width = '100%';
document.getElementById("rightFrameTasks").style.pageBreakBefore = 'always';
document.getElementById("rightFrameTasks").style.pageBreakInside = 'avoid';
}
else {
document.getElementById("rightFrameEvents").style.width = '49.5%';
document.getElementById("rightFrameTasks").style.width = '49.5%';
document.getElementById("rightFrameTasks").style.pageBreakBefore = 'auto';
document.getElementById("rightFrameTasks").style.pageBreakInside = 'auto';
}
}
function onEventsCheck(checkBox) {
if(checkBox.checked){
document.getElementById("rightFrameEvents").style.display = 'block';
if ($("printLayoutList").value == 0){
document.getElementById("rightFrameTasks").style.width = '49.5%';
}
}
else {
document.getElementById("rightFrameEvents").style.display = 'none';
if ($("printLayoutList").value == 0){
document.getElementById("rightFrameTasks").style.width = '100%';
}
}
}
function onTasksCheck(checkBox) {
var printOptions = document.getElementsByName("printOptions");
for (var i = 0; i < printOptions.length; i++)
printOptions[i].disabled = !checkBox.checked;
if(checkBox.checked) {
document.getElementById("rightFrameTasks").style.display = 'block';
if ($("printLayoutList").value == 0){
document.getElementById("rightFrameEvents").style.width = '49.5%';
}
}
else {
document.getElementById("rightFrameTasks").style.display = 'none';
if ($("printLayoutList").value == 0){
document.getElementById("rightFrameEvents").style.width = '100%';
}
}
}
/*function onPrintDateCheck() {
var dateRange = document.getElementsByName("dateRange");
var customDate = document.getElementById("customDate");
for (var i = 0; i < dateRange.length; i++)
if (dateRange[i].children[1].children[0].disabled == customDate.checked)
dateRange[i].children[1].children[0].disabled = !customDate.checked;
}*/
function onPrintCompletedTasksCheck(checkBox) {
printCompletedTasks = (checkBox.checked ? 1 : 0);
refreshTasks();
}
function onPrintNoDueDateTasksCheck(checkBox) {
printNoDueDateTasks = (checkBox.checked ? 1 : 0);
refreshTasks();
}
/************** Date picker functions *************
this.initTimeWidgets = function (widgets) {
this.timeWidgets = widgets;
jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0});
jQuery(widgets['end']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0});
//jQuery(widgets['start']['date']).change(onAdjustTime);
jQuery(widgets['startingDate']['date']).closest('.date').datepicker({autoclose: true,
weekStart: 0,
endDate: lastDay,
startDate: firstDay,
setStartDate: lastDay,
startView: 2,
position: "below-shifted-left"});
}
this.onAdjustTime = function(event) {
onAdjustDueTime(event);
}
this.onAdjustDueTime = function(event) {
var dateDelta = (window.getStartDate().valueOf() - window.getShadowStartDate().valueOf());
var newDueDate = new Date(window.getDueDate().valueOf() + dateDelta);
window.setDueDate(newDueDate);
window.timeWidgets['start']['date'].updateShadowValue();
}
/****************************************************/
/******************************* Buttons ***********************************************/
function onPrintCancelClick(event) {
this.blur();
onCloseButtonClick(event);
}
function onPrintClick(event) {
this.blur();
window.print();
}
/**************************** Initialization *******************************************/
function init() {
initializePrintSettings();
//initializeWhatToPrint();
//initializeOptions();
$("cancelButton").observe("click", onPrintCancelClick);
$("printButton").observe("click", onPrintClick);
/* TODO : Selected and custom date must be implemented and finished.
document.getElementById("eventsTasks").disabled=true;
document.getElementById("customDate").disabled=true;*/
onPrintLayoutListChange();
}
function initializePrintSettings() {
$("inputFieldTitle").observe("change", onInputTitleChange);
$("printLayoutList").observe("change", onPrintLayoutListChange);
}
/*function initializeWhatToPrint() {
var widgets = {'start': {'date': $("startingDate")},
'end': {'date': $("endingDate")}};
initTimeWidgets(widgets);
onPrintDateCheck();
}*/
/*function initializeOptions() {
}*/
document.observe("dom:loaded", init);