From 37635fdacef78bbff15dc7b81baf10e397188780 Mon Sep 17 00:00:00 2001 From: wolfgang Date: Tue, 22 Apr 2008 14:55:25 +0000 Subject: [PATCH] git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1400 d1b88da0-ebda-0310-925b-ed51d893ca5b --- ChangeLog | 19 + Main/SOGo.m | 1 - .../Appointments/SOGoAppointmentFolder.h | 3 + .../Appointments/SOGoAppointmentFolder.m | 70 +++ SoObjects/SOGo/NSString+Utilities.h | 1 + SoObjects/SOGo/NSString+Utilities.m | 12 + SoObjects/SOGo/SOGoGCSFolder.h | 2 + SoObjects/SOGo/SOGoGCSFolder.m | 81 ++- SoObjects/SOGo/SOGoObject.m | 33 + SoObjects/SOGo/SOGoUser.h | 2 + UI/Common/UIxFolderActions.h | 1 - UI/Common/UIxFolderActions.m | 15 +- UI/Common/product.plist | 2 - UI/SOGoUI/UIxJSClose.m | 9 +- UI/Scheduler/GNUmakefile | 2 + UI/Scheduler/UIxCalendarProperties.h | 42 ++ UI/Scheduler/UIxCalendarProperties.m | 91 +++ UI/Scheduler/UIxCalendarSelector.m | 52 +- UI/Scheduler/UIxColorPicker.h | 31 + UI/Scheduler/UIxColorPicker.m | 29 + UI/Scheduler/product.plist | 29 +- .../SchedulerUI/UIxCalendarProperties.wox | 44 ++ UI/Templates/SchedulerUI/UIxColorPicker.wox | 16 + UI/Templates/UIxJSClose.wox | 2 +- UI/WebServerResources/SchedulerUI.js | 47 +- .../UIxCalendarProperties.css | 36 ++ .../UIxCalendarProperties.js | 46 ++ UI/WebServerResources/UIxColorPicker.js | 9 + UI/WebServerResources/js_color_picker_v2.css | 191 ++++++ UI/WebServerResources/js_color_picker_v2.js | 580 ++++++++++++++++++ UI/WebServerResources/slider_handle.gif | Bin 0 -> 511 bytes UI/WebServerResources/tab_.gif | Bin 127 -> 0 bytes UI/WebServerResources/tab_selected.gif | Bin 127 -> 0 bytes 33 files changed, 1362 insertions(+), 136 deletions(-) create mode 100644 UI/Scheduler/UIxCalendarProperties.h create mode 100644 UI/Scheduler/UIxCalendarProperties.m create mode 100644 UI/Scheduler/UIxColorPicker.h create mode 100644 UI/Scheduler/UIxColorPicker.m create mode 100644 UI/Templates/SchedulerUI/UIxCalendarProperties.wox create mode 100644 UI/Templates/SchedulerUI/UIxColorPicker.wox create mode 100644 UI/WebServerResources/UIxCalendarProperties.css create mode 100644 UI/WebServerResources/UIxCalendarProperties.js create mode 100644 UI/WebServerResources/UIxColorPicker.js create mode 100644 UI/WebServerResources/js_color_picker_v2.css create mode 100644 UI/WebServerResources/js_color_picker_v2.js create mode 100644 UI/WebServerResources/slider_handle.gif delete mode 100644 UI/WebServerResources/tab_.gif delete mode 100644 UI/WebServerResources/tab_selected.gif diff --git a/ChangeLog b/ChangeLog index 243b773d..ef99e9b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2008-04-22 Wolfgang Sourdeau + + * SoObjects/SOGo/SOGoGCSFolder.m ([SOGoGCSFolder + -setDavDisplayName:newName]): deny the renaming of the folder if + not owner. + + * SoObjects/SOGo/SOGoObject.m ([SOGoObject + -davSetProperties:setPropsremovePropertiesNamed:removedPropsinContext:localContext]): + certain properties should be authorized when not owner. + +2008-04-21 Wolfgang Sourdeau + + * UI/Scheduler/UIxColorPicker.[hm]: new class module that + implements a javascript-based color picker. + + * UI/Scheduler/UIxCalendarProperties.[hm]: new class module that + implements the interface for renaming and recoloring the + calendars. + 2008-04-15 Wolfgang Sourdeau * UI/MailPartViewers/UIxMailPartHTMLViewer.m diff --git a/Main/SOGo.m b/Main/SOGo.m index f61c1466..afb19b09 100644 --- a/Main/SOGo.m +++ b/Main/SOGo.m @@ -392,7 +392,6 @@ static BOOL debugObjectAllocation = NO; static NSArray *runLoopModes = nil; WOResponse *resp; -// sleep (1); cache = [SOGoCache sharedCache]; resp = [super dispatchRequest: _request]; [SOGoCache killCache]; diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.h b/SoObjects/Appointments/SOGoAppointmentFolder.h index c359f65e..8b0d97ed 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.h +++ b/SoObjects/Appointments/SOGoAppointmentFolder.h @@ -58,6 +58,9 @@ - (BOOL) isActive; +- (NSString *) calendarColor; +- (void) setCalendarColor: (NSString *) newColor; + /* selection */ - (NSArray *) calendarUIDs; diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index b7760034..bf618a8b 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -63,6 +63,8 @@ #import "SOGoAppointmentFolder.h" +#define defaultColor @"#AAAAAA" + #if APPLE_Foundation_LIBRARY || NeXT_Foundation_LIBRARY @interface NSDate(UsedPrivates) - (id)initWithTimeIntervalSince1970:(NSTimeInterval)_interval; @@ -130,6 +132,46 @@ static NSNumber *sharedYes = nil; [super dealloc]; } +- (NSString *) calendarColor +{ + NSUserDefaults *settings; + NSDictionary *colors; + NSString *color; + + settings = [[context activeUser] userSettings]; + colors = [[settings objectForKey: @"Calendar"] + objectForKey: @"FolderColors"]; + color = [colors objectForKey: [self folderReference]]; + if (!color) + color = defaultColor; + + return color; +} + +- (void) setCalendarColor: (NSString *) newColor +{ + NSUserDefaults *settings; + NSMutableDictionary *calendarSettings; + NSMutableDictionary *colors; + + settings = [[context activeUser] userSettings]; + calendarSettings = [settings objectForKey: @"Calendar"]; + if (!calendarSettings) + { + calendarSettings = [NSMutableDictionary dictionary]; + [settings setObject: calendarSettings + forKey: @"Calendar"]; + } + colors = [calendarSettings objectForKey: @"FolderColors"]; + if (!colors) + { + colors = [NSMutableDictionary dictionary]; + [calendarSettings setObject: colors forKey: @"FolderColors"]; + } + [colors setObject: newColor forKey: [self folderReference]]; + [settings synchronize]; +} + /* logging */ - (id) debugLogger @@ -561,6 +603,34 @@ static NSNumber *sharedYes = nil; return ns; } +- (NSString *) davCalendarColor +{ + NSString *color; + + color = [[self calendarColor] uppercaseString]; + + return [NSString stringWithFormat: @"%@FF", color]; +} + +- (NSException *) setDavCalendarColor: (NSString *) newColor +{ + NSException *error; + NSString *realColor; + + if ([newColor length] == 9 + && [newColor hasPrefix: @"#"]) + { + realColor = [newColor substringToIndex: 7]; + [self setCalendarColor: realColor]; + error = nil; + } + else + error = [NSException exceptionWithHTTPStatus: 400 + reason: @"Bad color format (should be '#XXXXXXXX')."]; + + return error; +} + - (id) davCalendarQuery: (id) queryContext { WOResponse *r; diff --git a/SoObjects/SOGo/NSString+Utilities.h b/SoObjects/SOGo/NSString+Utilities.h index 75bc6dc9..548cb294 100644 --- a/SoObjects/SOGo/NSString+Utilities.h +++ b/SoObjects/SOGo/NSString+Utilities.h @@ -37,6 +37,7 @@ - (NSString *) urlWithoutParameters; - (NSString *) davMethodToObjC; +- (NSString *) davSetterName; - (NSDictionary *) asDavInvocation; - (NSString *) stringByDetectingURLs; diff --git a/SoObjects/SOGo/NSString+Utilities.m b/SoObjects/SOGo/NSString+Utilities.m index ff0c38d0..857fe71c 100644 --- a/SoObjects/SOGo/NSString+Utilities.m +++ b/SoObjects/SOGo/NSString+Utilities.m @@ -111,6 +111,18 @@ static NSMutableCharacterSet *urlStartChars = nil; return newName; } +- (NSString *) davSetterName +{ + unichar firstLetter; + NSString *firstString; + + firstLetter = [self characterAtIndex: 0]; + firstString = [[NSString stringWithCharacters: &firstLetter length: 1] + uppercaseString]; + return [NSString stringWithFormat: @"set%@%@:", + firstString, [self substringFromIndex: 1]]; +} + - (NSDictionary *) asDavInvocation { NSMutableDictionary *davInvocation; diff --git a/SoObjects/SOGo/SOGoGCSFolder.h b/SoObjects/SOGo/SOGoGCSFolder.h index 6a89dd4b..54214dff 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.h +++ b/SoObjects/SOGo/SOGoGCSFolder.h @@ -59,6 +59,8 @@ - (GCSFolder *) ocsFolderForPath: (NSString *)_path; - (GCSFolder *) ocsFolder; +- (NSString *) folderReference; + /* lower level fetches */ - (BOOL) nameExistsInFolder: (NSString *) objectName; diff --git a/SoObjects/SOGo/SOGoGCSFolder.m b/SoObjects/SOGo/SOGoGCSFolder.m index 4fea87a1..e3d7c56c 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.m +++ b/SoObjects/SOGo/SOGoGCSFolder.m @@ -227,11 +227,62 @@ static BOOL sendFolderAdvisories = NO; return [nameInContainer isEqualToString: @"personal"]; } +- (NSString *) folderReference +{ + NSString *login, *reference, *realName; + NSArray *nameComponents; + + login = [[context activeUser] login]; + if ([owner isEqualToString: login]) + reference = nameInContainer; + else + { + nameComponents = [nameInContainer componentsSeparatedByString: @"_"]; + if ([nameComponents count] > 1) + realName = [nameComponents objectAtIndex: 1]; + else + realName = nameInContainer; + + reference = [NSString stringWithFormat: @"%@:%@/%@", + owner, + [container nameInContainer], + realName]; + } + + return reference; +} + - (NSString *) davDisplayName { return [self displayName]; } +- (NSException *) setDavDisplayName: (NSString *) newName +{ + NSException *error; + NSArray *currentRoles; + + currentRoles = [[context activeUser] rolesForObject: self + inContext: context]; + if ([currentRoles containsObject: SoRole_Owner]) + { + if ([newName length]) + { + [self renameTo: newName]; + error = nil; + } + else + error = [NSException exceptionWithHTTPStatus: 400 + reason: [NSString stringWithFormat: + @"Empty string"]]; + } + else + error = [NSException exceptionWithHTTPStatus: 403 + reason: @"Modification denied."]; + + return error; +} + - (GCSFolder *) ocsFolder { GCSFolder *folder; @@ -449,8 +500,7 @@ static BOOL sendFolderAdvisories = NO; else folder = [realFolderPath objectAtIndex: 0]; - subscriptionPointer = [NSString stringWithFormat: @"%@:%@/%@", - owner, baseFolder, folder]; + subscriptionPointer = [self folderReference]; if (reallyDo) [folderSubscription addObjectUniquely: subscriptionPointer]; else @@ -524,33 +574,6 @@ static BOOL sendFolderAdvisories = NO; inContext: queryContext]; } -- (NSException *) davSetProperties: (NSDictionary *) setProps - removePropertiesNamed: (NSDictionary *) removedProps - inContext: (WOContext *) localContext -{ - NSString *newDisplayName; - NSException *exception; - NSArray *currentRoles; - - currentRoles = [[localContext activeUser] rolesForObject: self - inContext: localContext]; - if ([currentRoles containsObject: SoRole_Owner]) - { - newDisplayName = [setProps objectForKey: @"davDisplayName"]; - if ([newDisplayName length]) - { - [self renameTo: newDisplayName]; - exception = nil; - } - else - exception = [NSException exceptionWithHTTPStatus: 404]; - } - else - exception = [NSException exceptionWithHTTPStatus: 403]; - - return exception; -} - /* acls as a container */ - (NSArray *) aclUsersForObjectAtPath: (NSArray *) objectPathArray; diff --git a/SoObjects/SOGo/SOGoObject.m b/SoObjects/SOGo/SOGoObject.m index 64f1293f..678f6a3c 100644 --- a/SoObjects/SOGo/SOGoObject.m +++ b/SoObjects/SOGo/SOGoObject.m @@ -1342,4 +1342,37 @@ static BOOL sendACLAdvisories = NO; return r; } +- (NSException *) davSetProperties: (NSDictionary *) setProps + removePropertiesNamed: (NSDictionary *) removedProps + inContext: (WOContext *) localContext +{ + NSString *currentProp; + NSException *exception; + NSEnumerator *properties; + id currentValue; + SEL methodSel; + + properties = [[setProps allKeys] objectEnumerator]; + exception = nil; + while (!exception + && (currentProp = [properties nextObject])) + { + methodSel = NSSelectorFromString ([currentProp davSetterName]); + if ([self respondsToSelector: methodSel]) + { + currentValue = [setProps objectForKey: currentProp]; + exception = [self performSelector: methodSel + withObject: currentValue]; + } + else + exception + = [NSException exceptionWithHTTPStatus: 404 + reason: [NSString stringWithFormat: + @"Property '%@' cannot be set.", + currentProp]]; + } + + return exception; +} + @end /* SOGoObject */ diff --git a/SoObjects/SOGo/SOGoUser.h b/SoObjects/SOGo/SOGoUser.h index 03c067ce..54f53073 100644 --- a/SoObjects/SOGo/SOGoUser.h +++ b/SoObjects/SOGo/SOGoUser.h @@ -36,6 +36,8 @@ @class NSArray; @class NSDictionary; +@class NSMutableArray; +@class NSMutableDictionary; @class NSString; @class NSTimeZone; @class NSURL; diff --git a/UI/Common/UIxFolderActions.h b/UI/Common/UIxFolderActions.h index 96b6cbc1..4d4a751e 100644 --- a/UI/Common/UIxFolderActions.h +++ b/UI/Common/UIxFolderActions.h @@ -41,7 +41,6 @@ NSString *owner; NSString *login; NSString *baseFolder; - NSString *subscriptionPointer; NSMutableDictionary *moduleSettings; BOOL isMailInvitation; } diff --git a/UI/Common/UIxFolderActions.m b/UI/Common/UIxFolderActions.m index d8c65968..a2d6f64d 100644 --- a/UI/Common/UIxFolderActions.m +++ b/UI/Common/UIxFolderActions.m @@ -50,8 +50,7 @@ - (void) _setupContext { - NSString *folder, *mailInvitationParam; - NSArray *realFolderPath; + NSString *mailInvitationParam; SOGoUser *activeUser; activeUser = [context activeUser]; @@ -71,15 +70,6 @@ } [ud setObject: moduleSettings forKey: baseFolder]; - realFolderPath = [[clientObject nameInContainer] - componentsSeparatedByString: @"_"]; - if ([realFolderPath count] > 1) - folder = [realFolderPath objectAtIndex: 1]; - else - folder = [realFolderPath objectAtIndex: 0]; - subscriptionPointer = [NSString stringWithFormat: @"%@:%@/%@", - owner, baseFolder, folder]; - mailInvitationParam = [[context request] formValueForKey: @"mail-invitation"]; isMailInvitation = [mailInvitationParam boolValue]; @@ -89,7 +79,7 @@ { WOResponse *response; NSMutableArray *folderSubscription; - NSString *mailInvitationURL; + NSString *mailInvitationURL, *subscriptionPointer; if ([owner isEqualToString: login]) { @@ -108,6 +98,7 @@ [moduleSettings setObject: folderSubscription forKey: @"SubscribedFolders"]; } + subscriptionPointer = [[self clientObject] folderReference]; if (reallyDo) [folderSubscription addObjectUniquely: subscriptionPointer]; else diff --git a/UI/Common/product.plist b/UI/Common/product.plist index 16cf11bf..ba403b8d 100644 --- a/UI/Common/product.plist +++ b/UI/Common/product.plist @@ -16,8 +16,6 @@ box_botleft.gif, box_bottom.gif, box_botright.gif, - tab_selected.gif, - tab_.gif, corner_right.gif, closewindow.gif, OGoLogo.gif, diff --git a/UI/SOGoUI/UIxJSClose.m b/UI/SOGoUI/UIxJSClose.m index 96dc6704..ed855818 100644 --- a/UI/SOGoUI/UIxJSClose.m +++ b/UI/SOGoUI/UIxJSClose.m @@ -36,8 +36,7 @@ - (void) dealloc { - if (refreshMethod) - [refreshMethod release]; + [refreshMethod release]; [super dealloc]; } @@ -51,11 +50,7 @@ - (void) setRefreshMethod: (NSString *) method { - if (refreshMethod) - [refreshMethod release]; - refreshMethod = method; - if (refreshMethod) - [refreshMethod retain]; + ASSIGN (refreshMethod, method); } - (NSString *) refreshMethod diff --git a/UI/Scheduler/GNUmakefile b/UI/Scheduler/GNUmakefile index beed2942..005b36d4 100644 --- a/UI/Scheduler/GNUmakefile +++ b/UI/Scheduler/GNUmakefile @@ -13,6 +13,8 @@ SchedulerUI_OBJC_FILES = \ NSArray+Scheduler.m \ \ UIxCalMainView.m \ + UIxCalendarProperties.m \ + UIxColorPicker.m \ \ UIxCalFilterPanel.m \ UIxCalDayTable.m \ diff --git a/UI/Scheduler/UIxCalendarProperties.h b/UI/Scheduler/UIxCalendarProperties.h new file mode 100644 index 00000000..e8ebc8c0 --- /dev/null +++ b/UI/Scheduler/UIxCalendarProperties.h @@ -0,0 +1,42 @@ +/* UIxCalendarProperties.m - this file is part of SOGo + * + * Copyright (C) 2008 Inverse groupe conseil + * + * Author: Wolfgang Sourdeau + * + * 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 "SOGoUI/UIxComponent.h" + +@class NSString; + +@class SOGoAppointmentFolder; + +@interface UIxCalendarProperties : UIxComponent +{ + SOGoAppointmentFolder *calendar; +} + +- (NSString *) calendarName; +- (void) setCalendarName: (NSString *) newName; +- (NSString *) calendarNameIsDisabled; + +- (NSString *) calendarColor; +- (void) setCalendarColor: (NSString *) newColor; + + +@end diff --git a/UI/Scheduler/UIxCalendarProperties.m b/UI/Scheduler/UIxCalendarProperties.m new file mode 100644 index 00000000..0dbb77ca --- /dev/null +++ b/UI/Scheduler/UIxCalendarProperties.m @@ -0,0 +1,91 @@ +/* UIxCalendarProperties.m - this file is part of SOGo + * + * Copyright (C) 2008 Inverse groupe conseil + * + * Author: Wolfgang Sourdeau + * + * 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 +#import + +#import "UIxCalendarProperties.h" + +@implementation UIxCalendarProperties + +- (id) init +{ + if ((self = [super init])) + { + calendar = [self clientObject]; + } + + return self; +} + +- (NSString *) calendarID +{ + return [calendar folderReference]; +} + +- (NSString *) calendarName +{ + return [calendar displayName]; +} + +- (void) setCalendarName: (NSString *) newName +{ + NSString *login; + + login = [[context activeUser] login]; + + if ([login isEqualToString: [calendar ownerInContext: context]]) + [calendar renameTo: newName]; +} + +- (NSString *) calendarNameIsDisabled +{ + NSString *login; + + login = [[context activeUser] login]; + + return ([login isEqualToString: [calendar ownerInContext: context]] + ? @"false" : @"true"); +} + +- (NSString *) calendarColor +{ + return [calendar calendarColor]; +} + +- (void) setCalendarColor: (NSString *) newColor +{ + [calendar setCalendarColor: newColor]; +} + +- (BOOL) shouldTakeValuesFromRequest: (WORequest *) request + inContext: (WOContext*) context +{ + return YES; +} + +- (id ) savePropertiesAction +{ + return [self jsCloseWithRefreshMethod: nil]; +} + +@end diff --git a/UI/Scheduler/UIxCalendarSelector.m b/UI/Scheduler/UIxCalendarSelector.m index 743375ee..82086547 100644 --- a/UI/Scheduler/UIxCalendarSelector.m +++ b/UI/Scheduler/UIxCalendarSelector.m @@ -36,56 +36,6 @@ #import "UIxCalendarSelector.h" -// static inline char -// darkenedColor (const char value) -// { -// char newValue; - -// if (value >= '0' && value <= '9') -// newValue = ((value - '0') / 2) + '0'; -// else if (value >= 'a' && value <= 'f') -// newValue = ((value + 10 - 'a') / 2) + '0'; -// else if (value >= 'A' && value <= 'F') -// newValue = ((value + 10 - 'A') / 2) + '0'; -// else -// newValue = value; - -// return newValue; -// } - -static inline NSString * -colorForNumber (unsigned int number) -{ - unsigned int index, currentValue; - unsigned char colorTable[] = { 1, 1, 1 }; - NSString *color; - - if (number == 0) - color = @"#ccf"; - else if (number == NSNotFound) - color = @"#f00"; - else - { - currentValue = number; - index = 0; - while (currentValue) - { - if (currentValue & 1) - colorTable[index]++; - if (index == 3) - index = 0; - currentValue >>= 1; - index++; - } - color = [NSString stringWithFormat: @"#%2x%2x%2x", - (255 / colorTable[2]) - 1, - (255 / colorTable[1]) - 1, - (255 / colorTable[0]) - 1]; - } - - return color; -} - @implementation UIxCalendarSelector - (id) init @@ -137,7 +87,7 @@ colorForNumber (unsigned int number) forKey: @"id"]; [calendar setObject: fDisplayName forKey: @"displayName"]; [calendar setObject: folderName forKey: @"folder"]; - [calendar setObject: colorForNumber (count) + [calendar setObject: [folder calendarColor] forKey: @"color"]; isActive = [NSNumber numberWithBool: [folder isActive]]; [calendar setObject: isActive forKey: @"active"]; diff --git a/UI/Scheduler/UIxColorPicker.h b/UI/Scheduler/UIxColorPicker.h new file mode 100644 index 00000000..9a12eff6 --- /dev/null +++ b/UI/Scheduler/UIxColorPicker.h @@ -0,0 +1,31 @@ +/* UIxColorPicker.h - this file is part of SOGo + * + * Copyright (C) 2008 Inverse groupe conseil + * + * Author: Wolfgang Sourdeau + * + * 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. + */ + +#ifndef UIXCOLORPICKER_H +#define UIXCOLORPICKER_H + +#import + +@interface UIxColorPicker : UIxComponent +@end + +#endif /* UIXCOLORPICKER_H */ diff --git a/UI/Scheduler/UIxColorPicker.m b/UI/Scheduler/UIxColorPicker.m new file mode 100644 index 00000000..d4680611 --- /dev/null +++ b/UI/Scheduler/UIxColorPicker.m @@ -0,0 +1,29 @@ +/* UIxColorPicker.m - this file is part of SOGo + * + * Copyright (C) 2008 Inverse groupe conseil + * + * Author: Wolfgang Sourdeau + * + * 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 "UIxColorPicker.h" + +#warning this module should probably be moved into a "Utility" product + +@implementation UIxColorPicker + +@end diff --git a/UI/Scheduler/product.plist b/UI/Scheduler/product.plist index 85db92f0..b18b596b 100644 --- a/UI/Scheduler/product.plist +++ b/UI/Scheduler/product.plist @@ -111,20 +111,23 @@ protectedBy = "View"; pageName = "UIxRecurrenceEditor"; }; + colorPicker = { + protectedBy = "View"; + pageName = "UIxColorPicker"; + }; }; }; SOGoAppointmentFolder = { methods = { - newevent = { - protectedBy = "Add Documents, Images, and Files"; - pageName = "UIxAppointmentEditor"; - actionName = "new"; + properties = { + protectedBy = "Access Contents Information"; + pageName = "UIxCalendarProperties"; }; - newtask = { - protectedBy = "Add Documents, Images, and Files"; - pageName = "UIxTaskEditor"; - actionName = "new"; + saveProperties = { + protectedBy = "Access Contents Information"; + pageName = "UIxCalendarProperties"; + actionName = "saveProperties"; }; show = { protectedBy = "View"; @@ -140,6 +143,16 @@ pageName = "UIxCalUserRightsEditor"; actionName = "saveUserRights"; }; + newevent = { + protectedBy = "Add Documents, Images, and Files"; + pageName = "UIxAppointmentEditor"; + actionName = "new"; + }; + newtask = { + protectedBy = "Add Documents, Images, and Files"; + pageName = "UIxTaskEditor"; + actionName = "new"; + }; }; }; diff --git a/UI/Templates/SchedulerUI/UIxCalendarProperties.wox b/UI/Templates/SchedulerUI/UIxCalendarProperties.wox new file mode 100644 index 00000000..5207d7ff --- /dev/null +++ b/UI/Templates/SchedulerUI/UIxCalendarProperties.wox @@ -0,0 +1,44 @@ + + + +
+ +
+ + +
+
+ + +
+
+
diff --git a/UI/Templates/SchedulerUI/UIxColorPicker.wox b/UI/Templates/SchedulerUI/UIxColorPicker.wox new file mode 100644 index 00000000..6687b7cb --- /dev/null +++ b/UI/Templates/SchedulerUI/UIxColorPicker.wox @@ -0,0 +1,16 @@ + + + + + diff --git a/UI/Templates/UIxJSClose.wox b/UI/Templates/UIxJSClose.wox index 06275838..bb209932 100644 --- a/UI/Templates/UIxJSClose.wox +++ b/UI/Templates/UIxJSClose.wox @@ -7,7 +7,7 @@ > diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index 714dd0df..903ac7e8 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -1617,30 +1617,25 @@ function initCalendarSelector() { function onCalendarModify(event) { var folders = $("calendarList"); var selected = folders.getSelectedNodes()[0]; - - if (UserLogin == selected.getAttribute("owner")) { - var node = selected.childNodes[selected.childNodes.length - 1]; - var currentName = node.nodeValue.trim(); - var newName = window.prompt(labels["Name of the Calendar"], - currentName); - if (newName && newName.length > 0 - && newName != currentName) { - var url = (URLForFolderID(selected.getAttribute("id")) - + "/renameFolder?name=" + escape(newName.utf8encode())); - triggerAjaxRequest(url, folderRenameCallback, - {node: node, name: " " + newName}); - } - } else - window.alert(clabels["Unable to rename that folder!"]); + var calendarID = selected.getAttribute("id"); + var url = ApplicationBaseURL + calendarID + "/properties"; + var properties = window.open(url, calendarID + "properties", + "width=300,height=100,resizable=0,scrollbars=0" + + "toolbar=0,location=0,directories=0,status=0," + + "menubar=0,copyhistory=0"); + properties.focus(); } -function folderRenameCallback(http) { - if (http.readyState == 4) { - if (isHttpStatus204(http.status)) { - var dict = http.callbackData; - dict["node"].nodeValue = dict["name"]; - } - } +function updateCalendarProperties(calendarID, calendarName, calendarColor) { + var idParts = calendarID.split(":"); + var nodeID = "/" + idParts[0]; + if (idParts.length > 1) + nodeID += "_" + idParts[1].split("/")[1]; + var calendarNode = $(nodeID); + var childNodes = calendarNode.childNodes; + childNodes[childNodes.length-1].nodeValue = calendarName; + + appendStyleElement(nodeID, calendarColor); } function onCalendarNew(event) { @@ -1743,8 +1738,12 @@ function appendCalendar(folderName, folderPath) { triggerAjaxRequest(url, calendarEntryCallback, folderPath); // Update CSS for events color - if (!document.styleSheets) return; - + appendStyleElement(folderPath, color); + } +} + +function appendStyleElement(folderPath, color) { + if (document.styleSheets) { var styleElement = document.createElement("style"); styleElement.type = "text/css"; var selectors = [ diff --git a/UI/WebServerResources/UIxCalendarProperties.css b/UI/WebServerResources/UIxCalendarProperties.css new file mode 100644 index 00000000..dc80db08 --- /dev/null +++ b/UI/WebServerResources/UIxCalendarProperties.css @@ -0,0 +1,36 @@ +LABEL +{ display: block; + position: relative; + line-height: 1.5em; + height: 1.5em; + margin-left: .5em; + margin-bottom: .5em; + width: 100%; } + +DIV#propertiesView +{ overflow: hidden; + padding: .5em; } + +SPAN.content +{ position: absolute; + top: -.25em; + left: 8em; + right: 1em; } + +BUTTON#colorButton +{ + display: none; + margin: 1px; + border-bottom: 1px solid #fff; + border-right: 1px solid #fff; + border-top: 2px solid #222; + border-left: 2px solid #222; + -moz-border-top-colors: #9c9a94 #000 transparent; + -moz-border-left-colors: #9c9a94 #000 transparent; + width: 3em; + height: 2em; +} + +DIV#buttons +{ padding: .5em; + text-align: right; } diff --git a/UI/WebServerResources/UIxCalendarProperties.js b/UI/WebServerResources/UIxCalendarProperties.js new file mode 100644 index 00000000..340d33a1 --- /dev/null +++ b/UI/WebServerResources/UIxCalendarProperties.js @@ -0,0 +1,46 @@ +function onLoadCalendarProperties() { + var colorButton = $("colorButton"); + var calendarColor = $("calendarColor"); + colorButton.setStyle({ "backgroundColor": calendarColor.value, display: "inline" }); + colorButton.observe("click", onColorClick); + + var cancelButton = $("cancelButton"); + cancelButton.observe("click", onCancelClick); + + var okButton = $("okButton"); + okButton.observe("click", onOKClick); +} + +function onCancelClick(event) { + window.close(); +} + +function onOKClick(event) { + var calendarName = $("calendarName"); + var calendarColor = $("calendarColor"); + var calendarID = $("calendarID"); + + window.opener.updateCalendarProperties(calendarID.value, + calendarName.value, + calendarColor.value); +} + +function onColorClick(event) { + var cPicker = window.open(ApplicationBaseURL + "colorPicker", "colorPicker", + "width=250,height=200,resizable=0,scrollbars=0" + + "toolbar=0,location=0,directories=0,status=0," + + "menubar=0,copyhistory=0", "test" + ); + cPicker.focus(); + + preventDefault(event); +} + +function onColorPickerChoice(newColor) { + var colorButton = $("colorButton"); + colorButton.setStyle({ "backgroundColor": newColor }); + var calendarColor = $("calendarColor"); + calendarColor.value = newColor; +} + +FastInit.addOnLoad(onLoadCalendarProperties); diff --git a/UI/WebServerResources/UIxColorPicker.js b/UI/WebServerResources/UIxColorPicker.js new file mode 100644 index 00000000..892635d7 --- /dev/null +++ b/UI/WebServerResources/UIxColorPicker.js @@ -0,0 +1,9 @@ +function onLoadColorPicker(event) { + showColorPicker(); +} + +function onChooseColor(newColor) { + window.opener.onColorPickerChoice(newColor); +} + +FastInit.addOnLoad(onLoadColorPicker); diff --git a/UI/WebServerResources/js_color_picker_v2.css b/UI/WebServerResources/js_color_picker_v2.css new file mode 100644 index 00000000..f85fb4ac --- /dev/null +++ b/UI/WebServerResources/js_color_picker_v2.css @@ -0,0 +1,191 @@ + #dhtmlgoodies_colorPicker{ + position:absolute; + width:250px; + padding-bottom:1px; + background-color:#FFF; + border:1px solid #317082; + + width: 252px; /* IE 5.x */ + width/* */:/**/250px; /* Other browsers */ + width: /**/250px; + + } + + #dhtmlgoodies_colorPicker .colorPicker_topRow{ + padding-bottom:1px; + border-bottom:3px double #317082; + background-color:#E2EBED; + padding-left:2px; + + width: 250px; /* IE 5.x */ + width/* */:/**/248px; /* Other browsers */ + width: /**/248px; + + height: 20px; /* IE 5.x */ + height/* */:/**/16px; /* Other browsers */ + height: /**/16px; + + } + + #dhtmlgoodies_colorPicker .colorPicker_statusBar{ + height:13px; + padding-bottom:2px; + width:248px; + border-top:3px double #317082; + background-color:#E2EBED; + padding-left:2px; + clear:both; + + width: 250px; /* IE 5.x */ + width/* */:/**/248px; /* Other browsers */ + width: /**/248px; + + height: 18px; /* IE 5.x */ + height/* */:/**/13px; /* Other browsers */ + height: /**/13px; + + } + + #dhtmlgoodies_colorPicker .colorSquare{ + margin-left:1px; + margin-bottom:1px; + float:left; + border:1px solid #000; + cursor:pointer; + + width: 12px; /* IE 5.x */ + width/* */:/**/10px; /* Other browsers */ + width: /**/10px; + + height: 12px; /* IE 5.x */ + height/* */:/**/10px; /* Other browsers */ + height: /**/10px; + + } + + .colorPickerTab_inactive,.colorPickerTab_active{ + + height:17px; + padding-left:4px; + cursor:pointer; + + + } + .colorPickerTab_inactive span{ + background-image:url('tab_left_inactive.gif'); + } + + .colorPickerTab_active span{ + background-image:url('tab_left_active.gif'); + + } + .colorPickerTab_inactive span, .colorPickerTab_active span{ + line-height:16px; + font-weight:bold; + font-family:arial; + font-size:11px; + padding-top:1px; + vertical-align:middle; + background-position:top left; + background-repeat: no-repeat; + float:left; + padding-left:6px; + -moz-user-select:no; + } + .colorPickerTab_inactive img,.colorPickerTab_active img{ + float:left; + } + .colorPickerCloseButton{ + width:11px; + height:11px; + text-align:center; + line-height:10px; + border:1px solid #317082; + position:absolute; + right:1px; + font-size:12px; + font-weight:bold; + top:1px; + padding:1px; + cursor:pointer; + + width: 15px; /* IE 5.x */ + width/* */:/**/11px; /* Other browsers */ + width: /**/11px; + + height: 15px; /* IE 5.x */ + height/* */:/**/11px; /* Other browsers */ + height: /**/11px; + + + } + #colorPicker_statusBarTxt{ + font-size:11px; + font-family:arial; + vertical-align:top; + line-height:13px; + + } + form{ + padding-left:5px; + } + + .form_widget_amount_slider{ + border-top:1px solid #9d9c99; + border-left:1px solid #9d9c99; + border-bottom:1px solid #eee; + border-right:1px solid #eee; + background-color:#f0ede0; + position:absolute; + bottom:0px; + + width: 5px; /* IE 5.x */ + width/* */:/**/3px; /* Other browsers */ + width: /**/3px; + + height: 5px; /* IE 5.x */ + height/* */:/**/3px; /* Other browsers */ + height: /**/3px; + + } + .colorSliderLabel{ + width:15px; + height:20px; + float:left; + font-size:11px; + font-weight:bold; + } + .colorSlider{ + width:175px; + height:20px; + float:left; + } + .colorInput{ + width:45px; + height:20px; + float:left; + } + .colorPreviewDiv{ + width:186px; + margin-right:2px; + margin-top:1px; + border:1px solid #CCC; + height:20px; + float:left; + cursor:pointer; + + width: 188px; /* IE 5.x */ + width/* */:/**/186px; /* Other browsers */ + width: /**/186px; + + height: 22px; /* IE 5.x */ + height/* */:/**/20px; /* Other browsers */ + height: /**/20px; + + + } + .colorCodeDiv{ + width:50px; + height:20px; + float:left; + } \ No newline at end of file diff --git a/UI/WebServerResources/js_color_picker_v2.js b/UI/WebServerResources/js_color_picker_v2.js new file mode 100644 index 00000000..9c9a9b6c --- /dev/null +++ b/UI/WebServerResources/js_color_picker_v2.js @@ -0,0 +1,580 @@ +/************************************************************************************************************ +@fileoverview +JS Color picker +Copyright (C) October 2005, DHTMLGoodies.com, Alf Magne Kalleland + +This library 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.1 of the License, or (at your option) any later version. + +This library 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 this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Dhtmlgoodies.com., hereby disclaims all copyright interest in this script +written by Alf Magne Kalleland. + +Alf Magne Kalleland, 2007 +Owner of DHTMLgoodies.com + + +************************************************************************************************************/ + +var MSIE = navigator.userAgent.indexOf('MSIE')>=0?true:false; +var navigatorVersion = navigator.appVersion.replace(/.*?MSIE (\d\.\d).*/g,'$1')/1; + +var form_widget_amount_slider_handle = ResourcesURL + "/slider_handle.gif"; +var slider_handle_image_obj = false; +var sliderObjectArray = new Array(); +var slider_counter = 0; +var slideInProgress = false; +var handle_start_x; +var event_start_x; +var currentSliderIndex; + +function form_widget_cancel_event() +{ + return false; +} + +function getImageSliderHeight(){ + if(!slider_handle_image_obj){ + slider_handle_image_obj = new Image(); + slider_handle_image_obj.src = form_widget_amount_slider_handle; + } + if(slider_handle_image_obj.width>0){ + return; + }else{ + setTimeout('getImageSliderHeight()',50); + } +} + +function positionSliderImage(e,theIndex,inputObj) +{ + if(this)inputObj = this; + if(!theIndex)theIndex = inputObj.getAttribute('sliderIndex'); + var handleImg = document.getElementById('slider_handle' + theIndex); + var ratio = sliderObjectArray[theIndex]['width'] / (sliderObjectArray[theIndex]['max']-sliderObjectArray[theIndex]['min']); + var currentValue = sliderObjectArray[theIndex]['formTarget'].value-sliderObjectArray[theIndex]['min']; + handleImg.style.left = currentValue * ratio + 'px'; + setColorByRGB(); +} + +function adjustFormValue(theIndex) +{ + var handleImg = document.getElementById('slider_handle' + theIndex); + var ratio = sliderObjectArray[theIndex]['width'] / (sliderObjectArray[theIndex]['max']-sliderObjectArray[theIndex]['min']); + var currentPos = handleImg.style.left.replace('px',''); + sliderObjectArray[theIndex]['formTarget'].value = Math.round(currentPos / ratio) + sliderObjectArray[theIndex]['min']; + +} + +function initMoveSlider(e) +{ + + if(document.all)e = event; + slideInProgress = true; + event_start_x = e.clientX; + handle_start_x = this.style.left.replace('px',''); + currentSliderIndex = this.id.replace(/[^\d]/g,''); + return false; +} + +function startMoveSlider(e) +{ + if(document.all)e = event; + if(!slideInProgress)return; + var leftPos = handle_start_x/1 + e.clientX/1 - event_start_x; + if(leftPos<0)leftPos = 0; + if(leftPos/1>sliderObjectArray[currentSliderIndex]['width'])leftPos = sliderObjectArray[currentSliderIndex]['width']; + document.getElementById('slider_handle' + currentSliderIndex).style.left = leftPos + 'px'; + adjustFormValue(currentSliderIndex); + if(sliderObjectArray[currentSliderIndex]['onchangeAction']){ + eval(sliderObjectArray[currentSliderIndex]['onchangeAction']); + } +} + +function stopMoveSlider() +{ + slideInProgress = false; +} + + +function form_widget_amount_slider(targetElId,formTarget,width,min,max,onchangeAction) +{ + if(!slider_handle_image_obj){ + getImageSliderHeight(); + } + + slider_counter = slider_counter +1; + sliderObjectArray[slider_counter] = new Array(); + sliderObjectArray[slider_counter] = {"width":width - 9,"min":min,"max":max,"formTarget":formTarget,"onchangeAction":onchangeAction}; + + formTarget.setAttribute('sliderIndex',slider_counter); + formTarget.onchange = positionSliderImage; + var parentObj = document.createElement('DIV'); + parentObj.style.width = width + 'px'; + parentObj.style.height = '12px'; // The height of the image + parentObj.style.position = 'relative'; + parentObj.id = 'slider_container' + slider_counter; + document.getElementById(targetElId).appendChild(parentObj); + + var obj = document.createElement('DIV'); + obj.className = 'form_widget_amount_slider'; + obj.innerHTML = ''; + obj.style.width = width + 'px'; + obj.id = 'slider_slider' + slider_counter; + obj.style.position = 'absolute'; + obj.style.bottom = '0px'; + parentObj.appendChild(obj); + + var handleImg = document.createElement('IMG'); + handleImg.style.position = 'absolute'; + handleImg.style.left = '0px'; + handleImg.style.zIndex = 5; + handleImg.src = slider_handle_image_obj.src; + handleImg.id = 'slider_handle' + slider_counter; + handleImg.onmousedown = initMoveSlider; + if(document.body.onmouseup){ + if(document.body.onmouseup.toString().indexOf('stopMoveSlider')==-1){ + alert('You allready have an onmouseup event assigned to the body tag'); + } + }else{ + document.body.onmouseup = stopMoveSlider; + document.body.onmousemove = startMoveSlider; + } + handleImg.ondragstart = form_widget_cancel_event; + parentObj.appendChild(handleImg); + positionSliderImage(false,slider_counter); +} + + + +var namedColors = new Array('AliceBlue','AntiqueWhite','Aqua','Aquamarine','Azure','Beige','Bisque','Black','BlanchedAlmond','Blue','BlueViolet','Brown', + 'BurlyWood','CadetBlue','Chartreuse','Chocolate','Coral','CornflowerBlue','Cornsilk','Crimson','Cyan','DarkBlue','DarkCyan','DarkGoldenRod','DarkGray', + 'DarkGreen','DarkKhaki','DarkMagenta','DarkOliveGreen','Darkorange','DarkOrchid','DarkRed','DarkSalmon','DarkSeaGreen','DarkSlateBlue','DarkSlateGray', + 'DarkTurquoise','DarkViolet','DeepPink','DeepSkyBlue','DimGray','DodgerBlue','Feldspar','FireBrick','FloralWhite','ForestGreen','Fuchsia','Gainsboro', + 'GhostWhite','Gold','GoldenRod','Gray','Green','GreenYellow','HoneyDew','HotPink','IndianRed','Indigo','Ivory','Khaki','Lavender','LavenderBlush', + 'LawnGreen','LemonChiffon','LightBlue','LightCoral','LightCyan','LightGoldenRodYellow','LightGrey','LightGreen','LightPink','LightSalmon','LightSeaGreen', + 'LightSkyBlue','LightSlateBlue','LightSlateGray','LightSteelBlue','LightYellow','Lime','LimeGreen','Linen','Magenta','Maroon','MediumAquaMarine', + 'MediumBlue','MediumOrchid','MediumPurple','MediumSeaGreen','MediumSlateBlue','MediumSpringGreen','MediumTurquoise','MediumVioletRed','MidnightBlue', + 'MintCream','MistyRose','Moccasin','NavajoWhite','Navy','OldLace','Olive','OliveDrab','Orange','OrangeRed','Orchid','PaleGoldenRod','PaleGreen', + 'PaleTurquoise','PaleVioletRed','PapayaWhip','PeachPuff','Peru','Pink','Plum','PowderBlue','Purple','Red','RosyBrown','RoyalBlue','SaddleBrown', + 'Salmon','SandyBrown','SeaGreen','SeaShell','Sienna','Silver','SkyBlue','SlateBlue','SlateGray','Snow','SpringGreen','SteelBlue','Tan','Teal','Thistle', + 'Tomato','Turquoise','Violet','VioletRed','Wheat','White','WhiteSmoke','Yellow','YellowGreen'); + +var namedColorRGB = new Array('#F0F8FF','#FAEBD7','#00FFFF','#7FFFD4','#F0FFFF','#F5F5DC','#FFE4C4','#000000','#FFEBCD','#0000FF','#8A2BE2','#A52A2A','#DEB887', + '#5F9EA0','#7FFF00','#D2691E','#FF7F50','#6495ED','#FFF8DC','#DC143C','#00FFFF','#00008B','#008B8B','#B8860B','#A9A9A9','#006400','#BDB76B','#8B008B', + '#556B2F','#FF8C00','#9932CC','#8B0000','#E9967A','#8FBC8F','#483D8B','#2F4F4F','#00CED1','#9400D3','#FF1493','#00BFFF','#696969','#1E90FF','#D19275', + '#B22222','#FFFAF0','#228B22','#FF00FF','#DCDCDC','#F8F8FF','#FFD700','#DAA520','#808080','#008000','#ADFF2F','#F0FFF0','#FF69B4','#CD5C5C','#4B0082', + '#FFFFF0','#F0E68C','#E6E6FA','#FFF0F5','#7CFC00','#FFFACD','#ADD8E6','#F08080','#E0FFFF','#FAFAD2','#D3D3D3','#90EE90','#FFB6C1','#FFA07A','#20B2AA', + '#87CEFA','#8470FF','#778899','#B0C4DE','#FFFFE0','#00FF00','#32CD32','#FAF0E6','#FF00FF','#800000','#66CDAA','#0000CD','#BA55D3','#9370D8','#3CB371', + '#7B68EE','#00FA9A','#48D1CC','#C71585','#191970','#F5FFFA','#FFE4E1','#FFE4B5','#FFDEAD','#000080','#FDF5E6','#808000','#6B8E23','#FFA500','#FF4500', + '#DA70D6','#EEE8AA','#98FB98','#AFEEEE','#D87093','#FFEFD5','#FFDAB9','#CD853F','#FFC0CB','#DDA0DD','#B0E0E6','#800080','#FF0000','#BC8F8F','#4169E1', + '#8B4513','#FA8072','#F4A460','#2E8B57','#FFF5EE','#A0522D','#C0C0C0','#87CEEB','#6A5ACD','#708090','#FFFAFA','#00FF7F','#4682B4','#D2B48C','#008080', + '#D8BFD8','#FF6347','#40E0D0','#EE82EE','#D02090','#F5DEB3','#FFFFFF','#F5F5F5','#FFFF00','#9ACD32'); + + +var color_picker_div = false; +var color_picker_active_tab = false; +// var color_picker_form_field = false; +// var color_picker_active_input = false; +function baseConverter (number,ob,nb) { + number = number + ""; + number = number.toUpperCase(); + var list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + var dec = 0; + for (var i = 0; i <= number.length; i++) { + dec += (list.indexOf(number.charAt(i))) * (Math.pow(ob , (number.length - i - 1))); + } + number = ""; + var magnitude = Math.floor((Math.log(dec))/(Math.log(nb))); + for (var i = magnitude; i >= 0; i--) { + var amount = Math.floor(dec/Math.pow(nb,i)); + number = number + list.charAt(amount); + dec -= amount*(Math.pow(nb,i)); + } + if(number.length==0)number=0; + return number; +} + +// function colorPickerGetTopPos(inputObj) +// { + +// var returnValue = inputObj.offsetTop; +// while((inputObj = inputObj.offsetParent) != null){ +// returnValue += inputObj.offsetTop; +// } +// return returnValue; +// } + +// function colorPickerGetLeftPos(inputObj) +// { +// var returnValue = inputObj.offsetLeft; +// while((inputObj = inputObj.offsetParent) != null)returnValue += inputObj.offsetLeft; +// return returnValue; +// } + +function cancelColorPickerEvent(){ + return false; +} + +function showHideColorOptions(e,inputObj) +{ + var thisObj = this; + if(inputObj){ + var parentNode = inputObj.parentNode; + thisObj = inputObj; + }else var parentNode = this.parentNode; + var activeColorDiv = false; + var subDiv = parentNode.getElementsByTagName('DIV')[0]; + counter=0; + var initZIndex = 10; + var contentDiv = document.getElementById('color_picker_content').getElementsByTagName('DIV')[0]; + do{ + if(subDiv.tagName=='DIV') { + if(subDiv==thisObj){ + thisObj.className='colorPickerTab_active'; + thisObj.style.zIndex = 50; + var img = thisObj.getElementsByTagName('IMG')[0]; + img.src = ResourcesURL + "/tab_right_active.gif" + img.src = img.src.replace(/inactive/,'active'); + contentDiv.style.display='block'; + activeColorDiv = contentDiv; + }else{ + subDiv.className = 'colorPickerTab_inactive'; + var img = subDiv.getElementsByTagName('IMG')[0]; + img.src = ResourcesURL + "/tab_right_inactive.gif"; + if(activeColorDiv) + subDiv.style.zIndex = initZIndex - counter; + else + subDiv.style.zIndex = counter; + contentDiv.style.display='none'; + } + counter++; + } + subDiv = subDiv.nextSibling; + if(contentDiv.nextSibling)contentDiv = contentDiv.nextSibling; + }while(subDiv); + + + document.getElementById('colorPicker_statusBarTxt').innerHTML = ' '; + + +} + +function createColorPickerTopRow(inputObj){ + var tabs = ['RGB','Named colors','Color slider']; + var tabWidths = [37,90,70]; + var div = document.createElement('DIV'); + div.className='colorPicker_topRow'; + + inputObj.appendChild(div); + var currentWidth = 0; + for(var no=0;no=0;r-=3){ + for(var g=0;g<=15;g+=3){ + for(var b=0;b<=15;b+=3){ + var red = baseConverter(r,10,16) + ''; + var green = baseConverter(g,10,16) + ''; + var blue = baseConverter(b,10,16) + ''; + + var color = '#' + red + red + green + green + blue + blue; + var div = document.createElement('DIV'); + div.style.backgroundColor=color; + div.innerHTML = ''; + div.className='colorSquare'; + div.title = color; + div.onclick = chooseColor; + div.setAttribute('rgbColor',color); + div.onmouseover = colorPickerShowStatusBarText; + div.onmouseout = colorPickerHideStatusBarText; + webColorDiv.appendChild(div); + } + } + } +} + +function createNamedColors(inputObj){ + var namedColorDiv = document.createElement('DIV'); + namedColorDiv.style.paddingTop = '1px'; + namedColorDiv.style.display='none'; + inputObj.appendChild(namedColorDiv); + for(var no=0;no255)r=255; + if(g/1>255)g=255; + if(b/1>255)b=255; + r = baseConverter(r,10,16) + ''; + g = baseConverter(g,10,16) + ''; + b = baseConverter(b,10,16) + ''; + if(r.length==1)r = '0' + r; + if(g.length==1)g = '0' + g; + if(b.length==1)b = '0' + b; + + document.getElementById('colorPreview').style.backgroundColor = '#' + r + g + b; + document.getElementById('js_color_picker_color_code').value = '#' + r + g + b; +} diff --git a/UI/WebServerResources/slider_handle.gif b/UI/WebServerResources/slider_handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..28de71905bd340ca6503ff0e785497f9ea36b63b GIT binary patch literal 511 zcmZ?wbhEHb^5Nq7(|>+{fBpLTuHzR%yVGjAr~LZz?f19u zb=}jhy}5As<$=H7eyuuu`1q?MhhFTPbAI*SSG%&hyZ-KYti! zF}N*?{r2TkNN-BU^yWPecD{f8dgqDrtZNw$z1-inYT^I?{~3l9Q2fcl$iU#rpaXI> zC{7sIV;WqWT;(*In`DGkthJjJ^o2#`C0$(kmCX4Vba^a9R5ffE8JHZ5xY<}37BjIj zbF5swWZi~UYqpqJs&jI3i5ciPDhmiY^V%EhDVj<+nW>3eX&Kr{vtPHBm1<T BtKt9v literal 0 HcmV?d00001 diff --git a/UI/WebServerResources/tab_.gif b/UI/WebServerResources/tab_.gif deleted file mode 100644 index ad720a0c634d7e8c6ffc3490b425e8d261312f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmZ?wbhEHbOl1&bn8*ME|NsAIGwFWu;(-o`2NGvsikQ;B^7LDNW$wfq-J9?2`OV)p z+oAJW=Q7R6mG8J`=lERzmh=2q=lg%_Uoy7aDSnJFR+_G-`dL%kak-7=*I$K6+r@On dU;hm{oTRbyjLqVSuS_?-WjplP)r*nA8UXE_I41xA diff --git a/UI/WebServerResources/tab_selected.gif b/UI/WebServerResources/tab_selected.gif deleted file mode 100644 index 2cbdea66a508c7d581fa1f4775de5bbb2e253b97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmZ?wbhEHbOl1&bn8*ME|NsAIGwJ^N^`#Do2NGvsikQ;B^7LDNW$wfq-J9?2`OV)p z+oAJW=Q7R6mG8J`=lERzmh=2q=lg%_Uoy7aDSnJFR+_G-`dL%kak-7=*I$K6+r@On dU;hm{oTRbyjLqVSuS_?-WjplP)r*nA8UXv)I7$Ej -- 2.39.5