/*
 Copyright (C) 2000-2004 SKYRIX Software AG
 
 This file is part of OGo
 
 OGo is free software; you can redistribute it and/or modify it under
 the terms of the GNU Lesser General Public License as published by the
 Free Software Foundation; either version 2, or (at your option) any
 later version.
 
 OGo is distributed in the hope that it will be useful, but WITHOUT ANY
 WARRANTY; without even the implied warranty of MERCHANTABILITY or
 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
 License for more details.
 
 You should have received a copy of the GNU Lesser General Public
 License along with OGo; see the file COPYING.  If not, write to the
 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.
 */
// $Id$

#import <NGExtensions/NGExtensions.h>
#import <NGCards/iCalPerson.h>

#import <SOGoUI/UIxComponent.h>
#import <SOGo/AgenorUserManager.h>

#import "common.h"

#import "UIxContactSelector.h"

@implementation UIxContactSelector

- (id)init {
  if ((self = [super init])) {
    [self setTitle:@"UIxContacts"];
    [self setWindowId:@"UIxContacts"];
    [self setCallback:@"undefined"];
    checkedBoxes = nil;
    userColors = nil;
  }
  return self;
}

- (void)dealloc {
  [self->title    release];
  [self->windowId release];
  [self->callback release];
  [super dealloc];
}

/* accessors */

- (void)setTitle:(NSString *)_title {
  ASSIGNCOPY(self->title, _title);
}
- (NSString *)title {
  return self->title;
}

- (void)setWindowId:(NSString *)_winId {
  ASSIGNCOPY(self->windowId, _winId);
}
- (NSString *)windowId {
  return self->windowId;
}

- (void)setSelectorId:(NSString *)_selId {
  ASSIGNCOPY(selectorId, _selId);
}

- (NSString *)selectorId {
  return selectorId;
}

- (NSString *)selectorIdList {
  return [NSString stringWithFormat: @"uixselector-%@-uidList", selectorId];
}

- (NSString *)selectorIdDisplay {
  return [NSString stringWithFormat: @"uixselector-%@-display", selectorId];
}

- (void)setCallback:(NSString *)_callback {
  ASSIGNCOPY(self->callback, _callback);
}
- (NSString *)callback {
  return self->callback;
}

/* Helper */

- (NSString *)relativeContactsPath {
  return [self relativePathToUserFolderSubPath:@"Contacts/select"];
}

/* JavaScript */

- (NSString *)jsFunctionName {
  return [NSString stringWithFormat:@"openUIxContactsListViewWindowWithId%@",
    [self windowId]];
}

- (NSString *)jsFunctionHref {
  return [NSString stringWithFormat:@"javascript:%@()",
    [self jsFunctionName]];
}

- (NSString *)jsCode {
  static NSString *codeFmt = \
  @"function %@() {\n"
  @"  var url = '%@?callback=%@';\n"
  @"  var contactsWindow = window.open(url, '%@', 'width=600, height=400, left=10, top=10, toolbar=no, dependent=yes, menubar=no, location=no, resizable=yes, scrollbars=yes, directories=no, status=no');\n"
  @"  contactsWindow.focus();\n"
  @"}";
  return [NSString stringWithFormat:codeFmt,
    [self jsFunctionName],
    [self relativeContactsPath],
    [self callback],
    [self windowId]];
}

- (void) setContacts: (NSArray *) _contacts
{
  contacts = _contacts;
}

- (NSArray *) contacts
{
  return contacts;
}

- (NSArray *) getICalPersonsFromValue: (NSString *) selectorValue
{
  NSMutableArray *persons;
  NSEnumerator *uids;
  NSString *uid;
  AgenorUserManager *um;

  um = [AgenorUserManager sharedUserManager];

  persons = [NSMutableArray new];
  [persons autorelease];

  if ([selectorValue length] > 0)
    {
      uids = [[selectorValue componentsSeparatedByString: @","]
               objectEnumerator];
      uid = [uids nextObject];
      while (uid)
        {
          [persons addObject: [um iCalPersonWithUid: uid]];
          uid = [uids nextObject];
        }
    }

  return persons;
}

- (void) takeValuesFromRequest: (WORequest *) _rq
                     inContext: (WOContext *) _ctx
{
  contacts = [self getICalPersonsFromValue: [_rq formValueForKey: selectorId]];
  if ([contacts count] > 0)
    NSLog (@"got %i attendees: %@", [contacts count], contacts);
  else
    NSLog (@"got no attendees!");
}

- (void) setCurrentContact: (iCalPerson *) aContact
{
  currentContact = aContact;
}

- (NSString *) initialContactsAsString
{
  NSEnumerator *persons;
  iCalPerson *person;
  NSMutableArray *participants;

  participants = [NSMutableArray arrayWithCapacity: [contacts count]];
  persons = [contacts objectEnumerator];
  person = [persons nextObject];
  while (person)
    {
      [participants addObject: [person cn]];
      person = [persons nextObject];
    }

  return [participants componentsJoinedByString: @","];
}

- (NSString *) currentContactId
{
  return [currentContact cn];
}

- (NSString *) currentContactName
{
  return [currentContact cn];
}

- (void) setCheckedBoxes: (NSArray *) boxes
{
  checkedBoxes = boxes;
}

- (void) setHasCheckBoxes: (BOOL) aBool
{
  hasCheckBoxes = aBool;
}

- (BOOL) hasCheckBoxes
{
  return hasCheckBoxes;
}

- (BOOL) isCheckBoxChecked
{
  return (checkedBoxes != nil
          && [checkedBoxes containsObject: currentContact]);
}

- (void) setCheckBoxOnChange: (NSString *) aString
{
  checkBoxOnChange = aString;
}

- (NSString *) checkBoxOnChange
{
  return  checkBoxOnChange;
}

- (void) setColors: (NSDictionary *) colors
{
  userColors = colors;
}

- (BOOL) hasColors
{
  return (userColors != nil);
}

- (NSString *) currentContactStyle
{
  return [NSString stringWithFormat: @"background-color: %@;",
                   [userColors objectForKey: [currentContact cn]]];
}

@end /* UIxContactSelector */
