Monotone-Parent: 22d8f930ef0774232d40575f91fe4eb49c980bd6
Monotone-Revision: 4c641cc8cb0c4617186e4139ce2c11f856fbbbf7 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2008-04-21T23:03:48 Monotone-Branch: ca.inverse.sogomaint-2.0.2
|
@ -1,3 +1,12 @@
|
|||
2008-04-21 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* 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 <wsourdeau@inverse.ca>
|
||||
|
||||
* UI/MailPartViewers/UIxMailPartHTMLViewer.m
|
||||
|
|
|
@ -58,6 +58,9 @@
|
|||
|
||||
- (BOOL) isActive;
|
||||
|
||||
- (NSString *) calendarColor;
|
||||
- (void) setCalendarColor: (NSString *) newColor;
|
||||
|
||||
/* selection */
|
||||
|
||||
- (NSArray *) calendarUIDs;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
- (NSString *) urlWithoutParameters;
|
||||
|
||||
- (NSString *) davMethodToObjC;
|
||||
- (NSString *) davSetterName;
|
||||
- (NSDictionary *) asDavInvocation;
|
||||
|
||||
- (NSString *) stringByDetectingURLs;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -59,6 +59,8 @@
|
|||
- (GCSFolder *) ocsFolderForPath: (NSString *)_path;
|
||||
- (GCSFolder *) ocsFolder;
|
||||
|
||||
- (NSString *) folderReference;
|
||||
|
||||
/* lower level fetches */
|
||||
- (BOOL) nameExistsInFolder: (NSString *) objectName;
|
||||
|
||||
|
|
|
@ -227,11 +227,53 @@ 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;
|
||||
|
||||
if ([newName length])
|
||||
{
|
||||
[self renameTo: newName];
|
||||
error = nil;
|
||||
}
|
||||
else
|
||||
error = [NSException exceptionWithHTTPStatus: 400
|
||||
reason: [NSString stringWithFormat:
|
||||
@"Empty string"]];
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
- (GCSFolder *) ocsFolder
|
||||
{
|
||||
GCSFolder *folder;
|
||||
|
@ -449,8 +491,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 +565,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;
|
||||
|
|
|
@ -1342,4 +1342,55 @@ static BOOL sendACLAdvisories = NO;
|
|||
return r;
|
||||
}
|
||||
|
||||
- (NSException *) _setDavProperty: (NSString *) property
|
||||
toValue: (id) newValue
|
||||
{
|
||||
NSException *exception;
|
||||
SEL methodSel;
|
||||
|
||||
methodSel = NSSelectorFromString ([property davSetterName]);
|
||||
if ([self respondsToSelector: methodSel])
|
||||
exception = [self performSelector: methodSel
|
||||
withObject: newValue];
|
||||
else
|
||||
exception
|
||||
= [NSException exceptionWithHTTPStatus: 404
|
||||
reason: [NSString stringWithFormat:
|
||||
@"Property '%@' cannot be set.",
|
||||
property]];
|
||||
|
||||
return exception;
|
||||
}
|
||||
|
||||
- (NSException *) davSetProperties: (NSDictionary *) setProps
|
||||
removePropertiesNamed: (NSDictionary *) removedProps
|
||||
inContext: (WOContext *) localContext
|
||||
{
|
||||
NSString *currentProp;
|
||||
NSException *exception;
|
||||
NSArray *currentRoles;
|
||||
NSEnumerator *properties;
|
||||
id currentValue;
|
||||
|
||||
currentRoles = [[localContext activeUser] rolesForObject: self
|
||||
inContext: localContext];
|
||||
if ([currentRoles containsObject: SoRole_Owner])
|
||||
{
|
||||
properties = [[setProps allKeys] objectEnumerator];
|
||||
exception = nil;
|
||||
while (!exception
|
||||
&& (currentProp = [properties nextObject]))
|
||||
{
|
||||
currentValue = [setProps objectForKey: currentProp];
|
||||
exception = [self _setDavProperty: currentProp
|
||||
toValue: currentValue];
|
||||
}
|
||||
}
|
||||
else
|
||||
exception = [NSException exceptionWithHTTPStatus: 403
|
||||
reason: @"Modification denied."];
|
||||
|
||||
return exception;
|
||||
}
|
||||
|
||||
@end /* SOGoObject */
|
||||
|
|
|
@ -36,6 +36,8 @@
|
|||
|
||||
@class NSArray;
|
||||
@class NSDictionary;
|
||||
@class NSMutableArray;
|
||||
@class NSMutableDictionary;
|
||||
@class NSString;
|
||||
@class NSTimeZone;
|
||||
@class NSURL;
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
NSString *owner;
|
||||
NSString *login;
|
||||
NSString *baseFolder;
|
||||
NSString *subscriptionPointer;
|
||||
NSMutableDictionary *moduleSettings;
|
||||
BOOL isMailInvitation;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -13,6 +13,8 @@ SchedulerUI_OBJC_FILES = \
|
|||
NSArray+Scheduler.m \
|
||||
\
|
||||
UIxCalMainView.m \
|
||||
UIxCalendarProperties.m \
|
||||
UIxColorPicker.m \
|
||||
\
|
||||
UIxCalFilterPanel.m \
|
||||
UIxCalDayTable.m \
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
/* UIxCalendarProperties.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2008 Inverse groupe conseil
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
* 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
|
|
@ -0,0 +1,91 @@
|
|||
/* UIxCalendarProperties.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2008 Inverse groupe conseil
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
* 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 <SoObjects/SOGo/SOGoUser.h>
|
||||
#import <SoObjects/Appointments/SOGoAppointmentFolder.h>
|
||||
|
||||
#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 <WOActionResults>) savePropertiesAction
|
||||
{
|
||||
return [self jsCloseWithRefreshMethod: nil];
|
||||
}
|
||||
|
||||
@end
|
|
@ -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"];
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
/* UIxColorPicker.h - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2008 Inverse groupe conseil
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
* 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 <SOGoUI/UIxComponent.h>
|
||||
|
||||
@interface UIxColorPicker : UIxComponent
|
||||
@end
|
||||
|
||||
#endif /* UIXCOLORPICKER_H */
|
|
@ -0,0 +1,29 @@
|
|||
/* UIxColorPicker.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2008 Inverse groupe conseil
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
* 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
|
|
@ -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 = "View";
|
||||
pageName = "UIxCalendarProperties";
|
||||
};
|
||||
newtask = {
|
||||
protectedBy = "Add Documents, Images, and Files";
|
||||
pageName = "UIxTaskEditor";
|
||||
actionName = "new";
|
||||
saveProperties = {
|
||||
protectedBy = "View";
|
||||
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";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version='1.0' standalone='yes'?>
|
||||
<!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:rsrc="OGo:url"
|
||||
xmlns:label="OGo:label"
|
||||
className="UIxPageFrame"
|
||||
const:toolbar="none"
|
||||
const:popup="YES"
|
||||
title="title">
|
||||
<form const:href="saveProperties" name="propertiesform">
|
||||
<input type="hidden" const:name="calendarID" const:id="calendarID" var:value="calendarID"/>
|
||||
<div id="propertiesView">
|
||||
<label><var:string label:value="Name:" /><span class="content"
|
||||
><input type="text" name="calendarName" id="calendarName"
|
||||
var:disabled="calendarNameIsDisabled"
|
||||
class="textField"
|
||||
var:value="calendarName"
|
||||
/></span></label>
|
||||
<label><var:string label:value="Color:" /><span class="content"
|
||||
><button id="colorButton"><!-- space --></button>
|
||||
<input type="hidden"
|
||||
name="calendarColor"
|
||||
id="calendarColor"
|
||||
class="textField"
|
||||
var:value="calendarColor"
|
||||
/></span></label>
|
||||
</div>
|
||||
<div id="buttons">
|
||||
<input type="button"
|
||||
const:class="button"
|
||||
label:value="Cancel"
|
||||
const:id="cancelButton"
|
||||
name="cancelButton"/>
|
||||
<input type="submit"
|
||||
const:class="button"
|
||||
label:value="OK"
|
||||
const:id="okButton"
|
||||
name="okButton"/>
|
||||
</div>
|
||||
</form>
|
||||
</var:component>
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version='1.0' standalone='yes'?>
|
||||
<!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:rsrc="OGo:url"
|
||||
xmlns:label="OGo:label"
|
||||
className="UIxPageFrame"
|
||||
const:toolbar="none"
|
||||
const:popup="YES"
|
||||
title="title"
|
||||
const:jsFiles="js_color_picker_v2.js"
|
||||
const:cssFiles="js_color_picker_v2.css">
|
||||
<input type="hidden" const:name="pickerValue" const:id="pickerValue"/>
|
||||
</var:component>
|
|
@ -7,7 +7,7 @@
|
|||
><script type="text/javascript"
|
||||
><var:if condition="hasRefreshMethod"
|
||||
>window.opener.setTimeout('<var:string value="refreshMethod"
|
||||
const:escapeHTML="NO" />;', 200);</var:if
|
||||
const:escapeHTML="NO" />;', 50);</var:if
|
||||
>window.close();</script
|
||||
></body></html
|
||||
></container>
|
||||
|
|
|
@ -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 = (URLForFolderID(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 = [
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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 = '<span></span>';
|
||||
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<tabs.length;no++){
|
||||
|
||||
var tabDiv = document.createElement('DIV');
|
||||
tabDiv.onselectstart = cancelColorPickerEvent;
|
||||
tabDiv.ondragstart = cancelColorPickerEvent;
|
||||
if(no==0){
|
||||
suffix = 'active';
|
||||
color_picker_active_tab = this;
|
||||
}else suffix = 'inactive';
|
||||
|
||||
tabDiv.id = 'colorPickerTab' + no;
|
||||
tabDiv.onclick = showHideColorOptions;
|
||||
if(no==0)tabDiv.style.zIndex = 50; else tabDiv.style.zIndex = 1 + (tabs.length-no);
|
||||
tabDiv.style.left = currentWidth + 'px';
|
||||
tabDiv.style.position = 'absolute';
|
||||
tabDiv.className='colorPickerTab_' + suffix;
|
||||
var tabSpan = document.createElement('SPAN');
|
||||
tabSpan.innerHTML = tabs[no];
|
||||
tabDiv.appendChild(tabSpan);
|
||||
var tabImg = document.createElement('IMG');
|
||||
tabImg.src = ResourcesURL + "/tab_right_" + suffix + ".gif";
|
||||
tabDiv.appendChild(tabImg);
|
||||
div.appendChild(tabDiv);
|
||||
if(navigatorVersion<6 && MSIE){ /* Lower IE version fix */
|
||||
tabSpan.style.position = 'relative';
|
||||
tabImg.style.position = 'relative';
|
||||
tabImg.style.left = '-3px';
|
||||
tabDiv.style.cursor = 'hand';
|
||||
}
|
||||
currentWidth = currentWidth + tabWidths[no];
|
||||
|
||||
}
|
||||
|
||||
/* var closeButton = document.createElement('DIV');
|
||||
closeButton.className='colorPickerCloseButton';
|
||||
closeButton.innerHTML = 'x';
|
||||
closeButton.onclick = closeColorPicker;
|
||||
closeButton.onmouseover = toggleCloseButton;
|
||||
closeButton.onmouseout = toggleOffCloseButton;
|
||||
div.appendChild(closeButton); */
|
||||
|
||||
}
|
||||
|
||||
function createWebColors(inputObj){
|
||||
var webColorDiv = document.createElement('DIV');
|
||||
webColorDiv.style.paddingTop = '1px';
|
||||
inputObj.appendChild(webColorDiv);
|
||||
for(var r=15;r>=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 = '<span></span>';
|
||||
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;no<namedColors.length;no++){
|
||||
var color = namedColorRGB[no];
|
||||
var div = document.createElement('DIV');
|
||||
div.style.backgroundColor=color;
|
||||
div.innerHTML = '<span></span>';
|
||||
div.className='colorSquare';
|
||||
div.title = namedColors[no];
|
||||
div.onclick = chooseColor;
|
||||
div.onmouseover = colorPickerShowStatusBarText;
|
||||
div.onmouseout = colorPickerHideStatusBarText;
|
||||
div.setAttribute('rgbColor',color);
|
||||
namedColorDiv.appendChild(div);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function colorPickerHideStatusBarText()
|
||||
{
|
||||
document.getElementById('colorPicker_statusBarTxt').innerHTML = ' ';
|
||||
}
|
||||
|
||||
function colorPickerShowStatusBarText()
|
||||
{
|
||||
var txt = this.getAttribute('rgbColor');
|
||||
if(this.title.indexOf('#')<0)txt = txt + " (" + this.title + ")";
|
||||
document.getElementById('colorPicker_statusBarTxt').innerHTML = txt;
|
||||
}
|
||||
|
||||
function createAllColorDiv(inputObj){
|
||||
var allColorDiv = document.createElement('DIV');
|
||||
allColorDiv.style.display='none';
|
||||
allColorDiv.className = 'js_color_picker_allColorDiv';
|
||||
allColorDiv.style.paddingLeft = '3px';
|
||||
allColorDiv.style.paddingTop = '5px';
|
||||
allColorDiv.style.paddingBottom = '5px';
|
||||
inputObj.appendChild(allColorDiv);
|
||||
|
||||
var labelDiv = document.createElement('DIV');
|
||||
labelDiv.className='colorSliderLabel';
|
||||
labelDiv.innerHTML = 'R';
|
||||
allColorDiv.appendChild(labelDiv);
|
||||
|
||||
var innerDiv = document.createElement('DIV');
|
||||
innerDiv.className = 'colorSlider';
|
||||
innerDiv.id = 'sliderRedColor';
|
||||
allColorDiv.appendChild(innerDiv);
|
||||
|
||||
var innerDivInput = document.createElement('DIV');
|
||||
innerDivInput.className='colorInput';
|
||||
|
||||
var input = document.createElement('INPUT');
|
||||
input.id = 'js_color_picker_red_color';
|
||||
input.maxlength = 3;
|
||||
input.style.width = '48px';
|
||||
input.style.fontSize = '11px';
|
||||
input.name = 'redColor';
|
||||
input.value = 0;
|
||||
|
||||
innerDivInput.appendChild(input);
|
||||
allColorDiv.appendChild(innerDivInput);
|
||||
|
||||
var labelDiv = document.createElement('DIV');
|
||||
labelDiv.className='colorSliderLabel';
|
||||
labelDiv.innerHTML = 'G';
|
||||
allColorDiv.appendChild(labelDiv);
|
||||
|
||||
var innerDiv = document.createElement('DIV');
|
||||
innerDiv.className = 'colorSlider';
|
||||
innerDiv.id = 'sliderGreenColor';
|
||||
allColorDiv.appendChild(innerDiv);
|
||||
|
||||
var innerDivInput = document.createElement('DIV');
|
||||
innerDivInput.className='colorInput';
|
||||
|
||||
var input = document.createElement('INPUT');
|
||||
input.id = 'js_color_picker_green_color';
|
||||
input.maxlength = 3;
|
||||
input.style.width = '48px';
|
||||
input.style.fontSize = '11px';
|
||||
input.name = 'GreenColor';
|
||||
input.value = 0;
|
||||
|
||||
innerDivInput.appendChild(input);
|
||||
allColorDiv.appendChild(innerDivInput);
|
||||
|
||||
var labelDiv = document.createElement('DIV');
|
||||
labelDiv.className='colorSliderLabel';
|
||||
labelDiv.innerHTML = 'B';
|
||||
allColorDiv.appendChild(labelDiv);
|
||||
var innerDiv = document.createElement('DIV');
|
||||
innerDiv.className = 'colorSlider';
|
||||
innerDiv.id = 'sliderBlueColor';
|
||||
allColorDiv.appendChild(innerDiv);
|
||||
|
||||
var innerDivInput = document.createElement('DIV');
|
||||
innerDivInput.className='colorInput';
|
||||
|
||||
var input = document.createElement('INPUT');
|
||||
input.id = 'js_color_picker_blue_color';
|
||||
input.maxlength = 3;
|
||||
input.style.width = '48px';
|
||||
input.style.fontSize = '11px';
|
||||
input.name = 'BlueColor';
|
||||
input.value = 0;
|
||||
|
||||
innerDivInput.appendChild(input);
|
||||
allColorDiv.appendChild(innerDivInput);
|
||||
|
||||
|
||||
var colorPreview = document.createElement('DIV');
|
||||
colorPreview.className='colorPreviewDiv';
|
||||
colorPreview.id = 'colorPreview';
|
||||
colorPreview.style.backgroundColor = '#000000';
|
||||
colorPreview.innerHTML = '<span></span>';
|
||||
colorPreview.title = 'Click on me to assign color';
|
||||
allColorDiv.appendChild(colorPreview);
|
||||
colorPreview.onclick = chooseColorSlider;
|
||||
|
||||
var colorCodeDiv = document.createElement('DIV');
|
||||
colorCodeDiv.className='colorCodeDiv';
|
||||
var input = document.createElement('INPUT');
|
||||
input.id = 'js_color_picker_color_code';
|
||||
|
||||
colorCodeDiv.appendChild(input);
|
||||
input.maxLength = 7;
|
||||
input.style.fontSize = '11px';
|
||||
input.style.width = '48px';
|
||||
input.value = '#000000';
|
||||
input.onchange = setPreviewColorFromTxt;
|
||||
input.onblur = setPreviewColorFromTxt;
|
||||
allColorDiv.appendChild(colorCodeDiv);
|
||||
|
||||
var clearingDiv = document.createElement('DIV');
|
||||
clearingDiv.style.clear = 'both';
|
||||
allColorDiv.appendChild(clearingDiv);
|
||||
|
||||
|
||||
form_widget_amount_slider('sliderRedColor',document.getElementById('js_color_picker_red_color'),170,0,255,"setColorByRGB()");
|
||||
form_widget_amount_slider('sliderGreenColor',document.getElementById('js_color_picker_green_color'),170,0,255,"setColorByRGB()");
|
||||
form_widget_amount_slider('sliderBlueColor',document.getElementById('js_color_picker_blue_color'),170,0,255,"setColorByRGB()");
|
||||
}
|
||||
|
||||
function setPreviewColorFromTxt()
|
||||
{
|
||||
if(this.value.match(/\#[0-9A-F]{6}/g)){
|
||||
document.getElementById('colorPreview').style.backgroundColor=this.value;
|
||||
var r = this.value.substr(1,2);
|
||||
var g = this.value.substr(3,2);
|
||||
var b = this.value.substr(5,2);
|
||||
document.getElementById('js_color_picker_red_color').value = baseConverter(r,16,10);
|
||||
document.getElementById('js_color_picker_green_color').value = baseConverter(g,16,10);
|
||||
document.getElementById('js_color_picker_blue_color').value = baseConverter(b,16,10);
|
||||
|
||||
positionSliderImage(false,1,document.getElementById('js_color_picker_red_color'));
|
||||
positionSliderImage(false,2,document.getElementById('js_color_picker_green_color'));
|
||||
positionSliderImage(false,3,document.getElementById('js_color_picker_blue_color'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function chooseColor()
|
||||
{
|
||||
onChooseColor(this.getAttribute('rgbColor'));
|
||||
// color_picker_form_field.value = this.getAttribute('rgbColor');
|
||||
// color_picker_div.style.display='none';
|
||||
}
|
||||
|
||||
function createStatusBar(inputObj)
|
||||
{
|
||||
var div = document.createElement('DIV');
|
||||
div.className='colorPicker_statusBar';
|
||||
var innerSpan = document.createElement('SPAN');
|
||||
innerSpan.id = 'colorPicker_statusBarTxt';
|
||||
div.appendChild(innerSpan);
|
||||
inputObj.appendChild(div);
|
||||
}
|
||||
|
||||
function chooseColorSlider()
|
||||
{
|
||||
onChooseColor(document.getElementById('js_color_picker_color_code').value);
|
||||
// color_picker_form_field.value = document.getElementById('js_color_picker_color_code').value;
|
||||
// color_picker_div.style.display='none';
|
||||
}
|
||||
|
||||
|
||||
function showColorPicker()
|
||||
{
|
||||
if(!color_picker_div){
|
||||
color_picker_div = document.createElement('DIV');
|
||||
color_picker_div.id = 'dhtmlgoodies_colorPicker';
|
||||
document.body.appendChild(color_picker_div);
|
||||
createColorPickerTopRow(color_picker_div);
|
||||
var contentDiv = document.createElement('DIV');
|
||||
contentDiv.id = 'color_picker_content';
|
||||
color_picker_div.appendChild(contentDiv);
|
||||
createWebColors(contentDiv);
|
||||
createNamedColors(contentDiv);
|
||||
createAllColorDiv(contentDiv);
|
||||
createStatusBar(color_picker_div);
|
||||
}
|
||||
// if(color_picker_div.style.display=='none' || color_picker_active_input!=inputObj)color_picker_div.style.display='block'; else color_picker_div.style.display='none';
|
||||
// color_picker_div.style.left = colorPickerGetLeftPos(inputObj) + 'px';
|
||||
// color_picker_div.style.top = colorPickerGetTopPos(inputObj) + inputObj.offsetHeight + 2 + 'px';
|
||||
// color_picker_form_field = formField;
|
||||
// color_picker_active_input = inputObj;
|
||||
}
|
||||
|
||||
function setColorByRGB()
|
||||
{
|
||||
var formObj = document.forms[0];
|
||||
var r = document.getElementById('js_color_picker_red_color').value.replace(/[^\d]/,'');
|
||||
var g = document.getElementById('js_color_picker_green_color').value.replace(/[^\d]/,'');
|
||||
var b = document.getElementById('js_color_picker_blue_color').value.replace(/[^\d]/,'');
|
||||
if(r/1>255)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;
|
||||
}
|
After Width: | Height: | Size: 636 B |
After Width: | Height: | Size: 650 B |
After Width: | Height: | Size: 639 B |
Before Width: | Height: | Size: 127 B |
After Width: | Height: | Size: 73 B |
After Width: | Height: | Size: 920 B |
After Width: | Height: | Size: 920 B |
After Width: | Height: | Size: 329 B |
After Width: | Height: | Size: 331 B |
Before Width: | Height: | Size: 127 B |