SOGo-2.1.1b/0000755000000000000000000000000012247657030011170 5ustar rootrootSOGo-2.1.1b/OpenChange/0000755000000000000000000000000012247657027013205 5ustar rootrootSOGo-2.1.1b/OpenChange/MAPIStoreAttachmentTable.h0000644000000000000000000000207012247657026020100 0ustar rootroot/* MAPIStoreAttachmentTable.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREATTACHMENTTABLE_H #define MAPISTOREATTACHMENTTABLE_H #import "MAPIStoreTable.h" @interface MAPIStoreAttachmentTable : MAPIStoreTable @end #endif /* MAPISTOREATTACHMENTTABLE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreContactsFolder.h0000644000000000000000000000207412247657026017756 0ustar rootroot/* MAPIStoreContactsFolder.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORECONTACTSFOLDER_H #define MAPISTORECONTACTSFOLDER_H #import "MAPIStoreGCSFolder.h" @interface MAPIStoreContactsFolder : MAPIStoreGCSFolder @end #endif /* MAPISTORECONTACTSFOLDER_H */ SOGo-2.1.1b/OpenChange/MAPIStoreAttachment.h0000644000000000000000000000360512247657026017135 0ustar rootroot/* MAPIStoreAttachment.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREATTACHMENT_H #define MAPISTOREATTACHMENT_H #import "MAPIStoreObject.h" @class NSData; @class MAPIStoreEmbeddedMessage; @interface MAPIStoreAttachment : MAPIStoreObject { uint32_t aid; } - (void) setAID: (uint32_t) newAID; - (uint32_t) AID; - (int) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr withMID: (uint64_t *) mid withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr inMemCtx: (TALLOC_CTX *) memCtx; - (int) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr inMemCtx: (TALLOC_CTX *) memCtx; /* helpers */ - (NSData *) mimeAttachTag; /* move & copy operations */ - (void) copyToAttachment: (MAPIStoreAttachment *) newAttachment inMemCtx: (TALLOC_CTX *) memCtx; /* subclasses */ - (MAPIStoreEmbeddedMessage *) openEmbeddedMessage; - (MAPIStoreEmbeddedMessage *) createEmbeddedMessage; @end #endif /* MAPISTOREATTACHMENT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreMailVolatileMessage.m0000644000000000000000000007202112247657026020737 0ustar rootroot/* MAPIStoreMailVolatileMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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. */ /* TODO: - calendar invitations - merge some code in a common module with SOGoDraftObject */ #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "MAPIStoreAttachment.h" #import "MAPIStoreAttachmentTable.h" #import "MAPIStoreContext.h" #import "MAPIStoreMailFolder.h" #import "MAPIStoreMIME.h" #import "MAPIStoreMapping.h" #import "MAPIStoreSamDBUtils.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "SOGoMAPIObject.h" #import "MAPIStoreMailVolatileMessage.h" #undef DEBUG #include #include static Class NSNumberK = Nil; static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; // // Useful extension that comes from Pantomime which is also // released under the LGPL. We should eventually merge // this with the same category found in SOPE's NGSmtpClient.m // or simply drop sope-mime in favor of Pantomime // @interface NSMutableData (DataCleanupExtension) - (NSRange) rangeOfCString: (const char *) theCString; - (NSRange) rangeOfCString: (const char *) theCString options: (unsigned int) theOptions range: (NSRange) theRange; @end @implementation NSMutableData (DataCleanupExtension) - (NSRange) rangeOfCString: (const char *) theCString { return [self rangeOfCString: theCString options: 0 range: NSMakeRange(0,[self length])]; } -(NSRange) rangeOfCString: (const char *) theCString options: (unsigned int) theOptions range: (NSRange) theRange { const char *b, *bytes; int i, len, slen; if (!theCString) { return NSMakeRange(NSNotFound,0); } bytes = [self bytes]; len = [self length]; slen = strlen(theCString); b = bytes; if (len > theRange.location + theRange.length) { len = theRange.location + theRange.length; } if (theOptions == NSCaseInsensitiveSearch) { i = theRange.location; b += i; for (; i <= len-slen; i++, b++) { if (!strncasecmp(theCString,b,slen)) { return NSMakeRange(i,slen); } } } else { i = theRange.location; b += i; for (; i <= len-slen; i++, b++) { if (!memcmp(theCString,b,slen)) { return NSMakeRange(i,slen); } } } return NSMakeRange(NSNotFound,0); } @end @interface MAPIStoreAttachment (MAPIStoreMIME) - (BOOL) hasContentId; - (NGMimeBodyPart *) asMIMEBodyPart; @end @implementation MAPIStoreAttachment (MAPIStoreMIME) - (BOOL) hasContentId { return ([properties objectForKey: MAPIPropertyKey (PR_ATTACH_CONTENT_ID_UNICODE)] != nil); } - (NGMimeBodyPart *) asMIMEBodyPart { NGMimeBodyPart *bodyPart = nil; NSString *filename, *mimeType, *baseDisposition, *contentType, *contentDisposition, *contentId; NSData *content; struct mapistore_connection_info *connInfo; SOGoDomainDefaults *dd; SOGoUser *activeUser; NGMutableHashMap *map; content = [properties objectForKey: MAPIPropertyKey (PR_ATTACH_DATA_BIN)]; if (content) { filename = [properties objectForKey: MAPIPropertyKey (PR_ATTACH_LONG_FILENAME_UNICODE)]; if (![filename length]) filename = [properties objectForKey: MAPIPropertyKey (PR_ATTACH_FILENAME_UNICODE)]; mimeType = [properties objectForKey: MAPIPropertyKey (PR_ATTACH_MIME_TAG_UNICODE)]; if (!mimeType && [filename length]) mimeType = [[MAPIStoreMIME sharedMAPIStoreMIME] mimeTypeForExtension: [filename pathExtension]]; if (!mimeType) mimeType = @"application/octet-stream"; if ([mimeType hasPrefix: @"text/"]) { connInfo = [[self context] connectionInfo]; activeUser = [SOGoUser userWithLogin: [NSString stringWithUTF8String: connInfo->username]]; dd = [activeUser domainDefaults]; baseDisposition = ([dd mailAttachTextDocumentsInline] ? @"inline" : @"attachment"); } else if ([mimeType hasPrefix: @"image/"] || [mimeType hasPrefix: @"message"]) baseDisposition = @"inline"; else baseDisposition = @"attachment"; if ([filename length] > 0) { contentType = [NSString stringWithFormat: @"%@; name=\"%@\"", mimeType, filename]; contentDisposition = [NSString stringWithFormat: @"%@; filename=\"%@\"", baseDisposition, filename]; } else { contentType = mimeType; contentDisposition = baseDisposition; } map = [[NGMutableHashMap alloc] initWithCapacity: 16]; [map addObject: contentType forKey: @"content-type"]; [map addObject: contentDisposition forKey: @"content-disposition"]; contentId = [properties objectForKey: MAPIPropertyKey (PR_ATTACH_CONTENT_ID_UNICODE)]; if (contentId) [map setObject: [NSString stringWithFormat: @"<%@>", contentId] forKey: @"content-id"]; bodyPart = [NGMimeBodyPart bodyPartWithHeader: map]; [bodyPart setBody: content]; [map release]; } else [self errorWithFormat: @"no content for attachment"]; return bodyPart; } @end @implementation MAPIStoreMailVolatileMessage + (void) initialize { NSNumberK = [NSNumber class]; } - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newContainer { if ((self = [super initWithSOGoObject: newSOGoObject inContainer: newContainer])) { ASSIGN (properties, [sogoObject properties]); } return self; } - (void) addProperties: (NSDictionary *) newProperties { [super addProperties: newProperties]; [sogoObject adjustLastModified]; } - (BOOL) canGetProperty: (enum MAPITAGS) propTag { return ([super canGetProperty: propTag] || [properties objectForKey: MAPIPropertyKey (propTag)] != nil); } - (uint64_t) objectVersion { NSNumber *version; version = [properties objectForKey: @"version"]; return (version ? exchange_globcnt ([version unsignedLongLongValue]) : ULLONG_MAX); } - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Note" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSData *changeKey; int rc; changeKey = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)]; if (changeKey) { *data = [changeKey asBinaryInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } else rc = [super getPidTagChangeKey: data inMemCtx: memCtx]; return rc; } - (NSDate *) creationTime { return [sogoObject creationDate]; } - (NSDate *) lastModificationTime { return [sogoObject lastModified]; } - (id) lookupAttachment: (NSString *) childKey { return [attachmentParts objectForKey: childKey]; } - (void) getMessageData: (struct mapistore_message **) dataPtr inMemCtx: (TALLOC_CTX *) memCtx { NSArray *recipients; NSUInteger count, max, recipientsMax, p, current; NSString *username, *cn, *email; NSData *entryId; NSDictionary *allRecipients, *dict, *contactInfos; SOGoUserManager *mgr; struct ldb_context *samCtx; struct mapistore_message *msgData; struct mapistore_message_recipient *recipient; enum ulRecipClass type; samCtx = [[self context] connectionInfo]->sam_ctx; // [super getMessageData: &msgData inMemCtx: memCtx]; msgData = talloc_zero (memCtx, struct mapistore_message); allRecipients = [properties objectForKey: @"recipients"]; msgData->columns = set_SPropTagArray (msgData, 9, PR_OBJECT_TYPE, PR_DISPLAY_TYPE, PR_7BIT_DISPLAY_NAME_UNICODE, PR_SMTP_ADDRESS_UNICODE, PR_SEND_INTERNET_ENCODING, PR_RECIPIENT_DISPLAY_NAME_UNICODE, PR_RECIPIENT_FLAGS, PR_RECIPIENT_ENTRYID, PR_RECIPIENT_TRACKSTATUS); /* Retrieve recipients from the message */ max = ([[allRecipients objectForKey: @"orig"] count] + [[allRecipients objectForKey: @"to"] count] + [[allRecipients objectForKey: @"cc"] count] + [[allRecipients objectForKey: @"bcc"] count]); mgr = [SOGoUserManager sharedUserManager]; msgData->recipients_count = max; msgData->recipients = talloc_array (msgData, struct mapistore_message_recipient, max); current = 0; for (type = 0; type < 4; type++) { recipients = [allRecipients objectForKey: recTypes[type]]; recipientsMax = [recipients count]; for (count = 0; count < recipientsMax; count++) { recipient = msgData->recipients + current; recipient->type = type; dict = [recipients objectAtIndex: count]; cn = [dict objectForKey: @"fullName"]; email = [dict objectForKey: @"email"]; contactInfos = [mgr contactInfosForUserWithUIDorEmail: email]; if (contactInfos) { username = [contactInfos objectForKey: @"c_uid"]; recipient->username = [username asUnicodeInMemCtx: msgData]; entryId = MAPIStoreInternalEntryId (samCtx, username); } else { recipient->username = NULL; entryId = MAPIStoreExternalEntryId (cn, email); } /* properties */ p = 0; recipient->data = talloc_array (msgData, void *, msgData->columns->cValues); memset (recipient->data, 0, msgData->columns->cValues * sizeof (void *)); // PR_OBJECT_TYPE = MAPI_MAILUSER (see MAPI_OBJTYPE) recipient->data[p] = MAPILongValue (msgData, MAPI_MAILUSER); p++; // PR_DISPLAY_TYPE = DT_MAILUSER (see MS-NSPI) recipient->data[p] = MAPILongValue (msgData, 0); p++; // PR_7BIT_DISPLAY_NAME_UNICODE recipient->data[p] = [cn asUnicodeInMemCtx: msgData]; p++; // PR_SMTP_ADDRESS_UNICODE recipient->data[p] = [email asUnicodeInMemCtx: msgData]; p++; // PR_SEND_INTERNET_ENCODING = 0x00060000 (plain text, see OXCMAIL) recipient->data[p] = MAPILongValue (msgData, 0x00060000); p++; // PR_RECIPIENT_DISPLAY_NAME_UNICODE recipient->data[p] = [cn asUnicodeInMemCtx: msgData]; p++; // PR_RECIPIENT_FLAGS recipient->data[p] = MAPILongValue (msgData, 0x01); p++; // PR_RECIPIENT_ENTRYID recipient->data[p] = [entryId asBinaryInMemCtx: msgData]; p++; // PR_RECIPIENT_TRACKSTATUS recipient->data[p] = MAPILongValue (msgData, 0x00); p++; current++; } } *dataPtr = msgData; } static inline NSString * MakeRecipientString (NSDictionary *recipient) { NSString *fullName, *email, *fullEmail; fullName = [recipient objectForKey: @"fullName"]; email = [recipient objectForKey: @"email"]; if ([email length] > 0) { if ([fullName length] > 0) fullEmail = [NSString stringWithFormat: @"%@ <%@>", fullName, email]; else fullEmail = email; } else { NSLog (@"recipient not generated from record: %@", recipient); fullEmail = nil; } return fullEmail; } static inline NSArray * MakeRecipientsList (NSArray *recipients) { NSMutableArray *list; NSUInteger count, max; NSString *recipient; max = [recipients count]; list = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { recipient = MakeRecipientString ([recipients objectAtIndex: count]); if (recipient) [list addObject: recipient]; } return list; } static NSString * QuoteSpecials (NSString *address) { NSString *result, *part, *s2; int i, len; // We want to correctly send mails to recipients such as : // foo.bar // foo (bar) // bar, foo if ([address indexOf: '('] >= 0 || [address indexOf: ')'] >= 0 || [address indexOf: '<'] >= 0 || [address indexOf: '>'] >= 0 || [address indexOf: '@'] >= 0 || [address indexOf: ','] >= 0 || [address indexOf: ';'] >= 0 || [address indexOf: ':'] >= 0 || [address indexOf: '\\'] >= 0 || [address indexOf: '"'] >= 0 || [address indexOf: '.'] >= 0 || [address indexOf: '['] >= 0 || [address indexOf: ']'] >= 0) { // We search for the first instance of < from the end // and we quote what was before if we need to len = [address length]; i = -1; while (len--) if ([address characterAtIndex: len] == '<') { i = len; break; } if (i > 0) { part = [address substringToIndex: i - 1]; s2 = [[part stringByReplacingString: @"\\" withString: @"\\\\"] stringByReplacingString: @"\"" withString: @"\\\""]; result = [NSString stringWithFormat: @"\"%@\" %@", s2, [address substringFromIndex: i]]; } else { s2 = [[address stringByReplacingString: @"\\" withString: @"\\\\"] stringByReplacingString: @"\"" withString: @"\\\""]; result = [NSString stringWithFormat: @"\"%@\"", s2]; } } else result = address; return result; } static inline void FillMessageHeadersFromProperties (NGMutableHashMap *headers, NSDictionary *mailProperties, BOOL withBcc, struct mapistore_connection_info *connInfo) { NSMutableString *subject; NSString *from, *recId, *messageId, *subjectData; NSArray *list; NSCalendarDate *date; NSDictionary *recipients; NSUInteger type, bccLimit; SOGoUser *activeUser; NSNumber *priority; activeUser = [SOGoUser userWithLogin: [NSString stringWithUTF8String: connInfo->username]]; from = [NSString stringWithFormat: @"%@ <%@>", [activeUser cn], [[activeUser allEmails] objectAtIndex: 0]]; [headers setObject: QuoteSpecials (from) forKey: @"from"]; /* save the recipients */ recipients = [mailProperties objectForKey: @"recipients"]; if (recipients) { if (withBcc) bccLimit = MAPI_BCC; else bccLimit = MAPI_CC; bccLimit++; for (type = MAPI_TO; type < bccLimit; type++) { recId = recTypes[type]; list = MakeRecipientsList ([recipients objectForKey: recId]); [headers setObjects: list forKey: recId]; } list = MakeRecipientsList ([recipients objectForKey: @"orig"]); if ([list count]) [headers setObjects: list forKey: @"from"]; } else NSLog (@"message without recipients"); subject = [NSMutableString stringWithCapacity: 128]; subjectData = [mailProperties objectForKey: MAPIPropertyKey (PR_SUBJECT_PREFIX_UNICODE)]; if (subjectData) [subject appendString: subjectData]; subjectData = [mailProperties objectForKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)]; if (subjectData) [subject appendString: subjectData]; [headers setObject: [subject asQPSubjectString: @"utf-8"] forKey: @"subject"]; messageId = [mailProperties objectForKey: MAPIPropertyKey (PR_INTERNET_MESSAGE_ID_UNICODE)]; if ([messageId length]) [headers setObject: messageId forKey: @"message-id"]; date = [mailProperties objectForKey: MAPIPropertyKey (PR_CLIENT_SUBMIT_TIME)]; if (date) { date = [date addYear: 0 month: 0 day: 0 hour: 0 minute: 0 second: [[date timeZone] secondsFromGMT]]; [headers addObject: [date rfc822DateString] forKey: @"date"]; } [headers addObject: @"1.0" forKey: @"MIME-Version"]; priority = [mailProperties objectForKey: MAPIPropertyKey (PidTagImportance)]; if ([priority intValue] == 2) { [headers addObject: @"1 (Highest)" forKey: @"X-Priority"]; } else if ([priority intValue] == 1) { [headers removeAllObjectsForKey: @"X-Priority"]; } else { [headers addObject: @"5 (Lowest)" forKey: @"X-Priority"]; } } static NSArray * MakeAttachmentParts (NSDictionary *attachmentParts, BOOL withContentId) { NSMutableArray *attachmentMimeParts; NSArray *keys; MAPIStoreAttachment *attachment; NSUInteger count, max; NGMimeBodyPart *mimePart; keys = [attachmentParts allKeys]; max = [keys count]; attachmentMimeParts = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { attachment = [attachmentParts objectForKey: [keys objectAtIndex: count]]; if ([attachment hasContentId] == withContentId) { mimePart = [attachment asMIMEBodyPart]; if (mimePart) [attachmentMimeParts addObject: mimePart]; } } return attachmentMimeParts; } static inline id MakeTextPlainBody (NSDictionary *mailProperties, NSString **contentType) { id textPlainBody; textPlainBody = [[mailProperties objectForKey: MAPIPropertyKey (PR_BODY_UNICODE)] dataUsingEncoding: NSUTF8StringEncoding]; *contentType = @"text/plain; charset=utf-8"; return textPlainBody; } static inline id MakeTextHtmlBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NSString **contentType) { id textHtmlBody; NSData *htmlBody; NSString *charset, *htmlContentType; NSArray *parts; NSNumber *codePage; NGMimeBodyPart *htmlBodyPart; NGMutableHashMap *headers; NSUInteger count, max; htmlBody = [mailProperties objectForKey: MAPIPropertyKey (PR_HTML)]; if (htmlBody) { /* charset */ codePage = [mailProperties objectForKey: MAPIPropertyKey (PR_INTERNET_CPID)]; switch ([codePage intValue]) { case 20127: charset = @"us-ascii"; break; case 28605: charset = @"iso-8859-15"; break; case 65001: charset = @"utf-8"; break; case 28591: default: charset = @"iso-8859-1"; } htmlContentType = [NSString stringWithFormat: @"text/html; charset=%@", charset]; parts = MakeAttachmentParts (attachmentParts, YES); max = [parts count]; if (max > 0) { textHtmlBody = [NGMimeMultipartBody new]; [textHtmlBody autorelease]; headers = [[NGMutableHashMap alloc] initWithCapacity: 1]; [headers setObject: htmlContentType forKey: @"content-type"]; htmlBodyPart = [NGMimeBodyPart bodyPartWithHeader: headers]; [htmlBodyPart setBody: htmlBody]; [headers release]; [textHtmlBody addBodyPart: htmlBodyPart]; for (count = 0; count < max; count++) [textHtmlBody addBodyPart: [parts objectAtIndex: count]]; *contentType = @"multipart/related"; } else { textHtmlBody = htmlBody; *contentType = htmlContentType; } } else textHtmlBody = nil; return textHtmlBody; } static inline id MakeTextPartBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NSString **contentType) { id textBody, textPlainBody, textHtmlBody; NSString *textPlainContentType, *textHtmlContentType; NGMutableHashMap *headers; NGMimeBodyPart *bodyPart; textPlainBody = MakeTextPlainBody (mailProperties, &textPlainContentType); textHtmlBody = MakeTextHtmlBody (mailProperties, attachmentParts, &textHtmlContentType); if (textPlainBody) { if (textHtmlBody) { textBody = [NGMimeMultipartBody new]; [textBody autorelease]; headers = [[NGMutableHashMap alloc] initWithCapacity: 1]; [headers setObject: textHtmlContentType forKey: @"content-type"]; bodyPart = [NGMimeBodyPart bodyPartWithHeader: headers]; [bodyPart setBody: textHtmlBody]; [headers release]; [textBody addBodyPart: bodyPart]; headers = [[NGMutableHashMap alloc] initWithCapacity: 1]; [headers setObject: textPlainContentType forKey: @"content-type"]; bodyPart = [NGMimeBodyPart bodyPartWithHeader: headers]; [bodyPart setBody: textPlainBody]; [headers release]; [textBody addBodyPart: bodyPart]; *contentType = @"multipart/alternative"; } else { textBody = textPlainBody; *contentType = textPlainContentType; } } else { textBody = textHtmlBody; *contentType = textHtmlContentType; } return textBody; } // static id // MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, // NSString **contentType) static id MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NSString **contentType) { id messageBody, textBody; NSString *textContentType; NSArray *parts; NGMimeBodyPart *textBodyPart; NGMutableHashMap *headers; NSUInteger count, max; textBody = MakeTextPartBody (mailProperties, attachmentParts, &textContentType); parts = MakeAttachmentParts (attachmentParts, NO); max = [parts count]; if (max > 0) { messageBody = [NGMimeMultipartBody new]; [messageBody autorelease]; if (textBody) { headers = [[NGMutableHashMap alloc] initWithCapacity: 1]; [headers setObject: textContentType forKey: @"content-type"]; textBodyPart = [NGMimeBodyPart bodyPartWithHeader: headers]; [textBodyPart setBody: textBody]; [headers release]; [messageBody addBodyPart: textBodyPart]; } for (count = 0; count < max; count++) [messageBody addBodyPart: [parts objectAtIndex: count]]; *contentType = @"multipart/mixed"; } else { messageBody = textBody; *contentType = textContentType; } return messageBody; } - (NGMimeMessage *) _generateMessageWithBcc: (BOOL) withBcc { NSString *contentType; NGMimeMessage *message; NGMutableHashMap *headers; id messageBody; headers = [[NGMutableHashMap alloc] initWithCapacity: 16]; FillMessageHeadersFromProperties (headers, properties, withBcc, [[self context] connectionInfo]); message = [[NGMimeMessage alloc] initWithHeader: headers]; [message autorelease]; [headers release]; messageBody = MakeMessageBody (properties, attachmentParts, &contentType); if (messageBody) { [headers setObject: contentType forKey: @"content-type"]; [message setBody: messageBody]; } return message; } - (NSData *) _generateMailDataWithBcc: (BOOL) withBcc { NGMimeMessage *message; NGMimeMessageGenerator *generator; NSData *messageData; /* mime message generation */ generator = [NGMimeMessageGenerator new]; message = [self _generateMessageWithBcc: withBcc]; messageData = [generator generateMimeFromPart: message]; [generator release]; // [messageData writeToFile: @"/tmp/mimegen.eml" atomically: NO]; return messageData; } - (int) submitWithFlags: (enum SubmitFlags) flags { NSDictionary *recipients; NSData *messageData; NSMutableArray *recipientEmails; NSArray *list; NSString *recId, *from, *msgClass; NSUInteger count; SOGoUser *activeUser; SOGoDomainDefaults *dd; NSException *error; WOContext *woContext; id authenticator; msgClass = [properties objectForKey: MAPIPropertyKey (PidTagMessageClass)]; if ([msgClass isEqualToString: @"IPM.Note"]) /* we skip invitation replies */ { /* send mail */ messageData = [self _generateMailDataWithBcc: NO]; recipientEmails = [NSMutableArray arrayWithCapacity: 32]; recipients = [properties objectForKey: @"recipients"]; for (count = 0; count < 3; count++) { recId = recTypes[count]; list = [recipients objectForKey: recId]; [recipientEmails addObjectsFromArray: [list objectsForKey: @"email" notFoundMarker: nil]]; } activeUser = [[self context] activeUser]; [self logWithFormat: @"recipients: %@", recipientEmails]; dd = [activeUser domainDefaults]; from = [[activeUser allEmails] objectAtIndex: 0]; woContext = [[self userContext] woContext]; authenticator = [sogoObject authenticatorInContext: woContext]; error = [[SOGoMailer mailerWithDomainDefaults: dd] sendMailData: messageData toRecipients: recipientEmails sender: from withAuthenticator: authenticator inContext: woContext]; if (error) [self logWithFormat: @"an error occurred: '%@'", error]; // mapping = [self mapping]; // [mapping unregisterURLWithID: [self objectId]]; // [self setIsNew: NO]; // [properties removeAllObjects]; [(MAPIStoreMailFolder *) [self container] cleanupCaches]; } else [self logWithFormat: @"skipping submit of message with class '%@'", msgClass]; return MAPISTORE_SUCCESS; } - (void) save: (TALLOC_CTX *) memCtx { NSString *folderName, *flag, *newIdString, *messageKey; NSData *changeKey, *messageData; NGImap4Connection *connection; NGImap4Client *client; SOGoMailFolder *containerFolder; NSDictionary *result, *responseResult; MAPIStoreMapping *mapping; uint64_t mid; messageData = [self _generateMailDataWithBcc: YES]; /* appending to imap folder */ containerFolder = [container sogoObject]; connection = [containerFolder imap4Connection]; client = [connection client]; folderName = [connection imap4FolderNameForURL: [containerFolder imap4URL]]; result = [client append: messageData toFolder: folderName withFlags: [NSArray arrayWithObjects: @"seen", nil]]; if ([[result objectForKey: @"result"] boolValue]) { /* we reregister the new message URL with the id mapper */ responseResult = [[result objectForKey: @"RawResponse"] objectForKey: @"ResponseResult"]; flag = [responseResult objectForKey: @"flag"]; newIdString = [[flag componentsSeparatedByString: @" "] objectAtIndex: 2]; mapping = [self mapping]; mid = [self objectId]; [mapping unregisterURLWithID: mid]; // [sogoObject setNameInContainer: ]; messageKey = [NSString stringWithFormat: @"%@.eml", newIdString]; [sogoObject setNameInContainer: messageKey]; [mapping registerURL: [self url] withID: mid]; /* synchronise the cache and update the change key with the one provided by the client. Before doing this, lets issue a unselect/select combo because of timing issues with Dovecot in obtaining the latest modseq. Sometimes, Dovecot doesn't return the newly appended UID if we do a "UID SORT (DATE) UTF-8 (MODSEQ XYZ) (NOT DELETED)" command (where XYZ is the HIGHESTMODSEQ+1) immediately after IMAP APPEND */ [client unselect]; [client select: folderName]; [(MAPIStoreMailFolder *) container synchroniseCache]; changeKey = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)]; if (changeKey) [(MAPIStoreMailFolder *) container setChangeKey: changeKey forMessageWithKey: messageKey]; } } @end SOGo-2.1.1b/OpenChange/MAPIStoreGCSMessage.h0000644000000000000000000000213112247657026016757 0ustar rootroot/* MAPIStoreGCSMessage.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREGCSMESSAGE_H #define MAPISTOREGCSMESSAGE_H #import "MAPIStoreMessage.h" @interface MAPIStoreGCSMessage : MAPIStoreMessage { } /* subclass helpers */ - (void) updateVersions; @end #endif /* MAPISTOREGCSMESSAGE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreTypes.h0000644000000000000000000000401612247657026016146 0ustar rootroot/* MAPIStoreTypes.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTORETYPES_H #define MAPISTORETYPES_H #import #include #include #include #include @class NSData; @class NSDictionary; @class NSTimeZone; extern NSTimeZone *utcTZ; uint8_t *MAPIBoolValue (void *memCtx, BOOL value); uint32_t *MAPILongValue (void *memCtx, uint32_t value); uint64_t *MAPILongLongValue (void *memCtx, uint64_t value); double *MAPIDoubleValue (void *memCtx, double value); id NSObjectFromSPropValue (const struct SPropValue *); id NSObjectFromMAPISPropValue (const struct mapi_SPropValue *); id NSObjectFromValuePointer (enum MAPITAGS, const void *); NSComparisonResult MAPICNCompare (uint64_t cn1, uint64_t cn2, void *); NSComparisonResult MAPIChangeKeyGUIDCompare (id ck1, id ck2, void *); static inline NSNumber * MAPIPropertyKey (enum MAPITAGS propTag) { #if (GS_SIZEOF_LONG == 4) return [NSString stringWithFormat: @"%ul", propTag]; #elif (GS_SIZEOF_INT == 4) return [NSString stringWithFormat: @"%u", propTag]; #else #error No suitable type for 4 bytes integers #endif } void MAPIStoreDumpMessageProperties (NSDictionary *properties); #endif /* MAPISTORETYPES_H */ SOGo-2.1.1b/OpenChange/MAPIStoreTasksMessage.h0000644000000000000000000000206412247657026017435 0ustar rootroot/* MAPIStoreTasksMessage.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORETASKSMESSAGE_H #define MAPISTORETASKSMESSAGE_H #import "MAPIStoreGCSMessage.h" @interface MAPIStoreTasksMessage : MAPIStoreGCSMessage @end #endif /* MAPISTORETASKSMESSAGE_H */ SOGo-2.1.1b/OpenChange/NSData+MAPIStore.h0000644000000000000000000000362112247657026016230 0ustar rootroot/* NSData+MAPIStore.h - this file is part of SOGo * * Copyright (C) 2010 Inverse inc. * * 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 3, 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 NSDATA_MAPISTORE_H #define NSDATA_MAPISTORE_H #import @interface NSData (MAPIStoreDataTypes) + (id) dataWithBinary: (const struct Binary_r *) binData; - (struct Binary_r *) asBinaryInMemCtx: (void *) memCtx; + (id) dataWithShortBinary: (const struct SBinary_short *) binData; - (struct SBinary_short *) asShortBinaryInMemCtx: (void *) memCtx; + (id) dataWithFlatUID: (const struct FlatUID_r *) flatUID; - (struct FlatUID_r *) asFlatUIDInMemCtx: (void *) memCtx; + (id) dataWithGUID: (const struct GUID *) guid; - (struct GUID *) asGUIDInMemCtx: (void *) memCtx; + (id) dataWithXID: (const struct XID *) xid; - (struct XID *) asXIDInMemCtx: (void *) memCtx; + (id) dataWithChangeKeyGUID: (NSString *) guidString andCnt: (NSData *) globCnt; - (void) hexDumpWithLineSize: (NSUInteger) lineSize; @end @interface NSMutableData (MAPIStoreDataTypes) - (void) appendUInt8: (uint8_t) value; - (void) appendUInt16: (uint16_t) value; - (void) appendUInt32: (uint32_t) value; @end #endif /* NSDATA_MAPISTORE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreMapping.h0000644000000000000000000000363212247657026016440 0ustar rootroot/* MAPIStoreMapping.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTOREMAPPING_H #define MAPISTOREMAPPING_H #import @class NSMutableDictionary; @class NSString; @interface MAPIStoreMapping : NSObject { void *memCtx; NSString *username; struct tdb_wrap *indexing; NSMutableDictionary *mapping; /* FID/MID -> url */ NSMutableDictionary *reverseMapping; /* url -> FID/MID */ NSUInteger useCount; } + (id) mappingForUsername: (NSString *) username withIndexing: (struct tdb_wrap *) indexing; - (id) initForUsername: (NSString *) username withIndexing: (struct tdb_wrap *) indexing; - (void) increaseUseCount; - (void) decreaseUseCount; - (NSString *) urlFromID: (uint64_t) idKey; - (uint64_t) idFromURL: (NSString *) url; - (BOOL) registerURL: (NSString *) urlString withID: (uint64_t) idNbr; - (void) registerURLs: (NSArray *) urlString withIDs: (NSArray *) idNbrs; - (void) unregisterURLWithID: (uint64_t) idNbr; - (void) updateID: (uint64_t) idNbr withURL: (NSString *) urlString; @end #endif /* MAPISTOREMAPPING_H */ SOGo-2.1.1b/OpenChange/MAPIStoreActiveTables.m0000644000000000000000000001056412247657026017422 0ustar rootroot/* MAPIStoreActiveTables.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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. */ /* MAPIStoreActiveTables provides an interface to keep accounting of all instances of a given table, independently from its store and context. Primary useful for notifications across different connections. */ #import #import #import "MAPIStoreFolder.h" #import "MAPIStoreTable.h" #import "MAPIStoreActiveTables.h" @interface MAPIStoreActiveTableRecord : NSObject { uint64_t folderId; uint8_t tableType; MAPIStoreTable *table; } + (id) recordForTable: (MAPIStoreTable *) newTable; - (id) initWithTable: (MAPIStoreTable *) newTable; - (MAPIStoreTable *) table; - (BOOL) exactlyMatchesTable: (MAPIStoreTable *) otherTable; - (BOOL) matchesFMID: (uint64_t) otherFMid andTableType: (uint8_t) otherTableType; - (BOOL) matchesTable: (MAPIStoreTable *) otherTable; @end @implementation MAPIStoreActiveTableRecord : NSObject + (id) recordForTable: (MAPIStoreTable *) newTable { MAPIStoreActiveTableRecord *record; record = [[self alloc] initWithTable: newTable]; [record autorelease]; return record; } - (id) init { if ((self = [super init])) { folderId = 0; tableType = 0; table = nil; } return self; } - (id) initWithTable: (MAPIStoreTable *) newTable { if ((self = [self init])) { table = newTable; folderId = [[table container] objectId]; tableType = [table tableType]; } return self; } - (MAPIStoreTable *) table { return table; } - (BOOL) exactlyMatchesTable: (MAPIStoreTable *) otherTable { return (table == otherTable); } - (BOOL) matchesFMID: (uint64_t) otherFMid andTableType: (uint8_t) otherTableType { return (tableType == otherTableType && folderId == otherFMid); } - (BOOL) matchesTable: (MAPIStoreTable *) otherTable { uint64_t otherFMid; BOOL rc; rc = [self exactlyMatchesTable: otherTable]; if (!rc) { otherFMid = [[otherTable container] objectId]; rc = [self matchesFMID: otherFMid andTableType: [otherTable tableType]]; } return rc; } @end @implementation MAPIStoreActiveTables + (id) activeTables { static MAPIStoreActiveTables *activeTables = nil; if (!activeTables) activeTables = [self new]; return activeTables; } - (id) init { if ((self = [super init])) { records = [NSMutableArray new]; } return self; } - (void) dealloc { [records release]; [super dealloc]; } - (void) registerTable: (MAPIStoreTable *) table { MAPIStoreActiveTableRecord *newRecord; newRecord = [MAPIStoreActiveTableRecord recordForTable: table]; [records addObject: newRecord]; } - (void) unregisterTable: (MAPIStoreTable *) table { MAPIStoreActiveTableRecord *currentRecord; NSUInteger count, max; BOOL done = NO; max = [records count]; for (count = 0; !done && count < max; count++) { currentRecord = [records objectAtIndex: count]; if ([currentRecord exactlyMatchesTable: table]) { [records removeObject: currentRecord]; done = YES; } } } - (NSArray *) activeTablesForFMID: (uint64_t) fmid andType: (uint8_t) tableType { NSUInteger count, max; NSMutableArray *tables; MAPIStoreActiveTableRecord *currentRecord; tables = [NSMutableArray arrayWithCapacity: 5]; max = [records count]; for (count = 0; count < max; count++) { currentRecord = [records objectAtIndex: count]; if ([currentRecord matchesFMID: fmid andTableType: tableType]) [tables addObject: [currentRecord table]]; } return tables; } @end SOGo-2.1.1b/OpenChange/MAPIStoreGCSMessageTable.h0000644000000000000000000000224112247657026017731 0ustar rootroot/* MAPIStoreGCSMessageTable.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 MAPISTOREGCSMESSAGETABLE_H #define MAPISTOREGCSMESSAGETABLE_H #import "MAPIStoreMessageTable.h" @class EOQualifier; @interface MAPIStoreGCSMessageTable : MAPIStoreMessageTable - (NSString *) sortIdentifierForProperty: (enum MAPITAGS) property; @end #endif /* MAPISTOREGCSMESSAGETABLE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreCalendarMessage.m0000644000000000000000000005434612247657026020100 0ustar rootroot/* MAPIStoreCalendarMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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. */ /* TODO: - merge common code with tasks - take the tz definitions from Outlook */ #include #include #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "iCalEvent+MAPIStore.h" #import "MAPIStoreAppointmentWrapper.h" #import "MAPIStoreCalendarAttachment.h" #import "MAPIStoreCalendarFolder.h" #import "MAPIStoreContext.h" #import "MAPIStoreMapping.h" #import "MAPIStoreRecurrenceUtils.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSDate+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "NSValue+MAPIStore.h" #import "MAPIStoreCalendarMessage.h" #undef DEBUG #include #include #include #include #include #include #include // extern void ndr_print_AppointmentRecurrencePattern(struct ndr_print *ndr, const char *name, const struct AppointmentRecurrencePattern *r); static Class NSArrayK; @implementation SOGoAppointmentObject (MAPIStoreExtension) - (Class) mapistoreMessageClass { return [MAPIStoreCalendarMessage class]; } @end @implementation MAPIStoreCalendarMessage + (void) initialize { NSArrayK = [NSArray class]; } + (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP inMemCtx: (TALLOC_CTX *) memCtx { BOOL listedProperties[65536]; NSUInteger count; uint16_t propId; memset (listedProperties, NO, 65536 * sizeof (BOOL)); [super getAvailableProperties: propertiesP inMemCtx: memCtx]; for (count = 0; count < (*propertiesP)->cValues; count++) { propId = ((*propertiesP)->aulPropTag[count] >> 16) & 0xffff; listedProperties[propId] = YES; } [MAPIStoreAppointmentWrapper fillAvailableProperties: *propertiesP withExclusions: listedProperties]; return MAPISTORE_SUCCESS; } - (id) init { if ((self = [super init])) { calendar = nil; masterEvent = nil; } return self; } - (void) _setupAttachmentParts { NSUInteger count, max; NSArray *events; NSString *newKey; MAPIStoreCalendarAttachment *attachment; NSUInteger aid; iCalEvent *event; events = [calendar events]; max = [events count]; for (count = 1; count < max; count++) { attachment = [MAPIStoreCalendarAttachment mapiStoreObjectInContainer: self]; /* we now that there are no attachments yet, so we can assume that the right AID is 0 from the start */ aid = count - 1; [attachment setAID: aid]; event = [events objectAtIndex: count]; [attachment setEvent: event]; newKey = [[event uniqueChildWithTag: @"recurrence-id"] flattenedValuesForKey: @""]; [attachmentParts setObject: attachment forKey: newKey]; } } - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newFolder { MAPIStoreContext *context; MAPIStoreUserContext *userContext; iCalCalendar *origCalendar; MAPIStoreAppointmentWrapper *appointmentWrapper; if ((self = [super initWithSOGoObject: newSOGoObject inContainer: newFolder])) { if ([newSOGoObject isNew]) { ASSIGN (calendar, [iCalCalendar groupWithTag: @"vcalendar"]); [calendar setVersion: @"2.0"]; [calendar setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"]; masterEvent = [iCalEvent groupWithTag: @"vevent"]; [calendar addChild: masterEvent]; [masterEvent setCreated: [NSCalendarDate date]]; } else { origCalendar = [sogoObject calendar: YES secure: YES]; calendar = [origCalendar mutableCopy]; masterEvent = [[calendar events] objectAtIndex: 0]; [self _setupAttachmentParts]; } context = [self context]; userContext = [self userContext]; appointmentWrapper = [MAPIStoreAppointmentWrapper wrapperWithICalEvent: masterEvent andUser: [userContext sogoUser] andSenderEmail: nil inTimeZone: [userContext timeZone] withConnectionInfo: [context connectionInfo]]; [self addProxy: appointmentWrapper]; } return self; } - (void) dealloc { //NSLog(@"MAPIStoreCalendarMessage: -dealloc (%p)", self); [calendar release]; [super dealloc]; } /* getters */ - (int) getPidLidFInvited: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { SOGoUser *owner; owner = [[self userContext] sogoUser]; if ([masterEvent userAsAttendee: owner]) *data = talloc_strdup (memCtx, "IPM.Schedule.Meeting.Request"); else *data = talloc_strdup (memCtx, "IPM.Appointment"); return MAPISTORE_SUCCESS; } - (int) getPidLidSideEffects: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, seOpenToDelete | seOpenToCopy | seOpenToMove | seCoerceToInbox | seOpenForCtxMenu); return MAPISTORE_SUCCESS; } - (int) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (void) getMessageData: (struct mapistore_message **) dataPtr inMemCtx: (TALLOC_CTX *) memCtx { static NSString *recTypes[] = {@"orig", @"to", @"cc", @"bcc"}; static NSInteger recTypesValue[] = {MAPI_ORIG, MAPI_TO, MAPI_CC, MAPI_BCC}; struct mapistore_message *msgData; NSDictionary *recipients, *contactInfos; NSString *email; NSArray *attendees; NSDictionary *attendee; SOGoUserManager *mgr; struct mapistore_message_recipient *recipient; NSUInteger nRecType, maxRecTypes, count, max, propCount; NSObject *currentValue; [super getMessageData: &msgData inMemCtx: memCtx]; /* The presence of the "recipients" meta-property means that our most recent list of recipients has not been saved yet and that we must return that one instead of the one stored in the event. */ recipients = [properties objectForKey: @"recipients"]; if (recipients) { mgr = [SOGoUserManager sharedUserManager]; /* TODO: this code might need to be moved into MAPIStoreMessage */ msgData->columns = set_SPropTagArray (msgData, 9, PR_OBJECT_TYPE, PR_DISPLAY_TYPE, PR_7BIT_DISPLAY_NAME_UNICODE, PR_SMTP_ADDRESS_UNICODE, PR_SEND_INTERNET_ENCODING, PR_RECIPIENT_DISPLAY_NAME_UNICODE, PR_RECIPIENT_FLAGS, PR_RECIPIENT_ENTRYID, PR_RECIPIENT_TRACKSTATUS); maxRecTypes = sizeof(recTypes) / sizeof(recTypes[0]); for (nRecType = 0; nRecType < maxRecTypes; nRecType++) { attendees = [recipients objectForKey: recTypes[nRecType]]; max = [attendees count]; if (max > 0) { msgData->recipients_count += max; msgData->recipients = talloc_realloc(msgData, msgData->recipients, struct mapistore_message_recipient, msgData->recipients_count); recipient = msgData->recipients; for (count = 0; count < max; count++) { attendee = [attendees objectAtIndex: count]; recipient->type = recTypesValue[nRecType]; email = [attendee objectForKey: @"email"]; if (email) { contactInfos = [mgr contactInfosForUserWithUIDorEmail: email]; recipient->username = [[contactInfos objectForKey: @"c_uid"] asUnicodeInMemCtx: msgData]; } else recipient->username = NULL; recipient->data = talloc_array(msgData, void *, msgData->columns->cValues); for (propCount = 0; propCount < msgData->columns->cValues; propCount++) { currentValue = [attendee objectForKey: MAPIPropertyKey (msgData->columns->aulPropTag[propCount])]; [currentValue getValue: recipient->data + propCount forTag: msgData->columns->aulPropTag[propCount] inMemCtx: msgData]; } recipient++; } } } } else { /* HACK: we know the first (and only) proxy is our appointment wrapper instance, but this might not always be true */ [[proxies objectAtIndex: 0] fillMessageData: msgData inMemCtx: memCtx]; } *dataPtr = msgData; } /* sender representing */ // - (int) getPidTagSentRepresentingEmailAddress: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; // } // - (int) getPidTagSentRepresentingAddressType: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [self getSMTPAddrType: data inMemCtx: memCtx]; // } // - (int) getPidTagSentRepresentingName: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [self getPidTagSenderName: data inMemCtx: memCtx]; // } // - (int) getPidTagSentRepresentingEntryId: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [self getPidTagSenderEntryId: data inMemCtx: memCtx]; // } /* attendee */ // - (int) getPidTagReceivedByAddressType: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [appointmentWrapper getPidTagReceivedByAddressType: data // inMemCtx: memCtx]; // } // - (int) getPidTagReceivedByEmailAddress: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [appointmentWrapper getPidTagReceivedByEmailAddress: data // inMemCtx: memCtx]; // } // - (int) getPidTagReceivedByName: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [appointmentWrapper getPidTagReceivedByName: data // inMemCtx: memCtx]; // } // - (int) getPidTagReceivedByEntryId: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [appointmentWrapper getPidTagReceivedByEntryId: data // inMemCtx: memCtx]; // } // /* attendee representing */ // - (int) getPidTagReceivedRepresentingEmailAddress: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [self getPidTagReceivedByEmailAddress: data inMemCtx: memCtx]; // } // - (int) getPidTagReceivedRepresentingAddressType: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [self getSMTPAddrType: data inMemCtx: memCtx]; // } // - (int) getPidTagReceivedRepresentingName: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [self getPidTagReceivedByName: data inMemCtx: memCtx]; // } // - (int) getPidTagReceivedRepresentingEntryId: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [self getPidTagReceivedByEntryId: data inMemCtx: memCtx]; // } - (int) getPidTagResponseRequested: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (NSString *) _uidFromGlobalObjectId: (TALLOC_CTX *) memCtx { NSData *objectId; NSString *uid = nil; char *bytesDup, *uidStart; NSUInteger length; /* NOTE: we only handle the generic case at the moment, see MAPIStoreAppointmentWrapper */ objectId = [properties objectForKey: MAPIPropertyKey (PidLidGlobalObjectId)]; if (objectId) { length = [objectId length]; bytesDup = talloc_array (memCtx, char, length + 1); memcpy (bytesDup, [objectId bytes], length); bytesDup[length] = 0; uidStart = bytesDup + length - 1; while (uidStart != bytesDup && *(uidStart - 1)) uidStart--; if (uidStart > bytesDup && *uidStart) uid = [NSString stringWithUTF8String: uidStart]; talloc_free (bytesDup); } return uid; } - (SOGoAppointmentObject *) _resurrectRecord: (NSString *) cname fromFolder: (SOGoAppointmentFolder *) folder { NSArray *records; EOQualifier *qualifier; EOFetchSpecification *fs; GCSFolder *ocsFolder; SOGoAppointmentObject *newObject; NSMutableDictionary *newRecord; static NSArray *childRecordFields = nil; if (!childRecordFields) { childRecordFields = [NSArray arrayWithObjects: @"c_name", @"c_creationdate", @"c_lastmodified", @"c_content", nil]; [childRecordFields retain]; } ocsFolder = [folder ocsFolder]; qualifier = [EOQualifier qualifierWithQualifierFormat: [NSString stringWithFormat: @"c_name='%@'", cname]]; fs = [EOFetchSpecification fetchSpecificationWithEntityName: [ocsFolder folderName] qualifier: qualifier sortOrderings: nil]; records = [ocsFolder fetchFields: childRecordFields fetchSpecification: fs ignoreDeleted: NO]; if ([records isKindOfClass: NSArrayK] && [records count]) { newRecord = [[records objectAtIndex: 0] mutableCopy]; [newRecord setObject: [NSNumber numberWithInt: 0] forKey: @"c_version"]; newObject = [SOGoAppointmentObject objectWithRecord: newRecord inContainer: folder]; [newRecord autorelease]; [newObject setIsNew: NO]; } else newObject = nil; return newObject; } - (void) _fixupAppointmentObjectWithUID: (NSString *) uid { NSString *cname, *url; MAPIStoreMapping *mapping; uint64_t objectId; WOContext *woContext; SOGoAppointmentFolder *folder; SOGoAppointmentObject *newObject; cname = [[container sogoObject] resourceNameForEventUID: uid]; if (cname) isNew = NO; else cname = [NSString stringWithFormat: @"%@.ics", uid]; mapping = [self mapping]; url = [NSString stringWithFormat: @"%@%@", [container url], cname]; folder = [sogoObject container]; /* reinstantiate the old sogo object and attach it to self */ woContext = [[self userContext] woContext]; if (isNew) { /* event could have been deleted, let's try to resurrect it */ newObject = [self _resurrectRecord: cname fromFolder: folder]; if (!newObject) { newObject = [SOGoAppointmentObject objectWithName: cname inContainer: folder]; [newObject setIsNew: YES]; } } else { /* dissociate the object url from the old object's id */ objectId = [mapping idFromURL: url]; [mapping unregisterURLWithID: objectId]; newObject = [folder lookupName: cname inContext: woContext acquire: NO]; } /* dissociate the object url associated with this object, as we want to discard it */ objectId = [self objectId]; [mapping unregisterURLWithID: objectId]; /* associate the new object url with this object id */ [mapping registerURL: url withID: objectId]; [newObject setContext: woContext]; ASSIGN (sogoObject, newObject); } - (BOOL) subscriberCanReadMessage { NSArray *roles; roles = [self activeUserRoles]; return ([roles containsObject: SOGoCalendarRole_ComponentViewer] || [roles containsObject: SOGoCalendarRole_ComponentDAndTViewer] || [self subscriberCanModifyMessage]); } - (BOOL) subscriberCanModifyMessage { BOOL rc; NSArray *roles = [self activeUserRoles]; if (isNew) rc = [roles containsObject: SOGoRole_ObjectCreator]; else rc = ([roles containsObject: SOGoCalendarRole_ComponentModifier] || [roles containsObject: SOGoCalendarRole_ComponentResponder]); return rc; } - (void) _updateAttachedEvents { NSArray *allAttachments; NSUInteger count, max; NSString *uid, *summary; iCalEvent *event; MAPIStoreCalendarAttachment *attachment; /* ensure that all exception events have the same UID as the master */ uid = [masterEvent uid]; summary = [masterEvent summary]; allAttachments = [attachmentParts allValues]; max = [allAttachments count]; for (count = 0; count < max; count++) { attachment = [allAttachments objectAtIndex: count]; event = [attachment event]; if ([[event summary] length] == 0) [event setSummary: summary]; [event setUid: uid]; } } - (void) save: (TALLOC_CTX *) memCtx { // iCalCalendar *vCalendar; // NSCalendarDate *now; NSString *uid, *nameInContainer; // iCalEvent *newEvent; // iCalPerson *userPerson; SOGoUser *activeUser; NSRange rangeOfDot; if (isNew) { uid = [self _uidFromGlobalObjectId: memCtx]; if (uid) { /* Hack required because of what's explained in oxocal 3.1.4.7.1: basically, Outlook creates a copy of the event and then removes the old instance. We perform a trickery to avoid performing those operations in the backend, in a way that enables us to recover the initial instance and act solely on it. */ [self _fixupAppointmentObjectWithUID: uid]; } else { /* We create a UID from the nameInContainer, or the reverse if the latter is already set... */ nameInContainer = [sogoObject nameInContainer]; if (nameInContainer) { rangeOfDot = [nameInContainer rangeOfString: @"." options: NSBackwardsSearch]; if (rangeOfDot.location == NSNotFound) uid = nameInContainer; else uid = [nameInContainer substringToIndex: rangeOfDot.location]; } else { uid = [SOGoObject globallyUniqueObjectId]; nameInContainer = [NSString stringWithFormat: @"%@.ics", uid]; [sogoObject setNameInContainer: nameInContainer]; } } [masterEvent setUid: uid]; } // [self logWithFormat: @"-save, event props:"]; // MAPIStoreDumpMessageProperties (newProperties); // now = [NSCalendarDate date]; activeUser = [[self context] activeUser]; [masterEvent updateFromMAPIProperties: properties inUserContext: [self userContext] withActiveUser: activeUser inMemCtx: memCtx]; [self _updateAttachedEvents]; [[self userContext] activateWithUser: activeUser]; [sogoObject updateContentWithCalendar: calendar fromRequest: nil]; [self updateVersions]; } - (id) lookupAttachment: (NSString *) childKey { return [attachmentParts objectForKey: childKey]; } - (MAPIStoreAttachment *) createAttachment { MAPIStoreCalendarAttachment *newAttachment; uint32_t newAid; NSString *newKey; iCalEvent *newEvent; newAid = [[self attachmentKeys] count]; newAttachment = [MAPIStoreCalendarAttachment mapiStoreObjectInContainer: self]; [newAttachment setAID: newAid]; newEvent = [iCalEvent groupWithTag: @"vevent"]; [newAttachment setEvent: newEvent]; [calendar addToEvents: newEvent]; newKey = [NSString stringWithFormat: @"%ul", newAid]; [attachmentParts setObject: newAttachment forKey: newKey]; [attachmentKeys release]; attachmentKeys = nil; return newAttachment; } - (int) setReadFlag: (uint8_t) flag { return MAPISTORE_SUCCESS; } @end SOGo-2.1.1b/OpenChange/MAPIStoreDBMessage.m0000644000000000000000000001366212247657026016650 0ustar rootroot/* MAPIStoreDBMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import "MAPIStoreContext.h" #import "MAPIStorePropertySelectors.h" #import "SOGoMAPIDBMessage.h" #import "MAPIStoreDBFolder.h" #import "MAPIStoreDBMessage.h" #import "MAPIStoreTypes.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #undef DEBUG #include #include @implementation MAPIStoreDBMessage + (int) getAvailableProperties: (struct SPropTagArray **) propertiesP inMemCtx: (TALLOC_CTX *) memCtx { struct SPropTagArray *properties; NSUInteger count; enum MAPITAGS faiProperties[] = { 0x68350102, 0x683c0102, 0x683e0102, 0x683f0102, 0x68410003, 0x68420102, 0x68450102, 0x68460003 }; properties = talloc_zero (memCtx, struct SPropTagArray); properties->cValues = MAPIStoreSupportedPropertiesCount + 8; properties->aulPropTag = talloc_array (properties, enum MAPITAGS, MAPIStoreSupportedPropertiesCount + 8); for (count = 0; count < MAPIStoreSupportedPropertiesCount; count++) properties->aulPropTag[count] = MAPIStoreSupportedProperties[count]; /* FIXME (hack): append a few undocumented properties that can be added to FAI messages */ for (count = 0; count < 8; count++) properties->aulPropTag[MAPIStoreSupportedPropertiesCount+count] = faiProperties[count]; *propertiesP = properties; return MAPISTORE_SUCCESS; } - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newContainer { if ((self = [super initWithSOGoObject: newSOGoObject inContainer: newContainer])) { [properties release]; properties = [newSOGoObject properties]; [properties retain]; } return self; } - (uint64_t) objectVersion { NSNumber *versionNbr; uint64_t objectVersion; [(SOGoMAPIDBMessage *) sogoObject reloadIfNeeded]; versionNbr = [properties objectForKey: @"version"]; if (versionNbr) objectVersion = (([versionNbr unsignedLongLongValue] >> 16) & 0x0000ffffffffffffLL); else objectVersion = ULLONG_MAX; return objectVersion; } // // FIXME: how this can happen? // // We might get there if for some reasons, all classes weren't able // to tell us the message class. // - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Note" asUnicodeInMemCtx: memCtx]; [self logWithFormat: @"METHOD '%s' - unable to determine message class. Falling back to IPM.Note", __FUNCTION__]; return MAPISTORE_SUCCESS; } - (int) getProperties: (struct mapistore_property_data *) data withTags: (enum MAPITAGS *) tags andCount: (uint16_t) columnCount inMemCtx: (TALLOC_CTX *) memCtx { [sogoObject reloadIfNeeded]; return [super getProperties: data withTags: tags andCount: columnCount inMemCtx: memCtx]; } - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag inMemCtx: (TALLOC_CTX *) memCtx { id value; int rc; value = [properties objectForKey: MAPIPropertyKey (propTag)]; if (value) rc = [value getValue: data forTag: propTag inMemCtx: memCtx]; else rc = [super getProperty: data withTag: propTag inMemCtx: memCtx]; return rc; } - (void) addProperties: (NSDictionary *) newNewProperties { [sogoObject reloadIfNeeded]; [super addProperties: newNewProperties]; } - (void) save: (TALLOC_CTX *) memCtx { uint64_t newVersion; if ([attachmentKeys count] > 0) [properties setObject: attachmentParts forKey: @"attachments"]; newVersion = [[self context] getNewChangeNumber]; [properties setObject: [NSNumber numberWithUnsignedLongLong: newVersion] forKey: @"version"]; [self logWithFormat: @"%d props in dict", [properties count]]; [sogoObject save]; } - (BOOL) _messageIsFreeBusy { NSString *msgClass; /* This is a HACK until we figure out how to determine a message position in the mailbox hierarchy.... (missing: folderid and role) */ msgClass = [properties objectForKey: MAPIPropertyKey (PR_MESSAGE_CLASS_UNICODE)]; return [msgClass isEqualToString: @"IPM.Microsoft.ScheduleData.FreeBusy"]; } /* TODO: differentiate between the "Own" and "All" cases */ - (BOOL) subscriberCanReadMessage { return [(MAPIStoreFolder *) container subscriberCanReadMessages]; // || [self _messageIsFreeBusy]); } - (BOOL) subscriberCanModifyMessage { return ((isNew && [(MAPIStoreFolder *) container subscriberCanCreateMessages]) || (!isNew && [(MAPIStoreFolder *) container subscriberCanModifyMessages])); // || [self _messageIsFreeBusy]); } - (NSDate *) creationTime { return [sogoObject creationDate]; } - (NSDate *) lastModificationTime { return [sogoObject lastModified]; } @end SOGo-2.1.1b/OpenChange/GNUmakefile0000644000000000000000000001150312247657026015256 0ustar rootroot # GNUstep makefile include ../config.make include $(GNUSTEP_MAKEFILES)/common.make include ../Version BACKEND_VERSION = 1.0.0 ### bootstrap library MAPISTORESOGO = MAPIStoreSOGo LIBRARY_NAME = $(MAPISTORESOGO) $(MAPISTORESOGO)_VERSION = $(BACKEND_VERSION) $(MAPISTORESOGO)_OBJC_FILES += \ MAPIStoreSOGo.m ### backend bundle SOGOBACKEND = SOGoBackend BUNDLE_NAME = $(SOGOBACKEND) BUNDLE_EXTENSION = .MAPIStore BUNDLE_INSTALL_DIR = $(SOGO_LIBDIR) PYTHON = /usr/bin/python PYTHON_IS_GOOD = $(shell $(PYTHON) -c 'from sys import version_info; a=version_info; print a[0] == 2 and a[1] >= 6') ifeq (${PYTHON_IS_GOOD},False) PYTHON = /usr/bin/python2.6 endif all:: @echo " Python executable: ${PYTHON}" SAMBA_PRIVATE_DIR = $(shell $(PYTHON) ./samba-get-config.py "private dir") $(SOGOBACKEND)_PRINCIPAL_CLASS = MAPIApplication $(SOGOBACKEND)_OBJC_FILES += \ MAPIApplication.m \ MAPIStoreActiveTables.m \ MAPIStoreAuthenticator.m \ MAPIStoreMapping.m \ MAPIStoreMIME.m \ MAPIStoreTypes.m \ MAPIStorePropertySelectors.m \ MAPIStoreSamDBUtils.m \ MAPIStoreUserContext.m \ \ SOGoMAPIObject.m \ \ SOGoMAPIDBObject.m \ SOGoMAPIDBMessage.m \ SOGoMAPIDBFolder.m \ \ MAPIStoreAppointmentWrapper.m \ MAPIStoreAttachment.m \ MAPIStoreAttachmentTable.m \ MAPIStoreContext.m \ MAPIStoreEmbeddedMessage.m \ MAPIStoreFolder.m \ MAPIStoreMessage.m \ MAPIStoreObject.m \ MAPIStoreObjectProxy.m \ MAPIStoreSOGoObject.m \ MAPIStoreTable.m \ MAPIStoreMessageTable.m \ MAPIStoreFolderTable.m \ MAPIStorePermissionsTable.m \ \ MAPIStoreDBBaseContext.m \ MAPIStoreDBFolder.m \ MAPIStoreDBFolderTable.m \ MAPIStoreDBMessage.m \ MAPIStoreDBMessageTable.m \ \ MAPIStoreFAIMessage.m \ MAPIStoreFAIMessageTable.m \ \ MAPIStoreGCSBaseContext.m \ MAPIStoreGCSFolder.m \ MAPIStoreGCSMessage.m \ MAPIStoreGCSMessageTable.m \ \ MAPIStoreCalendarAttachment.m \ MAPIStoreCalendarContext.m \ MAPIStoreCalendarFolder.m \ MAPIStoreCalendarMessage.m \ MAPIStoreCalendarEmbeddedMessage.m \ MAPIStoreCalendarMessageTable.m \ MAPIStoreRecurrenceUtils.m \ \ MAPIStoreContactsAttachment.m \ MAPIStoreContactsContext.m \ MAPIStoreContactsFolder.m \ MAPIStoreContactsMessage.m \ MAPIStoreContactsMessageTable.m \ \ MAPIStoreTasksContext.m \ MAPIStoreTasksFolder.m \ MAPIStoreTasksMessage.m \ MAPIStoreTasksMessageTable.m \ \ MAPIStoreMailAttachment.m \ MAPIStoreMailContext.m \ MAPIStoreMailFolder.m \ MAPIStoreMailMessage.m \ MAPIStoreMailVolatileMessage.m \ MAPIStoreMailMessageTable.m \ \ MAPIStoreNotesContext.m \ MAPIStoreNotesFolder.m \ MAPIStoreNotesMessage.m \ \ MAPIStoreFallbackContext.m \ \ NSArray+MAPIStore.m \ NSData+MAPIStore.m \ NSDate+MAPIStore.m \ NSObject+MAPIStore.m \ NSString+MAPIStore.m \ NSValue+MAPIStore.m \ \ iCalEvent+MAPIStore.m \ iCalTimeZone+MAPIStore.m \ \ GCSSpecialQueries+OpenChange.m\ \ EOQualifier+MAPI.m \ \ EOBitmaskQualifier.m \ \ BSONCodec.m \ RTFHandler.m $(SOGOBACKEND)_RESOURCE_FILES += \ product.plist ### pl reader PLREADER_TOOL = plreader $(PLREADER_TOOL)_OBJC_FILES += \ plreader.m \ DBMSGREADER_TOOL = dbmsgreader $(DBMSGREADER_TOOL)_OBJC_FILES += \ dbmsgreader.m $(DBMSGREADER_TOOL)_LIB_DIRS += \ -L../SoObjects/SOGo/SOGo.framework/ -lSOGo \ -L../OGoContentStore/obj/ -lOGoContentStore \ -L../SOPE/GDLContentStore/obj/ -lGDLContentStore \ -L../SOPE/NGCards/obj/ -lNGCards \ -lNGObjWeb TEST_TOOL_NAME += $(PLREADER_TOOL) $(DBMSGREADER_TOOL) ### cflags and libs LIBMAPI_CFLAGS = $(shell pkg-config libmapi --cflags) ifeq ($(LIBMAPI_CFLAGS),) all install:: @echo "Cannot build the OpenChange SOGo backend (empty CFLAGS for libmapistore)" else SAMBA_LIB_DIR = $(shell pkg-config libmapistore --variable=libdir) LIBMAPI_LIBS = $(shell pkg-config libmapi --libs) LIBMAPISTORE_CFLAGS = $(shell pkg-config libmapistore --cflags) -DSAMBA_PREFIX="\"$(shell pkg-config libmapistore --variable=prefix)\"" LIBMAPISTORE_LIBS = $(shell pkg-config libmapistore --libs) -lmapiproxy -lWEExtensions $(MAPISTORESOGO)_INSTALL_DIR = $(DESTDIR)/$(SAMBA_LIB_DIR)/mapistore_backends $(MAPISTORESOGO)_LIB_DIRS += \ -L../SoObjects/SOGo/SOGo.framework/ -lSOGo \ $(LIBMAPI_LIBS) \ $(LIBMAPISTORE_LIBS) $(SOGOBACKEND)_LIB_DIRS += \ -L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ -lOGoContentStore \ -L../SoObjects/SOGo/SOGo.framework/ -lSOGo \ $(LIBMAPI_LIBS) \ $(LIBMAPISTORE_LIBS) ADDITIONAL_INCLUDE_DIRS += \ -Werror -Wall \ -DSAMBA_PRIVATE_DIR=@"\"$(SAMBA_PRIVATE_DIR)\"" \ $(LIBMAPI_CFLAGS) \ $(LIBMAPISTORE_CFLAGS) \ -I../SoObjects -I../SOPE \ -DBACKEND_BUNDLE_NAME="@\"$(BUNDLE_NAME)$(BUNDLE_EXTENSION)\"" \ -DSOGO_BUNDLES_DIR="@\"$(BUNDLE_INSTALL_DIR)\"" -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make include $(GNUSTEP_MAKEFILES)/library.make include $(GNUSTEP_MAKEFILES)/test-tool.make include $(GNUSTEP_MAKEFILES)/aggregate.make -include GNUmakefile.postamble endif SOGo-2.1.1b/OpenChange/MAPIStoreGCSFolder.h0000644000000000000000000000363012247657026016613 0ustar rootroot/* MAPIStoreGCSFolder.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREGCSFOLDER_H #define MAPISTOREGCSFOLDER_H #import "MAPIStoreFolder.h" @class NSArray; @class NSCalendarDate; @class NSData; @class NSMutableDictionary; @class NSNumber; @class NSString; @interface MAPIStoreGCSFolder : MAPIStoreFolder { SOGoMAPIDBMessage *versionsMessage; NSArray *activeUserRoles; EOQualifier *componentQualifier; } /* synchronisation */ - (BOOL) synchroniseCache; - (void) updateVersionsForMessageWithKey: (NSString *) messageKey withChangeKey: (NSData *) newChangeKey; - (NSNumber *) lastModifiedFromMessageChangeNumber: (NSString *) changeNumber; - (NSString *) changeNumberForMessageWithKey: (NSString *) messageKey; - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey; - (NSData *) predecessorChangeListForMessageWithKey: (NSString *) messageKey; - (NSArray *) activeUserRoles; - (EOQualifier *) componentQualifier; - (EOQualifier *) contentComponentQualifier; /* subclasses */ - (EOQualifier *) aclQualifier; - (NSString *) component; @end #endif /* MAPISTOREGCSFOLDER_H */ SOGo-2.1.1b/OpenChange/MAPIStoreGCSFolder.m0000644000000000000000000005462212247657026016627 0ustar rootroot/* MAPIStoreGCSFolder.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import #import #import #import #import #import "MAPIStoreGCSBaseContext.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" #import "NSString+MAPIStore.h" #import "SOGoMAPIDBMessage.h" #import "MAPIStoreGCSFolder.h" #undef DEBUG #include #include static Class NSNumberK; @implementation MAPIStoreGCSFolder + (void) initialize { NSNumberK = [NSNumber class]; } - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newContainer { if ((self = [super initWithSOGoObject: newSOGoObject inContainer: newContainer])) { activeUserRoles = nil; } return self; } - (void) setupVersionsMessage { ASSIGN (versionsMessage, [SOGoMAPIDBMessage objectWithName: @"versions.plist" inContainer: dbFolder]); [versionsMessage setObjectType: MAPIDBObjectTypeInternal]; } - (void) dealloc { [versionsMessage release]; [activeUserRoles release]; [componentQualifier release]; [super dealloc]; } - (int) deleteFolder { int rc; NSException *error; NSString *name; name = [self nameInContainer]; if ([name isEqualToString: @"personal"]) rc = MAPISTORE_ERR_DENIED; else { [[sogoObject container] removeSubFolder: name]; error = [(SOGoGCSFolder *) sogoObject delete]; if (error) rc = MAPISTORE_ERROR; else { if (![versionsMessage delete]) rc = MAPISTORE_SUCCESS; else rc = MAPISTORE_ERROR; } } return (rc == MAPISTORE_SUCCESS) ? [super deleteFolder] : rc; } - (void) setDisplayName: (NSString *) newDisplayName { NSString *suffix, *fullSuffix; Class cClass; cClass = [(MAPIStoreGCSBaseContext *) [self context] class]; /* if a suffix exists, we strip it from the final name */ suffix = [cClass folderNameSuffix]; if ([suffix length] > 0) { fullSuffix = [NSString stringWithFormat: @"(%@)", suffix]; if ([newDisplayName hasSuffix: fullSuffix]) { newDisplayName = [newDisplayName substringToIndex: [newDisplayName length] - [fullSuffix length]]; newDisplayName = [newDisplayName stringByTrimmingSpaces]; } } if (![[sogoObject displayName] isEqualToString: newDisplayName]) [sogoObject renameTo: newDisplayName]; } - (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *displayName; Class cClass; cClass = [(MAPIStoreGCSBaseContext *) [self context] class]; displayName = [cClass getFolderDisplayName: [sogoObject displayName]]; *data = [displayName asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (void) addProperties: (NSDictionary *) newProperties { NSString *newDisplayName; NSMutableDictionary *propsCopy; NSNumber *key; key = MAPIPropertyKey (PR_DISPLAY_NAME_UNICODE); newDisplayName = [newProperties objectForKey: key]; if (newDisplayName) { [self setDisplayName: newDisplayName]; propsCopy = [newProperties mutableCopy]; [propsCopy removeObjectForKey: key]; [propsCopy autorelease]; newProperties = propsCopy; } [super addProperties: newProperties]; } - (NSArray *) messageKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { static NSArray *fields = nil; SOGoUser *ownerUser; NSArray *records; NSMutableArray *qualifierArray; EOQualifier *fetchQualifier, *aclQualifier; GCSFolder *ocsFolder; EOFetchSpecification *fs; NSArray *keys; if (!fields) fields = [[NSArray alloc] initWithObjects: @"c_name", @"c_version", nil]; qualifierArray = [NSMutableArray new]; ownerUser = [[self userContext] sogoUser]; if (![[context activeUser] isEqual: ownerUser]) { aclQualifier = [self aclQualifier]; if (aclQualifier) [qualifierArray addObject: aclQualifier]; } [qualifierArray addObject: [self componentQualifier]]; if (qualifier) [qualifierArray addObject: qualifier]; fetchQualifier = [[EOAndQualifier alloc] initWithQualifierArray: qualifierArray]; ocsFolder = [sogoObject ocsFolder]; fs = [EOFetchSpecification fetchSpecificationWithEntityName: [ocsFolder folderName] qualifier: fetchQualifier sortOrderings: sortOrderings]; [fetchQualifier release]; [qualifierArray release]; records = [ocsFolder fetchFields: fields fetchSpecification: fs]; keys = [records objectsForKey: @"c_name" notFoundMarker: nil]; return keys; } - (NSDate *) lastMessageModificationTime { NSDate *value; NSNumber *ti; [self synchroniseCache]; ti = [[versionsMessage properties] objectForKey: @"SyncLastModificationDate"]; if (ti) value = [NSDate dateWithTimeIntervalSince1970: [ti doubleValue]]; else value = nil; return value; } - (SOGoFolder *) aclFolder { return (SOGoFolder *) sogoObject; } /* synchronisation */ /* Tree { SyncLastModseq = x; SyncLastSynchronisationDate = x; ** not updated until something changed Messages = { MessageKey = { Version = x; Modseq = x; Deleted = b; ChangeKey = d; PredecessorChangeList = { guid1 = globcnt1, guid2 ... }; }; ... }; VersionMapping = { Version = last-modified; ... } } */ - (void) _setChangeKey: (NSData *) changeKey forMessageEntry: (NSMutableDictionary *) messageEntry inChangeListOnly: (BOOL) inChangeListOnly { struct XID *xid; NSString *guid; NSData *globCnt; NSDictionary *changeKeyDict; NSMutableDictionary *changeList; xid = [changeKey asXIDInMemCtx: NULL]; guid = [NSString stringWithGUID: &xid->GUID]; globCnt = [NSData dataWithBytes: xid->Data length: xid->Size]; talloc_free (xid); if (!inChangeListOnly) { /* 1. set change key association */ changeKeyDict = [NSDictionary dictionaryWithObjectsAndKeys: guid, @"GUID", globCnt, @"LocalId", nil]; [messageEntry setObject: changeKeyDict forKey: @"ChangeKey"]; } /* 2. append/update predecessor change list */ changeList = [messageEntry objectForKey: @"PredecessorChangeList"]; if (!changeList) { changeList = [NSMutableDictionary new]; [messageEntry setObject: changeList forKey: @"PredecessorChangeList"]; [changeList release]; } [changeList setObject: globCnt forKey: guid]; } - (EOQualifier *) componentQualifier { if (!componentQualifier) componentQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_component" operatorSelector: EOQualifierOperatorEqual value: [self component]]; return componentQualifier; } - (EOQualifier *) contentComponentQualifier { EOQualifier *contentComponentQualifier; NSString *likeString; likeString = [NSString stringWithFormat: @"%%BEGIN:%@%%", [[self component] uppercaseString]]; contentComponentQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_content" operatorSelector: EOQualifierOperatorLike value: likeString]; [contentComponentQualifier autorelease]; return contentComponentQualifier; } - (BOOL) synchroniseCache { BOOL rc = YES; uint64_t newChangeNum; NSData *changeKey; NSString *cName, *changeNumber; NSNumber *ti, *lastModificationDate, *cVersion, *cLastModified, *cDeleted; EOFetchSpecification *fs; EOQualifier *searchQualifier, *fetchQualifier; NSUInteger count, max; NSArray *fetchResults, *changeNumbers; NSMutableArray *keys, *modifiedEntries; NSDictionary *result; NSMutableDictionary *currentProperties, *messages, *mapping, *messageEntry; NSCalendarDate *now; GCSFolder *ocsFolder; static NSArray *fields = nil; static EOSortOrdering *sortOrdering = nil; /* NOTE: we are using NSString instance for "changeNumber" because NSNumber proved to give very bad performances when used as NSDictionary keys with GNUstep 1.22.1. The bug seems to be solved with 1.24 but many distros still ship an older version. */ if (!fields) fields = [[NSArray alloc] initWithObjects: @"c_name", @"c_version", @"c_lastmodified", @"c_deleted", nil]; if (!sortOrdering) { sortOrdering = [EOSortOrdering sortOrderingWithKey: @"c_lastmodified" selector: EOCompareAscending]; [sortOrdering retain]; } [versionsMessage reloadIfNeeded]; currentProperties = [versionsMessage properties]; lastModificationDate = [currentProperties objectForKey: @"SyncLastModificationDate"]; if (lastModificationDate) { searchQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_lastmodified" operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo value: lastModificationDate]; fetchQualifier = [[EOAndQualifier alloc] initWithQualifiers: searchQualifier, [self contentComponentQualifier], nil]; [fetchQualifier autorelease]; [searchQualifier release]; } else fetchQualifier = [self componentQualifier]; ocsFolder = [sogoObject ocsFolder]; fs = [EOFetchSpecification fetchSpecificationWithEntityName: [ocsFolder folderName] qualifier: fetchQualifier sortOrderings: [NSArray arrayWithObject: sortOrdering]]; fetchResults = [ocsFolder fetchFields: fields fetchSpecification: fs ignoreDeleted: NO]; max = [fetchResults count]; if (max > 0) { messages = [currentProperties objectForKey: @"Messages"]; if (!messages) { messages = [NSMutableDictionary new]; [currentProperties setObject: messages forKey: @"Messages"]; [messages release]; } mapping = [currentProperties objectForKey: @"VersionMapping"]; if (!mapping) { mapping = [NSMutableDictionary new]; [currentProperties setObject: mapping forKey: @"VersionMapping"]; [mapping release]; } keys = [NSMutableArray arrayWithCapacity: max]; modifiedEntries = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { result = [fetchResults objectAtIndex: count]; cName = [result objectForKey: @"c_name"]; [keys addObject: cName]; cDeleted = [result objectForKey: @"c_deleted"]; if ([cDeleted isKindOfClass: NSNumberK] && [cDeleted intValue]) cVersion = [NSNumber numberWithInt: -1]; else cVersion = [result objectForKey: @"c_version"]; cLastModified = [result objectForKey: @"c_lastmodified"]; messageEntry = [messages objectForKey: cName]; if (!messageEntry) { messageEntry = [NSMutableDictionary new]; [messages setObject: messageEntry forKey: cName]; [messageEntry release]; } if (![[messageEntry objectForKey: @"c_version"] isEqual: cVersion]) { [sogoObject removeChildRecordWithName: cName]; [modifiedEntries addObject: messageEntry]; [messageEntry setObject: cLastModified forKey: @"c_lastmodified"]; [messageEntry setObject: cVersion forKey: @"c_version"]; if (!lastModificationDate || ([lastModificationDate compare: cLastModified] == NSOrderedAscending)) lastModificationDate = cLastModified; } } /* make sure all returned objects have a corresponding mid */ [self ensureIDsForChildKeys: keys]; max = [modifiedEntries count]; if (max > 0) { changeNumbers = [[self context] getNewChangeNumbers: max]; for (count = 0; count < max; count++) { messageEntry = [modifiedEntries objectAtIndex: count]; changeNumber = [changeNumbers objectAtIndex: count]; cLastModified = [messageEntry objectForKey: @"c_lastmodified"]; [mapping setObject: cLastModified forKey: changeNumber]; [messageEntry setObject: changeNumber forKey: @"version"]; newChangeNum = [changeNumber unsignedLongLongValue]; // A GLOBCNT structure is a 6-byte global namespace counter, // we strip the first 2 bytes. The first two bytes is the ReplicaId changeKey = [self getReplicaKeyFromGlobCnt: newChangeNum >> 16]; [self _setChangeKey: changeKey forMessageEntry: messageEntry inChangeListOnly: NO]; } now = [NSCalendarDate date]; ti = [NSNumber numberWithDouble: [now timeIntervalSince1970]]; [currentProperties setObject: ti forKey: @"SyncLastSynchronisationDate"]; [currentProperties setObject: lastModificationDate forKey: @"SyncLastModificationDate"]; [versionsMessage save]; } } return rc; } - (void) updateVersionsForMessageWithKey: (NSString *) messageKey withChangeKey: (NSData *) newChangeKey { NSMutableDictionary *messages, *messageEntry; [self synchroniseCache]; if (newChangeKey) { messages = [[versionsMessage properties] objectForKey: @"Messages"]; messageEntry = [messages objectForKey: messageKey]; if (!messageEntry) [NSException raise: @"MAPIStoreIOException" format: @"no version record found for message '%@'", messageKey]; [self _setChangeKey: newChangeKey forMessageEntry: messageEntry inChangeListOnly: YES]; [versionsMessage save]; } } - (NSNumber *) lastModifiedFromMessageChangeNumber: (NSString *) changeNumber { NSDictionary *mapping; NSNumber *modseq; mapping = [[versionsMessage properties] objectForKey: @"VersionMapping"]; modseq = [mapping objectForKey: changeNumber]; return modseq; } - (NSString *) changeNumberForMessageWithKey: (NSString *) messageKey { NSDictionary *messages; NSString *changeNumber; messages = [[versionsMessage properties] objectForKey: @"Messages"]; changeNumber = [[messages objectForKey: messageKey] objectForKey: @"version"]; return changeNumber; } - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey { NSDictionary *messages, *changeKeyDict; NSString *guid; NSData *globCnt, *changeKey = nil; messages = [[versionsMessage properties] objectForKey: @"Messages"]; changeKeyDict = [[messages objectForKey: messageKey] objectForKey: @"ChangeKey"]; if (changeKeyDict) { guid = [changeKeyDict objectForKey: @"GUID"]; globCnt = [changeKeyDict objectForKey: @"LocalId"]; changeKey = [NSData dataWithChangeKeyGUID: guid andCnt: globCnt]; } return changeKey; } - (NSData *) predecessorChangeListForMessageWithKey: (NSString *) messageKey { NSMutableData *list = nil; NSDictionary *messages, *changeListDict; NSArray *keys; NSMutableArray *changeKeys; NSUInteger count, max; NSData *changeKey; NSString *guid; NSData *globCnt; messages = [[versionsMessage properties] objectForKey: @"Messages"]; changeListDict = [[messages objectForKey: messageKey] objectForKey: @"PredecessorChangeList"]; if (changeListDict) { keys = [changeListDict allKeys]; max = [keys count]; changeKeys = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { guid = [keys objectAtIndex: count]; globCnt = [changeListDict objectForKey: guid]; changeKey = [NSData dataWithChangeKeyGUID: guid andCnt: globCnt]; [changeKeys addObject: changeKey]; } [changeKeys sortUsingFunction: MAPIChangeKeyGUIDCompare context: nil]; list = [NSMutableData data]; for (count = 0; count < max; count++) { changeKey = [changeKeys objectAtIndex: count]; [list appendUInt8: [changeKey length]]; [list appendData: changeKey]; } } return list; } - (NSArray *) getDeletedKeysFromChangeNumber: (uint64_t) changeNum andCN: (NSNumber **) cnNbr inTableType: (uint8_t) tableType { NSArray *deletedKeys, *deletedCNames, *records; NSNumber *lastModified; NSString *cName, *changeNumber; NSDictionary *versionProperties, *messageEntry; NSMutableDictionary *messages; uint64_t maxChangeNum = changeNum, currentChangeNum; EOAndQualifier *fetchQualifier; EOKeyValueQualifier *cDeletedQualifier, *cLastModifiedQualifier; EOFetchSpecification *fs; GCSFolder *ocsFolder; NSUInteger count, max; if (tableType == MAPISTORE_MESSAGE_TABLE) { deletedKeys = [NSMutableArray array]; changeNumber = [NSString stringWithUnsignedLongLong: changeNum]; lastModified = [self lastModifiedFromMessageChangeNumber: changeNumber]; if (lastModified) { versionProperties = [versionsMessage properties]; messages = [versionProperties objectForKey: @"Messages"]; ocsFolder = [sogoObject ocsFolder]; cLastModifiedQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_lastmodified" operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo value: lastModified]; cDeletedQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_deleted" operatorSelector: EOQualifierOperatorEqual value: [NSNumber numberWithInt: 1]]; fetchQualifier = [[EOAndQualifier alloc] initWithQualifiers: cLastModifiedQualifier, cDeletedQualifier, nil]; [fetchQualifier autorelease]; [cLastModifiedQualifier release]; [cDeletedQualifier release]; fs = [EOFetchSpecification fetchSpecificationWithEntityName: [ocsFolder folderName] qualifier: fetchQualifier sortOrderings: nil]; records = [ocsFolder fetchFields: [NSArray arrayWithObject: @"c_name"] fetchSpecification: fs ignoreDeleted: NO]; deletedCNames = [records objectsForKey: @"c_name" notFoundMarker: nil]; max = [deletedCNames count]; for (count = 0; count < max; count++) { cName = [deletedCNames objectAtIndex: count]; [sogoObject removeChildRecordWithName: cName]; messageEntry = [messages objectForKey: cName]; if (messageEntry) { currentChangeNum = [[messageEntry objectForKey: @"version"] unsignedLongLongValue]; if (MAPICNCompare (changeNum, currentChangeNum, NULL) == NSOrderedAscending) { [(NSMutableArray *) deletedKeys addObject: cName]; if (MAPICNCompare (maxChangeNum, currentChangeNum, NULL) == NSOrderedAscending) maxChangeNum = currentChangeNum; } } } if (maxChangeNum != changeNum) *cnNbr = [NSNumber numberWithUnsignedLongLong: maxChangeNum]; } } else deletedKeys = [super getDeletedKeysFromChangeNumber: changeNum andCN: cnNbr inTableType: tableType]; return deletedKeys; } - (NSArray *) activeUserRoles { SOGoUser *activeUser; WOContext *woContext; if (!activeUserRoles) { activeUser = [[self context] activeUser]; woContext = [[self userContext] woContext]; activeUserRoles = [activeUser rolesForObject: sogoObject inContext: woContext]; [activeUserRoles retain]; } return activeUserRoles; } - (BOOL) subscriberCanCreateMessages { return [[self activeUserRoles] containsObject: SOGoRole_ObjectCreator]; } - (BOOL) subscriberCanDeleteMessages { return [[self activeUserRoles] containsObject: SOGoRole_ObjectEraser]; } /* subclasses */ - (EOQualifier *) aclQualifier { return nil; } - (NSString *) component { [self subclassResponsibility: _cmd]; return nil; } @end SOGo-2.1.1b/OpenChange/MAPIStoreDBMessageTable.h0000644000000000000000000000207412247657026017606 0ustar rootroot/* MAPIStoreDBMessageTable.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 MAPISTOREDBMESSAGETABLE_H #define MAPISTOREDBMESSAGETABLE_H #import "MAPIStoreMessageTable.h" @interface MAPIStoreDBMessageTable : MAPIStoreMessageTable @end #endif /* MAPISTOREDBMESSAGETABLE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreTasksContext.m0000644000000000000000000000277212247657026017510 0ustar rootroot/* MAPIStoreTasksContext.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 "MAPIStoreTasksFolder.h" #import "MAPIStoreUserContext.h" #import "MAPIStoreTasksContext.h" #undef DEBUG #include static Class MAPIStoreTasksFolderK; @implementation MAPIStoreTasksContext + (void) initialize { MAPIStoreTasksFolderK = [MAPIStoreTasksFolder class]; } + (NSString *) MAPIModuleName { return @"tasks"; } + (enum mapistore_context_role) MAPIContextRole { return MAPISTORE_TASKS_ROLE; } - (Class) MAPIStoreFolderClass { return MAPIStoreTasksFolderK; } + (NSString *) folderNameSuffix { return @"t"; } @end SOGo-2.1.1b/OpenChange/MAPIStoreObjectProxy.m0000644000000000000000000000352012247657026017316 0ustar rootroot/* MAPIStoreObjectProxy.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 "MAPIStorePropertySelectors.h" #import "NSString+MAPIStore.h" #import "MAPIStoreObjectProxy.h" #undef DEBUG #include #include #include #include #include @implementation MAPIStoreObjectProxy - (id) init { if ((self = [super init])) { classGetters = (IMP *) MAPIStorePropertyGettersForClass (isa); } return self; } - (enum mapistore_error) getProperty: (void **) data withTag: (enum MAPITAGS) propTag inMemCtx: (TALLOC_CTX *) memCtx { MAPIStorePropertyGetter method; uint16_t propValue; SEL methodSel; int rc; propValue = (propTag & 0xffff0000) >> 16; methodSel = MAPIStoreSelectorForPropertyGetter (propValue); method = (MAPIStorePropertyGetter) classGetters[propValue]; if (method) rc = method (self, methodSel, data, memCtx); else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } @end SOGo-2.1.1b/OpenChange/NSDate+MAPIStore.m0000644000000000000000000000724612247657026016250 0ustar rootroot/* NSDate+MAPIStore.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 #import "NSDate+MAPIStore.h" #undef DEBUG #include #include #include #include static NSCalendarDate *refDate = nil; @interface NSDate (MAPIStorePossibleMethods) - (NSTimeZone *) timeZone; @end @implementation NSDate (MAPIStoreDataTypes) static void _setupRefDate () { refDate = [[NSCalendarDate alloc] initWithYear: 1601 month: 1 day: 1 hour: 0 minute: 0 second: 0 timeZone: [NSTimeZone timeZoneWithName: @"UTC"]]; } + (NSCalendarDate *) dateFromMinutesSince1601: (uint32_t) minutes { NSCalendarDate *result; if (!refDate) _setupRefDate (); result = [refDate dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: minutes seconds: 0]; return result; } - (uint32_t) asMinutesSince1601 { uint32_t minutes; NSInteger offset; if (!refDate) _setupRefDate (); if ([self respondsToSelector: @selector (timeZone)]) offset = [[self timeZone] secondsFromGMT]; else offset = 0; minutes = (uint32_t) (([self timeIntervalSinceDate: refDate] + offset) / 60); return minutes; } + (id) dateFromFileTime: (const struct FILETIME *) timeValue { NSCalendarDate *result; uint64_t interval; if (!refDate) _setupRefDate (); interval = ((uint64_t) timeValue->dwHighDateTime << 32 | timeValue->dwLowDateTime); result = [[NSCalendarDate alloc] initWithTimeInterval: (NSTimeInterval) interval / 10000000 sinceDate: refDate]; [result autorelease]; return result; } - (struct FILETIME *) asFileTimeInMemCtx: (void *) memCtx { struct FILETIME *timeValue; uint64_t interval; if (!refDate) _setupRefDate (); interval = (((uint64_t) [self timeIntervalSinceDate: refDate]) * 10000000); timeValue = talloc_zero (memCtx, struct FILETIME); timeValue->dwLowDateTime = (uint32_t) (interval & 0xffffffff); timeValue->dwHighDateTime = (uint32_t) ((interval >> 32) & 0xffffffff); return timeValue; } - (BOOL) isNever /* occurs on 4500-12-31 */ { NSCalendarDate *calDate; if ([self isKindOfClass: [NSCalendarDate class]]) calDate = (NSCalendarDate *) self; else calDate = [NSCalendarDate dateWithTimeIntervalSince1970: [self timeIntervalSince1970]]; return [calDate yearOfCommonEra] == 4500; } @end NSComparisonResult NSDateCompare (id date1, id date2, void *ctx) { NSTimeInterval secs1, secs2; NSComparisonResult result; secs1 = [date1 timeIntervalSince1970]; secs2 = [date2 timeIntervalSince1970]; if (secs1 == secs2) result = NSOrderedSame; else if (secs1 < secs2) result = NSOrderedAscending; else result = NSOrderedDescending; return result; } SOGo-2.1.1b/OpenChange/MAPIStoreAuthenticator.m0000644000000000000000000000364012247657026017663 0ustar rootroot/* MAPIStoreAuthenticator.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 #import #import "MAPIStoreAuthenticator.h" @implementation MAPIStoreAuthenticator - (void) dealloc { [username release]; [password release]; [super dealloc]; } - (void) setUsername: (NSString *) newUsername { ASSIGN (username, newUsername); } - (NSString *) username { return username; } - (void) setPassword: (NSString *) newPassword { ASSIGN (password, newPassword); } - (SOGoUser *) userInContext: (WOContext *)_ctx { return [SOGoUser userWithLogin: username roles: [NSArray arrayWithObject: SoRole_Authenticated]]; } - (NSString *) imapPasswordInContext: (WOContext *) context forURL: (NSURL *) server forceRenew: (BOOL) renew { NSString *imapPassword; if (renew) imapPassword = nil; else imapPassword = password; return imapPassword; } @end SOGo-2.1.1b/OpenChange/MAPIStoreDBMessageTable.m0000644000000000000000000001074712247657026017621 0ustar rootroot/* MAPIStoreDBMessageTable.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 3, 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 #import "MAPIStoreTypes.h" #import "MAPIStoreDBMessage.h" #import "MAPIStoreDBMessageTable.h" #undef DEBUG #include static Class MAPIStoreDBMessageK = Nil; @implementation MAPIStoreDBMessageTable + (void) initialize { MAPIStoreDBMessageK = [MAPIStoreDBMessage class]; } + (Class) childObjectClass { return MAPIStoreDBMessageK; } - (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property { return [NSString stringWithFormat: @"%@", MAPIPropertyKey (property)]; } - (MAPIRestrictionState) evaluatePropertyRestriction: (struct mapi_SPropertyRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; id value; NSNumber *version; uint64_t cVersion; if ((uint32_t) res->ulPropTag == PidTagChangeNumber) { value = NSObjectFromMAPISPropValue (&res->lpProp); cVersion = exchange_globcnt (([value unsignedLongLongValue] >> 16) & 0x0000ffffffffffffLL); version = [NSNumber numberWithUnsignedLongLong: cVersion]; //[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]]; [self logWithFormat: @" version: %.16lx", cVersion]; *qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"version" operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo value: version]; [*qualifier autorelease]; rc = MAPIRestrictionStateNeedsEval; } else if ((uint32_t) res->ulPropTag == PR_SUBJECT_UNICODE) { EOQualifier *subjectQualifier, *nSubjectQualifier, *subjectPQualifier; EOQualifier *orQualifier, *andQualifier; struct mapi_SPropertyRestriction subRes; char *colPtr, *prefix; [super evaluatePropertyRestriction: res intoQualifier: &subjectQualifier]; subRes.relop = res->relop; subRes.ulPropTag = PR_NORMALIZED_SUBJECT_UNICODE; subRes.lpProp.ulPropTag = PR_NORMALIZED_SUBJECT_UNICODE; colPtr = strstr (res->lpProp.value.lpszW, ":"); if (colPtr) subRes.lpProp.value.lpszW = colPtr + 1; else subRes.lpProp.value.lpszW = res->lpProp.value.lpszW; [self evaluatePropertyRestriction: &subRes intoQualifier: &nSubjectQualifier]; if (colPtr) { prefix = strndup (res->lpProp.value.lpszW, (colPtr - res->lpProp.value.lpszW)); subRes.relop = RELOP_EQ; subRes.ulPropTag = PR_SUBJECT_PREFIX_UNICODE; subRes.lpProp.ulPropTag = PR_SUBJECT_PREFIX_UNICODE; subRes.lpProp.value.lpszW = prefix; [self evaluatePropertyRestriction: &subRes intoQualifier: &subjectPQualifier]; free (prefix); andQualifier = [[EOOrQualifier alloc] initWithQualifiers: subjectPQualifier, nSubjectQualifier, nil]; orQualifier = [[EOOrQualifier alloc] initWithQualifiers: subjectQualifier, andQualifier, nil]; [andQualifier release]; } else orQualifier = [[EOOrQualifier alloc] initWithQualifiers: subjectQualifier, nSubjectQualifier, nil]; [orQualifier autorelease]; *qualifier = orQualifier; rc = MAPIRestrictionStateNeedsEval; } else rc = [super evaluatePropertyRestriction: res intoQualifier: qualifier]; return rc; } @end SOGo-2.1.1b/OpenChange/MAPIStoreUserContext.h0000644000000000000000000000445212247657026017331 0ustar rootroot/* MAPIStoreUserContext.h - this file is part of $PROJECT_NAME_HERE$ * * Copyright (C) 2012 Inverse inc * * 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 MAPISTOREUSERCONTEXT_H #define MAPISTOREUSERCONTEXT_H #import @class NSMutableDictionary; @class NSString; @class NSTimeZone; @class NSURL; @class WOContext; @class SOGoAppointmentFolders; @class SOGoContactFolders; @class SOGoMailAccount; @class SOGoUser; @class SOGoUserFolder; @class MAPIStoreAuthenticator; @class MAPIStoreMapping; @interface MAPIStoreUserContext : NSObject { NSString *username; SOGoUser *sogoUser; NSTimeZone *timeZone; SOGoUserFolder *userFolder; NSMutableArray *containersBag; NSMutableDictionary *rootFolders; MAPIStoreMapping *mapping; BOOL userDbTableExists; NSURL *folderTableURL; WOContext *woContext; MAPIStoreAuthenticator *authenticator; BOOL inboxHasNoInferiors; } + (id) userContextWithUsername: (NSString *) username andTDBIndexing: (struct tdb_wrap *) indexingTdb; - (id) initWithUsername: (NSString *) newUsername andTDBIndexing: (struct tdb_wrap *) indexingTdb; - (NSString *) username; - (SOGoUser *) sogoUser; - (NSTimeZone *) timeZone; - (SOGoUserFolder *) userFolder; - (NSDictionary *) rootFolders; - (BOOL) inboxHasNoInferiors; - (NSURL *) folderTableURL; - (MAPIStoreMapping *) mapping; - (void) ensureFolderTableExists; /* SOGo hacky magic */ - (void) activateWithUser: (SOGoUser *) activeUser; - (MAPIStoreAuthenticator *) authenticator; - (WOContext *) woContext; @end #endif /* MAPISTOREUSERCONTEXT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreMailMessage.h0000644000000000000000000000475412247657026017242 0ustar rootroot/* MAPIStoreMailMessage.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREMAILMESSAGE_H #define MAPISTOREMAILMESSAGE_H #import "MAPIStoreMessage.h" @class NSData; @class NSString; @class MAPIStoreAppointmentWrapper; @class MAPIStoreMailFolder; @interface MAPIStoreMailMessage : MAPIStoreMessage { BOOL headerSetup; BOOL mailIsEvent; NSString *mimeKey; NSString *headerCharset; NSString *headerEncoding; NSString *headerMimeType; BOOL bodySetup; NSData *bodyContent; BOOL fetchedAttachments; MAPIStoreAppointmentWrapper *appointmentWrapper; } - (NSString *) subject; - (int) getPidTagIconIndex: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagFlagStatus: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagMessageFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagFollowupIcon: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagImportance: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagReceivedByEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagSenderEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagDisplayTo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagDisplayCc: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagDisplayBcc: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; /* batch-mode helpers */ - (NSString *) bodyContentPartKey; - (void) setBodyContentFromRawData: (NSData *) rawContent; @end #endif /* MAPISTOREMAILMESSAGE_H */ SOGo-2.1.1b/OpenChange/COPYING0000644000000000000000000010451312247657026014243 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program 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 3 of the License, or (at your option) any later version. This program 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. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . SOGo-2.1.1b/OpenChange/code-MAPIStorePropertySelectors.h0000644000000000000000000000221412247657026021460 0ustar rootroot/* code-MAPIStorePropertySelectors.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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. */ typedef int (*MAPIStorePropertyGetter) (id inst, SEL _cmd, void **data, TALLOC_CTX *memCtx); const MAPIStorePropertyGetter *MAPIStorePropertyGettersForClass (Class klass); SEL MAPIStoreSelectorForPropertyGetter (uint16_t propertyId); SOGo-2.1.1b/OpenChange/MAPIStoreMailMessageTable.h0000644000000000000000000000215112247657026020177 0ustar rootroot/* MAPIStoreMailMessageTable.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 MAPISTOREMAILMESSAGETABLE_H #define MAPISTOREMAILMESSAGETABLE_H #import "MAPIStoreMessageTable.h" @interface MAPIStoreMailMessageTable : MAPIStoreMessageTable { BOOL fetchedCoreInfos; } @end #endif /* MAPISTOREMAILMESSAGETABLE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreTasksMessageTable.m0000644000000000000000000001112512247657026020410 0ustar rootroot/* MAPIStoreTasksMessageTable.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 #import #import "MAPIStoreTasksMessage.h" #import "MAPIStoreTypes.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreTasksMessageTable.h" #include static Class MAPIStoreTasksMessageK = Nil; @implementation MAPIStoreTasksMessageTable + (void) initialize { MAPIStoreTasksMessageK = [MAPIStoreTasksMessage class]; } + (Class) childObjectClass { return MAPIStoreTasksMessageK; } - (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property { static NSMutableDictionary *knownProperties = nil; if (!knownProperties) { knownProperties = [NSMutableDictionary new]; [knownProperties setObject: @"c_enddate" forKey: MAPIPropertyKey (PidLidTaskDueDate)]; } return [knownProperties objectForKey: MAPIPropertyKey (property)]; } /* restrictions */ - (MAPIRestrictionState) evaluatePropertyRestriction: (struct mapi_SPropertyRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; id value; value = NSObjectFromMAPISPropValue (&res->lpProp); switch ((uint32_t) res->ulPropTag) { case PR_MESSAGE_CLASS_UNICODE: if ([value isKindOfClass: [NSString class]] && [value isEqualToString: @"IPM.Task"]) rc = MAPIRestrictionStateAlwaysTrue; else rc = MAPIRestrictionStateAlwaysFalse; break; case PR_SENSITIVITY: rc = MAPIRestrictionStateAlwaysTrue; break; case PR_RULE_PROVIDER_UNICODE: // TODO: what's this? rc = MAPIRestrictionStateAlwaysTrue; break; case PidLidTaskOwnership: rc = MAPIRestrictionStateAlwaysTrue; break; case PidLidTaskStatus: rc = MAPIRestrictionStateAlwaysTrue; break; case PidLidTaskComplete: *qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_status" operatorSelector: EOQualifierOperatorEqual value: [NSNumber numberWithInt: 1]]; [*qualifier autorelease]; rc = MAPIRestrictionStateNeedsEval; break; case PidLidTaskDateCompleted: rc = MAPIRestrictionStateAlwaysTrue; break; default: rc = [super evaluatePropertyRestriction: res intoQualifier: qualifier]; } return rc; } - (MAPIRestrictionState) evaluateExistRestriction: (struct mapi_SExistRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; switch ((uint32_t) res->ulPropTag) { case PidLidTaskDateCompleted: /* since we don't store the completion date in the quick table, we only checks whether the task has been completed */ *qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_status" operatorSelector: EOQualifierOperatorEqual value: [NSNumber numberWithInt: 1]]; [*qualifier autorelease]; rc = MAPIRestrictionStateNeedsEval; break; default: rc = [super evaluateExistRestriction: res intoQualifier: qualifier]; } return rc; } /* sorting */ - (NSString *) sortIdentifierForProperty: (enum MAPITAGS) property { static NSMutableDictionary *knownProperties = nil; if (!knownProperties) { knownProperties = [NSMutableDictionary new]; [knownProperties setObject: @"c_title" forKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)]; [knownProperties setObject: @"c_enddate" forKey: MAPIPropertyKey (PidLidTaskDueDate)]; [knownProperties setObject: @"c_creationdate" forKey: MAPIPropertyKey (PidLidTaskOrdinal)]; } return [knownProperties objectForKey: MAPIPropertyKey (property)]; } @end SOGo-2.1.1b/OpenChange/NSObject+PropertyList.m0000644000000000000000000001110512247657026017503 0ustar rootroot/* dbmsgdump.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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. */ /* A format-agnostic property list dumper. Usage: dbmsgdump [filename] */ #import #import #import #import #import #import #import #import #import #import "BSONCodec.h" const char *indentationStep = " "; @interface NSObject (plext) - (void) displayWithIndentation: (NSInteger) anInt; @end @implementation NSObject (plext) - (void) _outputIndentation: (NSInteger) anInt { NSInteger i; for (i = 0; i < anInt; i++) printf ("%s", indentationStep); } - (void) displayWithIndentation: (NSInteger) anInt { printf ("(%s) %s", [NSStringFromClass (isa) UTF8String], [[self description] UTF8String]); } @end @implementation NSDictionary (plext) - (void) displayKey: (NSString *) key withIndentation: (NSInteger) anInt { [self _outputIndentation: anInt]; printf ("%s ", [[key description] UTF8String]); if ([key isKindOfClass: [NSValue class]]) printf ("(%s: 0x%.8x) ", [(NSValue *) key objCType], [key intValue]); printf ("= "); } - (void) displayWithIndentation: (NSInteger) anInt { NSUInteger i, max; NSArray *keys; NSInteger subIndent; NSString *key; keys = [self allKeys]; max = [keys count]; printf ("{ (%ld) items\n", (long) max); subIndent = anInt + 1; for (i = 0; i < max; i++) { key = [keys objectAtIndex: i]; [self displayKey: key withIndentation: subIndent]; [[self objectForKey: key] displayWithIndentation: subIndent]; if (i < (max - 1)) printf (","); printf ("\n"); } [self _outputIndentation: anInt]; printf ("}"); } @end @implementation NSArray (plext) - (void) displayCount: (NSUInteger) count withIndentation: (NSInteger) anInt { [self _outputIndentation: anInt]; printf ("%lu = ", (unsigned long) count); } - (void) displayWithIndentation: (NSInteger) anInt { NSUInteger i, max; NSInteger subIndent; max = [self count]; printf ("[ (%ld) items\n", (long) max); subIndent = anInt + 1; for (i = 0; i < max; i++) { [self displayCount: i withIndentation: subIndent]; [[self objectAtIndex: i] displayWithIndentation: subIndent]; if (i < (max - 1)) printf (","); printf ("\n"); } [self _outputIndentation: anInt]; printf ("]"); } @end static void OCDumpPListData (NSData *content) { //NSDictionary *d; //NSPropertyListFormat format; //NSString *error = nil; //const char *formatName; //d = [NSPropertyListSerialization propertyListFromData: content // mutabilityOption: NSPropertyListImmutable // format: &format // errorDescription: &error]; //d = [content BSONValue]; // if (d) // { // switch (format) // { // case NSPropertyListOpenStepFormat: // formatName = "OpenStep"; // break; // case NSPropertyListXMLFormat_v1_0: // formatName = "XML"; // break; // case NSPropertyListBinaryFormat_v1_0: // formatName = "Binary"; // break; // case NSPropertyListGNUstepFormat: // formatName = "GNUstep"; // break; // case NSPropertyListGNUstepBinaryFormat: // formatName = "GNUstep binary"; // break; // default: formatName = "unknown"; // } // printf ("File format is: %s\n", formatName); // [d displayWithIndentation: 0]; // printf ("\n"); // } // else // printf ("an error occurred: %s\n", [error UTF8String]); } SOGo-2.1.1b/OpenChange/MAPIStorePermissionsTable.h0000644000000000000000000000307012247657026020324 0ustar rootroot/* MAPIStorePermissionsTable.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 MAPISTOREPERMISSIONSTABLE_H #define MAPISTOREPERMISSIONSTABLE_H #import "MAPIStoreTable.h" struct ldb_context; @interface MAPIStorePermissionEntry : MAPIStoreObject { NSString *userId; uint64_t memberId; } + (id) entryWithUserId: (NSString *) newUserId andMemberId: (uint64_t) newMemberId forFolder: (MAPIStoreFolder *) newFolder; - (id) initWithUserId: (NSString *) newUserId andMemberId: (uint64_t) newMemberId forFolder: (MAPIStoreFolder *) newFolder; - (NSString *) userId; - (uint64_t) memberId; @end @interface MAPIStorePermissionsTable : MAPIStoreTable { NSMutableDictionary *entries; } @end #endif /* MAPISTOREPERMISSIONSTABLE_H */ SOGo-2.1.1b/OpenChange/NSData+MAPIStore.m0000644000000000000000000001410212247657026016231 0ustar rootroot/* NSData+MAPIStore.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "NSData+MAPIStore.h" #undef DEBUG #include #include #include #include @implementation NSData (MAPIStoreDataTypes) + (id) dataWithBinary: (const struct Binary_r *) binData { return [NSData dataWithBytes: binData->lpb length: binData->cb]; } - (struct Binary_r *) asBinaryInMemCtx: (void *) memCtx { struct Binary_r *binary; binary = talloc_zero (memCtx, struct Binary_r); binary->cb = [self length]; binary->lpb = (uint8_t *) [self bytes]; [self tallocWrapper: binary]; return binary; } + (id) dataWithShortBinary: (const struct SBinary_short *) binData { return [NSData dataWithBytes: binData->lpb length: binData->cb]; } - (struct SBinary_short *) asShortBinaryInMemCtx: (void *) memCtx { struct SBinary_short *binary; binary = talloc_zero (memCtx, struct SBinary_short); binary->cb = [self length]; binary->lpb = (uint8_t *) [self bytes]; [self tallocWrapper: binary]; return binary; } + (id) dataWithFlatUID: (const struct FlatUID_r *) flatUID { return [NSData dataWithBytes: flatUID->ab length: 16]; } - (struct FlatUID_r *) asFlatUIDInMemCtx: (void *) memCtx { struct FlatUID_r *flatUID; flatUID = talloc_zero (memCtx, struct FlatUID_r); [self getBytes: flatUID->ab]; return flatUID; } static void _fillFlatUIDWithGUID (struct FlatUID_r *flatUID, const struct GUID *guid) { flatUID->ab[0] = (guid->time_low & 0xFF); flatUID->ab[1] = ((guid->time_low >> 8) & 0xFF); flatUID->ab[2] = ((guid->time_low >> 16) & 0xFF); flatUID->ab[3] = ((guid->time_low >> 24) & 0xFF); flatUID->ab[4] = (guid->time_mid & 0xFF); flatUID->ab[5] = ((guid->time_mid >> 8) & 0xFF); flatUID->ab[6] = (guid->time_hi_and_version & 0xFF); flatUID->ab[7] = ((guid->time_hi_and_version >> 8) & 0xFF); memcpy (flatUID->ab + 8, guid->clock_seq, sizeof (uint8_t) * 2); memcpy (flatUID->ab + 10, guid->node, sizeof (uint8_t) * 6); } + (id) dataWithGUID: (const struct GUID *) guid { struct FlatUID_r flatUID; _fillFlatUIDWithGUID (&flatUID, guid); return [self dataWithFlatUID: &flatUID]; } - (void) _extractGUID: (struct GUID *) guid { uint8_t *bytes; bytes = (uint8_t *) [self bytes]; guid->time_low = (bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0]); guid->time_mid = (bytes[5] << 8 | bytes[4]); guid->time_hi_and_version = (bytes[7] << 8 | bytes[6]); memcpy (guid->clock_seq, bytes + 8, sizeof (uint8_t) * 2); memcpy (guid->node, bytes + 10, sizeof (uint8_t) * 6); } - (struct GUID *) asGUIDInMemCtx: (void *) memCtx { struct GUID *guid; guid = talloc_zero (memCtx, struct GUID); [self _extractGUID: guid]; return guid; } + (id) dataWithXID: (const struct XID *) xid { NSMutableData *xidData; struct FlatUID_r flatUID; _fillFlatUIDWithGUID (&flatUID, &xid->GUID); xidData = [NSMutableData dataWithCapacity: 16 + xid->Size]; [xidData appendBytes: flatUID.ab length: 16]; [xidData appendBytes: xid->Data length: xid->Size]; return xidData; } - (struct XID *) asXIDInMemCtx: (void *) memCtx { struct XID *xid; uint8_t *bytes; NSUInteger max; max = [self length]; if (max > 16) { xid = talloc_zero (memCtx, struct XID); [self _extractGUID: &xid->GUID]; xid->Size = max - 16; bytes = (uint8_t *) [self bytes]; xid->Data = talloc_memdup (xid, (bytes+16), xid->Size); } else { xid = NULL; abort (); } return xid; } + (id) dataWithChangeKeyGUID: (NSString *) guidString andCnt: (NSData *) globCnt; { NSMutableData *changeKey; struct GUID guid; changeKey = [NSMutableData dataWithCapacity: 16 + [globCnt length]]; [guidString extractGUID: &guid]; [changeKey appendData: [NSData dataWithGUID: &guid]]; [changeKey appendData: globCnt]; return changeKey; } - (void) hexDumpWithLineSize: (NSUInteger) lineSize { const char *bytes; NSUInteger lineCount, count, max, charCount, charMax; NSMutableString *line; bytes = [self bytes]; max = [self length]; lineCount = 0; for (count = 0; count < max; count++) { line = [NSMutableString stringWithFormat: @"%d: ", lineCount]; if (lineSize) { if ((max - count) > lineSize) charMax = lineSize; else charMax = max - count; } else charMax = max; for (charCount = 0; charCount < charMax; charCount++) [line appendFormat: @" %.2x", *(bytes + count + charCount)]; [self logWithFormat: @" %@", line]; count += charMax; lineCount++; } } @end @implementation NSMutableData (MAPIStoreDataTypes) - (void) appendUInt8: (uint8_t) value { [self appendBytes: (char *) &value length: 1]; } - (void) appendUInt16: (uint16_t) value { NSUInteger count; char bytes[2]; for (count = 0; count < 2; count++) { bytes[count] = value & 0xff; value >>= 8; } [self appendBytes: bytes length: 2]; } - (void) appendUInt32: (uint32_t) value { NSUInteger count; char bytes[4]; for (count = 0; count < 4; count++) { bytes[count] = value & 0xff; value >>= 8; } [self appendBytes: bytes length: 4]; } @end SOGo-2.1.1b/OpenChange/GCSSpecialQueries+OpenChange.h0000644000000000000000000000223412247657026020634 0ustar rootroot/* GCSSpecialQueries+OpenChange.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 GCSSPECIALQUERIES_OPENCHANGE_H #define GCSSPECIALQUERIES_OPENCHANGE_H #import @interface GCSSpecialQueries (OpenChangeHelpers) - (NSString *) createOpenChangeFSTableWithName: (NSString *) tableName; @end #endif /* GCSSPECIALQUERIES_OPENCHANGE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreFolder.h0000644000000000000000000001572012247657026016261 0ustar rootroot/* MAPIStoreFolder.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREFOLDER_H #define MAPISTOREFOLDER_H #import @class NSArray; @class NSMutableArray; @class NSNumber; @class EOQualifier; @class MAPIStoreContext; @class MAPIStoreMessage; @class MAPIStoreFAIMessageTable; @class MAPIStoreFolderTable; @class MAPIStoreMessageTable; @class MAPIStorePermissionsTable; @class SOGoFolder; @class SOGoMAPIDBFolder; @class SOGoMAPIDBMessage; #import "MAPIStoreSOGoObject.h" @interface MAPIStoreFolder : MAPIStoreSOGoObject { MAPIStoreContext *context; // NSArray *messageKeys; // NSArray *faiMessageKeys; // NSArray *folderKeys; SOGoMAPIDBFolder *dbFolder; // SOGoMAPIDBFolder *faiFolder; // SOGoMAPIDBFolder *propsFolder; // SOGoMAPIDBMessage *propsMessage; } - (void) setContext: (MAPIStoreContext *) newContext; - (void) setupAuxiliaryObjects; - (SOGoMAPIDBFolder *) dbFolder; - (NSArray *) activeMessageTables; - (NSArray *) activeFAIMessageTables; // - (SOGoMAPIDBMessage *) propertiesMessage; - (NSString *) childKeyFromURL: (NSString *) childURL; - (id) lookupMessageByURL: (NSString *) messageURL; - (id) lookupFolderByURL: (NSString *) folderURL; /* permissions */ - (MAPIStorePermissionsTable *) permissionsTable; - (NSArray *) permissionEntries; /* message objects and tables */ - (id) lookupMessage: (NSString *) messageKey; - (NSArray *) messageKeys; /* FAI message objects and tables */ - (id) lookupFAIMessage: (NSString *) messageKey; - (MAPIStoreFAIMessageTable *) faiMessageTable; - (NSArray *) faiMessageKeys; - (NSArray *) faiMessageKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings; /* folder objects and tables */ - (id) lookupFolder: (NSString *) folderKey; - (MAPIStoreFolderTable *) folderTable; - (NSArray *) folderKeys; - (NSArray *) folderKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings; - (MAPIStoreMessage *) createMessage: (BOOL) isAssociated; /* backend interface */ - (int) openFolder: (MAPIStoreFolder **) childFolderPtr withFID: (uint64_t) fid; - (int) createFolder: (MAPIStoreFolder **) childFolderPtr withRow: (struct SRow *) aRow andFID: (uint64_t) fid; - (int) deleteFolder; - (int) getChildCount: (uint32_t *) rowCount ofTableType: (enum mapistore_table_type) tableType; - (int) createMessage: (MAPIStoreMessage **) messagePtr withMID: (uint64_t) mid isAssociated: (BOOL) isAssociated; - (int) openMessage: (MAPIStoreMessage **) messagePtr withMID: (uint64_t) mid forWriting: (BOOL) readWrite inMemCtx: (TALLOC_CTX *) memCtx; - (int) deleteMessageWithMID: (uint64_t) mid andFlags: (uint8_t) flags; - (int) moveCopyMessagesWithMIDs: (uint64_t *) srcMids andCount: (uint32_t) count fromFolder: (MAPIStoreFolder *) sourceFolder withMIDs: (uint64_t *) targetMids andChangeKeys: (struct Binary_r **) targetChangeKeys wantCopy: (uint8_t) want_copy inMemCtx: (TALLOC_CTX *) memCtx; - (enum mapistore_error) moveCopyToFolder: (MAPIStoreFolder *) targetFolder withNewName: (NSString *) newFolderName isMove: (BOOL) isMove isRecursive: (BOOL) isRecursive inMemCtx: (TALLOC_CTX *) memCtx; - (int) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr andCN: (uint64_t *) cnPtr fromChangeNumber: (uint64_t) changeNum inTableType: (enum mapistore_table_type) tableType inMemCtx: (TALLOC_CTX *) mem_ctx; - (int) getTable: (MAPIStoreTable **) tablePtr andRowCount: (uint32_t *) count tableType: (enum mapistore_table_type) tableType andHandleId: (uint32_t) handleId; - (int) modifyPermissions: (struct PermissionData *) permissions withCount: (uint16_t) pcount andFlags: (int8_t) flags; - (enum mapistore_error) preloadMessageBodiesWithMIDs: (const struct UI8Array_r *) mids ofTableType: (enum mapistore_table_type) tableType; /* helpers */ - (uint64_t) idForObjectWithKey: (NSString *) childKey; /* subclasses */ - (MAPIStoreMessage *) createMessage; - (MAPIStoreMessageTable *) messageTable; - (NSArray *) messageKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings; - (NSArray *) getDeletedKeysFromChangeNumber: (uint64_t) changeNum andCN: (NSNumber **) cnNbr inTableType: (enum mapistore_table_type) tableType; - (enum mapistore_error) createFolder: (struct SRow *) aRow withFID: (uint64_t) newFID andKey: (NSString **) newKeyP; - (NSCalendarDate *) lastMessageModificationTime; - (SOGoFolder *) aclFolder; - (NSArray *) rolesForExchangeRights: (uint32_t) rights; - (uint32_t) exchangeRightsForRoles: (NSArray *) roles; - (BOOL) subscriberCanCreateMessages; - (BOOL) subscriberCanModifyMessages; - (BOOL) subscriberCanReadMessages; - (BOOL) subscriberCanDeleteMessages; - (BOOL) subscriberCanCreateSubFolders; - (BOOL) supportsSubFolders; /* capability */ - (enum mapistore_error) preloadMessageBodiesWithKeys: (NSArray *) keys ofTableType: (enum mapistore_table_type) tableType; /* subclass helpers */ - (void) setupVersionsMessage; - (void) ensureIDsForChildKeys: (NSArray *) keys; - (void) postNotificationsForMoveCopyMessagesWithMIDs: (uint64_t *) srcMids andMessageURLs: (NSArray *) oldMessageURLs andCount: (uint32_t) midCount fromFolder: (MAPIStoreFolder *) sourceFolder withMIDs: (uint64_t *) targetMids wantCopy: (uint8_t) wantCopy; @end #endif /* MAPISTOREFOLDER_H */ SOGo-2.1.1b/OpenChange/iCalTimeZone+MAPIStore.m0000644000000000000000000001106712247657027017452 0ustar rootroot/* iCalTimeZone+MAPIStore.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 3, 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 #import #import #import #import "NSString+MAPIStore.h" #include #include #include #undef DEBUG #include #import "iCalTimeZone+MAPIStore.h" @interface iCalTimeZonePeriod (MAPIStorePropertiesPrivate) - (void) _fillTZDate: (struct SYSTEMTIME *) tzData; @end @implementation iCalTimeZonePeriod (MAPIStorePropertiesPrivate) - (void) _fillTZDate: (struct SYSTEMTIME *) tzData { iCalRecurrenceRule *rrule; NSArray *byMonth; iCalByDayMask *mask; NSCalendarDate *dateValue; rrule = [self recurrenceRule]; byMonth = [rrule byMonth]; if ([byMonth count] > 0) { tzData->wMonth = [[byMonth objectAtIndex: 0] intValue]; mask = [rrule byDayMask]; tzData->wDayOfWeek = [mask firstDay]; tzData->wDay = [mask firstOccurrence]; dateValue = [self startDate]; tzData->wHour = [dateValue hourOfDay]; tzData->wMinute = [dateValue minuteOfHour]; tzData->wSecond = [dateValue secondOfMinute]; } } @end @implementation iCalTimeZone (MAPIStoreProperties) - (iCalTimeZonePeriod *) _mostRecentPeriodWithName: (NSString *) periodName { NSArray *periods; iCalTimeZonePeriod *period; NSUInteger max; periods = [self childrenWithTag: periodName]; max = [periods count]; if (max > 0) { periods = [periods sortedArrayUsingSelector: @selector (compare:)]; period = (iCalTimeZonePeriod *) [periods objectAtIndex: (max - 1)]; } else period = nil; return period; } - (struct Binary_r *) asTimeZoneStructInMemCtx: (TALLOC_CTX *) memCtx { iCalTimeZonePeriod *period; struct TimeZoneStruct tz; int lBias, dlBias; memset (&tz, 0, sizeof (struct TimeZoneStruct)); period = [self _mostRecentPeriodWithName: @"STANDARD"]; lBias = -[period secondsOffsetFromGMT] / 60; tz.lBias = (uint32_t) lBias; [period _fillTZDate: &tz.stStandardDate]; period = [self _mostRecentPeriodWithName: @"DAYLIGHT"]; if (!period) tz.stStandardDate.wMonth = 0; dlBias = -([period secondsOffsetFromGMT] / 60) - lBias; tz.lDaylightBias = (uint32_t) (dlBias); [period _fillTZDate: &tz.stDaylightDate]; tz.wStandardYear = tz.stStandardDate.wYear; tz.wDaylightYear = tz.stDaylightDate.wYear; return set_TimeZoneStruct (memCtx, &tz); } - (struct Binary_r *) asZoneTimeDefinitionWithFlags: (enum TZRuleFlag) flags inMemCtx: (TALLOC_CTX *) memCtx { iCalTimeZonePeriod *period; struct TimeZoneDefinition definition; struct TZRule rule; NSString *tzId; int lBias, dlBias; memset (&definition, 0, sizeof (struct TimeZoneDefinition)); definition.major = 0x02; definition.minor = 0x01; definition.reserved = 0x0002; tzId = [self tzId]; definition.keyName = [tzId asUnicodeInMemCtx: memCtx]; definition.cbHeader = 6 + [tzId length] * 2; definition.cRules = 1; definition.TZRules = &rule; memset (&rule, 0, sizeof (struct TZRule)); rule.major = 0x02; rule.minor = 0x01; rule.reserved = 0x003e; rule.flags = flags; period = [self _mostRecentPeriodWithName: @"STANDARD"]; rule.wYear = [[period startDate] yearOfCommonEra]; lBias = -[period secondsOffsetFromGMT] / 60; rule.lBias = (uint32_t) lBias; [period _fillTZDate: &rule.stStandardDate]; period = [self _mostRecentPeriodWithName: @"DAYLIGHT"]; if (!period) rule.stStandardDate.wMonth = 0; dlBias = -([period secondsOffsetFromGMT] / 60) - lBias; rule.lDaylightBias = (uint32_t) (dlBias); [period _fillTZDate: &rule.stDaylightDate]; return set_TimeZoneDefinition (memCtx, &definition); } @end SOGo-2.1.1b/OpenChange/MAPIStoreFallbackContext.m0000644000000000000000000000705612247657026020122 0ustar rootroot/* MAPIStoreFallbackContext.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc. * * 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 3, 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 #import "MAPIStoreUserContext.h" #import "NSString+MAPIStore.h" #import "SOGoMAPIDBFolder.h" #import "MAPIStoreFallbackContext.h" #undef DEBUG #include #include @implementation MAPIStoreFallbackContext + (NSString *) MAPIModuleName { return @"fallback"; } + (enum mapistore_context_role) MAPIContextRole { return MAPISTORE_MAIL_ROLE; } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName withTDBIndexing: (struct tdb_wrap *) indexingTdb inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *firstContext = NULL, *context; SOGoMAPIDBFolder *root; NSArray *names; NSUInteger count, max; NSString *baseURL, *url, *name; MAPIStoreUserContext *userContext; baseURL = [NSString stringWithFormat: @"sogo://%@@fallback/", userName]; context = talloc_zero (memCtx, struct mapistore_contexts_list); context->url = [baseURL asUnicodeInMemCtx: context]; context->name = "Fallback"; context->main_folder = true; context->role = MAPISTORE_FALLBACK_ROLE; context->tag = "tag"; DLIST_ADD_END (firstContext, context, void); /* Maybe emsmdbp_provisioning should be fixed in order to only take the uri returned above to avoid deleting its entries... */ root = [SOGoMAPIDBFolder objectWithName: [self MAPIModuleName] inContainer: nil]; [root setOwner: userName]; userContext = [MAPIStoreUserContext userContextWithUsername: userName andTDBIndexing: indexingTdb]; [userContext ensureFolderTableExists]; [root setTableUrl: [userContext folderTableURL]]; names = [root toManyRelationshipKeys]; max = [names count]; for (count = 0; count < max; count++) { name = [names objectAtIndex: count]; url = [NSString stringWithFormat: @"%@%@/", baseURL, name]; context = talloc_zero (memCtx, struct mapistore_contexts_list); context->url = [url asUnicodeInMemCtx: context]; context->name = [name asUnicodeInMemCtx: context]; context->main_folder = false; context->role = MAPISTORE_FALLBACK_ROLE; context->tag = "tag"; DLIST_ADD_END (firstContext, context, void); } return firstContext; } + (NSString *) createRootSecondaryFolderWithFID: (uint64_t) fid andName: (NSString *) folderName forUser: (NSString *) userName { return [NSString stringWithFormat: @"sogo://%@@fallback/0x%.16"PRIx64"/", userName, (unsigned long long) fid]; } @end SOGo-2.1.1b/OpenChange/SOGoMAPIObject.h0000644000000000000000000000252112247657026015762 0ustar rootroot/* SOGoMAPIObject.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 SOGOMAPIOBJECT_H #define SOGOMAPIOBJECT_H #import @class NSMutableDictionary; @interface SOGoMAPIObject : SOGoObject { BOOL isNew; NSMutableDictionary *properties; NSCalendarDate *creationDate; NSCalendarDate *lastModified; } - (void) setIsNew: (BOOL) newIsNew; - (BOOL) isNew; - (void) adjustLastModified; - (NSMutableDictionary *) properties; - (NSCalendarDate *) creationDate; - (NSCalendarDate *) lastModified; @end #endif /* SOGOMAPIOBJECT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreContactsMessage.m0000644000000000000000000010640412247657026020136 0ustar rootroot/* MAPIStoreContactsMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * Author: Wolfgang Sourdeau * Ludovic Marcotte * * 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 3, 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 #import #import #import #import #import #import #import #import #import #import #import "MAPIStoreAttachment.h" #import "MAPIStoreContactsAttachment.h" #import "MAPIStoreContactsFolder.h" #import "MAPIStorePropertySelectors.h" #import "MAPIStoreTypes.h" #import "NSArray+MAPIStore.h" #import "NSDate+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreContactsMessage.h" #undef DEBUG #include #include #include #include #include @implementation SOGoContactGCSEntry (MAPIStoreExtension) - (Class) mapistoreMessageClass { return [MAPIStoreContactsMessage class]; } @end @implementation MAPIStoreContactsMessage - (id) init { if ((self = [super init])) { fetchedAttachments = NO; } return self; } // TODO: this should be combined with the version found // in UIxContactEditor.m - (CardElement *) _elementWithTag: (NSString *) tag ofType: (NSString *) type forCard: (NGVCard *) card { NSArray *elements; CardElement *element; elements = [card childrenWithTag: tag andAttribute: @"type" havingValue: type]; if ([elements count] > 0) element = [elements objectAtIndex: 0]; else { element = [CardElement new]; [element autorelease]; [element setTag: tag]; [element addType: type]; [card addChild: element]; } return element; } - (int) getPidTagIconIndex: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ *data = MAPILongValue (memCtx, 0x00000200); return MAPISTORE_SUCCESS; } - (int) getPidTagAlternateRecipientAllowed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (int) getPidTagMessageFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, MSGFLAG_READ); return MAPISTORE_SUCCESS; } - (int) getPidTagDeleteAfterSubmit: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "IPM.Contact"); return MAPISTORE_SUCCESS; } // - (int) getPidTagOfflineAddressBookName: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // *data = talloc_strdup (memCtx, "PR_OAB_NAME_UNICODE"); // return MAPISTORE_SUCCESS; // } // - (int) getPidTagOfflineAddressBookLanguageId: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // /* see http://msdn.microsoft.com/en-us/goglobal/bb895996.asxp */ // /* English US */ // *data = MAPILongValue (memCtx, 0x0409); // return MAPISTORE_SUCCESS; // } - (int) getPidTagTitle: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[sogoObject vCard] title]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagCompanyName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { CardElement *org; org = [[sogoObject vCard] org]; *data = [[org flattenedValueAtIndex: 0 forKey: @""] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagDepartmentName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { CardElement *org; org = [[sogoObject vCard] org]; *data = [[org flattenedValueAtIndex: 1 forKey: @""] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagSendInternetEncoding: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00065001); return MAPISTORE_SUCCESS; } - (int) getPidTagNormalizedSubject: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagDisplayName: data inMemCtx: memCtx]; } - (int) getPidLidFileUnder: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *surName, *givenName, *middleName; NSMutableString *fileUnder; CardElement *n; n = [[sogoObject vCard] n]; surName = [n flattenedValueAtIndex: 0 forKey: @""]; fileUnder = [surName mutableCopy]; [fileUnder autorelease]; [fileUnder appendString: @","]; givenName = [n flattenedValueAtIndex: 1 forKey: @""]; if ([givenName length] > 0) [fileUnder appendFormat: @" %@", givenName]; middleName = [n flattenedValueAtIndex: 2 forKey: @""]; if ([middleName length] > 0) [fileUnder appendFormat: @" %@", middleName]; *data = [fileUnder asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidFileUnderId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00008017); /* what ol2003 sets */ return MAPISTORE_SUCCESS; } - (int) getPidLidEmail1DisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NGVCard *vCard; NSString *fn, *email; vCard = [sogoObject vCard]; fn = [vCard fn]; email = [vCard preferredEMail]; *data = [[NSString stringWithFormat: @"%@ (%@)", fn, email] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidEmail1OriginalDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidEmail1EmailAddress: data inMemCtx: memCtx]; } - (int) getPidLidEmail1EmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[sogoObject vCard] preferredEMail]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAccount: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidEmail1EmailAddress: data inMemCtx: memCtx]; } - (int) getPidTagContactEmailAddresses: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[sogoObject vCard] preferredEMail]; if (!stringValue) stringValue = @""; *data = [[NSArray arrayWithObject: stringValue] asMVUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagEmsAbTargetAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[sogoObject vCard] preferredEMail]; *data = [[NSString stringWithFormat: @"SMTP:%@", stringValue] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagSearchKey: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[sogoObject vCard] preferredEMail]; *data = [[stringValue dataUsingEncoding: NSASCIIStringEncoding] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagMailPermission: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (int) getPidLidEmail2EmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSMutableArray *emails; NSString *email, *stringValue; NGVCard *card; NSUInteger count, max; emails = [NSMutableArray array]; stringValue = nil; card = [sogoObject vCard]; [emails addObjectsFromArray: [card childrenWithTag: @"email"]]; [emails removeObjectsInArray: [card childrenWithTag: @"email" andAttribute: @"type" havingValue: @"pref"]]; max = [emails count]; for (count = 0; !stringValue && count < max; count++) { email = [[emails objectAtIndex: count] flattenedValuesForKey: @""]; if ([email caseInsensitiveCompare: [card preferredEMail]] != NSOrderedSame) stringValue = email; } if (!stringValue) stringValue = @""; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidEmail2OriginalDisplayName: (void **) data // Other email inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidEmail2EmailAddress: data inMemCtx: memCtx]; } - (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSString *stringValue; stringValue = [[sogoObject vCard] note]; if ([stringValue length] > 0) *data = [stringValue asUnicodeInMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) _getElement: (NSString *) elementTag ofType: (NSString *) aType excluding: (NSString *) aTypeToExclude atPos: (NSUInteger) pos inData: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSArray *elements; CardElement *ce; NSUInteger count, max; NGVCard *vCard; NSString *stringValue; stringValue = nil; vCard = [sogoObject vCard]; elements = [[vCard childrenWithTag: elementTag] cardElementsWithAttribute: @"type" havingValue: aType]; max = [elements count]; for (count = 0; !stringValue && count < max; count++) { ce = [elements objectAtIndex: count]; if (!aTypeToExclude || ![ce hasAttribute: @"type" havingValue: aTypeToExclude]) stringValue = [ce flattenedValueAtIndex: pos forKey: @""]; } if (!stringValue) stringValue = @""; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagBusinessTelephoneNumber: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"work" excluding: @"fax" atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagHomeTelephoneNumber: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"home" excluding: @"fax" atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagMobileTelephoneNumber: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"cell" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagPagerTelephoneNumber: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"pager" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagPrimaryTelephoneNumber: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"pref" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagBusinessFaxNumber: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"fax" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagBusinessHomePage: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"url" ofType: @"work" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagPersonalHomePage: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"url" ofType: @"home" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidLidEmail1AddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPidLidEmail2AddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPidLidEmail3AddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPidLidInstantMessagingAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-aim"] flattenedValuesForKey: @""]; if (!stringValue) stringValue = @""; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidPostalAddressId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSArray *elements; CardElement *element; uint32_t longValue = 0; NGVCard *vCard; vCard = [sogoObject vCard]; elements = [[vCard childrenWithTag: @"adr"] cardElementsWithAttribute: @"type" havingValue: @"pref"]; if ([elements count] > 0) { element = [elements objectAtIndex: 0]; if ([element hasAttribute: @"type" havingValue: @"home"]) longValue = 1; // The Home Address is the mailing address. else if ([element hasAttribute: @"type" havingValue: @"work"]) longValue = 2; // The Work Address is the mailing address. } *data = MAPILongValue (memCtx, longValue); return MAPISTORE_SUCCESS; } // // getters when no address is selected as the Mailing Address // - (int) getPidTagPostalAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"label" ofType: @"pref" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagPostOfficeBox: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagStreetAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 2 inData: data inMemCtx: memCtx]; } - (int) getPidTagLocality: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 3 inData: data inMemCtx: memCtx]; } - (int) getPidTagStateOrProvince: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 4 inData: data inMemCtx: memCtx]; } - (int) getPidTagPostalCode: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 5 inData: data inMemCtx: memCtx]; } - (int) getPidTagCountry: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 6 inData: data inMemCtx: memCtx]; } // // home address getters // - (int) getPidLidHomeAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"label" ofType: @"home" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagHomeAddressPostOfficeBox: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidTagHomeAddressStreet: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 2 inData: data inMemCtx: memCtx]; } - (int) getPidTagHomeAddressCity: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 3 inData: data inMemCtx: memCtx]; } - (int) getPidTagHomeAddressStateOrProvince: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 4 inData: data inMemCtx: memCtx]; } - (int) getPidTagHomeAddressPostalCode: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 5 inData: data inMemCtx: memCtx]; } - (int) getPidTagHomeAddressCountry: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 6 inData: data inMemCtx: memCtx]; } // // Work addresss // - (int) getPidLidWorkAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"label" ofType: @"work" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressPostOfficeBox: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressStreet: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 2 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressCity: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 3 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressState: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 4 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressPostalCode: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 5 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressCountry: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 6 inData: data inMemCtx: memCtx]; } // // // - (int) getPidTagNickname: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[sogoObject vCard] nickname]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagBirthday: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSString *stringValue; int rc = MAPISTORE_SUCCESS; stringValue = [[sogoObject vCard] bday]; if (stringValue) { dateValue = [NSCalendarDate dateWithString: stringValue calendarFormat: @"%Y-%m-%d"]; //dateValue = [dateValue addYear: 0 month: 0 day: 1 hour: 0 minute: 0 second: 0]; *data = [dateValue asFileTimeInMemCtx: memCtx]; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } // // Decomposed fullname getters // - (int) getPidTagSurname: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] flattenedValueAtIndex: 0 forKey: @""]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagGivenName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] flattenedValueAtIndex: 1 forKey: @""]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagMiddleName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] flattenedValueAtIndex: 2 forKey: @""]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagDisplayNamePrefix: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] flattenedValueAtIndex: 3 forKey: @""]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagGeneration: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] flattenedValueAtIndex: 4 forKey: @""]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagSensitivity: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } /* attachments (photos) */ - (void) _fetchAttachmentParts { NGVCardPhoto *photo; MAPIStoreContactsAttachment *attachment; NSString *encoding; photo = (NGVCardPhoto *) [[sogoObject vCard] firstChildWithTag: @"photo"]; if (photo) { encoding = [[photo value: 0 ofAttribute: @"encoding"] uppercaseString]; if ([encoding isEqualToString: @"B"] || [encoding isEqualToString: @"BASE64"]) { attachment = [MAPIStoreContactsAttachment mapiStoreObjectInContainer: self]; [attachment setAID: 0]; [attachment setPhoto: photo]; [attachmentParts setObject: attachment forKey: @"photo"]; } } fetchedAttachments = YES; } - (int) getPidLidHasPicture: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!fetchedAttachments) [self _fetchAttachmentParts]; *data = MAPIBoolValue (memCtx, ([attachmentParts count] > 0)); return MAPISTORE_SUCCESS; } - (NSArray *) attachmentKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { if (!fetchedAttachments) [self _fetchAttachmentParts]; return [super attachmentKeysMatchingQualifier: qualifier andSortOrderings: sortOrderings]; } - (id) lookupAttachment: (NSString *) childKey { if (!fetchedAttachments) [self _fetchAttachmentParts]; return [attachmentParts objectForKey: childKey]; } - (void) _updatePhotoInVCard: (NGVCard *) card fromProperties: (NSDictionary *) attachmentProps { NSString *photoExt, *photoType, *content; CardElement *photo; if ([[attachmentProps objectForKey: MAPIPropertyKey (PR_ATTACHMENT_CONTACTPHOTO)] boolValue]) { photoExt = [[attachmentProps objectForKey: MAPIPropertyKey (PR_ATTACH_EXTENSION_UNICODE)] uppercaseString]; if ([photoExt isEqualToString: @".JPG"]) photoType = @"JPEG"; else if ([photoExt isEqualToString: @".PNG"]) photoType = @"PNG"; else if ([photoExt isEqualToString: @".BMP"]) photoType = @"BMP"; else if ([photoExt isEqualToString: @".GIF"]) photoType = @"GIF"; else photoType = nil; content = [[attachmentProps objectForKey: MAPIPropertyKey (PR_ATTACH_DATA_BIN)] stringByEncodingBase64]; if (photoType && content) { photo = [card uniqueChildWithTag: @"photo"]; [photo setValue: 0 ofAttribute: @"type" to: photoType]; [photo setValue: 0 ofAttribute: @"encoding" to: @"b"]; [photo setSingleValue: [content stringByReplacingString: @"\n" withString: @""] atIndex: 0 forKey: @""]; } } } - (BOOL) subscriberCanReadMessage { return [[self activeUserRoles] containsObject: SOGoRole_ObjectViewer]; } - (BOOL) subscriberCanModifyMessage { NSArray *roles; roles = [self activeUserRoles]; return ((isNew && [roles containsObject: SOGoRole_ObjectCreator]) || (!isNew && [roles containsObject: SOGoRole_ObjectEditor])); } // // // - (void) save:(TALLOC_CTX *) memCtx { NSArray *elements, *units; CardElement *element; NGVCard *newCard; MAPIStoreAttachment *attachment; int postalAddressId; id value; [self logWithFormat: @"setMAPIProperties: %@", properties]; newCard = [sogoObject vCard]; [newCard setTag: @"vcard"]; [newCard setVersion: @"3.0"]; [newCard setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"]; [newCard setProfile: @"vCard"]; // Decomposed fullname [newCard setNWithFamily: [properties objectForKey: MAPIPropertyKey(PR_SURNAME_UNICODE)] given: [properties objectForKey: MAPIPropertyKey(PR_GIVEN_NAME_UNICODE)] additional: [properties objectForKey: MAPIPropertyKey(PR_MIDDLE_NAME_UNICODE)] prefixes: [properties objectForKey: MAPIPropertyKey(PR_DISPLAY_NAME_PREFIX_UNICODE)] suffixes: [properties objectForKey: MAPIPropertyKey(PR_GENERATION_UNICODE)]]; // // display name // value = [properties objectForKey: MAPIPropertyKey(PR_DISPLAY_NAME_UNICODE)]; if (value) [newCard setFn: value]; // // email addresses handling // elements = [newCard childrenWithTag: @"email"]; value = [properties objectForKey: MAPIPropertyKey(PidLidEmail1EmailAddress)]; if (value) { if ([elements count] > 0) [[elements objectAtIndex: 0] setSingleValue: value forKey: @""]; else [newCard addEmail: value types: [NSArray arrayWithObject: @"pref"]]; } value = [properties objectForKey: MAPIPropertyKey (PidLidEmail2EmailAddress)]; if (value) { if ([elements count] > 1) [[elements objectAtIndex: 1] setSingleValue: value forKey: @""]; else [newCard addEmail: value types: nil]; } value = [properties objectForKey: MAPIPropertyKey (PidLidEmail3EmailAddress)]; if (value) { if ([elements count] > 2) [[elements objectAtIndex: 2] setSingleValue: value forKey: @""]; else [newCard addEmail: value types: nil]; } // // work postal addresses handling // // Possible values for PidLidPostalAddressId are: // // 0x00000000 - No address is selected as the Mailing Address. // 0x00000001 - The Home Address is the Mailing Address. // 0x00000002 - The Work Address is the Mailing Address // 0x00000003 - The Other Address is the Mailing Address. // // postalAddressId = [[properties objectForKey: MAPIPropertyKey (PidLidPostalAddressId)] intValue]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddress)]; if ([value length]) { elements = [newCard childrenWithTag: @"label" andAttribute: @"type" havingValue: @"work"]; if ([elements count] > 0) element = [elements objectAtIndex: 0]; else { element = [CardElement elementWithTag: @"label"]; [element addAttribute: @"type" value: @"work"]; [newCard addChild: element]; } if (postalAddressId == 2) { [element removeValue: @"pref" fromAttribute: @"type"]; [element addAttribute: @"type" value: @"pref"]; } [element setSingleValue: value forKey: @""]; } elements = [newCard childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"work"]; if ([elements count] > 0) element = [elements objectAtIndex: 0]; else { element = [CardElement elementWithTag: @"adr"]; [element addAttribute: @"type" value: @"work"]; [newCard addChild: element]; } if (postalAddressId == 2) [element addAttribute: @"type" value: @"pref"]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressPostOfficeBox)]; if (value) [element setSingleValue: value atIndex: 0 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressStreet)]; if (value) [element setSingleValue: value atIndex: 2 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressCity)]; if (value) [element setSingleValue: value atIndex: 3 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressState)]; if (value) [element setSingleValue: value atIndex: 4 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressPostalCode)]; if (value) [element setSingleValue: value atIndex: 5 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressCountry)]; if (value) [element setSingleValue: value atIndex: 6 forKey: @""]; // // home postal addresses handling // value = [properties objectForKey: MAPIPropertyKey(PidLidHomeAddress)]; if ([value length]) { elements = [newCard childrenWithTag: @"label" andAttribute: @"type" havingValue: @"home"]; if ([elements count] > 0) element = [elements objectAtIndex: 0]; else { element = [CardElement elementWithTag: @"label"]; [element addAttribute: @"type" value: @"home"]; [newCard addChild: element]; } if (postalAddressId == 1) { [element removeValue: @"pref" fromAttribute: @"type"]; [element addAttribute: @"type" value: @"pref"]; } [element setSingleValue: value forKey: @""]; } elements = [newCard childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"home"]; if ([elements count] > 0) element = [elements objectAtIndex: 0]; else { element = [CardElement elementWithTag: @"adr"]; [element addAttribute: @"type" value: @"home"]; [newCard addChild: element]; } if (postalAddressId == 1) [element addAttribute: @"type" value: @"pref"]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_ADDRESS_POST_OFFICE_BOX_UNICODE)]; if (value) [element setSingleValue: value atIndex: 0 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey( PR_HOME_ADDRESS_STREET_UNICODE)]; if (value) [element setSingleValue: value atIndex: 2 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_ADDRESS_CITY_UNICODE)]; if (value) [element setSingleValue: value atIndex: 3 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_ADDRESS_STATE_OR_PROVINCE_UNICODE)]; if (value) [element setSingleValue: value atIndex: 4 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_ADDRESS_POSTAL_CODE_UNICODE)]; if (value) [element setSingleValue: value atIndex: 5 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_ADDRESS_COUNTRY_UNICODE)]; if (value) [element setSingleValue: value atIndex: 6 forKey: @""]; // // telephone numbers: work, home, fax, pager and mobile // element = [self _elementWithTag: @"tel" ofType: @"work" forCard: newCard]; value = [properties objectForKey: MAPIPropertyKey(PR_OFFICE_TELEPHONE_NUMBER_UNICODE)]; if (value) [element setSingleValue: value forKey: @""]; element = [self _elementWithTag: @"tel" ofType: @"home" forCard: newCard]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_TELEPHONE_NUMBER_UNICODE)]; if (value) [element setSingleValue: value forKey: @""]; element = [self _elementWithTag: @"tel" ofType: @"fax" forCard: newCard]; value = [properties objectForKey: MAPIPropertyKey(PR_BUSINESS_FAX_NUMBER_UNICODE)]; if (value) [element setSingleValue: value forKey: @""]; element = [self _elementWithTag: @"tel" ofType: @"pager" forCard: newCard]; value = [properties objectForKey: MAPIPropertyKey(PR_PAGER_TELEPHONE_NUMBER_UNICODE)]; if (value) [element setSingleValue: value forKey: @""]; element = [self _elementWithTag: @"tel" ofType: @"cell" forCard: newCard]; value = [properties objectForKey: MAPIPropertyKey(PR_MOBILE_TELEPHONE_NUMBER_UNICODE)]; if (value) [element setSingleValue: value forKey: @""]; // // job title, nickname, company name, deparment, work url, im address/screen name and birthday // value = [properties objectForKey: MAPIPropertyKey(PR_TITLE_UNICODE)]; if (value) [newCard setTitle: value]; value = [properties objectForKey: MAPIPropertyKey(PR_NICKNAME_UNICODE)]; if (value) [newCard setNickname: value]; value = [properties objectForKey: MAPIPropertyKey(PR_DEPARTMENT_NAME_UNICODE)]; if (value) units = [NSArray arrayWithObject: value]; else units = nil; value = [properties objectForKey: MAPIPropertyKey(PR_COMPANY_NAME_UNICODE)]; if (value) [newCard setOrg: value units: units]; value = [properties objectForKey: MAPIPropertyKey(PR_BUSINESS_HOME_PAGE_UNICODE)]; if (value) { [[self _elementWithTag: @"url" ofType: @"work" forCard: newCard] setSingleValue: value forKey: @""]; } value = [properties objectForKey: MAPIPropertyKey(PidLidInstantMessagingAddress)]; if (value) { [[newCard uniqueChildWithTag: @"x-aim"] setSingleValue: value forKey: @""]; } value = [properties objectForKey: MAPIPropertyKey(PR_BIRTHDAY)]; if (value) { [newCard setBday: [value descriptionWithCalendarFormat: @"%Y-%m-%d"]]; } /* photo */ if ([attachmentParts count] > 0) { attachment = [[attachmentParts allValues] objectAtIndex: 0]; [self _updatePhotoInVCard: newCard fromProperties: [attachment properties]]; } /* Note */ value = [properties objectForKey: MAPIPropertyKey (PR_BODY_UNICODE)]; if (!value) { value = [properties objectForKey: MAPIPropertyKey (PR_HTML)]; if (value) { value = [[NSString alloc] initWithData: value encoding: NSUTF8StringEncoding]; [value autorelease]; value = [value htmlToText]; } } if (value) [newCard setNote: value]; // // we save the new/modified card // [sogoObject saveContentString: [newCard versitString]]; [self updateVersions]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreContactsFolder.m0000644000000000000000000000700612247657026017763 0ustar rootroot/* MAPIStoreContactsFolder.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import "MAPIApplication.h" #import "MAPIStoreContactsContext.h" #import "MAPIStoreContactsMessage.h" #import "MAPIStoreContactsMessageTable.h" #import "NSString+MAPIStore.h" #import "MAPIStoreContactsFolder.h" #include #include #include @implementation MAPIStoreContactsFolder - (MAPIStoreMessageTable *) messageTable { [self synchroniseCache]; return [MAPIStoreContactsMessageTable tableForContainer: self]; } - (NSString *) component { return @"vcard"; } - (MAPIStoreMessage *) createMessage { MAPIStoreMessage *newMessage; SOGoContactGCSEntry *newEntry; NSString *name; name = [NSString stringWithFormat: @"%@.vcf", [SOGoObject globallyUniqueObjectId]]; newEntry = [SOGoContactGCSEntry objectWithName: name inContainer: sogoObject]; [newEntry setIsNew: YES]; newMessage = [MAPIStoreContactsMessage mapiStoreObjectWithSOGoObject: newEntry inContainer: self]; return newMessage; } - (NSArray *) rolesForExchangeRights: (uint32_t) rights { NSMutableArray *roles; roles = [NSMutableArray arrayWithCapacity: 6]; if (rights & RightsCreateItems) [roles addObject: SOGoRole_ObjectCreator]; if (rights & RightsDeleteAll) [roles addObject: SOGoRole_ObjectEraser]; if (rights & RightsEditAll) [roles addObject: SOGoRole_ObjectEditor]; if (rights & RightsReadItems) [roles addObject: SOGoRole_ObjectViewer]; return roles; } - (uint32_t) exchangeRightsForRoles: (NSArray *) roles { uint32_t rights = 0; if ([roles containsObject: SOGoRole_ObjectCreator]) rights |= RightsCreateItems; if ([roles containsObject: SOGoRole_ObjectEraser]) rights |= RightsDeleteAll; if ([roles containsObject: SOGoRole_ObjectEditor]) rights |= RightsEditAll; if ([roles containsObject: SOGoRole_ObjectViewer]) rights |= RightsReadItems; if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ return rights; } - (BOOL) subscriberCanModifyMessages { return [[self activeUserRoles] containsObject: SOGoRole_ObjectEditor]; } - (BOOL) subscriberCanReadMessages { return [[self activeUserRoles] containsObject: SOGoRole_ObjectViewer]; } - (int) getPidTagDefaultPostMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Contact" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } @end SOGo-2.1.1b/OpenChange/MAPIStoreFolderTable.h0000644000000000000000000000204412247657026017224 0ustar rootroot/* MAPIStoreFolderTable.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 MAPISTOREFOLDERTABLE_H #define MAPISTOREFOLDERTABLE_H #import "MAPIStoreTable.h" @interface MAPIStoreFolderTable : MAPIStoreTable @end #endif /* MAPISTOREFOLDERTABLE_H */ SOGo-2.1.1b/OpenChange/iCalEvent+MAPIStore.h0000644000000000000000000000257712247657027017002 0ustar rootroot/* iCalEvent+MAPIStore.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 ICALEVENT_MAPISTORE_H #define ICALEVENT_MAPISTORE_H #include #import @class MAPIStoreUserContext; @class NSDictionary; @class NSString; @class SOGoUser; @interface iCalEvent (MAPIStoreProperties) - (void) updateFromMAPIProperties: (NSDictionary *) properties inUserContext: (MAPIStoreUserContext *) userContext withActiveUser: (SOGoUser *) activeUser inMemCtx: (TALLOC_CTX *) memCtx; @end #endif /* ICALEVENT_MAPISTORE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreTasksFolder.h0000644000000000000000000000205512247657026017264 0ustar rootroot/* MAPIStoreTasksFolder.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORETASKSFOLDER_H #define MAPISTORETASKSFOLDER_H #import "MAPIStoreGCSFolder.h" @interface MAPIStoreTasksFolder : MAPIStoreGCSFolder @end #endif /* MAPISTORETASKSFOLDER_H */ SOGo-2.1.1b/OpenChange/MAPIStoreSOGo.m0000644000000000000000000012611412247657026015662 0ustar rootroot/* MAPIStoreSOGo.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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. */ /* OpenChange SOGo storage backend */ #import #import #import #import #import #import #import #import #import #import #import #import "MAPIApplication.h" #import "MAPIStoreAttachment.h" #import "MAPIStoreAttachmentTable.h" #import "MAPIStoreContext.h" #import "MAPIStoreEmbeddedMessage.h" #import "MAPIStoreFolder.h" #import "MAPIStoreMessage.h" #import "MAPIStoreMailVolatileMessage.h" #import "MAPIStoreObject.h" #import "MAPIStoreTable.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #include #include static Class MAPIStoreContextK = Nil; static BOOL leakDebugging = NO; static enum mapistore_error sogo_backend_unexpected_error() { NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); abort(); return MAPISTORE_SUCCESS; } static void sogo_backend_atexit (void) { NSAutoreleasePool *pool; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; //NSLog (@"allocated classes:\n%s", GSDebugAllocationList (YES)); [pool release]; GSUnregisterCurrentThread (); } /** \details Initialize sogo mapistore backend \return MAPISTORE_SUCCESS on success */ static enum mapistore_error sogo_backend_init (void) { NSAutoreleasePool *pool; SOGoProductLoader *loader; Class MAPIApplicationK; NSUserDefaults *ud; SoProductRegistry *registry; char *argv[] = { SAMBA_PREFIX "/sbin/samba", NULL }; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; /* Here we work around a bug in GNUstep which decodes XML user defaults using the system encoding rather than honouring the encoding specified in the file. */ putenv ("GNUSTEP_STRING_ENCODING=NSUTF8StringEncoding"); //putenv ("NSZombieEnabled=YES"); [NSProcessInfo initializeWithArguments: argv count: 1 environment: environ]; [SOGoSystemDefaults sharedSystemDefaults]; /* We force the plugin to base its configuration on the SOGo tree. */ ud = [NSUserDefaults standardUserDefaults]; if (!leakDebugging && [ud boolForKey: @"SOGoDebugLeaks"]) { NSLog (@" leak debugging on"); GSDebugAllocationActive (YES); atexit (sogo_backend_atexit); leakDebugging = YES; } registry = [SoProductRegistry sharedProductRegistry]; [registry scanForProductsInDirectory: SOGO_BUNDLES_DIR]; loader = [SOGoProductLoader productLoader]; [loader loadProducts: [NSArray arrayWithObject: BACKEND_BUNDLE_NAME]]; MAPIApplicationK = NSClassFromString (@"MAPIApplication"); if (MAPIApplicationK) [[MAPIApplicationK new] activateApplication]; [[SOGoCache sharedCache] disableRequestsCache]; [[SOGoCache sharedCache] disableLocalCache]; MAPIStoreContextK = NSClassFromString (@"MAPIStoreContext"); [pool release]; return MAPISTORE_SUCCESS; } /** \details Create a connection context to the sogo backend \param mem_ctx pointer to the memory context \param uri pointer to the sogo path \param private_data pointer to the private backend context */ static enum mapistore_error sogo_backend_create_context(TALLOC_CTX *mem_ctx, struct mapistore_connection_info *conn_info, struct tdb_wrap *indexingTdb, const char *uri, void **context_object) { NSAutoreleasePool *pool; MAPIStoreContext *context; int rc; DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) { rc = [MAPIStoreContextK openContext: &context withURI: uri connectionInfo: conn_info andTDBIndexing: indexingTdb]; if (rc == MAPISTORE_SUCCESS) *context_object = [context tallocWrapper: mem_ctx]; } else rc = MAPISTORE_ERROR; [pool release]; GSUnregisterCurrentThread (); return rc; } static enum mapistore_error sogo_backend_create_root_folder (const char *username, enum mapistore_context_role role, uint64_t fid, const char *name, // struct tdb_wrap *indexingTdb, TALLOC_CTX *mem_ctx, char **mapistore_urip) { NSAutoreleasePool *pool; NSString *userName, *folderName; NSString *mapistoreUri; int rc; DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) { userName = [NSString stringWithUTF8String: username]; folderName = [NSString stringWithUTF8String: name]; rc = [MAPIStoreContextK createRootFolder: &mapistoreUri withFID: fid andName: folderName forUser: userName withRole: role]; if (rc == MAPISTORE_SUCCESS) *mapistore_urip = [mapistoreUri asUnicodeInMemCtx: mem_ctx]; } else rc = MAPISTORE_ERROR; [pool release]; GSUnregisterCurrentThread (); return rc; } static enum mapistore_error sogo_backend_list_contexts(const char *username, struct tdb_wrap *indexingTdb, TALLOC_CTX *mem_ctx, struct mapistore_contexts_list **contexts_listp) { NSAutoreleasePool *pool; NSString *userName; int rc; DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) { userName = [NSString stringWithUTF8String: username]; *contexts_listp = [MAPIStoreContextK listAllContextsForUser: userName withTDBIndexing: indexingTdb inMemCtx: mem_ctx]; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERROR; [pool release]; GSUnregisterCurrentThread (); return rc; } // andFID: fid // uint64_t fid, // void **private_data) /** \details return the mapistore path associated to a given message or folder ID \param private_data pointer to the current sogo context \param fmid the folder/message ID to lookup \param type whether it is a folder or message \param path pointer on pointer to the path to return \return MAPISTORE_SUCCESS on success, otherwise MAPISTORE error */ static enum mapistore_error sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, uint64_t fmid, char **path) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreContext *context; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (backend_object) { wrapper = backend_object; context = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [context getPath: path ofFMID: fmid inMemCtx: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, uint64_t fid, void **folder_object) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreContext *context; MAPIStoreFolder *folder; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (backend_object) { wrapper = backend_object; context = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [context getRootFolder: &folder withFID: fid]; if (rc == MAPISTORE_SUCCESS) *folder_object = [folder tallocWrapper: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } /** \details Open a folder from the sogo backend \param private_data pointer to the current sogo context \param parent_fid the parent folder identifier \param fid the identifier of the colder to open \return MAPISTORE_SUCCESS on success, otherwise MAPISTORE_ERROR */ static enum mapistore_error sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, void **childfolder_object) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder, *childFolder; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder openFolder: &childFolder withFID: fid]; if (rc == MAPISTORE_SUCCESS) *childfolder_object = [childFolder tallocWrapper: mem_ctx]; // [context tearDownRequest]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } /** \details Create a folder in the sogo backend \param private_data pointer to the current sogo context \return MAPISTORE_SUCCESS on success, otherwise MAPISTORE_ERROR */ static enum mapistore_error sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, struct SRow *aRow, void **childfolder_object) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder, *childFolder; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder createFolder: &childFolder withRow: aRow andFID: fid]; if (rc == MAPISTORE_SUCCESS) *childfolder_object = [childFolder tallocWrapper: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } /** \details Delete a folder from the sogo backend \param private_data pointer to the current sogo context \param parent_fid the FID for the parent of the folder to delete \param fid the FID for the folder to delete \return MAPISTORE_SUCCESS on success, otherwise MAPISTORE_ERROR */ static enum mapistore_error sogo_folder_delete(void *folder_object) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder deleteFolder]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table_type, uint32_t *child_count) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder getChildCount: child_count ofTableType: table_type]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_open_message(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t mid, bool write_access, void **message_object) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; MAPIStoreMessage *message; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder openMessage: &message withMID: mid forWriting: write_access inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_create_message(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t mid, uint8_t associated, void **message_object) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; MAPIStoreMessage *message; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder createMessage: &message withMID: mid isAssociated: associated]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder deleteMessageWithMID: mid andFlags: flags]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_move_copy_messages(void *folder_object, void *source_folder_object, TALLOC_CTX *mem_ctx, uint32_t mid_count, uint64_t *src_mids, uint64_t *t_mids, struct Binary_r **target_change_keys, uint8_t want_copy) { MAPIStoreFolder *sourceFolder, *targetFolder; NSAutoreleasePool *pool; struct MAPIStoreTallocWrapper *wrapper; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; targetFolder = wrapper->instance; wrapper = source_folder_object; sourceFolder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [targetFolder moveCopyMessagesWithMIDs: src_mids andCount: mid_count fromFolder: sourceFolder withMIDs: t_mids andChangeKeys: target_change_keys wantCopy: want_copy inMemCtx: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_move_folder(void *folder_object, void *target_folder_object, TALLOC_CTX *mem_ctx, const char *new_folder_name) { NSAutoreleasePool *pool; MAPIStoreFolder *moveFolder, *targetFolder; NSString *newFolderName; struct MAPIStoreTallocWrapper *wrapper; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; moveFolder = wrapper->instance; wrapper = target_folder_object; if (wrapper) targetFolder = wrapper->instance; else targetFolder = nil; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; if (new_folder_name) newFolderName = [NSString stringWithUTF8String: new_folder_name]; else newFolderName = nil; rc = [moveFolder moveCopyToFolder: targetFolder withNewName: newFolderName isMove: YES isRecursive: YES inMemCtx: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_CTX *mem_ctx, bool recursive, const char *new_folder_name) { NSAutoreleasePool *pool; MAPIStoreFolder *copyFolder, *targetFolder; NSString *newFolderName; struct MAPIStoreTallocWrapper *wrapper; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; copyFolder = wrapper->instance; wrapper = target_folder_object; targetFolder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; newFolderName = [NSString stringWithUTF8String: new_folder_name]; rc = [copyFolder moveCopyToFolder: targetFolder withNewName: newFolderName isMove: NO isRecursive: recursive inMemCtx: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, enum mapistore_table_type table_type, uint64_t change_num, struct UI8Array_r **fmidsp, uint64_t *cnp) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder getDeletedFMIDs: fmidsp andCN: cnp fromChangeNumber: change_num inTableType: table_type inMemCtx: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, enum mapistore_table_type table_type, uint32_t handle_id, void **table_object, uint32_t *row_count) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder getTable: &table andRowCount: row_count tableType: table_type andHandleId: handle_id]; if (rc == MAPISTORE_SUCCESS) *table_object = [table tallocWrapper: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_modify_permissions(void *folder_object, uint8_t flags, uint16_t pcount, struct PermissionData *permissions) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder modifyPermissions: permissions withCount: pcount andFlags: flags]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_type table_type, const struct UI8Array_r *mids) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (folder_object) { wrapper = folder_object; folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder preloadMessageBodiesWithMIDs: mids ofTableType: table_type]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_message_get_message_data(void *message_object, TALLOC_CTX *mem_ctx, struct mapistore_message **msg_dataP) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (message_object) { wrapper = message_object; message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; [message getMessageData: msg_dataP inMemCtx: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); rc = MAPISTORE_SUCCESS; } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void **attachment_object, uint32_t *aidp) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; MAPIStoreAttachment *attachment; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (message_object) { wrapper = message_object; message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message createAttachment: &attachment inAID: aidp]; if (rc == MAPISTORE_SUCCESS) *attachment_object = [attachment tallocWrapper: mem_ctx]; // [context tearDownRequest]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, uint32_t aid, void **attachment_object) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; MAPIStoreAttachment *attachment; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (message_object) { wrapper = message_object; message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message getAttachment: &attachment withAID: aid]; if (rc == MAPISTORE_SUCCESS) *attachment_object = [attachment tallocWrapper: mem_ctx]; // [context tearDownRequest]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, void **table_object, uint32_t *row_count) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; MAPIStoreAttachmentTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (message_object) { wrapper = message_object; message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message getAttachmentTable: &table andRowCount: row_count]; if (rc == MAPISTORE_SUCCESS) *table_object = [table tallocWrapper: mem_ctx]; // [context tearDownRequest]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_message_modify_recipients (void *message_object, struct SPropTagArray *columns, uint16_t count, struct mapistore_message_recipient *recipients) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (message_object) { wrapper = message_object; message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message modifyRecipientsWithRecipients: recipients andCount: count andColumns: columns]; // [context tearDownRequest]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_message_set_read_flag (void *message_object, uint8_t flag) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (message_object) { wrapper = message_object; message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message setReadFlag: flag]; // [context tearDownRequest]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (message_object) { wrapper = message_object; message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message saveMessage: mem_ctx]; // [context tearDownRequest]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_message_submit (void *message_object, enum SubmitFlags flags) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMailVolatileMessage *message; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (message_object) { wrapper = message_object; message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message submitWithFlags: flags]; // [context tearDownRequest]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_message_attachment_open_embedded_message (void *attachment_object, TALLOC_CTX *mem_ctx, void **message_object, uint64_t *midP, struct mapistore_message **msg) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreAttachment *attachment; MAPIStoreEmbeddedMessage *message; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (attachment_object) { wrapper = attachment_object; attachment = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [attachment openEmbeddedMessage: &message withMID: midP withMAPIStoreMsg: msg inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_message_attachment_create_embedded_message (void *attachment_object, TALLOC_CTX *mem_ctx, void **message_object, struct mapistore_message **msg) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreAttachment *attachment; MAPIStoreEmbeddedMessage *message; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (attachment_object) { wrapper = attachment_object; attachment = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [attachment createEmbeddedMessage: &message withMAPIStoreMsg: msg inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_table_get_available_properties(void *table_object, TALLOC_CTX *mem_ctx, struct SPropTagArray **propertiesP) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (table_object) { wrapper = table_object; table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [table getAvailableProperties: propertiesP inMemCtx: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *properties) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (table_object) { wrapper = table_object; table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [table setColumns: properties withCount: count]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restrictions, uint8_t *table_status) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (table_object) { wrapper = table_object; table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; [table setRestrictions: restrictions]; //[table cleanupCaches]; rc = MAPISTORE_SUCCESS; *table_status = TBLSTAT_COMPLETE; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, uint8_t *table_status) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (table_object) { wrapper = table_object; table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; [table setSortOrder: sort_order]; [table cleanupCaches]; rc = MAPISTORE_SUCCESS; *table_status = TBLSTAT_COMPLETE; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, enum mapistore_query_type query_type, uint32_t row_id, struct mapistore_property_data **data) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (table_object) { wrapper = table_object; table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [table getRow: data withRowID: row_id andQueryType: query_type inMemCtx: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_table_get_row_count (void *table_object, enum mapistore_query_type query_type, uint32_t *row_countp) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (table_object) { wrapper = table_object; table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [table getRowCount: row_countp withQueryType: query_type]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_table_handle_destructor (void *table_object, uint32_t handle_id) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (table_object) { wrapper = table_object; table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; [table destroyHandle: handle_id]; [pool release]; GSUnregisterCurrentThread (); rc = MAPISTORE_SUCCESS; } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_properties_get_available_properties(void *object, TALLOC_CTX *mem_ctx, struct SPropTagArray **propertiesP) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (object) { wrapper = object; propObject = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [propObject getAvailableProperties: propertiesP inMemCtx: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_properties_get_properties (void *object, TALLOC_CTX *mem_ctx, uint16_t count, enum MAPITAGS *properties, struct mapistore_property_data *data) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (object) { wrapper = object; propObject = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [propObject getProperties: data withTags: properties andCount: count inMemCtx: mem_ctx]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_properties_set_properties (void *object, struct SRow *aRow) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (object) { wrapper = object; propObject = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [propObject addPropertiesFromRow: aRow]; [pool release]; GSUnregisterCurrentThread (); } else { rc = sogo_backend_unexpected_error(); } return rc; } static enum mapistore_error sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, const char *user, const char *folder, const char *message, const char *rootURI, char **uri) { NSAutoreleasePool *pool; NSString *partialURLString, *username, *directory; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); if (uri == NULL) return MAPISTORE_ERR_INVALID_PARAMETER; /* This fixes a crash occurring during the instantiation of the NSAutoreleasePool below. */ GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; // printf("rootURI = %s\n", rootURI); if (rootURI) partialURLString = [NSString stringWithUTF8String: rootURI]; else { /* sogo uri are of type: sogo://[username]:[password]@[folder type]/folder/id */ username = [NSString stringWithUTF8String: (user ? user : "*")]; /* Do proper directory lookup here */ directory = [NSString stringWithUTF8String: (folder ? folder : "*")]; partialURLString = [NSString stringWithFormat: @"sogo://%@:*@%@", username, directory]; } if (![partialURLString hasSuffix: @"/"]) partialURLString = [partialURLString stringByAppendingString: @"/"]; if (message) partialURLString = [partialURLString stringByAppendingFormat: @"%s.eml", message]; // printf("uri = %s\n", [partialURLString UTF8String]); *uri = talloc_strdup (mem_ctx, [partialURLString UTF8String]); [pool release]; GSUnregisterCurrentThread (); return MAPISTORE_SUCCESS; } /** \details Entry point for mapistore SOGO backend \return MAPISTORE_SUCCESS on success, otherwise MAPISTORE error */ int mapistore_init_backend(void) { struct mapistore_backend backend; int ret; static BOOL registered = NO; if (registered) ret = MAPISTORE_SUCCESS; else { registered = YES; backend.backend.name = "SOGo"; backend.backend.description = "mapistore SOGo backend"; backend.backend.namespace = "sogo://"; backend.backend.init = sogo_backend_init; backend.backend.create_context = sogo_backend_create_context; backend.backend.create_root_folder = sogo_backend_create_root_folder; backend.backend.list_contexts = sogo_backend_list_contexts; backend.context.get_path = sogo_context_get_path; backend.context.get_root_folder = sogo_context_get_root_folder; backend.folder.open_folder = sogo_folder_open_folder; backend.folder.create_folder = sogo_folder_create_folder; backend.folder.delete = sogo_folder_delete; backend.folder.open_message = sogo_folder_open_message; backend.folder.create_message = sogo_folder_create_message; backend.folder.delete_message = sogo_folder_delete_message; backend.folder.move_copy_messages = sogo_folder_move_copy_messages; backend.folder.move_folder = sogo_folder_move_folder; backend.folder.copy_folder = sogo_folder_copy_folder; backend.folder.get_deleted_fmids = sogo_folder_get_deleted_fmids; backend.folder.get_child_count = sogo_folder_get_child_count; backend.folder.open_table = sogo_folder_open_table; backend.folder.modify_permissions = sogo_folder_modify_permissions; backend.folder.preload_message_bodies = sogo_folder_preload_message_bodies; backend.message.create_attachment = sogo_message_create_attachment; backend.message.get_attachment_table = sogo_message_get_attachment_table; backend.message.open_attachment = sogo_message_open_attachment; backend.message.open_embedded_message = sogo_message_attachment_open_embedded_message; backend.message.create_embedded_message = sogo_message_attachment_create_embedded_message; backend.message.get_message_data = sogo_message_get_message_data; backend.message.modify_recipients = sogo_message_modify_recipients; backend.message.set_read_flag = sogo_message_set_read_flag; backend.message.save = sogo_message_save; backend.message.submit = sogo_message_submit; backend.table.get_available_properties = sogo_table_get_available_properties; backend.table.set_restrictions = sogo_table_set_restrictions; backend.table.set_sort_order = sogo_table_set_sort_order; backend.table.set_columns = sogo_table_set_columns; backend.table.get_row = sogo_table_get_row; backend.table.get_row_count = sogo_table_get_row_count; backend.table.handle_destructor = sogo_table_handle_destructor; backend.properties.get_available_properties = sogo_properties_get_available_properties; backend.properties.get_properties = sogo_properties_get_properties; backend.properties.set_properties = sogo_properties_set_properties; backend.manager.generate_uri = sogo_manager_generate_uri; /* Register ourselves with the MAPISTORE subsystem */ ret = mapistore_backend_register (&backend); if (ret != MAPISTORE_SUCCESS) DEBUG(0, ("Failed to register the '%s' mapistore backend!\n", backend.backend.name)); } return ret; } SOGo-2.1.1b/OpenChange/MAPIStoreCalendarEmbeddedMessage.m0000644000000000000000000001503612247657026021503 0ustar rootroot/* MAPIStoreCalendarEmbeddedMessage.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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. */ #include #import #import #import #import #import "iCalEvent+MAPIStore.h" #import "MAPIStoreAppointmentWrapper.h" #import "MAPIStoreCalendarAttachment.h" #import "MAPIStoreContext.h" #import "MAPIStoreUserContext.h" #import "MAPIStoreTypes.h" #import "NSObject+MAPIStore.h" #import "MAPIStoreCalendarEmbeddedMessage.h" #include @implementation MAPIStoreCalendarEmbeddedMessage - (id) initInContainer: (id) newContainer { MAPIStoreContext *context; MAPIStoreUserContext *userContext; MAPIStoreAppointmentWrapper *appointmentWrapper; if ((self = [super initInContainer: newContainer])) { context = [self context]; userContext = [self userContext]; appointmentWrapper = [MAPIStoreAppointmentWrapper wrapperWithICalEvent: [newContainer event] andUser: [userContext sogoUser] andSenderEmail: nil inTimeZone: [userContext timeZone] withConnectionInfo: [context connectionInfo]]; [self addProxy: appointmentWrapper]; } return self; } - (NSDate *) creationTime { return [[container event] created]; } - (NSDate *) lastModificationTime { return [[container event] lastModified]; } - (void) getMessageData: (struct mapistore_message **) dataPtr inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_message *msgData; [super getMessageData: &msgData inMemCtx: memCtx]; /* HACK: we know the first (and only) proxy is our appointment wrapper instance, but this might not always be true */ [[proxies objectAtIndex: 0] fillMessageData: msgData inMemCtx: memCtx]; *dataPtr = msgData; } - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "IPM.OLE.CLASS.{00061055-0000-0000-C000-000000000046}"); return MAPISTORE_SUCCESS; } - (int) getPidTagMessageFlags: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, MSGFLAG_UNMODIFIED); return MAPISTORE_SUCCESS; } - (int) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (int) getPidTagResponseRequested: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } /* discarded properties */ - (int) getPidLidAppointmentLastSequence: (void **) inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidLidMeetingWorkspaceUrl: (void **) inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidLidContacts: (void **) inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagSensitivity: (void **) inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidLidPrivate: (void **) inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidNameKeywords: (void **) inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidLidFExceptionalBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (void) save: (TALLOC_CTX *) memCtx { // (gdb) po embeddedMessage->properties // 2442592320 = "2012-07-11 22:30:00 +0000"; // 2448359488 = "2012-07-11 22:30:00 +0000"; // 2442723392 = "2012-07-11 22:30:00 +0000"; // 2442068032 = "2012-07-11 22:30:00 +0000"; // 2441740352 = "2012-07-11 23:00:00 +0000"; // 131083 = 1; 2442330115 = 2; // 235339779 = 9; // 6291520 = "2012-07-11 16:00:00 +0000"; // 2442526784 = "2012-07-11 23:00:00 +0000"; // 2818059 = 0; // 1703967 = "IPM.OLE.CLASS.{00061055-0000-0000-C000-000000000046}"; // 3538947 = 0; // 1071513603 = 28591; 805830720 = "2012-07-10 16:42:00 +0000"; // 2485977346 = <02013000 02001500 45006100 73007400 // 65007200 6e002000 53007400 61006e00 64006100 72006400 20005400 69006d00 // 65000200 02013e00 0000d607 00000000 00000000 00000000 00002c01 00000000 // 0000c4ff ffff0000 0a000000 05000200 00000000 00000000 04000000 01000200 // 00000000 00000201 3e000200 d7070000 00000000 00000000 00000000 2c010000 // 00000000 c4ffffff 00000b00 00000100 02000000 00000000 00000300 00000200 // 02000000 00000000>; 2454257728 = "2012-07-11 16:00:00 +0000"; 2442985475 = // 118330; 1507331 = 1; 805765184 = "2012-07-09 18:32:00 +0000"; 2442657856 = // "2012-07-11 23:00:00 +0000"; 2443051039 = "11.0"; 236912651 = 1; 2485911810 = // <02013000 02001500 45006100 73007400 65007200 6e002000 53007400 61006e00 // 64006100 72006400 20005400 69006d00 65000200 02013e00 0000d607 00000000 // 00000000 00000000 00002c01 00000000 0000c4ff ffff0000 0a000000 05000200 // 00000000 00000000 04000000 01000200 00000000 00000201 3e000200 d7070000 // 00000000 00000000 00000000 2c010000 00000000 c4ffffff 00000b00 00000100 // 02000000 00000000 00000300 00000200 02000000 00000000>; 2441543683 = 30; // 2442068032 = "2012-07-11 22:30:00 +0000"; // 1073348639 = "OpenChange User"; // 806027522 = <2d64f6f5 89a59243 992d29d1 49173b3a>; 6357056 = "2012-07-11 // 16:30:00 +0000"; // */ // // 0x92490040 = 2454257728 // } SOGoUser *activeUser; activeUser = [[self context] activeUser]; [[container event] updateFromMAPIProperties: properties inUserContext: [self userContext] withActiveUser: activeUser inMemCtx: memCtx]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreDBFolderTable.h0000644000000000000000000000206512247657026017435 0ustar rootroot/* MAPIStoreDBFolderTable.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 3, 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 MAPISTOREDBFOLDERTABLE_H #define MAPISTOREDBFOLDERTABLE_H #import "MAPIStoreFolderTable.h" @interface MAPIStoreDBFolderTable : MAPIStoreFolderTable @end #endif /* MAPISTOREDBFOLDERTABLE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreTypes.m0000644000000000000000000002236612247657026016163 0ustar rootroot/* MAPIStoreTypes.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 #import #import #import #import "NSArray+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" #import "MAPIStoreTypes.h" #undef DEBUG #include #include NSTimeZone *utcTZ; uint8_t * MAPIBoolValue (void *memCtx, BOOL value) { uint8_t *boolValue; boolValue = talloc_zero (memCtx, uint8_t); *boolValue = value; return boolValue; } uint32_t * MAPILongValue (void *memCtx, uint32_t value) { uint32_t *longValue; longValue = talloc_zero (memCtx, uint32_t); *longValue = value; return longValue; } uint64_t * MAPILongLongValue (void *memCtx, uint64_t value) { uint64_t *llongValue; llongValue = talloc_zero (memCtx, uint64_t); *llongValue = value; return llongValue; } double * MAPIDoubleValue (void *memCtx, double value) { double *doubleValue; doubleValue = talloc_zero (memCtx, double); *doubleValue = value; return doubleValue; } id NSObjectFromMAPISPropValue (const struct mapi_SPropValue *value) { short int valueType; id result; valueType = (value->ulPropTag & 0xffff); switch (valueType) { case PT_NULL: result = [NSNull null]; break; case PT_SHORT: result = [NSNumber numberWithUnsignedShort: value->value.i]; break; case PT_LONG: case PT_ERROR: result = [NSNumber numberWithUnsignedLong: value->value.l]; break; case PT_I8: result = [NSNumber numberWithUnsignedLongLong: value->value.d]; break; case PT_BOOLEAN: result = [NSNumber numberWithBool: (value->value.b ? YES : NO)]; break; case PT_DOUBLE: result = [NSNumber numberWithDouble: value->value.dbl]; break; case PT_UNICODE: result = [NSString stringWithUTF8String: value->value.lpszW]; break; case PT_STRING8: result = [NSString stringWithUTF8String: value->value.lpszA]; break; case PT_SYSTIME: result = [NSCalendarDate dateFromFileTime: &(value->value.ft)]; break; case PT_BINARY: case PT_SVREID: result = [NSData dataWithShortBinary: &value->value.bin]; break; case PT_CLSID: result = [NSData dataWithGUID: &value->value.lpguid]; break; case PT_MV_LONG: result = [NSArray arrayFromMAPIMVLong: &value->value.MVl]; break; case PT_MV_STRING8: result = [NSArray arrayFromMAPIMVString: &value->value.MVszA]; break; case PT_MV_UNICODE: result = [NSArray arrayFromMAPIMVUnicode: &value->value.MVszW]; break; case PT_MV_CLSID: result = [NSArray arrayFromMAPIMVGuid: &value->value.MVguid]; break; case PT_MV_BINARY: result = [NSArray arrayFromMAPIMVBinary: &value->value.MVbin]; break; default: // #define PT_UNSPECIFIED 0x0 // #define PT_I2 0x2 // #define PT_CURRENCY 0x6 // #define PT_APPTIME 0x7 // #define PT_ERROR 0xa // #define PT_OBJECT 0xd // #define PT_I8 0x14 // #define PT_SRESTRICT 0xFD // #define PT_ACTIONS 0xFE result = [NSNull null]; abort(); NSLog (@"%s: object type not handled: %d (0x%.4x)", __PRETTY_FUNCTION__, valueType, valueType); } return result; } id NSObjectFromSPropValue (const struct SPropValue *value) { short int valueType; id result; valueType = (value->ulPropTag & 0xffff); switch (valueType) { case PT_NULL: result = [NSNull null]; break; case PT_SHORT: result = [NSNumber numberWithShort: value->value.i]; break; case PT_LONG: case PT_ERROR: result = [NSNumber numberWithLong: value->value.l]; break; case PT_I8: result = [NSNumber numberWithUnsignedLongLong: value->value.d]; break; case PT_BOOLEAN: result = [NSNumber numberWithBool: (value->value.b ? YES : NO)]; break; case PT_DOUBLE: result = [NSNumber numberWithDouble: value->value.dbl]; break; case PT_UNICODE: result = (value->value.lpszW ? [NSString stringWithUTF8String: value->value.lpszW] : (id) @""); break; case PT_STRING8: result = (value->value.lpszA ? [NSString stringWithUTF8String: value->value.lpszA] : (id) @""); break; case PT_SYSTIME: result = [NSCalendarDate dateFromFileTime: &(value->value.ft)]; break; case PT_BINARY: case PT_SVREID: // lpProps->value.bin = *((const struct Binary_r *)data); result = [NSData dataWithBinary: (const struct Binary_r *) &(value->value.bin)]; break; case PT_CLSID: result = [NSData dataWithFlatUID: value->value.lpguid]; break; case PT_MV_SHORT: result = [NSArray arrayFromMVShort: &value->value.MVi]; break; case PT_MV_LONG: result = [NSArray arrayFromMVLong: &value->value.MVl]; break; case PT_MV_I8: result = [NSArray arrayFromMVUI8: &value->value.MVui8]; break; case PT_MV_STRING8: result = [NSArray arrayFromMVString: &value->value.MVszA]; break; case PT_MV_UNICODE: result = [NSArray arrayFromMVUnicode: &value->value.MVszW]; break; case PT_MV_CLSID: result = [NSArray arrayFromMVGuid: &value->value.MVguid]; break; case PT_MV_BINARY: result = [NSArray arrayFromMVBinary: &value->value.MVbin]; break; case PT_MV_SYSTIME: result = [NSArray arrayFromMVFileTime: &value->value.MVft]; break; default: // #define PT_UNSPECIFIED 0x0 // #define PT_I2 0x2 // #define PT_CURRENCY 0x6 // #define PT_APPTIME 0x7 // #define PT_ERROR 0xa // #define PT_OBJECT 0xd // #define PT_I8 0x14 // #define PT_SRESTRICT 0xFD // #define PT_ACTIONS 0xFE result = [NSNull null]; abort(); NSLog (@"%s: object type not handled: %d (0x%.4x)", __PRETTY_FUNCTION__, valueType, valueType); } return result; } id NSObjectFromValuePointer (enum MAPITAGS propTag, const void *data) { struct SPropValue sPropValue; id result; if (set_SPropValue_proptag(&sPropValue, propTag, data)) result = NSObjectFromSPropValue (&sPropValue); else result = nil; return result; } static uint64_t _reverseCN (uint64_t cn) { return ((cn & UINT64_C (0x00000000000000ff)) << 56 | (cn & UINT64_C (0x000000000000ff00)) << 40 | (cn & UINT64_C (0x0000000000ff0000)) << 24 | (cn & UINT64_C (0x00000000ff000000)) << 8 | (cn & UINT64_C (0x000000ff00000000)) >> 8 | (cn & UINT64_C (0x0000ff0000000000)) >> 24 | (cn & UINT64_C (0x00ff000000000000)) >> 40 | (cn & UINT64_C (0xff00000000000000)) >> 56); } NSComparisonResult MAPICNCompare (uint64_t cn1, uint64_t cn2, void *unused) { NSComparisonResult result; if (cn1 == cn2) result = NSOrderedSame; else if (_reverseCN (cn1) < _reverseCN (cn2)) result = NSOrderedAscending; else result = NSOrderedDescending; return result; } NSComparisonResult MAPIChangeKeyGUIDCompare (id ck1, id ck2, void *unused) { NSUInteger count; const unsigned char *ptr1, *ptr2; NSComparisonResult result = NSOrderedSame; if ([ck1 length] < 16) { NSLog (@"ck1 has a length < 16"); abort (); } if ([ck2 length] < 16) { NSLog (@"ck2 has a length < 16"); abort (); } ptr1 = [ck1 bytes]; ptr2 = [ck2 bytes]; for (count = 0; result == NSOrderedSame && count < 16; count++) { if (*ptr1 < *ptr2) result = NSOrderedAscending; else if (*ptr1 > *ptr2) result = NSOrderedDescending; else { ptr1++; ptr2++; } } return result; } void MAPIStoreDumpMessageProperties (NSDictionary *properties) { NSNumber *key; NSArray *allKeys; NSUInteger count, max; NSUInteger keyAsInt; id value; allKeys = [properties allKeys]; max = [allKeys count]; NSLog (@"message properties (%d):", max); value = [properties objectForKey: @"recipients"]; if (value) NSLog (@" recipients: %@", value); for (count = 0; count < max; count++) { key = [allKeys objectAtIndex: count]; if ([key isKindOfClass: [NSNumber class]]) { keyAsInt = [key intValue]; value = [properties objectForKey: key]; NSLog (@" 0x%.4x: %@ (%@)", keyAsInt, value, NSStringFromClass ([value class])); } } } SOGo-2.1.1b/OpenChange/MAPIStoreAppointmentWrapper.h0000644000000000000000000001626512247657026020712 0ustar rootroot/* MAPIStoreAppointmentWrapper.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORECALENDARWRAPPER_H #define MAPISTORECALENDARWRAPPER_H #import #import #import "MAPIStoreObjectProxy.h" @class NSTimeZone; @class iCalAlarm; @class iCalCalendar; @class iCalEvent; @class SOGoUser; @interface MAPIStoreAppointmentWrapper : MAPIStoreObjectProxy { struct mapistore_connection_info *connInfo; iCalCalendar *calendar; iCalEvent *firstEvent; iCalEvent *event; NSTimeZone *timeZone; SOGoUser *user; NSString *senderEmail; NSData *globalObjectId; NSData *cleanGlobalObjectId; BOOL alarmSet; iCalAlarm *alarm; BOOL itipSetup; NSString *method; iCalPersonPartStat partstat; } + (id) wrapperWithICalEvent: (iCalEvent *) newEvent andUser: (SOGoUser *) newUser andSenderEmail: (NSString *) newSenderEmail inTimeZone: (NSTimeZone *) newTimeZone withConnectionInfo: (struct mapistore_connection_info *) newConnInfo; - (id) initWithICalEvent: (iCalEvent *) newEvent andUser: (SOGoUser *) newUser andSenderEmail: (NSString *) newSenderEmail inTimeZone: (NSTimeZone *) newTimeZone withConnectionInfo: (struct mapistore_connection_info *) newConnInfo; /* getters */ - (void) fillMessageData: (struct mapistore_message *) dataPtr inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagSenderEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagSenderAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagSenderName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagSenderEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagReceivedByAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagReceivedByEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagReceivedByName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagReceivedByEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagIconIndex: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagOwnerAppointmentId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidMeetingType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagStartDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentSequence: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentStateFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidResponseStatus: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentStartWhole: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidCommonStart: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagEndDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentEndWhole: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidCommonEnd: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentDuration: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentSubType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidBusyStatus: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidIndentedBusyStatus: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagNormalizedSubject: (void **) data // SUMMARY inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidLocation: (void **) data // LOCATION inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagImportance: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidIsRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentRecur: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidGlobalObjectId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidCleanGlobalObjectId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidServerProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidServerProcessingActions: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentReplyTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; /* reminders */ - (int) getPidLidReminderSet: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidReminderDelta: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidReminderTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidReminderSignalTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidReminderOverride: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidReminderType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidReminderPlaySound: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidReminderFileParameter: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; @end #endif /* MAPISTORECALENDARWRAPPER_H */ SOGo-2.1.1b/OpenChange/MAPIStoreDBBaseContext.m0000644000000000000000000000612012247657026017472 0ustar rootroot/* MAPIStoreDBBaseContext.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc. * * 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 3, 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. */ /* A generic parent class for all context that will store their data on the disk in the form of a plist. */ #import #import #import #import #import "MAPIStoreDBFolder.h" #import "MAPIStoreMapping.h" #import "MAPIStoreUserContext.h" #import "SOGoMAPIDBFolder.h" #import "MAPIStoreDBBaseContext.h" #undef DEBUG #include static Class MAPIStoreDBFolderK; @implementation MAPIStoreDBBaseContext + (void) initialize { MAPIStoreDBFolderK = [MAPIStoreDBFolder class]; } + (NSString *) MAPIModuleName { return nil; } - (Class) MAPIStoreFolderClass { return MAPIStoreDBFolderK; } - (void) ensureContextFolder { SOGoMAPIDBFolder *currentFolder; NSArray *parts; NSMutableArray *folders; NSString *folderName; NSUInteger count, max; parts = [[contextUrl path] componentsSeparatedByString: @"/"]; max = [parts count]; folders = [NSMutableArray arrayWithCapacity: max]; /* build the folder chain */ currentFolder = [self rootSOGoFolder]; [folders addObject: currentFolder]; for (count = 1; count < max; count++) { folderName = [parts objectAtIndex: count]; if ([folderName length] > 0) { currentFolder = [SOGoMAPIDBFolder objectWithName: folderName inContainer: currentFolder]; [folders addObject: currentFolder]; } } /* ensure each folder in the chain actually exists, so that it becomes "listable" in further operations */ max = [folders count]; for (count = 0; count < max; count++) { currentFolder = [folders objectAtIndex: count]; [currentFolder reloadIfNeeded]; if ([currentFolder isNew]) [currentFolder save]; } } - (id) rootSOGoFolder { SOGoMAPIDBFolder *folder; [userContext ensureFolderTableExists]; folder = [SOGoMAPIDBFolder objectWithName: [isa MAPIModuleName] inContainer: nil]; [folder setTableUrl: [userContext folderTableURL]]; // [folder reloadIfNeeded]; /* we don't need to set the "path prefix" of the folder since the module name is used as the label for the top folder */ return folder; } @end SOGo-2.1.1b/OpenChange/MAPIStoreMessageTable.m0000644000000000000000000001041012247657026017376 0ustar rootroot/* MAPIStoreMessageTable.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 #import #import "MAPIStoreContext.h" #import "MAPIStoreFolder.h" #import "MAPIStoreMessage.h" #import "MAPIStoreTypes.h" #import "NSData+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreMessageTable.h" @implementation MAPIStoreMessageTable - (void) setSortOrder: (const struct SSortOrderSet *) set { [self logWithFormat: @"unimplemented method: %@", NSStringFromSelector (_cmd)]; } - (NSArray *) childKeys { if (!childKeys) { childKeys = [(MAPIStoreFolder *) container messageKeysMatchingQualifier: nil andSortOrderings: sortOrderings]; [childKeys retain]; } return childKeys; } - (NSArray *) restrictedChildKeys { NSArray *keys; if (!restrictedChildKeys) { if (restrictionState != MAPIRestrictionStateAlwaysTrue) { if (restrictionState == MAPIRestrictionStateNeedsEval) keys = [(MAPIStoreFolder *) container messageKeysMatchingQualifier: restriction andSortOrderings: sortOrderings]; else keys = [NSArray array]; } else keys = [self childKeys]; ASSIGN (restrictedChildKeys, keys); } return restrictedChildKeys; } - (id) lookupChild: (NSString *) childKey { return [(MAPIStoreFolder *) container lookupMessage: childKey]; } - (void) notifyChangesForChild: (MAPIStoreMessage *) child { NSUInteger currentChildRow, newChildRow; NSArray *list; NSString *childName; struct mapistore_table_notification_parameters notif_parameters; struct mapistore_context *mstoreCtx; mstoreCtx = [[(MAPIStoreFolder *) container context] connectionInfo]->mstore_ctx; notif_parameters.table_type = tableType; notif_parameters.handle = handleId; notif_parameters.folder_id = [(MAPIStoreFolder *) container objectId]; notif_parameters.object_id = [child objectId]; notif_parameters.instance_id = 0; /* TODO: always 0 ? */ childName = [child nameInContainer]; list = [self restrictedChildKeys]; currentChildRow = [list indexOfObject: childName]; notif_parameters.row_id = currentChildRow; [self cleanupCaches]; list = [self restrictedChildKeys]; newChildRow = [list indexOfObject: childName]; if (currentChildRow == NSNotFound) { if (newChildRow != NSNotFound) { notif_parameters.row_id = newChildRow; mapistore_push_notification (mstoreCtx, MAPISTORE_TABLE, MAPISTORE_OBJECT_CREATED, ¬if_parameters); } } else { if (newChildRow == NSNotFound) mapistore_push_notification (mstoreCtx, MAPISTORE_TABLE, MAPISTORE_OBJECT_DELETED, ¬if_parameters); else { /* the fact that the row order has changed has no impact here */ notif_parameters.row_id = newChildRow; mapistore_push_notification (mstoreCtx, MAPISTORE_TABLE, MAPISTORE_OBJECT_MODIFIED, ¬if_parameters); } } } @end SOGo-2.1.1b/OpenChange/MAPIStoreObject.h0000644000000000000000000000562712247657026016261 0ustar rootroot/* MAPIStoreObject.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREOBJECT_H #define MAPISTOREOBJECT_H #include #import @class NSDate; @class NSData; @class NSString; @class NSMutableArray; @class NSMutableDictionary; @class MAPIStoreContext; @class MAPIStoreMapping; @class MAPIStoreObjectProxy; @class MAPIStoreUserContext; @class MAPIStoreSOGoObject; @interface MAPIStoreObject : NSObject { const IMP *classGetters; NSMutableArray *parentContainersBag; NSMutableArray *proxies; id container; NSMutableDictionary *properties; } + (id) mapiStoreObjectInContainer: (MAPIStoreObject *) newContainer; - (id) initInContainer: (MAPIStoreObject *) newContainer; - (void) addProxy: (MAPIStoreObjectProxy *) newProxy; - (MAPIStoreObject *) container; - (MAPIStoreContext *) context; - (MAPIStoreUserContext *) userContext; - (MAPIStoreMapping *) mapping; - (NSString *) url; /* properties */ - (void) addProperties: (NSDictionary *) newProperties; - (NSMutableDictionary *) properties; /* ops */ - (int) getProperties: (struct mapistore_property_data *) data withTags: (enum MAPITAGS *) tags andCount: (uint16_t) columnCount inMemCtx: (TALLOC_CTX *) localMemCtx; - (int) addPropertiesFromRow: (struct SRow *) aRow; - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag inMemCtx: (TALLOC_CTX *) localMemCtx; /* helper getters */ - (NSData *) getReplicaKeyFromGlobCnt: (uint64_t) objectCnt; - (int) getReplicaKey: (void **) data fromGlobCnt: (uint64_t) objectCnt inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagCreationTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagLastModificationTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; /* move and copy operations */ - (void) copyPropertiesToObject: (MAPIStoreObject *) newObject inMemCtx: (TALLOC_CTX *) memCtx; /* subclasses */ - (NSString *) nameInContainer; - (NSDate *) creationTime; - (NSDate *) lastModificationTime; @end #endif /* MAPISTOREOBJECT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreFAIMessage.h0000644000000000000000000000204712247657026016750 0ustar rootroot/* MAPIStoreFAIMessage.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREFAIMESSAGE_H #define MAPISTOREFAIMESSAGE_H #import "MAPIStoreDBMessage.h" @interface MAPIStoreFAIMessage : MAPIStoreDBMessage @end #endif /* MAPISTOREFAIMESSAGE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreCalendarContext.m0000644000000000000000000000306412247657026020127 0ustar rootroot/* MAPIStoreCalendarContext.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 "MAPIStoreMapping.h" #import "MAPIStoreCalendarFolder.h" #import "MAPIStoreUserContext.h" #import "MAPIStoreCalendarContext.h" #undef DEBUG #include static Class MAPIStoreCalendarFolderK; @implementation MAPIStoreCalendarContext + (void) initialize { MAPIStoreCalendarFolderK = [MAPIStoreCalendarFolder class]; } + (NSString *) MAPIModuleName { return @"calendar"; } + (enum mapistore_context_role) MAPIContextRole { return MAPISTORE_CALENDAR_ROLE; } - (Class) MAPIStoreFolderClass { return MAPIStoreCalendarFolderK; } + (NSString *) folderNameSuffix { return @"c"; } @end SOGo-2.1.1b/OpenChange/SOGoMAPIDBFolder.m0000644000000000000000000003254412247657026016212 0ustar rootroot/* SOGoMAPIDBFolder.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc. * * 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 3, 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 #import #import #import #import #import #import #import #import #import // #import #import #import #import #import #import "EOQualifier+MAPI.h" #import "GCSSpecialQueries+OpenChange.h" #import "SOGoMAPIDBMessage.h" #import "SOGoMAPIDBFolder.h" #undef DEBUG #include #include #include #include #include #include #include Class SOGoMAPIDBObjectK = Nil; @implementation SOGoMAPIDBFolder + (void) initialize { SOGoMAPIDBObjectK = [SOGoMAPIDBObject class]; } - (id) init { if ((self = [super init])) { pathPrefix = nil; } return self; } - (id) initWithName: (NSString *) name inContainer: (id) newContainer { if ((self = [super initWithName: name inContainer: newContainer])) { objectType = MAPIDBObjectTypeFolder; aclMessage = [SOGoMAPIDBObject objectWithName: @"permissions" inContainer: self]; [aclMessage setObjectType: MAPIDBObjectTypeInternal]; [aclMessage retain]; } return self; } - (void) dealloc { [aclMessage release]; [pathPrefix release]; [super dealloc]; } - (BOOL) isFolderish { return YES; } - (void) setPathPrefix: (NSString *) newPathPrefix { ASSIGN (pathPrefix, newPathPrefix); } - (NSMutableString *) pathForChild: (NSString *) childName { NSMutableString *path; path = [self path]; [path appendFormat: @"/%@", childName]; return path; } - (NSMutableString *) path { NSMutableString *path; path = [super path]; if (pathPrefix) [path insertString: pathPrefix atIndex: 0]; return path; } // - (SOGoMAPIDBMessage *) newMessage // { // NSString *newFilename; // newFilename = [NSString stringWithFormat: @"%@.plist", // [SOGoObject globallyUniqueObjectId]]; // return [SOGoMAPIDBMessage objectWithName: filename inContainer: self]; // } - (NSArray *) childKeysOfType: (MAPIDBObjectType) type includeDeleted: (BOOL) includeDeleted matchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { NSMutableArray *childKeys; NSMutableString *sql// , *qualifierClause ; NSString *childPathPrefix, *childPath, *childKey; NSMutableArray *whereClause; NSArray *records; NSDictionary *record; NSUInteger childPathPrefixLen, count, max; SOGoMAPIDBObject *currentChild; /* query construction */ sql = [NSMutableString stringWithCapacity: 256]; [sql appendFormat: @"SELECT * FROM %@", [self tableName]]; whereClause = [NSMutableArray arrayWithCapacity: 2]; [whereClause addObject: [NSString stringWithFormat: @"c_parent_path = '%@'", [self path]]]; [whereClause addObject: [NSString stringWithFormat: @"c_type = %d", type]]; if (!includeDeleted) [whereClause addObject: @"c_deleted = 0"]; [sql appendFormat: @" WHERE %@", [whereClause componentsJoinedByString: @" AND "]]; childPathPrefix = [NSString stringWithFormat: @"%@/", [self path]]; /* results */ records = [self performSQLQuery: sql]; if (records) { max = [records count]; childKeys = [NSMutableArray arrayWithCapacity: max]; childPathPrefixLen = [childPathPrefix length]; for (count = 0; count < max; count++) { record = [records objectAtIndex: count]; childPath = [record objectForKey: @"c_path"]; childKey = [childPath substringFromIndex: childPathPrefixLen]; if ([childKey rangeOfString: @"/"].location == NSNotFound) { if (qualifier) { currentChild = [SOGoMAPIDBObject objectWithName: childKey inContainer: self]; [currentChild setupFromRecord: record]; if ([qualifier evaluateSOGoMAPIDBObject: currentChild]) [childKeys addObject: childKey]; } else [childKeys addObject: childKey]; } } } else childKeys = nil; return childKeys; } - (NSArray *) toManyRelationshipKeys { return [self childKeysOfType: MAPIDBObjectTypeFolder includeDeleted: NO matchingQualifier: nil andSortOrderings: nil]; } - (NSArray *) toOneRelationshipKeys { return [self childKeysOfType: MAPIDBObjectTypeMessage includeDeleted: NO matchingQualifier: nil andSortOrderings: nil]; } - (void) setNameInContainer: (NSString *) newName { NSMutableString *sql; NSString *oldPath, *newPath, *path, *parentPath; NSMutableArray *queries; NSArray *records; NSDictionary *record; NSUInteger count, max; /* change the paths in children records */ if (nameInContainer) oldPath = [self path]; [super setNameInContainer: newName]; if (nameInContainer) { newPath = [self path]; sql = [NSMutableString stringWithFormat: @"SELECT c_path, c_parent_path FROM %@" @" WHERE c_path LIKE '%@/%%'", [self tableName], oldPath]; records = [self performSQLQuery: sql]; max = [records count]; queries = [NSMutableArray arrayWithCapacity: max + 1]; if (max > 0) { for (count = 0; count < max; count++) { record = [records objectAtIndex: count]; path = [record objectForKey: @"c_path"]; sql = [NSMutableString stringWithFormat: @"UPDATE %@" @" SET c_path = '%@'", [self tableName], [path stringByReplacingPrefix: oldPath withPrefix: newPath]]; parentPath = [record objectForKey: @"c_parent_path"]; if ([parentPath isNotNull]) [sql appendFormat: @", c_parent_path = '%@'", [parentPath stringByReplacingPrefix: oldPath withPrefix: newPath]]; [sql appendFormat: @" WHERE c_path = '%@'", path]; [queries addObject: sql]; } [self performBatchSQLQueries: queries]; } } } - (void) changePathTo: (NSString *) newPath { NSMutableString *sql// , *qualifierClause ; NSString *oldPath, *oldPathAsPrefix, *path, *parentPath; NSMutableArray *queries; NSArray *records; NSDictionary *record; NSUInteger count, max; /* change the paths in children records */ oldPath = [self path]; oldPathAsPrefix = [NSString stringWithFormat: @"%@/", oldPath]; sql = [NSMutableString stringWithFormat: @"SELECT c_path, c_parent_path FROM %@" @" WHERE c_path LIKE '%@%%'", [self tableName], oldPathAsPrefix]; records = [self performSQLQuery: sql]; max = [records count]; queries = [NSMutableArray arrayWithCapacity: max + 1]; if (max > 0) { for (count = 0; count < max; count++) { record = [records objectAtIndex: count]; path = [record objectForKey: @"c_path"]; sql = [NSMutableString stringWithFormat: @"UPDATE %@" @" SET c_path = '%@'", [self tableName], [path stringByReplacingPrefix: oldPath withPrefix: newPath]]; parentPath = [record objectForKey: @"c_parent_path"]; if ([parentPath isNotNull]) [sql appendFormat: @", c_parent_path = '%@'", [parentPath stringByReplacingPrefix: oldPath withPrefix: newPath]]; [sql appendFormat: @" WHERE c_path = '%@'", path]; [queries addObject: sql]; } [self performBatchSQLQueries: queries]; } /* change the path in this folder record */ [super changePathTo: newPath]; } // - (NSArray *) toOneRelationshipKeysMatchingQualifier: (EOQualifier *) qualifier // andSortOrderings: (NSArray *) sortOrderings // { // NSArray *allKeys; // NSMutableArray *keys; // NSUInteger count, max; // NSString *messageKey; // SOGoMAPIDBMessage *message; // if (sortOrderings) // [self warnWithFormat: @"sorting is not handled yet"]; // allKeys = [self toOneRelationshipKeys]; // if (qualifier) // { // [self logWithFormat: @"%s: getting restricted FAI keys", __PRETTY_FUNCTION__]; // max = [allKeys count]; // keys = [NSMutableArray arrayWithCapacity: max]; // for (count = 0; count < max; count++) // { // messageKey = [allKeys objectAtIndex: count]; // message = [self lookupName: messageKey // inContext: nil // acquire: NO]; // if ([qualifier evaluateMAPIVolatileMessage: message]) // [keys addObject: messageKey]; // } // } // else // keys = (NSMutableArray *) allKeys; // return keys; // } - (id) lookupName: (NSString *) childName inContext: (WOContext *) woContext acquire: (BOOL) acquire { id object; Class objectClass; NSString *childPath; NSDictionary *record; childPath = [self pathForChild: childName]; record = [self lookupRecord: childPath newerThanVersion: -1]; if (record) { if ([[record objectForKey: @"c_type"] intValue] == MAPIDBObjectTypeFolder) objectClass = isa; else objectClass = SOGoMAPIDBObjectK; object = [objectClass objectWithName: childName inContainer: self]; [object setupFromRecord: record]; } else object = nil; return object; } - (id) lookupFolder: (NSString *) folderName inContext: (WOContext *) woContext { id object; object = [SOGoMAPIDBFolder objectWithName: folderName inContainer: self]; [object reloadIfNeeded]; return object; } // - (id) _fileAttributeForKey: (NSString *) key // { // NSDictionary *attributes; // attributes = [[NSFileManager defaultManager] // fileAttributesAtPath: directory // traverseLink: NO]; // return [attributes objectForKey: key]; // } // - (NSCalendarDate *) creationTime // { // return [self _fileAttributeForKey: NSFileCreationDate]; // } // - (NSCalendarDate *) lastModificationTime // { // return [self _fileAttributeForKey: NSFileModificationDate]; // } /* acl */ - (NSString *) defaultUserID { return @"default"; } - (NSMutableDictionary *) _aclEntries { NSMutableDictionary *aclEntries; [aclMessage reloadIfNeeded]; aclEntries = [aclMessage properties]; if (![aclEntries objectForKey: @"users"]) [aclEntries setObject: [NSMutableArray array] forKey: @"users"]; if (![aclEntries objectForKey: @"entries"]) [aclEntries setObject: [NSMutableDictionary dictionary] forKey: @"entries"]; return aclEntries; } - (void) addUserInAcls: (NSString *) user { NSMutableDictionary *acl; NSMutableArray *users; acl = [self _aclEntries]; users = [acl objectForKey: @"users"]; [users addObjectUniquely: user]; [aclMessage save]; } - (void) removeAclsForUsers: (NSArray *) oldUsers { NSDictionary *acl; NSMutableDictionary *entries; NSMutableArray *users; acl = [self _aclEntries]; entries = [acl objectForKey: @"entries"]; [entries removeObjectsForKeys: oldUsers]; users = [acl objectForKey: @"users"]; [users removeObjectsInArray: oldUsers]; [aclMessage save]; } - (NSArray *) aclUsers { return [[self _aclEntries] objectForKey: @"users"]; } - (NSArray *) aclsForUser: (NSString *) uid { NSDictionary *entries; entries = [[self _aclEntries] objectForKey: @"entries"]; return [entries objectForKey: uid]; } - (void) setRoles: (NSArray *) roles forUser: (NSString *) uid { NSMutableDictionary *acl; NSMutableDictionary *entries; acl = [self _aclEntries]; entries = [acl objectForKey: @"entries"]; [entries setObject: roles forKey: uid]; [aclMessage save]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreFAIMessageTable.h0000644000000000000000000000211212247657026017711 0ustar rootroot/* MAPIStoreFAIMessageTable.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREFAIMESSAGETABLE_H #define MAPISTOREFAIMESSAGETABLE_H #import "MAPIStoreDBMessageTable.h" @interface MAPIStoreFAIMessageTable : MAPIStoreDBMessageTable @end #endif /* MAPISTOREFAIMESSAGETABLE_H */ SOGo-2.1.1b/OpenChange/NSValue+MAPIStore.m0000644000000000000000000000335712247657026016446 0ustar rootroot/* NSValue+MAPIStore.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #import "NSValue+MAPIStore.h" @implementation NSNumber (MAPIStoreDataTypes) - (uint8_t *) asBooleanInMemCtx: (void *) memCtx { uint8_t *value; value = talloc (memCtx, uint8_t); *value = ([self boolValue] ? 1 : 0); return value; } - (uint16_t *) asShortInMemCtx: (void *) memCtx { uint16_t *value; value = talloc (memCtx, uint16_t); *value = [self shortValue]; return value; } - (uint32_t *) asLongInMemCtx: (void *) memCtx { uint32_t *value; value = talloc (memCtx, uint32_t); *value = [self longValue]; return value; } - (uint64_t *) asI8InMemCtx: (void *) memCtx { uint64_t *value; value = talloc (memCtx, uint64_t); *value = [self unsignedLongLongValue]; return value; } - (double *) asDoubleInMemCtx: (void *) memCtx { double *value; value = talloc (memCtx, double); *value = [self doubleValue]; return value; } @end SOGo-2.1.1b/OpenChange/MAPIStoreContactsContext.m0000644000000000000000000000273512247657026020200 0ustar rootroot/* MAPIStoreContactsContext.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 "MAPIStoreContactsFolder.h" #import "MAPIStoreUserContext.h" #import "MAPIStoreContactsContext.h" #undef DEBUG #include static Class MAPIStoreContactsFolderK; @implementation MAPIStoreContactsContext + (void) initialize { MAPIStoreContactsFolderK = [MAPIStoreContactsFolder class]; } + (NSString *) MAPIModuleName { return @"contacts"; } + (enum mapistore_context_role) MAPIContextRole { return MAPISTORE_CONTACTS_ROLE; } - (Class) MAPIStoreFolderClass { return MAPIStoreContactsFolderK; } @end SOGo-2.1.1b/OpenChange/gen-property-selectors.py0000755000000000000000000002142612247657026020222 0ustar rootroot#!/usr/bin/python include_dirs = [ "/usr/include" ] output = "-" import os import sys m_template = """/* %(filename)s (auto-generated) */ #include #include #import "%(h_filename)s" const NSUInteger MAPIStorePropertyGettersCount = %(nbr_getters)d; const NSUInteger MAPIStoreLastPropertyIdx = %(last_property)d; const NSUInteger MAPIStoreSupportedPropertiesCount = %(nbr_supported_properties)d; const enum MAPITAGS MAPIStoreSupportedProperties[] = { %(supported_properties)s }; static const uint16_t MAPIStorePropertyGettersIdx[] = { %(getters_idx)s }; static const SEL MAPIStorePropertyGetterSelectors[] = { %(getters)s }; #include "code-%(filename)s" """ h_template = """/* %(filename)s (auto-generated) */ #ifndef %(h_exclusion)s #define %(h_exclusion)s 1 #import #include #include #include #include extern const NSUInteger MAPIStorePropertyGettersCount; extern const NSUInteger MAPIStoreLastPropertyIdx; extern const NSUInteger MAPIStoreSupportedPropertiesCount; extern const enum MAPITAGS MAPIStoreSupportedProperties[]; #import "MAPIStoreObject.h" @interface MAPIStoreObject (MAPIStorePropertySelectors) %(prototypes)s @end #include "code-%(filename)s" #endif /* %(h_exclusion)s */ """ # hack: some properties have multiple and incompatible types. Sometimes those # props are not related at all... bannedProps = set(["PidTagBodyHtml", "PidTagFavAutosubfolders", "PidTagAttachDataObj", "PidTagAclTable", "PidTagAclData", "PidTagRulesTable", "PidTagRulesData", "PidTagDisableWinsock", "PidTagHierarchyServer", "PidTagOfflineAddrbookEntryid", "PidTagShorttermEntryidFromObject", "PidTagNormalMessageSizeExtended", "PidTagAssocMessageSizeExtended", "PidTagMessageSizeExtended", "PidTagOabContainerGuid", "PidTagOfflineAddressBookMessageClass", "PidTagScriptData", "PidTagOfflineAddressBookTruncatedProperties", "PidTagOfflineAddressBookContainerGuid", "PidTagOfflineAddressBookDistinguishedName", "PidTagOfflineAddressBookShaHash", "PidTagSenderTelephoneNumber", "PidTagGatewayNeedsToRefresh", "PidTagWlinkType", "PidTagWlinkFlags", "PidTagWlinkGroupClsid", "PidTagWlinkGroupName", "PidTagWlinkGroupHeaderID", "PidTagScheduleInfoDelegatorWantsCopy", "PidTagWlinkOrdinal", "PidTagWlinkSection", "PidTagWlinkCalendarColor", "PidTagWlinkAddressBookEID", "PidTagWlinkFolderType", "PidTagScheduleInfoDelegateNames", "PidTagScheduleInfoDelegateEntryIds", "PidTagBusiness2TelephoneNumbers", "PidTagHome2TelephoneNumbers", "PidTagAttachDataObject", "PidTagShorttermEntryIdFromObject", ]) def ParseExchangeH(names, lines): state = 0 maxlines = len(lines) x = 0 while x < maxlines and state != 3: stripped = lines[x].strip() if state == 0: if stripped == "enum MAPITAGS": state = 1 elif state == 1: if stripped == "{": state = 2 elif state == 2: if stripped == "}": state = 3 else: ParseExchangeHDefinition(names, stripped) x = x + 1 def ParseExchangeHDefinition(names, line): stripped = line.strip() eqIdx = stripped.find("=") if eqIdx == -1: raise Exception, "line does not contain a '='" propName = stripped[0:eqIdx] if not propName.endswith("_Error") and not propName.endswith("_string8") \ and propName not in bannedProps: intIdx = stripped.find("(int", eqIdx) valueIdx = stripped.find("0x", intIdx + 1) endIdx = stripped.find(")", valueIdx) value = int(stripped[valueIdx:endIdx], 16) if value < 0x80000000: names[propName] = value def ParseMapistoreNameIDH(names, lines): for line in lines: stripped = line.strip() if stripped.startswith("#define Pid"): ParseMapistoreNameIDHDefinition(names, stripped) def ParseMapistoreNameIDHDefinition(names, line): stripped = line.strip() pidIdx = stripped.find("Pid") if pidIdx == -1: raise Exception, "line does not contain a 'Pid'" valueIdx = stripped.find("0x") propName = stripped[pidIdx:valueIdx].strip() if not propName.startswith("PidLidUnknown") and propName not in bannedProps: value = int(stripped[valueIdx:], 16) names[propName] = value def FindHFile(filename): found = None for dirname in include_dirs: full_filename = "%s/%s" % (dirname, filename) if os.path.exists(full_filename): found = full_filename if found is None: raise Exception, "'%s' not found in include dirs" % filename return found def ProcessHeaders(names, hdict): for filename in hdict: header_filename = FindHFile(filename) header_file = open(header_filename, "r") lines = header_file.readlines() header_file.close() hdict[filename](names, lines) if __name__ == "__main__": arg_count = len(sys.argv) x = 0 while x < arg_count: arg = sys.argv[x] argname = None if arg.startswith("-"): argname = arg[1] if len(arg) == 2: argvalue = sys.argv[x + 1] x = x + 1 else: argvalue = arg[2:] x = x + 1 if argname == "o": output = argvalue elif argname == "I": include_dirs.append(argvalue) names = {} ProcessHeaders(names, {"gen_ndr/exchange.h": ParseExchangeH, "mapistore/mapistore_nameid.h": ParseMapistoreNameIDH}) getters = [] getters_idx = [] # setters = [] # preferred_types = [] prototypes = [] for x in xrange(0x10000): getters_idx.append(" 0xffff") # setters.append(" NULL") prop_types = {} # sanitization: only take unicode version of text properties for name, prop_tag in names.iteritems(): prop_id = prop_tag >> 16 prop_type = prop_tag & 0xffff if not prop_id in prop_types: prop_types[prop_id] = [] prop_types[prop_id].append(prop_type) if (prop_type & 0xfff) == 0x001e: prop_tag = (prop_tag & 0xfffff000) | 0x001f names[name] = prop_tag #sanitization: report multiple types for the same keynames for prop_id, xtypes in prop_types.iteritems(): cnt = len(xtypes) if cnt > 1: print "%d types available for prop id 0x%.4x: %s" % (cnt, prop_id, ", ".join(["%.4x" % x for x in xtypes])) supported_properties = [] current_getter_idx = 0 highest_prop_idx = 0 for name, prop_tag in names.iteritems(): supported_properties.append(" 0x%.8x" % prop_tag); prop_idx = (prop_tag & 0xffff0000) >> 16 getters_idx[prop_idx] = " 0x%.4x" % current_getter_idx if prop_idx > highest_prop_idx: highest_prop_idx = prop_idx getters.append(" @selector (get%s:inMemCtx:)" % name) # preferred_types.append(" 0x%.4x" % (prop_tag & 0xffff)) prototypes.append("- (int) get%s: (void **) data inMemCtx: (TALLOC_CTX *) memCtx;" % name) current_getter_idx = current_getter_idx + 1 # setters[prop_idx] = " @selector (set%s:)" % name # prototypes.append("- (int) set%s: (void **) data;" % name) # prototypes.append("") filename = "%s.m" % output h_filename = "%s.h" % output outf = open(filename, "wb+") outf.write(m_template % {"getters_idx": ",\n".join(getters_idx), "getters": ",\n".join(getters), "nbr_getters": len(getters), "last_property": highest_prop_idx, "nbr_supported_properties": len(supported_properties), "supported_properties": ",\n".join(supported_properties), "filename": filename, "h_filename": h_filename}) outf.close() outf = open(h_filename, "wb+") exclusion = "" for x in h_filename.upper(): if ord(x) < 65 or ord(x) > 90: x = "_" exclusion = exclusion + x outf.write(h_template % {"prototypes": "\n".join(prototypes), "h_exclusion": exclusion, "filename": h_filename }) outf.close() SOGo-2.1.1b/OpenChange/SOGoMAPIDBObject.m0000644000000000000000000003710212247657026016200 0ustar rootroot/* SOGoMAPIDBObject.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "GCSSpecialQueries+OpenChange.h" #import "MAPIStoreTypes.h" #import "SOGoMAPIDBFolder.h" #import "BSONCodec.h" #import "SOGoMAPIDBObject.h" // // This defines the storage for internal properly list, stored in the // database. Possible values are: // // NSPropertyListGNUstepFormat = 1000 // NSPropertyListGNUstepBinaryFormat = 1001 // NSPropertyListOpenStepFormat = 1 // NSPropertyListXMLFormat_v1_0 = 100 // NSPropertyListBinaryFormat_v1_0 = 200 // static NSPropertyListFormat plistFormat; static EOAttribute *textColumn = nil; @implementation SOGoMAPIDBObject + (void) initialize { NSDictionary *description; plistFormat = [[NSUserDefaults standardUserDefaults] integerForKey: @"SOGoPropertyListFormat"]; if (!plistFormat) plistFormat = NSPropertyListGNUstepBinaryFormat; if (!textColumn) { /* TODO: this is a hack for providing an EOAttribute definition that is compatible with all the backends that we support. We should make use of EOModel instead. */ description = [NSDictionary dictionaryWithObjectsAndKeys: @"c_textfield", @"columnName", @"VARCHAR", @"externalType", nil]; textColumn = [EOAttribute attributeFromPropertyList: description]; [textColumn retain]; } } /* = (@"CREATE TABLE %@ (" @" c_path VARCHAR(255) PRIMARY KEY," @" c_type VARCHAR(20) NOT NULL," @" c_creationdate INT4 NOT NULL," @" c_lastmodified INT4 NOT NULL," @" c_version INT4 NOT NULL DEFAULT 0," @" c_deleted SMALLINT NOT NULL DEFAULT 0," */ /* indexes: c_path (primary key) c_counter c_path, c_type c_path, c_creationdate */ - (id) init { if ((self = [super init])) { tableUrl = nil; initialized = NO; objectType = -1; deleted = NO; version = 0; } return self; } - (void) dealloc { [tableUrl release]; [super dealloc]; } - (void) setTableUrl: (NSURL *) newTableUrl { ASSIGN (tableUrl, newTableUrl); } - (NSURL *) tableUrl { if (!tableUrl) { tableUrl = [container tableUrl]; [tableUrl retain]; if (!tableUrl) [NSException raise: @"MAPIStoreIOException" format: @"table url is not set for object '%@'", self]; } return tableUrl; } - (NSString *) tableName { NSArray *parts; [self tableUrl]; parts = [[tableUrl path] componentsSeparatedByString: @"/"]; return [parts lastObject]; } - (void) setupFromRecord: (NSDictionary *) record { NSInteger intValue; NSString *propsValue;//, *error; NSDictionary *newValues; //NSPropertyListFormat format; objectType = [[record objectForKey: @"c_type"] intValue]; intValue = [[record objectForKey: @"c_creationdate"] intValue]; ASSIGN (creationDate, [NSCalendarDate dateWithTimeIntervalSince1970: (NSTimeInterval) intValue]); intValue = [[record objectForKey: @"c_lastmodified"] intValue]; ASSIGN (lastModified, [NSCalendarDate dateWithTimeIntervalSince1970: (NSTimeInterval) intValue]); deleted = ([[record objectForKey: @"c_deleted"] intValue] > 0); version = [[record objectForKey: @"c_version"] intValue]; propsValue = [record objectForKey: @"c_content"]; if ([propsValue isNotNull]) { newValues = [[propsValue dataByDecodingBase64] BSONValue]; [properties addEntriesFromDictionary: newValues]; } else [properties removeAllObjects]; initialized = YES; } /* accessors */ - (NSMutableString *) path { NSMutableString *path; if (container) path = [container pathForChild: nameInContainer]; else path = [NSMutableString stringWithFormat: @"/%@", nameInContainer]; if ([path rangeOfString: @"//"].location != NSNotFound) [NSException raise: @"MAPIStoreIOException" format: @"object path has not been properly set for" " folder '%@' (%@)", self, path]; return path; } - (void) setObjectType: (MAPIDBObjectType) newObjectType { objectType = newObjectType; } - (MAPIDBObjectType) objectType /* message, fai, folder */ { return objectType; } - (NSCalendarDate *) creationDate { if (!initialized) [NSException raise: @"MAPIStoreIOException" format: @"record has not been initialized: %@", self]; return creationDate; } - (NSCalendarDate *) lastModified { if (!initialized) [NSException raise: @"MAPIStoreIOException" format: @"record has not been initialized: %@", self]; return lastModified; } - (BOOL) deleted { return deleted; } - (Class) mapistoreMessageClass { NSString *className, *mapiMsgClass; switch (objectType) { case MAPIDBObjectTypeMessage: mapiMsgClass = [properties objectForKey: MAPIPropertyKey (PidTagMessageClass)]; if (mapiMsgClass) { if ([mapiMsgClass isEqualToString: @"IPM.StickyNote"]) className = @"MAPIStoreNotesMessage"; else className = @"MAPIStoreDBMessage"; //[self logWithFormat: @"PidTagMessageClass = '%@', returning '%@'", // mapiMsgClass, className]; } else { //[self warnWithFormat: @"PidTagMessageClass is not set, falling back" // @" to 'MAPIStoreDBMessage'"]; className = @"MAPIStoreDBMessage"; } break; case MAPIDBObjectTypeFAI: className = @"MAPIStoreFAIMessage"; break; default: [NSException raise: @"MAPIStoreIOException" format: @"message class should not be queried for objects" @" of type '%d'", objectType]; } return NSClassFromString (className); } /* actions */ - (void) setNameInContainer: (NSString *) newNameInContainer { NSMutableString *sql; NSString *oldPath, *newPath; if (nameInContainer) oldPath = [self path]; [super setNameInContainer: newNameInContainer]; if (nameInContainer) { newPath = [self path]; sql = [NSMutableString stringWithFormat: @"UPDATE %@" @" SET c_path = '%@'", [self tableName], newPath]; [sql appendFormat: @" WHERE c_path = '%@'", oldPath]; [self performBatchSQLQueries: [NSArray arrayWithObject: sql]]; } } - (void) changePathTo: (NSString *) newPath { NSMutableString *sql; NSString *oldPath, *newParentPath; NSRange slashRange; oldPath = [self path]; slashRange = [newPath rangeOfString: @"/" options: NSBackwardsSearch]; if (slashRange.location != NSNotFound) newParentPath = [newPath substringToIndex: slashRange.location]; else newParentPath = NULL; sql = [NSMutableString stringWithFormat: @"UPDATE %@" @" SET c_path = '%@'", [self tableName], newPath]; if (newParentPath) [sql appendFormat: @", c_parent_path = '%@'", newParentPath]; else [sql appendString: @", c_parent_path = NULL"]; [sql appendFormat: @" WHERE c_path = '%@'", oldPath]; [self performBatchSQLQueries: [NSArray arrayWithObject: sql]]; } - (EOAdaptor *) tableChannelAdaptor { GCSChannelManager *cm; EOAdaptor *adaptor; EOAdaptorChannel *channel; cm = [GCSChannelManager defaultChannelManager]; channel = [cm acquireOpenChannelForURL: [self tableUrl]]; adaptor = [[channel adaptorContext] adaptor]; [cm releaseChannel: channel]; return adaptor; } - (NSArray *) performSQLQuery: (NSString *) sql { NSMutableArray *records; GCSChannelManager *cm; EOAdaptorChannel *channel; NSException *error; NSArray *attrs; NSDictionary *record; cm = [GCSChannelManager defaultChannelManager]; channel = [cm acquireOpenChannelForURL: [self tableUrl]]; error = [channel evaluateExpressionX: sql]; if (error) { records = nil; [self logWithFormat: @"an exception occurred when executing query '%@'", sql]; [self logWithFormat: @"exception is '%@'", error]; } else { records = [NSMutableArray arrayWithCapacity: 256]; attrs = [channel describeResults: NO]; while ((record = [channel fetchAttributes: attrs withZone: NULL])) [records addObject: record]; } [cm releaseChannel: channel]; return records; } - (BOOL) performBatchSQLQueries: (NSArray *) queries { GCSChannelManager *cm; EOAdaptorChannel *channel; EOAdaptorContext *dbContext; NSException *error; NSUInteger count, max; NSString *sql; cm = [GCSChannelManager defaultChannelManager]; channel = [cm acquireOpenChannelForURL: [self tableUrl]]; dbContext = [channel adaptorContext]; [dbContext beginTransaction]; error = nil; max = [queries count]; for (count = 0; error == nil && count < max; count++) { sql = [queries objectAtIndex: count]; error = [channel evaluateExpressionX: sql]; if (error) [dbContext rollbackTransaction]; } if (!error) [dbContext commitTransaction]; [cm releaseChannel: channel]; return (error == nil); } - (NSDictionary *) lookupRecord: (NSString *) path newerThanVersion: (NSInteger) startVersion { NSDictionary *record; NSArray *records; NSString *tableName, *pathValue; NSMutableString *sql; EOAdaptor *adaptor; if ([path hasSuffix: @"/"]) [NSException raise: @"MAPIStoreIOException" format: @"path ends with a slash: %@", path]; tableName = [self tableName]; adaptor = [self tableChannelAdaptor]; pathValue = [adaptor formatValue: path forAttribute: textColumn]; /* query */ sql = [NSMutableString stringWithFormat: @"SELECT * FROM %@ WHERE c_path = %@", tableName, pathValue]; if (startVersion > -1) [sql appendFormat: @" AND c_version > %d", startVersion]; /* execution */ records = [self performSQLQuery: sql]; if ([records count] > 0) record = [records objectAtIndex: 0]; else record = nil; return record; } - (void) reloadIfNeeded { /* if object is uninitialized: reload without condition, otherwise, load if c_version > :version */ NSDictionary *record; if (initialized) { if (!isNew) { record = [self lookupRecord: [self path] newerThanVersion: version]; if (record) [self setupFromRecord: record]; } } else { record = [self lookupRecord: [self path] newerThanVersion: -1]; if (record) { [self setupFromRecord: record]; isNew = NO; } else isNew = YES; initialized = YES; } } - (NSException *) delete { deleted = YES; [properties removeAllObjects]; [self save]; return nil; } - (void) save { NSString *sql; NSData *content; NSCalendarDate *now; GCSChannelManager *cm; EOAdaptor *adaptor; EOAdaptorChannel *channel; NSInteger creationDateValue, lastModifiedValue, deletedValue; NSString *tableName, *pathValue, *parentPathValue, *propsValue; NSException *result; if (!initialized) [NSException raise: @"MAPIStoreIOException" format: @"record has not been initialized: %@", self]; cm = [GCSChannelManager defaultChannelManager]; channel = [cm acquireOpenChannelForURL: [self tableUrl]]; tableName = [self tableName]; now = [NSCalendarDate date]; ASSIGN (lastModified, now); /* - (NSException *)insertRowX:(NSDictionary *)_row forEntity:(EOEntity *)_entity; - (NSException *)updateRowX:(NSDictionary*)aRow describedByQualifier:(EOSQLQualifier*)aQualifier; */ adaptor = [[channel adaptorContext] adaptor]; pathValue = [adaptor formatValue: [self path] forAttribute: textColumn]; lastModifiedValue = (NSInteger) [lastModified timeIntervalSince1970]; if (objectType == -1) [NSException raise: @"MAPIStoreIOException" format: @"object type has not been set for object '%@'", self]; if ([properties count] > 0) { content = [properties BSONRepresentation]; propsValue = [adaptor formatValue: [content stringByEncodingBase64] forAttribute: textColumn]; } else propsValue = @"NULL"; if (isNew) { ASSIGN (creationDate, now); creationDateValue = (NSInteger) [creationDate timeIntervalSince1970]; parentPathValue = [adaptor formatValue: [container path] forAttribute: textColumn]; if (!parentPathValue) parentPathValue = @"NULL"; sql = [NSString stringWithFormat: (@"INSERT INTO %@" @" (c_path, c_parent_path, c_type, c_creationdate, c_lastmodified," @" c_deleted, c_version, c_content)" @" VALUES (%@, %@, %d, %d, %d, 0, 0, %@" @")"), tableName, pathValue, parentPathValue, objectType, creationDateValue, lastModifiedValue, propsValue]; isNew = NO; } else { version++; deletedValue = (deleted ? 1 : 0); sql = [NSString stringWithFormat: (@"UPDATE %@" @" SET c_lastmodified = %d, c_deleted = %d," @" c_version = %d, c_content = %@" @" WHERE c_path = %@"), tableName, lastModifiedValue, deletedValue, version, propsValue, pathValue]; } result = [channel evaluateExpressionX: sql]; if (result) [self errorWithFormat: @"could not insert/update record for record %@" @" in %@: %@", pathValue, tableName, result]; // @" c_path VARCHAR(255) PRIMARY KEY," // @" c_type SMALLINT NOT NULL," // @" c_creationdate INT4 NOT NULL," // @" c_lastmodified INT4 NOT NULL," // @" c_deleted SMALLINT NOT NULL DEFAULT 0," // @" c_content BLOB"); [cm releaseChannel: channel]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreEmbeddedMessage.m0000644000000000000000000000727212247657026020054 0ustar rootroot/* MAPIStoreEmbeddedMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 "MAPIStoreAttachment.h" #import "MAPIStoreFolder.h" #import "NSObject+MAPIStore.h" #import "MAPIStoreEmbeddedMessage.h" #include static Class MAPIStoreAttachmentK; @implementation MAPIStoreEmbeddedMessage + (void) initialize { MAPIStoreAttachmentK = [MAPIStoreAttachment class]; } - (uint64_t) objectId { NSString *objectKey; MAPIStoreMessage *grandParent; grandParent = (MAPIStoreMessage *) [container container]; /* FIXME: this is a hack */ objectKey = [NSString stringWithFormat: @"%@/%@/as-message", [grandParent nameInContainer], [container nameInContainer], [self nameInContainer]]; return [(MAPIStoreFolder *) [grandParent container] idForObjectWithKey: objectKey]; } - (int) getPidTagAccessLevel: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } /* disabled properties */ - (int) getPidTagFolderId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagSourceKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagParentSourceKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagChangeNumber: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagInstID: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagInstanceNum: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagRowType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagDepth: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagIconIndex: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagGenerateExchangeViews: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagOriginalMessageClass: (void **) dataa inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } /* common methods */ - (NSString *) nameInContainer { return @"as-message"; } - (uint64_t) objectVersion { return ULLONG_MAX; } - (void) save: (TALLOC_CTX *) memCtx { [self subclassResponsibility: _cmd]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreNotesContext.m0000644000000000000000000000344212247657026017506 0ustar rootroot/* MAPIStoreNotesContext.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 "MAPIStoreNotesFolder.h" #import "MAPIStoreMapping.h" #import "MAPIStoreNotesContext.h" #undef DEBUG #include @implementation MAPIStoreNotesContext + (NSString *) MAPIModuleName { return @"notes"; } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName withTDBIndexing: (struct tdb_wrap *) indexingTdb inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *context; context = talloc_zero(memCtx, struct mapistore_contexts_list); context->url = talloc_asprintf (context, "sogo://%s@notes/", [userName UTF8String]); // context->name = "Notes personnelles"; context->main_folder = true; context->role = MAPISTORE_NOTES_ROLE; context->tag = "tag"; context->prev = context; return context; } @end SOGo-2.1.1b/OpenChange/MAPIStoreEmbeddedMessage.h0000644000000000000000000000207612247657026020044 0ustar rootroot/* MAPIStoreEmbeddedMessage.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREEMBEDDEDMESSAGE_H #define MAPISTOREEMBEDDEDMESSAGE_H #import "MAPIStoreMessage.h" @interface MAPIStoreEmbeddedMessage : MAPIStoreMessage @end #endif /* MAPISTOREEMBEDDEDMESSAGE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreObjectProxy.h0000644000000000000000000000241112247657026017307 0ustar rootroot/* MAPIStoreObjectProxy.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 MAPISTOREOBJECTPROXY_H #define MAPISTOREOBJECTPROXY_H #include #import @interface MAPIStoreObjectProxy : NSObject { const IMP *classGetters; } - (enum mapistore_error) getProperty: (void **) data withTag: (enum MAPITAGS) propTag inMemCtx: (TALLOC_CTX *) localMemCtx; @end #endif /* MAPISTOREOBJECTPROXY_H */ SOGo-2.1.1b/OpenChange/BSONCodec.h0000644000000000000000000000172012247657026015054 0ustar rootroot// // BSONCodec.h // BSON Codec for Objective-C. // // Created by Martin Kou on 8/17/10. // MIT License, see LICENSE file for details. // #import #import @protocol BSONCoding - (uint8_t) BSONTypeID; - (NSData *) BSONEncode; - (NSData *) BSONRepresentation; + (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID; @end @protocol BSONObjectCoding - (id) initWithBSONDictionary: (NSDictionary *) data; - (NSDictionary *) BSONDictionary; @end @interface NSObject (BSONObjectCoding) - (NSData *) BSONEncode; - (NSData *) BSONRepresentation; @end @interface NSDictionary (BSON) @end @interface NSData (BSON) - (NSDictionary *) BSONValue; @end @interface NSNumber (BSON) @end @interface NSString (BSON) @end @interface NSArray (BSON) @end @interface NSNull (BSON) @end @interface NSCalendarDate (BSON) @end SOGo-2.1.1b/OpenChange/NSValue+MAPIStore.h0000644000000000000000000000241012247657026016426 0ustar rootroot/* NSValue+MAPIStore.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 NSVALUE_MAPISTORE_H #define NSVALUE_MAPISTORE_H #import @interface NSNumber (MAPIStoreDataTypes) - (uint8_t *) asBooleanInMemCtx: (void *) memCtx; - (uint16_t *) asShortInMemCtx: (void *) memCtx; - (uint32_t *) asLongInMemCtx: (void *) memCtx; - (uint64_t *) asI8InMemCtx: (void *) memCtx; - (double *) asDoubleInMemCtx: (void *) memCtx; @end #endif /* NSVALUE_MAPISTORE_H */ SOGo-2.1.1b/OpenChange/RTFHandler.h0000644000000000000000000000447412247657026015317 0ustar rootroot/* Copyright (C) 2005-2012 Inverse inc. This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include // // // @interface RTFHandler : NSObject { NSMapTable *_charsets; NSMutableData *_html; NSData *_data; const char *_bytes; int _current_pos; int _len; } - (id) initWithData: (NSData *) theData; - (NSMutableData *) parse; @end // // // @interface RTFStack: NSObject { NSMutableArray *a; } - (void) push: (id) theObject; - (id) pop; @end // // // @interface RTFFormattingOptions : NSObject { @public BOOL bold; BOOL italic; BOOL underline; BOOL strikethrough; int font_index; int color_index; int start_pos; } @end // // // @interface RTFFontInfo : NSObject { @public NSString *family; NSString *charset; NSString *name; unsigned int pitch; unsigned int index; } @end // // \fX - font, index in font table // @interface RTFFontTable : NSObject { @public NSMapTable *fontInfos; } - (void) addFontInfo: (RTFFontInfo *) theFontInfo atIndex: (unsigned int ) theIndex; - (RTFFontInfo *) fontInfoAtIndex: (unsigned int ) theIndex; @end // // // @interface RTFColorDef : NSObject { @public unsigned char red; unsigned char green; unsigned char blue; } @end // // {\colortbl\red0\green0\blue0;\red128\green0\blue0;\red255\green0\blue0;} // // \cfX - color/foreground - index // \cbX - color/background - index // // @interface RTFColorTable : NSObject { @public NSMutableArray *colorDefs; } - (void) addColorDef: (RTFColorDef *) theColorDef; @end SOGo-2.1.1b/OpenChange/gen-charset-table.py0000755000000000000000000000327712247657026017057 0ustar rootroot#!/usr/bin/python import getopt import os import re import string import sys h_template = """unsigned short %(charsetName)s[%(len)d] = { %(values)s };""" CHAR_UNDEF = "0x0000" MAP_LEN = 256 itemsPerLine = 16 def usage(): usageMsg = """ Usage: %s -f inputFile """ % (os.path.basename(sys.argv[0])) sys.stderr.write(usageMsg) def parseCharsetFile(file = None): if file is None: return None charmap = [CHAR_UNDEF] * MAP_LEN # Sample line: # FD = U+200E : LEFT-TO-RIGHT MARK for line in file.xreadlines(): m = re.search("(\w{2}) = U\+(\w{4}) :", line) if not m: sys.stderr.write("Skipping weird line: %s" % line) continue ind = int(m.group(1), base=16) unicodeValue = str(m.group(2)).lower() charmap[ind] = "0x%s" % (unicodeValue) return charmap def formatCharacterMap(charmap = None): if not charmap: return None value = "" for i in xrange(0,MAP_LEN-1): char = charmap[i] if i % itemsPerLine == 0: value += "\n " value += "%s, " % (char) i += 1 value += charmap[MAP_LEN-1] return value if __name__ == '__main__': inputFile = None try: opts, args = getopt.getopt(sys.argv[1:], "f:") except getopt.GetoptError, err: sys.stderr.write(str(err)) usage() sys.exit(2) for o, a in opts: if o == "-f": inputFile = a else: assert False, "unhandled option" if not inputFile: usage() sys.exit(1) f = open(inputFile, "r", 1) charsetMap = parseCharsetFile(f) charsetValues = formatCharacterMap(charsetMap) print h_template % {"len": len(charsetMap), "charsetName": os.path.basename(inputFile), "values": charsetValues} SOGo-2.1.1b/OpenChange/MAPIStoreObject.m0000644000000000000000000002460112247657026016257 0ustar rootroot/* MAPIStoreObject.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import "MAPIStoreContext.h" #import "MAPIStoreFolder.h" #import "MAPIStorePropertySelectors.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSDate+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreObject.h" #undef DEBUG #include #include #include #include #include @implementation MAPIStoreObject static Class NSExceptionK, MAPIStoreFolderK; + (void) initialize { NSExceptionK = [NSExceptionK class]; MAPIStoreFolderK = [MAPIStoreFolder class]; } + (id) mapiStoreObjectInContainer: (MAPIStoreObject *) newContainer { id newObject; newObject = [[self alloc] initInContainer: newContainer]; [newObject autorelease]; return newObject; } - (id) init { if ((self = [super init])) { classGetters = (IMP *) MAPIStorePropertyGettersForClass (isa); parentContainersBag = [NSMutableArray new]; container = nil; properties = [NSMutableDictionary new]; proxies = [NSMutableArray new]; } // [self logWithFormat: @"-init"]; return self; } - (id) initInContainer: (MAPIStoreObject *) newContainer { if ((self = [self init])) { ASSIGN (container, newContainer); } return self; } - (void) dealloc { // [self logWithFormat: @"-dealloc"]; [proxies release]; [properties release]; [parentContainersBag release]; [container release]; [super dealloc]; } - (MAPIStoreObject *) container { return container; } - (MAPIStoreContext *) context { return (MAPIStoreContext *) [container context]; } - (MAPIStoreUserContext *) userContext { return [[self context] userContext]; } - (MAPIStoreMapping *) mapping { return [[self userContext] mapping]; } - (NSString *) url { NSString *containerURL, *urlName, *format; containerURL = (NSString *) [container url]; if ([containerURL hasSuffix: @"/"]) format = @"%@%@"; else format = @"%@/%@"; urlName = [[self nameInContainer] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; return [NSString stringWithFormat: format, containerURL, urlName]; } /* helpers */ - (void) addProperties: (NSDictionary *) newNewProperties { [properties addEntriesFromDictionary: newNewProperties]; } - (NSMutableDictionary *) properties { return properties; } - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag inMemCtx: (TALLOC_CTX *) memCtx { MAPIStorePropertyGetter method = NULL; uint16_t propValue; SEL methodSel; id value; int rc = MAPISTORE_ERR_NOT_FOUND; NSUInteger count, max; value = [properties objectForKey: MAPIPropertyKey (propTag)]; if (value) rc = [value getValue: data forTag: propTag inMemCtx: memCtx]; else { propValue = (propTag & 0xffff0000) >> 16; methodSel = MAPIStoreSelectorForPropertyGetter (propValue); method = (MAPIStorePropertyGetter) classGetters[propValue]; if (method) rc = method (self, methodSel, data, memCtx); } if (rc == MAPISTORE_ERR_NOT_FOUND) { max = [proxies count]; for (count = 0; rc == MAPISTORE_ERR_NOT_FOUND && count < max; count++) rc = [[proxies objectAtIndex: count] getProperty: data withTag: propTag inMemCtx: memCtx]; } return rc; } - (int) getPidTagCreationTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self creationTime] asFileTimeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagLastModificationTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self lastModificationTime] asFileTimeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (BOOL) canGetProperty: (enum MAPITAGS) propTag { uint16_t propValue; BOOL canGetProperty; NSUInteger count, max; propValue = (propTag >> 16) & 0xffff; canGetProperty = (classGetters[propValue] || [properties objectForKey: MAPIPropertyKey (propTag)]); max = [proxies count]; for (count = 0; !canGetProperty && count < max; count++) canGetProperty = [[proxies objectAtIndex: count] canGetProperty: propTag]; return canGetProperty; } - (int) getProperties: (struct mapistore_property_data *) data withTags: (enum MAPITAGS *) tags andCount: (uint16_t) columnCount inMemCtx: (TALLOC_CTX *) memCtx { uint16_t count; for (count = 0; count < columnCount; count++) data[count].error = [self getProperty: &data[count].data withTag: tags[count] inMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (void) addProxy: (MAPIStoreObjectProxy *) newProxy { [proxies addObject: newProxy]; } - (int) addPropertiesFromRow: (struct SRow *) aRow { struct SPropValue *cValue; NSUInteger counter; NSMutableDictionary *newProperties; NSTimeZone *tz; NSInteger tzOffset; id value; tz = nil; newProperties = [NSMutableDictionary dictionaryWithCapacity: aRow->cValues]; for (counter = 0; counter < aRow->cValues; counter++) { cValue = aRow->lpProps + counter; value = NSObjectFromSPropValue (cValue); switch (cValue->ulPropTag & 0xffff) { case PT_STRING8: case PT_MV_STRING8: [self warnWithFormat: @"attempting to set string property as PR_STRING8: %.8x", cValue->ulPropTag]; break; case PT_SYSTIME: if (!tz) { tz = [[self userContext] timeZone]; tzOffset = -[tz secondsFromGMT]; } value = [value addYear: 0 month: 0 day: 0 hour: 0 minute: 0 second: tzOffset]; [value setTimeZone: tz]; break; } [newProperties setObject: value forKey: MAPIPropertyKey (cValue->ulPropTag)]; } [self addProperties: newProperties]; return MAPISTORE_SUCCESS; } // // The GlobCnt is 6 bytes long. // - (NSData *) getReplicaKeyFromGlobCnt: (uint64_t) objectCnt { struct mapistore_connection_info *connInfo; NSMutableData *replicaKey; char buffer[6]; NSUInteger count; connInfo = [[self context] connectionInfo]; for (count = 0; count < 6; count++) { buffer[count] = objectCnt & 0xff; objectCnt >>= 8; } replicaKey = [NSMutableData dataWithCapacity: 22]; [replicaKey appendBytes: &connInfo->replica_guid length: sizeof (struct GUID)]; [replicaKey appendBytes: buffer length: 6]; return replicaKey; } - (int) getReplicaKey: (void **) data fromGlobCnt: (uint64_t) objectCnt inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self getReplicaKeyFromGlobCnt: objectCnt] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } /* move and copy operations */ - (void) copyPropertiesToObject: (MAPIStoreObject *) newObject inMemCtx: (TALLOC_CTX *) memCtx { //TALLOC_CTX *memCtx; struct SPropTagArray *availableProps; struct SRow row; enum MAPITAGS propTag; bool *exclusions; NSUInteger count; enum mapistore_error error; void *data; //memCtx = talloc_zero (NULL, TALLOC_CTX); [self getAvailableProperties: &availableProps inMemCtx: memCtx]; /* We exclude identity and versioning properties to facilitate copy operations. If they need to be set (move operations), the caller will need to take care of them. */ exclusions = talloc_array (memCtx, bool, 65536); exclusions[(PidTagRowType >> 16) & 0xffff] = true; exclusions[(PidTagInstanceKey >> 16) & 0xffff] = true; exclusions[(PidTagInstanceNum >> 16) & 0xffff] = true; exclusions[(PidTagInstID >> 16) & 0xffff] = true; exclusions[(PidTagAttachNumber >> 16) & 0xffff] = true; exclusions[(PidTagFolderId >> 16) & 0xffff] = true; exclusions[(PidTagMid >> 16) & 0xffff] = true; exclusions[(PidTagSourceKey >> 16) & 0xffff] = true; exclusions[(PidTagParentSourceKey >> 16) & 0xffff] = true; exclusions[(PidTagParentFolderId >> 16) & 0xffff] = true; exclusions[(PidTagChangeKey >> 16) & 0xffff] = true; exclusions[(PidTagChangeNumber >> 16) & 0xffff] = true; exclusions[(PidTagPredecessorChangeList >> 16) & 0xffff] = true; row.cValues = 0; row.lpProps = talloc_array (memCtx, struct SPropValue, 65535); for (count = 0; count < availableProps->cValues; count++) { propTag = availableProps->aulPropTag[count]; if (!exclusions[(propTag >> 16) & 0xffff]) { error = [self getProperty: &data withTag: propTag inMemCtx: memCtx]; if (error == MAPISTORE_SUCCESS && data) { set_SPropValue_proptag (row.lpProps + row.cValues, propTag, data); row.cValues++; } } } [newObject addPropertiesFromRow: &row]; //talloc_free (memCtx); } /* subclasses */ - (NSString *) nameInContainer { [self subclassResponsibility: _cmd]; return nil; } - (NSDate *) creationTime { [self subclassResponsibility: _cmd]; return nil; } - (NSDate *) lastModificationTime { [self subclassResponsibility: _cmd]; return nil; } /* logging */ - (NSString *) loggingPrefix { return [NSString stringWithFormat:@"<%@:%p:%@>", NSStringFromClass (isa), self, [self nameInContainer]]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreUserContext.m0000644000000000000000000002260612247657026017337 0ustar rootroot/* MAPIStoreUserContext.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "GCSSpecialQueries+OpenChange.h" #import "MAPIApplication.h" #import "MAPIStoreAuthenticator.h" #import "MAPIStoreMapping.h" #import "MAPIStoreUserContext.h" static NSMapTable *contextsTable = nil; @implementation MAPIStoreUserContext + (void) initialize { contextsTable = [NSMapTable mapTableWithStrongToWeakObjects]; [contextsTable retain]; } + (id) userContextWithUsername: (NSString *) username andTDBIndexing: (struct tdb_wrap *) indexingTdb; { id userContext; userContext = [contextsTable objectForKey: username]; if (!userContext) { userContext = [[self alloc] initWithUsername: username andTDBIndexing: indexingTdb]; [userContext autorelease]; [contextsTable setObject: userContext forKey: username]; } return userContext; } - (id) init { if ((self = [super init])) { username = nil; sogoUser = nil; userFolder = nil; containersBag = [NSMutableArray new]; rootFolders = nil; mapping = nil; userDbTableExists = NO; folderTableURL = nil; authenticator = nil; woContext = [WOContext contextWithRequest: nil]; [woContext retain]; } return self; } - (NSString *) _readUserPassword: (NSString *) newUsername { NSString *password, *path; NSData *content; password = nil; path = [NSString stringWithFormat: SAMBA_PRIVATE_DIR @"/mapistore/%@/password", newUsername]; content = [NSData dataWithContentsOfFile: path]; if (content) { password = [[NSString alloc] initWithData: content encoding: NSUTF8StringEncoding]; [password autorelease]; password = [password stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString: @"\r\n"]]; } return password; } - (id) initWithUsername: (NSString *) newUsername andTDBIndexing: (struct tdb_wrap *) indexingTdb { NSString *userPassword; if ((self = [self init])) { /* "username" will be retained by table */ username = newUsername; if (indexingTdb) ASSIGN (mapping, [MAPIStoreMapping mappingForUsername: username withIndexing: indexingTdb]); authenticator = [MAPIStoreAuthenticator new]; [authenticator setUsername: username]; /* TODO: very hackish (IMAP access) */ userPassword = [self _readUserPassword: newUsername]; if ([userPassword length] == 0) userPassword = username; [authenticator setPassword: userPassword]; } return self; } - (void) dealloc { [userFolder release]; [containersBag release]; [rootFolders release]; [woContext release]; [authenticator release]; [mapping release]; [folderTableURL release]; [sogoUser release]; [contextsTable removeObjectForKey: username]; [super dealloc]; } - (NSString *) username { return username; } - (SOGoUser *) sogoUser { if (!sogoUser) ASSIGN (sogoUser, [SOGoUser userWithLogin: username]); return sogoUser; } - (NSTimeZone *) timeZone { if (!timeZone) { SOGoUser *user; user = [self sogoUser]; timeZone = [[user userDefaults] timeZone]; [timeZone retain]; } return timeZone; } - (SOGoUserFolder *) userFolder { if (!userFolder) { userFolder = [SOGoUserFolder objectWithName: username inContainer: MAPIApp]; [userFolder retain]; } return userFolder; } - (NSDictionary *) rootFolders { SOGoMailAccounts *accountsFolder; id currentFolder; NGImap4Connection *connection; NSDictionary *hierarchy; NSArray *flags; if (!rootFolders) { rootFolders = [NSMutableDictionary new]; [self userFolder]; [woContext setClientObject: userFolder]; /* Calendar */ currentFolder = [userFolder lookupName: @"Calendar" inContext: woContext acquire: NO]; [rootFolders setObject: currentFolder forKey: @"calendar"]; [rootFolders setObject: currentFolder forKey: @"tasks"]; /* Contacts */ currentFolder = [userFolder lookupName: @"Contacts" inContext: woContext acquire: NO]; [rootFolders setObject: currentFolder forKey: @"contacts"]; /* Mail */ accountsFolder = [userFolder lookupName: @"Mail" inContext: woContext acquire: NO]; [containersBag addObject: accountsFolder]; [woContext setClientObject: accountsFolder]; currentFolder = [accountsFolder lookupName: @"0" inContext: woContext acquire: NO]; [rootFolders setObject: currentFolder forKey: @"mail"]; connection = [currentFolder imap4Connection]; [connection enableExtensions: [NSArray arrayWithObject: @"QRESYNC"]]; /* ensure the folder cache is filled */ [currentFolder toManyRelationshipKeysWithNamespaces: YES]; hierarchy = [connection cachedHierarchyResultsForURL: [currentFolder imap4URL]]; flags = [[hierarchy objectForKey: @"list"] objectForKey: @"/INBOX"]; inboxHasNoInferiors = [flags containsObject: @"noinferiors"]; } return rootFolders; } - (BOOL) inboxHasNoInferiors { [self rootFolders]; return inboxHasNoInferiors; } - (MAPIStoreMapping *) mapping { return mapping; } /* OpenChange db table */ - (NSURL *) folderTableURL { NSString *urlString, *ocFSTableName; NSMutableArray *parts; SOGoUser *user; if (!folderTableURL) { user = [self sogoUser]; urlString = [[user domainDefaults] folderInfoURL]; parts = [[urlString componentsSeparatedByString: @"/"] mutableCopy]; [parts autorelease]; if ([parts count] == 5) { /* If "OCSFolderInfoURL" is properly configured, we must have 5 parts in this url. */ ocFSTableName = [NSString stringWithFormat: @"socfs_%@", [username asCSSIdentifier]]; [parts replaceObjectAtIndex: 4 withObject: ocFSTableName]; folderTableURL = [NSURL URLWithString: [parts componentsJoinedByString: @"/"]]; [folderTableURL retain]; } else [NSException raise: @"MAPIStoreIOException" format: @"'OCSFolderInfoURL' is not set"]; } return folderTableURL; } - (void) ensureFolderTableExists { GCSChannelManager *cm; EOAdaptorChannel *channel; NSString *tableName, *query; GCSSpecialQueries *queries; [self folderTableURL]; cm = [GCSChannelManager defaultChannelManager]; channel = [cm acquireOpenChannelForURL: folderTableURL]; /* FIXME: make use of [EOChannelAdaptor describeTableNames] instead */ tableName = [[folderTableURL path] lastPathComponent]; if ([channel evaluateExpressionX: [NSString stringWithFormat: @"SELECT count(*) FROM %@", tableName]]) { queries = [channel specialQueries]; query = [queries createOpenChangeFSTableWithName: tableName]; if ([channel evaluateExpressionX: query]) [NSException raise: @"MAPIStoreIOException" format: @"could not create special table '%@'", tableName]; } else [channel cancelFetch]; [cm releaseChannel: channel]; } /* SOGo context objects */ - (WOContext *) woContext { return woContext; } - (MAPIStoreAuthenticator *) authenticator { return authenticator; } - (void) activateWithUser: (SOGoUser *) activeUser; { NSMutableDictionary *info; [MAPIApp setUserContext: self]; [woContext setActiveUser: activeUser]; info = [[NSThread currentThread] threadDictionary]; [info setObject: woContext forKey: @"WOContext"]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreMailAttachment.h0000644000000000000000000000237512247657026017743 0ustar rootroot/* MAPIStoreMailAttachment.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREMAILATTACHMENT_H #define MAPISTOREMAILATTACHMENT_H #import "MAPIStoreAttachment.h" @class NSDictionary; @interface MAPIStoreMailAttachment : MAPIStoreAttachment { NSDictionary *bodyInfo; SOGoMailBodyPart *bodyPart; } - (void) setBodyInfo: (NSDictionary *) newBodyInfo; - (void) setBodyPart: (SOGoMailBodyPart *) newBodyPart; @end #endif /* MAPISTOREMAILATTACHMENT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreSOGoObject.m0000644000000000000000000001204712247657026017010 0ustar rootroot/* MAPIStoreObject.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import "MAPIStoreContext.h" #import "MAPIStoreFolder.h" #import "MAPIStorePropertySelectors.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSDate+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreSOGoObject.h" #undef DEBUG #include #include #include #include #include @implementation MAPIStoreSOGoObject static Class MAPIStoreFolderK; + (void) initialize { MAPIStoreFolderK = [MAPIStoreFolder class]; } + (id) mapiStoreObjectWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newContainer { id newObject; newObject = [[self alloc] initWithSOGoObject: newSOGoObject inContainer: newContainer]; [newObject autorelease]; return newObject; } - (id) init { if ((self = [super init])) { sogoObject = nil; isNew = NO; } // [self logWithFormat: @"-init"]; return self; } - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newContainer { if ((self = [self initInContainer: newContainer])) { ASSIGN (sogoObject, newSOGoObject); } return self; } - (void) dealloc { // [self logWithFormat: @"-dealloc"]; [sogoObject release]; [super dealloc]; } - (void) setIsNew: (BOOL) newIsNew { isNew = newIsNew; } - (BOOL) isNew { return isNew; } - (id) sogoObject { return sogoObject; } - (MAPIStoreObject *) container { return container; } - (NSString *) nameInContainer { return [sogoObject nameInContainer]; } - (void) cleanupCaches { } /* helpers */ - (uint64_t) objectId { return [container idForObjectWithKey: [sogoObject nameInContainer]]; } /* getters */ - (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject displayName] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagSearchKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [sogoObject nameInContainer]; *data = [[stringValue dataUsingEncoding: NSASCIIStringEncoding] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagGenerateExchangeViews: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidTagParentSourceKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getReplicaKey: data fromGlobCnt: [container objectId] >> 16 inMemCtx: memCtx]; } - (int) getPidTagSourceKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getReplicaKey: data fromGlobCnt: [self objectId] >> 16 inMemCtx: memCtx]; } /* helper getters */ - (int) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; uint64_t obVersion; obVersion = [self objectVersion]; if (obVersion == ULLONG_MAX) rc = MAPISTORE_ERR_NOT_FOUND; else rc = [self getReplicaKey: data fromGlobCnt: obVersion inMemCtx: memCtx]; return rc; } - (int) getPidTagChangeNumber: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; uint64_t obVersion; obVersion = [self objectVersion]; if (obVersion == ULLONG_MAX) rc = MAPISTORE_ERR_NOT_FOUND; else { *data = MAPILongLongValue (memCtx, ((obVersion << 16) | 0x0001)); rc = MAPISTORE_SUCCESS; } return rc; } /* subclasses */ - (uint64_t) objectVersion { [self subclassResponsibility: _cmd]; return ULLONG_MAX; } /* logging */ - (NSString *) loggingPrefix { return [NSString stringWithFormat:@"<%@:%p:%@>", NSStringFromClass (isa), self, [self nameInContainer]]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreContactsContext.h0000644000000000000000000000211412247657026020162 0ustar rootroot/* MAPIStoreContactsContext.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTORECONTACTSCONTEXT_H #define MAPISTORECONTACTSCONTEXT_H #import "MAPIStoreGCSBaseContext.h" @interface MAPIStoreContactsContext : MAPIStoreGCSBaseContext @end #endif /* MAPISTORECONTACTSCONTEXT_H */ SOGo-2.1.1b/OpenChange/samba-get-config.py0000755000000000000000000000016712247657027016671 0ustar rootroot#!/usr/bin/python import sys import samba.param a = samba.param.LoadParm() a.load_default() print a.get(sys.argv[1]) SOGo-2.1.1b/OpenChange/plreader.m0000644000000000000000000000301312247657027015156 0ustar rootroot/* plreader.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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. */ /* A format-agnostic property list dumper. Usage: plreader [filename] */ #import #import #import #import "NSObject+PropertyList.m" static void PLReaderDumpPListFile (NSString *filename) { NSData *content; content = [NSData dataWithContentsOfFile: filename]; OCDumpPListData (content); } int main() { NSAutoreleasePool *p; NSProcessInfo *pi; NSArray *arguments; p = [NSAutoreleasePool new]; pi = [NSProcessInfo processInfo]; arguments = [pi arguments]; if ([arguments count] > 1) PLReaderDumpPListFile ([arguments objectAtIndex: 1]); [p release]; return 0; } SOGo-2.1.1b/OpenChange/MAPIStoreFallbackContext.h0000644000000000000000000000211212247657026020101 0ustar rootroot/* MAPIStoreFallbackContext.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTOREFALLBACKCONTEXT_H #define MAPISTOREFALLBACKCONTEXT_H #import "MAPIStoreDBBaseContext.h" @interface MAPIStoreFallbackContext : MAPIStoreDBBaseContext @end #endif /* MAPISTOREFALLBACKCONTEXT_H */ SOGo-2.1.1b/OpenChange/EOBitmaskQualifier.m0000644000000000000000000000314112247657026017041 0ustar rootroot/* EOBitmaskQualifier.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 "EOBitmaskQualifier.h" @implementation EOBitmaskQualifier - (id) initWithKey: (NSString *) newKey mask: (uint32_t) newMask isZero: (BOOL) newIsZero { if ((self = [self init])) { ASSIGN (key, newKey); isZero = newIsZero; mask = newMask; } return self; } - (void) dealloc { [key release]; [super dealloc]; } - (NSString *) key { return key; } - (uint32_t ) mask { return mask; } - (BOOL) isZero { return isZero; } - (NSString *) description { NSMutableString *desc; desc = [NSMutableString stringWithCapacity: [key length] + 24]; if (isZero) [desc appendString: @"!"]; [desc appendFormat: @"(%@ & 0x%.8x)", key, mask]; return desc; } @end SOGo-2.1.1b/OpenChange/SOGoMAPIObject.m0000644000000000000000000000336412247657026015775 0ustar rootroot/* SOGoMAPIObject.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 3, 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 "SOGoMAPIObject.h" @implementation SOGoMAPIObject - (id) init { if ((self = [super init])) { isNew = NO; creationDate = [NSCalendarDate date]; [creationDate retain]; lastModified = [creationDate copy]; properties = [NSMutableDictionary new]; } return self; } - (void) dealloc { [creationDate release]; [lastModified release]; [properties release]; [super dealloc]; } - (void) setIsNew: (BOOL) newIsNew { isNew = newIsNew; } - (BOOL) isNew { return isNew; } - (void) adjustLastModified { ASSIGN (lastModified, [NSCalendarDate date]); } - (BOOL) isFolderish { return NO; } - (NSMutableDictionary *) properties { return properties; } - (NSCalendarDate *) creationDate { return creationDate; } - (NSCalendarDate *) lastModified { return lastModified; } @end SOGo-2.1.1b/OpenChange/MAPIStoreTasksContext.h0000644000000000000000000000207512247657026017477 0ustar rootroot/* MAPIStoreTasksContext.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTORETASKSCONTEXT_H #define MAPISTORETASKSCONTEXT_H #import "MAPIStoreGCSBaseContext.h" @interface MAPIStoreTasksContext : MAPIStoreGCSBaseContext @end #endif /* MAPISTORETASKSCONTEXT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreContactsMessageTable.m0000644000000000000000000001660212247657026021106 0ustar rootroot/* MAPIStoreContactsMessageTable.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import #import "MAPIStoreContactsMessage.h" #import "MAPIStoreTypes.h" #import "NSDate+MAPIStore.h" #import "NSArray+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreContactsMessageTable.h" #include static Class MAPIStoreContactsMessageK, NGMailAddressK, NSDataK, NSStringK; @implementation MAPIStoreContactsMessageTable + (void) initialize { MAPIStoreContactsMessageK = [MAPIStoreContactsMessage class]; NSDataK = [NSData class]; NSStringK = [NSString class]; NGMailAddressK = [NGMailAddress class]; } + (Class) childObjectClass { return MAPIStoreContactsMessageK; } - (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property { static NSMutableDictionary *knownProperties = nil; if (!knownProperties) { knownProperties = [NSMutableDictionary new]; [knownProperties setObject: @"c_mail" forKey: MAPIPropertyKey (PidLidEmail1EmailAddress)]; [knownProperties setObject: @"c_mail" forKey: MAPIPropertyKey (PidLidEmail2EmailAddress)]; [knownProperties setObject: @"c_mail" forKey: MAPIPropertyKey (PidLidEmail3EmailAddress)]; [knownProperties setObject: @"c_cn" forKey: MAPIPropertyKey (PidLidFileUnder)]; [knownProperties setObject: @"c_cn" forKey: MAPIPropertyKey (PidTagDisplayName)]; [knownProperties setObject: @"c_cn" forKey: MAPIPropertyKey (PidTagSubject)]; } return [knownProperties objectForKey: MAPIPropertyKey (property)]; } /* restrictions */ - (MAPIRestrictionState) evaluatePropertyRestriction: (struct mapi_SPropertyRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; EOAndQualifier *andQualifier; EOKeyValueQualifier *fullNameQualifier, *emailQualifier; NSString *fullName, *email; SEL operator; id value, ngAddress; value = NSObjectFromMAPISPropValue (&res->lpProp); switch ((uint32_t) res->ulPropTag) { case PR_MESSAGE_CLASS_UNICODE: if ([value isEqualToString: @"IPM.Contact"]) rc = MAPIRestrictionStateAlwaysTrue; else rc = MAPIRestrictionStateAlwaysFalse; break; case PR_SENSITIVITY: rc = MAPIRestrictionStateAlwaysTrue; break; case PidLidAddressBookProviderArrayType: case PidLidAddressBookProviderEmailList: /* FIXME: this is a hack. We should return a real qualifier here */ rc = MAPIRestrictionStateAlwaysTrue; break; case PidLidEmail1OriginalDisplayName: case PidLidEmail2OriginalDisplayName: case PidLidEmail3OriginalDisplayName: rc = MAPIRestrictionStateAlwaysFalse; value = NSObjectFromMAPISPropValue (&res->lpProp); if (value && [value isKindOfClass: NSStringK]) { rc = MAPIRestrictionStateNeedsEval; ngAddress = [[NGMailAddressParser mailAddressParserWithString: value] parse]; if ([ngAddress isKindOfClass: NGMailAddressK]) { operator = [self operatorFromRestrictionOperator: res->relop]; fullName = [ngAddress displayName]; email = [ngAddress address]; emailQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_mail" operatorSelector: operator value: email]; if ([fullName length] > 0) { fullNameQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_cn" operatorSelector: operator value: fullName]; andQualifier = [[EOAndQualifier alloc] initWithQualifiers: emailQualifier, fullNameQualifier, nil]; [fullNameQualifier release]; [emailQualifier release]; *qualifier = andQualifier; } else *qualifier = emailQualifier; [*qualifier autorelease]; } } break; case PidLidEmail1AddressType: case PidLidEmail2AddressType: case PidLidEmail3AddressType: if ([value isEqualToString: @"SMTP"]) rc = MAPIRestrictionStateAlwaysTrue; else rc = MAPIRestrictionStateAlwaysFalse; break; default: rc = [super evaluatePropertyRestriction: res intoQualifier: qualifier]; } return rc; } - (MAPIRestrictionState) evaluateContentRestriction: (struct mapi_SContentRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; id value; value = NSObjectFromMAPISPropValue (&res->lpProp); if ([value isKindOfClass: NSDataK]) { value = [[NSString alloc] initWithData: value encoding: NSUTF8StringEncoding]; [value autorelease]; } else if (![value isKindOfClass: NSStringK]) [NSException raise: @"MAPIStoreTypeConversionException" format: @"unhandled content restriction for class '%@'", NSStringFromClass ([value class])]; switch (res->ulPropTag) { case PR_MESSAGE_CLASS_UNICODE: /* FIXME: should make use of c_component here */ if ([value isEqualToString: @"IPM.Contact"]) rc = MAPIRestrictionStateAlwaysTrue; else rc = MAPIRestrictionStateAlwaysFalse; break; default: rc = [super evaluateContentRestriction: res intoQualifier: qualifier]; } return rc; } /* sorting */ - (NSString *) sortIdentifierForProperty: (enum MAPITAGS) property { static NSMutableDictionary *knownProperties = nil; if (!knownProperties) { knownProperties = [NSMutableDictionary new]; [knownProperties setObject: @"c_cn" forKey: MAPIPropertyKey (PidLidFileUnder)]; [knownProperties setObject: @"c_cn" forKey: MAPIPropertyKey (PidTagDisplayName)]; [knownProperties setObject: @"c_cn" forKey: MAPIPropertyKey (PidTagSubject)]; [knownProperties setObject: @"c_cn" forKey: MAPIPropertyKey (PidTagNormalizedSubject)]; } return [knownProperties objectForKey: MAPIPropertyKey (property)]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreFAIMessage.m0000644000000000000000000000403312247657026016752 0ustar rootroot/* MAPIStoreFAIMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 "MAPIStoreActiveTables.h" #import "MAPIStoreContext.h" #import "MAPIStoreUserContext.h" #import "NSObject+MAPIStore.h" #import "MAPIStoreFAIMessage.h" #undef DEBUG #include #include #include #include #include @implementation MAPIStoreFAIMessage - (NSArray *) activeContainerMessageTables { return [[MAPIStoreActiveTables activeTables] activeTablesForFMID: [container objectId] andType: MAPISTORE_FAI_TABLE]; } - (int) getPidTagAssociated: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (enum mapistore_error) saveMessage: (TALLOC_CTX *) memCtx; { enum mapistore_error rc; MAPIStoreContext *context; SOGoUser *ownerUser; context = [self context]; ownerUser = [[self userContext] sogoUser]; if ([[context activeUser] isEqual: ownerUser]) rc = [super saveMessage: memCtx]; else rc = MAPISTORE_ERR_DENIED; return rc; } - (BOOL) subscriberCanReadMessage { return NO; } - (BOOL) subscriberCanModifyMessage { return NO; } @end SOGo-2.1.1b/OpenChange/NSDate+MAPIStore.h0000644000000000000000000000261412247657026016235 0ustar rootroot/* NSDate+MAPIStore.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 NSCALENDARDATE_MAPISTORE_H #define NSCALENDARDATE_MAPISTORE_H #import @class NSCalendarDate; @interface NSDate (MAPIStoreDataTypes) + (NSCalendarDate *) dateFromMinutesSince1601: (uint32_t) minutes; - (uint32_t) asMinutesSince1601; + (id) dateFromFileTime: (const struct FILETIME *) timeValue; - (struct FILETIME *) asFileTimeInMemCtx: (void *) memCtx; - (BOOL) isNever; /* occurs on 4500-12-31 */ @end NSComparisonResult NSDateCompare (id date1, id date2, void *); #endif /* NSCALENDARDATE+MAPISTORE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreCalendarMessageTable.m0000644000000000000000000001501312247657026021034 0ustar rootroot/* MAPIStoreCalendarMessageTable.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 #import #import #import "MAPIStoreCalendarMessage.h" #import "MAPIStoreTypes.h" #import "NSDate+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreCalendarMessageTable.h" #include static Class MAPIStoreCalendarMessageK = Nil; @implementation MAPIStoreCalendarMessageTable + (void) initialize { MAPIStoreCalendarMessageK = [MAPIStoreCalendarMessage class]; } + (Class) childObjectClass { return MAPIStoreCalendarMessageK; } - (EOQualifier *) _orgMailNotNullQualifier { static EOQualifier *orgMailQualifier = nil; EOQualifier *notNullQualifier, *nullQualifier, *notEmptyQualifier, *emptyQualifier; if (!orgMailQualifier) { nullQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_orgmail" operatorSelector: EOQualifierOperatorEqual value: [NSNull null]]; notNullQualifier = [[EONotQualifier alloc] initWithQualifier: nullQualifier]; emptyQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_orgmail" operatorSelector: EOQualifierOperatorEqual value: @""]; notEmptyQualifier = [[EONotQualifier alloc] initWithQualifier: emptyQualifier]; orgMailQualifier = [[EOAndQualifier alloc] initWithQualifiers: notNullQualifier, notEmptyQualifier, nil]; [nullQualifier release]; [notNullQualifier release]; [emptyQualifier release]; [notEmptyQualifier release]; } return orgMailQualifier; } - (MAPIRestrictionState) evaluatePropertyRestriction: (struct mapi_SPropertyRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; id value; NSMutableString *likeString; NSString *likePartString; EOAndQualifier *andQualifier, *stringQualifier; union { uint32_t longValue; char charValue[4]; } apptIdValue; value = NSObjectFromMAPISPropValue (&res->lpProp); switch ((uint32_t) res->ulPropTag) { case PR_MESSAGE_CLASS_UNICODE: if ([value isEqualToString: @"IPM.Appointment"]) rc = MAPIRestrictionStateAlwaysTrue; else rc = MAPIRestrictionStateAlwaysFalse; break; case PR_OWNER_APPT_ID: // c_orgmail != NULL && c_orgmail != '' && c_uid like 'ab%89'; apptIdValue.longValue = [value unsignedLongValue]; likeString = [NSMutableString string]; likePartString = [[NSString alloc] initWithBytes: apptIdValue.charValue length: 2 encoding: NSISOLatin1StringEncoding]; [likeString appendString: likePartString]; [likePartString release]; [likeString appendString: @"%%"]; likePartString = [[NSString alloc] initWithBytes: apptIdValue.charValue + 2 length: 2 encoding: NSISOLatin1StringEncoding]; [likeString appendString: likePartString]; [likePartString release]; stringQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_uid" operatorSelector: EOQualifierOperatorLike value: likeString]; andQualifier = [[EOAndQualifier alloc] initWithQualifiers: [self _orgMailNotNullQualifier], stringQualifier, nil]; [andQualifier autorelease]; [stringQualifier release]; *qualifier = andQualifier; rc = MAPIRestrictionStateNeedsEval; break; case PidLidBusyStatus: rc = MAPIRestrictionStateAlwaysTrue; // should be based on c_isopaque break; default: rc = [super evaluatePropertyRestriction: res intoQualifier: qualifier]; } return rc; } - (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property { static NSMutableDictionary *knownProperties = nil; if (!knownProperties) { knownProperties = [NSMutableDictionary new]; [knownProperties setObject: @"c_startdate" forKey: MAPIPropertyKey (PidLidAppointmentStartWhole)]; [knownProperties setObject: @"c_enddate" forKey: MAPIPropertyKey (PidLidAppointmentEndWhole)]; [knownProperties setObject: @"c_iscycle" forKey: MAPIPropertyKey (PidLidRecurring)]; } return [knownProperties objectForKey: MAPIPropertyKey (property)]; } /* sorting */ - (NSString *) sortIdentifierForProperty: (enum MAPITAGS) property { static NSMutableDictionary *knownProperties = nil; if (!knownProperties) { knownProperties = [NSMutableDictionary new]; [knownProperties setObject: @"c_startdate" forKey: MAPIPropertyKey (PidLidAppointmentStartWhole)]; [knownProperties setObject: @"c_enddate" forKey: MAPIPropertyKey (PidLidAppointmentEndWhole)]; [knownProperties setObject: @"c_iscycle" forKey: MAPIPropertyKey (PidLidRecurring)]; [knownProperties setObject: @"c_isallday" forKey: MAPIPropertyKey (PidLidAppointmentSubType)]; [knownProperties setObject: @"c_creationdate" forKey: MAPIPropertyKey (PR_CREATION_TIME)]; [knownProperties setObject: @"c_uid" forKey: MAPIPropertyKey (PR_OWNER_APPT_ID)]; } return [knownProperties objectForKey: MAPIPropertyKey (property)]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreFolderTable.m0000644000000000000000000000574612247657026017245 0ustar rootroot/* MAPIStoreFolderTable.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 "MAPIStoreFolder.h" #import "MAPIStoreTypes.h" #import "MAPIStoreFolderTable.h" #undef DEBUG #include #include #include @implementation MAPIStoreFolderTable - (id) init { if ((self = [super init])) { tableType = MAPISTORE_FOLDER_TABLE; } return self; } - (NSArray *) childKeys { if (!childKeys) { childKeys = [(MAPIStoreFolder *) container folderKeysMatchingQualifier: nil andSortOrderings: sortOrderings]; [childKeys retain]; } return childKeys; } - (NSArray *) restrictedChildKeys { NSArray *keys; /* FIXME: restrictions are ignored on folder tables */ if (!restrictedChildKeys) { if (restrictionState != MAPIRestrictionStateAlwaysTrue) { if (restrictionState == MAPIRestrictionStateNeedsEval) keys = [(MAPIStoreFolder *) container folderKeysMatchingQualifier: restriction andSortOrderings: sortOrderings]; else keys = [NSArray array]; } else keys = [self childKeys]; ASSIGN (restrictedChildKeys, keys); } return restrictedChildKeys; } - (MAPIRestrictionState) evaluatePropertyRestriction: (struct mapi_SPropertyRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; switch ((uint32_t) res->ulPropTag) { /* HACK: we cheat here as we current have no mechanism for searching folders based on PR_CHANGE_NUM, which is used by the oxcfxics mechanism... */ case PidTagChangeNumber: rc = MAPIRestrictionStateAlwaysTrue; break; default: rc = [super evaluatePropertyRestriction: res intoQualifier: qualifier]; } return rc; } - (id) lookupChild: (NSString *) childKey { return [(MAPIStoreFolder *) container lookupFolder: childKey]; } - (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property { return nil; } @end SOGo-2.1.1b/OpenChange/GCSSpecialQueries+OpenChange.m0000644000000000000000000000616112247657026020644 0ustar rootroot/* GCSSpecialQueries+OpenChange.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 3, 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 "GCSSpecialQueries+OpenChange.h" @interface GCSPostgreSQLSpecialQueries (OpenChangeHelpers) @end @interface GCSMySQLSpecialQueries (OpenChangeHelpers) @end @interface GCSOracleSpecialQueries (OpenChangeHelpers) @end @implementation GCSSpecialQueries (OpenChangeHelpers) /* FIXME: c_parent_path should be indexed */ - (NSString *) createOpenChangeFSTableWithName: (NSString *) tableName { [self subclassResponsibility: _cmd]; return nil; } @end @implementation GCSPostgreSQLSpecialQueries (OpenChangeHelpers) - (NSString *) createOpenChangeFSTableWithName: (NSString *) tableName { static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (" @" c_path VARCHAR(255) PRIMARY KEY," @" c_parent_path VARCHAR(255)," @" c_type SMALLINT NOT NULL," @" c_creationdate INT4 NOT NULL," @" c_lastmodified INT4 NOT NULL," @" c_version INT4 NOT NULL DEFAULT 0," @" c_deleted SMALLINT NOT NULL DEFAULT 0," @" c_content TEXT)"); return [NSString stringWithFormat: sqlFolderFormat, tableName]; } @end @implementation GCSMySQLSpecialQueries (OpenChangeHelpers) - (NSString *) createOpenChangeFSTableWithName: (NSString *) tableName { static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (" @" c_path VARCHAR(255) PRIMARY KEY," @" c_parent_path VARCHAR(255)," @" c_type TINYINT NOT NULL," @" c_creationdate INT NOT NULL," @" c_lastmodified INT NOT NULL," @" c_version INT NOT NULL DEFAULT 0," @" c_deleted TINYINT NOT NULL DEFAULT 0," @" c_content LONGTEXT)"); return [NSString stringWithFormat: sqlFolderFormat, tableName]; } @end @implementation GCSOracleSpecialQueries (OpenChangeHelpers) - (NSString *) createOpenChangeFSTableWithName: (NSString *) tableName { static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (" @" c_path VARCHAR2(255) PRIMARY KEY," @" c_parent_path VARCHAR2(255)," @" c_type SMALLINT NOT NULL," @" c_creationdate INT4 NOT NULL," @" c_lastmodified INT4 NOT NULL," @" c_version INT4 NOT NULL DEFAULT 0," @" c_deleted SMALLINT NOT NULL DEFAULT 0," @" c_content CLOB)"); return [NSString stringWithFormat: sqlFolderFormat, tableName]; } @end SOGo-2.1.1b/OpenChange/BSONCodec.m0000644000000000000000000003436212247657026015071 0ustar rootroot// // BSONCodec.m // BSON Codec for Objective-C. // // Created by Martin Kou on 8/17/10. // MIT License, see LICENSE file for details. // #import "BSONCodec.h" #import #import #import #define BSONTYPE(tag,className) [className class], [NSNumber numberWithChar: (tag)] #ifndef objc_msgSend #define objc_msgSend(obj, sel, ...) \ objc_msg_lookup(obj, sel)(obj, sel, ## __VA_ARGS__) #endif static NSDictionary *BSONTypes() { static NSDictionary *retval = nil; if (retval == nil) { retval = [[NSDictionary dictionaryWithObjectsAndKeys: BSONTYPE(0x01, NSNumber), BSONTYPE(0x02, NSString), BSONTYPE(0x03, NSDictionary), BSONTYPE(0x04, NSArray), BSONTYPE(0x05, NSData), BSONTYPE(0x08, NSNumber), BSONTYPE(0x0A, NSNull), BSONTYPE(0x10, NSNumber), BSONTYPE(0x11, NSCalendarDate), BSONTYPE(0x12, NSNumber), nil] retain]; } return retval; } #define SWAP16(x) \ ((uint16_t)((((uint16_t)(x) & 0xff00) >> 8) | \ (((uint16_t)(x) & 0x00ff) << 8))) #define SWAP32(x) \ ((uint32_t)((((uint32_t)(x) & 0xff000000) >> 24) | \ (((uint32_t)(x) & 0x00ff0000) >> 8) | \ (((uint32_t)(x) & 0x0000ff00) << 8) | \ (((uint32_t)(x) & 0x000000ff) << 24))) #define SWAP64(x) \ ((uint64_t)((((uint64_t)(x) & 0xff00000000000000ULL) >> 56) | \ (((uint64_t)(x) & 0x00ff000000000000ULL) >> 40) | \ (((uint64_t)(x) & 0x0000ff0000000000ULL) >> 24) | \ (((uint64_t)(x) & 0x000000ff00000000ULL) >> 8) | \ (((uint64_t)(x) & 0x00000000ff000000ULL) << 8) | \ (((uint64_t)(x) & 0x0000000000ff0000ULL) << 24) | \ (((uint64_t)(x) & 0x000000000000ff00ULL) << 40) | \ (((uint64_t)(x) & 0x00000000000000ffULL) << 56))) #if BYTE_ORDER == LITTLE_ENDIAN #define BSONTOHOST16(x) (x) #define BSONTOHOST32(x) (x) #define BSONTOHOST64(x) (x) #define HOSTTOBSON16(x) (x) #define HOSTTOBSON32(x) (x) #define HOSTTOBSON64(x) (x) #elif BYTE_ORDER == BIG_ENDIAN #define BSONTOHOST16(x) SWAP16(x) #define BSONTOHOST32(x) SWAP32(x) #define BSONTOHOST64(x) SWAP64(x) #define HOSTTOBSON16(x) SWAP16(x) #define HOSTTOBSON32(x) SWAP16(x) #define HOSTTOBSON64(x) SWAP16(x) #endif #define CLASS_NAME_MARKER @"$$__CLASS_NAME__$$" @implementation NSObject (BSONObjectCoding) - (NSData *) BSONEncode { if (![self conformsToProtocol: @protocol(BSONObjectCoding)]) [NSException raise: NSInvalidArgumentException format: @"BSON encoding is only valid on objects conforming to the BSONObjectEncoding protocol."]; id myself = (id ) self; NSMutableDictionary *values = [[myself BSONDictionary] mutableCopy]; #if (defined(__GNU_LIBOBJC__) && (__GNU_LIBOBJC__ >= 20100911)) || defined(APPLE_RUNTIME) || defined(__GNUSTEP_RUNTIME__) const char* className = class_getName([self class]); #else const char* className = [self class]->name; #endif [values setObject: [NSData dataWithBytes: (void *)className length: strlen(className)] forKey: CLASS_NAME_MARKER]; NSData *retval = [values BSONEncode]; [values release]; return retval; } - (NSData *) BSONRepresentation { return [self BSONEncode]; } @end @implementation NSDictionary (BSON) - (uint8_t) BSONTypeID { return 0x03; } - (NSData *) BSONEncode { // Initialize the components structure. NSMutableArray *components = [[NSMutableArray alloc] init]; NSMutableData *lengthData = [[NSMutableData alloc] initWithLength: 4]; [components addObject: lengthData]; [lengthData release]; NSMutableData *contentsData = [[NSMutableData alloc] init]; [components addObject: contentsData]; [contentsData release]; [components addObject: [NSData dataWithBytes: "\x00" length: 1]]; // Ensure ordered keys. not in BSON spec, but ensures all BSONRepresentations // of the same dict will be the same. NSMutableArray *keys = [[NSMutableArray alloc] init]; [keys addObjectsFromArray: [self allKeys]]; //[keys sortUsingSelector: @selector(caseInsensitiveCompare:)]; // Encode data.- (NSData *) BSONEncode; uint8_t elementType = 0; int i; for (i = 0; i < [keys count]; i++) { NSString *key = [keys objectAtIndex: i]; NSObject *value = [self objectForKey: key]; if ([value respondsToSelector: @selector(BSONTypeID)]) elementType = [(id ) value BSONTypeID]; else elementType = 3; [contentsData appendBytes: &elementType length: 1]; [contentsData appendData: [key dataUsingEncoding: NSUTF8StringEncoding]]; [contentsData appendBytes: "\x00" length: 1]; [contentsData appendData: [value BSONEncode]]; } [keys release]; // Write length. uint32_t *length = (uint32_t *)[lengthData mutableBytes]; *length = HOSTTOBSON32([contentsData length]) + 4 + 1; // Assemble the output data. NSMutableData *retval = [NSMutableData data]; for (i = 0; i < [components count]; i++) [retval appendData: [components objectAtIndex: i]]; [components release]; return retval; } - (NSData *) BSONRepresentation { return [self BSONEncode]; } + (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) t { const void *current = [data bytes]; if ((id)base != nil) current = *base; else base = ¤t; uint32_t length = BSONTOHOST32(*((uint32_t *)current)); const void *endPoint = current + length; current += 4; NSMutableDictionary *retval = [NSMutableDictionary dictionary]; while (current < endPoint - 1) { uint8_t typeID = *((uint8_t *)current); current++; char *utf8Key = (char *) current; while (*((char *)current) != 0 && current < endPoint - 1) current++; current++; NSString *key = [NSString stringWithUTF8String: utf8Key]; *base = current; Class typeClass = [BSONTypes() objectForKey: [NSNumber numberWithChar: typeID]]; id value = objc_msgSend(typeClass, @selector(BSONFragment:at:ofType:), data, base, typeID); current = *base; [retval setObject: value forKey: key]; } *base = current + 1; // If the dictionary has a class name marker, then it is to be converted to an object. if ([retval objectForKey: CLASS_NAME_MARKER] != nil) { NSData *classNameData = [retval objectForKey: CLASS_NAME_MARKER]; char *className = malloc([classNameData length] + 1); memcpy(className, [classNameData bytes], [classNameData length]); className[[classNameData length]] = 0; Class targetClass = objc_getClass(className); if (targetClass == nil) [NSException raise: NSInvalidArgumentException format: @"Class %s found in incoming data is undefined.", className]; id obj = [[targetClass alloc] initWithBSONDictionary: retval]; return obj; } return retval; } @end @implementation NSData (BSON) - (uint8_t) BSONTypeID { return 0x05; } - (NSData *) BSONEncode { uint32_t length = HOSTTOBSON32([self length]); NSMutableData *retval = [NSMutableData data]; [retval appendBytes: &length length: 4]; [retval appendBytes: "\x00" length: 1]; [retval appendData: self]; return retval; } - (NSData *) BSONRepresentation { return [self BSONEncode]; } + (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) t { const void *current = [data bytes]; if ((id)base != nil) current = *base; else base = ¤t; uint32_t length = BSONTOHOST32(*((uint32_t *)current)); current += 4 + 1; NSData *retval = [NSData dataWithBytes: current length: length]; current += length; *base = current; return retval; } - (NSDictionary *) BSONValue { return [NSDictionary BSONFragment: self at: NULL ofType: 0x03]; } @end @implementation NSNumber (BSON) - (uint8_t) BSONTypeID { const char encoding = tolower(*([self objCType])); switch (encoding) { case 'f': case 'd': return 0x01; case 'b': return 0x08; case 'c': case 's': return 0x10; case 'i': // Ok, if you're running Objective-C on 16-bit platforms... // Then YOU have issues. // So, yeah, we won't handle that case. if (sizeof(int) == 4) return 0x10; else if (sizeof(int) == 8) return 0x12; case 'l': if (sizeof(long) == 4) return 0x10; else if (sizeof(long) == 8) return 0x12; case 'q': return 0x12; default: [NSException raise: NSInvalidArgumentException format: @"%@::%s - invalid encoding type '%c'", [self class], _cmd, encoding]; } return 0; } - (NSData *) BSONEncode { const char encoding = *([self objCType]); if (encoding == 'd' || encoding == 'D') { double value = [self doubleValue]; return [NSData dataWithBytes: &value length: 8]; } if (encoding == 'f' || encoding == 'F') { double value = [self floatValue]; return [NSData dataWithBytes: &value length: 8]; } if (encoding == 'b' || encoding == 'B') { char value = [self boolValue]; return [NSData dataWithBytes: &value length: 1]; } if (encoding == 'c' || encoding == 'C') { int32_t value = [self charValue]; value = HOSTTOBSON32(value); return [NSData dataWithBytes: &value length: 4]; } if (encoding == 's' || encoding == 'S') { int32_t value = [self shortValue]; value = HOSTTOBSON32(value); return [NSData dataWithBytes: &value length: 4]; } if (encoding == 'i' || encoding == 'I') { int value = [self intValue]; if (sizeof(int) == 4) value = HOSTTOBSON32(value); else if (sizeof(int) == 8) value = HOSTTOBSON64(value); return [NSData dataWithBytes: &value length: sizeof(int)]; } if (encoding == 'l' || encoding == 'L') { long value = [self longValue]; if (sizeof(long) == 4) value = HOSTTOBSON32(value); else if (sizeof(long) == 8) value = HOSTTOBSON64(value); return [NSData dataWithBytes: &value length: sizeof(long)]; } if (encoding == 'q') { long long value = HOSTTOBSON64([self longLongValue]); return [NSData dataWithBytes: &value length: 8]; } if (encoding == 'Q') { long long value = HOSTTOBSON64([self unsignedLongLongValue]); return [NSData dataWithBytes: &value length: 8]; } [NSException raise: NSInvalidArgumentException format: @"%@::%s - invalid encoding type '%c'", [self class], _cmd, encoding]; return nil; } - (NSData *) BSONRepresentation { return [self BSONEncode]; } + (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) t { if (t == 0x01) { // #5: LLVM GCC requires double pointers to have a certain alignment in ARM CPUs. // So we can't just read the double off directly from the data - need to copy it. double value; memcpy(&value, *base, sizeof(double)); *base += 8; return [NSNumber numberWithDouble: value]; } if (t == 0x08) { char value = ((char *) *base)[0]; *base += 1; return [NSNumber numberWithBool: value]; } if (t == 0x10) { int32_t value = BSONTOHOST32(((int32_t *) *base)[0]); *base += 4; if (sizeof(int) == 4) return [NSNumber numberWithInt: value]; return [NSNumber numberWithLong: value]; } if (t == 0x12) { int64_t value = BSONTOHOST64(((int64_t *) *base)[0]); *base += 8; return [NSNumber numberWithUnsignedLongLong: value]; } return nil; } @end @implementation NSString (BSON) - (uint8_t) BSONTypeID { return 0x02; } - (NSData *) BSONEncode { NSData *utf8Data = [self dataUsingEncoding: NSUTF8StringEncoding]; uint32_t length = HOSTTOBSON32([utf8Data length] + 1); NSMutableData *retval = [NSMutableData data]; [retval appendBytes: &length length: 4]; [retval appendData: utf8Data]; [retval appendBytes: "\x00" length: 1]; return retval; } - (NSData *) BSONRepresentation { return [self BSONEncode]; } + (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID { uint32_t length = BSONTOHOST32(((const uint32_t *) *base)[0]); *base += 4; const char *utf8Str = (const char *) *base; *base += length; return [NSString stringWithUTF8String: utf8Str]; } @end @implementation NSArray (BSON) - (uint8_t) BSONTypeID { return 0x04; } - (NSData *) BSONEncode { // Initialize the components structure. NSMutableArray *components = [[NSMutableArray alloc] init]; NSMutableData *lengthData = [[NSMutableData alloc] initWithLength: 4]; [components addObject: lengthData]; [lengthData release]; NSMutableData *contentsData = [[NSMutableData alloc] init]; [components addObject: contentsData]; [contentsData release]; [components addObject: [NSData dataWithBytes: "\x00" length: 1]]; // Encode data. uint8_t elementType = 0; int i, count = [self count]; for (i = 0 ; i < count ; i++) { NSObject *value = [self objectAtIndex: i]; if ([value respondsToSelector: @selector(BSONTypeID)]) elementType = [(id ) value BSONTypeID]; else elementType = 3; [contentsData appendBytes: &elementType length: 1]; [contentsData appendData: [[NSString stringWithFormat: @"%d", i] dataUsingEncoding: NSUTF8StringEncoding]]; [contentsData appendBytes: "\x00" length: 1]; [contentsData appendData: [value BSONEncode]]; } // Write length. uint32_t *length = (uint32_t *)[lengthData mutableBytes]; *length = HOSTTOBSON32([contentsData length]) + 4 + 1; // Assemble the output data. NSMutableData *retval = [NSMutableData data]; for (i = 0; i < [components count]; i++) [retval appendData: [components objectAtIndex: i]]; [components release]; return retval; } - (NSData *) BSONRepresentation { return [self BSONEncode]; } + (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID { NSDictionary *tmp = [NSDictionary BSONFragment: data at: base ofType: 0x03]; NSMutableArray *retval = [NSMutableArray arrayWithCapacity: [tmp count]]; int i; for (i = 0; i < [tmp count]; i++) [retval addObject: [tmp objectForKey: [NSString stringWithFormat: @"%d", i]]]; return retval; } @end @implementation NSNull (BSON) - (uint8_t) BSONTypeID { return 0x0a; } - (NSData *) BSONEncode { return [NSData data]; } - (NSData *) BSONRepresentation { return [self BSONEncode]; } + (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID { return [NSNull null]; } @end @implementation NSCalendarDate (BSON) - (uint8_t) BSONTypeID { return 0x11; } - (NSData *) BSONEncode { NSString *v; v = [self descriptionWithCalendarFormat: @"%Y-%m-%d %H:%M:%S %Z" locale: nil]; return [v BSONEncode]; } - (NSData *) BSONRepresentation { return [self BSONEncode]; } + (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID { NSString *v; v = [NSString BSONFragment: data at: base ofType: 0x02]; return [NSCalendarDate dateWithString: v calendarFormat: @"%Y-%m-%d %H:%M:%S %Z"]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreMailVolatileMessage.h0000644000000000000000000000220512247657026020727 0ustar rootroot/* MAPIStoreMailVolatileMessage.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 MAPISTOREMAILVOLATILEMESSAGE_H #define MAPISTOREMAILVOLATILEMESSAGE_H #import "MAPIStoreMessage.h" @interface MAPIStoreMailVolatileMessage : MAPIStoreMessage - (int) submitWithFlags: (enum SubmitFlags) flags; @end #endif /* MAPISTOREMAILVOLATILEMESSAGE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreMIME.h0000644000000000000000000000214012247657026015565 0ustar rootroot/* MAPIStoreMIME.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 MAPISTOREMIME_H #define MAPISTOREMIME_H @interface MAPIStoreMIME : NSObject { NSMutableDictionary *mimeDict; } + (id) sharedMAPIStoreMIME; - (NSString *) mimeTypeForExtension: (NSString *) extension; @end #endif /* MAPISTOREMIME_H */ SOGo-2.1.1b/OpenChange/MAPIStoreDBBaseContext.h0000644000000000000000000000205712247657026017472 0ustar rootroot/* MAPIStoreDBBaseContext.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc. * * 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 3, 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 MAPISTOREDBBASECONTEXT_H #define MAPISTOREDBBASECONTEXT_H #import "MAPIStoreContext.h" @interface MAPIStoreDBBaseContext : MAPIStoreContext @end #endif /* MAPISTOREDBBASECONTEXT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreCalendarMessageTable.h0000644000000000000000000000214612247657026021032 0ustar rootroot/* MAPIStoreCalendarMessageTable.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 MAPISTORECALENDARMESSAGETABLE_H #define MAPISTORECALENDARMESSAGETABLE_H #import "MAPIStoreGCSMessageTable.h" @interface MAPIStoreCalendarMessageTable : MAPIStoreGCSMessageTable @end #endif /* MAPISTORECALENDARMESSAGETABLE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreMailContext.m0000644000000000000000000002405112247657026017277 0ustar rootroot/* MAPIStoreMailContext.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 #import #import #import #import #import #import "MAPIStoreMailFolder.h" #import "MAPIStoreUserContext.h" #import "NSString+MAPIStore.h" #import #import "MAPIApplication.h" #import "MAPIStoreMailContext.h" #include #undef DEBUG #include static Class MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; @implementation MAPIStoreMailContext + (void) initialize { MAPIStoreMailFolderK = [MAPIStoreMailFolder class]; MAPIStoreOutboxFolderK = [MAPIStoreOutboxFolder class]; } + (NSString *) MAPIModuleName { return @"mail"; } + (enum mapistore_context_role) MAPIContextRole { return MAPISTORE_MAIL_ROLE; } static inline NSString * MakeDisplayFolderName (NSString *folderName) { NSArray *parts; NSString *lastFolder; NSUInteger max; parts = [folderName componentsSeparatedByString: @"/"]; max = [parts count]; if (max > 1) { lastFolder = [parts objectAtIndex: max - 1]; if ([lastFolder length] == 0) lastFolder = [parts objectAtIndex: max - 2]; } else lastFolder = folderName; return [[lastFolder substringFromIndex: 6] fromCSSIdentifier]; } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName withTDBIndexing: (struct tdb_wrap *) indexingTdb inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *firstContext = NULL, *context; NSString *urlBase, *stringData, *currentName, *inboxName, *draftsName, *sentName, *trashName; NSArray *unprefixedFolders; NSMutableArray *secondaryFolders; enum mapistore_context_role role[] = {MAPISTORE_MAIL_ROLE, MAPISTORE_DRAFTS_ROLE, MAPISTORE_SENTITEMS_ROLE}; NSString *folderName[3]; NSUInteger count, max; SOGoMailAccount *accountFolder; MAPIStoreUserContext *userContext; WOContext *woContext; userContext = [MAPIStoreUserContext userContextWithUsername: userName andTDBIndexing: indexingTdb]; accountFolder = [[userContext rootFolders] objectForKey: @"mail"]; woContext = [userContext woContext]; inboxName = @"folderINBOX"; folderName[0] = inboxName; unprefixedFolders = [[accountFolder draftsFolderNameInContext: woContext] componentsSeparatedByString: @"/"]; draftsName = [NSString stringWithFormat: @"folder%@", [unprefixedFolders componentsJoinedByString: @"/folder"]]; folderName[1] = draftsName; unprefixedFolders = [[accountFolder sentFolderNameInContext: woContext] componentsSeparatedByString: @"/"]; sentName = [NSString stringWithFormat: @"folder%@", [unprefixedFolders componentsJoinedByString: @"/folder"]]; folderName[2] = sentName; /* Note: trash is not used as a mail folder, since "Deleted Items" makes use of the fallback context */ unprefixedFolders = [[accountFolder trashFolderNameInContext: woContext] componentsSeparatedByString: @"/"]; trashName = [NSString stringWithFormat: @"folder%@", [unprefixedFolders componentsJoinedByString: @"/folder"]]; urlBase = [NSString stringWithFormat: @"sogo://%@:%@@mail/", userName, userName]; for (count = 0; count < 3; count++) { context = talloc_zero (memCtx, struct mapistore_contexts_list); stringData = [NSString stringWithFormat: @"%@%@", urlBase, [folderName[count] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; context->url = [stringData asUnicodeInMemCtx: context]; /* remove "folder" prefix */ stringData = MakeDisplayFolderName (folderName[count]); context->name = [stringData asUnicodeInMemCtx: context]; context->main_folder = true; context->role = role[count]; context->tag = "tag"; DLIST_ADD_END (firstContext, context, void); } secondaryFolders = [[accountFolder toManyRelationshipKeysWithNamespaces: NO] mutableCopy]; [secondaryFolders autorelease]; [secondaryFolders removeObject: inboxName]; [secondaryFolders removeObject: draftsName]; [secondaryFolders removeObject: sentName]; [secondaryFolders removeObject: trashName]; max = [secondaryFolders count]; for (count = 0; count < max; count++) { context = talloc_zero (memCtx, struct mapistore_contexts_list); currentName = [secondaryFolders objectAtIndex: count]; stringData = [NSString stringWithFormat: @"%@%@", urlBase, [currentName stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; context->url = [stringData asUnicodeInMemCtx: context]; stringData = [[[currentName substringFromIndex: 6] fromCSSIdentifier] stringByDecodingImap4FolderName]; context->name = [stringData asUnicodeInMemCtx: context]; context->main_folder = false; context->role = MAPISTORE_MAIL_ROLE; context->tag = "tag"; DLIST_ADD_END (firstContext, context, void); } return firstContext; } + (NSString *) createRootSecondaryFolderWithFID: (uint64_t) fid andName: (NSString *) newFolderName forUser: (NSString *) userName { NSString *mapistoreURI, *folderName; MAPIStoreUserContext *userContext; SOGoMailAccount *accountFolder; SOGoMailFolder *newFolder; userContext = [MAPIStoreUserContext userContextWithUsername: userName andTDBIndexing: NULL]; [MAPIApp setUserContext: userContext]; accountFolder = [[userContext rootFolders] objectForKey: @"mail"]; folderName = [NSString stringWithFormat: @"folder%@", [newFolderName asCSSIdentifier]]; newFolder = [SOGoMailFolder objectWithName: folderName inContainer: accountFolder]; if ([newFolder create]) mapistoreURI = [NSString stringWithFormat: @"sogo://%@:%@@mail/%@/", userName, userName, [[folderName stringByEncodingImap4FolderName] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; else mapistoreURI = nil; [MAPIApp setUserContext: nil]; return mapistoreURI; } - (Class) MAPIStoreFolderClass { return MAPIStoreMailFolderK; } - (id) rootSOGoFolder { return [[userContext rootFolders] objectForKey: @"mail"]; } - (void) updateURLWithFolderName: (NSString *) newFolderName { NSString *urlString, *escapedName; NSMutableArray *pathComponents; BOOL hasSlash; NSUInteger max, folderNameIdx; NSURL *newURL; /* we do not need to unescape the url here as it will be reassembled later in the method */ urlString = [contextUrl absoluteString]; hasSlash = [urlString hasSuffix: @"/"]; pathComponents = [[urlString componentsSeparatedByString: @"/"] mutableCopy]; [pathComponents autorelease]; max = [pathComponents count]; if (hasSlash) folderNameIdx = max - 2; else folderNameIdx = max - 1; escapedName = [newFolderName stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; [pathComponents replaceObjectAtIndex: folderNameIdx withObject: escapedName]; urlString = [pathComponents componentsJoinedByString: @"/"]; newURL = [NSURL URLWithString: urlString]; ASSIGN (contextUrl, newURL); } @end @implementation MAPIStoreOutboxContext + (NSString *) MAPIModuleName { return @"outbox"; } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName withTDBIndexing: (struct tdb_wrap *) indexingTdb inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *context; NSString *url, *folderName; NSArray *unprefixedFolders; SOGoMailAccount *accountFolder; MAPIStoreUserContext *userContext; WOContext *woContext; userContext = [MAPIStoreUserContext userContextWithUsername: userName andTDBIndexing: indexingTdb]; accountFolder = [[userContext rootFolders] objectForKey: @"mail"]; woContext = [userContext woContext]; unprefixedFolders = [[accountFolder draftsFolderNameInContext: woContext] componentsSeparatedByString: @"/"]; folderName = [NSString stringWithFormat: @"folder%@", [unprefixedFolders componentsJoinedByString: @"/folder"]]; url = [NSString stringWithFormat: @"sogo://%@:%@@outbox/%@", userName, userName, folderName]; context = talloc_zero (memCtx, struct mapistore_contexts_list); context->url = [url asUnicodeInMemCtx: context]; /* TODO: use a localized version of this display name */ context->name = [@"Outbox" asUnicodeInMemCtx: context]; context->main_folder = true; context->role = MAPISTORE_OUTBOX_ROLE; context->tag = "tag"; context->prev = context; return context; } - (Class) MAPIStoreFolderClass { return MAPIStoreOutboxFolderK; } @end SOGo-2.1.1b/OpenChange/MAPIStoreMessage.m0000644000000000000000000006543712247657026016451 0ustar rootroot/* MAPIStoreMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import #import "MAPIStoreActiveTables.h" #import "MAPIStoreAttachment.h" #import "MAPIStoreAttachmentTable.h" #import "MAPIStoreContext.h" #import "MAPIStoreEmbeddedMessage.h" #import "MAPIStoreFolder.h" #import "MAPIStoreMessageTable.h" #import "MAPIStorePropertySelectors.h" #import "MAPIStoreSamDBUtils.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "RTFHandler.h" #import "MAPIStoreMessage.h" #undef DEBUG #include #include #include #include static Class MAPIStoreFolderK, MAPIStoreEmbeddedMessageK; static NSString *resourcesDir = nil; static NSData * uncompressRTF (NSData *compressedRTF) { NSData *rtfData = nil; DATA_BLOB *rtf; TALLOC_CTX *mem_ctx; mem_ctx = talloc_zero (NULL, TALLOC_CTX); rtf = talloc_zero (mem_ctx, DATA_BLOB); if (uncompress_rtf (mem_ctx, (uint8_t *) [compressedRTF bytes], [compressedRTF length], rtf) == MAPI_E_SUCCESS) rtfData = [NSData dataWithBytes: rtf->data length: rtf->length]; talloc_free (mem_ctx); return rtfData; } static NSData * rtf2html (NSData *compressedRTF) { NSData *rtf; NSMutableData *html = nil; rtf = uncompressRTF (compressedRTF); if (rtf) { //html = [NSMutableData data]; RTFHandler *handler; handler = [[RTFHandler alloc] initWithData: rtf]; AUTORELEASE(handler); html = [handler parse]; } return html; } @interface SOGoObject (MAPIStoreProtocol) - (NSString *) davContentLength; @end @implementation MAPIStoreMessage + (void) initialize { if (!resourcesDir) { resourcesDir = [[NSBundle bundleForClass: self] resourcePath]; [resourcesDir retain]; } MAPIStoreFolderK = [MAPIStoreFolder class]; MAPIStoreEmbeddedMessageK = [MAPIStoreEmbeddedMessage class]; } - (id) init { //[self logWithFormat: @"METHOD '%s' (%d) (%d)", __FUNCTION__, __LINE__, self]; if ((self = [super init])) { attachmentParts = [NSMutableDictionary new]; activeTables = [NSMutableArray new]; activeUserRoles = nil; } return self; } - (void) dealloc { //[self logWithFormat: @"METHOD '%s' (%d) (%d)", __FUNCTION__, __LINE__, self]; [activeUserRoles release]; [attachmentKeys release]; [attachmentParts release]; [activeTables release]; [super dealloc]; } - (void) getMessageData: (struct mapistore_message **) dataPtr inMemCtx: (TALLOC_CTX *) memCtx { void *propValue; struct mapistore_message *msgData; // [self logWithFormat: @"INCOMPLETE METHOD '%s' (%d): no recipient handling", // __FUNCTION__, __LINE__]; msgData = talloc_zero (memCtx, struct mapistore_message); if ([self getPidTagSubjectPrefix: &propValue inMemCtx: msgData] == MAPISTORE_SUCCESS && propValue) msgData->subject_prefix = propValue; else msgData->subject_prefix = ""; if ([self getPidTagNormalizedSubject: &propValue inMemCtx: msgData] == MAPISTORE_SUCCESS && propValue) msgData->normalized_subject = propValue; else msgData->normalized_subject = ""; msgData->columns = talloc_zero(msgData, struct SPropTagArray); msgData->recipients_count = 0; *dataPtr = msgData; } - (NSDictionary *) _convertRecipient: (struct mapistore_message_recipient *) recipient andColumns: (struct SPropTagArray *) columns { NSMutableDictionary *recipientProperties; SOGoUser *recipientUser; NSUInteger count; id value; recipientProperties = [NSMutableDictionary dictionaryWithCapacity: columns->cValues + 2]; if (recipient->username) { value = [NSString stringWithUTF8String: recipient->username]; [recipientProperties setObject: value forKey: @"x500dn"]; recipientUser = [SOGoUser userWithLogin: [value lowercaseString]]; if (recipientUser) { value = [recipientUser cn]; if ([value length] > 0) [recipientProperties setObject: value forKey: @"fullName"]; value = [[recipientUser allEmails] objectAtIndex: 0]; if ([value length] > 0) [recipientProperties setObject: value forKey: @"email"]; } } else { if (recipient->data[0]) { value = [NSString stringWithUTF8String: recipient->data[0]]; if ([value length] > 0) [recipientProperties setObject: value forKey: @"fullName"]; } if (recipient->data[1]) { value = [NSString stringWithUTF8String: recipient->data[1]]; if ([value length] > 0) [recipientProperties setObject: value forKey: @"email"]; } } for (count = 0; count < columns->cValues; count++) { if (recipient->data[count]) { value = NSObjectFromValuePointer (columns->aulPropTag[count], recipient->data[count]); if (value) [recipientProperties setObject: value forKey: MAPIPropertyKey (columns->aulPropTag[count])]; } } return recipientProperties; } - (int) modifyRecipientsWithRecipients: (struct mapistore_message_recipient *) newRecipients andCount: (NSUInteger) max andColumns: (struct SPropTagArray *) columns; { static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; NSDictionary *recipientProperties; NSMutableDictionary *recipients; NSMutableArray *list; NSString *recType; struct mapistore_message_recipient *recipient; NSUInteger count; //[self logWithFormat: @"METHOD '%s'", __FUNCTION__]; recipients = [NSMutableDictionary new]; recipientProperties = [NSDictionary dictionaryWithObject: recipients forKey: @"recipients"]; [recipients release]; for (count = 0; count < max; count++) { recipient = newRecipients + count; if (recipient->type >= MAPI_ORIG && recipient->type <= MAPI_BCC) { recType = recTypes[recipient->type]; list = [recipients objectForKey: recType]; if (!list) { list = [NSMutableArray new]; [recipients setObject: list forKey: recType]; [list release]; } [list addObject: [self _convertRecipient: recipient andColumns: columns]]; } } [self addProperties: recipientProperties]; return MAPISTORE_SUCCESS; } - (int) addPropertiesFromRow: (struct SRow *) aRow { enum mapistore_error rc; MAPIStoreContext *context; SOGoUser *ownerUser; BOOL userIsOwner; MAPIStoreMessage *mainMessage; context = [self context]; ownerUser = [[self userContext] sogoUser]; userIsOwner = [[context activeUser] isEqual: ownerUser]; if (userIsOwner) mainMessage = nil; else if ([self isKindOfClass: MAPIStoreEmbeddedMessageK]) mainMessage = (MAPIStoreMessage *) [[self container] container]; else mainMessage = self; if (userIsOwner || [mainMessage subscriberCanModifyMessage]) rc = [super addPropertiesFromRow: aRow]; else rc = MAPISTORE_ERR_DENIED; return rc; } - (void) addProperties: (NSDictionary *) newNewProperties { NSData *htmlData, *rtfData; static NSNumber *htmlKey = nil, *rtfKey = nil; /* we intercept any RTF content and convert it to HTML */ [super addProperties: newNewProperties]; if (!htmlKey) { htmlKey = MAPIPropertyKey (PR_HTML); [htmlKey retain]; } if (!rtfKey) { rtfKey = MAPIPropertyKey (PR_RTF_COMPRESSED); [rtfKey retain]; } if (![properties objectForKey: htmlKey]) { rtfData = [properties objectForKey: rtfKey]; if (rtfData) { htmlData = rtf2html (rtfData); [properties setObject: htmlData forKey: htmlKey]; [properties removeObjectForKey: rtfKey]; [properties removeObjectForKey: MAPIPropertyKey (PR_RTF_IN_SYNC)]; } } } - (MAPIStoreAttachment *) createAttachment { MAPIStoreAttachment *newAttachment; uint32_t newAid; NSString *newKey; newAid = [[self attachmentKeys] count]; newAttachment = [MAPIStoreAttachment mapiStoreObjectInContainer: self]; // [newAttachment setIsNew: YES]; [newAttachment setAID: newAid]; newKey = [NSString stringWithFormat: @"%ul", newAid]; [attachmentParts setObject: newAttachment forKey: newKey]; [attachmentKeys release]; attachmentKeys = nil; return newAttachment; } - (int) createAttachment: (MAPIStoreAttachment **) attachmentPtr inAID: (uint32_t *) aidPtr { MAPIStoreAttachment *attachment; int rc = MAPISTORE_SUCCESS; attachment = [self createAttachment]; if (attachment) { *attachmentPtr = attachment; *aidPtr = [attachment AID]; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (id) lookupAttachment: (NSString *) childKey { [self subclassResponsibility: _cmd]; return nil; } - (int) getAttachment: (MAPIStoreAttachment **) attachmentPtr withAID: (uint32_t) aid { MAPIStoreAttachment *attachment; NSArray *keys; int rc = MAPISTORE_ERR_NOT_FOUND; keys = [self attachmentKeys]; if (aid < [keys count]) { attachment = [self lookupAttachment: [keys objectAtIndex: aid]]; if (attachment) { *attachmentPtr = attachment; rc = MAPISTORE_SUCCESS; } } return rc; } - (int) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr andRowCount: (uint32_t *) countPtr { MAPIStoreAttachmentTable *attTable; int rc = MAPISTORE_SUCCESS; attTable = [self attachmentTable]; if (attTable) { *tablePtr = attTable; *countPtr = [[attTable childKeys] count]; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (NSArray *) activeContainerMessageTables { return [[MAPIStoreActiveTables activeTables] activeTablesForFMID: [container objectId] andType: MAPISTORE_MESSAGE_TABLE]; } - (void) copyToMessage: (MAPIStoreMessage *) newMessage inMemCtx: (TALLOC_CTX *) memCtx; { //TALLOC_CTX *memCtx; struct mapistore_message *messageData; NSArray *keys; NSUInteger count, max; NSString *key; MAPIStoreAttachment *attachment, *newAttachment; //[self logWithFormat: @"METHOD '%s' (%d) (%d)", __FUNCTION__, __LINE__, self]; //memCtx = talloc_zero (NULL, TALLOC_CTX); /* message headers and recipients */ [self getMessageData: &messageData inMemCtx: memCtx]; [newMessage modifyRecipientsWithRecipients: messageData->recipients andCount: messageData->recipients_count andColumns: messageData->columns]; /* properties */ [self copyPropertiesToObject: newMessage inMemCtx: memCtx]; /* attachments */ keys = [self attachmentKeys]; max = [keys count]; for (count = 0; count < max; count++) { key = [keys objectAtIndex: count]; attachment = [self lookupAttachment: key]; newAttachment = [newMessage createAttachment]; [attachment copyToAttachment: newAttachment inMemCtx: memCtx]; } //talloc_free (memCtx); } - (enum mapistore_error) saveMessage: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSArray *containerTables; NSUInteger count, max; struct mapistore_object_notification_parameters *notif_parameters; uint64_t folderId; struct mapistore_context *mstoreCtx; MAPIStoreContext *context; SOGoUser *ownerUser; BOOL userIsOwner; MAPIStoreMessage *mainMessage; //[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__]; context = [self context]; ownerUser = [[self userContext] sogoUser]; userIsOwner = [[context activeUser] isEqual: ownerUser]; if (userIsOwner) mainMessage = nil; else if ([self isKindOfClass: MAPIStoreEmbeddedMessageK]) mainMessage = (MAPIStoreMessage *) [[self container] container]; else mainMessage = self; if (userIsOwner || ([self isKindOfClass: MAPIStoreEmbeddedMessageK] && [mainMessage subscriberCanModifyMessage]) || (![self isKindOfClass: MAPIStoreEmbeddedMessageK] && ((isNew && [(MAPIStoreFolder *) container subscriberCanCreateMessages]) || (!isNew && [self subscriberCanModifyMessage])))) { /* notifications */ if ([container isKindOfClass: MAPIStoreFolderK]) { folderId = [(MAPIStoreFolder *) container objectId]; mstoreCtx = [[self context] connectionInfo]->mstore_ctx; /* folder modified */ notif_parameters = talloc_zero(memCtx, struct mapistore_object_notification_parameters); notif_parameters->object_id = folderId; if (isNew) { notif_parameters->tag_count = 3; notif_parameters->tags = talloc_array (notif_parameters, enum MAPITAGS, 3); notif_parameters->tags[0] = PR_CONTENT_COUNT; notif_parameters->tags[1] = PR_MESSAGE_SIZE; notif_parameters->tags[2] = PR_NORMAL_MESSAGE_SIZE; notif_parameters->new_message_count = true; notif_parameters->message_count = [[(MAPIStoreFolder *) container messageKeys] count] + 1; } mapistore_push_notification (mstoreCtx, MAPISTORE_FOLDER, MAPISTORE_OBJECT_MODIFIED, notif_parameters); talloc_free (notif_parameters); /* message created */ if (isNew) { notif_parameters = talloc_zero(memCtx, struct mapistore_object_notification_parameters); notif_parameters->object_id = [self objectId]; notif_parameters->folder_id = folderId; notif_parameters->tag_count = 0xffff; mapistore_push_notification (mstoreCtx, MAPISTORE_MESSAGE, MAPISTORE_OBJECT_CREATED, notif_parameters); talloc_free (notif_parameters); } /* we ensure the table caches are loaded so that old and new state can be compared */ containerTables = [self activeContainerMessageTables]; max = [containerTables count]; for (count = 0; count < max; count++) [[containerTables objectAtIndex: count] restrictedChildKeys]; } [self save: memCtx]; /* We make sure that any change-related properties are removes from the properties dictionary, to make sure that related methods will be invoked the next time they are requested. */ [properties removeObjectForKey: MAPIPropertyKey (PidTagChangeKey)]; [properties removeObjectForKey: MAPIPropertyKey (PidTagChangeNumber)]; if ([container isKindOfClass: MAPIStoreFolderK]) { /* table modified */ for (count = 0; count < max; count++) { id table; table = [containerTables objectAtIndex: count]; /* Safety check here as we could have MAPIStorePermissionsTable instances in our containerTables array. This code might need to be reworked later */ if ([table respondsToSelector: @selector(notifyChangesForChild:)]) [table notifyChangesForChild: self]; } [container cleanupCaches]; } [self setIsNew: NO]; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_DENIED; return rc; } /* getters */ - (int) getPidTagInstID: (void **) data // TODO: DOUBT inMemCtx: (TALLOC_CTX *) memCtx { /* we return a unique id based on the key */ *data = MAPILongLongValue (memCtx, [[sogoObject nameInContainer] hash]); return MAPISTORE_SUCCESS; } - (int) getPidTagInstanceNum: (void **) data // TODO: DOUBT inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidTagRowType: (void **) data // TODO: DOUBT inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, TBL_LEAF_ROW); return MAPISTORE_SUCCESS; } - (int) getPidTagDepth: (void **) data // TODO: DOUBT inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, 0); return MAPISTORE_SUCCESS; } /* Possible values are: 0x00000001 Modify 0x00000002 Read 0x00000004 Delete 0x00000008 Create Hierarchy Table 0x00000010 Create Contents Table 0x00000020 Create Associated Contents Table */ - (int) getPidTagAccess: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t access = 0; BOOL userIsOwner; MAPIStoreContext *context; SOGoUser *ownerUser; MAPIStoreMessage *mainMessage; context = [self context]; ownerUser = [[self userContext] sogoUser]; userIsOwner = [[context activeUser] isEqual: ownerUser]; if (userIsOwner) mainMessage = nil; else if ([self isKindOfClass: MAPIStoreEmbeddedMessageK]) mainMessage = (MAPIStoreMessage *) [[self container] container]; else mainMessage = self; if (userIsOwner || [mainMessage subscriberCanModifyMessage]) access |= 0x01; if (userIsOwner || [mainMessage subscriberCanReadMessage]) access |= 0x02; if (userIsOwner || ([self isKindOfClass: MAPIStoreEmbeddedMessageK] && [mainMessage subscriberCanModifyMessage]) || [(MAPIStoreFolder *) [mainMessage container] subscriberCanDeleteMessages]) access |= 0x04; *data = MAPILongValue (memCtx, access); return MAPISTORE_SUCCESS; } /* Possible values are: 0x00000000 Read-Only 0x00000001 Modify */ - (int) getPidTagAccessLevel: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t access = 0; BOOL userIsOwner; MAPIStoreContext *context; SOGoUser *ownerUser; context = [self context]; ownerUser = [[self userContext] sogoUser]; userIsOwner = [[context activeUser] isEqual: ownerUser]; if (userIsOwner || [self subscriberCanModifyMessage]) access = 0x01; else access = 0; *data = MAPILongValue (memCtx, access); return MAPISTORE_SUCCESS; } - (int ) getPidTagHasNamedProperties: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (int) getPidLidSideEffects: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidLidCurrentVersion: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { // *data = MAPILongValue (memCtx, 115608); // Outlook 11.5608 *data = MAPILongValue (memCtx, 0x1ce3a); // Outlook 11.8330 return MAPISTORE_SUCCESS; } - (int) getPidLidCurrentVersionName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"11.0" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidAutoProcessState: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000000); return MAPISTORE_SUCCESS; } - (int) getPidTagFolderId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); return MAPISTORE_SUCCESS; } - (int) getPidTagMid: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; uint64_t obId; obId = [self objectId]; if (obId == ULLONG_MAX) rc = MAPISTORE_ERR_NOT_FOUND; else { *data = MAPILongLongValue (memCtx, obId); rc = MAPISTORE_SUCCESS; } return rc; } - (int) getPidTagMessageLocaleId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x0409); return MAPISTORE_SUCCESS; } - (int) getPidTagMessageFlags: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, MSGFLAG_FROMME | MSGFLAG_READ | MSGFLAG_UNMODIFIED); return MAPISTORE_SUCCESS; } - (int) getPidTagMessageSize: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { /* TODO: choose another name in SOGo for that method */ *data = MAPILongValue (memCtx, [[sogoObject davContentLength] intValue]); return MAPISTORE_SUCCESS; } - (int) getPidTagImportance: (void **) data // TODO -> subclass? inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 1); return MAPISTORE_SUCCESS; } - (int) getPidTagPriority: (void **) data // TODO -> subclass? inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidTagSensitivity: (void **) data // TODO -> subclass in calendar inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidTagSubject: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; TALLOC_CTX *localMemCtx; char *prefix, *normalizedSubject; localMemCtx = talloc_zero (NULL, TALLOC_CTX); if ([self getProperty: (void **) &prefix withTag: PidTagSubjectPrefix inMemCtx: localMemCtx] != MAPISTORE_SUCCESS) prefix = ""; rc = [self getProperty: (void **) &normalizedSubject withTag: PidTagNormalizedSubject inMemCtx: localMemCtx]; if (rc == MAPISTORE_SUCCESS) *data = talloc_asprintf (memCtx, "%s%s", prefix, normalizedSubject); return rc; } - (int) getPidTagNormalizedSubject: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagOriginalSubject: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSubject: data inMemCtx: memCtx]; } - (int) getPidTagConversationTopic: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagNormalizedSubject: data inMemCtx: memCtx]; } - (int) getPidTagSubjectPrefix: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } - (int) getPidTagDeleteAfterSubmit: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidTagDisplayTo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } - (int) getPidTagDisplayCc: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } - (int) getPidTagDisplayBcc: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } // - (int) getPidTagOriginalDisplayTo: (void **) data // { // return [self getPidTagDisplayTo: data]; // } // - (int) getPidTagOriginalDisplayCc: (void **) data // { // return [self getPidTagDisplayCc: data]; // } // - (int) getPidTagOriginalDisplayBcc: (void **) data // { // return [self getPidTagDisplayBcc: data]; // } - (int) getPidTagLastModifierName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSURL *contextUrl; contextUrl = (NSURL *) [[self context] url]; *data = [[contextUrl user] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { [self subclassResponsibility: _cmd]; return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagOriginalMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getProperty: data withTag: PidTagMessageClass inMemCtx: memCtx]; } - (int) getPidTagHasAttachments: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [[self attachmentKeys] count] > 0); return MAPISTORE_SUCCESS; } - (int) getPidTagAssociated: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx];; } - (int) setReadFlag: (uint8_t) flag { // [self subclassResponsibility: _cmd]; return MAPISTORE_ERROR; } - (void) save: (TALLOC_CTX *) memCtx { [self subclassResponsibility: _cmd]; } - (NSArray *) attachmentKeys { if (!attachmentKeys) { attachmentKeys = [self attachmentKeysMatchingQualifier: nil andSortOrderings: nil]; [attachmentKeys retain]; } return attachmentKeys; } - (NSArray *) attachmentKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { if (qualifier) [self errorWithFormat: @"qualifier is not used for attachments"]; if (sortOrderings) [self errorWithFormat: @"sort orderings are not used for attachments"]; return [attachmentParts allKeys]; } - (MAPIStoreAttachmentTable *) attachmentTable { return [MAPIStoreAttachmentTable tableForContainer: self]; } - (void) addActiveTable: (MAPIStoreTable *) activeTable { [activeTables addObject: activeTable]; } - (void) removeActiveTable: (MAPIStoreTable *) activeTable { [activeTables removeObject: activeTable]; } - (NSArray *) activeUserRoles { MAPIStoreContext *context; MAPIStoreUserContext *userContext; if (!activeUserRoles) { context = [self context]; userContext = [self userContext]; activeUserRoles = [[context activeUser] rolesForObject: sogoObject inContext: [userContext woContext]]; [activeUserRoles retain]; } return activeUserRoles; } - (BOOL) subscriberCanReadMessage { return NO; } - (BOOL) subscriberCanModifyMessage { return NO; } @end SOGo-2.1.1b/OpenChange/MAPIStorePermissionsTable.m0000644000000000000000000001061212247657026020331 0ustar rootroot/* MAPIStorePermissionsTable.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import "MAPIStoreContext.h" #import "MAPIStoreFolder.h" #import "MAPIStoreTypes.h" #import "MAPIStoreSamDBUtils.h" #import "NSData+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStorePermissionsTable.h" #undef DEBUG #include #include @implementation MAPIStorePermissionEntry + (id) entryWithUserId: (NSString *) newUserId andMemberId: (uint64_t) newMemberId forFolder: (MAPIStoreFolder *) newFolder { MAPIStorePermissionEntry *newEntry; newEntry = [[self alloc] initWithUserId: newUserId andMemberId: newMemberId forFolder: newFolder]; [newEntry autorelease]; return newEntry; } - (id) initWithUserId: (NSString *) newUserId andMemberId: (uint64_t) newMemberId forFolder: (MAPIStoreFolder *) newFolder { if ((self = [self initInContainer: newFolder])) { ASSIGN (userId, newUserId); memberId = newMemberId; } return self; } - (void) dealloc { [userId release]; [super dealloc]; } - (NSString *) userId { return userId; } - (uint64_t) memberId { return memberId; } - (int) getPidTagMemberId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, memberId); return MAPISTORE_SUCCESS; } - (int) getPidTagEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSData *entryId; struct mapistore_connection_info *connInfo; if (memberId == 0 || memberId == ULLONG_MAX) entryId = [NSData data]; else { connInfo = [(MAPIStoreContext *) [container context] connectionInfo]; entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, userId); } *data = [entryId asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagMemberName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *displayName; if (memberId == 0) displayName = @""; else if (memberId == ULLONG_MAX) displayName = @"Anonymous"; else displayName = [[SOGoUser userWithLogin: userId] cn]; *data = [displayName asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagMemberRights: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t rights; NSArray *roles; roles = [[(MAPIStoreFolder *) container aclFolder] aclsForUser: userId]; rights = [(MAPIStoreFolder *) container exchangeRightsForRoles: roles]; *data = MAPILongValue (memCtx, rights); return MAPISTORE_SUCCESS; } @end @implementation MAPIStorePermissionsTable - (void) dealloc { [entries release]; [super dealloc]; } - (void) _fetchEntries { NSArray *permEntries; NSUInteger count, max; MAPIStorePermissionEntry *entry; entries = [NSMutableDictionary new]; permEntries = [(MAPIStoreFolder *) container permissionEntries]; max = [permEntries count]; for (count = 0; count < max; count++) { entry = [permEntries objectAtIndex: count]; [entries setObject: entry forKey: [entry userId]]; } childKeys = [entries allKeys]; [childKeys retain]; } - (NSArray *) childKeys { if (!entries) [self _fetchEntries]; return childKeys; } - (NSArray *) restrictedChildKeys { return [self childKeys]; } - (id) lookupChild: (NSString *) childKey { if (!entries) [self _fetchEntries]; return [entries objectForKey: childKey]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreNotesMessage.m0000644000000000000000000000331212247657026017442 0ustar rootroot/* MAPIStoreNotesMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 "MAPIStoreTypes.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreNotesMessage.h" #include @implementation MAPIStoreNotesMessage - (int) getPidTagIconIndex: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ // *longValue = 0x00000300 for blue // *longValue = 0x00000301 for green // *longValue = 0x00000302 for pink // *longValue = 0x00000303 for yellow // *longValue = 0x00000304 for white *data = MAPILongValue (memCtx, 0x00000303); return MAPISTORE_SUCCESS; } - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.StickyNote" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } @end SOGo-2.1.1b/OpenChange/MAPIStoreAuthenticator.h0000644000000000000000000000266612247657026017665 0ustar rootroot /* MAPIStoreAuthenticator.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTOREAUTHENTICATOR_H #define MAPISTOREAUTHENTICATOR_H #import @class NSString; @class NSURL; @class WOContext; @interface MAPIStoreAuthenticator : NSObject { NSString *username; NSString *password; } - (void) setUsername: (NSString *) newUsername; - (NSString *) username; - (void) setPassword: (NSString *) newPassword; - (NSString *) imapPasswordInContext: (WOContext *) context forURL: (NSURL *) server forceRenew: (BOOL) renew; @end #endif /* MAPISTOREAUTHENTICATOR_H */ SOGo-2.1.1b/OpenChange/MAPIStoreAttachment.m0000644000000000000000000001157112247657026017143 0ustar rootroot/* MAPIStoreAttachment.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 "MAPIStoreAttachment.h" #import "MAPIStoreEmbeddedMessage.h" #import "MAPIStoreContext.h" #import "MAPIStoreMapping.h" #import "MAPIStoreMessage.h" #import "MAPIStoreTypes.h" #import "NSObject+MAPIStore.h" #undef DEBUG #include #include #include #include @implementation MAPIStoreAttachment - (void) setAID: (uint32_t) newAID { aid = newAID; } - (uint32_t) AID { return aid; } - (NSString *) nameInContainer { return [NSString stringWithFormat: @"%d", aid]; } - (NSData *) mimeAttachTag { static NSData *mimeAttachTag = nil; char tagBytes[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x14, 0x03, 0x0a, 0x04}; if (!mimeAttachTag) { mimeAttachTag = [NSData dataWithBytes: tagBytes length: 9]; [mimeAttachTag retain]; } return mimeAttachTag; } - (int) getPidTagMid: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); return MAPISTORE_SUCCESS; } - (int) getPidTagAttachNumber: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, aid); return MAPISTORE_SUCCESS; } - (int) getPidTagRenderingPosition: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0xffffffff); return MAPISTORE_SUCCESS; } - (int) getPidTagAccessLevel: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr withMID: (uint64_t *) mid withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreEmbeddedMessage *attMessage; struct mapistore_message *mapistoreMsg; mapistoreMsg = talloc_zero (memCtx, struct mapistore_message); attMessage = [self openEmbeddedMessage]; if (attMessage) { *mid = [attMessage objectId]; *messagePtr = attMessage; *mapistoreMsgPtr = mapistoreMsg; } return (attMessage ? MAPISTORE_SUCCESS : MAPISTORE_ERROR); } - (int) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreEmbeddedMessage *attMessage; struct mapistore_message *mapistoreMsg; mapistoreMsg = talloc_zero (memCtx, struct mapistore_message); attMessage = [self createEmbeddedMessage]; if (attMessage) { *messagePtr = attMessage; *mapistoreMsgPtr = mapistoreMsg; } return (attMessage ? MAPISTORE_SUCCESS : MAPISTORE_ERROR); } - (NSDate *) creationTime { return [container creationTime]; } - (NSDate *) lastModificationTime { return [container lastModificationTime]; } - (uint64_t) objectVersion { /* attachments have no version number */ return ULLONG_MAX; } - (void) copyToAttachment: (MAPIStoreAttachment *) newAttachment inMemCtx: (TALLOC_CTX *) memCtx { void *attachMethod; enum mapistore_error error; MAPIStoreEmbeddedMessage *embeddedMessage, *newEmbeddedMessage; [self copyPropertiesToObject: newAttachment inMemCtx: memCtx]; attachMethod = NULL; error = [self getProperty: &attachMethod withTag: PidTagAttachMethod inMemCtx: NULL]; if (error == MAPISTORE_SUCCESS && attachMethod) { if (*(uint32_t *) attachMethod == afEmbeddedMessage) { embeddedMessage = [self openEmbeddedMessage]; newEmbeddedMessage = [newAttachment createEmbeddedMessage]; [embeddedMessage copyToMessage: newEmbeddedMessage inMemCtx: memCtx]; } talloc_free (attachMethod); } } /* subclasses */ - (MAPIStoreEmbeddedMessage *) openEmbeddedMessage { // [self subclassResponsibility: _cmd]; return nil; } - (MAPIStoreEmbeddedMessage *) createEmbeddedMessage { [self subclassResponsibility: _cmd]; return nil; } @end SOGo-2.1.1b/OpenChange/MAPIStoreCalendarMessage.h0000644000000000000000000000230712247657026020061 0ustar rootroot/* MAPIStoreCalendarMessage.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORECALENDARMESSAGE_H #define MAPISTORECALENDARMESSAGE_H #import "MAPIStoreGCSMessage.h" @class iCalCalendar; @class iCalEvent; @class MAPIStoreAppointmentWrapper; @interface MAPIStoreCalendarMessage : MAPIStoreGCSMessage { iCalCalendar *calendar; iCalEvent *masterEvent; } @end #endif /* MAPISTORECALENDARMESSAGE_H */ SOGo-2.1.1b/OpenChange/MAPIApplication.h0000644000000000000000000000235212247657026016271 0ustar rootroot/* MAPIApplication.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPIAPPLICATION_H #define MAPIAPPLICATION_H #import @class MAPIStoreUserContext; @interface MAPIApplication : SoApplication { MAPIStoreUserContext *userContext; } - (id) authenticatorInContext: (id) context; - (void) setUserContext: (MAPIStoreUserContext *) newContext; @end extern MAPIApplication *MAPIApp; #endif /* MAPIAPPLICATION_H */ SOGo-2.1.1b/OpenChange/NSString+MAPIStore.m0000644000000000000000000001167412247657026016641 0ustar rootroot/* NSString+MAPIStore.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #import #import "NSString+MAPIStore.h" #undef DEBUG #include #include #include @implementation NSString (MAPIStoreDataTypes) + (id) stringWithGUID: (const struct GUID *) guid { char *guidString; NSString *newString; guidString = GUID_string (NULL, guid); newString = [self stringWithUTF8String: guidString]; talloc_free (guidString); return newString; } - (void) extractGUID: (struct GUID *) guid { GUID_from_string ([self UTF8String], guid); } - (char *) asUnicodeInMemCtx: (void *) memCtx { char *unicode; NSData *encoded; if ([self length] > 0) { encoded = [self dataUsingEncoding: NSUTF8StringEncoding]; unicode = talloc_strndup (memCtx, [encoded bytes], [encoded length]); } else unicode = talloc_memdup (memCtx, "", 1); return unicode; } - (char) _decodeHexByte: (char) byteChar { char newByte; if (byteChar >= 48 && byteChar <= 57) newByte = (uint8_t) byteChar - 48; else if (byteChar >= 65 && byteChar <= 70) newByte = (uint8_t) byteChar - 55; else if (byteChar >= 97 && byteChar <= 102) newByte = (uint8_t) byteChar - 87; else newByte = -1; return newByte; } - (BOOL) _decodeHexByte: (uint8_t *) byte atPos: (NSUInteger) pos { BOOL error = NO; char newByte; unichar byteChar; byteChar = [self characterAtIndex: pos]; if (byteChar < 256) { newByte = [self _decodeHexByte: (char) byteChar]; if (newByte == -1) error = YES; else *byte = newByte; } else error = YES; return error; } - (BOOL) _decodeHexPair: (uint8_t *) byte atPos: (NSUInteger) pos { BOOL error; uint8_t lowValue, highValue; error = [self _decodeHexByte: &highValue atPos: pos]; if (!error) { error = [self _decodeHexByte: &lowValue atPos: pos + 1]; if (!error) *byte = highValue << 4 | lowValue; } return error; } - (NSData *) convertHexStringToBytes { NSUInteger count, strLen, bytesLen; uint8_t *bytes, *currentByte; NSData *decoded = nil; BOOL error = NO; strLen = [self length]; if ((strLen % 2) == 0) { bytesLen = strLen / 2; bytes = NSZoneCalloc (NULL, bytesLen, sizeof (uint8_t)); currentByte = bytes; for (count = 0; !error && count < strLen; count += 2) { error = [self _decodeHexPair: currentByte atPos: count]; currentByte++; } if (error) NSZoneFree (NULL, bytes); else decoded = [NSData dataWithBytesNoCopy: bytes length: bytesLen freeWhenDone: YES]; } return decoded; } - (NSString *) stringByReplacingPercentEscapesUsingEncoding: (NSStringEncoding) encoding { NSString *newString; NSData *data; NSUInteger count, length, newCount; const char *bytes; char *newBytes; char newByte0, newByte1; data = [self dataUsingEncoding: NSASCIIStringEncoding]; if (data) { length = [data length]; bytes = [data bytes]; newBytes = NSZoneMalloc (NULL, sizeof (char) * length); newCount = 0; for (count = 0; count < length; count++) { if (bytes[count] == '%') { newByte0 = [self _decodeHexByte: bytes[count+1]]; newByte1 = [self _decodeHexByte: bytes[count+2]]; if ((newByte0 != -1) && (newByte1 != -1)) { newBytes[newCount] = (((newByte0 << 4) & 0xf0) | (newByte1 & 0x0f)); count += 2; } else newBytes[newCount] = bytes[count]; } else newBytes[newCount] = bytes[count]; newCount++; } data = [NSData dataWithBytesNoCopy: newBytes length: newCount freeWhenDone: YES]; newString = [[NSString alloc] initWithData: data encoding: encoding]; [newString autorelease]; } else newString = nil; return newString; } @end SOGo-2.1.1b/OpenChange/MAPIStoreNotesMessage.h0000644000000000000000000000206112247657026017435 0ustar rootroot/* MAPIStoreNotesMessage.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORENOTESMESSAGE_H #define MAPISTORENOTESMESSAGE_H #import "MAPIStoreDBMessage.h" @interface MAPIStoreNotesMessage : MAPIStoreDBMessage @end #endif /* MAPISTORENOTESMESSAGE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreCalendarAttachment.h0000644000000000000000000000235412247657026020567 0ustar rootroot/* MAPIStoreCalendarAttachment.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORECALENDARATTACHMENT_H #define MAPISTORECALENDARATTACHMENT_H #import "MAPIStoreAttachment.h" @class NSTimeZone; @class iCalEvent; @interface MAPIStoreCalendarAttachment : MAPIStoreAttachment { iCalEvent *event; NSTimeZone *timeZone; } - (void) setEvent: (iCalEvent *) newEvent; - (iCalEvent *) event; @end #endif /* MAPISTORECALENDARATTACHMENT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreDBMessage.h0000644000000000000000000000203112247657026016627 0ustar rootroot/* MAPIStoreDBMessage.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 MAPISTOREDBMESSAGE_H #define MAPISTOREDBMESSAGE_H #import "MAPIStoreMessage.h" @interface MAPIStoreDBMessage : MAPIStoreMessage @end #endif /* MAPISTOREDBMESSAGE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreGCSBaseContext.m0000644000000000000000000001132412247657026017623 0ustar rootroot/* MAPIStoreGCSBaseContext.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 #import #import #import "MAPIApplication.h" #import "MAPIStoreUserContext.h" #import "NSString+MAPIStore.h" #import "MAPIStoreGCSBaseContext.h" #undef DEBUG #include #include @implementation MAPIStoreGCSBaseContext + (NSString *) MAPIModuleName { return nil; } + (NSString *) folderNameSuffix { return @""; } + (NSString *) getFolderDisplayName: (NSString *) sogoDisplayName { NSString *suffix, *displayName; suffix = [self folderNameSuffix]; if ([suffix length] > 0 && ![sogoDisplayName hasSuffix: suffix]) displayName = [NSString stringWithFormat: @"%@ (%@)", sogoDisplayName, suffix]; else displayName = sogoDisplayName; return displayName; } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName withTDBIndexing: (struct tdb_wrap *) indexingTdb inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *firstContext = NULL, *context; NSString *moduleName, *baseUrl, *url, *nameInContainer, *displayName; NSArray *subfolders; MAPIStoreUserContext *userContext; SOGoParentFolder *parentFolder; NSUInteger count, max; SOGoGCSFolder *currentFolder; moduleName = [self MAPIModuleName]; if (moduleName) { userContext = [MAPIStoreUserContext userContextWithUsername: userName andTDBIndexing: indexingTdb]; parentFolder = [[userContext rootFolders] objectForKey: moduleName]; baseUrl = [NSString stringWithFormat: @"sogo://%@@%@/", userName, moduleName]; subfolders = [parentFolder subFolders]; max = [subfolders count]; for (count = 0; count < max; count++) { currentFolder = [subfolders objectAtIndex: count]; if ([[currentFolder ownerInContext: nil] isEqualToString: userName]) { context = talloc_zero (memCtx, struct mapistore_contexts_list); nameInContainer = [currentFolder nameInContainer]; url = [NSString stringWithFormat: @"%@%@", baseUrl, nameInContainer]; context->url = [url asUnicodeInMemCtx: context]; displayName = [self getFolderDisplayName: [currentFolder displayName]]; context->name = [displayName asUnicodeInMemCtx: context]; context->main_folder = [nameInContainer isEqualToString: @"personal"]; context->role = [self MAPIContextRole]; context->tag = "tag"; DLIST_ADD_END (firstContext, context, void); } } } return firstContext; } + (NSString *) createRootSecondaryFolderWithFID: (uint64_t) fid andName: (NSString *) folderName forUser: (NSString *) userName { NSString *mapistoreURI, *nameInContainer, *moduleName; MAPIStoreUserContext *userContext; SOGoParentFolder *parentFolder; userContext = [MAPIStoreUserContext userContextWithUsername: userName andTDBIndexing: NULL]; [MAPIApp setUserContext: userContext]; moduleName = [self MAPIModuleName]; parentFolder = [[userContext rootFolders] objectForKey: moduleName]; nameInContainer = nil; if (![parentFolder newFolderWithName: folderName nameInContainer: &nameInContainer]) mapistoreURI = [NSString stringWithFormat: @"sogo://%@@%@/%@/", userName, moduleName, nameInContainer]; else mapistoreURI = nil; [MAPIApp setUserContext: nil]; return mapistoreURI; } - (id) rootSOGoFolder { return [[userContext rootFolders] objectForKey: [isa MAPIModuleName]]; } @end SOGo-2.1.1b/OpenChange/dbmsgreader.m0000644000000000000000000000660212247657026015645 0ustar rootroot/* dbmsgreader.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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. */ /* A format-agnostic property list readerer. Usage: dbmsgreader [username] [filename] */ #import #import #import #import #import #import #import #import #import #import "MAPIStoreUserContext.h" #import "SOGoMAPIDBObject.h" #import "NSObject+PropertyList.m" Class MAPIStoreUserContextK, SOGoMAPIDBObjectK; static void DbDumpObject (NSString *username, NSString *path) { id ctx; NSData *content; id dbobject; NSDictionary *record; ctx = [MAPIStoreUserContextK userContextWithUsername: username andTDBIndexing: NULL]; dbobject = [SOGoMAPIDBObjectK new]; [dbobject setTableUrl: [ctx folderTableURL]]; record = [dbobject lookupRecord: path newerThanVersion: -1]; if (record) { content = [[record objectForKey: @"c_content"] dataByDecodingBase64]; OCDumpPListData (content); } else NSLog (@"record not found"); [dbobject release]; } int main (int argc, char *argv[], char *envp[]) { NSAutoreleasePool *pool; SOGoProductLoader *loader; NSUserDefaults *ud; SoProductRegistry *registry; NSArray *arguments; /* Here we work around a bug in GNUstep which decodes XML user defaults using the system encoding rather than honouring the encoding specified in the file. */ putenv ("GNUSTEP_STRING_ENCODING=NSUTF8StringEncoding"); pool = [NSAutoreleasePool new]; [SOGoSystemDefaults sharedSystemDefaults]; /* We force the plugin to base its configuration on the SOGo tree. */ ud = [NSUserDefaults standardUserDefaults]; [ud registerDefaults: [ud persistentDomainForName: @"sogod"]]; [NSProcessInfo initializeWithArguments: argv count: argc environment: envp]; registry = [SoProductRegistry sharedProductRegistry]; [registry scanForProductsInDirectory: SOGO_BUNDLES_DIR]; loader = [SOGoProductLoader productLoader]; [loader loadProducts: [NSArray arrayWithObject: BACKEND_BUNDLE_NAME]]; MAPIStoreUserContextK = NSClassFromString (@"MAPIStoreUserContext"); SOGoMAPIDBObjectK = NSClassFromString (@"SOGoMAPIDBObject"); arguments = [[NSProcessInfo processInfo] arguments]; if ([arguments count] > 2) DbDumpObject ([arguments objectAtIndex: 1], [arguments objectAtIndex: 2]); [pool release]; return 0; } SOGo-2.1.1b/OpenChange/MAPIStoreTasksFolder.m0000644000000000000000000001022012247657026017262 0ustar rootroot/* MAPIStoreTasksFolder.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import "MAPIApplication.h" #import "MAPIStoreTasksContext.h" #import "MAPIStoreTasksMessage.h" #import "MAPIStoreTasksMessageTable.h" #import "NSString+MAPIStore.h" #import "MAPIStoreTasksFolder.h" #include #include #include @implementation MAPIStoreTasksFolder - (MAPIStoreMessageTable *) messageTable { [self synchroniseCache]; return [MAPIStoreTasksMessageTable tableForContainer: self]; } - (NSString *) component { return @"vtodo"; } - (MAPIStoreMessage *) createMessage { MAPIStoreMessage *newMessage; SOGoTaskObject *newEntry; NSString *name; name = [NSString stringWithFormat: @"%@.ics", [SOGoObject globallyUniqueObjectId]]; newEntry = [SOGoTaskObject objectWithName: name inContainer: sogoObject]; [newEntry setIsNew: YES]; newMessage = [MAPIStoreTasksMessage mapiStoreObjectWithSOGoObject: newEntry inContainer: self]; return newMessage; } - (NSArray *) rolesForExchangeRights: (uint32_t) rights { NSMutableArray *roles; roles = [NSMutableArray arrayWithCapacity: 6]; if (rights & RightsCreateItems) [roles addObject: SOGoRole_ObjectCreator]; if (rights & RightsDeleteAll) [roles addObject: SOGoRole_ObjectEraser]; if (rights & RightsEditAll) { [roles addObject: SOGoCalendarRole_PublicModifier]; [roles addObject: SOGoCalendarRole_PrivateModifier]; [roles addObject: SOGoCalendarRole_ConfidentialModifier]; } else if (rights & RightsReadItems) { [roles addObject: SOGoCalendarRole_PublicViewer]; [roles addObject: SOGoCalendarRole_PrivateViewer]; [roles addObject: SOGoCalendarRole_ConfidentialViewer]; } return roles; } - (uint32_t) exchangeRightsForRoles: (NSArray *) roles { uint32_t rights = 0; if ([roles containsObject: SOGoRole_ObjectCreator]) rights |= RightsCreateItems; if ([roles containsObject: SOGoRole_ObjectEraser]) rights |= RightsDeleteAll; if ([roles containsObject: SOGoCalendarRole_PublicModifier] && [roles containsObject: SOGoCalendarRole_PrivateModifier] && [roles containsObject: SOGoCalendarRole_ConfidentialModifier]) rights |= RightsReadItems | RightsEditAll; else if ([roles containsObject: SOGoCalendarRole_PublicViewer] && [roles containsObject: SOGoCalendarRole_PrivateViewer] && [roles containsObject: SOGoCalendarRole_ConfidentialViewer]) rights |= RightsReadItems; if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ return rights; } - (EOQualifier *) aclQualifier { return [EOQualifier qualifierWithQualifierFormat: [(SOGoAppointmentFolder *) sogoObject aclSQLListingFilter]]; } - (int) getPidTagDefaultPostMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Task" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } @end SOGo-2.1.1b/OpenChange/GNUmakefile.preamble0000644000000000000000000000056412247657026017051 0ustar rootrootall:: MAPIStorePropertySelectors.m MAPIStorePropertySelectors.h MAPIStorePropertySelectors.m MAPIStorePropertySelectors.h: gen-property-selectors.py code-MAPIStorePropertySelectors.m code-MAPIStorePropertySelectors.h @echo " Auto-generating MAPIStorePropertySelectors.[hm]..." @$(PYTHON) ./gen-property-selectors.py -o MAPIStorePropertySelectors $(LIBMAPISTORE_CFLAGS) SOGo-2.1.1b/OpenChange/MAPIStoreFolder.m0000644000000000000000000016145012247657026016270 0ustar rootroot/* MAPIStoreFolder.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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. */ /* TODO: main key arrays must be initialized */ #import #import #import #import #import #import #import #import #import #import #import #import #import "MAPIStoreActiveTables.h" #import "MAPIStoreContext.h" #import "MAPIStoreFAIMessage.h" #import "MAPIStoreFAIMessageTable.h" #import "MAPIStoreFolder.h" #import "MAPIStoreFolderTable.h" #import "MAPIStoreMapping.h" #import "MAPIStoreMessage.h" #import "MAPIStorePermissionsTable.h" #import "MAPIStoreSamDBUtils.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" #import "NSString+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "SOGoMAPIDBFolder.h" #import "SOGoMAPIDBMessage.h" #include #undef DEBUG #include #include #include #include Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStoreFolderTableK; @implementation MAPIStoreFolder + (void) initialize { NSExceptionK = [NSException class]; MAPIStoreFAIMessageK = [MAPIStoreFAIMessage class]; MAPIStoreMessageTableK = [MAPIStoreMessageTable class]; MAPIStoreFAIMessageTableK = [MAPIStoreFAIMessageTable class]; MAPIStoreFolderTableK = [MAPIStoreFolderTable class]; } - (id) init { if ((self = [super init])) { // messageKeys = nil; // faiMessageKeys = nil; // folderKeys = nil; dbFolder = nil; context = nil; // propsFolder = nil; // propsMessage = nil; } return self; } - (void) setupAuxiliaryObjects { NSURL *folderURL; NSMutableString *pathPrefix; NSString *path, *folderName; NSArray *parts; NSUInteger lastPartIdx; MAPIStoreUserContext *userContext; folderURL = [NSURL URLWithString: [self url]]; /* note: -[NSURL path] returns an unescaped representation */ path = [folderURL path]; path = [path substringFromIndex: 1]; if ([path length] > 0) { parts = [path componentsSeparatedByString: @"/"]; lastPartIdx = [parts count] - 1; if ([path hasSuffix: @"/"]) lastPartIdx--; folderName = [parts objectAtIndex: lastPartIdx]; } else folderName = [folderURL host]; userContext = [self userContext]; [userContext ensureFolderTableExists]; ASSIGN (dbFolder, [SOGoMAPIDBFolder objectWithName: folderName inContainer: [container dbFolder]]); [dbFolder setTableUrl: [userContext folderTableURL]]; if (!container && [path length] > 0) { pathPrefix = [NSMutableString stringWithCapacity: 64]; [pathPrefix appendFormat: @"/%@", [folderURL host]]; parts = [parts subarrayWithRange: NSMakeRange (0, lastPartIdx)]; if ([parts count] > 0) [pathPrefix appendFormat: @"/%@", [parts componentsJoinedByString: @"/"]]; [dbFolder setPathPrefix: pathPrefix]; } [dbFolder reloadIfNeeded]; /* propsMessage and self share the same properties dictionary */ // ASSIGN (propsMessage, // [SOGoMAPIDBMessage objectWithName: @"properties.plist" // inContainer: dbFolder]); // [propsMessage setObjectType: MAPIDBObjectTypeInternal]; // [propsMessage reloadIfNeeded]; [properties release]; properties = [dbFolder properties]; [properties retain]; [self setupVersionsMessage]; } - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newContainer { /* The instantiation of auxiliary folders is postponed when newContainer is nil since there is no way to deduce the parent url. When setContext: is invoked, it becomes possible again. */ if ((self = [super initWithSOGoObject: newSOGoObject inContainer: newContainer]) && newContainer) { [self setupAuxiliaryObjects]; } return self; } - (void) setContext: (MAPIStoreContext *) newContext { ASSIGN (context, newContext); if (newContext) [self setupAuxiliaryObjects]; } - (MAPIStoreContext *) context { if (!context) [self setContext: (MAPIStoreContext *) [container context]]; return context; } - (void) dealloc { //[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__]; // [messageKeys release]; // [faiMessageKeys release]; // [folderKeys release]; // [propsMessage release]; [dbFolder release]; [context release]; [super dealloc]; } - (SOGoMAPIDBFolder *) dbFolder { return dbFolder; } /* backend interface */ // - (SOGoMAPIDBMessage *) propertiesMessage // { // return propsMessage; // } - (uint64_t) objectVersion { NSNumber *value; uint64_t cn; value = [properties objectForKey: MAPIPropertyKey (PidTagChangeNumber)]; if (value) cn = [value unsignedLongLongValue]; else { [self logWithFormat: @"no value for PidTagChangeNumber, adding one now"]; cn = [[self context] getNewChangeNumber]; value = [NSNumber numberWithUnsignedLongLong: cn]; [properties setObject: value forKey: MAPIPropertyKey (PidTagChangeNumber)]; [dbFolder save]; } return cn >> 16; } - (id) lookupFolder: (NSString *) folderKey { MAPIStoreFolder *childFolder; SOGoFolder *sogoFolder; WOContext *woContext; if ([[self folderKeys] containsObject: folderKey]) { woContext = [[self userContext] woContext]; sogoFolder = [sogoObject lookupName: folderKey inContext: woContext acquire: NO]; if (sogoFolder && ![sogoFolder isKindOfClass: NSExceptionK]) { [sogoFolder setContext: woContext]; childFolder = [isa mapiStoreObjectWithSOGoObject: sogoFolder inContainer: self]; } } else childFolder = nil; return childFolder; } - (id) lookupFolderByURL: (NSString *) childURL { MAPIStoreObject *foundObject; NSString *key, *slashLessURL; if ([childURL hasSuffix: @"/"]) slashLessURL = [childURL substringToIndex: [childURL length] - 1]; else slashLessURL = childURL; key = [self childKeyFromURL: slashLessURL]; if (key) foundObject = [self lookupFolder: key]; else foundObject = nil; return foundObject; } - (id) lookupMessage: (NSString *) messageKey { MAPIStoreObject *childMessage = nil; Class messageClass; SOGoObject *msgObject; if (messageKey) { msgObject = [sogoObject lookupName: messageKey inContext: nil acquire: NO]; if (msgObject && ![msgObject isKindOfClass: NSExceptionK]) { [msgObject setContext: [[self userContext] woContext]]; messageClass = [msgObject mapistoreMessageClass]; childMessage = [messageClass mapiStoreObjectWithSOGoObject: msgObject inContainer: self]; } } return childMessage; } - (id) lookupFAIMessage: (NSString *) messageKey { MAPIStoreObject *childMessage = nil; SOGoObject *msgObject; if (messageKey) { if ([[self faiMessageKeys] containsObject: messageKey]) { msgObject = [dbFolder lookupName: messageKey inContext: nil acquire: NO]; childMessage = [MAPIStoreFAIMessageK mapiStoreObjectWithSOGoObject: msgObject inContainer: self]; } } return childMessage; } - (NSString *) childKeyFromURL: (NSString *) childURL { NSString *baseURL, *subURL, *key = nil; NSArray *parts; NSUInteger partsCount; baseURL = [self url]; if (![baseURL hasSuffix: @"/"]) baseURL = [NSString stringWithFormat: @"%@/", baseURL]; if ([childURL hasPrefix: baseURL]) { subURL = [childURL substringFromIndex: [baseURL length]]; if ([subURL length] > 0) { parts = [subURL componentsSeparatedByString: @"/"]; partsCount = [parts count]; if (partsCount == 1) { key = [[parts objectAtIndex: 0] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; } } } return key; } - (id) lookupMessageByURL: (NSString *) childURL { MAPIStoreObject *foundObject; NSString *key; key = [self childKeyFromURL: childURL]; if (key) { foundObject = [self lookupFAIMessage: key]; if (!foundObject) foundObject = [self lookupMessage: key]; } else foundObject = nil; return foundObject; } - (int) openFolder: (MAPIStoreFolder **) childFolderPtr withFID: (uint64_t) fid { int rc = MAPISTORE_ERR_NOT_FOUND; MAPIStoreFolder *childFolder; MAPIStoreMapping *mapping; NSString *childURL; //[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__]; mapping = [self mapping]; childURL = [mapping urlFromID: fid]; if (childURL) { childFolder = [self lookupFolderByURL: childURL]; if (childFolder) { *childFolderPtr = childFolder; rc = MAPISTORE_SUCCESS; } } return rc; } - (int) createFolder: (MAPIStoreFolder **) childFolderPtr withRow: (struct SRow *) aRow andFID: (uint64_t) fid { int rc = MAPISTORE_SUCCESS; MAPIStoreMapping *mapping; NSString *baseURL, *childURL, *folderKey; MAPIStoreFolder *childFolder; SOGoUser *ownerUser; //[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__]; ownerUser = [[self userContext] sogoUser]; if ([[context activeUser] isEqual: ownerUser] || [self subscriberCanCreateSubFolders]) { mapping = [self mapping]; childURL = [mapping urlFromID: fid]; if (childURL) rc = MAPISTORE_ERR_EXIST; else { rc = [self createFolder: aRow withFID: fid andKey: &folderKey]; if (rc == MAPISTORE_SUCCESS) { [self cleanupCaches]; baseURL = [self url]; if (![baseURL hasSuffix: @"/"]) baseURL = [NSString stringWithFormat: @"%@/", baseURL]; childURL = [NSString stringWithFormat: @"%@%@/", baseURL, [folderKey stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; [mapping registerURL: childURL withID: fid]; childFolder = [self lookupFolder: folderKey]; if (childFolder) { [childFolder addPropertiesFromRow: aRow]; *childFolderPtr = childFolder; } else [NSException raise: @"MAPIStoreIOException" format: @"unable to fetch created folder"]; } } } else rc = MAPISTORE_ERR_DENIED; return rc; } - (int) deleteFolder { // [propsMessage delete]; [dbFolder delete]; [self cleanupCaches]; return MAPISTORE_SUCCESS; } - (int) getChildCount: (uint32_t *) rowCount ofTableType: (enum mapistore_table_type) tableType { NSArray *keys; int rc = MAPISTORE_SUCCESS; //[self logWithFormat: @"METHOD '%s' (%d) -- tableType: %d", //__FUNCTION__, __LINE__, tableType]; if (tableType == MAPISTORE_MESSAGE_TABLE) keys = [self messageKeys]; else if (tableType == MAPISTORE_FOLDER_TABLE) keys = [self folderKeys]; else if (tableType == MAPISTORE_FAI_TABLE) keys = [self faiMessageKeys]; else { keys = nil; rc = MAPISTORE_ERR_NOT_FOUND; } *rowCount = [keys count]; return rc; } - (int) openMessage: (MAPIStoreMessage **) messagePtr withMID: (uint64_t) mid forWriting: (BOOL) readWrite inMemCtx: (TALLOC_CTX *) memCtx; { NSString *messageURL; MAPIStoreMapping *mapping; MAPIStoreMessage *message; SOGoUser *ownerUser; int rc = MAPISTORE_ERR_NOT_FOUND; mapping = [self mapping]; messageURL = [mapping urlFromID: mid]; if (messageURL) { message = [self lookupMessageByURL: messageURL]; if (message) { ownerUser = [[self userContext] sogoUser]; if ([[context activeUser] isEqual: ownerUser] || (readWrite && [message subscriberCanModifyMessage]) || (!readWrite && [message subscriberCanReadMessage])) { *messagePtr = message; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_DENIED; } } return rc; } - (int) createMessage: (MAPIStoreMessage **) messagePtr withMID: (uint64_t) mid isAssociated: (BOOL) isAssociated { enum mapistore_error rc; MAPIStoreMessage *message; NSString *baseURL, *childURL; MAPIStoreMapping *mapping; SOGoUser *ownerUser; //[self logWithFormat: @"METHOD '%s' -- mid: 0x%.16llx associated: %d", // __FUNCTION__, mid, isAssociated]; context = [self context]; ownerUser = [[self userContext] sogoUser]; if ([[context activeUser] isEqual: ownerUser] || (!isAssociated && [self subscriberCanCreateMessages])) { mapping = [self mapping]; if ([mapping urlFromID: mid]) rc = MAPISTORE_ERR_EXIST; else { message = [self createMessage: isAssociated]; if (message) { baseURL = [self url]; if (![baseURL hasSuffix: @"/"]) baseURL = [NSString stringWithFormat: @"%@/", baseURL]; childURL = [NSString stringWithFormat: @"%@%@", baseURL, [message nameInContainer]]; [mapping registerURL: childURL withID: mid]; *messagePtr = message; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERROR; } } else rc = MAPISTORE_ERR_DENIED; return rc; } - (int) deleteMessageWithMID: (uint64_t) mid andFlags: (uint8_t) flags { NSString *childURL; MAPIStoreMapping *mapping; MAPIStoreMessage *message; NSArray *activeTables; NSUInteger count, max; id msgObject; SOGoUser *ownerUser; struct mapistore_connection_info *connInfo; struct mapistore_object_notification_parameters *notif_parameters; int rc; [self logWithFormat: @"-deleteMessageWithMID: mid: 0x%.16llx flags: %d", mid, flags]; mapping = [self mapping]; childURL = [mapping urlFromID: mid]; if (childURL) { message = [self lookupMessageByURL: childURL]; if (message) { ownerUser = [[self userContext] sogoUser]; if ([[context activeUser] isEqual: ownerUser] || (![message isKindOfClass: MAPIStoreFAIMessageK] && [self subscriberCanDeleteMessages])) { /* we ensure the table caches are loaded so that old and new state can be compared */ activeTables = ([message isKindOfClass: MAPIStoreFAIMessageK] ? [self activeFAIMessageTables] : [self activeMessageTables]); max = [activeTables count]; for (count = 0; count < max; count++) [[activeTables objectAtIndex: count] restrictedChildKeys]; msgObject = [message sogoObject]; if (([msgObject respondsToSelector: @selector (prepareDelete)] && [msgObject prepareDelete]) || [msgObject delete]) { rc = MAPISTORE_ERROR; [self logWithFormat: @"ERROR deleting object at URL: %@", childURL]; } else { if (![message isNew]) { /* folder notification */ notif_parameters = talloc_zero(NULL, struct mapistore_object_notification_parameters); notif_parameters->object_id = [self objectId]; notif_parameters->tag_count = 5; notif_parameters->tags = talloc_array (notif_parameters, enum MAPITAGS, 5); notif_parameters->tags[0] = PR_CONTENT_COUNT; notif_parameters->tags[1] = PR_DELETED_COUNT_TOTAL; notif_parameters->tags[2] = PR_MESSAGE_SIZE; notif_parameters->tags[3] = PR_NORMAL_MESSAGE_SIZE; notif_parameters->tags[4] = PR_DELETED_MSG_COUNT; notif_parameters->new_message_count = true; notif_parameters->message_count = [[self messageKeys] count] - 1; connInfo = [[self context] connectionInfo]; mapistore_push_notification (connInfo->mstore_ctx, MAPISTORE_FOLDER, MAPISTORE_OBJECT_MODIFIED, notif_parameters); talloc_free(notif_parameters); /* message notification */ notif_parameters = talloc_zero(NULL, struct mapistore_object_notification_parameters); notif_parameters->object_id = mid; notif_parameters->folder_id = [self objectId]; /* Exchange sends a fnevObjectCreated!! */ mapistore_push_notification (connInfo->mstore_ctx, MAPISTORE_MESSAGE, MAPISTORE_OBJECT_CREATED, notif_parameters); talloc_free(notif_parameters); /* table notification */ for (count = 0; count < max; count++) [[activeTables objectAtIndex: count] notifyChangesForChild: message]; } [self logWithFormat: @"successfully deleted object at URL: %@", childURL]; [mapping unregisterURLWithID: mid]; [self cleanupCaches]; rc = MAPISTORE_SUCCESS; } } else rc = MAPISTORE_ERR_DENIED; } else rc = MAPISTORE_ERR_NOT_FOUND; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } // private method - (int) _moveCopyMessageWithMID: (uint64_t) srcMid fromFolder: (MAPIStoreFolder *) sourceFolder withMID: (uint64_t) targetMid andChangeKey: (struct Binary_r *) targetChangeKey wantCopy: (uint8_t) wantCopy inMemCtx: (TALLOC_CTX *) memCtx { int rc; MAPIStoreMessage *sourceMsg, *destMsg; //TALLOC_CTX *memCtx; struct SRow aRow; struct SPropValue property; [self logWithFormat: @"-moveCopyMessageWithMID: 0x%.16llx .. withMID: 0x%.16llx .. wantCopy: %d", srcMid, targetMid, wantCopy]; //memCtx = talloc_zero (NULL, TALLOC_CTX); rc = [sourceFolder openMessage: &sourceMsg withMID: srcMid forWriting: NO inMemCtx: memCtx]; if (rc != MAPISTORE_SUCCESS) goto end; rc = [self createMessage: &destMsg withMID: targetMid isAssociated: [sourceMsg isKindOfClass: MAPIStoreFAIMessageK]]; if (rc != MAPISTORE_SUCCESS) goto end; [sourceMsg copyToMessage: destMsg inMemCtx: memCtx]; if (targetChangeKey) { property.ulPropTag = PidTagChangeKey; property.value.bin = *targetChangeKey; aRow.cValues = 1; aRow.lpProps = &property; rc = [destMsg addPropertiesFromRow: &aRow]; if (rc != MAPISTORE_SUCCESS) goto end; } [destMsg save: memCtx]; if (!wantCopy) rc = [sourceFolder deleteMessageWithMID: srcMid andFlags: 0]; end: //talloc_free (memCtx); return rc; } - (int) moveCopyMessagesWithMIDs: (uint64_t *) srcMids andCount: (uint32_t) midCount fromFolder: (MAPIStoreFolder *) sourceFolder withMIDs: (uint64_t *) targetMids andChangeKeys: (struct Binary_r **) targetChangeKeys wantCopy: (uint8_t) wantCopy inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSUInteger count; NSMutableArray *oldMessageURLs; NSString *oldMessageURL; MAPIStoreMapping *mapping; SOGoUser *ownerUser; struct Binary_r *targetChangeKey; //TALLOC_CTX *memCtx; //memCtx = talloc_zero (NULL, TALLOC_CTX); ownerUser = [[self userContext] sogoUser]; if (wantCopy || [[context activeUser] isEqual: ownerUser]) { if ([sourceFolder isKindOfClass: isa] || [self isKindOfClass: [sourceFolder class]]) [self logWithFormat: @"%s: this class could probably implement" @" a specialized/optimized version", __FUNCTION__]; oldMessageURLs = [NSMutableArray arrayWithCapacity: midCount]; mapping = [self mapping]; for (count = 0; rc == MAPISTORE_SUCCESS && count < midCount; count++) { oldMessageURL = [mapping urlFromID: srcMids[count]]; if (oldMessageURL) { [oldMessageURLs addObject: oldMessageURL]; if (targetChangeKeys) targetChangeKey = targetChangeKeys[count]; else targetChangeKey = NULL; rc = [self _moveCopyMessageWithMID: srcMids[count] fromFolder: sourceFolder withMID: targetMids[count] andChangeKey: targetChangeKey wantCopy: wantCopy inMemCtx: memCtx]; } else rc = MAPISTORE_ERR_NOT_FOUND; } /* Notifications */ if (rc == MAPISTORE_SUCCESS) { [self postNotificationsForMoveCopyMessagesWithMIDs: srcMids andMessageURLs: oldMessageURLs andCount: midCount fromFolder: sourceFolder withMIDs: targetMids wantCopy: wantCopy]; // We cleanup cache of our source and destination folders [self cleanupCaches]; [sourceFolder cleanupCaches]; } } else rc = MAPISTORE_ERR_DENIED; //talloc_free (memCtx); return rc; } - (enum mapistore_error) moveCopyToFolder: (MAPIStoreFolder *) targetFolder withNewName: (NSString *) newFolderName isMove: (BOOL) isMove isRecursive: (BOOL) isRecursive inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSAutoreleasePool *pool; struct SRow folderRow; struct SPropValue nameProperty; MAPIStoreFolder *subFolder, *newFolder; NSArray *children; MAPIStoreMapping *mapping; MAPIStoreMessage *message, *targetMessage; NSUInteger count, max; NSString *childKey; uint64_t fmid; //TALLOC_CTX *memCtx; //memCtx = talloc_zero (NULL, TALLOC_CTX); /* TODO: one possible issue with this algorithm is that moved messages will lack a version number and will all be assigned a new one, even though they have not changed. This also means that they will be transferred again to the client during a sync operation. */ if ([targetFolder supportsSubFolders]) { mapping = [self mapping]; if (!newFolderName) newFolderName = [sogoObject displayName]; nameProperty.ulPropTag = PidTagDisplayName; nameProperty.value.lpszW = [newFolderName UTF8String]; folderRow.lpProps = &nameProperty; folderRow.cValues = 1; rc = [targetFolder createFolder: &folderRow withFID: [self objectId] andKey: &childKey]; if (rc == MAPISTORE_SUCCESS) { newFolder = [targetFolder lookupFolder: childKey]; [self copyPropertiesToObject: newFolder inMemCtx: memCtx]; pool = [NSAutoreleasePool new]; children = [self messageKeys]; max = [children count]; for (count = 0; count < max; count++) { childKey = [children objectAtIndex: count]; message = [self lookupMessage: childKey]; targetMessage = [newFolder createMessage: NO]; [targetMessage setIsNew: YES]; [message copyToMessage: targetMessage inMemCtx: memCtx]; if (isMove) { fmid = [mapping idFromURL: [message url]]; [self deleteMessageWithMID: fmid andFlags: 0]; [mapping registerURL: [targetMessage url] withID: fmid]; } [targetMessage save: memCtx]; } [pool release]; pool = [NSAutoreleasePool new]; children = [self faiMessageKeys]; max = [children count]; for (count = 0; count < max; count++) { childKey = [children objectAtIndex: count]; message = [self lookupFAIMessage: childKey]; targetMessage = [newFolder createMessage: YES]; [targetMessage setIsNew: YES]; [message copyToMessage: targetMessage inMemCtx: memCtx]; if (isMove) { fmid = [mapping idFromURL: [message url]]; [self deleteMessageWithMID: fmid andFlags: 0]; [mapping registerURL: [targetMessage url] withID: fmid]; } [targetMessage save: memCtx]; } [pool release]; if (isRecursive) { pool = [NSAutoreleasePool new]; children = [self folderKeys]; max = [children count]; for (count = 0; count < max; count++) { childKey = [children objectAtIndex: count]; subFolder = [self lookupFolder: childKey]; [subFolder moveCopyToFolder: newFolder withNewName: nil isMove: isMove isRecursive: isRecursive inMemCtx: memCtx]; } [pool release]; } if (isMove) { fmid = [mapping idFromURL: [self url]]; [mapping unregisterURLWithID: fmid]; [self deleteFolder]; [mapping registerURL: [newFolder url] withID: fmid]; } [targetFolder cleanupCaches]; } [self cleanupCaches]; } else rc = MAPISTORE_ERR_DENIED; //talloc_free (memCtx); return rc; } - (SOGoFolder *) aclFolder { [self subclassResponsibility: _cmd]; return nil; } - (void) _modifyPermissionEntryForUser: (NSString *) user withRoles: (NSArray *) roles isAddition: (BOOL) isAddition withACLFolder: (SOGoFolder *) aclFolder { if (user) { if (isAddition) [aclFolder addUserInAcls: user]; [aclFolder setRoles: roles forUser: user]; } else [self logWithFormat: @"user is nil, keeping intended entry intact"]; } - (void) setupVersionsMessage { } - (void) ensureIDsForChildKeys: (NSArray *) keys { NSMutableArray *missingURLs; MAPIStoreMapping *mapping; NSUInteger count, max; NSString *baseURL, *URL, *key; NSArray *newIDs; uint64_t idNbr; baseURL = [self url]; mapping = [self mapping]; max = [keys count]; missingURLs = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { key = [keys objectAtIndex: count]; URL = [NSString stringWithFormat: @"%@%@", baseURL, key]; idNbr = [mapping idFromURL: URL]; if (idNbr == NSNotFound) [missingURLs addObject: URL]; } max = [missingURLs count]; newIDs = [[self context] getNewFMIDs: max]; [mapping registerURLs: missingURLs withIDs: newIDs]; } - (void) postNotificationsForMoveCopyMessagesWithMIDs: (uint64_t *) srcMids andMessageURLs: (NSArray *) oldMessageURLs andCount: (uint32_t) midCount fromFolder: (MAPIStoreFolder *) sourceFolder withMIDs: (uint64_t *) targetMids wantCopy: (uint8_t) wantCopy { NSArray *activeTables; NSUInteger count, tableCount, max; MAPIStoreMessage *message; NSString *messageURL; MAPIStoreMapping *mapping; struct mapistore_object_notification_parameters *notif_parameters; struct mapistore_connection_info *connInfo; connInfo = [[self context] connectionInfo]; // For the "source folder, we ensure the table caches are loaded so // that old and new state can be compared activeTables = [sourceFolder activeMessageTables]; max = [activeTables count]; for (count = 0; count < max; count++) [[activeTables objectAtIndex: count] restrictedChildKeys]; if (!wantCopy) { // We notify the client. We start with the source folder. notif_parameters = talloc_zero(NULL, struct mapistore_object_notification_parameters); notif_parameters->object_id = [sourceFolder objectId]; notif_parameters->tag_count = 5; notif_parameters->tags = talloc_array (notif_parameters, enum MAPITAGS, 5); notif_parameters->tags[0] = PR_CONTENT_COUNT; notif_parameters->tags[1] = PR_DELETED_COUNT_TOTAL; notif_parameters->tags[2] = PR_MESSAGE_SIZE; notif_parameters->tags[3] = PR_NORMAL_MESSAGE_SIZE; notif_parameters->tags[4] = PR_RECIPIENT_ON_NORMAL_MSG_COUNT; notif_parameters->new_message_count = true; notif_parameters->message_count = [[sourceFolder messageKeys] count] - midCount; mapistore_push_notification (connInfo->mstore_ctx, MAPISTORE_FOLDER, MAPISTORE_OBJECT_MODIFIED, notif_parameters); talloc_free(notif_parameters); } // move/copy notification of the copied/moved message for (count = 0; count < midCount; count++) { notif_parameters = talloc_zero (NULL, struct mapistore_object_notification_parameters); notif_parameters->tag_count = 0; notif_parameters->new_message_count = true; notif_parameters->message_count = 0; notif_parameters->object_id = targetMids[count]; notif_parameters->folder_id = [self objectId]; notif_parameters->old_object_id = srcMids[count]; notif_parameters->old_folder_id = [sourceFolder objectId]; mapistore_push_notification (connInfo->mstore_ctx, MAPISTORE_MESSAGE, (wantCopy ? MAPISTORE_OBJECT_COPIED : MAPISTORE_OBJECT_MOVED), notif_parameters); talloc_free (notif_parameters); message = [sourceFolder lookupMessageByURL: [oldMessageURLs objectAtIndex: count]]; // table notification for (tableCount = 0; tableCount < max; tableCount++) [[activeTables objectAtIndex: tableCount] notifyChangesForChild: message]; } // For the "destination folder, we ensure the table caches are loaded so // that old and new state can be compared activeTables = [self activeMessageTables]; max = [activeTables count]; for (count = 0; count < max; count++) [[activeTables objectAtIndex: count] restrictedChildKeys]; notif_parameters = talloc_zero(NULL, struct mapistore_object_notification_parameters); notif_parameters->object_id = [self objectId]; notif_parameters->tag_count = 5; notif_parameters->tags = talloc_array (notif_parameters, enum MAPITAGS, 5); notif_parameters->tags[0] = PR_CONTENT_COUNT; notif_parameters->tags[1] = PR_DELETED_COUNT_TOTAL; notif_parameters->tags[2] = PR_MESSAGE_SIZE; notif_parameters->tags[3] = PR_NORMAL_MESSAGE_SIZE; notif_parameters->tags[4] = PR_RECIPIENT_ON_NORMAL_MSG_COUNT; notif_parameters->new_message_count = true; notif_parameters->message_count = [[self messageKeys] count] + midCount; connInfo = [[self context] connectionInfo]; mapistore_push_notification (connInfo->mstore_ctx, MAPISTORE_FOLDER, MAPISTORE_OBJECT_MODIFIED, notif_parameters); talloc_free(notif_parameters); // table notification mapping = [self mapping]; for (count = 0; count < midCount; count++) { messageURL = [mapping urlFromID: targetMids[count]]; message = [self lookupMessageByURL: messageURL]; for (tableCount = 0; tableCount < max; tableCount++) [[activeTables objectAtIndex: tableCount] notifyChangesForChild: message]; } } - (int) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr andCN: (uint64_t *) cnPtr fromChangeNumber: (uint64_t) changeNum inTableType: (enum mapistore_table_type) tableType inMemCtx: (TALLOC_CTX *) memCtx { int rc; NSString *baseURL, *format, *url; NSArray *keys; NSNumber *cnNbr; NSUInteger count, max; MAPIStoreMapping *mapping; struct UI8Array_r *fmids; uint64_t fmid; keys = [self getDeletedKeysFromChangeNumber: changeNum andCN: &cnNbr inTableType: tableType]; if (keys) { mapping = [self mapping]; max = [keys count]; fmids = talloc_zero (memCtx, struct UI8Array_r); fmids->cValues = 0; fmids->lpui8 = talloc_array (fmids, uint64_t, max); *fmidsPtr = fmids; if (max > 0) *cnPtr = [cnNbr unsignedLongLongValue]; baseURL = [self url]; if ([baseURL hasSuffix: @"/"]) format = @"%@%@"; else format = @"%@/%@"; for (count = 0; count < max; count++) { url = [NSString stringWithFormat: format, baseURL, [keys objectAtIndex: count]]; fmid = [mapping idFromURL: url]; if (fmid != NSNotFound) /* if no fmid is returned, then the object "never existed" in the OpenChange databases */ { fmids->lpui8[fmids->cValues] = fmid; fmids->cValues++; } } rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getTable: (MAPIStoreTable **) tablePtr andRowCount: (uint32_t *) countPtr tableType: (enum mapistore_table_type) tableType andHandleId: (uint32_t) handleId { int rc = MAPISTORE_SUCCESS; MAPIStoreTable *table; SOGoUser *ownerUser; if (tableType == MAPISTORE_MESSAGE_TABLE) table = [self messageTable]; else if (tableType == MAPISTORE_FAI_TABLE) table = [self faiMessageTable]; else if (tableType == MAPISTORE_FOLDER_TABLE) table = [self folderTable]; else if (tableType == MAPISTORE_PERMISSIONS_TABLE) { ownerUser = [[self userContext] sogoUser]; if ([[context activeUser] isEqual: ownerUser]) table = [self permissionsTable]; else rc = MAPISTORE_ERR_DENIED; } else { table = nil; [NSException raise: @"MAPIStoreIOException" format: @"unsupported table type: %d", tableType]; } if (rc == MAPISTORE_SUCCESS) { if (table) { [table setHandleId: handleId]; *tablePtr = table; *countPtr = [[table childKeys] count]; } else rc = MAPISTORE_ERR_NOT_FOUND; } return rc; } - (void) addProperties: (NSDictionary *) newProperties { static enum MAPITAGS bannedProps[] = { PR_MID, PR_FID, PR_PARENT_FID, PR_SOURCE_KEY, PR_PARENT_SOURCE_KEY, PR_CHANGE_KEY, 0x00000000 }; enum MAPITAGS *currentProp; NSMutableDictionary *propsCopy; /* TODO: this should no longer be required once mapistore v2 API is in place, when we can then do this from -dealloc below */ [dbFolder reloadIfNeeded]; propsCopy = [newProperties mutableCopy]; [propsCopy autorelease]; currentProp = bannedProps; while (*currentProp) { [propsCopy removeObjectForKey: MAPIPropertyKey (*currentProp)]; currentProp++; } [properties addEntriesFromDictionary: propsCopy]; [dbFolder save]; } - (NSArray *) messageKeys { return [self messageKeysMatchingQualifier: nil andSortOrderings: nil]; // if (!messageKeys) // { // messageKeys = [self messageKeysMatchingQualifier: nil // andSortOrderings: nil]; // [messageKeys retain]; // } // return messageKeys; } - (MAPIStoreFAIMessageTable *) faiMessageTable { return [MAPIStoreFAIMessageTable tableForContainer: self]; } - (NSArray *) faiMessageKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { return [dbFolder childKeysOfType: MAPIDBObjectTypeFAI includeDeleted: NO matchingQualifier: qualifier andSortOrderings: sortOrderings]; } - (NSArray *) faiMessageKeys { return [self faiMessageKeysMatchingQualifier: nil andSortOrderings: nil]; // if (!faiMessageKeys) // { // faiMessageKeys = [self faiMessageKeysMatchingQualifier: nil // andSortOrderings: nil]; // [faiMessageKeys retain]; // } // return faiMessageKeys; } - (MAPIStoreFolderTable *) folderTable { return [MAPIStoreFolderTable tableForContainer: self]; } - (NSArray *) folderKeys { return [self folderKeysMatchingQualifier: nil andSortOrderings: nil]; // if (!folderKeys) // { // folderKeys = [self folderKeysMatchingQualifier: nil // andSortOrderings: nil]; // [folderKeys retain]; // } // return folderKeys; } - (NSArray *) folderKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { if (qualifier) [self errorWithFormat: @"qualifier is not used for folders"]; if (sortOrderings) [self errorWithFormat: @"sort orderings are not used for folders"]; return [sogoObject toManyRelationshipKeys]; } - (NSArray *) activeMessageTables { return [[MAPIStoreActiveTables activeTables] activeTablesForFMID: [self objectId] andType: MAPISTORE_MESSAGE_TABLE]; } - (NSArray *) activeFAIMessageTables { return [[MAPIStoreActiveTables activeTables] activeTablesForFMID: [self objectId] andType: MAPISTORE_FAI_TABLE]; } - (void) _cleanupTableCaches: (enum mapistore_table_type) tableType { NSArray *tables; NSUInteger count, max; tables = [[MAPIStoreActiveTables activeTables] activeTablesForFMID: [self objectId] andType: tableType]; max = [tables count]; for (count = 0; count < max; count++) [[tables objectAtIndex: count] cleanupCaches]; } - (void) cleanupCaches { [self _cleanupTableCaches: MAPISTORE_MESSAGE_TABLE]; [self _cleanupTableCaches: MAPISTORE_FAI_TABLE]; [self _cleanupTableCaches: MAPISTORE_FOLDER_TABLE]; // [faiMessageKeys release]; // faiMessageKeys = nil; // [messageKeys release]; // messageKeys = nil; // [folderKeys release]; // folderKeys = nil; } - (int) getPidTagParentFolderId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); return MAPISTORE_SUCCESS; } - (int) getPidTagFolderId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [self objectId]); return MAPISTORE_SUCCESS; } /* Possible values are: 0x00000001 Modify 0x00000002 Read 0x00000004 Delete 0x00000008 Create Hierarchy Table 0x00000010 Create Contents Table 0x00000020 Create Associated Contents Table */ - (int) getPidTagAccess: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t access = 0; SOGoUser *ownerUser; BOOL userIsOwner; ownerUser = [[self userContext] sogoUser]; userIsOwner = [[context activeUser] isEqual: ownerUser]; if (userIsOwner || [self subscriberCanModifyMessages]) access |= 0x01; if (userIsOwner || [self subscriberCanReadMessages]) access |= 0x02; if (userIsOwner || [self subscriberCanDeleteMessages]) access |= 0x04; if ((userIsOwner || [self subscriberCanCreateSubFolders]) && [self supportsSubFolders]) access |= 0x08; if (userIsOwner || [self subscriberCanCreateMessages]) access |= 0x10; if (userIsOwner) access |= 0x20; *data = MAPILongValue (memCtx, access); return MAPISTORE_SUCCESS; } - (int) getPidTagRights: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t rights = 0; SOGoUser *ownerUser; BOOL userIsOwner; ownerUser = [[self userContext] sogoUser]; userIsOwner = [[context activeUser] isEqual: ownerUser]; if (userIsOwner || [self subscriberCanReadMessages]) rights |= RightsReadItems; if (userIsOwner || [self subscriberCanCreateMessages]) rights |= RightsCreateItems; if (userIsOwner || [self subscriberCanModifyMessages]) rights |= RightsEditOwn | RightsEditAll; if (userIsOwner || [self subscriberCanDeleteMessages]) rights |= RightsDeleteOwn | RightsDeleteAll; if ((userIsOwner || [self subscriberCanCreateSubFolders]) && [self supportsSubFolders]) rights |= RightsCreateSubfolders; if (userIsOwner) rights |= RightsFolderOwner | RightsFolderContact; *data = MAPILongValue (memCtx, rights); return MAPISTORE_SUCCESS; } - (int) getPidTagAccessControlListData: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[NSData data] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttributeHidden: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidTagAttributeSystem: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidTagAttributeReadOnly: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidTagSubfolders: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [self supportsSubFolders] && [[self folderKeys] count] > 0); return MAPISTORE_SUCCESS; } - (int) getPidTagFolderChildCount: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self folderKeys] count]); return MAPISTORE_SUCCESS; } - (int) getPidTagContentCount: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self messageKeys] count]); return MAPISTORE_SUCCESS; } - (int) getPidTagContentUnreadCount: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0); return MAPISTORE_SUCCESS; } - (int) getPidTagAssociatedContentCount: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self faiMessageKeys] count]); return MAPISTORE_SUCCESS; } - (int) getPidTagDeletedCountTotal: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { /* TODO */ *data = MAPILongValue (memCtx, 0); return MAPISTORE_SUCCESS; } - (int) getPidTagLocalCommitTimeMax: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSDate *date; date = [self lastMessageModificationTime]; if (date) *data = [date asFileTimeInMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidTagDefaultPostMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Note" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getProperties: (struct mapistore_property_data *) data withTags: (enum MAPITAGS *) tags andCount: (uint16_t) columnCount inMemCtx: (TALLOC_CTX *) memCtx { [dbFolder reloadIfNeeded]; return [super getProperties: data withTags: tags andCount: columnCount inMemCtx: memCtx]; } - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag inMemCtx: (TALLOC_CTX *) memCtx { int rc; id value; value = [properties objectForKey: MAPIPropertyKey (propTag)]; if (value) rc = [value getValue: data forTag: propTag inMemCtx: memCtx]; else rc = [super getProperty: data withTag: propTag inMemCtx: memCtx]; return rc; } - (MAPIStoreMessage *) _createAssociatedMessage { MAPIStoreMessage *newMessage; SOGoMAPIDBMessage *dbObject; NSString *newKey; newKey = [NSString stringWithFormat: @"%@.plist", [SOGoObject globallyUniqueObjectId]]; dbObject = [SOGoMAPIDBMessage objectWithName: newKey inContainer: dbFolder]; [dbObject setObjectType: MAPIDBObjectTypeFAI]; [dbObject setIsNew: YES]; newMessage = [MAPIStoreFAIMessageK mapiStoreObjectWithSOGoObject: dbObject inContainer: self]; return newMessage; } - (MAPIStoreMessage *) createMessage: (BOOL) isAssociated { MAPIStoreMessage *newMessage; WOContext *woContext; if (isAssociated) newMessage = [self _createAssociatedMessage]; else newMessage = [self createMessage]; /* FIXME: this is ugly as the specifics of message creation should all be delegated to subclasses */ if ([newMessage respondsToSelector: @selector (setIsNew:)]) [newMessage setIsNew: YES]; woContext = [[self userContext] woContext]; /* FIXME: this is ugly too as the specifics of message creation should all be delegated to subclasses */ if ([newMessage respondsToSelector: @selector (sogoObject:)]) [[newMessage sogoObject] setContext: woContext]; return newMessage; } - (enum mapistore_error) createFolder: (struct SRow *) aRow withFID: (uint64_t) newFID andKey: (NSString **) newKeyP { [self errorWithFormat: @"new folders cannot be created in this context"]; return MAPISTORE_ERR_DENIED; } /* helpers */ - (NSString *) url { NSString *url; if (container) url = [NSString stringWithFormat: @"%@/", [super url]]; else { url = [[context url] absoluteString]; if (![url hasSuffix: @"/"]) url = [NSString stringWithFormat: @"%@/", url]; } return url; } - (MAPIStorePermissionsTable *) permissionsTable { return [MAPIStorePermissionsTable tableForContainer: self]; } - (NSArray *) permissionEntries { NSMutableArray *permissionEntries; MAPIStorePermissionEntry *entry; NSArray *aclUsers; uint64_t memberId, regularMemberId = 1; NSUInteger count, max; NSString *username, *defaultUserId; SOGoFolder *aclFolder; aclFolder = [self aclFolder]; defaultUserId = [aclFolder defaultUserID]; aclUsers = [aclFolder aclUsers]; max = [aclUsers count]; permissionEntries = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { username = [aclUsers objectAtIndex: count]; if (![username hasPrefix: @"@"]) { if ([username isEqualToString: defaultUserId]) memberId = 0; else if ([username isEqualToString: @"anonymous"]) memberId = ULLONG_MAX; else { memberId = regularMemberId; regularMemberId++; } entry = [MAPIStorePermissionEntry entryWithUserId: username andMemberId: memberId forFolder: self]; [permissionEntries addObject: entry]; } } return permissionEntries; } - (NSArray *) rolesForExchangeRights: (uint32_t) rights { [self subclassResponsibility: _cmd]; return nil; } - (uint32_t) exchangeRightsForRoles: (NSArray *) roles { [self subclassResponsibility: _cmd]; return 0; } - (NSString *) _usernameFromEntryId: (struct SBinary_short *) bin { struct Binary_r bin32; struct AddressBookEntryId *entryId; NSString *username; struct ldb_context *samCtx; if (bin && bin->cb) { bin32.cb = bin->cb; bin32.lpb = bin->lpb; entryId = get_AddressBookEntryId (NULL, &bin32); if (entryId) { samCtx = [[self context] connectionInfo]->sam_ctx; username = MAPIStoreSamDBUserAttribute (samCtx, @"legacyExchangeDN", [NSString stringWithUTF8String: entryId->X500DN], @"sAMAccountName"); } else username = nil; talloc_free (entryId); } else username = nil; return username; } - (NSString *) _usernameFromMemberId: (uint64_t) memberId inEntries: (NSArray *) entries { NSString *username = nil; NSUInteger count, max; MAPIStorePermissionEntry *entry; if (memberId == 0) username = [[self aclFolder] defaultUserID]; else if (memberId == ULLONG_MAX) username = @"anonymous"; else { max = [entries count]; for (count = 0; !username && count < max; count++) { entry = [entries objectAtIndex: count]; if ([entry memberId] == memberId) username = [entry userId]; } } return username; } - (void) _emptyACL { NSUInteger count, max; NSArray *users; SOGoFolder *aclFolder; aclFolder = [self aclFolder]; users = [aclFolder aclUsers]; max = [users count]; for (count = 0; count < max; count++) [aclFolder removeUserFromAcls: [users objectAtIndex: count]]; } - (int) modifyPermissions: (struct PermissionData *) permissions withCount: (uint16_t) pcount andFlags: (int8_t) flags { NSUInteger count, propCount; struct PermissionData *currentPermission; struct mapi_SPropValue *mapiValue; NSString *permissionUser; NSArray *entries; NSArray *permissionRoles; BOOL reset, isAdd = NO, isDelete = NO, isModify = NO; SOGoFolder *aclFolder; aclFolder = [self aclFolder]; reset = ((flags & ModifyPerms_ReplaceRows) != 0); if (reset) [self _emptyACL]; entries = [self permissionEntries]; for (count = 0; count < pcount; count++) { currentPermission = permissions + count; permissionUser = nil; permissionRoles = nil; if (currentPermission->PermissionDataFlags == ROW_ADD) isAdd = YES; else if (currentPermission->PermissionDataFlags == ROW_MODIFY) isModify = YES; else isDelete = YES; for (propCount = 0; propCount < currentPermission->lpProps.cValues; propCount++) { mapiValue = currentPermission->lpProps.lpProps + propCount; switch (mapiValue->ulPropTag) { case PR_ENTRYID: if (isAdd) permissionUser = [self _usernameFromEntryId: &mapiValue->value.bin]; break; case PR_MEMBER_ID: if (isModify || isDelete) permissionUser = [self _usernameFromMemberId: mapiValue->value.d inEntries: entries]; break; case PR_MEMBER_RIGHTS: if (isAdd || isModify) permissionRoles = [self rolesForExchangeRights: mapiValue->value.l]; break; default: if (mapiValue->ulPropTag != PR_MEMBER_NAME) [self warnWithFormat: @"unhandled permission property: %.8x", mapiValue->ulPropTag]; } } if (reset) { if (isAdd) [self _modifyPermissionEntryForUser: permissionUser withRoles: permissionRoles isAddition: YES withACLFolder: aclFolder]; } else { if (isAdd || currentPermission->PermissionDataFlags == ROW_MODIFY) [self _modifyPermissionEntryForUser: permissionUser withRoles: permissionRoles isAddition: isAdd withACLFolder: aclFolder]; else if (currentPermission->PermissionDataFlags == ROW_REMOVE) [aclFolder removeUserFromAcls: permissionUser]; else [self errorWithFormat: @"unhandled permission action flag: %d", currentPermission->PermissionDataFlags]; } } return MAPISTORE_SUCCESS; } - (enum mapistore_error) preloadMessageBodiesWithMIDs: (const struct UI8Array_r *) mids ofTableType: (enum mapistore_table_type) tableType { uint32_t count; NSMutableArray *messageKeys; MAPIStoreMapping *mapping; NSString *messageURL, *messageKey; messageKeys = [NSMutableArray arrayWithCapacity: mids->cValues]; mapping = [self mapping]; for (count = 0; count < mids->cValues; count++) { messageURL = [mapping urlFromID: mids->lpui8[count]]; if (messageURL) { messageKey = [self childKeyFromURL: messageURL]; if (messageKey) [messageKeys addObject: messageKey]; } } return [self preloadMessageBodiesWithKeys: messageKeys ofTableType: tableType]; } - (enum mapistore_error) preloadMessageBodiesWithKeys: (NSArray *) keys ofTableType: (enum mapistore_table_type) tableType { return MAPISTORE_SUCCESS; } - (uint64_t) objectId { uint64_t objectId; NSString *folderKey; if (container) { folderKey = [NSString stringWithFormat: @"%@/", [sogoObject nameInContainer]]; objectId = [container idForObjectWithKey: folderKey]; } else objectId = [self idForObjectWithKey: nil]; return objectId; } - (uint64_t) idForObjectWithKey: (NSString *) childKey { return [[self context] idForObjectWithKey: childKey inFolderURL: [self url]]; } - (NSDate *) creationTime { return [dbFolder creationDate]; } - (NSDate *) lastModificationTime { return [dbFolder lastModified]; } /* subclasses */ - (MAPIStoreMessageTable *) messageTable { return nil; } - (NSArray *) messageKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { [self subclassResponsibility: _cmd]; return nil; } - (NSArray *) getDeletedKeysFromChangeNumber: (uint64_t) changeNum andCN: (NSNumber **) cnNbrs inTableType: (enum mapistore_table_type) tableType { return nil; } - (MAPIStoreMessage *) createMessage { [self logWithFormat: @"ignored method: %s", __PRETTY_FUNCTION__]; return nil; } - (NSCalendarDate *) lastMessageModificationTime { [self subclassResponsibility: _cmd]; return nil; } - (BOOL) subscriberCanCreateMessages { return NO; } - (BOOL) subscriberCanModifyMessages { return NO; } - (BOOL) subscriberCanReadMessages { return NO; } - (BOOL) subscriberCanDeleteMessages { return NO; } - (BOOL) subscriberCanCreateSubFolders { return NO; } - (BOOL) supportsSubFolders { return NO; } @end SOGo-2.1.1b/OpenChange/MAPIStoreDBFolder.m0000644000000000000000000002663112247657026016477 0ustar rootroot/* MAPIStoreDBFolder.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #import #import #import #import #import #import #import #import #import #import #import "EOQualifier+MAPI.h" #import "MAPIStoreContext.h" #import "MAPIStoreDBFolderTable.h" #import "MAPIStoreDBMessage.h" #import "MAPIStoreDBMessageTable.h" #import "MAPIStoreMapping.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "SOGoMAPIDBFolder.h" #import "SOGoMAPIDBMessage.h" #import "MAPIStoreDBFolder.h" #undef DEBUG #include #include static Class EOKeyValueQualifierK, SOGoMAPIDBFolderK, MAPIStoreDBFolderK; static NSString *MAPIStoreRightReadItems = @"RightsReadItems"; static NSString *MAPIStoreRightCreateItems = @"RightsCreateItems"; static NSString *MAPIStoreRightEditOwn = @"RightsEditOwn"; static NSString *MAPIStoreRightEditAll = @"RightsEditAll"; static NSString *MAPIStoreRightDeleteOwn = @"RightsDeleteOwn"; static NSString *MAPIStoreRightDeleteAll = @"RightsDeleteAll"; static NSString *MAPIStoreRightCreateSubfolders = @"RightsCreateSubfolders"; static NSString *MAPIStoreRightFolderOwner = @"RightsFolderOwner"; static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; @implementation MAPIStoreDBFolder + (void) initialize { EOKeyValueQualifierK = [EOKeyValueQualifier class]; SOGoMAPIDBFolderK = [SOGoMAPIDBFolder class]; MAPIStoreDBFolderK = [MAPIStoreDBFolder class]; } - (void) setupAuxiliaryObjects { [super setupAuxiliaryObjects]; ASSIGN (sogoObject, dbFolder); } - (MAPIStoreMessageTable *) messageTable { return [MAPIStoreDBMessageTable tableForContainer: self]; } - (MAPIStoreFolderTable *) folderTable { return [MAPIStoreDBFolderTable tableForContainer: self]; } - (enum mapistore_error) createFolder: (struct SRow *) aRow withFID: (uint64_t) newFID andKey: (NSString **) newKeyP { enum mapistore_error rc; NSString *folderName, *nameInContainer; SOGoMAPIDBFolder *newFolder; struct SPropValue *value; value = get_SPropValue_SRow (aRow, PidTagDisplayName); if (value) folderName = [NSString stringWithUTF8String: value->value.lpszW]; else { value = get_SPropValue_SRow (aRow, PidTagDisplayName_string8); if (value) folderName = [NSString stringWithUTF8String: value->value.lpszA]; else folderName = nil; } if (folderName) { nameInContainer = [NSString stringWithFormat: @"0x%.16"PRIx64, (unsigned long long) newFID]; newFolder = [SOGoMAPIDBFolderK objectWithName: nameInContainer inContainer: sogoObject]; [newFolder reloadIfNeeded]; [[newFolder properties] setObject: folderName forKey: MAPIPropertyKey (PidTagDisplayName)]; [newFolder save]; *newKeyP = nameInContainer; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_INVALID_PARAMETER; return rc; } - (enum mapistore_error) moveCopyToFolder: (MAPIStoreFolder *) targetFolder withNewName: (NSString *) newFolderName isMove: (BOOL) isMove isRecursive: (BOOL) isRecursive inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSString *path, *pathComponent, *targetPath, *newPath; NSString *newURL; MAPIStoreMapping *mapping; NSRange slashRange; if (isMove && [targetFolder isKindOfClass: MAPIStoreDBFolderK]) { path = [sogoObject path]; slashRange = [path rangeOfString: @"/" options: NSBackwardsSearch]; if (slashRange.location == NSNotFound) [NSException raise: @"MAPIStoreIOException" format: @"db folder path must start with a '/'"]; else pathComponent = [path substringFromIndex: slashRange.location + 1]; targetPath = [[targetFolder sogoObject] path]; newPath = [NSString stringWithFormat: @"%@/%@", targetPath, pathComponent]; [dbFolder changePathTo: newPath]; mapping = [self mapping]; newURL = [NSString stringWithFormat: @"%@%@/", [targetFolder url], pathComponent]; [mapping updateID: [self objectId] withURL: newURL]; [targetFolder cleanupCaches]; rc = MAPISTORE_SUCCESS; } else rc = [super moveCopyToFolder: targetFolder withNewName: newFolderName isMove: isMove isRecursive: isRecursive inMemCtx: memCtx]; return rc; } - (MAPIStoreMessage *) createMessage { MAPIStoreMessage *newMessage; SOGoMAPIDBMessage *fsObject; NSString *newKey; newKey = [NSString stringWithFormat: @"%@.plist", [SOGoObject globallyUniqueObjectId]]; fsObject = [SOGoMAPIDBMessage objectWithName: newKey inContainer: sogoObject]; [fsObject setObjectType: MAPIDBObjectTypeMessage]; [fsObject reloadIfNeeded]; newMessage = [MAPIStoreDBMessage mapiStoreObjectWithSOGoObject: fsObject inContainer: self]; return newMessage; } - (NSArray *) messageKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { NSArray *keys; SOGoUser *ownerUser; ownerUser = [[self userContext] sogoUser]; if ([[context activeUser] isEqual: ownerUser] || [self subscriberCanReadMessages]) keys = [(SOGoMAPIDBFolder *) sogoObject childKeysOfType: MAPIDBObjectTypeMessage includeDeleted: NO matchingQualifier: qualifier andSortOrderings: sortOrderings]; else keys = [NSArray array]; return keys; } - (NSArray *) folderKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { return [dbFolder childKeysOfType: MAPIDBObjectTypeFolder includeDeleted: NO matchingQualifier: qualifier andSortOrderings: sortOrderings]; } /* TODO: now that we are DB-based, this method can easily be implemented - (NSArray *) getDeletedKeysFromChangeNumber: (uint64_t) changeNum andCN: (NSNumber **) cnNbrs inTableType: (enum mapistore_table_type) tableType { } */ - (NSDate *) lastMessageModificationTime { NSUInteger count, max; NSDate *date, *fileDate; MAPIStoreDBMessage *msg; NSArray *messageKeys; messageKeys = [self messageKeys]; date = [NSCalendarDate date]; //[self logWithFormat: @"current date: %@", date]; max = [messageKeys count]; for (count = 0; count < max; count++) { msg = [self lookupMessage: [messageKeys objectAtIndex: count]]; fileDate = [msg lastModificationTime]; if ([date laterDate: fileDate] == fileDate) { //[self logWithFormat: @"current date: %@", date]; date = fileDate; } } return date; } - (SOGoFolder *) aclFolder { return sogoObject; } - (NSArray *) rolesForExchangeRights: (uint32_t) rights { NSMutableArray *roles; roles = [NSMutableArray arrayWithCapacity: 9]; if (rights & RightsReadItems) [roles addObject: MAPIStoreRightReadItems]; if (rights & RightsCreateItems) [roles addObject: MAPIStoreRightCreateItems]; if (rights & RightsEditOwn) [roles addObject: MAPIStoreRightEditOwn]; if (rights & RightsDeleteOwn) [roles addObject: MAPIStoreRightDeleteOwn]; if (rights & RightsEditAll) [roles addObject: MAPIStoreRightEditAll]; if (rights & RightsDeleteAll) [roles addObject: MAPIStoreRightDeleteAll]; if (rights & RightsCreateSubfolders) [roles addObject: MAPIStoreRightCreateSubfolders]; if (rights & RightsFolderOwner) [roles addObject: MAPIStoreRightFolderOwner]; if (rights & RightsFolderContact) [roles addObject: MAPIStoreRightFolderContact]; return roles; } - (uint32_t) exchangeRightsForRoles: (NSArray *) roles { uint32_t rights = 0; if ([roles containsObject: MAPIStoreRightReadItems]) rights |= RightsReadItems; if ([roles containsObject: MAPIStoreRightCreateItems]) rights |= RightsCreateItems; if ([roles containsObject: MAPIStoreRightEditOwn]) rights |= RightsEditOwn; if ([roles containsObject: MAPIStoreRightDeleteOwn]) rights |= RightsDeleteOwn; if ([roles containsObject: MAPIStoreRightEditAll]) rights |= RightsEditAll; if ([roles containsObject: MAPIStoreRightDeleteAll]) rights |= RightsDeleteAll; if ([roles containsObject: MAPIStoreRightCreateSubfolders]) rights |= RightsCreateSubfolders; if ([roles containsObject: MAPIStoreRightFolderOwner]) rights |= RightsFolderOwner; if ([roles containsObject: MAPIStoreRightFolderContact]) rights |= RightsFolderContact; if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ return rights; } - (BOOL) _testRoleForActiveUser: (const NSString *) role { SOGoUser *activeUser; NSArray *roles; activeUser = [[self context] activeUser]; roles = [[self aclFolder] aclsForUser: [activeUser login]]; return [roles containsObject: role]; } - (BOOL) subscriberCanCreateMessages { return [self _testRoleForActiveUser: MAPIStoreRightCreateItems]; } - (BOOL) subscriberCanModifyMessages { return ([self _testRoleForActiveUser: MAPIStoreRightEditAll] || [self _testRoleForActiveUser: MAPIStoreRightEditOwn]); } - (BOOL) subscriberCanReadMessages { NSString *displayName; /* when this folder is the "Freebusy Data" folder, we need to allow subscribed to read an open contained messages in order to enable them to find the "LocalFreebusy" message */ [sogoObject reloadIfNeeded]; displayName = [[sogoObject properties] objectForKey: MAPIPropertyKey (PidTagDisplayName)]; return ([displayName isEqualToString: @"Freebusy Data"] || [self _testRoleForActiveUser: MAPIStoreRightReadItems]); } - (BOOL) subscriberCanDeleteMessages { return ([self _testRoleForActiveUser: MAPIStoreRightDeleteAll] || [self _testRoleForActiveUser: MAPIStoreRightDeleteOwn]); } - (BOOL) subscriberCanCreateSubFolders { return [self _testRoleForActiveUser: MAPIStoreRightCreateSubfolders]; } - (BOOL) supportsSubFolders { return YES; } @end SOGo-2.1.1b/OpenChange/MAPIStoreActiveTables.h0000644000000000000000000000254112247657026017411 0ustar rootroot/* MAPIStoreActiveTables.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 MAPISTOREACTIVETABLES_H #define MAPISTOREACTIVETABLES_H #import @class NSMutableArray; @class MAPIStoreTable; @interface MAPIStoreActiveTables : NSObject { NSMutableArray *records; } + (id) activeTables; - (void) registerTable: (MAPIStoreTable *) table; - (void) unregisterTable: (MAPIStoreTable *) table; - (NSArray *) activeTablesForFMID: (uint64_t) fmid andType: (uint8_t) tableType; @end #endif /* MAPISTOREACTIVETABLES_H */ SOGo-2.1.1b/OpenChange/MAPIStoreTable.m0000644000000000000000000006053612247657026016107 0ustar rootroot/* MAPIStoreTable.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 #import "EOBitmaskQualifier.h" #import "MAPIStoreActiveTables.h" #import "MAPIStoreObject.h" #import "MAPIStoreTypes.h" #import "NSData+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreContext.h" #import "MAPIStoreObject.h" #import "MAPIStoreTable.h" #undef DEBUG #include #include #include @interface MAPIStoreTable (Private) - (MAPIRestrictionState) evaluateRestriction: (const struct mapi_SRestriction *) res intoQualifier: (EOQualifier **) qualifier; @end static Class NSDataK, NSStringK; // static NSString * // MAPIStringForRestrictionState (MAPIRestrictionState state) // { // NSString *stateStr; // if (state == MAPIRestrictionStateAlwaysTrue) // stateStr = @"always true"; // else if (state == MAPIRestrictionStateAlwaysFalse) // stateStr = @"always false"; // else // stateStr = @"needs eval"; // return stateStr; // } // static NSString * // MAPIStringForRestriction (const struct mapi_SRestriction *resPtr); // static NSString * // _MAPIIndentString(int indent) // { // NSString *spaces; // char *buffer; // if (indent > 0) // { // buffer = malloc (indent + 1); // memset (buffer, 32, indent); // *(buffer+indent) = 0; // spaces = [NSString stringWithFormat: @"%s", buffer]; // free (buffer); // } // else // spaces = @""; // return spaces; // } // static NSString * // MAPIStringForAndRestriction (const struct mapi_SAndRestriction *resAnd) // { // NSMutableArray *restrictions; // uint16_t count; // restrictions = [NSMutableArray arrayWithCapacity: 8]; // for (count = 0; count < resAnd->cRes; count++) // [restrictions addObject: MAPIStringForRestriction ((struct mapi_SRestriction *) resAnd->res + count)]; // return [NSString stringWithFormat: @"(%@)", [restrictions componentsJoinedByString: @" && "]]; // } // static NSString * // MAPIStringForOrRestriction (const struct mapi_SOrRestriction *resOr) // { // NSMutableArray *restrictions; // uint16_t count; // restrictions = [NSMutableArray arrayWithCapacity: 8]; // for (count = 0; count < resOr->cRes; count++) // [restrictions addObject: MAPIStringForRestriction ((struct mapi_SRestriction *) resOr->res + count)]; // return [NSString stringWithFormat: @"(%@)", [restrictions componentsJoinedByString: @" || "]]; // } // static NSString * // MAPIStringForNotRestriction (const struct mapi_SNotRestriction *resNot) // { // return [NSString stringWithFormat: @"!(%@)", // MAPIStringForRestriction ((struct mapi_SRestriction *) &resNot->res)]; // } // static NSString * // MAPIStringForContentRestriction (const struct mapi_SContentRestriction *resContent) // { // NSString *eqMatch, *caseMatch; // id value; // const char *propName; // switch (resContent->fuzzy & 0xf) // { // case 0: eqMatch = @"eq"; break; // case 1: eqMatch = @"substring"; break; // case 2: eqMatch = @"prefix"; break; // default: eqMatch = @"[unknown]"; // } // switch (((resContent->fuzzy) >> 16) & 0xf) // { // case 0: caseMatch = @"fl"; break; // case 1: caseMatch = @"nc"; break; // case 2: caseMatch = @"ns"; break; // case 4: caseMatch = @"lo"; break; // default: caseMatch = @"[unknown]"; // } // propName = get_proptag_name (resContent->ulPropTag); // if (!propName) // propName = ""; // value = NSObjectFromMAPISPropValue (&resContent->lpProp); // return [NSString stringWithFormat: @"%s(0x%.8x) %@,%@ %@", // propName, resContent->ulPropTag, eqMatch, caseMatch, value]; // } // static NSString * // MAPIStringForExistRestriction (const struct mapi_SExistRestriction *resExist) // { // const char *propName; // propName = get_proptag_name (resExist->ulPropTag); // if (!propName) // propName = ""; // return [NSString stringWithFormat: @"%s(0x%.8x) IS NOT NULL", propName, resExist->ulPropTag]; // } // static NSString * // MAPIStringForPropertyRestriction (const struct mapi_SPropertyRestriction *resProperty) // { // static NSString *operators[] = { @"<", @"<=", @">", @">=", @"==", @"!=", // @"=~" }; // NSString *operator; // id value; // const char *propName; // propName = get_proptag_name (resProperty->ulPropTag); // if (!propName) // propName = ""; // if (resProperty->relop >= 0 && resProperty->relop < 7) // operator = operators[resProperty->relop]; // else // operator = [NSString stringWithFormat: @"", resProperty->relop]; // value = NSObjectFromMAPISPropValue (&resProperty->lpProp); // return [NSString stringWithFormat: @"%s(0x%.8x) %@ %@", // propName, resProperty->ulPropTag, operator, value]; // } // static NSString * // MAPIStringForBitmaskRestriction (const struct mapi_SBitmaskRestriction *resBitmask) // { // NSString *format; // const char *propName; // propName = get_proptag_name (resBitmask->ulPropTag); // if (!propName) // propName = ""; // if (resBitmask->relMBR == 0) // format = @"((%s(0x%.8x) & 0x%.8x) == 0)"; // else // format = @"((%s(0x%.8x) & 0x%.8x) != 0)"; // return [NSString stringWithFormat: format, // propName, resBitmask->ulPropTag, resBitmask->ulMask]; // } // static NSString * // MAPIStringForRestriction (const struct mapi_SRestriction *resPtr) // { // NSString *restrictionStr; // if (resPtr) // { // switch (resPtr->rt) // { // // RES_CONTENT=(int)(0x3), // // RES_BITMASK=(int)(0x6), // // RES_EXIST=(int)(0x8), // case 0: restrictionStr = MAPIStringForAndRestriction(&resPtr->res.resAnd); break; // case 1: restrictionStr = MAPIStringForOrRestriction(&resPtr->res.resOr); break; // case 2: restrictionStr = MAPIStringForNotRestriction(&resPtr->res.resNot); break; // case 3: restrictionStr = MAPIStringForContentRestriction(&resPtr->res.resContent); break; // case 4: restrictionStr = MAPIStringForPropertyRestriction(&resPtr->res.resProperty); break; // case 6: restrictionStr = MAPIStringForBitmaskRestriction(&resPtr->res.resBitmask); break; // case 8: restrictionStr = MAPIStringForExistRestriction(&resPtr->res.resExist); break; // // case 5: MAPIStringForComparePropsRestriction(&resPtr->res.resCompareProps); break; // // case 7: MAPIStringForPropertyRestriction(&resPtr->res.resProperty); break; // // case 9: MAPIStringForPropertyRestriction(&resPtr->res.resProperty); break; // // case 10: MAPIStringForPropertyRestriction(&resPtr->res.resProperty); break; // default: // restrictionStr // = [NSString stringWithFormat: @"[unhandled restriction type: %d]", // resPtr->rt]; // } // } // else // restrictionStr = @"[unrestricted]"; // return restrictionStr; // } @implementation MAPIStoreTable + (void) initialize { NSDataK = [NSData class]; NSStringK = [NSString class]; } + (id) tableForContainer: (MAPIStoreObject *) newContainer { MAPIStoreTable *newTable; newTable = [[self alloc] initForContainer: newContainer]; [newTable autorelease]; return newTable; } + (Class) childObjectClass { [self subclassResponsibility: _cmd]; return Nil; } - (id) init { if ((self = [super init])) { // [self logWithFormat: @"-init"]; tableType = MAPISTORE_MESSAGE_TABLE; handleId = -1; container = nil; childKeys = nil; restrictedChildKeys = nil; currentRow = (uint32_t) -1; currentChild = nil; restriction = nil; restrictionState = MAPIRestrictionStateAlwaysTrue; sortOrderings = nil; columns = NULL; columnsCount = 0; } return self; } - (id) initForContainer: (MAPIStoreObject *) newContainer { if ((self = [self init])) { container = newContainer; } return self; } // - (id) retain // { // [self logWithFormat: @"-retain"]; // return [super retain]; // } // - (void) release // { // [self logWithFormat: @"-release"]; // [super release]; // } - (void) dealloc { // [self logWithFormat: @"-dealloc"]; if (columns) NSZoneFree (NULL, columns); [currentChild release]; [childKeys release]; [restrictedChildKeys release]; [sortOrderings release]; [restriction release]; [super dealloc]; } - (id) container { return container; } - (enum mapistore_table_type) tableType { return tableType; } - (void) setHandleId: (uint32_t) newHandleId { handleId = newHandleId; if (newHandleId) [[MAPIStoreActiveTables activeTables] registerTable: self]; } - (void) destroyHandle: (uint32_t) tableHandleId { if (tableHandleId && (handleId == tableHandleId)) [[MAPIStoreActiveTables activeTables] unregisterTable: self]; } - (void) cleanupCaches { [restrictedChildKeys release]; restrictedChildKeys = nil; [childKeys release]; childKeys = nil; [currentChild release]; currentChild = nil; currentRow = (uint32_t) -1; } - (int) getAvailableProperties: (struct SPropTagArray **) propertiesP inMemCtx: (TALLOC_CTX *) memCtx { return [[isa childObjectClass] getAvailableProperties: propertiesP inMemCtx: memCtx]; } - (void) setRestrictions: (const struct mapi_SRestriction *) res { //EOQualifier *oldRestriction; // [self logWithFormat: @"set restriction to (table type: %d): %@", // type, MAPIStringForRestriction (res)]; //oldRestriction = restriction; [restriction autorelease]; if (res) restrictionState = [self evaluateRestriction: res intoQualifier: &restriction]; else restrictionState = MAPIRestrictionStateAlwaysTrue; if (restrictionState == MAPIRestrictionStateNeedsEval) [restriction retain]; else restriction = nil; // FIXME: we should not flush the caches if the restrictions matches [self cleanupCaches]; //if (restriction) // [self logWithFormat: @"restriction set to EOQualifier: %@", // restriction]; // else if (oldRestriction) // [self logWithFormat: @"restriction unset (was %@)", oldRestriction]; } - (MAPIRestrictionState) evaluateNotRestriction: (struct mapi_SNotRestriction *) res intoQualifier: (EOQualifier **) qualifierPtr { MAPIRestrictionState state, subState; EONotQualifier *qualifier; EOQualifier *subQualifier; subState = [self evaluateRestriction: (struct mapi_SRestriction *)&res->res intoQualifier: &subQualifier]; if (subState == MAPIRestrictionStateAlwaysTrue) state = MAPIRestrictionStateAlwaysFalse; else if (subState == MAPIRestrictionStateAlwaysFalse) state = MAPIRestrictionStateAlwaysTrue; else { state = MAPIRestrictionStateNeedsEval; qualifier = [[EONotQualifier alloc] initWithQualifier: subQualifier]; [qualifier autorelease]; *qualifierPtr = qualifier; } return state; } - (MAPIRestrictionState) evaluateAndRestriction: (struct mapi_SAndRestriction *) res intoQualifier: (EOQualifier **) qualifierPtr { MAPIRestrictionState state, subState; EOAndQualifier *qualifier; EOQualifier *subQualifier; NSMutableArray *subQualifiers; uint16_t count; state = MAPIRestrictionStateNeedsEval; subQualifiers = [NSMutableArray arrayWithCapacity: 8]; for (count = 0; state == MAPIRestrictionStateNeedsEval && count < res->cRes; count++) { subState = [self evaluateRestriction: (struct mapi_SRestriction *) res->res + count intoQualifier: &subQualifier]; if (subState == MAPIRestrictionStateNeedsEval) [subQualifiers addObject: subQualifier]; else if (subState == MAPIRestrictionStateAlwaysFalse) state = MAPIRestrictionStateAlwaysFalse; } if (state == MAPIRestrictionStateNeedsEval) { if ([subQualifiers count] == 0) state = MAPIRestrictionStateAlwaysTrue; else { qualifier = [[EOAndQualifier alloc] initWithQualifierArray: subQualifiers]; [qualifier autorelease]; *qualifierPtr = qualifier; } } return state; } - (MAPIRestrictionState) evaluateOrRestriction: (struct mapi_SOrRestriction *) res intoQualifier: (EOQualifier **) qualifierPtr { MAPIRestrictionState state, subState; EOOrQualifier *qualifier; EOQualifier *subQualifier; NSMutableArray *subQualifiers; uint16_t count, falseCount; state = MAPIRestrictionStateNeedsEval; falseCount = 0; subQualifiers = [NSMutableArray arrayWithCapacity: 8]; for (count = 0; state == MAPIRestrictionStateNeedsEval && count < res->cRes; count++) { subState = [self evaluateRestriction: (struct mapi_SRestriction *) res->res + count intoQualifier: &subQualifier]; if (subState == MAPIRestrictionStateNeedsEval) [subQualifiers addObject: subQualifier]; else if (subState == MAPIRestrictionStateAlwaysTrue) state = MAPIRestrictionStateAlwaysTrue; else falseCount++; } if (falseCount == res->cRes) state = MAPIRestrictionStateAlwaysFalse; else if ([subQualifiers count] == 0) state = MAPIRestrictionStateAlwaysTrue; if (state == MAPIRestrictionStateNeedsEval) { qualifier = [[EOOrQualifier alloc] initWithQualifierArray: subQualifiers]; [qualifier autorelease]; *qualifierPtr = qualifier; } return state; } - (void) warnUnhandledProperty: (enum MAPITAGS) property inFunction: (const char *) function { const char *propName; propName = get_proptag_name (property); if (!propName) propName = ""; [self warnWithFormat: @"property %s (%.8x) has no matching field name (%@) in '%s'", propName, property, self, function]; } - (MAPIRestrictionState) evaluateContentRestriction: (struct mapi_SContentRestriction *) res intoQualifier: (EOQualifier **) qualifier { NSString *property; // SEL operator; id value; MAPIRestrictionState rc; property = [self backendIdentifierForProperty: res->ulPropTag]; if (property) { value = NSObjectFromMAPISPropValue (&res->lpProp); if ([value isKindOfClass: NSDataK]) { value = [[NSString alloc] initWithData: value encoding: NSUTF8StringEncoding]; [value autorelease]; } else if (![value isKindOfClass: NSStringK]) [NSException raise: @"MAPIStoreTypeConversionException" format: @"unhandled content restriction for class '%@'", NSStringFromClass ([value class])]; // switch (res->fuzzy & 0xf) // { // case 0: // operator = EOQualifierOperatorEqual; // break; // case 1: // operator = EOQualifierOperatorLike; // value = [NSString stringWithFormat: @"%%%@%%", value]; // break; // case 2: // operator = EOQualifierOperatorEqual; // value = [NSString stringWithFormat: @"%@%%", value]; // break; // default: [NSException raise: @"MAPIStoreInvalidOperatorException" // format: @"fuzzy operator value '%.4x' is invalid", // res->fuzzy]; // } *qualifier = [[EOKeyValueQualifier alloc] initWithKey: property operatorSelector: EOQualifierOperatorCaseInsensitiveLike value: value]; [*qualifier autorelease]; [self logWithFormat: @"%s: resulting qualifier: %@", __PRETTY_FUNCTION__, *qualifier]; rc = MAPIRestrictionStateNeedsEval; } else { [self warnUnhandledProperty: res->ulPropTag inFunction: __FUNCTION__]; rc = MAPIRestrictionStateAlwaysFalse; } return rc; } - (SEL) operatorFromRestrictionOperator: (uint32_t) resOp { static SEL operators[] = { EOQualifierOperatorLessThan, EOQualifierOperatorLessThanOrEqualTo, EOQualifierOperatorGreaterThan, EOQualifierOperatorGreaterThanOrEqualTo, EOQualifierOperatorEqual, EOQualifierOperatorNotEqual, EOQualifierOperatorContains }; SEL operator; if (resOp < 7) operator = operators[resOp]; else { operator = NULL; [NSException raise: @"MAPIStoreRestrictionException" format: @"unhandled operator type number %d", resOp]; } return operator; } - (MAPIRestrictionState) evaluatePropertyRestriction: (struct mapi_SPropertyRestriction *) res intoQualifier: (EOQualifier **) qualifier { SEL operator; id value; NSString *property; MAPIRestrictionState rc; property = [self backendIdentifierForProperty: res->ulPropTag]; if (property) { operator = [self operatorFromRestrictionOperator: res->relop]; value = NSObjectFromMAPISPropValue (&res->lpProp); *qualifier = [[EOKeyValueQualifier alloc] initWithKey: property operatorSelector: operator value: value]; [*qualifier autorelease]; rc = MAPIRestrictionStateNeedsEval; } else { [self warnUnhandledProperty: res->ulPropTag inFunction: __FUNCTION__]; rc = MAPIRestrictionStateAlwaysFalse; } return rc; } - (MAPIRestrictionState) evaluateBitmaskRestriction: (struct mapi_SBitmaskRestriction *) res intoQualifier: (EOQualifier **) qualifier { NSString *property; MAPIRestrictionState rc; property = [self backendIdentifierForProperty: res->ulPropTag]; if (property) { *qualifier = [[EOBitmaskQualifier alloc] initWithKey: property mask: res->ulMask isZero: (res->relMBR == BMR_EQZ)]; [*qualifier autorelease]; rc = MAPIRestrictionStateNeedsEval; } else { [self warnUnhandledProperty: res->ulPropTag inFunction: __FUNCTION__]; rc = MAPIRestrictionStateAlwaysFalse; } return rc; } - (MAPIRestrictionState) evaluateExistRestriction: (struct mapi_SExistRestriction *) res intoQualifier: (EOQualifier **) qualifier { NSString *property; MAPIRestrictionState rc; property = [self backendIdentifierForProperty: res->ulPropTag]; if (property) { *qualifier = [[EOKeyValueQualifier alloc] initWithKey: property operatorSelector: EOQualifierOperatorNotEqual value: nil]; [*qualifier autorelease]; rc = MAPIRestrictionStateNeedsEval; } else { [self warnUnhandledProperty: res->ulPropTag inFunction: __FUNCTION__]; rc = MAPIRestrictionStateAlwaysFalse; } return rc; } - (MAPIRestrictionState) evaluateRestriction: (struct mapi_SRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState state; switch (res->rt) { /* basic operators */ case RES_AND: state = [self evaluateAndRestriction: &res->res.resAnd intoQualifier: qualifier]; break; case RES_OR: state = [self evaluateOrRestriction: &res->res.resOr intoQualifier: qualifier]; break; case RES_NOT: state = [self evaluateNotRestriction: &res->res.resNot intoQualifier: qualifier]; break; /* content restrictions */ case RES_CONTENT: state = [self evaluateContentRestriction: &res->res.resContent intoQualifier: qualifier]; break; case RES_PROPERTY: state = [self evaluatePropertyRestriction: &res->res.resProperty intoQualifier: qualifier]; break; case RES_BITMASK: state = [self evaluateBitmaskRestriction: &res->res.resBitmask intoQualifier: qualifier]; break; case RES_SIZE: state = MAPIRestrictionStateAlwaysTrue; /* let's cheat a little */ break; case RES_EXIST: state = [self evaluateExistRestriction: &res->res.resExist intoQualifier: qualifier]; break; case RES_COMMENT: if (res->res.resComment.RestrictionPresent) state = [self evaluateRestriction: (struct mapi_SRestriction *) res->res.resComment.Restriction.res intoQualifier: qualifier]; else state = MAPIRestrictionStateAlwaysTrue; break; // case 5: MAPIStringForComparePropsRestriction(&resPtr->res.resCompareProps); break; // case 7: MAPIStringForPropertyRestriction(&resPtr->res.resProperty); break; // case 9: MAPIStringForPropertyRestriction(&resPtr->res.resProperty); break; // case 10: MAPIStringForPropertyRestriction(&resPtr->res.resProperty); break; default: [NSException raise: @"MAPIStoreRestrictionException" format: @"unhandled restriction type: %.2x", res->rt]; state = MAPIRestrictionStateAlwaysTrue; } // [self logRestriction: res withState: state]; return state; } /* proof of concept */ - (int) setColumns: (enum MAPITAGS *) newColumns withCount: (uint16_t) newColumnsCount { NSUInteger count; if (columns) NSZoneFree (NULL, columns); columns = NSZoneMalloc (NULL, newColumnsCount * sizeof (enum MAPITAGS)); for (count = 0; count < newColumnsCount; count++) columns[count] = newColumns[count]; columnsCount = newColumnsCount; return MAPISTORE_SUCCESS; } - (id) childAtRowID: (uint32_t) rowId forQueryType: (enum mapistore_query_type) queryType { id child; NSArray *children, *restrictedChildren; NSString *childKey; if (rowId == currentRow) child = currentChild; else { [currentChild release]; child = nil; if (queryType == MAPISTORE_PREFILTERED_QUERY) { children = [self restrictedChildKeys]; restrictedChildren = nil; } else { children = [self childKeys]; restrictedChildren = [self restrictedChildKeys]; } if ([children count] > rowId) { childKey = [children objectAtIndex: rowId]; if (queryType == MAPISTORE_PREFILTERED_QUERY || [restrictedChildren containsObject: childKey]) child = [self lookupChild: childKey]; } currentChild = child; [currentChild retain]; if (child) currentRow = rowId; else currentRow = (uint32_t) -1; } return child; } - (NSArray *) childKeys { [self subclassResponsibility: _cmd]; return nil; } - (NSArray *) restrictedChildKeys { [self subclassResponsibility: _cmd]; return nil; } - (id) lookupChild: (NSString *) childKey { [self subclassResponsibility: _cmd]; return nil; } - (int) getRow: (struct mapistore_property_data **) dataP withRowID: (uint32_t) rowId andQueryType: (enum mapistore_query_type) queryType inMemCtx: (TALLOC_CTX *) memCtx { NSUInteger count; MAPIStoreObject *child; struct mapistore_property_data *rowData; int rc; child = [self childAtRowID: rowId forQueryType: queryType]; if (child) { rowData = talloc_array(memCtx, struct mapistore_property_data, columnsCount); for (count = 0; count < columnsCount; count++) rowData[count].error = [child getProperty: &rowData[count].data withTag: columns[count] inMemCtx: memCtx]; *dataP = rowData; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getRowCount: (uint32_t *) countP withQueryType: (enum mapistore_query_type) queryType { NSArray *children; if (queryType == MAPISTORE_PREFILTERED_QUERY) children = [self restrictedChildKeys]; else children = [self childKeys]; *countP = [children count]; return MAPISTORE_SUCCESS; } /* subclasses */ - (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property { [self subclassResponsibility: _cmd]; return nil; } - (void) setSortOrder: (const struct SSortOrderSet *) set { [self subclassResponsibility: _cmd]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreTable.h0000644000000000000000000001001112247657026016061 0ustar rootroot/* MAPIStoreTable.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 MAPISTORETABLE_H #define MAPISTORETABLE_H #include #import "NSObject+MAPIStore.h" #undef DEBUG #include #define SENSITIVITY_NONE 0 #define SENSITIVITY_PERSONAL 1 #define SENSITIVITY_PRIVATE 2 #define SENSITIVITY_COMPANY_CONFIDENTIAL 3 typedef enum { MAPIRestrictionStateAlwaysFalse = NO, MAPIRestrictionStateAlwaysTrue = YES, MAPIRestrictionStateNeedsEval, /* needs passing of qualifier to underlying database */ } MAPIRestrictionState; @class NSArray; @class NSMutableArray; @class NSString; @class EOQualifier; @class MAPIStoreObject; @interface MAPIStoreTable : NSObject { MAPIStoreObject *container; uint32_t handleId; /* hack for identifying tables during notifications */ NSArray *childKeys; NSArray *restrictedChildKeys; EOQualifier *restriction; /* should probably be a dictionary too */ MAPIRestrictionState restrictionState; NSMutableArray *sortOrderings; uint32_t currentRow; MAPIStoreObject *currentChild; enum mapistore_table_type tableType; /* mapistore */ /* proof of concept */ uint16_t columnsCount; enum MAPITAGS *columns; } + (id) tableForContainer: (MAPIStoreObject *) newContainer; + (Class) childObjectClass; - (id) initForContainer: (MAPIStoreObject *) newContainer; - (id) container; - (enum mapistore_table_type) tableType; - (void) setHandleId: (uint32_t) newHandleId; - (void) destroyHandle: (uint32_t) handleId; - (id) childAtRowID: (uint32_t) rowId forQueryType: (enum mapistore_query_type) queryType; - (void) cleanupCaches; - (int) getAvailableProperties: (struct SPropTagArray **) propertiesP inMemCtx: (TALLOC_CTX *) localMemCtx; - (void) setRestrictions: (const struct mapi_SRestriction *) res; - (int) setColumns: (enum MAPITAGS *) newColumns withCount: (uint16_t) newColumCount; - (int) getRow: (struct mapistore_property_data **) dataP withRowID: (uint32_t) rowId andQueryType: (enum mapistore_query_type) queryType inMemCtx: (TALLOC_CTX *) memCtx; - (int) getRowCount: (uint32_t *) countP withQueryType: (enum mapistore_query_type) queryType; /* helpers */ - (SEL) operatorFromRestrictionOperator: (uint32_t) resOp; - (void) warnUnhandledProperty: (enum MAPITAGS) property inFunction: (const char *) function; /* subclasses */ - (NSArray *) childKeys; - (NSArray *) restrictedChildKeys; - (id) lookupChild: (NSString *) childKey; - (void) setSortOrder: (const struct SSortOrderSet *) set; - (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property; - (MAPIRestrictionState) evaluateContentRestriction: (const struct mapi_SContentRestriction *) res intoQualifier: (EOQualifier **) qualifier; - (MAPIRestrictionState) evaluatePropertyRestriction: (const struct mapi_SPropertyRestriction *) res intoQualifier: (EOQualifier **) qualifier; - (MAPIRestrictionState) evaluateBitmaskRestriction: (const struct mapi_SBitmaskRestriction *) res intoQualifier: (EOQualifier **) qualifier; - (MAPIRestrictionState) evaluateExistRestriction: (const struct mapi_SExistRestriction *) res intoQualifier: (EOQualifier **) qualifier; @end #endif /* MAPISTORETABLE_H */ SOGo-2.1.1b/OpenChange/NSArray+MAPIStore.h0000644000000000000000000000413012247657026016431 0ustar rootroot/* NSArray+MAPIStore.h - this file is part of SOGo * * Copyright (C) 2010 Inverse inc. * * 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 3, 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 NSARRAY_MAPISTORE_H #define NSARRAY_MAPISTORE_H #import @interface NSArray (MAPIStoreFolders) /* mapi structs */ + (id) arrayFromMAPIMVLong: (const struct mapi_MV_LONG_STRUCT *) mvLong; + (id) arrayFromMAPIMVUnicode: (const struct mapi_SLPSTRArrayW *) mvUnicode; + (id) arrayFromMAPIMVString: (const struct mapi_SLPSTRArray *) mvString; + (id) arrayFromMAPIMVBinary: (const struct mapi_SBinaryArray *) mvBinary; + (id) arrayFromMAPIMVGuid: (const struct mapi_SGuidArray *) mvGuid; + (id) arrayFromMVShort: (const struct ShortArray_r *) mvShort; + (id) arrayFromMVLong: (const struct LongArray_r *) mvLong; - (struct LongArray_r *) asMVLongInMemCtx: (void *) memCtx; + (id) arrayFromMVUI8: (const struct UI8Array_r *) mvI8; + (id) arrayFromMVString: (const struct StringArray_r *) mvString; + (id) arrayFromMVUnicode: (const struct StringArrayW_r *) mvUnicode; - (struct StringArrayW_r *) asMVUnicodeInMemCtx: (void *) memCtx; + (id) arrayFromMVBinary: (const struct BinaryArray_r *) mvBinary; - (struct BinaryArray_r *) asMVBinaryInMemCtx: (void *) memCtx; + (id) arrayFromMVGuid: (const struct FlatUIDArray_r *) mvGuid; + (id) arrayFromMVFileTime: (const struct DateTimeArray_r *) mvGuid; @end #endif /* NSARRAY+MAPISTORE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreAttachmentTable.m0000644000000000000000000000400012247657026020100 0ustar rootroot/* MAPIStoreAttachmentTable.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 "MAPIStoreMessage.h" #import "MAPIStoreAttachmentTable.h" @implementation MAPIStoreAttachmentTable - (NSArray *) childKeys { if (!childKeys) { childKeys = [(MAPIStoreMessage *) container attachmentKeysMatchingQualifier: nil andSortOrderings: sortOrderings]; [childKeys retain]; } return childKeys; } - (NSArray *) restrictedChildKeys { NSArray *keys; if (!restrictedChildKeys) { if (restrictionState != MAPIRestrictionStateAlwaysTrue) { if (restrictionState == MAPIRestrictionStateNeedsEval) keys = [(MAPIStoreMessage *) container attachmentKeysMatchingQualifier: restriction andSortOrderings: sortOrderings]; else keys = [NSArray array]; } else keys = [self childKeys]; ASSIGN (restrictedChildKeys, keys); } return restrictedChildKeys; } - (id) lookupChild: (NSString *) childKey { return [(MAPIStoreMessage *) container lookupAttachment: childKey]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreMIME.m0000644000000000000000000000747312247657026015610 0ustar rootroot/* MAPIStoreMIME.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import "MAPIStoreMIME.h" /* Seems common to all distros ? */ #define MAPIStoreMIMEFile @"/etc/mime.types" @implementation MAPIStoreMIME + (id) sharedMAPIStoreMIME { static MAPIStoreMIME *sharedInstance = nil; if (!sharedInstance) sharedInstance = [self new]; return sharedInstance; } - (void) _parseLine: (const char *) line withLength: (NSUInteger) length { NSUInteger count = 0, lastWord = 0; NSString *mimeType = nil, *word; NSData *wordData; BOOL comment = NO; while (count < length && !comment) { while (count < length && (line[count] == ' ' || line[count] == '\t')) count++; lastWord = count; while (count < length && line[count] != ' ' && line[count] != '\t' && !comment) { if (line[count] == '#') comment = YES; else count++; } if (count > lastWord) { wordData = [NSData dataWithBytes: line + lastWord length: count - lastWord]; word = [[NSString alloc] initWithData: wordData encoding: NSASCIIStringEncoding]; if (word) { if (mimeType) { [mimeDict setObject: mimeType forKey: word]; [word release]; } else mimeType = word; } } } [mimeType release]; } - (void) _parseContent: (NSData *) content { const char *data; NSUInteger lineStart = 0, bytesRead = 0, max; data = [content bytes]; max = [content length]; bytesRead = 0; lineStart = 0; while (bytesRead < max) { if (data[bytesRead] == '\n') { [self _parseLine: data + lineStart withLength: bytesRead - lineStart]; lineStart = bytesRead + 1; } else if (data[bytesRead] == '\r') { [self _parseLine: data + lineStart withLength: bytesRead - lineStart]; if (bytesRead < (max - 1) && data[bytesRead] == '\n') lineStart = bytesRead + 2; else lineStart = bytesRead + 1; } bytesRead++; } if (bytesRead > (lineStart + 1)) [self _parseLine: data + lineStart withLength: bytesRead - lineStart]; } - (void) _readMIMEFile { NSFileHandle *inH; NSData *content; inH = [NSFileHandle fileHandleForReadingAtPath: MAPIStoreMIMEFile]; content = [inH readDataToEndOfFile]; [self _parseContent: content]; } - (id) init { if ((self = [super init])) { mimeDict = [NSMutableDictionary new]; [self _readMIMEFile]; } return self; } - (void) dealloc { [mimeDict release]; [super dealloc]; } - (NSString *) mimeTypeForExtension: (NSString *) extension { return [mimeDict objectForKey: [extension lowercaseString]]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreDBFolder.h0000644000000000000000000000202412247657026016460 0ustar rootroot/* MAPIStoreDBFolder.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 MAPISTOREDBFOLDER_H #define MAPISTOREDBFOLDER_H #import "MAPIStoreFolder.h" @interface MAPIStoreDBFolder : MAPIStoreFolder @end #endif /* MAPISTOREDBFOLDER_H */ SOGo-2.1.1b/OpenChange/MAPIStoreContactsMessageTable.h0000644000000000000000000000214512247657026021076 0ustar rootroot/* MAPIStoreContactsMessageTable.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 MAPISTORECONTACTSMESSAGETABLE_H #define MAPISTORECONTACTSMESSAGETABLE_H #import "MAPIStoreGCSMessageTable.h" @interface MAPIStoreContactsMessageTable : MAPIStoreGCSMessageTable @end #endif /* MAPISTORECONTACTSMESSAGETABLE_H */ SOGo-2.1.1b/OpenChange/iCalEvent+MAPIStore.m0000644000000000000000000004306212247657027017001 0ustar rootroot/* iCalEvent+MAPIStore.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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. */ #include #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "MAPIStoreAppointmentWrapper.h" #import "MAPIStoreCalendarAttachment.h" #import "MAPIStoreCalendarFolder.h" #import "MAPIStoreContext.h" #import "MAPIStoreMapping.h" #import "MAPIStoreRecurrenceUtils.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSDate+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "NSValue+MAPIStore.h" #import "MAPIStoreCalendarMessage.h" #undef DEBUG #include #include #include #include #include #include #include #import "iCalEvent+MAPIStore.h" @implementation iCalEvent (MAPIStoreProperties) - (void) _setupEventRecurrence: (NSData *) mapiRecurrenceData inMemCtx: (TALLOC_CTX *) memCtx { struct Binary_r *blob; struct AppointmentRecurrencePattern *pattern; blob = [mapiRecurrenceData asBinaryInMemCtx: memCtx]; pattern = get_AppointmentRecurrencePattern (memCtx, blob); [(iCalCalendar *) parent setupRecurrenceWithMasterEntity: self fromRecurrencePattern: &pattern->RecurrencePattern]; //talloc_free (blob); } - (void) _setupEventAlarmFromProperties: (NSDictionary *) properties { NSArray *alarms; iCalAlarm *currentAlarm, *alarm = nil; iCalTrigger *trigger; NSNumber *delta; NSString *action; NSUInteger count, max; /* find and remove first display alarm */ alarms = [self alarms]; max = [alarms count]; for (count = 0; !alarm && count < max; count++) { currentAlarm = [alarms objectAtIndex: count]; action = [[currentAlarm action] lowercaseString]; if (!action || [action isEqualToString: @"display"]) alarm = currentAlarm; } if (alarm) [self removeChild: alarm]; if ([[properties objectForKey: MAPIPropertyKey (PidLidReminderSet)] boolValue]) { delta = [properties objectForKey: MAPIPropertyKey (PidLidReminderDelta)]; if (delta) { alarm = [iCalAlarm new]; [alarm setAction: @"DISPLAY"]; trigger = [iCalTrigger elementWithTag: @"trigger"]; [trigger setValueType: @"DURATION"]; [trigger setSingleValue: [NSString stringWithFormat: @"-PT%@M", delta] forKey: @""]; [alarm setTrigger: trigger]; [self addToAlarms: alarm]; [alarm release]; } } } - (void) updateFromMAPIProperties: (NSDictionary *) properties inUserContext: (MAPIStoreUserContext *) userContext withActiveUser: (SOGoUser *) activeUser inMemCtx: (TALLOC_CTX *) memCtx { BOOL isAllDay; iCalDateTime *start, *end; iCalTimeZone *tz; NSTimeZone *userTimeZone; NSString *priority; NSUInteger responseStatus = 0; NSInteger tzOffset; SOGoUser *ownerUser; id value; // value = [properties objectForKey: MAPIPropertyKey (PidTagMessageClass)]; // if (value) // isException = [value isEqualToString: @"IPM.OLE.CLASS.{00061055-0000-0000-C000-000000000046}"]; // else // isException = NO; /* privacy */ value = [properties objectForKey: MAPIPropertyKey(PidLidPrivate)]; if (value) { if ([value boolValue]) [self setAccessClass: @"PRIVATE"]; else [self setAccessClass: @"PUBLIC"]; } userTimeZone = [userContext timeZone]; /* CREATED */ value = [properties objectForKey: MAPIPropertyKey (PidTagCreationTime)]; if (value) [self setCreated: value]; // LAST-MODIFIED = PidTagLastModificationTime value = [properties objectForKey: MAPIPropertyKey (PidTagLastModificationTime)]; if (value) [self setLastModified: value]; /* DTSTAMP = PidLidOwnerCriticalChange or PidLidAttendeeCriticalChange */ value = [properties objectForKey: MAPIPropertyKey (PidLidOwnerCriticalChange)]; if (value) [self setTimeStampAsDate: value]; /* SUMMARY */ value = [properties objectForKey: MAPIPropertyKey (PidTagNormalizedSubject)]; if (value) [self setSummary: value]; // Location value = [properties objectForKey: MAPIPropertyKey (PidLidLocation)]; if (value) [self setLocation: value]; isAllDay = [self isAllDay]; value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentSubType)]; if (value) isAllDay = [value boolValue]; if (!isAllDay) { tz = [iCalTimeZone timeZoneForName: [userTimeZone name]]; [(iCalCalendar *) parent addTimeZone: tz]; } else tz = nil; // recurrence-id value = [properties objectForKey: MAPIPropertyKey (PidLidExceptionReplaceTime)]; if (value) { if (!isAllDay) { tzOffset = [userTimeZone secondsFromGMTForDate: value]; value = [value dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: tzOffset]; } [self setRecurrenceId: value]; } // start value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentStartWhole)]; if (!value) value = [properties objectForKey: MAPIPropertyKey (PR_START_DATE)]; if (value) { start = (iCalDateTime *) [self uniqueChildWithTag: @"dtstart"]; [start setTimeZone: tz]; if (isAllDay) { [start setDate: value]; [start setTimeZone: nil]; } else { tzOffset = [userTimeZone secondsFromGMTForDate: value]; value = [value dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: tzOffset]; [start setDateTime: value]; } } /* end */ value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentEndWhole)]; if (!value) value = [properties objectForKey: MAPIPropertyKey (PR_END_DATE)]; if (value) { end = (iCalDateTime *) [self uniqueChildWithTag: @"dtend"]; [end setTimeZone: tz]; if (isAllDay) { [end setDate: value]; [end setTimeZone: nil]; } else { tzOffset = [[value timeZone] secondsFromGMTForDate: value]; value = [value dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: tzOffset]; [end setDateTime: value]; } } /* priority */ value = [properties objectForKey: MAPIPropertyKey(PR_IMPORTANCE)]; if (value) { switch ([value intValue]) { case 0: // IMPORTANCE_LOW priority = @"9"; break; case 2: // IMPORTANCE_HIGH priority = @"1"; break; default: // IMPORTANCE_NORMAL priority = @"5"; } } else priority = @"0"; // None [self setPriority: priority]; /* show time as free/busy/tentative/out of office. Possible values are: 0x00000000 - olFree 0x00000001 - olTentative 0x00000002 - olBusy 0x00000003 - olOutOfOffice */ value = [properties objectForKey: MAPIPropertyKey(PidLidBusyStatus)]; if (value) { switch ([value intValue]) { case 0: [self setTransparency: @"TRANSPARENT"]; break; case 1: case 2: case 3: default: [self setTransparency: @"OPAQUE"]; } } /* Comment */ value = [properties objectForKey: MAPIPropertyKey (PR_BODY_UNICODE)]; if (!value) { value = [properties objectForKey: MAPIPropertyKey (PR_HTML)]; if (value) { value = [[NSString alloc] initWithData: value encoding: NSUTF8StringEncoding]; [value autorelease]; value = [value htmlToText]; } } if (value) { if ([value length] == 0 || [value isEqualToString: @"\\n"]) value = nil; [self setComment: value]; } /* recurrence */ value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentRecur)]; if (value) [self _setupEventRecurrence: value inMemCtx: memCtx]; /* alarm */ [self _setupEventAlarmFromProperties: properties]; // Organizer value = [properties objectForKey: @"recipients"]; if (value) { NSArray *recipients; NSDictionary *dict; NSString *orgEmail, *sentBy, *attEmail; iCalPerson *person; iCalPersonPartStat newPartStat; NSNumber *flags, *trackStatus; int i, effective; BOOL organizerIsSet = NO; [self setOrganizer: nil]; [self removeAllAttendees]; recipients = [value objectForKey: @"to"]; effective = 0; for (i = 0; i < [recipients count]; i++) { dict = [recipients objectAtIndex: i]; person = [iCalPerson new]; [person setCn: [dict objectForKey: @"fullName"]]; attEmail = [dict objectForKey: @"email"]; [person setEmail: attEmail]; flags = [dict objectForKey: MAPIPropertyKey (PR_RECIPIENT_FLAGS)]; if (!flags) { [self logWithFormat: @"no recipient flags specified: skipping recipient"]; continue; } if (([flags unsignedIntValue] & 0x0002)) /* recipOrganizer */ { [self setOrganizer: person]; organizerIsSet = YES; [self logWithFormat: @"organizer set via recipient flags"]; } else { BOOL isOrganizer = NO; // /* Work-around: it happens that Outlook still passes the // organizer as a recipient, maybe because of a feature // documented in a pre-mesozoic PDF still buried in a // cavern... In that case we remove it, and we keep the // number of effective recipients in "effective". If the // total is 0, we remove the "ORGANIZER" too. */ // if ([attEmail isEqualToString: orgEmail]) // { // [self logWithFormat: // @"avoiding setting organizer as recipient"]; // continue; // } trackStatus = [dict objectForKey: MAPIPropertyKey (PidTagRecipientTrackStatus)]; if (trackStatus) { /* FIXME: we should provide a data converter between OL partstats and SOGo */ switch ([trackStatus unsignedIntValue]) { case 0x01: /* respOrganized */ isOrganizer = YES; break; case 0x02: /* respTentative */ newPartStat = iCalPersonPartStatTentative; break; case 0x03: /* respAccepted */ newPartStat = iCalPersonPartStatAccepted; break; case 0x04: /* respDeclined */ newPartStat = iCalPersonPartStatDeclined; break; default: newPartStat = iCalPersonPartStatNeedsAction; } if (isOrganizer) { [self setOrganizer: person]; organizerIsSet = YES; [self logWithFormat: @"organizer set via track status"]; } else { [person setParticipationStatus: newPartStat]; [person setRsvp: @"TRUE"]; [person setRole: @"REQ-PARTICIPANT"]; [self addToAttendees: person]; effective++; } } else [self errorWithFormat: @"skipped recipient due" @" to missing track status"]; } [person release]; } if (effective == 0) /* See work-around above */ [self setOrganizer: nil]; else { // SEQUENCE = PidLidAppointmentSequence value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentSequence)]; if (value) [self setSequence: value]; ownerUser = [userContext sogoUser]; if (organizerIsSet) { /* We must reset the participation status to the value obtained from PidLidResponseStatus as the value in PidTagRecipientTrackStatus is not correct. Note (hack): the method used here requires that the user directory from LDAP and Samba matches perfectly. This can be solved more appropriately by making use of the sender properties... */ person = [self userAsAttendee: ownerUser]; if (person) { value = [properties objectForKey: MAPIPropertyKey (PidLidResponseStatus)]; if (value) responseStatus = [value unsignedLongValue]; /* FIXME: we should provide a data converter between OL partstats and SOGo */ switch (responseStatus) { case 0x02: /* respTentative */ newPartStat = iCalPersonPartStatTentative; break; case 0x03: /* respAccepted */ newPartStat = iCalPersonPartStatAccepted; break; case 0x04: /* respDeclined */ newPartStat = iCalPersonPartStatDeclined; break; default: newPartStat = iCalPersonPartStatNeedsAction; } [person setParticipationStatus: newPartStat]; value = [properties objectForKey: MAPIPropertyKey (PidLidAttendeeCriticalChange)]; if (value && ![value isNever]) [self setTimeStampAsDate: value]; // if (newPartStat // != iCalPersonPartStatUndefined // ) // { // // iCalPerson *participant; // // participant = [self userAsAttendee: ownerUser]; // // [participant setParticipationStatus: newPartStat]; // // [sogoObject saveComponent: self]; // [sogoObject changeParticipationStatus: newPartStat // withDelegate: nil]; // // [[self context] tearDownRequest]; // } // // }1005 // // else // // { } } else { [self errorWithFormat: @"organizer was not set although a" @" recipient list was specified"]; /* We must set the organizer preliminarily here because, unlike what the doc states, Outlook does not always pass the real organizer in the recipients list. */ dict = [ownerUser primaryIdentity]; person = [iCalPerson new]; [person setCn: [dict objectForKey: @"fullName"]]; orgEmail = [dict objectForKey: @"email"]; [person setEmail: orgEmail]; if (![activeUser isEqual: ownerUser]) { dict = [activeUser primaryIdentity]; sentBy = [NSString stringWithFormat: @"mailto:%@", [dict objectForKey: @"email"]]; [person setSentBy: sentBy]; } [self setOrganizer: person]; [person release]; } } } } @end SOGo-2.1.1b/OpenChange/MAPIStoreCalendarFolder.h0000644000000000000000000000207412247657026017711 0ustar rootroot/* MAPIStoreCalendarFolder.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORECALENDARFOLDER_H #define MAPISTORECALENDARFOLDER_H #import "MAPIStoreGCSFolder.h" @interface MAPIStoreCalendarFolder : MAPIStoreGCSFolder @end #endif /* MAPISTORECALENDARFOLDER_H */ SOGo-2.1.1b/OpenChange/SOGoMAPIDBMessage.h0000644000000000000000000000206612247657026016352 0ustar rootroot/* SOGoMAPIDBMessage.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc. * * 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 3, 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 SOGOMAPIDBMESSAGE_H #define SOGOMAPIDBMESSAGE_H #import "SOGoMAPIDBObject.h" @class NSDate; @class NSString; @interface SOGoMAPIDBMessage : SOGoMAPIDBObject @end #endif /* SOGOMAPIDBMESSAGE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreMailMessage.m0000644000000000000000000013137412247657026017246 0ustar rootroot/* MAPIStoreMailMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * Author: Wolfgang Sourdeau * Ludovic Marcotte * * 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 3, 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreAppointmentWrapper.h" #import "MAPIStoreContext.h" #import "MAPIStoreFolder.h" #import "MAPIStoreMailAttachment.h" #import "MAPIStoreMailFolder.h" #import "MAPIStoreMapping.h" #import "MAPIStoreSamDBUtils.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "MAPIStoreMailMessage.h" #undef DEBUG #include #include #include #include @class iCalCalendar, iCalEvent; static Class NSExceptionK; @interface NSString (MAPIStoreMIME) - (NSString *) _strippedBodyKey; @end @implementation NSString (MAPIStoreMIME) - (NSString *) _strippedBodyKey { NSRange bodyRange; NSString *strippedKey; bodyRange = [self rangeOfString: @"body.peek["]; if (bodyRange.length > 0) { strippedKey = [self substringFromIndex: NSMaxRange (bodyRange)]; strippedKey = [strippedKey substringToIndex: [strippedKey length] - 1]; } else strippedKey = nil; return strippedKey; } @end @implementation SOGoMailObject (MAPIStoreExtension) - (Class) mapistoreMessageClass { return [MAPIStoreMailMessage class]; } @end @implementation MAPIStoreMailMessage + (void) initialize { NSExceptionK = [NSException class]; } - (id) init { if ((self = [super init])) { mimeKey = nil; mailIsEvent = NO; headerCharset = nil; headerEncoding = nil; headerMimeType = nil; headerSetup = NO; bodyContent = nil; bodySetup = NO; appointmentWrapper = nil; } return self; } - (void) dealloc { [mimeKey release]; [bodyContent release]; [headerMimeType release]; [headerCharset release]; [appointmentWrapper release]; [super dealloc]; } - (NSString *) subject { return [sogoObject decodedSubject]; } - (NSDate *) creationTime { return [sogoObject date]; } - (NSDate *) lastModificationTime { return [sogoObject date]; } static NSComparisonResult _compareBodyKeysByPriority (id entry1, id entry2, void *data) { NSComparisonResult result; NSArray *keys; NSString *data1, *data2; NSUInteger count1, count2; keys = data; data1 = [entry1 objectForKey: @"mimeType"]; count1 = [keys indexOfObject: data1]; data2 = [entry2 objectForKey: @"mimeType"]; count2 = [keys indexOfObject: data2]; if (count1 == count2) { data1 = [entry1 objectForKey: @"key"]; count1 = [data1 countOccurrencesOfString: @"."]; data2 = [entry2 objectForKey: @"key"]; count2 = [data2 countOccurrencesOfString: @"."]; if (count1 == count2) { data1 = [data1 _strippedBodyKey]; count1 = [data1 intValue]; data2 = [data2 _strippedBodyKey]; count2 = [data2 intValue]; if (count1 == count2) result = NSOrderedSame; else if (count1 < count2) result = NSOrderedAscending; else result = NSOrderedDescending; } else if (count1 < count2) result = NSOrderedAscending; else result = NSOrderedDescending; } else if (count1 < count2) result = NSOrderedAscending; else result = NSOrderedDescending; return result; } - (void) _fetchHeaderData { NSMutableArray *keys; NSArray *acceptedTypes; NSDictionary *messageData, *partHeaderData, *parameters; acceptedTypes = [NSArray arrayWithObjects: @"text/calendar", @"application/ics", @"text/html", @"text/plain", nil]; keys = [NSMutableArray array]; [sogoObject addRequiredKeysOfStructure: [sogoObject bodyStructure] path: @"" toArray: keys acceptedTypes: acceptedTypes withPeek: YES]; [keys sortUsingFunction: _compareBodyKeysByPriority context: acceptedTypes]; if ([keys count] > 0) { messageData = [keys objectAtIndex: 0]; ASSIGN (mimeKey, [messageData objectForKey: @"key"]); ASSIGN (headerMimeType, [messageData objectForKey: @"mimeType"]); partHeaderData = [sogoObject lookupInfoForBodyPart: [mimeKey _strippedBodyKey]]; ASSIGN (headerEncoding, [partHeaderData objectForKey: @"encoding"]); parameters = [partHeaderData objectForKey: @"parameterList"]; ASSIGN (headerCharset, [parameters objectForKey: @"charset"]); if ([headerMimeType isEqualToString: @"text/calendar"] || [headerMimeType isEqualToString: @"application/ics"]) mailIsEvent = YES; } headerSetup = YES; } - (void) _fetchBodyData { NSData *rawContent; NSString *resultKey; id result; if (!headerSetup) [self _fetchHeaderData]; if (!bodyContent && mimeKey) { result = [sogoObject fetchParts: [NSArray arrayWithObject: mimeKey]]; result = [[result valueForKey: @"RawResponse"] objectForKey: @"fetch"]; if ([mimeKey hasPrefix: @"body.peek"]) resultKey = [NSString stringWithFormat: @"body[%@]", [mimeKey _strippedBodyKey]]; else resultKey = mimeKey; rawContent = [[result objectForKey: resultKey] objectForKey: @"data"]; ASSIGN (bodyContent, [rawContent bodyDataFromEncoding: headerEncoding]); } bodySetup = YES; } - (MAPIStoreAppointmentWrapper *) _appointmentWrapper { NSArray *events, *from; iCalCalendar *calendar; iCalEvent *event; NSString *stringValue, *senderEmail; MAPIStoreContext *context; if (!appointmentWrapper) { if (!bodySetup) [self _fetchBodyData]; stringValue = [bodyContent bodyStringFromCharset: headerCharset]; calendar = [iCalCalendar parseSingleFromSource: stringValue]; events = [calendar events]; if ([events count] > 0) { event = [events objectAtIndex: 0]; from = [sogoObject fromEnvelopeAddresses]; if ([from count] > 0) senderEmail = [[from objectAtIndex: 0] email]; else senderEmail = nil; context = [self context]; appointmentWrapper = [MAPIStoreAppointmentWrapper wrapperWithICalEvent: event andUser: [context activeUser] andSenderEmail: senderEmail inTimeZone: [[self userContext] timeZone] withConnectionInfo: [context connectionInfo]]; [appointmentWrapper retain]; } } return appointmentWrapper; } - (int) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSData *changeKey; MAPIStoreMailFolder *parentFolder; NSString *nameInContainer; if (isNew) rc = MAPISTORE_ERR_NOT_FOUND; else { parentFolder = (MAPIStoreMailFolder *)[self container]; nameInContainer = [self nameInContainer]; changeKey = [parentFolder changeKeyForMessageWithKey: nameInContainer]; if (!changeKey) { [self warnWithFormat: @"attempting to get change key" @" by synchronising folder..."]; [(MAPIStoreMailFolder *) container synchroniseCache]; [parentFolder synchroniseCache]; changeKey = [parentFolder changeKeyForMessageWithKey: nameInContainer]; if (changeKey) [self logWithFormat: @"got one"]; else { [self errorWithFormat: @"still nothing. We crash!"]; abort (); } } *data = [changeKey asBinaryInMemCtx: memCtx]; } return rc; } - (int) getPidTagPredecessorChangeList: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSData *changeList; if (isNew) rc = MAPISTORE_ERR_NOT_FOUND; else { changeList = [(MAPIStoreMailFolder *)[self container] predecessorChangeListForMessageWithKey: [self nameInContainer]]; if (!changeList) { [self warnWithFormat: @"attempting to get predecessor change list" @" by synchronising folder..."]; [(MAPIStoreMailFolder *) container synchroniseCache]; changeList = [(MAPIStoreMailFolder *)[self container] predecessorChangeListForMessageWithKey: [self nameInContainer]]; if (changeList) [self logWithFormat: @"got one"]; else { [self errorWithFormat: @"still nothing. We crash!"]; abort (); } } *data = [changeList asBinaryInMemCtx: memCtx]; } return rc; } - (uint64_t) objectVersion { uint64_t version = ULLONG_MAX; NSString *uid, *changeNumber; uid = [(MAPIStoreMailFolder *) container messageUIDFromMessageKey: [self nameInContainer]]; if (uid) { changeNumber = [(MAPIStoreMailFolder *) container changeNumberForMessageUID: uid]; if (!changeNumber) { [self warnWithFormat: @"attempting to get change number" @" by synchronising folder..."]; [(MAPIStoreMailFolder *) container synchroniseCache]; changeNumber = [(MAPIStoreMailFolder *) container changeNumberForMessageUID: uid]; if (changeNumber) [self logWithFormat: @"got one"]; else { [self errorWithFormat: @"still nothing. We crash!"]; abort(); } } version = [changeNumber unsignedLongLongValue] >> 16; } else abort(); return version; } - (int) getPidTagIconIndex: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; if (!headerSetup) [self _fetchHeaderData]; if (mailIsEvent) [[self _appointmentWrapper] getPidTagIconIndex: data inMemCtx: memCtx]; else { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ if ([sogoObject isNewMail]) longValue = 0xffffffff; else if ([sogoObject replied]) longValue = 0x105; else if ([sogoObject forwarded]) longValue = 0x106; else if ([sogoObject read]) longValue = 0x100; else longValue = 0x101; *data = MAPILongValue (memCtx, longValue); } return MAPISTORE_SUCCESS; } - (int) getPidLidResponseStatus: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0); return MAPISTORE_SUCCESS; } - (int) getPidLidImapDeleted: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; if ([sogoObject deleted]) longValue = 1; else longValue = 0; *data = MAPILongValue (memCtx, longValue); return MAPISTORE_SUCCESS; } - (int) getPidTagSubjectPrefix: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *subject; NSUInteger colIdx; NSString *stringValue; subject = [self subject]; colIdx = [subject rangeOfString: @":"].location; if (colIdx != NSNotFound && colIdx < 4) stringValue = [NSString stringWithFormat: @"%@: ", [subject substringToIndex: colIdx]]; else stringValue = @""; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagNormalizedSubject: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *subject; NSUInteger colIdx; NSString *stringValue; subject = [self subject]; colIdx = [subject rangeOfString: @":"].location; if (colIdx != NSNotFound && colIdx < 4) stringValue = [[subject substringFromIndex: colIdx + 1] stringByTrimmingLeadSpaces]; else stringValue = subject; if (!stringValue) stringValue = @""; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidFInvited: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; if (mailIsEvent) [[self _appointmentWrapper] getPidTagMessageClass: data inMemCtx: memCtx]; else *data = talloc_strdup (memCtx, "IPM.Note"); return MAPISTORE_SUCCESS; } /* Note: this applies to regular mails... */ // - (int) getPidTagReplyRequested: (void **) data // TODO // inMemCtx: (TALLOC_CTX *) memCtx // { // if (!headerSetup) // [self _fetchHeaderData]; // return (mailIsEvent // ? [self getYes: data inMemCtx: memCtx] // : [self getNo: data inMemCtx: memCtx]); // } /* ... while this applies to invitations. */ - (int) getPidTagResponseRequested: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [self getNo: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidTagLatestDeliveryTime: (void **) data // DOUBT inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagCreationTime: data inMemCtx: memCtx]; } - (int) getPidTagOriginalSubmitTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagCreationTime: data inMemCtx: memCtx]; } - (int) getPidTagClientSubmitTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagCreationTime: data inMemCtx: memCtx]; } - (int) getPidTagMessageDeliveryTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagCreationTime: data inMemCtx: memCtx]; } - (int) getPidTagMessageFlags: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; unsigned int v = 0; coreInfos = [sogoObject fetchCoreInfos]; flags = [coreInfos objectForKey: @"flags"]; // if ([container isKindOfClass: MAPIStoreSentItemsFolderK] // || [container isKindOfClass: MAPIStoreDraftsFolderK]) // v |= MSGFLAG_FROMME; if ([flags containsObject: @"seen"]) v |= MSGFLAG_READ; if ([[self attachmentKeys] count] > 0) v |= MSGFLAG_HASATTACH; *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; } - (int) getPidTagFlagStatus: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; unsigned int v; coreInfos = [sogoObject fetchCoreInfos]; flags = [coreInfos objectForKey: @"flags"]; if ([flags containsObject: @"flagged"]) v = 2; else v = 0; *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; } - (int) getPidTagFollowupIcon: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; unsigned int v; coreInfos = [sogoObject fetchCoreInfos]; flags = [coreInfos objectForKey: @"flags"]; if ([flags containsObject: @"flagged"]) v = 6; else v = 0; *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; } - (int) getPidTagSensitivity: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidTagOriginalSensitivity: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSensitivity: data inMemCtx: memCtx]; } - (int) getPidTagSentRepresentingAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPidTagReceivedRepresentingAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPidTagReceivedByAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPidTagSenderAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) _getEmailAddressFromEmail: (NSString *) fullMail inData: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NGMailAddress *ngAddress; NSString *email; if (!fullMail) fullMail = @""; ngAddress = [[NGMailAddressParser mailAddressParserWithString: fullMail] parse]; if ([ngAddress isKindOfClass: [NGMailAddress class]]) email = [ngAddress address]; else email = @""; *data = [email asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) _getCNFromEmail: (NSString *) fullMail inData: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NGMailAddress *ngAddress; NSString *cn; if (!fullMail) fullMail = @""; ngAddress = [[NGMailAddressParser mailAddressParserWithString: fullMail] parse]; if ([ngAddress isKindOfClass: [NGMailAddress class]]) { cn = [ngAddress displayName]; // If we don't have a displayName, we use the email address instead. This // avoid bug #2119 - where Outlook won't display anything in the "From" field, // nor in the recipient field if we reply to the email. if (![cn length]) cn = [ngAddress address]; } else cn = @""; *data = [cn asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) _getEntryIdFromEmail: (NSString *) fullMail inData: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *username, *cn, *email; SOGoUserManager *mgr; NSDictionary *contactInfos; NGMailAddress *ngAddress; NSData *entryId; struct ldb_context *samCtx; int rc; if (fullMail) { ngAddress = [[NGMailAddressParser mailAddressParserWithString: fullMail] parse]; if ([ngAddress isKindOfClass: [NGMailAddress class]]) { email = [ngAddress address]; cn = [ngAddress displayName]; } else { email = fullMail; cn = @""; } mgr = [SOGoUserManager sharedUserManager]; contactInfos = [mgr contactInfosForUserWithUIDorEmail: email]; if (contactInfos) { username = [contactInfos objectForKey: @"c_uid"]; samCtx = [[self context] connectionInfo]->sam_ctx; entryId = MAPIStoreInternalEntryId (samCtx, username); } else entryId = MAPIStoreExternalEntryId (cn, email); *data = [entryId asBinaryInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidTagSenderEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddressFromEmail: [sogoObject from] inData: data inMemCtx: memCtx]; } - (int) getPidTagSenderName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getCNFromEmail: [sogoObject from] inData: data inMemCtx: memCtx]; } - (int) getPidTagSenderEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryIdFromEmail: [sogoObject from] inData: data inMemCtx: memCtx]; } - (int) getPidTagOriginalAuthorName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; } - (int) getPidTagSentRepresentingEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; } - (int) getPidTagSentRepresentingName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderName: data inMemCtx: memCtx]; } - (int) getPidTagSentRepresentingEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderEntryId: data inMemCtx: memCtx]; } - (int) getPidTagReceivedByEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddressFromEmail: [sogoObject to] inData: data inMemCtx: memCtx]; } - (int) getPidTagReceivedByName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getCNFromEmail: [sogoObject to] inData: data inMemCtx: memCtx]; } - (int) getPidTagReceivedByEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryIdFromEmail: [sogoObject to] inData: data inMemCtx: memCtx]; } - (int) getPidTagReceivedRepresentingName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagReceivedByName: data inMemCtx: memCtx]; } - (int) getPidTagReceivedRepresentingEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagReceivedByEmailAddress: data inMemCtx: memCtx]; } - (int) getPidTagReceivedRepresentingEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagReceivedByEntryId: data inMemCtx: memCtx]; } - (int) getPidTagDisplayTo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject to] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagOriginalDisplayTo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagDisplayTo: data inMemCtx: memCtx]; } - (int) getPidTagDisplayCc: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; stringValue = [sogoObject cc]; if (!stringValue) stringValue = @""; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagOriginalDisplayCc: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagDisplayCc: data inMemCtx: memCtx]; } - (int) getPidTagDisplayBcc: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } - (int) getPidTagOriginalDisplayBcc: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagDisplayBcc: data inMemCtx: memCtx]; } - (int) getPidNameContentType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"message/rfc822" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagImportance: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; NSString *s; s = [[sogoObject mailHeaders] objectForKey: @"x-priority"]; v = 0x1; if ([s hasPrefix: @"1"]) v = 0x2; else if ([s hasPrefix: @"2"]) v = 0x2; else if ([s hasPrefix: @"4"]) v = 0x0; else if ([s hasPrefix: @"5"]) v = 0x0; *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; } - (int) getPidTagInternetCodepage: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { /* ref: http://msdn.microsoft.com/en-us/library/dd317756%28v=vs.85%29.aspx minimal list that should be handled: us-ascii: 20127 iso-8859-1: 28591 iso-8859-15: 28605 utf-8: 65001 */ *data = MAPILongValue(memCtx, 65001); return MAPISTORE_SUCCESS; } - (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; int rc = MAPISTORE_SUCCESS; if (!bodySetup) [self _fetchBodyData]; if ([headerMimeType isEqualToString: @"text/plain"]) { stringValue = [bodyContent bodyStringFromCharset: headerCharset]; *data = [stringValue asUnicodeInMemCtx: memCtx]; } else if (mailIsEvent) rc = [[self _appointmentWrapper] getPidTagBody: data inMemCtx: memCtx]; else { *data = NULL; rc = MAPISTORE_ERR_NOT_FOUND; } return rc; } - (int) getPidTagHtml: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; if (!bodySetup) [self _fetchBodyData]; if ([headerMimeType isEqualToString: @"text/html"]) *data = [bodyContent asBinaryInMemCtx: memCtx]; else { *data = NULL; rc = MAPISTORE_ERR_NOT_FOUND; } return rc; } - (int) getPidTagRtfCompressed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = NULL; return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidTagRtfInSync: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidTagInternetMessageId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject messageId] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagReadReceiptRequested: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidGlobalObjectId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidGlobalObjectId: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidCleanGlobalObjectId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidCleanGlobalObjectId: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidServerProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidServerProcessed: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidServerProcessingActions: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidServerProcessingActions: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; if (!headerSetup) [self _fetchHeaderData]; if (mailIsEvent) rc = [self getYes: data inMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } // - (int) getPidLidServerProcessed: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // if (!headerSetup) // [self _fetchHeaderData]; // return (mailIsEvent // ? [[self _appointmentWrapper] getPidLidServerProcessed: data // inMemCtx: memCtx] // : MAPISTORE_ERR_NOT_FOUND); // } - (int) getPidLidPrivate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidPrivate: data inMemCtx: memCtx] : [self getNo: data inMemCtx: memCtx]); } - (int) getPidTagMessageEditorFormat: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t format; if (!headerSetup) [self _fetchHeaderData]; if ([headerMimeType isEqualToString: @"text/plain"]) format = EDITOR_FORMAT_PLAINTEXT; else if ([headerMimeType isEqualToString: @"text/html"]) format = EDITOR_FORMAT_HTML; else format = 0; /* EDITOR_FORMAT_DONTKNOW */ *data = MAPILongValue (memCtx, format); return MAPISTORE_SUCCESS; } - (int) getPidLidReminderSet: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidUseTnef: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidRemoteStatus: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidLidAgingDontAgeMe: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } /* event getters */ - (int) getPidTagStartDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidTagStartDate: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidAppointmentMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; if (!headerSetup) [self _fetchHeaderData]; if (mailIsEvent) *data = talloc_strdup (memCtx, "IPM.Appointment"); else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidAppointmentStartWhole: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidAppointmentStartWhole: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidCommonStart: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidCommonStart: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidTagEndDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidTagEndDate: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidAppointmentEndWhole: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidAppointmentEndWhole: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidCommonEnd: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidCommonEnd: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidAppointmentDuration: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidAppointmentDuration: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidAppointmentSubType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidAppointmentSubType: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidBusyStatus: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidBusyStatus: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidLocation: (void **) data // LOCATION inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidLocation: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidIsRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidIsRecurring: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidRecurring: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidAppointmentRecur: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidAppointmentRecur: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidTagOwnerAppointmentId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidTagOwnerAppointmentId: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidMeetingType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent ? [[self _appointmentWrapper] getPidLidMeetingType: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (void) getMessageData: (struct mapistore_message **) dataPtr inMemCtx: (TALLOC_CTX *) memCtx { NSArray *addresses; NSString *addressMethods[] = { @"fromEnvelopeAddresses", @"toEnvelopeAddresses", @"ccEnvelopeAddresses", @"bccEnvelopeAddresses" }; enum ulRecipClass addressTypes[] = { MAPI_ORIG, MAPI_TO, MAPI_CC, MAPI_BCC }; NSUInteger arrayCount, count, recipientStart, max, p; NGImap4EnvelopeAddress *currentAddress; NSString *username, *cn, *email; NSData *entryId; NSDictionary *contactInfos; SOGoUserManager *mgr; struct ldb_context *samCtx; struct mapistore_message *msgData; struct mapistore_message_recipient *recipient; samCtx = [[self context] connectionInfo]->sam_ctx; [super getMessageData: &msgData inMemCtx: memCtx]; if (!headerSetup) [self _fetchHeaderData]; if (mailIsEvent) [[self _appointmentWrapper] fillMessageData: msgData inMemCtx: memCtx]; else { mgr = [SOGoUserManager sharedUserManager]; /* Retrieve recipients from the message */ msgData->columns = set_SPropTagArray (msgData, 9, PR_OBJECT_TYPE, PR_DISPLAY_TYPE, PR_7BIT_DISPLAY_NAME_UNICODE, PR_SMTP_ADDRESS_UNICODE, PR_SEND_INTERNET_ENCODING, PR_RECIPIENT_DISPLAY_NAME_UNICODE, PR_RECIPIENT_FLAGS, PR_RECIPIENT_ENTRYID, PR_RECIPIENT_TRACKSTATUS); msgData->recipients_count = 0; msgData->recipients = NULL; recipientStart = 0; for (arrayCount = 0; arrayCount < 4; arrayCount++) { addresses = [sogoObject performSelector: NSSelectorFromString (addressMethods[arrayCount])]; max = [addresses count]; if (max > 0) { msgData->recipients_count += max; msgData->recipients = talloc_realloc (msgData, msgData->recipients, struct mapistore_message_recipient, msgData->recipients_count); for (count = 0; count < max; count++) { recipient = msgData->recipients + recipientStart; currentAddress = [addresses objectAtIndex: count]; cn = [currentAddress personalName]; email = [currentAddress baseEMail]; if ([cn length] == 0) cn = email; contactInfos = [mgr contactInfosForUserWithUIDorEmail: email]; if (contactInfos) { username = [contactInfos objectForKey: @"c_uid"]; recipient->username = [username asUnicodeInMemCtx: msgData]; entryId = MAPIStoreInternalEntryId (samCtx, username); } else { recipient->username = NULL; entryId = MAPIStoreExternalEntryId (cn, email); } recipient->type = addressTypes[arrayCount]; /* properties */ p = 0; recipient->data = talloc_array (msgData, void *, msgData->columns->cValues); memset (recipient->data, 0, msgData->columns->cValues * sizeof (void *)); // PR_OBJECT_TYPE = MAPI_MAILUSER (see MAPI_OBJTYPE) recipient->data[p] = MAPILongValue (msgData, MAPI_MAILUSER); p++; // PR_DISPLAY_TYPE = DT_MAILUSER (see MS-NSPI) recipient->data[p] = MAPILongValue (msgData, 0); p++; // PR_7BIT_DISPLAY_NAME_UNICODE recipient->data[p] = [cn asUnicodeInMemCtx: msgData]; p++; // PR_SMTP_ADDRESS_UNICODE recipient->data[p] = [email asUnicodeInMemCtx: msgData]; p++; // PR_SEND_INTERNET_ENCODING = 0x00060000 (plain text, see OXCMAIL) recipient->data[p] = MAPILongValue (msgData, 0x00060000); p++; // PR_RECIPIENT_DISPLAY_NAME_UNICODE recipient->data[p] = [cn asUnicodeInMemCtx: msgData]; p++; // PR_RECIPIENT_FLAGS recipient->data[p] = MAPILongValue (msgData, 0x01); p++; // PR_RECIPIENT_ENTRYID recipient->data[p] = [entryId asBinaryInMemCtx: msgData]; p++; // PR_RECIPIENT_TRACKSTATUS recipient->data[p] = MAPILongValue (msgData, 0x00); p++; recipientStart++; } } } } *dataPtr = msgData; } - (void) _fetchAttachmentPartsInBodyInfo: (NSDictionary *) bodyInfo withPrefix: (NSString *) keyPrefix { NSArray *parts; NSDictionary *parameters; NSUInteger count, max; parameters = [[bodyInfo objectForKey: @"disposition"] objectForKey: @"parameterList"]; if ([[parameters objectForKey: @"filename"] length] > 0) { if ([keyPrefix length] == 0) keyPrefix = @"0"; [attachmentParts setObject: bodyInfo forKey: keyPrefix]; } else { if ([keyPrefix length] > 0) keyPrefix = [NSString stringWithFormat: @"%@/", keyPrefix]; parts = [bodyInfo objectForKey: @"parts"]; max = [parts count]; for (count = 0; count < max; count++) [self _fetchAttachmentPartsInBodyInfo: [parts objectAtIndex: count] withPrefix: [NSString stringWithFormat: @"%@%d", keyPrefix, count + 1]]; } } - (NSArray *) attachmentKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { [self _fetchAttachmentPartsInBodyInfo: [sogoObject bodyStructure] withPrefix: @""]; return [super attachmentKeysMatchingQualifier: qualifier andSortOrderings: sortOrderings]; } - (id) lookupAttachment: (NSString *) childKey { MAPIStoreMailAttachment *attachment; SOGoMailBodyPart *currentPart; NSArray *keyParts; NSUInteger count, max; attachment = nil; keyParts = [childKey componentsSeparatedByString: @"/"]; max = [keyParts count]; if (max > 0) { currentPart = [sogoObject lookupName: [keyParts objectAtIndex: 0] inContext: nil acquire: NO]; if ([currentPart isKindOfClass: NSExceptionK]) currentPart = nil; for (count = 1; currentPart && count < max; count++) { [parentContainersBag addObject: currentPart]; currentPart = [currentPart lookupName: [keyParts objectAtIndex: count] inContext: nil acquire: NO]; if ([currentPart isKindOfClass: NSExceptionK]) currentPart = nil; } if (currentPart) { attachment = [MAPIStoreMailAttachment mapiStoreObjectInContainer: self]; [attachment setBodyPart: currentPart]; [attachment setBodyInfo: [attachmentParts objectForKey: childKey]]; [attachment setAID: [[self attachmentKeys] indexOfObject: childKey]]; } } return attachment; } - (int) setReadFlag: (uint8_t) flag { NSString *imapFlag = @"\\Seen"; /* TODO: notifications should probably be emitted from here */ if (flag & CLEAR_READ_FLAG) [sogoObject removeFlags: imapFlag]; else [sogoObject addFlags: imapFlag]; return MAPISTORE_SUCCESS; } - (NSString *) bodyContentPartKey { NSString *bodyPartKey; if (!headerSetup) [self _fetchHeaderData]; if ([mimeKey hasPrefix: @"body.peek"]) bodyPartKey = [NSString stringWithFormat: @"body[%@]", [mimeKey _strippedBodyKey]]; else bodyPartKey = mimeKey; return bodyPartKey; } - (void) setBodyContentFromRawData: (NSData *) rawContent { if (!headerSetup) [self _fetchHeaderData]; ASSIGN (bodyContent, [rawContent bodyDataFromEncoding: headerEncoding]); bodySetup = YES; } - (void) save: (TALLOC_CTX *) memCtx { NSNumber *value; value = [properties objectForKey: MAPIPropertyKey (PR_FLAG_STATUS)]; if (value) { /* We don't handle the concept of "Follow Up" */ if ([value intValue] == 2) [sogoObject addFlags: @"\\Flagged"]; else /* 0: unflagged, 1: follow up complete */ [sogoObject removeFlags: @"\\Flagged"]; } } @end SOGo-2.1.1b/OpenChange/RTFHandler.m0000644000000000000000000012164512247657026015324 0ustar rootroot/* Copyright (C) 2005-2013 Inverse inc. This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "RTFHandler.h" #include // // Useful macros // #define ADVANCE _bytes++; _current_pos++; #define REWIND _bytes--; _current_pos--; // // Charset definitions. See http://msdn.microsoft.com/en-us/goglobal/bb964654 for all details. // const unsigned short ansicpg1250[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0000, 0x201a, 0x0000, 0x201e, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, 0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9 }; const unsigned short ansicpg1251[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f }; const unsigned short ansicpg1252[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017d, 0x0000, 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x0000, 0x017e, 0x0178, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff }; const unsigned short ansicpg1253[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203a, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000 }; const unsigned short ansicpg1254[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x0000, 0x0000, 0x0178, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff }; const unsigned short ansicpg1255[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0000, 0x203a, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, 0x05b8, 0x05b9, 0x0000, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000 }; const unsigned short ansicpg1256[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba, 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f, 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef, 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2 }; const unsigned short ansicpg1257[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0000, 0x201a, 0x0000, 0x201e, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00a8, 0x02c7, 0x00b8, 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203a, 0x0000, 0x00af, 0x02db, 0x0000, 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x0000, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x02d9 }; const unsigned short ansicpg1258[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0000, 0x203a, 0x0153, 0x0000, 0x0000, 0x0178, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff }; const unsigned short ansicpg874[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f, 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000 }; // // // @implementation RTFStack - (id) init { if ((self = [super init])) { a = [[NSMutableArray alloc] init]; } return self; } - (void) dealloc { RELEASE(a); [super dealloc]; } - (void) push: (id) theObject { [a addObject: theObject]; } - (id) pop { id o = nil; if ([a count]) { o = AUTORELEASE([[a lastObject] retain]); [a removeLastObject]; } return o; } - (id) top { id o = nil; if ([a count]) { o = AUTORELEASE([[a lastObject] retain]); } return o; } @end // // // @implementation RTFFormattingOptions @end // // // @implementation RTFFontInfo - (id) init { if ((self = [super init])) { } return self; } - (void) dealloc { RELEASE(family); RELEASE(charset); RELEASE(name); [super dealloc]; } @end // // // @implementation RTFFontTable - (id) init { if ((self = [super init])) { fontInfos = NSCreateMapTable(NSObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 128); } return self; } - (void) dealloc { NSFreeMapTable(fontInfos); [super dealloc]; } - (void) addFontInfo: (RTFFontInfo *) theFontInfo atIndex: (unsigned int) theIndex { NSNumber *key; key = [NSNumber numberWithInt: theIndex]; NSMapInsert(fontInfos, key, (void*) theFontInfo); } - (RTFFontInfo *) fontInfoAtIndex: (unsigned int) theIndex { NSNumber *key; key = [NSNumber numberWithInt: theIndex]; return NSMapGet(fontInfos, key); } @end // // // @implementation RTFColorDef @end // // // @implementation RTFColorTable - (id) init { if ((self = [super init])) { colorDefs = [[NSMutableArray alloc] init]; } return self; } - (void) dealloc { RELEASE(colorDefs); [super dealloc]; } - (void) addColorDef: (RTFColorDef *) theColorDef { [colorDefs addObject: theColorDef]; } - (RTFColorDef *) colorDefAtIndex: (unsigned int) theIndex { return [colorDefs objectAtIndex: theIndex]; } @end // // // @implementation RTFHandler - (id) initWithData: (NSData *) theData { if ((self = [super init])) { ASSIGN(_data, theData); _bytes = (char *)[_data bytes]; _len = [_data length]; _current_pos = 0; _charsets = NSCreateMapTable(NSObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 10); NSMapInsert(_charsets, @"ansicpg1250", ansicpg1250); NSMapInsert(_charsets, @"ansicpg1251", ansicpg1251); NSMapInsert(_charsets, @"ansicpg1252", ansicpg1252); NSMapInsert(_charsets, @"ansicpg1253", ansicpg1253); NSMapInsert(_charsets, @"ansicpg1254", ansicpg1254); NSMapInsert(_charsets, @"ansicpg1255", ansicpg1255); NSMapInsert(_charsets, @"ansicpg1256", ansicpg1256); NSMapInsert(_charsets, @"ansicpg1257", ansicpg1257); NSMapInsert(_charsets, @"ansicpg1258", ansicpg1258); NSMapInsert(_charsets, @"ansicpg874", ansicpg874); } return self; } - (void) dealloc { NSFreeMapTable(_charsets); RELEASE(_data); [super dealloc]; } - (const char *) parseControlWord: (unsigned int *) len { const char *start, *end; start = ADVANCE; while (isalnum(*_bytes) || *_bytes == '-') { ADVANCE; } end = _bytes; *len = end-start-1; return start+1; } // // {\colortbl\red0\green0\blue0;\red128\green0\blue0;\red255\green0\blue0;} // - (RTFColorTable *) parseColorTable { RTFColorTable *colorTable; RTFColorDef *colorDef; colorTable = [[[RTFColorTable alloc] init] autorelease]; colorDef = [[[RTFColorDef alloc] init] autorelease]; while (*_bytes != '}') { if (*_bytes == ';') { [colorTable addColorDef: colorDef]; colorDef = [[[RTFColorDef alloc] init] autorelease]; ADVANCE; } else if (*_bytes == '\\') { const char *cw; unsigned int len; NSString *s; cw = [self parseControlWord: &len]; // Skip our control word //if (strncmp(start+1, "colortbl", len) == 0) // continue; s = [[NSString alloc] initWithBytesNoCopy: (void *)cw length: len encoding: NSASCIIStringEncoding freeWhenDone: NO]; [s autorelease]; if ([s hasPrefix: @"red"]) { colorDef->red = [[s substringFromIndex: 3] intValue]; } else if ([s hasPrefix: @"green"]) { colorDef->green = [[s substringFromIndex: 4] intValue]; } else { colorDef->blue = [[s substringFromIndex: 4] intValue]; } } else { ADVANCE; } } return colorTable; } // // Possible formats: // // {\fonttbl\f0\fswiss Helvetica;} // {\fonttbl{\f0\froman\fcharset0\fprq2 Arial;}{\f1\fswiss\fprq2\fcharset0 Arial;}} // // FIXME: Complex ones not handled right now: // // {\fonttbl{\f2\fnil\fcharset256\fprq2{\*\panose 00020703090202050204}Courier New;}{... // {\fonttbl{\f31\fnil\fcharset0\fprq0 Times New Roman Monotype{\*\falt Times New Roman};}{... // // We receive the full string. // - (RTFFontTable *) parseFontTable { NSMutableString *fontName; RTFFontTable *fontTable; RTFFontInfo *fontInfo; unsigned int count; fontTable = [[[RTFFontTable alloc] init] autorelease]; fontName = nil; count = 0; do { if (*_bytes == '{') { if (fontTable) { fontInfo = [[[RTFFontInfo alloc] init] autorelease]; fontName = [[[NSMutableString alloc] init] autorelease]; } ADVANCE; count++; } else if (*_bytes == '}') { if (fontTable) //&& ![NSAllMapTableValues(fontTable->fontInfos) containsObject: fontInfo]) { ASSIGN(fontInfo->name, fontName); [fontTable addFontInfo: fontInfo atIndex: fontInfo->index]; } ADVANCE; count--; } else if (*_bytes == '\\') { const char *cw; unsigned int len; NSString *s; cw = [self parseControlWord: &len]; // Skip our control word if (strncmp((const char*)cw, "fonttbl", len) == 0) continue; // We must at least parse s = [[NSString alloc] initWithBytesNoCopy: (void *)cw+1 length: len-1 encoding: NSASCIIStringEncoding freeWhenDone: NO]; [s autorelease]; // If we got a fontnum, let's parse all three fields at once) if (isdigit(*(cw+1))) { fontInfo->index = [s intValue]; // We now parse cw = [self parseControlWord: &len]; fontInfo->family = [[NSString alloc] initWithBytesNoCopy: (void *)cw+1 length: len-1 encoding: NSASCIIStringEncoding freeWhenDone: NO]; cw = [self parseControlWord: &len]; fontInfo->charset = [[NSString alloc] initWithBytesNoCopy: (void *)cw+1 length: len-1 encoding: NSASCIIStringEncoding freeWhenDone: NO]; // We now skip everything until we find our final group closer ('}') int cc = 1; do { if (*_bytes == '{') cc++; if (*_bytes == '}') cc--; ADVANCE; } while (cc != 0); // move back our buffer; REWIND; } } else { if (isalnum(*_bytes)) [fontName appendFormat: @"%c", *_bytes]; ADVANCE; } } while (count != 0); return fontTable; } // // // - (void) parseStyleSheet { unsigned int count; count = 0; do { if (*_bytes == '{') { count++; } else if (*_bytes == '}') { count--; } ADVANCE; } while (count != 0); } // // // - (void) parsePicture { // Do the same as -parseStyleSheet for now, that is, ignore everything. [self parseStyleSheet]; } // // // - (NSMutableData *) parse { RTFFormattingOptions *formattingOptions; RTFColorTable *colorTable; RTFFontTable *fontTable; RTFStack *stack; unsigned short *charset; char c; stack = [[RTFStack alloc] init]; fontTable = nil; colorTable = nil; charset = NULL; _html = [[NSMutableData alloc] init]; [_html appendBytes: "" length: 34]; // Check if we got RTF data if (_len > 4 && strncmp((const char*)_bytes, "{\\rtf", 4) != 0) return NO; while (_current_pos < _len) { c = *_bytes; // RTF control code if (c == '\\') { unsigned int len; const char *cw; NSString *s; if (*(_bytes+1) == '\'' && charset) { // A hexadecimal value, based on the specified character set (may be used to identify 8-bit values). NSString *s; NSData *d; const char *b1, *b2; unsigned short index; ADVANCE; ADVANCE; b1 = ADVANCE; b2 = ADVANCE; index = (isdigit(*b1) ? *b1 - 48 : toupper(*b1) - 55) * 16; index += (isdigit(*b2) ? *b2 - 48 : toupper(*b2) - 55); s = [NSString stringWithCharacters: &(charset[index]) length: 1]; d = [s dataUsingEncoding: NSUTF8StringEncoding]; [_html appendData: d]; continue; } else if (*(_bytes+1) == '*') { int cc = 1; do { if (*_bytes == '{') cc++; if (*_bytes == '}') cc--; ADVANCE; } while (cc != 0); continue; } cw = [self parseControlWord: &len]; s = [[NSString alloc] initWithBytesNoCopy: (void *)cw length: len encoding: NSASCIIStringEncoding freeWhenDone: NO]; [s autorelease]; if (strncmp(cw, "ansicpg", 7) == 0) { charset = NSMapGet(_charsets, s); } else if (strncmp(cw, "fonttbl", 7) == 0) { // We rewind our buffer so we start at the beginning of {\fonttbl... _bytes = cw-2; _current_pos -= 10; fontTable = [self parseFontTable]; // We go back 1 byte in order to end our section properly ('}' character REWIND; } else if (strncmp(cw, "stylesheet", 10) == 0) { _bytes = cw-2; _current_pos -= 13; [self parseStyleSheet]; REWIND; } else if (strncmp(cw, "colortbl", 8) == 0) { colorTable = [self parseColorTable]; } else if (strncmp(cw, "pict", 4) == 0) { _bytes = cw-2; _current_pos -= 7; [self parsePicture]; REWIND; } else if ([s isEqualToString: @"b"] && formattingOptions) { [_html appendBytes: "" length: 3]; formattingOptions->bold = YES; } else if ([s isEqualToString: @"b0"] && formattingOptions) { [_html appendBytes: "" length: 4]; formattingOptions->bold = NO; } else if ([s hasPrefix: @"cf"] && [s length] > 2) { RTFColorDef *colorDef; int color_index; char *v; color_index = [[s substringFromIndex: 2] intValue]; if (!formattingOptions) continue; if (formattingOptions->color_index >= 0) // && color_index != formattingOptions->color_index) { [_html appendBytes: "" length: 7]; } formattingOptions->color_index = color_index; colorDef = [colorTable colorDefAtIndex: color_index]; v = malloc(23*sizeof(char)); memset(v, 0, 23); sprintf(v, "", colorDef->red, colorDef->green, colorDef->blue); [_html appendBytes: v length: strlen(v)]; free(v); } else if ([s hasPrefix: @"fcs"]) { // ignore } else if ([s hasPrefix: @"fs"]) { // ignore } else if ([s hasPrefix: @"fbidis"]) { // ignore } else if ([s hasPrefix: @"fromhtml"]) { // ignore } else if ([s hasPrefix: @"fromtext"]) { // ignore } else if ([s hasPrefix: @"f"] && [s length] > 1) { RTFFontInfo *fontInfo; int font_index; font_index = [[s substringFromIndex: 1] intValue]; if (!formattingOptions) continue; if (formattingOptions->font_index >= 0 && font_index != formattingOptions->font_index) { [_html appendBytes: "" length: 7]; } formattingOptions->font_index = font_index; fontInfo = [fontTable fontInfoAtIndex: font_index]; char *v = malloc(128*sizeof(char)); memset(v, 0, 128); sprintf(v, "", [fontInfo->name UTF8String]); [_html appendBytes: v length: strlen(v)]; free(v); } else if ([s isEqualToString: @"i"] && formattingOptions) { [_html appendBytes: "" length: 3]; formattingOptions->italic = YES; } else if ([s isEqualToString: @"i0"] && formattingOptions) { [_html appendBytes: "" length: 4]; formattingOptions->italic = NO; } else if ([s isEqualToString: @"tab"]) { [_html appendBytes: "  " length: 12]; } else if ([s isEqualToString: @"softline"] || [s isEqualToString: @"par"]) { [_html appendBytes: "
" length: 4]; } else if ([s isEqualToString: @"strike"] && formattingOptions) { [_html appendBytes: "" length: 8]; formattingOptions->strikethrough = YES; } else if ([s isEqualToString: @"strike0"] && formattingOptions) { [_html appendBytes: "" length: 9]; formattingOptions->strikethrough = NO; } else if ([s hasPrefix: @"u"] && [s length] > 1 && isdigit([s characterAtIndex: 1])) { NSData *d; unichar ch; ch = (unichar)[[s substringFromIndex: 1] intValue]; s = [NSString stringWithCharacters: &ch length: 1]; d = [s dataUsingEncoding: NSUTF8StringEncoding]; [_html appendData: d]; } else if ([s isEqualToString: @"ul"] && formattingOptions) { [_html appendBytes: "" length: 3]; formattingOptions->underline = YES; } else if (([s isEqualToString: @"ul0"] || [s isEqualToString: @"ulnone"]) && formattingOptions) { [_html appendBytes: "" length: 4]; formattingOptions->underline = NO; } // If a space delimits the control word, the space does not appear in the document. // Any characters following the delimiter, including spaces, will appear in the document. if (*_bytes == ' ') { ADVANCE; } } else if (c == '{') { formattingOptions = [[[RTFFormattingOptions alloc] init] autorelease]; formattingOptions->bold = NO; formattingOptions->italic = NO; formattingOptions->strikethrough = NO; formattingOptions->underline = NO; formattingOptions->font_index = -1; formattingOptions->color_index = -1; formattingOptions->start_pos = [_html length]; [stack push: formattingOptions]; ADVANCE; } else if (c == '}') { formattingOptions = [stack pop]; if (formattingOptions) { // Handle {\b bold} vs. \b bold \b0 if (formattingOptions->bold) { [_html appendBytes: "" length: 4]; } if (formattingOptions->italic) { [_html appendBytes: "" length: 4]; } if (formattingOptions->strikethrough) { [_html appendBytes: "" length: 9]; } if (formattingOptions->underline) { [_html appendBytes: "" length: 4]; } if (formattingOptions->font_index >= 0) { [_html appendBytes: "
" length: 7]; } if (formattingOptions->color_index >= 0) { [_html appendBytes: "" length: 7]; } } formattingOptions = [stack top]; ADVANCE; } else { // We avoid appending NULL bytes if (*_bytes) [_html appendBytes: _bytes length: 1]; ADVANCE; } } [_html appendBytes: "" length: 14]; RELEASE(stack); return AUTORELEASE(_html); } @end SOGo-2.1.1b/OpenChange/NSArray+MAPIStore.m0000644000000000000000000001727712247657026016456 0ustar rootroot/* NSArray+MAPIStore.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 "NSDate+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSString+MAPIStore.h" #import "NSArray+MAPIStore.h" #undef DEBUG #include #include #include #include #include @implementation NSArray (MAPIStoreFolders) + (id) arrayFromMAPIMVLong: (struct mapi_MV_LONG_STRUCT *) mvLong { NSUInteger count; NSNumber *subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvLong->cValues]; for (count = 0; count < mvLong->cValues; count++) { subObject = [NSNumber numberWithLong: mvLong->lpl[count]]; [mvResult addObject: subObject]; } return mvResult; } + (id) arrayFromMAPIMVUnicode: (struct mapi_SLPSTRArrayW *) mvUnicode { NSUInteger count; NSString *subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvUnicode->cValues]; for (count = 0; count < mvUnicode->cValues; count++) { subObject = [NSString stringWithUTF8String: mvUnicode->strings[count].lppszW]; [mvResult addObject: subObject]; } return mvResult; } + (id) arrayFromMAPIMVString: (struct mapi_SLPSTRArray *) mvString { NSUInteger count; id subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvString->cValues]; for (count = 0; count < mvString->cValues; count++) { subObject = [NSString stringWithUTF8String: mvString->strings[count].lppszA]; [mvResult addObject: subObject]; } return mvResult; } + (id) arrayFromMAPIMVBinary: (struct mapi_SBinaryArray *) mvBinary { NSUInteger count; id subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvBinary->cValues]; for (count = 0; count < mvBinary->cValues; count++) { subObject = [NSData dataWithShortBinary: mvBinary->bin + count]; [mvResult addObject: subObject]; } return mvResult; } + (id) arrayFromMAPIMVGuid: (struct mapi_SGuidArray *) mvGuid { NSUInteger count; id subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvGuid->cValues]; for (count = 0; count < mvGuid->cValues; count++) { subObject = [NSData dataWithGUID: mvGuid->lpguid + count]; [mvResult addObject: subObject]; } return mvResult; } + (id) arrayFromMVShort: (const struct ShortArray_r *) mvShort { NSUInteger count; NSNumber *subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvShort->cValues]; for (count = 0; count < mvShort->cValues; count++) { subObject = [NSNumber numberWithShort: mvShort->lpi[count]]; [mvResult addObject: subObject]; } return mvResult; } + (id) arrayFromMVLong: (const struct LongArray_r *) mvLong { NSUInteger count; NSNumber *subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvLong->cValues]; for (count = 0; count < mvLong->cValues; count++) { subObject = [NSNumber numberWithLong: mvLong->lpl[count]]; [mvResult addObject: subObject]; } return mvResult; } - (struct LongArray_r *) asMVLongInMemCtx: (void *) memCtx { struct LongArray_r *list; NSNumber *number; NSInteger count, max; max = [self count]; list = talloc_zero (memCtx, struct LongArray_r); list->cValues = max; list->lpl = talloc_array (list, uint32_t, max); for (count = 0; count < max; count++) { number = [self objectAtIndex: count]; list->lpl[count] = [number longValue]; } return list; } + (id) arrayFromMVUI8: (const struct UI8Array_r *) mvUI8 { NSUInteger count; NSNumber *subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvUI8->cValues]; for (count = 0; count < mvUI8->cValues; count++) { subObject = [NSNumber numberWithLongLong: mvUI8->lpui8[count]]; [mvResult addObject: subObject]; } return mvResult; } + (id) arrayFromMVUnicode: (const struct StringArrayW_r *) mvUnicode { NSUInteger count; NSString *subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvUnicode->cValues]; for (count = 0; count < mvUnicode->cValues; count++) { subObject = [NSString stringWithUTF8String: mvUnicode->lppszW[count]]; [mvResult addObject: subObject]; } return mvResult; } - (struct StringArrayW_r *) asMVUnicodeInMemCtx: (void *) memCtx { struct StringArrayW_r *list; NSInteger count, max; max = [self count]; list = talloc_zero (memCtx, struct StringArrayW_r); list->cValues = max; list->lppszW = talloc_array (list, const char *, max); for (count = 0; count < max; count++) list->lppszW[count] = [[self objectAtIndex: count] asUnicodeInMemCtx: list->lppszW]; return list; } + (id) arrayFromMVString: (const struct StringArray_r *) mvString { NSUInteger count; id subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvString->cValues]; for (count = 0; count < mvString->cValues; count++) { subObject = [NSString stringWithUTF8String: mvString->lppszA[count]]; [mvResult addObject: subObject]; } return mvResult; } + (id) arrayFromMVBinary: (const struct BinaryArray_r *) mvBinary { NSUInteger count; id subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvBinary->cValues]; for (count = 0; count < mvBinary->cValues; count++) { subObject = [NSData dataWithBinary: mvBinary->lpbin + count]; [mvResult addObject: subObject]; } return mvResult; } - (struct BinaryArray_r *) asMVBinaryInMemCtx: (void *) memCtx { struct BinaryArray_r *list; NSData *data; NSInteger count, max; max = [self count]; list = talloc_zero (memCtx,struct BinaryArray_r); list->cValues = max; list->lpbin = talloc_array (list, struct Binary_r, max); for (count = 0; count < max; count++) { data = [self objectAtIndex: count]; list->lpbin[count].cb = [data length]; list->lpbin[count].lpb = talloc_memdup (list->lpbin, [data bytes], list->lpbin[count].cb); } return list; } + (id) arrayFromMVGuid: (const struct FlatUIDArray_r *) mvGuid { NSUInteger count; id subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvGuid->cValues]; for (count = 0; count < mvGuid->cValues; count++) { subObject = [NSData dataWithFlatUID: mvGuid->lpguid[count]]; [mvResult addObject: subObject]; } return mvResult; } + (id) arrayFromMVFileTime: (const struct DateTimeArray_r *) mvFileTime { NSUInteger count; id subObject; NSMutableArray *mvResult; mvResult = [NSMutableArray arrayWithCapacity: mvFileTime->cValues]; for (count = 0; count < mvFileTime->cValues; count++) { subObject = [NSDate dateFromFileTime: mvFileTime->lpft + count]; [mvResult addObject: subObject]; } return mvResult; } @end SOGo-2.1.1b/OpenChange/EOBitmaskQualifier.h0000644000000000000000000000236612247657026017044 0ustar rootroot/* EOBitmaskQualifier.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 EOBITMASKQUALIFIER_H #define EOBITMASKQUALIFIER_H #import @interface EOBitmaskQualifier : EOQualifier { NSString *key; uint32_t mask; BOOL isZero; } - (id) initWithKey: (NSString *) newKey mask: (uint32_t) newMask isZero: (BOOL) newIsZero; - (NSString *) key; - (uint32_t ) mask; - (BOOL) isZero; @end #endif /* EOBITMASKQUALIFIER_H */ SOGo-2.1.1b/OpenChange/MAPIStoreCalendarAttachment.m0000644000000000000000000001457312247657026020602 0ustar rootroot/* MAPIStoreCalendarAttachment.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import "iCalEvent+MAPIStore.h" #import "MAPIStoreCalendarEmbeddedMessage.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSDate+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreCalendarAttachment.h" #undef DEBUG #include #include #include #include @implementation MAPIStoreCalendarAttachment - (id) init { if ((self = [super init])) { event = nil; timeZone = nil; } return self; } - (id) initInContainer: (MAPIStoreObject *) newContainer { MAPIStoreUserContext *userContext; if ((self = [super initInContainer: newContainer])) { userContext = [newContainer userContext]; ASSIGN (timeZone, [userContext timeZone]); } return self; } - (void) dealloc { [event release]; [timeZone release]; [super dealloc]; } - (void) setEvent: (iCalEvent *) newEvent { ASSIGN (event, newEvent); } - (iCalEvent *) event { return event; } - (NSString *) nameInContainer { return [[event uniqueChildWithTag: @"recurrence-id"] flattenedValuesForKey: @""]; } - (int) getPidTagAttachmentHidden: (void **) data inMemCtx: (TALLOC_CTX *) localMemCtx { return [self getYes: data inMemCtx: localMemCtx]; } - (int) getPidTagAttachmentFlags: (void **) data inMemCtx: (TALLOC_CTX *) localMemCtx { *data = MAPILongValue (localMemCtx, 0x00000002); /* afException */ return MAPISTORE_SUCCESS; } - (int) getPidTagAttachmentLinkId: (void **) data inMemCtx: (TALLOC_CTX *) localMemCtx { return [self getLongZero: data inMemCtx: localMemCtx]; } - (int) getPidTagAttachFlags: (void **) data inMemCtx: (TALLOC_CTX *) localMemCtx { return [self getLongZero: data inMemCtx: localMemCtx]; } - (int) getPidTagAttachMethod: (void **) data inMemCtx: (TALLOC_CTX *) localMemCtx { *data = MAPILongValue (localMemCtx, afEmbeddedMessage); return MAPISTORE_SUCCESS; } - (int) getPidTagAttachEncoding: (void **) data inMemCtx: (TALLOC_CTX *) localMemCtx { *data = [[NSData data] asBinaryInMemCtx: localMemCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) localMemCtx { *data = [@"Untitled" asUnicodeInMemCtx: localMemCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttachmentContactPhoto: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidTagExceptionReplaceTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSCalendarDate *dateValue; NSInteger offset; dateValue = [event recurrenceId]; if (dateValue) { rc = MAPISTORE_SUCCESS; if ([event isAllDay]) { offset = -[timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; } [dateValue setTimeZone: utcTZ]; *data = [dateValue asFileTimeInMemCtx: memCtx]; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidTagExceptionStartTime: (void **) data inMemCtx: (TALLOC_CTX *) localMemCtx { enum mapistore_error rc; NSCalendarDate *dateValue; NSInteger offset; if ([event recurrenceId] != nil) { dateValue = [event startDate]; [dateValue setTimeZone: timeZone]; if (![event isAllDay]) { offset = [timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; } *data = [dateValue asFileTimeInMemCtx: localMemCtx]; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidTagExceptionEndTime: (void **) data inMemCtx: (TALLOC_CTX *) localMemCtx { enum mapistore_error rc; NSCalendarDate *dateValue; NSInteger offset; if ([event recurrenceId] != nil) { dateValue = [event startDate]; [dateValue setTimeZone: timeZone]; offset = [event durationAsTimeInterval]; if (![event isAllDay]) offset += [timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; *data = [dateValue asFileTimeInMemCtx: localMemCtx]; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } /* subclasses */ - (MAPIStoreCalendarEmbeddedMessage *) openEmbeddedMessage { MAPIStoreCalendarEmbeddedMessage *msg; msg = [MAPIStoreCalendarEmbeddedMessage mapiStoreObjectInContainer: self]; return msg; } - (MAPIStoreCalendarEmbeddedMessage *) createEmbeddedMessage { MAPIStoreCalendarEmbeddedMessage *msg; msg = [self openEmbeddedMessage]; [msg setIsNew: YES]; return msg; } @end SOGo-2.1.1b/OpenChange/SOGoMAPIDBFolder.h0000644000000000000000000000325012247657026016175 0ustar rootroot/* SOGoMAPIDBFolder.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc. * * 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 3, 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 SOGOMAPIDBFOLDER_H #define SOGOMAPIDBFOLDER_H #import "SOGoMAPIDBObject.h" @class NSArray; @class NSMutableString; @class NSString; @class NSURL; @class EOQualifier; @class SOGoMAPIDBMessage; @interface SOGoMAPIDBFolder : SOGoMAPIDBObject { NSString *pathPrefix; /* for root folders */ SOGoMAPIDBObject *aclMessage; } - (void) setPathPrefix: (NSString *) newPathPrefix; - (NSMutableString *) pathForChild: (NSString *) childName; - (NSArray *) toOneRelationshipKeys; - (NSArray *) toManyRelationshipKeys; - (NSArray *) childKeysOfType: (MAPIDBObjectType) type includeDeleted: (BOOL) includeDeleted matchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings; - (void) changePathTo: (NSString *) newPath; @end #endif /* SOGOMAPIDBFOLDER_H */ SOGo-2.1.1b/OpenChange/iCalTimeZone+MAPIStore.h0000644000000000000000000000241512247657027017442 0ustar rootroot/* iCalTimeZone+MAPIStore.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 3, 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 ICALTIMEZONE_MAPISTORE_H #define ICALTIMEZONE_MAPISTORE_H #import @interface iCalTimeZone (MAPIStoreProperties) - (struct Binary_r *) asTimeZoneStructInMemCtx: (TALLOC_CTX *) memCtx; - (struct Binary_r *) asZoneTimeDefinitionWithFlags: (enum TZRuleFlag) flags inMemCtx: (TALLOC_CTX *) memCtx; @end #endif /* ICALTIMEZONE_MAPISTORE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreFAIMessageTable.m0000644000000000000000000000463712247657026017734 0ustar rootroot/* MAPIStoreFAIMessageTable.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 "MAPIStoreFAIMessage.h" #import "MAPIStoreFolder.h" #import "MAPIStoreFAIMessageTable.h" #undef DEBUG #include #include #include static Class MAPIStoreFAIMessageK = Nil; @implementation MAPIStoreFAIMessageTable + (void) initialize { MAPIStoreFAIMessageK = [MAPIStoreFAIMessage class]; } + (Class) childObjectClass { return MAPIStoreFAIMessageK; } - (id) init { if ((self = [super init])) { tableType = MAPISTORE_FAI_TABLE; } return self; } - (NSArray *) childKeys { if (!childKeys) { childKeys = [(MAPIStoreFolder *) container faiMessageKeysMatchingQualifier: nil andSortOrderings: sortOrderings]; [childKeys retain]; } return childKeys; } - (NSArray *) restrictedChildKeys { NSArray *keys; if (!restrictedChildKeys) { if (restrictionState != MAPIRestrictionStateAlwaysTrue) { if (restrictionState == MAPIRestrictionStateNeedsEval) keys = [(MAPIStoreFolder *) container faiMessageKeysMatchingQualifier: restriction andSortOrderings: sortOrderings]; else keys = [NSArray array]; } else keys = [self childKeys]; ASSIGN (restrictedChildKeys, keys); } return restrictedChildKeys; } - (id) lookupChild: (NSString *) childKey { return [(MAPIStoreFolder *) container lookupFAIMessage: childKey]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreNotesContext.h0000644000000000000000000000207312247657026017500 0ustar rootroot/* MAPIStoreNotesContext.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTORENOTESCONTEXT_H #define MAPISTORENOTESCONTEXT_H #import "MAPIStoreDBBaseContext.h" @interface MAPIStoreNotesContext : MAPIStoreDBBaseContext @end #endif /* MAPISTORENOTESCONTEXT_H */ SOGo-2.1.1b/OpenChange/EOQualifier+MAPI.m0000644000000000000000000000754412247657026016263 0ustar rootroot/* EOQualifier+MAPI.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 #import #import #import #import "EOBitmaskQualifier.h" #import "SOGoMAPIDBObject.h" #import "EOQualifier+MAPI.h" @implementation EOQualifier (MAPIStoreRestrictions) - (BOOL) _evaluateSOGoMAPIDBObject: (NSDictionary *) properties { [self subclassResponsibility: _cmd]; return NO; } - (BOOL) evaluateSOGoMAPIDBObject: (SOGoMAPIDBObject *) object { NSDictionary *properties; BOOL rc; //[self logWithFormat: @"evaluating object '%@'", object]; properties = [object properties]; rc = [self _evaluateSOGoMAPIDBObject: properties]; //[self logWithFormat: @" evaluation result: %d", rc]; return rc; } @end @implementation EOAndQualifier (MAPIStoreRestrictionsPrivate) - (BOOL) _evaluateSOGoMAPIDBObject: (NSDictionary *) properties { NSUInteger i; BOOL rc; rc = YES; for (i = 0; rc && i < count; i++) rc = [[qualifiers objectAtIndex: i] _evaluateSOGoMAPIDBObject: properties]; return rc; } @end @implementation EOOrQualifier (MAPIStoreRestrictionsPrivate) - (BOOL) _evaluateSOGoMAPIDBObject: (NSDictionary *) properties { NSUInteger i; BOOL rc; rc = NO; for (i = 0; !rc && i < count; i++) rc = [[qualifiers objectAtIndex: i] _evaluateSOGoMAPIDBObject: properties]; return rc; } @end @implementation EONotQualifier (MAPIStoreRestrictionsPrivate) - (BOOL) _evaluateSOGoMAPIDBObject: (NSDictionary *) properties { return ![qualifier _evaluateSOGoMAPIDBObject: properties]; } @end @implementation EOKeyValueQualifier (MAPIStoreRestrictionsPrivate) typedef BOOL (*EOComparator) (id, SEL, id); - (BOOL) _evaluateSOGoMAPIDBObject: (NSDictionary *) properties { id finalKey; id propValue; EOComparator comparator; if ([key isKindOfClass: [NSNumber class]]) finalKey = key; else if ([key isKindOfClass: [NSString class]]) { finalKey = [key stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet]]; if ([finalKey length] > 0) finalKey = key; else finalKey = [NSNumber numberWithInt: [key intValue]]; } else finalKey = @""; propValue = [properties objectForKey: finalKey]; comparator = (EOComparator) [propValue methodForSelector: operator]; return (comparator ? comparator (propValue, operator, value) : NO); } @end @implementation EOBitmaskQualifier (MAPIStoreRestrictionsPrivate) - (BOOL) _evaluateSOGoMAPIDBObject: (NSDictionary *) properties { NSNumber *propTag; id propValue; uint32_t intValue; BOOL rc; propTag = [NSNumber numberWithInt: [key intValue]]; propValue = [properties objectForKey: propTag]; intValue = [propValue unsignedIntValue]; rc = ((isZero && (intValue & mask) == 0) || (!isZero && (intValue & mask) != 0)); //[self logWithFormat: @"evaluation of bitmask qualifier:" // @" (%.8x & %.8x) %s 0: %d", // intValue, mask, (isZero ? "==" : "!="), rc]; return rc; } @end SOGo-2.1.1b/OpenChange/MAPIStoreMessageTable.h0000644000000000000000000000224212247657026017375 0ustar rootroot/* MAPIStoreMessageTable.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 MAPISTOREMESSAGETABLE_H #define MAPISTOREMESSAGETABLE_H #import "MAPIStoreTable.h" @interface MAPIStoreMessageTable : MAPIStoreTable - (void) setSortOrder: (const struct SSortOrderSet *) set; - (void) notifyChangesForChild: (MAPIStoreMessage *) child; @end #endif /* MAPISTOREMESSAGETABLE_H */ SOGo-2.1.1b/OpenChange/classes.txt0000644000000000000000000000132112247657026015377 0ustar rootrootclass hierarchy (*: end points) MAPIStoreContext MAPIStoreGCSBaseContext * MAPIStoreCalendarContext * MAPIStoreContactsContext * MAPIStoreTasksContext * MAPIStoreMailContext * MAPIStoreOutboxContext * MAPIStoreSpoolerContext MAPIStoreFileSystemBaseContext * MAPIStoreCommonViewsContext * MAPIStoreDeferredActionsContext * MAPIStoreDraftsContext * MAPIStoreJournalContext * MAPIStoreNotesContext * MAPIStoreRemindersContext * MAPIStoreSearchContext * MAPIStoreSentItemsContext * MAPIStoreShortcutsContext (undecided:) DeletedItems (trash IMAP folder?) Freebusy (needs info) Schedule (needs info + purpose?) Views (needs info + purpose) SOGo-2.1.1b/OpenChange/MAPIStoreMailFolder.h0000644000000000000000000000370312247657026017062 0ustar rootroot/* MAPIStoreMailFolder.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREMAILFOLDER_H #define MAPISTOREMAILFOLDER_H #import "MAPIStoreFolder.h" @class NSNumber; @class WOContext; @class SOGoMailAccount; @class SOGoMailFolder; @class MAPIStoreMailMessageTable; @interface MAPIStoreMailFolder : MAPIStoreFolder { SOGoMAPIDBMessage *versionsMessage; NSMutableDictionary *bodyData; } - (BOOL) ensureFolderExists; /* synchronisation & versioning */ - (BOOL) synchroniseCache; - (NSNumber *) modseqFromMessageChangeNumber: (NSString *) changeNum; - (NSString *) messageUIDFromMessageKey: (NSString *) messageKey; - (NSString *) changeNumberForMessageUID: (NSString *) messageUid; - (void) setChangeKey: (NSData *) changeKey forMessageWithKey: (NSString *) messageKey; - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey; - (NSData *) predecessorChangeListForMessageWithKey: (NSString *) messageKey; @end /* MAPIStoreOutboxFolder is a special subclass of MAPIStoreMailFolder where the displayname is always "Outbox" and can not be changed. */ @interface MAPIStoreOutboxFolder : MAPIStoreMailFolder @end #endif /* MAPISTOREMAILFOLDER_H */ SOGo-2.1.1b/OpenChange/NSObject+MAPIStore.m0000644000000000000000000001674112247657026016601 0ustar rootroot/* NSObject+MAPIStore.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import "MAPIStorePropertySelectors.h" #import "MAPIStoreTypes.h" #import "NSArray+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" #import "NSValue+MAPIStore.h" #import "NSString+MAPIStore.h" #import "NSObject+MAPIStore.h" #undef DEBUG #include #include @implementation NSObject (MAPIStoreTallocHelpers) static int MAPIStoreTallocWrapperDestroy (void *data) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; wrapper = data; //NSLog (@"destroying wrapped object (wrapper: %p; object: %p (%@))...\n", wrapper, wrapper->instance, NSStringFromClass([wrapper->instance class])); [wrapper->instance release]; [pool release]; GSUnregisterCurrentThread (); return 0; } - (struct MAPIStoreTallocWrapper *) tallocWrapper: (TALLOC_CTX *) tallocCtx { struct MAPIStoreTallocWrapper *wrapper; wrapper = talloc_zero (tallocCtx, struct MAPIStoreTallocWrapper); talloc_set_destructor ((void *) wrapper, MAPIStoreTallocWrapperDestroy); wrapper->instance = self; [self retain]; //NSLog (@"returning wrapper: %p; object: %p (%@)", wrapper, self, NSStringFromClass([self class])); return wrapper; } @end @implementation NSObject (MAPIStoreDataTypes) - (int) getValue: (void **) data forTag: (enum MAPITAGS) propTag inMemCtx: (TALLOC_CTX *) memCtx { uint16_t valueType; int rc = MAPISTORE_SUCCESS; // [self logWithFormat: @"property %.8x found", propTag]; valueType = (propTag & 0xffff); switch (valueType) { case PT_NULL: *data = NULL; break; case PT_SHORT: *data = [(NSNumber *) self asShortInMemCtx: memCtx]; break; case PT_LONG: *data = [(NSNumber *) self asLongInMemCtx: memCtx]; break; case PT_I8: *data = [(NSNumber *) self asI8InMemCtx: memCtx]; break; case PT_BOOLEAN: *data = [(NSNumber *) self asBooleanInMemCtx: memCtx]; break; case PT_DOUBLE: *data = [(NSNumber *) self asDoubleInMemCtx: memCtx]; break; case PT_UNICODE: case PT_STRING8: *data = [(NSString *) self asUnicodeInMemCtx: memCtx]; break; case PT_SYSTIME: *data = [(NSCalendarDate * ) self asFileTimeInMemCtx: memCtx]; break; case PT_BINARY: case PT_SVREID: *data = [(NSData *) self asBinaryInMemCtx: memCtx]; break; case PT_CLSID: *data = [(NSData *) self asGUIDInMemCtx: memCtx]; break; case PT_MV_LONG: *data = [(NSArray *) self asMVLongInMemCtx: memCtx]; break; case PT_MV_UNICODE: *data = [(NSArray *) self asMVUnicodeInMemCtx: memCtx]; break; case PT_MV_BINARY: *data = [(NSArray *) self asMVBinaryInMemCtx: memCtx]; break; default: [self errorWithFormat: @"object type not handled: %d (0x%.4x)", valueType, valueType]; abort(); *data = NULL; rc = MAPISTORE_ERR_NOT_FOUND; } return rc; } /* helper getters */ - (int) getEmptyString: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getLongZero: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0); return MAPISTORE_SUCCESS; } - (int) getYes: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, YES); return MAPISTORE_SUCCESS; } - (int) getNo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, NO); return MAPISTORE_SUCCESS; } - (int) getSMTPAddrType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"SMTP" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } @end @implementation NSObject (MAPIStoreProperties) + (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP inMemCtx: (TALLOC_CTX *) memCtx { struct SPropTagArray *properties; const MAPIStorePropertyGetter *classGetters; NSUInteger count; enum MAPITAGS propTag; uint16_t propId; properties = talloc_zero (memCtx, struct SPropTagArray); properties->aulPropTag = talloc_array (properties, enum MAPITAGS, MAPIStoreSupportedPropertiesCount); classGetters = MAPIStorePropertyGettersForClass (self); for (count = 0; count < MAPIStoreSupportedPropertiesCount; count++) { propTag = MAPIStoreSupportedProperties[count]; propId = (propTag >> 16) & 0xffff; if (classGetters[propId]) { properties->aulPropTag[properties->cValues] = propTag; properties->cValues++; } } *propertiesP = properties; return MAPISTORE_SUCCESS; } + (void) fillAvailableProperties: (struct SPropTagArray *) properties withExclusions: (BOOL *) exclusions { TALLOC_CTX *localMemCtx; struct SPropTagArray *subProperties; uint16_t propId; NSUInteger count; localMemCtx = talloc_zero (NULL, TALLOC_CTX); [self getAvailableProperties: &subProperties inMemCtx: localMemCtx]; for (count = 0; count < subProperties->cValues; count++) { propId = (subProperties->aulPropTag[count] >> 16) & 0xffff; if (!exclusions[propId]) { properties->aulPropTag[properties->cValues] = subProperties->aulPropTag[count]; properties->cValues++; exclusions[propId] = YES; } } talloc_free (localMemCtx); } - (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP inMemCtx: (TALLOC_CTX *) memCtx { NSUInteger count; struct SPropTagArray *availableProps; enum MAPITAGS propTag; availableProps = talloc_zero (memCtx, struct SPropTagArray); availableProps->aulPropTag = talloc_array (availableProps, enum MAPITAGS, MAPIStoreSupportedPropertiesCount); for (count = 0; count < MAPIStoreSupportedPropertiesCount; count++) { propTag = MAPIStoreSupportedProperties[count]; if ([self canGetProperty: propTag]) { availableProps->aulPropTag[availableProps->cValues] = propTag; availableProps->cValues++; } } *propertiesP = availableProps; return MAPISTORE_SUCCESS; } - (BOOL) canGetProperty: (enum MAPITAGS) propTag { uint16_t propId; const IMP *classGetters; classGetters = (IMP *) MAPIStorePropertyGettersForClass (isa); propId = (propTag >> 16) & 0xffff; return (classGetters[propId] != NULL); } @end SOGo-2.1.1b/OpenChange/MAPIStoreCalendarContext.h0000644000000000000000000000211412247657026020115 0ustar rootroot/* MAPIStoreCalendarContext.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTORECALENDARCONTEXT_H #define MAPISTORECALENDARCONTEXT_H #import "MAPIStoreGCSBaseContext.h" @interface MAPIStoreCalendarContext : MAPIStoreGCSBaseContext @end #endif /* MAPISTORECALENDARCONTEXT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreMailContext.h0000644000000000000000000000225012247657026017267 0ustar rootroot/* MAPIStoreMailContext.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTOREMAILCONTEXT_H #define MAPISTOREMAILCONTEXT_H #import "MAPIStoreContext.h" @interface MAPIStoreMailContext : MAPIStoreContext - (void) updateURLWithFolderName: (NSString *) newFolderName; @end @interface MAPIStoreOutboxContext : MAPIStoreMailContext @end #endif /* MAPISTOREMAILCONTEXT_H */ SOGo-2.1.1b/OpenChange/SOGoMAPIDBMessage.m0000644000000000000000000000404212247657026016353 0ustar rootroot/* SOGoMAPIDBMessage.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc. * * 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 3, 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 #import #import #import #import #import #import "SOGoMAPIDBFolder.h" #import "SOGoMAPIDBMessage.h" @implementation SOGoMAPIDBMessage - (Class) mapistoreMessageClass { // NSArray *dirMembers; NSString *className; [NSException raise: @"whereisthisusedexception" format: @"this exception should be triggered only for tracing"]; // /* FIXME: this method is a bit dirty */ // dirMembers = [[container directory] componentsSeparatedByString: @"/"]; // if ([dirMembers containsObject: @"fai"]) /* should not occur as FAI message // are instantiated directly in // MAPIStoreFolder */ // className = @"MAPIStoreFAIMessage"; // else if ([dirMembers containsObject: @"notes"]) // className = @"MAPIStoreNotesMessage"; // else // className = @"MAPIStoreDBMessage"; className = @"nimportequoi"; return NSClassFromString (className); } @end SOGo-2.1.1b/OpenChange/MAPIStoreNotesFolder.m0000644000000000000000000000243312247657026017274 0ustar rootroot/* MAPIStoreNotesFolder.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 "MAPIStoreNotesFolder.h" #import "MAPIStoreNotesMessage.h" #import "NSString+MAPIStore.h" #include #import "MAPIStoreNotesFolder.h" @implementation MAPIStoreNotesFolder - (int) getPidTagDefaultPostMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.StickyNote" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } @end SOGo-2.1.1b/OpenChange/MAPIStoreTasksMessageTable.h0000644000000000000000000000212712247657026020405 0ustar rootroot/* MAPIStoreTasksMessageTable.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 MAPISTORETASKSMESSAGETABLE_H #define MAPISTORETASKSMESSAGETABLE_H #import "MAPIStoreGCSMessageTable.h" @interface MAPIStoreTasksMessageTable : MAPIStoreGCSMessageTable @end #endif /* MAPISTORETASKSMESSAGETABLE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreContactsMessage.h0000644000000000000000000000214212247657026020123 0ustar rootroot/* MAPIStoreContactsMessage.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORECONTACTSMESSAGE_H #define MAPISTORECONTACTSMESSAGE_H #import "MAPIStoreGCSMessage.h" @interface MAPIStoreContactsMessage : MAPIStoreGCSMessage { BOOL fetchedAttachments; } @end #endif /* MAPISTORECONTACTSMESSAGE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreMessage.h0000644000000000000000000000544512247657026016435 0ustar rootroot/* MAPIStoreMessage.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTOREMESSAGE_H #define MAPISTOREMESSAGE_H #import @class NSArray; @class NSMutableArray; @class NSMutableDictionary; @class EOQualifier; @class MAPIStoreAttachment; @class MAPIStoreAttachmentTable; @class MAPIStoreFolder; #import "MAPIStoreSOGoObject.h" @interface MAPIStoreMessage : MAPIStoreSOGoObject { NSArray *attachmentKeys; NSMutableDictionary *attachmentParts; NSMutableArray *activeTables; NSArray *activeUserRoles; } - (void) getMessageData: (struct mapistore_message **) dataPtr inMemCtx: (TALLOC_CTX *) memCtx; - (int) modifyRecipientsWithRecipients: (struct mapistore_message_recipient *) recipients andCount: (NSUInteger) max andColumns: (struct SPropTagArray *) columns; - (NSArray *) attachmentKeys; - (NSArray *) attachmentKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings; - (id) lookupAttachment: (NSString *) childKey; /* backend methods */ - (int) createAttachment: (MAPIStoreAttachment **) attachmentPtr inAID: (uint32_t *) aidPtr; - (int) getAttachment: (MAPIStoreAttachment **) attachmentPtr withAID: (uint32_t) aid; - (int) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr andRowCount: (uint32_t *) countPtr; - (int) setReadFlag: (uint8_t) flag; - (enum mapistore_error) saveMessage: (TALLOC_CTX *) memCtx; - (NSArray *) activeContainerMessageTables; - (NSArray *) activeUserRoles; /* move & copy internal ops */ - (void) copyToMessage: (MAPIStoreMessage *) newMessage inMemCtx: (TALLOC_CTX *) memCtx; /* subclasses */ - (void) save: (TALLOC_CTX *) memCtx; /* attachments (subclasses) */ - (MAPIStoreAttachment *) createAttachment; - (MAPIStoreAttachmentTable *) attachmentTable; - (BOOL) subscriberCanReadMessage; - (BOOL) subscriberCanModifyMessage; @end #endif /* MAPISTOREMESSAGE_H */ SOGo-2.1.1b/OpenChange/product.plist0000644000000000000000000000007312247657027015742 0ustar rootroot{ requires = ( MAIN, Appointments, Contacts, Mailer ); } SOGo-2.1.1b/OpenChange/MAPIStoreMapping.m0000644000000000000000000002470512247657026016451 0ustar rootroot/* MAPIStoreMapping.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #import #import #import #import #import #import #import #import #import "MAPIStoreTypes.h" #import "MAPIStoreMapping.h" #include #include struct tdb_wrap { struct tdb_context *tdb; }; static NSMutableDictionary *mappingRegistry = nil; @implementation MAPIStoreMapping + (void) initialize { mappingRegistry = [NSMutableDictionary new]; } static inline id MAPIStoreMappingKeyFromId (uint64_t idNbr) { return [NSString stringWithUnsignedLongLong: idNbr]; } static int MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, void *data) { NSMutableDictionary *mapping; id idKey; NSString *uri; char *idStr, *uriStr; uint64_t idNbr; // get the key // key examples : key(18) = "0x6900000000000001" // key(31) = "SOFT_DELETED:0xb100020000000001" // idStr = (char *) data1.dptr; idKey = nil; if (strncmp(idStr, "SOFT_DELETED:", 13) != 0) { // It's very important here to use strtoull and NOT strtoll as // the latter will overflow a long long with typical key values. idNbr = strtoull(idStr, NULL, 0); // idKey = [NSNumber numberWithUnsignedLongLong: idNbr]; idKey = MAPIStoreMappingKeyFromId(idNbr); } // get the value and null-terminate it uriStr = (char *)malloc(sizeof(char *) * data2.dsize+1); memset(uriStr, 0, data2.dsize+1); memcpy(uriStr, (const char *) data2.dptr, data2.dsize); uri = [NSString stringWithUTF8String: uriStr]; free (uriStr); mapping = data; if (uri && idKey) { [mapping setObject: uri forKey: idKey]; } return 0; } + (id) mappingForUsername: (NSString *) username withIndexing: (struct tdb_wrap *) indexing { id mapping; mapping = [mappingRegistry objectForKey: username]; if (!mapping) { mapping = [[self alloc] initForUsername: username withIndexing: indexing]; [mapping autorelease]; } return mapping; } - (id) init { if ((self = [super init])) { memCtx = talloc_zero (NULL, TALLOC_CTX); mapping = [NSMutableDictionary new]; reverseMapping = [NSMutableDictionary new]; indexing = NULL; useCount = 0; } return self; } - (void) increaseUseCount { if (useCount == 0) { [mappingRegistry setObject: self forKey: username]; [self logWithFormat: @"mapping registered (%@)", username]; } useCount++; } - (void) decreaseUseCount { useCount--; if (useCount == 0) { [mappingRegistry removeObjectForKey: username]; [self logWithFormat: @"mapping deregistered (%@)", username]; } } - (id) initForUsername: (NSString *) newUsername withIndexing: (struct tdb_wrap *) newIndexing { NSString *idNbr, *uri; NSArray *keys; NSUInteger count, max; if ((self = [self init])) { ASSIGN (username, newUsername); indexing = newIndexing; (void) talloc_reference (memCtx, newIndexing); tdb_traverse_read (indexing->tdb, MAPIStoreMappingTDBTraverse, mapping); keys = [mapping allKeys]; max = [keys count]; for (count = 0; count < max; count++) { idNbr = [keys objectAtIndex: count]; uri = [mapping objectForKey: idNbr]; //[self logWithFormat: @"preregistered id '%@' for url '%@'", idNbr, uri]; [reverseMapping setObject: idNbr forKey: uri]; } //[self logWithFormat: @"Complete mapping: %@ \nComplete reverse mapping: %@", mapping, reverseMapping]; } return self; } - (void) dealloc { [username release]; [mapping release]; [reverseMapping release]; talloc_free (memCtx); [super dealloc]; } - (NSString *) urlFromID: (uint64_t) idNbr { return [mapping objectForKey: MAPIStoreMappingKeyFromId (idNbr)]; } - (uint64_t) idFromURL: (NSString *) url { id key; uint64_t idNbr; key = [reverseMapping objectForKey: url]; if (key) idNbr = [key unsignedLongLongValue]; else idNbr = NSNotFound; return idNbr; } - (void) _updateFolderWithURL: (NSString *) oldURL withURL: (NSString *) urlString { NSArray *allKeys; NSUInteger count, max; NSString *currentKey, *newKey; id idKey; TDB_DATA key, dbuf; [oldURL retain]; allKeys = [reverseMapping allKeys]; max = [allKeys count]; for (count = 0; count < max; count++) { currentKey = [allKeys objectAtIndex: count]; if ([currentKey hasPrefix: oldURL]) { newKey = [currentKey stringByReplacingPrefix: oldURL withPrefix: urlString]; idKey = [reverseMapping objectForKey: currentKey]; [mapping setObject: newKey forKey: idKey]; [reverseMapping setObject: idKey forKey: newKey]; [reverseMapping removeObjectForKey: currentKey]; /* update the record in the indexing database */ key.dptr = (unsigned char *) talloc_asprintf (NULL, "0x%.16"PRIx64, (uint64_t) [idKey unsignedLongLongValue]); key.dsize = strlen ((const char *) key.dptr); dbuf.dptr = (unsigned char *) talloc_strdup (NULL, [newKey UTF8String]); dbuf.dsize = strlen ((const char *) dbuf.dptr); tdb_store (indexing->tdb, key, dbuf, TDB_MODIFY); talloc_free (key.dptr); talloc_free (dbuf.dptr); } } [oldURL release]; } - (void) updateID: (uint64_t) idNbr withURL: (NSString *) urlString { NSString *oldURL; id idKey; TDB_DATA key, dbuf; idKey = MAPIStoreMappingKeyFromId (idNbr); oldURL = [mapping objectForKey: idKey]; if (oldURL) { if ([oldURL hasSuffix: @"/"]) /* is container ? */ { if (![urlString hasSuffix: @"/"]) [NSException raise: NSInvalidArgumentException format: @"a container url must have an ending '/'"]; tdb_transaction_start (indexing->tdb); [self _updateFolderWithURL: oldURL withURL: urlString]; tdb_transaction_commit (indexing->tdb); } else { if ([urlString hasSuffix: @"/"]) [NSException raise: NSInvalidArgumentException format: @"a leaf url must not have an ending '/'"]; [mapping setObject: urlString forKey: idKey]; [reverseMapping setObject: idKey forKey: urlString]; [reverseMapping removeObjectForKey: oldURL]; /* update the record in the indexing database */ key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); key.dsize = strlen((const char *) key.dptr); dbuf.dptr = (unsigned char *) talloc_strdup (NULL, [urlString UTF8String]); dbuf.dsize = strlen((const char *) dbuf.dptr); tdb_store (indexing->tdb, key, dbuf, TDB_MODIFY); talloc_free (key.dptr); talloc_free (dbuf.dptr); } } } - (BOOL) registerURL: (NSString *) urlString withID: (uint64_t) idNbr { id idKey; BOOL rc; TDB_DATA key, dbuf; idKey = MAPIStoreMappingKeyFromId (idNbr); if ([mapping objectForKey: idKey] || [reverseMapping objectForKey: urlString]) { [self errorWithFormat: @"attempt to double register an entry ('%@', %lld," @" 0x%.16"PRIx64")", urlString, idNbr, idNbr]; rc = NO; } else { [mapping setObject: urlString forKey: idKey]; [reverseMapping setObject: idKey forKey: urlString]; rc = YES; // [self logWithFormat: @"registered url '%@' with id %lld (0x%.16"PRIx64")", // urlString, idNbr, idNbr]; /* Add the record given its fid and mapistore_uri */ key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); key.dsize = strlen((const char *) key.dptr); dbuf.dptr = (unsigned char *) talloc_strdup(NULL, [urlString UTF8String]); dbuf.dsize = strlen((const char *) dbuf.dptr); tdb_store (indexing->tdb, key, dbuf, TDB_INSERT); talloc_free (key.dptr); talloc_free (dbuf.dptr); } return rc; } - (void) registerURLs: (NSArray *) urlStrings withIDs: (NSArray *) idNbrs { uint64_t count, max, newID; max = [urlStrings count]; if (max == [idNbrs count]) { tdb_transaction_start (indexing->tdb); for (count = 0; count < max; count++) { newID = [[idNbrs objectAtIndex: count] unsignedLongLongValue]; [self registerURL: [urlStrings objectAtIndex: count] withID: newID]; } tdb_transaction_commit (indexing->tdb); } else [NSException raise: NSInvalidArgumentException format: @"number of urls and ids do not match"]; } - (void) unregisterURLWithID: (uint64_t) idNbr { NSString *urlString; id idKey; TDB_DATA key; idKey = MAPIStoreMappingKeyFromId (idNbr); urlString = [mapping objectForKey: idKey]; if (urlString) { // [self logWithFormat: @"unregistering url '%@' with id %lld (0x%.16"PRIx64")", // urlString, idNbr, idNbr]; [reverseMapping removeObjectForKey: urlString]; [mapping removeObjectForKey: idKey]; /* We hard-delete the entry from the indexing database */ key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); key.dsize = strlen((const char *) key.dptr); tdb_delete(indexing->tdb, key); talloc_free(key.dptr); } } @end SOGo-2.1.1b/OpenChange/MAPIStoreMailMessageTable.m0000644000000000000000000002547712247657026020224 0ustar rootroot/* MAPIStoreMailMessageTable.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import #import #import "MAPIStoreContext.h" #import "MAPIStoreMailFolder.h" #import "MAPIStoreMailMessage.h" #import "MAPIStoreTypes.h" #import "NSData+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreMailMessageTable.h" #undef DEBUG #include #include @implementation MAPIStoreMailMessageTable static Class MAPIStoreMailMessageK, NSDataK, NSStringK; + (void) initialize { MAPIStoreMailMessageK = [MAPIStoreMailMessage class]; NSDataK = [NSData class]; NSStringK = [NSString class]; } + (Class) childObjectClass { return MAPIStoreMailMessageK; } - (id) init { if ((self = [super init])) { ASSIGN (sortOrderings, [NSArray arrayWithObject: @"ARRIVAL"]); fetchedCoreInfos = NO; } return self; } - (void) cleanupCaches { [(MAPIStoreMailFolder *) container synchroniseCache]; fetchedCoreInfos = NO; [super cleanupCaches]; } - (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property { static NSMutableDictionary *knownProperties = nil; if (!knownProperties) { knownProperties = [NSMutableDictionary new]; [knownProperties setObject: @"DATE" forKey: MAPIPropertyKey (PR_CLIENT_SUBMIT_TIME)]; [knownProperties setObject: @"DATE" forKey: MAPIPropertyKey (PR_MESSAGE_DELIVERY_TIME)]; [knownProperties setObject: @"MESSAGE-ID" forKey: MAPIPropertyKey (PR_INTERNET_MESSAGE_ID_UNICODE)]; } return [knownProperties objectForKey: MAPIPropertyKey (property)]; } /* restrictions */ - (MAPIRestrictionState) evaluatePropertyRestriction: (struct mapi_SPropertyRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; id value; NSNumber *modseq; value = NSObjectFromMAPISPropValue (&res->lpProp); switch ((uint32_t) res->ulPropTag) { case PR_MESSAGE_CLASS_UNICODE: if ([value isEqualToString: @"IPM.Note"]) rc = MAPIRestrictionStateAlwaysTrue; else rc = MAPIRestrictionStateAlwaysFalse; break; case PidLidAppointmentStartWhole: case PidLidAppointmentEndWhole: case PidLidRecurring: //[self logWithFormat: @"apt restriction on mail folder?"]; rc = MAPIRestrictionStateAlwaysFalse; break; case PidLidAutoProcessState: if ([value intValue] == 0) rc = MAPIRestrictionStateAlwaysTrue; else rc = MAPIRestrictionStateAlwaysFalse; break; case PR_SEARCH_KEY: rc = MAPIRestrictionStateAlwaysFalse; break; case 0x0fff00fb: /* PR_ENTRY_ID in PtyServerId form */ case 0x0ff600fb: /* resProperty: struct mapi_SPropertyRestriction relop : 0x04 (4) ulPropTag : UNKNOWN_ENUM_VALUE (0xFF600FB) lpProp: struct mapi_SPropValue ulPropTag : UNKNOWN_ENUM_VALUE (0xFF600FB) value : union mapi_SPropValue_CTR(case 251) bin : SBinary_short cb=21 [0000] 01 01 00 1A 00 00 00 00 00 9C 83 E8 0F 00 00 00 ........ ........ [0010] 00 00 00 00 00 ..... */ rc = MAPIRestrictionStateAlwaysFalse; break; case PidTagConversationKey: rc = MAPIRestrictionStateAlwaysFalse; break; case PidTagChangeNumber: { value = [NSString stringWithFormat: @"0x%.16llx", [value unsignedLongLongValue]]; modseq = [(MAPIStoreMailFolder *) container modseqFromMessageChangeNumber: value]; //[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]]; //[self logWithFormat: @" modseq: %.16lx", [modseq unsignedLongLongValue]]; if (modseq) modseq = [NSNumber numberWithUnsignedLongLong: [modseq unsignedLongLongValue] + 1]; else modseq = [NSNumber numberWithUnsignedLongLong: 0]; *qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"MODSEQ" operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo value: modseq]; [*qualifier autorelease]; rc = MAPIRestrictionStateNeedsEval; } break; default: rc = [super evaluatePropertyRestriction: res intoQualifier: qualifier]; } return rc; } - (MAPIRestrictionState) evaluateContentRestriction: (struct mapi_SContentRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; id value; value = NSObjectFromMAPISPropValue (&res->lpProp); if ([value isKindOfClass: NSDataK]) { value = [[NSString alloc] initWithData: value encoding: NSUTF8StringEncoding]; [value autorelease]; } else if (![value isKindOfClass: NSStringK]) [NSException raise: @"MAPIStoreTypeConversionException" format: @"unhandled content restriction for class '%@'", NSStringFromClass ([value class])]; switch (res->ulPropTag) { case PR_MESSAGE_CLASS_UNICODE: if ([value isEqualToString: @"IPM.Note"]) rc = MAPIRestrictionStateAlwaysTrue; else rc = MAPIRestrictionStateAlwaysFalse; break; case PidTagConversationKey: rc = MAPIRestrictionStateAlwaysFalse; break; default: rc = [super evaluateContentRestriction: res intoQualifier: qualifier]; } return rc; } - (MAPIRestrictionState) evaluateExistRestriction: (struct mapi_SExistRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; switch (res->ulPropTag) { case PR_MESSAGE_CLASS_UNICODE: rc = MAPIRestrictionStateAlwaysFalse; break; case PR_MESSAGE_DELIVERY_TIME: rc = MAPIRestrictionStateAlwaysTrue; break; case PR_CLIENT_SUBMIT_TIME: rc = MAPIRestrictionStateAlwaysTrue; break; case PR_PROCESSED: rc = MAPIRestrictionStateAlwaysFalse; break; default: rc = [super evaluateExistRestriction: res intoQualifier: qualifier]; } return rc; } /* sorting */ - (NSString *) _sortIdentifierForProperty: (enum MAPITAGS) property { static NSMutableDictionary *knownProperties = nil; if (!knownProperties) { knownProperties = [NSMutableDictionary new]; /* ARRIVAL, CC */ [knownProperties setObject: @"DATE" forKey: MAPIPropertyKey (PR_CLIENT_SUBMIT_TIME)]; [knownProperties setObject: @"DATE" forKey: MAPIPropertyKey (PR_MESSAGE_DELIVERY_TIME)]; [knownProperties setObject: @"FROM" forKey: MAPIPropertyKey (PR_SENT_REPRESENTING_NAME_UNICODE)]; [knownProperties setObject: @"SIZE" forKey: MAPIPropertyKey (PR_MESSAGE_SIZE)]; [knownProperties setObject: @"SIZE" forKey: MAPIPropertyKey (PidLidRemoteTransferSize)]; [knownProperties setObject: @"SUBJECT" forKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)]; [knownProperties setObject: @"TO" forKey: MAPIPropertyKey (PR_DISPLAY_TO_UNICODE)]; } return [knownProperties objectForKey: MAPIPropertyKey (property)]; } - (void) setSortOrder: (const struct SSortOrderSet *) set { NSMutableArray *newSortOrderings; NSMutableString *newSortOrdering; struct SSortOrder *sortOrder; NSString *sortIdentifier; const char *propName; uint16_t count; if (set) { /* TODO: */ if (set->cCategories > 0) [self errorWithFormat: @"we don't handle sort categories yet"]; newSortOrderings = [NSMutableArray array]; for (count = 0; count < set->cSorts; count++) { sortOrder = set->aSort + count; sortIdentifier = [self _sortIdentifierForProperty: sortOrder->ulPropTag]; if (sortIdentifier) { newSortOrdering = [NSMutableString string]; if (sortOrder->ulOrder == TABLE_SORT_DESCEND) [newSortOrdering appendString: @" REVERSE"]; else if (sortOrder->ulOrder == TABLE_SORT_MAXIMUM_CATEGORY) [self errorWithFormat: @"TABLE_SORT_MAXIMUM_CATEGORY is not handled"]; [newSortOrdering appendFormat: @" %@", sortIdentifier]; [newSortOrderings addObject: [newSortOrdering substringFromIndex: 1]]; } else { propName = get_proptag_name (sortOrder->ulPropTag); if (!propName) propName = ""; [self errorWithFormat: @"sort unhandled for property: %s (0x%.8x)", propName, sortOrder->ulPropTag]; } } if ([newSortOrderings count] > 0) ASSIGN (sortOrderings, newSortOrderings); else ASSIGN (sortOrderings, [NSArray arrayWithObject: @"ARRIVAL"]); //[self logWithFormat: @"new sort orderings: '%@'", sortOrderings]; } else ASSIGN (sortOrderings, [NSArray arrayWithObject: @"ARRIVAL"]); [self cleanupCaches]; } - (int) getRow: (struct mapistore_property_data **) dataP withRowID: (uint32_t) rowId andQueryType: (enum mapistore_query_type) queryType inMemCtx: (TALLOC_CTX *) memCtx { if (!fetchedCoreInfos) { fetchedCoreInfos = YES; [(SOGoMailFolder *) [(MAPIStoreMailFolder *) container sogoObject] prefetchCoreInfosForMessageKeys: [self restrictedChildKeys]]; } return [super getRow: dataP withRowID: rowId andQueryType: queryType inMemCtx: memCtx]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreSOGoObject.h0000644000000000000000000000457112247657026017006 0ustar rootroot/* MAPIStoreObject.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORESOGOOBJECT_H #define MAPISTORESOGOOBJECT_H #include #import "MAPIStoreObject.h" @class NSDate; @class NSData; @class NSString; @class NSMutableArray; @class NSMutableDictionary; @class EOQualifier; @class MAPIStoreContext; @class MAPIStoreFolder; @class MAPIStoreMapping; @class MAPIStoreTable; @class MAPIStoreUserContext; @interface MAPIStoreSOGoObject : MAPIStoreObject { id sogoObject; BOOL isNew; } + (id) mapiStoreObjectWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newContainer; - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newFolder; - (void) setIsNew: (BOOL) newIsNew; - (BOOL) isNew; - (id) sogoObject; - (MAPIStoreObject *) container; - (void) cleanupCaches; - (uint64_t) objectId; /* implemented getters */ - (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagSearchKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagGenerateExchangeViews: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagParentSourceKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagSourceKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; /* subclasses */ - (uint64_t) objectVersion; @end #endif /* MAPISTORESOGOOBJECT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreNotesFolder.h0000644000000000000000000000205212247657026017264 0ustar rootroot/* MAPIStoreNotesFolder.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORENOTESFOLDER_H #define MAPISTORENOTESFOLDER_H #import "MAPIStoreDBFolder.h" @interface MAPIStoreNotesFolder : MAPIStoreDBFolder @end #endif /* MAPISTORENOTESFOLDER_H */ SOGo-2.1.1b/OpenChange/NSString+MAPIStore.h0000644000000000000000000000245512247657026016631 0ustar rootroot/* NSString+MAPIStore.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 NSSTRING_MAPISTORE_H #define NSSTRING_MAPISTORE_H #import @interface NSString (MAPIStoreDataTypes) + (id) stringWithGUID: (const struct GUID *) guid; - (void) extractGUID: (struct GUID *) guid; - (char *) asUnicodeInMemCtx: (void *) memCtx; - (NSData *) convertHexStringToBytes; - (NSString *) stringByReplacingPercentEscapesUsingEncoding: (NSStringEncoding) encoding; @end #endif /* NSSTRING+MAPISTORE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreContactsAttachment.h0000644000000000000000000000232612247657026020633 0ustar rootroot/* MAPIStoreContactsAttachment.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 MAPISTORECONTACTSATTACHMENT_H #define MAPISTORECONTACTSATTACHMENT_H #import "MAPIStoreAttachment.h" @class NSData; @class NGVCardPhoto; @interface MAPIStoreContactsAttachment : MAPIStoreAttachment { NGVCardPhoto *photo; NSData *photoData; } - (void) setPhoto: (NGVCardPhoto *) newPhoto; @end #endif /* MAPISTORECONTACTSATTACHMENT_H */ SOGo-2.1.1b/OpenChange/MAPIApplication.m0000644000000000000000000000411012247657026016270 0ustar rootroot/* MAPIApplication.m - this file is part of SOGo * * Copyright (C) 2010 Inverse inc. * * 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 3, 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 #import #import #import #import "MAPIStoreUserContext.h" #import "MAPIStoreTypes.h" #import "MAPIApplication.h" MAPIApplication *MAPIApp = nil; @implementation MAPIApplication + (BOOL) isCachingEnabled; { return NO; } - (NSString *) name { return @"SOGo"; } - (id) init { if (!MAPIApp) { WEResourceManager *rm; // TODO publish [iCalEntityObject initializeSOGoExtensions]; MAPIApp = [super init]; [MAPIApp retain]; rm = [[WEResourceManager alloc] init]; [self setResourceManager:rm]; [rm release]; utcTZ = [NSTimeZone timeZoneWithName: @"UTC"]; [utcTZ retain]; } return MAPIApp; } - (BOOL) shouldSetupSignalHandlers { return NO; } - (void) setUserContext: (MAPIStoreUserContext *) newContext { /* user contexts must not be retained here ad their holder (mapistore) contexts must be active when any operation occurs. */ userContext = newContext; } - (id) authenticatorInContext: (id) context { return [userContext authenticator]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreTasksMessage.m0000644000000000000000000003303512247657026017444 0ustar rootroot/* MAPIStoreTasksMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * Author: Wolfgang Sourdeau * Ludovic Marcotte * * 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 3, 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "MAPIStoreContext.h" #import "MAPIStoreTasksFolder.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSDate+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreTasksMessage.h" #undef DEBUG #include #include #include #include #include @implementation SOGoTaskObject (MAPIStoreExtension) - (Class) mapistoreMessageClass { return [MAPIStoreTasksMessage class]; } @end @implementation MAPIStoreTasksMessage - (int) getPidTagIconIndex: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ // Unassigned recurring task 0x00000501 // Assignee's task 0x00000502 // Assigner's task 0x00000503 // Task request 0x00000504 // Task acceptance 0x00000505 // Task rejection 0x00000506 *data = MAPILongValue (memCtx, 0x00000500); return MAPISTORE_SUCCESS; } - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup(memCtx, "IPM.Task"); return MAPISTORE_SUCCESS; } - (int) getPidTagNormalizedSubject: (void **) data // SUMMARY inMemCtx: (TALLOC_CTX *) memCtx { iCalToDo *task; task = [sogoObject component: NO secure: YES]; *data = [[task summary] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } /* FIXME: Should be combined somehow with the code in MAPIStoreAppointmentWrapper.m */ - (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSString *stringValue; iCalToDo *task; /* FIXME: there is a confusion in NGCards around "comment" and "description" */ task = [sogoObject component: NO secure: YES]; stringValue = [task comment]; if ([stringValue length] > 0) *data = [stringValue asUnicodeInMemCtx: memCtx]; else *data = [@"" asUnicodeInMemCtx: memCtx]; return rc; } /* FIXME: Should be combined somehow with the code in MAPIStoreAppointmentWrapper.m */ - (int) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions inMemCtx: (TALLOC_CTX *) memCtx { iCalToDo *task; task = [sogoObject component: NO secure: YES]; if ([task symbolicAccessClass] == iCalAccessPublic) return [self getNo: data inMemCtx: memCtx]; return [self getYes: data inMemCtx: memCtx]; } - (int) getPidTagImportance: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; iCalToDo *task; task = [sogoObject component: NO secure: YES]; if ([[task priority] isEqualToString: @"9"]) v = 0x0; else if ([[task priority] isEqualToString: @"1"]) v = 0x2; else v = 0x1; *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; } - (int) getPidLidTaskComplete: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { iCalToDo *task; task = [sogoObject component: NO secure: YES]; *data = MAPIBoolValue (memCtx, [[task status] isEqualToString: @"COMPLETED"]); return MAPISTORE_SUCCESS; } - (int) getPidLidPercentComplete: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { double doubleValue; iCalToDo *task; task = [sogoObject component: NO secure: YES]; doubleValue = ((double) [[task percentComplete] intValue] / 100); *data = MAPIDoubleValue (memCtx, doubleValue); return MAPISTORE_SUCCESS; } - (int) getPidLidTaskDateCompleted: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSCalendarDate *dateValue; iCalToDo *task; task = [sogoObject component: NO secure: YES]; dateValue = [task completed]; if (dateValue) *data = [dateValue asFileTimeInMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidTaskState: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x1); // not assigned return MAPISTORE_SUCCESS; } - (int) getPidLidTaskMode: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidLidTaskFRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidTaskAccepted: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidTaskActualEffort: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidLidTaskEstimatedEffort: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidTagHasAttachments: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidTaskDueDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSCalendarDate *dateValue; iCalToDo *task; task = [sogoObject component: NO secure: YES]; dateValue = [task due]; if (dateValue) *data = [dateValue asFileTimeInMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidTaskStartDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSCalendarDate *dateValue; iCalToDo *task; task = [sogoObject component: NO secure: YES]; dateValue = [task startDate]; if (dateValue) *data = [dateValue asFileTimeInMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidTagMessageDeliveryTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagLastModificationTime: data inMemCtx: memCtx]; } - (int) getClientSubmitTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagLastModificationTime: data inMemCtx: memCtx]; } - (int) getLocalCommitTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagLastModificationTime: data inMemCtx: memCtx]; } - (int) getPidLidTaskStatus: (void **) data // status inMemCtx: (TALLOC_CTX *) memCtx { NSString *status; uint32_t longValue; iCalToDo *task; task = [sogoObject component: NO secure: YES]; status = [task status]; if (![status length] || [status isEqualToString: @"NEEDS-ACTION"]) longValue = 0; else if ([status isEqualToString: @"IN-PROCESS"]) longValue = 1; else if ([status isEqualToString: @"COMPLETED"]) longValue = 2; else longValue = 0xff; *data = MAPILongValue (memCtx, longValue); return MAPISTORE_SUCCESS; } - (int) getPidLidTaskOwner: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *owner; owner = [sogoObject ownerInContext: nil]; *data = [owner asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidTaskOwnership: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (BOOL) subscriberCanReadMessage { return ([[self activeUserRoles] containsObject: SOGoCalendarRole_ComponentViewer] || [self subscriberCanModifyMessage]); } - (BOOL) subscriberCanModifyMessage { BOOL rc; NSArray *roles = [self activeUserRoles]; if (isNew) rc = [roles containsObject: SOGoRole_ObjectCreator]; else rc = ([roles containsObject: SOGoCalendarRole_ComponentModifier] || [roles containsObject: SOGoCalendarRole_ComponentResponder]); return rc; } - (void) save:(TALLOC_CTX *) memCtx { iCalCalendar *vCalendar; iCalToDo *vToDo; id value; iCalDateTime *date; iCalTimeZone *tz; NSString *status, *priority, *tzName; NSCalendarDate *now; NSInteger tzOffset; double doubleValue; vToDo = [sogoObject component: YES secure: NO]; vCalendar = [vToDo parent]; [vCalendar setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"]; tzName = [[[self userContext] timeZone] name]; tz = [iCalTimeZone timeZoneForName: tzName]; [vCalendar addTimeZone: tz]; // summary value = [properties objectForKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)]; if (value) [vToDo setSummary: value]; // comment value = [properties objectForKey: MAPIPropertyKey (PR_BODY_UNICODE)]; if (!value) { value = [properties objectForKey: MAPIPropertyKey (PR_HTML)]; if (value) { value = [[NSString alloc] initWithData: value encoding: NSUTF8StringEncoding]; [value autorelease]; value = [value htmlToText]; } } if (value) { if ([value length] == 0 || [value isEqualToString: @"\\n"]) value = nil; [vToDo setComment: value]; } // location value = [properties objectForKey: MAPIPropertyKey (PidLidLocation)]; if (value) [vToDo setLocation: value]; // created value = [properties objectForKey: MAPIPropertyKey (PR_CREATION_TIME)]; if (value) [vToDo setCreated: value]; // last-modified + dtstamp value = [properties objectForKey: MAPIPropertyKey (PR_LAST_MODIFICATION_TIME)]; if (value) { [vToDo setLastModified: value]; [vToDo setTimeStampAsDate: value]; } // start value = [properties objectForKey: MAPIPropertyKey (PidLidTaskStartDate)]; if (value) { date = (iCalDateTime *) [vToDo uniqueChildWithTag: @"dtstart"]; [date setTimeZone: tz]; [date setDateTime: value]; } // due value = [properties objectForKey: MAPIPropertyKey (PidLidTaskDueDate)]; if (value) { date = (iCalDateTime *) [vToDo uniqueChildWithTag: @"due"]; [date setTimeZone: tz]; [date setDateTime: value]; } // completed value = [properties objectForKey: MAPIPropertyKey (PidLidTaskDateCompleted)]; if (value) { date = (iCalDateTime *) [vToDo uniqueChildWithTag: @"completed"]; tzOffset = [[value timeZone] secondsFromGMTForDate: value]; value = [value dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: -tzOffset]; [date setDate: value]; } // status value = [properties objectForKey: MAPIPropertyKey (PidLidTaskStatus)]; if (value) { switch ([value intValue]) { case 1: status = @"IN-PROCESS"; break; case 2: status = @"COMPLETED"; break; default: status = @"NEEDS-ACTION"; } [vToDo setStatus: status]; } // priority value = [properties objectForKey: MAPIPropertyKey (PR_IMPORTANCE)]; if (value) { switch ([value intValue]) { case 0: // IMPORTANCE_LOW priority = @"9"; break; case 2: // IMPORTANCE_HIGH priority = @"1"; break; default: // IMPORTANCE_NORMAL priority = @"5"; } [vToDo setPriority: priority]; } // percent complete // NOTE: this does not seem to work on Outlook 2003. PidLidPercentComplete's value // is always set to 0, no matter what value is set in Outlook value = [properties objectForKey: MAPIPropertyKey (PidLidPercentComplete)]; if (value) { doubleValue = [value doubleValue]; [vToDo setPercentComplete: [NSString stringWithFormat: @"%d", (int) (doubleValue * 100)]]; } /* privacy */ /* FIXME: this should be combined with the code found in iCalEvent+MAPIStore.m */ value = [properties objectForKey: MAPIPropertyKey(PidLidPrivate)]; if (value) { if ([value boolValue]) [vToDo setAccessClass: @"PRIVATE"]; else [vToDo setAccessClass: @"PUBLIC"]; } now = [NSCalendarDate date]; if ([sogoObject isNew]) { [vToDo setCreated: now]; } [vToDo setTimeStampAsDate: now]; [sogoObject saveContentString: [vCalendar versitString]]; [self updateVersions]; } @end SOGo-2.1.1b/OpenChange/NSObject+MAPIStore.h0000644000000000000000000000453612247657026016573 0ustar rootroot/* NSObject+MAPIStore.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 NSOBJECT_MAPISTORE_H #define NSOBJECT_MAPISTORE_H #import #include #include struct MAPIStoreTallocWrapper { id instance; }; @interface NSObject (MAPIStoreTallocHelpers) - (struct MAPIStoreTallocWrapper *) tallocWrapper: (TALLOC_CTX *) tallocCtx; @end @interface NSObject (MAPIStoreDataTypes) - (int) getValue: (void **) data forTag: (enum MAPITAGS) propTag inMemCtx: (TALLOC_CTX *) memCtx; /* getter helpers */ - (int) getEmptyString: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getLongZero: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getYes: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getNo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getSMTPAddrType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; @end @interface NSObject (MAPIStoreExtension) - (Class) mapistoreMessageClass; @end @interface NSObject (MAPIStoreProperties) + (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP inMemCtx: (TALLOC_CTX *) memCtx; + (void) fillAvailableProperties: (struct SPropTagArray *) properties withExclusions: (BOOL *) exclusions; - (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP inMemCtx: (TALLOC_CTX *) memCtx; - (BOOL) canGetProperty: (enum MAPITAGS) propTag; @end #endif /* NSOBJECT_MAPISTORE_H */ SOGo-2.1.1b/OpenChange/EOQualifier+MAPI.h0000644000000000000000000000216612247657026016251 0ustar rootroot/* EOQualifier+MAPI.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 EOQUALIFIER_MAPI_H #define EOQUALIFIER_MAPI_H #import @class SOGoMAPIDBObject; @interface EOQualifier (MAPIStoreRestrictions) - (BOOL) evaluateSOGoMAPIDBObject: (SOGoMAPIDBObject *) object; @end #endif /* EOQUALIFIER_MAPI_H */ SOGo-2.1.1b/OpenChange/MAPIStoreRecurrenceUtils.h0000644000000000000000000000343612247657026020165 0ustar rootroot/* MAPIStoreRecurrenceUtils.h - this file is part of $PROJECT_NAME_HERE$ * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORERECURRENCEUTILS_H #define MAPISTORERECURRENCEUTILS_H #include #import #import @class NSTimeZone; @class iCalEvent; @class iCalRepeatableEntityObject; @class iCalRecurrenceRule; #define SOGoMinutesPerHour 60 #define SOGoHoursPerDay 24 #define SOGoMinutesPerDay (SOGoMinutesPerHour * SOGoHoursPerDay) @interface iCalCalendar (MAPIStoreRecurrence) - (void) setupRecurrenceWithMasterEntity: (iCalRepeatableEntityObject *) entity fromRecurrencePattern: (struct RecurrencePattern *) rp; @end @interface iCalRecurrenceRule (MAPIStoreRecurrence) - (void) fillRecurrencePattern: (struct RecurrencePattern *) rp withEvent: (iCalEvent *) event inTimeZone: (NSTimeZone *) timeZone inMemCtx: (TALLOC_CTX *) memCtx; @end #endif /* MAPISTORERECURRENCEUTILS_H */ SOGo-2.1.1b/OpenChange/MAPIStoreGCSBaseContext.h0000644000000000000000000000226312247657026017620 0ustar rootroot/* MAPIStoreGCSBaseContext.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTOREGCSBASECONTEXT_H #define MAPISTOREGCSBASECONTEXT_H #import "MAPIStoreContext.h" @class EOQualifier; @interface MAPIStoreGCSBaseContext : MAPIStoreContext + (NSString *) folderNameSuffix; + (NSString *) getFolderDisplayName: (NSString *) sogoDisplayName; @end #endif /* MAPISTOREGCSBASECONTEXT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreContext.h0000644000000000000000000001015512247657026016467 0ustar rootroot/* MAPIStoreContext.h - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 MAPISTORECONTEXT_H #define MAPISTORECONTEXT_H #include #import @class NSArray; @class NSFileHandle; @class NSMutableArray; @class NSMutableDictionary; @class NSString; @class NSURL; @class EOQualifier; @class WOContext; @class SOGoFolder; @class SOGoMAPIFSFolder; @class SOGoObject; @class SOGoUser; @class MAPIStoreAuthenticator; @class MAPIStoreAttachment; @class MAPIStoreAttachmentTable; @class MAPIStoreFolder; @class MAPIStoreMessage; @class MAPIStoreTable; @class MAPIStoreUserContext; @interface MAPIStoreContext : NSObject { struct mapistore_connection_info *connInfo; NSMutableArray *containersBag; SOGoUser *activeUser; /* the user accessing the resource */ MAPIStoreUserContext *userContext; /* the owner or the resource */ NSURL *contextUrl; } + (struct mapistore_contexts_list *) listAllContextsForUser: (NSString *) userName withTDBIndexing: (struct tdb_wrap *) indexingTdb inMemCtx: (TALLOC_CTX *) memCtx; + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName withTDBIndexing: (struct tdb_wrap *) indexingTdb inMemCtx: (TALLOC_CTX *) memCtx; + (enum mapistore_error) createRootFolder: (NSString **) mapistoreUriP withFID: (uint64_t ) fid andName: (NSString *) folderName forUser: (NSString *) username withRole: (enum mapistore_context_role) role; + (int) openContext: (MAPIStoreContext **) contextPtr withURI: (const char *) newUri connectionInfo: (struct mapistore_connection_info *) newConnInfo andTDBIndexing: (struct tdb_wrap *) indexingTdb; - (id) initFromURL: (NSURL *) newUri withConnectionInfo: (struct mapistore_connection_info *) newConnInfo andTDBIndexing: (struct tdb_wrap *) indexingTdb; - (NSURL *) url; - (struct mapistore_connection_info *) connectionInfo; - (MAPIStoreUserContext *) userContext; - (SOGoUser *) activeUser; // - (id) lookupObject: (NSString *) objectURLString; /* backend methods */ - (int) getPath: (char **) path ofFMID: (uint64_t) fmid inMemCtx: (TALLOC_CTX *) memCtx; - (int) getRootFolder: (MAPIStoreFolder **) folderPtr withFID: (uint64_t) fmid; /* util methods */ - (NSString *) extractChildNameFromURL: (NSString *) childURL andFolderURLAt: (NSString **) folderURL; - (uint64_t) idForObjectWithKey: (NSString *) key inFolderURL: (NSString *) folderURL; - (NSArray *) getNewFMIDs: (uint64_t) max; - (uint64_t) getNewChangeNumber; - (NSArray *) getNewChangeNumbers: (uint64_t) max; /* subclass methods */ + (NSString *) MAPIModuleName; + (enum mapistore_context_role) MAPIContextRole; + (NSString *) createRootSecondaryFolderWithFID: (uint64_t) fid andName: (NSString *) folderName forUser: (NSString *) userName; - (Class) MAPIStoreFolderClass; /* the top-most parent of the context folder: SOGoMailAccount, SOGoCalendarFolders, ... */ - (id) rootSOGoFolder; @end #endif /* MAPISTORECONTEXT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreCalendarEmbeddedMessage.h0000644000000000000000000000222512247657026021472 0ustar rootroot/* MAPIStoreCalendarEmbeddedMessage.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 MAPISTORECALENDAREMBEDDEDMESSAGE_H #define MAPISTORECALENDAREMBEDDEDMESSAGE_H #import "MAPIStoreEmbeddedMessage.h" @class MAPIStoreAppointmentWrapper; @interface MAPIStoreCalendarEmbeddedMessage : MAPIStoreEmbeddedMessage @end #endif /* MAPISTORECALENDAREMBEDDEDMESSAGE_H */ SOGo-2.1.1b/OpenChange/MAPIStoreSamDBUtils.h0000644000000000000000000000257212247657026017016 0ustar rootroot/* MAPIStoreSamDBUtils.h - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 MAPISTORESAMDBUTILS_H #define MAPISTORESAMDBUTILS_H @class NSString; struct ldb_context; NSString *MAPIStoreSamDBUserAttribute (struct ldb_context *samCtx, NSString *userKey, NSString *value, NSString *attributeName); NSData *MAPIStoreInternalEntryId (struct ldb_context *, NSString *username); NSData *MAPIStoreExternalEntryId (NSString *cn, NSString *email); #endif /* MAPISTORESAMDBUTILS_H */ SOGo-2.1.1b/OpenChange/MAPIStoreAppointmentWrapper.m0000644000000000000000000016732212247657026020720 0ustar rootroot/* MAPIStoreAppointmentWrapper.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "iCalTimeZone+MAPIStore.h" #import "MAPIStoreRecurrenceUtils.h" #import "MAPIStoreSamDBUtils.h" #import "MAPIStoreTypes.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreAppointmentWrapper.h" #undef DEBUG #include #include #include #include #include #include #include #include #include static NSCharacterSet *hexCharacterSet = nil; @implementation MAPIStoreAppointmentWrapper + (void) initialize { if (!hexCharacterSet) { hexCharacterSet = [NSCharacterSet characterSetWithCharactersInString: @"1234567890abcdefABCDEF"]; [hexCharacterSet retain]; } } + (id) wrapperWithICalEvent: (iCalEvent *) newEvent andUser: (SOGoUser *) newUser andSenderEmail: (NSString *) newSenderEmail inTimeZone: (NSTimeZone *) newTimeZone withConnectionInfo: (struct mapistore_connection_info *) newConnInfo { MAPIStoreAppointmentWrapper *wrapper; wrapper = [[self alloc] initWithICalEvent: newEvent andUser: newUser andSenderEmail: newSenderEmail inTimeZone: newTimeZone withConnectionInfo: newConnInfo]; [wrapper autorelease]; return wrapper; } - (id) init { if ((self = [super init])) { connInfo = NULL; calendar = nil; event = nil; timeZone = nil; senderEmail = nil; globalObjectId = nil; cleanGlobalObjectId = nil; user = nil; alarmSet = NO; itipSetup = NO; alarm = nil; method = nil; } return self; } - (void) _setupITIPContextFromAttendees { iCalPerson *attendee = nil; NSArray *attendees; attendee = [event userAsAttendee: user]; if (attendee) method = @"REQUEST"; else if ([event userIsOrganizer: user]) { if (senderEmail) attendee = [event findAttendeeWithEmail: senderEmail]; if (!attendee) { attendees = [event attendees]; if ([attendees count] == 1) attendee = [attendees objectAtIndex: 0]; } if (attendee) { method = @"REPLY"; partstat = [attendee participationStatus]; } else { [self logWithFormat: @"no attendee matching sender found"]; method = nil; } } else method = nil; [method retain]; } - (void) _setupITIPContext { NSArray *attendees; NSUInteger max; /* Here we attempt to determine the type of message from the ITIP method contained in the event. It it fails, we attempt to determine this by checking the identity of the organizer and of the attendees. */ itipSetup = YES; method = [[event parent] method]; if ([method length] > 0) { method = [method uppercaseString]; [method retain]; if ([method isEqualToString: @"REPLY"]) { attendees = [event attendees]; max = [attendees count]; if (max == 1) partstat = [[attendees objectAtIndex: 0] participationStatus]; else if (max > 1) [self _setupITIPContextFromAttendees]; } } else [self _setupITIPContextFromAttendees]; } - (id) initWithICalEvent: (iCalEvent *) newEvent andUser: (SOGoUser *) newUser andSenderEmail: (NSString *) newSenderEmail inTimeZone: (NSTimeZone *) newTimeZone withConnectionInfo: (struct mapistore_connection_info *) newConnInfo { NSArray *events; if ((self = [self init])) { connInfo = newConnInfo; ASSIGN (calendar, [newEvent parent]); event = newEvent; events = [calendar events]; firstEvent = [events objectAtIndex: 0]; ASSIGN (timeZone, newTimeZone); ASSIGN (user, newUser); ASSIGN (senderEmail, newSenderEmail); [self _setupITIPContext]; } return self; } - (void) dealloc { [calendar release]; [timeZone release]; [user release]; [senderEmail release]; [globalObjectId release]; [cleanGlobalObjectId release]; [alarm release]; [method release]; [super dealloc]; } - (void) fillMessageData: (struct mapistore_message *) msgData inMemCtx: (TALLOC_CTX *) memCtx { NSString *username, *cn, *email; NSData *entryId; NSArray *attendees; iCalPerson *person; iCalPersonPartStat partStat; uint32_t partStatValue; SOGoUserManager *mgr; NSDictionary *contactInfos; struct mapistore_message_recipient *recipient; int count, max, p; msgData->columns = set_SPropTagArray (msgData, 9, PR_OBJECT_TYPE, PR_DISPLAY_TYPE, PR_7BIT_DISPLAY_NAME_UNICODE, PR_SMTP_ADDRESS_UNICODE, PR_SEND_INTERNET_ENCODING, PR_RECIPIENT_DISPLAY_NAME_UNICODE, PR_RECIPIENT_FLAGS, PR_RECIPIENT_ENTRYID, PR_RECIPIENT_TRACKSTATUS); // , // PR_RECORD_KEY); attendees = [event attendees]; max = [attendees count]; if (max > 0) { mgr = [SOGoUserManager sharedUserManager]; msgData->recipients_count = max + 1; msgData->recipients = talloc_array (msgData, struct mapistore_message_recipient, max + 1); for (count = 0; count < max; count++) { recipient = msgData->recipients + count; person = [attendees objectAtIndex: count]; cn = [person cn]; email = [person rfc822Email]; if ([cn length] == 0) cn = email; contactInfos = [mgr contactInfosForUserWithUIDorEmail: email]; if (contactInfos) { username = [contactInfos objectForKey: @"c_uid"]; recipient->username = [username asUnicodeInMemCtx: msgData]; entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username); } else { recipient->username = NULL; entryId = MAPIStoreExternalEntryId (cn, email); } recipient->type = MAPI_TO; /* properties */ p = 0; recipient->data = talloc_array (msgData, void *, msgData->columns->cValues); memset (recipient->data, 0, msgData->columns->cValues * sizeof (void *)); // PR_OBJECT_TYPE = MAPI_MAILUSER (see MAPI_OBJTYPE) recipient->data[p] = MAPILongValue (msgData, MAPI_MAILUSER); p++; // PR_DISPLAY_TYPE = DT_MAILUSER (see MS-NSPI) recipient->data[p] = MAPILongValue (msgData, 0); p++; // PR_7BIT_DISPLAY_NAME_UNICODE recipient->data[p] = [cn asUnicodeInMemCtx: msgData]; p++; // PR_SMTP_ADDRESS_UNICODE recipient->data[p] = [email asUnicodeInMemCtx: msgData]; p++; // PR_SEND_INTERNET_ENCODING = 0x00060000 (plain text, see OXCMAIL) recipient->data[p] = MAPILongValue (msgData, 0x00060000); p++; // PR_RECIPIENT_DISPLAY_NAME_UNICODE recipient->data[p] = [cn asUnicodeInMemCtx: msgData]; p++; // PR_RECIPIENT_FLAGS recipient->data[p] = MAPILongValue (msgData, 1); p++; // PR_RECIPIENT_ENTRYID recipient->data[p] = [entryId asBinaryInMemCtx: msgData]; p++; // PR_RECIPIENT_TRACKSTATUS /* respNone 0x00000000 No response is required for this object. This is the case for Appointment objects and Meeting Response objects. respOrganized 0x00000001 This Meeting object belongs to the organizer. respTentative 0x00000002 This value on the attendee's Meeting object indicates that the attendee has tentatively accepted the Meeting Request object. respAccepted 0x00000003 This value on the attendee's Meeting object indicates that the attendee has accepted the Meeting Request object. respDeclined 0x00000004 This value on the attendee's Meeting object indicates that the attendee has declined the Meeting Request object. respNotResponded 0x00000005 This value on the attendee's Meeting object indicates that the attendee has not yet responded. This value is on the Meet */ partStat = [person participationStatus]; switch (partStat) { case iCalPersonPartStatAccepted: partStatValue = 3; break; case iCalPersonPartStatDeclined: partStatValue = 4; break; case iCalPersonPartStatTentative: partStatValue = 2; break; default: partStatValue = 5; } recipient->data[p] = MAPILongValue (msgData, partStatValue); p++; // // PR_RECORD_KEY // recipient->data[p] = [entryId asBinaryInMemCtx: msgData]; // p++; } /* On with the organizer: */ { recipient = msgData->recipients + max; person = [event organizer]; cn = [person cn]; email = [person rfc822Email]; contactInfos = [mgr contactInfosForUserWithUIDorEmail: email]; if (contactInfos) { username = [contactInfos objectForKey: @"c_uid"]; recipient->username = [username asUnicodeInMemCtx: msgData]; entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username); } else { recipient->username = NULL; entryId = MAPIStoreExternalEntryId (cn, email); } recipient->type = MAPI_TO; p = 0; recipient->data = talloc_array (msgData, void *, msgData->columns->cValues); memset (recipient->data, 0, msgData->columns->cValues * sizeof (void *)); // PR_OBJECT_TYPE = MAPI_MAILUSER (see MAPI_OBJTYPE) recipient->data[p] = MAPILongValue (msgData, MAPI_MAILUSER); p++; // PR_DISPLAY_TYPE = DT_MAILUSER (see MS-NSPI) recipient->data[p] = MAPILongValue (msgData, 0); p++; // PR_7BIT_DISPLAY_NAME_UNICODE recipient->data[p] = [cn asUnicodeInMemCtx: msgData]; p++; // PR_SMTP_ADDRESS_UNICODE recipient->data[p] = [email asUnicodeInMemCtx: msgData]; p++; // PR_SEND_INTERNET_ENCODING = 0x00060000 (plain text, see OXCMAIL) recipient->data[p] = MAPILongValue (msgData, 0x00060000); p++; // PR_RECIPIENT_DISPLAY_NAME_UNICODE recipient->data[p] = [cn asUnicodeInMemCtx: msgData]; p++; // PR_RECIPIENT_FLAGS recipient->data[p] = MAPILongValue (msgData, 3); p++; // PR_RECIPIENT_ENTRYID = NULL recipient->data[p] = [entryId asBinaryInMemCtx: msgData]; p++; // PR_RECIPIENT_TRACKSTATUS /* respNone 0x00000000 No response is required for this object. This is the case for Appointment objects and Meeting Response objects. respOrganized 0x00000001 This Meeting object belongs to the organizer. respTentative 0x00000002 This value on the attendee's Meeting object indicates that the attendee has tentatively accepted the Meeting Request object. respAccepted 0x00000003 This value on the attendee's Meeting object indicates that the attendee has accepted the Meeting Request object. respDeclined 0x00000004 This value on the attendee's Meeting object indicates that the attendee has declined the Meeting Request object. respNotResponded 0x00000005 This value on the attendee's Meeting object indicates that the attendee has not yet responded. This value is on the Meet */ recipient->data[p] = MAPILongValue (msgData, 1); p++; // // PR_RECORD_KEY // recipient->data[p] = [entryId asBinaryInMemCtx: msgData]; // p++; } } } - (int) getPidTagIconIndex: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx: Single instance appointment: 0x00000400 Recurring appointment: 0x00000401 Single instance meeting: 0x00000402 Recurring meeting: 0x00000403 Meeting request: 0x00000404 Accept: 0x00000405 Decline: 0x00000406 Tentativly: 0x00000407 Cancellation: 0x00000408 Informational update: 0x00000409 */ // if ([headerMethod isEqualToString: @"REQUEST"]) // longValue = 0x0404; // else // longValue = 0x0400; if (!itipSetup) [self _setupITIPContext]; longValue = 0x0400; if (method) { if ([method isEqualToString: @"REQUEST"]) longValue |= 0x0004; else if ([method isEqualToString: @"REPLY"]) { longValue |= 0x0004; switch (partstat) { case iCalPersonPartStatAccepted: longValue |= 0x0001; break; case iCalPersonPartStatDeclined: longValue |= 0x0002; break; case iCalPersonPartStatTentative: longValue |= 0x0003; break; default: longValue = 0x0400; [self logWithFormat: @"unhandled part stat"]; } } else if ([method isEqualToString: @"CANCEL"]) longValue |= 0x0008; } else { if ([event isRecurrent]) longValue |= 0x0001; if ([[event attendees] count] > 0) longValue |= 0x0002; } *data = MAPILongValue (memCtx, longValue); return MAPISTORE_SUCCESS; } - (int) getPidTagOwnerAppointmentId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; const char *utf8UID; union { uint32_t longValue; char charValue[4]; } value; NSUInteger max, length; if ([[event attendees] count] > 0) { utf8UID = [[event uid] UTF8String]; length = strlen (utf8UID); max = 2; if (length < max) max = length; memcpy (value.charValue, utf8UID, max); memcpy (value.charValue + 2, utf8UID + length - 2, max); *data = MAPILongValue (memCtx, value.longValue); rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidMeetingType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { /* TODO See 2.2.6.5 PidLidMeetingType (OXOCAL) */ *data = MAPILongValue (memCtx, 0x00000001); return MAPISTORE_SUCCESS; } - (int) getPidLidOwnerCriticalChange: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_ERR_NOT_FOUND; NSCalendarDate *lastModified; if ([[event attendees] count] > 0) { lastModified = [event lastModified]; if (lastModified) { *data = [lastModified asFileTimeInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } } return rc; } - (int) getPidLidAttendeeCriticalChange: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_ERR_NOT_FOUND; NSCalendarDate *lastModified; if ([[event attendees] count] > 0) { lastModified = [event lastModified]; if (lastModified) { *data = [lastModified asFileTimeInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } } return rc; } - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { const char *className; if (!itipSetup) [self _setupITIPContext]; if (method) { if ([method isEqualToString: @"REQUEST"]) className = "IPM.Schedule.Meeting.Request"; else if ([method isEqualToString: @"REPLY"]) { switch (partstat) { case iCalPersonPartStatAccepted: className = "IPM.Schedule.Meeting.Resp.Pos"; break; case iCalPersonPartStatDeclined: className = "IPM.Schedule.Meeting.Resp.Neg"; break; case iCalPersonPartStatTentative: className = "IPM.Schedule.Meeting.Resp.Tent"; break; default: className = "IPM.Appointment"; [self logWithFormat: @"unhandled part stat"]; } } else if ([method isEqualToString: @"COUNTER"]) className = "IPM.Schedule.Meeting.Resp.Tent"; else if ([method isEqualToString: @"CANCEL"]) className = "IPM.Schedule.Meeting.Cancelled"; else { className = "IPM.Appointment"; [self logWithFormat: @"unhandled method: %@", method]; } } else className = "IPM.Appointment"; *data = talloc_strdup(memCtx, className); return MAPISTORE_SUCCESS; } - (int) getPidLidAppointmentMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "IPM.Appointment"); return MAPISTORE_SUCCESS; } - (int) getPidLidFInvited: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (int) getPidLidAppointmentSequence: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[event sequence] unsignedIntValue]); return MAPISTORE_SUCCESS; } - (int) getPidLidAppointmentStateFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t flags = 0x00; if ([[event attendees] count] > 0) { flags |= 0x01; /* asfMeeting */ if ([event userAsAttendee: user]) flags |= 0x02; /* asfReceived */ /* TODO: asfCancelled */ } *data = MAPILongValue (memCtx, flags); return MAPISTORE_SUCCESS; } - (int) getPidLidResponseStatus: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t status = 0x00; iCalPerson *person; if ([[event attendees] count] > 0) { if ([event userIsOrganizer: user]) status = 1; else { person = [event userAsAttendee: user]; if (person) { switch ([person participationStatus]) { case iCalPersonPartStatTentative: status = 2; break; case iCalPersonPartStatAccepted: status = 3; break; case iCalPersonPartStatDeclined: status = 4; break; default: status = 5; } } } } *data = MAPILongValue (memCtx, status); return MAPISTORE_SUCCESS; } - (int) getPidLidAppointmentNotAllowPropose: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (int) getPidLidAppointmentStartWhole: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSInteger offset; // if ([event isRecurrent]) // dateValue = [event firstRecurrenceStartDate]; // else dateValue = [event startDate]; if ([event isAllDay]) { offset = -[timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; } [dateValue setTimeZone: utcTZ]; *data = [dateValue asFileTimeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagStartDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { /* "The PidTagStartDate property ([MS-OXPROPS] section 2.1077) SHOULD be set, and when set, it MUST be equal to the value of the PidLidAppointmentStartWhole property (section 2.2.1.5).". Not true for exceptions, where it is the normal start date for the day of the exception. */ NSCalendarDate *dateValue; NSInteger offset; dateValue = [event recurrenceId]; if (!dateValue) dateValue = [event startDate]; [dateValue setTimeZone: timeZone]; if ([event isAllDay]) { offset = -[timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; } [dateValue setTimeZone: utcTZ]; *data = [dateValue asFileTimeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidCommonStart: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSInteger offset; dateValue = [firstEvent startDate]; if ([firstEvent isAllDay]) { offset = -[timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; } [dateValue setTimeZone: utcTZ]; *data = [dateValue asFileTimeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidClipStart: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSCalendarDate *dateValue; if ([event isRecurrent]) { dateValue = [[event startDate] hour: 0 minute: 0 second: 0]; *data = [dateValue asFileTimeInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } else if ([event recurrenceId] != nil) rc = MAPISTORE_ERR_NOT_FOUND; else rc = [self getPidLidAppointmentStartWhole: data inMemCtx: memCtx]; return rc; } - (int) getPidLidAppointmentEndWhole: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSInteger offset; // if ([event isRecurrent]) // dateValue = [event firstRecurrenceStartDate]; // else dateValue = [event startDate]; offset = [event durationAsTimeInterval]; if ([event isAllDay]) offset -= [timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; *data = [dateValue asFileTimeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagEndDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSInteger offset; dateValue = [event recurrenceId]; if (!dateValue) dateValue = [event startDate]; [dateValue setTimeZone: timeZone]; offset = [firstEvent durationAsTimeInterval]; if ([firstEvent isAllDay]) offset -= [timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; *data = [dateValue asFileTimeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidCommonEnd: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSInteger offset; // if ([event isRecurrent]) // dateValue = [event firstRecurrenceStartDate]; // else dateValue = [firstEvent startDate]; offset = [firstEvent durationAsTimeInterval]; if ([event isAllDay]) offset -= [timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; *data = [dateValue asFileTimeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidClipEnd: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSCalendarDate *dateValue; NSInteger offset; iCalRecurrenceRule *rrule; if ([event isRecurrent]) { rrule = [[event recurrenceRules] objectAtIndex: 0]; dateValue = [rrule untilDate]; if (dateValue) { if ([event isAllDay]) offset = -[timeZone secondsFromGMTForDate: dateValue]; else offset = 0; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; } else dateValue = [NSCalendarDate dateWithYear: 4500 month: 8 day: 31 hour: 23 minute: 59 second: 59 timeZone: utcTZ]; *data = [dateValue asFileTimeInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } else if ([event recurrenceId] != nil) rc = MAPISTORE_ERR_NOT_FOUND; else rc = [self getPidLidAppointmentEndWhole: data inMemCtx: memCtx]; return rc; } - (int) _getEntryIdFromCN: (NSString *) cn andEmail: (NSString *) email inData: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *username; SOGoUserManager *mgr; NSDictionary *contactInfos; NSData *entryId; mgr = [SOGoUserManager sharedUserManager]; contactInfos = [mgr contactInfosForUserWithUIDorEmail: email]; if (contactInfos) { username = [contactInfos objectForKey: @"c_uid"]; entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username); } else entryId = MAPIStoreExternalEntryId (cn, email); *data = [entryId asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) _getEmailAddress: (void **) data forICalPerson: (iCalPerson *) person inMemCtx: (TALLOC_CTX *) memCtx { int rc; NSString *email; email = [person rfc822Email]; if ([email length] > 0) { *data = [email asUnicodeInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) _getAddrType: (void **) data forICalPerson: (iCalPerson *) person inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"SMTP" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) _getName: (void **) data forICalPerson: (iCalPerson *) person inMemCtx: (TALLOC_CTX *) memCtx { int rc; NSString *cn; cn = [person cn]; if ([cn length] > 0) { *data = [cn asUnicodeInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) _getEntryId: (void **) data forICalPerson: (iCalPerson *) person inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_ERR_NOT_FOUND; NSString *email, *cn; if (person) { email = [person rfc822Email]; if ([email length] > 0) { cn = [person cn]; rc = [self _getEntryIdFromCN: cn andEmail: email inData: data inMemCtx: memCtx]; } } return rc; } /* sender (organizer) */ - (int) getPidTagSenderEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddress: data forICalPerson: [event organizer] inMemCtx: memCtx]; } - (int) getPidTagSenderAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getAddrType: data forICalPerson: [event organizer] inMemCtx: memCtx]; } - (int) getPidTagSenderName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getName: data forICalPerson: [event organizer] inMemCtx: memCtx]; } - (int) getPidTagSenderEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryId: data forICalPerson: [event organizer] inMemCtx: memCtx]; } /* sender representing */ - (int) getPidTagSentRepresentingEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; } - (int) getPidTagSentRepresentingAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPidTagSentRepresentingName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderName: data inMemCtx: memCtx]; } - (int) getPidTagSentRepresentingEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderEntryId: data inMemCtx: memCtx]; } /* attendee */ - (int) getPidTagReceivedByEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddress: data forICalPerson: [event userAsAttendee: user] inMemCtx: memCtx]; } - (int) getPidTagReceivedByAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getAddrType: data forICalPerson: [event userAsAttendee: user] inMemCtx: memCtx]; } - (int) getPidTagReceivedByName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getName: data forICalPerson: [event userAsAttendee: user] inMemCtx: memCtx]; } - (int) getPidTagReceivedByEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryId: data forICalPerson: [event userAsAttendee: user] inMemCtx: memCtx]; } /* /attendee */ - (int) getPidLidAppointmentDuration: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSTimeInterval timeValue; timeValue = [[event endDate] timeIntervalSinceDate: [event startDate]]; *data = MAPILongValue (memCtx, (uint32_t) (timeValue / 60)); return MAPISTORE_SUCCESS; } - (int) getPidLidAppointmentSubType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [event isAllDay]); return MAPISTORE_SUCCESS; } - (int) getPidLidBusyStatus: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint8_t value; value = 0x2; // olBusy if (![event isOpaque]) value = 0x0; // olFree *data = MAPILongValue (memCtx, value); return MAPISTORE_SUCCESS; } - (int) getPidLidIndentedBusyStatus: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidBusyStatus: data inMemCtx: memCtx]; } - (int) getPidTagNormalizedSubject: (void **) data // SUMMARY inMemCtx: (TALLOC_CTX *) memCtx { *data = [[event summary] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidLidLocation: (void **) data // LOCATION inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSString *location; location = [event location]; if (location) *data = [location asUnicodeInMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidWhere: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidLocation: data inMemCtx: memCtx]; } - (int) getPidLidServerProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { /* TODO: we need to check whether the event has been processed internally by SOGo or if it was received only by mail. We only assume the SOGo case here. */ return [self getYes: data inMemCtx: memCtx]; } - (int) getPidLidServerProcessingActions: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000010 /* cpsCreatedOnPrincipal */ | 0x00000080 /* cpsUpdatedCalItem */ | 0x00000100 /* cpsCopiedOldProperties */); return MAPISTORE_SUCCESS; } - (int) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions inMemCtx: (TALLOC_CTX *) memCtx { if ([event symbolicAccessClass] == iCalAccessPublic) return [self getNo: data inMemCtx: memCtx]; return [self getYes: data inMemCtx: memCtx]; } - (int) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS inMemCtx: (TALLOC_CTX *) memCtx { // normal = 0, personal?? = 1, private = 2, confidential = 3 return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidTagImportance: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; if ([[event priority] isEqualToString: @"9"]) v = 0x0; else if ([[event priority] isEqualToString: @"1"]) v = 0x2; else v = 0x1; *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; } - (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; NSString *stringValue; /* FIXME: there is a confusion in NGCards around "comment" and "description" */ stringValue = [event comment]; if ([stringValue length] > 0 && ![stringValue isEqualToString: @"\r\n"] && ![stringValue isEqualToString: @"\n"]) { rc = MAPISTORE_SUCCESS; *data = [stringValue asUnicodeInMemCtx: memCtx]; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidTagInternetCodepage: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { /* ref: http://msdn.microsoft.com/en-us/library/dd317756%28v=vs.85%29.aspx minimal list that should be handled: us-ascii: 20127 iso-8859-1: 28591 iso-8859-15: 28605 utf-8: 65001 */ *data = MAPILongValue(memCtx, 65001); return MAPISTORE_SUCCESS; } - (int) getPidLidRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [event isRecurrent]); return MAPISTORE_SUCCESS; } - (int) getPidLidIsRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [event isRecurrent] || ([event recurrenceId] != nil)); return MAPISTORE_SUCCESS; } - (int) getPidLidIsException: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [event recurrenceId] != nil); return MAPISTORE_SUCCESS; } - (int) getPidLidExceptionReplaceTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSCalendarDate *dateValue; NSInteger offset; dateValue = [event recurrenceId]; if (dateValue) { rc = MAPISTORE_SUCCESS; if ([event isAllDay]) { offset = -[timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; } [dateValue setTimeZone: utcTZ]; *data = [dateValue asFileTimeInMemCtx: memCtx]; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidRecurrencePattern: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"No description" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (void) _fillExceptionInfo: (struct ExceptionInfo *) exceptionInfo andExtendedException: (struct ExtendedException *) extendedException withException: (iCalEvent *) exceptionEvent inMemCtx: (TALLOC_CTX *) memCtx { iCalEventChanges *changes; NSArray *changedProperties; NSCalendarDate *dateValue; NSInteger offset; changes = [iCalEventChanges changesFromEvent: event toEvent: exceptionEvent]; memset (exceptionInfo, 0, sizeof (struct ExceptionInfo)); memset (extendedException, 0, sizeof (struct ExtendedException)); extendedException->ChangeHighlight.Size = sizeof (uint32_t); dateValue = [exceptionEvent startDate]; offset = [timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; exceptionInfo->StartDateTime = [dateValue asMinutesSince1601]; extendedException->ChangeHighlight.Value = BIT_CH_START; extendedException->StartDateTime = exceptionInfo->StartDateTime; dateValue = [exceptionEvent endDate]; offset = [timeZone secondsFromGMTForDate: dateValue]; dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; exceptionInfo->EndDateTime = [dateValue asMinutesSince1601]; extendedException->ChangeHighlight.Value |= BIT_CH_END; extendedException->EndDateTime = exceptionInfo->EndDateTime; dateValue = [[exceptionEvent recurrenceId] dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: offset]; exceptionInfo->OriginalStartDate = [dateValue asMinutesSince1601]; extendedException->OriginalStartDate = exceptionInfo->OriginalStartDate; changedProperties = [changes updatedProperties]; if ([changedProperties containsObject: @"summary"]) { extendedException->ChangeHighlight.Value |= BIT_CH_SUBJECT; extendedException->Subject = [[exceptionEvent summary] asUnicodeInMemCtx: memCtx]; exceptionInfo->OverrideFlags |= ARO_SUBJECT; exceptionInfo->Subject.subjectMsg.msg = (uint8_t *) extendedException->Subject; /* FIXME: this will fail with non ascii chars */ exceptionInfo->Subject.subjectMsg.msgLength2 = [[exceptionEvent summary] length]; exceptionInfo->Subject.subjectMsg.msgLength = exceptionInfo->Subject.subjectMsg.msgLength2 + 1; } if ([changedProperties containsObject: @"location"]) { extendedException->ChangeHighlight.Value |= BIT_CH_LOCATION; extendedException->Location = [[exceptionEvent location] asUnicodeInMemCtx: memCtx]; exceptionInfo->OverrideFlags |= ARO_LOCATION; exceptionInfo->Location.locationMsg.msg = (uint8_t *) extendedException->Location; /* FIXME: this will fail with non ascii chars */ exceptionInfo->Location.locationMsg.msgLength2 = [[exceptionEvent location] length]; exceptionInfo->Location.locationMsg.msgLength = exceptionInfo->Location.locationMsg.msgLength2 + 1; } if ([event isAllDay] != [exceptionEvent isAllDay]) { exceptionInfo->OverrideFlags |= ARO_SUBTYPE; exceptionInfo->SubType.sType = [exceptionEvent isAllDay]; } } // - (struct SBinary_short *) _computeAppointmentRecurInMemCtx: (TALLOC_CTX *) memCtx - (struct Binary_r *) _computeAppointmentRecurInMemCtx: (TALLOC_CTX *) memCtx { struct AppointmentRecurrencePattern *arp; struct Binary_r *bin; // struct SBinary_short *sBin; NSCalendarDate *firstStartDate; iCalRecurrenceRule *rule; NSUInteger startMinutes; NSArray *events, *exceptions; iCalEvent *exceptionEvent; NSUInteger count, max; rule = [[event recurrenceRules] objectAtIndex: 0]; firstStartDate = [event firstRecurrenceStartDate]; if (firstStartDate) { [firstStartDate setTimeZone: timeZone]; arp = talloc_zero (NULL, struct AppointmentRecurrencePattern); [rule fillRecurrencePattern: &arp->RecurrencePattern withEvent: event inTimeZone: timeZone inMemCtx: arp]; arp->ReaderVersion2 = 0x00003006; arp->WriterVersion2 = 0x00003008; /* 0x3008 for compatibility with ol2003 */ startMinutes = ([firstStartDate hourOfDay] * 60 + [firstStartDate minuteOfHour]); arp->StartTimeOffset = startMinutes; arp->EndTimeOffset = (startMinutes + (NSUInteger) ([event durationAsTimeInterval] / 60)); events = [[event parent] events]; exceptions = [events subarrayWithRange: NSMakeRange (1, [events count] - 1)]; max = [exceptions count]; arp->ExceptionCount = max; arp->ExceptionInfo = talloc_array (memCtx, struct ExceptionInfo, max); arp->ExtendedException = talloc_array (memCtx, struct ExtendedException, max); for (count = 0; count < max; count++) { exceptionEvent = [exceptions objectAtIndex: count]; [self _fillExceptionInfo: arp->ExceptionInfo + count andExtendedException: arp->ExtendedException + count withException: exceptionEvent inMemCtx: arp]; } arp->ReservedBlock1Size = 0; arp->ReservedBlock2Size = 0; /* Currently ignored in property.idl: arp->ReservedBlock2Size = 0; */ /* convert struct to blob */ // sBin = talloc_zero (memCtx, struct SBinary_short); bin = set_AppointmentRecurrencePattern (memCtx, arp); // sBin->cb = bin->cb; // sBin->lpb = bin->lpb; talloc_free (arp); // DEBUG(5, ("To client:\n")); // NDR_PRINT_DEBUG (AppointmentRecurrencePattern, arp); } else { [self errorWithFormat: @"no first occurrence found in rule: %@", rule]; // bin = NULL; bin = NULL; } return bin; } /* exception 12345 + 123456 (exchange): 81ad0102 (PT_BINARY): named prop guid: {00062002-0000-0000-c000-000000000046} dispid: 0x00008216 (163 bytes) 04 30 04 30 0a 20 00 00 | \x04 0 \x04 0 \x0a \x00 \x00 00 00 00 00 00 00 a0 05 | \x00 \x00 \x00 \x00 \x00 \x00 \xa0 \x05 00 00 00 00 00 00 23 20 | \x00 \x00 \x00 \x00 \x00 \x00 # 00 00 0a 00 00 00 00 00 | \x00 \x00 \x0a \x00 \x00 \x00 \x00 \x00 00 00 01 00 00 00 a0 c6 | \x00 \x00 \x01 \x00 \x00 \x00 \xa0 \xc6 e6 0c 01 00 00 00 a0 c6 | \xe6 \x0c \x01 \x00 \x00 \x00 \xa0 \xc6 e6 0c 00 c1 e6 0c df 80 | \xe6 \x0c \x00 \xc1 \xe6 \x0c \xdf \x80 e9 5a 06 30 00 00 08 30 | \xe9 Z \x06 0 \x00 \x00 \x08 0 00 00 66 03 00 00 84 03 | \x00 \x00 f \x03 \x00 \x00 \x84 \x03 00 00 01 00 e8 c9 e6 0c | \x00 \x00 \x01 \x00 \xe8 \xc9 \xe6 \x0c f6 ca e6 0c 06 ca e6 0c | \xf6 \xca \xe6 \x0c \x06 \xca \xe6 \x0c 11 00 06 00 05 00 31 32 | \x11 \x00 \x06 \x00 \x05 \x00 1 2 33 34 35 07 00 06 00 31 | 3 4 5 \x07 \x00 \x06 \x00 1 32 33 34 35 36 00 00 00 | 2 3 4 5 6 \x00 \x00 \x00 00 00 00 00 00 e8 c9 e6 | \x00 \x00 \x00 \x00 \x00 \xe8 \xc9 \xe6 0c f6 ca e6 0c 06 ca e6 | \x0c \xf6 \xca \xe6 \x0c \x06 \xca \xe6 0c 05 00 31 00 32 00 33 | \x0c \x05 \x00 1 \x00 2 \x00 3 00 34 00 35 00 06 00 31 | \x00 4 \x00 5 \x00 \x06 \x00 1 00 32 00 33 00 34 00 35 | \x00 2 \x00 3 \x00 4 \x00 5 00 36 00 00 00 00 00 00 | \x00 6 \x00 \x00 \x00 \x00 \x00 \x00 00 00 00 | \x00 \x00 \x00 openchange: 918b0102 (PT_BINARY): named prop guid: {00062002-0000-0000-c000-000000000046} dispid: 0x00008216 (167 bytes) recurrence pattern readerversion: 04 30 writerversion: 04 30 recurfrequency: 0a 20 (daily) patterntype: 00 00 calendartype: 00 00 firstdatetime: 00 00 00 00 period: a0 05 00 00 (1440 minutes) slidingflag: 00 00 00 00 patterntypespecific: (0 bytes) endtype: 23 20 00 00 occurrencecount: *00->0a 00 00 00 (meaningless since no enddate) firstdow: 00 00 00 00 deletedicount: 01 00 00 00 deletedinstancedates: (1) a0 c6 e6 0c modifiedicount: 01 00 00 00 modifiedinstancedates: (1) a0 c6 e6 0c startdate: 00 c1 e6 0c enddate: df 80 e9 5a ReaderVersion2: 06 30 00 00 WriterVersion2: 08 30 00 00 StartTimeOffset: 66 03 00 00 EndTimeOffset: 84 03 00 00 ExceptionCount: 01 00 ExceptionInfos: (1) StartDateTime: *e7->e8 *ca->c9 e6 0c EndDateTime: *e6->f6 *cb->ca e6 0c OriginalStartDate: *a0->06 *c6->ca e6 0c OverrideFlags: 11 00 SubjectLength2: 06 00 SubjectLength: 05 00 Subject: 31 32 33 34 35 LocationLength2: 07 00 LocationLength: 06 00 Location: 31 32 33 34 35 36 ReservedBlock1Size: 00 00 00 00 ExtendedException: (1) ReservedBlockEE1Size: 00 00 00 00 StartDateTime: *e7->e8 *ca->c9 e6 0c EndDateTime: *e6->f6 *cb->ca e6 0c OriginalStartDate: *a0->06 *c6->ca e6 0c WideCharSubjectLength *06->05 WideCharSubject: 00 31 00 32 00 33 00 34 00 35 00 [2bytes sup: 00 00] LocationLength: *07->06 Location 00 31 00 32 00 33 00 34 00 35 00 36 00 00 ReservedBlockEE2Size: 00 00 00 00 ReservedBlockEE2Size: 00 00 00 00 */ - (int) getPidLidAppointmentRecur: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; if ([event isRecurrent]) *data = [self _computeAppointmentRecurInMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidRecurrenceType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; iCalRecurrenceFrequency freq; iCalRecurrenceRule *rrule; enum RecurrenceType rectype; if ([event isRecurrent]) { rrule = [[event recurrenceRules] objectAtIndex: 0]; freq = [rrule frequency]; if (freq == iCalRecurrenceFrequenceDaily) rectype = rectypeDaily; else if (freq == iCalRecurrenceFrequenceWeekly) rectype = rectypeWeekly; else if (freq == iCalRecurrenceFrequenceMonthly) rectype = rectypeMonthly; else if (freq == iCalRecurrenceFrequenceYearly) rectype = rectypeYearly; else rectype = rectypeNone; /* or "unsupported" */ *data = MAPILongValue (memCtx, rectype); rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } // - (int) getPidLidGlobalObjectId: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // static char byteArrayId[] = {0x04, 0x00, 0x00, 0x00, 0x82, 0x00, 0xE0, // 0x00, 0x74, 0xC5, 0xB7, 0x10, 0x1A, 0x82, // 0xE0, 0x08}; // static char X[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // NSMutableData *nsData; // NSData *uidData; // NSCalendarDate *creationTime; // struct FILETIME *creationFileTime; // uint32_t uidDataLength; // nsData = [NSMutableData dataWithCapacity: 256]; // [nsData appendBytes: byteArrayId length: 16]; // /* FIXME TODO */ // [nsData appendBytes: X length: 4]; // /* /FIXME */ // creationTime = [event created]; // if (!creationTime) // { // [self logWithFormat: @"" __location__ ": event has no 'CREATED' tag -> inventing one"]; // creationTime = [event lastModified]; // if (!creationTime) // creationTime = [NSCalendarDate date]; // } // creationFileTime = [creationTime asFileTimeInMemCtx: NULL]; // [nsData appendBytes: &creationFileTime->dwLowDateTime length: 4]; // [nsData appendBytes: &creationFileTime->dwHighDateTime length: 4]; // talloc_free (creationFileTime); // uidData = [[event uid] dataUsingEncoding: NSUTF8StringEncoding]; // uidDataLength = [uidData length]; // [nsData appendBytes: &uidDataLength length: 4]; // [nsData appendData: uidData]; // *data = [nsData asBinaryInMemCtx: memCtx]; // return MAPISTORE_SUCCESS; // } - (void) _setInstanceDate: (struct GlobalObjectId *) newGlobalId fromDate: (NSCalendarDate *) instanceDate; { uint16_t year; if (instanceDate) { [instanceDate setTimeZone: timeZone]; year = [instanceDate yearOfCommonEra]; newGlobalId->YH = year >> 8; newGlobalId->YL = year & 0xff; newGlobalId->Month = [instanceDate monthOfYear]; newGlobalId->D = [instanceDate dayOfMonth]; } } /* note: returns a retained object */ - (NSData *) _objectIdAsNSData: (const struct GlobalObjectId *) newGlobalId { NSData *nsData; TALLOC_CTX *localMemCtx; struct ndr_push *ndr; localMemCtx = talloc_zero (NULL, TALLOC_CTX); ndr = ndr_push_init_ctx (localMemCtx); ndr_push_GlobalObjectId (ndr, NDR_SCALARS, newGlobalId); nsData = [[NSData alloc] initWithBytes: ndr->data length: ndr->offset]; talloc_free (localMemCtx); return nsData; } - (void) _computeGlobalObjectIds { static NSString *prefix = @"040000008200e00074c5b7101a82e008"; static uint8_t dataPrefix[] = { 0x76, 0x43, 0x61, 0x6c, 0x2d, 0x55, 0x69, 0x64, 0x01, 0x00, 0x00, 0x00 }; NSString *uid; const char *uidAsUTF8; NSUInteger uidLength; NSData *encodedGlobalIdData; struct Binary_r *encodedGlobalIdBinary; struct GlobalObjectId *encodedGlobalId; struct GlobalObjectId newGlobalId; uint16_t year; NSData *binPrefix; TALLOC_CTX *localMemCtx; localMemCtx = talloc_zero (NULL, TALLOC_CTX); memset (&newGlobalId, 0, sizeof (struct GlobalObjectId)); uid = [event uid]; uidLength = [uid length]; if (uidLength >= 82 && (uidLength % 2) == 0 && [uid hasPrefix: prefix] && [[uid stringByTrimmingCharactersInSet: hexCharacterSet] length] == 0) { encodedGlobalIdData = [uid convertHexStringToBytes]; if (encodedGlobalIdData) { encodedGlobalIdBinary = [encodedGlobalIdData asBinaryInMemCtx: localMemCtx]; encodedGlobalId = get_GlobalObjectId (localMemCtx, encodedGlobalIdBinary); if (encodedGlobalId) { memcpy (newGlobalId.ByteArrayID, encodedGlobalId->ByteArrayID, 16); year = ((uint16_t) encodedGlobalId->YH << 8) | encodedGlobalId->YL; if (year >= 1601 && year <= 4500 && encodedGlobalId->Month > 0 && encodedGlobalId->Month < 13 && encodedGlobalId->D > 0 && encodedGlobalId->D < 31) { newGlobalId.YH = encodedGlobalId->YH; newGlobalId.YL = encodedGlobalId->YL; newGlobalId.Month = encodedGlobalId->Month; newGlobalId.D = encodedGlobalId->D; } else [self _setInstanceDate: &newGlobalId fromDate: [event recurrenceId]]; newGlobalId.CreationTime = encodedGlobalId->CreationTime; memcpy (newGlobalId.X, encodedGlobalId->X, 8); newGlobalId.Size = encodedGlobalId->Size; newGlobalId.Data = encodedGlobalId->Data; } else abort (); } else abort (); } else { binPrefix = [prefix convertHexStringToBytes]; [binPrefix getBytes: &newGlobalId.ByteArrayID]; [self _setInstanceDate: &newGlobalId fromDate: [event recurrenceId]]; uidAsUTF8 = [uid UTF8String]; newGlobalId.Size = 0x0c + strlen (uidAsUTF8); newGlobalId.Data = talloc_array (localMemCtx, uint8_t, newGlobalId.Size); memcpy (newGlobalId.Data, dataPrefix, 0x0c); memcpy (newGlobalId.Data + 0x0c, uidAsUTF8, newGlobalId.Size - 0x0c); } globalObjectId = [self _objectIdAsNSData: &newGlobalId]; newGlobalId.YH = 0; newGlobalId.YL = 0; newGlobalId.Month = 0; newGlobalId.D = 0; cleanGlobalObjectId = [self _objectIdAsNSData: &newGlobalId]; talloc_free (localMemCtx); } - (int) getPidLidGlobalObjectId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; if (!globalObjectId) [self _computeGlobalObjectIds]; if (globalObjectId) *data = [globalObjectId asBinaryInMemCtx: memCtx]; else abort (); return rc; } - (int) getPidLidCleanGlobalObjectId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; if (!cleanGlobalObjectId) [self _computeGlobalObjectIds]; if (cleanGlobalObjectId) *data = [cleanGlobalObjectId asBinaryInMemCtx: memCtx]; else abort (); return rc; } - (int) getPidLidAppointmentReplyTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { /* We always return LAST-MODIFIED, which is a hack, but one that works because: the user is either (NOT recipient OR (is recipient AND its status is N/A), where this value should not be taken into account by the client OR the user is recipient and its status is defined, where this value is thus correct because the recipient status is the only property that can be changed. */ int rc = MAPISTORE_ERR_NOT_FOUND; NSCalendarDate *lastModified; lastModified = [event lastModified]; if (lastModified) { *data = [lastModified asFileTimeInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } return rc; } /* reminders */ - (void) _setupAlarm { NSArray *alarms; NSUInteger count, max; iCalAlarm *currentAlarm; NSString *action; alarms = [event alarms]; max = [alarms count]; for (count = 0; !alarm && count < max; count++) { currentAlarm = [alarms objectAtIndex: count]; action = [[currentAlarm action] lowercaseString]; if (!action || [action isEqualToString: @"display"]) ASSIGN (alarm, currentAlarm); } alarmSet = YES; } - (int) getPidLidReminderSet: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!alarmSet) [self _setupAlarm]; *data = MAPIBoolValue (memCtx, (alarm != nil)); return MAPISTORE_SUCCESS; } - (int) getPidLidReminderTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!alarmSet) [self _setupAlarm]; return (alarm ? [self getPidTagStartDate: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } - (int) getPidLidReminderDelta: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_ERR_NOT_FOUND; iCalTrigger *trigger; NSCalendarDate *startDate, *relationDate, *alarmDate; NSTimeInterval interval; NSString *relation; if (!alarmSet) [self _setupAlarm]; if (alarm) { trigger = [alarm trigger]; if ([[trigger valueType] caseInsensitiveCompare: @"DURATION"] == NSOrderedSame) { startDate = [event startDate]; relation = [[trigger relationType] lowercaseString]; interval = [[trigger flattenedValuesForKey: @""] durationAsTimeInterval]; if ([relation isEqualToString: @"end"]) relationDate = [event endDate]; else relationDate = startDate; // Compute the next alarm date with respect to the reference date if (relationDate) { alarmDate = [relationDate addTimeInterval: interval]; interval = [startDate timeIntervalSinceDate: alarmDate]; *data = MAPILongValue (memCtx, (int) (interval / 60)); rc = MAPISTORE_SUCCESS; } } } return rc; } - (int) getPidLidReminderSignalTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSCalendarDate *alarmDate; if (!alarmSet) [self _setupAlarm]; if (alarm) { alarmDate = [alarm nextAlarmDate]; [alarmDate setTimeZone: utcTZ]; *data = [alarmDate asFileTimeInMemCtx: memCtx]; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidReminderOverride: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; if (!alarmSet) [self _setupAlarm]; if (alarm) *data = MAPIBoolValue (memCtx, YES); else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidReminderPlaySound: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; if (!alarmSet) [self _setupAlarm]; if (alarm) *data = MAPIBoolValue (memCtx, YES); else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidReminderFileParameter: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { // if (!alarmSet) // [self _setupAlarm]; return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidLidReminderType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } - (int) getPidLidTimeZoneDescription: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSString *tzid; tzid = [(iCalDateTime *) [event firstChildWithTag: @"dtstart"] value: 0 ofAttribute: @"tzid"]; if ([tzid length] > 0) { *data = [tzid asUnicodeInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidTimeZoneStruct: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; iCalTimeZone *icalTZ; icalTZ = [(iCalDateTime *) [event firstChildWithTag: @"dtstart"] timeZone]; if (icalTZ) { *data = [icalTZ asTimeZoneStructInMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidAppointmentTimeZoneDefinitionStartDisplay: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; iCalTimeZone *icalTZ; if ([event isRecurrent]) { icalTZ = [(iCalDateTime *) [event firstChildWithTag: @"dtstart"] timeZone]; if (icalTZ) { *data = [icalTZ asZoneTimeDefinitionWithFlags: TZRULE_FLAG_EFFECTIVE_TZREG | TZRULE_FLAG_RECUR_CURRENT_TZREG inMemCtx: memCtx]; rc = MAPISTORE_SUCCESS; } else rc = MAPISTORE_ERR_NOT_FOUND; } else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } - (int) getPidLidAppointmentTimeZoneDefinitionEndDisplay: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidAppointmentTimeZoneDefinitionStartDisplay: data inMemCtx: memCtx]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreMailFolder.m0000644000000000000000000012210512247657026017065 0ustar rootroot/* MAPIStoreMailFolder.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "MAPIApplication.h" #import "MAPIStoreAppointmentWrapper.h" #import "MAPIStoreContext.h" #import "MAPIStoreFAIMessage.h" #import "MAPIStoreMailContext.h" #import "MAPIStoreMailMessage.h" #import "MAPIStoreMailMessageTable.h" #import "MAPIStoreMapping.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSData+MAPIStore.h" #import "NSString+MAPIStore.h" #import "SOGoMAPIDBMessage.h" #import "SOGoMAPIDBFolder.h" #import "MAPIStoreMailVolatileMessage.h" #import "MAPIStoreMailFolder.h" static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; #undef DEBUG #include #include #include #include @implementation MAPIStoreMailFolder + (void) initialize { SOGoMailFolderK = [SOGoMailFolder class]; MAPIStoreMailFolderK = [MAPIStoreMailFolder class]; MAPIStoreOutboxFolderK = [MAPIStoreOutboxFolder class]; [MAPIStoreAppointmentWrapper class]; } - (id) init { if ((self = [super init])) { versionsMessage = nil; bodyData = [NSMutableDictionary new]; } return self; } - (void) dealloc { [versionsMessage release]; [bodyData release]; [super dealloc]; } - (void) setupVersionsMessage { ASSIGN (versionsMessage, [SOGoMAPIDBMessage objectWithName: @"versions.plist" inContainer: dbFolder]); [versionsMessage setObjectType: MAPIDBObjectTypeInternal]; } - (BOOL) ensureFolderExists { return [(SOGoMailFolder *) sogoObject exists] || [sogoObject create]; } - (void) addProperties: (NSDictionary *) newProperties { NSString *newDisplayName, *newNameInContainer; NSMutableDictionary *propsCopy; NSNumber *key; uint64_t fid; key = MAPIPropertyKey (PR_DISPLAY_NAME_UNICODE); newDisplayName = [newProperties objectForKey: key]; if (newDisplayName && ![self isKindOfClass: MAPIStoreOutboxFolderK] && ![[(SOGoMailFolder *) sogoObject displayName] isEqualToString: newDisplayName]) { fid = [self objectId]; [(SOGoMailFolder *) sogoObject renameTo: newDisplayName]; newNameInContainer = [sogoObject nameInContainer]; if (!container) [(MAPIStoreMailContext *) context updateURLWithFolderName: newNameInContainer]; [[self mapping] updateID: fid withURL: [self url]]; [dbFolder setNameInContainer: newNameInContainer]; [self cleanupCaches]; propsCopy = [newProperties mutableCopy]; [propsCopy removeObjectForKey: key]; [propsCopy autorelease]; newProperties = propsCopy; } [super addProperties: newProperties]; } - (MAPIStoreMessageTable *) messageTable { [self synchroniseCache]; return [MAPIStoreMailMessageTable tableForContainer: self]; } - (enum mapistore_error) createFolder: (struct SRow *) aRow withFID: (uint64_t) newFID andKey: (NSString **) newKeyP { enum mapistore_error rc; NSString *folderName, *nameInContainer; SOGoMailFolder *newFolder; int i; nameInContainer = nil; folderName = nil; for (i = 0; !folderName && i < aRow->cValues; i++) { if (aRow->lpProps[i].ulPropTag == PR_DISPLAY_NAME_UNICODE) folderName = [NSString stringWithUTF8String: aRow->lpProps[i].value.lpszW]; else if (aRow->lpProps[i].ulPropTag == PR_DISPLAY_NAME) folderName = [NSString stringWithUTF8String: aRow->lpProps[i].value.lpszA]; } if (folderName) { nameInContainer = [NSString stringWithFormat: @"folder%@", [[folderName stringByEncodingImap4FolderName] asCSSIdentifier]]; newFolder = [SOGoMailFolderK objectWithName: nameInContainer inContainer: sogoObject]; if ([newFolder create]) { *newKeyP = nameInContainer; rc = MAPISTORE_SUCCESS; } else if ([newFolder exists]) rc = MAPISTORE_ERR_EXIST; else rc = MAPISTORE_ERR_DENIED; } return rc; } - (int) deleteFolder { int rc; NSException *error; NSString *name; name = [self nameInContainer]; if ([name isEqualToString: @"folderINBOX"]) rc = MAPISTORE_ERR_DENIED; else { error = [(SOGoMailFolder *) sogoObject delete]; if (error) rc = MAPISTORE_ERROR; else { if (![versionsMessage delete]) rc = MAPISTORE_SUCCESS; else rc = MAPISTORE_ERROR; } } return (rc == MAPISTORE_SUCCESS) ? [super deleteFolder] : rc; } - (int) getPidTagContentUnreadCount: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { EOQualifier *searchQualifier; uint32_t longValue; searchQualifier = [EOQualifier qualifierWithQualifierFormat: @"flags = %@", @"unseen"]; longValue = [[sogoObject fetchUIDsMatchingQualifier: searchQualifier sortOrdering: nil] count]; *data = MAPILongValue (memCtx, longValue); return MAPISTORE_SUCCESS; } - (int) getPidTagContainerClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPF.Note" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (EOQualifier *) nonDeletedQualifier { static EOQualifier *nonDeletedQualifier = nil; EOQualifier *deletedQualifier; if (!nonDeletedQualifier) { deletedQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"FLAGS" operatorSelector: EOQualifierOperatorContains value: [NSArray arrayWithObject: @"Deleted"]]; nonDeletedQualifier = [[EONotQualifier alloc] initWithQualifier: deletedQualifier]; [deletedQualifier release]; } return nonDeletedQualifier; } - (NSArray *) messageKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { NSArray *uidKeys; EOQualifier *fetchQualifier; if ([self ensureFolderExists]) { if (!sortOrderings) sortOrderings = [NSArray arrayWithObject: @"ARRIVAL"]; if (qualifier) { fetchQualifier = [[EOAndQualifier alloc] initWithQualifiers: [self nonDeletedQualifier], qualifier, nil]; [fetchQualifier autorelease]; } else fetchQualifier = [self nonDeletedQualifier]; uidKeys = [[sogoObject fetchUIDsMatchingQualifier: fetchQualifier sortOrdering: sortOrderings] stringsWithFormat: @"%@.eml"]; } else uidKeys = nil; return uidKeys; } - (NSMutableString *) _imapFolderNameRepresentation: (NSString *) subfolderName { NSMutableString *representation; NSString *nameInContainer, *strippedName; nameInContainer = [self nameInContainer]; if (container) representation = [(MAPIStoreMailFolder *) container _imapFolderNameRepresentation: nameInContainer]; else { if (![nameInContainer hasPrefix: @"folder"]) abort (); strippedName = [nameInContainer substringFromIndex: 6]; representation = [NSMutableString stringWithString: strippedName]; } if (![subfolderName hasPrefix: @"folder"]) abort (); strippedName = [[subfolderName substringFromIndex: 6] stringByDecodingImap4FolderName]; [representation appendFormat: @"/%@", strippedName]; return representation; } - (void) _cleanupSubfolderKeys: (NSMutableArray *) subfolderKeys { SOGoMailAccount *account; NSString *draftsFolderName, *sentFolderName, *trashFolderName; NSString *subfolderKey, *cmpString; NSUInteger count, max; NSMutableArray *keysToRemove; account = [(SOGoMailFolder *) sogoObject mailAccountFolder]; draftsFolderName = [account draftsFolderNameInContext: nil]; sentFolderName = [account sentFolderNameInContext: nil]; trashFolderName = [account trashFolderNameInContext: nil]; max = [subfolderKeys count]; keysToRemove = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { subfolderKey = [subfolderKeys objectAtIndex: count]; cmpString = [self _imapFolderNameRepresentation: subfolderKey]; if ([cmpString isEqualToString: draftsFolderName] || [cmpString isEqualToString: sentFolderName] || [cmpString isEqualToString: trashFolderName]) [keysToRemove addObject: subfolderKey]; } [subfolderKeys removeObjectsInArray: keysToRemove]; } - (NSArray *) folderKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { NSMutableArray *subfolderKeys; if ([self ensureFolderExists]) { if (qualifier) [self errorWithFormat: @"qualifier is not used for folders"]; if (sortOrderings) [self errorWithFormat: @"sort orderings are not used for folders"]; subfolderKeys = [[sogoObject toManyRelationshipKeys] mutableCopy]; [subfolderKeys autorelease]; [self _cleanupSubfolderKeys: subfolderKeys]; } else subfolderKeys = nil; return subfolderKeys; } - (NSDate *) creationTime { return [NSCalendarDate dateWithTimeIntervalSince1970: 0x4dbb2dbe]; /* oc_version_time */ } - (NSDate *) lastMessageModificationTime { NSNumber *ti; NSDate *value = nil; [self synchroniseCache]; ti = [[versionsMessage properties] objectForKey: @"SyncLastSynchronisationDate"]; if (ti) value = [NSDate dateWithTimeIntervalSince1970: [ti doubleValue]]; else value = [NSDate date]; //[self logWithFormat: @"lastMessageModificationTime: %@", value]; return value; } - (SOGoFolder *) aclFolder { return (SOGoFolder *) sogoObject; } - (NSArray *) permissionEntries { NSArray *permissionEntries; if ([self ensureFolderExists]) permissionEntries = [super permissionEntries]; else permissionEntries = nil; return permissionEntries; } - (BOOL) supportsSubFolders { BOOL supportsSubFolders; MAPIStoreUserContext *userContext; if ([[self nameInContainer] isEqualToString: @"folderINBOX"]) { userContext = [self userContext]; supportsSubFolders = ![userContext inboxHasNoInferiors]; } else supportsSubFolders = YES; return supportsSubFolders; } /* synchronisation */ /* Tree: { SyncLastModseq = x; SyncLastSynchronisationDate = x; ** not updated until something changed Messages = { MessageKey = { Version = x; Modseq = x; Deleted = b; }; ... }; VersionMapping = { Version = MessageKey; ... } } */ static NSComparisonResult _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) { static NSNumber *zeroNumber = nil; NSNumber *modseq1, *modseq2; if (!zeroNumber) { zeroNumber = [NSNumber numberWithUnsignedLongLong: 0]; [zeroNumber retain]; } modseq1 = [entry1 objectForKey: @"modseq"]; if (!modseq1) modseq1 = zeroNumber; modseq2 = [entry2 objectForKey: @"modseq"]; if (!modseq2) modseq2 = zeroNumber; return [modseq1 compare: modseq2]; } - (void) _setChangeKey: (NSData *) changeKey forMessageEntry: (NSMutableDictionary *) messageEntry { struct XID *xid; NSString *guid; NSData *globCnt; NSDictionary *changeKeyDict; NSMutableDictionary *changeList; xid = [changeKey asXIDInMemCtx: NULL]; guid = [NSString stringWithGUID: &xid->GUID]; globCnt = [NSData dataWithBytes: xid->Data length: xid->Size]; talloc_free (xid); /* 1. set change key association */ changeKeyDict = [NSDictionary dictionaryWithObjectsAndKeys: guid, @"GUID", globCnt, @"LocalId", nil]; [messageEntry setObject: changeKeyDict forKey: @"ChangeKey"]; /* 2. append/update predecessor change list */ changeList = [messageEntry objectForKey: @"PredecessorChangeList"]; if (!changeList) { changeList = [NSMutableDictionary new]; [messageEntry setObject: changeList forKey: @"PredecessorChangeList"]; [changeList release]; } [changeList setObject: globCnt forKey: guid]; } - (BOOL) synchroniseCache { BOOL rc = YES; uint64_t newChangeNum; NSNumber *ti, *modseq, *initialLastModseq, *lastModseq, *nextModseq; NSString *changeNumber, *uid, *messageKey; uint64_t lastModseqNbr; EOQualifier *kvQualifier, *searchQualifier; NSArray *uids, *changeNumbers; NSUInteger count, max; NSArray *fetchResults; NSDictionary *result; NSData *changeKey; NSMutableArray *messageKeys; NSMutableDictionary *currentProperties, *messages, *mapping, *messageEntry; NSCalendarDate *now; BOOL foundChange = NO; /* NOTE: we are using NSString instance for "uid" and "changeNumber" because NSNumber proved to give very bad performances when used as NSDictionary keys with GNUstep 1.22.1. The bug seems to be solved with 1.24 but many distros still ship an older version. */ now = [NSCalendarDate date]; [now setTimeZone: utcTZ]; [versionsMessage reloadIfNeeded]; currentProperties = [versionsMessage properties]; messages = [currentProperties objectForKey: @"Messages"]; if (!messages) { messages = [NSMutableDictionary new]; [currentProperties setObject: messages forKey: @"Messages"]; [messages release]; } mapping = [currentProperties objectForKey: @"VersionMapping"]; if (!mapping) { mapping = [NSMutableDictionary new]; [currentProperties setObject: mapping forKey: @"VersionMapping"]; [mapping release]; } lastModseq = [currentProperties objectForKey: @"SyncLastModseq"]; initialLastModseq = lastModseq; if (lastModseq) { lastModseqNbr = [lastModseq unsignedLongLongValue]; nextModseq = [NSNumber numberWithUnsignedLongLong: lastModseqNbr + 1]; kvQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"modseq" operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo value: nextModseq]; searchQualifier = [[EOAndQualifier alloc] initWithQualifiers: kvQualifier, [self nonDeletedQualifier], nil]; [kvQualifier release]; [searchQualifier autorelease]; } else { lastModseqNbr = 0; searchQualifier = [self nonDeletedQualifier]; } /* 1. we fetch modified or added uids */ uids = [sogoObject fetchUIDsMatchingQualifier: searchQualifier sortOrdering: nil]; max = [uids count]; if (max > 0) { messageKeys = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { messageKey = [NSString stringWithFormat: @"%@.eml", [uids objectAtIndex: count]]; [messageKeys addObject: messageKey]; } [self ensureIDsForChildKeys: messageKeys]; changeNumbers = [[self context] getNewChangeNumbers: max]; fetchResults = [(NSDictionary *) [sogoObject fetchUIDs: uids parts: [NSArray arrayWithObject: @"modseq"]] objectForKey: @"fetch"]; /* NOTE: we sort items manually because Cyrus does not properly sort entries with a MODSEQ of 0 */ fetchResults = [fetchResults sortedArrayUsingFunction: _compareFetchResultsByMODSEQ context: NULL]; for (count = 0; count < max; count++) { result = [fetchResults objectAtIndex: count]; uid = [[result objectForKey: @"uid"] stringValue]; modseq = [result objectForKey: @"modseq"]; newChangeNum = [[changeNumbers objectAtIndex: count] unsignedLongLongValue]; changeNumber = [NSString stringWithUnsignedLongLong: newChangeNum]; messageEntry = [NSMutableDictionary new]; [messages setObject: messageEntry forKey: uid]; [messageEntry release]; [messageEntry setObject: modseq forKey: @"modseq"]; [messageEntry setObject: changeNumber forKey: @"version"]; //[self logWithFormat: @"added message entry for uid %@, modseq %@," // @" version %@", uid, modseq, changeNumber]; changeKey = [self getReplicaKeyFromGlobCnt: newChangeNum >> 16]; [self _setChangeKey: changeKey forMessageEntry: messageEntry]; [mapping setObject: modseq forKey: changeNumber]; if (!lastModseq || ([lastModseq compare: modseq] == NSOrderedAscending)) lastModseq = modseq; } [currentProperties setObject: lastModseq forKey: @"SyncLastModseq"]; foundChange = YES; } /* 2. we synchronise deleted UIDs */ if (initialLastModseq) { fetchResults = [(SOGoMailFolder *) sogoObject fetchUIDsOfVanishedItems: lastModseqNbr]; max = [fetchResults count]; changeNumbers = [[self context] getNewChangeNumbers: max]; changeNumber = nil; for (count = 0; count < max; count++) { uid = [fetchResults objectAtIndex: count]; if ([messages objectForKey: uid]) { newChangeNum = [[changeNumbers objectAtIndex: count] unsignedLongLongValue]; changeNumber = [NSString stringWithUnsignedLongLong: newChangeNum]; [messages removeObjectForKey: uid]; [self logWithFormat: @"removed message entry for uid %@", uid]; } } if (changeNumber) { [currentProperties setObject: changeNumber forKey: @"SyncLastDeleteChangeNumber"]; foundChange = YES; } } if (foundChange) { ti = [NSNumber numberWithDouble: [now timeIntervalSince1970]]; [currentProperties setObject: ti forKey: @"SyncLastSynchronisationDate"]; [versionsMessage save]; } return rc; } - (NSNumber *) modseqFromMessageChangeNumber: (NSString *) changeNum { NSDictionary *mapping; NSNumber *modseq; mapping = [[versionsMessage properties] objectForKey: @"VersionMapping"]; modseq = [mapping objectForKey: changeNum]; return modseq; } - (NSString *) messageUIDFromMessageKey: (NSString *) messageKey { NSString *messageUid; NSRange dotRange; dotRange = [messageKey rangeOfString: @".eml"]; if (dotRange.location != NSNotFound) messageUid = [messageKey substringToIndex: dotRange.location]; else messageUid = nil; return messageUid; } - (NSString *) changeNumberForMessageUID: (NSString *) messageUid { NSDictionary *messages; NSString *changeNumber; messages = [[versionsMessage properties] objectForKey: @"Messages"]; changeNumber = [[messages objectForKey: messageUid] objectForKey: @"version"]; return changeNumber; } - (void) setChangeKey: (NSData *) changeKey forMessageWithKey: (NSString *) messageKey { NSMutableDictionary *messages, *messageEntry; NSString *messageUid; messageUid = [self messageUIDFromMessageKey: messageKey]; messages = [[versionsMessage properties] objectForKey: @"Messages"]; messageEntry = [messages objectForKey: messageUid]; if (!messageEntry) abort (); [self _setChangeKey: changeKey forMessageEntry: messageEntry]; [versionsMessage save]; } - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey { NSDictionary *messages, *changeKeyDict; NSString *guid, *messageUid; NSData *globCnt, *changeKey = nil; messageUid = [self messageUIDFromMessageKey: messageKey]; messages = [[versionsMessage properties] objectForKey: @"Messages"]; changeKeyDict = [[messages objectForKey: messageUid] objectForKey: @"ChangeKey"]; if (changeKeyDict) { guid = [changeKeyDict objectForKey: @"GUID"]; globCnt = [changeKeyDict objectForKey: @"LocalId"]; changeKey = [NSData dataWithChangeKeyGUID: guid andCnt: globCnt]; } return changeKey; } - (NSData *) predecessorChangeListForMessageWithKey: (NSString *) messageKey { NSMutableData *list = nil; NSDictionary *messages, *changeListDict; NSArray *keys; NSMutableArray *changeKeys; NSUInteger count, max; NSData *changeKey; NSString *guid, *messageUid; NSData *globCnt; messageUid = [self messageUIDFromMessageKey: messageKey]; messages = [[versionsMessage properties] objectForKey: @"Messages"]; changeListDict = [[messages objectForKey: messageUid] objectForKey: @"PredecessorChangeList"]; if (changeListDict) { keys = [changeListDict allKeys]; max = [keys count]; changeKeys = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { guid = [keys objectAtIndex: count]; globCnt = [changeListDict objectForKey: guid]; changeKey = [NSData dataWithChangeKeyGUID: guid andCnt: globCnt]; [changeKeys addObject: changeKey]; } [changeKeys sortUsingFunction: MAPIChangeKeyGUIDCompare context: nil]; list = [NSMutableData data]; for (count = 0; count < max; count++) { changeKey = [changeKeys objectAtIndex: count]; [list appendUInt8: [changeKey length]]; [list appendData: changeKey]; } } return list; } - (NSArray *) getDeletedKeysFromChangeNumber: (uint64_t) changeNum andCN: (NSNumber **) cnNbr inTableType: (uint8_t) tableType { NSArray *deletedKeys, *deletedUIDs; NSString *changeNumber; uint64_t modseq; NSDictionary *versionProperties; if (tableType == MAPISTORE_MESSAGE_TABLE) { changeNumber = [NSString stringWithFormat: @"0x%.16llx", changeNum]; modseq = [[self modseqFromMessageChangeNumber: changeNumber] unsignedLongLongValue]; if (modseq > 0) { deletedUIDs = [(SOGoMailFolder *) sogoObject fetchUIDsOfVanishedItems: modseq]; deletedKeys = [deletedUIDs stringsWithFormat: @"%@.eml"]; if ([deletedUIDs count] > 0) { versionProperties = [versionsMessage properties]; changeNumber = [versionProperties objectForKey: @"SyncLastDeleteChangeNumber"]; *cnNbr = [NSNumber numberWithUnsignedLongLong: [changeNumber unsignedLongLongValue]]; [versionsMessage save]; } } else deletedKeys = [NSArray array]; } else deletedKeys = [super getDeletedKeysFromChangeNumber: changeNum andCN: cnNbr inTableType: tableType]; return deletedKeys; } static void _appendIMAPRange (NSMutableArray *UIDs, uint32_t low, uint32_t high) { uint32_t count; for (count = low; count < high + 1; count++) [UIDs addObject: [NSNumber numberWithUnsignedLong: count]]; } static NSUInteger _parseUID (const unichar *uniString, uint32_t *newUidP) { NSUInteger count = 0; uint32_t newUid = 0; while (uniString[count] >= '0' && uniString[count] <= '9') { newUid = newUid * 10 + (uniString[count] - 48); count++; } *newUidP = newUid; return count; } static NSUInteger _parseIMAPRange (const unichar *uniString, NSArray **UIDsP) { NSMutableArray *UIDs; NSUInteger count = 0; uint32_t currentUid, rangeMin; BOOL done = NO, inRange = NO; UIDs = [NSMutableArray array]; while (!done) { count += _parseUID (uniString + count, ¤tUid); switch (uniString[count]) { case ':': inRange = YES; rangeMin = currentUid; break; case ' ': case 0: done = YES; case ',': if (inRange) { _appendIMAPRange (UIDs, rangeMin, currentUid); inRange = NO; } else [UIDs addObject: [NSNumber numberWithUnsignedLong: currentUid]]; break; default: abort (); } count++; } *UIDsP = UIDs; return count; } static void _parseCOPYUID (NSString *line, NSArray **destUIDsP) { unichar *uniString; NSUInteger count = 0, max; // char state = 'i'; /* i = init, v = validity, s = source range, d = dest range */ /* sample: 1 OK [COPYUID 1311899334 1:3 11:13] Completed */ max = [line length]; uniString = NSZoneMalloc (NULL, sizeof (unichar) * (max + 1)); [line getCharacters: uniString]; uniString[max] = 0; while (count < max && uniString[count] != ' ') count++; count++; while (count < max && uniString[count] != ' ') count++; count++; while (count < max && uniString[count] != ' ') count++; count++; if (count < max) count += _parseIMAPRange (uniString + count, destUIDsP); NSZoneFree (NULL, uniString); } // // Move (or eventually copy) the mails identified by // "srcMids" from the source folder into this folder. // - (int) moveCopyMessagesWithMIDs: (uint64_t *) srcMids andCount: (uint32_t) midCount fromFolder: (MAPIStoreFolder *) sourceFolder withMIDs: (uint64_t *) targetMids andChangeKeys: (struct Binary_r **) targetChangeKeys wantCopy: (uint8_t) wantCopy inMemCtx: (TALLOC_CTX *) memCtx { NGImap4Connection *connection; NGImap4Client *client; NSString *sourceFolderName, *targetFolderName, *messageURL, *messageKey, *uid, *v; NSMutableArray *uids, *oldMessageURLs; NSArray *destUIDs; MAPIStoreMapping *mapping; NSDictionary *result; NSUInteger count; NSArray *a; NSData *changeKey; if (![sourceFolder isKindOfClass: [MAPIStoreMailFolder class]]) return [super moveCopyMessagesWithMIDs: srcMids andCount: midCount fromFolder: sourceFolder withMIDs: targetMids andChangeKeys: targetChangeKeys wantCopy: wantCopy inMemCtx: memCtx]; /* Conversion of mids to IMAP uids */ mapping = [self mapping]; uids = [NSMutableArray arrayWithCapacity: midCount]; oldMessageURLs = [NSMutableArray arrayWithCapacity: midCount]; for (count = 0; count < midCount; count++) { messageURL = [mapping urlFromID: srcMids[count]]; if (messageURL) { uid = [self messageUIDFromMessageKey: [messageURL lastPathComponent]]; [uids addObject: uid]; [oldMessageURLs addObject: messageURL]; } else return MAPISTORE_ERROR; } /* IMAP COPY */ connection = [sogoObject imap4Connection]; sourceFolderName = [connection imap4FolderNameForURL: [[sourceFolder sogoObject] imap4URL]]; targetFolderName = [connection imap4FolderNameForURL: [sogoObject imap4URL]]; client = [connection client]; [client select: sourceFolderName]; result = [client copyUids: uids toFolder: targetFolderName]; if (![[result objectForKey: @"result"] boolValue]) return MAPISTORE_ERROR; /* "Move" treatment: Store \Deleted and unregister urls */ if (!wantCopy) { [client storeFlags: [NSArray arrayWithObject: @"Deleted"] forUIDs: uids addOrRemove: YES]; for (count = 0; count < midCount; count++) [mapping unregisterURLWithID: srcMids[count]]; } /* Registration of target messages */ // // We use the UIDPLUS IMAP extension here in order to speedup UID retrieval // If supported by the server, we'll get something like: COPYUID 1315425789 1 8 // // Sometimes COPYUID isn't returned at all by Cyrus or in case the server doesn't // support the UIDPLUS IMAP extension, we fallback to a simple UID search. // v = [[[result objectForKey: @"RawResponse"] objectForKey: @"ResponseResult"] objectForKey: @"flag"]; if (v) { destUIDs = nil; _parseCOPYUID (v, &destUIDs); } else { /* FIXME: this may fail if new messages are appended to the folder between the COPY and SORT operations */ [client select: targetFolderName]; a = [[client sort: @"ARRIVAL" qualifier: nil encoding: @"UTF-8"] objectForKey: @"sort"]; destUIDs = [[a sortedArrayUsingSelector: @selector (compare:)] subarrayWithRange: NSMakeRange ([a count] - midCount, midCount)]; } for (count = 0; count < midCount; count++) { messageURL = [NSString stringWithFormat: @"%@%@.eml", [self url], [destUIDs objectAtIndex: count]]; [mapping registerURL: messageURL withID: targetMids[count]]; } /* Update the change keys */ if (targetChangeKeys) { [self synchroniseCache]; for (count = 0; count < midCount; count++) { changeKey = [NSData dataWithBinary: targetChangeKeys[count]]; messageKey = [NSString stringWithFormat: @"%@.eml", [destUIDs objectAtIndex: count]]; [self setChangeKey: changeKey forMessageWithKey: messageKey]; } } [self postNotificationsForMoveCopyMessagesWithMIDs: srcMids andMessageURLs: oldMessageURLs andCount: midCount fromFolder: sourceFolder withMIDs: targetMids wantCopy: wantCopy]; // We cleanup cache of our source and destination folders [self cleanupCaches]; [sourceFolder cleanupCaches]; return MAPISTORE_SUCCESS; } - (enum mapistore_error) moveCopyToFolder: (MAPIStoreFolder *) targetFolder withNewName: (NSString *) newFolderName isMove: (BOOL) isMove isRecursive: (BOOL) isRecursive inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSURL *folderURL, *newFolderURL; struct SRow folderRow; struct SPropValue nameProperty; MAPIStoreMailFolder *newFolder; SOGoMailFolder *targetSOGoFolder; NSMutableArray *uids; NSArray *childKeys; NSUInteger count, max; NGImap4Connection *connection; NGImap4Client *client; NSString *newURL, *parentDBFolderPath, *childKey, *folderIMAPName, *urlNamePart, *newFolderIMAPName; NSException *error; MAPIStoreMapping *mapping; NSDictionary *result; if ([targetFolder isKindOfClass: MAPIStoreMailFolderK]) { folderURL = [sogoObject imap4URL]; if (!newFolderName) newFolderName = [sogoObject displayName]; targetSOGoFolder = [targetFolder sogoObject]; if (isMove) { urlNamePart = [newFolderName stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; newFolderURL = [NSURL URLWithString: urlNamePart relativeToURL: [targetSOGoFolder imap4URL]]; error = [[sogoObject imap4Connection] moveMailboxAtURL: folderURL toURL: newFolderURL]; if (error) rc = MAPISTORE_ERR_DENIED; else { rc = MAPISTORE_SUCCESS; mapping = [self mapping]; newURL = [NSString stringWithFormat: @"%@folder%@/", [targetFolder url], urlNamePart]; [mapping updateID: [self objectId] withURL: newURL]; parentDBFolderPath = [[targetFolder dbFolder] path]; if (!parentDBFolderPath) parentDBFolderPath = @""; [dbFolder changePathTo: [NSString stringWithFormat: @"%@/folder%@", parentDBFolderPath, newFolderName]]; } } else { nameProperty.ulPropTag = PidTagDisplayName; nameProperty.value.lpszW = [newFolderName UTF8String]; folderRow.lpProps = &nameProperty; folderRow.cValues = 1; rc = [targetFolder createFolder: &folderRow withFID: -1 andKey: &childKey]; if (rc == MAPISTORE_SUCCESS) { newFolder = [targetFolder lookupFolder: childKey]; connection = [sogoObject imap4Connection]; folderIMAPName = [connection imap4FolderNameForURL: [sogoObject imap4URL]]; newFolderIMAPName = [connection imap4FolderNameForURL: [[newFolder sogoObject] imap4URL]]; client = [connection client]; [client select: folderIMAPName]; childKeys = [self messageKeys]; max = [childKeys count]; uids = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { childKey = [childKeys objectAtIndex: count]; [uids addObject: [self messageUIDFromMessageKey: childKey]]; } result = [client copyUids: uids toFolder: newFolderIMAPName]; if ([[result objectForKey: @"result"] boolValue]) { if (isRecursive) { childKeys = [self folderKeys]; max = [childKeys count]; for (count = 0; count < max; count++) { childKey = [childKeys objectAtIndex: count]; [[self lookupFolder: childKey] moveCopyToFolder: newFolder withNewName: nil isMove: NO isRecursive: YES inMemCtx: memCtx]; } } } else rc = MAPISTORE_ERROR; } } [targetFolder cleanupCaches]; } else rc = [super moveCopyToFolder: targetFolder withNewName: newFolderName isMove: isMove isRecursive: isRecursive inMemCtx: memCtx]; return rc; } - (MAPIStoreMessage *) createMessage { SOGoMAPIObject *childObject; childObject = [SOGoMAPIObject objectWithName: [SOGoMAPIObject globallyUniqueObjectId] inContainer: sogoObject]; return [MAPIStoreMailVolatileMessage mapiStoreObjectWithSOGoObject: childObject inContainer: self]; } - (id) lookupMessage: (NSString *) messageKey { MAPIStoreMailMessage *message; NSData *rawBodyData; message = [super lookupMessage: messageKey]; if (message) { rawBodyData = [bodyData objectForKey: messageKey]; if (rawBodyData) [message setBodyContentFromRawData: rawBodyData]; } return message; } - (NSArray *) rolesForExchangeRights: (uint32_t) rights { NSMutableArray *roles; roles = [NSMutableArray arrayWithCapacity: 6]; if (rights & RoleOwner) [roles addObject: SOGoMailRole_Administrator]; if (rights & RightsCreateItems) { [roles addObject: SOGoRole_ObjectCreator]; [roles addObject: SOGoMailRole_Writer]; [roles addObject: SOGoMailRole_Poster]; } if (rights & RightsDeleteAll) { [roles addObject: SOGoRole_ObjectEraser]; [roles addObject: SOGoRole_FolderEraser]; [roles addObject: SOGoMailRole_Expunger]; } if (rights & RightsEditAll) [roles addObject: SOGoRole_ObjectEditor]; if (rights & RightsReadItems) [roles addObject: SOGoRole_ObjectViewer]; if (rights & RightsCreateSubfolders) [roles addObject: SOGoRole_FolderCreator]; // [self logWithFormat: @"roles for rights %.8x = (%@)", rights, roles]; return roles; } - (uint32_t) exchangeRightsForRoles: (NSArray *) roles { uint32_t rights = 0; if ([roles containsObject: SOGoMailRole_Administrator]) rights |= (RoleOwner ^ RightsAll); if ([roles containsObject: SOGoRole_ObjectCreator]) rights |= RightsCreateItems; if ([roles containsObject: SOGoRole_ObjectEraser] && [roles containsObject: SOGoRole_FolderEraser]) rights |= RightsDeleteAll; if ([roles containsObject: SOGoRole_ObjectEditor]) rights |= RightsEditAll; if ([roles containsObject: SOGoRole_ObjectViewer]) rights |= RightsReadItems; if ([roles containsObject: SOGoRole_FolderCreator]) rights |= RightsCreateSubfolders; if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ // [self logWithFormat: @"rights for roles (%@) = %.8x", roles, rights]; return rights; } - (enum mapistore_error) preloadMessageBodiesWithKeys: (NSArray *) keys ofTableType: (enum mapistore_table_type) tableType { MAPIStoreMailMessage *message; NSMutableSet *bodyPartKeys; NSMutableDictionary *keyAssoc; NSDictionary *response; NSUInteger count, max; NSString *messageKey, *messageUid, *bodyPartKey; NGImap4Client *client; NSArray *fetch; NSData *bodyContent; if (tableType == MAPISTORE_MESSAGE_TABLE) { [bodyData removeAllObjects]; max = [keys count]; if (max > 0) { bodyPartKeys = [NSMutableSet setWithCapacity: max]; keyAssoc = [NSMutableDictionary dictionaryWithCapacity: max]; for (count = 0; count < max; count++) { messageKey = [keys objectAtIndex: count]; message = [self lookupMessage: messageKey]; if (message) { bodyPartKey = [message bodyContentPartKey]; if (bodyPartKey) { [bodyPartKeys addObject: bodyPartKey]; messageUid = [self messageUIDFromMessageKey: messageKey]; [keyAssoc setObject: bodyPartKey forKey: messageUid]; } } } client = [[(SOGoMailFolder *) sogoObject imap4Connection] client]; [client select: [sogoObject absoluteImap4Name]]; response = [client fetchUids: [keyAssoc allKeys] parts: [bodyPartKeys allObjects]]; fetch = [response objectForKey: @"fetch"]; max = [fetch count]; for (count = 0; count < max; count++) { response = [fetch objectAtIndex: count]; messageUid = [[response objectForKey: @"uid"] stringValue]; bodyPartKey = [keyAssoc objectForKey: messageUid]; if (bodyPartKey) { bodyContent = [[response objectForKey: bodyPartKey] objectForKey: @"data"]; if (bodyContent) { messageKey = [NSString stringWithFormat: @"%@.eml", messageUid]; [bodyData setObject: bodyContent forKey: messageKey]; } } } } } return MAPISTORE_SUCCESS; } @end @implementation MAPIStoreOutboxFolder - (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"Outbox" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } @end SOGo-2.1.1b/OpenChange/MAPIStoreMailAttachment.m0000644000000000000000000001214312247657026017742 0ustar rootroot/* MAPIStoreMailAttachment.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import #import "MAPIStoreTypes.h" #import "MAPIStoreMailMessage.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreMailAttachment.h" #undef DEBUG #include #include #include #include @implementation MAPIStoreMailAttachment - (id) init { if ((self = [super init])) { bodyInfo = nil; bodyPart = nil; } return self; } - (void) dealloc { [bodyInfo release]; [bodyPart release]; [super dealloc]; } - (void) setBodyInfo: (NSDictionary *) newBodyInfo { ASSIGN (bodyInfo, newBodyInfo); } - (void) setBodyPart: (SOGoMailBodyPart *) newBodyPart { ASSIGN (bodyPart, newBodyPart); } - (int) getPidTagAttachMethod: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000001); // afByValue return MAPISTORE_SUCCESS; } - (int) getPidTagAttachTag: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self mimeAttachTag] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttachSize: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; longValue = [[bodyInfo objectForKey: @"size"] longValue]; *data = MAPILongValue (memCtx, longValue); return MAPISTORE_SUCCESS; } - (int) getPidTagRecordKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { static char recordBytes[] = {0xd9, 0xd8, 0x11, 0xa3, 0xe2, 0x90, 0x18, 0x41, 0x9e, 0x04, 0x58, 0x46, 0x9d, 0x6d, 0x1b, 0x68}; *data = [[NSData dataWithBytes: recordBytes length: 16] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (NSString *) _fileName { NSString *fileName; NSDictionary *parameters; fileName = [[bodyInfo objectForKey: @"parameterList"] objectForKey: @"name"]; if (!fileName) { parameters = [[bodyInfo objectForKey: @"disposition"] objectForKey: @"parameterList"]; fileName = [parameters objectForKey: @"filename"]; } return fileName; } - (int) getPidTagAttachLongFilename: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self _fileName] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttachFilename: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *fileName, *baseName, *ext; fileName = [self _fileName]; baseName = [fileName stringByDeletingPathExtension]; if ([baseName length] > 8) baseName = [baseName substringToIndex: 8]; ext = [fileName pathExtension]; if ([ext length] > 3) ext = [ext substringToIndex: 3]; fileName = [NSString stringWithFormat: @"%@.%@", baseName, ext]; *data = [fileName asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[bodyInfo objectForKey: @"description"] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttachContentId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[bodyInfo objectForKey: @"bodyId"] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttachMimeTag: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *mimeTag; mimeTag = [NSString stringWithFormat: @"%@/%@", [bodyInfo objectForKey: @"type"], [bodyInfo objectForKey: @"subtype"]]; *data = [[mimeTag lowercaseString] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttachDataBinary: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[bodyPart fetchBLOBWithPeek: YES] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } @end SOGo-2.1.1b/OpenChange/MAPIStoreGCSMessageTable.m0000644000000000000000000002000012247657026017727 0ustar rootroot/* MAPIStoreGCSMessageTable.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import #import #import #import "MAPIStoreTypes.h" #import "MAPIStoreGCSFolder.h" #import "MAPIStoreGCSMessageTable.h" #undef DEBUG #include @implementation MAPIStoreGCSMessageTable - (void) cleanupCaches { [(MAPIStoreGCSFolder *) container synchroniseCache]; [super cleanupCaches]; } - (struct mapi_SPropertyRestriction *) _fixedDatePropertyRestriction: (struct mapi_SPropertyRestriction *) res inMemCtx: (TALLOC_CTX *) memCtx { struct mapi_SPropertyRestriction *translatedRes; NSCalendarDate *dateValue; int32_t longDate; translatedRes = talloc (memCtx, struct mapi_SPropertyRestriction); translatedRes->ulPropTag = (res->ulPropTag & 0xffff0000) | PT_LONG; translatedRes->relop = res->relop; dateValue = NSObjectFromMAPISPropValue (&res->lpProp); longDate = (int32_t) [dateValue timeIntervalSince1970]; translatedRes->lpProp.ulPropTag = translatedRes->ulPropTag; translatedRes->lpProp.value.l = longDate; return translatedRes; } - (MAPIRestrictionState) evaluatePropertyRestriction: (struct mapi_SPropertyRestriction *) res intoQualifier: (EOQualifier **) qualifier { static SEL operators[] = { EOQualifierOperatorLessThan, EOQualifierOperatorLessThanOrEqualTo, EOQualifierOperatorGreaterThan, EOQualifierOperatorGreaterThanOrEqualTo, EOQualifierOperatorEqual, EOQualifierOperatorNotEqual, EOQualifierOperatorContains }; SEL operator; id value; NSString *property; NSNumber *lastModified; MAPIRestrictionState rc; TALLOC_CTX *memCtx = NULL; if (res->ulPropTag == PidTagChangeNumber) { value = NSObjectFromMAPISPropValue (&res->lpProp); lastModified = [(MAPIStoreGCSFolder *) container lastModifiedFromMessageChangeNumber: value]; //[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]]; //[self logWithFormat: @" c_lastmodified: %@", lastModified]; if (lastModified) { *qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_lastmodified" operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo value: lastModified]; [*qualifier autorelease]; rc = MAPIRestrictionStateNeedsEval; } else rc = MAPIRestrictionStateAlwaysTrue; } else { property = [self backendIdentifierForProperty: res->ulPropTag]; if (property) { if (res->relop < 7) operator = operators[res->relop]; else { operator = NULL; [NSException raise: @"MAPIStoreRestrictionException" format: @"unhandled operator type number %d", res->relop]; } if ((res->ulPropTag & 0xffff) == PT_SYSTIME) { memCtx = talloc_zero (NULL, TALLOC_CTX); res = [self _fixedDatePropertyRestriction: res inMemCtx: memCtx]; } value = NSObjectFromMAPISPropValue (&res->lpProp); if ((res->ulPropTag & 0xffff) == PT_UNICODE) { property = [NSString stringWithFormat: @"UPPER(%@)", property]; value = [value uppercaseString]; } *qualifier = [[EOKeyValueQualifier alloc] initWithKey: property operatorSelector: operator value: value]; [*qualifier autorelease]; if (memCtx) talloc_free (memCtx); rc = MAPIRestrictionStateNeedsEval; } else { [self warnUnhandledProperty: res->ulPropTag inFunction: __FUNCTION__]; rc = MAPIRestrictionStateAlwaysFalse; } } return rc; } /* sorting */ - (EOSortOrdering *) _sortOrderingFromSortOrder: (struct SSortOrder *) sortOrder { EOSortOrdering *newSortOrdering = nil; NSString *sortIdentifier; SEL orderSelector = NULL; const char *propName; sortIdentifier = [self sortIdentifierForProperty: sortOrder->ulPropTag]; if (sortIdentifier) { if ((sortOrder->ulPropTag & 0xffff) == PT_UNICODE || (sortOrder->ulPropTag & 0xffff) == PT_STRING8) { if (sortOrder->ulOrder == TABLE_SORT_ASCEND) orderSelector = EOCompareCaseInsensitiveAscending; else if (sortOrder->ulOrder == TABLE_SORT_DESCEND) orderSelector = EOCompareCaseInsensitiveDescending; else if (sortOrder->ulOrder == TABLE_SORT_MAXIMUM_CATEGORY) { orderSelector = EOCompareCaseInsensitiveAscending; [self errorWithFormat: @"TABLE_SORT_MAXIMUM_CATEGORY is not handled"]; } } else { if (sortOrder->ulOrder == TABLE_SORT_ASCEND) orderSelector = EOCompareAscending; else if (sortOrder->ulOrder == TABLE_SORT_DESCEND) orderSelector = EOCompareDescending; else if (sortOrder->ulOrder == TABLE_SORT_MAXIMUM_CATEGORY) { orderSelector = EOCompareAscending; [self errorWithFormat: @"TABLE_SORT_MAXIMUM_CATEGORY is not handled"]; } } if (orderSelector) newSortOrdering = [EOSortOrdering sortOrderingWithKey: sortIdentifier selector: orderSelector]; } else { propName = get_proptag_name (sortOrder->ulPropTag); if (!propName) propName = ""; [self errorWithFormat: @"sort unhandled for property: %s (0x%.8x)", propName, sortOrder->ulPropTag]; } return newSortOrdering; } - (void) setSortOrder: (const struct SSortOrderSet *) set { NSMutableArray *newSortOrderings; EOSortOrdering *sortOrdering; uint16_t count; if (set) { newSortOrderings = [NSMutableArray arrayWithCapacity: set->cSorts]; /* TODO: */ if (set->cCategories > 0) [self errorWithFormat: @"we don't handle sort categories yet"]; for (count = 0; count < set->cSorts; count++) { sortOrdering = [self _sortOrderingFromSortOrder: set->aSort + count]; if (sortOrdering) [newSortOrderings addObject: sortOrdering]; } } else newSortOrderings = nil; ASSIGN (sortOrderings, newSortOrderings); [self cleanupCaches]; [self logWithFormat: @"new sort orderings: %@", sortOrderings]; } /* subclasses */ - (NSString *) sortIdentifierForProperty: (enum MAPITAGS) property { [self subclassResponsibility: _cmd]; return nil; } @end SOGo-2.1.1b/OpenChange/MAPIStoreGCSMessage.m0000644000000000000000000001420712247657026016773 0ustar rootroot/* MAPIStoreGCSMessage.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import "MAPIStoreContext.h" #import "MAPIStoreGCSFolder.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSData+MAPIStore.h" #import "MAPIStoreGCSMessage.h" #undef DEBUG #include #include @implementation MAPIStoreGCSMessage - (NSDate *) creationTime { return [sogoObject creationDate]; } - (NSDate *) lastModificationTime { return [sogoObject lastModified]; } - (int) getPidTagAccess: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreContext *context; WOContext *woContext; SoSecurityManager *sm; MAPIStoreUserContext *userContext; uint32_t access; context = [self context]; userContext = [self userContext]; if ([[context activeUser] isEqual: [userContext sogoUser]]) access = 0x03; else { sm = [SoSecurityManager sharedSecurityManager]; woContext = [userContext woContext]; access = 0; if (![sm validatePermission: SoPerm_ChangeImagesAndFiles onObject: sogoObject inContext: woContext]) access |= 1; if (![sm validatePermission: SoPerm_AccessContentsInformation onObject: sogoObject inContext: woContext]) access |= 2; if (![sm validatePermission: SOGoPerm_DeleteObject onObject: sogoObject inContext: woContext]) access |= 4; } *data = MAPILongValue (memCtx, access); return MAPISTORE_SUCCESS; } - (int) getPidTagAccessLevel: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreContext *context; MAPIStoreUserContext *userContext; WOContext *woContext; SoSecurityManager *sm; uint32_t accessLvl; context = [self context]; userContext = [self userContext]; if ([[context activeUser] isEqual: [userContext sogoUser]]) accessLvl = 1; else { sm = [SoSecurityManager sharedSecurityManager]; woContext = [userContext woContext]; if (![sm validatePermission: SoPerm_ChangeImagesAndFiles onObject: sogoObject inContext: woContext]) accessLvl = 1; else accessLvl = 0; } *data = MAPILongValue (memCtx, accessLvl); return MAPISTORE_SUCCESS; } - (int) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSData *changeKey; MAPIStoreGCSFolder *parentFolder; NSString *nameInContainer; if (isNew) rc = MAPISTORE_ERR_NOT_FOUND; else { parentFolder = (MAPIStoreGCSFolder *)[self container]; nameInContainer = [self nameInContainer]; changeKey = [parentFolder changeKeyForMessageWithKey: nameInContainer]; if (!changeKey) { [parentFolder synchroniseCache]; changeKey = [parentFolder changeKeyForMessageWithKey: nameInContainer]; } if (!changeKey) abort (); *data = [changeKey asBinaryInMemCtx: memCtx]; } return rc; } - (int) getPidTagPredecessorChangeList: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSData *changeList; MAPIStoreGCSFolder *parentFolder; if (isNew) rc = MAPISTORE_ERR_NOT_FOUND; else { parentFolder = (MAPIStoreGCSFolder *)[self container]; changeList = [parentFolder predecessorChangeListForMessageWithKey: [self nameInContainer]]; if (!changeList) { [parentFolder synchroniseCache]; changeList = [parentFolder predecessorChangeListForMessageWithKey: [self nameInContainer]]; } if (!changeList) abort (); *data = [changeList asBinaryInMemCtx: memCtx]; } return rc; } - (uint64_t) objectVersion { uint64_t version = ULLONG_MAX; NSString *changeNumber; if (!isNew) { changeNumber = [(MAPIStoreGCSFolder *) container changeNumberForMessageWithKey: [self nameInContainer]]; if (!changeNumber) { [self warnWithFormat: @"attempting to get change number" @" by synchronising folder..."]; [(MAPIStoreGCSFolder *) container synchroniseCache]; changeNumber = [(MAPIStoreGCSFolder *) container changeNumberForMessageWithKey: [self nameInContainer]]; if (changeNumber) [self logWithFormat: @"got one"]; else { [self errorWithFormat: @"still nothing. We crash!"]; abort(); } } version = [changeNumber unsignedLongLongValue] >> 16; } return version; } - (void) updateVersions { NSData *newChangeKey; newChangeKey = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)]; [(MAPIStoreGCSFolder *) container updateVersionsForMessageWithKey: [self nameInContainer] withChangeKey: newChangeKey]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreContext.m0000644000000000000000000004440712247657026016503 0ustar rootroot/* MAPIStoreContext.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. * * 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 3, 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 #import #import #import #import #import #import #import "MAPIStoreAttachment.h" // #import "MAPIStoreAttachmentTable.h" #import "MAPIStoreFallbackContext.h" #import "MAPIStoreFolder.h" #import "MAPIStoreFolderTable.h" #import "MAPIStoreMapping.h" #import "MAPIStoreMessage.h" #import "MAPIStoreMessageTable.h" #import "MAPIStoreFAIMessage.h" #import "MAPIStoreFAIMessageTable.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSArray+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreContext.h" #undef DEBUG #include #include #include #include #include #include #include #include /* TODO: homogenize method names and order of parameters */ @implementation MAPIStoreContext : NSObject /* sogo://username:password@{contacts,calendar,tasks,journal,notes,mail}/dossier/id */ static Class NSExceptionK, MAPIStoreFallbackContextK, SOGoObjectK; static NSMutableDictionary *contextClassMapping; + (void) initialize { NSArray *classes; Class currentClass; NSUInteger count, max; NSString *moduleName; NSExceptionK = [NSException class]; SOGoObjectK = [SOGoObject class]; contextClassMapping = [NSMutableDictionary new]; classes = GSObjCAllSubclassesOfClass (self); max = [classes count]; for (count = 0; count < max; count++) { currentClass = [classes objectAtIndex: count]; moduleName = [currentClass MAPIModuleName]; if (moduleName) { [contextClassMapping setObject: currentClass forKey: moduleName]; NSLog (@" registered class '%@' as handler of '%@' contexts", NSStringFromClass (currentClass), moduleName); } } MAPIStoreFallbackContextK = [MAPIStoreFallbackContext class]; } + (struct mapistore_contexts_list *) listAllContextsForUser: (NSString *) userName withTDBIndexing: (struct tdb_wrap *) indexingTdb inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *list, *current; NSArray *classes; Class currentClass; NSUInteger count, max; MAPIStoreUserContext *userContext; list = NULL; userContext = [MAPIStoreUserContext userContextWithUsername: userName andTDBIndexing: indexingTdb]; [userContext activateWithUser: [userContext sogoUser]]; classes = GSObjCAllSubclassesOfClass (self); max = [classes count]; for (count = 0; count < max; count++) { currentClass = [classes objectAtIndex: count]; current = [currentClass listContextsForUser: userName withTDBIndexing: indexingTdb inMemCtx: memCtx]; if (current) DLIST_CONCATENATE(list, current, void); } return list; } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName withTDBIndexing: (struct tdb_wrap *) indexingTdb inMemCtx: (TALLOC_CTX *) memCtx { return NULL; } static Class MAPIStoreLookupContextClassByRole (Class self, enum mapistore_context_role role) { static NSMutableDictionary *classMapping = nil; Class currentClass; enum mapistore_context_role classRole; NSNumber *roleNbr; NSArray *classes; NSUInteger count, max; if (!classMapping) { classMapping = [NSMutableDictionary new]; classes = GSObjCAllSubclassesOfClass (self); max = [classes count]; for (count = 0; count < max; count++) { currentClass = [classes objectAtIndex: count]; classRole = [currentClass MAPIContextRole]; if (classRole != -1) { roleNbr = [NSNumber numberWithUnsignedInt: classRole]; [classMapping setObject: currentClass forKey: roleNbr]; } } } roleNbr = [NSNumber numberWithUnsignedInt: role]; return [classMapping objectForKey: roleNbr]; } + (enum mapistore_error) createRootFolder: (NSString **) mapistoreUriP withFID: (uint64_t) fid andName: (NSString *) folderName forUser: (NSString *) userName withRole: (enum mapistore_context_role) role { Class contextClass; NSString *mapistoreURI; enum mapistore_error rc = MAPISTORE_SUCCESS; contextClass = MAPIStoreLookupContextClassByRole (self, role); if (!contextClass) contextClass = MAPIStoreFallbackContextK; mapistoreURI = [contextClass createRootSecondaryFolderWithFID: fid andName: folderName forUser: userName]; if (!mapistoreURI && contextClass != MAPIStoreFallbackContextK) mapistoreURI = [MAPIStoreFallbackContextK createRootSecondaryFolderWithFID: fid andName: folderName forUser: userName]; if (mapistoreURI) *mapistoreUriP = mapistoreURI; else rc = MAPISTORE_ERR_NOT_FOUND; return rc; } static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) { NSString *urlString; NSURL *completeURL; urlString = [NSString stringWithFormat: @"sogo://%@", [NSString stringWithUTF8String: uri]]; if (![urlString hasSuffix: @"/"]) urlString = [urlString stringByAppendingString: @"/"]; completeURL = [NSURL URLWithString: urlString]; return completeURL; } + (int) openContext: (MAPIStoreContext **) contextPtr withURI: (const char *) newUri connectionInfo: (struct mapistore_connection_info *) newConnInfo andTDBIndexing: (struct tdb_wrap *) indexingTdb { MAPIStoreContext *context; Class contextClass; NSString *module; NSURL *baseURL; int rc = MAPISTORE_ERR_NOT_FOUND; //NSLog (@"METHOD '%s' (%d) -- uri: '%s'", __FUNCTION__, __LINE__, newUri); context = nil; baseURL = CompleteURLFromMapistoreURI (newUri); if (baseURL) { module = [baseURL host]; if (module) { contextClass = [contextClassMapping objectForKey: module]; if (contextClass) { context = [[contextClass alloc] initFromURL: baseURL withConnectionInfo: newConnInfo andTDBIndexing: indexingTdb]; if (context) { [context autorelease]; rc = MAPISTORE_SUCCESS; *contextPtr = context; } } else NSLog (@"ERROR: unrecognized module name '%@'", module); } } else NSLog (@"ERROR: url could not be parsed"); return rc; } - (id) init { if ((self = [super init])) { activeUser = nil; userContext = nil; contextUrl = nil; containersBag = [NSMutableArray new]; } return self; } - (id) initFromURL: (NSURL *) newUrl withConnectionInfo: (struct mapistore_connection_info *) newConnInfo andTDBIndexing: (struct tdb_wrap *) indexingTdb { NSString *username; if ((self = [self init])) { ASSIGN (contextUrl, newUrl); username = [newUrl user]; if ([username length] == 0) { [self errorWithFormat: @"attempt to instantiate a context with an empty owner"]; [self release]; return nil; } ASSIGN (userContext, [MAPIStoreUserContext userContextWithUsername: username andTDBIndexing: indexingTdb]); #if 0 mapistore_mgmt_backend_register_user (newConnInfo, "SOGo", [username UTF8String]); #endif connInfo = newConnInfo; username = [NSString stringWithUTF8String: newConnInfo->username]; ASSIGN (activeUser, [SOGoUser userWithLogin: username]); if (!activeUser) { [self errorWithFormat: @"user '%@' not found in SOGo environment", username]; [self release]; return nil; } } return self; } - (void) dealloc { #if 0 mapistore_mgmt_backend_unregister_user ([self connectionInfo], "SOGo", [[userContext username] UTF8String]); #endif [contextUrl release]; [userContext release]; [containersBag release]; [super dealloc]; } - (MAPIStoreUserContext *) userContext { return userContext; } - (NSURL *) url { return contextUrl; } - (struct mapistore_connection_info *) connectionInfo { return connInfo; } - (SOGoUser *) activeUser { return activeUser; } // - (void) logRestriction: (struct mapi_SRestriction *) res // withState: (MAPIRestrictionState) state // { // NSString *resStr; // resStr = MAPIStringForRestriction (res); // [self logWithFormat: @"%@ --> %@", resStr, MAPIStringForRestrictionState (state)]; // } - (int) getPath: (char **) path ofFMID: (uint64_t) fmid inMemCtx: (TALLOC_CTX *) memCtx { int rc; NSString *objectURL, *url; // TDB_DATA key, dbuf; url = [[contextUrl absoluteString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; objectURL = [[userContext mapping] urlFromID: fmid]; if (objectURL) { if ([objectURL hasPrefix: url]) { *path = [[objectURL substringFromIndex: 7] asUnicodeInMemCtx: memCtx]; [self logWithFormat: @"found path '%s' for fmid %.16x", *path, fmid]; rc = MAPISTORE_SUCCESS; } else { [self logWithFormat: @"context (%@, %@) does not contain" @" found fmid: 0x%.16x", objectURL, url, fmid]; *path = NULL; rc = MAPISTORE_SUCCESS; } } else { [self errorWithFormat: @"%s: you should *never* get here", __PRETTY_FUNCTION__]; // /* attempt to populate our mapping dict with data from indexing.tdb */ // key.dptr = (unsigned char *) talloc_asprintf (memCtx, "0x%.16llx", // (long long unsigned int )fmid); // key.dsize = strlen ((const char *) key.dptr); // dbuf = tdb_fetch (memCtx->indexing_list->index_ctx->tdb, key); // talloc_free (key.dptr); // uri = talloc_strndup (memCtx, (const char *)dbuf.dptr, dbuf.dsize); *path = NULL; rc = MAPISTORE_SUCCESS; } return rc; } - (void) ensureContextFolder { } - (int) getRootFolder: (MAPIStoreFolder **) folderPtr withFID: (uint64_t) newFid { enum mapistore_error rc; MAPIStoreMapping *mapping; MAPIStoreFolder *baseFolder; SOGoFolder *currentFolder; WOContext *woContext; NSString *path; NSArray *pathComponents; NSUInteger count, max; mapping = [userContext mapping]; if (![mapping urlFromID: newFid]) [mapping registerURL: [contextUrl absoluteString] withID: newFid]; [userContext activateWithUser: activeUser]; woContext = [userContext woContext]; [self ensureContextFolder]; currentFolder = [self rootSOGoFolder]; [containersBag addObject: currentFolder]; /* HACK: -[NSURL path] returns unescaped strings in theory. In pratice, sometimes it does, sometimes not. Therefore we use the result of our own implementation of -[NSString stringByReplacingPercentEscapeUsingEncoding:], which returns nil if the original string contains non-ascii chars, from which we can determine whether the path was unescaped or not. */ path = [[contextUrl path] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; if (!path) path = [contextUrl path]; if ([path hasPrefix: @"/"]) path = [path substringFromIndex: 1]; if ([path hasSuffix: @"/"]) path = [path substringToIndex: [path length] - 1]; if ([path length] > 0) { pathComponents = [path componentsSeparatedByString: @"/"]; max = [pathComponents count]; for (count = 0; currentFolder && count < max; count++) { [woContext setClientObject: currentFolder]; currentFolder = [currentFolder lookupName: [pathComponents objectAtIndex: count] inContext: woContext acquire: NO]; if ([currentFolder isKindOfClass: SOGoObjectK]) /* class common to all SOGo folder types */ [containersBag addObject: currentFolder]; else currentFolder = nil; } } if (currentFolder) { baseFolder = [[self MAPIStoreFolderClass] mapiStoreObjectWithSOGoObject: currentFolder inContainer: nil]; [baseFolder setContext: self]; *folderPtr = baseFolder; rc = MAPISTORE_SUCCESS; } else if ([[userContext sogoUser] isEqual: activeUser]) rc = MAPISTORE_ERR_NOT_FOUND; else rc = MAPISTORE_ERR_DENIED; return rc; } /* utils */ - (NSString *) extractChildNameFromURL: (NSString *) objectURL andFolderURLAt: (NSString **) folderURL; { NSString *childKey; NSRange lastSlash; NSUInteger slashPtr; if ([objectURL hasSuffix: @"/"]) objectURL = [objectURL substringToIndex: [objectURL length] - 2]; lastSlash = [objectURL rangeOfString: @"/" options: NSBackwardsSearch]; if (lastSlash.location != NSNotFound) { slashPtr = NSMaxRange (lastSlash); childKey = [objectURL substringFromIndex: slashPtr]; if ([childKey length] == 0) childKey = nil; if (folderURL) *folderURL = [objectURL substringToIndex: slashPtr]; } else childKey = nil; return childKey; } - (uint64_t) idForObjectWithKey: (NSString *) key inFolderURL: (NSString *) folderURL { NSString *childURL, *owner; MAPIStoreMapping *mapping; uint64_t mappingId; uint32_t contextId; void *rootObject; if (key) childURL = [NSString stringWithFormat: @"%@%@", folderURL, [key stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; else childURL = folderURL; mapping = [userContext mapping]; mappingId = [mapping idFromURL: childURL]; if (mappingId == NSNotFound) { //[self warnWithFormat: @"no id exist yet for '%@', requesting one...", // childURL]; openchangedb_get_new_folderID (connInfo->oc_ctx, &mappingId); [mapping registerURL: childURL withID: mappingId]; contextId = 0; mapistore_search_context_by_uri (connInfo->mstore_ctx, [folderURL UTF8String], &contextId, &rootObject); owner = [userContext username]; mapistore_indexing_record_add_mid (connInfo->mstore_ctx, contextId, [owner UTF8String], mappingId); } return mappingId; } - (uint64_t) getNewChangeNumber { uint64_t newVersionNumber; if (openchangedb_get_new_changeNumber (connInfo->oc_ctx, &newVersionNumber) != MAPI_E_SUCCESS) abort (); return newVersionNumber; } - (NSArray *) getNewChangeNumbers: (uint64_t) max { TALLOC_CTX *memCtx; NSMutableArray *newChangeNumbers; uint64_t count; struct UI8Array_r *numbers; NSString *newNumber; memCtx = talloc_zero(NULL, TALLOC_CTX); newChangeNumbers = [NSMutableArray arrayWithCapacity: max]; if (openchangedb_get_new_changeNumbers (connInfo->oc_ctx, memCtx, max, &numbers) != MAPI_E_SUCCESS || numbers->cValues != max) abort (); for (count = 0; count < max; count++) { newNumber = [NSString stringWithUnsignedLongLong: numbers->lpui8[count]]; [newChangeNumbers addObject: newNumber]; } talloc_free (memCtx); return newChangeNumbers; } - (NSArray *) getNewFMIDs: (uint64_t) max { TALLOC_CTX *memCtx; NSMutableArray *newFMIDs; uint64_t count; struct UI8Array_r *numbers; NSString *newNumber; memCtx = talloc_zero(NULL, TALLOC_CTX); newFMIDs = [NSMutableArray arrayWithCapacity: max]; if (openchangedb_get_new_folderIDs (connInfo->oc_ctx, memCtx, max, &numbers) != MAPI_E_SUCCESS || numbers->cValues != max) abort (); for (count = 0; count < max; count++) { newNumber = [NSString stringWithUnsignedLongLong: numbers->lpui8[count]]; [newFMIDs addObject: newNumber]; } talloc_free (memCtx); return newFMIDs; } /* subclasses */ + (NSString *) MAPIModuleName { [self subclassResponsibility: _cmd]; return nil; } + (enum mapistore_context_role) MAPIContextRole { return -1; } + (NSString *) createRootSecondaryFolderWithFID: (uint64_t) fid andName: (NSString *) folderName forUser: (NSString *) userName { [self subclassResponsibility: _cmd]; return nil; } - (Class) MAPIStoreFolderClass { [self subclassResponsibility: _cmd]; return nil; } - (id) rootSOGoFolder { [self subclassResponsibility: _cmd]; return nil; } @end SOGo-2.1.1b/OpenChange/MAPIStoreCalendarFolder.m0000644000000000000000000001351712247657026017722 0ustar rootroot/* MAPIStoreCalendarFolder.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import #import "MAPIApplication.h" #import "MAPIStoreCalendarContext.h" #import "MAPIStoreCalendarMessage.h" #import "MAPIStoreCalendarMessageTable.h" #import "MAPIStoreUserContext.h" #import "NSString+MAPIStore.h" #import "MAPIStoreCalendarFolder.h" #include #include #include @implementation MAPIStoreCalendarFolder - (MAPIStoreMessageTable *) messageTable { [self synchroniseCache]; return [MAPIStoreCalendarMessageTable tableForContainer: self]; } - (NSString *) component { return @"vevent"; } - (MAPIStoreMessage *) createMessage { MAPIStoreMessage *newMessage; SOGoAppointmentObject *newEntry; NSString *name; //[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__]; name = [NSString stringWithFormat: @"%@.ics", [SOGoObject globallyUniqueObjectId]]; newEntry = [SOGoAppointmentObject objectWithName: name inContainer: sogoObject]; [newEntry setIsNew: YES]; /* the WOContext is required here for resolving notification pages */ [newEntry setContext: [[self userContext] woContext]]; newMessage = [MAPIStoreCalendarMessage mapiStoreObjectWithSOGoObject: newEntry inContainer: self]; return newMessage; } - (NSArray *) rolesForExchangeRights: (uint32_t) rights { NSMutableArray *roles; roles = [NSMutableArray arrayWithCapacity: 6]; if (rights & RightsCreateItems) [roles addObject: SOGoRole_ObjectCreator]; if (rights & RightsDeleteAll) [roles addObject: SOGoRole_ObjectEraser]; if (rights & RightsEditAll) { [roles addObject: SOGoCalendarRole_PublicModifier]; [roles addObject: SOGoCalendarRole_PrivateModifier]; [roles addObject: SOGoCalendarRole_ConfidentialModifier]; } else if (rights & RightsReadItems) { [roles addObject: SOGoCalendarRole_PublicViewer]; [roles addObject: SOGoCalendarRole_PrivateViewer]; [roles addObject: SOGoCalendarRole_ConfidentialViewer]; } // [self logWithFormat: @"roles for rights %.8x = (%@)", rights, roles]; return roles; } - (uint32_t) exchangeRightsForRoles: (NSArray *) roles { uint32_t rights = 0; if ([roles containsObject: SOGoRole_ObjectCreator]) rights |= RightsCreateItems; if ([roles containsObject: SOGoRole_ObjectEraser]) rights |= RightsDeleteAll; if ([roles containsObject: SOGoCalendarRole_PublicModifier] && [roles containsObject: SOGoCalendarRole_PrivateModifier] && [roles containsObject: SOGoCalendarRole_ConfidentialModifier]) rights |= RightsReadItems | RightsEditAll; else if ([roles containsObject: SOGoCalendarRole_PublicViewer] && [roles containsObject: SOGoCalendarRole_PrivateViewer] && [roles containsObject: SOGoCalendarRole_ConfidentialViewer]) rights |= RightsReadItems | 0x1800; if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ // [self logWithFormat: @"rights for roles (%@) = %.8x", roles, rights]; return rights; } - (BOOL) subscriberCanReadMessages { static NSArray *viewerRoles = nil; if (!viewerRoles) viewerRoles = [[NSArray alloc] initWithObjects: SOGoCalendarRole_PublicViewer, SOGoCalendarRole_PublicDAndTViewer, SOGoCalendarRole_PrivateViewer, SOGoCalendarRole_PrivateDAndTViewer, SOGoCalendarRole_ConfidentialViewer, SOGoCalendarRole_ConfidentialDAndTViewer, nil]; return ([[self activeUserRoles] firstObjectCommonWithArray: viewerRoles] != nil); } - (BOOL) subscriberCanModifyMessages { static NSArray *modifierRoles = nil; if (!modifierRoles) modifierRoles = [[NSArray alloc] initWithObjects: SOGoCalendarRole_PublicModifier, SOGoCalendarRole_PrivateModifier, SOGoCalendarRole_ConfidentialModifier, nil]; return ([[self activeUserRoles] firstObjectCommonWithArray: modifierRoles] != nil); } - (EOQualifier *) aclQualifier { return [EOQualifier qualifierWithQualifierFormat: [(SOGoAppointmentFolder *) sogoObject aclSQLListingFilter]]; } - (int) getPidTagDefaultPostMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Appointment" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } @end SOGo-2.1.1b/OpenChange/SOGoMAPIDBObject.h0000644000000000000000000000434212247657026016173 0ustar rootroot/* SOGoMAPIDBObject.h - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 3, 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 SOGOMAPIDBOBJECT_H #define SOGOMAPIDBOBJECT_H #import "SOGoMAPIObject.h" @class NSArray; @class NSMutableDictionary; @class NSMutableString; @class NSString; @class NSURL; @class EOAdaptor; typedef enum { MAPIDBObjectTypeFolder = 1, MAPIDBObjectTypeMessage = 2, MAPIDBObjectTypeFAI = 3, MAPIDBObjectTypeInternal = 99 /* object = property list */ } MAPIDBObjectType; @interface SOGoMAPIDBObject : SOGoMAPIObject { NSURL *tableUrl; BOOL initialized; /* safe guard */ MAPIDBObjectType objectType; NSInteger version; BOOL deleted; } /* actions */ - (void) setupFromRecord: (NSDictionary *) record; - (void) reloadIfNeeded; - (void) save; /* accessors */ - (NSMutableString *) path; /* full filename */ - (void) setTableUrl: (NSURL *) newTableUrl; - (NSURL *) tableUrl; - (NSString *) tableName; - (NSArray *) performSQLQuery: (NSString *) sql; - (NSDictionary *) lookupRecord: (NSString *) path newerThanVersion: (NSInteger) startVersion; - (void) setObjectType: (MAPIDBObjectType) newObjectType; - (MAPIDBObjectType) objectType; /* message, fai, folder */ /* automatically set from actions */ - (BOOL) deleted; - (void) changePathTo: (NSString *) newPath; /* db helpers */ - (EOAdaptor *) tableChannelAdaptor; - (NSArray *) performSQLQuery: (NSString *) sql; - (BOOL) performBatchSQLQueries: (NSArray *) queries; @end #endif /* SOGOMAPIDBOBJECT_H */ SOGo-2.1.1b/OpenChange/MAPIStoreContactsAttachment.m0000644000000000000000000001141312247657026020635 0ustar rootroot/* MAPIStoreContactsAttachment.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import "MAPIStoreTypes.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" #import "MAPIStoreContactsAttachment.h" #include /* TODO: handle URL pictures via PidTagAttachMethod = ref ? */ @implementation MAPIStoreContactsAttachment - (id) init { if ((self = [super init])) { photo = nil; photoData = nil; } return self; } - (void) dealloc { [photo release]; [photoData release]; [super dealloc]; } - (void) setPhoto: (NGVCardPhoto *) newPhoto { ASSIGN (photo, newPhoto); } - (NSString *) fileExtension { NSString *type, *extension; type = [photo type]; if ([type isEqualToString: @"JPEG"] || [type isEqualToString: @"JPG"]) extension = @".jpg"; else if ([type isEqualToString: @"PNG"]) extension = @".png"; else if ([type isEqualToString: @"BMP"]) extension = @".bmp"; else if ([type isEqualToString: @"GIF"]) extension = @".gif"; else extension = nil; return extension; } - (NSDate *) creationTime { return [container creationTime]; } - (NSDate *) lastModificationTime { return [container lastModificationTime]; } - (int) getPidTagAttachEncoding: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; { *data = [[NSData data] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttachFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidTagAttachmentFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidTagAttachmentHidden: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } - (int) getPidTagAttachmentLinkId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidTagAttachMethod: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000001); return MAPISTORE_SUCCESS; } - (int) getPidTagAttachmentContactPhoto: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } - (int) getPidTagAttachDataBinary: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!photoData) ASSIGN (photoData, [[photo flattenedValuesForKey: @""] dataByDecodingBase64]); *data = [photoData asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttachSize: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!photoData) ASSIGN (photoData, [[photo flattenedValuesForKey: @""] dataByDecodingBase64]); *data = MAPILongValue (memCtx, [photoData length]); return MAPISTORE_SUCCESS; } - (int) getPidTagAttachExtension: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self fileExtension] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttachLongFilename: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *filename; filename = [NSString stringWithFormat: @"ContactPhoto%@", [self fileExtension]]; *data = [filename asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } - (int) getPidTagAttachFilename: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagAttachLongFilename: data inMemCtx: memCtx]; } - (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagAttachLongFilename: data inMemCtx: memCtx]; } @end SOGo-2.1.1b/OpenChange/MAPIStoreDBFolderTable.m0000644000000000000000000000221512247657026017437 0ustar rootroot/* MAPIStoreDBFolderTable.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 3, 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 "MAPIStoreTypes.h" #import "MAPIStoreDBFolderTable.h" @implementation MAPIStoreDBFolderTable - (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property { return [NSString stringWithFormat: @"%@", MAPIPropertyKey (property)]; } @end SOGo-2.1.1b/OpenChange/code-MAPIStorePropertySelectors.m0000644000000000000000000000463312247657026021474 0ustar rootroot/* code-MAPIStorePropertySelectors.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #undef DEBUG #include const MAPIStorePropertyGetter * MAPIStorePropertyGettersForClass (Class klass) { static NSMapTable *classesTable = nil; MAPIStorePropertyGetter *getters; MAPIStorePropertyGetter getter; uint16_t count, idx; SEL currentSel; if (!classesTable) classesTable = NSCreateMapTable (NSNonOwnedPointerMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); getters = NSMapGet (classesTable, klass); if (!getters) { getters = NSZoneCalloc (NULL, 65536, sizeof (MAPIStorePropertyGetter)); NSMapInsert (classesTable, klass, getters); for (count = 0; count < 65535; count++) { idx = MAPIStorePropertyGettersIdx[count]; if (idx != 0xffff && !getters[count]) { currentSel = MAPIStorePropertyGetterSelectors[idx]; if ([klass instancesRespondToSelector: currentSel]) { getter = (MAPIStorePropertyGetter) [klass instanceMethodForSelector: currentSel]; if (getter) getters[count] = getter; } } } } return getters; } SEL MAPIStoreSelectorForPropertyGetter (uint16_t propertyId) { return ((MAPIStorePropertyGettersIdx[propertyId] != 0xffff) ? MAPIStorePropertyGetterSelectors[MAPIStorePropertyGettersIdx[propertyId]] : NULL); } SOGo-2.1.1b/OpenChange/MAPIStoreSamDBUtils.m0000644000000000000000000001146112247657026017020 0ustar rootroot/* MAPIStoreSamDBUtils.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 #include #include #import "NSData+MAPIStore.h" #import "MAPIStoreSamDBUtils.h" NSString * MAPIStoreSamDBUserAttribute (struct ldb_context *samCtx, NSString *userKey, NSString *value, NSString *attributeName) { NSString *resultValue = nil; const char *attrs[] = { "", NULL }; NSString *searchFormat; const char *result; struct ldb_result *res = NULL; TALLOC_CTX *memCtx; int ret; memCtx = talloc_zero(NULL, TALLOC_CTX); attrs[0] = [attributeName UTF8String]; searchFormat = [NSString stringWithFormat: @"(&(objectClass=user)(%@=%%s))", userKey]; ret = ldb_search (samCtx, memCtx, &res, ldb_get_default_basedn(samCtx), LDB_SCOPE_SUBTREE, attrs, [searchFormat UTF8String], [value UTF8String]); if (ret == LDB_SUCCESS && res->count == 1) { result = ldb_msg_find_attr_as_string (res->msgs[0], attrs[0], NULL); if (result) resultValue = [NSString stringWithUTF8String: result]; } talloc_free (memCtx); return resultValue; } NSData * MAPIStoreInternalEntryId (struct ldb_context *samCtx, NSString *username) { static const uint8_t const providerUid[] = { 0xdc, 0xa7, 0x40, 0xc8, 0xc0, 0x42, 0x10, 0x1a, 0xb4, 0xb9, 0x08, 0x00, 0x2b, 0x2f, 0xe1, 0x82 }; NSMutableData *entryId; NSData *legacyDNData; NSString *legacyDN; /* structure: flags: 32 provideruid: 32 * 4 version: 32 type: 32 X500DN: variable */ legacyDN = MAPIStoreSamDBUserAttribute (samCtx, @"sAMAccountName", username, @"legacyExchangeDN"); if (legacyDN) { entryId = [NSMutableData dataWithCapacity: 256]; [entryId appendUInt32: 0]; // flags [entryId appendBytes: providerUid length: 16]; // provideruid [entryId appendUInt32: 1]; // version [entryId appendUInt32: 0]; // type (local mail user) legacyDNData = [legacyDN dataUsingEncoding: NSASCIIStringEncoding]; [entryId appendData: legacyDNData]; // x500dn [entryId appendUInt8: 0]; // end of string } else entryId = nil; return entryId; } NSData * MAPIStoreExternalEntryId (NSString *cn, NSString *email) { NSMutableData *entryId; static uint8_t providerUid[] = { 0x81, 0x2b, 0x1f, 0xa4, 0xbe, 0xa3, 0x10, 0x19, 0x9d, 0x6e, 0x00, 0xdd, 0x01, 0x0f, 0x54, 0x02 }; uint8_t flags21, flags22; /* structure: flags: 32 provideruid: 32 * 4 version: 16 { PaD: 1 MAE: 2 Format: 4 M: 1 U: 1 R: 2 L: 1 Pad: 4 } DisplayName: variable AddressType: variable EmailAddress: variable */ entryId = [NSMutableData dataWithCapacity: 256]; [entryId appendUInt32: 0]; // flags [entryId appendBytes: providerUid length: 16]; // provideruid [entryId appendUInt16: 0]; // version flags21 = 0; /* PaD, MAE, R, Pad = 0 */ flags21 |= 0x16; /* Format: text and HTML */ flags21 |= 0x01; /* M: mime format */ flags22 = 0x90; /* U: unicode, L: no lookup */ [entryId appendUInt8: flags21]; [entryId appendUInt8: flags22]; /* DisplayName */ if (!cn) cn = @""; [entryId appendData: [cn dataUsingEncoding: NSUTF16LittleEndianStringEncoding]]; [entryId appendUInt16: 0]; /* AddressType */ [entryId appendData: [@"SMTP" dataUsingEncoding: NSUTF16LittleEndianStringEncoding]]; [entryId appendUInt16: 0]; /* EMailAddress */ if (!email) email = @""; [entryId appendData: [email dataUsingEncoding: NSUTF16LittleEndianStringEncoding]]; [entryId appendUInt16: 0]; return entryId; } SOGo-2.1.1b/OpenChange/MAPIStoreRecurrenceUtils.m0000644000000000000000000004056012247657026020171 0ustar rootroot/* MAPIStoreRecurrenceUtils.m - this file is part of SOGo * * Copyright (C) 2011-2012 Inverse inc * * 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 3, 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 #import #import #import #import #import #import #import #import #import #import "NSDate+MAPIStore.h" #import "MAPIStoreRecurrenceUtils.h" #import "MAPIStoreTypes.h" #include #include #include #include @implementation iCalCalendar (MAPIStoreRecurrence) - (void) setupRecurrenceWithMasterEntity: (iCalRepeatableEntityObject *) entity fromRecurrencePattern: (struct RecurrencePattern *) rp { NSCalendarDate *startDate, *olEndDate, *untilDate, *exDate; NSString *monthDay, *month; NSMutableSet *exceptionDates; NSArray *realExDates; iCalRecurrenceRule *rule; iCalByDayMask *byDayMask; iCalWeekOccurrence weekOccurrence; iCalWeekOccurrences dayMaskDays; NSUInteger count, max; NSInteger bySetPos; unsigned char maskValue; [entity removeAllRecurrenceRules]; [entity removeAllExceptionRules]; [entity removeAllExceptionDates]; rule = [iCalRecurrenceRule elementWithTag: @"rrule"]; [entity addToRecurrenceRules: rule]; startDate = [entity startDate]; // DEBUG(5, ("From client:\n")); // NDR_PRINT_DEBUG(AppointmentRecurrencePattern, pattern); memset (&dayMaskDays, 0, sizeof (iCalWeekOccurrences)); if (rp->PatternType == PatternType_Day) { [rule setFrequency: iCalRecurrenceFrequenceDaily]; [rule setRepeatInterval: rp->Period / SOGoMinutesPerDay]; } else if (rp->PatternType == PatternType_Week) { [rule setFrequency: iCalRecurrenceFrequenceWeekly]; [rule setRepeatInterval: rp->Period]; /* MAPI values for days are the same as in NGCards */ for (count = 0; count < 7; count++) { maskValue = 1 << count; if ((rp->PatternTypeSpecific.WeekRecurrencePattern & maskValue)) dayMaskDays[count] = iCalWeekOccurrenceAll; } byDayMask = [iCalByDayMask byDayMaskWithDays: dayMaskDays]; [rule setByDayMask: byDayMask]; } else { if (rp->RecurFrequency == RecurFrequency_Monthly) { [rule setFrequency: iCalRecurrenceFrequenceMonthly]; [rule setRepeatInterval: rp->Period]; } else if (rp->RecurFrequency == RecurFrequency_Yearly) { [rule setFrequency: iCalRecurrenceFrequenceYearly]; [rule setRepeatInterval: rp->Period / 12]; month = [NSString stringWithFormat: @"%d", [startDate monthOfYear]]; [rule setSingleValue: month forKey: @"bymonth"]; } else [self errorWithFormat: @"unhandled frequency case for Month pattern type: %d", rp->RecurFrequency]; if ((rp->PatternType & 3) == 3) { /* HjMonthNth and MonthNth */ if (rp->PatternTypeSpecific.MonthRecurrencePattern.WeekRecurrencePattern == 0x7f) { /* firsts or last day of month */ if (rp->PatternTypeSpecific.MonthRecurrencePattern.N == RecurrenceN_Last) monthDay = @"-1"; else monthDay = [NSString stringWithFormat: @"%d", rp->PatternTypeSpecific.MonthRecurrencePattern.N]; [rule setSingleValue: monthDay forKey: @"bymonthday"]; } else if ((rp->PatternTypeSpecific.MonthRecurrencePattern.WeekRecurrencePattern == 0x3e) /* Nth week day */ || (rp->PatternTypeSpecific.MonthRecurrencePattern.WeekRecurrencePattern == 0x41)) /* Nth week-end day */ { for (count = 0; count < 7; count++) { maskValue = 1 << count; if ((rp->PatternTypeSpecific.MonthRecurrencePattern.WeekRecurrencePattern & maskValue)) dayMaskDays[count] = iCalWeekOccurrenceAll; } byDayMask = [iCalByDayMask byDayMaskWithDays: dayMaskDays]; [rule setByDayMask: byDayMask]; if (rp->PatternTypeSpecific.MonthRecurrencePattern.N == RecurrenceN_Last) bySetPos = -1; else bySetPos = rp->PatternTypeSpecific.MonthRecurrencePattern.N; [rule setSingleValue: [NSString stringWithFormat: @"%d", bySetPos] forKey: @"bysetpos"]; } else { if (rp->PatternTypeSpecific.MonthRecurrencePattern.N < RecurrenceN_Last) weekOccurrence = (1 << (rp->PatternTypeSpecific.MonthRecurrencePattern.N - 1)); else weekOccurrence = iCalWeekOccurrenceLast; for (count = 0; count < 7; count++) { maskValue = 1 << count; if ((rp->PatternTypeSpecific.MonthRecurrencePattern.WeekRecurrencePattern & maskValue)) dayMaskDays[count] = weekOccurrence; } byDayMask = [iCalByDayMask byDayMaskWithDays: dayMaskDays]; [rule setByDayMask: byDayMask]; } } else if ((rp->PatternType & 2) == 2 || (rp->PatternType & 4) == 4) { /* MonthEnd, HjMonth and HjMonthEnd */ [rule setSingleValue: [NSString stringWithFormat: @"%d", rp->PatternTypeSpecific.Day] forKey: @"bymonthday"]; } else [self errorWithFormat: @"invalid value for PatternType: %.4x", rp->PatternType]; } switch (rp->EndType) { case END_NEVER_END: case NEVER_END: break; case END_AFTER_N_OCCURRENCES: [rule setRepeatCount: rp->OccurrenceCount]; break; case END_AFTER_DATE: olEndDate = [NSCalendarDate dateFromMinutesSince1601: rp->EndDate]; untilDate = [NSCalendarDate dateWithYear: [olEndDate yearOfCommonEra] month: [olEndDate monthOfYear] day: [olEndDate dayOfMonth] hour: [startDate hourOfDay] minute: [startDate minuteOfHour] second: [startDate secondOfMinute] timeZone: [startDate timeZone]]; [rule setUntilDate: untilDate]; break; default: [self errorWithFormat: @"invalid value for EndType: %.4x", rp->EndType]; } /* exception dates: - take all deleted instances - remove all modified instances from the above set - add remaining instances, in chronological order */ exceptionDates = [NSMutableSet set]; for (count = 0; count < rp->DeletedInstanceCount; count++) { exDate = [NSDate dateFromMinutesSince1601: rp->DeletedInstanceDates[count]]; exDate = [exDate hour: [startDate hourOfDay] minute: [startDate minuteOfHour] second: [startDate secondOfMinute]]; [exceptionDates addObject: exDate]; } for (count = 0; count < rp->ModifiedInstanceCount; count++) { exDate = [NSDate dateFromMinutesSince1601: rp->ModifiedInstanceDates[count]]; exDate = [exDate hour: [startDate hourOfDay] minute: [startDate minuteOfHour] second: [startDate secondOfMinute]]; [exceptionDates removeObject: exDate]; } realExDates = [[exceptionDates allObjects] sortedArrayUsingSelector: @selector (compare:)]; max = [realExDates count]; for (count = 0; count < max; count++) [entity addToExceptionDates: [realExDates objectAtIndex: count]]; } @end @implementation iCalRecurrenceRule (MAPIStoreRecurrence) - (void) fillRecurrencePattern: (struct RecurrencePattern *) rp withEvent: (iCalEvent *) event inTimeZone: (NSTimeZone *) timeZone inMemCtx: (TALLOC_CTX *) memCtx { iCalRecurrenceFrequency freq; iCalByDayMask *byDayMask; NSString *byMonthDay, *bySetPos; NSCalendarDate *startDate, *endDate, *untilDate, *beginOfWeek, *minimumDate, *moduloDate, *midnight; iCalWeekOccurrences *days; NSInteger dayOfWeek, repeatInterval, repeatCount, count, firstOccurrence, max; uint32_t nbrMonths, mask; NSArray *events; NSMutableArray *deletedDates, *modifiedDates; startDate = [event firstRecurrenceStartDate]; [startDate setTimeZone: timeZone]; endDate = [event lastPossibleRecurrenceStartDate]; [endDate setTimeZone: timeZone]; rp->ReaderVersion = 0x3004; rp->WriterVersion = 0x3004; rp->StartDate = [[startDate beginOfDay] asMinutesSince1601]; untilDate = [self untilDate]; if (untilDate) { rp->EndDate = [untilDate asMinutesSince1601]; rp->EndType = END_AFTER_DATE; } else { repeatCount = [self repeatCount]; if (repeatCount > 0) { rp->EndDate = [endDate asMinutesSince1601]; rp->OccurrenceCount = repeatCount; rp->EndType = END_AFTER_N_OCCURRENCES; } else { rp->EndDate = 0x5ae980df; rp->OccurrenceCount = 0xa; rp->EndType = END_NEVER_END; } } freq = [self frequency]; repeatInterval = [self repeatInterval]; if (freq == iCalRecurrenceFrequenceDaily) { rp->RecurFrequency = RecurFrequency_Daily; rp->PatternType = PatternType_Day; rp->Period = repeatInterval * SOGoMinutesPerDay; rp->FirstDateTime = rp->StartDate % rp->Period; } else if (freq == iCalRecurrenceFrequenceWeekly) { rp->RecurFrequency = RecurFrequency_Weekly; rp->PatternType = PatternType_Week; rp->Period = repeatInterval; mask = 0; byDayMask = [self byDayMask]; for (count = 0; count < 7; count++) if ([byDayMask occursOnDay: count]) mask |= 1 << count; rp->PatternTypeSpecific.WeekRecurrencePattern = mask; /* FirstDateTime */ dayOfWeek = [startDate dayOfWeek]; if (dayOfWeek) beginOfWeek = [startDate dateByAddingYears: 0 months: 0 days: -dayOfWeek hours: 0 minutes: 0 seconds: 0]; else beginOfWeek = startDate; rp->FirstDateTime = ([[beginOfWeek beginOfDay] asMinutesSince1601] % (repeatInterval * 10080)); } else { if (freq == iCalRecurrenceFrequenceMonthly) { rp->RecurFrequency = RecurFrequency_Monthly; rp->Period = repeatInterval; } else if (freq == iCalRecurrenceFrequenceYearly) { rp->RecurFrequency = RecurFrequency_Yearly; rp->Period = 12; if (repeatInterval != 1) [self errorWithFormat: @"yearly interval '%d' cannot be converted", repeatInterval]; } else [self errorWithFormat: @"frequency '%d' cannot be converted", freq]; /* FirstDateTime */ midnight = [[startDate firstDayOfMonth] beginOfDay]; minimumDate = [NSCalendarDate dateFromMinutesSince1601: 0]; nbrMonths = (([midnight yearOfCommonEra] - [minimumDate yearOfCommonEra]) * 12 + [midnight monthOfYear] - 1); moduloDate = [minimumDate dateByAddingYears: 0 months: (nbrMonths % rp->Period) days: 0 hours: 0 minutes: 0 seconds: 0]; rp->FirstDateTime = [moduloDate asMinutesSince1601]; byMonthDay = [[self byMonthDay] objectAtIndex: 0]; if (!byMonthDay && (freq == iCalRecurrenceFrequenceYearly)) { byMonthDay = [NSString stringWithFormat: @"%d", [startDate dayOfMonth]]; [self warnWithFormat: @"no month day specified in yearly" @" recurrence: we deduce it from the start date: %@", byMonthDay]; } if (byMonthDay) { if ([byMonthDay intValue] < 0) { /* This means we cannot handle values of BYMONTHDAY that are < -7. */ rp->PatternType = PatternType_MonthNth; rp->PatternTypeSpecific.MonthRecurrencePattern.WeekRecurrencePattern = 0x7f; rp->PatternTypeSpecific.MonthRecurrencePattern.N = RecurrenceN_Last; } else { rp->PatternType = PatternType_Month; rp->PatternTypeSpecific.Day = [byMonthDay intValue]; } } else { rp->PatternType = PatternType_MonthNth; byDayMask = [self byDayMask]; mask = 0; days = [byDayMask weekDayOccurrences]; if (days) { for (count = 0; count < 7; count++) if (days[0][count]) mask |= 1 << count; } if (mask) { rp->PatternTypeSpecific.MonthRecurrencePattern.WeekRecurrencePattern = mask; bySetPos = [self flattenedValuesForKey: @"bysetpos"]; if ([bySetPos length]) rp->PatternTypeSpecific.MonthRecurrencePattern.N = ([bySetPos hasPrefix: @"-"] ? RecurrenceN_Last : [bySetPos intValue]); else { firstOccurrence = [byDayMask firstOccurrence]; if (firstOccurrence) rp->PatternTypeSpecific.MonthRecurrencePattern.N = ((firstOccurrence > -1) ? firstOccurrence : RecurrenceN_Last); } } else [self errorWithFormat: @"rule for an event that never occurs"]; } } events = [[event parent] events]; max = [events count]; modifiedDates = [NSMutableArray arrayWithCapacity: max]; for (count = 1; count < max; count++) { startDate = [[events objectAtIndex: count] recurrenceId]; if (startDate) [modifiedDates addObject: startDate]; else [self errorWithFormat: @"missing recurrence-id for event %d", count]; } max = [modifiedDates count]; rp->ModifiedInstanceCount = max; rp->ModifiedInstanceDates = talloc_array (memCtx, uint32_t, max); for (count = 0; count < max; count++) { startDate = [[modifiedDates objectAtIndex: count] hour: 0 minute: 0 second: 0]; *(rp->ModifiedInstanceDates + count) = [startDate asMinutesSince1601]; } deletedDates = [modifiedDates mutableCopy]; [deletedDates autorelease]; [deletedDates addObjectsFromArray: [event exceptionDatesWithTimeZone: utcTZ]]; [deletedDates sortUsingFunction: NSDateCompare context: NULL]; max = [deletedDates count]; rp->DeletedInstanceCount = max; rp->DeletedInstanceDates = talloc_array (memCtx, uint32_t, max); for (count = 0; count < max; count++) { startDate = [[deletedDates objectAtIndex: count] hour: 0 minute: 0 second: 0]; *(rp->DeletedInstanceDates + count) = [startDate asMinutesSince1601]; } } @end SOGo-2.1.1b/UI/0000755000000000000000000000000012247657030011505 5ustar rootrootSOGo-2.1.1b/UI/GNUmakefile0000644000000000000000000000052412247657027013566 0ustar rootroot# GNUstep makefile -include ../config.make include $(GNUSTEP_MAKEFILES)/common.make SUBPROJECTS += \ SOGoUI \ SOGoElements \ Common \ Contacts \ MailPartViewers \ MailerUI \ MainUI \ PreferencesUI \ Scheduler \ AdministrationUI \ Templates \ WebServerResources include $(GNUSTEP_MAKEFILES)/aggregate.make SOGo-2.1.1b/UI/MailerUI/0000755000000000000000000000000012247657027013162 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/UIxMailAccountActions.m0000644000000000000000000002442612247657027017516 0ustar rootroot/* UIxMailAccountActions.m - this file is part of SOGo * * Copyright (C) 2007-2013 Inverse inc. * * Author: Wolfgang Sourdeau * Ludovic Marcotte * * 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "../Common/WODirectAction+SOGo.h" #import "UIxMailAccountActions.h" @implementation UIxMailAccountActions - (id) init { if ((self = [super init])) { inboxFolderName = nil; draftsFolderName = nil; sentFolderName = nil; trashFolderName = nil; otherUsersFolderName = nil; sharedFoldersName = nil; } return self; } - (void) dealloc { [inboxFolderName release]; [draftsFolderName release]; [sentFolderName release]; [trashFolderName release]; [otherUsersFolderName release]; [sharedFoldersName release]; [super dealloc]; } - (NSString *) _folderType: (NSString *) folderName { NSString *folderType; SOGoMailAccount *co; NSArray *specialFolders; if (!inboxFolderName) { co = [self clientObject]; specialFolders = [[NSArray arrayWithObjects: [co inboxFolderNameInContext: context], [co draftsFolderNameInContext: context], [co sentFolderNameInContext: context], [co trashFolderNameInContext: context], [co otherUsersFolderNameInContext: context], [co sharedFoldersNameInContext: context], nil] stringsWithFormat: @"/%@"]; ASSIGN(inboxFolderName, [specialFolders objectAtIndex: 0]); ASSIGN(draftsFolderName, [specialFolders objectAtIndex: 1]); ASSIGN(sentFolderName, [specialFolders objectAtIndex: 2]); ASSIGN(trashFolderName, [specialFolders objectAtIndex: 3]); if ([specialFolders count] > 4) ASSIGN(otherUsersFolderName, [specialFolders objectAtIndex: 4]); if ([specialFolders count] > 5) ASSIGN(sharedFoldersName, [specialFolders objectAtIndex: 5]); } if ([folderName isEqualToString: inboxFolderName]) folderType = @"inbox"; else if ([folderName isEqualToString: draftsFolderName]) folderType = @"draft"; else if ([folderName isEqualToString: sentFolderName]) folderType = @"sent"; else if ([folderName isEqualToString: trashFolderName]) folderType = @"trash"; else if ([folderName hasPrefix: [NSString stringWithFormat: @"%@/", draftsFolderName]]) folderType = @"draft/folder"; else if ([folderName hasPrefix: [NSString stringWithFormat: @"%@/", sentFolderName]]) folderType = @"sent/folder"; else folderType = @"folder"; return folderType; } - (NSArray *) _jsonFolders: (NSEnumerator *) rawFolders { NSString *currentFolder, *currentDecodedFolder, *currentDisplayName, *currentFolderType, *login, *fullName; NSMutableArray *pathComponents; SOGoUserManager *userManager; NSDictionary *folderData; NSMutableArray *folders; NSAutoreleasePool *pool; folders = [NSMutableArray array]; while ((currentFolder = [rawFolders nextObject])) { // Using a local pool to avoid using too many file descriptors. This could // happen with tons of mailboxes under "Other Users" as LDAP connections // are never reused and "autoreleased" at the end. This loop would consume // lots of LDAP connections during its execution. pool = [[NSAutoreleasePool alloc] init]; currentDecodedFolder = [currentFolder stringByDecodingImap4FolderName]; currentFolderType = [self _folderType: currentFolder]; // We translate the "Other Users" and "Shared Folders" namespaces. // While we're at it, we also translate the user's mailbox names // to the full name of the person. if (otherUsersFolderName && [currentDecodedFolder hasPrefix: otherUsersFolderName]) { // We have a string like /Other Users/lmarcotte/... under Cyrus, but we could // also have something like /shared under Dovecot. So we swap the username only // if we have one, of course. pathComponents = [NSMutableArray arrayWithArray: [currentDecodedFolder pathComponents]]; if ([pathComponents count] > 2) { login = [pathComponents objectAtIndex: 2]; userManager = [SOGoUserManager sharedUserManager]; fullName = [userManager getCNForUID: login]; [pathComponents removeObjectsInRange: NSMakeRange(0,3)]; currentDisplayName = [NSString stringWithFormat: @"/%@/%@/%@", [self labelForKey: @"OtherUsersFolderName"], (fullName != nil ? fullName : login), [pathComponents componentsJoinedByString: @"/"]]; } else { currentDisplayName = [NSString stringWithFormat: @"/%@%@", [self labelForKey: @"OtherUsersFolderName"], [currentDecodedFolder substringFromIndex: [otherUsersFolderName length]]]; } } else if (sharedFoldersName && [currentDecodedFolder hasPrefix: sharedFoldersName]) currentDisplayName = [NSString stringWithFormat: @"/%@%@", [self labelForKey: @"SharedFoldersName"], [currentDecodedFolder substringFromIndex: [sharedFoldersName length]]]; else currentDisplayName = currentDecodedFolder; folderData = [NSDictionary dictionaryWithObjectsAndKeys: currentFolder, @"path", currentFolderType, @"type", currentDisplayName, @"displayName", nil]; [folders addObject: folderData]; [pool release]; } return folders; } - (WOResponse *) listMailboxesAction { SOGoMailAccount *co; NSEnumerator *rawFolders; NSArray *folders; NSDictionary *data; WOResponse *response; co = [self clientObject]; rawFolders = [[co allFolderPaths] objectEnumerator]; folders = [self _jsonFolders: rawFolders]; data = [NSDictionary dictionaryWithObjectsAndKeys: folders, @"mailboxes", nil]; response = [self responseWithStatus: 200 andString: [data jsonRepresentation]]; [response setHeader: @"application/json" forKey: @"content-type"]; return response; } /* compose */ - (WOResponse *) composeAction { NSString *urlBase, *url, *value, *signature, *nl; SOGoDraftObject *newDraftMessage; NSMutableDictionary *headers; SOGoDraftsFolder *drafts; id mailTo; BOOL save; drafts = [[self clientObject] draftsFolderInContext: context]; newDraftMessage = [drafts newDraft]; headers = [NSMutableDictionary dictionary]; save = NO; value = [[self request] formValueForKey: @"mailto"]; if ([value length] > 0) { mailTo = [[value stringByUnescapingURL] objectFromJSONString]; if (mailTo && [mailTo isKindOfClass: [NSArray class]]) { [headers setObject: (NSArray *) mailTo forKey: @"to"]; save = YES; } } value = [[self request] formValueForKey: @"subject"]; if ([value length] > 0) { [headers setObject: [value stringByUnescapingURL] forKey: @"subject"]; save = YES; } if (save) [newDraftMessage setHeaders: headers]; signature = [[self clientObject] signature]; if ([signature length]) { nl = ([[[[context activeUser] userDefaults] mailComposeMessageType] isEqualToString: @"html"] ? @"
" : @"\n"); [newDraftMessage setText: [NSString stringWithFormat: @"%@%@-- %@%@", nl, nl, nl, signature]]; save = YES; } if (save) [newDraftMessage storeInfo]; urlBase = [newDraftMessage baseURLInContext: context]; url = [urlBase composeURLWithAction: @"edit" parameters: nil andHash: NO]; return [self redirectToLocation: url]; } - (WOResponse *) _performDelegationAction: (SEL) action { SOGoMailAccount *co; WOResponse *response; NSString *uid; co = [self clientObject]; if ([[co nameInContainer] isEqualToString: @"0"]) { uid = [[context request] formValueForKey: @"uid"]; if ([uid length] > 0) { [co performSelector: action withObject: [NSArray arrayWithObject: uid]]; response = [self responseWith204]; } else response = [self responseWithStatus: 500 andString: @"Missing 'uid' parameter."]; } else response = [self responseWithStatus: 403 andString: @"This action cannot be performed on secondary accounts."]; return response; } - (WOResponse *) addDelegateAction { return [self _performDelegationAction: @selector (addDelegates:)]; } - (WOResponse *) removeDelegateAction { return [self _performDelegationAction: @selector (removeDelegates:)]; } @end SOGo-2.1.1b/UI/MailerUI/German.lproj/0000755000000000000000000000000012247657027015520 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/German.lproj/Localizable.strings0000644000000000000000000002515212247657027021361 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Erstellen"; "Empty Trash" = "Papierkorb leeren"; "Delete" = "Löschen"; "Expunge" = "Expunge"; "Forward" = "Weiterleiten"; "Get Mail" = "Abrufen"; "Junk" = "Junk"; "Reply" = "Antworten"; "Reply All" = "Allen Antworten"; "Print" = "Drucken"; "Stop" = "Stopp"; "Write" = "Verfassen"; "Send" = "Senden"; "Contacts" = "Kontakte"; "Attach" = "Anhang"; "Save" = "Speichern"; "Options" = "Optionen"; "Close" = "Schließen"; "Size" = "Größe"; /* Tooltips */ "Send this message now" = "Diese Nachricht jetzt senden"; "Select a recipient from an Address Book" = "Einen Empfänger aus einem Adressbuch wählen"; "Include an attachment" = "Datei-Anhang hinzufügen"; "Save this message" = "Diese Nachricht speichern"; "Get new messages" = "Neue Nachrichten empfangen"; "Create a new message" = "Eine neue Nachricht schreiben"; "Go to address book" = "Adressbuch öffnen"; "Reply to the message" = "Auf gewählte Nachricht(en) antworten"; "Reply to sender and all recipients" = "Auf gewählte Nachricht(en) an den Absender und alle Empfänger antworten"; "Forward selected message" = "Gewählte Nachricht(en) weiterleiten"; "Delete selected message or folder" = "Gewählte Nachricht(en) oder Ordner löschen"; "Mark the selected messages as junk" = "Gewählte Nachricht(en) als Junk einstufen"; "Print this message" = "Gewählte Nachricht drucken"; "Stop the current transfer" = "Derzeitige Übertragung stoppen"; "Attachment" = "Anhang"; "Unread" = "Ungelesene"; "Flagged" = "Markiert"; /* Main Frame */ "Home" = "Anfang"; "Calendar" = "Kalender"; "Addressbook" = "Adressbuch"; "Mail" = "E-Mail"; "Right Administration" = "Rechteverwaltung"; "Help" = "Hilfe"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Willkommen zum SOGo Mailer. Verwenden Sie den Ordnerbaum auf der linken Seite, um in Ihrem E-Mail-Konto zu stöbern!"; "Read messages" = "Nachrichten lesen"; "Write a new message" = "Eine neue Nachricht schreiben"; "Share: " = "Benutzerrechte: "; "Account: " = "Konto: "; "Shared Account: " = "Gemeinsames Konto: "; /* acls */ "Access rights to" = "Zugriffsrechte für"; "For user" = "Für Benutzer"; "Any Authenticated User" = "Alle authentifizierten Benutzer "; "List and see this folder" = "Diesen Ordner sehen"; "Read mails from this folder" = "E-Mails in diesem Ordner ansehen"; "Mark mails read and unread" = "E-Mails in diesem Ordner als (un)gelesen markieren"; "Modify the flags of the mails in this folder" = "Markierungen von E-Mails in diesem Ordner verändern"; "Insert, copy and move mails into this folder" = "E-Mails in diesem Ordner hinzufügen, kopieren und verschieben"; "Post mails" = "E-Mails versenden"; "Add subfolders to this folder" = "Neue Unterordner anlegen"; "Remove this folder" = "Diesen Ordner löschen"; "Erase mails from this folder" = "E-Mails in diesem Ordner löschen"; "Expunge this folder" = "Diesen Ordner komprimieren"; "Archive This Folder" = "Diesen Ordner archivieren"; "Modify the acl of this folder" = "Benutzerrechte dieses Ordners verändern"; "Saved Messages.zip" = "Gespeicherte Nachrichten.zip"; "Update" = "Speichern"; "Cancel" = "Abbrechen"; /* Mail edition */ "From" = "Von"; "Subject" = "Betreff"; "To" = "An"; "Cc" = "CC"; "Bcc" = "BCC"; "Reply-To" = "Antwort an"; "Add address" = "Adresse hinzufügen"; "Attachments:" = "Anhänge:"; "Open" = "Öffnen"; "Select All" = "Alles auswählen"; "Attach Web Page..." = "Webseite anhängen..."; "Attach File(s)..." = "Datei(en) als Anhang anfügen..."; "to" = "An"; "cc" = "CC"; "bcc" = "BCC"; "Edit Draft..." = "Entwurf bearbeiten..."; "Load Images" = "Bilder laden"; "Return Receipt" = "Empfangsbestätigung"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Der Absender dieser Nachricht hat um eine Empfangsbestätigung gebeten. Möchten Sie eine Empfangsbestätigung senden?"; "Return Receipt (displayed) - %@"= "Empfangsbestätigung (angezeigt) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Dies ist die Empfangsbestätigung für die Nachricht, die Sie an %@ gesendet haben.\n\nHinweis: Es wird lediglich bestätigt, dass die Nachricht auf dem Computer des Empfängers empfangen (angezeigt) wurde. Es wird nicht garantiert, dass der Empfänger die Nachricht gelesen und/oder verstanden hat."; "Priority" = "Priorität"; "highest" = "Sehr hoch"; "high" = "Hoch"; "normal" = "Normal"; "low" = "Niedrig"; "lowest" = "Sehr niedrig"; "This mail is being sent from an unsecure network!" = "Diese E-Mail wurde von einem unsicheren Netzwerk gesendet!"; "Address Book:" = "Adressbuch:"; "Search For:" = "Suche nach:"; /* Popup "show" */ "all" = "Alle"; "read" = "Gelesene"; "unread" = "Ungelesene"; "deleted" = "Gelöschte"; "flagged" = "Markierte"; /* MailListView */ "Sender" = "Absender"; "Subject or Sender" = "Betreff oder Absender"; "To or Cc" = "Empfänger (An oder CC)"; "Entire Message" = "Nachrichtentext"; "Date" = "Datum"; "View" = "Ansicht"; "All" = "Alle"; "No message" = "Keine Nachricht"; "messages" = "Nachricht(en)"; "first" = "Erste"; "previous" = "Vorherige"; "next" = "Nächste"; "last" = "Letzte"; "msgnumber_to" = "bis"; "msgnumber_of" = "von"; "Mark Unread" = "Als ungelesen markieren"; "Mark Read" = "Als gelesen markieren"; "Untitled" = "ohne Titel"; /* Tree */ "SentFolderName" = "Gesendet"; "TrashFolderName" = "Papierkorb"; "InboxFolderName" = "Posteingang"; "DraftsFolderName" = "Entwürfe"; "SieveFolderName" = "Filter"; "OtherUsersFolderName" = "Andere Benutzer"; "SharedFoldersName" = "Gemeinsame Ordner"; "Folders" = "Ordner"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Verschieben nach …"; /* Address Popup menu */ "Add to Address Book..." = "Zum Adressbuch hinzufügen..."; "Compose Mail To" = "Verfassen an"; "Create Filter From Message..." = "Filter aus Nachricht erstellen..."; /* Image Popup menu */ "Save Image" = "Bild speichern"; "Save Attachment" = "Anhang speichern"; /* Mailbox popup menus */ "Open in New Mail Window" = "In neuem Fenster öffnen"; "Copy Folder Location" = "Ordneradresse kopieren"; "Subscribe..." = "Abonnieren..."; "Mark Folder Read" = "Ordner als gelesen markieren"; "New Folder..." = "Neuer Ordner..."; "Compact This Folder" = "Komprimieren"; "Search Messages..." = "Suchen..."; "Sharing..." = "Benutzerrechte..."; "New Subfolder..." = "Neuer Unterordner..."; "Rename Folder..." = "Umbenennen..."; "Delete Folder" = "Löschen"; "Use This Folder For" = "Diesen Ordner verwenden für"; "Get Messages for Account" = "Neue Nachrichten empfangen"; "Properties..." = "Eigenschaften..."; "Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Gesendete Nachrichten"; "Drafts" = "Entwürfe"; "Deleted Messages" = "Gelöschte Nachrichten"; /* Message list popup menu */ "Open Message In New Window" = "In neuem Fenster öffnen"; "Reply to Sender Only" = "Antworten nur an Absender"; "Reply to All" = "Antworten an alle"; "Edit As New..." = "Als neu bearbeiten"; "Move To" = "Verschieben in"; "Copy To" = "Kopieren in"; "Label" = "Schlagwörter"; "Mark" = "Markieren"; "Save As..." = "Speichern unter..."; "Print Preview" = "Druckvorschau"; "View Message Source" = "Nachrichten-Quelltext"; "Print..." = "Drucken..."; "Delete Message" = "Nachricht löschen"; "Delete Selected Messages" = "Gewählte Nachricht(en) löschen"; "This Folder" = "Dieser Ordner"; /* Label popup menu */ "None" = "Kein"; /* Mark popup menu */ "As Read" = "Gelesen"; "Thread As Read" = "Thema gelesen"; "As Read By Date..." = "Datumsbereich gelesen..."; "All Read" = "Alles gelesen"; "Flag" = "Markierung"; "As Junk" = "Junk"; "As Not Junk" = "Kein Junk"; "Run Junk Mail Controls" = "Junk-Filter anwenden"; /* Folder operations */ "Name :" = "Name:"; "Enter the new name of your folder :" = "Geben Sie den Namen des neuen Ordners ein:"; "Do you really want to move this folder into the trash ?" = "Wollen Sie diesen Ordner wirklich in den Papierkorb verschieben?"; "Operation failed" = "Operation fehlgeschlagen."; "Quota" = "Quota:"; "quotasFormat" = "%{0}% von %{1} MB verwendet"; "Please select a message." = "Sie müssen eine Nachricht auswählen."; "Please select a message to print." = "Sie müssen eine Nachricht zum Drucken auswählen."; "Please select only one message to print." = "Bitte wählen Sie nur eine Nachricht zum Drucken aus."; "The message you have selected doesn't exist anymore." = "Die gewählte Nachricht existiert nicht mehr."; "The folder with name \"%{0}\" could not be created." = "Der Ordner mit dem Namen \"%{0}\" konnte nicht erzeugt werden."; "This folder could not be renamed to \"%{0}\"." = "Dieser Ordner konnte nicht in \"%{0}\" umbenannt werden."; "The folder could not be deleted." = "Der Ordner konnte nicht gelöscht werden."; "The trash could not be emptied." = "Der Papierkorb konnte nicht geleert werden."; "The folder functionality could not be changed." = "Die Ordnerverwendung konnte nicht geändert werden."; "You need to choose a non-virtual folder!" = "Sie müssen einen nicht-virtuellen Ordner auswählen!"; "Moving a message into its own folder is impossible!" = "Nachricht befindet sich bereits in diesem Ordner!"; "Copying a message into its own folder is impossible!" = "Nachricht befindet sich bereits in diesem Ordner!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Die Nachricht(en) können nicht in den Papierkorb verschoben werden. Wollen Sie diese endgültig löschen?"; /* Message editing */ "error_missingsubject" = "Der Betreff fehlt. Sind Sie sicher, dass Sie dies so senden möchten?"; "error_missingrecipients" = "Der Empfänger fehlt"; "Send Anyway" = "Trotzdem versenden"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Kann Nachricht nicht versenden: Alle Empfänger sind ungültig."; "cannot send message (smtp) - recipients discarded:" = "Kann Nachricht nicht versenden: Die folgenden Addressen sind ungültig:"; "cannot send message: (smtp) error when connecting" = "Kann Nachricht nicht versenden: Fehler beim Verbinden mit dem SMTP-Server."; /* Contacts list in mail editor */ "Email" = "E-Mail"; "Name" = "Name"; SOGo-2.1.1b/UI/MailerUI/UIxMailEditor.m0000644000000000000000000004400512247657027016022 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG Copyright (C) 2008-2011 Inverse inc. This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import #import #define COMPILING_NGOBJWEB 1 /* we want httpRequest for parsing multi-part form data */ #import #undef COMPILING_NGOBJWEB #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import /* UIxMailEditor A mail editor component which works on SOGoDraftObject's. */ @interface UIxMailEditor : UIxComponent { NSArray *to; NSArray *cc; NSArray *bcc; NSString *subject; NSString *sourceUID; NSString *sourceFolder; NSString *text; NSMutableArray *fromEMails; NSString *from; SOGoMailFolder *sentFolder; BOOL isHTML; NSString *priority; NSString *receipt; id item; id currentFolder; /* these are for the inline attachment list */ NSString *attachmentName; NSArray *attachmentNames; NSMutableArray *attachedFiles; } @end @implementation UIxMailEditor static NSArray *infoKeys = nil; + (void) initialize { if (!infoKeys) infoKeys = [[NSArray alloc] initWithObjects: @"subject", @"to", @"cc", @"bcc", @"from", @"inReplyTo", @"replyTo", @"priority", @"receipt", nil]; } - (id) init { if ((self = [super init])) { priority = @"NORMAL"; receipt = nil; currentFolder = nil; } return self; } - (void) dealloc { [item release]; [priority release]; [receipt release]; [sentFolder release]; [fromEMails release]; [from release]; [text release]; [subject release]; [to release]; [cc release]; [bcc release]; [sourceUID release]; [sourceFolder release]; [attachmentName release]; [attachmentNames release]; [attachedFiles release]; [currentFolder release]; [super dealloc]; } /* accessors */ - (void) setItem: (id) _item { ASSIGN (item, _item); } - (id) item { return item; } - (NSArray *) priorityClasses { static NSArray *priorities = nil; if (!priorities) { priorities = [NSArray arrayWithObjects: @"HIGHEST", @"HIGH", @"NORMAL", @"LOW", @"LOWEST", nil]; [priorities retain]; } return priorities; } - (void) setPriority: (NSString *) _priority { ASSIGN (priority, _priority); } - (NSString *) priority { return priority; } - (void) setReceipt: (NSString *) newReceipt { ASSIGN (receipt, newReceipt); } - (NSString *) receipt { return receipt; } - (void) setIsHTML: (BOOL) aBool { isHTML = aBool; } - (BOOL) isHTML { SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; return [[ud mailComposeMessageType] isEqualToString: @"html"]; } - (NSString *) itemPriorityText { return [self labelForKey: [NSString stringWithFormat: @"%@", [item lowercaseString]]]; } - (NSString *) isMailReply { return ([to count] > 0 ? @"true" : @"false"); } - (NSString *) localeCode { // WARNING : NSLocaleCode is not defined in return [locale objectForKey: @"NSLocaleCode"]; } - (void) setFrom: (NSString *) newFrom { ASSIGN (from, newFrom); } - (NSString *) _emailFromIdentity: (NSDictionary *) identity { NSString *fullName, *format; fullName = [identity objectForKey: @"fullName"]; if ([fullName length]) format = @"%{fullName} <%{email}>"; else format = @"%{email}"; return [identity keysWithFormat: format]; } - (NSString *) from { NSDictionary *identity; if (!from) { identity = [[context activeUser] primaryIdentity]; from = [self _emailFromIdentity: identity]; [from retain]; } return from; } - (NSString *) replyTo { NSString *value; value = nil; // // We add the correct replyTo here. That is, the one specified in the defaults // for the main "SOGo mail account" versus the one specified in the auxiliary // IMAP accounts. // if ([[[[self clientObject] mailAccountFolder] nameInContainer] intValue] == 0) { SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; value = [ud mailReplyTo]; } else { NSArray *identities; identities = [[[self clientObject] mailAccountFolder] identities]; if ([identities count]) value = [[identities objectAtIndex: 0] objectForKey: @"replyTo"]; } return value; } - (void) setSubject: (NSString *) newSubject { ASSIGN (subject, newSubject); } - (NSString *) subject { return subject; } - (void) setText: (NSString *) newText { ASSIGN (text, newText); } - (NSString *) text { return text; } - (void) setSourceUID: (int) newSourceUID { NSString *s; s = [NSString stringWithFormat: @"%i", newSourceUID]; ASSIGN (sourceUID, s); } - (NSString *) sourceUID { return sourceUID; } - (void) setSourceFolder: (NSString *) newSourceFolder { ASSIGN (sourceFolder, newSourceFolder); } - (NSString *) sourceFolder { return sourceFolder; } - (void) setTo: (NSArray *) newTo { if ([newTo isKindOfClass: [NSNull class]]) newTo = nil; ASSIGN (to, newTo); } - (NSArray *) to { return to; } - (void) setCc: (NSArray *) newCc { if ([newCc isKindOfClass: [NSNull class]]) newCc = nil; ASSIGN (cc, newCc); } - (NSArray *) cc { return cc; } - (void) setBcc: (NSArray *) newBcc { if ([newBcc isKindOfClass: [NSNull class]]) newBcc = nil; ASSIGN (bcc, newBcc); } - (NSArray *) bcc { return bcc; } - (BOOL) hasOneOrMoreRecipients { return (([to count] + [cc count] + [bcc count]) > 0); } - (void) setAttachmentName: (NSString *) newAttachmentName { ASSIGN (attachmentName, newAttachmentName); } - (NSString *) attachmentName { return attachmentName; } /* from addresses */ - (NSArray *) fromEMails { NSArray *identities; int count, max; NSString *email; SOGoMailAccount *account; if (!fromEMails) { account = [[self clientObject] mailAccountFolder]; identities = [account identities]; max = [identities count]; fromEMails = [[NSMutableArray alloc] initWithCapacity: max]; for (count = 0; count < max; count++) { email = [self _emailFromIdentity: [identities objectAtIndex: count]]; [fromEMails addObjectUniquely: email]; } } return fromEMails; } /* info loading */ - (void) loadInfo: (NSDictionary *) _info { if (![_info isNotNull]) return; [self debugWithFormat:@"loading info ..."]; [self setValuesForKeysWithDictionary:_info]; } - (NSDictionary *) storeInfo { [self debugWithFormat:@"storing info ..."]; return [self valuesForKeys:infoKeys]; } /* contacts search */ - (NSArray *) contactFolders { SOGoContactFolders *folderContainer; folderContainer = (SOGoContactFolders *) [[[self clientObject] lookupUserFolder] privateContacts: @"Contacts" inContext: nil]; return [folderContainer subFolders]; } - (NSArray *) personalContactInfos { SOGoContactFolders *folderContainer; id folder; NSArray *contactInfos; folderContainer = (SOGoContactFolders *) [[[self clientObject] lookupUserFolder] privateContacts: @"Contacts" inContext: nil]; folder = [folderContainer lookupPersonalFolder: @"personal" ignoringRights: YES]; // If the folder doesn't exist anymore or if the database is down, we // return an empty array. if ([folder isKindOfClass: [NSException class]]) return [NSArray array]; contactInfos = [folder lookupContactsWithFilter: nil onCriteria: nil sortBy: @"c_cn" ordering: NSOrderedAscending inDomain: nil]; return contactInfos; } - (void) setCurrentFolder: (id) _currentFolder { ASSIGN (currentFolder, _currentFolder); } - (NSString *) currentContactFolderId { return [NSString stringWithFormat: @"/%@", [currentFolder nameInContainer]]; } - (NSString *) currentContactFolderName { return [currentFolder displayName]; } - (NSString *) currentContactFolderOwner { return [currentFolder ownerInContext: context]; } - (NSString *) currentContactFolderClass { return ([currentFolder isKindOfClass: [SOGoContactSourceFolder class]] ? @"remote" : @"local"); } /* requests */ - (BOOL) shouldTakeValuesFromRequest: (WORequest *) request inContext: (WOContext*) localContext { return YES; } /* actions */ - (NSString *) _fixedFilename: (NSString *) filename { NSString *newFilename, *baseFilename, *extension; unsigned int variation; if (!attachedFiles) attachedFiles = [NSMutableArray new]; newFilename = filename; baseFilename = [filename stringByDeletingPathExtension]; extension = [filename pathExtension]; variation = 0; while ([attachedFiles containsObject: newFilename]) { variation++; newFilename = [NSString stringWithFormat: @"%@-%d.%@", baseFilename, variation, extension]; } [attachedFiles addObject: newFilename]; return newFilename; } - (NSDictionary *) _scanAttachmentFilenamesInRequest: (id) httpBody { NSMutableDictionary *filenames; NSDictionary *attachment; NSArray *parts; unsigned int count, max; NGMimeBodyPart *part; NGMimeContentDispositionHeaderField *header; NSString *mimeType, *filename; parts = [httpBody parts]; max = [parts count]; filenames = [NSMutableDictionary dictionaryWithCapacity: max]; for (count = 0; count < max; count++) { part = [parts objectAtIndex: count]; header = (NGMimeContentDispositionHeaderField *) [part headerForKey: @"content-disposition"]; mimeType = [(NGMimeType *) [part headerForKey: @"content-type"] stringValue]; filename = [self _fixedFilename: [header filename]]; attachment = [NSDictionary dictionaryWithObjectsAndKeys: filename, @"filename", mimeType, @"mimetype", nil]; [filenames setObject: attachment forKey: [header name]]; } return filenames; } - (BOOL) _saveAttachments { WORequest *request; NSEnumerator *allKeys; NSString *key; BOOL success; NSDictionary *filenames; id httpBody; SOGoDraftObject *co; success = YES; request = [context request]; httpBody = [[request httpRequest] body]; filenames = [self _scanAttachmentFilenamesInRequest: httpBody]; co = [self clientObject]; allKeys = [[request formValueKeys] objectEnumerator]; while ((key = [allKeys nextObject]) && success) if ([key hasPrefix: @"attachment"]) success = (![co saveAttachment: (NSData *) [request formValueForKey: key] withMetadata: [filenames objectForKey: key]]); return success; } - (BOOL) _saveFormInfo { NSDictionary *info; NSException *error; BOOL success; SOGoDraftObject *co; co = [self clientObject]; [co fetchInfo]; success = YES; if ([self _saveAttachments]) { info = [self storeInfo]; [co setHeaders: info]; [co setIsHTML: isHTML]; [co setText: (isHTML ? [NSString stringWithFormat: @"%@", text] : text)];; error = [co storeInfo]; if (error) { [self errorWithFormat: @"failed to store draft: %@", error]; // TODO: improve error handling success = NO; } } else success = NO; // TODO: wrap content return success; } - (id) failedToSaveFormResponse { // TODO: improve error handling return [NSException exceptionWithHTTPStatus:500 /* server error */ reason:@"failed to store draft object on server!"]; } /* attachment helper */ - (NSArray *) attachmentNames { NSArray *a; if (!attachmentNames) { a = [[self clientObject] fetchAttachmentNames]; ASSIGN (attachmentNames, [a sortedArrayUsingSelector: @selector (compare:)]); } return attachmentNames; } - (BOOL) hasAttachments { return [[self attachmentNames] count] > 0 ? YES : NO; } - (NSString *) uid { return [[self clientObject] nameInContainer]; } - (id) defaultAction { SOGoDraftObject *co; co = [self clientObject]; [co fetchInfo]; [self loadInfo: [co headers]]; [self setText: [co text]]; [self setSourceUID: [co IMAP4ID]]; [self setSourceFolder: [co sourceFolder]]; return self; } - (id ) saveAction { id result; if ([self _saveFormInfo]) { result = [[self clientObject] save]; if (!result) result = [self responseWith204]; } else result = [self failedToSaveFormResponse]; return result; } - (NSException *) validateForSend { NSException *error; if (![self hasOneOrMoreRecipients]) error = [NSException exceptionWithHTTPStatus: 400 /* Bad Request */ reason: [self labelForKey: @"error_missingrecipients"]]; else error = nil; return error; } // // // - (WOResponse *) sendAction { SOGoDraftObject *co; NSDictionary *jsonResponse; NSException *error; NSMutableArray *errorMsg; NSDictionary *messageSubmissions; SOGoSystemDefaults *dd; int messages_count, recipients_count; messageSubmissions = [[SOGoCache sharedCache] messageSubmissionsCountForLogin: [[context activeUser] login]]; dd = [SOGoSystemDefaults sharedSystemDefaults]; messages_count = recipients_count = 0; if (messageSubmissions) { unsigned int current_time, start_time, delta, block_time; current_time = [[NSCalendarDate date] timeIntervalSince1970]; start_time = [[messageSubmissions objectForKey: @"InitialDate"] unsignedIntValue]; delta = current_time - start_time; block_time = [dd messageSubmissionBlockInterval]; messages_count = [[messageSubmissions objectForKey: @"MessagesCount"] intValue]; recipients_count = [[messageSubmissions objectForKey: @"RecipientsCount"] intValue]; if ((messages_count >= [dd maximumMessageSubmissionCount] || recipients_count >= [dd maximumRecipientCount]) && delta >= [dd maximumSubmissionInterval] && delta <= block_time ) { jsonResponse = [NSDictionary dictionaryWithObjectsAndKeys: @"failure", @"status", [self labelForKey: @"Tried to send too many mails. Please wait."], @"message", nil]; return [self responseWithStatus: 200 andString: [jsonResponse jsonRepresentation]]; } if (delta > block_time) { [[SOGoCache sharedCache] setMessageSubmissionsCount: 0 recipientsCount: 0 forLogin: [[context activeUser] login]]; } } co = [self clientObject]; /* first, save form data */ error = [self validateForSend]; if (!error) { if ([self _saveFormInfo]) error = [co sendMail]; else error = [self failedToSaveFormResponse]; } if (error) { // Only the first line is translated errorMsg = [NSMutableArray arrayWithArray: [[error reason] componentsSeparatedByString: @"\n"]]; [errorMsg replaceObjectAtIndex: 0 withObject: [self labelForKey: [errorMsg objectAtIndex: 0]]]; jsonResponse = [NSDictionary dictionaryWithObjectsAndKeys: @"failure", @"status", [errorMsg componentsJoinedByString: @"\n"], @"message", nil]; } else { jsonResponse = [NSDictionary dictionaryWithObjectsAndKeys: @"success", @"status", [co sourceFolder], @"sourceFolder", [NSNumber numberWithInt: [co IMAP4ID]], @"messageID", nil]; recipients_count += [[co allRecipients] count]; messages_count += 1; if ([dd maximumMessageSubmissionCount] > 0 && [dd maximumRecipientCount] > 0) { [[SOGoCache sharedCache] setMessageSubmissionsCount: messages_count recipientsCount: recipients_count forLogin: [[context activeUser] login]]; } } return [self responseWithStatus: 200 andString: [jsonResponse jsonRepresentation]]; } @end /* UIxMailEditor */ SOGo-2.1.1b/UI/MailerUI/UIxMailSourceView.h0000644000000000000000000000203412247657027016656 0ustar rootroot/* UIxMailSourceView.h - this file is part of SOGo * * Copyright (C) 2007 Inverse inc. * * 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 UIXMAILSOURCEVIEW_H #define UIXMAILSOURCEVIEW_H #import @interface UIxMailSourceView : WODirectAction @end #endif /* UIXMAILSOURCEVIEW_H */ SOGo-2.1.1b/UI/MailerUI/WOContext+UIxMailer.h0000644000000000000000000000240712247657027017063 0ustar rootroot/* Copyright (C) 2004 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #ifndef __Mailer_WOContext_UIxMailer_H__ #define __Mailer_WOContext_UIxMailer_H__ #import /* WOContext(UIxMailer) Provide shared objects used by the UIx components. */ @class NSFormatter; @class UIxEnvelopeAddressFormatter; @interface WOContext (UIxMailer) - (NSFormatter *) mailDateFormatter; - (UIxEnvelopeAddressFormatter *) mailEnvelopeAddressFormatter; - (NSFormatter *) mailEnvelopeFullAddressFormatter; @end #endif /* __Mailer_WOContext_UIxMailer_H__ */ SOGo-2.1.1b/UI/MailerUI/GNUmakefile0000644000000000000000000000232212247657027015233 0ustar rootroot# GNUstep makefile include ../common.make BUNDLE_NAME = MailerUI MailerUI_PRINCIPAL_CLASS = MailerUIProduct MailerUI_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh MailerUI_OBJC_FILES += \ MailerUIProduct.m \ \ UIxMailFormatter.m \ UIxEnvelopeAddressFormatter.m \ WOContext+UIxMailer.m \ \ UIxMailMainFrame.m \ \ UIxMailListActions.m \ UIxMailView.m \ UIxMailSourceView.m \ UIxMailPopupView.m \ UIxMailMoveToPopUp.m \ UIxMailFilterPanel.m \ \ UIxMailAccountActions.m \ UIxMailFolderActions.m \ UIxMailActions.m \ UIxMailEditor.m \ UIxMailToSelection.m \ UIxMailWindowCloser.m \ \ UIxMailUserRightsEditor.m \ UIxMailUserDelegationEditor.m MailerUI_RESOURCE_FILES += \ product.plist \ Toolbars/*.toolbar MailerUI_LOCALIZED_RESOURCE_FILES += \ Localizable.strings # make ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ -L../MailPartViewers/obj/ -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble SOGo-2.1.1b/UI/MailerUI/GNUmakefile.postamble0000644000000000000000000000046712247657027017230 0ustar rootroot# post processing validate-wox: # xmllint --noout *.wox before-all :: validate-wox ifneq ($(GNUSTEP_BUILD_DIR),) after-all :: @(cp bundle-info.plist \ $(GNUSTEP_BUILD_DIR)/$(BUNDLE_NAME)$(BUNDLE_EXTENSION)) else after-all :: @(cd $(BUNDLE_NAME)$(BUNDLE_EXTENSION);\ cp ../bundle-info.plist .) endif SOGo-2.1.1b/UI/MailerUI/UIxEnvelopeAddressFormatter.m0000644000000000000000000000652712247657027020747 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import #import #import #import #import "UIxMailFormatter.h" @implementation UIxEnvelopeAddressFormatter static Class EnvAddrClass = Nil; static Class StrClass = Nil; + (void)initialize { EnvAddrClass = [NGImap4EnvelopeAddress class]; StrClass = [NSString class]; } - (id)initWithMaxLength:(unsigned int)_max generateFullEMail:(BOOL)_genFull { if ((self = [super init])) { self->maxLength = _max; self->separator = @", "; self->eafFlags.fullEMail = _genFull ? 1 : 0; } return self; } - (id)init { return [self initWithMaxLength:128 generateFullEMail:NO]; } /* configuration */ - (unsigned)maxLength { return self->maxLength; } - (NSString *)separator { return self->separator; } - (BOOL)generateFullEMail { return self->eafFlags.fullEMail ? YES : NO; } /* formatting envelope addresses */ - (NSString *)stringForEnvelopeAddress:(NGImap4EnvelopeAddress *)_address { NSString *s; if ([self generateFullEMail]) return [_address email]; s = [_address personalName]; if ([s isNotNull]) return s; s = [_address baseEMail]; if ([s isNotNull]) return s; [self warnWithFormat:@"unexpected envelope address: %@", _address]; return [_address stringValue]; } - (NSString *)stringForArray:(NSArray *)_addresses { NSMutableString *ms; unsigned i, count; if ((count = [_addresses count]) == 0) return nil; if (count == 1) return [self stringForObjectValue:[_addresses objectAtIndex:0]]; ms = [NSMutableString stringWithCapacity:16 * count]; for (i = 0; i < count && [ms length] < [self maxLength]; i++) { NSString *s; s = [self stringForObjectValue:[_addresses objectAtIndex:i]]; if (s == nil) continue; if ([ms length] > 0) [ms appendString:[self separator]]; [ms appendString:s]; } return ms; } /* formatter entry function */ - (NSString *)stringForObjectValue:(id)_address { if (![_address isNotNull]) return nil; if ([_address isKindOfClass:StrClass]) /* preformatted? */ return _address; if ([_address isKindOfClass:EnvAddrClass]) return [self stringForEnvelopeAddress:_address]; if ([_address isKindOfClass:[NSArray class]]) return [self stringForArray:_address]; [self debugWithFormat: @"NOTE: unexpected object for envelope formatter: %@<%@>", _address, NSStringFromClass([_address class])]; return [_address stringValue]; } @end /* UIxEnvelopeAddressFormatter */ SOGo-2.1.1b/UI/MailerUI/COPYING0000644000000000000000000006130312247657027014220 0ustar rootroot GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! SOGo-2.1.1b/UI/MailerUI/UIxMailUserDelegationEditor.m0000644000000000000000000000473612247657027020664 0ustar rootroot/* UIxMailUserDelegationEditor.m - this file is part of SOGo * * Copyright (C) 2010 Inverse inc. * * 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 #import #import @interface UIxMailUserDelegationEditor : UIxComponent { NSArray *delegates; NSString *currentDelegate; } - (NSArray *) delegates; - (void) setCurrentDelegate: (NSString *) newCurrentDelegate; - (NSString *) currentDelegate; @end @implementation UIxMailUserDelegationEditor - (id) init { if ((self = [super init])) { delegates = nil; currentDelegate = nil; } return self; } - (void) dealloc { [delegates release]; [currentDelegate release]; [super dealloc]; } - (NSArray *) delegates { if (!delegates) { delegates = [[self clientObject] delegates]; [delegates retain]; } return delegates; } - (void) setCurrentDelegate: (NSString *) newCurrentDelegate { ASSIGN (currentDelegate, newCurrentDelegate); } - (NSString *) currentDelegate { return currentDelegate; } - (NSString *) currentDelegateDisplayName { SOGoUserManager *um; NSString *s; um = [SOGoUserManager sharedUserManager]; s = ([currentDelegate hasPrefix: @"@"] ? [currentDelegate substringFromIndex: 1] : currentDelegate); return [um getFullEmailForUID: s]; } - (id) defaultAction { id response; SOGoMailAccount *co; co = [self clientObject]; if ([[co nameInContainer] isEqualToString: @"0"]) response = self; else response = [self responseWithStatus: 403 andString: @"The list of account delegates cannot be modified on secondary accounts."]; return response; } @end SOGo-2.1.1b/UI/MailerUI/Czech.lproj/0000755000000000000000000000000012247657027015343 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Czech.lproj/Localizable.strings0000644000000000000000000002460112247657027021202 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "VytvoÅ™it"; "Empty Trash" = "Vyprázdnit koÅ¡"; "Delete" = "Smazat"; "Expunge" = "VyÅ¡krtnout"; "Forward" = "PÅ™eposlat"; "Get Mail" = "PÅ™ijmout"; "Junk" = "Nevyžádané"; "Reply" = "OdpovÄ›dÄ›t"; "Reply All" = "Odp. vÅ¡em"; "Print" = "Tisk"; "Stop" = "Zastavit"; "Write" = "Napsat"; "Send" = "Odeslat"; "Contacts" = "Kontakty"; "Attach" = "PÅ™iložit"; "Save" = "Uložit"; "Options" = "Možnosti"; "Close" = "Zavřít"; "Size" = "Velikost"; /* Tooltips */ "Send this message now" = "Odeslat tuto zprávu nyní"; "Select a recipient from an Address Book" = "Zvolit příjemce z adresáře"; "Include an attachment" = "PÅ™ipojit přílohu"; "Save this message" = "Uložit tuto zprávu"; "Get new messages" = "Stáhnout nové zprávy"; "Create a new message" = "VytvoÅ™it novou zprávu"; "Go to address book" = "PÅ™ejít do adresáře"; "Reply to the message" = "OdpovÄ›dÄ›t na zprávu"; "Reply to sender and all recipients" = "OdpovÄ›dÄ›t odesílateli a vÅ¡em příjemcům"; "Forward selected message" = "PÅ™eposlat oznaÄenou zprávu"; "Delete selected message or folder" = "Smazat oznaÄenou zprávu nebo složku"; "Mark the selected messages as junk" = "OznaÄit vybrané zprávy jako nevyžádané"; "Print this message" = "Tisknout tuto zprávu"; "Stop the current transfer" = "Zastavit aktuální pÅ™esun"; "Attachment" = "Příloha"; "Unread" = "NepÅ™eÄtené"; "Flagged" = "OÅ¡títkované"; /* Main Frame */ "Home" = "Domů"; "Calendar" = "Kalendář"; "Addressbook" = "Adresář"; "Mail" = "E-Mail"; "Right Administration" = "Administrace"; "Help" = "NápovÄ›da"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Vítejte v SOGo Mailer. Využijte stromu složek nalevo pro procházení VaÅ¡imi mailovými úÄty!"; "Read messages" = "Číst zprávy"; "Write a new message" = "Napsat zprávu"; "Share: " = "Sdílet: "; "Account: " = "ÚÄet: "; "Shared Account: " = "Sdílený úÄet: "; /* acls */ "Access rights to" = "Přístupová práva k"; "For user" = "Pro uživatele"; "Any Authenticated User" = "VÅ¡ichni ověření uživatelé"; "List and see this folder" = "Prohlížet tuto složku"; "Read mails from this folder" = "Číst maily v této složce"; "Mark mails read and unread" = "OznaÄit maily jako pÅ™eÄtené a nepÅ™eÄtené"; "Modify the flags of the mails in this folder" = "Upravit mailové Å¡títky v této složce"; "Insert, copy and move mails into this folder" = "Vložit, kopírovat a pÅ™esunout maily do této složky"; "Post mails" = "VyvÄ›sit maily"; "Add subfolders to this folder" = "PÅ™idat podsložky této složce"; "Remove this folder" = "Odebrat tuto složku"; "Erase mails from this folder" = "Vymazat maily v této složce"; "Expunge this folder" = "VyÅ¡krtnout tuto složku"; "Archive This Folder" = "Archivovat složku"; "Modify the acl of this folder" = "Upravit acl této složky"; "Saved Messages.zip" = "zpravy.zip"; "Update" = "Aktualizace"; "Cancel" = "Storno"; /* Mail edition */ "From" = "Odesílatel"; "Subject" = "PÅ™edmÄ›t"; "To" = "Komu"; "Cc" = "Kopie"; "Bcc" = "Skrytá Kopie"; "Reply-To" = "OdpovÄ›dÄ›t komu"; "Add address" = "PÅ™idat adresu"; "Attachments:" = "Přílohy:"; "Open" = "Otevřít"; "Select All" = "Vybrat vÅ¡e"; "Attach Web Page..." = "PÅ™ipojit WWW stránku..."; "Attach File(s)..." = "PÅ™ipojit soubor(y)..."; "to" = "Komu"; "cc" = "Kopie"; "bcc" = "Skrytá kopie"; "Edit Draft..." = "Upravit koncept..."; "Load Images" = "Nahrát obrázky"; "Return Receipt" = "Potvrzení o pÅ™eÄtení"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Odesílatel této zprávy si pÅ™eje být informován o tom, že jste si tuto zprávu pÅ™eÄetli. Chcete odesílateli poslat potvrzení?"; "Return Receipt (displayed) - %@"= "Potvrzení o pÅ™eÄtení (zobrazeno) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Toto je potvrzení o pÅ™eÄtení ke zprávÄ›, kterou jste poslali pro %@.\n\nPoznámka: Potvrzení o pÅ™ijetí znamená pouze to, že se zpráva zobrazila na poÄítaÄi adresáta. Není ale zaruÄeno, že adresát zprávu Äetl a porozumÄ›l jejímu obsahu."; "Priority" = "Priorita"; "highest" = "Nejvyšší"; "high" = "Vysoká"; "normal" = "Normální"; "low" = "Nízká"; "lowest" = "Nejnižší"; "This mail is being sent from an unsecure network!" = "Tento mail je odesílán z nezabezpeÄené sítÄ›!"; "Address Book:" = "Adresář:"; "Search For:" = "Hledat:"; /* Popup "show" */ "all" = "vÅ¡echny"; "read" = "pÅ™eÄtené"; "unread" = "nepÅ™eÄtené"; "deleted" = "smazané"; "flagged" = "oÅ¡títkované"; /* MailListView */ "Sender" = "Odesílatel"; "Subject or Sender" = "PÅ™edmÄ›t nebo Odesílatel"; "To or Cc" = "Komu nebo Kopie"; "Entire Message" = "Celá zpráva"; "Date" = "Datum"; "View" = "Zobrazit"; "All" = "VÅ¡echny"; "No message" = "Žádná zpráva"; "messages" = "zprávy"; "first" = "NejnovÄ›jší"; "previous" = "PÅ™edchozí"; "next" = "Následující"; "last" = "Nejstarší"; "msgnumber_to" = "pro"; "msgnumber_of" = "o"; "Mark Unread" = "OznaÄit jako nepÅ™eÄtené"; "Mark Read" = "OznaÄit jako pÅ™eÄtené"; "Untitled" = "Bez názvu"; /* Tree */ "SentFolderName" = "Odeslaná poÅ¡ta"; "TrashFolderName" = "KoÅ¡"; "InboxFolderName" = "DoruÄená poÅ¡ta"; "DraftsFolderName" = "Koncepty"; "SieveFolderName" = "Filtry"; "OtherUsersFolderName" = "Ostatní uživatelé"; "SharedFoldersName" = "Sdílené složky"; "Folders" = "Složky"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "PÅ™esunout do …"; /* Address Popup menu */ "Add to Address Book..." = "PÅ™idat do adresáře..."; "Compose Mail To" = "Napsat mail pro"; "Create Filter From Message..." = "VytvoÅ™it filtr ze zprávy..."; /* Image Popup menu */ "Save Image" = "Uložit obrázek"; "Save Attachment" = "Uložit přílohu"; /* Mailbox popup menus */ "Open in New Mail Window" = "Otevřít v novém mailovém oknÄ›"; "Copy Folder Location" = "Kopírovat adresu složky"; "Subscribe..." = "Odebírat..."; "Mark Folder Read" = "OznaÄit složku jako pÅ™eÄtenou..."; "New Folder..." = "Nová složka..."; "Compact This Folder" = "Provést údržbu složky"; "Search Messages..." = "Vyhledat zprávy..."; "Sharing..." = "Sdílení..."; "New Subfolder..." = "Nová podsložka..."; "Rename Folder..." = "PÅ™ejmenovat složku..."; "Delete Folder" = "Smazat složku"; "Use This Folder For" = "Použít tuto složku pro"; "Get Messages for Account" = "Stáhnout zprávy pro úÄet"; "Properties..." = "Vlastnosti..."; "Delegation..." = "Delegování..."; /* Use This Folder menu */ "Sent Messages" = "Odeslané zprávy"; "Drafts" = "Koncepty"; "Deleted Messages" = "Smazané zprávy"; /* Message list popup menu */ "Open Message In New Window" = "Otevřít zprávu v novém oknÄ›"; "Reply to Sender Only" = "OdpovÄ›dÄ›t pouze odesílateli"; "Reply to All" = "OdpovÄ›dÄ›t vÅ¡em"; "Edit As New..." = "Upravit jako novou..."; "Move To" = "PÅ™esunout do"; "Copy To" = "Kopírovat do"; "Label" = "OznaÄkovat"; "Mark" = "OznaÄit"; "Save As..." = "Uložit jako..."; "Print Preview" = "Náhled tisku"; "View Message Source" = "Zobrazit zdroj zprávy"; "Print..." = "Tisk..."; "Delete Message" = "Smazat zprávu"; "Delete Selected Messages" = "Smazat oznaÄené zprávy"; "This Folder" = "Tato složka"; /* Label popup menu */ "None" = "Žádný"; /* Mark popup menu */ "As Read" = "Jako pÅ™eÄtené"; "Thread As Read" = "Vlákno jako pÅ™eÄtené"; "As Read By Date..." = "PÅ™eÄtené od data..."; "All Read" = "VÅ¡echny pÅ™eÄtené"; "Flag" = "OÅ¡títkovat"; "As Junk" = "Jako nevyžádané"; "As Not Junk" = "Jako vyžádané"; "Run Junk Mail Controls" = "Spustit kontrolu nevyžádaných"; /* Folder operations */ "Name :" = "Jméno :"; "Enter the new name of your folder :" = "Zadejte nový název Vaší složky :"; "Do you really want to move this folder into the trash ?" = "Opravdu chcete tuto složku vyhodit do koÅ¡e ?"; "Operation failed" = "Operace selhala"; "Quota" = "Kvóta:"; "quotasFormat" = "%{0}% využito z %{1} MB"; "Please select a message." = "Vyberte zprávu prosím."; "Please select a message to print." = "Zvolte prosím zprávu, kterou chcete tisknout."; "Please select only one message to print." = "Zvolte pouze jednu zprávu, kterou chcete tisknout."; "The message you have selected doesn't exist anymore." = "Zpráva, kterou jste zvolili, již neexistuje."; "The folder with name \"%{0}\" could not be created." = "Složka s názvem \"%{0}\" nemohla být vytvoÅ™ena."; "This folder could not be renamed to \"%{0}\"." = "Tato složka nemohla být pÅ™ejmenována na \"%{0}\"."; "The folder could not be deleted." = "Tato složka nemohla být smazána."; "The trash could not be emptied." = "KoÅ¡ nemohl být vyprázdnÄ›n."; "The folder functionality could not be changed." = "Funkce složky nemohla být zmÄ›nÄ›na."; "You need to choose a non-virtual folder!" = "Musíte zvolit ne-virtuální složku!"; "Moving a message into its own folder is impossible!" = "Zprávu nelze pÅ™esunout do své vlastní složky!"; "Copying a message into its own folder is impossible!" = "Zprávu nelze zkopírovat do své vlastní složky!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Zprávy nemohou být pÅ™esunuty do koÅ¡e. Chcete je smazat trvale?"; /* Message editing */ "error_missingsubject" = "Chybí pÅ™edmÄ›t"; "error_missingrecipients" = "Příjemci nebyli specifikováni"; "Send Anyway" = "Odeslat"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Zprávu nelze odeslat: adresy vÅ¡ech příjemců jsou neplatné."; "cannot send message (smtp) - recipients discarded:" = "Zprávu nelze odeslat: následující adresy jsou neplatné:"; "cannot send message: (smtp) error when connecting" = "Zprávu nelze odeslat: pÅ™i spojení se SMTP serverem doÅ¡lo k chybÄ›."; /* Contacts list in mail editor */ "Email" = "E-mail"; "Name" = "Jméno"; SOGo-2.1.1b/UI/MailerUI/Welsh.lproj/0000755000000000000000000000000012247657027015371 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Welsh.lproj/Localizable.strings0000644000000000000000000002360512247657027021233 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Creu"; "Empty Trash" = "Gwagio Sbwriel"; "Delete" = "Dileu"; "Expunge" = "Dileu"; "Forward" = "Blaenyrru"; "Get Mail" = "Cael ebost"; "Junk" = "Jync"; "Reply" = "Ateb"; "Reply All" = "Ateb Pawb"; "Print" = "Argraffu"; "Stop" = "Stop"; "Write" = "Ysgrifennu"; "Send" = "Anfon"; "Contacts" = "Cysylltiadau"; "Attach" = "Atodi"; "Save" = "Cadw"; "Options" = "Options"; "Size" = "Size"; /* Tooltips */ "Send this message now" = "Anfon y neges yn syth"; "Select a recipient from an Address Book" = "Dewis derbynnydd o lyfr cyfeiriadau"; "Include an attachment" = "Cynnwys atodiad"; "Save this message" = "Cadw'r neges"; "Get new messages" = "Cael negeseuon newydd"; "Create a new message" = "Creu neges newydd"; "Go to address book" = "Mynd at llyfr cyfeiriadau"; "Reply to the message" = "Ymateb i'r neges"; "Reply to sender and all recipients" = "Ymateb i'r anfonwr a'r holl derbynwyr"; "Forward selected message" = "Blaenyrru'r neges dewisol"; "Delete selected message or folder" = "Dileu y neges dewisol neu ffolder"; "Mark the selected messages as junk" = "Marciwch y negeseuon dewisol fel jync"; "Print this message" = "Argraffu'r neges"; "Stop the current transfer" = "Stopio'r trosglwyddiad presennol"; "Attachment" = "Atodiad"; "Unread" = "Heb ddarllen"; "Flagged" = "Wedi fflagio"; /* Main Frame */ "Home" = "Hafan"; "Calendar" = "Calendr"; "Addressbook" = "Llyfr Cyfeiradau"; "Mail" = "Ebost"; "Right Administration" = "Hawl Gweinyddwr"; "Help" = "Help"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Croeso i ebost SOGo. Defnyddiwch y coeden ffolderi ar y chwith i pori eich cyfrifon ebost!"; "Read messages" = "Darllen negeseuon"; "Write a new message" = "Ysgrifennu neges newydd"; "Share: " = "Rhannu: "; "Account: " = "Cyfrif: "; "Shared Account: " = "Cyfrif ranedig: "; /* acls */ "Default Roles" = "Rolau Gwreiddiol"; "User rights for:" = "hawliau defnyddiwr i:"; "List and see this folder" = "Rhestri a gweld y ffolder hwn"; "Read mails from this folder" = "Darllen negeseuon o'r ffolder hwn"; "Mark mails read and unread" = "Marcio ebost wedi darllen a heb ddarllen"; "Modify the flags of the mails in this folder" = "Newid y fflags ar yr ebost yn y ffolder hwn"; "Insert, copy and move mails into this folder" = "Mewnosod, copio a symud ebost i'r ffolder hwn"; "Post mails" = "Anfon ebost"; "Add subfolders to this folder" = "Ychwanegu is-ffolderi i'r ffolder hwn"; "Remove this folder" = "Dileu'r ffolder hwn"; "Erase mails from this folder" = "Dileu ebost o'r ffolder hwn"; "Expunge this folder" = "Dileu'r ffolder hwn"; "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Newid acl y ffolder"; "Saved Messages.zip" = "Saved Messages.zip"; "Update" = "Diweddaru"; "Cancel" = "Canslo"; /* Mail edition */ "From" = "Oddi wrth"; "Subject" = "Testun"; "To" = "At"; "Cc" = "Cc"; "Bcc" = "Bcc"; "Reply-To" = "Ymateb i"; "Add address" = "Ychwanegu cyfeiriad"; "Attachments:" = "Atodiadau:"; "Open" = "Open"; "Select All" = "Select All"; "Attach Web Page..." = "Attach Web Page..."; "Attach File(s)..." = "Attach File(s)..."; "to" = "At"; "cc" = "Cc"; "bcc" = "Bcc"; "Addressbook" = "Llyfr Cyfeiradau"; "Edit Draft..." = "Golygu Drafft..."; "Load Images" = "Llwytho Delweddau"; "Return Receipt" = "Return Receipt"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; "Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "Blaenoriaeth"; "highest" = "Uchaf"; "high" = "Uchel"; "normal" = "Normal"; "low" = "Isel"; "lowest" = "Lleiaf"; "This mail is being sent from an unsecure network!" = "Mae'r neges yma yn cael ei anfon o rwydwaith anniogel!"; /* Popup "show" */ "all" = "Oll"; "read" = "darllenwyd"; "unread" = "heb ddarllen"; "deleted" = "dilewyd"; "flagged" = "fflagiwyd"; /* MailListView */ "Sender" = "Anfonwr"; "Subject or Sender" = "Testun neu Anfonwr"; "To or Cc" = "At neu Cc"; "Entire Message" = "Neges Llawn"; "Date" = "Dyddiad"; "View" = "Gweld"; "All" = "Oll"; "Unread" = "Heb ddarllen"; "No message" = "No message"; "messages" = "negeseuon"; "first" = "Cyntaf"; "previous" = "Cynt"; "next" = "Nesaf"; "last" = "Olaf"; "msgnumber_to" = "at"; "msgnumber_of" = "o"; "Mark Unread" = "Marcio heb ddarllen"; "Mark Read" = "Marcio Darllenwyd"; "Untitled" = "Heb deitl"; /* Tree */ "SentFolderName" = "Anfonwyd"; "TrashFolderName" = "Sbwriel"; "InboxFolderName" = "Newydd"; "DraftsFolderName" = "Draffts"; "SieveFolderName" = "Ffilteri"; "OtherUsersFolderName" = "Other Users"; "SharedFoldersName" = "Shared Folders"; "Folders" = "Ffolderi"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Move …"; /* Address Popup menu */ "Add to Address Book..." = "Ychwanegu i Llyfr Cyfeiriadau..."; "Compose Mail To" = "Cyfansoddi neges at"; "Create Filter From Message..." = "Creu Ffilter o'r neges..."; /* Image Popup menu */ "Save Image" = "Cadw Delwedd"; "Save Attachment" = "Save Attachment"; /* Mailbox popup menus */ "Open in New Mail Window" = "Agor mewn ffenestr Neges Newydd"; "Copy Folder Location" = "Copio Lleoliad Ffolder"; "Subscribe..." = "Tanysgrifio..."; "Mark Folder Read" = "Marcio Ffolder Darllenwyd..."; "New Folder..." = "Ffolder Newydd..."; "Compact This Folder" = "Cywasgu'r ffolder hwn"; "Search Messages..." = "Chwilio negeseuon..."; "Sharing..." = "Rhannu..."; "New Subfolder..." = "Is-ffolder newydd..."; "Rename Folder..." = "Ail-enwi ffolder..."; "Delete Folder" = "Dileu Ffolder"; "Use This Folder For" = "Defyddio'r Ffolder yma am"; "Get Messages for Account" = "Cael negeseuon ar gyfer Cyfrif"; "Properties..." = "Properties..."; "Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Negeseuon anfonwyd"; "Drafts" = "Draffts"; "Deleted Messages" = "Negeseuon Dileuwyd"; /* Message list popup menu */ "Open Message In New Window" = "Agor Neges mewn ffenestr newydd"; "Reply to Sender Only" = "Ymateb i Anfonwr yn unig"; "Reply to All" = "Ymateb i Pawb"; "Forward" = "Blaenyrru"; "Edit As New..." = "Golygu fel Newydd..."; "Move To" = "Symud i"; "Copy To" = "Copio i"; "Label" = "Label"; "Mark" = "Marc"; "Save As..." = "Cadw Fel..."; "Print Preview" = "Rhagolwg Argraffu"; "View Message Source" = "Gweld Tarddiad Neges"; "Print..." = "Argraffu..."; "Delete Message" = "Dileu Neges"; "Delete Selected Messages" = "Dileu Negeseuon Dewisol"; "This Folder" = "Y ffolder hwn"; /* Label popup menu */ "None" = "Dim"; /* Mark popup menu */ "As Read" = "Darllenwyd"; "Thread As Read" = "Thread Darllenwyd"; "As Read By Date..." = "Darllenwyd wrth dyddiad..."; "All Read" = "Oll Darllenwyd"; "Flag" = "Fflag"; "As Junk" = "Fel Jync"; "As Not Junk" = "Fel nid Jync"; "Run Junk Mail Controls" = "Rhedeg rheolaethau ebost Jync"; /* Folder operations */ "Name :" = "Enw :"; "Enter the new name of your folder :" = "Rhowch yr enw newydd ar eich ffolder :"; "Do you really want to move this folder into the trash ?" = "A ydych yn sicr eich bod eisiau symudy ffolder yma i'r sbwriel ?"; "Operation failed" = "Gweithrediad wedi methu"; "Quota" = "cwota:"; "quotasFormat" = "%{0}% used on %{1} MB"; "Please select a message." = "Dewiswch neges."; "Please select a message to print." = "Dewiswch neges i'w argraffu."; "Please select only one message to print." = "Dewiswch un neges yn unig i'w argraffu."; "The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; "The folder with name \"%{0}\" could not be created." = "Ni chafodd y ffolder o'r' enw \"%{0}\" ei greu."; "This folder could not be renamed to \"%{0}\"." = "Ni llwyddwyd i ail-enwi'r ffolder yma i \"%{0}\"."; "The folder could not be deleted." = "Ni llwyddwyd i ddileu'r ffolder yma"; "The trash could not be emptied." = "Ni llwyddwyd i wagio'r sbwriel."; "The folder functionality could not be changed." = "Ni llwyddwyd i newid ffwythiant y ffolder."; "You need to choose a non-virtual folder!" = "Mae angen i chi dewis ffolder a di-rhithwir!"; "Moving a message into its own folder is impossible!" = "Mae symud neges i fewn i'w ffolder ei hun yn amhosibl!"; "Copying a message into its own folder is impossible!" = "Mae copio neges i fewn i'w ffolder ei hun yn amhosibl!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; /* Message editing */ "error_validationfailed" = "Dilysiad wedi methu"; "error_missingsubject" = "Testun yn eisiau"; "error_missingrecipients" = "Dim derbynnydd wedi nodi"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; "cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; "cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; "Name" = "Enw"; "Email" = "Ebost"; SOGo-2.1.1b/UI/MailerUI/BrazilianPortuguese.lproj/0000755000000000000000000000000012247657027020305 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings0000644000000000000000000002446412247657027024153 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Criar"; "Empty Trash" = "Esvaziar Lixeira"; "Delete" = "Apagar"; "Expunge" = "Expurgar"; "Forward" = "Encaminhar"; "Get Mail" = "Receber"; "Junk" = "Lixo Eletrônico"; "Reply" = "Responder"; "Reply All" = "Responder a Todos"; "Print" = "Imprimir"; "Stop" = "Parar"; "Write" = "Escrever"; "Send" = "Enviar"; "Contacts" = "Contatos"; "Attach" = "Anexo"; "Save" = "Salvar"; "Options" = "Opções"; "Close" = "Fechar"; "Size" = "Tamanho"; /* Tooltips */ "Send this message now" = "Envia esta mensagem agora"; "Select a recipient from an Address Book" = "Seleciona um destinatário de a partir de um Catálogo"; "Include an attachment" = "Inclui um anexo"; "Save this message" = "Salva esta mensagem"; "Get new messages" = "Receber novas mensagens"; "Create a new message" = "Cria uma nova mensagem"; "Go to address book" = "Ir para Catálogo"; "Reply to the message" = "Responder a esta mensagem"; "Reply to sender and all recipients" = "Responder ao remetente e todos na mensagem"; "Forward selected message" = "Encaminha a mensagem selecionada"; "Delete selected message or folder" = "Apaga a mensagem ou pasta selecionada"; "Mark the selected messages as junk" = "Marca a mensagem selecionada como Lixo Eletrônico"; "Print this message" = "Imprimir esta mensagem"; "Stop the current transfer" = "Interromper a transferência"; "Attachment" = "Anexos"; "Unread" = "Não Lido"; "Flagged" = "Sinalizado"; /* Main Frame */ "Home" = "Início"; "Calendar" = "Calendário"; "Addressbook" = "Catálogo"; "Mail" = "Correio"; "Right Administration" = "Administração de Direitos"; "Help" = "Ajuda"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Bem-Vindo ao SOGo WebMail. Use as pastas a esquerda para exibir suas contas de email!"; "Read messages" = "Ler mensagens"; "Write a new message" = "Escrever uma nova mensagem"; "Share: " = "Compartilhamento: "; "Account: " = "Conta: "; "Shared Account: " = "Conta Compartilhada: "; /* acls */ "Access rights to" = "Direitos de acesso para"; "For user" = "Para usuário"; "Any Authenticated User" = "Qualquer Usuário Autenticado"; "List and see this folder" = "Listar e ver esta pasta"; "Read mails from this folder" = "Ler emails desta pasta"; "Mark mails read and unread" = "Marcar emails como lido e não lido"; "Modify the flags of the mails in this folder" = "Modificar a sinalização dos emails nesta pasta"; "Insert, copy and move mails into this folder" = "Inserir, copiar e mover emails nesta pasta"; "Post mails" = "Postar emails"; "Add subfolders to this folder" = "Adicionar subpastas a esta pasta"; "Remove this folder" = "Apagar esta pasta"; "Erase mails from this folder" = "Apagar emails desta pasta"; "Expunge this folder" = "Expurgar esta pasta"; "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Modificar os direitos desta pasta"; "Saved Messages.zip" = "Mensagens Salvas.zip"; "Update" = "Atualizar"; "Cancel" = "Cancelar"; /* Mail edition */ "From" = "De"; "Subject" = "Assunto"; "To" = "Para"; "Cc" = "Cc"; "Bcc" = "Bcc"; "Reply-To" = "Responder-Para"; "Add address" = "Adicionar endereço"; "Attachments:" = "Anexos:"; "Open" = "Abrir"; "Select All" = "Selecionar Tudo"; "Attach Web Page..." = "Anexar Página Web..."; "Attach File(s)..." = "Anexar Arquivo(s)..."; "to" = "Para"; "cc" = "Cc"; "bcc" = "Bcc"; "Edit Draft..." = "Editar Rascunho..."; "Load Images" = "Carregar Imagens"; "Return Receipt" = "Endereço de Resposta"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "O remetente desta mensagem pediu para ser notificado quando você ler esta mensagem. Deseja notificar o remetente?"; "Return Receipt (displayed) - %@"= "Endereço de Resposta - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Este é o Endereço de Resposta do e-mail que você enviou para %@.\n\nNota: Este Endereço de Resposta permite saber que a mensagem foi visualizada pelo destinatário. Não há garantia de que o destinatário tenha lido ou entendido o conteúdo da mensagem."; "Priority" = "Prioridade"; "highest" = "Muito Alta"; "high" = "Alta"; "normal" = "Normal"; "low" = "Baixa"; "lowest" = "Muito Baixa"; "This mail is being sent from an unsecure network!" = "Este email está sendo enviado por uma rede não segura!"; "Address Book:" = "Catálogo:"; "Search For:" = "Pesquisar Por:"; /* Popup "show" */ "all" = "todos"; "read" = "lido"; "unread" = "não lido"; "deleted" = "apagados"; "flagged" = "sinalizados"; /* MailListView */ "Sender" = "Remetente"; "Subject or Sender" = "Assunto ou Remetente"; "To or Cc" = "Para ou Cc"; "Entire Message" = "Mensagem Inteira"; "Date" = "Data"; "View" = "Visão"; "All" = "Tudo"; "No message" = "Sem mensagem"; "messages" = "mensagens"; "first" = "Primeiro"; "previous" = "Anterior"; "next" = "Próximo"; "last" = "Último"; "msgnumber_to" = "para"; "msgnumber_of" = "de"; "Mark Unread" = "Marcar como Não Lido"; "Mark Read" = "Marcar como Lido"; "Untitled" = "Sem título"; /* Tree */ "SentFolderName" = "Enviados"; "TrashFolderName" = "Lixeira"; "InboxFolderName" = "Entrada"; "DraftsFolderName" = "Rascunhos"; "SieveFolderName" = "Filtros"; "OtherUsersFolderName" = "Outros Usuários"; "SharedFoldersName" = "Pastas Compartilhadas"; "Folders" = "Pastas"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Mover …"; /* Address Popup menu */ "Add to Address Book..." = "Adicionar ao Catálogo..."; "Compose Mail To" = "Escrever Mensagem Parana"; "Create Filter From Message..." = "Criar Filtro Da Mensagem..."; /* Image Popup menu */ "Save Image" = "Salvar Imagem"; "Save Attachment" = "Salvar Anexo."; /* Mailbox popup menus */ "Open in New Mail Window" = "Abrir em uma Nova Janela"; "Copy Folder Location" = "Copiar o Local da Pasta"; "Subscribe..." = "Inscrever-se..."; "Mark Folder Read" = "Marcar Pasta como Lido..."; "New Folder..." = "Nova Pasta..."; "Compact This Folder" = "Compactar Esta Pasta"; "Search Messages..." = "Procurar Mensagens..."; "Sharing..." = "Compartilhamento..."; "New Subfolder..." = "Nova Subpasta..."; "Rename Folder..." = "Renomear Pasta..."; "Delete Folder" = "Apagar Pasta"; "Use This Folder For" = "Usar Esta Pasta Para"; "Get Messages for Account" = "Receber Mensagens por Conta"; "Properties..." = "Propriedades..."; "Delegation..." = "Delegação..."; /* Use This Folder menu */ "Sent Messages" = "Enviar Mensagens"; "Drafts" = "Rascunhos"; "Deleted Messages" = "Mensagens Apagadas"; /* Message list popup menu */ "Open Message In New Window" = "Abrir Mensagens em uma Nova Janela"; "Reply to Sender Only" = "Responder Somente para o Remetente"; "Reply to All" = "Responder a Todos"; "Edit As New..." = "Editar Como Novo..."; "Move To" = "Mover Para"; "Copy To" = "Copiar Para"; "Label" = "Etiqueta"; "Mark" = "Marcar"; "Save As..." = "Salvar Como..."; "Print Preview" = "Visualizar Impressão"; "View Message Source" = "Ver Código-Fonte da Mensagem"; "Print..." = "Imprimir..."; "Delete Message" = "Apagar Mensagem"; "Delete Selected Messages" = "Apagar Mensagens Selecionadas"; "This Folder" = "Esta Pasta"; /* Label popup menu */ "None" = "Nenhum"; /* Mark popup menu */ "As Read" = "Como Lido"; "Thread As Read" = "Tarefa Como Lido"; "As Read By Date..." = "Como Lido Por Data..."; "All Read" = "Tudo Lido"; "Flag" = "Sinalizado"; "As Junk" = "Como Lixo Eletrônico"; "As Not Junk" = "Como Não é Lixo Eletrônico"; "Run Junk Mail Controls" = "Executar Controle de Lixo Eletrônico"; /* Folder operations */ "Name :" = "Nome :"; "Enter the new name of your folder :" = "Informe o novo nome de sua pasta :"; "Do you really want to move this folder into the trash ?" = "Você realmente quer mover esta pasta para a Lixeira ?"; "Operation failed" = "Falha na Operação"; "Quota" = "Quota:"; "quotasFormat" = "%{0}% usedo em %{1} MB"; "Please select a message." = "Por favor, selecione uma mensagem."; "Please select a message to print." = "Por favor, selecione a mensagem para imprimir."; "Please select only one message to print." = "Por favor, selecione somente uma mensagem para imprimir."; "The message you have selected doesn't exist anymore." = "A mensagem que você selecionou não existe mais."; "The folder with name \"%{0}\" could not be created." = "A pasta com o nome \"%{0}\" não pode ser criada."; "This folder could not be renamed to \"%{0}\"." = "Esta pasta não pode ser renomeada para \"%{0}\"."; "The folder could not be deleted." = "A pasta não pode ser apagada."; "The trash could not be emptied." = "A Lixeira não pode ser esvaziada."; "The folder functionality could not be changed." = "A funcionalidade da pasta não pode ser alterada"; "You need to choose a non-virtual folder!" = "Você precisa escolher uma pasta não-virtual!"; "Moving a message into its own folder is impossible!" = "Mover a mensagem em sua própria pasta é impossível!"; "Copying a message into its own folder is impossible!" = "Copiar a mensagem em sua própria pasta é impossível!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "As mensagens não podem ser movidas para a lixeira. Gostaria de excluí-las imediatamente?"; /* Message editing */ "error_missingsubject" = "Está faltando o Assunto"; "error_missingrecipients" = "Sem destinatários selecionados"; "Send Anyway" = "Enviar assim mesmo"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Não é possível enviar a mensagem: todos os destinatários são inválidos."; "cannot send message (smtp) - recipients discarded:" = "Não é possível enviar a mensagem. Os seguintes endereços estão inválidos:"; "cannot send message: (smtp) error when connecting" = "Não é possível enviar a mensagem: erro ao conectar ao servidor SMTP."; /* Contacts list in mail editor */ "Email" = "Email"; "Name" = "Nome"; SOGo-2.1.1b/UI/MailerUI/UIxMailView.m0000644000000000000000000004216112247657027015507 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG Copyright (C) 2005-2013 Inverse inc. This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import // cyclic #import "WOContext+UIxMailer.h" @interface UIxMailView : UIxComponent { id currentAddress; NSString *shouldAskReceipt; NSString *matchingIdentityEMail; } @end @implementation UIxMailView static NSString *mailETag = nil; + (void) initialize { mailETag = [[NSString alloc] initWithFormat:@"\"imap4url_%@_%@_%@\"", SOGO_MAJOR_VERSION, SOGO_MINOR_VERSION, SOGO_SUBMINOR_VERSION]; NSLog (@"Note: using constant etag for mail viewer: '%@'", mailETag); } - (void) dealloc { [matchingIdentityEMail release]; [super dealloc]; } /* accessors */ - (void) setCurrentAddress: (id) _addr { currentAddress = _addr; } - (id) currentAddress { return currentAddress; } - (NSString *) messageSubject { NSString *subject; subject = [[self clientObject] decodedSubject]; return subject; } - (NSString *) panelTitle { return [NSString stringWithFormat: @"%@: %@", [self labelForKey: @"View Mail"], [self messageSubject]]; } /* links (DUP to UIxMailPartViewer!) */ - (NSString *) linkToEnvelopeAddress: (NGImap4EnvelopeAddress *) _address { // TODO: make some web-link, eg open a new compose panel? return [NSString stringWithFormat: @"mailto: %@", [_address baseEMail]]; } - (NSString *) currentAddressLink { return [self linkToEnvelopeAddress:[self currentAddress]]; } /* fetching */ - (id) message { return [[self clientObject] fetchCoreInfos]; } - (BOOL) hasCC { return [[[self clientObject] ccEnvelopeAddresses] count] > 0 ? YES : NO; } - (BOOL) hasBCC { return [[[self clientObject] bccEnvelopeAddresses] count] > 0 ? YES : NO; } - (BOOL) hasReplyTo { return [[[self clientObject] replyToEnvelopeAddresses] count] > 0 ? YES : NO; } /* viewers */ - (id) contentViewerComponent { // TODO: I would prefer to flatten the body structure prior rendering, // using some delegate to decide which parts to select for alternative. id info; info = [[self clientObject] bodyStructure]; return [[context mailRenderingContext] viewerForBodyInfo:info]; } /* actions */ - (id) defaultAction { WOResponse *response; NSString *s; /* check etag to see whether we really must rerender */ /* Note: There is one thing which *can* change for an existing message, those are the IMAP4 flags (and annotations, which we do not use). Since we don't render the flags, it should be OK, if this changes we must embed the flagging into the etag. */ s = [[context request] headerForKey: @"if-none-match"]; if (s) { if ([s rangeOfString:mailETag].length > 0) /* not perfectly correct */ { /* client already has the proper entity */ // [self logWithFormat:@"MATCH: %@ (tag %@)", s, mailETag]; if (![[self clientObject] doesMailExist]) { return [NSException exceptionWithHTTPStatus:404 /* Not Found */ reason:@"message got deleted"]; } response = [context response]; [response setStatus: 304 /* Not Modified */]; return response; } } if (![self message]) // TODO: redirect to proper error return [NSException exceptionWithHTTPStatus:404 /* Not Found */ reason:@"did not find specified message!"]; return self; } /* MDN */ - (BOOL) _userHasEMail: (NSString *) email { NSArray *identities; NSString *identityEmail; SOGoMailAccount *account; int count, max; BOOL rc; rc = NO; account = [[self clientObject] mailAccountFolder]; identities = [account identities]; max = [identities count]; for (count = 0; !rc && count < max; count++) { identityEmail = [[identities objectAtIndex: count] objectForKey: @"email"]; rc = ([identityEmail caseInsensitiveCompare: email] == NSOrderedSame); } return rc; } - (BOOL) _messageHasDraftOrMDNSentFlag { NSArray *flags; NSDictionary *coreInfos; coreInfos = [[self clientObject] fetchCoreInfos]; flags = [coreInfos objectForKey: @"flags"]; return ([flags containsObject: @"draft"] || [flags containsObject: @"$mdnsent"]); } - (NSString *) _matchingIdentityEMail { NSMutableArray *recipients; NSArray *headerRecipients; NSString *currentEMail; NGImap4EnvelopeAddress *address; NSInteger count, max; SOGoMailObject *co; if (!matchingIdentityEMail) { recipients = [NSMutableArray array]; co = [self clientObject]; headerRecipients = [co toEnvelopeAddresses]; if ([headerRecipients count]) [recipients addObjectsFromArray: headerRecipients]; headerRecipients = [co ccEnvelopeAddresses]; if ([headerRecipients count]) [recipients addObjectsFromArray: headerRecipients]; max = [recipients count]; for (count = 0; !matchingIdentityEMail && count < max; count++) { address = [recipients objectAtIndex: count]; currentEMail = [NSString stringWithFormat: @"%@@%@", [address mailbox], [address host]]; if ([self _userHasEMail: currentEMail]) { matchingIdentityEMail = currentEMail; [matchingIdentityEMail retain]; } } } return matchingIdentityEMail; } - (NSString *) _domainFromEMail: (NSString *) email { NSString *domain; NSRange separator; separator = [email rangeOfString: @"@"]; if (separator.location != NSNotFound) domain = [email substringFromIndex: NSMaxRange (separator)]; else domain = nil; return domain; } - (NSArray *) _userEMailDomains { NSMutableArray *domains; NSArray *identities; NSString *email, *domain; SOGoMailAccount *account; NSInteger count, max; account = [[self clientObject] mailAccountFolder]; identities = [account identities]; max = [identities count]; domains = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { email = [[identities objectAtIndex: count] objectForKey: @"email"]; domain = [self _domainFromEMail: email]; if (domain) [domains addObject: domain]; } return domains; } - (BOOL) _senderIsInUserDomain: (NSDictionary *) headers { NSString *sender, *senderDomain; BOOL rc; sender = [[headers objectForKey: @"from"] pureEMailAddress]; senderDomain = [self _domainFromEMail: sender]; if (senderDomain) rc = [[self _userEMailDomains] containsObject: senderDomain]; else rc = NO; return rc; } - (NSString *) _receiptAction { SOGoUserDefaults *ud; NSString *action; NSDictionary *headers; headers = [[self clientObject] mailHeaders]; ud = [[context activeUser] userDefaults]; if ([ud allowUserReceipt]) { if ([self _matchingIdentityEMail]) { if ([self _senderIsInUserDomain: headers]) action = [ud userReceiptAnyAction]; else action = [ud userReceiptOutsideDomainAction]; } else action = [ud userReceiptNonRecipientAction]; } else action = @"ignore"; return action; } - (void) _flagMessageWithMDNSent { [[self clientObject] addFlags: @"$MDNSent"]; } - (void) _appendReceiptTextToBody: (NGMimeMultipartBody *) body { NGMutableHashMap *map; NGMimeBodyPart *bodyPart; NSString *textPartFormat, *textPartMessage; map = [[NGMutableHashMap alloc] initWithCapacity: 1]; [map setObject: @"text/plain; charset=utf-8; format=flowed" forKey: @"content-type"]; bodyPart = [[NGMimeBodyPart alloc] initWithHeader: map]; [map release]; textPartFormat = [self labelForKey: @"This is a Return Receipt for the mail" @" that you sent to %@.\n\nNote: This Return Receipt" @" only acknowledges that the message was displayed" @" on the recipient's computer. There is no" @" guarantee that the recipient has read or" @" understood the message contents."]; textPartMessage = [NSString stringWithFormat: textPartFormat, [self _matchingIdentityEMail]]; [bodyPart setBody: [textPartMessage dataUsingEncoding: NSUTF8StringEncoding]]; [body addBodyPart: bodyPart]; [bodyPart release]; } - (void) _appendMDNToBody: (NGMimeMultipartBody *) body { NGMutableHashMap *map; NGMimeBodyPart *bodyPart; NSString *messageId; NSMutableString *mdnPartMessage; map = [[NGMutableHashMap alloc] initWithCapacity: 3]; [map addObject: @"message/disposition-notification; name=\"MDNPart2.txt\"" forKey: @"content-type"]; [map addObject: @"inline" forKey: @"content-disposition"]; [map addObject: @"7bit" forKey: @"content-transfer-encoding"]; bodyPart = [[NGMimeBodyPart alloc] initWithHeader: map]; [map release]; mdnPartMessage = [[NSMutableString alloc] initWithCapacity: 100]; [mdnPartMessage appendFormat: @"Reporting-UA: SOGoMail %@\n", SOGoVersion]; [mdnPartMessage appendFormat: @"Final-Recipient: rfc822;%@\n", [self _matchingIdentityEMail]]; messageId = [[self clientObject] messageId]; [mdnPartMessage appendFormat: @"Original-Message-ID: %@\n", messageId]; [mdnPartMessage appendString: @"Disposition:" @" manual-action/MDN-sent-manually; displayed"]; [bodyPart setBody: [mdnPartMessage dataUsingEncoding: NSASCIIStringEncoding]]; [mdnPartMessage release]; [body addBodyPart: bodyPart]; [bodyPart release]; } - (void) _appendHeadersToBody: (NGMimeMultipartBody *) body { NGMutableHashMap *map; NGMimeBodyPart *bodyPart; NSDictionary *coreInfos; map = [[NGMutableHashMap alloc] initWithCapacity: 3]; [map addObject: @"text/rfc822-headers; name=\"MDNPart3.txt\"" forKey: @"content-type"]; [map addObject: @"inline" forKey: @"content-disposition"]; [map addObject: @"7bit" forKey: @"content-transfer-encoding"]; bodyPart = [[NGMimeBodyPart alloc] initWithHeader: map]; [map release]; coreInfos = [[self clientObject] fetchCoreInfos]; [bodyPart setBody: [coreInfos objectForKey: @"header"]]; [body addBodyPart: bodyPart]; [bodyPart release]; } - (NGHashMap *) _receiptMessageHeaderTo: (NSString *) email { NGMutableHashMap *map; NSString *subject; map = [[NGMutableHashMap alloc] initWithCapacity: 1]; [map autorelease]; [map setObject: email forKey: @"to"]; [map setObject: [self _matchingIdentityEMail] forKey: @"from"]; [map setObject: @"multipart/report; report-type=disposition-notification" forKey: @"content-type"]; subject = [NSString stringWithFormat: [self labelForKey: @"Return Receipt (displayed) - %@"], [self messageSubject]]; [map setObject: [subject asQPSubjectString: @"utf-8"] forKey: @"subject"]; return map; } - (void) _sendEMailReceiptTo: (NSString *) email { NGMimeMultipartBody *body; NGMimeMessage *message; NGMimeMessageGenerator *generator; SOGoDomainDefaults *dd; message = [NGMimeMessage messageWithHeader: [self _receiptMessageHeaderTo: email]]; body = [[NGMimeMultipartBody alloc] initWithPart: message]; [self _appendReceiptTextToBody: body]; [self _appendMDNToBody: body]; [self _appendHeadersToBody: body]; [message setBody: body]; [body release]; dd = [[context activeUser] domainDefaults]; generator = [NGMimeMessageGenerator new]; [generator autorelease]; if (![[SOGoMailer mailerWithDomainDefaults: dd] sendMailData: [generator generateMimeFromPart: message] toRecipients: [NSArray arrayWithObject: email] sender: [self _matchingIdentityEMail] withAuthenticator: [self authenticatorInContext: context] inContext: context]) [self _flagMessageWithMDNSent]; } - (NSString *) shouldAskReceipt { NGMailAddress *mailAddress; NSDictionary *mailHeaders; NSString *email, *action; if (!shouldAskReceipt) { shouldAskReceipt = @"false"; mailHeaders = [[self clientObject] mailHeaders]; email = [mailHeaders objectForKey: @"disposition-notification-to"]; if (!email) { email = [mailHeaders objectForKey: @"x-confirm-reading-to"]; if (!email) email = [mailHeaders objectForKey: @"return-receipt-to"]; } // email here can be "foo@bar.com" or "Foo Bar " // we must extract the actual email address mailAddress = [[NGMailAddressParser mailAddressParserWithString: email] parse]; if ([mailAddress isKindOfClass: [NGMailAddress class]]) email = [mailAddress address]; else email = nil; if (email) { if (![self _userHasEMail: email] && ![self _messageHasDraftOrMDNSentFlag]) { action = [self _receiptAction]; if ([action isEqualToString: @"ask"]) { shouldAskReceipt = @"true"; [self _flagMessageWithMDNSent]; } else if ([action isEqualToString: @"send"]) [self _sendEMailReceiptTo: email]; } } } return shouldAskReceipt; } - (WOResponse *) sendMDNAction { WOResponse *response; NSDictionary *mailHeaders; NSString *email, *action; mailHeaders = [[self clientObject] mailHeaders]; email = [mailHeaders objectForKey: @"disposition-notification-to"]; if (!email) { email = [mailHeaders objectForKey: @"x-confirm-reading-to"]; if (!email) email = [mailHeaders objectForKey: @"return-receipt-to"]; } /* We perform most of the validation steps that were done in -shouldAskReceipt in order to enforce consistency. */ if (email) { if ([self _userHasEMail: email]) response = [self responseWithStatus: 403 andString: (@"One cannot send an MDN to" @" oneself.")]; else { action = [self _receiptAction]; if ([action isEqualToString: @"ask"]) { [self _sendEMailReceiptTo: email]; response = [self responseWithStatus: 204]; } else response = [self responseWithStatus: 403 andString: (@"No notification header found in" @" original message.")]; } } else response = [self responseWithStatus: 403 andString: (@"No notification header found in" @" original message.")]; return response; } /* /MDN */ - (BOOL) mailIsDraft { return [[self clientObject] isInDraftsFolder]; } - (id) redirectToParentFolder { id url; url = [[[self clientObject] container] baseURLInContext: context]; return [self redirectToLocation: url]; } /* generating response */ - (void) appendToResponse: (WOResponse *) _response inContext: (WOContext *) _ctx { UIxMailRenderingContext *mctx; [[_ctx response] setHeader:mailETag forKey:@"etag"]; mctx = [[UIxMailRenderingContext alloc] initWithViewer: self context: _ctx]; [_ctx pushMailRenderingContext: mctx]; [mctx release]; [super appendToResponse: _response inContext: _ctx]; [[_ctx popMailRenderingContext] reset]; } @end /* UIxMailView */ SOGo-2.1.1b/UI/MailerUI/NorwegianNynorsk.lproj/0000755000000000000000000000000012247657027017624 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings0000644000000000000000000002337712247657027023474 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Opprett"; "Empty Trash" = "Tøm papirkurven"; "Delete" = "Slett"; "Expunge" = "Slett"; "Forward" = "Videresend"; "Get Mail" = "Hent e-post"; "Junk" = "Søppelpost"; "Reply" = "Svar"; "Reply All" = "Svar alle"; "Print" = "Skriv ut"; "Stop" = "Stopp"; "Write" = "Skriv"; "Send" = "Send"; "Contacts" = "Kontakter"; "Attach" = "Vedlegg"; "Save" = "Lagre"; "Options" = "Innstillinger"; "Size" = "Størrelse"; /* Tooltips */ "Send this message now" = "Send meldingen nÃ¥"; "Select a recipient from an Address Book" = "Velg en mottaker fra adressebok"; "Include an attachment" = "Legg til et vedlegg"; "Save this message" = "Lagre denne meldingen"; "Get new messages" = "Hent ny melding"; "Create a new message" = "Ny e-postmelding"; "Go to address book" = "GÃ¥ til adresseboken"; "Reply to the message" = "Svar avsender"; "Reply to sender and all recipients" = "Svar avsender og alle mottakere"; "Forward selected message" = "Videresend den valgte melding"; "Delete selected message or folder" = "Slett den merkete meldingen eller mappen"; "Mark the selected messages as junk" = "Merk de markerte meldingene som søppelpost"; "Print this message" = "Skriv ut denne e-postmeldingen"; "Stop the current transfer" = "Stopp pÃ¥gÃ¥ende overføring"; "Attachment" = "Vedlegg"; "Unread" = "Ulest"; "Flagged" = "Flagget"; /* Main Frame */ "Home" = "Hjem"; "Calendar" = "Kalender"; "Addressbook" = "Adressebok"; "Mail" = "E-post"; "Right Administration" = "Rettighetsadministration"; "Help" = "Hjelp"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Velkommen til SOGo Mailer. Bruk mappeviseren pÃ¥ venstre side for Ã¥ bla i gjennom dine e-postkontoer!"; "Read messages" = "Les meldinger"; "Write a new message" = "Skriv en ny melding"; "Share: " = "Del: "; "Account: " = "Konto: "; "Shared Account: " = "Delt konto: "; /* acls */ "Default Roles" = "Standard roller"; "User rights for:" = "Brukerrettigheter til:"; "List and see this folder" = "List og se i mappen"; "Read mails from this folder" = "Les meldinger fra denne mappen"; "Mark mails read and unread" = "Markere meldinger som leste og uleste"; "Modify the flags of the mails in this folder" = "Endre flagg til meldingene i denne mappen"; "Insert, copy and move mails into this folder" = "Legg inn, kopiere og flytt meldinger til mappen"; "Post mails" = "Send e-postmeldinger"; "Add subfolders to this folder" = "Legg til undermapper til denne mappen"; "Remove this folder" = "Ta bort mappen"; "Erase mails from this folder" = "Slett meldinger fra mappen"; "Expunge this folder" = "Fjern mappen"; "Archive This Folder" = "Arkiver denne mappen"; "Modify the acl of this folder" = "Endre adgangsrettigheter til mappen"; "Saved Messages.zip" = "Lagrete Meldinger.zip"; "Update" = "Oppdater"; "Cancel" = "Avbryt"; /* Mail edition */ "From" = "Fra"; "Subject" = "Emne"; "To" = "Til"; "Cc" = "Kopi"; "Bcc" = "Blindkopi"; "Reply-To" = "Svar-til"; "Add address" = "Legg til adresse"; "Attachments:" = "Vedlegg:"; "Open" = "Ã…pne"; "Select All" = "Velg alle"; "Attach Web Page..." = "Legg til url..."; "Attach File(s)..." = "Legg til fil(er)..."; "to" = "Til"; "cc" = "Kopi"; "bcc" = "Blindkopi"; "Addressbook" = "Adressebok"; "Edit Draft..." = "Rediger utkast..."; "Load Images" = "Last ned bilder"; "Return Receipt" = "Returkvittering"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Avsender har bedt om Ã¥ bli varslet nÃ¥r du leser denne meldingen. Ønsker du Ã¥ varsle avsenderen?"; "Return Receipt (displayed) - %@"= "Returkvittering (vist) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Dette er en returkvittering pÃ¥ e-posten som du sendte til %@.\n\nMerk: Denne returkvitteringen forteller bare at meldingen ble vist hos mottaker. Det er ingen garanti at mottaker har lest eller forstÃ¥tt innholdet i e-postmeldingen."; "Priority" = "Prioritet"; "highest" = "Høyest"; "high" = "Høy"; "normal" = "Normal"; "low" = "Lav"; "lowest" = "Lavest"; "This mail is being sent from an unsecure network!" = "Denne e-posten sendes fra en usikker nettverksforbindelse!"; /* Popup "show" */ "all" = "alle"; "read" = "les"; "unread" = "ulest"; "deleted" = "slettet"; "flagged" = "flagget"; /* MailListView */ "Sender" = "Avsender"; "Subject or Sender" = "Emne eller avsender"; "To or Cc" = "Til eller Kopi"; "Entire Message" = "Hele meldingen"; "Date" = "Dato"; "View" = "Vis"; "All" = "Alle"; "Unread" = "Ulest"; "No message" = "Ingen melding"; "messages" = "meldinger"; "first" = "Første"; "previous" = "Forrige"; "next" = "Neste"; "last" = "Siste"; "msgnumber_to" = "til"; "msgnumber_of" = "av"; "Mark Unread" = "Merk som ulest"; "Mark Read" = "Merk som lest"; "Untitled" = "Uten emne"; /* Tree */ "SentFolderName" = "Sendt"; "TrashFolderName" = "Søppel"; "InboxFolderName" = "Innboks"; "DraftsFolderName" = "Kladder"; "SieveFolderName" = "Filter"; "OtherUsersFolderName" = "Other Users"; "SharedFoldersName" = "Shared Folders"; "Folders" = "Mapper"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Flytt til"; /* Address Popup menu */ "Add to Address Book..." = "Legg til adressebok..."; "Compose Mail To" = "Skriv e-postmelding til"; "Create Filter From Message..." = "Opprett filter fra en melding..."; /* Image Popup menu */ "Save Image" = "Lagre bilde"; "Save Attachment" = "Lagre vedlegg"; /* Mailbox popup menus */ "Open in New Mail Window" = "Ã…pne i nytt vindu"; "Copy Folder Location" = "Kopiere mappens lokasjon"; "Subscribe..." = "Abonnere..."; "Mark Folder Read" = "Merk mappe som lest..."; "New Folder..." = "Ny mappe..."; "Compact This Folder" = "Komprimer mappen"; "Search Messages..." = "Søk meldinger..."; "Sharing..." = "Deling..."; "New Subfolder..." = "Ny undermappe..."; "Rename Folder..." = "Endre navn pÃ¥ mappe..."; "Delete Folder" = "Slett mappe"; "Use This Folder For" = "Bruk mappen til"; "Get Messages for Account" = "Hent nya meldinger for konto"; "Properties..." = "Egenskaper..."; "Delegation..." = "Delegasjon..."; /* Use This Folder menu */ "Sent Messages" = "Sendte meldinger"; "Drafts" = "Kladd"; "Deleted Messages" = "Slettede meldinger"; /* Message list popup menu */ "Open Message In New Window" = "Ã…pne melding i nytt vindu"; "Reply to Sender Only" = "Svar kun til avsender"; "Reply to All" = "Svar alle"; "Forward" = "Videresend"; "Edit As New..." = "Redigere som nytt..."; "Move To" = "Flytt til"; "Copy To" = "Kopier til"; "Label" = "Etikett"; "Mark" = "Merk"; "Save As..." = "Lagre som..."; "Print Preview" = "ForhÃ¥ndsvisning"; "View Message Source" = "Vis meldingskilde"; "Print..." = "Skriv ut..."; "Delete Message" = "Slett melding"; "Delete Selected Messages" = "Slett markerte meldinger"; "This Folder" = "Denne mappen"; /* Label popup menu */ "None" = "Ingen"; /* Mark popup menu */ "As Read" = "Som lest"; "Thread As Read" = "Hele trÃ¥den som lest"; "As Read By Date..." = "Som lest etter dato..."; "All Read" = "Alle som leste"; "Flag" = "Legg til flagg"; "As Junk" = "Som søppel"; "As Not Junk" = "Som ikke søppel"; "Run Junk Mail Controls" = "Kjør søppelpostkontroll"; /* Folder operations */ "Name :" = "Navn: "; "Enter the new name of your folder :" = "Skriv navnet pÃ¥ mappen: "; "Do you really want to move this folder into the trash ?" = "Vil du virkelig flytte mappen till papirkurven?"; "Operation failed" = "Operasjonen misslykkes"; "Quota" = "Disktildeling"; "quotasFormat" = "%{0}% brukt av %{1} MB"; "Please select a message." = "Marker en melding."; "Please select a message to print." = "Marker en melding som skal skrives ut."; "Please select only one message to print." = "Marker bare en melding som skal skrives ut."; "The message you have selected doesn't exist anymore." = "Meldingen som du markerte finnes ikke lengre."; "The folder with name \"%{0}\" could not be created." = "Mappen \"%{0}\" kunne ikke opprettes."; "This folder could not be renamed to \"%{0}\"." = "Mappen kunnne ikke bytte navn til \"%{0}\"."; "The folder could not be deleted." = "Mappen kunne ikke slettes."; "The trash could not be emptied." = "Søppelkurven kunne ikke tømmes."; "The folder functionality could not be changed." = "Mappens funksjon kunne ikke endres."; "You need to choose a non-virtual folder!" = "Du mÃ¥ velge en ikke virtuell mappe!"; "Moving a message into its own folder is impossible!" = "Det er ikke mulig Ã¥ flytte en e-postmelding til samme mappe!"; "Copying a message into its own folder is impossible!" = "Det er ikke mulig Ã¥ kopiere en e-postmelding til samme mappe!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Meldingene kunne ikke flyttes til søppelmappen. Vil du slette dem umiddelbart?"; /* Message editing */ "error_validationfailed" = "Validering misslykket"; "error_missingsubject" = "Emnefelt mangler"; "error_missingrecipients" = "Ingen mottagere er angitt"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; "cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; "cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; "Name" = "Navn"; "Email" = "E-post"; SOGo-2.1.1b/UI/MailerUI/Swedish.lproj/0000755000000000000000000000000012247657027015715 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Swedish.lproj/Localizable.strings0000644000000000000000000002412712247657027021557 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Skapa"; "Empty Trash" = "Töm papperskorgen"; "Delete" = "Ta bort"; "Expunge" = "Radera"; "Forward" = "Vidarebefordra"; "Get Mail" = "Hämta"; "Junk" = "Skräppost"; "Reply" = "Svara"; "Reply All" = "Svara alla"; "Print" = "Skriv ut"; "Stop" = "Stopp"; "Write" = "Skriv"; "Send" = "Skicka"; "Contacts" = "Kontakter"; "Attach" = "Bifoga"; "Save" = "Spara"; "Options" = "Alternativ"; "Size" = "Storlek"; /* Tooltips */ "Send this message now" = "Skicka meddelandet nu"; "Select a recipient from an Address Book" = "Välj en mottagare ur en adressbok"; "Include an attachment" = "Lägg till en bilaga"; "Save this message" = "Spara meddelandet"; "Get new messages" = "Hämta nya meddelanden"; "Create a new message" = "Skapa ett nytt meddelande"; "Go to address book" = "GÃ¥ till adressboken"; "Reply to the message" = "Svara avsändaren"; "Reply to sender and all recipients" = "Svara avsändaren och även alla mottagare"; "Forward selected message" = "Vidarebefordra meddelandet"; "Delete selected message or folder" = "Ta bort markerat meddelande eller mapp"; "Mark the selected messages as junk" = "Märk de markerade meddelandena som skräp"; "Print this message" = "Skriv ut detta meddelande"; "Stop the current transfer" = "Stoppa pÃ¥gÃ¥ende överföring"; "Attachment" = "Bilagor"; "Unread" = "Oläst"; "Flagged" = "Märkt"; /* Main Frame */ "Home" = "Hem"; "Calendar" = "Kalender"; "Addressbook" = "Adressbok"; "Mail" = "E-post"; "Right Administration" = "Rättighetsadministration"; "Help" = "Hjälp"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Välkommen till SOGo Mailer. Använd mappvisaren pÃ¥ vänster sida för att bläddra i dina e-post konton!"; "Read messages" = "Läs meddelanden"; "Write a new message" = "Skriv ett nytt meddelande"; "Share: " = "Dela ut: "; "Account: " = "Konto: "; "Shared Account: " = "Delat konto: "; /* acls */ "Default Roles" = "Standardroller"; "User rights for:" = "Användarrättigheter till:"; "List and see this folder" = "Lista och titta i mappen"; "Read mails from this folder" = "Läsa meddelanden i mappen"; "Mark mails read and unread" = "Markera meddelanden som lästa och olästa"; "Modify the flags of the mails in this folder" = "Ändra märkningen av meddelanden i mappen"; "Insert, copy and move mails into this folder" = "Lägga in, kopiera och flytta meddelanden till mappen"; "Post mails" = "Skicka meddelanden"; "Add subfolders to this folder" = "Lägga till undermappar till mappen"; "Remove this folder" = "Ta bort mappen"; "Erase mails from this folder" = "Radera meddelanden frÃ¥n mappen"; "Expunge this folder" = "Radera mappen"; "Archive This Folder" = "Arkivera mappen"; "Modify the acl of this folder" = "Ändra Ã¥tkomsträttigheter pÃ¥ mappen"; "Saved Messages.zip" = "Sparat Messages.zip"; "Update" = "Uppdatera"; "Cancel" = "Avbryt"; /* Mail edition */ "From" = "FrÃ¥n"; "Subject" = "Ämne"; "To" = "Till"; "Cc" = "Kopia"; "Bcc" = "Dold kopia"; "Reply-To" = "Svar-till"; "Add address" = "Lägg till adress"; "Attachments:" = "Bilagor:"; "Open" = "Öppna"; "Select All" = "Välj alla"; "Attach Web Page..." = "Bifoga webbsida..."; "Attach File(s)..." = "Bifoga fil(er)..."; "to" = "Till"; "cc" = "Kopia"; "bcc" = "Dold kopia"; "Addressbook" = "Adressbok"; "Edit Draft..." = "Redigera utkast..."; "Load Images" = "Ladda bilder"; "Return Receipt" = "Mottagningskvitto"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Avsändaren av detta meddelande har begärt att fÃ¥ bli underrättad när du läser detta meddelande. Vill du underrätta avsändaren?"; "Return Receipt (displayed) - %@"= "Mottagningskvitto (visad) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Detta är ett mottagningskvitto för meddelandet du skickade till %@.\n\nNotera: Detta mottagningskvitto bekräftar bara att meddelandet visades pÃ¥ mottagarens dator. Det finns ingen garanti att mottagaren har läst eller förstÃ¥tt innehÃ¥llet i meddelandet."; "Priority" = "Prioritet"; "highest" = "Högst"; "high" = "Hög"; "normal" = "Normal"; "low" = "LÃ¥g"; "lowest" = "Lägst"; "This mail is being sent from an unsecure network!" = "Meddelandet skickas över en osäker nätverksförbindelse!"; /* Popup "show" */ "all" = "alla"; "read" = "läst"; "unread" = "oläst"; "deleted" = "borttaget"; "flagged" = "märkt"; /* MailListView */ "Sender" = "Avsändare"; "Subject or Sender" = "Ämne eller avsändare"; "To or Cc" = "Till eller kopia"; "Entire Message" = "Hela meddelandet"; "Date" = "Datum"; "View" = "Visa"; "All" = "Alla"; "Unread" = "Oläst"; "No message" = "Inga meddelanden"; "messages" = "meddelanden"; "first" = "Första"; "previous" = "FöregÃ¥ende"; "next" = "Nästa"; "last" = "Sista"; "msgnumber_to" = "till"; "msgnumber_of" = "av"; "Mark Unread" = "Märk som oläst"; "Mark Read" = "Märk som läst"; "Untitled" = "Ämne saknas"; /* Tree */ "SentFolderName" = "Skickat"; "TrashFolderName" = "Papperskorgen"; "InboxFolderName" = "Inkorgen"; "DraftsFolderName" = "Utkast"; "SieveFolderName" = "Filter"; "OtherUsersFolderName" = "Other Users"; "SharedFoldersName" = "Shared Folders"; "Folders" = "Mappar"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Flytta …"; /* Address Popup menu */ "Add to Address Book..." = "Lägg till i adressbok..."; "Compose Mail To" = "Skriv meddelande till"; "Create Filter From Message..." = "Skapa filter frÃ¥n ett meddelande..."; /* Image Popup menu */ "Save Image" = "Spara bild"; "Save Attachment" = "Spara bilaga"; /* Mailbox popup menus */ "Open in New Mail Window" = "Öppna i nytt fönster"; "Copy Folder Location" = "Kopiera mappens sökväg"; "Subscribe..." = "Prenumrera..."; "Mark Folder Read" = "Märk mapp som läst..."; "New Folder..." = "Ny mapp..."; "Compact This Folder" = "Komprimera mapp"; "Search Messages..." = "Sök meddelanden..."; "Sharing..." = "Dela ut..."; "New Subfolder..." = "Ny undermapp..."; "Rename Folder..." = "Byt namn pÃ¥ mapp..."; "Delete Folder" = "Ta bort mapp"; "Use This Folder For" = "Använd mapp till"; "Get Messages for Account" = "Hämta nya meddelanden för konto"; "Properties..." = "Egenskaper..."; "Delegation..." = "Delegera meddelanden..."; /* Use This Folder menu */ "Sent Messages" = "Skickade meddelanden"; "Drafts" = "Utkast"; "Deleted Messages" = "Borttagna meddelanden"; /* Message list popup menu */ "Open Message In New Window" = "Öppna meddelande i nytt fönster"; "Reply to Sender Only" = "Svara endast avsändaren"; "Reply to All" = "Svara alla"; "Forward" = "Vidarebefordra"; "Edit As New..." = "Redigera som nytt..."; "Move To" = "Flytta till"; "Copy To" = "Kopiera till"; "Label" = "Etikett"; "Mark" = "Märk"; "Save As..." = "Spara som..."; "Print Preview" = "Förhandsgranska"; "View Message Source" = "Visa meddelandets källkod"; "Print..." = "Skriv ut..."; "Delete Message" = "Ta bort meddelande"; "Delete Selected Messages" = "Ta bort markerade meddelanden"; "This Folder" = "Den här mappen"; /* Label popup menu */ "None" = "Inget"; /* Mark popup menu */ "As Read" = "Som läst"; "Thread As Read" = "Hela trÃ¥den som läst"; "As Read By Date..." = "Som lästa efter datum..."; "All Read" = "Alla som lästa"; "Flag" = "Lägg till märke"; "As Junk" = "Som skräp"; "As Not Junk" = "Som icke skräp"; "Run Junk Mail Controls" = "Kör skräppostkontroll"; /* Folder operations */ "Name :" = "Namn: "; "Enter the new name of your folder :" = "Skriv namnet pÃ¥ mappen: "; "Do you really want to move this folder into the trash ?" = "Vill du verkligen flytta mappen till papperskorgen?"; "Operation failed" = "Operationen misslyckades"; "Quota" = "Disktilldelning"; "quotasFormat" = "%{0}% använt av %{1} MB"; "Please select a message." = "Markera ett meddelande."; "Please select a message to print." = "Markera meddelandet som ska skrivas ut."; "Please select only one message to print." = "Markera bara ett meddelande som ska skrivas ut."; "The message you have selected doesn't exist anymore." = "Meddelandet du markerat finns inte längre."; "The folder with name \"%{0}\" could not be created." = "Mappen \"%{0}\" kunde inte skapas."; "This folder could not be renamed to \"%{0}\"." = "Mappen kunde inte byta namn till \"%{0}\"."; "The folder could not be deleted." = "Mappen kunde inte tas bort."; "The trash could not be emptied." = "Papperskorgen kunde inte tömmas."; "The folder functionality could not be changed." = "Mappens funktion kunde inte ändras."; "You need to choose a non-virtual folder!" = "Du mÃ¥ste välja en icke virtuell mapp!"; "Moving a message into its own folder is impossible!" = "Det är inte möjligt att flytta ett meddelande till samma mapp!"; "Copying a message into its own folder is impossible!" = "Det är inte möjligt att kopiera ett meddelande till samma mapp!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Meddelandena kunde inte flyttas till papperskorgen. Vill du ta bort dem direkt?"; /* Message editing */ "error_validationfailed" = "Validering har misslyckats"; "error_missingsubject" = "Ämne saknas"; "error_missingrecipients" = "Ingen mottagare är angiven"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Meddelandet kan inte skickas: alla mottagaradresserna är felaktiga."; "cannot send message (smtp) - recipients discarded:" = "Meddelandet kan inte skickas. Följande mottagaradresser är felaktiga:"; "cannot send message: (smtp) error when connecting" = "Meddelandet kan inte skickas: ett fel uppstod i uppkopplingen mot SMTP servern."; "Name" = "Namn"; "Email" = "E-post"; SOGo-2.1.1b/UI/MailerUI/Danish.lproj/0000755000000000000000000000000012247657027015515 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Danish.lproj/Localizable.strings0000644000000000000000000002345712247657027021364 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Opret"; "Empty Trash" = "Tøm papirkurv"; "Delete" = "Slet"; "Expunge" = "Slet"; "Forward" = "Videresend"; "Get Mail" = "Hent besked"; "Junk" = "Uønsket post"; "Reply" = "Besvar"; "Reply All" = "Besvar alle"; "Print" = "Udskriv"; "Stop" = "Stop"; "Write" = "Skriv"; "Send" = "Send"; "Contacts" = "Kontakter"; "Attach" = "Vedhæft"; "Save" = "Gem"; "Options" = "Indstillinger"; "Close" = "Luk"; "Size" = "Størrelse"; /* Tooltips */ "Send this message now" = "Send denne besked nu"; "Select a recipient from an Address Book" = "Vælg en modtager fra en adressebog"; "Include an attachment" = "Medtag en vedhæftet fil"; "Save this message" = "Gem denne besked"; "Get new messages" = "Hent nye beskeder"; "Create a new message" = "Opret en ny besked"; "Go to address book" = "GÃ¥ til adressebog"; "Reply to the message" = "Svar pÃ¥ beskeden"; "Reply to sender and all recipients" = "Svar afsender og alle modtagere"; "Forward selected message" = "Videresend valgte besked"; "Delete selected message or folder" = "Slet valgte besked eller mappe"; "Mark the selected messages as junk" = "Markér de valgte meddelelser som uønsket post"; "Print this message" = "Udskriv denne besked"; "Stop the current transfer" = "Stop den aktuelle overførsel"; "Attachment" = "Vedhæftet"; "Unread" = "Ulæst"; "Flagged" = "Markeret"; /* Main Frame */ "Home" = "Hjem"; "Calendar" = "Kalender"; "Addressbook" = "Adressebog"; "Mail" = "Mail"; "Right Administration" = "Højre administration"; "Help" = "Hjælp"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Velkommen til Sogo Mailer. Brug mappernet til venstre for at gennemse dine mail-konti!"; "Read messages" = "Læs beskeder"; "Write a new message" = "Skriv en ny besked"; "Share: " = "Del:"; "Account: " = "Konto:"; "Shared Account: " = "Delt konto:"; /* acls */ "Access rights to" = "Adgangsrettigheder til"; "For user" = "For bruger"; "Any Authenticated User" = "Alle godkendte brugere"; "List and see this folder" = "Udvid og se denne mappe"; "Read mails from this folder" = "Læs beskeder fra denne mappe"; "Mark mails read and unread" = "Markér beskeder som læst og ulæst"; "Modify the flags of the mails in this folder" = "Redigér markeringerne af beskederne i denne mappe"; "Insert, copy and move mails into this folder" = "Indsæt, kopier og flyt beskeder til denne mappe"; "Post mails" = "Indsæt beskeder"; "Add subfolders to this folder" = "Tilføj undermapper til denne mappe"; "Remove this folder" = "Fjern denne mappe"; "Erase mails from this folder" = "Slet beskeder fra denne mappe"; "Expunge this folder" = "Slet denne mappe"; "Archive This Folder" = "Gem denne mappe"; "Modify the acl of this folder" = "Rediger ACL i denne mappe"; "Saved Messages.zip" = "Gemte beskeder.zip"; "Update" = "Opdatér"; "Cancel" = "Annullér"; /* Mail edition */ "From" = "Fra"; "Subject" = "Emne"; "To" = "Til"; "Cc" = "Cc"; "Bcc" = "Bcc"; "Reply-To" = "Svar til"; "Add address" = "Tilføj adresse"; "Attachments:" = "Vedhæftede filer:"; "Open" = "Ã…bn"; "Select All" = "Vælg alle"; "Attach Web Page..." = "Vedhæft hjemmeside ..."; "Attach File(s)..." = "Vedhæft fil(er) ..."; "to" = "Til"; "cc" = "Cc"; "bcc" = "Bcc"; "Edit Draft..." = "Redigér kladde ..."; "Load Images" = "Indlæs billeder"; "Return Receipt" = "Kvittering"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Afsenderen af ​​denne besked har bedt om at blive underrettet, nÃ¥r du læser denne besked. Vil du underrette afsenderen?"; "Return Receipt (displayed) - %@"= "Kvittering (vist) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Dette er en kvittering for den besked, du har sendt til %@\n\nBemærk:. Denne kvittering anerkender kun, at budskabet blev vist pÃ¥ modtagerens computer. Der er ingen garanti for, at modtageren har læst eller forstÃ¥et indholdet i beskeden."; "Priority" = "Prioritet"; "highest" = "Højeste"; "high" = "Høj"; "normal" = "Normal"; "low" = "Lav"; "lowest" = "Laveste"; "This mail is being sent from an unsecure network!" = "Denne besked bliver sendt fra et usikkert netværk!"; "Address Book:" = "Adressebog:"; "Search For:" = "Søg efter:"; /* Popup "show" */ "all" = "alle"; "read" = "Læs"; "unread" = "Ulæst"; "deleted" = "Slettet"; "flagged" = "Markerede"; /* MailListView */ "Sender" = "Afsender"; "Subject or Sender" = "Emne eller afsender"; "To or Cc" = "Til eller Cc"; "Entire Message" = "Hele beskeden"; "Date" = "Dato"; "View" = "Vis"; "All" = "Alle"; "No message" = "Ingen besked"; "messages" = "Beskeder"; "first" = "Første"; "previous" = "Forrige"; "next" = "Næste"; "last" = "Sidste"; "msgnumber_to" = "Til"; "msgnumber_of" = "Af"; "Mark Unread" = "Marker som ulæst"; "Mark Read" = "Mark som læst"; "Untitled" = "Ikke navngivet"; /* Tree */ "SentFolderName" = "Sendte Beskeder"; "TrashFolderName" = "Papirkurv"; "InboxFolderName" = "Indbakke"; "DraftsFolderName" = "Kladder"; "SieveFolderName" = "Filtre"; "OtherUsersFolderName" = "Andre brugere"; "SharedFoldersName" = "Delte mapper"; "Folders" = "Mapper"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Flyt ..."; /* Address Popup menu */ "Add to Address Book..." = "Tilføj til adressebog ..."; "Compose Mail To" = "Skriv mail til"; "Create Filter From Message..." = "Opret filter fra besked ..."; /* Image Popup menu */ "Save Image" = "Gem billede"; "Save Attachment" = "Gem vedhæftede"; /* Mailbox popup menus */ "Open in New Mail Window" = "Ã…ben i nyt vindue"; "Copy Folder Location" = "Kopier mappens lokation"; "Subscribe..." = "Abonnér ..."; "Mark Folder Read" = "Mark mappe som Læst ..."; "New Folder..." = "Ny mappe ..."; "Compact This Folder" = "Komprimér denne mappe"; "Search Messages..." = "Søg beskeder ..."; "Sharing..." = "Deling ..."; "New Subfolder..." = "Ny undermappe ..."; "Rename Folder..." = "Omdøb mappe ..."; "Delete Folder" = "Slet mappe"; "Use This Folder For" = "Brug denne mappe til"; "Get Messages for Account" = "Hent beskeder til konto"; "Properties..." = "Egenskaber ..."; "Delegation..." = "Delegationen ..."; /* Use This Folder menu */ "Sent Messages" = "Sendte beskeder"; "Drafts" = "Kladder"; "Deleted Messages" = "Slettede beskeder"; /* Message list popup menu */ "Open Message In New Window" = "Ã…ben besked i nyt vindue"; "Reply to Sender Only" = "Svar kun afsenderen"; "Reply to All" = "Svar alle"; "Edit As New..." = "Redigér som ..."; "Move To" = "Flyt til"; "Copy To" = "Kopier til"; "Label" = "Mærke"; "Mark" = "Markér"; "Save As..." = "Gem som ..."; "Print Preview" = "Se udskrift"; "View Message Source" = "Se beskedens kilde"; "Print..." = "Udskriv ..."; "Delete Message" = "Slet besked"; "Delete Selected Messages" = "Slet valgte beskeder"; "This Folder" = "Denne mappe"; /* Label popup menu */ "None" = "Ingen"; /* Mark popup menu */ "As Read" = "Som læst"; "Thread As Read" = "TrÃ¥d som læst"; "As Read By Date..." = "Som læst af dato ..."; "All Read" = "Alle læst"; "Flag" = "Markér"; "As Junk" = "Som uønsket"; "As Not Junk" = "Som Ikke uønsket"; "Run Junk Mail Controls" = "Kør uønsket post kontroller"; /* Folder operations */ "Name :" = "Navn:"; "Enter the new name of your folder :" = "Indtast det nye navn pÃ¥ din mappe:"; "Do you really want to move this folder into the trash ?" = "Er du sikker pÃ¥, at du vil flytte denne mappe til papirkurven?"; "Operation failed" = "Handlingen mislykkedes"; "Quota" = "Kvote:"; "quotasFormat" = "%{0}% used on %{1} MB"; "Please select a message." = "Vælg venligst en besked."; "Please select a message to print." = "Vælg en besked til udskrivning."; "Please select only one message to print." = "Vælg kun én besked til at udskrive."; "The message you have selected doesn't exist anymore." = "Den besked du har valgt findes ikke længere."; "The folder with name \"%{0}\" could not be created." = "Mappen med navnet \"%{0}\" kunne ikke oprettes."; "This folder could not be renamed to \"%{0}\"." = "Denne mappe kan ikke omdøbes til \"%{0}\"."; "The folder could not be deleted." = "Mappen kunne ikke slettes."; "The trash could not be emptied." = "Papirkurven kunne ikke tømmes."; "The folder functionality could not be changed." = "Mappens funktionalitet kunne ikke ændres."; "You need to choose a non-virtual folder!" = "Du skal vælge en ikke-virtuel mappe!"; "Moving a message into its own folder is impossible!" = "Det er umuligt at flytte en besked til dens egen mappe!"; "Copying a message into its own folder is impossible!" = "Det er umuligt at kopiere en besked til dens egen mappe! "; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Beskederne kunne ikke flyttes til papirkurven. Vil du slette dem med det samme?"; /* Message editing */ "error_missingsubject" = "Emne mangler"; "error_missingrecipients" = "Ingen modtagere angivet"; "Send Anyway" = "Send alligevel"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Kan ikke sende besked: alle modtagere er ugyldige."; "cannot send message (smtp) - recipients discarded:" = "Kan ikke sende besked. Følgende adresser er ugyldige:"; "cannot send message: (smtp) error when connecting" = "Kan ikke sende besked: Fejl ved oprettelse til SMTP-server."; /* Contacts list in mail editor */ "Email" = "Mail"; "Name" = "Navn"; SOGo-2.1.1b/UI/MailerUI/UIxMailWindowCloser.m0000644000000000000000000000234112247657027017210 0ustar rootroot/* Copyright (C) 2000-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import @interface UIxMailWindowCloser : WOComponent { BOOL refreshOpener; } @end @implementation UIxMailWindowCloser - (void)setRefreshOpener:(BOOL)_flag { refreshOpener = _flag; } - (BOOL)refreshOpener { return refreshOpener; } - (NSString *)refreshOpenerScript { return @"if (window.opener && !window.opener.closed) {\n" @" window.opener.location.reload();\n" @"}\n"; } @end /* UIxMailWindowCloser */ SOGo-2.1.1b/UI/MailerUI/UIxMailMoveToPopUp.m0000644000000000000000000000721412247657027016772 0ustar rootroot/* Copyright (C) 2007-2009 Inverse inc. Copyright (C) 2000-2005 SKYRIX Software AG This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import @class NSString, NSMutableArray, NSDictionary; @interface UIxMailMoveToPopUp : WOComponent { NSString *identifier; NSString *callback; id rootNodes; id item; } - (NSString *)itemDisplayString; - (NSString *)itemURL; - (void)_appendEntriesFromNodeDict:(NSDictionary *)_dict toList:(NSMutableArray *)_list withPrefix:(NSString *)_pathPrefix; @end @implementation UIxMailMoveToPopUp - (void)dealloc { [self->identifier release]; [self->callback release]; [self->rootNodes release]; [self->item release]; [super dealloc]; } /* accessors */ - (void)setIdentifier:(NSString *)_identifier { ASSIGN(self->identifier, _identifier); } - (NSString *)identifier { return self->identifier; } - (void)setCallback:(NSString *)_callback { ASSIGN(self->callback, _callback); } - (NSString *)callback { return self->callback; } - (void)setRootNodes:(id)_rootNodes { ASSIGN(self->rootNodes, _rootNodes); } - (id)rootNodes { return self->rootNodes; } - (void)setItem:(id)_item { ASSIGN(self->item, _item); } - (id)item { return self->item; } - (NSArray *)sortedNodes { NSMutableArray *r; NSDictionary *dict; r = [NSMutableArray arrayWithCapacity:10]; /* INBOX node */ dict = [[self->rootNodes objectForKey:@"children"] objectAtIndex:0]; [self _appendEntriesFromNodeDict:dict toList:r withPrefix:nil]; return r; } - (void)_appendEntriesFromNodeDict:(NSDictionary *)_dict toList:(NSMutableArray *)_list withPrefix:(NSString *)_pathPrefix { NSMutableDictionary *e; NSString *title, *link; NSArray *children; unsigned count, i; title = [_dict objectForKey:@"title"]; link = [_dict objectForKey:@"link"]; e = [[NSMutableDictionary alloc] initWithCapacity:2]; _pathPrefix = (_pathPrefix == nil) ? (id)title : (id)[NSString stringWithFormat:@"%@.%@", _pathPrefix, title]; [e setObject:_pathPrefix forKey:@"title"]; [e setObject:link forKey:@"link"]; [_list addObject:e]; [e release]; e = nil; children = [_dict objectForKey:@"children"]; count = [children count]; for (i = 0; i < count; i++) { NSDictionary *dict; dict = [children objectAtIndex:i]; [self _appendEntriesFromNodeDict:dict toList:_list withPrefix:_pathPrefix]; } } - (NSString *)itemDisplayString { return [self->item objectForKey:@"title"]; } - (NSString *)itemURL { return [self->item objectForKey:@"link"]; } - (NSString *)itemDisabledValue { return [[self itemURL] isEqualToString:@"."] ? @" disabled" : @""; } /* JavaScript */ - (NSString *)selectItemJS { static NSString *selectJS = \ @"javascript:if(!this.hasAttribute('disabled')) %@('%@');"; return [NSString stringWithFormat:selectJS, self->callback, [self itemURL]]; } @end /* UIxMailMoveToPopUp */ SOGo-2.1.1b/UI/MailerUI/UIxMailFilterPanel.m0000644000000000000000000001025012247657027016774 0ustar rootroot/* Copyright (C) 2000-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import #import #import #import @interface UIxMailFilterPanel : WOComponent { NSString *searchText; NSString *searchCriteria; } @end @implementation UIxMailFilterPanel static NSArray *filters = nil; // static NSDictionary *filterToQualifier = nil; + (void)initialize { // TODO: also available: answered, draft [custom: NotJunk and Junk] // Note: we currently cannot use: "flags != 'deleted'" static NSString *quals[] = { @"all", nil, @"read", @"flags = 'seen' AND NOT (flags = 'deleted')", @"unread", @"flags = 'unseen' AND NOT (flags = 'deleted')", @"deleted", @"flags = 'deleted'", @"flagged", @"flags = 'flagged'", nil, nil }; NSMutableDictionary *md; NSMutableArray *ma; unsigned i; #warning why not populate "filters" directly, as an NSMutableArray? md = [[NSMutableDictionary alloc] initWithCapacity:8]; ma = [[NSMutableArray alloc] initWithCapacity:4]; for (i = 0; quals[i] != nil; i += 2) { [ma addObject:quals[i]]; if (quals[i + 1] != nil) { [md setObject:[EOQualifier qualifierWithQualifierFormat:quals[i + 1]] forKey:quals[i]]; } } // filterToQualifier = [md copy]; filters = [ma copy]; [md release]; md = nil; [ma release]; ma = nil; } - (id) init { if ((self = [super init])) { searchText = nil; searchCriteria = nil; } return self; } - (void) dealloc { [searchCriteria release]; [searchText release]; [super dealloc]; } /* accessors */ - (void) setSearchText: (NSString *) _txt { ASSIGN (searchText, _txt); } - (void) setSearchCriteria: (NSString *) _txt { ASSIGN (searchText, _txt); } - (NSString *) searchText { if (!searchText) { searchText = [[context request] formValueForKey: @"value"]; [searchText retain]; } return searchText; } - (NSString *) searchCriteria { if (!searchCriteria) { searchCriteria = [[context request] formValueForKey: @"criteria"]; [searchCriteria retain]; } return searchCriteria; } /* filters */ - (NSArray *) filters { return filters; } /* qualifiers */ // - (EOQualifier *) searchTextQualifier // { // EOQualifier *q; // NSString *s; // s = [self searchText]; // if ([s length] == 0) // return nil; // q = [EOQualifier qualifierWithQualifierFormat: // @"(subject doesContain: %@) OR " // @"(from doesContain: %@)", // s, s]; // return q; // } // - (NSString *) filterLabel // { // #if 1 // return [[context page] labelForKey:[self valueForKey:@"filter"]]; // #else // return [self valueForKey:@"filter"]; // #endif // } // - (NSString *) selectedFilter // { // return [[context request] formValueForKey: @"filterpopup"]; // } // - (EOQualifier *) filterQualifier // { // NSString *selectedFilter; // selectedFilter = [self selectedFilter]; // return [selectedFilter length] > 0 // ? [filterToQualifier objectForKey:selectedFilter] : nil; // } // - (EOQualifier *) qualifier // { // EOQualifier *sq, *fq; // NSArray *qa; // sq = [self searchTextQualifier]; // fq = [self filterQualifier]; // if (fq == nil) return sq; // if (sq == nil) return fq; // qa = [NSArray arrayWithObjects:fq, sq, nil]; // return [[[EOAndQualifier alloc] initWithQualifierArray:qa] autorelease]; // } @end /* UIxMailFilterPanel */ SOGo-2.1.1b/UI/MailerUI/Polish.lproj/0000755000000000000000000000000012247657027015545 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Polish.lproj/Localizable.strings0000644000000000000000000002440512247657027021406 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Utwórz"; "Empty Trash" = "Opróżnij kosz"; "Delete" = "UsuÅ„"; "Expunge" = "Wyczyść ostatecznie"; "Forward" = "Przekaż"; "Get Mail" = "Pobierz pocztÄ™"; "Junk" = "Åšmieć"; "Reply" = "Odpowiedz"; "Reply All" = "Odpowiedz wszystkim"; "Print" = "Drukuj"; "Stop" = "Zatrzymaj"; "Write" = "Napisz"; "Send" = "WyÅ›lij"; "Contacts" = "Kontakty"; "Attach" = "Załącz"; "Save" = "Zapisz"; "Options" = "Opcje"; "Close" = "Zamknij"; "Size" = "Rozmiar"; /* Tooltips */ "Send this message now" = "WyÅ›lij teraz tÄ™ wiadomość"; "Select a recipient from an Address Book" = "Wybierz odbiorcÄ™ z książki adresowej"; "Include an attachment" = "Dodaj załącznik"; "Save this message" = "Zapisz tÄ™ wiadomość"; "Get new messages" = "Pobierz nowÄ… wiadomość"; "Create a new message" = "Utwórz nowÄ… wiadomość"; "Go to address book" = "Idź do książki adresowej"; "Reply to the message" = "Odpowiedz na wiadomość"; "Reply to sender and all recipients" = "Odpowiedz nadawcy i wszystkim odbiorcom"; "Forward selected message" = "Przekaż zaznaczonÄ… wiadomość"; "Delete selected message or folder" = "UsuÅ„ zaznaczonÄ… wiadomość lub folder"; "Mark the selected messages as junk" = "Oznacz zaznaczone wiadomoÅ›ci jako Å›mieci"; "Print this message" = "Wydrukuj tÄ™ wiadomość"; "Stop the current transfer" = "Zatrzymaj bieżący transfer"; "Attachment" = "Załącznik"; "Unread" = "Nie przeczytane"; "Flagged" = "Oflagowane"; /* Main Frame */ "Home" = "Strona główna"; "Calendar" = "Kalendarz"; "Addressbook" = "Książka adresowa"; "Mail" = "Poczta"; "Right Administration" = "Uprawnienia"; "Help" = "Pomoc"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Witaj w programie SOGo Mailer. Używaj drzewa folderów po lewej stronie by przeglÄ…dać swoje konta pocztowe!"; "Read messages" = "WiadomoÅ›ci przeczytane"; "Write a new message" = "Napisz nowÄ… wiadomość"; "Share: " = "UdostÄ™pnianie: "; "Account: " = "Konto: "; "Shared Account: " = "UdostÄ™pnione konto: "; /* acls */ "Access rights to" = "Uprawnienia dla"; "For user" = "Dla użytkownika"; "Any Authenticated User" = "Dowolny zalogowany użytkownik"; "List and see this folder" = "Wylistuj i zobacz ten folder"; "Read mails from this folder" = "Czytaj wiadomoÅ›ci z tego folderu"; "Mark mails read and unread" = "Zaznacz wiadomoÅ›ci jako przeczytane lub nie przeczytane"; "Modify the flags of the mails in this folder" = "ZmieÅ„ oflagowanie wiadomoÅ›ci w tym folderze"; "Insert, copy and move mails into this folder" = "Wstaw, kopiuj lub przenieÅ› wiadomoÅ›ci do tego folderu"; "Post mails" = "WyÅ›lij wiadomoÅ›ci"; "Add subfolders to this folder" = "Utwórz podfoldery w tym folderze"; "Remove this folder" = "UsuÅ„ ten folder"; "Erase mails from this folder" = "UsuÅ„ wiadomoÅ›ci z tego folderu"; "Expunge this folder" = "Wyczyść ostatecznie ten folder"; "Archive This Folder" = "Zarchiwizuj ten folder"; "Modify the acl of this folder" = "Modyfikuj uprawnienia ACL tego folderu"; "Saved Messages.zip" = "Zapisano Messages.zip"; "Update" = "Zaktualizuj"; "Cancel" = "Anuluj"; /* Mail edition */ "From" = "Od"; "Subject" = "Temat"; "To" = "Do"; "Cc" = "DW"; "Bcc" = "UDW"; "Reply-To" = "Odpowiedź do"; "Add address" = "Dodaj adres"; "Attachments:" = "Załączniki:"; "Open" = "Otwórz"; "Select All" = "Zaznacz wszystkie"; "Attach Web Page..." = "Załącz stronÄ™ Web"; "Attach File(s)..." = "Załącz plik(i)"; "to" = "Do"; "cc" = "DW"; "bcc" = "UDW"; "Edit Draft..." = "Edytuj szkic"; "Load Images" = "ZaÅ‚aduj obrazki"; "Return Receipt" = "Potwierdzenie"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Nadawca maila prosi o powiadomienie odczytania wiadomoÅ›ci. Czy chcesz je wysÅ‚ać?"; "Return Receipt (displayed) - %@"= "Potwierdzenie (wyÅ›wietlone) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "To jest potwierdzenie dla e-maila, który byÅ‚ wysÅ‚any do %@.\n\nUwaga: To jest potwierdzenie otwarcia maila. Nie gwarantuje ono, że odbiorca przeczytaÅ‚ wiadomość i jÄ… zrozumiaÅ‚."; "Priority" = "Priorytet"; "highest" = "Najwyższy"; "high" = "Wysoki"; "normal" = "Normalny"; "low" = "Niski"; "lowest" = "Najniższy"; "This mail is being sent from an unsecure network!" = "Ta wiadomość jest wysyÅ‚ana z niezabezpieczonej sieci!"; "Address Book:" = "Książka adresowa:"; "Search For:" = "Szukaj:"; /* Popup "show" */ "all" = "wszystkie"; "read" = "przeczytane"; "unread" = "nie przeczytane"; "deleted" = "usuniÄ™te"; "flagged" = "oflagowane"; /* MailListView */ "Sender" = "Nadawca"; "Subject or Sender" = "Temat lub nadawca"; "To or Cc" = "Do lub DW"; "Entire Message" = "CaÅ‚a wiadomość"; "Date" = "Data"; "View" = "Widok"; "All" = "Wszystkie"; "No message" = "Brak wiadomoÅ›ci"; "messages" = "wiadomoÅ›ci"; "first" = "Pierwsza"; "previous" = "Poprzednia"; "next" = "NastÄ™pna"; "last" = "Ostatnia"; "msgnumber_to" = "do"; "msgnumber_of" = "z"; "Mark Unread" = "Oznacz jako nie przeczytane"; "Mark Read" = "Oznacz jako przeczytane"; "Untitled" = "Bez tytuÅ‚u"; /* Tree */ "SentFolderName" = "WysÅ‚ane"; "TrashFolderName" = "Kosz"; "InboxFolderName" = "Odebrane"; "DraftsFolderName" = "Szkice"; "SieveFolderName" = "Filtry"; "OtherUsersFolderName" = "Inni użytkownicy"; "SharedFoldersName" = "Foldery współdzielone"; "Folders" = "Foldery"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "PrzenieÅ› …"; /* Address Popup menu */ "Add to Address Book..." = "Dodaj do książki adresowej"; "Compose Mail To" = "Utwórz wiadomość do"; "Create Filter From Message..." = "Utwórz filtr z wiadomoÅ›ci"; /* Image Popup menu */ "Save Image" = "Zapisz obrazek"; "Save Attachment" = "Zapisz załącznik"; /* Mailbox popup menus */ "Open in New Mail Window" = "Otwórz w nowym oknie"; "Copy Folder Location" = "Kopiuj poÅ‚ożenie foldera"; "Subscribe..." = "Subskrybuj"; "Mark Folder Read" = "Oznacz folder jako przeczytany"; "New Folder..." = "Nowy folder"; "Compact This Folder" = "Kompaktuj ten folder"; "Search Messages..." = "Szukaj wiadomoÅ›ci"; "Sharing..." = "UdostÄ™pnianie"; "New Subfolder..." = "Nowy podfolder"; "Rename Folder..." = "ZmieÅ„ nazwÄ™ foldera"; "Delete Folder" = "UsuÅ„ folder"; "Use This Folder For" = "Użyj tego foldera do"; "Get Messages for Account" = "Pobierz wiadomoÅ›ci z konta"; "Properties..." = "WÅ‚aÅ›ciwoÅ›ci"; "Delegation..." = "Delegacja"; /* Use This Folder menu */ "Sent Messages" = "WysÅ‚ane"; "Drafts" = "Szkice"; "Deleted Messages" = "UsuniÄ™te"; /* Message list popup menu */ "Open Message In New Window" = "Otwórz wiadomość w nowym oknie"; "Reply to Sender Only" = "Odpowiedz tylko nadawcy"; "Reply to All" = "Odpowiedz wszystkim"; "Edit As New..." = "Edytuj jako nowÄ…"; "Move To" = "PrzenieÅ› do"; "Copy To" = "Kopiuj do"; "Label" = "Etykieta"; "Mark" = "Oznacz"; "Save As..." = "Zapisz jako"; "Print Preview" = "PodglÄ…d wydruku"; "View Message Source" = "Pokaż źródÅ‚o wiadomoÅ›ci"; "Print..." = "Drukuj..."; "Delete Message" = "UsuÅ„ wiadomość"; "Delete Selected Messages" = "UsuÅ„ zaznaczone wiadomoÅ›ci"; "This Folder" = "Ten folder"; /* Label popup menu */ "None" = "Brak"; /* Mark popup menu */ "As Read" = "Jako przeczytane"; "Thread As Read" = "WÄ…tek jako przeczytany"; "As Read By Date..." = "jako przeczytane do daty"; "All Read" = "wszystkie przeczytane"; "Flag" = "Flaga"; "As Junk" = "Jako Å›mieć"; "As Not Junk" = "Jako nie-Å›mieć"; "Run Junk Mail Controls" = "Uruchom kontrole wiadomoÅ›ci Å›mieci"; /* Folder operations */ "Name :" = "Nazwa :"; "Enter the new name of your folder :" = "Wprowadź nowÄ… nazwÄ™ twojego folderu:"; "Do you really want to move this folder into the trash ?" = "Czy na pewno chcesz przenieść ten folder do kosza ?"; "Operation failed" = "Operacja nie powiodÅ‚a siÄ™"; "Quota" = "Limit:"; "quotasFormat" = "użyte %{0}% z %{1} MB"; "Please select a message." = "Zaznacz wiadomość."; "Please select a message to print." = "Zaznacz wiadomość do drukowania."; "Please select only one message to print." = "Zaznacz tylko jednÄ… wiadomość do drukowania."; "The message you have selected doesn't exist anymore." = "Zaznaczona wiadomość już nie istnieje."; "The folder with name \"%{0}\" could not be created." = "Nie można byÅ‚o utworzyć folderu o nazwie \"%{0}\"."; "This folder could not be renamed to \"%{0}\"." = "Nie można byÅ‚o zmienić nazwy folderau{0}\"."; "The folder could not be deleted." = "Nie można byÅ‚o usunąć folderu."; "The trash could not be emptied." = "Nie można byÅ‚o opróżnić kosza."; "The folder functionality could not be changed." = "Nie można byÅ‚o zmienić funkcjonalnoÅ›ci folderu."; "You need to choose a non-virtual folder!" = "Musisz wybrać folder, który nie jest wirtualny!"; "Moving a message into its own folder is impossible!" = "Przenoszenie wiadomoÅ›ci do jej obecnego folderu nie jest możliwe!"; "Copying a message into its own folder is impossible!" = "Kopiowanie wiadomoÅ›ci do jej obecnego folderu nie jest możliwe!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Wiadomość nie może być przeniesiona do kosza. Czy chcesz jÄ… skasować?"; /* Message editing */ "error_missingsubject" = "Brak tematu"; "error_missingrecipients" = "Brak odbiorców"; "Send Anyway" = "WyÅ›lij mimo wszystko"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Nie można wysÅ‚ać wiadomoÅ›ci - wszyscy odbiorcy zostali odrzuceni."; "cannot send message (smtp) - recipients discarded:" = "Nie można wysÅ‚ać wiadomoÅ›ci - poniźsi odbiorcy zostali odrzuceni:"; "cannot send message: (smtp) error when connecting" = "Nie można wysÅ‚ać wiadomoÅ›ci - błąd połączenia z serwerem SMTP"; /* Contacts list in mail editor */ "Email" = "E-mail"; "Name" = "Nazwa"; SOGo-2.1.1b/UI/MailerUI/UIxMailFolderActions.m0000644000000000000000000004037012247657027017331 0ustar rootroot/* UIxMailFolderActions.m - this file is part of SOGo * * Copyright (C) 2007-2011 Inverse inc. * * Author: Wolfgang Sourdeau * Francis Lachapelle * * 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "UIxMailFolderActions.h" @implementation UIxMailFolderActions - (WOResponse *) createFolderAction { SOGoMailFolder *co, *newFolder; WOResponse *response; NSString *folderName; co = [self clientObject]; folderName = [[context request] formValueForKey: @"name"]; if ([folderName length] > 0) { newFolder = [co lookupName: [NSString stringWithFormat: @"folder%@", folderName] inContext: context acquire: NO]; if ([newFolder create]) response = [self responseWith204]; else { response = [self responseWithStatus: 500]; [response appendContentString: @"Unable to create folder."]; } } else { response = [self responseWithStatus: 500]; [response appendContentString: @"Missing 'name' parameter."]; } return response; } - (WOResponse *) renameFolderAction { SOGoMailFolder *co; WOResponse *response; NSException *error; NSString *folderName; co = [self clientObject]; folderName = [[context request] formValueForKey: @"name"]; error = [co renameTo: folderName]; if (error) { response = [self responseWithStatus: 500]; [response appendContentString: @"Unable to rename folder."]; } else response = [self responseWith204]; return response; } - (NSURL *) _trashedURLOfFolder: (NSURL *) srcURL withCO: (SOGoMailFolder *) co { NSURL *destURL; NSString *trashFolderName, *folderName, *path, *testPath; NGImap4Connection *connection; int i = 1; id test; connection = [co imap4Connection]; folderName = [[srcURL path] lastPathComponent]; trashFolderName = [[co mailAccountFolder] trashFolderNameInContext: context]; path = [NSString stringWithFormat: @"/%@/%@", trashFolderName, folderName]; testPath = path; while ( i < 10 ) { test = [[connection client] select: testPath]; if (test && [[test objectForKey: @"result"] boolValue]) { testPath = [NSString stringWithFormat: @"%@%x", path, i]; i++; } else { path = testPath; break; } } destURL = [[NSURL alloc] initWithScheme: [srcURL scheme] host: [srcURL host] path: path]; [destURL autorelease]; return destURL; } - (WOResponse *) deleteAction { SOGoMailFolder *co, *inbox; WOResponse *response; NGImap4Connection *connection; NSException *error; NSURL *srcURL, *destURL; co = [self clientObject]; if ([co ensureTrashFolder]) { connection = [co imap4Connection]; srcURL = [co imap4URL]; destURL = [self _trashedURLOfFolder: srcURL withCO: co]; connection = [co imap4Connection]; inbox = [[co mailAccountFolder] inboxFolderInContext: context]; [[connection client] select: [inbox absoluteImap4Name]]; error = [connection moveMailboxAtURL: srcURL toURL: destURL]; if (error) { response = [self responseWithStatus: 500]; [response appendContentString: @"Unable to move folder."]; } else { // We unsubscribe to the old one, and subscribe back to the new one [[connection client] subscribe: [destURL path]]; [[connection client] unsubscribe: [srcURL path]]; response = [self responseWith204]; } } else { response = [self responseWithStatus: 500]; [response appendContentString: @"Unable to move folder."]; } return response; } - (WOResponse *) batchDeleteAction { SOGoMailFolder *co; SOGoMailAccount *account; WOResponse *response; NSArray *uids; NSString *value; NSDictionary *data; BOOL withTrash; co = [self clientObject]; value = [[context request] formValueForKey: @"uid"]; withTrash = ![[[context request] formValueForKey: @"withoutTrash"] boolValue]; response = nil; if ([value length] > 0) { uids = [value componentsSeparatedByString: @","]; response = (WOResponse *) [co deleteUIDs: uids useTrashFolder: &withTrash inContext: context]; if (!response) { if (!withTrash) { // When not using a trash folder, return the quota account = [co mailAccountFolder]; data = [NSDictionary dictionaryWithObjectsAndKeys: [account getInboxQuota], @"quotas", nil]; response = [self responseWithStatus: 200 andString: [data jsonRepresentation]]; } else response = [self responseWith204]; } } else { response = [self responseWithStatus: 500]; [response appendContentString: @"Missing 'uid' parameter."]; } return response; } - (WOResponse *) saveMessagesAction { SOGoMailFolder *co; WOResponse *response; NSArray *uids; NSString *value; co = [self clientObject]; value = [[context request] formValueForKey: @"uid"]; response = nil; if ([value length] > 0) { uids = [value componentsSeparatedByString: @","]; response = [co archiveUIDs: uids inArchiveNamed: [self labelForKey: @"Saved Messages.zip"] inContext: context]; if (!response) response = [self responseWith204]; } else { response = [self responseWithStatus: 500]; [response appendContentString: @"Missing 'uid' parameter."]; } return response; } - (id) markFolderReadAction { id response; response = [[self clientObject] addFlagsToAllMessages: @"seen"]; if (!response) response = [self responseWith204]; return response; } - (WOResponse *) exportFolderAction { WOResponse *response; response = [[self clientObject] archiveAllMessagesInContext: context]; return response; } - (WOResponse *) copyMessagesAction { SOGoMailFolder *co; SOGoMailAccount *account; WOResponse *response; NSArray *uids; NSString *value, *destinationFolder; NSDictionary *data; co = [self clientObject]; value = [[context request] formValueForKey: @"uid"]; destinationFolder = [[context request] formValueForKey: @"folder"]; response = nil; if ([value length] > 0) { uids = [value componentsSeparatedByString: @","]; response = [co copyUIDs: uids toFolder: destinationFolder inContext: context]; if (!response) { // We return the inbox quota account = [co mailAccountFolder]; data = [NSDictionary dictionaryWithObjectsAndKeys: [account getInboxQuota], @"quotas", nil]; response = [self responseWithStatus: 200 andString: [data jsonRepresentation]]; } } else { response = [self responseWithStatus: 500]; [response appendContentString: @"Missing 'uid' parameter."]; } return response; } - (WOResponse *) moveMessagesAction { SOGoMailFolder *co; WOResponse *response; NSArray *uids; NSString *value, *destinationFolder; co = [self clientObject]; value = [[context request] formValueForKey: @"uid"]; destinationFolder = [[context request] formValueForKey: @"folder"]; response = nil; if ([value length] > 0) { uids = [value componentsSeparatedByString: @","]; response = [co moveUIDs: uids toFolder: destinationFolder inContext: context]; if (!response) response = [self responseWith204]; } else { response = [self responseWithStatus: 500]; [response appendContentString: @"Missing 'uid' parameter."]; } return response; } - (void) _setFolderPurposeOnMainAccount: (NSString *) purpose inUserDefaults: (SOGoUserDefaults *) ud to: (NSString *) value { NSString *selName; SEL setter; selName = [NSString stringWithFormat: @"set%@FolderName:", purpose]; setter = NSSelectorFromString (selName); [ud performSelector: setter withObject: value]; } - (WOResponse *) _setFolderPurpose: (NSString *) purpose onAuxAccount: (int) accountIdx inUserDefaults: (SOGoUserDefaults *) ud to: (NSString *) value { NSArray *accounts; int realIdx; NSMutableDictionary *account, *mailboxes; WOResponse *response; if (accountIdx > 0) { realIdx = accountIdx - 1; accounts = [ud auxiliaryMailAccounts]; if ([accounts count] > realIdx) { account = [accounts objectAtIndex: realIdx]; mailboxes = [account objectForKey: @"mailboxes"]; if (!mailboxes) { mailboxes = [NSMutableDictionary new]; [account setObject: mailboxes forKey: @"mailboxes"]; [mailboxes release]; } [mailboxes setObject: value forKey: purpose]; [ud setAuxiliaryMailAccounts: accounts]; response = [self responseWith204]; } else response = [self responseWithStatus: 500 andString: @"You reached an impossible end."]; } else response = [self responseWithStatus: 500 andString: @"You reached an impossible end."]; return response; } - (WOResponse *) _setFolderPurpose: (NSString *) purpose { SOGoMailFolder *co; WOResponse *response; SOGoUser *owner; SOGoUserDefaults *ud; NSString *accountIdx, *traversal; co = [self clientObject]; if ([co isKindOfClass: [SOGoMailFolder class]]) { accountIdx = [[co mailAccountFolder] nameInContainer]; owner = [SOGoUser userWithLogin: [co ownerInContext: nil]]; ud = [owner userDefaults]; traversal = [co traversalFromMailAccount]; if ([accountIdx isEqualToString: @"0"]) { /* default account: we directly set the corresponding pref in the ud */ [self _setFolderPurposeOnMainAccount: purpose inUserDefaults: ud to: traversal]; response = [self responseWith204]; } else if ([[owner domainDefaults] mailAuxiliaryUserAccountsEnabled]) response = [self _setFolderPurpose: purpose onAuxAccount: [accountIdx intValue] inUserDefaults: ud to: traversal]; else response = [self responseWithStatus: 500 andString: @"You reached an impossible end."]; if ([response status] == 204) [ud synchronize]; } else { response = [self responseWithStatus: 500]; [response appendContentString: @"Unable to change the purpose of this folder."]; } return response; } - (WOResponse *) setAsDraftsFolderAction { return [self _setFolderPurpose: @"Drafts"]; } - (WOResponse *) setAsSentFolderAction { return [self _setFolderPurpose: @"Sent"]; } - (WOResponse *) setAsTrashFolderAction { return [self _setFolderPurpose: @"Trash"]; } - (WOResponse *) expungeAction { NSException *error; SOGoTrashFolder *co; SOGoMailAccount *account; NSDictionary *data; WOResponse *response; co = [self clientObject]; error = [co expunge]; if (error) { response = [self responseWithStatus: 500]; [response appendContentString: @"Unable to expunge folder."]; } else { [co flushMailCaches]; // We return the inbox quota account = [co mailAccountFolder]; data = [NSDictionary dictionaryWithObjectsAndKeys: [account getInboxQuota], @"quotas", nil]; response = [self responseWithStatus: 200 andString: [data jsonRepresentation]]; } return response; } - (WOResponse *) emptyTrashAction { NSException *error; SOGoTrashFolder *co; SOGoMailAccount *account; NSEnumerator *subfolders; WOResponse *response; NGImap4Connection *connection; NSURL *currentURL; NSDictionary *data; co = [self clientObject]; error = [co addFlagsToAllMessages: @"deleted"]; if (!error) error = [co expunge]; if (!error) { [co flushMailCaches]; // Delete folders within the trash connection = [co imap4Connection]; subfolders = [[co allFolderURLs] objectEnumerator]; while ((currentURL = [subfolders nextObject])) { [[connection client] unsubscribe: [currentURL path]]; [connection deleteMailboxAtURL: currentURL]; } } if (error) { response = [self responseWithStatus: 500]; [response appendContentString: @"Unable to empty the trash folder."]; } else { // We return the inbox quota account = [co mailAccountFolder]; data = [NSDictionary dictionaryWithObjectsAndKeys: [account getInboxQuota], @"quotas", nil]; response = [self responseWithStatus: 200 andString: [data jsonRepresentation]]; } return response; } #warning here should be done what should be done: IMAP subscription - (WOResponse *) _subscriptionStubAction { NSString *mailInvitationParam, *mailInvitationURL; WOResponse *response; SOGoMailFolder *clientObject; mailInvitationParam = [[context request] formValueForKey: @"mail-invitation"]; if ([mailInvitationParam boolValue]) { clientObject = [self clientObject]; mailInvitationURL = [[clientObject soURLToBaseContainerForCurrentUser] absoluteString]; response = [self responseWithStatus: 302]; [response setHeader: mailInvitationURL forKey: @"location"]; } else { response = [self responseWithStatus: 500]; [response appendContentString: @"How did you end up here?"]; } return response; } - (WOResponse *) subscribeAction { return [self _subscriptionStubAction]; } - (WOResponse *) unsubscribeAction { return [self _subscriptionStubAction]; } - (NSDictionary *) _unseenCount { EOQualifier *searchQualifier; NSArray *searchResult; NSDictionary *imapResult; // NSMutableDictionary *data; NGImap4Connection *connection; NGImap4Client *client; int unseen; SOGoMailFolder *folder; folder = [self clientObject]; connection = [folder imap4Connection]; client = [connection client]; if ([connection selectFolder: [folder imap4URL]]) { searchQualifier = [EOQualifier qualifierWithQualifierFormat: @"flags = %@ AND not flags = %@", @"unseen", @"deleted"]; imapResult = [client searchWithQualifier: searchQualifier]; searchResult = [[imapResult objectForKey: @"RawResponse"] objectForKey: @"search"]; unseen = [searchResult count]; } else unseen = 0; return [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: unseen] forKey: @"unseen"]; } - (WOResponse *) unseenCountAction { WOResponse *response; NSDictionary *data; response = [self responseWithStatus: 200]; data = [self _unseenCount]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; [response appendContentString: [data jsonRepresentation]]; return response; } @end SOGo-2.1.1b/UI/MailerUI/WOContext+UIxMailer.m0000644000000000000000000000273112247657027017070 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import #import #import "UIxMailFormatter.h" #import "WOContext+UIxMailer.h" @implementation WOContext(UIxMailer) // TODO: make configurable // TODO: cache! - (NSFormatter *) mailDateFormatter { return [[self activeUser] dateFormatterInContext: self]; } - (UIxEnvelopeAddressFormatter *) mailEnvelopeAddressFormatter { return [[[UIxEnvelopeAddressFormatter alloc] init] autorelease]; } - (NSFormatter *) mailEnvelopeFullAddressFormatter { return [[[UIxEnvelopeAddressFormatter alloc] initWithMaxLength:256 generateFullEMail:YES] autorelease]; } @end /* WOContext(UIxMailer) */ SOGo-2.1.1b/UI/MailerUI/UIxFilterList.m0000644000000000000000000000543012247657027016051 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import #import #import #import /* UIxFilterList This component shows a list of filter scripts and is (usually) attached to a SOGoSieveScriptsFolder object. */ @interface UIxFilterList : UIxComponent { NSArray *filters; id filter; } @end @implementation UIxFilterList - (void)dealloc { [self->filter release]; [self->filters release]; [super dealloc]; } /* notifications */ - (void)sleep { [self->filter release]; self->filter = nil; [self->filters release]; self->filters = nil; [super sleep]; } /* accessors */ - (void)setFilter:(id)_msg { ASSIGN(self->filter, _msg); } - (id)filter { return self->filter; } - (NSArray *)filters { return self->filters; } - (NSString *)panelTitle { return [self labelForKey:@"Mail Filters"]; } /* JavaScript code */ - (NSString *)clickedFilterJS { /* return 'false' aborts processing */ return [NSString stringWithFormat: @"clickedFilter(this, '%@'); return false", [self filter]]; } /* creating scripts */ - (NSString *)newScriptName { NSCalendarDate *now; now = [NSCalendarDate date]; return [NSString stringWithFormat:@"MyFilter-%04d%02d%02d-%02d%02d%02d", [now yearOfCommonEra], [now monthOfYear], [now dayOfMonth], [now hourOfDay], [now minuteOfHour], [now secondOfMinute]]; } /* actions */ - (id)defaultAction { [self debugWithFormat:@"fetch scripts in: %@", [self clientObject]]; self->filters = [[[self clientObject] toOneRelationshipKeys] copy]; return self; } - (id)createAction { NSString *newURL; newURL = [[self clientObject] baseURLInContext:[self context]]; if (![newURL hasSuffix:@"/"]) newURL = [newURL stringByAppendingString:@"/"]; newURL = [newURL stringByAppendingString:[self newScriptName]]; newURL = [newURL stringByAppendingString:@"/edit"]; return [self redirectToLocation:newURL]; } @end /* UIxFilterList */ SOGo-2.1.1b/UI/MailerUI/Hungarian.lproj/0000755000000000000000000000000012247657027016223 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Hungarian.lproj/Localizable.strings0000644000000000000000000002536512247657027022072 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Új üzenet"; "Empty Trash" = "Lomtár ürítése"; "Delete" = "Törlés"; "Expunge" = "Megjelölés töröltként"; "Forward" = "Továbbítás"; "Get Mail" = "Letöltés"; "Junk" = "Szemét"; "Reply" = "Válasz"; "Reply All" = "Válasz mindenkinek"; "Print" = "Nyomtatás"; "Stop" = "Leállítás"; "Write" = "Levélírás"; "Send" = "Küldés"; "Contacts" = "Kapcsolatok"; "Attach" = "Melléklet"; "Save" = "Mentés"; "Options" = "Beállítások"; "Close" = "Bezárás"; "Size" = "Méret"; /* Tooltips */ "Send this message now" = "Üzenet azonnali küldése"; "Select a recipient from an Address Book" = "Címzett kiválasztása egy címjegyzékbÅ‘l"; "Include an attachment" = "Melléklet hozzáadása"; "Save this message" = "Üzenet mentése"; "Get new messages" = "Új üzenetek letöltése"; "Create a new message" = "Új üzenet létrehozása"; "Go to address book" = "Címjegyzék"; "Reply to the message" = "Válasz az üzenetre"; "Reply to sender and all recipients" = "Válasz a feladónak és az összes címzettnek"; "Forward selected message" = "A kijelölt üzenet továbbítása"; "Delete selected message or folder" = "A kijelölt üzenet vagy mappa törlése"; "Mark the selected messages as junk" = "Kijelölt üzenetek megjelölése, mint szemét"; "Print this message" = "Üzenet nyomtatása"; "Stop the current transfer" = "Küldés megszakítása"; "Attachment" = "Melléklet"; "Unread" = "Olvasatlan"; "Flagged" = "Csillagozott"; /* Main Frame */ "Home" = "KezdÅ‘lap"; "Calendar" = "Naptár"; "Addressbook" = "Címjegyzék"; "Mail" = "Üzenetek"; "Right Administration" = "Jogosultságok kezelése"; "Help" = "Súgó"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Üdvözöljük a SOGo levelezÅ‘ rendszerben. A baloldali fában tallózhat a levelezÅ‘ fiókjai között."; "Read messages" = "Üzenetek olvasása"; "Write a new message" = "Új üzenet írása"; "Share: " = "Megosztás: "; "Account: " = "Fiók: "; "Shared Account: " = "Megosztott fiók: "; /* acls */ "Access rights to" = "Hozzáférés az alábbiaknak:"; "For user" = "Felhasználónak"; "Any Authenticated User" = "Bejelentkezett felhasználók"; "List and see this folder" = "Mappa megtekintése és listázása"; "Read mails from this folder" = "Üzenetek olvasása a mappában"; "Mark mails read and unread" = "Üzenetek olvasottnak vagy olvasatlannak jelölése"; "Modify the flags of the mails in this folder" = "Üzenetek megjelölésének megváltoztatása a mappában"; "Insert, copy and move mails into this folder" = "Üzenetek beillesztése, másolása, mozgatása a mappában"; "Post mails" = "Üzenetek küldése"; "Add subfolders to this folder" = "Almappa hozzáadása a mappához"; "Remove this folder" = "Mappa törlése"; "Erase mails from this folder" = "Üzenetek törlése a mappából"; "Expunge this folder" = "Mappa megjelölése töröltként"; "Archive This Folder" = "Mappa archiválása"; "Modify the acl of this folder" = "Mappa jogosultságainak szerkesztése"; "Saved Messages.zip" = "Messages.zip elmentve"; "Update" = "Mentés"; "Cancel" = "Mégsem"; /* Mail edition */ "From" = "Feladó"; "Subject" = "Tárgy"; "To" = "Címzett"; "Cc" = "Másolat"; "Bcc" = "Titkos másolat"; "Reply-To" = "Válaszcím"; "Add address" = "Cím hozzáadása"; "Attachments:" = "Mellékletek:"; "Open" = "Megnyitás"; "Select All" = "Összes kijelölése"; "Attach Web Page..." = "Weboldal csatolása"; "Attach File(s)..." = "Fájl(ok) csatolása"; "to" = "Címzett"; "cc" = "Másolat"; "bcc" = "Titkos másolat"; "Edit Draft..." = "Piszkozat szerkesztése..."; "Load Images" = "Képek betöltése"; "Return Receipt" = "Visszaigazolás"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "A levél küldÅ‘je értesítést kér arról, hogy üzenetét elolvasta. Kíván visszaigazolást küldeni?"; "Return Receipt (displayed) - %@"= "Visszaigazolás (megjelenítés) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Ez egy %@ címre küldött levél visszaigazolása.\n\nMegjegyzés: A visszaigazolás csak azt igazolja, hogy a levél a címzett számítógépén meg lett jelenítve. Nincs garancia arra, hogy a címzett el is olvasta, illetve megértette a levél tartalmát."; "Priority" = "SürgÅ‘sség"; "highest" = "nagyon sürgÅ‘s"; "high" = "sürgÅ‘s"; "normal" = "átlagos"; "low" = "nem nagyon sürgÅ‘s"; "lowest" = "nem sürgÅ‘s"; "This mail is being sent from an unsecure network!" = "A levelet nem biztonságos hálózatból készül elküldeni!"; "Address Book:" = "Címjegyzék:"; "Search For:" = "Keresés:"; /* Popup "show" */ "all" = "összes"; "read" = "olvasott"; "unread" = "olvasatlan"; "deleted" = "törölt"; "flagged" = "csillagozott"; /* MailListView */ "Sender" = "Feladó"; "Subject or Sender" = "Tárgy vagy feladó"; "To or Cc" = "Címzett vagy másolat"; "Entire Message" = "A teljes üzenet"; "Date" = "Dátum"; "View" = "Nézet"; "All" = "Összes"; "No message" = "Nincs üzenete"; "messages" = "üzenetek"; "first" = "ElsÅ‘"; "previous" = "ElÅ‘zÅ‘"; "next" = "KövetkezÅ‘"; "last" = "Utolsó"; "msgnumber_to" = "az alábbiaknak"; "msgnumber_of" = "az alábbitól:"; "Mark Unread" = "Megjelölés olvasatlanként"; "Mark Read" = "Megjelölés olvasottként"; "Untitled" = "Névtelen"; /* Tree */ "SentFolderName" = "Elküldött üzenetek"; "TrashFolderName" = "Lomtár"; "InboxFolderName" = "Beérkezett üzenetek"; "DraftsFolderName" = "Piszkozatok"; "SieveFolderName" = "SzűrÅ‘k"; "OtherUsersFolderName" = "Egyéb felhasználók"; "SharedFoldersName" = "Megosztott mappák"; "Folders" = "Mappák"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Ãthelyezés ide: …"; /* Address Popup menu */ "Add to Address Book..." = "Hozzáadás a címjegyzékhez..."; "Compose Mail To" = "Üzenet írása"; "Create Filter From Message..." = "SzűrÅ‘ létrehozása az üzenet alapján..."; /* Image Popup menu */ "Save Image" = "Kép mentése"; "Save Attachment" = "Melléklet mentése"; /* Mailbox popup menus */ "Open in New Mail Window" = "Megnyitás új üzenet ablakban"; "Copy Folder Location" = "Mappa helyének másolása"; "Subscribe..." = "Feliratkozás..."; "Mark Folder Read" = "Mappa megjelölése olvasottként..."; "New Folder..." = "Új mappa..."; "Compact This Folder" = "Mappa tömörítése"; "Search Messages..." = "Üzenetek keresése..."; "Sharing..." = "Megosztás..."; "New Subfolder..." = "Új almappa..."; "Rename Folder..." = "Mappa átnevezése..."; "Delete Folder" = "Mappa törlése"; "Use This Folder For" = "Mappa használata az alábbira:"; "Get Messages for Account" = "Fiók üzeneteinek letöltése"; "Properties..." = "Tulajdonságok..."; "Delegation..." = "Jogok átadása..."; /* Use This Folder menu */ "Sent Messages" = "Elküldött üzenetek"; "Drafts" = "Piszkozatok"; "Deleted Messages" = "Törölt üzenetek"; /* Message list popup menu */ "Open Message In New Window" = "Üzenet megnyitása új ablakban"; "Reply to Sender Only" = "Válasz csak a feladónak"; "Reply to All" = "Válasz mindenkinek"; "Edit As New..." = "Szerkesztés újként..."; "Move To" = "Ãthelyezés"; "Copy To" = "Másolás"; "Label" = "Cimke"; "Mark" = "Megjelölés"; "Save As..." = "Mentés másként..."; "Print Preview" = "Nyomtatási kép"; "View Message Source" = "Üzenet forrása"; "Print..." = "Nyomtatás..."; "Delete Message" = "Üzenet törlése"; "Delete Selected Messages" = "Kiválasztott üzenetek törlése"; "This Folder" = "Aktulis mappa"; /* Label popup menu */ "None" = "Nincs cimke"; /* Mark popup menu */ "As Read" = "Olvasottként"; "Thread As Read" = "Olvasott témacsoportonként"; "As Read By Date..." = "Olvasás dátuma szerint..."; "All Read" = "Mindet olvasottként"; "Flag" = "Csillagozottként"; "As Junk" = "Szemétként"; "As Not Junk" = "Nem szemétként"; "Run Junk Mail Controls" = "LevélszemétgyűjtÅ‘ futtatása"; /* Folder operations */ "Name :" = "Név:"; "Enter the new name of your folder :" = "Adja meg az új mappa nevét:"; "Do you really want to move this folder into the trash ?" = "Biztosan lomtárba kívánja helyezni ezt a mappát ?"; "Operation failed" = "A művelet megszakadt"; "Quota" = "Tárhely:"; "quotasFormat" = "Felhasznált: %{0}%,összes: %{1} MB"; "Please select a message." = "Kérem válasszon egy üzenetet."; "Please select a message to print." = "Kérem válasszon ki egy üzenetet a nyomtatáshoz."; "Please select only one message to print." = "Kérem csak egy üzenetet válasszon a nyomtatáshoz."; "The message you have selected doesn't exist anymore." = "A kijelölt üzenet már nem létezik."; "The folder with name \"%{0}\" could not be created." = "\"%{0}\" néven nem hozható létre a mappa."; "This folder could not be renamed to \"%{0}\"." = "\"%{0}\" névre nem nevezhetÅ‘ át a mappa."; "The folder could not be deleted." = "A mappa nem törölhetÅ‘."; "The trash could not be emptied." = "A lomtár nem üríthetÅ‘."; "The folder functionality could not be changed." = "A mappa funkciója nem változtatható meg."; "You need to choose a non-virtual folder!" = "Egy nem virtuális mappát lehet csak választani!"; "Moving a message into its own folder is impossible!" = "Egy üzenet nem helyezhetÅ‘ át a saját mappájába!"; "Copying a message into its own folder is impossible!" = "Egy üzenet nem másolható át a saját mappájába!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Az üzeneteket nem lehetett a szemétkosárba helyezni. Kívánja Å‘ket közvetlenül törölni?"; /* Message editing */ "error_missingsubject" = "Az üzenet tárgya hiányzik"; "error_missingrecipients" = "Nincsenek címzettek megadva"; "Send Anyway" = "Ãgy küldöm el"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Az üzenetet nem lehetett elküldeni: az összes címzett érvénytelen."; "cannot send message (smtp) - recipients discarded:" = "Az üzenetet nem lehetett elküldeni: az alábbi címzettek érvénytelenek:"; "cannot send message: (smtp) error when connecting" = "Az üzenetet nem lehetett elküldeni: hiba az SMTP kiszolgálóhoz történÅ‘ csatlakozáskor."; /* Contacts list in mail editor */ "Email" = "Email"; "Name" = "Név"; SOGo-2.1.1b/UI/MailerUI/English.lproj/0000755000000000000000000000000012247657027015700 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/English.lproj/Localizable.strings0000644000000000000000000002334112247657027021537 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Create"; "Empty Trash" = "Empty Trash"; "Delete" = "Delete"; "Expunge" = "Expunge"; "Forward" = "Forward"; "Get Mail" = "Get Mail"; "Junk" = "Junk"; "Reply" = "Reply"; "Reply All" = "Reply All"; "Print" = "Print"; "Stop" = "Stop"; "Write" = "Write"; "Send" = "Send"; "Contacts" = "Contacts"; "Attach" = "Attach"; "Save" = "Save"; "Options" = "Options"; "Close" = "Close"; "Size" = "Size"; /* Tooltips */ "Send this message now" = "Send this message now"; "Select a recipient from an Address Book" = "Select a recipient from an Address Book"; "Include an attachment" = "Include an attachment"; "Save this message" = "Save this message"; "Get new messages" = "Get new messages"; "Create a new message" = "Create a new message"; "Go to address book" = "Go to address book"; "Reply to the message" = "Reply to the message"; "Reply to sender and all recipients" = "Reply to sender and all recipients"; "Forward selected message" = "Forward selected message"; "Delete selected message or folder" = "Delete selected message or folder"; "Mark the selected messages as junk" = "Mark the selected messages as junk"; "Print this message" = "Print this message"; "Stop the current transfer" = "Stop the current transfer"; "Attachment" = "Attachment"; "Unread" = "Unread"; "Flagged" = "Flagged"; /* Main Frame */ "Home" = "Home"; "Calendar" = "Calendar"; "Addressbook" = "Address Book"; "Mail" = "Mail"; "Right Administration" = "Right Administration"; "Help" = "Help"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!"; "Read messages" = "Read messages"; "Write a new message" = "Write a new message"; "Share: " = "Share: "; "Account: " = "Account: "; "Shared Account: " = "Shared Account: "; /* acls */ "Access rights to" = "Access rights to"; "For user" = "For user"; "Any Authenticated User" = "Any Authenticated User"; "List and see this folder" = "List and see this folder"; "Read mails from this folder" = "Read mails from this folder"; "Mark mails read and unread" = "Mark mails read and unread"; "Modify the flags of the mails in this folder" = "Modify the flags of the mails in this folder"; "Insert, copy and move mails into this folder" = "Insert, copy and move mails into this folder"; "Post mails" = "Post mails"; "Add subfolders to this folder" = "Add subfolders to this folder"; "Remove this folder" = "Remove this folder"; "Erase mails from this folder" = "Erase mails from this folder"; "Expunge this folder" = "Expunge this folder"; "Archive This Folder" = "Archive this folder"; "Modify the acl of this folder" = "Modify the acl of this folder"; "Saved Messages.zip" = "Saved Messages.zip"; "Update" = "Update"; "Cancel" = "Cancel"; /* Mail edition */ "From" = "From"; "Subject" = "Subject"; "To" = "To"; "Cc" = "Cc"; "Bcc" = "Bcc"; "Reply-To" = "Reply-To"; "Add address" = "Add address"; "Attachments:" = "Attachments:"; "Open" = "Open"; "Select All" = "Select All"; "Attach Web Page..." = "Attach Web Page..."; "Attach File(s)..." = "Attach File(s)..."; "to" = "To"; "cc" = "Cc"; "bcc" = "Bcc"; "Edit Draft..." = "Edit Draft..."; "Load Images" = "Load Images"; "Return Receipt" = "Return Receipt"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; "Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "Priority"; "highest" = "Highest"; "high" = "High"; "normal" = "Normal"; "low" = "Low"; "lowest" = "Lowest"; "This mail is being sent from an unsecure network!" = "This mail is being sent from an unsecure network!"; "Address Book:" = "Address Book:"; "Search For:" = "Search For:"; /* Popup "show" */ "all" = "all"; "read" = "read"; "unread" = "unread"; "deleted" = "deleted"; "flagged" = "flagged"; /* MailListView */ "Sender" = "Sender"; "Subject or Sender" = "Subject or Sender"; "To or Cc" = "To or Cc"; "Entire Message" = "Entire Message"; "Date" = "Date"; "View" = "View"; "All" = "All"; "No message" = "No message"; "messages" = "messages"; "first" = "First"; "previous" = "Previous"; "next" = "Next"; "last" = "Last"; "msgnumber_to" = "to"; "msgnumber_of" = "of"; "Mark Unread" = "Mark Unread"; "Mark Read" = "Mark Read"; "Untitled" = "Untitled"; /* Tree */ "SentFolderName" = "Sent"; "TrashFolderName" = "Trash"; "InboxFolderName" = "Inbox"; "DraftsFolderName" = "Drafts"; "SieveFolderName" = "Filters"; "OtherUsersFolderName" = "Other Users"; "SharedFoldersName" = "Shared Folders"; "Folders" = "Folders"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Move …"; /* Address Popup menu */ "Add to Address Book..." = "Add to Address Book..."; "Compose Mail To" = "Compose Mail To"; "Create Filter From Message..." = "Create Filter From Message..."; /* Image Popup menu */ "Save Image" = "Save Image"; "Save Attachment" = "Save Attachment"; /* Mailbox popup menus */ "Open in New Mail Window" = "Open in New Mail Window"; "Copy Folder Location" = "Copy Folder Location"; "Subscribe..." = "Subscribe..."; "Mark Folder Read" = "Mark Folder Read"; "New Folder..." = "New Folder..."; "Compact This Folder" = "Compact This Folder"; "Search Messages..." = "Search Messages..."; "Sharing..." = "Sharing..."; "New Subfolder..." = "New Subfolder..."; "Rename Folder..." = "Rename Folder..."; "Delete Folder" = "Delete Folder"; "Use This Folder For" = "Use This Folder For"; "Get Messages for Account" = "Get Messages for Account"; "Properties..." = "Properties..."; "Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Sent Messages"; "Drafts" = "Drafts"; "Deleted Messages" = "Deleted Messages"; /* Message list popup menu */ "Open Message In New Window" = "Open Message In New Window"; "Reply to Sender Only" = "Reply to Sender Only"; "Reply to All" = "Reply to All"; "Edit As New..." = "Edit As New..."; "Move To" = "Move To"; "Copy To" = "Copy To"; "Label" = "Label"; "Mark" = "Mark"; "Save As..." = "Save As..."; "Print Preview" = "Print Preview"; "View Message Source" = "View Message Source"; "Print..." = "Print..."; "Delete Message" = "Delete Message"; "Delete Selected Messages" = "Delete Selected Messages"; "This Folder" = "This Folder"; /* Label popup menu */ "None" = "None"; /* Mark popup menu */ "As Read" = "As Read"; "Thread As Read" = "Thread As Read"; "As Read By Date..." = "As Read By Date..."; "All Read" = "All Read"; "Flag" = "Flag"; "As Junk" = "As Junk"; "As Not Junk" = "As Not Junk"; "Run Junk Mail Controls" = "Run Junk Mail Controls"; /* Folder operations */ "Name :" = "Name :"; "Enter the new name of your folder :" = "Enter the new name of your folder :"; "Do you really want to move this folder into the trash ?" = "Do you really want to move this folder into the trash ?"; "Operation failed" = "Operation failed"; "Quota" = "Quota:"; "quotasFormat" = "%{0}% used on %{1} MB"; "Please select a message." = "Please select a message."; "Please select a message to print." = "Please select a message to print."; "Please select only one message to print." = "Please select only one message to print."; "The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; "The folder with name \"%{0}\" could not be created." = "The folder with name \"%{0}\" could not be created."; "This folder could not be renamed to \"%{0}\"." = "This folder could not be renamed to \"%{0}\"."; "The folder could not be deleted." = "The folder could not be deleted."; "The trash could not be emptied." = "The trash could not be emptied."; "The folder functionality could not be changed." = "The folder functionality could not be changed."; "You need to choose a non-virtual folder!" = "You need to choose a non-virtual folder!"; "Moving a message into its own folder is impossible!" = "Moving a message into its own folder is impossible!"; "Copying a message into its own folder is impossible!" = "Copying a message into its own folder is impossible!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; /* Message editing */ "error_missingsubject" = "The message has no subject. Are you sure you want to send it?"; "error_missingrecipients" = "Please specify at least one recipient."; "Send Anyway" = "Send Anyway"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; "cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; "cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; /* Contacts list in mail editor */ "Email" = "Email"; "Name" = "Name"; SOGo-2.1.1b/UI/MailerUI/UIxMailAccountActions.h0000644000000000000000000000245012247657027017502 0ustar rootroot/* UIxMailAccountActions.h - this file is part of SOGo * * Copyright (C) 2007-2011 Inverse inc. * * 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 UIXMAILACCOUNTACTIONS_H #define UIXMAILACCOUNTACTIONS_H #import @class WOResponse; @interface UIxMailAccountActions : WODirectAction { NSString *inboxFolderName; NSString *draftsFolderName; NSString *sentFolderName; NSString *trashFolderName; NSString *otherUsersFolderName; NSString *sharedFoldersName; } - (WOResponse *) listMailboxesAction; @end #endif /* UIXMAILACCOUNTACTIONS_H */ SOGo-2.1.1b/UI/MailerUI/UIxMailFormatter.h0000644000000000000000000000363012247657027016531 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #ifndef __Mailer_UIxMailFormatter_H__ #define __Mailer_UIxMailFormatter_H__ #import /* UIxMailFormatter Formatters which render various mail related fields. */ @class NSData, NSString, NSCalendarDate, NSTimeZone; @interface UIxMailFormatter : NSFormatter { } /* labels */ - (NSString *)labelForKey:(NSString *)_key; @end @interface UIxMailDateFormatter : UIxMailFormatter { NSCalendarDate *now; NSTimeZone *timeZone; struct { int showOnlyTimeForToday:1; int showLabelsForNearDays:1; /* 'yesterday' instead of '2004-09-31' */ int reserved:30; } dfFlags; } /* configuration */ - (NSTimeZone *)timeZone; - (void) setTimeZone: (NSTimeZone *) newTimeZone; - (BOOL)showOnlyTimeForToday; - (BOOL)showLabelsForNearDays; @end @interface UIxEnvelopeAddressFormatter : UIxMailFormatter { NSString *separator; unsigned int maxLength; struct { int fullEMail:1; int reserved:31; } eafFlags; } - (id)initWithMaxLength:(unsigned int)_max generateFullEMail:(BOOL)_genFull; - (NSString *)stringForArray:(NSArray *)_addresses; @end #endif /* __Mailer_UIxMailFormatter_H__ */ SOGo-2.1.1b/UI/MailerUI/MailerUIProduct.m0000644000000000000000000000164112247657027016352 0ustar rootroot/* Copyright (C) 2004 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import @interface MailerUIProduct : NSObject { } @end @implementation MailerUIProduct @end /* MailerUIProduct */ SOGo-2.1.1b/UI/MailerUI/UIxMailUserRightsEditor.h0000644000000000000000000000337012247657027020035 0ustar rootroot/* UIxMailUserRightsEditor.h - this file is part of SOGo * * Copyright (C) 2007-2013 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef UIXMAILUSERRIGHTSEDITOR_H #define UIXMAILUSERRIGHTSEDITOR_H #import @interface UIxMailUserRightsEditor : UIxUserRightsEditor - (void) setUserCanReadMails: (BOOL) userCanReadMails; - (BOOL) userCanReadMails; - (void) setUserCanWriteMails: (BOOL) userCanWriteMails; - (BOOL) userCanWriteMails; - (void) setUserCanInsertMails: (BOOL) userCanInsertMails; - (BOOL) userCanInsertMails; - (void) setUserCanMarkMailsRead: (BOOL) userCanMarkMailsRead; - (BOOL) userCanMarkMailsRead; - (void) setUserCanEraseMails: (BOOL) userCanEraseMails; - (BOOL) userCanEraseMails; - (void) setUserCanCreateSubfolders: (BOOL) userCanCreateSubfolders; - (BOOL) userCanCreateSubfolders; - (void) setUserCanPostMails: (BOOL) userCanPostMails; - (BOOL) userCanPostMails; - (void) setUserIsAdministrator: (BOOL) userIsAdministrator; - (BOOL) userIsAdministrator; - (void) updateRights; @end #endif /* UIXMAILUSERRIGHTSEDITOR_H */ SOGo-2.1.1b/UI/MailerUI/Catalan.lproj/0000755000000000000000000000000012247657027015652 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Catalan.lproj/Localizable.strings0000644000000000000000000002457012247657027021516 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Redactar"; "Empty Trash" = "Buidar paperera"; "Delete" = "Esborrar"; "Expunge" = "Compactar"; "Forward" = "Reenviar"; "Get Mail" = "Rebre"; "Junk" = "Brossa"; "Reply" = "Respondre"; "Reply All" = "Respondre a tots"; "Print" = "Imprimir"; "Stop" = "Aturar"; "Write" = "Redactar"; "Send" = "Enviar"; "Contacts" = "Contactes"; "Attach" = "Adjuntar"; "Save" = "Desar"; "Options" = "Opcions"; "Close" = "Tancar"; "Size" = "Mida"; /* Tooltips */ "Send this message now" = "Enviar aquest missatge ara"; "Select a recipient from an Address Book" = "Seleccionar un destinatari d'una llibreta d'adreces"; "Include an attachment" = "Incloure un adjunt"; "Save this message" = "Desar aquest missatge"; "Get new messages" = "Rebre nous missatges"; "Create a new message" = "Crear un missatge nou"; "Go to address book" = "Anar a llibreta d'adreces"; "Reply to the message" = "Respondre al missatge"; "Reply to sender and all recipients" = "Respondre al remitent i a tots els destinataris"; "Forward selected message" = "Reenviar missatge seleccionat"; "Delete selected message or folder" = "Esborrar el missatge o la carpeta seleccionats"; "Mark the selected messages as junk" = "Marcar els missatges seleccionats com a brossa"; "Print this message" = "Imprimir aquest missatge"; "Stop the current transfer" = "Aturar la transferència"; "Attachment" = "Adjunt"; "Unread" = "No llegit"; "Flagged" = "Marcat"; /* Main Frame */ "Home" = "Inici"; "Calendar" = "Calendari"; "Addressbook" = "Llibreta d'adreces"; "Mail" = "Correu"; "Right Administration" = "Gestió de permisos"; "Help" = "Ajuda"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Benvingut a SOGo! Utilitzeu l'arbre de carpetes de l'esquerra per a navegar pels comptes de correu."; "Read messages" = "Llegir missatges"; "Write a new message" = "Redactar un missatge nou"; "Share: " = "Compartir: "; "Account: " = "Compte: "; "Shared Account: " = "Compte compartit: "; /* acls */ "Access rights to" = "Drets d'accés a"; "For user" = "Per a l'usuari"; "Any Authenticated User" = "Qualsevol usuari autenticat"; "List and see this folder" = "Llistar i veure aquesta carpeta"; "Read mails from this folder" = "Llegir corrreu d'aquesta carpeta"; "Mark mails read and unread" = "Marcar correus com a llegits o no llegits"; "Modify the flags of the mails in this folder" = "Modificar les marques dels correus en aquesta carpeta"; "Insert, copy and move mails into this folder" = "Inserir, copiar i moure correus a aquesta carpeta"; "Post mails" = "Enviar correus"; "Add subfolders to this folder" = "Afegir subcarpetes a aquesta carpeta"; "Remove this folder" = "Esborrar aquesta carpeta"; "Erase mails from this folder" = "Esborrar els correus d'aquesta carpeta"; "Expunge this folder" = "Compactar aquesta carpeta"; "Archive This Folder" = "Arxivar aquesta carpeta"; "Modify the acl of this folder" = "Modificar la llista de permisos d'aquesta carpeta"; "Saved Messages.zip" = "missatgesdesats.zip"; "Update" = "Actualitzar"; "Cancel" = "Cancel·lar"; /* Mail edition */ "From" = "De"; "Subject" = "Assummpte"; "To" = "Per a"; "Cc" = "Cc"; "Bcc" = "C/o"; "Reply-To" = "Respondre a"; "Add address" = "Afegir adreça"; "Attachments:" = "Adjunts:"; "Open" = "Obrir"; "Select All" = "Seleccionar tots"; "Attach Web Page..." = "Adjuntar pàgina Web..."; "Attach File(s)..." = "Adjuntar fitxers..."; "to" = "per a"; "cc" = "cc"; "bcc" = "c/o"; "Edit Draft..." = "Modificar esborrany..."; "Load Images" = "Carregar imatges"; "Return Receipt" = "Justificant de recepció"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "El remitent d'aquest missatge ha demanat justificant de recepció. Voleu enviar-li justificant de recepció?"; "Return Receipt (displayed) - %@"= " Justificant de recepció (mostrat) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Aquest és un justificant de recepció del missatge que has enviat a% @. \ N \ nNota: Aquest justificant de recepció només confirma que el missatge ha estat mostrat en l'ordinador del destinatari. No es garanteix que el destinatari haja llegit o entès el contingut del missatge."; "Priority" = "Prioritat"; "highest" = "Màxima"; "high" = "Alta"; "normal" = "Normal"; "low" = "Baixa"; "lowest" = "Mínima"; "This mail is being sent from an unsecure network!" = "Aquest missatge s'envia des d'una xarxa no segura."; "Address Book:" = "Llibreta d'adreces"; "Search For:" = "Cercar:"; /* Popup "show" */ "all" = "tot"; "read" = "llegit"; "unread" = "no llegit"; "deleted" = "esborrat"; "flagged" = "marcat"; /* MailListView */ "Sender" = "Remitent"; "Subject or Sender" = "Assumpte o remitent"; "To or Cc" = "Per a o CC"; "Entire Message" = "Missatge complet"; "Date" = "Data"; "View" = "Vista"; "All" = "Tot"; "No message" = "Sense missatges"; "messages" = "Missatges"; "first" = "Primer"; "previous" = "Anterior"; "next" = "Següent"; "last" = "Últim"; "msgnumber_to" = "a"; "msgnumber_of" = "de"; "Mark Unread" = "Marcar com a no llegit"; "Mark Read" = "Marcar com a llegit"; "Untitled" = "Sense títol"; /* Tree */ "SentFolderName" = "Enviats"; "TrashFolderName" = "Paperera"; "InboxFolderName" = "Safata d'entrada"; "DraftsFolderName" = "Esborranys"; "SieveFolderName" = "Filtres"; "OtherUsersFolderName" = "Altres usuaris"; "SharedFoldersName" = "Carpetes compartides"; "Folders" = "Carpetes"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Moure a …"; /* Address Popup menu */ "Add to Address Book..." = "Afegir a una llibreta d'adreces..."; "Compose Mail To" = "Crear missatge per a"; "Create Filter From Message..." = "Crear filtre a partir del missatge..."; /* Image Popup menu */ "Save Image" = "Desar imatge"; "Save Attachment" = "Guardar adjunt"; /* Mailbox popup menus */ "Open in New Mail Window" = "Obrir missatge en una finestra nova"; "Copy Folder Location" = "Copiar adreça de la carpeta"; "Subscribe..." = "Subscriure..."; "Mark Folder Read" = "Marcar carpeta com a llegida..."; "New Folder..." = "Crear carpeta..."; "Compact This Folder" = "Compactar aquesta carpeta"; "Search Messages..." = "Cercar missatges..."; "Sharing..." = "Compartir..."; "New Subfolder..." = "Crear subcarpeta..."; "Rename Folder..." = "Reanomenar carpeta..."; "Delete Folder" = "Esborrar carpeta"; "Use This Folder For" = "Usar aquesta carpeta per a"; "Get Messages for Account" = "Rebre missatges per a compte"; "Properties..." = "Propietats..."; "Delegation..." = "Delegació ..."; /* Use This Folder menu */ "Sent Messages" = "Enviar missatges"; "Drafts" = "Esborranys"; "Deleted Messages" = "Missatges esborrats"; /* Message list popup menu */ "Open Message In New Window" = "Obrir missatge en una finestra nova"; "Reply to Sender Only" = "Respondre només al remitent"; "Reply to All" = "Repondre a tots"; "Edit As New..." = "Editar com a nou..."; "Move To" = "Moure a"; "Copy To" = "Copiar a"; "Label" = "Etiquetar"; "Mark" = "Marcar"; "Save As..." = "Desar com a..."; "Print Preview" = "Vista preliminar"; "View Message Source" = "Veure format original del missatge"; "Print..." = "Imprimir..."; "Delete Message" = "Esborrar missatge"; "Delete Selected Messages" = "Esborrar missatges seleccionats"; "This Folder" = "Aquesta carpeta"; /* Label popup menu */ "None" = "Cap"; /* Mark popup menu */ "As Read" = "Com a llegits"; "Thread As Read" = "Conversa com a llegida"; "As Read By Date..." = "Com a llegits per data..."; "All Read" = "Tots llegits"; "Flag" = "Afegir estrella"; "As Junk" = "Com a correu brossa"; "As Not Junk" = "Com a correu normal"; "Run Junk Mail Controls" = "Executar controls de correu brossa"; /* Folder operations */ "Name :" = "Nom: "; "Enter the new name of your folder :" = "Introduïu el nom nou per a la carpeta: "; "Do you really want to move this folder into the trash ?" = "Voleu moure aquesta carpeta a la paperera?"; "Operation failed" = "Operació no vàlida"; "Quota" = "Quota"; "quotasFormat" = "%{0}% de %{1} Mb usats"; "Please select a message." = "Seleccioneu un missatge abans."; "Please select a message to print." = "Seleccioneu el missatge que voleu imprimir."; "Please select only one message to print." = "Per imprimir, seleccioneu només un missatge."; "The message you have selected doesn't exist anymore." = "El missatge seleccionat ja no existeix."; "The folder with name \"%{0}\" could not be created." = "La carpeta de nom \"%{0}\" no es pot crear."; "This folder could not be renamed to \"%{0}\"." = "Aquesta carpeta no es pot anomenar \"%{0}\"."; "The folder could not be deleted." = "No s'ha pogut esborrar la carpeta."; "The trash could not be emptied." = "No s'ha pogut buidar la paperera."; "The folder functionality could not be changed." = "La funció d'aquesta carpeta no es pot canviar."; "You need to choose a non-virtual folder!" = "Heu de seleccionar una carpeta no virtual."; "Moving a message into its own folder is impossible!" = "No es poden moure missatges a la mateixa carpeta."; "Copying a message into its own folder is impossible!" = "No es poden copiar missatges en la mateixa carpeta."; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Els missatges no poden traslladar-se a la paperera. Els voleu esborrar immediatament?"; /* Message editing */ "error_missingsubject" = "No heu indicat l'assumpte"; "error_missingrecipients" = "No heu indicat els destinataris"; "Send Anyway" = "Enviar igualment"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "No s'ha pogut enviar el missatge: tots els destinataris són incorrectes."; "cannot send message (smtp) - recipients discarded:" = "No s'ha pogut enviar el missatge. Les següents adreces són incorrectes:"; "cannot send message: (smtp) error when connecting" = "No s'ha pogut enviar el missatge. Error al connectar amb el servidor SMTP."; "Name" = "Nom"; "Email" = "Correu electrònic"; SOGo-2.1.1b/UI/MailerUI/GNUmakefile.preamble0000644000000000000000000000041212247657027017017 0ustar rootroot# compiler flags ADDITIONAL_CPPFLAGS += \ -Wall -DCOMPILE_FOR_GSTEP_MAKE=1 \ -DSOGO_MAJOR_VERSION="@\"$(MAJOR_VERSION)\"" \ -DSOGO_MINOR_VERSION="@\"$(MINOR_VERSION)\"" \ -DSOGO_SUBMINOR_VERSION="@\"$(SUBMINOR_VERSION)\"" SOGo-2.1.1b/UI/MailerUI/SpanishSpain.lproj/0000755000000000000000000000000012247657027016707 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/SpanishSpain.lproj/Localizable.strings0000644000000000000000000002452512247657027022553 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Crear"; "Empty Trash" = "Vaciar papelera"; "Delete" = "Borrar"; "Expunge" = "Compactar"; "Forward" = "Reenviar"; "Get Mail" = "Recibir"; "Junk" = "SPAM"; "Reply" = "Responder"; "Reply All" = "Responder a todos"; "Print" = "Imprimir"; "Stop" = "Detener"; "Write" = "Redactar"; "Send" = "Enviar"; "Contacts" = "Contactos"; "Attach" = "Adjuntar"; "Save" = "Guardar"; "Options" = "Opciones"; "Close" = "Cerrar"; "Size" = "Tamaño"; /* Tooltips */ "Send this message now" = "Enviar este mensaje ahora"; "Select a recipient from an Address Book" = "Seleccionar un destinatario de una libreta de direcciones"; "Include an attachment" = "Incluir un adjunto"; "Save this message" = "Guardar este mensaje"; "Get new messages" = "Recibir mensajes nuevos"; "Create a new message" = "Crear mensaje nuevo"; "Go to address book" = "Ir a libreta de direcciones"; "Reply to the message" = "Responder al mensaje"; "Reply to sender and all recipients" = "Responder al remitente y a todos los destinatarios"; "Forward selected message" = "Reenviar mensaje seleccionado"; "Delete selected message or folder" = "Borrar el mensaje o la carpeta seleccionados"; "Mark the selected messages as junk" = "Marcar los mensajes seleccionados como SPAM"; "Print this message" = "Imprimir este mensaje"; "Stop the current transfer" = "Detener la transferencia actual"; "Attachment" = "Adjunto"; "Unread" = "No leído"; "Flagged" = "Marcado"; /* Main Frame */ "Home" = "Inicio"; "Calendar" = "Calendario"; "Addressbook" = "Libreta de direcciones"; "Mail" = "Correo"; "Right Administration" = "Gestión de permisos"; "Help" = "Ayuda"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Bienvenido a SOGo Mailer. Use el árbol de carpetas a la izquierda para navegar por sus cuentas de correo."; "Read messages" = "Leer mensajes"; "Write a new message" = "Redactar un nuevo mensaje"; "Share: " = "Compartir: "; "Account: " = "Cuenta: "; "Shared Account: " = "Cuenta compartida: "; /* acls */ "Access rights to" = "Derechos de acceso a"; "For user" = "Para usuario"; "Any Authenticated User" = "Cualquier usuario autentificado"; "List and see this folder" = "Listar y ver esta carpeta"; "Read mails from this folder" = "Leer corrreo de esta carpeta"; "Mark mails read and unread" = "Marcar correos como leídos y no leídos"; "Modify the flags of the mails in this folder" = "Modificar los indicadores de los correos en esta carpeta"; "Insert, copy and move mails into this folder" = "Insertar, copiar y mover correos a esta carpeta"; "Post mails" = "Enviar correos"; "Add subfolders to this folder" = "Añadir subcarpetas a esta carpeta"; "Remove this folder" = "Borrar esta carpeta"; "Erase mails from this folder" = "Borrar los correos de esta carpeta"; "Expunge this folder" = "Compactar esta carpeta"; "Archive This Folder" = "Archivar esta carpeta"; "Modify the acl of this folder" = "Modificar la lista de permisos de esta carpeta"; "Saved Messages.zip" = "Guardar Mensaje.zip"; "Update" = "Actualizar"; "Cancel" = "Cancelar"; /* Mail edition */ "From" = "De"; "Subject" = "Asunto"; "To" = "Para"; "Cc" = "Cc"; "Bcc" = "CCo"; "Reply-To" = "Responder A"; "Add address" = "Añadir dirección"; "Attachments:" = "Adjuntos:"; "Open" = "Abrir"; "Select All" = "Seleccionar todo"; "Attach Web Page..." = "Adjuntar página web..."; "Attach File(s)..." = "Adjuntar fichero(s)..."; "to" = "Para"; "cc" = "Cc"; "bcc" = "CCo"; "Edit Draft..." = "Modificar borrador..."; "Load Images" = "Cargar Imágenes"; "Return Receipt" = "Acuse de Recibo"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "El remitente ha solicitado ser notificado al leerse este mensaje. ¿Quiere notificar al remitente?"; "Return Receipt (displayed) - %@"= "Acuse de Recibo (mostrado) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Este es un Acuse de Recibo del correo enviado a %@.\n\nNota: Este acuse de recibo sólo acredita que el mensaje se mostró en el ordenador del destinatario. No hay garantía de que el destinatario haya leído o comprendido el contenido del mensaje."; "Priority" = "Prioridad"; "highest" = "Muy alta"; "high" = "Alta"; "normal" = "Normal"; "low" = "Baja"; "lowest" = "Muy baja"; "This mail is being sent from an unsecure network!" = "Este mendaje es enviado desde una red no segura."; "Address Book:" = "Libreta de direcciones:"; "Search For:" = "Buscar:"; /* Popup "show" */ "all" = "todo"; "read" = "leído"; "unread" = "no leído"; "deleted" = "borrado"; "flagged" = "marcado"; /* MailListView */ "Sender" = "Remitente"; "Subject or Sender" = "Asunto o remitente"; "To or Cc" = "Para o CC"; "Entire Message" = "Mensage completo"; "Date" = "Fecha"; "View" = "Vista"; "All" = "Todo"; "No message" = "Sin mensaje"; "messages" = "mensajes"; "first" = "Primero"; "previous" = "Previo"; "next" = "Siguiente"; "last" = "Último"; "msgnumber_to" = "a"; "msgnumber_of" = "de"; "Mark Unread" = "Marcar como no leído"; "Mark Read" = "Marcar como leído"; "Untitled" = "Sin título"; /* Tree */ "SentFolderName" = "Enviados"; "TrashFolderName" = "Papelera"; "InboxFolderName" = "Bandeja de entrada"; "DraftsFolderName" = "Borradores"; "SieveFolderName" = "Filtros"; "OtherUsersFolderName" = "Otros usuarios"; "SharedFoldersName" = "Carpetas compartidas"; "Folders" = "Carpetas"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Mover a …"; /* Address Popup menu */ "Add to Address Book..." = "Añadir a una libreta de direcciones..."; "Compose Mail To" = "Crear mensaje para"; "Create Filter From Message..." = "Create filtro a partir del mensaje..."; /* Image Popup menu */ "Save Image" = "Guardar imagen"; "Save Attachment" = "Guardar adjunto"; /* Mailbox popup menus */ "Open in New Mail Window" = "Abrir mensaje en nueva ventana"; "Copy Folder Location" = "Copiar dirección de la carpeta"; "Subscribe..." = "Suscribir..."; "Mark Folder Read" = "Marcar carpeta como leída..."; "New Folder..." = "Crear carpeta..."; "Compact This Folder" = "Compactar esta carpeta"; "Search Messages..." = "Buscar mensajes..."; "Sharing..." = "Compartir..."; "New Subfolder..." = "Crear subcarpeta..."; "Rename Folder..." = "Renombrar carpeta..."; "Delete Folder" = "Borrar carpeta"; "Use This Folder For" = "Usar esta carpeta para"; "Get Messages for Account" = "Recibir mensajes para cuenta"; "Properties..." = "Propiedades..."; "Delegation..." = "Delegación..."; /* Use This Folder menu */ "Sent Messages" = "Enviar mensajes"; "Drafts" = "Borradores"; "Deleted Messages" = "Mensajes borrados"; /* Message list popup menu */ "Open Message In New Window" = "Abrir mensaje en ventana nueva"; "Reply to Sender Only" = "Responder sólo al remitente"; "Reply to All" = "Reponder a todos"; "Edit As New..." = "Editar como nuevo..."; "Move To" = "Mover a"; "Copy To" = "Copiar a"; "Label" = "Etiquetar"; "Mark" = "Marcar"; "Save As..." = "Guardar como..."; "Print Preview" = "Vista preliminar"; "View Message Source" = "Ver formato original del mensaje"; "Print..." = "Imprimir..."; "Delete Message" = "Borrar mensaje"; "Delete Selected Messages" = "Borrar mensajes selecionados"; "This Folder" = "Esta carpeta"; /* Label popup menu */ "None" = "Ninguna"; /* Mark popup menu */ "As Read" = "Como leídos"; "Thread As Read" = "Conversación como leída"; "As Read By Date..." = "Como leídos por fecha..."; "All Read" = "Todos leídos"; "Flag" = "Añadir estrella"; "As Junk" = "Como correo basura"; "As Not Junk" = "Como correo normal"; "Run Junk Mail Controls" = "Ejecutar controles de correo basura"; /* Folder operations */ "Name :" = "Nombre: "; "Enter the new name of your folder :" = "Introduzca el nuevo nombre de la carpeta: "; "Do you really want to move this folder into the trash ?" = "¿Seguro que desea mover la carpeta a la papelera?"; "Operation failed" = "Operación fallida"; "Quota" = "Cuota"; "quotasFormat" = "%{0}% de %{1} MB usados"; "Please select a message." = "Seleccione un mensaje."; "Please select a message to print." = "Seleccione el mensaje que desea imprimir."; "Please select only one message to print." = "Para imprimir, seleccione sólo un mensaje."; "The message you have selected doesn't exist anymore." = "El mensaje seleccionado ya no existe."; "The folder with name \"%{0}\" could not be created." = "La carpeta llamada \"%{0}\" no puede ser creada."; "This folder could not be renamed to \"%{0}\"." = "La carpeta no puede ser renombrada a \"%{0}\"."; "The folder could not be deleted." = "La carpeta no puede ser borrada."; "The trash could not be emptied." = "La papelera no puede ser vaciada."; "The folder functionality could not be changed." = "La funcionalidad de la carpeta no puede ser cambiada."; "You need to choose a non-virtual folder!" = "¡Ha de seleccionar una carpeta no virtual!"; "Moving a message into its own folder is impossible!" = "¡Es imposible mover los mensajes en su propia carpeta!"; "Copying a message into its own folder is impossible!" = "¡Es imposible copiar mensajes en su propia carpeta!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Los mensajes no pueden ser movidos a la papelera. ¿Quiere borrarlos inmediatamente?"; /* Message editing */ "error_missingsubject" = "No ha indicado el asunto"; "error_missingrecipients" = "No ha indicado el/los destinatario(s)"; "Send Anyway" = "Enviar de toda forma"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "No se puede enviar el mensaje: (smtp) todos los destinatarios han sido descartados"; "cannot send message (smtp) - recipients discarded:" = "No se puede enviar el mensaje: (smtp) destinatarios descartados:"; "cannot send message: (smtp) error when connecting" = "No se puede enviar el mensaje: (smtp) error de conexión"; /* Contacts list in mail editor */ "Email" = "Correo"; "Name" = "Nombre Completo"; SOGo-2.1.1b/UI/MailerUI/UIxMailUserRightsEditor.m0000644000000000000000000001351712247657027020046 0ustar rootroot/* UIxMailUserRightsEditor.m - this file is part of SOGo * * Copyright (C) 2007-2013 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import "UIxMailUserRightsEditor.h" @implementation UIxMailUserRightsEditor - (BOOL) conformsToRFC4314 { SOGoMailAccount *mailAccount; mailAccount = [[self clientObject] mailAccountFolder]; return ([mailAccount imapAclStyle] == rfc4314); } - (void) setUserCanReadMails: (BOOL) userCanReadMails { if (userCanReadMails) [self appendRight: SOGoRole_ObjectViewer]; else [self removeRight: SOGoRole_ObjectViewer]; } - (BOOL) userCanReadMails { return [userRights containsObject: SOGoRole_ObjectViewer]; } - (void) setUserCanMarkMailsRead: (BOOL) userCanMarkMailsRead { if (userCanMarkMailsRead) [self appendRight: SOGoMailRole_SeenKeeper]; else [self removeRight: SOGoMailRole_SeenKeeper]; } - (BOOL) userCanMarkMailsRead { return [userRights containsObject: SOGoMailRole_SeenKeeper]; } - (void) setUserCanWriteMails: (BOOL) userCanWriteMails { if (userCanWriteMails) [self appendRight: SOGoMailRole_Writer]; else [self removeRight: SOGoMailRole_Writer]; } - (BOOL) userCanWriteMails { return [userRights containsObject: SOGoMailRole_Writer]; } - (void) setUserCanInsertMails: (BOOL) userCanInsertMails { if (userCanInsertMails) [self appendRight: SOGoRole_ObjectCreator]; else [self removeRight: SOGoRole_ObjectCreator]; } - (BOOL) userCanInsertMails { return [userRights containsObject: SOGoRole_ObjectCreator]; } - (void) setUserCanPostMails: (BOOL) userCanPostMails { if (userCanPostMails) [self appendRight: SOGoMailRole_Poster]; else [self removeRight: SOGoMailRole_Poster]; } - (BOOL) userCanPostMails { return [userRights containsObject: SOGoMailRole_Poster]; } - (void) setUserCanCreateSubfolders: (BOOL) userCanCreateSubfolders { if (userCanCreateSubfolders) [self appendRight: SOGoRole_FolderCreator]; else [self removeRight: SOGoRole_FolderCreator]; } - (BOOL) userCanCreateSubfolders { return [userRights containsObject: SOGoRole_FolderCreator]; } - (void) setUserCanRemoveFolder: (BOOL) userCanRemoveFolder { if (userCanRemoveFolder) [self appendRight: SOGoRole_FolderEraser]; else [self removeRight: SOGoRole_FolderEraser]; } - (BOOL) userCanRemoveFolder { return [userRights containsObject: SOGoRole_FolderEraser]; } - (void) setUserCanEraseMails: (BOOL) userCanEraseMails { if (userCanEraseMails) [self appendRight: SOGoRole_ObjectEraser]; else [self removeRight: SOGoRole_ObjectEraser]; } - (BOOL) userCanEraseMails { return [userRights containsObject: SOGoRole_ObjectEraser]; } - (void) setUserCanExpungeFolder: (BOOL) userCanExpungeFolder { if (userCanExpungeFolder) [self appendRight: SOGoMailRole_Expunger]; else [self removeRight: SOGoMailRole_Expunger]; } - (BOOL) userCanExpungeFolder { return [userRights containsObject: SOGoMailRole_Expunger]; } - (void) setUserIsAdministrator: (BOOL) userIsAdministrator { if (userIsAdministrator) [self appendRight: SOGoMailRole_Administrator]; else [self removeRight: SOGoMailRole_Administrator]; } - (BOOL) userIsAdministrator { return [userRights containsObject: SOGoMailRole_Administrator]; } - (void) updateRights { WORequest *request; request = [context request]; if ([[request formValueForKey: SOGoRole_ObjectViewer] length] > 0) [self appendRight: SOGoRole_ObjectViewer]; else [self removeRight: SOGoRole_ObjectViewer]; if ([[request formValueForKey: SOGoMailRole_SeenKeeper] length] > 0) [self appendRight: SOGoMailRole_SeenKeeper]; else [self removeRight: SOGoMailRole_SeenKeeper]; if ([[request formValueForKey: SOGoMailRole_Writer] length] > 0) [self appendRight: SOGoMailRole_Writer]; else [self removeRight: SOGoMailRole_Writer]; if ([[request formValueForKey: SOGoRole_ObjectCreator] length] > 0) [self appendRight: SOGoRole_ObjectCreator]; else [self removeRight: SOGoRole_ObjectCreator]; if ([[request formValueForKey: SOGoMailRole_Poster] length] > 0) [self appendRight: SOGoMailRole_Poster]; else [self removeRight: SOGoMailRole_Poster]; if ([[request formValueForKey: SOGoRole_FolderCreator] length] > 0) [self appendRight: SOGoRole_FolderCreator]; else [self removeRight: SOGoRole_FolderCreator]; if ([[request formValueForKey: SOGoRole_FolderEraser] length] > 0) [self appendRight: SOGoRole_FolderEraser]; else [self removeRight: SOGoRole_FolderEraser]; if ([[request formValueForKey: SOGoRole_ObjectEraser] length] > 0) [self appendRight: SOGoRole_ObjectEraser]; else [self removeRight: SOGoRole_ObjectEraser]; if ([[request formValueForKey: SOGoMailRole_Expunger] length] > 0) [self appendRight: SOGoMailRole_Expunger]; else [self removeRight: SOGoMailRole_Expunger]; if ([[request formValueForKey: SOGoMailRole_Administrator] length] > 0) [self appendRight: SOGoMailRole_Administrator]; else [self removeRight: SOGoMailRole_Administrator]; } @end SOGo-2.1.1b/UI/MailerUI/bundle-info.plist0000644000000000000000000000026312247657027016442 0ustar rootroot{ requires = { bundleManagerVersion = 1; classes = ( { name = NSObject; } ); }; provides = { classes = ( ); WOComponents = ( ); }; } SOGo-2.1.1b/UI/MailerUI/Dutch.lproj/0000755000000000000000000000000012247657027015356 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Dutch.lproj/Localizable.strings0000644000000000000000000002432312247657027021216 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Aanmaken"; "Empty Trash" = "Prullenbak legen"; "Delete" = "Verwijderen"; "Expunge" = "Leegmaken"; "Forward" = "Doorsturen"; "Get Mail" = "E-mail ophalen"; "Junk" = "Ongewenst"; "Reply" = "Beantwoorden"; "Reply All" = "Allen antwoorden"; "Print" = "Afdrukken"; "Stop" = "Stoppen"; "Write" = "Opstellen"; "Send" = "Verzenden"; "Contacts" = "Adresboek"; "Attach" = "Bijlage"; "Save" = "Opslaan"; "Options" = "Opties"; "Close" = "Sluiten"; "Size" = "Grootte"; /* Tooltips */ "Send this message now" = "Stuur dit bericht nu"; "Select a recipient from an Address Book" = "Kies een ontvanger uit een adresboek"; "Include an attachment" = "Voeg een bijlage toe"; "Save this message" = "Sla dit bericht op"; "Get new messages" = "Haal nieuwe berichten"; "Create a new message" = "Maak een nieuw bericht"; "Go to address book" = "Ga naar adresboek"; "Reply to the message" = "Beantwoord het bericht"; "Reply to sender and all recipients" = "Antwoord aan verzender en alle ontvangers"; "Forward selected message" = "Geselecteerd bericht doorsturen"; "Delete selected message or folder" = "Verwijder geselecteerd bericht of map"; "Mark the selected messages as junk" = "Markeer de geselecteerde berichten als ongewenst"; "Print this message" = "Druk dit bericht af"; "Stop the current transfer" = "Stop de huidige overdracht"; "Attachment" = "Bijlage"; "Unread" = "Ongelezen"; "Flagged" = "Gemarkeerd"; /* Main Frame */ "Home" = "Start"; "Calendar" = "Agenda"; "Addressbook" = "Adresboek"; "Mail" = "E-mail"; "Right Administration" = "Machtigingen beheren"; "Help" = "Help"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Welkom bij de SOGo Mailer. Gebruik de mappenlijst aan de linkerkant om door uw e-mailaccounts te bladeren."; "Read messages" = "Berichten lezen"; "Write a new message" = "Een nieuw bericht opstellen"; "Share: " = "Delen: "; "Account: " = "Account: "; "Shared Account: " = "Gedeeld account: "; /* acls */ "Access rights to" = "Toegangsrechten voor"; "For user" = "Voor gebruiker"; "Any Authenticated User" = "Elke geauthenticeerde gebruiker"; "List and see this folder" = "De inhoud van deze map bekijken"; "Read mails from this folder" = "E-mails in deze map lezen"; "Mark mails read and unread" = "E-mails in deze map als (on)gelezen markeren"; "Modify the flags of the mails in this folder" = "De markeringen van e-mails in deze map aanpassen"; "Insert, copy and move mails into this folder" = "E-mails aan deze map toevoegen"; "Post mails" = "E-mail verzenden"; "Add subfolders to this folder" = "Nieuwe submappen maken"; "Remove this folder" = "Deze map verwijderen"; "Erase mails from this folder" = "E-mails in in deze map verwijderen"; "Expunge this folder" = "Deze map leegmaken"; "Archive This Folder" = "Deze map archiveren"; "Modify the acl of this folder" = "Machtigingen voor deze map aanpassen"; "Saved Messages.zip" = "Bewaarde Berichten.zip"; "Update" = "Opslaan"; "Cancel" = "Annuleren"; /* Mail edition */ "From" = "Van"; "Subject" = "Onderwerp"; "To" = "Aan"; "Cc" = "Cc"; "Bcc" = "Bcc"; "Reply-To" = "Reply-To"; "Add address" = "Adres toevoegen"; "Attachments:" = "Bijlage:"; "Open" = "Openen"; "Select All" = "Selecteer Alles"; "Attach Web Page..." = "Voeg Webpagina toe..."; "Attach File(s)..." = "Voeg Bestand(en) toe..."; "to" = "Aan"; "cc" = "Cc"; "bcc" = "Bcc"; "Edit Draft..." = "Concept aanpassen..."; "Load Images" = "Afbeeldingen laden"; "Return Receipt" = "Ontvangstbevestiging"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "De afzender van dit bericht heeft gevraagd te worden geïnformeerd als u het leest. Wilt u de afzender informeren?"; "Return Receipt (displayed) - %@"= "Ontvangstbevestigig (vertoond) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Dit is een Ontvangstbevestiging voor de e-mail die u hebt verzonden naar %@.\n\nOpmerking: Deze Ontvangstbevestiging bevestigt alleen dat het bericht is weergegeven op de computer van de ontvanger. Er is geen garantie dat de ontvanger het heeft gelezen of begrepen."; "Priority" = "Prioriteit"; "highest" = "Hoogste"; "high" = "Hoog"; "normal" = "Normaal"; "low" = "Laag"; "lowest" = "Laagste"; "This mail is being sent from an unsecure network!" = "Deze e-mail wordt verzonden vanaf een onveilig netwerk!"; "Address Book:" = "Adresboek:"; "Search For:" = "Zoek naar:"; /* Popup "show" */ "all" = "alle"; "read" = "gelezen"; "unread" = "ongelezen"; "deleted" = "verwijderde"; "flagged" = "gemarkeerde"; /* MailListView */ "Sender" = "Afzender"; "Subject or Sender" = "Onderwerp of afzender"; "To or Cc" = "Ontvanger (Aan of Cc)"; "Entire Message" = "Volledig bericht"; "Date" = "Datum"; "View" = "Beeld"; "All" = "Alle"; "No message" = "Geen bericht"; "messages" = "berichten"; "first" = "Eerste"; "previous" = "Vorige"; "next" = "Volgende"; "last" = "Laatste"; "msgnumber_to" = "tot"; "msgnumber_of" = "van"; "Mark Unread" = "Als ongelezen markeren"; "Mark Read" = "Als gelezen markeren"; "Untitled" = "(geen onderwerp)"; /* Tree */ "SentFolderName" = "Verzonden"; "TrashFolderName" = "Prullenbak"; "InboxFolderName" = "Postvak IN"; "DraftsFolderName" = "Concepten"; "SieveFolderName" = "Berichtregel"; "OtherUsersFolderName" = "Andere Gebruikers"; "SharedFoldersName" = "Gedeelde Mappen"; "Folders" = "Mappen"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Verplaatsen naar"; /* Address Popup menu */ "Add to Address Book..." = "Aan adresboek toevoegen"; "Compose Mail To" = "Bericht opstellen"; "Create Filter From Message..." = "Berichtregel maken op basis van bericht..."; /* Image Popup menu */ "Save Image" = "Afbeelding opslaan"; "Save Attachment" = "Bijlage Opslaan"; /* Mailbox popup menus */ "Open in New Mail Window" = "In nieuw e-mailvenster openen"; "Copy Folder Location" = "Kopieer maplocatie"; "Subscribe..." = "Abonneren..."; "Mark Folder Read" = "Map als gelezen markeren"; "New Folder..." = "Nieuwe map..."; "Compact This Folder" = "Comprimeer deze map"; "Search Messages..." = "Zoeken..."; "Sharing..." = "Delen..."; "New Subfolder..." = "Nieuwe submap..."; "Rename Folder..." = "Mapnaam wijzigen..."; "Delete Folder" = "Map verwijderen"; "Use This Folder For" = "De map gebruiken voor..."; "Get Messages for Account" = "Berichten ophalen voor account"; "Properties..." = "Eigenschappen..."; "Delegation..." = "Delegeren ..."; /* Use This Folder menu */ "Sent Messages" = "Berichten verzenden"; "Drafts" = "Concepten"; "Deleted Messages" = "Verwijderde berichten"; /* Message list popup menu */ "Open Message In New Window" = "In nieuw venster openen"; "Reply to Sender Only" = "Beantwoorden"; "Reply to All" = "Allen antwoorden"; "Edit As New..." = "Als nieuw bewerken"; "Move To" = "Verplaatsen naar"; "Copy To" = "Kopiëren naar"; "Label" = "Labelen"; "Mark" = "Markeren"; "Save As..." = "Opslaan als..."; "Print Preview" = "Afdrukvoorbeeld"; "View Message Source" = "Bron bekijken"; "Print..." = "Afdrukken..."; "Delete Message" = "Bericht verwijderen"; "Delete Selected Messages" = "Verwijder geselecteerde berichten"; "This Folder" = "Deze map"; /* Label popup menu */ "None" = "Geen label"; /* Mark popup menu */ "As Read" = "Als gelezen"; "Thread As Read" = "Draad als gelezen"; "As Read By Date..." = "Per datum als gelezen..."; "All Read" = "Alles als gelezen"; "Flag" = "Met vlag"; "As Junk" = "Als ongewenst"; "As Not Junk" = "Als gewenst"; "Run Junk Mail Controls" = "Ongewenste berichtenfilter starten"; /* Folder operations */ "Name :" = "Naam:"; "Enter the new name of your folder :" = "Geef de nieuw naam van de map op:"; "Do you really want to move this folder into the trash ?" = "Weet u zeker dat u deze map naar de prullenbak wilt verplaatsen?"; "Operation failed" = "Bewerking mislukt."; "Quota" = "Quota:"; "quotasFormat" = "%{0}% van %{1} MB gebruikt"; "Please select a message." = "Selecteer een bericht."; "Please select a message to print." = "Selecteer een bericht om af te drukken."; "Please select only one message to print." = "Selecteer een enkel bericht om af te drukken."; "The message you have selected doesn't exist anymore." = "Het bericht dat u selecteerde bestaat niet meer."; "The folder with name \"%{0}\" could not be created." = "De map met naam \"%{0}\" kan niet gemaakt worden."; "This folder could not be renamed to \"%{0}\"." = "Deze map kan niet hernoemd worden naar \"%{0}\"."; "The folder could not be deleted." = "Het verwijderen van de map is mislukt."; "The trash could not be emptied." = "Prullenbak legen mislukt."; "The folder functionality could not be changed." = "De mapfunctionaliteit kan niet veranderd worden."; "You need to choose a non-virtual folder!" = "U dient een niet-virtuele map te kiezen!"; "Moving a message into its own folder is impossible!" = "Kan bericht niet naar zijn eigen map verplaatsen"; "Copying a message into its own folder is impossible!" = "Kan bericht niet naar zijn eigen map kopiëren!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "De berichten konden niet naar de vuilnisbak worden verplaatst. Wilt u ze direct verwijderen?"; /* Message editing */ "error_missingsubject" = "U heeft geen onderwerp opgegeven!"; "error_missingrecipients" = "U heeft geen ontvanger opgegeven!"; "Send Anyway" = "Toch verzenden"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Kan bericht niet sturen: alle ontvangers zijn ongeldig."; "cannot send message (smtp) - recipients discarded:" = "Kan bericht niet sturen: de volgende adressen zijn ongeldig:"; "cannot send message: (smtp) error when connecting" = "Kan bericht niet sturen: fout bij verbinden met de SMTP server."; /* Contacts list in mail editor */ "Email" = "E-mail"; "Name" = "Naam"; SOGo-2.1.1b/UI/MailerUI/Icelandic.lproj/0000755000000000000000000000000012247657027016162 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Icelandic.lproj/Localizable.strings0000644000000000000000000002442712247657027022027 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Búðu til"; "Empty Trash" = "Tæma rusl"; "Delete" = "Eyða"; "Expunge" = "Þurrka út"; "Forward" = "Ãfram"; "Get Mail" = "Ná í póst"; "Junk" = "Ruslpóstur"; "Reply" = "Svara"; "Reply All" = "Svara öllum"; "Print" = "Prenta"; "Stop" = "Stöðva"; "Write" = "Skrifa"; "Send" = "Senda"; "Contacts" = "Tengiliðir"; "Attach" = "Setja inn"; "Save" = "Vista"; "Options" = "Valkostir"; "Size" = "Stærð"; /* Tooltips */ "Send this message now" = "Senda þennan póst núna"; "Select a recipient from an Address Book" = "Veldu viðtakanda úr nafnaskránni"; "Include an attachment" = "Bæta við viðhengi"; "Save this message" = "Vista þennan póst"; "Get new messages" = "Ná í nýjan póst"; "Create a new message" = "Búa til nýjan póst"; "Go to address book" = "Fara í nafnaskrá"; "Reply to the message" = "Svara pósti"; "Reply to sender and all recipients" = "Svara sendanda og öllum viðtakendum"; "Forward selected message" = "Ãframsenda völdum pósti"; "Delete selected message or folder" = "Eyða völdum pósti eða möppu"; "Mark the selected messages as junk" = "Merkja valinn póst sem ruslpóst"; "Print this message" = "Prenta þennan póst"; "Stop the current transfer" = "Stöðva núverandi sendingu"; "Attachment" = "Viðhengi"; "Unread" = "Ólesin"; "Flagged" = "Tilkynnt"; /* Main Frame */ "Home" = "Heima"; "Calendar" = "Dagatal"; "Addressbook" = "Nafnaskrá"; "Mail" = "Póstur"; "Right Administration" = "Umsjón réttinda"; "Help" = "Hjálp"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Velkomin(n) í SOGo Póstsendandann. Notaðu möpputréð vinstra megin til að skoða pósthólfin þín!"; "Read messages" = "Lesinn póstur"; "Write a new message" = "Skrifa nýjan póst"; "Share: " = "Samnýta: "; "Account: " = "Stillingar: "; "Shared Account: " = "Samnýttar stillingar: "; /* acls */ "Default Roles" = "Sjálfgefin hlutverk"; "User rights for:" = "Notandanréttindi fyrir:"; "List and see this folder" = "Sýna og skoða þessa möppu"; "Read mails from this folder" = "Lesa tölvubréf úr þessari möppu"; "Mark mails read and unread" = "Merkja póst sem lesinn eða ólesinn"; "Modify the flags of the mails in this folder" = "Breyta merkjum á tölvupósti í þessari möppu"; "Insert, copy and move mails into this folder" = "Setja inn, afrita og flytja tölvubréf inn í þessa möppu"; "Post mails" = "Senda tölvupóst"; "Add subfolders to this folder" = "Bæta undirmöppum við þessa möppu"; "Remove this folder" = "Fjarlægja þessa möppu"; "Erase mails from this folder" = "Eyða bréfum úr þessari möppu"; "Expunge this folder" = "Afmá allt í þessari möppu"; "Archive This Folder" = "Setja þessa möppu í geymslu"; "Modify the acl of this folder" = "Breyta aðgangsstýringum fyrir þessa möppu"; "Saved Messages.zip" = "vistud_skilabod.zip"; "Update" = "Uppfæra"; "Cancel" = "Hætta við"; /* Mail edition */ "From" = "Frá"; "Subject" = "Viðfangsefni"; "To" = "Til"; "Cc" = "Afrit"; "Bcc" = "Falið afrit"; "Reply-To" = "Reply-To"; "Add address" = "Bæta við viðtakanda"; "Attachments:" = "Viðhengi:"; "Open" = "Opna"; "Select All" = "Velja allt"; "Attach Web Page..." = "Hengja vefsðiðu við ..."; "Attach File(s)..." = "Hengja skrá(r) við..."; "to" = "Til"; "cc" = "Afrit"; "bcc" = "Falið afrit"; "Addressbook" = "Nafnaskrá"; "Edit Draft..." = "Sýsla með uppkast..."; "Load Images" = "Sækja myndir"; "Return Receipt" = "Staðfesting á lestri"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Sendandi þessa bréfs hefur beðið um að fá skilaboð þegar þú lest það. Viltu láta sendandann vita?"; "Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Þetta er móttökukvittun fyrir tölvupóstihn sem þú sendir til %@.\n\nAth: Þessi móttökukvittun staðfestir aðeins að tölvubréfið hafi verið sýnt á tölvu móttakandans. Það er engin trygging fyrir því að móttakandinn hafi lesið eða skilið innihald tölvubréfsins."; "Priority" = "Forgangur"; "highest" = "Hæst"; "high" = "Hátt"; "normal" = "Venjulegur"; "low" = "Lágt"; "lowest" = "Lægst"; "This mail is being sent from an unsecure network!" = "Þessi póstur er sendur frá óöruggu netkerfi!"; /* Popup "show" */ "all" = "öll"; "read" = "lesin"; "unread" = "ólesin"; "deleted" = "eytt"; "flagged" = "tilkynnt"; /* MailListView */ "Sender" = "Sendandi"; "Subject or Sender" = "Efni eða viðtakandi"; "To or Cc" = "Til eða afrit"; "Entire Message" = "Allur pósturinn"; "Date" = "Dagsetning"; "View" = "Skoða"; "All" = "Allar"; "Unread" = "Ólesin"; "No message" = "Engin skilaboð"; "messages" = "bréfum"; "first" = "Fyrsta"; "previous" = "Fyrra"; "next" = "Næsta"; "last" = "Síðasta"; "msgnumber_to" = "til"; "msgnumber_of" = "af"; "Mark Unread" = "Merkja sem ólesið"; "Mark Read" = "Merkja sem lesið"; "Untitled" = "ónefnt"; /* Tree */ "SentFolderName" = "Sent"; "TrashFolderName" = "Rusl"; "InboxFolderName" = "Innhólf"; "DraftsFolderName" = "Drög"; "SieveFolderName" = "Síur"; "OtherUsersFolderName" = "Aðrir Notendur"; "SharedFoldersName" = "Samnýttar Möppur"; "Folders" = "Möppur"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Færa …"; /* Address Popup menu */ "Add to Address Book..." = "Bæta við nafnaskrá..."; "Compose Mail To" = "Skrifa bréf til"; "Create Filter From Message..." = "Búa til síu eftir bréfi..."; /* Image Popup menu */ "Save Image" = "Vista mynd"; "Save Attachment" = "Vista viðhengi"; /* Mailbox popup menus */ "Open in New Mail Window" = "Opna í nýjum glugga fyrir póst"; "Copy Folder Location" = "Afrita staðsetningu möppu"; "Subscribe..." = "Fá áskrift..."; "Mark Folder Read" = "Merkja möppu sem lesna..."; "New Folder..." = "Ný mappa..."; "Compact This Folder" = "Þjappa þessari möppu"; "Search Messages..." = "Leita í Skilaboðum..."; "Sharing..." = "Samnýting..."; "New Subfolder..." = "Ný undirmappa..."; "Rename Folder..." = "Endurnefna möppu..."; "Delete Folder" = "Eyða möppu"; "Use This Folder For" = "Nota þessa möppu fyrir"; "Get Messages for Account" = "Sækja tölvubréf fyrir þetta pósthólf"; "Properties..." = "Eiginleikar..."; "Delegation..." = "Skipun fulltrúa..."; /* Use This Folder menu */ "Sent Messages" = "Send Tölvubréf"; "Drafts" = "Drög"; "Deleted Messages" = "Eydd bréf"; /* Message list popup menu */ "Open Message In New Window" = "Opna bréf í nýjum glugga"; "Reply to Sender Only" = "Svara aðeins sendanda"; "Reply to All" = "Svara öllum"; "Forward" = "Ãfram"; "Edit As New..." = "Sýsla með sem nýtt væri..."; "Move To" = "Færa í"; "Copy To" = "Afrita í"; "Label" = "Merki"; "Mark" = "Merkja"; "Save As..." = "Vista sem..."; "Print Preview" = "Prentskoðun"; "View Message Source" = "Skoða kóðann í skilaboðunum"; "Print..." = "Prenta..."; "Delete Message" = "Eyða pósti"; "Delete Selected Messages" = "Eyða völdum póstum"; "This Folder" = "Þessi mappa"; /* Label popup menu */ "None" = "Engin"; /* Mark popup menu */ "As Read" = "Sem lesið"; "Thread As Read" = "Umræðu sem lesna"; "As Read By Date..." = "As Read By Date..."; "All Read" = "Alla sem lesna"; "Flag" = "Tilkynna"; "As Junk" = "Sem ruslpóst"; "As Not Junk" = "Ekki sem ruslpóst"; "Run Junk Mail Controls" = "Keyra ruslpóstsaðgerðir"; /* Folder operations */ "Name :" = "Nafn :"; "Enter the new name of your folder :" = "Enter the new name of your folder :"; "Do you really want to move this folder into the trash ?" = "Do you really want to move this folder into the trash ?"; "Operation failed" = "Aðgerðin mistókst"; "Quota" = "Kvóti:"; "quotasFormat" = "%{0}% notað af %{1} MB"; "Please select a message." = "Velja þarf tölvubréf."; "Please select a message to print." = "Velja þarf tölvubréf til að prenta."; "Please select only one message to print." = "Aðeins má velja eitt tölvubréf til að prenta."; "The message you have selected doesn't exist anymore." = "Bréfið sem þú hefur valið er ekki lengur til."; "The folder with name \"%{0}\" could not be created." = "Ekki var hægt að búa til möppu með nafninu \"%{0}\" ."; "This folder could not be renamed to \"%{0}\"." = "Ekki var hægt að breyta nafni möppunnar í \"%{0}\" ."; "The folder could not be deleted." = "Ekki var hægt að eyða möppunni."; "The trash could not be emptied." = "Ekki var hægt að tæma ruslið."; "The folder functionality could not be changed." = "Ekki var hægt að breyta virkni möppunnar."; "You need to choose a non-virtual folder!" = "Velja þarf möppu sem er ekki sýndarmappa!"; "Moving a message into its own folder is impossible!" = "Ekki er hægt að færa tölvubréf í sömu möppu og það er í núna."; "Copying a message into its own folder is impossible!" = "Ekki er hægt að afrita tölvubréf í sömu möppu og það er í núna."; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Ekki var hægt að færa tölvubréfin í ruslið. Viltu kannski eyða þeim samstundis?"; /* Message editing */ "error_validationfailed" = "Staðfesting tókst ekki"; "error_missingsubject" = "Efni vantar"; "error_missingrecipients" = "Engir viðtakendur tilgreindir"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Ekki var hægt að senda tölvubréfið: enginn gildur móttakandi."; "cannot send message (smtp) - recipients discarded:" = "Ekki var hægt að senda tölvubréfið: Eftirfarandi móttakendur eru ógildir:"; "cannot send message: (smtp) error when connecting" = "Ekki var hægt að senda tölvubréfið: ekki tókst að tengjast SMTP póstþjóni."; "Name" = "Nafn"; "Email" = "Tölvupóstur"; SOGo-2.1.1b/UI/MailerUI/UIxMailPopupView.m0000644000000000000000000000174012247657027016531 0ustar rootroot/* UIxMailPopupView.m - this file is part of SOGo * * Copyright (C) 2006 Inverse inc. * * 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 @interface UIxMailPopupView : UIxComponent @end @implementation UIxMailPopupView @end SOGo-2.1.1b/UI/MailerUI/Toolbars/0000755000000000000000000000000012247657027014747 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Toolbars/SOGoDraftObject.toolbar0000644000000000000000000000260012247657027021250 0ustar rootroot( /* the toolbar groups -*-cperl-*- */ ( /* first group */ { link = "#"; isSafe = NO; onclick = "return clickedEditorSend(this);"; image = "tb-compose-send-flat-24x24.png"; cssClass = "tbicon_send"; label = "Send"; tooltip = "Send this message now"; } ), ( { link = "#"; onclick = "return onContactAdd(this);"; image = "tb-compose-contacts-flat-24x24.png"; cssClass = "tbicon_addressbook"; label = "Contacts"; tooltip = "Select a recipient from an Address Book"; }, { link = "#"; isSafe = NO; onclick = "return clickedEditorAttach(this)"; image = "tb-compose-attach-flat-24x24.png"; cssClass = "tbicon_attach single-window-not-conditional"; label = "Attach"; tooltip = "Include an attachment"; }, { link = "#"; isSafe = NO; onclick = "return clickedEditorSave(this);"; image = "tb-mail-file-flat-24x24.png"; cssClass = "tbicon_save"; label = "Save"; tooltip = "Save this message"; }, { link = "#"; hasMenu = YES; onclick = "return onSelectOptions(event);"; image = "options.png"; cssClass = "tbicon_options"; label = "Options"; } ), ( { link = "#"; isSafe = NO; onclick = "return onCloseButtonClick(event);"; label = "Close"; image = "tb-mail-stop-flat-24x24.png"; } ) ) SOGo-2.1.1b/UI/MailerUI/Toolbars/SOGoMailFolder.toolbar0000644000000000000000000000407012247657027021102 0ustar rootroot( /* the toolbar groups -*-cperl-*- */ ( // first group { link = "#"; image = "tb-mail-getmail-flat-24x24.png"; cssClass = "tbicon_getmail"; label = "Get Mail"; onclick = "return refreshMailbox(this);"; tooltip = "Get new messages"; }, { link = "#"; isSafe = NO; image = "tb-mail-write-flat-24x24.png"; onclick = "return onComposeMessage();"; cssClass = "tbicon_compose"; label = "Write"; tooltip = "Create a new message"; }, ), ( // second group { link = "#"; onclick = "return openMessageWindowsForSelection('reply');"; isSafe = NO; image = "tb-mail-reply-flat-24x24.png"; cssClass = "tbicon_reply"; label = "Reply"; tooltip = "Reply to the message"; }, { link = "#"; onclick = "return openMessageWindowsForSelection('replyall');"; isSafe = NO; image = "tb-mail-replyall-flat-24x24.png"; cssClass = "tbicon_replyall"; label = "Reply All"; tooltip = "Reply to sender and all recipients"; }, { link = "#"; onclick = "return openMessageWindowsForSelection('forward');"; isSafe = NO; image = "tb-mail-forward-flat-24x24.png"; cssClass = "tbicon_forward"; label = "Forward"; tooltip = "Forward selected message"; }, ), ( // third group { link = "#"; isSafe = NO; onclick = "onMenuDeleteMessage(event);"; // enabled = showMarkDeletedButton; image = "tb-mail-delete-flat-24x24.png"; cssClass = "tbicon_delete"; label = "Delete"; tooltip = "Delete selected message or folder"; }, // { link = "#"; // isSafe = NO; // image = "tb-mail-junk-flat-24x24.png"; // cssClass = "tbicon_junk"; // label = "Junk"; // tooltip = "Mark the selected messages as junk"; }, ), ( { link = "#"; onclick = "return onPrintCurrentMessage(event);"; cssClass = "tbicon_print single-window-not-conditional"; image = "tb-mail-print-flat-24x24.png"; label = "Print"; tooltip = "Print this message"; }, ) ) SOGo-2.1.1b/UI/MailerUI/Toolbars/SOGoMailObject.toolbar0000644000000000000000000000340012247657027021071 0ustar rootroot( /* the toolbar groups -*-cperl-*- */ ( // first group { link = "#"; onclick = "return openMessageWindowsForSelection('reply');"; isSafe = NO; image = "tb-mail-reply-flat-24x24.png"; cssClass = "tbicon_reply"; label = "Reply"; tooltip = "Reply to the message"; }, { link = "#"; onclick = "return openMessageWindowsForSelection('replyall');"; isSafe = NO; image = "tb-mail-replyall-flat-24x24.png"; cssClass = "tbicon_replyall"; label = "Reply All"; tooltip = "Reply to sender and all recipients"; }, { link = "#"; onclick = "return openMessageWindowsForSelection('forward');"; isSafe = NO; image = "tb-mail-forward-flat-24x24.png"; cssClass = "tbicon_forward"; label = "Forward"; tooltip = "Forward selected message"; }, ), ( // second group { link = "#"; isSafe = NO; onclick = "onMenuDeleteMessage(event);"; // enabled = showMarkDeletedButton; image = "tb-mail-delete-flat-24x24.png"; cssClass = "tbicon_delete"; label = "Delete"; tooltip = "Delete selected message or folder"; }, // { link = "#"; // isSafe = NO; // image = "tb-mail-junk-flat-24x24.png"; // cssClass = "tbicon_junk"; // label = "Junk"; // tooltip = "Mark the selected messages as junk"; }, ), ( { link = "#"; onclick = "return onPrintCurrentMessage(event);"; cssClass = "tbicon_print single-window-not-conditional"; image = "tb-mail-print-flat-24x24.png"; label = "Print"; tooltip = "Print this message"; }, ), ( { link = "#"; isSafe = NO; onclick = "return onCloseButtonClick(event);"; label = "Close"; image = "tb-mail-stop-flat-24x24.png"; } ) ) SOGo-2.1.1b/UI/MailerUI/Arabic.lproj/0000755000000000000000000000000012247657027015470 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Arabic.lproj/Localizable.strings0000644000000000000000000003027012247657027021326 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "أنشئ"; "Empty Trash" = "Ø£ÙØ±Ùغ سلة المهملات"; "Delete" = "احذÙ"; "Expunge" = "محا"; "Forward" = "ارسال الى"; "Get Mail" = "الحصول على البريد"; "Junk" = "تاÙÙ‡"; "Reply" = "رد"; "Reply All" = "رد للكل"; "Print" = "طباعة"; "Stop" = "توقÙ"; "Write" = "كتابة"; "Send" = "ارسال"; "Contacts" = "عناوين"; "Attach" = "Ø¥Ø¶Ø§ÙØ© مرÙÙ‚"; "Save" = "Ø­ÙØ¸"; "Options" = "خيارات"; "Close" = "إغلاق"; "Size" = "حجم"; /* Tooltips */ "Send this message now" = "إرسال هذه الرسالة الآن"; "Select a recipient from an Address Book" = "حدد المستلم من Ø¯ÙØªØ± العناوين"; "Include an attachment" = "تضمين مرÙÙ‚"; "Save this message" = "Ø­ÙØ¸ هذه الرسالة"; "Get new messages" = "الحصول على رسائل جديدة"; "Create a new message" = "إنشاء رسالة جديدة"; "Go to address book" = "انتقل إلى Ø¯ÙØªØ± العناوين"; "Reply to the message" = "الرد على الرسالة"; "Reply to sender and all recipients" = "الرد للمرسل وجميع المتلقين"; "Forward selected message" = "إرسال الرسالة المحددة"; "Delete selected message or folder" = "مسح الرسالة او المجلد المحدد"; "Mark the selected messages as junk" = "سجل الرسائل المحددة على انها تاÙهة"; "Print this message" = "اطبع هذه الرسالة"; "Stop the current transfer" = "وق٠النقل الحالي"; "Attachment" = "مرÙÙ‚"; "Unread" = "غير مقروء"; "Flagged" = "تم وضع علامة عليه"; /* Main Frame */ "Home" = "Ø§Ù„ØµÙØ­Ø© الرئيسية"; "Calendar" = "التقويم"; "Addressbook" = "Ø¯ÙØªØ± العناوين"; "Mail" = "البريد"; "Right Administration" = "حق الإدارة"; "Help" = "مساعدة"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "مرحبا بكم ÙÙŠ خدمة سوجو البريدية. استخدم شجرة المجلد على اليسار Ù„ØªØµÙØ­ حسابات البريد الإلكتروني الخاص بك!"; "Read messages" = "قراءة الرسائل"; "Write a new message" = "كتابة رسالة جديدة"; "Share: " = "مشاركة :"; "Account: " = "حساب:"; "Shared Account: " = "حساب مشاركة:"; /* acls */ "Access rights to" = "حقوق الوصول إلى"; "For user" = "الى مستخدم"; "Any Authenticated User" = "أي مستخدم مسجل"; "List and see this folder" = "ÙØªØ­ ورؤية هذا المجلد"; "Read mails from this folder" = "قراءة الرسائل من هذا المجلد"; "Mark mails read and unread" = "وضع علامة مقروء او غير مقروء على الرسائل"; "Modify the flags of the mails in this folder" = "تعديل علامات الرسائل بهذا المجلد"; "Insert, copy and move mails into this folder" = "إدراج، نسخ ونقل الرسائل ÙÙŠ هذا المجلد"; "Post mails" = "Ø¥Ø¶Ø§ÙØ© رسائل"; "Add subfolders to this folder" = "Ø¥Ø¶Ø§ÙØ© مجلدات ÙØ±Ø¹ÙŠØ© إلى هذا المجلد"; "Remove this folder" = "مسح المجلد"; "Erase mails from this folder" = "مسح الرسائل من هذا المجلد"; "Expunge this folder" = "محو هذا المجلد"; "Archive This Folder" = "Ø£Ø±Ø´ÙØ© هذا المجلد"; "Modify the acl of this folder" = "تعديل قائمة الصلاحيات لهذا المجلد"; "Saved Messages.zip" = "Ø­ÙØ¸ Messages.zip"; "Update" = "تحديث"; "Cancel" = "إلغاء"; /* Mail edition */ "From" = "من"; "Subject" = "الموضوع"; "To" = "إلى"; "Cc" = "نسخة الى"; "Bcc" = "نسخة مخÙية إلى"; "Reply-To" = "الرد إلى"; "Add address" = "Ø¥Ø¶Ø§ÙØ© عنوان"; "Attachments:" = "مرÙقات:"; "Open" = "ÙØªØ­"; "Select All" = "إختيار الكل"; "Attach Web Page..." = "Ø¥Ø±ÙØ§Ù‚ ØµÙØ­Ø© ويب ..."; "Attach File(s)..." = "Ø¥Ø±ÙØ§Ù‚ مل٠(Ù…Ù„ÙØ§Øª) ..."; "to" = "إلى"; "cc" = "نسخة الى"; "bcc" = "نسخة مخÙية إلى"; "Edit Draft..." = "تعديل مسودة ..."; "Load Images" = "تحميل صور"; "Return Receipt" = "عودة الإيصال"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "طلب مرسل هذه الرسالة أن يتم إعلامه عند قراءة هذه الرسالة. هل ترغب ÙÙŠ إبلاغ المرسل؟"; "Return Receipt (displayed) - %@"= "إيصال عودة (عرض) -Ùª @"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "هذا هو الإيصال مقابل الرسالة الإلكترونية التي أرسلت إلى @Ùª\n\nملاحظة: هذا الإشعار بالاستلام لا يقر سوى أنه تم عرض رسالة على الكمبيوتر المستلم. ليس هناك ما يضمن أن المتلقي قد قرأ أو Ùهم محتويات الرسالة."; "Priority" = " الأولوية"; "highest" = "قصوي"; "high" = "أعلى"; "normal" = "عادي"; "low" = "قليلة"; "lowest" = "دنيا"; "This mail is being sent from an unsecure network!" = "يتم إرسال هذا البريد من شبكة غير آمن!"; "Address Book:" = "Ø¯ÙØªØ± العناوين:"; "Search For:" = "البحث عن :"; /* Popup "show" */ "all" = "الكل"; "read" = "قرأ"; "unread" = "لم يقرأ"; "deleted" = "مسح"; "flagged" = "معلم"; /* MailListView */ "Sender" = "الراسل"; "Subject or Sender" = "الموضوع أو المرسل"; "To or Cc" = "إلى أو نسخة الى"; "Entire Message" = "الرسالة كاملة"; "Date" = "التاريخ"; "View" = "عرض"; "All" = "الكل"; "No message" = "لا يوجد رسالة"; "messages" = "رسائل"; "first" = "الأول"; "previous" = "السابق"; "next" = "التالي"; "last" = "آخر"; "msgnumber_to" = "إلى"; "msgnumber_of" = "من"; "Mark Unread" = "سجل غير مقروء"; "Mark Read" = "سجل مقروء"; "Untitled" = "بدون عنوان"; /* Tree */ "SentFolderName" = "البريد الصادر"; "TrashFolderName" = "المهملات"; "InboxFolderName" = "البريد الوارد"; "DraftsFolderName" = "مسودات"; "SieveFolderName" = "Ùلاتر"; "OtherUsersFolderName" = "مستخدمين أخرين"; "SharedFoldersName" = "مجلدات مشتركة"; "Folders" = "مجلدات"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "نقل ومساعدة؛"; /* Address Popup menu */ "Add to Address Book..." = "Ø¥Ø¶Ø§ÙØ© الى Ø¯ÙØªØ± العناوين"; "Compose Mail To" = "إنشاء بريد الى"; "Create Filter From Message..." = "إنشاء Ùلتر من الرسالة ..."; /* Image Popup menu */ "Save Image" = "Ø­ÙØ¸ الصورة"; "Save Attachment" = "Ø­ÙØ¸ المرÙقات"; /* Mailbox popup menus */ "Open in New Mail Window" = "ÙØªØ­ ÙÙŠ Ù†Ø§ÙØ°Ø© بريد جديدة"; "Copy Folder Location" = "نسخ موقع المجلد"; "Subscribe..." = "إشترك..."; "Mark Folder Read" = "اجعل رسائل المجلد مقروءة"; "New Folder..." = "مجلد جديد..."; "Compact This Folder" = "ضغط هذا المجلد"; "Search Messages..." = "ابحث عن رسائل ..."; "Sharing..." = "مشاركة..."; "New Subfolder..." = "مجلد ÙØ±Ø¹ÙŠ Ø¬Ø¯ÙŠØ¯ ..."; "Rename Folder..." = "إعادة تسمية مجلد ..."; "Delete Folder" = "مسح المجلد"; "Use This Folder For" = "استخدم هذا المجلد لى"; "Get Messages for Account" = "الحصول على الرسائل من حساب"; "Properties..." = "خصائص ..."; "Delegation..." = "تÙويض..."; /* Use This Folder menu */ "Sent Messages" = "الرسالة المرسلة"; "Drafts" = "المسودات"; "Deleted Messages" = "الرسائل Ø§Ù„Ù…Ø­Ø°ÙˆÙØ©"; /* Message list popup menu */ "Open Message In New Window" = "Ø¥Ùنح الرسالة ÙÙŠ Ù†Ø§ÙØ°Ø© جديدة"; "Reply to Sender Only" = "الرد على المرسل Ùقط"; "Reply to All" = "الرد على الكل"; "Edit As New..." = "تعديل كالجديد ..."; "Move To" = "نقل إلى"; "Copy To" = "نسخ إلى"; "Label" = "ملصق"; "Mark" = "وضع علامة"; "Save As..." = "Ø­ÙØ¸ باسم ..."; "Print Preview" = "معاينة قبل الطباعة"; "View Message Source" = "عرض مصدر الرسالة"; "Print..." = "طباعة..."; "Delete Message" = "مسح الرسالة"; "Delete Selected Messages" = "مسح الرسائل المختارة"; "This Folder" = "هذا المجلد"; /* Label popup menu */ "None" = "لا شيء"; /* Mark popup menu */ "As Read" = "مقروء"; "Thread As Read" = "الموضوع مقروء"; "As Read By Date..." = "كما يقرأ من التاريخ"; "All Read" = "الكل مقروء"; "Flag" = "علم"; "As Junk" = "غير هام"; "As Not Junk" = "ليس غير هام"; "Run Junk Mail Controls" = "تشغيل عناصر تحكم البريد غير المرغوب Ùيه"; /* Folder operations */ "Name :" = "أسم:"; "Enter the new name of your folder :" = "أدخل اسم جديد للمجلد:"; "Do you really want to move this folder into the trash ?" = "هل تريد حقا نقل هذا المجلد إلى سلة المهملات؟"; "Operation failed" = "ÙØ´Ù„ت عملية"; "Quota" = "مساحة تخزين:"; "quotasFormat" = "%{0}% المستخدمة ÙÙŠ %{1} ميغابايت"; "Please select a message." = "الرجاء اختيار رسالة."; "Please select a message to print." = "الرجاء اختيار رسالة للطباعة."; "Please select only one message to print." = "الرجاء اختيار رسالة واحدة Ùقط للطباعة."; "The message you have selected doesn't exist anymore." = "الرسالة التي اخترتها لا وجود لها بعد الآن."; "The folder with name \"%{0}\" could not be created." = "المجلد الذي اسمه \"Ùª {0}\" لا يمكن أن ينشأ."; "This folder could not be renamed to \"%{0}\"." = "لا يمكن تغييراسم هذا المجلد إلى \"Ùª {0}\"."; "The folder could not be deleted." = "لا يمكن حذ٠المجلد."; "The trash could not be emptied." = "لا يمكن ØªÙØ±ÙŠØº القمامة."; "The folder functionality could not be changed." = "لا يمكن تغيير ÙˆØ¸ÙŠÙØ© المجلد ."; "You need to choose a non-virtual folder!" = "تحتاج إلى اختيار مجلد غير ظاهري!"; "Moving a message into its own folder is impossible!" = "لا يمكن نقل رسالة إلى المجلد الخاص بها!"; "Copying a message into its own folder is impossible!" = "لا يمكن نسخ رسالة إلى المجلد الخاص بها !"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "لا يمكن نقل الرسائل إلى مجلد سلة المهملات. هل ترغب ÙÙŠ حذÙها Ùورا؟"; /* Message editing */ "error_missingsubject" = "الرسالة ليس بها موضوع. هل أنت متأكد من أنك تريد إرسالها؟"; "error_missingrecipients" = "يرجى تحديد مستلم واحد على الأقل."; "Send Anyway" = "إرسال على أي حال"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "لا يمكن إرسال الرسالة: جميع العناوين خاطئة."; "cannot send message (smtp) - recipients discarded:" = "لا يمكن إرسال رسالة. العناوين التالية غير صالحة:"; "cannot send message: (smtp) error when connecting" = "لا يمكن إرسال الرسالة: خطأ عند الاتصال إلى خادم SMTP."; /* Contacts list in mail editor */ "Email" = "بريد إلكتروني"; "Name" = "الاسم"; SOGo-2.1.1b/UI/MailerUI/Italian.lproj/0000755000000000000000000000000012247657027015670 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Italian.lproj/Localizable.strings0000644000000000000000000002463712247657027021540 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Crea"; "Empty Trash" = "Svuota cestino"; "Delete" = "Cancella"; "Expunge" = "Pulisci"; "Forward" = "Inoltra"; "Get Mail" = "Scarica posta"; "Junk" = "Indesiderato"; "Reply" = "Rispondi"; "Reply All" = "Rispondi a tutti"; "Print" = "Stampa"; "Stop" = "Stop"; "Write" = "Scrivi"; "Send" = "Invia"; "Contacts" = "Contatti"; "Attach" = "Allegato"; "Save" = "Salva"; "Options" = "Opzioni"; "Close" = "Chiudi"; "Size" = "Dimensione"; /* Tooltips */ "Send this message now" = "Invia ora il messaggio"; "Select a recipient from an Address Book" = "Seleziona almeno un destinatario dalla rubrica"; "Include an attachment" = "Includi un allegato"; "Save this message" = "Salva questo messaggio"; "Get new messages" = "Scarica nuovi messaggi"; "Create a new message" = "Scrivi un nuovo messaggio"; "Go to address book" = "Vai alla rubrica"; "Reply to the message" = "Rispondi a questo messaggio"; "Reply to sender and all recipients" = "Rispondi al mittente e a tutti i destinatari"; "Forward selected message" = "Inoltra il messaggio selezionato"; "Delete selected message or folder" = "Cancella il messaggio o la cartella selezionata"; "Mark the selected messages as junk" = "Contrassegna il messaggio selezionato come indesiderato"; "Print this message" = "Stampa questo messaggio"; "Stop the current transfer" = "Ferma il trasferimento in corso"; "Attachment" = "Allegato"; "Unread" = "Non letti"; "Flagged" = "Contrassegnato"; /* Main Frame */ "Home" = "Home"; "Calendar" = "Calendario"; "Addressbook" = "Rubrica"; "Mail" = "Posta"; "Right Administration" = "Gestione permessi"; "Help" = "Aiuto"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Benvenuto in SOGo Mailer. Usa l'albero di sinistra per navigare tra i tuoi account di posta!"; "Read messages" = "Leggi messaggi"; "Write a new message" = "Scrivi un nuovo messaggio"; "Share: " = "Condividi: "; "Account: " = "Account:"; "Shared Account: " = "Account condiviso: "; /* acls */ "Access rights to" = "Permessi di accesso a"; "For user" = "Per utente"; "Any Authenticated User" = "Utenti Autenticati"; "List and see this folder" = "Elenca e guarda questa cartella"; "Read mails from this folder" = "Leggi emails da questa cartella"; "Mark mails read and unread" = "Contrassegna emails lette/non lette"; "Modify the flags of the mails in this folder" = "Modifica i contrassegni delle emails in questa cartella"; "Insert, copy and move mails into this folder" = "Inserisci, copia e sposta emails in questa cartella"; "Post mails" = "Recapita emails"; "Add subfolders to this folder" = "Aggiungi sottocartelle a questa cartella"; "Remove this folder" = "Rimuovi questa cartella"; "Erase mails from this folder" = "Elimina emails da questa cartella"; "Expunge this folder" = "Pulisci questa cartella"; "Archive This Folder" = "Archivia questa cartella"; "Modify the acl of this folder" = "Modifica i permessi per questa cartella"; "Saved Messages.zip" = "Salvato Messages.zip"; "Update" = "Aggiorna"; "Cancel" = "Annulla"; /* Mail edition */ "From" = "Da"; "Subject" = "Oggetto"; "To" = "A"; "Cc" = "Cc"; "Bcc" = "Bcc"; "Reply-To" = "Rispondi a"; "Add address" = "Aggiungi indirizzi"; "Attachments:" = "Allegati:"; "Open" = "Apri"; "Select All" = "Seleziona tutti"; "Attach Web Page..." = "Allega pagina Web..."; "Attach File(s)..." = "Allega File(s)..."; "to" = "A"; "cc" = "Cc"; "bcc" = "Bcc"; "Edit Draft..." = "Modifica bozza..."; "Load Images" = "Carica Immagini"; "Return Receipt" = "Ricevuta di ritorno"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Il mittente del messaggio ha chiesto di essere avvisato della lettura di questo messaggio. Vuoi avvisare il mittente?"; "Return Receipt (displayed) - %@"= "Ricevuta di ritorno (visualizza) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Questa è la Ricevuta di ritorno per la mail che hai inviato a %@.\n\nNota: Questa Ricevuta di ritorno ti assicura che il messaggio sta stato visualizzato sul computer del destinatario. Non c'è alcun conferma sul fatto che il destinatario abbia letto o capito il contenuto del messaggio."; "Priority" = "Priorità"; "highest" = "Molto alta"; "high" = "Alta"; "normal" = "Normale"; "low" = "Bassa"; "lowest" = "Molto bassa"; "This mail is being sent from an unsecure network!" = "Questa email è stata spedita da una rete contrassegnata come non sicuro!"; "Address Book:" = "Rubrica:"; "Search For:" = "Cerca:"; /* Popup "show" */ "all" = "tutti"; "read" = "letti"; "unread" = "non letti"; "deleted" = "cancellati"; "flagged" = "contrassegnati"; /* MailListView */ "Sender" = "Mittente"; "Subject or Sender" = "Oggetto o Mittente"; "To or Cc" = "A o Cc"; "Entire Message" = "Tutto il messaggio"; "Date" = "Data"; "View" = "Vista"; "All" = "Tutti"; "No message" = "Nessun messaggio"; "messages" = "messaggi"; "first" = "Primo"; "previous" = "Precedente"; "next" = "Prossimo"; "last" = "Ultimo"; "msgnumber_to" = "a"; "msgnumber_of" = "di"; "Mark Unread" = "Contrassegna come da leggere"; "Mark Read" = "Contrassegna come letto"; "Untitled" = "Senza nome"; /* Tree */ "SentFolderName" = "Posta inviata"; "TrashFolderName" = "Cestino"; "InboxFolderName" = "Posta in arrivo"; "DraftsFolderName" = "Bozze"; "SieveFolderName" = "Filtri"; "OtherUsersFolderName" = "Altri Utenti"; "SharedFoldersName" = "Cartelle Condivise"; "Folders" = "Cartelle"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Sposta in …"; /* Address Popup menu */ "Add to Address Book..." = "Aggiungi alla rubrica..."; "Compose Mail To" = "Invia email a "; "Create Filter From Message..." = "Crea filtro dal messaggio..."; /* Image Popup menu */ "Save Image" = "Salva immagine"; "Save Attachment" = "Salva l'allegato"; /* Mailbox popup menus */ "Open in New Mail Window" = "Apri in una nuova finestra"; "Copy Folder Location" = "Copia cartella"; "Subscribe..." = "Sottoscrivi..."; "Mark Folder Read" = "Contrassegna cartella come già letta..."; "New Folder..." = "Nuova cartella..."; "Compact This Folder" = "Compatta cartella"; "Search Messages..." = "Cerca messaggi..."; "Sharing..." = "Condivisione..."; "New Subfolder..." = "Nuova sottocartella..."; "Rename Folder..." = "Rinomina cartella..."; "Delete Folder" = "Cancella cartella"; "Use This Folder For" = "Usa questa cartella per"; "Get Messages for Account" = "Scarica messaggi per l'account"; "Properties..." = "Proprietà..."; "Delegation..." = "Delega..."; /* Use This Folder menu */ "Sent Messages" = "Messaggi inviati"; "Drafts" = "Bozze"; "Deleted Messages" = "Messaggi cancellati"; /* Message list popup menu */ "Open Message In New Window" = "Apri messaggio in una nuova finestra"; "Reply to Sender Only" = "Rispondi"; "Reply to All" = "Rispondi a tutti"; "Edit As New..." = "Modifica come..."; "Move To" = "Sposta in "; "Copy To" = "Copia in "; "Label" = "Etichetta"; "Mark" = "Contrassegna"; "Save As..." = "Salva come ..."; "Print Preview" = "Anteprima di stampa"; "View Message Source" = "Visualizza sorgente"; "Print..." = "Stampa..."; "Delete Message" = "Cancella messaggio"; "Delete Selected Messages" = "Cancella i messaggi selezionati"; "This Folder" = "Questa cartella"; /* Label popup menu */ "None" = "Nessuno"; /* Mark popup menu */ "As Read" = "Già letto"; "Thread As Read" = "Thread già letto"; "As Read By Date..." = "Già letti per data..."; "All Read" = "Tutti già letti"; "Flag" = "Contrassegna"; "As Junk" = "Come indesiderati"; "As Not Junk" = "Come non indesiderati"; "Run Junk Mail Controls" = "Avvia controllo email indesiderate"; /* Folder operations */ "Name :" = "Nome :"; "Enter the new name of your folder :" = "Inserisci il nuovo nome della cartella :"; "Do you really want to move this folder into the trash ?" = "Sei sicuro di voler spostare la cartella nel cestino ?"; "Operation failed" = "Operazione non riuscita"; "Quota" = "Spazio usato"; "quotasFormat" = "%{0}% usato su %{1} MB"; "Please select a message." = "Per favore seleziona un messaggio."; "Please select a message to print." = "Per favore seleziona un messaggio da stampare."; "Please select only one message to print." = "Per favore seleziona un solo messaggio da stampare."; "The message you have selected doesn't exist anymore." = "Il messaggio selezionato non esiste più."; "The folder with name \"%{0}\" could not be created." = "La cartella con nome \"%{0}\" non può essere creata."; "This folder could not be renamed to \"%{0}\"." = "Questa cartella non puo essere rinominata in \"%{0}\"."; "The folder could not be deleted." = "Questa cartella non può essere eliminata."; "The trash could not be emptied." = "Il cestino non puo essere svuotato."; "The folder functionality could not be changed." = "La funzionalita della cartella non puo essere cambiata."; "You need to choose a non-virtual folder!" = "Devi selezionare una cartella fisica, non virtuale!"; "Moving a message into its own folder is impossible!" = "La cartella di destinazione coincide con la cartella di origine!"; "Copying a message into its own folder is impossible!" = "La cartella di destinazione coincide con la cartella di origine!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Il messaggi non psonno essere spostati nel cestino. Vuoi cancellarli immediatamente?"; /* Message editing */ "error_missingsubject" = "Nessun oggetto specificato"; "error_missingrecipients" = "Nessun destinatario specificato"; "Send Anyway" = "Invia comunque"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Impossibile inviare il messaggio: tutti i destinatari non sono validi."; "cannot send message (smtp) - recipients discarded:" = "Impossibile inviare il messaggio. Il seguente indirizzo non è valido:"; "cannot send message: (smtp) error when connecting" = "Impossibile inviare il messaggio: si è verificato un errore durante la connessione al server SMTP."; "Name" = "Nome"; "Email" = "Email"; SOGo-2.1.1b/UI/MailerUI/UIxMailActions.h0000644000000000000000000000173112247657027016166 0ustar rootroot/* UIxMailActions.h - this file is part of SOGo * * Copyright (C) 2007-2013 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef UIXMAILACTIONS_H #define UIXMAILACTIONS_H #import @interface UIxMailActions : WODirectAction @end #endif /* UIXMAILACTIONS_H */ SOGo-2.1.1b/UI/MailerUI/UIxMailMainFrame.m0000644000000000000000000004761712247657027016447 0ustar rootroot/* Copyright (C) 2007-2013 Inverse inc. This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "UIxMailMainFrame.h" #import "UIxMailListActions.h" // Avoid compilation warnings @interface SOGoUserFolder (private) - (SOGoAppointmentFolders *) privateContacts: (NSString *) key inContext: (WOContext *) localContext; @end @implementation UIxMailMainFrame - (id) init { if ((self = [super init])) { folderType = 0; } return self; } - (void) dealloc { RELEASE(_currentLabel); [super dealloc]; } - (void) _setupContext { SOGoUser *activeUser; NSString *module; SOGoMailAccounts *clientObject; activeUser = [context activeUser]; clientObject = [self clientObject]; module = [clientObject nameInContainer]; us = [activeUser userSettings]; moduleSettings = [us objectForKey: module]; if (!moduleSettings) { moduleSettings = [NSMutableDictionary dictionary]; [us setObject: moduleSettings forKey: module]; } } /* accessors */ - (NSString *) mailAccounts { NSArray *accounts, *names; accounts = [[self clientObject] mailAccounts]; names = [accounts objectsForKey: @"name" notFoundMarker: nil]; return [names jsonRepresentation]; } - (NSString *) pageFormURL { NSString *u; NSRange r; u = [[[self context] request] uri]; if ((r = [u rangeOfString:@"?"]).length > 0) { /* has query parameters */ // TODO: this is ugly, create reusable link facility in SOPE // TODO: remove 'search' and 'filterpopup', preserve sorting NSMutableString *ms; NSArray *qp; NSUInteger i, count; qp = [[u substringFromIndex:(r.location + r.length)] componentsSeparatedByString:@"&"]; count = [qp count]; ms = [NSMutableString stringWithCapacity:count * 12]; for (i = 0; i < count; i++) { NSString *s; s = [qp objectAtIndex:i]; /* filter out */ if ([s hasPrefix:@"search="]) continue; if ([s hasPrefix:@"filterpopup="]) continue; if ([ms length] > 0) [ms appendString:@"&"]; [ms appendString:s]; } if ([ms length] == 0) { /* no other query params */ u = [u substringToIndex:r.location]; } else { u = [u substringToIndex:r.location + r.length]; u = [u stringByAppendingString:ms]; } return u; } return [u hasSuffix:@"/"] ? @"view" : @"#"; } - (NSString *) inboxData { SOGoMailAccounts *accounts; SOGoMailAccount *account; SOGoMailFolder *inbox; NSDictionary *data; UIxMailListActions *actions; [self _setupContext]; #warning this code is dirty: we should not invoke UIxMailListActions from here! actions = [[[UIxMailListActions new] initWithRequest: [context request]] autorelease]; accounts = [self clientObject]; account = [accounts lookupName: @"0" inContext: context acquire: NO]; inbox = [account inboxFolderInContext: context]; data = [actions getUIDsInFolder: inbox withHeaders: YES]; return [data jsonRepresentation]; } - (id ) composeAction { id contact; NSArray *contactsId, *cards; NSString *newLocation, *parameters, *folderId, *uid, *formattedMail; NSEnumerator *uids; NSMutableArray *addresses; NGVCard *card; NGVList *list; SOGoMailAccounts *co; SOGoContactFolders *folders; SOGoParentFolder *folder; WORequest *request; NSUInteger i, count; parameters = nil; co = [self clientObject]; request = [context request]; if ((folderId = [request formValueForKey: @"folder"]) && (contactsId = [request formValuesForKey: @"uid"])) { // Retrieve the email addresses from the specified address book // and contact IDs folders = (SOGoContactFolders *)[[[self clientObject] container] privateContacts: @"Contacts" inContext: nil]; folder = [folders lookupName: folderId inContext: nil acquire: NO]; if (folder) { uids = [contactsId objectEnumerator]; uid = [uids nextObject]; addresses = [NSMutableArray array]; while (uid) { contact = [folder lookupName: uid inContext: [self context] acquire: NO]; if ([contact isKindOfClass: [SOGoContactGCSList class]]) { list = [(SOGoContactGCSList *)contact vList]; cards = [list cardReferences]; count = [cards count]; for (i = 0; i < count; i++) { formattedMail = [self formattedMailtoString: [cards objectAtIndex: i]]; if (formattedMail) [addresses addObject: formattedMail]; } } else if ([contact isKindOfClass: [SOGoContactGCSEntry class]] || [contact isKindOfClass: [SOGoContactLDIFEntry class]]) { // We fetch the preferred email address of the contact or // the first defined email address card = [contact vCard]; formattedMail = [self formattedMailtoString: card]; if (formattedMail) [addresses addObject: formattedMail]; } uid = [uids nextObject]; } if ([addresses count] > 0) parameters = [NSString stringWithFormat: @"?mailto=%@", [addresses jsonRepresentation]]; } } else if ([[request formValues] objectForKey: @"mailto"]) // We use the email addresses defined in the request parameters = [[request formValues] asURLParameters]; if (!parameters) // No parameter passed; simply open the compose window parameters = @"?mailto="; newLocation = [NSString stringWithFormat: @"%@/0/compose%@", [co baseURLInContext: context], parameters]; return [self redirectToLocation: newLocation]; } - (NSString *) formattedMailtoString: (NGVCard *) card { NSString *firstName, *lastName, *email; NSMutableString *fn, *rc = nil; CardElement *n; if ([card isKindOfClass: [NGVCard class]]) email = [card preferredEMail]; else email = [(NGVCardReference *)card email]; if (email == nil) email = (NSString*)[card firstChildWithTag: @"EMAIL"]; if (email) { email = [NSString stringWithFormat: @"<%@>", email]; // We append the contact's name fn = [NSMutableString stringWithString: [card fn]]; if ([fn length] == 0 && [card isKindOfClass: [NGVCard class]]) { n = [card n]; lastName = [n flattenedValueAtIndex: 0 forKey: @""]; firstName = [n flattenedValueAtIndex: 1 forKey: @""]; if ([firstName length] > 0) { if ([lastName length] > 0) fn = [NSMutableString stringWithFormat: @"%@ %@", firstName, lastName]; else fn = [NSMutableString stringWithString: firstName]; } else if ([lastName length] > 0) fn = [NSMutableString stringWithString: lastName]; } if ([fn length] > 0) { [fn appendFormat: @" %@", email]; rc = fn; } else rc = [NSMutableString stringWithString: email]; } return rc; } - (WOResponse *) getFoldersStateAction { NSString *expandedFolders; [self _setupContext]; expandedFolders = [moduleSettings objectForKey: @"ExpandedFolders"]; return [self responseWithStatus: 200 andString: expandedFolders]; } - (NSString *) verticalDragHandleStyle { NSString *vertical; [self _setupContext]; vertical = [moduleSettings objectForKey: @"DragHandleVertical"]; return ((vertical && [vertical intValue] > 0) ? (id)[vertical stringByAppendingString: @"px"] : nil); } - (NSString *) horizontalDragHandleStyle { NSString *horizontal; [self _setupContext]; horizontal = [moduleSettings objectForKey: @"DragHandleHorizontal"]; return ((horizontal && [horizontal intValue] > 0) ? (id)[horizontal stringByAppendingString: @"px"] : nil); } - (NSString *) mailboxContentStyle { NSString *height; [self _setupContext]; height = [moduleSettings objectForKey: @"DragHandleVertical"]; return ((height && [height intValue] > 0) ? (id)[NSString stringWithFormat: @"%ipx", ([height intValue] - 27)] : nil); } - (WOResponse *) saveDragHandleStateAction { WORequest *request; NSString *dragHandle; [self _setupContext]; request = [context request]; if ((dragHandle = [request formValueForKey: @"vertical"]) != nil) [moduleSettings setObject: dragHandle forKey: @"DragHandleVertical"]; else if ((dragHandle = [request formValueForKey: @"horizontal"]) != nil) [moduleSettings setObject: dragHandle forKey: @"DragHandleHorizontal"]; else return [self responseWithStatus: 400]; [us synchronize]; return [self responseWithStatus: 204]; } - (WOResponse *) saveFoldersStateAction { WORequest *request; NSString *expandedFolders; [self _setupContext]; request = [context request]; expandedFolders = [request formValueForKey: @"expandedFolders"]; [moduleSettings setObject: expandedFolders forKey: @"ExpandedFolders"]; [us synchronize]; return [self responseWithStatus: 204]; } - (NSString *) columnsState { NSDictionary *columns; [self _setupContext]; columns = [moduleSettings objectForKey: @"ColumnsState"]; return [columns jsonRepresentation]; } - (WOResponse *) saveColumnsStateAction { WORequest *request; NSDictionary *columns; NSArray *columnsIds, *widths; [self _setupContext]; request = [context request]; columnsIds = [[request formValueForKey: @"columns"] componentsSeparatedByString: @","]; widths = [[request formValueForKey: @"widths"] componentsSeparatedByString: @","]; if (columnsIds != nil && widths != nil && [columnsIds count] == [widths count]) { columns = [NSDictionary dictionaryWithObjects: widths forKeys: columnsIds]; [moduleSettings setObject: columns forKey: @"ColumnsState"]; } else return [self responseWithStatus: 400]; [us synchronize]; return [self responseWithStatus: 204]; } - (id) defaultAction { SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; if ([ud rememberLastModule]) { [ud setLoginModule: @"Mail"]; [ud synchronize]; } return [super defaultAction]; } - (BOOL) showToAddress { SOGoMailFolder *co; if (!folderType) { co = [self clientObject]; if ([co isKindOfClass: [SOGoSentFolder class]] || [co isKindOfClass: [SOGoDraftsFolder class]]) folderType = 1; else folderType = -1; } return (folderType == 1); } - (NSDictionary *) columnsMetaData { NSMutableDictionary *columnsMetaData; NSArray *tmpColumns, *tmpKeys; columnsMetaData = [NSMutableDictionary dictionaryWithCapacity: 8]; tmpKeys = [NSArray arrayWithObjects: @"headerClass", @"headerId", @"value", nil]; tmpColumns = [NSArray arrayWithObjects: @"messageThreadColumn tbtv_headercell", @"invisibleHeader", @"Thread", nil]; [columnsMetaData setObject: [NSDictionary dictionaryWithObjects: tmpColumns forKeys: tmpKeys] forKey: @"Thread"]; tmpColumns = [NSArray arrayWithObjects: @"messageSubjectColumn tbtv_headercell sortableTableHeader resizable", @"subjectHeader", @"Subject", nil]; [columnsMetaData setObject: [NSDictionary dictionaryWithObjects: tmpColumns forKeys: tmpKeys] forKey: @"Subject"]; tmpColumns = [NSArray arrayWithObjects: @"messageFlagColumn tbtv_headercell", @"invisibleHeader", @"Flagged", nil]; [columnsMetaData setObject: [NSDictionary dictionaryWithObjects: tmpColumns forKeys: tmpKeys] forKey: @"Flagged"]; tmpColumns = [NSArray arrayWithObjects: @"messageFlagColumn tbtv_headercell", @"attachmentHeader", @"Attachment", nil]; [columnsMetaData setObject: [NSDictionary dictionaryWithObjects: tmpColumns forKeys: tmpKeys] forKey: @"Attachment"]; tmpColumns = [NSArray arrayWithObjects: @"messageFlagColumn tbtv_headercell", @"messageFlagHeader", @"Unread", nil]; [columnsMetaData setObject: [NSDictionary dictionaryWithObjects: tmpColumns forKeys: tmpKeys] forKey: @"Unread"]; tmpColumns = [NSArray arrayWithObjects: @"messageAddressHeader tbtv_headercell sortableTableHeader resizable", @"toHeader", @"To", nil]; [columnsMetaData setObject: [NSDictionary dictionaryWithObjects: tmpColumns forKeys: tmpKeys] forKey: @"To"]; tmpColumns = [NSArray arrayWithObjects: @"messageAddressColumn tbtv_headercell sortableTableHeader resizable", @"fromHeader", @"From", nil]; [columnsMetaData setObject: [NSDictionary dictionaryWithObjects: tmpColumns forKeys: tmpKeys] forKey: @"From"]; tmpColumns = [NSArray arrayWithObjects: @"messageDateColumn tbtv_headercell sortableTableHeader resizable", @"dateHeader", @"Date", nil]; [columnsMetaData setObject: [NSDictionary dictionaryWithObjects: tmpColumns forKeys: tmpKeys] forKey: @"Date"]; tmpColumns = [NSArray arrayWithObjects: @"messagePriorityColumn tbtv_headercell resizable", @"priorityHeader", @"Priority", nil]; [columnsMetaData setObject: [NSDictionary dictionaryWithObjects: tmpColumns forKeys: tmpKeys] forKey: @"Priority"]; tmpColumns = [NSArray arrayWithObjects: @"messageSizeColumn tbtv_headercell sortableTableHeader", @"sizeHeader", @"Size", nil]; [columnsMetaData setObject: [NSDictionary dictionaryWithObjects: tmpColumns forKeys: tmpKeys] forKey: @"Size"]; return columnsMetaData; } - (NSArray *) columnsDisplayOrder { NSMutableArray *finalOrder, *invalid; NSArray *available; NSDictionary *metaData; SOGoUserDefaults *ud; NSUInteger i; if (!columnsOrder) { ud = [[context activeUser] userDefaults]; columnsOrder = [ud mailListViewColumnsOrder]; metaData = [self columnsMetaData]; invalid = [columnsOrder mutableCopy]; [invalid autorelease]; available = [metaData allKeys]; [invalid removeObjectsInArray: available]; if ([invalid count] > 0) { [self errorWithFormat: @"those column names specified in" @" SOGoMailListViewColumnsOrder are invalid: '%@'", [invalid componentsJoinedByString: @"', '"]]; [self errorWithFormat: @" falling back on hardcoded column order"]; columnsOrder = available; } finalOrder = [columnsOrder mutableCopy]; [finalOrder autorelease]; if (![ud mailSortByThreads]) [finalOrder removeObject: @"Thread"]; else { i = [finalOrder indexOfObject: @"Thread"]; if (i == NSNotFound) [finalOrder insertObject: @"Thread" atIndex: 0]; } if ([self showToAddress]) { i = [finalOrder indexOfObject: @"From"]; if (i != NSNotFound) { [finalOrder removeObject: @"To"]; [finalOrder replaceObjectAtIndex: i withObject: @"To"]; } } else { i = [finalOrder indexOfObject: @"To"]; if (i != NSNotFound) { [finalOrder removeObject: @"From"]; [finalOrder replaceObjectAtIndex: i withObject: @"From"]; } } columnsOrder = [[self columnsMetaData] objectsForKeys: finalOrder notFoundMarker: @""]; [columnsOrder retain]; } return columnsOrder; } - (NSString *) columnsDisplayCount { return [NSString stringWithFormat: @"%d", [[self columnsDisplayOrder] count]]; } - (void) setCurrentColumn: (NSDictionary *) newCurrentColumn { ASSIGN (currentColumn, newCurrentColumn); } - (NSDictionary *) currentColumn { return currentColumn; } - (NSString *) columnTitle { return [self labelForKey: [currentColumn objectForKey: @"value"]]; } - (NSString *) unseenCountFolders { NSArray *pathComponents, *filters, *actions; NSDictionary *d, *action; NSMutableArray *folders; NSMutableString *path; SOGoUserDefaults *ud; NSString *s; NSUInteger i, j, k; // If Sieve scripts aren't enabled, there's no need in considering // what's potentially in the database regarding "fileinto" scripts. if (![[[context activeUser] domainDefaults] sieveScriptsEnabled]) return [[NSArray array] jsonRepresentation]; ud = [[context activeUser] userDefaults]; folders = [NSMutableArray array]; filters = [ud sieveFilters]; for (i = 0; i < [filters count]; i++) { d = [filters objectAtIndex: i]; actions = [d objectForKey: @"actions"]; for (j = 0; j < [actions count]; j++) { action = [actions objectAtIndex: j]; if ([[action objectForKey: @"method"] caseInsensitiveCompare: @"fileinto"] == NSOrderedSame) { s = [action objectForKey: @"argument"]; // We format the result string so that MailerUI.js can simply consume that information // without doing anything special on its side if (s) { pathComponents = [s componentsSeparatedByString: @"/"]; path = [NSMutableString string]; for (k = 0; k < [pathComponents count]; k++) { [path appendFormat: @"folder%@", [[pathComponents objectAtIndex: k] asCSSIdentifier]]; if (k < [pathComponents count] - 1) [path appendString: @"/"]; } [folders addObject: [NSString stringWithFormat: @"/0/%@", path]]; } } } } return [folders jsonRepresentation]; } // // Standard mapping done by Thunderbird: // // label1 => Important // label2 => Work // label3 => Personal // label4 => To Do // label5 => Later // - (NSArray *) availableLabels { NSDictionary *v; v = [[[context activeUser] userDefaults] mailLabelsColors]; return [SOGoMailLabel labelsFromDefaults: v component: self]; } - (void) setCurrentLabel: (SOGoMailLabel *) theCurrentLabel { ASSIGN(_currentLabel, theCurrentLabel); } - (SOGoMailLabel *) currentLabel { return _currentLabel; } @end /* UIxMailMainFrame */ SOGo-2.1.1b/UI/MailerUI/Russian.lproj/0000755000000000000000000000000012247657027015733 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Russian.lproj/Localizable.strings0000644000000000000000000003374512247657027021603 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Создать"; "Empty Trash" = "ОчиÑтить 'Удаленные'"; "Delete" = "Удалить"; "Expunge" = "ОчиÑтить"; "Forward" = "ПереÑлать"; "Get Mail" = "Получить"; "Junk" = "Спам"; "Reply" = "Ответить"; "Reply All" = "Ответить вÑем"; "Print" = "Печать"; "Stop" = "Стоп"; "Write" = "ÐапиÑать"; "Send" = "ПоÑлать"; "Contacts" = "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°"; "Attach" = "Вложить"; "Save" = "Сохранить"; "Options" = "Опции"; "Close" = "Закрыть"; "Size" = "Размер"; /* Tooltips */ "Send this message now" = "ПоÑлать Ñто Ñообщение ÑейчаÑ"; "Select a recipient from an Address Book" = "Выбрать получателей из адреÑной книги"; "Include an attachment" = "Приложить файл"; "Save this message" = "Сохранить Ñто Ñообщение"; "Get new messages" = "Получить новые ÑообщениÑ"; "Create a new message" = "СоÑтавить новое Ñообщение"; "Go to address book" = "Перейти в адреÑную книгу"; "Reply to the message" = "Ответить на Ñообщение"; "Reply to sender and all recipients" = "СоÑотавить ответ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ Ð¸ вÑех получателей"; "Forward selected message" = "ПереÑлать выделенное пиÑьмо"; "Delete selected message or folder" = "Удалить выделенное пиÑьмо или папку"; "Mark the selected messages as junk" = "Пометить выделенные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ðº Ñпам"; "Print this message" = "Ðапечатать Ñто Ñообщение"; "Stop the current transfer" = "ОÑтановить текущую операцию"; "Attachment" = "ВложениÑ"; "Unread" = "Ðепрочитанные"; "Flagged" = "Помеченные флагом"; /* Main Frame */ "Home" = "Ðачало"; "Calendar" = "Календарь"; "Addressbook" = "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°"; "Mail" = "Почта"; "Right Administration" = "Права доÑтупа"; "Help" = "Помощь"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Добро пожаловать в быÑтропочту! Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñообщений воÑпользуйтеÑÑŒ деревом папок Ñлева."; "Read messages" = "Читать ÑообщениÑ"; "Write a new message" = "СоÑтавить новое Ñообщение"; "Share: " = "СовмеÑтное иÑпользование: "; "Account: " = "Пользователь: "; "Shared Account: " = "ÐžÐ±Ñ‰Ð°Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ: "; /* acls */ "Access rights to" = "Права доÑтупа к"; "For user" = "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"; "Any Authenticated User" = "Любой аутентифицированный пользователь"; "List and see this folder" = "Видеть папку и Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¸Ñем в ней"; "Read mails from this folder" = "Читать пиÑьма в папке"; "Mark mails read and unread" = "Ставить пиÑьмам метку о прочтении"; "Modify the flags of the mails in this folder" = "РаÑÑтавлÑть флаги ÑообщениÑм в папке"; "Insert, copy and move mails into this folder" = "ДобавлÑть, копироваьт и перемещать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² Ñту папку"; "Post mails" = "ОтправлÑть ÑообщениÑ"; "Add subfolders to this folder" = "Создавать подпапки в Ñтой папке"; "Remove this folder" = "УдалÑть Ñту папку"; "Erase mails from this folder" = "УдалÑть ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð· Ñтой папки"; "Expunge this folder" = "Помечать пиÑьма как удаленные"; "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "УправлÑть правами доÑтупа к Ñтой папке"; "Saved Messages.zip" = "Saved Messages.zip"; "Update" = "Обновить"; "Cancel" = "Отмена"; /* Mail edition */ "From" = "От"; "Subject" = "Тема"; "To" = "Кому"; "Cc" = "КопиÑ"; "Bcc" = "Ð¡ÐºÑ€Ñ‹Ñ‚Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ"; "Reply-To" = "Обратный адреÑ"; "Add address" = "Добавить адреÑ"; "Attachments:" = "ВложениÑ:"; "Open" = "Открыть"; "Select All" = "Выбрать вÑе"; "Attach Web Page..." = "Прикрепить веб-Ñтраницы ..."; "Attach File(s)..." = "Прикрепить файл (Ñ‹) ..."; "to" = "Кому"; "cc" = "КопиÑ"; "bcc" = "Ð¡ÐºÑ€Ñ‹Ñ‚Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ"; "Edit Draft..." = "Редактировать черновик..."; "Load Images" = "Загрузить изображениÑ"; "Return Receipt" = "Уведомление о вручении"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Отправитель Ñтого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñил получать уведомлениÑ, когда вы читаете Ñто Ñообщение. Ð’Ñ‹ хотите уведомить отправителÑ?"; "Return Receipt (displayed) - %@"= "Уведомление о вручении (отображаетÑÑ Ð½Ð° диÑплее) -% @"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "ВажноÑть"; "highest" = "Самый выÑокий"; "high" = "Ð’Ñ‹Ñокий"; "normal" = "Обычный"; "low" = "Ðизкий"; "lowest" = "Самый низкий"; "This mail is being sent from an unsecure network!" = "Это почта была поÑлана Ñ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°Ñной Ñети!"; "Address Book:" = "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°"; "Search For:" = "Что иÑкать:"; /* Popup "show" */ "all" = "вÑе"; "read" = "прочитанные"; "unread" = "непрочитанные"; "deleted" = "удаленные"; "flagged" = "помеченные флагом"; /* MailListView */ "Sender" = "Отправитель"; "Subject or Sender" = "Тема или Отправитель"; "To or Cc" = "Кому или копиÑ"; "Entire Message" = "Сообщение целиком"; "Date" = "Дата"; "View" = "ПроÑмотр"; "All" = "Ð’Ñе"; "No message" = "Ðет Ñообщений"; "messages" = "ÑообщениÑ"; "first" = "перваÑ"; "previous" = "предыдущаÑ"; "next" = "ÑледующаÑ"; "last" = "поÑледнÑÑ"; "msgnumber_to" = "до"; "msgnumber_of" = "из"; "Mark Unread" = "Пометить как непрочитанное"; "Mark Read" = "Пометить как прочитанное"; "Untitled" = "Без темы"; /* Tree */ "SentFolderName" = "Отправленные"; "TrashFolderName" = "Корзина"; "InboxFolderName" = "ВходÑщие"; "DraftsFolderName" = "Черновики"; "SieveFolderName" = "Папки"; "OtherUsersFolderName" = "Другие пользователи"; "SharedFoldersName" = "Общие папки"; "Folders" = "Папки"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "ПеремеÑтить в …"; /* Address Popup menu */ "Add to Address Book..." = "Добавиь в адреÑную книгу..."; "Compose Mail To" = "СоÑтавить пиÑьмо длÑ"; "Create Filter From Message..." = "Создать фильтр из ÑообщениÑ..."; /* Image Popup menu */ "Save Image" = "Сохранить изображение"; "Save Attachment" = "Сохранить ПриложениÑ"; /* Mailbox popup menus */ "Open in New Mail Window" = "Открыть в новом окне"; "Copy Folder Location" = "Скопировать Ð°Ð´Ñ€ÐµÑ Ð¿Ð°Ð¿ÐºÐ¸"; "Subscribe..." = "ПодпиÑатьÑÑ..."; "Mark Folder Read" = "Отметить вÑе пиÑьма в папке как прочтенные..."; "New Folder..." = "Создать папку..."; "Compact This Folder" = "Сжать Ñту папку"; "Search Messages..." = "ПоиÑк в ÑообщениÑÑ…..."; "Sharing..." = "СовмеÑтное иÑпользование папки..."; "New Subfolder..." = "Создать вложенную папку..."; "Rename Folder..." = "Переименовать папку..."; "Delete Folder" = "Удалить папку"; "Use This Folder For" = "ИÑпользовать Ñту папку длÑ"; "Get Messages for Account" = "Получить новые ÑообщениÑ"; "Properties..." = "СвойÑтва ..."; "Delegation..." = "Делегирование ..."; /* Use This Folder menu */ "Sent Messages" = "Отправленные ÑообщениÑ"; "Drafts" = "Черновики"; "Deleted Messages" = "Удаленные ÑообщениÑ"; /* Message list popup menu */ "Open Message In New Window" = "Открыть Ñообщение в новом окне"; "Reply to Sender Only" = "Ответить отправителю"; "Reply to All" = "Ответить вÑем упомÑнутым адреÑатам"; "Edit As New..." = "Редактировать как новое..."; "Move To" = "ПеремеÑтить в"; "Copy To" = "Скопировать в"; "Label" = "Метка"; "Mark" = "Отметить"; "Save As..." = "Сохранить как..."; "Print Preview" = "Печатать Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¾Ñмотром"; "View Message Source" = "ПроÑмотр иÑходного текÑта ÑообщениÑ"; "Print..." = "Отправить на печать"; "Delete Message" = "Удалить Ñообщение"; "Delete Selected Messages" = "Удалить выделенные ÑообщениÑ"; "This Folder" = "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°"; /* Label popup menu */ "None" = "Удалить вÑе метки"; /* Mark popup menu */ "As Read" = "как прочтанное"; "Thread As Read" = "ветку как прочитанную"; "As Read By Date..." = "как прочитанные по дате..."; "All Read" = "вÑе прочитанные"; "Flag" = "Флаг"; "As Junk" = "Спам"; "As Not Junk" = "Ðе Ñпам"; "Run Junk Mail Controls" = "ЗапуÑтить фильтр Ñпама"; /* Folder operations */ "Name :" = "Ð˜Ð¼Ñ :"; "Enter the new name of your folder :" = "Введите новое Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ :"; "Do you really want to move this folder into the trash ?" = "Ð’Ñ‹ дейÑтвительно хотите перенеÑти Ñту папку в корзину?"; "Operation failed" = "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»Ð°ÑÑŒ неудачно"; "Quota" = "Квота:"; "quotasFormat" = "ЗанÑто %{0}% из %{1}МБ"; "Please select a message." = "ПожалуйÑта выберите Ñообщение."; "Please select a message to print." = "ПожалуйÑта выберите Ñообщение Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ на печать."; "Please select only one message to print." = "ПожалуйÑта выберите только одно Ñообщение Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸."; "The message you have selected doesn't exist anymore." = "Сообщение, которое вы выбрали, не ÑущеÑтвует больше."; "The folder with name \"%{0}\" could not be created." = "Ðе могу Ñоздать папку Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%{0}\"."; "This folder could not be renamed to \"%{0}\"." = "Ðе могу переименовать папку в \"%{0}\"."; "The folder could not be deleted." = "Ðе могу удалить Ñту папку."; "The trash could not be emptied." = "Ðе могу очиÑтить корзину."; "The folder functionality could not be changed." = "Ðазначение папки не может быть изменено."; "You need to choose a non-virtual folder!" = "Выберите одно из невиртуальных папок!"; "Moving a message into its own folder is impossible!" = "Ðевозможно перемеÑтить Ñообщение туда, где оно уже находитÑÑ!"; "Copying a message into its own folder is impossible!" = "Ðевозможно Ñкопировать Ñообщение туда, где оно уже находитÑÑ!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ могут быть помещены в корзину. Хотите ли вы уничтожить их немедленно?"; /* Message editing */ "error_missingsubject" = "Тема ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ указана"; "error_missingrecipients" = "Ðе указан Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ"; "Send Anyway" = "Ð’ÑÑ‘ равно поÑлать"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ Ñообщение: вÑем получателÑм, вÑе получатели ÑвлÑÑŽÑ‚ÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительными."; "cannot send message (smtp) - recipients discarded:" = "Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ Ñообщение. Следующие адреÑа неверны:"; "cannot send message: (smtp) error when connecting" = "Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ Ñообщение: ошибка при Ñоединении Ñ Ñервером SMTP."; /* Contacts list in mail editor */ "Email" = "Email"; "Name" = "ПолноеИмÑ"; SOGo-2.1.1b/UI/MailerUI/SpanishArgentina.lproj/0000755000000000000000000000000012247657027017545 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/SpanishArgentina.lproj/Localizable.strings0000644000000000000000000002461112247657027023405 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Crear"; "Empty Trash" = "Vaciar la papelera"; "Delete" = "Borrar"; "Expunge" = "Compactar"; "Forward" = "Reenviar"; "Get Mail" = "Recibir"; "Junk" = "SPAM"; "Reply" = "Responder"; "Reply All" = "Responder a todos"; "Print" = "Imprimir"; "Stop" = "Detener"; "Write" = "Redactar"; "Send" = "Enviar"; "Contacts" = "Contactos"; "Attach" = "Adjuntar"; "Save" = "Guardar"; "Options" = "Opciones"; "Close" = "Cerrar"; "Size" = "Tamaño"; /* Tooltips */ "Send this message now" = "Enviar este mensaje ahora"; "Select a recipient from an Address Book" = "Seleccione un destinatario de alguna de las libretas de direcciones"; "Include an attachment" = "Incluir un adjunto"; "Save this message" = "Guardar este mensaje"; "Get new messages" = "Recibir mensajes nuevos"; "Create a new message" = "Crear mensaje nuevo"; "Go to address book" = "Ir a libreta de direcciones"; "Reply to the message" = "Responder al mensaje"; "Reply to sender and all recipients" = "Responder al remitente y a todos los destinatarios"; "Forward selected message" = "Reenviar el mensaje seleccionado"; "Delete selected message or folder" = "Borrar el mensaje o la carpeta seleccionados"; "Mark the selected messages as junk" = "Marcar los mensajes seleccionados como SPAM"; "Print this message" = "Imprimir este mensaje"; "Stop the current transfer" = "Detener la transferencia actual"; "Attachment" = "Adjunto"; "Unread" = "No leído"; "Flagged" = "Marcado"; /* Main Frame */ "Home" = "Inicio"; "Calendar" = "Calendario"; "Addressbook" = "Libreta de direcciones"; "Mail" = "Correo"; "Right Administration" = "Gestión de permisos"; "Help" = "Ayuda"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Bienvenido al módulo de correo de SOGo. Use el árbol de carpetas a la izquierda para navegar por sus cuentas de correo."; "Read messages" = "Leer mensajes"; "Write a new message" = "Redactar un nuevo mensaje"; "Share: " = "Compartir: "; "Account: " = "Cuenta: "; "Shared Account: " = "Cuenta compartida: "; /* acls */ "Access rights to" = "Permisos de acceso a"; "For user" = "Para el usuario"; "Any Authenticated User" = "Cualquier usuario autenticado"; "List and see this folder" = "Listar y ver esta carpeta"; "Read mails from this folder" = "Leer corrreo de esta carpeta"; "Mark mails read and unread" = "Marcar correos como leídos y no leídos"; "Modify the flags of the mails in this folder" = "Modificar los indicadores de los correos en esta carpeta"; "Insert, copy and move mails into this folder" = "Insertar, copiar y mover correos en esta carpeta"; "Post mails" = "Enviar correo"; "Add subfolders to this folder" = "Añadir subcarpetas a esta carpeta"; "Remove this folder" = "Borrar esta carpeta"; "Erase mails from this folder" = "Borrar los correos de esta carpeta"; "Expunge this folder" = "Compactar esta carpeta"; "Archive This Folder" = "Archivar esta carpeta"; "Modify the acl of this folder" = "Modificar los permisos de esta carpeta"; "Saved Messages.zip" = "Mensajes Guardados.zip"; "Update" = "Actualizar"; "Cancel" = "Cancelar"; /* Mail edition */ "From" = "De"; "Subject" = "Asunto"; "To" = "Para"; "Cc" = "Cc"; "Bcc" = "CCo"; "Reply-To" = "Responder a"; "Add address" = "Añadir dirección"; "Attachments:" = "Adjuntos:"; "Open" = "Abrir"; "Select All" = "Seleccionar todo"; "Attach Web Page..." = "Adjuntar página web..."; "Attach File(s)..." = "Adjuntar archivo(s)..."; "to" = "Para"; "cc" = "Cc"; "bcc" = "CCo"; "Edit Draft..." = "Editar borrador..."; "Load Images" = "Cargar Imágenes"; "Return Receipt" = "Acuse de Recibo"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "El remitente ha solicitado que se le notifique cuando se lea este correo. ¿Quiere notificar al remitente?"; "Return Receipt (displayed) - %@"= "Acuse de Recibo (mostrado) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Este es un Acuse de Recibo del correo enviado a %@.\n\nNota: Este acuse de recibo sólo garantiza que el mensaje se mostró en la computadora del destinatario. No hay garantía de que el destinatario haya leído o comprendido el contenido del mensaje."; "Priority" = "Prioridad"; "highest" = "Muy alta"; "high" = "Alta"; "normal" = "Normal"; "low" = "Baja"; "lowest" = "Muy baja"; "This mail is being sent from an unsecure network!" = "Este mensaje esta siendo enviado desde una red no segura."; "Address Book:" = "Libreta de direcciones:"; "Search For:" = "Buscar:"; /* Popup "show" */ "all" = "todo"; "read" = "leído"; "unread" = "no leído"; "deleted" = "borrado"; "flagged" = "marcado"; /* MailListView */ "Sender" = "Remitente"; "Subject or Sender" = "Asunto o remitente"; "To or Cc" = "Para o CC"; "Entire Message" = "Mensage completo"; "Date" = "Fecha"; "View" = "Vista"; "All" = "Todo"; "No message" = "Sin mensajes"; "messages" = "mensajes"; "first" = "Primero"; "previous" = "Anterior"; "next" = "Siguiente"; "last" = "Último"; "msgnumber_to" = "a"; "msgnumber_of" = "de"; "Mark Unread" = "Marcar como no leído"; "Mark Read" = "Marcar como leído"; "Untitled" = "Sin título"; /* Tree */ "SentFolderName" = "Enviados"; "TrashFolderName" = "Papelera"; "InboxFolderName" = "Bandeja de entrada"; "DraftsFolderName" = "Borradores"; "SieveFolderName" = "Filtros"; "OtherUsersFolderName" = "Otros usuarios"; "SharedFoldersName" = "Carpetas compartidas"; "Folders" = "Carpetas"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Mover a …"; /* Address Popup menu */ "Add to Address Book..." = "Añadir a una libreta de direcciones..."; "Compose Mail To" = "Crear mensaje para"; "Create Filter From Message..." = "Create filtro a partir del mensaje..."; /* Image Popup menu */ "Save Image" = "Guardar imagen"; "Save Attachment" = "Guardar adjunto"; /* Mailbox popup menus */ "Open in New Mail Window" = "Abrir mensaje en nueva ventana"; "Copy Folder Location" = "Copiar dirección de la carpeta"; "Subscribe..." = "Suscribir..."; "Mark Folder Read" = "Marcar carpeta como leída..."; "New Folder..." = "Crear carpeta..."; "Compact This Folder" = "Compactar esta carpeta"; "Search Messages..." = "Buscar mensajes..."; "Sharing..." = "Compartir..."; "New Subfolder..." = "Crear subcarpeta..."; "Rename Folder..." = "Renombrar carpeta..."; "Delete Folder" = "Borrar carpeta"; "Use This Folder For" = "Usar esta carpeta para"; "Get Messages for Account" = "Recibir mensajes para cuenta"; "Properties..." = "Propiedades..."; "Delegation..." = "Delegación..."; /* Use This Folder menu */ "Sent Messages" = "Enviar mensajes"; "Drafts" = "Borradores"; "Deleted Messages" = "Mensajes borrados"; /* Message list popup menu */ "Open Message In New Window" = "Abrir mensaje en ventana nueva"; "Reply to Sender Only" = "Responder sólo al remitente"; "Reply to All" = "Reponder a todos"; "Edit As New..." = "Editar como nuevo..."; "Move To" = "Mover a"; "Copy To" = "Copiar a"; "Label" = "Etiquetar"; "Mark" = "Marcar"; "Save As..." = "Guardar como..."; "Print Preview" = "Vista preliminar"; "View Message Source" = "Ver formato original del mensaje"; "Print..." = "Imprimir..."; "Delete Message" = "Borrar mensaje"; "Delete Selected Messages" = "Borrar mensajes selecionados"; "This Folder" = "Esta carpeta"; /* Label popup menu */ "None" = "Ninguna"; /* Mark popup menu */ "As Read" = "Como leídos"; "Thread As Read" = "Conversación como leída"; "As Read By Date..." = "Como leídos por fecha..."; "All Read" = "Todos leídos"; "Flag" = "Añadir estrella"; "As Junk" = "Como correo basura"; "As Not Junk" = "Como correo normal"; "Run Junk Mail Controls" = "Ejecutar controles de correo basura"; /* Folder operations */ "Name :" = "Nombre: "; "Enter the new name of your folder :" = "Introduzca el nuevo nombre de la carpeta: "; "Do you really want to move this folder into the trash ?" = "¿Seguro que desea mover la carpeta a la papelera?"; "Operation failed" = "Operación fallida"; "Quota" = "Cuota"; "quotasFormat" = "%{0}% de %{1} MB usados"; "Please select a message." = "Seleccione un mensaje."; "Please select a message to print." = "Seleccione el mensaje que desea imprimir."; "Please select only one message to print." = "Para imprimir, seleccione sólo un mensaje."; "The message you have selected doesn't exist anymore." = "El mensaje seleccionado ya no existe."; "The folder with name \"%{0}\" could not be created." = "La carpeta llamada \"%{0}\" no puede ser creada."; "This folder could not be renamed to \"%{0}\"." = "La carpeta no puede ser renombrada a \"%{0}\"."; "The folder could not be deleted." = "La carpeta no puede ser borrada."; "The trash could not be emptied." = "La papelera no puede ser vaciada."; "The folder functionality could not be changed." = "La funcionalidad de la carpeta no puede ser cambiada."; "You need to choose a non-virtual folder!" = "¡Ha de seleccionar una carpeta no virtual!"; "Moving a message into its own folder is impossible!" = "¡Es imposible mover los mensajes en su propia carpeta!"; "Copying a message into its own folder is impossible!" = "¡Es imposible copiar mensajes en su propia carpeta!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Los mensajes no pueden ser movidos a la papelera. ¿Quiere borrarlos inmediatamente?"; /* Message editing */ "error_missingsubject" = "No ha indicado el asunto"; "error_missingrecipients" = "No ha indicado el/los destinatario(s)"; "Send Anyway" = "Enviar de cualquier forma"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "No se puede enviar el mensaje: (smtp) todos los destinatarios han sido descartados"; "cannot send message (smtp) - recipients discarded:" = "No se puede enviar el mensaje: (smtp) destinatarios descartados:"; "cannot send message: (smtp) error when connecting" = "No se puede enviar el mensaje: (smtp) error de conexión"; /* Contacts list in mail editor */ "Email" = "Correo"; "Name" = "Nombre Completo"; SOGo-2.1.1b/UI/MailerUI/product.plist0000644000000000000000000002746512247657027015735 0ustar rootroot{ /* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ requires = ( MAIN, MainUI, CommonUI, Mailer, MailPartViewers ); publicResources = ("generic.js", "UIxAppointmentEditor.js", "UIxContactEditor.js", "UIxMailToSelection.js", "lori_32x32.png", "tbtv_account_17x17.gif", "tbtv_drafts_17x17.gif", "tbtv_inbox_17x17.png", "tbtv_junction2_17x17.gif", "tbtv_junction_17x17.gif", "tbtv_leaf_corner_17x17.png", "tbtv_line_17x17.gif", "tbtv_minus_17x17.gif", "tbtv_plus_17x17.gif", "tbtv_corner_17x17.gif", "tbtv_corner_minus_17x17.gif", "tbtv_corner_plus_17x17.gif", "tbtv_sent_17x17.gif", "tbtv_trash_17x17.gif", "tbtb_addressbook.png", "tbtb_compose.png", "tbtb_delete.png", "tbtb_deletedoc.png", "tbtb_filetofolder.png", "tbtb_forward.png", "tbtb_getmail.png", "tbtb_next.png", "tbtb_previous.png", "tbtb_print.png", "tbtb_reply.png", "tbtb_replyall.png", "tbtb_search.png", "tbtb_trash.png", "tbtb_compose_addressbook_30x30.png", "tbtb_compose_attach_30x30.png", "tbtb_compose_clip_30x30.png", "tbtb_compose_cut_30x30.png", "tbtb_compose_dup_30x30.png", "tbtb_compose_file_30x30.png", "tbtb_compose_lock_30x30.png", "tbtb_compose_quote_30x30.png", "tbtb_compose_send_30x30.png", "tbtb_compose_spell_30x30.png", "message-mail.png", "message-mail-read.png", "dot.png", "flag.png", "icon_unread.gif", "title_attachment_14x14.png", "title_config.png", "title_junk.png", "title_read_14x14.png", "title_thread.png", "title_sortdown_12x12.png", "title_sortup_12x12.png", ); factories = { }; categories = { SOGoMailFolder = { slots = { toolbar = { protectedBy = "View"; value = "SOGoMailFolder.toolbar"; }; }; methods = { uids = { protectedBy = ""; actionClass = "UIxMailListActions"; actionName = "getUIDs"; }; headers = { protectedBy = ""; actionClass = "UIxMailListActions"; actionName = "getHeaders"; }; subscribe = { protectedBy = ""; actionClass = "UIxMailFolderActions"; actionName = "subscribe"; }; unsubscribe = { protectedBy = ""; actionClass = "UIxMailFolderActions"; actionName = "unsubscribe"; }; quotas = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "quotas"; }; expunge = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "expunge"; }; createFolder = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "createFolder"; }; renameFolder = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "renameFolder"; }; delete = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "delete"; }; batchDelete = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "batchDelete"; }; saveMessages = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "saveMessages"; }; markRead = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "markFolderRead"; }; exportFolder = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "exportFolder"; }; copyMessages = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "copyMessages"; }; moveMessages = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "moveMessages"; }; setAsDraftsFolder = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "setAsDraftsFolder"; }; setAsSentFolder = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "setAsSentFolder"; }; setAsTrashFolder = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "setAsTrashFolder"; }; userRights = { protectedBy = "ReadAcls"; pageName = "UIxMailUserRightsEditor"; }; unseenCount = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "unseenCount"; }; saveUserRights = { protectedBy = "Change Permissions"; pageName = "UIxMailUserRightsEditor"; actionName = "saveUserRights"; }; }; }; SOGoTrashFolder = { /* just a new toolbar, other things come from SOGoMailFolder */ slots = { toolbar = { protectedBy = "View"; value = "SOGoMailFolder.toolbar"; }; }; methods = { emptyTrash = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "emptyTrash"; }; }; }; SOGoMailObject = { slots = { toolbar = { protectedBy = "View"; value = "SOGoMailObject.toolbar"; }; }; methods = { view = { protectedBy = "View"; pageName = "UIxMailView"; }; sendMDN = { protectedBy = "View"; pageName = "UIxMailView"; actionName = "sendMDN"; }; viewsource = { protectedBy = "View"; actionClass = "UIxMailSourceView"; actionName = "viewSource"; }; popupview = { protectedBy = "View"; pageName = "UIxMailPopupView"; }; junk = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "junk"; }; edit = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "edit"; }; reply = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "reply"; }; replyall = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "replyToAll"; }; forward = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "forward"; }; markMessageUnflagged = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "markMessageUnflagged"; }; markMessageFlagged = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "markMessageFlagged"; }; markMessageUnread = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "markMessageUnread"; }; markMessageRead = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "markMessageRead"; }; addLabel = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "addLabel"; }; removeLabel = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "removeLabel"; }; removeAllLabels = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "removeAllLabels"; }; }; }; SOGoMailAccounts = { slots = { toolbar = { protectedBy = "View"; value = "SOGoMailFolder.toolbar"; }; }; methods = { view = { protectedBy = "View"; pageName = "UIxMailMainFrame"; }; compose = { protectedBy = "View"; pageName = "UIxMailMainFrame"; actionName = "compose"; }; foldersState = { protectedBy = "View"; pageName = "UIxMailMainFrame"; actionName = "getFoldersState"; }; saveDragHandleState = { protectedBy = "View"; pageName = "UIxMailMainFrame"; actionName = "saveDragHandleState"; }; saveFoldersState = { protectedBy = "View"; pageName = "UIxMailMainFrame"; actionName = "saveFoldersState"; }; saveColumnsState = { protectedBy = "View"; pageName = "UIxMailMainFrame"; actionName = "saveColumnsState"; }; }; }; SOGoMailAccount = { slots = { toolbar = { protectedBy = "View"; value = "SOGoMailFolder.toolbar"; }; }; methods = { compose = { protectedBy = "View"; actionClass = "UIxMailAccountActions"; actionName = "compose"; }; mailboxes = { protectedBy = "View"; actionClass = "UIxMailAccountActions"; actionName = "listMailboxes"; }; createFolder = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "createFolder"; }; delegation = { protectedBy = "View"; pageName = "UIxMailUserDelegationEditor"; }; addDelegate = { protectedBy = "View"; actionClass = "UIxMailAccountActions"; actionName = "addDelegate"; }; removeDelegate = { protectedBy = "View"; actionClass = "UIxMailAccountActions"; actionName = "removeDelegate"; }; }; }; SOGoDraftObject = { slots = { toolbar = { protectedBy = "View"; value = "SOGoDraftObject.toolbar"; }; }; methods = { view = { protectedBy = "View"; pageName = "UIxMailEditor"; }; edit = { protectedBy = "View"; pageName = "UIxMailEditor"; }; save = { protectedBy = "View"; pageName = "UIxMailEditor"; actionName = "save"; }; send = { protectedBy = "View"; pageName = "UIxMailEditor"; actionName = "send"; }; delete = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "delete"; }; deleteAttachment = { protectedBy = "View"; actionClass = "UIxMailActions"; actionName = "deleteAttachment"; }; }; }; }; } SOGo-2.1.1b/UI/MailerUI/UIxMailToSelection.m0000644000000000000000000001470112247657027017024 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import #import #import #import #import #import /* UIxMailToSelection Select a set of address headers for composing an email. Bindings: to - array of strings suitable for placement in a To: header cc - array of strings suitable for placement in a Cc: header bcc - array of strings suitable for placement in a Bcc: header Sample: */ @class NSArray; @interface UIxMailToSelection : UIxComponent { NSArray *to; NSArray *cc; NSArray *bcc; id item; id address; NSArray *addressList; int currentIndex; } - (void) setTo: (NSArray *) _to; - (NSArray *) to; - (void) setCc: (NSArray *) _cc; - (NSArray *) cc; - (void) setBcc: (NSArray *) _bcc; - (NSArray *) bcc; - (void) getAddressesFromFormValues: (NSDictionary *) _dict; - (NSString *) getIndexFromIdentifier: (NSString *) _identifier; @end @implementation UIxMailToSelection static NSArray *headers = nil; + (void) initialize { static BOOL didInit = NO; if (!didInit) { didInit = YES; headers = [[NSArray alloc] initWithObjects: @"to", @"cc", @"bcc", nil]; } } - (id) init { if ((self = [super init])) currentIndex = -1; return self; } - (void) dealloc { [to release]; [cc release]; [bcc release]; [item release]; [address release]; [addressList release]; [super dealloc]; } /* accessors */ - (void) setTo: (NSArray *) _to { ASSIGN (to, _to); } - (NSArray *) to { NSString *mailto; mailto = [self queryParameterForKey: @"mailto"]; if ([mailto length] > 0 && ![to count]) { to = [NSArray arrayWithObject: mailto]; [to retain]; } return to; } - (void) setCc: (NSArray *) _cc { ASSIGN (cc, _cc); } - (NSArray *) cc { return cc; } - (void) setBcc: (NSArray *) _bcc { ASSIGN (bcc, _bcc); } - (NSArray *) bcc { return bcc; } - (void) setAddressList: (NSArray *) _addressList { ASSIGN (addressList, _addressList); } - (NSArray *) addressList { return addressList; } - (void) setAddress: (id) _address { ASSIGN (address, _address); } - (id) address { return address; } - (void) setItem: (id) _item { ASSIGN (item, _item); } - (id) item { return item; } - (NSArray *) addressLists { NSMutableArray *ma; NSArray *tmp; ma = [NSMutableArray arrayWithCapacity:3]; if ([to isNotNull] && [to count] > 0) [ma addObject: to]; if ([cc isNotNull]) [ma addObject: cc]; if ([bcc isNotNull]) [ma addObject: bcc]; /* ensure that at least one object is available */ if ([ma count] == 0) { tmp = [NSArray arrayWithObject: @""]; ASSIGN (to, tmp); [ma addObject: to]; } return ma; } - (NSArray *) headers { return headers; } - (NSString *) currentHeader { if (addressList == to) return @"to"; else if (addressList == cc) return @"cc"; return @"bcc"; } /* identifiers */ - (NSString *) nextId { currentIndex++; return @""; } - (NSString *) currentRowId { [self nextId]; return [NSString stringWithFormat: @"row_%d", currentIndex]; } - (NSString *) currentPopUpId { return [NSString stringWithFormat: @"popup_%d", currentIndex]; } - (NSString *) currentAddressId { return [NSString stringWithFormat: @"addr_%d", currentIndex]; } /* handling requests */ - (void) _fillAddresses: (NSMutableArray *) addresses withObject: (id) object { NSEnumerator *list; NSString *currentAddress; if ([object isKindOfClass: [NSString class]]) [addresses addObject: object]; else if ([object isKindOfClass: [NSArray class]]) { list = [object objectEnumerator]; while ((currentAddress = [[list nextObject] stringByTrimmingSpaces])) if ([currentAddress length]) [addresses addObject: currentAddress]; } } - (void) getAddressesFromFormValues: (NSDictionary *) _dict { NSMutableArray *rawTo, *rawCc, *rawBcc; NSString *idx, *popupKey, *popupValue; NSArray *keys; unsigned i, count; id addr; rawTo = [NSMutableArray arrayWithCapacity:4]; rawCc = [NSMutableArray arrayWithCapacity:4]; rawBcc = [NSMutableArray arrayWithCapacity:2]; keys = [_dict allKeys]; count = [keys count]; for (i = 0; i < count; i++) { NSString *key; key = [keys objectAtIndex:i]; if ([key hasPrefix:@"addr_"]) { addr = [_dict objectForKey:key]; idx = [self getIndexFromIdentifier:key]; popupKey = [NSString stringWithFormat:@"popup_%@", idx]; popupValue = [[_dict objectForKey:popupKey] lastObject]; if([popupValue isEqualToString:@"0"]) [self _fillAddresses: rawTo withObject: addr]; else if([popupValue isEqualToString:@"1"]) [self _fillAddresses: rawCc withObject: addr]; else [self _fillAddresses: rawBcc withObject: addr]; } } [self setTo: rawTo]; [self setCc: rawCc]; [self setBcc: rawBcc]; } - (NSString *) getIndexFromIdentifier: (NSString *) _identifier { NSRange r; r = [_identifier rangeOfString: @"_"]; return [_identifier substringFromIndex: NSMaxRange(r)]; } - (void) takeValuesFromRequest: (WORequest *) _rq inContext: (WOContext *) _ctx { /* OK, we have a special form value processor */ NSDictionary *d; if ((d = [_rq formValues]) == nil) return; #if 0 [self debugWithFormat:@"Note: will take values ..."]; NSLog(@"%s formValues: %@", __PRETTY_FUNCTION__, d); #endif [self getAddressesFromFormValues: d]; } - (int) addressCount { return [to count] + [cc count] + [bcc count]; } @end /* UIxMailToSelection */ SOGo-2.1.1b/UI/MailerUI/UIxMailFormatter.m0000644000000000000000000001045212247657027016536 0ustar rootroot/* Copyright (C) 2004 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import #import #import #import #import "UIxMailFormatter.h" static Class StrClass = Nil; static Class CalDateClass = Nil; @implementation UIxMailFormatter static BOOL debugOn = YES; + (void)initialize { StrClass = [NSString class]; CalDateClass = [NSCalendarDate class]; } /* labels */ - (NSString *)labelForKey:(NSString *)_key { // TODO: fetch labels from context return _key; } /* debugging */ - (BOOL)isDebuggingEnabled { return debugOn; } @end /* UIxMailFormatter */ @implementation UIxMailDateFormatter - (id)init { if ((self = [super init])) { static NSTimeZone *met = nil; if (met == nil) met = [[NSTimeZone timeZoneWithName:@"MET"] retain]; self->timeZone = [met retain]; self->dfFlags.showOnlyTimeForToday = 1; self->dfFlags.showLabelsForNearDays = 1; } return self; } - (void)dealloc { [self->timeZone release]; [self->now release]; [super dealloc]; } /* configuration */ - (NSTimeZone *)timeZone { return self->timeZone; } - (void) setTimeZone: (NSTimeZone *) newTimeZone { if (timeZone) [timeZone release]; timeZone = newTimeZone; if (timeZone) [timeZone retain]; } - (BOOL)showOnlyTimeForToday { return self->dfFlags.showOnlyTimeForToday ? YES : NO; } - (BOOL)showLabelsForNearDays { return self->dfFlags.showLabelsForNearDays ? YES : NO; } /* formatting dates */ - (NSString *)stringForTime:(NSCalendarDate *)_d prefix:(char *)_p { /* Note: prefix is not allowed to be long! */ char buf[32]; if (_p == NULL) _p = ""; #if GS_64BIT_OLD sprintf(buf, "%s%02i:%02i", _p, [_d hourOfDay], [_d minuteOfHour]); #else sprintf(buf, "%s%02li:%02li", _p, [_d hourOfDay], [_d minuteOfHour]); #endif return [StrClass stringWithCString:buf]; } - (NSString *)stringForCalendarDate:(NSCalendarDate *)_date { char buf[32]; if (self->now == nil) { self->now = [[NSCalendarDate alloc] init]; [self->now setTimeZone:[self timeZone]]; } [_date setTimeZone:[self timeZone]]; if ([self showOnlyTimeForToday] && [_date isDateOnSameDay:self->now]) return [self stringForTime:_date prefix:NULL]; if ([self showLabelsForNearDays]) { NSString *label; if ([_date isDateOnSameDay:self->now]) label = [self labelForKey:@"today"]; else if ([_date isDateOnSameDay:[self->now yesterday]]) label = [self labelForKey:@"yesterday"]; else label = nil; if (label != nil) { return [label stringByAppendingString: [self stringForTime:_date prefix:", "]]; } } #if GS_64BIT_OLD sprintf(buf, "%02d.%02d.%04d %02d:%02d", [_date dayOfMonth], [_date monthOfYear], [_date yearOfCommonEra], [_date hourOfDay], [_date minuteOfHour]); #else sprintf(buf, "%02ld.%02ld.%04ld %02ld:%02ld", [_date dayOfMonth], [_date monthOfYear], [_date yearOfCommonEra], [_date hourOfDay], [_date minuteOfHour]); #endif return [StrClass stringWithCString:buf]; } /* formatter entry function */ - (NSString *)stringForObjectValue:(id)_date { if (![_date isNotNull]) return nil; if ([_date isKindOfClass:StrClass]) /* already formatted */ return _date; if ([_date isKindOfClass:CalDateClass]) return [self stringForCalendarDate:_date]; [self debugWithFormat: @"NOTE: unexpected object for date formatter: %@<%@>", _date, NSStringFromClass([_date class])]; return [_date description]; } @end /* UIxMailDateFormatter */ SOGo-2.1.1b/UI/MailerUI/UIxMailActions.m0000644000000000000000000001375312247657027016202 0ustar rootroot/* UIxMailActions.m - this file is part of SOGo * * Copyright (C) 2007-2013 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import #import #import #import #import #import #import "../Common/WODirectAction+SOGo.h" #import "UIxMailActions.h" @implementation UIxMailActions - (WOResponse *) replyToAll: (BOOL) toAll { SOGoMailAccount *account; SOGoMailObject *co; SOGoDraftsFolder *folder; SOGoDraftObject *newMail; NSString *newLocation; co = [self clientObject]; account = [co mailAccountFolder]; folder = [account draftsFolderInContext: context]; newMail = [folder newDraft]; [newMail fetchMailForReplying: co toAll: toAll]; newLocation = [NSString stringWithFormat: @"%@/edit", [newMail baseURLInContext: context]]; return [self redirectToLocation: newLocation]; } - (WOResponse *) replyAction { return [self replyToAll: NO]; } - (WOResponse *) replyToAllAction { return [self replyToAll: YES]; } - (WOResponse *) forwardAction { SOGoMailAccount *account; SOGoMailObject *co; SOGoDraftsFolder *folder; SOGoDraftObject *newMail; NSString *newLocation; co = [self clientObject]; account = [co mailAccountFolder]; folder = [account draftsFolderInContext: context]; newMail = [folder newDraft]; [newMail fetchMailForForwarding: co]; newLocation = [NSString stringWithFormat: @"%@/edit", [newMail baseURLInContext: context]]; return [self redirectToLocation: newLocation]; } /* active message */ - (id) markMessageUnflaggedAction { id response; response = [[self clientObject] removeFlags: @"\\Flagged"]; if (!response) response = [self responseWith204]; return response; } - (id) markMessageFlaggedAction { id response; response = [[self clientObject] addFlags: @"\\Flagged"]; if (!response) response = [self responseWith204]; return response; } - (id) markMessageUnreadAction { id response; response = [[self clientObject] removeFlags: @"seen"]; if (!response) response = [self responseWith204]; return response; } - (id) markMessageReadAction { id response; response = [[self clientObject] addFlags: @"seen"]; if (!response) response = [self responseWith204]; return response; } /* SOGoDraftObject */ - (WOResponse *) editAction { SOGoMailAccount *account; SOGoMailObject *co; SOGoDraftsFolder *folder; SOGoDraftObject *newMail; NSString *newLocation; co = [self clientObject]; account = [co mailAccountFolder]; folder = [account draftsFolderInContext: context]; newMail = [folder newDraft]; [newMail fetchMailForEditing: co]; [newMail storeInfo]; newLocation = [NSString stringWithFormat: @"%@/edit", [newMail baseURLInContext: context]]; return [self redirectToLocation: newLocation]; } - (id) deleteAction { SOGoDraftObject *draft; NSException *error; id response; draft = [self clientObject]; error = [draft delete]; if (error) response = error; else response = [self responseWith204]; return response; } - (WOResponse *) deleteAttachmentAction { WOResponse *response; NSString *filename; filename = [[context request] formValueForKey: @"filename"]; if ([filename length] > 0) { response = [self responseWith204]; [[self clientObject] deleteAttachmentWithName: filename]; } else { response = [self responseWithStatus: 500]; [response appendContentString: @"How did you end up here?"]; } return response; } - (WOResponse *) addLabelAction { WOResponse *response; SOGoMailObject *co; NSException *error; NSArray *flags; NSString *flag; flag = [[[self->context request] formValueForKey: @"flag"] fromCSSIdentifier]; co = [self clientObject]; flags = [NSArray arrayWithObject: flag]; error = [co addFlags: flags]; if (error) response = (WOResponse *) error; else response = [self responseWith204]; return response; } - (WOResponse *) removeLabelAction { WOResponse *response; SOGoMailObject *co; NSException *error; NSArray *flags; NSString *flag; flag = [[[self->context request] formValueForKey: @"flag"] fromCSSIdentifier]; co = [self clientObject]; flags = [NSArray arrayWithObject: flag]; error = [co removeFlags: flags]; if (error) response = (WOResponse *) error; else response = [self responseWith204]; return response; } - (WOResponse *) removeAllLabelsAction { NSMutableArray *flags; WOResponse *response; SOGoMailObject *co; NSException *error; NSDictionary *v; co = [self clientObject]; v = [[[context activeUser] userDefaults] mailLabelsColors]; // We always unconditionally remove the Mozilla tags flags = [NSMutableArray arrayWithObjects: @"$Label1", @"$Label2", @"$Label3", @"$Label4", @"$Label5", nil]; [flags addObjectsFromArray: [v allKeys]]; error = [co removeFlags: flags]; if (error) response = (WOResponse *) error; else response = [self responseWith204]; return response; } @end SOGo-2.1.1b/UI/MailerUI/French.lproj/0000755000000000000000000000000012247657027015514 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/French.lproj/Localizable.strings0000644000000000000000000002555112247657027021360 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Créer"; "Empty Trash" = "Vider la corbeille"; "Delete" = "Supprimer"; "Expunge" = "Purger"; "Forward" = "Transférer"; "Get Mail" = "Relever"; "Junk" = "Indésirable"; "Reply" = "Répondre"; "Reply All" = "Rép. à tous"; "Print" = "Imprimer"; "Stop" = "Arrêter"; "Write" = "Écrire"; "Send" = "Envoyer"; "Contacts" = "Contacts"; "Attach" = "Joindre"; "Save" = "Enregistrer"; "Options" = "Options"; "Close" = "Fermer"; "Size" = "Taille"; /* Tooltips */ "Send this message now" = "Envoyer le message maintenant"; "Select a recipient from an Address Book" = "Sélectionner un destinataire du carnet d'adresses"; "Include an attachment" = "Inclure une pièce jointe"; "Save this message" = "Enregistrer ce message"; "Get new messages" = "Relever les nouveaux messages"; "Create a new message" = "Créer un nouveau message"; "Go to address book" = "Ouvrir le carnet d'adresses"; "Reply to the message" = "Répondre au message"; "Reply to sender and all recipients" = "Répondre à l'expéditeur et à tous les destinataires"; "Forward selected message" = "Transférer le message sélectionné"; "Delete selected message or folder" = "Supprimer le message ou le dossier sélectionné"; "Mark the selected messages as junk" = "Marquer les messages sélectionnés comme indésirables"; "Print this message" = "Imprimer ce message"; "Stop the current transfer" = "Arrêter le transfert courant"; "Attachment" = "Documents joints"; "Unread" = "Non lus"; "Flagged" = "Marqués"; /* Main Frame */ "Home" = "Accueil"; "Calendar" = "Agenda"; "Addressbook" = "Adresses"; "Mail" = "Courrier"; "Right Administration" = "Administration"; "Help" = "Aide"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Bienvenue dans votre webmail. Utilisez l'arborescence sur votre gauche pour parcourir vos boites mails."; "Read messages" = "Lire les messages"; "Write a new message" = "Écrire un nouveau message"; "Share: " = "Partage : "; "Account: " = "Compte : "; "Shared Account: " = "Compte Partagé "; /* acls */ "Access rights to" = "Droits d'accès à"; "For user" = "Pour l'utilisateur"; "Any Authenticated User" = "Tout utilisateur identifié"; "List and see this folder" = "Lister et voir ce dossier"; "Read mails from this folder" = "Lire les messages de ce dossier"; "Mark mails read and unread" = "Marquer les messages comme lus ou non-lus"; "Modify the flags of the mails in this folder" = "Modifier les indicateurs sur les messages"; "Insert, copy and move mails into this folder" = "Insérer, copier et déplacer des messages dans ce dossier"; "Post mails" = "Poster des messages"; "Add subfolders to this folder" = "Ajouter des sous-dossiers à ce dossier"; "Remove this folder" = "Effacer ce dossier"; "Erase mails from this folder" = "Effacer des messages de ce dossier"; "Expunge this folder" = "Compacter ce dossier"; "Archive This Folder" = "Archiver ce dossier"; "Modify the acl of this folder" = "Administrer les droits sur ce dossier"; "Saved Messages.zip" = "Messages sauvegardés.zip"; "Update" = "Mettre à jour"; "Cancel" = "Annuler"; /* Mail edition */ "From" = "Expéditeur"; "Subject" = "Sujet"; "To" = "Destinataire"; "Cc" = "Copie à"; "Bcc" = "Copie cachée à"; "Reply-To" = "Répondre à"; "Add address" = "Ajouter Adresse"; "Attachments:" = "Pièces jointes :"; "Open" = "Ouvrir"; "Select All" = "Tout sélectionner"; "Attach Web Page..." = "Joindre une page Web..."; "Attach File(s)..." = "Joindre un fichier..."; "to" = "Pour"; "cc" = "Copie à"; "bcc" = "Copie cachée à"; "Edit Draft..." = "Modifier le brouillon..."; "Load Images" = "Télécharger les images"; "Return Receipt" = "Accusé de réception"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "L'auteur de ce message a souhaité être prévenu lorsque vous lirez ce message. Souhaitez-vous avertir l'expéditeur ?"; "Return Receipt (displayed) - %@"= "Accusé de réception (affiché) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Ceci est un accusé de réception pour le courrier électronique envoyé à %@.\n\nNote : Cet accusé de réception indique seulement que le message a été affiché sur l'ordinateur du destinataire. Il n'y a aucune garantie que le destinataire ait lu ou compris le contenu du message."; "Priority" = "Priorité"; "highest" = "Maximale"; "high" = "Haute"; "normal" = "Normale"; "low" = "Basse"; "lowest" = "Minimale"; "This mail is being sent from an unsecure network!" = "Ce mail est envoyé depuis un réseau non sécurisé !"; "Address Book:" = "Carnet d'adresses :"; "Search For:" = "Rechercher :"; /* Popup "show" */ "all" = "Tous"; "read" = "Lus"; "unread" = "Non Lus"; "deleted" = "Effacés"; "flagged" = "Drapeau"; /* MailListView */ "Sender" = "Expéditeur"; "Subject or Sender" = "Sujet ou expéditeur"; "To or Cc" = "Pour ou Copie à"; "Entire Message" = "Message Complet"; "Date" = "Date"; "View" = "Voir"; "All" = "Tous"; "No message" = "Aucun message"; "messages" = "message(s)"; "first" = "Premier"; "previous" = "Précédent"; "next" = "Suivant"; "last" = "Dernier"; "msgnumber_to" = "à"; "msgnumber_of" = "de"; "Mark Unread" = "Marquer comme non lu"; "Mark Read" = "Marquer comme lu"; "Untitled" = "Sans titre"; /* Tree */ "SentFolderName" = "Envoyés"; "TrashFolderName" = "Corbeille"; "InboxFolderName" = "Courrier entrant"; "DraftsFolderName" = "Brouillons"; "SieveFolderName" = "Filtres"; "OtherUsersFolderName" = "Autres utilisateurs"; "SharedFoldersName" = "Dossiers partagés"; "Folders" = "Dossiers"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Déplacer vers"; /* Address Popup menu */ "Add to Address Book..." = "Ajouter au carnet d'adresses"; "Compose Mail To" = "Écrire à"; "Create Filter From Message..." = "Créer un filtre à partir du message..."; /* Image Popup menu */ "Save Image" = "Enregistrer l'image"; "Save Attachment" = "Enregistrer le fichier"; /* Mailbox popup menus */ "Open in New Mail Window" = "Ouvrir dans une nouvelle fenétre"; "Copy Folder Location" = "Copier l'adresse du dossier"; "Subscribe..." = "S'abonner..."; "Mark Folder Read" = "Marquer le dossier comme lu"; "New Folder..." = "Nouveau dossier..."; "Compact This Folder" = "Compacter ce dossier"; "Search Messages..." = "Rechercher dans les messages..."; "Sharing..." = "Partage..."; "New Subfolder..." = "Nouveau sous-dossier..."; "Rename Folder..." = "Renommer le dossier..."; "Delete Folder" = "Supprimer le dossier..."; "Use This Folder For" = "Utiliser ce dossier pour"; "Get Messages for Account" = "Relever les messages de ce compte"; "Properties..." = "Propriétés..."; "Delegation..." = "Délégation..."; /* Use This Folder menu */ "Sent Messages" = "les message envoyés"; "Drafts" = "les brouillons"; "Deleted Messages" = "les message effacés"; /* Message list popup menu */ "Open Message In New Window" = "Ouvrir dans une nouvelle fenétre"; "Reply to Sender Only" = "Répondre à l'expéditeur"; "Reply to All" = "Répondre à tout le monde"; "Edit As New..." = "Modifier comme un nouveau message"; "Move To" = "Déplacer vers"; "Copy To" = "Copier vers"; "Label" = "Étiquette"; "Mark" = "Marquer"; "Save As..." = "Enregistrer comme..."; "Print Preview" = "Aperçu avant impression"; "View Message Source" = "Voir le code source"; "Print..." = "Imprimer..."; "Delete Message" = "Supprimer le message"; "Delete Selected Messages" = "Supprimer les messages sélectionnés"; "This Folder" = "Ce dossier-ci"; /* Label popup menu */ "None" = "Aucune"; /* Mark popup menu */ "As Read" = "Comme lu"; "Thread As Read" = "La discussion comme lue"; "As Read By Date..." = "Comme lus par date..."; "All Read" = "Tous les messages comme lus"; "Flag" = "Avec un drapeau"; "As Junk" = "Comme indésirable"; "As Not Junk" = "Comme acceptable"; "Run Junk Mail Controls" = "Lancer le contrôle des indésirables"; /* Folder operations */ "Name :" = "Nom:"; "Enter the new name of your folder :" = "Entrez le nouveau nom de votre dossier:"; "Do you really want to move this folder into the trash ?" = "Voulez-vous vraiment déplacer le dossier sélectionné dans la corbeille?"; "Operation failed" = "L'opération a échoué."; "Quota" = "Quota"; "quotasFormat" = "%{0}% utilisé sur %{1} MO"; "Please select a message." = "Veuillez sélectionner un message."; "Please select a message to print." = "Veuillez sélectionner un message à imprimer."; "Please select only one message to print." = "Veuillez ne sélectionner qu'un seul message à imprimer."; "The message you have selected doesn't exist anymore." = "Le message que vous avez selectionné n'existe plus."; "The folder with name \"%{0}\" could not be created." = "Le dossier intitulé \"%{0}\" n'a pas pu être créé."; "This folder could not be renamed to \"%{0}\"." = "Ce dossier n'a pu être renommé en \"%{0}\"."; "The folder could not be deleted." = "Le dossier n'a pas pu être effacé."; "The trash could not be emptied." = "La corbeille n'a pas pu être vidée."; "The folder functionality could not be changed." = "La fonctionnalité du dossier n'a pas pu être changée."; "You need to choose a non-virtual folder!" = "Vous devez choisir un dossier non-virtuel."; "Moving a message into its own folder is impossible!" = "Le déplacement d'un message dans son propre dossier est impossible."; "Copying a message into its own folder is impossible!" = "La copie d'un message dans son propre dossier est impossible."; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Les messages ne peuvent être déplacés dans la corbeille. Voulez-vous les supprimer immédiatement?"; /* Message editing */ "error_missingsubject" = "Le message n'a pas de sujet. Êtes-vous certain de vouloir l'envoyer?"; "error_missingrecipients" = "Veuillez spécifier au moins un destinataire."; "Send Anyway" = "Envoyer sans sujet"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Le message n'a pas pu être envoyé car aucune adresse n'est valide."; "cannot send message (smtp) - recipients discarded:" = "Le message n'a pas pu être envoyé car les adresses suivantes sont invalides :"; "cannot send message: (smtp) error when connecting" = "Le message n'a pas pu être envoyé: une erreur est survenue en tentant de rejoindre le serveur SMTP."; /* Contacts list in mail editor */ "Email" = "Adresse électronique"; "Name" = "Identité"; SOGo-2.1.1b/UI/MailerUI/UIxMailListActions.m0000644000000000000000000005522712247657027017040 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG Copyright (C) 2006-2013 Inverse inc. This file is part of SOGo SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* UIxMailListActions This component represent a list of mails and is attached to an SOGoMailFolder object. */ #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "WOContext+UIxMailer.h" #import "UIxMailFormatter.h" #import "UIxMailListActions.h" // The maximum number of headers to prefetch when querying the UIDs list #define headersPrefetchMaxSize 100 @implementation UIxMailListActions - (id) initWithRequest: (WORequest *) newRequest { SOGoUser *user; if ((self = [super initWithRequest: newRequest])) { user = [[self context] activeUser]; ASSIGN (dateFormatter, [user dateFormatterInContext: context]); ASSIGN (userTimeZone, [[user userDefaults] timeZone]); sortByThread = [[user userDefaults] mailSortByThreads]; folderType = 0; specificMessageNumber = 0; } return self; } - (void) dealloc { [sortedUIDs release]; [messages release]; [message release]; [dateFormatter release]; [userTimeZone release]; [super dealloc]; } /* accessors */ - (void) setMessage: (id) _msg { ASSIGN (message, _msg); } - (id) message { return message; } - (NSString *) messageDate { NSCalendarDate *messageDate; messageDate = [[message valueForKey: @"envelope"] date]; [messageDate setTimeZone: userTimeZone]; return [dateFormatter formattedDateAndTime: messageDate]; } - (NSString *) messageSize { NSString *rc; int size; size = [[message valueForKey: @"size"] intValue]; if (size > 1024*1024) rc = [NSString stringWithFormat: @"%.1f MB", (float) size/1024/1024]; else if (size > 1024*100) rc = [NSString stringWithFormat: @"%d KB", size/1024]; else rc = [NSString stringWithFormat: @"%.1f KB", (float) size/1024]; return rc; } // // Priorities are defined like this: // // X-Priority: 1 (Highest) // X-Priority: 2 (High) // X-Priority: 3 (Normal) // X-Priority: 4 (Low) // X-Priority: 5 (Lowest) // // Sometimes, the MUAs don't send over the string in () so we ignore it. // - (NSString *) messagePriority { NSString *result; NSData *data; data = [message objectForKey: @"header"]; result = @""; if (data) { NSString *s; s = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding]; if (s) { NSRange r; [s autorelease]; r = [s rangeOfString: @":"]; if (r.length) { s = [[s substringFromIndex: r.location+1] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; if ([s hasPrefix: @"1"]) result = [self labelForKey: @"highest"]; else if ([s hasPrefix: @"2"]) result = [self labelForKey: @"high"]; else if ([s hasPrefix: @"4"]) result = [self labelForKey: @"low"]; else if ([s hasPrefix: @"5"]) result = [self labelForKey: @"lowest"]; } } } return result; } - (NSString *) messageSubject { id baseSubject; NSString *subject; baseSubject = [[message valueForKey: @"envelope"] subject]; subject = [baseSubject decodedHeader]; if (![subject length]) subject = @""; return [subject stringByEscapingHTMLString]; } - (BOOL) showToAddress { SOGoMailFolder *co; if (!folderType) { co = [self clientObject]; if ([co isKindOfClass: [SOGoSentFolder class]] || [co isKindOfClass: [SOGoDraftsFolder class]]) folderType = 1; else folderType = -1; } return (folderType == 1); } /* title */ - (NSString *) objectTitle { return [[self clientObject] nameInContainer]; } - (NSString *) panelTitle { NSString *s; s = [self labelForKey:@"View Mail Folder"]; s = [s stringByAppendingString:@": "]; s = [s stringByAppendingString:[self objectTitle]]; return s; } /* derived accessors */ - (BOOL) isMessageDeleted { NSArray *flags; flags = [[self message] valueForKey:@"flags"]; return [flags containsObject:@"deleted"]; } - (BOOL) isMessageRead { NSArray *flags; flags = [[self message] valueForKey:@"flags"]; return [flags containsObject:@"seen"]; } - (BOOL) isMessageFlagged { NSArray *flags; flags = [[self message] valueForKey:@"flags"]; return [flags containsObject:@"flagged"]; } - (NSString *) messageUidString { return [[[self message] valueForKey:@"uid"] stringValue]; } - (NSString *) messageRowStyleClass { NSArray *flags; NSString *cellClass = @""; flags = [[self message] valueForKey:@"flags"]; if ([self isMessageDeleted]) cellClass = [cellClass stringByAppendingString: @"mailer_listcell_deleted "]; if (![self isMessageRead]) cellClass = [cellClass stringByAppendingString: @"mailer_unreadmail "]; if ([flags containsObject: @"answered"]) { if ([flags containsObject: @"$forwarded"]) cellClass = [cellClass stringByAppendingString: @"mailer_forwardedrepliedmailsubject"]; else cellClass = [cellClass stringByAppendingString: @"mailer_repliedmailsubject"]; } else if ([flags containsObject: @"$forwarded"]) cellClass = [cellClass stringByAppendingString: @"mailer_forwardedmailsubject"]; else cellClass = [cellClass stringByAppendingString: @"mailer_readmailsubject"]; return cellClass; } - (BOOL) hasMessageAttachment { NSArray *parts; NSEnumerator *dispositions; NSDictionary *currentDisp; BOOL hasAttachment; hasAttachment = NO; parts = [[message objectForKey: @"bodystructure"] objectForKey: @"parts"]; if ([parts count] > 1) { dispositions = [[parts objectsForKey: @"disposition" notFoundMarker: nil] objectEnumerator]; while (!hasAttachment && (currentDisp = [dispositions nextObject])) hasAttachment = ([[currentDisp objectForKey: @"type"] length]); } return hasAttachment; } /* fetching messages */ - (NSArray *) fetchKeys { /* Note: see SOGoMailManager.m for allowed IMAP4 keys */ static NSArray *keys = nil; if (!keys) keys = [[NSArray alloc] initWithObjects: @"UID", @"FLAGS", @"ENVELOPE", @"RFC822.SIZE", @"BODYSTRUCTURE", @"BODY.PEEK[HEADER.FIELDS (X-PRIORITY)]", nil]; return keys; } - (NSString *) defaultSortKey { return @"ARRIVAL"; } - (NSString *) imap4SortKey { NSString *sort; sort = [[context request] formValueForKey: @"sort"]; return [sort uppercaseString]; } - (NSString *) imap4SortOrdering { NSString *sort, *ascending; NSString *module; NSMutableDictionary *moduleSettings; BOOL asc; SOGoUser *activeUser; SOGoUserSettings *us; sort = [self imap4SortKey]; ascending = [[context request] formValueForKey: @"asc"]; asc = [ascending boolValue]; activeUser = [context activeUser]; module = @"Mail"; us = [activeUser userSettings]; moduleSettings = [us objectForKey: module]; if ([sort length]) { if ([sort isEqualToString: [self defaultSortKey]] && !asc) { if (moduleSettings) { [moduleSettings removeObjectForKey: @"SortingState"]; [us synchronize]; } } else { // Save the sorting state in the user settings if (!moduleSettings) { moduleSettings = [NSMutableDictionary dictionary]; [us setObject: moduleSettings forKey: module]; } [moduleSettings setObject: [NSArray arrayWithObjects: [sort lowercaseString], [NSString stringWithFormat: @"%d", (asc?1:0)], nil] forKey: @"SortingState"]; [us synchronize]; } } else if (moduleSettings) { NSArray *sortState = [moduleSettings objectForKey: @"SortingState"]; if ([sortState count]) { sort = [[sortState objectAtIndex: 0] uppercaseString]; asc = [[sortState objectAtIndex: 1] boolValue]; } } if (![sort length]) sort = [self defaultSortKey]; // Construct and return the final IMAP ordering constraint if (!asc) sort = [@"REVERSE " stringByAppendingString: sort]; return sort; } - (EOQualifier *) searchQualifier { NSString *criteria, *value; EOQualifier *qualifier; WORequest *request; request = [context request]; criteria = [request formValueForKey: @"search"]; value = [request formValueForKey: @"value"]; qualifier = nil; if ([value length]) { if ([criteria isEqualToString: @"subject"]) qualifier = [EOQualifier qualifierWithQualifierFormat: @"(subject doesContain: %@)", value]; else if ([criteria isEqualToString: @"sender"]) qualifier = [EOQualifier qualifierWithQualifierFormat: @"(from doesContain: %@)", value]; else if ([criteria isEqualToString: @"subject_or_sender"]) qualifier = [EOQualifier qualifierWithQualifierFormat: @"((subject doesContain: %@)" @" OR (from doesContain: %@))", value, value]; else if ([criteria isEqualToString: @"to_or_cc"]) qualifier = [EOQualifier qualifierWithQualifierFormat: @"((to doesContain: %@)" @" OR (cc doesContain: %@))", value, value]; else if ([criteria isEqualToString: @"entire_message"]) qualifier = [EOQualifier qualifierWithQualifierFormat: @"(body doesContain: %@)", value]; } return qualifier; } - (NSArray *) getSortedUIDsInFolder: (SOGoMailFolder *) mailFolder { EOQualifier *qualifier, *fetchQualifier, *notDeleted; if (!sortedUIDs) { notDeleted = [EOQualifier qualifierWithQualifierFormat: @"(not (flags = %@))", @"deleted"]; qualifier = [self searchQualifier]; if (qualifier) { fetchQualifier = [[EOAndQualifier alloc] initWithQualifiers: notDeleted, qualifier, nil]; [fetchQualifier autorelease]; } else fetchQualifier = notDeleted; sortedUIDs = [mailFolder fetchUIDsMatchingQualifier: fetchQualifier sortOrdering: [self imap4SortOrdering] threaded: sortByThread]; [sortedUIDs retain]; } return sortedUIDs; } /** * Returns a flatten representation of the messages threads as triples of * metadata, including the message UID, thread level and root position. * @param _sortedUIDs the interleaved arrays representation of the messages UIDs * @return an flatten array representation of the messages UIDs */ - (NSArray *) threadedUIDs: (NSArray *) _sortedUIDs { NSMutableArray *threads; NSMutableArray *currentThreads; NSEnumerator *rootThreads; id thread; int count; int i; BOOL first; BOOL expected; int previousLevel; count = 0; i = 0; previousLevel = 0; expected = YES; threads = [NSMutableArray arrayWithObject: [NSArray arrayWithObjects: @"uid", @"level", @"first", nil]]; rootThreads = [_sortedUIDs objectEnumerator]; thread = [rootThreads nextObject]; // Make sure rootThreads starts with an NSArray if (![thread respondsToSelector: @selector(objectEnumerator)]) return nil; first = [thread count] > 1; thread = [thread objectEnumerator]; currentThreads = [NSMutableArray array]; while (thread) { unsigned int ecount = 0; id t; if ([thread isKindOfClass: [NSEnumerator class]]) { t = [thread nextObject]; } else t = thread; // never happen? while (t && ![t isKindOfClass: [NSArray class]]) { BOOL currentFirst; int currentLevel; NSArray *currentThread; currentFirst = (first && ecount == 0) || (i == 0 && count > 0) || (count > 0 && previousLevel < 0); currentLevel = (first && ecount == 0)? 0 : (count > 0? count : -1); currentThread = [NSArray arrayWithObjects: t, [NSNumber numberWithInt: currentLevel], [NSNumber numberWithInt: currentFirst], nil]; [threads addObject: currentThread]; i++; count++; ecount++; expected = NO; previousLevel = currentLevel; t = [thread nextObject]; } if (t) { // If t is defined, it has to be an NSArray if (expected) { count++; expected = NO; } thread = [thread allObjects]; if ([thread count] > 0) [currentThreads addObject: [thread objectEnumerator]]; thread = [t objectEnumerator]; } else if ([currentThreads count] > 0) { thread = [currentThreads objectAtIndex: 0]; [currentThreads removeObjectAtIndex: 0]; count -= ecount; } else { thread = [[rootThreads nextObject] objectEnumerator]; // assume all objects of rootThreads are NSArrays count = 0; expected = YES; } // Prepare next iteration thread = [thread allObjects]; first = !first && (thread != nil) && [thread count] > 1; thread = [thread objectEnumerator]; } return threads; } - (int) indexOfMessageUID: (int) messageNbr { NSArray *messageNbrs; int index; messageNbrs = [self getSortedUIDsInFolder: [self clientObject]]; index = [messageNbrs indexOfObject: [NSNumber numberWithInt: messageNbr]]; // if (index < 0) // index = 0; return index; } /* JavaScript */ - (NSString *) msgRowID { return [@"row_" stringByAppendingString:[self messageUidString]]; } - (NSString *) msgIconReadImgID { return [@"readdiv_" stringByAppendingString:[self messageUidString]]; } - (NSString *) msgIconUnreadImgID { return [@"unreaddiv_" stringByAppendingString:[self messageUidString]]; } /* error redirects */ /* - (id) redirectToViewWithError: (id) _error { // TODO: DUP in UIxMailAccountView // TODO: improve, localize // TODO: there is a bug in the treeview which preserves the current URL for // the active object (displaying the error again) id url; if (![_error isNotNull]) return [self redirectToLocation:@"view"]; if ([_error isKindOfClass:[NSException class]]) _error = [_error reason]; else if ([_error isKindOfClass:[NSString class]]) _error = [_error stringValue]; url = [_error stringByEscapingURL]; url = [@"view?error=" stringByAppendingString:url]; return [self redirectToLocation:url]; } */ - (NSDictionary *) getUIDsInFolder: (SOGoMailFolder *) folder withHeaders: (BOOL) includeHeaders { NSMutableDictionary *data; NSArray *uids, *threadedUids, *headers; NSRange r; SOGoMailAccount *account; id quota; int count; data = [NSMutableDictionary dictionary]; // TODO: we might want to flush the caches? //[folder flushMailCaches]; [folder expungeLastMarkedFolder]; // Retrieve messages UIDs using form parameters "sort" and "asc" uids = [self getSortedUIDsInFolder: folder]; if (includeHeaders) { // Also retrieve the first headers, up to 'headersPrefetchMaxSize' count = [uids count]; if (count > headersPrefetchMaxSize) count = headersPrefetchMaxSize; r = NSMakeRange(0, count); headers = [self getHeadersForUIDs: [[uids flattenedArray] subarrayWithRange: r] inFolder: folder]; [data setObject: headers forKey: @"headers"]; } if (sortByThread) { // Add threads information threadedUids = [self threadedUIDs: uids]; if (threadedUids != nil) uids = threadedUids; else sortByThread = NO; } if (uids != nil) [data setObject: uids forKey: @"uids"]; [data setObject: [NSNumber numberWithBool: sortByThread] forKey: @"threaded"]; // We also return the inbox quota account = [folder mailAccountFolder]; quota = [account getInboxQuota]; if (quota != nil) [data setObject: quota forKey: @"quotas"]; return data; } /* Module actions */ - (id ) getUIDsAction { NSDictionary *data; NSString *noHeaders; SOGoMailFolder *folder; WORequest *request; WOResponse *response; request = [context request]; response = [context response]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; folder = [self clientObject]; noHeaders = [request formValueForKey: @"no_headers"]; data = [self getUIDsInFolder: folder withHeaders: ([noHeaders length] == 0)]; [response appendContentString: [data jsonRepresentation]]; return response; } - (NSArray *) getHeadersForUIDs: (NSArray *) uids inFolder: (SOGoMailFolder *) mailFolder { NSArray *to, *from; NSDictionary *msgs; NSMutableArray *headers, *msg; NSEnumerator *msgsList; NSString *msgIconStatus, *msgDate; UIxEnvelopeAddressFormatter *addressFormatter; headers = [NSMutableArray arrayWithCapacity: [uids count]]; addressFormatter = [context mailEnvelopeAddressFormatter]; // Fetch headers msgs = (NSDictionary *)[mailFolder fetchUIDs: uids parts: [self fetchKeys]]; msgsList = [[msgs objectForKey: @"fetch"] objectEnumerator]; [self setMessage: [msgsList nextObject]]; msg = [NSMutableArray arrayWithObjects: @"To", @"Attachment", @"Flagged", @"Subject", @"From", @"Unread", @"Priority", @"Date", @"Size", @"rowClasses", @"labels", @"rowID", @"uid", nil]; [headers addObject: msg]; while (message) { // We must check for "umimportant" untagged responses. // // It's generally caused by IMAP server processes sending untagged IMAP responses to SOGo in differnent IMAP // connections (SOGo might use 2-3 per user). Say you ask your messages: // // 127.000.000.001.40725-127.000.000.001.00143: 59 uid fetch 62 (UID FLAGS ENVELOPE RFC822.SIZE BODYSTRUCTURE BODY.PEEK[HEADER.FIELDS (X-PRIORITY)]) // 127.000.000.001.00143-127.000.000.001.40725: * 62 FETCH (UID 62 FLAGS (\Seen) RFC822.SIZE 854 ENVELOPE .... ( // * 61 FETCH (FLAGS (\Deleted \Seen)) // * 62 FETCH (FLAGS (\Deleted \Seen)) // * 63 FETCH (FLAGS (\Deleted \Seen)) // 59 OK Fetch completed. // // We must ignore the * 61 .. * 63 untagged responses. // if (![message objectForKey: @"uid"]) { [self setMessage: [msgsList nextObject]]; continue; } msg = [NSMutableArray arrayWithCapacity: 12]; // Columns data // To to = [[message objectForKey: @"envelope"] to]; if ([to count] > 0) [msg addObject: [[addressFormatter stringForArray: to] stringByEscapingHTMLString]]; else [msg addObject: @""]; // Attachment if ([self hasMessageAttachment]) [msg addObject: [NSString stringWithFormat: @"", [self urlForResourceFilename: @"title_attachment_14x14.png"]]]; else [msg addObject: @""]; // Flagged if ([self isMessageFlagged]) [msg addObject: [NSString stringWithFormat: @"", [self urlForResourceFilename: @"flag.png"]]]; else [msg addObject: [NSString stringWithFormat: @"", [self urlForResourceFilename: @"dot.png"]]]; // Subject [msg addObject: [NSString stringWithFormat: @"%@", [self messageSubject]]]; // From from = [[message objectForKey: @"envelope"] from]; if ([from count] > 0) [msg addObject: [[addressFormatter stringForArray: from] stringByEscapingHTMLString]]; else [msg addObject: @""]; // Unread if ([self isMessageRead]) msgIconStatus = @"dot.png"; else msgIconStatus = @"unread.png"; [msg addObject: [NSString stringWithFormat: @"", [self urlForResourceFilename: msgIconStatus], [self labelForKey: @"Mark Unread"], [self labelForKey: @"Mark Read"], [self labelForKey: @"Mark Unread"], [self msgIconReadImgID]]]; // Priority [msg addObject: [self messagePriority]]; // Date msgDate = [self messageDate]; if (msgDate == nil) msgDate = @""; [msg addObject: msgDate]; // Size [msg addObject: [self messageSize]]; // rowClasses [msg addObject: [self messageRowStyleClass]]; // labels [msg addObject: [self msgLabels]]; // rowID [msg addObject: [self msgRowID]]; // uid [msg addObject: [message objectForKey: @"uid"]]; [headers addObject: msg]; [self setMessage: [msgsList nextObject]]; } return headers; } - (id ) getHeadersAction { NSArray *uids, *headers; WORequest *request; WOResponse *response; request = [context request]; if ([request formValueForKey: @"uids"] == nil) { return [NSException exceptionWithHTTPStatus: 404 reason: @"No UID specified"]; } uids = [[request formValueForKey: @"uids"] componentsSeparatedByString: @","]; // Should we support ranges? ie "x-y" headers = [self getHeadersForUIDs: uids inFolder: [self clientObject]]; response = [context response]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; [response appendContentString: [headers jsonRepresentation]]; return response; } - (NSString *) msgLabels { NSMutableArray *labels; NSEnumerator *flags; NSString *currentFlag; labels = [NSMutableArray array]; flags = [[message objectForKey: @"flags"] objectEnumerator]; while ((currentFlag = [flags nextObject])) { [labels addObject: currentFlag]; } return [labels componentsJoinedByString: @" "]; } @end /* UIxMailListActions */ SOGo-2.1.1b/UI/MailerUI/NorwegianBokmal.lproj/0000755000000000000000000000000012247657027017366 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings0000644000000000000000000002351112247657027023224 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Opprett"; "Empty Trash" = "Tøm papirkurven"; "Delete" = "Slett"; "Expunge" = "Slett"; "Forward" = "Videresend"; "Get Mail" = "Hent e-post"; "Junk" = "Søppelpost"; "Reply" = "Svar"; "Reply All" = "Svar alle"; "Print" = "Skriv ut"; "Stop" = "Stopp"; "Write" = "Skriv"; "Send" = "Send"; "Contacts" = "Kontakter"; "Attach" = "Vedlegg"; "Save" = "Lagre"; "Options" = "Innstillinger"; "Close" = "Lukk"; "Size" = "Størrelse"; /* Tooltips */ "Send this message now" = "Send meldingen nÃ¥"; "Select a recipient from an Address Book" = "Velg en mottaker fra adressebok"; "Include an attachment" = "Legg til et vedlegg"; "Save this message" = "Lagre denne meldingen"; "Get new messages" = "Hent ny e-post"; "Create a new message" = "Ny e-postmelding"; "Go to address book" = "GÃ¥ til adresseboken"; "Reply to the message" = "Svar avsender"; "Reply to sender and all recipients" = "Svar avsender og alle mottakere"; "Forward selected message" = "Videresend valgt melding"; "Delete selected message or folder" = "Slett merket melding eller mappe"; "Mark the selected messages as junk" = "Merk markerte meldinger som søppelpost"; "Print this message" = "Skriv ut denne e-postmeldingen"; "Stop the current transfer" = "Stopp pÃ¥gÃ¥ende overføring"; "Attachment" = "Vedlegg"; "Unread" = "Ulest"; "Flagged" = "Flagget"; /* Main Frame */ "Home" = "Hjem"; "Calendar" = "Kalender"; "Addressbook" = "Adressebok"; "Mail" = "E-post"; "Right Administration" = "Rettighetsadministrasjon"; "Help" = "Hjelp"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Velkommen til SOGo Mailer. Bruk mappeviseren pÃ¥ venstre side for Ã¥ bla gjennom dine e-postkontoer!"; "Read messages" = "Les meldinger"; "Write a new message" = "Skriv en ny melding"; "Share: " = "Del: "; "Account: " = "Konto: "; "Shared Account: " = "Delt konto: "; /* acls */ "Access rights to" = "Tilgangsrettighet til"; "For user" = "For bruker"; "Any Authenticated User" = "Alle autentiserte brukere"; "List and see this folder" = "List og se i mappen"; "Read mails from this folder" = "Les meldinger fra denne mappen"; "Mark mails read and unread" = "Markere meldinger som leste og uleste"; "Modify the flags of the mails in this folder" = "Endre flagg til meldingene i denne mappen"; "Insert, copy and move mails into this folder" = "Legg inn, kopier og flytt meldinger til mappen"; "Post mails" = "Send e-postmeldinger"; "Add subfolders to this folder" = "Legg til undermapper til denne mappen"; "Remove this folder" = "Fjern mappen"; "Erase mails from this folder" = "Slett meldinger fra mappen"; "Expunge this folder" = "Fjern mappen"; "Archive This Folder" = "Arkiver denne mappen"; "Modify the acl of this folder" = "Endre adgangsrettigheter til mappen"; "Saved Messages.zip" = "Lagrede Meldinger.zip"; "Update" = "Oppdater"; "Cancel" = "Avbryt"; /* Mail edition */ "From" = "Fra"; "Subject" = "Emne"; "To" = "Til"; "Cc" = "Kopi"; "Bcc" = "Blindkopi"; "Reply-To" = "Svar-til"; "Add address" = "Legg til adresse"; "Attachments:" = "Vedlegg:"; "Open" = "Ã…pne"; "Select All" = "Velg alle"; "Attach Web Page..." = "Legg til url..."; "Attach File(s)..." = "Legg til fil(er)..."; "to" = "Til"; "cc" = "Kopi"; "bcc" = "Blindkopi"; "Edit Draft..." = "Rediger utkast..."; "Load Images" = "Last ned bilder"; "Return Receipt" = "Returkvittering"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Avsender har bedt om Ã¥ bli varslet nÃ¥r du leser denne meldingen. Ønsker du Ã¥ varsle avsenderen?"; "Return Receipt (displayed) - %@"= "Returkvittering (vist) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Dette er en returkvittering for e-posten du sendte til %@.\n\nMerk: Denne returkvitteringen forteller bare at meldingen ble vist hos mottaker. Det er ingen garanti at mottaker har lest eller forstÃ¥tt innholdet i e-postmeldingen."; "Priority" = "Prioritet"; "highest" = "Høyest"; "high" = "Høy"; "normal" = "Normal"; "low" = "Lav"; "lowest" = "Lavest"; "This mail is being sent from an unsecure network!" = "Denne e-posten sendes fra en usikker nettverksforbindelse!"; "Address Book:" = "Adressebok:"; "Search For:" = "Søk etter:"; /* Popup "show" */ "all" = "alle"; "read" = "leste"; "unread" = "ulest"; "deleted" = "slettet"; "flagged" = "flagget"; /* MailListView */ "Sender" = "Avsender"; "Subject or Sender" = "Emne eller avsender"; "To or Cc" = "Til eller Kopi"; "Entire Message" = "Hele meldingen"; "Date" = "Dato"; "View" = "Vis"; "All" = "Alle"; "No message" = "Ingen melding"; "messages" = "meldinger"; "first" = "Første"; "previous" = "Forrige"; "next" = "Neste"; "last" = "Siste"; "msgnumber_to" = "til"; "msgnumber_of" = "av"; "Mark Unread" = "Merk som ulest"; "Mark Read" = "Merk som lest"; "Untitled" = "Uten emne"; /* Tree */ "SentFolderName" = "Sendt"; "TrashFolderName" = "Søppel"; "InboxFolderName" = "Innboks"; "DraftsFolderName" = "Kladder"; "SieveFolderName" = "Filter"; "OtherUsersFolderName" = "Andre brukere"; "SharedFoldersName" = "Delte mapper"; "Folders" = "Mapper"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Flytt til"; /* Address Popup menu */ "Add to Address Book..." = "Legg til adressebok..."; "Compose Mail To" = "Skriv e-postmelding til"; "Create Filter From Message..." = "Opprett filter fra en melding..."; /* Image Popup menu */ "Save Image" = "Lagre bilde"; "Save Attachment" = "Lagre vedlegg"; /* Mailbox popup menus */ "Open in New Mail Window" = "Ã…pne i nytt vindu"; "Copy Folder Location" = "Kopiere mappens lokasjon"; "Subscribe..." = "Abonnere..."; "Mark Folder Read" = "Merk mappe som lest..."; "New Folder..." = "Ny mappe..."; "Compact This Folder" = "Komprimer mappen"; "Search Messages..." = "Søk i meldinger..."; "Sharing..." = "Deling..."; "New Subfolder..." = "Ny undermappe..."; "Rename Folder..." = "Endre navn pÃ¥ mappe..."; "Delete Folder" = "Slett mappe"; "Use This Folder For" = "Bruk mappen til"; "Get Messages for Account" = "Hent nye meldinger for konto"; "Properties..." = "Egenskaper..."; "Delegation..." = "Delegasjon..."; /* Use This Folder menu */ "Sent Messages" = "Sendte meldinger"; "Drafts" = "Kladd"; "Deleted Messages" = "Slettede meldinger"; /* Message list popup menu */ "Open Message In New Window" = "Ã…pne melding i nytt vindu"; "Reply to Sender Only" = "Svar kun til avsender"; "Reply to All" = "Svar alle"; "Edit As New..." = "Rediger som ny..."; "Move To" = "Flytt til"; "Copy To" = "Kopier til"; "Label" = "Etikett"; "Mark" = "Merk"; "Save As..." = "Lagre som..."; "Print Preview" = "ForhÃ¥ndsvisning"; "View Message Source" = "Vis meldingskilde"; "Print..." = "Skriv ut..."; "Delete Message" = "Slett melding"; "Delete Selected Messages" = "Slett markerte meldinger"; "This Folder" = "Denne mappen"; /* Label popup menu */ "None" = "Ingen"; /* Mark popup menu */ "As Read" = "Som lest"; "Thread As Read" = "Hele trÃ¥den som lest"; "As Read By Date..." = "Som lest etter dato..."; "All Read" = "Alle som leste"; "Flag" = "Legg til flagg"; "As Junk" = "Som søppel"; "As Not Junk" = "Som ikke søppel"; "Run Junk Mail Controls" = "Kjør søppelpostkontroll"; /* Folder operations */ "Name :" = "Navn: "; "Enter the new name of your folder :" = "Skriv navnet pÃ¥ mappen: "; "Do you really want to move this folder into the trash ?" = "Vil du virkelig flytte mappen til papirkurven?"; "Operation failed" = "Operasjonen mislykkes"; "Quota" = "Disktildeling"; "quotasFormat" = "%{0}% brukt av %{1} MB"; "Please select a message." = "Markér en melding."; "Please select a message to print." = "Markér en melding som skal skrives ut."; "Please select only one message to print." = "Markér bare én melding som skal skrives ut."; "The message you have selected doesn't exist anymore." = "Meldingen du markerte finnes ikke lengre."; "The folder with name \"%{0}\" could not be created." = "Mappen \"%{0}\" kunne ikke opprettes."; "This folder could not be renamed to \"%{0}\"." = "Mappen kunne ikke bytte navn til \"%{0}\"."; "The folder could not be deleted." = "Mappen kunne ikke slettes."; "The trash could not be emptied." = "Søppelkurven kunne ikke tømmes."; "The folder functionality could not be changed." = "Mappens funksjon kunne ikke endres."; "You need to choose a non-virtual folder!" = "Du mÃ¥ velge en ikke-virtuell mappe!"; "Moving a message into its own folder is impossible!" = "Det er ikke mulig Ã¥ flytte en e-postmelding til samme mappe!"; "Copying a message into its own folder is impossible!" = "Det er ikke mulig Ã¥ kopiere en e-postmelding til samme mappe!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Meldingene kunne ikke flyttes til søppelmappen. Vil du slette dem umiddelbart?"; /* Message editing */ "error_missingsubject" = "Emnefelt mangler. Vil du likevel sende meldingen?"; "error_missingrecipients" = "Ingen mottakere er angitt"; "Send Anyway" = "Send likevel"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Kan ikke sende melding: alle mottakeradresser er ugyldige."; "cannot send message (smtp) - recipients discarded:" = "Kan ikke sende melding. Følgende mottakeradresser er ugyldige:"; "cannot send message: (smtp) error when connecting" = "Kan ikke sende melding: tilkoblingsproblem med SMTP-tjener."; /* Contacts list in mail editor */ "Email" = "E-post"; "Name" = "Navn"; SOGo-2.1.1b/UI/MailerUI/Finnish.lproj/0000755000000000000000000000000012247657027015705 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Finnish.lproj/Localizable.strings0000644000000000000000000002430612247657027021546 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Luo"; "Empty Trash" = "Tyhjennä roskakori"; "Delete" = "Poista"; "Expunge" = "Hävitä"; "Forward" = "Lähetä edelleen"; "Get Mail" = "Hae"; "Junk" = "Roskaposti"; "Reply" = "Vastaa"; "Reply All" = "Vastaa kaikille"; "Print" = "Tulosta"; "Stop" = "Lopeta"; "Write" = "Kirjoita"; "Send" = "Lähetä"; "Contacts" = "Yhteystiedot"; "Attach" = "Liitä"; "Save" = "Tallenna"; "Options" = "Asetukset"; "Close" = "Sulje"; "Size" = "Koko"; /* Tooltips */ "Send this message now" = "Lähetä viesti nyt"; "Select a recipient from an Address Book" = "Valitse vastaanottaja osoitekirjasta"; "Include an attachment" = "Lisää liitetiedosto"; "Save this message" = "Tallenna viesti"; "Get new messages" = "Hae uusia viestejä "; "Create a new message" = "Luo uusi viesti"; "Go to address book" = "Osoitekirjaan"; "Reply to the message" = "Vastaa viestiin"; "Reply to sender and all recipients" = "Vastaa lähettäjälle ja kaikille vastaanottajille"; "Forward selected message" = "Edelleenlähetä valittu viesti"; "Delete selected message or folder" = "Poista valittu viesti tai kansio"; "Mark the selected messages as junk" = "Merkitse valitut viestit roskaksi"; "Print this message" = "Tulosta viesti"; "Stop the current transfer" = "Pysäytä tämänhetkinen siirto"; "Attachment" = "Liitetiedosto"; "Unread" = "Lukematta"; "Flagged" = "Merkitty"; /* Main Frame */ "Home" = "Koti"; "Calendar" = "Kalenteri"; "Addressbook" = "Osoitekirja"; "Mail" = "Sähköposti"; "Right Administration" = "Oikeushallinta"; "Help" = "Apua"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Tervetuloa SOGo Sähköpostiin. Käytä vasemmanpuoleista hakupuuta sähköpostitiliesi selaamiseen."; "Read messages" = "Luetut viestit"; "Write a new message" = "Kirjoita uusi viesti"; "Share: " = "Jaa:"; "Account: " = "Tili:"; "Shared Account: " = "Jaettu tili:"; /* acls */ "Access rights to" = "Käyttöoikeudet"; "For user" = "Käyttäjälle"; "Any Authenticated User" = "Kuka tahansa kirjautunut käyttäjä"; "List and see this folder" = "Listaa ja näytä tämä kansio"; "Read mails from this folder" = "Lue viestit tästä kansiosta"; "Mark mails read and unread" = "Merkitse viestit luetuksi ja lukemattomaksi"; "Modify the flags of the mails in this folder" = "Muokkaa kansion lippumerkintöjä "; "Insert, copy and move mails into this folder" = "Lisää, kopioi ja siirrä viestejä tähän kansioon"; "Post mails" = "Lähetä viestit"; "Add subfolders to this folder" = "Lisää alakansio tähän kansioon"; "Remove this folder" = "Poista tämä kansio"; "Erase mails from this folder" = "Poista viestit tästä kansiosta"; "Expunge this folder" = "Poista tämä kansio"; "Archive This Folder" = "Arkistoi tämä kansio"; "Modify the acl of this folder" = "Muokkaa kansion käyttäjäoikeuksia"; "Saved Messages.zip" = "TallennetutViestit.zip"; "Update" = "Päivitä"; "Cancel" = "Peruuta"; /* Mail edition */ "From" = "Lähettäjä"; "Subject" = "Aihe"; "To" = "Vastaanottaja"; "Cc" = "Kopio"; "Bcc" = "Piilokopio"; "Reply-To" = "Vastausosoite"; "Add address" = "Lisää osoite"; "Attachments:" = "Liitteet:"; "Open" = "Avaa."; "Select All" = "Valitse kaikki"; "Attach Web Page..." = "Liitä Web-sivu..."; "Attach File(s)..." = "Liitä tiedosto(ja)..."; "to" = "Vastaanottaja"; "cc" = "Kopio"; "bcc" = "Piilokopio"; "Edit Draft..." = "Muokkaa luonnosta..."; "Load Images" = "Lataa kuvia"; "Return Receipt" = "Vastaanottokuittaus"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Viestin lähettäjä on pyytänyt lukukuittausta. Haluatko lähettää kuittauksen viestin lähettäjälle?"; "Return Receipt (displayed) - %@"= "Vastaus kuittaus (näkyvä) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Tämä on vastaus kuittaus viestiin jonka lähetit %@lle.⎠⎠Huom: Tämä kuittaus kertoo ainoastaan että viesti on näytetty vastaanottajan koneella. Viestin lukemisesta tai sen sisällön ymmärtämisestä ei ole takuuta."; "Priority" = "Prioriteetti"; "highest" = "Korkein"; "high" = "Korkea"; "normal" = "Normaali"; "low" = "Matala"; "lowest" = "Matalin"; "This mail is being sent from an unsecure network!" = "Tätä viestiä lähetetään turvattomasta verkosta!"; "Address Book:" = "Osoitekirja:"; "Search For:" = "Etsi:"; /* Popup "show" */ "all" = "kaikki"; "read" = "luetut"; "unread" = "lukemattomat"; "deleted" = "poistetut"; "flagged" = "merkityt"; /* MailListView */ "Sender" = "Lähettäjä"; "Subject or Sender" = "Aihe tai lähettäjä"; "To or Cc" = "Vastaanottaja tai kopio"; "Entire Message" = "Koko viesti"; "Date" = "Päiväys"; "View" = "Näytä"; "All" = "Kaikki"; "No message" = "Ei viestiä"; "messages" = "viestit"; "first" = "Ensimmäinen"; "previous" = "Edellinen"; "next" = "Seuraava"; "last" = "Viimeinen"; "msgnumber_to" = " "; "msgnumber_of" = " "; "Mark Unread" = "Merkitse lukemattomaksi"; "Mark Read" = "Merkitse luetuksi"; "Untitled" = "Ei otsikkoa"; /* Tree */ "SentFolderName" = "Lähetetyt"; "TrashFolderName" = "Roskakori"; "InboxFolderName" = "Sapuneet"; "DraftsFolderName" = "Luonnokset"; "SieveFolderName" = "Suodattimet"; "OtherUsersFolderName" = "Muut käyttäjät"; "SharedFoldersName" = "Jaetut kansiot"; "Folders" = "Kansiot"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Siirrä …"; /* Address Popup menu */ "Add to Address Book..." = "Lisää osoitekirjaan..."; "Compose Mail To" = "Lähetä viesti"; "Create Filter From Message..." = "Muodosta viestistä suodatin..."; /* Image Popup menu */ "Save Image" = "Tallenna kuva"; "Save Attachment" = "Tallenna liite"; /* Mailbox popup menus */ "Open in New Mail Window" = "Avaa uudessa viesti-ikkunassa"; "Copy Folder Location" = "Kopioi kansion sijainti"; "Subscribe..." = "Liity..."; "Mark Folder Read" = "Merkitse kansio luetuksi..."; "New Folder..." = "Uusi kansio..."; "Compact This Folder" = "Pakkaa tämä kansio"; "Search Messages..." = "Etsi viestejä..."; "Sharing..." = "Jakaminen..."; "New Subfolder..." = "Uusi alakansio..."; "Rename Folder..." = "Uudelleennimeä kansio..."; "Delete Folder" = "Poista kansio"; "Use This Folder For" = "Käytä kansiota"; "Get Messages for Account" = "Hae viestit tilille"; "Properties..." = "Ominaisuudet..."; "Delegation..." = "Valtuutus..."; /* Use This Folder menu */ "Sent Messages" = "Lähetetyt viestit"; "Drafts" = "Luonnokset"; "Deleted Messages" = "Poistetut viestit"; /* Message list popup menu */ "Open Message In New Window" = "Avaa viesti uudessa ikkunassa"; "Reply to Sender Only" = "Vastaa vain lähettäjälle"; "Reply to All" = "Vastaa kaikille"; "Edit As New..." = "Muokkaa uutena..."; "Move To" = "Siirrä"; "Copy To" = "Kopioi"; "Label" = "Otsikoi"; "Mark" = "Merkitse"; "Save As..." = "Tallenna nimellä..."; "Print Preview" = "Esikatselu"; "View Message Source" = "Näytä viestin lähdekoodi"; "Print..." = "Tulosta..."; "Delete Message" = "Poista viesti"; "Delete Selected Messages" = "Poista valitut viestit"; "This Folder" = "Tämä kansio"; /* Label popup menu */ "None" = "Ei mitään"; /* Mark popup menu */ "As Read" = "Luetuksi"; "Thread As Read" = "Ketju luetuksi"; "As Read By Date..." = "Luetuksi pvm..."; "All Read" = "Kaikki luetuksi"; "Flag" = "Merkitse"; "As Junk" = "Roskaksi"; "As Not Junk" = "Ei roskaksi"; "Run Junk Mail Controls" = "Käynnistä roskapostien hallinta"; /* Folder operations */ "Name :" = "Nimi:"; "Enter the new name of your folder :" = "Syötä kansiosi uusi nimi:"; "Do you really want to move this folder into the trash ?" = "Oletko varma että haluat siirtää tämän kansion roskakoriin? "; "Operation failed" = "Toiminto epäonnistui"; "Quota" = "Kokorajoitus:"; "quotasFormat" = "%{0}% käytetty %{1} Mt:sta"; "Please select a message." = "Ole hyvä ja valitse viesti."; "Please select a message to print." = "Ole hyvä ja valitse tulostettava viesti."; "Please select only one message to print." = "Ole hyvä ja valitse vain yksi viesti tulostettavaksi."; "The message you have selected doesn't exist anymore." = "Valitsemaasi viestiä ei ole enää olemassa."; "The folder with name \"%{0}\" could not be created." = "Kansiota \"%{0}\" ei voitu luoda."; "This folder could not be renamed to \"%{0}\"." = "Kansiota ei voitu uudelleennimetä \"%{0}\" :ksi."; "The folder could not be deleted." = "Kansiota ei voitu poistaa."; "The trash could not be emptied." = "Roskakorin tyhjennys epäonnistui."; "The folder functionality could not be changed." = "Kansion toiminnallisuutta ei voitu muuttaa."; "You need to choose a non-virtual folder!" = "Sinun on valittava ei-virtuaalinen kansio!"; "Moving a message into its own folder is impossible!" = "Viestin siirtäminen omaan kansioonsa on mahdotonta!"; "Copying a message into its own folder is impossible!" = "Viestin kopioiminen omaan kansioonsa on mahdotonta!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Viestejä ei voitu siirtää roskakoriin. Haluatko poistaa ne välittömästi?"; /* Message editing */ "error_missingsubject" = "Viestillä ei ole otsikkoa. Haluatko varrmasti lähettää sen?"; "error_missingrecipients" = "Ole hyvä ja syötä ainakin yksi vastaanottaja."; "Send Anyway" = "Lähetä silti"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Viestiä ei voi lähettää: kaikki vastaanottajat ovat virheellisiä."; "cannot send message (smtp) - recipients discarded:" = "Viestiä ei voi lähettää: seuraavat osoitteet ovat virheellisiä:"; "cannot send message: (smtp) error when connecting" = "Viestiä ei voi lähettää: virhe yhdistettäessä SMTP -palvelimeen."; /* Contacts list in mail editor */ "Email" = "Sähköposti"; "Name" = "Nimi"; SOGo-2.1.1b/UI/MailerUI/UIxMailMainFrame.h0000644000000000000000000000277112247657027016432 0ustar rootroot/* UIxMailMainFrame.h - this file is part of SOGo * * Copyright (C) 2006-2013 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef UIXMAILMAINFRAME_H #define UIXMAILMAINFRAME_H #import "../SOGoUI/UIxComponent.h" @class SOGoMailLabel; @interface UIxMailMainFrame : UIxComponent { SOGoUserSettings *us; NSMutableDictionary *moduleSettings; NSArray *columnsOrder; int folderType; NSDictionary *currentColumn; SOGoMailLabel *_currentLabel; } - (WOResponse *) getFoldersStateAction; - (NSString *) verticalDragHandleStyle; - (NSString *) horizontalDragHandleStyle; - (NSString *) mailboxContentStyle; - (WOResponse *) saveDragHandleStateAction; - (WOResponse *) saveFoldersStateAction; - (NSString *) formattedMailtoString: (NGVCard *) card; - (NSArray *) columnsDisplayOrder; @end #endif /* UIXMAILMAINFRAME_H */ SOGo-2.1.1b/UI/MailerUI/Slovak.lproj/0000755000000000000000000000000012247657027015546 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Slovak.lproj/Localizable.strings0000644000000000000000000002454712247657027021416 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "VytvoriÅ¥"; "Empty Trash" = "VyprázdniÅ¥ kôš"; "Delete" = "ZmazaÅ¥"; "Expunge" = "VyÅ¡krtnúť"; "Forward" = "PreposlaÅ¥"; "Get Mail" = "PrijaÅ¥"; "Junk" = "Spam"; "Reply" = "OdpovedaÅ¥"; "Reply All" = "OdpovedaÅ¥ vÅ¡etkým"; "Print" = "TlaÄiÅ¥"; "Stop" = "Stop"; "Write" = "PísaÅ¥"; "Send" = "PoslaÅ¥"; "Contacts" = "Kontakty"; "Attach" = "Príloha"; "Save" = "UložiÅ¥"; "Options" = "Voľby"; "Close" = "ZavrieÅ¥"; "Size" = "VeľkosÅ¥"; /* Tooltips */ "Send this message now" = "PoslaÅ¥ správu"; "Select a recipient from an Address Book" = "Vyberte príjemcu z adresára"; "Include an attachment" = "Zahrnúť prílohu"; "Save this message" = "UložiÅ¥ správu"; "Get new messages" = "PrijaÅ¥ nové správy"; "Create a new message" = "VytvoriÅ¥ novú správu"; "Go to address book" = "PrejsÅ¥ do adresára"; "Reply to the message" = "OdpoveÄ na správu"; "Reply to sender and all recipients" = "OdpovedaÅ¥ odosielateľovi a vÅ¡etkým príjemcom"; "Forward selected message" = "PrepoÅ¡li oznaÄené správy"; "Delete selected message or folder" = "Odstráň oznaÄenú správu alebo prieÄinok"; "Mark the selected messages as junk" = "OznaÄ vybrané správy ako spam"; "Print this message" = "VytlaÄiÅ¥ správu"; "Stop the current transfer" = "Zastav prebiehajúci presun"; "Attachment" = "Príloha"; "Unread" = "NepreÄítané"; "Flagged" = "OznaÄené zástavkou"; /* Main Frame */ "Home" = "Domov"; "Calendar" = "Kalendár"; "Addressbook" = "Kontakty"; "Mail" = "PoÅ¡ta"; "Right Administration" = "Administrácia práv"; "Help" = "Pomoc"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Vitajte v SOGo Mailer. Použite zoznam zložiek vľavo na prehliadanie Vášho emailového úÄtu!"; "Read messages" = "ČítaÅ¥ správu"; "Write a new message" = "NápísaÅ¥ správu"; "Share: " = "ZdielaÅ¥"; "Account: " = "ÚÄet"; "Shared Account: " = "ZdielaÅ¥ úÄet"; /* acls */ "Access rights to" = "Pristupové práva k"; "For user" = "Pre užívateľa"; "Any Authenticated User" = "Akýkoľvek overení užívateľ"; "List and see this folder" = "ZoraÄ a zobraz tento prieÄinok"; "Read mails from this folder" = "ÄŒitaÅ¥ maile z tejto zložky"; "Mark mails read and unread" = "OznaÄ maily ako preÄítané a nepreÄítané"; "Modify the flags of the mails in this folder" = "Uprav zástavky mailov v tejto zložke"; "Insert, copy and move mails into this folder" = "Vlož, kopíruj a presuň maile do tejto zložky"; "Post mails" = "Zverejni maily"; "Add subfolders to this folder" = "PridaÅ¥ podadresáre pre tento adresár"; "Remove this folder" = "ZmazaÅ¥ adresár"; "Erase mails from this folder" = "ZmazaÅ¥ správy z adresára"; "Expunge this folder" = "VyprázdniÅ¥ adresár"; "Archive This Folder" = "ArchivovaÅ¥ adresár"; "Modify the acl of this folder" = "Uprav ACL tejto zložky"; "Saved Messages.zip" = "Uložené Správy.zip"; "Update" = "Aktualizuj"; "Cancel" = "ZruÅ¡iÅ¥"; /* Mail edition */ "From" = "Od"; "Subject" = "Predmet"; "To" = "Pre"; "Cc" = "Kópia"; "Bcc" = "Skrytá kópia"; "Reply-To" = "Odpovedz odosielateľovi"; "Add address" = "PridaÅ¥ adresu"; "Attachments:" = "Prílohy"; "Open" = "OtvoriÅ¥"; "Select All" = "Vyber vÅ¡etko"; "Attach Web Page..." = "Prilož WWW stránku..."; "Attach File(s)..." = "Prilož súbor(y)..."; "to" = "Pre"; "cc" = "Kópia"; "bcc" = "Skrytá kópia"; "Edit Draft..." = "Uprav rozpísané..."; "Load Images" = "Nahraj obrázky"; "Return Receipt" = "Notifikácia o doruÄení"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Odosielateľ tejto správy by chcel byÅ¥ informovaný o jej preÄítaní. Checete informovaÅ¥ odosielateľa?"; "Return Receipt (displayed) - %@"= "Notifikácia o doruÄení (zobrazená) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Toto je potvrdenie o preÄítaní ku správe, ktorú ste poslali pre %@.⎠⎠Poznámka: Potvrdenie o prijatí znamená iba to, že sa správa zobrazila na poÄítaÄi adresáta. Nie je ale zaruÄené, že adresát správu Äítal a porozumel jej obsahu."; "Priority" = "Priorita"; "highest" = "Najvyššia"; "high" = "Vysoká"; "normal" = "Normálna"; "low" = "Nízka"; "lowest" = "Najnižšia"; "This mail is being sent from an unsecure network!" = "Tento email bude odoslaný z nezabezpeÄenej siete!"; "Address Book:" = "Adresár:"; "Search For:" = "HľadaÅ¥ v:"; /* Popup "show" */ "all" = "vÅ¡etko"; "read" = "ÄítaÅ¥"; "unread" = "preÄítané"; "deleted" = "zmazané"; "flagged" = "oznaÄené"; /* MailListView */ "Sender" = "Odosielateľ"; "Subject or Sender" = "Predmet alebo Odosielateľ"; "To or Cc" = "Pre alebo Kópia"; "Entire Message" = "Celá správa"; "Date" = "Dátum"; "View" = "PozrieÅ¥"; "All" = "VÅ¡etko"; "No message" = "Žiadna správa"; "messages" = "správa"; "first" = "Prvá"; "previous" = "PredoÅ¡lá"; "next" = "ÄŽalÅ¡ia"; "last" = "Posledná"; "msgnumber_to" = "pre"; "msgnumber_of" = "o"; "Mark Unread" = "OznaÄ ako nepreÄítané"; "Mark Read" = "OznaÄ ako preÄítané"; "Untitled" = "Bez mena"; /* Tree */ "SentFolderName" = "PoslaÅ¥"; "TrashFolderName" = "Kôš"; "InboxFolderName" = "Prijaté"; "DraftsFolderName" = "Koncepty"; "SieveFolderName" = "Filtre"; "OtherUsersFolderName" = "Ostatní užívatelia"; "SharedFoldersName" = "Zdielané adresáre"; "Folders" = "Adresáre"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "Presuň …"; /* Address Popup menu */ "Add to Address Book..." = "Pridaj do adresára..."; "Compose Mail To" = "NapísaÅ¥ mail pre"; "Create Filter From Message..." = "VytvoriÅ¥ filter zo správy..."; /* Image Popup menu */ "Save Image" = "UložiÅ¥ obrázok"; "Save Attachment" = "UložiÅ¥ prílohu"; /* Mailbox popup menus */ "Open in New Mail Window" = "OtvoriÅ¥ v novom okne"; "Copy Folder Location" = "KopírovaÅ¥ adresu prieÄinka"; "Subscribe..." = "PotvrÄ odber..."; "Mark Folder Read" = "OznaÄ prieÄinok ako preÄítaný..."; "New Folder..." = "Nový adresár"; "Compact This Folder" = "Vykonaj údržbu tohoto prieÄinku"; "Search Messages..." = "HľadaÅ¥ správy"; "Sharing..." = "Zdieľanie"; "New Subfolder..." = "Nový podadresár"; "Rename Folder..." = "PremenovaÅ¥ adresár"; "Delete Folder" = "ZmazaÅ¥ adresár"; "Use This Folder For" = "Použitie tejto zložky"; "Get Messages for Account" = "PrijaÅ¥ správy na úÄet"; "Properties..." = "Vlastnosti"; "Delegation..." = "Delegácia ..."; /* Use This Folder menu */ "Sent Messages" = "PoslaÅ¥ Správu"; "Drafts" = "Koncepty"; "Deleted Messages" = "ZmazaÅ¥ správy"; /* Message list popup menu */ "Open Message In New Window" = "OtvoriÅ¥ správu v novom okne"; "Reply to Sender Only" = "OdpovedaÅ¥ len odosielateľovi"; "Reply to All" = "OdpovedaÅ¥ vÅ¡etkým"; "Edit As New..." = "EditovaÅ¥ nové..."; "Move To" = "Presunúť do"; "Copy To" = "KopírovaÅ¥ do"; "Label" = "Å títok"; "Mark" = "OznaÄiÅ¥"; "Save As..." = "UložiÅ¥ ako..."; "Print Preview" = "Náhľad pred tlaÄou"; "View Message Source" = "UkázaÅ¥ zdroj správy"; "Print..." = "TlaÄiÅ¥"; "Delete Message" = "ZmazaÅ¥ správu"; "Delete Selected Messages" = "ZmazaÅ¥ vybrané správy"; "This Folder" = "Adresár"; /* Label popup menu */ "None" = "Žiaden"; /* Mark popup menu */ "As Read" = "PreÄítané"; "Thread As Read" = "Konverzáciu ako preÄítanú"; "As Read By Date..." = "PreÄítané dátumom..."; "All Read" = "PreÄítaÅ¥ vÅ¡etko"; "Flag" = "OznaÄ zástavkou"; "As Junk" = "Ako SPAM"; "As Not Junk" = "Ako nie SPAM"; "Run Junk Mail Controls" = "Spusti kontrolu SPAMu"; /* Folder operations */ "Name :" = "Meno:"; "Enter the new name of your folder :" = "Zadajte nové meno adresára:"; "Do you really want to move this folder into the trash ?" = "SkutoÄne chcete presunúť tento prieÄinok do koÅ¡a?"; "Operation failed" = "Operácia zlyhala"; "Quota" = "Kvóta:"; "quotasFormat" = "%{0}% použité z %{1} MB"; "Please select a message." = "Prsím vyberte správu"; "Please select a message to print." = "Prosím vyberte správu ktorú chcete tlaÄiÅ¥."; "Please select only one message to print." = "Prosím vyberte iba jednu správu ktorú chcete tlaÄiÅ¥."; "The message you have selected doesn't exist anymore." = "Správa ktorú ste vybrali už neexistuje."; "The folder with name \"%{0}\" could not be created." = "PrieÄinok s menom \"%{0}\" nemôže byÅ¥ vytvorení."; "This folder could not be renamed to \"%{0}\"." = "Tento prieÄinok sa nedá premenovaÅ¥ na \"%{0}\"."; "The folder could not be deleted." = "PrieÄinok sa nedá odstrániÅ¥."; "The trash could not be emptied." = "Kôš sa nedá vyprázniÅ¥."; "The folder functionality could not be changed." = "Funkcia prieÄinka sa nedá zmeniÅ¥."; "You need to choose a non-virtual folder!" = "Musíte zvoliÅ¥ prieÄinok ktorý nie je virtuálny!"; "Moving a message into its own folder is impossible!" = "Presunúť správu do jej vlastného prieÄinka sa nedá!"; "Copying a message into its own folder is impossible!" = "KopírovaÅ¥ správu do jej vlastného prieÄinka sa nedá!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Správy nemôžu byÅ¥ presunuté do koÅ¡a. Chcete ich vymazaÅ¥ okamžite?"; /* Message editing */ "error_missingsubject" = "Správa nemá žiadny predmet. SkutoÄne ju checete odoslaÅ¥?"; "error_missingrecipients" = "Prosím zvoľte aspoň jedného príjemcu."; "Send Anyway" = "PoslaÅ¥ napriek tomu"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Správa sa nedá odoslaÅ¥: žiadny príjemca nie je platný."; "cannot send message (smtp) - recipients discarded:" = "Správa sa nedá odoslaÅ¥: Nasledujúci príjemcovia nemajú platnú adresu:"; "cannot send message: (smtp) error when connecting" = "Správa sa nedá odoslaÅ¥: chyba pri pripájaní na SMTP server."; /* Contacts list in mail editor */ "Email" = "Email"; "Name" = "Meno"; SOGo-2.1.1b/UI/MailerUI/UIxMailSourceView.m0000644000000000000000000000265212247657027016671 0ustar rootroot/* UIxMailSourceView.m - this file is part of SOGo * * Copyright (C) 2007 Inverse inc. * * 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 #import #import #import "UIxMailSourceView.h" @implementation UIxMailSourceView - (WOResponse *) viewSourceAction { NSString *source; WOResponse *response; source = [[self clientObject] contentAsString]; response = [self responseWithStatus: 200]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; [response appendContentString: source]; return response; } @end SOGo-2.1.1b/UI/MailerUI/UIxMailFolderActions.h0000644000000000000000000000257212247657027017326 0ustar rootroot/* UIxMailFolderActions.h - this file is part of SOGo * * Copyright (C) 2007 Inverse inc. * * 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 UIXMAILFOLDERACTIONS_H #define UIXMAILFOLDERACTIONS_H #import @class WOResponse; @interface UIxMailFolderActions : WODirectAction - (WOResponse *) createFolderAction; - (WOResponse *) renameFolderAction; - (WOResponse *) deleteAction; - (WOResponse *) batchDeleteAction; - (WOResponse *) saveMessagesAction; - (WOResponse *) expungeAction; - (WOResponse *) emptyTrashAction; - (WOResponse *) subscribeAction; - (WOResponse *) unsubscribeAction; @end #endif /* UIXMAILFOLDERACTIONS_H */ SOGo-2.1.1b/UI/MailerUI/Ukrainian.lproj/0000755000000000000000000000000012247657027016230 5ustar rootrootSOGo-2.1.1b/UI/MailerUI/Ukrainian.lproj/Localizable.strings0000644000000000000000000003364512247657027022077 0ustar rootroot/* this file is in UTF-8 format! */ /* Icon's label */ "Create" = "Створити"; "Empty Trash" = "Спорожнити 'Кошик'"; "Delete" = "Вилучити"; "Expunge" = "ОчиÑтити"; "Forward" = "ПереÑлати"; "Get Mail" = "Отримати"; "Junk" = "Спам"; "Reply" = "ВідповіÑти"; "Reply All" = "ВідповіÑти вÑім"; "Print" = "Друк"; "Stop" = "Стоп"; "Write" = "Створити"; "Send" = "ВідіÑлати"; "Contacts" = "Контакти"; "Attach" = "ВкладеннÑ"; "Save" = "Зберегти"; "Options" = "ÐалаштуваннÑ"; "Close" = "Закрити"; "Size" = "Розмір"; /* Tooltips */ "Send this message now" = "ВідіÑлати це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ñ€Ð°Ð·"; "Select a recipient from an Address Book" = "Вибрати адреÑата з адреÑної книги"; "Include an attachment" = "ВклаÑти файл в це повідомленнÑ"; "Save this message" = "Зберегти це повідомленнÑ"; "Get new messages" = "Отримати нові повідомленнÑ"; "Create a new message" = "Створити повідомленнÑ"; "Go to address book" = "Відкрити адреÑну книгу"; "Reply to the message" = "ВідповіÑти на повідомленнÑ"; "Reply to sender and all recipients" = "ВідповіÑти відправнику та вÑім адреÑатам"; "Forward selected message" = "ПереÑлати обране повідомленнÑ"; "Delete selected message or folder" = "Вилучити обране Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ теку"; "Mark the selected messages as junk" = "Позначити обрані Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñк Ñпам"; "Print this message" = "Роздрукувати це повідомленнÑ"; "Stop the current transfer" = "Зупинити поточну передачу даних"; "Attachment" = "ВкладеннÑ"; "Unread" = "Ðепрочитані"; "Flagged" = "Позначені зірочкою"; /* Main Frame */ "Home" = "Початок"; "Calendar" = "Календар"; "Addressbook" = "ÐдреÑна книга"; "Mail" = "Пошта"; "Right Administration" = "Права доÑтупу"; "Help" = "Допомога"; /* Mail account main windows */ "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Вітаємо в поштовій програмі SOGo! Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду повідомлень ÑкориÑтайтеÑÑŒ відповідним переліком тек, що розташований ліворуч."; "Read messages" = "Читати повідомленнÑ"; "Write a new message" = "Створити повідомленнÑ"; "Share: " = "Спільне викориÑтаннÑ: "; "Account: " = "КориÑтувач: "; "Shared Account: " = "Спільний обліковий запиÑ: "; /* acls */ "Access rights to" = "Права доÑтупу до"; "For user" = "Ð”Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"; "Any Authenticated User" = "Ð”Ð»Ñ Ð±ÑƒÐ´ÑŒ-Ñкого авторизованого кориÑтувача"; "List and see this folder" = "Бачити теку та назву лиÑтів в ній"; "Read mails from this folder" = "Читати лиÑти в теці"; "Mark mails read and unread" = "Ставити в лиÑтах позначку про прочитаннÑ"; "Modify the flags of the mails in this folder" = "Ставити позначки повідомленнÑм в теці"; "Insert, copy and move mails into this folder" = "Додавати, копіювати та переміщувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð² цю теку"; "Post mails" = "ВідправлÑти повідомленнÑ"; "Add subfolders to this folder" = "Створювати підтеки в цій теці"; "Remove this folder" = "Вилучати цю теку"; "Erase mails from this folder" = "Вилучати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· цієї теки"; "Expunge this folder" = "Позначати лиÑти Ñк вилучені"; "Archive This Folder" = "Ðрхівувати цю теку"; "Modify the acl of this folder" = "Керувати правами доÑтупу до цієї теки"; "Saved Messages.zip" = "Збережено Messages.zip"; "Update" = "Поновити"; "Cancel" = "СкаÑувати"; /* Mail edition */ "From" = "Від"; "Subject" = "Тема"; "To" = "Кому"; "Cc" = "КопіÑ"; "Bcc" = "Прихована копіÑ"; "Reply-To" = "Ð—Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ñ Ð°Ð´Ñ€ÐµÑа"; "Add address" = "Додати адреÑу"; "Attachments:" = "ВкладеннÑ:"; "Open" = "Відкрити"; "Select All" = "Вибрати вÑе"; "Attach Web Page..." = "ВклаÑти веб-Ñторінку..."; "Attach File(s)..." = "ВклаÑти файл(и)..."; "to" = "Кому"; "cc" = "КопіÑ"; "bcc" = "Прихована копіÑ"; "Edit Draft..." = "Редагувати чернетку..."; "Load Images" = "Завантажити зображеннÑ"; "Return Receipt" = "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ доÑтавку"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Відправник цього лиÑта попроÑив ÑповіÑтити, Ñк ви переглÑнете лиÑÑ‚. Чи ви бажаєте повідомити?"; "Return Receipt (displayed) - %@"= "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ (показано) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Це зворотнє Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÑƒÑ”, що ви надіÑлали лиÑÑ‚%@.\n\nУвага: Це зворотнє Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð»Ð¸ÑˆÐµ підтверджує, що лиÑÑ‚ було відкрито на комп’ютері отримувача. Це не означає, що отримувач прочитав або зрозумів його зміÑÑ‚."; "Priority" = "ВажливіÑть"; "highest" = "Ðайвища"; "high" = "ВиÑока"; "normal" = "Звичайна"; "low" = "Ðизька"; "lowest" = "Ðайнижча"; "This mail is being sent from an unsecure network!" = "Це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð´ÑилаєтьÑÑ Ð· небезпечної мережі!"; "Address Book:" = "ÐдреÑна книга:"; "Search For:" = "Шукати:"; /* Popup "show" */ "all" = "вÑÑ–"; "read" = "прочитані"; "unread" = "непрочитані"; "deleted" = "вилучені"; "flagged" = "позначені"; /* MailListView */ "Sender" = "Відправник"; "Subject or Sender" = "Тема або Відправник"; "To or Cc" = "Кому або копіÑ"; "Entire Message" = "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð½Ñ–Ñтю"; "Date" = "Дата"; "View" = "ПереглÑд"; "All" = "Ð’ÑÑ–"; "No message" = "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ñутні"; "messages" = "повідомленнÑ"; "first" = "перша"; "previous" = "попереднÑ"; "next" = "наÑтупна"; "last" = "оÑтаннÑ"; "msgnumber_to" = "до"; "msgnumber_of" = "з"; "Mark Unread" = "Позначити непрочитаним"; "Mark Read" = "Позначити прочитаним"; "Untitled" = "Без теми"; /* Tree */ "SentFolderName" = "ВідіÑлані"; "TrashFolderName" = "Кошик"; "InboxFolderName" = "Вхідні"; "DraftsFolderName" = "Чернетки"; "SieveFolderName" = "Теки"; "OtherUsersFolderName" = "Інші кориÑтувачі"; "SharedFoldersName" = "Спільні теки"; "Folders" = "Ð’ÑÑ– теки"; /* title line */ /* MailMoveToPopUp */ "MoveTo" = "ПереміÑтити до …"; /* Address Popup menu */ "Add to Address Book..." = "Додати у адреÑну книгу..."; "Compose Mail To" = "Створити лиÑÑ‚ длÑ"; "Create Filter From Message..." = "Створити фільтр з повідомленнÑ..."; /* Image Popup menu */ "Save Image" = "Зберегти зображеннÑ"; "Save Attachment" = "Зберегти вкладеннÑ"; /* Mailbox popup menus */ "Open in New Mail Window" = "Відкрити в новому вікні"; "Copy Folder Location" = "Копіювати адреÑу теки"; "Subscribe..." = "ПідпиÑатиÑÑŒ..."; "Mark Folder Read" = "Відзначити вÑÑ– лиÑти в теці прочитаними"; "New Folder..." = "Створити теку..."; "Compact This Folder" = "СтиÑнути цю теку"; "Search Messages..." = "Пошук повідомлень..."; "Sharing..." = "Спільне викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÐ¸..."; "New Subfolder..." = "Створити вкладену теку..."; "Rename Folder..." = "Перейменувати"; "Delete Folder" = "Вилучити"; "Use This Folder For" = "ВикориÑтати цю теку Ñк"; "Get Messages for Account" = "Отримати нові повідомленнÑ"; "Properties..." = "ВлаÑтивоÑті..."; "Delegation..." = "Права..."; /* Use This Folder menu */ "Sent Messages" = "ВідіÑлані"; "Drafts" = "Чернетки"; "Deleted Messages" = "Кошик"; /* Message list popup menu */ "Open Message In New Window" = "Відкрити Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð² новому вікні"; "Reply to Sender Only" = "ВідповіÑти відправнику"; "Reply to All" = "ВідповіÑти відправнику та вÑім адреÑатам"; "Edit As New..." = "Редагувати Ñк нове..."; "Move To" = "ПереміÑтити у"; "Copy To" = "Копіювати в"; "Label" = "Позначка"; "Mark" = "Позначити"; "Save As..." = "Зберегти Ñк..."; "Print Preview" = "Попередній переглÑд"; "View Message Source" = "Повний код повідомленнÑ"; "Print..." = "Друк"; "Delete Message" = "Вилучити повідомленнÑ"; "Delete Selected Messages" = "Вилучити обрані повідомленнÑ"; "This Folder" = "Ð¦Ñ Ñ‚ÐµÐºÐ°"; /* Label popup menu */ "None" = "Вилучити вÑÑ– позначки"; /* Mark popup menu */ "As Read" = "Прочитаним"; "Thread As Read" = "ÐžÐ±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð¸Ð¼"; "As Read By Date..." = "Як прочитане за дату..."; "All Read" = "Ð’ÑÑ– прочитаними"; "Flag" = "Додати зірочку"; "As Junk" = "Спамом"; "As Not Junk" = "Ðе Ñпамом"; "Run Junk Mail Controls" = "Відфільтрувати Ñпам"; /* Folder operations */ "Name :" = "Ðазва :"; "Enter the new name of your folder :" = "Введіть нову назву теки :"; "Do you really want to move this folder into the trash ?" = "Ви Ñправді бажаєте перенеÑти цю теку до кошика?"; "Operation failed" = "ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»Ð°ÑÑŒ невдало"; "Quota" = "Квота:"; "quotasFormat" = "ЗайнÑто %{0}% з %{1}МБ"; "Please select a message." = "Будь лаÑка, виберіть повідомленнÑ."; "Please select a message to print." = "Будь лаÑка, виберіть Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÑƒ."; "Please select only one message to print." = "Будь лаÑка, виберіть лише одне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÑƒ."; "The message you have selected doesn't exist anymore." = "Вибране Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±Ñ–Ð»ÑŒÑˆÐµ не Ñ–Ñнує."; "The folder with name \"%{0}\" could not be created." = "Ðеможливо Ñтворити теку з такою назвою \"%{0}\"."; "This folder could not be renamed to \"%{0}\"." = "Ðеможливо перейменувати теку в \"%{0}\"."; "The folder could not be deleted." = "Ðеможливо вилучити цю теку."; "The trash could not be emptied." = "Ðеможливо очиÑтити кошик."; "The folder functionality could not be changed." = "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÐºÐ¸ не може бути змінено."; "You need to choose a non-virtual folder!" = "Виберіть одну з невіртуальних тек!"; "Moving a message into its own folder is impossible!" = "Ðеможливо переÑунути повідомленнÑ, оÑкільки воно вже там Ñ”!"; "Copying a message into its own folder is impossible!" = "Ðеможливо Ñкопіювати повідомленнÑ, оÑкільки воно вже там Ñ”!"; /* Message operations */ "The messages could not be moved to the trash folder. Would you like to delete them immediately?" = "Ðеможливо переміÑтити Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ кошику. "; /* Message editing */ "error_validationfailed" = "Перевірка зазнала невдачі"; "error_missingsubject" = "Ðе зазначено теми повідомленнÑ"; "error_missingrecipients" = "Ðе зазначено адреÑи отримувача"; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Помилка під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ: некоректні адреÑи вÑÑ–Ñ… отримувачів."; "cannot send message (smtp) - recipients discarded:" = "Помила під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ: такі адреÑи некоректні:"; "cannot send message: (smtp) error when connecting" = "Помилка під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ: SMTP-Ñервер не відповідає."; "Name" = "Ім’Ñ"; "Email" = "Електронна пошта"; SOGo-2.1.1b/UI/MailerUI/UIxMailListActions.h0000644000000000000000000000343012247657027017020 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #ifndef UIXMAILLISTACTIONS_H #define UIXMAILLISTACTIONS_H #import @class NSDictionary; @class EOQualifier; @class SOGoDateFormatter; @interface UIxMailListActions : WODirectAction { NSArray *sortedUIDs; /* we always need to retrieve all anyway! */ NSArray *messages; id message; SOGoDateFormatter *dateFormatter; NSTimeZone *userTimeZone; BOOL sortByThread; int folderType; int specificMessageNumber; } - (NSString *) defaultSortKey; - (NSString *) imap4SortKey; - (NSString *) imap4SortOrdering; - (EOQualifier *) searchQualifier; - (NSString *) msgLabels; - (NSArray *) getSortedUIDsInFolder: (SOGoMailFolder *) mailFolder; - (NSArray *) getHeadersForUIDs: (NSArray *) uids inFolder: (SOGoMailFolder *) mailFolder; - (NSDictionary *) getUIDsInFolder: (SOGoMailFolder *) folder withHeaders: (BOOL) includeHeaders; - (id ) getUIDsAction; - (id ) getHeadersAction; @end #endif /* UIXMAILLISTACTIONS_H */ SOGo-2.1.1b/UI/common.make0000644000000000000000000000212612247657030013635 0ustar rootroot# common make file for UI bundles include ../../config.make include $(GNUSTEP_MAKEFILES)/common.make include ../../Version NEEDS_GUI=no BUNDLE_EXTENSION = .SOGo BUNDLE_INSTALL_DIR = $(SOGO_LIBDIR) ADDITIONAL_INCLUDE_DIRS += \ -I.. \ -I../.. \ -I../../.. \ -I../../SoObjects \ -I../../SOPE ifeq ($(GNUSTEP_BUILD_DIR),) ADDITIONAL_LIB_DIRS += \ -L../../SOPE/NGCards/$(GNUSTEP_OBJ_DIR) \ -L../SOGoUI/$(GNUSTEP_OBJ_DIR) \ -L../../SoObjects/SOGo/SOGo.framework/ else RELBUILD_DIR_libNGCards = \ $(GNUSTEP_BUILD_DIR)/../../SOPE/NGCards/$(GNUSTEP_OBJ_DIR_NAME) RELBUILD_DIR_libSOGo = \ $(GNUSTEP_BUILD_DIR)/../../SoObjects/SOGo/SOGo.framework/ RELBUILD_DIR_libSOGoUI = \ $(GNUSTEP_BUILD_DIR)/../SOGoUI/$(GNUSTEP_OBJ_DIR_NAME) RELBUILD_DIR_libOGoContentStore = \ $(GNUSTEP_BUILD_DIR)/../../OGoContentStore/$(GNUSTEP_OBJ_DIR_NAME) ADDITIONAL_LIB_DIRS += \ -L$(RELBUILD_DIR_libNGCards) \ -L$(RELBUILD_DIR_libSOGo) \ -L$(RELBUILD_DIR_libSOGoUI) \ -L$(RELBUILD_DIR_libOGoContentStore) endif SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib BUNDLE_LIBS += \ -lSOGoUI \ -lSOGo SOGo-2.1.1b/UI/Scheduler/0000755000000000000000000000000012247657031013424 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/UIxCalDateSelector.m0000644000000000000000000000744112247657030017233 0ustar rootroot/* UIxCalDateSelector.m - this file is part of SOGo * * Copyright (C) 2006 Inverse inc. * * 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 #import #import "UIxCalDateSelector.h" @implementation UIxCalDateSelector /* binding accessors */ - (void) setSelectedDate: (NSCalendarDate *) _date { ASSIGN (selectedDate, _date); [selectedDate setTimeZone: timeZone]; } - (NSCalendarDate *) selectedDate { if (!selectedDate) selectedDate = [super selectedDate]; return selectedDate; } - (NSString *) style { return style; } - (NSString *) headerStyle { return headerStyle; } - (NSString *) weekStyle { return weekStyle; } - (void) setTodayWeekStyle: (NSString *) _style { ASSIGN (todayWeekStyle, _style); } - (NSString *) todayWeekStyle { return ((todayWeekStyle) ? todayWeekStyle : [self weekStyle]); } - (NSString *) dayHeaderStyle { return dayHeaderStyle; } - (void) setSelectedDayExtraStyle: (NSString *) _style { ASSIGN(selectedDayExtraStyle, _style); } - (NSString *) selectedDayExtraStyle { return selectedDayExtraStyle; } - (NSTimeZone *) viewTimeZone { return timeZone; } /* date ranges */ - (NSCalendarDate *) startDate { return [[self selectedDate] firstDayOfMonth]; } - (unsigned int) firstDayOfWeek { SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; return [ud firstDayOfWeek]; } /* labels */ - (NSString *) headerMonthValue { NSCalendarDate *date; date = [self startDate]; return [NSString stringWithFormat: @"%.2d", [date monthOfYear]]; } - (NSString *) headerMonthString { NSCalendarDate *date; date = [self startDate]; return [NSString stringWithFormat:@"%@", [self localizedNameForMonthOfYear: [date monthOfYear]]]; } - (NSString *) headerYearString { NSCalendarDate *date; date = [self startDate]; return [NSString stringWithFormat: @"%d", [date yearOfCommonEra]]; } - (NSString *) localizedDayOfWeekName { return [self localizedAbbreviatedNameForDayOfWeek: [self dayOfWeek]]; } /* stylesheets */ - (NSString *) currentWeekStyle { return (([currentWeekStart isDateInSameWeek:[NSCalendarDate date]] && [currentWeekStart isDateInSameMonth:[self selectedDate]]) ? [self todayWeekStyle] : [self weekStyle]); } - (NSString *) contentStyle { return (([currentDay isToday] && [currentDay isDateInSameMonth:[self selectedDate]]) ? @"dayOfToday" : (([currentDay monthOfYear] != [[self startDate] monthOfYear]) ? @"inactiveDay" : @"activeDay")); } - (NSString *) extraStyle { NSString *extraStyle; if ([[self selectedDate] isDateOnSameDay: currentDay]) extraStyle = [self selectedDayExtraStyle]; else extraStyle = nil; return extraStyle; } /* URLs */ - (NSDictionary *) currentMonthQueryParameters { return [self queryParametersBySettingSelectedDate: [self startDate]]; } /* overriding */ - (NSArray *) fetchCoreInfos { return nil; } @end SOGo-2.1.1b/UI/Scheduler/UIxReminderEditor.m0000644000000000000000000000423512247657030017147 0ustar rootroot/* UIxReminderEditor.m - this file is part of SOGo * * Copyright (C) 2009 Inverse inc. * * Author: Francis Lachapelle * * 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 #import "UIxReminderEditor.h" @implementation UIxReminderEditor - (NSArray *) unitsList { static NSArray *unitsList = nil; if (!unitsList) { unitsList = [NSArray arrayWithObjects: @"MINUTES", @"HOURS", @"DAYS", nil]; [unitsList retain]; } return unitsList; } - (NSArray *) referencesList { static NSArray *referencesList = nil; if (!referencesList) { referencesList = [NSArray arrayWithObjects: @"BEFORE", @"AFTER", nil]; [referencesList retain]; } return referencesList; } - (NSArray *) relationsList { static NSArray *relationsList = nil; if (!relationsList) { relationsList = [NSArray arrayWithObjects: @"START", @"END", nil]; [relationsList retain]; } return relationsList; } - (void) setItem: (NSString *) theItem { item = theItem; } - (NSString *) item { return item; } - (NSString *) itemText { NSString *text; if ([item isEqualToString: @"-"]) text = item; else text = [self labelForKey: [NSString stringWithFormat: @"reminder_%@", item]]; return text; } - (BOOL) emailAlarmsEnabled { SOGoSystemDefaults *sd; sd = [SOGoSystemDefaults sharedSystemDefaults]; return [sd enableEMailAlarms]; } @end SOGo-2.1.1b/UI/Scheduler/UIxComponentEditor.m0000644000000000000000000020435612247657031017353 0ustar rootroot/* UIxComponentEditor.m - this file is part of SOGo * * Copyright (C) 2006-2013 Inverse inc. * * Author: Wolfgang Sourdeau * Francis Lachapelle * * 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "../../Main/SOGo.h" #import "UIxComponentEditor.h" #import "UIxDatePicker.h" static NSArray *reminderItems = nil; static NSArray *reminderValues = nil; #define iREPEAT(X) \ - (NSString *) repeat##X; \ - (void) setRepeat##X: (NSString *) theValue #define iRANGE(X) \ - (NSString *) range##X; \ - (void) setRange##X: (NSString *) theValue @interface UIxComponentEditor (Private) iREPEAT(1); iREPEAT(2); iREPEAT(3); iREPEAT(4); iREPEAT(5); iREPEAT(6); iREPEAT(7); iRANGE(1); iRANGE(2); @end #define REPEAT(X) \ - (NSString *) repeat##X { return repeat##X; } \ - (void) setRepeat##X: (NSString *) theValue { ASSIGN(repeat##X, theValue); } \ #define RANGE(X) \ - (NSString *) range##X { return range##X; } \ - (void) setRange##X: (NSString *) theValue { ASSIGN(range##X, theValue); } @implementation UIxComponentEditor + (void) initialize { if (!reminderItems && !reminderValues) { reminderItems = [NSArray arrayWithObjects: @"5_MINUTES_BEFORE", @"10_MINUTES_BEFORE", @"15_MINUTES_BEFORE", @"30_MINUTES_BEFORE", @"45_MINUTES_BEFORE", @"-", @"1_HOUR_BEFORE", @"2_HOURS_BEFORE", @"5_HOURS_BEFORE", @"15_HOURS_BEFORE", @"-", @"1_DAY_BEFORE", @"2_DAYS_BEFORE", @"1_WEEK_BEFORE", @"-", @"CUSTOM", nil]; reminderValues = [NSArray arrayWithObjects: @"-PT5M", @"-PT10M", @"-PT15M", @"-PT30M", @"-PT45M", @"", @"-PT1H", @"-PT2H", @"-PT5H", @"-PT15H", @"", @"-P1D", @"-P2D", @"-P1W", @"", @"", nil]; [reminderItems retain]; [reminderValues retain]; } } - (id) init { UIxDatePicker *datePicker; if ((self = [super init])) { // We must instanciate a UIxDatePicker object to retrieve // the proper date format to use. datePicker = [[UIxDatePicker alloc] initWithContext: context]; dateFormat = [datePicker dateFormat]; [datePicker release]; component = nil; componentCalendar = nil; classification = nil; [self setIsCycleEndNever]; componentOwner = @""; organizer = nil; //organizerIdentity = nil; organizerProfile = nil; ownerAsAttendee = nil; attendee = nil; jsonAttendees = nil; calendarList = nil; repeat = nil; reminder = nil; reminderQuantity = nil; reminderUnit = nil; reminderRelation = nil; reminderReference = nil; reminderAction = nil; reminderEmailOrganizer = NO; reminderEmailAttendees = NO; repeatType = nil; repeat1 = nil; repeat2 = nil; repeat3 = nil; repeat4 = nil; repeat5 = nil; repeat6 = nil; repeat7 = nil; range1 = nil; range2 = nil; } return self; } - (void) dealloc { [item release]; [cycleUntilDate release]; [title release]; [location release]; [organizer release]; //[organizerIdentity release]; [organizerProfile release]; [ownerAsAttendee release]; [comment release]; [priority release]; [classification release]; [categories release]; [cycle release]; [cycleEnd release]; [attachUrl release]; [attendee release]; [jsonAttendees release]; [calendarList release]; [reminder release]; [reminderQuantity release]; [reminderUnit release]; [reminderRelation release]; [reminderReference release]; [repeat release]; [repeatType release]; [repeat1 release]; [repeat2 release]; [repeat3 release]; [repeat4 release]; [repeat5 release]; [repeat6 release]; [repeat7 release]; [range1 release]; [range2 release]; [component release]; [componentCalendar release]; [super dealloc]; } - (void) _loadAttendees { NSEnumerator *attendees; NSMutableDictionary *currentAttendeeData; NSString *uid, *domain; NSArray *contacts; NSDictionary *contact; iCalPerson *currentAttendee; SOGoUserManager *um; NSObject *source; jsonAttendees = [NSMutableDictionary new]; um = [SOGoUserManager sharedUserManager]; attendees = [[component attendees] objectEnumerator]; while ((currentAttendee = [attendees nextObject])) { currentAttendeeData = [NSMutableDictionary dictionary]; if ([[currentAttendee cn] length]) [currentAttendeeData setObject: [currentAttendee cn] forKey: @"name"]; [currentAttendeeData setObject: [currentAttendee rfc822Email] forKey: @"email"]; uid = [um getUIDForEmail: [currentAttendee rfc822Email]]; if (uid != nil) [currentAttendeeData setObject: uid forKey: @"uid"]; else { domain = [[context activeUser] domain]; contacts = [um fetchContactsMatching: [currentAttendee rfc822Email] inDomain: domain]; if ([contacts count] == 1) { contact = [contacts lastObject]; source = [contact objectForKey: @"source"]; if ([source conformsToProtocol: @protocol (SOGoDNSource)] && [[(NSObject *) source MSExchangeHostname] length]) { uid = [NSString stringWithFormat: @"%@:%@", [[context activeUser] login], [contact valueForKey: @"c_uid"]]; [currentAttendeeData setObject: uid forKey: @"uid"]; } } } [currentAttendeeData setObject: [[currentAttendee partStat] lowercaseString] forKey: @"partstat"]; [currentAttendeeData setObject: [[currentAttendee role] lowercaseString] forKey: @"role"]; if ([[currentAttendee delegatedTo] length]) [currentAttendeeData setObject: [[currentAttendee delegatedTo] rfc822Email] forKey: @"delegated-to"]; if ([[currentAttendee delegatedFrom] length]) [currentAttendeeData setObject: [[currentAttendee delegatedFrom] rfc822Email] forKey: @"delegated-from"]; [jsonAttendees setObject: currentAttendeeData forKey: [currentAttendee rfc822Email]]; } } - (void) _loadCategories { NSString *simpleCategory; NSArray *compCategories; compCategories = [component categories]; if ([compCategories count] > 0) { simpleCategory = [compCategories objectAtIndex: 0]; ASSIGN (category, simpleCategory); } } - (void) _loadRRules { SOGoUserDefaults *ud; // We initialize our repeat ivars if ([component hasRecurrenceRules]) { iCalRecurrenceRule *rule; [self setRepeat: @"CUSTOM"]; rule = [[component recurrenceRules] lastObject]; /* DAILY */ if ([rule frequency] == iCalRecurrenceFrequenceDaily) { repeatType = @"0"; if ([[rule byDayMask] isWeekDays]) { if ([rule isInfinite]) repeat = @"EVERY WEEKDAY"; repeat1 = @"1"; } else { repeat1 = @"0"; if ([rule repeatInterval] == 1 && [rule isInfinite]) repeat = @"DAILY"; [self setRepeat2: [NSString stringWithFormat: @"%d", [rule repeatInterval]]]; } } /* WEEKLY */ else if ([rule frequency] == iCalRecurrenceFrequenceWeekly) { repeatType = @"1"; [self setRepeat1: [NSString stringWithFormat: @"%d", [rule repeatInterval]]]; if (![[rule byDay] length]) { if ([rule repeatInterval] == 1) repeat = @"WEEKLY"; else if ([rule repeatInterval] == 2) repeat = @"BI-WEEKLY"; } else { [self setRepeat2: [[rule byDayMask] asRuleStringWithIntegers]]; } } /* MONTHLY */ else if ([rule frequency] == iCalRecurrenceFrequenceMonthly) { repeatType = @"2"; if ([[rule byDay] length]) { int firstOccurrence; iCalByDayMask *dayMask; dayMask = [rule byDayMask]; firstOccurrence = [dayMask firstOccurrence] - 1; if (firstOccurrence < 0) firstOccurrence = 5; [self setRepeat2: @"0"]; [self setRepeat3: [NSString stringWithFormat: @"%d", firstOccurrence]]; [self setRepeat4: [NSString stringWithFormat: @"%d", [dayMask firstDay]]]; } else if ([[rule byMonthDay] count]) { NSArray *days; days = [rule byMonthDay]; if ([days count] > 0 && [[days objectAtIndex: 0] intValue] < 0) { // BYMONTHDAY=-1 [self setRepeat2: @"0"]; [self setRepeat3: @"5"]; // last .. [self setRepeat4: @"7"]; // .. day of the month } else { [self setRepeat2: @"1"]; [self setRepeat5: [[rule byMonthDay] componentsJoinedByString: @","]]; } } else if ([rule repeatInterval] == 1) repeat = @"MONTHLY"; [self setRepeat1: [NSString stringWithFormat: @"%d", [rule repeatInterval]]]; } /* YEARLY */ else { repeatType = @"3"; if ([[rule flattenedValuesForKey: @"bymonth"] length]) { if ([[rule byDay] length]) { int firstOccurrence; iCalByDayMask *dayMask; dayMask = [rule byDayMask]; firstOccurrence = [dayMask firstOccurrence] - 1; if (firstOccurrence < 0) firstOccurrence = 5; [self setRepeat2: @"1"]; [self setRepeat5: [NSString stringWithFormat: @"%d", firstOccurrence]]; [self setRepeat6: [NSString stringWithFormat: @"%d", [dayMask firstDay]]]; [self setRepeat7: [NSString stringWithFormat: @"%d", [[rule flattenedValuesForKey: @"bymonth"] intValue]-1]]; } else { [self setRepeat2: @"0"]; [self setRepeat3: [rule flattenedValuesForKey: @"bymonthday"]]; [self setRepeat4: [NSString stringWithFormat: @"%d", [[rule flattenedValuesForKey: @"bymonth"] intValue]-1]]; } } else if ([rule repeatInterval] == 1) repeat = @"YEARLY"; [self setRepeat1: [NSString stringWithFormat: @"%d", [rule repeatInterval]]]; } /* We decode the proper end date, recurrences count, etc. */ if ([rule repeatCount]) { repeat = @"CUSTOM"; [self setRange1: @"1"]; [self setRange2: [rule flattenedValuesForKey: @"count"]]; } else if ([rule untilDate]) { NSCalendarDate *date; repeat = @"CUSTOM"; date = [[rule untilDate] copy]; ud = [[context activeUser] userDefaults]; [date setTimeZone: [ud timeZone]]; [self setRange1: @"2"]; [self setRange2: [date descriptionWithCalendarFormat: dateFormat]]; [date release]; } else [self setRange1: @"0"]; } else { DESTROY(repeat); repeatType = @"0"; repeat1 = @"0"; repeat2 = @"1"; } } - (void) _loadEMailAlarm: (iCalAlarm *) anAlarm { NSArray *attendees; iCalPerson *aAttendee; SOGoUser *owner; NSString *ownerId, *email; int count, max; attendees = [anAlarm attendees]; reminderEmailOrganizer = NO; reminderEmailAttendees = NO; ownerId = [[self clientObject] ownerInContext: nil]; owner = [SOGoUser userWithLogin: ownerId]; email = [[owner defaultIdentity] objectForKey: @"email"]; max = [attendees count]; for (count = 0; !(reminderEmailOrganizer && reminderEmailAttendees) && count < max; count++) { aAttendee = [attendees objectAtIndex: count]; if ([[aAttendee rfc822Email] isEqualToString: email]) reminderEmailOrganizer = YES; else reminderEmailAttendees = YES; } } - (void) _loadAlarms { iCalAlarm *anAlarm; iCalTrigger *aTrigger; NSString *duration, *quantity; unichar c; NSUInteger i; if ([component hasAlarms]) { // We currently have the following limitations for alarms: // - only the first alarm is considered; // - the alarm's action must be of type DISPLAY; // - the alarm's trigger value type must be DURATION. anAlarm = [[component alarms] objectAtIndex: 0]; aTrigger = [anAlarm trigger]; ASSIGN (reminderAction, [[anAlarm action] lowercaseString]); if (([reminderAction isEqualToString: @"display"] || [reminderAction isEqualToString: @"email"]) && [[aTrigger valueType] caseInsensitiveCompare: @"DURATION"] == NSOrderedSame) { duration = [aTrigger flattenedValuesForKey: @""]; i = [reminderValues indexOfObject: duration]; if (i == NSNotFound || [reminderAction isEqualToString: @"email"]) { // Custom alarm ASSIGN (reminder, @"CUSTOM"); ASSIGN (reminderRelation, [aTrigger relationType]); i = 0; c = [duration characterAtIndex: i]; if (c == '-') { ASSIGN (reminderReference, @"BEFORE"); i++; } else { ASSIGN (reminderReference, @"AFTER"); } c = [duration characterAtIndex: i]; if (c == 'P') { quantity = @""; // Parse duration -- ignore first character (P) for (i++; i < [duration length]; i++) { c = [duration characterAtIndex: i]; if (c == 't' || c == 'T') // time -- ignore character continue; else if (isdigit (c)) quantity = [quantity stringByAppendingFormat: @"%c", c]; else { switch (c) { case 'D': /* day */ ASSIGN (reminderUnit, @"DAYS"); break; case 'H': /* hour */ ASSIGN (reminderUnit, @"HOURS"); break; case 'M': /* min */ ASSIGN (reminderUnit, @"MINUTES"); break; default: NSLog(@"Cannot process duration unit: '%c'", c); break; } } } if ([quantity length]) ASSIGN (reminderQuantity, quantity); if ([reminderAction isEqualToString: @"email"]) [self _loadEMailAlarm: anAlarm]; } } else // Matches one of the predefined alarms ASSIGN (reminder, [reminderItems objectAtIndex: i]); } } } /* warning: we use this method which will be triggered by the template system when the page is instantiated, but we should find another and cleaner way of doing this... for example, when the clientObject is set */ - (void) setComponent: (iCalRepeatableEntityObject *) newComponent { SOGoCalendarComponent *co; SOGoUserManager *um; NSString *owner, *ownerEmail; iCalRepeatableEntityObject *masterComponent; SOGoUserDefaults *defaults; NSString *tag; if (!component) { ASSIGN (component, newComponent); co = [self clientObject]; componentOwner = [co ownerInContext: nil]; if (component) { ASSIGN (title, [component summary]); ASSIGN (location, [component location]); ASSIGN (comment, [component comment]); ASSIGN (attachUrl, [[component attach] absoluteString]); ASSIGN (classification, [component accessClass]); if ([co isNew] && [classification length] == 0) { defaults = [[context activeUser] userDefaults]; tag = [co componentTag]; [classification release]; if ([tag isEqualToString: @"vevent"]) classification = [defaults calendarEventsDefaultClassification]; else classification = [defaults calendarTasksDefaultClassification]; if ([classification length] == 0) classification = @"PUBLIC"; [classification retain]; } ASSIGN (priority, [component priority]); ASSIGN (status, [component status]); ASSIGN (categories, [component categories]); if ([[[component organizer] rfc822Email] length]) { ASSIGN (organizer, [component organizer]); } else { masterComponent = [[[component parent] allObjects] objectAtIndex: 0]; ASSIGN (organizer, [masterComponent organizer]); } [self _loadCategories]; if (!jsonAttendees) [self _loadAttendees]; [self _loadRRules]; [self _loadAlarms]; [componentCalendar release]; componentCalendar = [co container]; if ([componentCalendar isKindOfClass: [SOGoCalendarComponent class]]) componentCalendar = [componentCalendar container]; [componentCalendar retain]; um = [SOGoUserManager sharedUserManager]; owner = [componentCalendar ownerInContext: context]; ownerEmail = [um getEmailForUID: owner]; ASSIGN (ownerAsAttendee, [component findAttendeeWithEmail: (id)ownerEmail]); } } // /* cycles */ // if ([component isRecurrent]) // { // rrule = [[component recurrenceRules] objectAtIndex: 0]; // [self adjustCycleControlsForRRule: rrule]; // } } - (void) setSaveURL: (NSString *) newSaveURL { saveURL = newSaveURL; } - (NSString *) saveURL { return saveURL; } /* accessors */ - (BOOL) isChildOccurence { return [[self clientObject] isKindOfClass: [SOGoComponentOccurence class]]; } - (void) setItem: (id) _item { ASSIGN (item, _item); } - (id) item { return item; } - (NSString *) itemPriorityText { return [self labelForKey: [NSString stringWithFormat: @"prio_%@", item]]; } - (NSString *) itemClassificationText { NSString *tag; tag = [[component tag] lowercaseString]; return [self labelForKey: [NSString stringWithFormat: @"%@_%@", item, tag]]; } - (NSString *) itemStatusText { return [self labelForKey: [NSString stringWithFormat: @"status_%@", item]]; } - (void) setTitle: (NSString *) _value { ASSIGN (title, _value); } - (NSString *) title { SOGoCalendarComponent *co; NSString *tag; co = [self clientObject]; if ([co isNew] && [co isKindOfClass: [SOGoCalendarComponent class]]) { tag = [co componentTag]; if ([tag isEqualToString: @"vevent"]) [self setTitle: [self labelForKey: @"New Event"]]; else if ([tag isEqualToString: @"vtodo"]) [self setTitle: [self labelForKey: @"New Task"]]; } return title; } - (void) setAttach: (NSString *) _attachUrl { ASSIGN (attachUrl, _attachUrl); } - (NSString *) attach { return attachUrl; } - (NSDictionary *) organizerProfile { NSMutableDictionary *profile; NSDictionary *ownerIdentity; NSString *uid, *name, *email, *partstat, *role; SOGoUserManager *um; SOGoCalendarComponent *co; SOGoUser *ownerUser; if (organizerProfile == nil) { profile = [NSMutableDictionary dictionary]; email = [organizer rfc822Email]; role = nil; partstat = nil; if ([email length]) { um = [SOGoUserManager sharedUserManager]; name = [organizer cn]; uid = [um getUIDForEmail: email]; partstat = [[organizer partStat] lowercaseString]; role = [[organizer role] lowercaseString]; } else { // No organizer defined in vEvent; use calendar owner co = [self clientObject]; uid = [[co container] ownerInContext: context]; ownerUser = [SOGoUser userWithLogin: uid roles: nil]; ownerIdentity = [ownerUser defaultIdentity]; name = [ownerIdentity objectForKey: @"fullName"]; email = [ownerIdentity objectForKey: @"email"]; } if (uid != nil) [profile setObject: uid forKey: @"uid"]; else uid = email; [profile setObject: name forKey: @"name"]; [profile setObject: email forKey: @"email"]; if (partstat == nil || ![partstat length]) partstat = @"accepted"; [profile setObject: partstat forKey: @"partstat"]; if (role == nil || ![role length]) role = @"chair"; [profile setObject: role forKey: @"role"]; organizerProfile = [NSDictionary dictionaryWithObject: profile forKey: uid]; [organizerProfile retain]; } return organizerProfile; } - (BOOL) hasCreatedBy { return ([[[component firstChildWithTag: @"X-SOGo-Component-Created-By"] flattenedValuesForKey: @""] length] > 0); } - (NSString *) createdBy { return [[component firstChildWithTag: @"X-SOGo-Component-Created-By"] flattenedValuesForKey: @""]; } - (NSString *) createdByLink { return [NSString stringWithFormat: @"mailto:%@", [[component firstChildWithTag: @"X-SOGo-Component-Created-By"] flattenedValuesForKey: @""]]; } - (NSString *) createdByName { NSString *login; SOGoUser *user; login = [[SOGoUserManager sharedUserManager] getUIDForEmail: [self createdBy]]; if (login) { user = [SOGoUser userWithLogin: login]; if (user) return [user cn]; } return @""; } - (NSString *) organizerName { NSDictionary *profile; NSString *s; profile = [[[self organizerProfile] allValues] lastObject]; s = [profile objectForKey: @"name"]; if ([s length] == 0) s = [profile objectForKey: @"email"]; return s; } - (NSString *) jsonOrganizer { return [[[[self organizerProfile] allValues] lastObject] jsonRepresentation]; } // - (BOOL) canBeOrganizer // { // NSString *owner; // SOGoObject *co; // SOGoUser *currentUser; // BOOL hasOrganizer; // SoSecurityManager *sm; // co = [self clientObject]; // owner = [co ownerInContext: context]; // currentUser = [context activeUser]; // hasOrganizer = ([[organizer value: 0] length] > 0); // sm = [SoSecurityManager sharedSecurityManager]; // return ([co isNew] // || (([owner isEqualToString: [currentUser login]] // || ![sm validatePermission: SOGoCalendarPerm_ModifyComponent // onObject: co // inContext: context]) // && (!hasOrganizer || [component userIsOrganizer: currentUser]))); // } - (BOOL) hasOrganizer { // We check if there's an organizer and if it's not ourself NSString *value; value = [organizer rfc822Email]; if ([value length]) { NSDictionary *currentIdentity; NSEnumerator *identities; NSArray *allIdentities; allIdentities = [[context activeUser] allIdentities]; identities = [allIdentities objectEnumerator]; currentIdentity = nil; while ((currentIdentity = [identities nextObject])) if ([[currentIdentity objectForKey: @"email"] caseInsensitiveCompare: value] == NSOrderedSame) return NO; return YES; } return NO; //return ([[organizer value: 0] length] && ![self canBeOrganizer]); } //- (void) setOrganizerIdentity: (NSDictionary *) newOrganizerIdentity //{ // ASSIGN (organizerIdentity, newOrganizerIdentity); //} // - (NSDictionary *) organizerIdentity // { // NSArray *allIdentities; // NSEnumerator *identities; // NSDictionary *currentIdentity; // NSString *orgEmail; // orgEmail = [organizer rfc822Email]; // if (!organizerIdentity) // { // if ([orgEmail length]) // { // allIdentities = [[context activeUser] allIdentities]; // identities = [allIdentities objectEnumerator]; // while (!organizerIdentity // && ((currentIdentity = [identities nextObject]))) // if ([[currentIdentity objectForKey: @"email"] // caseInsensitiveCompare: orgEmail] // == NSOrderedSame) // ASSIGN (organizerIdentity, currentIdentity); // } // } // return organizerIdentity; // } //- (NSArray *) organizerList //{ // return [[context activeUser] allIdentities]; //} //- (NSString *) itemOrganizerText //{ // return [item keysWithFormat: @"%{fullName} <%{email}>"]; //} - (BOOL) hasAttendees { return ([[component attendees] count] > 0); } - (void) setAttendee: (id) _attendee { ASSIGN (attendee, _attendee); } - (id) attendee { return attendee; } - (NSString *) attendeeForDisplay { NSString *fn, *result; fn = [attendee cnWithoutQuotes]; if ([fn length]) result = fn; else result = [attendee rfc822Email]; return result; } - (NSString *) jsonAttendees { return [jsonAttendees jsonRepresentation]; } - (void) setLocation: (NSString *) _value { ASSIGN (location, _value); } - (NSString *) location { return location; } - (BOOL) hasLocation { return [location length] > 0; } - (void) setComment: (NSString *) _value { #warning should we do the same for "location" and "summary"? What about ContactsUI? ASSIGN (comment, [_value stringByReplacingString: @"\r\n" withString: @"\n"]); } - (NSString *) comment { return [comment stringByReplacingString: @"\n" withString: @"\r\n"]; } - (BOOL) hasComment { return [comment length] > 0; } - (NSArray *) categoryList { NSMutableArray *categoryList; NSArray *categoryLabels; SOGoUserDefaults *defaults; defaults = [[context activeUser] userDefaults]; categoryLabels = [defaults calendarCategories]; if (!categoryLabels) categoryLabels = [[self labelForKey: @"category_labels"] componentsSeparatedByString: @","]; categoryList = [NSMutableArray arrayWithCapacity: [categoryLabels count] + 1]; if ([category length] && ![categoryLabels containsObject: category]) [categoryList addObject: category]; [categoryList addObjectsFromArray: [categoryLabels sortedArrayUsingSelector: @selector (localizedCaseInsensitiveCompare:)]]; return categoryList; } - (void) setCategories: (NSArray *) _categories { ASSIGN (categories, _categories); } - (NSArray *) categories { return categories; } - (void) setCategory: (NSString *) newCategory { if (newCategory) ASSIGN (categories, [NSArray arrayWithObject: newCategory]); else { [categories release]; categories = nil; } } - (NSString *) category { return category; } - (BOOL) hasCategory { return [category length] > 0; } - (NSArray *) repeatList { static NSArray *repeatItems = nil; if (!repeatItems) { repeatItems = [NSArray arrayWithObjects: @"DAILY", @"WEEKLY", @"BI-WEEKLY", @"EVERY WEEKDAY", @"MONTHLY", @"YEARLY", @"-", @"CUSTOM", nil]; [repeatItems retain]; } return repeatItems; } - (NSString *) itemRepeatText { NSString *text; if ([item isEqualToString: @"-"]) text = item; else text = [self labelForKey: [NSString stringWithFormat: @"repeat_%@", item]]; return text; } - (NSString *) repeatLabel { NSString *rc; if ([self repeat]) rc = [self labelForKey: [NSString stringWithFormat: @"repeat_%@", [self repeat]]]; else rc = [self labelForKey: @"repeat_NEVER"]; return rc; } - (NSArray *) reminderList { return reminderItems; } - (void) setReminder: (NSString *) theReminder { ASSIGN(reminder, theReminder); } - (NSString *) reminder { return reminder; } - (void) setReminderQuantity: (NSString *) theReminderQuantity { ASSIGN(reminderQuantity, theReminderQuantity); } - (NSString *) reminderQuantity { return reminderQuantity; } - (NSString *) itemReminderText { NSString *text; if ([item isEqualToString: @"-"]) text = item; else text = [self labelForKey: [NSString stringWithFormat: @"reminder_%@", item]]; return text; } - (void) setReminderAction: (NSString *) newValue { ASSIGN (reminderAction, newValue); } - (NSString *) reminderAction { return reminderAction; } - (void) setReminderEmailOrganizer: (NSString *) newValue { reminderEmailOrganizer = [newValue isEqualToString: @"true"]; } - (NSString *) reminderEmailOrganizer { return (reminderEmailOrganizer ? @"true" : @"false"); } - (void) setReminderEmailAttendees: (NSString *) newValue { reminderEmailAttendees = [newValue isEqualToString: @"true"]; } - (NSString *) reminderEmailAttendees { return (reminderEmailAttendees ? @"true" : @"false"); } - (NSString *) repeat { return repeat; } - (void) setRepeat: (NSString *) newRepeat { ASSIGN(repeat, newRepeat); } - (BOOL) hasRepeat { return [repeat length] > 0; } - (NSString *) itemReplyText { NSString *word; switch ([item intValue]) { case iCalPersonPartStatAccepted: word = @"ACCEPTED"; break; case iCalPersonPartStatDeclined: word = @"DECLINED"; break; case iCalPersonPartStatNeedsAction: word = @"NEEDS-ACTION"; break; case iCalPersonPartStatTentative: word = @"TENTATIVE"; break; case iCalPersonPartStatDelegated: word = @"DELEGATED"; break; default: word = @"UNKNOWN"; } return [self labelForKey: [NSString stringWithFormat: @"partStat_%@", word]]; } - (NSArray *) replyList { return [NSArray arrayWithObjects: [NSNumber numberWithInt: iCalPersonPartStatAccepted], [NSNumber numberWithInt: iCalPersonPartStatDeclined], [NSNumber numberWithInt: iCalPersonPartStatNeedsAction], [NSNumber numberWithInt: iCalPersonPartStatTentative], [NSNumber numberWithInt: iCalPersonPartStatDelegated], nil]; } - (NSNumber *) reply { iCalPersonPartStat participationStatus; participationStatus = [ownerAsAttendee participationStatus]; return [NSNumber numberWithInt: participationStatus]; } - (NSArray *) calendarList { SOGoAppointmentFolder *calendar, *currentCalendar; SOGoAppointmentFolders *calendarParent; NSEnumerator *allCalendars; SoSecurityManager *sm; NSString *perm; if (!calendarList) { calendarList = [NSMutableArray new]; calendar = [self componentCalendar]; sm = [SoSecurityManager sharedSecurityManager]; perm = SoPerm_DeleteObjects; if ([sm validatePermission: perm onObject: calendar inContext: context]) { // User can't delete components from this calendar; // don't add any calendar other than the current one [calendarList addObject: calendar]; } else { // Find which calendars user has creation rights perm = SoPerm_AddDocumentsImagesAndFiles; calendarParent = [[context activeUser] calendarsFolderInContext: context]; allCalendars = [[calendarParent subFolders] objectEnumerator]; while ((currentCalendar = [allCalendars nextObject])) if ([calendar isEqual: currentCalendar] || ![sm validatePermission: perm onObject: currentCalendar inContext: context]) [calendarList addObject: currentCalendar]; } } return calendarList; } /** * This method is called from the wox template and uses to display the event * organizer in the edition window of the attendees. * Returns an array of the two elements : * - array of calendar owners * - dictionary of owners profiles */ - (NSArray *) calendarOwnerList { NSArray *calendars; NSMutableArray *owners; NSDictionary *currentOwnerIdentity; NSMutableDictionary *profiles, *currentOwnerProfile; NSString *currentOwner; SOGoAppointmentFolder *currentCalendar; SOGoUser *currentUser; NSUInteger i; calendars = [self calendarList]; owners = [NSMutableArray arrayWithCapacity: [calendars count]]; profiles = [NSMutableDictionary dictionaryWithDictionary: [self organizerProfile]]; for (i = 0; i < [calendars count]; i++) { currentCalendar = [calendars objectAtIndex: i]; currentOwner = [currentCalendar ownerInContext: context]; [owners addObject: currentOwner]; if ([profiles objectForKey: currentOwner] == nil) { currentUser = [SOGoUser userWithLogin: currentOwner roles: nil]; currentOwnerIdentity = [currentUser defaultIdentity]; currentOwnerProfile = [NSMutableDictionary dictionary]; [currentOwnerProfile setObject: ([currentOwnerIdentity objectForKey: @"fullName"] == nil ? @"" : [currentOwnerIdentity objectForKey: @"fullName"]) forKey: @"name"]; [currentOwnerProfile setObject: ([currentOwnerIdentity objectForKey: @"email"] == nil ? @"" : [currentOwnerIdentity objectForKey: @"email"]) forKey: @"email"]; [currentOwnerProfile setObject: @"accepted" forKey: @"partstat"]; [currentOwnerProfile setObject: @"chair" forKey: @"role"]; [profiles setObject: currentOwnerProfile forKey: currentOwner]; } } return [NSArray arrayWithObjects: owners, profiles, nil]; } - (NSString *) calendarDisplayName { NSString *fDisplayName; SOGoAppointmentFolder *folder; SOGoAppointmentFolders *parentFolder; fDisplayName = [item displayName]; folder = [self componentCalendar]; parentFolder = [folder container]; if ([fDisplayName isEqualToString: [parentFolder defaultFolderName]]) fDisplayName = [self labelForKey: fDisplayName]; return fDisplayName; } - (NSString *) calendarsFoldersList { NSArray *calendars; calendars = [[self calendarList] valueForKey: @"nameInContainer"]; return [calendars componentsJoinedByString: @","]; } - (SOGoAppointmentFolder *) componentCalendar { return componentCalendar; } - (NSString *) componentCalendarName { return [componentCalendar displayName]; } - (void) setComponentCalendar: (SOGoAppointmentFolder *) _componentCalendar { ASSIGN(componentCalendar, _componentCalendar); } /* priorities */ - (NSArray *) priorities { /* 0 == undefined 9 == low 5 == medium 1 == high */ static NSArray *priorities = nil; if (!priorities) { priorities = [NSArray arrayWithObjects: @"9", @"5", @"1", nil]; [priorities retain]; } return priorities; } - (void) setPriority: (NSString *) _priority { ASSIGN (priority, _priority); } - (NSString *) priority { return priority; } - (BOOL) hasPriority { return [priority length] > 0; } - (NSArray *) classificationClasses { static NSArray *priorities = nil; if (!priorities) { priorities = [NSArray arrayWithObjects: @"PUBLIC", @"CONFIDENTIAL", @"PRIVATE", nil]; [priorities retain]; } return priorities; } - (void) setClassification: (NSString *) _classification { ASSIGN (classification, _classification); } - (NSString *) classification { return classification; } - (void) setStatus: (NSString *) _status { ASSIGN (status, _status); } - (NSString *) status { return status; } - (void) setRepeatType: (NSString *) theValue { ASSIGN (repeatType, theValue); } - (NSString *) repeatType { return repeatType; } REPEAT(1); REPEAT(2); REPEAT(3); REPEAT(4); REPEAT(5); REPEAT(6); REPEAT(7); RANGE(1); RANGE(2); ////////////////////////////////// JUNK //////////////////////////////////////// ////////////////////////////////// JUNK //////////////////////////////////////// ////////////////////////////////// JUNK //////////////////////////////////////// - (NSArray *) cycles { NSString *path; static NSArray *cycles = nil; if (!cycles) { path = [[self componentBundle] pathForResource: @"cycles" ofType: @"plist"]; NSAssert(path != nil, @"Cannot find cycles.plist!"); cycles = [[NSArray arrayWithContentsOfFile:path] retain]; NSAssert(cycles != nil, @"Cannot instantiate cycles from cycles.plist!"); } return cycles; } - (void) setCycle: (NSDictionary *) _cycle { ASSIGN (cycle, _cycle); } - (NSDictionary *) cycle { return cycle; } - (BOOL) hasCycle { return ([cycle objectForKey: @"rule"] != nil); } - (NSString *) cycleLabel { NSString *key; key = [(NSDictionary *)item objectForKey: @"label"]; return [self labelForKey:key]; } - (void) setCycleUntilDate: (NSCalendarDate *) _cycleUntilDate { // NSCalendarDate *until; // /* copy hour/minute/second from startDate */ // until = [_cycleUntilDate hour: [startDate hourOfDay] // minute: [startDate minuteOfHour] // second: [startDate secondOfMinute]]; // [until setTimeZone: [startDate timeZone]]; // ASSIGN (cycleUntilDate, until); } - (NSCalendarDate *) cycleUntilDate { return cycleUntilDate; } - (iCalRecurrenceRule *) rrule { NSString *ruleRep; iCalRecurrenceRule *rule; if (![self hasCycle]) return nil; ruleRep = [cycle objectForKey: @"rule"]; rule = [iCalRecurrenceRule recurrenceRuleWithICalRepresentation:ruleRep]; if (cycleUntilDate && [self isCycleEndUntil]) [rule setUntilDate:cycleUntilDate]; return rule; } - (void) adjustCycleControlsForRRule: (iCalRecurrenceRule *) _rrule { // NSDictionary *c; // NSCalendarDate *until; // c = [self cycleMatchingRRule:_rrule]; // [self setCycle:c]; // until = [[[_rrule untilDate] copy] autorelease]; // if (!until) // until = startDate; // else // [self setIsCycleEndUntil]; // [until setTimeZone:[[self clientObject] userTimeZone]]; // [self setCycleUntilDate:until]; } /* This method is necessary, because we have a fixed sets of cycles in the UI. The model is able to represent arbitrary rules, however. There SHOULD be a different UI, similar to iCal.app, to allow modelling of more complex rules. This method obviously cannot map all existing rules back to the fixed list in cycles.plist. This should be fixed in a future version when interop becomes more important. */ - (NSDictionary *) cycleMatchingRRule: (iCalRecurrenceRule *) _rrule { NSString *cycleRep; NSArray *cycles; NSUInteger i, count; if (!_rrule) return [[self cycles] objectAtIndex:0]; cycleRep = [_rrule versitString]; cycles = [self cycles]; count = [cycles count]; for (i = 1; i < count; i++) { NSDictionary *c; NSString *cr; c = [cycles objectAtIndex:i]; cr = [c objectForKey: @"rule"]; if ([cr isEqualToString:cycleRep]) return c; } [self warnWithFormat: @"No default cycle for rrule found! -> %@", _rrule]; return nil; } /* cycle "ends" - supposed to be 'never', 'COUNT' or 'UNTIL' */ - (NSArray *) cycleEnds { static NSArray *ends = nil; if (!ends) { ends = [NSArray arrayWithObjects: @"cycle_end_never", @"cycle_end_until", nil]; [ends retain]; } return ends; } - (void) setCycleEnd: (NSString *) _cycleEnd { ASSIGN (cycleEnd, _cycleEnd); } - (NSString *) cycleEnd { return cycleEnd; } - (BOOL) isCycleEndUntil { return (cycleEnd && [cycleEnd isEqualToString: @"cycle_end_until"]); } - (void) setIsCycleEndUntil { [self setCycleEnd: @"cycle_end_until"]; } - (void) setIsCycleEndNever { [self setCycleEnd: @"cycle_end_never"]; } ////////////////////////////////// JUNK //////////////////////////////////////// ////////////////////////////////// JUNK //////////////////////////////////////// ////////////////////////////////// JUNK //////////////////////////////////////// /* helpers */ - (NSString *) completeURIForMethod: (NSString *) _method { NSString *uri; NSRange r; uri = [[[self context] request] uri]; /* first: identify query parameters */ r = [uri rangeOfString: @"?" options:NSBackwardsSearch]; if (r.length > 0) uri = [uri substringToIndex:r.location]; /* next: append trailing slash */ if (![uri hasSuffix: @"/"]) uri = [uri stringByAppendingString: @"/"]; /* next: append method */ uri = [uri stringByAppendingString:_method]; /* next: append query parameters */ return [self completeHrefForMethod:uri]; } - (BOOL) isWriteableClientObject { return [[self clientObject] respondsToSelector: @selector(saveContentString:)]; } /* access */ - (BOOL) isMyComponent { return ([[context activeUser] hasEmail: [organizer rfc822Email]]); } - (BOOL) canEditComponent { return [self isMyComponent]; } /* response generation */ - (NSString *) initialCycleVisibility { return ([self hasCycle] ? @"visibility: visible;" : @"visibility: hidden;"); } - (NSString *) initialCycleEndUntilVisibility { return ([self isCycleEndUntil] ? @"visibility: visible;" : @"visibility: hidden;"); } // - (NSString *) iCalParticipantsAndResourcesStringFromQueryParameters // { // NSString *s; // s = [self iCalParticipantsStringFromQueryParameters]; // return [s stringByAppendingString: // [self iCalResourcesStringFromQueryParameters]]; // } // - (NSString *) iCalParticipantsStringFromQueryParameters // { // static NSString *iCalParticipantString = @"ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;CN=\"%@\":MAILTO:%@\r\n"; // return [self iCalStringFromQueryParameter: @"ps" // format: iCalParticipantString]; // } // - (NSString *) iCalResourcesStringFromQueryParameters // { // static NSString *iCalResourceString = @"ATTENDEE;ROLE=NON-PARTICIPANT;CN=\"%@\":MAILTO:%@\r\n"; // return [self iCalStringFromQueryParameter: @"rs" // format: iCalResourceString]; // } // - (NSString *) iCalStringFromQueryParameter: (NSString *) _qp // format: (NSString *) _format // { // LDAPUserManager *um; // NSMutableString *iCalRep; // NSString *s; // um = [LDAPUserManager sharedUserManager]; // iCalRep = (NSMutableString *)[NSMutableString string]; // s = [self queryParameterForKey:_qp]; // if(s && [s length] > 0) { // NSArray *es; // NSUInteger i, count; // es = [s componentsSeparatedByString: @","]; // count = [es count]; // for(i = 0; i < count; i++) { // NSString *email, *cn; // email = [es objectAtIndex:i]; // cn = [um getCNForUID:[um getUIDForEmail:email]]; // [iCalRep appendFormat:_format, cn, email]; // } // } // return iCalRep; // } - (NSException *) validateObjectForStatusChange { id co; co = [self clientObject]; if (![co respondsToSelector: @selector(changeParticipationStatus:)]) return [NSException exceptionWithHTTPStatus: 400 /* Bad Request */ reason: @"method cannot be invoked on the specified object"]; return nil; } /* contact editor compatibility */ /*- (NSString *) urlButtonClasses { NSString *classes; if ([url length]) classes = @"button"; else classes = @"button _disabled"; return classes; }*/ - (void) _handleAttendeesEdition { NSMutableArray *newAttendees; NSUInteger count, max; NSString *currentEmail; iCalPerson *currentAttendee; NSString *json, *role, *partstat; NSDictionary *attendeesData; NSArray *attendees; NSDictionary *currentData; WORequest *request; request = [context request]; json = [request formValueForKey: @"attendees"]; if ([json length]) { attendees = [NSArray array]; attendeesData = [json objectFromJSONString]; if (attendeesData && [attendeesData isKindOfClass: [NSDictionary class]]) { newAttendees = [NSMutableArray array]; attendees = [attendeesData allValues]; max = [attendees count]; for (count = 0; count < max; count++) { currentData = [attendees objectAtIndex: count]; currentEmail = [currentData objectForKey: @"email"]; if ([currentEmail length] > 0) { role = [[currentData objectForKey: @"role"] uppercaseString]; if (!role) role = @"REQ-PARTICIPANT"; if ([role isEqualToString: @"NON-PARTICIPANT"]) partstat = @""; else { partstat = [[currentData objectForKey: @"partstat"] uppercaseString]; if (!partstat) partstat = @"NEEDS-ACTION"; } currentAttendee = [component findAttendeeWithEmail: currentEmail]; if (!currentAttendee) { currentAttendee = [iCalPerson elementWithTag: @"attendee"]; [currentAttendee setCn: [currentData objectForKey: @"name"]]; [currentAttendee setEmail: currentEmail]; // [currentAttendee // setParticipationStatus: iCalPersonPartStatNeedsAction]; } [currentAttendee setRsvp: ([role isEqualToString: @"NON-PARTICIPANT"] ? @"FALSE" : @"TRUE")]; [currentAttendee setRole: role]; [currentAttendee setPartStat: partstat]; [newAttendees addObject: currentAttendee]; } } [component setAttendees: newAttendees]; } else NSLog(@"Error scanning following JSON:\n%@", json); } } - (void) _handleOrganizer { NSString *owner, *login, *currentEmail; BOOL isOwner, hasAttendees; //owner = [[self clientObject] ownerInContext: context]; owner = [componentCalendar ownerInContext: context]; login = [[context activeUser] login]; isOwner = [owner isEqualToString: login]; hasAttendees = [self hasAttendees]; currentEmail = [[[context activeUser] allEmails] objectAtIndex: 0]; if (hasAttendees) { SOGoUser *user; id identity; ASSIGN (organizer, [iCalPerson elementWithTag: @"organizer"]); [component setOrganizer: organizer]; user = [SOGoUser userWithLogin: owner roles: nil]; identity = [user defaultIdentity]; [organizer setCn: [identity objectForKey: @"fullName"]]; [organizer setEmail: [identity objectForKey: @"email"]]; if (!isOwner) { NSString *quotedEmail; quotedEmail = [NSString stringWithFormat: @"\"MAILTO:%@\"", currentEmail]; [organizer setValue: 0 ofAttribute: @"SENT-BY" to: quotedEmail]; } } else { organizer = nil; } [component setOrganizer: organizer]; // In case of a new component, if the current user isn't the owner of the calendar, we // add the "X-SOGo-Component-Created-By: " attribute if ([[self clientObject] isNew] && !isOwner && [currentEmail length]) { [component addChild: [CardElement simpleElementWithTag: @"X-SOGo-Component-Created-By" value: currentEmail]]; } } - (void) _handleCustomRRule: (iCalRecurrenceRule *) theRule { int type, range; NSMutableArray *values; // We decode the range range = [[self range1] intValue]; // Create X appointments if (range == 1) { [theRule setRepeatCount: [[self range2] intValue]]; } // Repeat until date else if (range == 2) { NSCalendarDate *date; SOGoUserDefaults *ud; date = [NSCalendarDate dateWithString: [self range2] calendarFormat: dateFormat locale: locale]; // Adjust timezone ud = [[context activeUser] userDefaults]; date = [NSCalendarDate dateWithYear: [date yearOfCommonEra] month: [date monthOfYear] day: [date dayOfMonth] hour: 0 minute: 0 second: 0 timeZone: [ud timeZone]]; [theRule setUntilDate: date]; } // No end date. else { // Do nothing? } // We decode the type and the rest accordingly. type = [[self repeatType] intValue]; switch (type) { // DAILY (0) // // repeat1 holds the value of the frequency radio button: // 0 -> Every X days // 1 -> Every weekday // // repeat2 holds the value of X when repeat1 equals 0 // case 0: { [theRule setFrequency: iCalRecurrenceFrequenceDaily]; if ([[self repeat1] intValue] > 0) { [theRule setByDayMask: [iCalByDayMask byDayMaskWithWeekDays]]; } else { // Make sure we haven't received any junk.... if ([[self repeat2] intValue] < 1) [self setRepeat2: @"1"]; [theRule setInterval: [self repeat2]]; } } break; // WEEKLY (1) // // repeat1 holds the value of "Every X week(s)" // // repeat2 holds which days are part of the recurrence rule // 1 -> Monday // 2 -> Tuesday .. and so on. // The list is separated by commas, like: 1,3,4 case 1: { if ([[self repeat1] intValue] > 0) { NSArray *v; int c, day; iCalWeekOccurrences days; [theRule setFrequency: iCalRecurrenceFrequenceWeekly]; [theRule setInterval: [self repeat1]]; if ([[self repeat2] length]) { v = [[self repeat2] componentsSeparatedByString: @","]; c = [v count]; memset(days, 0, 7 * sizeof(iCalWeekOccurrence)); while (c--) { day = [[v objectAtIndex: c] intValue]; if (day >= 0 && day <= 7) days[day] = iCalWeekOccurrenceAll; } [theRule setByDayMask: [iCalByDayMask byDayMaskWithDays: days]]; } } } break; // MONTHLY (2) // // repeat1 holds the value of "Every X month(s)" // // repeat2 holds the value of the radio-button "The" / "Recur on day(s)" // 0 -> The // 1 -> Recur on day(s) // // repeat3 holds the value of the first popup // 0 -> First // 1 -> Second ... and so on. // // repeat4 holds the value of the second popop // 0 -> Sunday // 1 -> Monday ... and so on. // 7 -> Day of the month // // repeat5 holds the selected days when "Recur on day(s)" // is chosen. The value starts at 1. // case 2: { if ([[self repeat1] intValue] > 0) { [theRule setFrequency: iCalRecurrenceFrequenceMonthly]; [theRule setInterval: [self repeat1]]; // We recur on specific days... if ([[self repeat2] intValue] == 0) { NSString *day; int occurence; day = [theRule iCalRepresentationForWeekDay: [[self repeat4] intValue]]; occurence = [[self repeat3] intValue] + 1; if (occurence > 5) // the first/second/third/fourth/fifth .. occurence = -1; // the last .. [theRule setSingleValue: [NSString stringWithFormat: @"%d%@", occurence, day] forKey: @"byday"]; } else { if ([[self repeat5] intValue] > 0) { values = [[[self repeat5] componentsSeparatedByString: @","] mutableCopy]; [theRule setValues: values atIndex: 0 forKey: @"bymonthday"]; [values release]; } } } } break; // YEARLY (3) // // repeat1 holds the value of "Every X year(s)" // // repeat2 holds the value of the radio-button "Every" / "Every .. of .." // 0 -> Every // 1 -> Every .. of .. // // repeat3 holds the value of the DAY parameter // repeat4 holds the value of the MONTH parameter (0 -> January, 1 -> February ... ) // ex: 3 February // // repeat5 holds the value of the OCCURENCE parameter (0 -> First, 1 -> Second .., 5 -> Last) // repeat6 holds the value of the DAY parameter (0 -> Sunday, 1 -> Monday, etc..) // repeat7 holds the value of the MONTH parameter (0 -> January, 1 -> February ... ) // case 3: default: { if ([[self repeat1] intValue] > 0) { [theRule setFrequency: iCalRecurrenceFrequenceYearly]; [theRule setInterval: [self repeat1]]; // We recur Every .. of .. if ([[self repeat2] intValue] == 1) { NSString *day; int occurence; day = [theRule iCalRepresentationForWeekDay: [[self repeat6] intValue]]; occurence = [[self repeat5] intValue] + 1; if (occurence > 5) // the first/second/third/fourth/fifth .. occurence = -1; // the last .. [theRule setSingleValue: [NSString stringWithFormat: @"%d%@", occurence, day] forKey: @"byday"]; [theRule setSingleValue: [NSString stringWithFormat: @"%d", [[self repeat7] intValue] + 1] forKey: @"bymonth"]; } else { if ([[self repeat3] intValue] > 0 && [[self repeat4] intValue] > 0) { values = [[[self repeat3] componentsSeparatedByString: @","] mutableCopy]; [theRule setValues: values atIndex: 0 forKey: @"bymonthday"]; [values release]; [theRule setSingleValue: [NSString stringWithFormat: @"%d", [[self repeat4] intValue] + 1] forKey: @"bymonth"]; } } } } break; } } - (void) _appendAttendees: (NSArray *) attendees toEmailAlarm: (iCalAlarm *) alarm { NSMutableArray *aAttendees; int count, max; iCalPerson *currentAttendee, *aAttendee; max = [attendees count]; aAttendees = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { currentAttendee = [attendees objectAtIndex: count]; aAttendee = [iCalPerson elementWithTag: @"attendee"]; [aAttendee setCn: [currentAttendee cn]]; [aAttendee setEmail: [currentAttendee rfc822Email]]; [aAttendees addObject: aAttendee]; } [alarm setAttendees: aAttendees]; } - (void) _appendOrganizerToEmailAlarm: (iCalAlarm *) alarm { NSString *uid; NSDictionary *ownerIdentity; iCalPerson *aAttendee; uid = [[self clientObject] ownerInContext: context]; ownerIdentity = [[SOGoUser userWithLogin: uid roles: nil] defaultIdentity]; aAttendee = [iCalPerson elementWithTag: @"attendee"]; [aAttendee setCn: [ownerIdentity objectForKey: @"fullName"]]; [aAttendee setEmail: [ownerIdentity objectForKey: @"email"]]; [alarm addChild: aAttendee]; } - (void) takeValuesFromRequest: (WORequest *) _rq inContext: (WOContext *) _ctx { SOGoCalendarComponent *clientObject; iCalRecurrenceRule *rule; NSCalendarDate *now; [super takeValuesFromRequest: _rq inContext: _ctx]; now = [NSCalendarDate calendarDate]; [component setSummary: title]; [component setLocation: location]; [component setComment: comment]; [component setAttach: attachUrl]; [component setAccessClass: classification]; [component setCategories: categories]; [self _handleAttendeesEdition]; [self _handleOrganizer]; clientObject = [self clientObject]; if ([clientObject isNew]) { [component setCreated: now]; [component setTimeStampAsDate: now]; } [component setPriority: priority]; [component setLastModified: now]; if (!reminder || [reminder caseInsensitiveCompare: @"-"] == NSOrderedSame) // No alarm selected -- if there was an unsupported alarm defined in // the event, it will be deleted. [component removeAllAlarms]; else { iCalTrigger *aTrigger; iCalAlarm *anAlarm; NSString *aValue; NSUInteger index; anAlarm = [iCalAlarm new]; index = [reminderItems indexOfObject: reminder]; aTrigger = [iCalTrigger elementWithTag: @"TRIGGER"]; [aTrigger setValueType: @"DURATION"]; [anAlarm setTrigger: aTrigger]; aValue = [reminderValues objectAtIndex: index]; if ([aValue length]) { // Predefined alarm [anAlarm setAction: @"DISPLAY"]; [aTrigger setSingleValue: aValue forKey: @""]; } else { // Custom alarm if ([reminderAction length] > 0 && [reminderUnit length] > 0) { [anAlarm setAction: [reminderAction uppercaseString]]; if ([reminderAction isEqualToString: @"email"]) { [anAlarm removeAllAttendees]; if (reminderEmailAttendees) [self _appendAttendees: [component attendees] toEmailAlarm: anAlarm]; if (reminderEmailOrganizer) [self _appendOrganizerToEmailAlarm: anAlarm]; [anAlarm setSummary: [component summary]]; [anAlarm setComment: [component comment]]; } if ([reminderReference caseInsensitiveCompare: @"BEFORE"] == NSOrderedSame) aValue = [NSString stringWithString: @"-P"]; else aValue = [NSString stringWithString: @"P"]; if ([reminderUnit caseInsensitiveCompare: @"MINUTES"] == NSOrderedSame || [reminderUnit caseInsensitiveCompare: @"HOURS"] == NSOrderedSame) aValue = [aValue stringByAppendingString: @"T"]; aValue = [aValue stringByAppendingFormat: @"%i%@", [reminderQuantity intValue], [reminderUnit substringToIndex: 1]]; [aTrigger setSingleValue: aValue forKey: @""]; [aTrigger setRelationType: reminderRelation]; } else { [anAlarm release]; anAlarm = nil; } } if (anAlarm) { [component removeAllAlarms]; [component addToAlarms: anAlarm]; [anAlarm release]; } } if (![self isChildOccurence]) { // We remove any repeat rules if (!repeat && [component hasRecurrenceRules]) [component removeAllRecurrenceRules]; else if ([repeat caseInsensitiveCompare: @"-"] != NSOrderedSame) { rule = [iCalRecurrenceRule new]; [rule setInterval: @"1"]; if ([repeat caseInsensitiveCompare: @"BI-WEEKLY"] == NSOrderedSame) { [rule setFrequency: iCalRecurrenceFrequenceWeekly]; [rule setInterval: @"2"]; } else if ([repeat caseInsensitiveCompare: @"EVERY WEEKDAY"] == NSOrderedSame) { [rule setByDayMask: [iCalByDayMask byDayMaskWithWeekDays]]; [rule setFrequency: iCalRecurrenceFrequenceDaily]; } else if ([repeat caseInsensitiveCompare: @"MONTHLY"] == NSOrderedSame || [repeat caseInsensitiveCompare: @"DAILY"] == NSOrderedSame || [repeat caseInsensitiveCompare: @"WEEKLY"] == NSOrderedSame || [repeat caseInsensitiveCompare: @"YEARLY"] == NSOrderedSame) { [rule setInterval: @"1"]; [rule setFrequency: (iCalRecurrenceFrequency) [rule valueForFrequency: repeat]]; } else { // We have a CUSTOM recurrence. Let's decode what kind of custome recurrence // we have and set that. [self _handleCustomRRule: rule]; } [component setRecurrenceRules: [NSArray arrayWithObject: rule]]; [rule release]; } } } #warning the following methods probably share some code... - (NSString *) _toolbarForOwner: (SOGoUser *) ownerUser andClientObject: (SOGoContentObject *) clientObject { NSString *toolbarFilename; BOOL isOrganizer; // We determine if we're the organizer of the component beeing modified. // If we created an event on behalf of someone else -userIsOrganizer will // return us YES. This is OK because we're in the SENT-BY. But, Alice // should be able to accept/decline an invitation if she created the event // in Bob's calendar and added herself in the attendee list. isOrganizer = [component userIsOrganizer: ownerUser]; if (isOrganizer) isOrganizer = ![ownerUser hasEmail: [[component organizer] sentBy]]; if ([componentCalendar isKindOfClass: [SOGoWebAppointmentFolder class]] || ([component userIsAttendee: ownerUser] && !isOrganizer // Lightning does not manage participation status within tasks, // so we also ignore the participation status of tasks in the // web interface. && ![[component tag] isEqualToString: @"VTODO"])) toolbarFilename = @"SOGoEmpty.toolbar"; else { if ([clientObject isKindOfClass: [SOGoAppointmentObject class]] || [clientObject isKindOfClass: [SOGoAppointmentOccurence class]]) toolbarFilename = @"SOGoAppointmentObject.toolbar"; else toolbarFilename = @"SOGoTaskObject.toolbar"; } return toolbarFilename; } - (NSString *) _toolbarForDelegate: (SOGoUser *) ownerUser andClientObject: (SOGoContentObject *) clientObject { SoSecurityManager *sm; NSString *toolbarFilename; sm = [SoSecurityManager sharedSecurityManager]; if (![sm validatePermission: SOGoCalendarPerm_ModifyComponent onObject: clientObject inContext: context]) toolbarFilename = [self _toolbarForOwner: ownerUser andClientObject: clientObject]; else toolbarFilename = @"SOGoEmpty.toolbar"; return toolbarFilename; } - (NSString *) toolbar { SOGoContentObject *clientObject; NSString *toolbarFilename; SOGoUser *ownerUser; clientObject = [self clientObject]; ownerUser = [SOGoUser userWithLogin: [clientObject ownerInContext: context] roles: nil]; if ([ownerUser isEqual: [context activeUser]]) toolbarFilename = [self _toolbarForOwner: ownerUser andClientObject: clientObject]; else toolbarFilename = [self _toolbarForDelegate: ownerUser andClientObject: clientObject]; return toolbarFilename; } - (int) ownerIsAttendee: (SOGoUser *) ownerUser andClientObject: (SOGoContentObject *) clientObject { BOOL isOrganizer; iCalPerson *ownerAttendee; int rc; rc = 0; isOrganizer = [component userIsOrganizer: ownerUser]; if (isOrganizer) isOrganizer = ![ownerUser hasEmail: [[component organizer] sentBy]]; if (!isOrganizer && ![[component tag] isEqualToString: @"VTODO"]) { ownerAttendee = [component userAsAttendee: ownerUser]; if (ownerAttendee) rc = 1; } return rc; } - (int) delegateIsAttendee: (SOGoUser *) ownerUser andClientObject: (SOGoContentObject *) clientObject { SoSecurityManager *sm; iCalPerson *ownerAttendee; int rc; rc = 0; sm = [SoSecurityManager sharedSecurityManager]; if (![sm validatePermission: SOGoCalendarPerm_ModifyComponent onObject: clientObject inContext: context]) rc = [self ownerIsAttendee: ownerUser andClientObject: clientObject]; else if (![sm validatePermission: SOGoCalendarPerm_RespondToComponent onObject: clientObject inContext: context]) { ownerAttendee = [component userAsAttendee: ownerUser]; if ([[ownerAttendee rsvp] isEqualToString: @"true"] && ![component userIsOrganizer: ownerUser]) rc = 1; else rc = 2; } else rc = 2; // not invited, just RO return rc; } - (int) getEventRWType { SOGoContentObject *clientObject; SOGoUser *ownerUser; int rc; clientObject = [self clientObject]; ownerUser = [SOGoUser userWithLogin: [clientObject ownerInContext: context]]; if ([componentCalendar isKindOfClass: [SOGoWebAppointmentFolder class]]) rc = 2; else { if ([ownerUser isEqual: [context activeUser]]) rc = [self ownerIsAttendee: ownerUser andClientObject: clientObject]; else rc = [self delegateIsAttendee: ownerUser andClientObject: clientObject]; } return rc; } - (BOOL) eventIsReadOnly { return [self getEventRWType] != 0; } - (NSString *) emailAlarmsEnabled { SOGoSystemDefaults *sd; sd = [SOGoSystemDefaults sharedSystemDefaults]; return ([sd enableEMailAlarms] ? @"true" : @"false"); } - (BOOL) userHasRSVP { return ([self getEventRWType] == 1); } - (NSString *) currentAttendeeClasses { NSMutableArray *classes; iCalPerson *ownerAttendee; SOGoUser *ownerUser; NSString *role, *partStat; SOGoCalendarComponent *co; classes = [NSMutableArray arrayWithCapacity: 5]; /* rsvp class */ if (![[attendee rsvp] isEqualToString: @"true"]) [classes addObject: @"not-rsvp"]; /* partstat class */ partStat = [[attendee partStat] lowercaseString]; if (![partStat length]) partStat = @"no-partstat"; [classes addObject: partStat]; /* role class */ role = [[attendee role] lowercaseString]; if (![partStat length]) role = @"no-role"; [classes addObject: role]; /* attendee class */ if ([[attendee delegatedFrom] length] > 0) [classes addObject: @"delegate"]; /* current attendee class */ co = [self clientObject]; ownerUser = [SOGoUser userWithLogin: [co ownerInContext: context]]; ownerAttendee = [component userAsAttendee: ownerUser]; if (attendee == ownerAttendee) [classes addObject: @"attendeeUser"]; return [classes componentsJoinedByString: @" "]; } - (NSString *) ownerLogin { return [[self clientObject] ownerInContext: context]; } - (unsigned int) firstDayOfWeek { SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; return [ud firstDayOfWeek]; } // returns the raw content of the object - (WOResponse *) rawAction { NSMutableString *content; WOResponse *response; content = [NSMutableString string]; response = [context response]; [content appendFormat: [[self clientObject] contentAsString]]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; [response appendContentString: content]; return response; } @end SOGo-2.1.1b/UI/Scheduler/UIxDatePicker.h0000644000000000000000000000235612247657030016243 0ustar rootroot/* UIxDatePicker.h - this file is part of SOGo * * Copyright (C) 2009 Inverse inc. * * Author: Francis Lachapelle * * 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 UIXDATEPICKER_H #define UIXDATEPICKER_H #import @class NSString; @interface UIxDatePicker : WOComponent { NSString *dateID; id day; id month; id year; NSString *label; BOOL isDisabled; } - (NSString *) dateID; - (NSString *) dateFormat; - (NSString *) jsDateFormat; - (BOOL) useISOFormats; @end #endif /* UIXDATEPICKER_H */ SOGo-2.1.1b/UI/Scheduler/UIxAppointmentActions.m0000644000000000000000000001450112247657030020047 0ustar rootroot/* UIxAppointmentActions.m - this file is part of SOGo * * Copyright (C) 2011 Inverse inc. * * 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import "UIxAppointmentActions.h" @implementation UIxAppointmentActions - (WOResponse *) adjustAction { WOResponse *response; WORequest *rq; SOGoAppointmentObject *co; iCalEvent *event; NSCalendarDate *start, *newStart, *end, *newEnd; NSTimeInterval newDuration; SOGoUserDefaults *ud; NSString *daysDelta, *startDelta, *durationDelta; NSTimeZone *tz; rq = [context request]; daysDelta = [rq formValueForKey: @"days"]; startDelta = [rq formValueForKey: @"start"]; durationDelta = [rq formValueForKey: @"duration"]; if ([daysDelta length] > 0 || [startDelta length] > 0 || [durationDelta length] > 0) { co = [self clientObject]; event = (iCalEvent *) [[self clientObject] occurence]; start = [event startDate]; end = [event endDate]; if ([event isAllDay]) { newStart = [start dateByAddingYears: 0 months: 0 days: [daysDelta intValue] hours: 0 minutes: 0 seconds: 0]; newDuration = (((float) abs ([end timeIntervalSinceDate: start]) + [durationDelta intValue] * 60) / 86400); [event setAllDayWithStartDate: newStart duration: newDuration]; } else { ud = [[context activeUser] userDefaults]; tz = [ud timeZone]; [start setTimeZone: tz]; [end setTimeZone: tz]; newStart = [start dateByAddingYears: 0 months: 0 days: [daysDelta intValue] hours: 0 minutes: [startDelta intValue] seconds: 0]; newDuration = ([end timeIntervalSinceDate: start] + [durationDelta intValue] * 60); newEnd = [newStart addTimeInterval: newDuration]; [event setStartDate: newStart]; [event setEndDate: newEnd]; } if ([event hasRecurrenceRules]) [event updateRecurrenceRulesUntilDate: end]; [event setLastModified: [NSCalendarDate calendarDate]]; [co saveComponent: event]; response = [self responseWith204]; } else response = (WOResponse *) [NSException exceptionWithHTTPStatus: 400 reason: @"missing 'days', 'start' and/or 'duration' parameters"]; return response; } - (WOResponse *) copyAction { NSString *destination; NSArray *events; iCalCalendar *calendar; iCalRepeatableEntityObject *masterOccurence; SOGoAppointmentObject *thisEvent; SOGoAppointmentFolder *sourceCalendar, *destinationCalendar; SoSecurityManager *sm; WOResponse *response; WORequest *rq; rq = [context request]; destination = [rq formValueForKey: @"destination"]; if (![destination length]) destination = @"personal"; thisEvent = [self clientObject]; sourceCalendar = [thisEvent container]; destinationCalendar = [[sourceCalendar container] lookupName: destination inContext: context acquire: NO]; if (destinationCalendar) { // Verify access rights to destination calendar sm = [SoSecurityManager sharedSecurityManager]; if ([sm validatePermission: SoPerm_AddDocumentsImagesAndFiles onObject: destinationCalendar inContext: context]) { response = [NSException exceptionWithHTTPStatus: 403 reason: @"Can't add event to destination calendar."]; } // Verify that the destination calendar is not the source calendar else if ([[destinationCalendar nameInContainer] isEqualToString: [sourceCalendar nameInContainer]]) { response = [NSException exceptionWithHTTPStatus: 400 reason: @"Destination calendar is the source calendar."]; } else { // Remove attendees, recurrence exceptions and single occurences from the event calendar = [thisEvent calendar: NO secure: NO]; events = [calendar events]; masterOccurence = [events objectAtIndex: 0]; if ([masterOccurence hasAlarms]) [masterOccurence removeAllAlarms]; if ([masterOccurence hasRecurrenceRules]) { [masterOccurence removeAllExceptionRules]; [masterOccurence removeAllExceptionDates]; } if ([[masterOccurence attendees] count] > 0) { [masterOccurence setOrganizer: nil]; [masterOccurence removeAllAttendees]; } [calendar setUniqueChild: masterOccurence]; // Perform the copy if ([thisEvent copyComponent: calendar toFolder: (SOGoGCSFolder *) destinationCalendar]) response = [NSException exceptionWithHTTPStatus: 500 reason: @"Can't copy event to destination calendar."]; else response = [self responseWith204]; } } else { response = [NSException exceptionWithHTTPStatus: 404 reason: @"Can't find destination calendar."]; } return response; } @end SOGo-2.1.1b/UI/Scheduler/German.lproj/0000755000000000000000000000000012247657030015761 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/German.lproj/Localizable.strings0000644000000000000000000004250512247657030021623 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Neuen Termin erstellen"; "Create a new task" = "Neue Aufgabe erstellen"; "Edit this event or task" = "Gewählten Termin oder Aufgabe bearbeiten"; "Delete this event or task" = "Gewählten Termin oder Aufgabe löschen "; "Go to today" = "Zu Heute springen"; "Switch to day view" = "Zur Tagesansicht wechseln"; "Switch to week view" = "Zur Wochenansicht wechseln"; "Switch to month view" = "Zur Monatsansicht wechseln"; "Reload all calendars" = "Alle Kalender neu laden"; /* Tabs */ "Date" = "Datum"; "Calendars" = "Kalenderliste"; /* Day */ "DayOfTheMonth" = "Monatstag"; "dayLabelFormat" = "%d.%m.%Y"; "today" = "Heute"; "Previous Day" = "Vorheriger Tag"; "Next Day" = "Nächster Tag"; /* Week */ "Week" = "Woche"; "this week" = "diese Woche"; "Week %d" = "Woche %d"; "Previous Week" = "Vorherige Woche"; "Next Week" = "Nächste Woche"; /* Month */ "this month" = "dieser Monat"; "Previous Month" = "Vorheriger Monat"; "Next Month" = "Nächster Monat"; /* Year */ "this year" = "dieses Jahr"; /* Menu */ "Calendar" = "Kalender"; "Contacts" = "Kontakte"; "New Calendar..." = "Neuer Kalender..."; "Delete Calendar" = "Kalender löschen"; "Unsubscribe Calendar" = "Kalender abbestellen"; "Sharing..." = "Benutzerrechte..."; "Export Calendar..." = "Kalender exportieren..."; "Import Events..." = "Termine importieren..."; "Import Events" = "Termine importieren"; "Select an iCalendar file (.ics)." = "Wählen Sie eine iCalendar-Datei (.ics)."; "Upload" = "Hochladen"; "Uploading" = "Hochladen"; "Publish Calendar..." = "Kalender publizieren..."; "Reload Remote Calendars" = "Externe Kalender neu laden"; "Properties" = "Einstellungen"; "Done" = "Fertig"; "An error occurred while importing calendar." = "Fehler während des Importierens von Terminen."; "No event was imported." = "Es wurden keine Termine importiert."; "A total of %{0} events were imported in the calendar." = "%{0} Termine wurden in den Kalender importiert."; "Compose E-Mail to All Attendees" = "E-Mail an alle Teilnehmer erstellen"; "Compose E-Mail to Undecided Attendees" = "E-Mail an unentschlossene Teilnehmer erstellen"; /* Folders */ "Personal calendar" = "Persönlicher Kalender"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Zugriff verboten"; /* acls */ "Access rights to" = "Zugriffsrechte für"; "For user" = "Für Benutzer"; "Any Authenticated User" = "Alle authentifizierten Benutzer"; "Public Access" = "Öffentlicher Zugang"; "label_Public" = "Öffentlich"; "label_Private" = "Privat"; "label_Confidential" = "Vertraulich"; "label_Viewer" = "Alles sehen"; "label_DAndTViewer" = "Datum & Uhrzeit sehen"; "label_Modifier" = "Ändern"; "label_Responder" = "Antworten"; "label_None" = "Keine"; "View All" = "Alles sehen"; "View the Date & Time" = "Datum & Uhrzeit sehen"; "Modify" = "Ändern"; "Respond To" = "Antworten"; "None" = "Keine"; "This person can create objects in my calendar." = "Diese Person kann Objekte in meinen Kalender hinzufügen."; "This person can erase objects from my calendar." = "Diese Person kann Objekte in meinem Kalender löschen."; /* Button Titles */ "Subscribe to a Calendar..." = "Einen Kalender abonnieren..."; "Remove the selected Calendar" = "Gewählten Kalender löschen"; "Name of the Calendar" = "Name des Kalenders"; "new" = "Neu"; "printview" = "Druckversion"; "edit" = "Bearbeiten"; "delete" = "Löschen"; "proposal" = "Vorschlag"; "Save and Close" = "Speichern und Schließen"; "Close" = "Schließen"; "Invite Attendees" = "Teilnehmer einladen"; "Attach" = "Anhang"; "Update" = "Speichern"; "Cancel" = "Abbrechen"; "show_rejected_apts" = "Abgelehnte Termine anzeigen"; "hide_rejected_apts" = "Abgelehnte Termine ausblenden"; /* Schedule */ "Schedule" = "Terminplan"; "No appointments found" = "Keine Termine gefunden"; "Meetings proposed by you" = "Von Ihnen vorgeschlagene Termine"; "Meetings proposed to you" = "Von Anderen vorgeschlagene Termine"; "sched_startDateFormat" = "%d.%m %H:%M"; "action" = "Aktion"; "accept" = "Annehmen"; "decline" = "Ablehnen"; "more attendees" = "Weitere Teilnehmer"; "Hide already accepted and rejected appointments" = "Abgelehnte und angenommene Termine ausblenden"; "Show already accepted and rejected appointments" = "Abgelehnte und angenommene Termine anzeigen"; /* Appointments */ "Appointment viewer" = "Termin Anzeige"; "Appointment editor" = "Termin Bearbeiten"; "Appointment proposal" = "Termin Vorschlag"; "Appointment on" = "Termin am"; "Start:" = "Beginn:"; "End:" = "Ende:"; "Due Date:" = "Fällig:"; "Title:" = "Titel:"; "Calendar:" = "Kalender:"; "Name" = "Name"; "Email" = "E-Mail"; "Status:" = "Status:"; "% complete" = "% fertig"; "Location:" = "Ort: "; "Priority:" = "Priorität: "; "Privacy" = "Datenschutz"; "Cycle" = "Wiederholen"; "Cycle End" = "Wiederholungsende"; "Categories" = "Kategorien"; "Classification" = "Einordnung"; "Duration" = "Dauer"; "Attendees:" = "Teilnehmer:"; "Resources" = "Ressourcen"; "Organizer:" = "Organisator:"; "Description:" = "Beschreibung:"; "Document:" = "Dokument:"; "Category:" = "Kategorie:"; "Repeat:" = "Wiederholen:"; "Reminder:" = "Erinnerung:"; "General:" = "Generell:"; "Reply:" = "Antwort:"; "Created by:" = "Erstellt von:"; "Target:" = "Ziel:"; "attributes" = "Attribute"; "attendees" = "Teilnehmer"; "delegated from" = "delegiert von"; /* checkbox title */ "is private" = "Privater Termin"; /* classification */ "Public" = "Öffentlich"; "Private" = "Privat"; /* text used in overviews and tooltips */ "empty title" = "Kein Titel"; "private appointment" = "Privater Termin"; "Change..." = "Bearbeiten..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Ich entscheide später"; "partStat_ACCEPTED" = "Ich nehme teil"; "partStat_DECLINED" = "Ich nehme nicht teil"; "partStat_TENTATIVE" = "Ich nehme eventuell teil"; "partStat_DELEGATED" = "Ich schicke einen Vertreter"; "partStat_OTHER" = "Sonstiges"; /* Appointments (error messages) */ "Conflicts found!" = "Ein order mehrere Konflikte wurden gefunden!"; "Invalid iCal data!" = "Ungültige iCal-Daten!"; "Could not create iCal data!" = "iCal-Daten konnten nicht erstellt werden!"; /* Searching */ "view_all" = "Alle Termine"; "view_today" = "Heutige Termine"; "view_next7" = "Termine in den nächsten 7 Tagen"; "view_next14" = "Termine in den nächsten 14 Tagen"; "view_next31" = "Termine in den nächsten 31 Tagen"; "view_thismonth" = "Termine in diesem Kalendermonat"; "view_future" = "Alle zukünftigen Termine"; "view_selectedday" = "Momentan gewählter Tag"; "View:" = "Anzeigen:"; "Title or Description" = "Titel oder Beschreibung"; "Search" = "Suchen"; "Search attendees" = "Teilnehmer suchen"; "Search resources" = "Ressourcen suchen"; "Search appointments" = "Termine suchen"; "All day Event" = "Ganztägiger Termin"; "check for conflicts" = "Auf Konflikte überprüfen"; "Browse URL" = "Gehe zu URL"; "newAttendee" = "Teilnehmer hinzufügen"; /* calendar modes */ "Overview" = "Übersicht"; "Chart" = "Tabelle"; "List" = "Liste"; "Columns" = "Spalten"; /* Priorities */ "prio_0" = "Nicht angegeben"; "prio_1" = "Hoch"; "prio_2" = "Hoch"; "prio_3" = "Hoch"; "prio_4" = "Hoch"; "prio_5" = "Mittel"; "prio_6" = "Niedrig"; "prio_7" = "Niedrig"; "prio_8" = "Niedrig"; "prio_9" = "Niedrig"; /* access classes (privacy) */ "PUBLIC_vevent" = "Öffentlicher Termin"; "CONFIDENTIAL_vevent" = "Vertraulicher Termin"; "PRIVATE_vevent" = "Privater Termin"; "PUBLIC_vtodo" = "Öffentliche Aufgabe"; "CONFIDENTIAL_vtodo" = "Vertrauliche Aufgabe"; "PRIVATE_vtodo" = "Private Aufgabe"; /* status type */ "status_" = "Nicht angegeben"; "status_NOT-SPECIFIED" = "Nicht angegeben"; "status_TENTATIVE" = "Vorläufig"; "status_CONFIRMED" = "Bestätigt"; "status_CANCELLED" = "Abgebrochen"; "status_NEEDS-ACTION" = "Benötigt Eingriff"; "status_IN-PROCESS" = "In Arbeit"; "status_COMPLETED" = "Abgeschlossen am"; /* Cycles */ "cycle_once" = "wiederholt sich nicht"; "cycle_daily" = "täglich"; "cycle_weekly" = "wöchentlich"; "cycle_2weeks" = "zweiwöchentlich"; "cycle_4weeks" = "vierwöchentlich"; "cycle_monthly" = "monatlich"; "cycle_weekday" = "jeden Arbeitstag"; "cycle_yearly" = "jährlich"; "cycle_end_never" = "Unendlich oft wiederholen"; "cycle_end_until" = "Wiederholen bis :"; "Recurrence pattern" = "Wiederholungsschema"; "Range of recurrence" = "Bereich der Wiederholung"; "Repeat" = "Wiederhole"; "Daily" = "Täglich"; "Weekly" = "Wöchentlich"; "Monthly" = "Monatlich"; "Yearly" = "Jährlich"; "Every" = "Jeden"; "Days" = "Tage"; "Week(s)" = "Woche(n)"; "On" = "Am"; "Month(s)" = "Monat(e)"; "The" = "Am"; "Recur on day(s)" = "Wiederholung an Tag(en) "; "Year(s)" = "Jahr(e)"; "cycle_of" = "im"; "No end date" = "Kein Enddatum"; "Create" = "Erstelle"; "appointment(s)" = "Termin(e)"; "Repeat until" = "Wiederhole bis"; "First" = "ersten"; "Second" = "zweiten"; "Third" = "dritten"; "Fourth" = "vierten"; "Fift" = "fünften"; "Last" = "letzten"; /* Appointment categories */ "category_none" = "Keine"; "category_labels" = "Jubiläum,Geburtstag,Geschäft,Anrufe,Klienten,Konkurrenz,Kunde,Favoriten,Fortsetzung,Geschenke,Ferien,Ideen,Meeting,Fragen,Verschiedenes,Persönlich,Projekte,Feiertag,Status,Lieferanten,Reise,Urlaub"; "repeat_NEVER" = "wiederholt sich nicht"; "repeat_DAILY" = "täglich"; "repeat_WEEKLY" = "wöchentlich"; "repeat_BI-WEEKLY" = "zweiwöchentlich"; "repeat_EVERY WEEKDAY" = "an Werktagen"; "repeat_MONTHLY" = "monatlich"; "repeat_YEARLY" = "jährlich"; "repeat_CUSTOM" = "benutzerdefiniert..."; "reminder_NONE" = "Keine Erinnerung"; "reminder_5_MINUTES_BEFORE" = "5 Minuten vorher"; "reminder_10_MINUTES_BEFORE" = "10 Minuten vorher"; "reminder_15_MINUTES_BEFORE" = "15 Minuten vorher"; "reminder_30_MINUTES_BEFORE" = "30 Minuten vorher"; "reminder_45_MINUTES_BEFORE" = "45 Minuten vorher"; "reminder_1_HOUR_BEFORE" = "1 Stunde vorher"; "reminder_2_HOURS_BEFORE" = "2 Stunden vorher"; "reminder_5_HOURS_BEFORE" = "5 Stunden vorher"; "reminder_15_HOURS_BEFORE" = "15 Stunden vorher"; "reminder_1_DAY_BEFORE" = "1 Tag vorher"; "reminder_2_DAYS_BEFORE" = "2 Tage vorher"; "reminder_1_WEEK_BEFORE" = "1 Woche vorher"; "reminder_CUSTOM" = "Benutzerdefiniert..."; "reminder_MINUTES" = "Minuten"; "reminder_HOURS" = "Stunden"; "reminder_DAYS" = "Tage"; "reminder_BEFORE" = "bevor"; "reminder_AFTER" = "nachdem"; "reminder_START" = "der Termin startet"; "reminder_END" = "der Termin endet"; "Reminder Details" = "Erinnerungsdetails"; "Choose a Reminder Action" = "Wählen Sie eine Erinnerungsoption"; "Show an Alert" = "Alarm anzeigen"; "Send an E-mail" = "Eine E-Mail senden"; "Email Organizer" = "E-Mail an Organisator"; "Email Attendees" = "E-Mail an Teilnehmer"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Zeige Zeit als Verfügbar"; /* email notifications */ "Send Appointment Notifications" = "Verabredungsbenachrichtigungen senden"; /* validation errors */ validate_notitle = "Sie haben keinen Titel eingegeben. Wollen Sie trotzdem fortfahren?"; validate_invalid_startdate = "Ungültiges Beginndatum !"; validate_invalid_enddate = "Ungültiges Enddatum !"; validate_endbeforestart = "Ihr Ende ist vor dem Beginndatum."; "Events" = "Ereignisse"; "Tasks" = "Aufgaben"; "Show completed tasks" = "Abgeschlossene Aufgaben anzeigen"; /* tabs */ "Task" = "Aufgabe"; "Event" = "Termin"; "Recurrence" = "Wiederholung"; /* toolbar */ "New Event" = "Neuer Termin"; "New Task" = "Neue Aufgabe"; "Edit" = "Bearbeiten"; "Delete" = "Löschen"; "Go to Today" = "Zu Heute springen"; "Day View" = "Tagesansicht"; "Week View" = "Wochenansicht"; "Month View" = "Monatsansicht"; "Reload" = "Neu laden"; "eventPartStatModificationError" = "Ihre Teilnahme an dem Termin kann nicht geändert werden."; /* menu */ "New Event..." = "Neuer Termin..."; "New Task..." = "Neue Aufgabe..."; "Edit Selected Event..." = "Markierten Termin bearbeiten..."; "Delete Selected Event" = "Markierten Termin löschen"; "Select All" = "Alles auswählen"; "Workweek days only" = "nur Arbeitstage"; "Tasks in View" = "Aufgaben anzeigen"; "eventDeleteConfirmation" = "Diese Termine werden gelöscht: \n%{0}\nFortfahren?"; "taskDeleteConfirmation" = "Diese Aufgaben werden gelöscht: \n%{0}\nFortfahren?"; "You cannot remove nor unsubscribe from your personal calendar." = "Der persönliche Kalender kann weder gelöscht noch abbestellt werden."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Wollen Sie diesen Kalender wirklich löschen \"%{0}\"?"; /* Legend */ "Participant" = "Teilnehmer"; "Optional Participant" = "Optionaler Teilnehmer"; "Non Participant" = "Kein Teilnehmer"; "Chair" = "Vorsitz"; "Needs action" = "Benötigt Eingriff"; "Accepted" = "Akzeptiert"; "Declined" = "Abgelehnt"; "Tentative" = "Vorläufig"; "Free" = "Verfügbar"; "Busy" = "Beschäftigt"; "Maybe busy" = "Vielleicht beschäftigt"; "No free-busy information" = "Keine Verfügbarkeitsinformationen"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Termin vorschlagen:"; "Zoom:" = "Zoom:"; "Previous slot" = "Vorheriger"; "Next slot" = "Nächster"; "Previous hour" = "Vorherige Stunde"; "Next hour" = "Nächste Stunde"; "Work days only" = "Nur an Arbeitstagen"; "The whole day" = "Den ganzen Tag"; "Between" = "Zwischen"; "and" = "und"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Dieser Termin überschneidet sich mit dem Termin mindestens eines Teilnehmers.\nWollen sie die Einstellungen trotzdem so belassen?"; /* apt list */ "Title" = "Titel"; "Start" = "Beginn"; "End" = "Ende"; "Due Date" = "Fällig"; "Location" = "Ort"; "(Private Event)" = "(Privater Termin)"; vevent_class0 = "(Öffentlicher Termin)"; vevent_class1 = "(Privater Termin)"; vevent_class2 = "(Vertraulicher Termin)"; "Priority" = "Priorität"; "Category" = "Kategorie"; vtodo_class0 = "(Öffentliche Aufgabe)"; vtodo_class1 = "(Private Aufgabe)"; vtodo_class2 = "(Vertrauliche Aufgabe)"; "closeThisWindowMessage" = "Vielen Dank! Sie können dieses Fenster jetzt schließen."; "Multicolumn Day View" = "Mehrspaltige Tagesansicht"; "Please select an event or a task." = "Bitte wählen Sie einen Termin oder eine Aufgabe aus!"; "editRepeatingItem" = "Sie bearbeiten einen sich wiederholenden Termin. Wollen Sie alle seine Ereignisse bearbeiten oder nur diese einzelne Instanz?"; "button_thisOccurrenceOnly" = "Nur diese Instanz"; "button_allOccurrences" = "Alle Ereignisse"; /* Properties dialog */ "Name:" = "Name:"; "Color:" = "Farbe:"; "Include in free-busy" = "In der Verfügbarkeit einschließen"; "Synchronization" = "Synchronisation"; "Synchronize" = "Synchronisieren"; "Tag:" = "Kennzeichen:"; "Display" = "Anzeige"; "Show alarms" = "Zeige Erinnerungen"; "Show tasks" = "Zeige Aufgaben"; "Notifications" = "Benachrichtigungen"; "Receive a mail when I modify my calendar" = "E-Mail erhalten, wenn ich meinen Kalender verändere"; "Receive a mail when someone else modifies my calendar" = "E-Mail erhalten, wenn jemand anderes meinen Kalender verändert"; "When I modify my calendar, send a mail to:" = "Wenn ich meinen Kalender verändere, schicke eine E-Mail an: "; "Links to this Calendar" = "Links zu diesem Kalender"; "Authenticated User Access" = "Zugang für angemeldete Benutzer"; "CalDAV URL" = "CalDAV-URL"; "WebDAV ICS URL" = "WebDAV-ICS-URL"; "WebDAV XML URL" = "WebDAV-XML-URL"; /* Error messages */ "dayFieldInvalid" = "Im Feld Tag(e) ist eine Zahl größer oder gleich 1 erforderlich."; "weekFieldInvalid" = "Im Feld Woche(n) ist eine Zahl größer oder gleich 1 erforderlich."; "monthFieldInvalid" = "Im Feld Monat(e) ist eine Zahl größer oder gleich 1 erforderlich."; "monthDayFieldInvalid" = "Im Feld Monatstag ist eine Zahl größer oder gleich 1 erforderlich."; "yearFieldInvalid" = "Im Feld Jahr(e) ist eine Zahl größer oder gleich 1 erforderlich."; "appointmentFieldInvalid" = "Im Feld Termin(e) ist eine Zahl größer oder gleich 1 erforderlich."; "recurrenceUnsupported" = "Diese Art von Wiederholung wird derzeit nicht unterstützt."; "Please specify a calendar name." = "Bitte geben Sie einen Kalendernamen an."; "tagNotDefined" = "Zum Synchronisieren des Kalenders muss ein Kennzeichen angegeben werden."; "tagAlreadyExists" = "Das angegebene Kennzeichen ist bereits für einen anderen Kalender vergeben."; "tagHasChanged" = "Wenn das Kennzeichen des Kalenders geändert wird, müssen die Daten erneut auf das Mobilgerät geladen werden.\nFortfahren?"; "tagWasAdded" = "Wenn der Kalender synchronisiert werden soll, müssen die Daten erneut auf das Mobilgerät geladen werden.\nFortfahren?"; "tagWasRemoved" = "Wenn der Kalender aus der Synchronisation entfernt wird, müssen die Daten erneut auf das Mobilgerät geladen werden.\nFortfahren?"; "DestinationCalendarError" = "Quell- und Zielkalender sind identisch. Bitte kopieren Sie in einen anderen Kalender."; "EventCopyError" = "Kopieren fehlgeschlagen. Bitte kopieren Sie in einen anderen Kalender."; "Open Task..." = "Aufgabe öffnen..."; "Mark Completed" = "Als abgeschlossen markieren"; "Delete Task" = "Aufgabe löschen"; "Delete Event" = "Termin löschen"; "Copy event to my calendar" = "Kopiere diesen Termin in meinen Kalender"; "View Raw Source" = "Roher Quelltext anzeigen"; "Subscribe to a web calendar..." = "Einen Webkalender abonnieren..."; "URL of the Calendar" = "URL des Kalenders"; "Web Calendar" = "Webkalender"; "Reload on login" = "Neu laden beim Anmelden"; "Invalid number." = "Ungültige Nummer."; "Please identify yourself to %{0}" = "Bitte identifizieren Sie sich gegenüber %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxTimeDateControl.h0000644000000000000000000000320612247657030017260 0ustar rootroot/* Copyright (C) 2004 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #ifndef UIXTIMEDATECONTROL_H #define UIXTIMEDATECONTROL_H #import @class NSString; @class NSCalendarDate; @class NSNumber; @interface UIxTimeDateControl : UIxComponent { NSString *controlID; NSString *label; NSCalendarDate *date; NSString *time; id day; id month; id year; BOOL displayTimeControl; BOOL isDisabled; } - (void)setControlID:(NSString *)_controlID; - (NSString *)controlID; - (void)setLabel:(NSString *)_label; - (NSString *)label; - (void)setDate:(NSCalendarDate *)_date; - (NSCalendarDate *)date; - (void)setTime:(NSString *)_time; - (NSString *)time; - (void)setDay:(id)_day; - (id)day; - (void)setMonth:(id)_month; - (id)month; - (void)setYear:(id)_year; - (id)year; - (NSString *)timeID; - (NSString *)dateID; - (void)_setDate:(NSCalendarDate *)_date; @end #endif /* UIXTIMEDATECONTROL_H */ SOGo-2.1.1b/UI/Scheduler/UIxCalMainActions.m0000644000000000000000000000512712247657030017061 0ustar rootroot/* UIxCalMainActions.m - this file is part of SOGo * * Copyright (C) 2009-2013 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import #import #import #import #import #import #import "UIxCalMainActions.h" @implementation UIxCalMainActions - (WOResponse *) addWebCalendarAction { WORequest *r; WOResponse *response; SOGoWebAppointmentFolder *folder; NSString *urlString, *displayName; NSMutableDictionary *rc; SOGoAppointmentFolders *folders; r = [context request]; urlString = [[r formValueForKey: @"url"] stringByTrimmingSpaces]; if ([urlString length] > 0) { folders = [self clientObject]; folder = [folders newWebCalendarWithURL: urlString nameInContainer: nil]; if (folder) { displayName = [folder displayName]; response = [self responseWithStatus: 200]; [response setHeader: @"application/json" forKey: @"content-type"]; rc = [NSMutableDictionary dictionary]; [rc setObject: [folder displayName] forKey: @"name"]; [rc setObject: [folder folderReference] forKey: @"folderID"]; [response appendContentString: [rc jsonRepresentation]]; } else response = (WOResponse *) [NSException exceptionWithHTTPStatus: 400 reason: @"folder was not created"]; } else response = (WOResponse *) [NSException exceptionWithHTTPStatus: 400 reason: @"missing 'url' parameter"]; return response; } @end SOGo-2.1.1b/UI/Scheduler/UIxCalMainView.m0000644000000000000000000001532112247657030016370 0ustar rootroot/* UIxCalMainView.m - this file is part of SOGo * * Copyright (C) 2006-2009 Inverse inc. * * 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import "UIxCalMainView.h" @implementation UIxCalMainView - (void) checkDefaultModulePreference { SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; if ([ud rememberLastModule]) { [ud setLoginModule: @"Calendar"]; [ud synchronize]; } } - (void) _setupContext { SOGoUser *activeUser; NSString *module; SOGoAppointmentFolders *clientObject; contextIsSetup = YES; [self checkDefaultModulePreference]; activeUser = [context activeUser]; clientObject = [self clientObject]; module = [clientObject nameInContainer]; us = [activeUser userSettings]; moduleSettings = [us objectForKey: module]; if (!moduleSettings) { moduleSettings = [NSMutableDictionary dictionary]; [us setObject: moduleSettings forKey: module]; } } - (NSArray *) monthMenuItems { static NSMutableArray *monthMenuItems = nil; unsigned int count; if (!monthMenuItems) { monthMenuItems = [[NSMutableArray alloc] initWithCapacity: 12]; for (count = 1; count < 13; count++) [monthMenuItems addObject: [NSString stringWithFormat: @"%.2d", count]]; } return monthMenuItems; } - (void) setMonthMenuItem: (NSString *) aMonthMenuItem { monthMenuItem = aMonthMenuItem; } - (NSString *) monthMenuItem { return monthMenuItem; } - (NSString *) monthMenuItemLabel { return [self localizedNameForMonthOfYear: [monthMenuItem intValue]]; } - (NSArray *) yearMenuItems { static NSMutableArray *yearMenuItems = nil; int count, year; if (!yearMenuItems) { year = [[NSCalendarDate date] yearOfCommonEra]; yearMenuItems = [[NSMutableArray alloc] initWithCapacity: 11]; for (count = -5; count < 6; count++) [yearMenuItems addObject: [NSNumber numberWithInt: year + count]]; } return yearMenuItems; } - (void) setYearMenuItem: (NSNumber *) aYearMenuItem { yearMenuItem = aYearMenuItem; } - (NSNumber *) yearMenuItem { return yearMenuItem; } - (NSString *) verticalDragHandleStyle { NSString *vertical; if (!contextIsSetup) [self _setupContext]; vertical = [moduleSettings objectForKey: @"DragHandleVertical"]; return ((vertical && [vertical intValue] > 0) ? (id)[vertical stringByAppendingFormat: @"px"] : nil); } - (NSString *) horizontalDragHandleStyle { NSString *horizontal; if (!contextIsSetup) [self _setupContext]; horizontal = [moduleSettings objectForKey: @"DragHandleHorizontal"]; return ((horizontal && [horizontal intValue] > 0) ? (id)[horizontal stringByAppendingFormat: @"px"] : nil); } - (NSString *) eventsListViewStyle { NSString *height; if (!contextIsSetup) [self _setupContext]; height = [moduleSettings objectForKey: @"DragHandleVertical"]; return ((height && [height intValue] > 0) ? [NSString stringWithFormat: @"%ipx", [height intValue]] : nil); } - (WOResponse *) saveDragHandleStateAction { WORequest *request; NSString *dragHandle; if (!contextIsSetup) [self _setupContext]; request = [context request]; if ((dragHandle = [request formValueForKey: @"vertical"]) != nil) [moduleSettings setObject: dragHandle forKey: @"DragHandleVertical"]; else if ((dragHandle = [request formValueForKey: @"horizontal"]) != nil) [moduleSettings setObject: dragHandle forKey: @"DragHandleHorizontal"]; else return [self responseWithStatus: 400]; [us synchronize]; return [self responseWithStatus: 204]; } - (NSString *) eventsTabClass { NSString *list; [self _setupContext]; list = [moduleSettings objectForKey: @"SelectedList"]; return (list && [list compare: @"eventsListView"] == NSOrderedSame)? @"active" : @""; } - (NSString *) tasksTabClass { NSString *list; [self _setupContext]; list = [moduleSettings objectForKey: @"SelectedList"]; return (list && [list compare: @"tasksListView"] == NSOrderedSame)? @"active" : @""; } - (BOOL) showCompletedTasks { [self _setupContext]; return [[us objectForKey: @"ShowCompletedTasks"] boolValue]; } - (WOResponse *) saveSelectedListAction { WORequest *request; NSString *selectedList; [self _setupContext]; request = [context request]; selectedList = [request formValueForKey: @"list"]; [moduleSettings setObject: selectedList forKey: @"SelectedList"]; [us synchronize]; return [self responseWithStatus: 204]; } - (WOResponse *) saveListStateAction { WORequest *request; NSString *state; [self _setupContext]; request = [context request]; state = [request formValueForKey: @"state"]; [moduleSettings setObject: state forKey: @"ListState"]; [us synchronize]; return [self responseWithStatus: 204]; } - (NSString *) listStateStyle { NSString *state; [self _setupContext]; state = [moduleSettings objectForKey: @"ListState"]; return (state && [state compare: @"collapse"] == NSOrderedSame)? @"display: none;" : @""; } - (unsigned int) firstDayOfWeek { SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; return [ud firstDayOfWeek]; } - (unsigned int) dayStartHour { SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; return [ud dayStartHour]; } - (NSString *) currentView { NSString *view; if (!contextIsSetup) [self _setupContext]; view = [moduleSettings objectForKey: @"View"]; return (view ? view : @"weekview"); } @end SOGo-2.1.1b/UI/Scheduler/UIxRecurrenceEditor.h0000644000000000000000000000246112247657030017471 0ustar rootroot/* UIxRecurrenceEditor.h - this file is part of SOGo * * Copyright (C) 2008 Inverse inc. * * Author: Ludovic Marcotte * * 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 UIXRECURRENCEEDITOR_H #define UIXRECURRENCEEDITOR_H #import @interface UIxRecurrenceEditor : UIxComponent { NSString *item, *repeat; NSCalendarDate *aptStartDate; } - (NSArray *) monthlyRepeatList; - (NSArray *) monthlyDayList; - (NSArray *) yearlyMonthList; - (NSArray *) yearlyDayList; - (NSArray *) repeatList; - (void) setItem: (NSString *) theItem; - (NSString *) item; @end #endif /* UIXRECURRENCEEDITOR_H */ SOGo-2.1.1b/UI/Scheduler/UIxCalMonthView.m0000644000000000000000000002106512247657030016573 0ustar rootroot/* UIxCalMonthView.m - this file is part of SOGo * * Copyright (C) 2006, 2007 Inverse inc. * * 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 #import #import #import #import #import #import #import #import "UIxCalMonthView.h" @implementation UIxCalMonthView - (id) init { if ((self = [super init])) { // monthAptFormatter // = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: timeZone]; // [monthAptFormatter setShortMonthTitleOnly]; // dateFormatter = [[SOGoDateFormatter alloc] // initWithLocale: [self locale]]; dayNames = [locale objectForKey: NSWeekDayNameArray]; [dayNames retain]; monthNames = [locale objectForKey: NSMonthNameArray]; [monthNames retain]; weeksToDisplay = nil; currentTableDay = nil; currentWeek = nil; } return self; } - (void) dealloc { [monthNames release]; [dayNames release]; [weeksToDisplay release]; [currentTableDay release]; [currentWeek release]; [super dealloc]; } - (id ) defaultAction { [super setCurrentView: @"monthview"]; return self; } - (NSArray *) headerDaysToDisplay { NSMutableArray *headerDaysToDisplay; unsigned int counter; NSCalendarDate *currentDate; headerDaysToDisplay = [NSMutableArray arrayWithCapacity: 7]; currentDate = [[context activeUser] firstDayOfWeekForDate: [self selectedDate]]; for (counter = 0; counter < 7; counter++) { [headerDaysToDisplay addObject: currentDate]; currentDate = [currentDate tomorrow]; } return headerDaysToDisplay; } - (NSArray *) weeksToDisplay { NSMutableArray *week; unsigned int counter, day; NSCalendarDate *currentDate, *selectedDate, *lastDayOfMonth, *firstOfAllDays; unsigned int firstToLast, weeks; if (!weeksToDisplay) { selectedDate = [self selectedDate]; firstOfAllDays = [[context activeUser] firstDayOfWeekForDate: [selectedDate firstDayOfMonth]]; lastDayOfMonth = [selectedDate lastDayOfMonth]; firstToLast = ([lastDayOfMonth timeIntervalSinceDate: firstOfAllDays] / 86400) + 1; weeks = firstToLast / 7; if ((firstToLast % 7)) weeks++; weeksToDisplay = [NSMutableArray arrayWithCapacity: weeks]; currentDate = firstOfAllDays; for (counter = 0; counter < weeks; counter++) { week = [NSMutableArray arrayWithCapacity: 7]; for (day = 0; day < 7; day++) { [week addObject: currentDate]; currentDate = [currentDate tomorrow]; } [weeksToDisplay addObject: week]; } [weeksToDisplay retain]; } return weeksToDisplay; } - (NSString *) labelForCurrentDayToDisplay { return [dayNames objectAtIndex: [currentTableDay dayOfWeek]]; } - (NSDictionary *) _dateQueryParametersWithOffset: (int) monthsOffset { NSCalendarDate *date, *firstDay; firstDay = [[self selectedDate] firstDayOfMonth]; date = [firstDay dateByAddingYears: 0 months: monthsOffset days: 0 hours: 0 minutes: 0 seconds: 0]; return [self queryParametersBySettingSelectedDate: date]; } - (NSDictionary *) monthBeforePrevMonthQueryParameters { return [self _dateQueryParametersWithOffset: -2]; } - (NSDictionary *) prevMonthQueryParameters { return [self _dateQueryParametersWithOffset: -1]; } - (NSDictionary *) nextMonthQueryParameters { return [self _dateQueryParametersWithOffset: 1]; } - (NSDictionary *) monthAfterNextMonthQueryParameters { return [self _dateQueryParametersWithOffset: 2]; } - (NSString *) _monthNameWithOffsetFromThisMonth: (int) monthsOffset { NSCalendarDate *date, *firstDay; firstDay = [[self selectedDate] firstDayOfMonth]; date = [firstDay dateByAddingYears: 0 months: monthsOffset days: 0 hours: 0 minutes: 0 seconds: 0]; return [self localizedNameForMonthOfYear: [date monthOfYear]]; } - (NSString *) monthNameOfTwoMonthAgo { return [self _monthNameWithOffsetFromThisMonth: -2]; } - (NSString *) monthNameOfOneMonthAgo { return [self _monthNameWithOffsetFromThisMonth: -1]; } - (NSString *) monthNameOfThisMonth { return [self _monthNameWithOffsetFromThisMonth: 0]; } - (NSString *) monthNameOfNextMonth { return [self _monthNameWithOffsetFromThisMonth: 1]; } - (NSString *) monthNameOfTheMonthAfterNextMonth { return [self _monthNameWithOffsetFromThisMonth: 2]; } /* template accessors */ - (void) setCurrentTableDay: (NSCalendarDate *) newCurrentTableDay { ASSIGN (currentTableDay, newCurrentTableDay); } - (NSCalendarDate *) currentTableDay { return currentTableDay; } - (NSString *) currentDayId { return [NSString stringWithFormat: @"day%@", [currentTableDay shortDateString]]; } - (int) currentDayNumber { return ([currentWeek indexOfObject: currentTableDay] + [weeksToDisplay indexOfObject: currentWeek] * 7); } - (void) setCurrentWeek: (NSArray *) newCurrentWeek { ASSIGN (currentWeek, newCurrentWeek); } - (NSArray *) currentWeek { return currentWeek; } - (NSString *) labelForCurrentDayCell { NSCalendarDate *lastDayOfMonth; NSString *label, *monthOfYear; int dayOfMonth; dayOfMonth = [currentTableDay dayOfMonth]; lastDayOfMonth = [currentTableDay lastDayOfMonth]; if (dayOfMonth == 1 || [currentTableDay isDateOnSameDay: lastDayOfMonth]) { monthOfYear = [monthNames objectAtIndex: [currentTableDay monthOfYear]]; label = [NSString stringWithFormat: @"%d %@", dayOfMonth, monthOfYear]; } else label = [NSString stringWithFormat: @"%d", dayOfMonth]; return label; } - (NSString *) headerDayCellClasses { unsigned int dayOfWeek; dayOfWeek = [[context activeUser] dayOfWeekForDate: currentTableDay]; return [NSString stringWithFormat: @"headerDay day%d", dayOfWeek]; } - (NSString *) dayHeaderNumber { NSString *nameOfMonth, *dayHeaderNumber; unsigned int dayOfMonth; dayOfMonth = [currentTableDay dayOfMonth]; if (dayOfMonth == 1 || [currentTableDay isDateOnSameDay: [currentTableDay lastDayOfMonth]]) { nameOfMonth = [self localizedNameForMonthOfYear: [currentTableDay monthOfYear]]; dayHeaderNumber = [NSString stringWithFormat: @"%d %@", dayOfMonth, nameOfMonth]; } else dayHeaderNumber = [NSString stringWithFormat: @"%d", dayOfMonth]; return dayHeaderNumber; } - (NSString *) dayCellClasses { NSMutableString *classes; NSCalendarDate *selectedDate; unsigned int realDayOfWeek, dayOfWeek, numberOfWeeks; classes = [NSMutableString string]; dayOfWeek = [[context activeUser] dayOfWeekForDate: currentTableDay]; realDayOfWeek = [currentTableDay dayOfWeek]; numberOfWeeks = [weeksToDisplay count]; [classes appendFormat: @"day weekOf%d week%dof%d day%d", numberOfWeeks, [weeksToDisplay indexOfObject: currentWeek], numberOfWeeks, dayOfWeek]; if (realDayOfWeek == 0 || realDayOfWeek == 6) [classes appendString: @" weekEndDay"]; selectedDate = [self selectedDate]; if (![[currentTableDay firstDayOfMonth] isDateOnSameDay: [selectedDate firstDayOfMonth]]) [classes appendString: @" dayOfAnotherMonth"]; if ([currentTableDay isToday]) [classes appendString: @" dayOfToday"]; return classes; } - (NSCalendarDate *) startDate { NSCalendarDate *firstDayOfMonth; firstDayOfMonth = [[self selectedDate] firstDayOfMonth]; return [[context activeUser] firstDayOfWeekForDate: firstDayOfMonth]; } - (NSCalendarDate *) endDate { NSCalendarDate *lastDayOfMonth, *firstDay; lastDayOfMonth = [[self selectedDate] lastDayOfMonth]; firstDay = [[context activeUser] firstDayOfWeekForDate: lastDayOfMonth]; return [firstDay dateByAddingYears: 0 months: 0 days: 6]; } @end SOGo-2.1.1b/UI/Scheduler/GNUmakefile0000644000000000000000000000400112247657030015470 0ustar rootroot# GNUstep makefile include ../common.make BUNDLE_NAME = SchedulerUI SchedulerUI_PRINCIPAL_CLASS = SchedulerUIProduct SchedulerUI_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh SchedulerUI_OBJC_FILES = \ SchedulerUIProduct.m \ NSArray+Scheduler.m \ NSDictionary+Scheduler.m \ \ UIxCalMainView.m \ UIxCalendarProperties.m \ \ UIxCalFilterPanel.m \ UIxCalDayTable.m \ UIxCalDateSelector.m \ UIxCalUserRightsEditor.m \ UIxCalFolderActions.m \ \ UIxCalView.m \ UIxCalDayView.m \ UIxCalMulticolumnDayView.m \ UIxCalWeekView.m \ UIxCalMonthView.m \ UIxAptTableView.m \ \ UIxCalListingActions.m \ UIxCalMainActions.m \ \ UIxAttendeesEditor.m \ UIxComponentEditor.m \ UIxCalendarSelector.m \ UIxAppointmentActions.m \ UIxAppointmentEditor.m \ UIxTaskEditor.m \ UIxDatePicker.m \ UIxTimeDateControl.m \ UIxCalMonthOverview.m \ UIxCalMonthViewOld.m \ UIxRecurrenceEditor.m \ UIxReminderEditor.m \ UIxOccurenceDialog.m SchedulerUI_RESOURCE_FILES += \ product.plist SchedulerUI_RESOURCE_FILES += \ Toolbars/SOGoAppointmentFolders.toolbar \ Toolbars/SOGoAppointmentObject.toolbar \ Toolbars/SOGoAppointmentObjectAccept.toolbar \ Toolbars/SOGoAppointmentObjectDecline.toolbar \ Toolbars/SOGoAppointmentObjectAcceptOrDecline.toolbar \ Toolbars/SOGoTaskObject.toolbar \ Toolbars/SOGoComponentClose.toolbar \ Toolbars/SOGoEmpty.toolbar SchedulerUI_LOCALIZED_RESOURCE_FILES += \ Localizable.strings # if SoProduct is fixed to enable localized resources, add this to # SchedulerUI_LOCALIZED_RESOURCE_FILES instead SchedulerUI_RESOURCE_FILES += \ cycles.plist \ # make ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble SOGo-2.1.1b/UI/Scheduler/UIxRecurrenceEditor.m0000644000000000000000000000651412247657030017501 0ustar rootroot/* UIxRecurrenceEditor.m - this file is part of SOGo * * Copyright (C) 2008 Inverse inc. * * Author: Ludovic Marcotte * * 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 /* for locale string constants */ #import #import "UIxRecurrenceEditor.h" @implementation UIxRecurrenceEditor - (NSArray *) shortWeekDaysList { static NSArray *shortWeekDaysList = nil; if (!shortWeekDaysList) { shortWeekDaysList = [locale objectForKey: NSShortWeekDayNameArray]; [shortWeekDaysList retain]; } return shortWeekDaysList; } - (NSArray *) monthlyRepeatList { static NSArray *monthlyRepeatList = nil; if (!monthlyRepeatList) { monthlyRepeatList = [NSArray arrayWithObjects: @"First", @"Second", @"Third", @"Fourth", @"Fift", @"Last", nil]; [monthlyRepeatList retain]; } return monthlyRepeatList; } - (NSArray *) monthlyDayList { static NSMutableArray *monthlyDayList = nil; if (!monthlyDayList) { monthlyDayList = [NSMutableArray arrayWithArray: [locale objectForKey: NSWeekDayNameArray]]; [monthlyDayList addObject: @"DayOfTheMonth"]; [monthlyDayList retain]; } return monthlyDayList; } - (NSArray *) yearlyMonthList { static NSArray *yearlyMonthList = nil; if (!yearlyMonthList) { yearlyMonthList = [locale objectForKey: NSMonthNameArray]; [yearlyMonthList retain]; } return yearlyMonthList; } - (NSArray *) yearlyDayList { static NSArray *yearlyDayList = nil; if (!yearlyDayList) { yearlyDayList = [locale objectForKey: NSWeekDayNameArray]; [yearlyDayList retain]; } return yearlyDayList; } // // Items used to specify what kind of recurrence we want // - (NSArray *) repeatList { static NSArray *repeatList = nil; if (!repeatList) { repeatList = [NSArray arrayWithObjects: @"Daily", @"Weekly", @"Monthly", @"Yearly", nil]; [repeatList retain]; } return repeatList; } // // Accessors // - (void) setItem: (NSString *) theItem { item = theItem; } - (NSString *) item { return item; } - (NSString *) itemText { NSString *text; text = [self labelForKey: item]; return text; } - (NSString *) idForWeekDay { static NSArray *shortWeekDaysList = nil; NSString *id; if (!shortWeekDaysList) { shortWeekDaysList = [locale objectForKey: NSShortWeekDayNameArray]; [shortWeekDaysList retain]; } id = [NSString stringWithFormat: @"weekDay%i", [shortWeekDaysList indexOfObject: item]]; return id; } - (NSString *) labelForWeekDay { return item; } @end SOGo-2.1.1b/UI/Scheduler/GNUmakefile.postamble0000644000000000000000000000052512247657030017464 0ustar rootroot# postprocessing ifeq ($(bundlewox),yes) validate-wox: xmllint --noout *.wox before-all :: validate-wox endif ifneq ($(GNUSTEP_BUILD_DIR),) after-all :: @(cp bundle-info.plist \ $(GNUSTEP_BUILD_DIR)/$(BUNDLE_NAME)$(BUNDLE_EXTENSION)) else after-all :: @(cd $(BUNDLE_NAME)$(BUNDLE_EXTENSION);\ cp ../bundle-info.plist .) endif SOGo-2.1.1b/UI/Scheduler/UIxCalendarProperties.h0000644000000000000000000000406412247657030020014 0ustar rootroot/* UIxCalendarProperties.m - this file is part of SOGo * * Copyright (C) 2008-2012 Inverse inc. * * Author: Wolfgang Sourdeau * Ludovic Marcotte * * 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 @class NSString; @class SOGoAppointmentFolder; @interface UIxCalendarProperties : UIxComponent { SOGoAppointmentFolder *calendar; NSString *baseCalDAVURL, *basePublicCalDAVURL; BOOL reloadTasks; } - (NSString *) calendarName; - (void) setCalendarName: (NSString *) newName; - (NSString *) calendarColor; - (void) setCalendarColor: (NSString *) newColor; - (BOOL) showCalendarAlarms; - (void) setShowCalendarAlarms: (BOOL) new; - (BOOL) synchronizeCalendar; - (void) setSynchronizeCalendar: (BOOL) new; - (NSString *) originalCalendarSyncTag; - (NSString *) allCalendarSyncTags; - (BOOL) mustSynchronize; - (NSString *) calendarSyncTag; - (void) setCalendarSyncTag: (NSString *) newTag; /* notifications */ - (BOOL) notifyOnPersonalModifications; - (void) setNotifyOnPersonalModifications: (BOOL) b; - (BOOL) notifyOnExternalModifications; - (void) setNotifyOnExternalModifications: (BOOL) b; - (BOOL) notifyUserOnPersonalModifications; - (void) setNotifyUserOnPersonalModifications: (BOOL) b; - (NSString *) notifiedUserOnPersonalModifications; - (void) setNotifiedUserOnPersonalModifications: (NSString *) theUser; @end SOGo-2.1.1b/UI/Scheduler/UIxCalMulticolumnDayView.h0000644000000000000000000000331612247657030020446 0ustar rootroot/* UIxCalMulticolumnDayView.h - this file is part of SOGo * * Copyright (C) 2006 Inverse inc. * * 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 __UIxCalMulticolumnDayView_H_ #define __UIxCalMulticolumnDayView_H_ #import "UIxCalDayView.h" @interface UIxCalMulticolumnDayView : UIxCalDayView { SOGoDateFormatter *dateFormatter; NSString *currentTableHour; NSMutableArray *subscriptionUsers; NSMutableArray *hoursToDisplay; // NSArray *allAppointments; NSString *currentTableUser; // NSDictionary *currentAppointment; NSString *cssClass; NSString *cssId; } - (void) setCSSClass: (NSString *) aCssClass; - (NSString *) cssClass; - (void) setCSSId: (NSString *) aCssId; - (NSString *) cssId; - (NSArray *) subscriptionUsers; - (void) setCurrentTableUser: (NSString *) aTableDay; - (NSString *) currentTableUser; // - (void) setCurrentAppointment: (NSDictionary *) newCurrentAppointment; // - (NSDictionary *) currentAppointment; @end #endif /* __UIxCalMulticolumnDayView_H_ */ SOGo-2.1.1b/UI/Scheduler/UIxCalDayView.h0000644000000000000000000000254612247657030016221 0ustar rootroot/* Copyright (C) 2004 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #ifndef __UIxCalDayView_H_ #define __UIxCalDayView_H_ #import "UIxCalView.h" @interface UIxCalDayView : UIxCalView - (NSDictionary *) dayBeforePrevDayQueryParameters; - (NSDictionary *) prevDayQueryParameters; - (NSDictionary *) nextDayQueryParameters; - (NSDictionary *) dayAfterNextDayQueryParameters; - (NSDictionary *) currentDateQueryParameters; - (NSCalendarDate *) startDate; - (NSString *) dayBeforeYesterdayName; - (NSString *) yesterdayName; - (NSString *) currentDayName; - (NSString *) tomorrowName; - (NSString *) dayAfterTomorrowName; @end #endif /* __UIxCalDayView_H_ */ SOGo-2.1.1b/UI/Scheduler/UIxTaskEditor.h0000644000000000000000000000326412247657030016300 0ustar rootroot/* UIxTaskEditor.h - this file is part of SOGo * * Copyright (C) 2007-2009 Inverse inc. * * 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 UIXAPPOINTMENTEDITOR_H #define UIXAPPOINTMENTEDITOR_H #import @class iCalToDo; @class NSString; @interface UIxTaskEditor : UIxComponent { iCalToDo *todo; NSCalendarDate *taskStartDate; NSCalendarDate *taskDueDate; NSCalendarDate *statusDate; NSString *status; NSString *statusPercent; BOOL hasStartDate; BOOL hasDueDate; NSString *item; SOGoDateFormatter *dateFormatter; } /* template values */ - (NSString *) saveURL; - (iCalToDo *) todo; /* icalendar values */ - (void) setTaskStartDate: (NSCalendarDate *) _date; - (NSCalendarDate *) taskStartDate; - (void) setTaskDueDate: (NSCalendarDate *) _date; - (NSCalendarDate *) taskDueDate; - (NSString *) taskStartDateTimeText; - (NSString *) taskDueDateTimeText; - (NSString *) statusDateText; @end #endif /* UIXAPPOINTMENTEDITOR_H */ SOGo-2.1.1b/UI/Scheduler/NSDictionary+Scheduler.m0000644000000000000000000000222212247657030020057 0ustar rootroot/* NSDictionary+Scheduler.m - this file is part of SOGo * * Copyright (C) 2008 Inverse inc. * * 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 "NSDictionary+Scheduler.h" @implementation NSDictionary (SOGoEventComparison) - (NSComparisonResult) compareEventByStart: (NSDictionary *) otherEvent { return [[self objectForKey: @"start"] compare: [otherEvent objectForKey: @"start"]]; } @end SOGo-2.1.1b/UI/Scheduler/COPYING0000644000000000000000000006130312247657027014467 0ustar rootroot GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! SOGo-2.1.1b/UI/Scheduler/UIxCalMonthView.h0000644000000000000000000000415312247657030016565 0ustar rootroot/* UIxCalMonthView.h - this file is part of SOGo * * Copyright (C) 2006-2009 Inverse inc. * * 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 UIXCALMONTHVIEW_H #define UIXCALMONTHVIEW_H #import "UIxCalView.h" @class NSArray; @class NSCalendarDate; @class NSDictionary; @class NSMutableDictionary; @class SOGoAptFormatter; @class SOGoDateFormatter; @protocol WOActionResults; @interface UIxCalMonthView : UIxCalView { SOGoAptFormatter *monthAptFormatter; SOGoDateFormatter *dateFormatter; NSCalendarDate *currentTableDay; NSMutableArray *weeksToDisplay; NSArray *currentWeek; NSArray *dayNames; NSArray *monthNames; } - (NSDictionary *) monthBeforePrevMonthQueryParameters; - (NSDictionary *) prevMonthQueryParameters; - (NSDictionary *) nextMonthQueryParameters; - (NSDictionary *) monthAfterNextMonthQueryParameters; - (NSString *) monthNameOfTwoMonthAgo; - (NSString *) monthNameOfOneMonthAgo; - (NSString *) monthNameOfThisMonth; - (NSString *) monthNameOfNextMonth; - (NSString *) monthNameOfTheMonthAfterNextMonth; - (NSArray *) weeksToDisplay; - (NSString *) labelForCurrentDayToDisplay; - (NSString *) dayCellClasses; - (void) setCurrentWeek: (NSArray *) newCurrentWeek; - (NSArray *) currentWeek; - (void) setCurrentTableDay: (NSCalendarDate *) newCurrentTableDay; - (NSCalendarDate *) currentTableDay; - (NSString *) labelForCurrentDayCell; @end #endif /* UIXCALMONTHVIEW_H */ SOGo-2.1.1b/UI/Scheduler/UIxDatePicker.m0000644000000000000000000001120212247657030016236 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import #import #import #import #import #import #import #import "UIxDatePicker.h" @implementation UIxDatePicker - (id) init { if ((self = [super init])) { isDisabled = NO; } return self; } - (void)dealloc { [self->dateID release]; [self->day release]; [self->month release]; [self->year release]; [self->label release]; [super dealloc]; } /* Accessors */ - (void)setDateID:(NSString *)_dateID { ASSIGNCOPY(self->dateID, _dateID); } - (NSString *)dateID { return self->dateID; } - (void)setDay:(id)_day { ASSIGN(self->day, _day); } - (id)day { return self->day; } - (void)setMonth:(id)_month { ASSIGN(self->month, _month); } - (id)month { return self->month; } - (void)setYear:(id)_year { ASSIGN(self->year, _year); } - (id)year { return self->year; } - (void)setLabel:(NSString *)_label { ASSIGNCOPY(self->label, _label); } - (NSString *)label { return self->label; } /* formats */ - (BOOL)useISOFormats { WOContext *ctx; NSNumber *useISOFormats; ctx = [self context]; useISOFormats = [ctx valueForKey:@"useISOFormats"]; if (!useISOFormats) { NSArray *languages = [ctx resourceLookupLanguages]; if (languages && [languages count] > 0) { if ([[languages objectAtIndex:0] isEqualToString:@"French"]) { useISOFormats = [NSNumber numberWithBool:NO]; } } if (!useISOFormats) useISOFormats = [NSNumber numberWithBool:YES]; [ctx takeValue:useISOFormats forKey:@"useISOFormats"]; } return [useISOFormats boolValue]; } - (NSString *) formattedDateString { char buf[22]; if ([self useISOFormats]) { sprintf(buf, "%04d-%02d-%02d", [[self year] intValue], [[self month] intValue], [[self day] intValue]); } else { sprintf(buf, "%02d/%02d/%04d", [[self day] intValue], [[self month] intValue], [[self year] intValue]); } return [NSString stringWithCString:buf]; } - (NSString *) dateFormat { return [self useISOFormats] ? @"%Y-%m-%d" : @"%d/%m/%Y"; } - (NSString *) jsDateFormat { return [self useISOFormats] ? @"yyyy-mm-dd" : @"dd/mm/yyyy"; } /* action */ - (void) takeValuesFromRequest: (WORequest *) _rq inContext: (WOContext *)_ctx { NSString *dateString; NSCalendarDate *d; NSInteger dateTZOffset, userTZOffset; NSTimeZone *systemTZ, *userTZ; SOGoUserDefaults *ud; dateString = [_rq formValueForKey:[self dateID]]; if (dateString == nil) { [self debugWithFormat:@"got no date string!"]; return; } d = [NSCalendarDate dateWithString:dateString calendarFormat:[self dateFormat]]; if (d == nil) { [self warnWithFormat:@"Could not parse dateString: '%@'", dateString]; } /* we must adjust the date timezone because "dateWithString:..." uses the system timezone, which can be different from the user's. */ ud = [[_ctx activeUser] userDefaults]; systemTZ = [d timeZone]; dateTZOffset = [systemTZ secondsFromGMTForDate: d]; userTZ = [ud timeZone]; userTZOffset = [userTZ secondsFromGMTForDate: d]; if (dateTZOffset != userTZOffset) d = [d dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: (dateTZOffset - userTZOffset)]; [d setTimeZone: userTZ]; [self setDay: [NSNumber numberWithInt:[d dayOfMonth]]]; [self setMonth:[NSNumber numberWithInt:[d monthOfYear]]]; [self setYear: [NSNumber numberWithInt:[d yearOfCommonEra]]]; [super takeValuesFromRequest:_rq inContext:_ctx]; } - (void) setDisabled: (BOOL) disabled { isDisabled = disabled; } - (BOOL) disabled { return isDisabled; } @end /* UIxDatePicker */ SOGo-2.1.1b/UI/Scheduler/UIxCalListingActions.m0000644000000000000000000010673512247657030017615 0ustar rootroot/* UIxCalListingActions.m - this file is part of SOGo * * Copyright (C) 2006-2011 Inverse inc. * * Author: Wolfgang Sourdeau * Francis Lachapelle * * 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "NSArray+Scheduler.h" #import "UIxCalListingActions.h" static NSArray *eventsFields = nil; static NSArray *tasksFields = nil; #define dayLength 86400 #define quarterLength 900 // number of seconds in 15 minutes #define offsetHours (24 * 5) // number of hours in invitation window #define offsetSeconds (offsetHours * 60 * 60) // number of seconds in // invitation window /* 1 block = 15 minutes */ #define offsetBlocks (offsetHours * 4) // number of 15-minute blocks in invitation window #define maxBlocks (offsetBlocks * 2) // maximum number of blocks to search // for a free slot (10 days) @implementation UIxCalListingActions + (void) initialize { if (!eventsFields) { eventsFields = [NSArray arrayWithObjects: @"c_name", @"c_folder", @"calendarName", @"c_status", @"c_title", @"c_startdate", @"c_enddate", @"c_location", @"c_isallday", @"c_classification", @"c_category", @"c_partmails", @"c_partstates", @"c_owner", @"c_iscycle", @"c_nextalarm", @"c_recurrence_id", @"isException", @"editable", @"erasable", @"ownerIsOrganizer", nil]; [eventsFields retain]; } if (!tasksFields) { tasksFields = [NSArray arrayWithObjects: @"c_name", @"c_folder", @"calendarName", @"c_status", @"c_title", @"c_enddate", @"c_classification", @"c_location", @"c_category", @"editable", @"erasable", @"c_priority", nil]; [tasksFields retain]; } } - (id) initWithRequest: (WORequest *) newRequest { SOGoUser *user; if ((self = [super initWithRequest: newRequest])) { componentsData = [NSMutableDictionary new]; startDate = nil; endDate = nil; ASSIGN (request, newRequest); user = [[self context] activeUser]; ASSIGN (dateFormatter, [user dateFormatterInContext: context]); ASSIGN (userTimeZone, [[user userDefaults] timeZone]); dayBasedView = NO; } return self; } - (void) dealloc { [dateFormatter release]; [request release]; [componentsData release]; [userTimeZone release]; [super dealloc]; } - (void) _setupDatesWithPopup: (NSString *) popupValue andUserTZ: (NSTimeZone *) userTZ { NSCalendarDate *newDate; NSString *param; if ([popupValue isEqualToString: @"view_today"]) { newDate = [NSCalendarDate calendarDate]; [newDate setTimeZone: userTZ]; startDate = [newDate beginOfDay]; endDate = [newDate endOfDay]; } else if ([popupValue isEqualToString: @"view_all"]) { startDate = nil; endDate = nil; } else if ([popupValue isEqualToString: @"view_next7"]) { newDate = [NSCalendarDate calendarDate]; [newDate setTimeZone: userTZ]; startDate = [newDate beginOfDay]; endDate = [[startDate dateByAddingYears: 0 months: 0 days: 6] endOfDay]; } else if ([popupValue isEqualToString: @"view_next14"]) { newDate = [NSCalendarDate calendarDate]; [newDate setTimeZone: userTZ]; startDate = [newDate beginOfDay]; endDate = [[startDate dateByAddingYears: 0 months: 0 days: 13] endOfDay]; } else if ([popupValue isEqualToString: @"view_next31"]) { newDate = [NSCalendarDate calendarDate]; [newDate setTimeZone: userTZ]; startDate = [newDate beginOfDay]; endDate = [[startDate dateByAddingYears: 0 months: 0 days: 30] endOfDay]; } else if ([popupValue isEqualToString: @"view_thismonth"]) { newDate = [NSCalendarDate calendarDate]; [newDate setTimeZone: userTZ]; startDate = [[newDate firstDayOfMonth] beginOfDay]; endDate = [[newDate lastDayOfMonth] endOfDay]; } else if ([popupValue isEqualToString: @"view_future"]) { newDate = [NSCalendarDate calendarDate]; [newDate setTimeZone: userTZ]; startDate = [newDate beginOfDay]; endDate = nil; } else if ([popupValue isEqualToString: @"view_selectedday"]) { param = [request formValueForKey: @"day"]; if ([param length] > 0) startDate = [[NSCalendarDate dateFromShortDateString: param andShortTimeString: nil inTimeZone: userTZ] beginOfDay]; else { newDate = [NSCalendarDate calendarDate]; [newDate setTimeZone: userTZ]; startDate = [newDate beginOfDay]; } endDate = [startDate endOfDay]; } } - (void) _setupContext { SOGoUser *user; NSString *param; user = [context activeUser]; userLogin = [user login]; title = [request formValueForKey: @"search"]; param = [request formValueForKey: @"filterpopup"]; if ([param length]) { [self _setupDatesWithPopup: param andUserTZ: userTimeZone]; } else { param = [request formValueForKey: @"sd"]; if ([param length] > 0) startDate = [[NSCalendarDate dateFromShortDateString: param andShortTimeString: nil inTimeZone: userTimeZone] beginOfDay]; else startDate = nil; param = [request formValueForKey: @"ed"]; if ([param length] > 0) endDate = [[NSCalendarDate dateFromShortDateString: param andShortTimeString: nil inTimeZone: userTimeZone] endOfDay]; else endDate = nil; param = [request formValueForKey: @"view"]; dayBasedView = ![param isEqualToString: @"monthview"]; } } - (void) _fixComponentTitle: (NSMutableDictionary *) component withType: (NSString *) type { NSString *labelKey; labelKey = [NSString stringWithFormat: @"%@_class%@", type, [component objectForKey: @"c_classification"]]; [component setObject: [self labelForKey: labelKey] forKey: @"c_title"]; } /* * Adjust the event start and end dates when there's a time change * in the period covering the view for the user's timezone. * @param theRecord the attributes of the event. */ - (void) _fixDates: (NSMutableDictionary *) theRecord { NSCalendarDate *aDate; NSNumber *aDateValue; NSString *aDateField; int daylightOffset; unsigned int count; static NSString *fields[] = { @"startDate", @"c_startdate", @"endDate", @"c_enddate" }; /* WARNING: This condition has been put and removed many times, please leave it. Here is the story... If _fixDates: is conditional to dayBasedView, the recurrences are computed properly but the display time is wrong. If _fixDates: is non-conditional, the reverse occurs. If only this part of _fixDates: is conditional, both are right. Regarding all day events, we need to execute this code no matter what the date and the view are, otherwise the event will span on two days. ref bugs: http://www.sogo.nu/bugs/view.php?id=909 http://www.sogo.nu/bugs/view.php?id=678 ... */ //NSLog(@"***[UIxCalListingActions _fixDates:] %@", [theRecord objectForKey: @"c_title"]); if (dayBasedView || [[theRecord objectForKey: @"c_isallday"] boolValue]) { for (count = 0; count < 2; count++) { aDateField = fields[count * 2]; aDate = [theRecord objectForKey: aDateField]; daylightOffset = (int) ([userTimeZone secondsFromGMTForDate: aDate] - [userTimeZone secondsFromGMTForDate: startDate]); //NSLog(@"***[UIxCalListingActions _fixDates:] %@ = %@ (%i)", aDateField, aDate, daylightOffset); if (daylightOffset) { aDate = [aDate dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: daylightOffset]; [theRecord setObject: aDate forKey: aDateField]; aDateValue = [NSNumber numberWithInt: [aDate timeIntervalSince1970]]; [theRecord setObject: aDateValue forKey: fields[count * 2 + 1]]; } } } } - (NSArray *) _fetchFields: (NSArray *) fields forComponentOfType: (NSString *) component { NSEnumerator *folders, *currentInfos; SOGoAppointmentFolder *currentFolder; NSMutableDictionary *newInfo; NSMutableArray *infos; NSNull *marker; SOGoAppointmentFolders *clientObject; SOGoUser *ownerUser; NSString *owner, *role, *calendarName; BOOL isErasable, folderIsRemote; infos = [NSMutableArray array]; marker = [NSNull null]; clientObject = [self clientObject]; folders = [[clientObject subFolders] objectEnumerator]; while ((currentFolder = [folders nextObject])) { if ([currentFolder isActive]) { folderIsRemote = [currentFolder isKindOfClass: [SOGoWebAppointmentFolder class]]; currentInfos = [[currentFolder fetchCoreInfosFrom: startDate to: endDate title: title component: component] objectEnumerator]; owner = [currentFolder ownerInContext: context]; ownerUser = [SOGoUser userWithLogin: owner]; isErasable = ([owner isEqualToString: userLogin] || [[currentFolder aclsForUser: userLogin] containsObject: SOGoRole_ObjectEraser]); while ((newInfo = [currentInfos nextObject])) { if ([fields containsObject: @"editable"]) { if (folderIsRemote) // .ics subscriptions are not editable [newInfo setObject: [NSNumber numberWithInt: 0] forKey: @"editable"]; else { // Identifies whether the active user can edit the event. role = [currentFolder roleForComponentsWithAccessClass: [[newInfo objectForKey: @"c_classification"] intValue] forUser: userLogin]; if ([role isEqualToString: @"ComponentModifier"] || [role length] == 0) [newInfo setObject: [NSNumber numberWithInt: 1] forKey: @"editable"]; else [newInfo setObject: [NSNumber numberWithInt: 0] forKey: @"editable"]; } } if ([fields containsObject: @"ownerIsOrganizer"]) { // Identifies whether the active user is the organizer // of this event. NSString *c_orgmail; c_orgmail = [newInfo objectForKey: @"c_orgmail"]; if ([c_orgmail isKindOfClass: [NSString class]] && [ownerUser hasEmail: c_orgmail]) [newInfo setObject: [NSNumber numberWithInt: 1] forKey: @"ownerIsOrganizer"]; else [newInfo setObject: [NSNumber numberWithInt: 0] forKey: @"ownerIsOrganizer"]; } if (isErasable) [newInfo setObject: [NSNumber numberWithInt: 1] forKey: @"erasable"]; else [newInfo setObject: [NSNumber numberWithInt: 0] forKey: @"erasable"]; [newInfo setObject: [currentFolder nameInContainer] forKey: @"c_folder"]; [newInfo setObject: [currentFolder ownerInContext: context] forKey: @"c_owner"]; calendarName = [currentFolder displayName]; if (calendarName == nil) calendarName = @""; [newInfo setObject: calendarName forKey: @"calendarName"]; if (![[newInfo objectForKey: @"c_title"] length]) [self _fixComponentTitle: newInfo withType: component]; // Possible improvement: only call _fixDates if event is recurrent // or the view range span a daylight saving time change [self _fixDates: newInfo]; [infos addObject: [newInfo objectsForKeys: fields notFoundMarker: marker]]; } } } return infos; } - (WOResponse *) _responseWithData: (NSArray *) data { WOResponse *response; response = [self responseWithStatus: 200]; [response appendContentString: [data jsonRepresentation]]; return response; } - (NSString *) _formattedDateForSeconds: (unsigned int) seconds forAllDay: (BOOL) forAllDay { NSCalendarDate *date; NSString *formattedDate; date = [NSCalendarDate dateWithTimeIntervalSince1970: seconds]; // Adjust for daylight saving time? (wrt to startDate) //NSLog(@"***[UIxCalListingActions _formattedDateForSeconds] user timezone is %@", userTimeZone); [date setTimeZone: userTimeZone]; if (forAllDay) formattedDate = [dateFormatter formattedDate: date]; else formattedDate = [dateFormatter formattedDateAndTime: date]; return formattedDate; } // // We return: // // [[calendar name (full path), complete Event ID (full path), Fire date (UTC)], ..] // // Called when each module is loaded or whenever a calendar component is created, modified, deleted // or whenever there's a {un}subscribe to a calendar. // // Workflow : // // - for ALL subscribed and ACTIVE calendars // - returns alarms that will occur in the next 48 hours or the non-triggered alarms // for non-completed events // - recurring events are currently ignored // - (WOResponse *) alarmsListAction { SOGoAppointmentFolder *currentFolder; SOGoAppointmentFolders *clientObject; NSMutableArray *allAlarms; NSEnumerator *folders; WOResponse *response; unsigned int browserTime, laterTime; // We look for alarms in the next 48 hours browserTime = [[[context request] formValueForKey: @"browserTime"] intValue]; laterTime = browserTime + 60*60*48; clientObject = [self clientObject]; allAlarms = [NSMutableArray array]; folders = [[clientObject subFolders] objectEnumerator]; while ((currentFolder = [folders nextObject])) { if ([currentFolder isActive] && [currentFolder showCalendarAlarms]) { NSDictionary *entry; NSArray *alarms; BOOL isCycle; int i; alarms = [currentFolder fetchAlarmInfosFrom: [NSNumber numberWithInt: browserTime] to: [NSNumber numberWithInt: laterTime]]; for (i = 0; i < [alarms count]; i++) { entry = [alarms objectAtIndex: i]; isCycle = [[entry objectForKey: @"c_iscycle"] boolValue]; if (!isCycle) { [allAlarms addObject: [NSArray arrayWithObjects: [currentFolder nameInContainer], [entry objectForKey: @"c_name"], [entry objectForKey: @"c_nextalarm"], nil]]; } } } } response = [self responseWithStatus: 200]; [response appendContentString: [allAlarms jsonRepresentation]]; return response; } - (void) checkFilterValue { NSString *filter; SOGoUserSettings *us; filter = [[context request] formValueForKey: @"filterpopup"]; if ([filter length] && ![filter isEqualToString: @"view_all"] && ![filter isEqualToString: @"view_future"]) { us = [[context activeUser] userSettings]; [us setObject: filter forKey: @"CalendarDefaultFilter"]; [us synchronize]; } } - (WOResponse *) eventsListAction { NSArray *oldEvent; NSEnumerator *events; NSMutableArray *newEvents, *newEvent; unsigned int interval; BOOL isAllDay; NSString *sort, *ascending; [self _setupContext]; [self checkFilterValue]; newEvents = [NSMutableArray array]; events = [[self _fetchFields: eventsFields forComponentOfType: @"vevent"] objectEnumerator]; while ((oldEvent = [events nextObject])) { newEvent = [NSMutableArray arrayWithArray: oldEvent]; isAllDay = [[oldEvent objectAtIndex: eventIsAllDayIndex] boolValue]; interval = [[oldEvent objectAtIndex: eventStartDateIndex] intValue]; [newEvent addObject: [self _formattedDateForSeconds: interval forAllDay: isAllDay]]; interval = [[oldEvent objectAtIndex: eventEndDateIndex] intValue]; [newEvent addObject: [self _formattedDateForSeconds: interval forAllDay: isAllDay]]; [newEvents addObject: newEvent]; } sort = [[context request] formValueForKey: @"sort"]; if ([sort isEqualToString: @"title"]) [newEvents sortUsingSelector: @selector (compareEventsTitleAscending:)]; else if ([sort isEqualToString: @"end"]) [newEvents sortUsingSelector: @selector (compareEventsEndDateAscending:)]; else if ([sort isEqualToString: @"location"]) [newEvents sortUsingSelector: @selector (compareEventsLocationAscending:)]; else if ([sort isEqualToString: @"calendarName"]) [newEvents sortUsingSelector: @selector (compareEventsCalendarNameAscending:)]; else [newEvents sortUsingSelector: @selector (compareEventsStartDateAscending:)]; ascending = [[context request] formValueForKey: @"asc"]; if (![ascending boolValue]) [newEvents reverseArray]; return [self _responseWithData: newEvents]; } static inline void _feedBlockWithDayBasedData (NSMutableDictionary *block, unsigned int start, unsigned int end, unsigned int dayStart) { unsigned int delta, quarterStart, length, swap; if (start > end) { swap = end; end = start; start = swap; } quarterStart = (start - dayStart) / quarterLength; delta = end - dayStart; if ((delta % quarterLength)) delta += quarterLength; length = (delta / quarterLength) - quarterStart; if (!length) length = 1; [block setObject: [NSNumber numberWithUnsignedInt: quarterStart] forKey: @"start"]; [block setObject: [NSNumber numberWithUnsignedInt: length] forKey: @"length"]; } static inline void _feedBlockWithMonthBasedData (NSMutableDictionary *block, unsigned int start, NSTimeZone *userTimeZone, SOGoDateFormatter *dateFormatter) { NSCalendarDate *eventStartDate; NSString *startHour; eventStartDate = [NSCalendarDate dateWithTimeIntervalSince1970: start]; [eventStartDate setTimeZone: userTimeZone]; startHour = [dateFormatter formattedTime: eventStartDate]; [block setObject: startHour forKey: @"starthour"]; [block setObject: [NSNumber numberWithUnsignedInt: start] forKey: @"start"]; } - (NSMutableDictionary *) _eventBlockWithStart: (unsigned int) start end: (unsigned int) end number: (NSNumber *) number onDay: (unsigned int) dayStart recurrenceTime: (unsigned int) recurrenceTime userState: (iCalPersonPartStat) userState { NSMutableDictionary *block; block = [NSMutableDictionary dictionary]; if (dayBasedView) _feedBlockWithDayBasedData (block, start, end, dayStart); else _feedBlockWithMonthBasedData (block, start, userTimeZone, dateFormatter); [block setObject: number forKey: @"nbr"]; if (recurrenceTime) [block setObject: [NSNumber numberWithInt: recurrenceTime] forKey: @"recurrenceTime"]; if (userState != iCalPersonPartStatOther) [block setObject: [NSNumber numberWithInt: userState] forKey: @"userState"]; return block; } static inline iCalPersonPartStat _userStateInEvent (NSArray *event) { unsigned int count, max; iCalPersonPartStat state; NSString *partList, *stateList; NSArray *participants, *states; SOGoUser *user; participants = nil; state = iCalPersonPartStatOther; partList = [event objectAtIndex: eventPartMailsIndex]; stateList = [event objectAtIndex: eventPartStatesIndex]; if ([partList length] && [stateList length]) { participants = [partList componentsSeparatedByString: @"\n"]; states = [stateList componentsSeparatedByString: @"\n"]; count = 0; max = [participants count]; while (state == iCalPersonPartStatOther && count < max) { user = [SOGoUser userWithLogin: [event objectAtIndex: eventOwnerIndex] roles: nil]; if ([user hasEmail: [participants objectAtIndex: count]]) state = [[states objectAtIndex: count] intValue]; else count++; } } return state; } - (void) _fillBlocks: (NSArray *) blocks withEvent: (NSArray *) event withNumber: (NSNumber *) number { int currentDayStart, startSecs, endsSecs, currentStart, eventStart, eventEnd, computedEventEnd, offset, recurrenceTime, swap; NSMutableArray *currentDay; NSMutableDictionary *eventBlock; iCalPersonPartStat userState; eventStart = [[event objectAtIndex: eventStartDateIndex] intValue]; if (eventStart < 0) [self errorWithFormat: @"event '%@' has negative start: %d (skipped)", [event objectAtIndex: eventNameIndex], eventStart]; else { eventEnd = [[event objectAtIndex: eventEndDateIndex] intValue]; if (eventEnd < 0) [self errorWithFormat: @"event '%@' has negative end: %d (skipped)", [event objectAtIndex: eventNameIndex], eventEnd]; else { if (eventEnd < eventStart) { swap = eventStart; eventStart = eventEnd; eventEnd = swap; [self warnWithFormat: @"event '%@' has end < start: %d < %d", [event objectAtIndex: eventNameIndex], eventEnd, eventStart]; } startSecs = (unsigned int) [startDate timeIntervalSince1970]; endsSecs = (unsigned int) [endDate timeIntervalSince1970]; if ([[event objectAtIndex: eventIsCycleIndex] boolValue]) recurrenceTime = [[event objectAtIndex: eventRecurrenceIdIndex] unsignedIntValue]; else recurrenceTime = 0; currentStart = eventStart; if (currentStart < startSecs) { currentStart = startSecs; offset = 0; } else offset = ((currentStart - startSecs) / dayLength); if (offset >= [blocks count]) [self errorWithFormat: @"event '%@' has a computed offset that" @" overflows the amount of blocks (skipped)", [event objectAtIndex: eventNameIndex]]; else { currentDay = [blocks objectAtIndex: offset]; currentDayStart = startSecs + dayLength * offset; if (eventEnd > endsSecs) eventEnd = endsSecs; if (eventEnd < startSecs) // The event doesn't end in the covered period. // This special case occurs with a DST change. return; userState = _userStateInEvent (event); while (currentDayStart + dayLength < eventEnd) { eventBlock = [self _eventBlockWithStart: currentStart end: currentDayStart + dayLength - 1 number: number onDay: currentDayStart recurrenceTime: recurrenceTime userState: userState]; [currentDay addObject: eventBlock]; currentDayStart += dayLength; currentStart = currentDayStart; offset++; currentDay = [blocks objectAtIndex: offset]; } computedEventEnd = eventEnd; // We add 5 mins to the end date of an event if the end date // is equal or smaller than the event's start date. if (eventEnd <= currentStart) computedEventEnd = currentStart + (5*60); eventBlock = [self _eventBlockWithStart: currentStart end: computedEventEnd number: number onDay: currentDayStart recurrenceTime: recurrenceTime userState: userState]; [currentDay addObject: eventBlock]; } } } } - (void) _prepareEventBlocks: (NSMutableArray **) blocks withAllDays: (NSMutableArray **) allDayBlocks { unsigned int count, nbrDays; int seconds; seconds = [endDate timeIntervalSinceDate: startDate]; if (seconds > 0) { nbrDays = 1 + (unsigned int) (seconds / dayLength); *blocks = [NSMutableArray arrayWithCapacity: nbrDays]; *allDayBlocks = [NSMutableArray arrayWithCapacity: nbrDays]; for (count = 0; count < nbrDays; count++) { [*blocks addObject: [NSMutableArray array]]; [*allDayBlocks addObject: [NSMutableArray array]]; } } else { *blocks = nil; *allDayBlocks = nil; } } - (NSArray *) _horizontalBlocks: (NSMutableArray *) day { NSMutableArray *quarters[96]; NSMutableArray *currentBlock, *blocks; NSDictionary *currentEvent; unsigned int count, max, qCount, qMax, qOffset; blocks = [NSMutableArray array]; bzero (quarters, 96 * sizeof (NSMutableArray *)); max = [day count]; for (count = 0; count < max; count++) { currentEvent = [day objectAtIndex: count]; qMax = [[currentEvent objectForKey: @"length"] unsignedIntValue]; qOffset = [[currentEvent objectForKey: @"start"] unsignedIntValue]; for (qCount = 0; qCount < qMax; qCount++) { currentBlock = quarters[qCount + qOffset]; if (!currentBlock) { currentBlock = [NSMutableArray array]; quarters[qCount + qOffset] = currentBlock; [blocks addObject: currentBlock]; } [currentBlock addObject: currentEvent]; } } return blocks; } static inline unsigned int _computeMaxBlockSiblings (NSArray *block) { unsigned int count, max, maxSiblings, siblings; NSNumber *nbrEvents; max = [block count]; maxSiblings = max; for (count = 0; count < max; count++) { nbrEvents = [[block objectAtIndex: count] objectForKey: @"siblings"]; if (nbrEvents) { siblings = [nbrEvents unsignedIntValue]; if (siblings > maxSiblings) maxSiblings = siblings; } } return maxSiblings; } static inline void _propagateBlockSiblings (NSArray *block, NSNumber *maxSiblings) { unsigned int count, max; NSMutableDictionary *event; NSNumber *realSiblings; max = [block count]; realSiblings = [NSNumber numberWithUnsignedInt: max]; for (count = 0; count < max; count++) { event = [block objectAtIndex: count]; [event setObject: maxSiblings forKey: @"siblings"]; [event setObject: realSiblings forKey: @"realSiblings"]; } } /* this requires two vertical passes */ static inline void _computeBlocksSiblings (NSArray *blocks) { NSArray *currentBlock; unsigned int count, max, maxSiblings; max = [blocks count]; for (count = 0; count < max; count++) { currentBlock = [blocks objectAtIndex: count]; maxSiblings = _computeMaxBlockSiblings (currentBlock); _propagateBlockSiblings (currentBlock, [NSNumber numberWithUnsignedInt: maxSiblings]); } } static inline void _computeBlockPosition (NSArray *block) { unsigned int count, max, j, siblings; NSNumber *position; NSMutableDictionary *event; NSMutableDictionary **positions; max = [block count]; event = [block objectAtIndex: 0]; siblings = [[event objectForKey: @"siblings"] unsignedIntValue]; positions = NSZoneCalloc (NULL, siblings, sizeof (NSMutableDictionary *)); for (count = 0; count < max; count++) { event = [block objectAtIndex: count]; position = [event objectForKey: @"position"]; if (position) *(positions + [position unsignedIntValue]) = event; else { j = 0; while (j < max && *(positions + j)) j++; *(positions + j) = event; [event setObject: [NSNumber numberWithUnsignedInt: j] forKey: @"position"]; } } NSZoneFree (NULL, positions); } // static inline void // _addBlockMultipliers (NSArray *block, NSMutableDictionary **positions) // { // unsigned int count, max, limit, multiplier; // NSMutableDictionary *currentEvent, *event; // max = [block count]; // event = [block objectAtIndex: 0]; // limit = [[event objectForKey: @"siblings"] unsignedIntValue]; // if (max < limit) // { // currentEvent = nil; // for (count = 0; count < limit; count++) // { // multiplier = 1; // event = positions[count]; // if ([[event objectForKey: @"realSiblings"] unsignedIntValue] // < limit) // { // if (event) // { // if (currentEvent && multiplier > 1) // [currentEvent setObject: [NSNumber numberWithUnsignedInt: multiplier] // forKey: @"multiplier"]; // currentEvent = event; // multiplier = 1; // } // else // multiplier++; // } // } // } // } static inline void _computeBlocksPosition (NSArray *blocks) { NSArray *block; unsigned int count, max; // NSMutableDictionary **positions; max = [blocks count]; for (count = 0; count < max; count++) { block = [blocks objectAtIndex: count]; _computeBlockPosition (block); // _addBlockMultipliers (block, positions); // NSZoneFree (NULL, positions); } } - (void) _addBlocksWidth: (NSMutableArray *) day { NSArray *blocks; blocks = [self _horizontalBlocks: day]; _computeBlocksSiblings (blocks); _computeBlocksSiblings (blocks); _computeBlocksPosition (blocks); /* ... _computeBlocksMultiplier() ... */ } - (WOResponse *) eventsBlocksAction { int count, max; NSArray *events, *event, *eventsBlocks; NSMutableArray *allDayBlocks, *blocks, *currentDay; NSNumber *eventNbr; BOOL isAllDay; [self _setupContext]; [self _prepareEventBlocks: &blocks withAllDays: &allDayBlocks]; events = [self _fetchFields: eventsFields forComponentOfType: @"vevent"]; eventsBlocks = [NSArray arrayWithObjects: events, allDayBlocks, blocks, nil]; max = [events count]; for (count = 0; count < max; count++) { event = [events objectAtIndex: count]; // NSLog(@"***[UIxCalListingActions eventsBlocksAction] %i = %@ : %@ / %@ / %@", count, // [event objectAtIndex: eventTitleIndex], // [event objectAtIndex: eventStartDateIndex], // [event objectAtIndex: eventEndDateIndex], // [event objectAtIndex: eventRecurrenceIdIndex]); eventNbr = [NSNumber numberWithUnsignedInt: count]; isAllDay = [[event objectAtIndex: eventIsAllDayIndex] boolValue]; if (dayBasedView && isAllDay) [self _fillBlocks: allDayBlocks withEvent: event withNumber: eventNbr]; else [self _fillBlocks: blocks withEvent: event withNumber: eventNbr]; } max = [blocks count]; for (count = 0; count < max; count++) { currentDay = [blocks objectAtIndex: count]; [currentDay sortUsingSelector: @selector (compareEventByStart:)]; [self _addBlocksWidth: currentDay]; } return [self _responseWithData: eventsBlocks]; // timeIntervalSinceDate: } - (NSString *) _getStatusClassForStatusCode: (int) statusCode andEndDateStamp: (unsigned int) endDateStamp { NSCalendarDate *taskDate, *now; NSString *statusClass; if (statusCode == 1) statusClass = @"completed"; else { if (endDateStamp) { now = [NSCalendarDate calendarDate]; taskDate = [NSCalendarDate dateWithTimeIntervalSince1970: endDateStamp]; [taskDate setTimeZone: userTimeZone]; if ([taskDate earlierDate: now] == taskDate) statusClass = @"overdue"; else { if ([taskDate isToday]) statusClass = @"duetoday"; else statusClass = @"duelater"; } } else statusClass = @"noduedate"; } return statusClass; } - (WOResponse *) tasksListAction { NSMutableArray *filteredTasks, *filteredTask; NSString *sort, *ascending; NSString *statusFlag; SOGoUserSettings *us; NSEnumerator *tasks; NSArray *task; unsigned int endDateStamp; BOOL showCompleted; int statusCode; filteredTasks = [NSMutableArray array]; [self _setupContext]; #warning see TODO in SchedulerUI.js about "setud" showCompleted = [[request formValueForKey: @"show-completed"] intValue]; if ([request formValueForKey: @"setud"]) { us = [[context activeUser] userSettings]; [us setBool: showCompleted forKey: @"ShowCompletedTasks"]; [us synchronize]; } tasks = [[self _fetchFields: tasksFields forComponentOfType: @"vtodo"] objectEnumerator]; while ((task = [tasks nextObject])) { statusCode = [[task objectAtIndex: 3] intValue]; if (statusCode != 1 || showCompleted) { filteredTask = [NSMutableArray arrayWithArray: task]; endDateStamp = [[task objectAtIndex: 5] intValue]; statusFlag = [self _getStatusClassForStatusCode: statusCode andEndDateStamp: endDateStamp]; [filteredTask addObject: statusFlag]; if (endDateStamp > 0) [filteredTask addObject: [self _formattedDateForSeconds: endDateStamp forAllDay: NO]]; [filteredTasks addObject: filteredTask]; } } sort = [[context request] formValueForKey: @"sort"]; if ([sort isEqualToString: @"title"]) [filteredTasks sortUsingSelector: @selector (compareTasksTitleAscending:)]; else if ([sort isEqualToString: @"priority"]) [filteredTasks sortUsingSelector: @selector (compareTasksPriorityAscending:)]; else if ([sort isEqualToString: @"end"]) [filteredTasks sortUsingSelector: @selector (compareTasksEndAscending:)]; else if ([sort isEqualToString: @"location"]) [filteredTasks sortUsingSelector: @selector (compareTasksLocationAscending:)]; else if ([sort isEqualToString: @"category"]) [filteredTasks sortUsingSelector: @selector (compareTasksCategoryAscending:)]; else if ([sort isEqualToString: @"calendarname"]) [filteredTasks sortUsingSelector: @selector (compareTasksCalendarNameAscending:)]; else [filteredTasks sortUsingSelector: @selector (compareTasksAscending:)]; ascending = [[context request] formValueForKey: @"asc"]; if (![ascending boolValue]) [filteredTasks reverseArray]; return [self _responseWithData: filteredTasks]; } @end SOGo-2.1.1b/UI/Scheduler/UIxCalFolderActions.h0000644000000000000000000000202612247657030017376 0ustar rootroot/* Copyright (C) 2006-2013 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG This file is part of SOGo SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __UIxContactsListView_H__ #define __UIxContactsListView_H__ #import @class NSDictionary; @class NSString; @interface UIxCalFolderActions : UIxComponent { } @end #endif /* __UIxContactsListView_H__ */ SOGo-2.1.1b/UI/Scheduler/Czech.lproj/0000755000000000000000000000000012247657027015612 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Czech.lproj/Localizable.strings0000644000000000000000000004215512247657027021455 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "VytvoÅ™it novou událost"; "Create a new task" = "VytvoÅ™it nový úkol"; "Edit this event or task" = "Upravit tuto událost nebo úkol"; "Delete this event or task" = "Smazat tuto událost nebo úkol"; "Go to today" = "PÅ™ejde na dneÅ¡ní den"; "Switch to day view" = "PÅ™epnout na denní zobrazení"; "Switch to week view" = "PÅ™epnout na týdenní zobrazení"; "Switch to month view" = "PÅ™epnout na mÄ›síÄní zobrazení"; "Reload all calendars" = "Aktualizovat vÅ¡echny kalendáře"; /* Tabs */ "Date" = "Datum"; "Calendars" = "Kalendáře"; /* Day */ "DayOfTheMonth" = "DayOfTheMonth"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "Dnes"; "Previous Day" = "PÅ™edchozí den"; "Next Day" = "Následující den"; /* Week */ "Week" = "Týden"; "this week" = "tento týden"; "Week %d" = "Týden %d"; "Previous Week" = "PÅ™edchozí týden"; "Next Week" = "Následující týden"; /* Month */ "this month" = "tento mÄ›síc"; "Previous Month" = "PÅ™edchozí mÄ›síc"; "Next Month" = "Následující mÄ›síc"; /* Year */ "this year" = "letos"; /* Menu */ "Calendar" = "Kalendář"; "Contacts" = "Kontakty"; "New Calendar..." = "Nový kalendář..."; "Delete Calendar" = "Smazat kalendář"; "Unsubscribe Calendar" = "Unsubscribe Calendar"; "Sharing..." = "Sdílení..."; "Export Calendar..." = "Exportovat kalendář..."; "Import Events..." = "Importovat události..."; "Import Events" = "Importovat události"; "Select an iCalendar file (.ics)." = "Zvolte iCalendar soubor (*.ics)."; "Upload" = "Nahrát"; "Uploading" = "Nahrávání"; "Publish Calendar..." = "Publikovat kalendář..."; "Reload Remote Calendars" = "Aktualizovat vzdálené kalendáře"; "Properties" = "Vlastnosti"; "Done" = "Hotovo"; "An error occurred while importing calendar." = "PÅ™i importu událostí doÅ¡lo k chybÄ›."; "No event was imported." = "Nebyla importována žádná událost."; "A total of %{0} events were imported in the calendar." = "Do kalendáře bylo importováno %{0} událostí."; "Compose E-Mail to All Attendees" = "VytvoÅ™it e-mail pro vÅ¡echny úÄastníky"; "Compose E-Mail to Undecided Attendees" = "VytvoÅ™it e-mail pro nerozhodnuté úÄastníky"; /* Folders */ "Personal calendar" = "Osobní kalendář"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Zakázaná"; /* acls */ "Access rights to" = "Přístupová práva k"; "For user" = "Pro uživatele"; "Any Authenticated User" = "Každý ověřený uživatel"; "Public Access" = "VeÅ™ejný přístup"; "label_Public" = "VeÅ™ejné"; "label_Private" = "Soukromé"; "label_Confidential" = "DůvÄ›rné"; "label_Viewer" = "Zobrazit vÅ¡e"; "label_DAndTViewer" = "Zobrazit datum a Äas"; "label_Modifier" = "Upravit"; "label_Responder" = "OdpovÄ›dÄ›t komu"; "label_None" = "Žádný"; "View All" = "Zobrazit vÅ¡e"; "View the Date & Time" = "Zobrazit datum a Äas"; "Modify" = "Upravit"; "Respond To" = "OdpovÄ›dÄ›t komu"; "None" = "Žádný"; "This person can create objects in my calendar." = "Tato osoba může vytvářet objekty v mém kalendáři."; "This person can erase objects from my calendar." = "Tato osoba může mazat objekty z mého kalendáře."; /* Button Titles */ "Subscribe to a Calendar..." = "Odebírat kalendář..."; "Remove the selected Calendar" = "Smazat zvolený kalendář"; "Name of the Calendar" = "Název kalendáře"; "new" = "Nový"; "printview" = "Náhled tisku"; "edit" = "Upravit"; "delete" = "Smazat"; "proposal" = "Návrh"; "Save and Close" = "Uložit a zavřít"; "Close" = "Zavřít"; "Invite Attendees" = "Pozvat úÄastníky"; "Attach" = "PÅ™ipojit"; "Update" = "Aktualizace"; "Cancel" = "Storno"; "show_rejected_apts" = "Ukázat odmítnuté schůzky"; "hide_rejected_apts" = "Skrýt odmítnuté schůzky"; /* Schedule */ "Schedule" = "Plán"; "No appointments found" = "Nenalezeny žádné schůzky"; "Meetings proposed by you" = "Schůzky navržené Vámi"; "Meetings proposed to you" = "Schůzky navržené Vám"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Akce"; "accept" = "PÅ™ijmout"; "decline" = "Odmítnout"; "more attendees" = "Více úÄastníků"; "Hide already accepted and rejected appointments" = "Skrýt již pÅ™ijaté a odmítnuté schůzky"; "Show already accepted and rejected appointments" = "Zobrazit již pÅ™ijaté a odmítnuté schůzky"; /* Appointments */ "Appointment viewer" = "Zobrazit schůzky"; "Appointment editor" = "Editovat schůzky"; "Appointment proposal" = "Navrhnout schůzku"; "Appointment on" = "Schůzka na"; "Start:" = "ZaÄátek:"; "End:" = "Konec:"; "Due Date:" = "Datum splnÄ›ní:"; "Title:" = "Název:"; "Calendar:" = "Kalendář:"; "Name" = "Jméno"; "Email" = "E-Mail"; "Status:" = "Status:"; "% complete" = "% hotovo"; "Location:" = "Místo:"; "Priority:" = "Priorita:"; "Privacy" = "Soukromí"; "Cycle" = "Cyklus opakování"; "Cycle End" = "Konec cyklu"; "Categories" = "Kategorie"; "Classification" = "Klasifikace"; "Duration" = "Trvání"; "Attendees:" = "ÚÄastníci:"; "Resources" = "Zdroje"; "Organizer:" = "Organizátor:"; "Description:" = "Popis:"; "Document:" = "Dokument:"; "Category:" = "Kategorie:"; "Repeat:" = "Opakování:"; "Reminder:" = "PÅ™ipomenutí:"; "General:" = "Obecný:"; "Reply:" = "OdpovÄ›Ä:"; "Created by:" = "VytvoÅ™eno:"; "Target:" = "Vložte adresu webové stránky nebo dokumentu."; "attributes" = "atributy"; "attendees" = "úÄastníci"; "delegated from" = "delegováno od"; /* checkbox title */ "is private" = "je soukromý/á"; /* classification */ "Public" = "VeÅ™ejný"; "Private" = "Soukromý"; /* text used in overviews and tooltips */ "empty title" = "Prázdný název"; "private appointment" = "Soukromá schůzka"; "Change..." = "ZmÄ›nit..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Potvrdím pozdÄ›ji"; "partStat_ACCEPTED" = "ZúÄastním se"; "partStat_DECLINED" = "NezúÄastním se"; "partStat_TENTATIVE" = "NezávaznÄ›"; "partStat_DELEGATED" = "Deleguji"; "partStat_OTHER" = "Ostatní"; /* Appointments (error messages) */ "Conflicts found!" = "Nalezeno pÅ™ekrývání"; "Invalid iCal data!" = "Neplatná iCal data"; "Could not create iCal data!" = "Nebylo možné vytvoÅ™it iCal data!"; /* Searching */ "view_all" = "VÅ¡echna"; "view_today" = "DneÅ¡ní události"; "view_next7" = "Následujících 7 dní"; "view_next14" = "Následujících 14 dní"; "view_next31" = "Následujících 31 dní"; "view_thismonth" = "Tento mÄ›síc"; "view_future" = "VÅ¡echny budoucí události"; "view_selectedday" = "Zvolený den"; "View:" = "Zobrazit:"; "Title or Description" = "Název nebo popis"; "Search" = "Vyhledat"; "Search attendees" = "Vyhledat úÄastníky"; "Search resources" = "Vyhledat zdroje"; "Search appointments" = "Vyhledat schůzky"; "All day Event" = "Celodenní událost"; "check for conflicts" = "Zkontrolovat pÅ™ekrývání"; "Browse URL" = "Prozkoumat URL"; "newAttendee" = "PÅ™idat úÄastníka"; /* calendar modes */ "Overview" = "PÅ™ehled"; "Chart" = "Tabulka"; "List" = "Seznam"; "Columns" = "Sloupy"; /* Priorities */ "prio_0" = "Nespecifikovaná"; "prio_1" = "Vysoká"; "prio_2" = "Vysoká"; "prio_3" = "Vysoká"; "prio_4" = "Vysoká"; "prio_5" = "Normální"; "prio_6" = "Nízká"; "prio_7" = "Nízká"; "prio_8" = "Nízká"; "prio_9" = "Nízká"; /* access classes (privacy) */ "PUBLIC_vevent" = "VeÅ™ejná událost"; "CONFIDENTIAL_vevent" = "DůvÄ›rná událost"; "PRIVATE_vevent" = "Soukromá událost"; "PUBLIC_vtodo" = "VeÅ™ejný úkol"; "CONFIDENTIAL_vtodo" = "DůvÄ›rný úkol"; "PRIVATE_vtodo" = "Osobní úkol"; /* status type */ "status_" = "Nespecifikovaný"; "status_NOT-SPECIFIED" = "Nespecifikovaný"; "status_TENTATIVE" = "NezávaznÄ›"; "status_CONFIRMED" = "Potvrzený"; "status_CANCELLED" = "ZruÅ¡ený"; "status_NEEDS-ACTION" = "Vyžaduje akci"; "status_IN-PROCESS" = "Probíhající"; "status_COMPLETED" = "Hotov"; /* Cycles */ "cycle_once" = "cyklus_jednou"; "cycle_daily" = "cyklus_dennÄ›"; "cycle_weekly" = "cyklus_týdnÄ›"; "cycle_2weeks" = "cyklus_2týdenní"; "cycle_4weeks" = "cyklus_4týdenní"; "cycle_monthly" = "cyklus_mÄ›síÄní"; "cycle_weekday" = "cyklus_pracovnídny"; "cycle_yearly" = "cyklus_roÄní"; "cycle_end_never" = "cyklus_konec_nikdy"; "cycle_end_until" = "cyklus_konec_do"; "Recurrence pattern" = "Vzor opakování"; "Range of recurrence" = "Rozsah opakování"; "Repeat" = "Opakování"; "Daily" = "Denní"; "Weekly" = "Týdenní"; "Monthly" = "MÄ›síÄní"; "Yearly" = "RoÄní"; "Every" = "Každých"; "Days" = "Dní"; "Week(s)" = "Týdnů"; "On" = "V"; "Month(s)" = "MÄ›síců"; "The" = "The"; "Recur on day(s)" = "Opakovat ve dnech"; "Year(s)" = "rocích"; "cycle_of" = "of"; "No end date" = "Bez data konce"; "Create" = "VytvoÅ™it"; "appointment(s)" = "schůzku/y"; "Repeat until" = "Opakovat do"; "First" = "První"; "Second" = "Druhý"; "Third" = "TÅ™etí"; "Fourth" = "ÄŒtvrtý"; "Fift" = "Pátý"; "Last" = "Poslední"; /* Appointment categories */ "category_none" = "Žádný"; "category_labels" = "VýroÄí,Narozeniny,Obchod,Hovory,Klienti,Soutěže,Zákazník,Oblíbené,Sledování,Dárky,Volno,Nápady,Meeting,Problémy,Různé,Osobní,Projekty,VeÅ™ejné prázdniny,Stav,Dodavatelé,Cesta,Dovolená"; "repeat_NEVER" = "Neopakuje se"; "repeat_DAILY" = "DennÄ›"; "repeat_WEEKLY" = "TýdnÄ›"; "repeat_BI-WEEKLY" = "Každý druhý týden"; "repeat_EVERY WEEKDAY" = "Každý pracovní den"; "repeat_MONTHLY" = "MÄ›síÄnÄ›"; "repeat_YEARLY" = "RoÄnÄ›"; "repeat_CUSTOM" = "Vlastní..."; "reminder_NONE" = "Bez pÅ™ipomenutí"; "reminder_5_MINUTES_BEFORE" = "5 minut pÅ™ed"; "reminder_10_MINUTES_BEFORE" = "10 minut pÅ™ed"; "reminder_15_MINUTES_BEFORE" = "15 minut pÅ™ed"; "reminder_30_MINUTES_BEFORE" = "30 minut pÅ™ed"; "reminder_45_MINUTES_BEFORE" = "45 minut pÅ™ed"; "reminder_1_HOUR_BEFORE" = "1 hodinu pÅ™ed"; "reminder_2_HOURS_BEFORE" = "2 hodiny pÅ™ed"; "reminder_5_HOURS_BEFORE" = "5 hodin pÅ™ed"; "reminder_15_HOURS_BEFORE" = "15 hodin pÅ™ed"; "reminder_1_DAY_BEFORE" = "1 den pÅ™ed"; "reminder_2_DAYS_BEFORE" = "2 dny pÅ™ed"; "reminder_1_WEEK_BEFORE" = "1 týden pÅ™ed"; "reminder_CUSTOM" = "Vlastní..."; "reminder_MINUTES" = "minuty"; "reminder_HOURS" = "hodiny"; "reminder_DAYS" = "dny"; "reminder_BEFORE" = "pÅ™ed"; "reminder_AFTER" = "po"; "reminder_START" = "zaÄátku/em události"; "reminder_END" = "konci události"; "Reminder Details" = "Podrobnosti pÅ™ipomenutí"; "Choose a Reminder Action" = "Zvolit akci"; "Show an Alert" = "Zobrazit výstrahu"; "Send an E-mail" = "Poslat e-mai"; "Email Organizer" = "E-mail organizátorovi"; "Email Attendees" = "E-mail úÄastníkům"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "ÄŒas zobrazit jako volný"; /* email notifications */ "Send Appointment Notifications" = "Poslat upozornÄ›ní na schůzku"; /* validation errors */ validate_notitle = "Název nebyl nastaven, pokraÄovat?"; validate_invalid_startdate = "Chybné datum zaÄátku!"; validate_invalid_enddate = "Chybné datum konce!"; validate_endbeforestart = "Zadané datum konce je pÅ™ed zaÄátkem události."; "Events" = "Události"; "Tasks" = "Úkoly"; "Show completed tasks" = "Zobrazit dokonÄené úkoly"; /* tabs */ "Task" = "Úkol"; "Event" = "Událost"; "Recurrence" = "Opakování"; /* toolbar */ "New Event" = "Nová událost"; "New Task" = "Nový úkol"; "Edit" = "Upravit"; "Delete" = "Smazat"; "Go to Today" = "DneÅ¡ní den"; "Day View" = "Den"; "Week View" = "Týden"; "Month View" = "MÄ›síc"; "Reload" = "Aktualizovat"; "eventPartStatModificationError" = "Status Vaší úÄasti nemohl být zmÄ›nÄ›n."; /* menu */ "New Event..." = "Nová událost..."; "New Task..." = "Nový úkol..."; "Edit Selected Event..." = "Upravit oznaÄenou událost..."; "Delete Selected Event" = "Smazat oznaÄenou událost"; "Select All" = "Vybrat vÅ¡e"; "Workweek days only" = "Pouze pracovní dny"; "Tasks in View" = "Zobrazené úkoly"; "eventDeleteConfirmation" = "Tato událost(i) bude smazána:\n%{0}\nChcete pokraÄovat?"; "taskDeleteConfirmation" = "Smazání tohoto úkolu je permanentní.\nChcete pokraÄovat?"; "You cannot remove nor unsubscribe from your personal calendar." = "Nemůžete odebrat nebo se odhlásit z odebírání svého vlastního kalendáře."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Opravdu chcete smazat kalendář \"%{0}\"?"; /* Legend */ "Participant" = "ÚÄastník"; "Optional Participant" = "Nepovinný úÄastník"; "Non Participant" = "Na vÄ›domí"; "Chair" = "PÅ™edsedající"; "Needs action" = "Vyžaduje akci"; "Accepted" = "ZúÄastníse"; "Declined" = "NezúÄastníse"; "Tentative" = "NezávaznÄ›"; "Free" = "Volno"; "Busy" = "Není volno"; "Maybe busy" = "Možná není volno"; "No free-busy information" = "Bez informací"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Navrhnout Äas"; "Zoom:" = "PÅ™iblížit:"; "Previous slot" = "PÅ™edchozí místo"; "Next slot" = "Následující místo"; "Previous hour" = "PÅ™edchozí hodina"; "Next hour" = "Následující hodina"; "Work days only" = "Pouze pracovní dny"; "The whole day" = "Celý den"; "Between" = "mezi"; "and" = "a"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Mezi úÄastníky dochází k Äasovému konfliktu.\nPonecháte souÄasné nastavení i pÅ™esto?"; /* apt list */ "Title" = "Název"; "Start" = "ZaÄátek"; "End" = "Konec"; "Due Date" = "Datum splnÄ›ní"; "Location" = "Místo"; "(Private Event)" = "(Soukromá událost)"; vevent_class0 = "(VeÅ™ejná událost)"; vevent_class1 = "(Soukromá událost)"; vevent_class2 = "(DůvÄ›rná událost)"; "Priority" = "Priorita"; "Category" = "Kategorie"; vtodo_class0 = "(VeÅ™ejný úkol)"; vtodo_class1 = "(Soukromý úkol)"; vtodo_class2 = "(DůvÄ›rný úkol)"; "closeThisWindowMessage" = "DÄ›kujeme! Nyní můžete okno zavřít nebo se podívat na vaÅ¡e "; "Multicolumn Day View" = "Vícesloupkové denní zobrazení"; "Please select an event or a task." = "Vyberte prosím událost nebo úkol."; "editRepeatingItem" = "Položka, kterou upravujete, se opakuje. Chcete opravit veÅ¡kerá opakování nebo pouze tuto?"; "button_thisOccurrenceOnly" = "Pouze toto opakování"; "button_allOccurrences" = "VÅ¡echna opakování"; /* Properties dialog */ "Name:" = "Název:"; "Color:" = "Barva:"; "Include in free-busy" = "Zahrnout do obsazeného Äasu (free-busy)"; "Synchronization" = "Synchronizace"; "Synchronize" = "Synchronizovat"; "Tag:" = "Å títek:"; "Display" = "Zobrazení"; "Show alarms" = "Zobrazit pÅ™ipomenutí"; "Show tasks" = "Zobrazit úkoly"; "Notifications" = "PÅ™ipomenutí"; "Receive a mail when I modify my calendar" = "Obdržet zprávu když upravím svůj kalendář"; "Receive a mail when someone else modifies my calendar" = "Obdržet zprávu když nÄ›kdo jiný upraví můj kalendář"; "When I modify my calendar, send a mail to:" = "Když upravím svůj kalendář, poslat zprávu na:"; "Links to this Calendar" = "Odkazy na tento kalendář"; "Authenticated User Access" = "Přístup pro ověřené uživatele"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "V políÄku Dny zadejte Äíselnou hodnotu vÄ›tší nebo rovnu 1."; "weekFieldInvalid" = "V políÄku Týden zadejte Äíselnou hodnotu vÄ›tší nebo rovnu 1."; "monthFieldInvalid" = "V políÄku MÄ›síc zadejte Äíselnou hodnotu vÄ›tší nebo rovnu 1."; "monthDayFieldInvalid" = "V políÄku Den v mÄ›síci zadejte Äíselnou hodnotu vÄ›tší nebo rovnu 1."; "yearFieldInvalid" = "V políÄku Rok zadejte Äíselnou hodnotu vÄ›tší nebo rovnu 1."; "appointmentFieldInvalid" = "V políÄku PÅ™ipomenutí zadejte Äíselnou hodnotu vÄ›tší nebo rovnu 1."; "recurrenceUnsupported" = "Tento typ opakování není podporován."; "Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Chcete-li synchronizovat tento kalendář, musíte zadat jeho Å títek."; "tagAlreadyExists" = "Zadaný Å¡títek je již pÅ™iÅ™azen jinému kalendáři."; "tagHasChanged" = "ZmÄ›níte-li Å¡títek svého kalendáře, budete muset znovu naÄíst data do svého mobilního zařízení.\nPokraÄovat?"; "tagWasAdded" = "Chcete-li synchronizovat tento kalendář, budete muset znovu naÄíst data do svého mobilního zařízení.\nPokraÄovat?"; "tagWasRemoved" = "Odstraníte-li u tohoto kalendáře synchronizaci, budete muset znovu naÄíst data do svého mobilního zařízení.\nPokraÄovat?"; "DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; "EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; "Open Task..." = "Otevřít úkol..."; "Mark Completed" = "OznaÄit jako dokonÄené"; "Delete Task" = "Smazat úkol"; "Delete Event" = "Smazat událost"; "Copy event to my calendar" = "Copy event to my calendar"; "View Raw Source" = "Zobrazit surový zdroj"; "Subscribe to a web calendar..." = "Odebírat vzdálený kalendář na webu"; "URL of the Calendar" = "Adresa vzdáleného kalendáře na webu"; "Web Calendar" = "Vzdálený kalendář na webu"; "Reload on login" = "Aktualizovat pÅ™i pÅ™ihlášení"; "Invalid number." = "Invalid number."; "Please identify yourself to %{0}" = "Identifikujte se na %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxCalMainActions.h0000644000000000000000000000175412247657030017056 0ustar rootroot/* UIxCalMainActions.h - this file is part of SOGo * * Copyright (C) 2009-2013 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef UIXCALMAINACTIONS_H #define UIXCALMAINACTIONS_H #import @interface UIxCalMainActions : WODirectAction @end #endif /* UIXCALMAINACTIONS_H */ SOGo-2.1.1b/UI/Scheduler/UIxCalView.h0000644000000000000000000000637212247657030015564 0ustar rootroot/* UIxCalView.h - this file is part of SOGo * * Copyright (C) 2006-2009 Inverse inc. * * 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 __SOGo_UIxCalView_H__ #define __SOGo_UIxCalView_H__ #include /* UIxCalView Superclass for most components which render a set of appointments coming from a SOPE clientObject (which usually is an SOGoAppointmentFolder). */ @class NSArray; @class NSCalendarDate; @class NSDictionary; @class NSMutableDictionary; @class NSString; @class NSTimeZone; @class SOGoAptFormatter; @class SOGoAppointmentFolder; @interface UIxCalView : UIxComponent { NSArray *appointments; NSMutableDictionary *componentsData; NSArray *tasks; NSArray *allDayApts; id appointment; NSCalendarDate *currentDay; NSTimeZone *timeZone; SOGoAptFormatter *aptFormatter; SOGoAptFormatter *aptTooltipFormatter; SOGoAptFormatter *privateAptFormatter; SOGoAptFormatter *privateAptTooltipFormatter; struct { unsigned isMyApt : 1; unsigned canAccessApt : 1; unsigned RESERVED : 30; } aptFlags; } /* config */ - (void) configureFormatters; /* accessors */ - (NSArray *) appointments; - (void) setAppointments: (NSArray *) _apts; - (void) setTasks: (NSArray *) _tasks; - (NSArray *) tasks; - (NSArray *) allDayApts; - (id) appointment; - (BOOL) isMyApt; - (BOOL) canAccessApt; /* protection */ - (BOOL) hasDayInfo; - (BOOL) hasHoldidayInfo; - (BOOL) hasAllDayApts; - (NSDictionary *) aptTypeDict; - (NSString *) aptTypeLabel; - (NSString *) aptTypeIcon; - (SOGoAptFormatter *) aptFormatter; - (NSString *) shortTextForApt; - (NSString *) shortTitleForApt; - (NSString *) tooltipForApt; - (NSString *) appointmentViewURL; - (id) holidayInfo; /* related to current day */ - (void) setCurrentDay: (NSCalendarDate *) _day; - (NSCalendarDate *) currentDay; - (NSString *) currentDayName; /* localized */ /* defaults */ - (BOOL) showFullNames; - (BOOL) showAMPMDates; - (unsigned) dayStartHour; - (unsigned) dayEndHour; - (BOOL) shouldDisplayRejectedAppointments; - (NSCalendarDate *) referenceDateForFormatter; - (NSCalendarDate *) thisMonth; - (NSCalendarDate *) nextMonth; - (void) setCurrentView: (NSString *) theView; /* fetching */ - (NSCalendarDate *) startDate; - (NSCalendarDate *) endDate; /* date selection */ - (NSDictionary *) todayQueryParameters; - (NSDictionary *) currentDayQueryParameters; /* CSS related */ - (NSString *) aptStyle; /* protected methods */ - (NSDictionary *) _dateQueryParametersWithOffset: (int) daysOffset; @end #endif /* __SOGo_UIxCalView_H__ */ SOGo-2.1.1b/UI/Scheduler/Welsh.lproj/0000755000000000000000000000000012247657030015632 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Welsh.lproj/Localizable.strings0000644000000000000000000003731012247657030021472 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Creu digwyddiad newydd"; "Create a new task" = "Creu tasg newydd"; "Edit this event or task" = "Golygu'r digwyddiad neu'r dasg"; "Delete this event or task" = "Dileu'r digwyddiad neu'r dasg"; "Go to today" = "Ewch i heddiw"; "Switch to day view" = "Newid i olygfa diwrnod"; "Switch to week view" = "Newid i olygfa wythnos"; "Switch to month view" = "Newid i olygfa mis"; "Reload all calendars" = "Reload all calendars"; /* Tabs */ "Date" = "Dyddiad"; "Calendars" = "Calendrau"; /* Day */ "DayOfTheMonth" = "DayOfTheMonth"; "dayLabelFormat" = "%m/%d/%Y"; "today" = "Heddiw"; "Previous Day" = "Previous Day"; "Next Day" = "Next Day"; /* Week */ "Week" = "wythnos"; "this week" = "yr wythnos hon"; "Week %d" = "Week %d"; "Previous Week" = "Previous Week"; "Next Week" = "Next Week"; /* Month */ "this month" = "mis hon"; "Previous Month" = "Previous Month"; "Next Month" = "Next Month"; /* Year */ "this year" = "y flwyddyn hon"; /* Menu */ "Calendar" = "Calendr"; "Contacts" = "Cysylltiadau"; "New Calendar..." = "Calendr Newydd..."; "Delete Calendar" = "Dileu Calendar"; "Unsubscribe Calendar" = "Unsubscribe Calendar"; "Sharing..." = "Rhannu..."; "Export Calendar..." = "Allfudo Calendr..."; "Import Events..." = "Import Events..."; "Import Events" = "Import Events"; "Select an iCalendar file (.ics)." = "Select an iCalendar file (.ics)."; "Upload" = "Upload"; "Publish Calendar..." = "Cyhoeddi Calendr..."; "Reload Remote Calendars" = "Ail-lwytho Calendrau Anghysbell"; "Properties" = "Dewisiadau"; "Done" = "Done"; "An error occurred while importing calendar." = "An error occurred while importing calendar."; "No event was imported." = "No event was imported."; "A total of %{0} events were imported in the calendar." = "A total of %{0} events were imported in the calendar."; "Compose E-Mail to All Attendees" = "Cyfansoddi Ebost i bawb sy'n mynychu"; "Compose E-Mail to Undecided Attendees" = "Cyfansoddi Ebost i bawb sydd heb benderfynu"; /* Folders */ "Personal calendar" = "Calendr Personol"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Gwaharddedig"; /* acls */ "User rights for:" = "hawliau defnyddiwr i:"; "Any Authenticated User" = "Any Authenticated User"; "Public Access" = "Public Access"; "label_Public" = "Cyhoeddus"; "label_Private" = "Preifat"; "label_Confidential" = "Cyfrinachol"; "label_Viewer" = "Dangos cyfan"; "label_DAndTViewer" = "Dangos amser a dyddiad"; "label_Modifier" = "Newid"; "label_Responder" = "Ymateb i"; "label_None" = "Dim"; "View All" = "Dangos y cyfan"; "View the Date & Time" = "Dangos y dyddiad a'r amser"; "Modify" = "Newid"; "Respond To" = "Ymateb i"; "None" = "Dim"; "This person can create objects in my calendar." = "Gall y person yma creu gwrthrychau yn fy nghalendr."; "This person can erase objects from my calendar." = "Gall y person hwn ddileu gwrthrychau o fy nghalendr."; /* Button Titles */ "New Calendar..." = "Calendr Newydd..."; "Subscribe to a Calendar..." = "Tanysgrifio i Galendr..."; "Remove the selected Calendar" = "Dileu y calendr dewisol"; "Name of the Calendar" = "Enw'r Calendr"; "new" = "Newydd"; "printview" = "Golygfa argraffu"; "edit" = "Golygu"; "delete" = "Dileu"; "proposal" = "Cynnig"; "Save and Close" = "Cadw a Cau"; "Close" = "Cau"; "Invite Attendees" = "Gwahodd Mynychwyr"; "Attach" = "Ceangail"; "Update" = "Diweddaru"; "Cancel" = "Canslo"; "show_rejected_apts" = "Dangos apwyntiadau a gwrthodwyd"; "hide_rejected_apts" = "Cuddio apwyntiadau a gwrthodwyd"; /* Schedule */ "Schedule" = "Rhaglen"; "No appointments found" = "Ni chwiliwyd unrhyw apwyntiadau"; "Meetings proposed by you" = "Cyfarfodydd a gynnigwyd gennych chi"; "Meetings proposed to you" = "Cyfarfodydd a gynnigwyd i chi"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Gweithred"; "accept" = "Derbyn"; "decline" = "Gwrthod"; "more attendees" = "Mwy o Fynychwyr"; "Hide already accepted and rejected appointments" = "Cuddio apwyntiadau sydd eisoes wedi derbyn a gwrthod"; "Show already accepted and rejected appointments" = "Dangos apwyntiadau sydd eisoes wedi derbyn neu gwrthod"; /* Appointments */ "Appointment viewer" = "Syllwr Apwyntiadau"; "Appointment editor" = "Golygydd Apwyntiadau"; "Appointment proposal" = "Cynnig Apwyntiad"; "Appointment on" = "Apwyntiad ar"; "Start:" = "Dechrau:"; "End:" = "Diwedd:"; "Due Date:" = "Dyddiad dyledus:"; "Title:" = "Teitl:"; "Calendar:" = "Calendr:"; "Name" = "Enw"; "Email" = "Ebost"; "Status:" = "Statws:"; "% complete" = "% cwblhau"; "Location:" = "Lleoliad:"; "Priority:" = "Blaenoriaeth:"; "Privacy" = "Preifatrwydd"; "Cycle" = "Cylch"; "Cycle End" = "Diwedd Cylch"; "Categories" = "Categoriau"; "Classification" = "Dosbarthiad"; "Duration" = "Parhad"; "Attendees:" = "Mynychwyr:"; "Resources" = "Adnoddau"; "Organizer:" = "Trefnwr:"; "Description:" = "Disgrifiad:"; "Document:" = "Dogfen:"; "Category:" = "Categori:"; "Repeat:" = "Ailwneud:"; "Reminder:" = "Atgoffa:"; "General:" = "General:"; "Reply:" = "Reply:"; "Target:" = "Targed:"; "attributes" = "priodoleddau"; "attendees" = "mynychwyr"; "delegated from" = "delegated from"; /* checkbox title */ "is private" = "yn breifat"; /* classification */ "Public" = "Cyhoeddus"; "Private" = "Preifat"; /* text used in overviews and tooltips */ "empty title" = "Teitl Gwag"; "private appointment" = "Apwyntiad preifat"; "Change..." = "Newid..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Angen gweithred"; "partStat_ACCEPTED" = "Derbyniwyd"; "partStat_DECLINED" = "Gwrthodwyd"; "partStat_TENTATIVE" = "Petrus"; "partStat_DELEGATED" = "Dirprwyedig"; "partStat_OTHER" = "Arall"; /* Appointments (error messages) */ "Conflicts found!" = "Gwrthdaro!"; "Invalid iCal data!" = "Data iCal annilys!"; "Could not create iCal data!" = "Methwyd creu data iCal!"; /* Searching */ "view_all" = "Oll"; "view_today" = "Heddiw"; "view_next7" = "7 diwrnod nesaf"; "view_next14" = "14 diwrnod nesaf"; "view_next31" = "31 diwrnod nesaf"; "view_thismonth" = "Y mis yma"; "view_future" = "Holl digwyddiadau'r dyfodol"; "view_selectedday" = "Diwrnod dewisol"; "View:" = "Golygfa:"; "Title or Description" = "Teitl neu disgrifiad"; "Search" = "Chwilio"; "Search attendees" = "Chwilio mynychwyr"; "Search resources" = "Chwilio adnoddau"; "Search appointments" = "Chwilio apwyntiadau"; "All day Event" = "Digwyddiad trwy'r dydd"; "check for conflicts" = "Gwirio gwrthdaro"; "Browse URL" = "Pori URL"; "newAttendee" = "Ychwanegu mynychwr"; /* calendar modes */ "Overview" = "Trosolwg"; "Chart" = "Siart"; "List" = "Rhestr"; "Columns" = "Colofnau"; /* Priorities */ "prio_0" = "Not specified"; "prio_1" = "Uchel"; "prio_2" = "Uchel"; "prio_3" = "Uchel"; "prio_4" = "Uchel"; "prio_5" = "Normal"; "prio_6" = "Isel"; "prio_7" = "Isel"; "prio_8" = "Isel"; "prio_9" = "Isel"; /* access classes (privacy) */ "PUBLIC_vevent" = "Digwyddiad cyhoeddus"; "CONFIDENTIAL_vevent" = "Digwyddiad cyfrinachol"; "PRIVATE_vevent" = "Digwyddiad preifat"; "PUBLIC_vtodo" = "Tasg gyhoeddus"; "CONFIDENTIAL_vtodo" = "Tasg gyfrinachol"; "PRIVATE_vtodo" = "Tasg breifat"; /* status type */ "status_" = "nid penodedig"; "status_NOT-SPECIFIED" = "nid penodedig"; "status_TENTATIVE" = "Petrus"; "status_CONFIRMED" = "Cadarnhawyd"; "status_CANCELLED" = "Canslwyd"; "status_NEEDS-ACTION" = "Angen gweithred"; "status_IN-PROCESS" = "Mewn proses"; "status_COMPLETED" = "Cwblhawyd ar"; /* Cycles */ "cycle_once" = "Cylch-unwaith"; "cycle_daily" = "cylch-dyddiol"; "cycle_weekly" = "cylch_wythnosol"; "cycle_2weeks" = "cylch-2wythnosol"; "cycle_4weeks" = "cylch-4wythnosol"; "cycle_monthly" = "cylch-misol"; "cycle_weekday" = "cycle_diwrnod wythnos"; "cycle_yearly" = "cylch_blynyddol"; "cycle_end_never" = "cylch_diwedd_byth"; "cycle_end_until" = "cylch_diwedd_tan"; "Recurrence pattern" = "Patrwm dychweliad"; "Range of recurrence" = "Amrediad y dychweliad"; "Repeat" = "Ailadrodd"; "Daily" = "Dyddiol"; "Weekly" = "Wythnosol"; "Monthly" = "Misol"; "Yearly" = "Blynyddol"; "Every" = "Pob"; "Days" = "Diwrnodau"; "Week(s)" = "wythnos(au)"; "On" = "Ar"; "Month(s)" = "Mis(oedd)"; "The" = "Y"; "Recur on day(s)" = "Ailddigwydd ar diwrnod(au)"; "Year(s)" = "Blwyddyn(au)"; "cycle_of" = "o"; "No end date" = "Dim dyddiad diwedd"; "Create" = "Creu"; "appointment(s)" = "apwyntiad(au)"; "Repeat until" = "Ailadrodd tan"; "First" = "Cyntaf"; "Second" = "Ail"; "Third" = "Trydydd"; "Fourth" = "Pedwerydd"; "Fift" = "Pumed"; "Last" = "Olaf"; /* Appointment categories */ "category_none" = "Dim"; "category_labels" = "Amrywiol,Anrhegion,Busnes,Canlyniadau,Clientau,Cwsmer,Cyflenwyr,Cystadleuaeth,Dilyn lan,Ffefrynnau,Galwadau,Gwyliau,Meeting,Gwyliau Cyhoeddus,Penblwydd,Personol,Projectau,Statws,Syniadau,Teithio"; "repeat_NEVER" = "Ddim yn ailadrodd"; "repeat_DAILY" = "Dyddiol"; "repeat_WEEKLY" = "Wythnosol"; "repeat_BI-WEEKLY" = "2-wythnosol"; "repeat_EVERY WEEKDAY" = "Pob diwrnod wythnos"; "repeat_MONTHLY" = "Misol"; "repeat_YEARLY" = "Blynyddol"; "repeat_CUSTOM" = "Cwstwm..."; "reminder_NONE" = "Dim atgoffa"; "reminder_5_MINUTES_BEFORE" = "5 munud o flaen"; "reminder_10_MINUTES_BEFORE" = "10 munud o flaen"; "reminder_15_MINUTES_BEFORE" = "15 munud o flaen"; "reminder_30_MINUTES_BEFORE" = "30 munud o flaen"; "reminder_45_MINUTES_BEFORE" = "45 munud o flaen"; "reminder_1_HOUR_BEFORE" = "1 awr o flaen"; "reminder_2_HOURS_BEFORE" = "2 awr o flaen"; "reminder_5_HOURS_BEFORE" = "5 awr o flaen"; "reminder_15_HOURS_BEFORE" = "15 awr o flaen"; "reminder_1_DAY_BEFORE" = "1 diwrnod o flaen"; "reminder_2_DAYS_BEFORE" = "2 diwrnod o flaen"; "reminder_1_WEEK_BEFORE" = "1 wythnos o flaen"; "reminder_CUSTOM" = "Cwstwm..."; "reminder_MINUTES" = "minutes"; "reminder_HOURS" = "hours"; "reminder_DAYS" = "days"; "reminder_BEFORE" = "before"; "reminder_AFTER" = "after"; "reminder_START" = "the event starts"; "reminder_END" = "the event ends"; "Reminder Details" = "Reminder Details"; "Choose a Reminder Action" = "Choose a Reminder Action"; "Show an Alert" = "Show an Alert"; "Send an E-mail" = "Send an E-mail"; "Email Organizer" = "Email Organizer"; "Email Attendees" = "Email Attendees"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Dangos amser fel rhydd"; /* validation errors */ validate_notitle = "Dim teitl wedi gosod, parhau?"; validate_invalid_startdate = "Maes Dyddiad dechrau anghywir!"; validate_invalid_enddate = "Maes dyddiad gorffen anghywir!"; validate_endbeforestart = "Mae'r dyddiad gorffen sydd wedi'i roi yn digwydd cyn y dyddiad dechrau"; "Tasks" = "Tasgau"; "Show completed tasks" = "Dangos tasgau cwblhawyd"; /* tabs */ "Task" = "Tasg"; "Event" = "Digwyddiad"; "Recurrence" = "Dychweliad"; /* toolbar */ "New Event" = "Digwyddiad newydd"; "New Task" = "Tasg Newydd"; "Edit" = "Golygu"; "Delete" = "Dileu"; "Go to Today" = "Ewch at Heddiw"; "Day View" = "Golygfa diwrnod"; "Week View" = "Golygfa wythnos"; "Month View" = "Golygfa mis"; "Reload" = "Reload"; "eventPartStatModificationError" = "Ni fedrwyd newid statws eich cyfranogiad."; /* menu */ "New Event..." = "Digwyddiad Newydd..."; "New Task..." = "Tasg Newydd..."; "Edit Selected Event..." = "Newid digwyddiad dewisol..."; "Delete Selected Event" = "Dileu Digwyddiad Dewisol"; "Select All" = "Dewis y cyfan"; "Workweek days only" = "diwrnodau gwaith yn unig"; "Tasks in View" = "Tasgau mewn golwg"; "eventDeleteConfirmation" = "Bydd dileu y digwyddiad yn barhaol.\nHoffech barhau?"; "taskDeleteConfirmation" = "Bydd dileu'r dasg yma'n barhaol.\nHoffech barhau?"; "You cannot remove nor unsubscribe from your personal calendar." = "You cannot remove nor unsubscribe from your personal calendar."; "Are you sure you want to delete the calendar \"%{0}\"?" = "A ydych yn sicr eich bod eisiau dileu'r calendr \"%{0}\"?"; /* Legend */ "Required participant" = "Cyfranogwr gofynnol"; "Optional participant" = "Cyfranogwr opsiynol"; "Non Participant" = "Non Participant"; "Chair" = "Cadair"; "Needs action" = "Angen gweithred"; "Accepted" = "Derbyniwyd"; "Declined" = "Gwrthodwyd"; "Tentative" = "Petrus"; "Free" = "Rhydd"; "Busy" = "Brysur"; "Maybe busy" = "Brysur efallai"; "No free-busy information" = "Dim gwybodaeth rhydd-brysur"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Awgrymwch amser:"; "Zoom:" = "Zoom:"; "Previous slot" = "Slot flaenorol"; "Next slot" = "Slot nesaf"; "Previous hour" = "Awr flaenorol"; "Next hour" = "Awr nesaf"; "Work days only" = "Work days only"; "The whole day" = "The whole day"; "Between" = "Between"; "and" = "and"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"; /* apt list */ "Title" = "Teitl"; "Start" = "Dechrau"; "End" = "Diwedd"; "Due Date" = "Dyddiad dyledus"; "Location" = "Lleoliad"; "(Private Event)" = "(Digwyddiad preifat)"; vevent_class0 = "(Digwyddiad cyhoeddus)"; vevent_class1 = "(Digwyddiad preifat)"; vevent_class2 = "(Digwyddiad cyfrinachol)"; vtodo_class0 = "(Tasg gyhoeddus)"; vtodo_class1 = "(Tasg breifat)"; vtodo_class2 = "(Tasg gyhoeddus)"; "closeThisWindowMessage" = "Diolch! Gallwch cau'r ffenestr neu weld "; "Multicolumn Day View" = "Golygfa diwrnod aml-golofn"; "Please select an event or a task." = "Dewiswch digwyddiad neu dasg."; "editRepeatingItem" = "Mae'r eitem yr ydych yn golygu yn ailadrodd. A ydych am olygu'r holl achlysuron neu yr un yma'n unig?"; "button_thisOccurrenceOnly" = "Yr achlysur yma'n unig"; "button_allOccurrences" = "Pob achlysur"; /* Properties dialog */ "Name:" = "Enw:"; "Color:" = "Lliw:"; "Include in free-busy" = "Include in free-busy"; "Synchronization" = "Synchronization"; "Synchronize" = "Synchronize"; "Tag:" = "Tag:"; "Display" = "Display"; "Show alarms" = "Show alarms"; "Show tasks" = "Show tasks"; "Links to this Calendar" = "Links to this Calendar"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Please specify a numerical value in the Days field greater or equal to 1."; "weekFieldInvalid" = "Please specify a numerical value in the Week(s) field greater or equal to 1."; "monthFieldInvalid" = "Please specify a numerical value in the Month(s) field greater or equal to 1."; "monthDayFieldInvalid" = "Please specify a numerical value in the month day field greater or equal to 1."; "yearFieldInvalid" = "Please specify a numerical value in the Year(s) field greater or equal to 1."; "appointmentFieldInvalid" = "Please specify a numerical value in the Appointment(s) field greater or equal to 1."; "recurrenceUnsupported" = "This type of recurrence is currently unsupported."; "tagNotDefined" = "You must specify a tag if you want to synchronize this calendar."; "tagAlreadyExists" = "The tag you specified is already associated to another calendar."; "tagHasChanged" = "If you change your calendar's tag, you'll need to perform a slow sync on your mobile device.\nContinue?"; "tagWasAdded" = "If you want to synchronize this calendar, you'll need to reload the data on your mobile device.\nContinue?"; "tagWasRemoved" = "If you remove this calendar from synchronization, you'll need to perform a slow sync on your mobile device.\nContinue?"; "DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; "EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; "Open Task..." = "Open Task..."; "Mark Completed" = "Mark Completed"; "Delete Task" = "Delete Task"; "Delete Event" = "Delete Event"; "Subscribe to a web calendar..." = "Subscribe to a web calendar..."; "URL of the Calendar" = "URL of the Calendar"; "Web Calendar" = "Web Calendar"; "Reload on login" = "Reload on login"; "Invalid number." = "Invalid number."; "Category" = "Categori"; "Priority" = "Blaenoriaeth"; SOGo-2.1.1b/UI/Scheduler/BrazilianPortuguese.lproj/0000755000000000000000000000000012247657027020554 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings0000644000000000000000000004214712247657027024420 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Criar um novo evento"; "Create a new task" = "Criar uma nova tarefa"; "Edit this event or task" = "Editar este evento ou tarefa"; "Delete this event or task" = "Apagar este evento ou tarefa"; "Go to today" = "Vai para hoje"; "Switch to day view" = "Visualizar Dia"; "Switch to week view" = "Visualizar Semana"; "Switch to month view" = "Visualizar Mês"; "Reload all calendars" = "Recarregar todos os calendários"; /* Tabs */ "Date" = "Data"; "Calendars" = "Calendários"; /* Day */ "DayOfTheMonth" = "Dia do mês"; "dayLabelFormat" = "%m/%d/%Y"; "today" = "Hoje"; "Previous Day" = "Dia Anterior"; "Next Day" = "Próximo Dia"; /* Week */ "Week" = "Semana"; "this week" = "esta semana"; "Week %d" = "Semana %d"; "Previous Week" = "Semana Anterior"; "Next Week" = "Próxima Semana"; /* Month */ "this month" = "este mês"; "Previous Month" = "Mês Anterior"; "Next Month" = "Próximo Mês"; /* Year */ "this year" = "este ano"; /* Menu */ "Calendar" = "Calendário"; "Contacts" = "Contatos"; "New Calendar..." = "Novo Calendário..."; "Delete Calendar" = "Apagar Calendário"; "Unsubscribe Calendar" = "Cancelar Calendário"; "Sharing..." = "Compartilhamento..."; "Export Calendar..." = "Exportar Calendário..."; "Import Events..." = "Importar Eventos..."; "Import Events" = "Importar Eventos"; "Select an iCalendar file (.ics)." = "Selecione um arquivo iCalendar (.ics)."; "Upload" = "Carregar"; "Uploading" = "Carregando"; "Publish Calendar..." = "Publicar Calendário..."; "Reload Remote Calendars" = "Recarregar Calendários Remotos"; "Properties" = "Propriedades"; "Done" = "Feito"; "An error occurred while importing calendar." = "Um erro ocorreu na importação do calendário."; "No event was imported." = "Nenhum evento importado."; "A total of %{0} events were imported in the calendar." = "Um total de %{0} eventos foram importados no calendário."; "Compose E-Mail to All Attendees" = "Compor E-Mail para Todos os Participantes"; "Compose E-Mail to Undecided Attendees" = "Compor E-Mail para os Participantes não confirmados"; /* Folders */ "Personal calendar" = "Calendário Pessoal"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Proibido"; /* acls */ "Access rights to" = "Direitos de acesso para"; "For user" = "Para usuário"; "Any Authenticated User" = "Qualquer usuário autenticado"; "Public Access" = "Acesso Público"; "label_Public" = "Público"; "label_Private" = "Privado"; "label_Confidential" = "Confidencial"; "label_Viewer" = "Ver Tudo"; "label_DAndTViewer" = "Ver Data e Hora"; "label_Modifier" = "Modificar"; "label_Responder" = "Responder Para"; "label_None" = "Nenhum"; "View All" = "Ver Tudo"; "View the Date & Time" = "Ver Data e Hora"; "Modify" = "Modificar"; "Respond To" = "Responder Para"; "None" = "Nenhum"; "This person can create objects in my calendar." = "Esta pessoa pode criar objetos em meu calendário."; "This person can erase objects from my calendar." = "Esta pessoa pode apagar objetos em meu calendário."; /* Button Titles */ "Subscribe to a Calendar..." = "Inscrever-se em um Calendário..."; "Remove the selected Calendar" = "Remover o Calendário selecionado"; "Name of the Calendar" = "Nome deste Calendário"; "new" = "Novo"; "printview" = "Visualizar Impressão"; "edit" = "Editar"; "delete" = "Apagar"; "proposal" = "Proposta"; "Save and Close" = "Salvar e Fechar"; "Close" = "Fechar"; "Invite Attendees" = "Convidar Participantes"; "Attach" = "Adicionar atalho"; "Update" = "Atualizar"; "Cancel" = "Cancelar"; "show_rejected_apts" = "Exibir apontamentos rejeitados"; "hide_rejected_apts" = "Ocultar apontamentos rejeitados"; /* Schedule */ "Schedule" = "Agenda"; "No appointments found" = "Apontamentos não encontrados"; "Meetings proposed by you" = "Reuniões propostas por você"; "Meetings proposed to you" = "Reuniões propostas para você"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Ação"; "accept" = "Aceitar"; "decline" = "Declinar"; "more attendees" = "Mais Participantes"; "Hide already accepted and rejected appointments" = "Ocultar apontamentos já aceitos e rejeitados"; "Show already accepted and rejected appointments" = "Exibir apontamentos já aceitos e rejeitados"; /* Appointments */ "Appointment viewer" = "Visualizador de Apontamentos"; "Appointment editor" = "Editor de Apontamento"; "Appointment proposal" = "Apontamento Proposto"; "Appointment on" = "Apontamento em"; "Start:" = "Inicio:"; "End:" = "Fim:"; "Due Date:" = "Data:"; "Title:" = "Título:"; "Calendar:" = "Calendário:"; "Name" = "Nome"; "Email" = "Correio"; "Status:" = "Status:"; "% complete" = "% completado"; "Location:" = "Localização:"; "Priority:" = "Prioridade:"; "Privacy" = "Privacidade"; "Cycle" = "Ciclo"; "Cycle End" = "Ciclo Final"; "Categories" = "Categorias"; "Classification" = "Classificação"; "Duration" = "Duração"; "Attendees:" = "Participantes:"; "Resources" = "Recursos"; "Organizer:" = "Organizador:"; "Description:" = "Descrição:"; "Document:" = "Documento:"; "Category:" = "Categoria:"; "Repeat:" = "Repetir:"; "Reminder:" = "Lembrete:"; "General:" = "Geral:"; "Reply:" = "Responder:"; "Created by:" = "Criado por:"; "Target:" = "Marca:"; "attributes" = "atributos"; "attendees" = "participantes"; "delegated from" = "delegado de"; /* checkbox title */ "is private" = "é privado"; /* classification */ "Public" = "Público"; "Private" = "Privado"; /* text used in overviews and tooltips */ "empty title" = "Título Vazio"; "private appointment" = "Apontamento privado"; "Change..." = "Alterar..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Ações necessárias"; "partStat_ACCEPTED" = "Vou participar"; "partStat_DECLINED" = "Não vou participar"; "partStat_TENTATIVE" = "Confirmarei depois"; "partStat_DELEGATED" = "Delegado"; "partStat_OTHER" = "Outro"; /* Appointments (error messages) */ "Conflicts found!" = "Conflitos encontrados!"; "Invalid iCal data!" = "Dados iCal inválidos!"; "Could not create iCal data!" = "Não foi possível criar dados iCal!"; /* Searching */ "view_all" = "Tudo"; "view_today" = "Hoje"; "view_next7" = "Próximos 7 dias"; "view_next14" = "Próximos 14 dias"; "view_next31" = "Próximos 31 dias"; "view_thismonth" = "Este Mês"; "view_future" = "Todos os Eventos Futuros"; "view_selectedday" = "Dia Selecionado"; "View:" = "Visão:"; "Title or Description" = "Título ou Descrição"; "Search" = "Pesquisar"; "Search attendees" = "Pesquisar participantes"; "Search resources" = "Pesquisar recursos"; "Search appointments" = "Pesquisar apontamentos"; "All day Event" = "Evento diário"; "check for conflicts" = "Checar conflitos"; "Browse URL" = "Abrir URL"; "newAttendee" = "Adicionar participante"; /* calendar modes */ "Overview" = "Visão Geral"; "Chart" = "Fluxo"; "List" = "Lista"; "Columns" = "Colunas"; /* Priorities */ "prio_0" = "Não especificado"; "prio_1" = "Alta 3"; "prio_2" = "Alta 2"; "prio_3" = "Alta 1"; "prio_4" = "Alta"; "prio_5" = "Normal"; "prio_6" = "Baixa"; "prio_7" = "Baixa 1"; "prio_8" = "Baixa 2"; "prio_9" = "Baixa 3"; /* access classes (privacy) */ "PUBLIC_vevent" = "Evento Público"; "CONFIDENTIAL_vevent" = "Evento Confidencial"; "PRIVATE_vevent" = "Evento Privado"; "PUBLIC_vtodo" = "Tarefa Pública"; "CONFIDENTIAL_vtodo" = "Tarefa Confidencial"; "PRIVATE_vtodo" = "Tarefa Privada"; /* status type */ "status_" = "Não especificado"; "status_NOT-SPECIFIED" = "Não especificado"; "status_TENTATIVE" = "Tentativa"; "status_CONFIRMED" = "Confirmado"; "status_CANCELLED" = "Cancelado"; "status_NEEDS-ACTION" = "Ações Necessárias"; "status_IN-PROCESS" = "Em Processamento"; "status_COMPLETED" = "Completado"; /* Cycles */ "cycle_once" = "Uma Vez"; "cycle_daily" = "Diariamente"; "cycle_weekly" = "Semanalmente"; "cycle_2weeks" = "2 semanas"; "cycle_4weeks" = "4 semanas"; "cycle_monthly" = "Mensalmente"; "cycle_weekday" = "Dia da Semana"; "cycle_yearly" = "Anualmente"; "cycle_end_never" = "Sem fim"; "cycle_end_until" = "Finalizar até"; "Recurrence pattern" = "Padrão de Repetição"; "Range of recurrence" = "Intervalo de Repetição"; "Repeat" = "Repetir"; "Daily" = "Diariamente"; "Weekly" = "Semanalmente"; "Monthly" = "Mensalmente"; "Yearly" = "Anualmente"; "Every" = "A cada"; "Days" = "Dias"; "Week(s)" = "Semana(s)"; "On" = "Em"; "Month(s)" = "Mês(es)"; "The" = "O/A"; "Recur on day(s)" = "Retorne em dia(s)"; "Year(s)" = "Ano(s)"; "cycle_of" = "de"; "No end date" = "Sem data final"; "Create" = "Criar"; "appointment(s)" = "apontamento(s)"; "Repeat until" = "Repetir até"; "First" = "Primeiro"; "Second" = "Segundo"; "Third" = "Terceiro"; "Fourth" = "Quarto"; "Fift" = "Quinto"; "Last" = "Último"; /* Appointment categories */ "category_none" = "Nenhum"; "category_labels" = "Aniversário,Negócios,Ligações,Concorrência,Cliente,Favoritos,Acompanhamento,Presentes,Feriados,Idéias,Problemas,Miscelânea,Meeting,Pessoal,Projetos,Feriado público,Posição,Fornecedores,Viagem,Férias"; "repeat_NEVER" = "Sem repetição"; "repeat_DAILY" = "Diariamente"; "repeat_WEEKLY" = "Semanalmente"; "repeat_BI-WEEKLY" = "Bi-semanal"; "repeat_EVERY WEEKDAY" = "Cada dia útil"; "repeat_MONTHLY" = "Mensalmente"; "repeat_YEARLY" = "Anualmente"; "repeat_CUSTOM" = "Personalizar..."; "reminder_NONE" = "Não lembrar"; "reminder_5_MINUTES_BEFORE" = "5 minutos antes"; "reminder_10_MINUTES_BEFORE" = "10 minutos antes"; "reminder_15_MINUTES_BEFORE" = "15 minutos antes"; "reminder_30_MINUTES_BEFORE" = "30 minutos antes"; "reminder_45_MINUTES_BEFORE" = "45 minutos antes"; "reminder_1_HOUR_BEFORE" = "1 hora antes"; "reminder_2_HOURS_BEFORE" = "2 horas antes"; "reminder_5_HOURS_BEFORE" = "5 horas antes"; "reminder_15_HOURS_BEFORE" = "15 horas antes"; "reminder_1_DAY_BEFORE" = "1 dia antes"; "reminder_2_DAYS_BEFORE" = "2 dias antes"; "reminder_1_WEEK_BEFORE" = "1 semana antes"; "reminder_CUSTOM" = "Personalizar..."; "reminder_MINUTES" = "minutos"; "reminder_HOURS" = "horas"; "reminder_DAYS" = "dias"; "reminder_BEFORE" = "antes"; "reminder_AFTER" = "depois"; "reminder_START" = "inicio do evento"; "reminder_END" = "fim do evento"; "Reminder Details" = "Detalhes do Lembrete"; "Choose a Reminder Action" = "Escolha uma ação"; "Show an Alert" = "Exibir um Alerta"; "Send an E-mail" = "Enviar um E-mail"; "Email Organizer" = "Organizador de Email"; "Email Attendees" = "Email Participantes"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Exibir Hora como Livre"; /* email notifications */ "Send Appointment Notifications" = "Enviar Notificações de Apontamento"; /* validation errors */ validate_notitle = "Nenhum título informado, continue?"; validate_invalid_startdate = "Campo Data Inicial incorreto!"; validate_invalid_enddate = "Campo Data Final incorreto!"; validate_endbeforestart = "A data que você informou ocorre antes da data inicial."; "Events" = "Eventos"; "Tasks" = "Tarefas"; "Show completed tasks" = "Exibir tarefas completadas"; /* tabs */ "Task" = "Tarefa"; "Event" = "Evento"; "Recurrence" = "Recorrencia"; /* toolbar */ "New Event" = "Novo Evento"; "New Task" = "Nova Tarefa"; "Edit" = "Editar"; "Delete" = "Apagar"; "Go to Today" = "Ir para Hoje"; "Day View" = "Visualizar Dia"; "Week View" = "Visualizar Semana"; "Month View" = "Visualizar Mês"; "Reload" = "Recarregar"; "eventPartStatModificationError" = "Seu status de participação não pode ser modificado."; /* menu */ "New Event..." = "Novo Evento..."; "New Task..." = "Neva Tarefa..."; "Edit Selected Event..." = "Editar o Evento Selecionado..."; "Delete Selected Event" = "Apagar o Evento Selecionado"; "Select All" = "Selecionar Tudo"; "Workweek days only" = "Somente semanas úteis"; "Tasks in View" = "Tarefas na vista"; "eventDeleteConfirmation" = "O(s) seguinte(s) evento(s) será(ão) apagado(s): \n%{0}\nGostaria de continuar?"; "taskDeleteConfirmation" = "Apagar permanentemente esta tarefa.\nVocê gostaria de continuar?"; "You cannot remove nor unsubscribe from your personal calendar." = "Você não pode remover nem retirar-se do seu calendário pessoal."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Você tem certeza que quer apagar o calendário \"%{0}\"?"; /* Legend */ "Participant" = "Participante"; "Optional Participant" = "Participante Opcional"; "Non Participant" = "Não Participante"; "Chair" = "Cadeira"; "Needs action" = "Ações necessárias"; "Accepted" = "Aceitado"; "Declined" = "Declinado"; "Tentative" = "Tentativa"; "Free" = "Livre"; "Busy" = "Ocupado"; "Maybe busy" = "Talvez ocupado"; "No free-busy information" = "Sem informação Livre/Ocupado"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Sugerir espaço de tempo:"; "Zoom:" = "Zoom:"; "Previous slot" = "Espaço anterior"; "Next slot" = "Próximo espaço"; "Previous hour" = "Hora anterior"; "Next hour" = "Próxima hora"; "Work days only" = "Somente dias de trabalho"; "The whole day" = "O dia inteiro"; "Between" = "Entre"; "and" = "and"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Existe um conflito de tempo com um ou mais participantes.\nGostaria de manter as configurações atuais?"; /* apt list */ "Title" = "Título"; "Start" = "Início"; "End" = "Fim"; "Due Date" = "Data de Vencimento"; "Location" = "Localização"; "(Private Event)" = "(Evento Privado)"; vevent_class0 = "(Evento Público)"; vevent_class1 = "(Evento Privado)"; vevent_class2 = "(Evento Confidencial)"; "Priority" = "Prioridade"; "Category" = "Categoria"; vtodo_class0 = "(Tarefa Pública)"; vtodo_class1 = "(Tarefa Privada)"; vtodo_class2 = "(Tarefa Confidencial)"; "closeThisWindowMessage" = "Obrigado! Agora você já pode fechar esta janela ou visualização "; "Multicolumn Day View" = "Visão Diária Multicolunas"; "Please select an event or a task." = "Por favor, selecione um evento ou tarefa."; "editRepeatingItem" = "O item que você está editando é um item repetitivo. Você quer editar todas as ocorrências deste ou somente este?"; "button_thisOccurrenceOnly" = "Somente esta ocorrência"; "button_allOccurrences" = "Todas as ocorrências"; /* Properties dialog */ "Name:" = "Nome:"; "Color:" = "Cor:"; "Include in free-busy" = "Incluir na disponibilidade"; "Synchronization" = "Sincronização"; "Synchronize" = "Sincronizar"; "Tag:" = "Marca:"; "Display" = "Exibir"; "Show alarms" = "Exibir alarmes"; "Show tasks" = "Exibir tarefas"; "Notifications" = "Notificações"; "Receive a mail when I modify my calendar" = "Receber um email quando eu modificar meu calendário"; "Receive a mail when someone else modifies my calendar" = "Receber um email quando alguem modificar meu calendário"; "When I modify my calendar, send a mail to:" = "Quando eu modificar meu calendário, enviar um email para:"; "Links to this Calendar" = "Links para este Calendário"; "Authenticated User Access" = "Acesso a Usuário Autenticado"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Por favor, especifique um valor numérico no campo Dias, maior ou igual a 1."; "weekFieldInvalid" = "Por favor, especifique um valor numérico no campo Semana(s), maior ou igual a 1."; "monthFieldInvalid" = "Por favor, especifique um valor numérico no campo Mes(es), maior ou igual a 1."; "monthDayFieldInvalid" = "Por favor, especifique um valor numéricio no campo Dia do Mes, maior ou igual a 1."; "yearFieldInvalid" = "Por favor, especifique um valor numéricio no campo Ano(s), maior ou igual a 1."; "appointmentFieldInvalid" = "Por favor, especifique um valor numéricio no campo Apontamento(s) maior ou igual a 1."; "recurrenceUnsupported" = "Este tipo de recorrência não é suportado."; "Please specify a calendar name." = "Por favor, especifique um nome de calendário."; "tagNotDefined" = "Você deve especificar um dispositivo se deseja sincronizar este calendário."; "tagAlreadyExists" = "Este dispositivo especificado já está associado a outro calendário."; "tagHasChanged" = "Se você trocar o dispositivo deste calendário, será necessário sincronizar novamente seus dados no dispositivo móvel.\nContinuar?"; "tagWasAdded" = "Se você quisar sincronizar este calendário, será necessário sincronizar novamente seus dados no dispositivo móvel.\nContinuar?"; "tagWasRemoved" = "Se você remover este calendário da sincronização, será necessário sincronizar novamente seus dados no dispositivo móvel.\nContinuar?"; "DestinationCalendarError" = "Os calendários de origem e destino são os mesmos. Por favor, tente copiar para outro calendário diferente."; "EventCopyError" = "A cópia falhou. Por favor, tente copiar para um calendário diferente."; "Open Task..." = "Abrir Tarefa..."; "Mark Completed" = "Marcar como Concluída"; "Delete Task" = "Remover Tarefa"; "Delete Event" = "Remover Evento"; "Copy event to my calendar" = "Copiar evento para o meu calendário"; "View Raw Source" = "Visualizar Fonte"; "Subscribe to a web calendar..." = "Inscrever-se a um calendário web..."; "URL of the Calendar" = "URL do Calendário"; "Web Calendar" = "Calendário Web"; "Reload on login" = "Recarregar no login"; "Invalid number." = "Número inválido."; "Please identify yourself to %{0}" = "Por favor, identifique-se para %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxCalDayView.m0000644000000000000000000001526212247657030016225 0ustar rootroot/* Copyright (C) 2004 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import #import #import #import #import #import #import #import #import #import "UIxCalDayView.h" // @interface UIxCalDayView (PrivateAPI) // - (BOOL)isCurrentDateInApt:(id)_apt; // - (NSArray *)_getDatesFrom:(NSCalendarDate *)_from to:(NSCalendarDate *)_to; // @end @implementation UIxCalDayView // - (void) dealloc // { // [self->currentDate release]; // [super dealloc]; // } - (id ) defaultAction { [super setCurrentView: @"dayview"]; return self; } // - (void) setCurrentDate: (NSCalendarDate *) _date // { // ASSIGN(self->currentDate, _date); // } // - (NSCalendarDate *) currentDate // { // return self->currentDate; // } // - (BOOL) isCurrentDateInApt // { // return [self isCurrentDateInApt: [self appointment]]; // } // - (BOOL) isCurrentDateInApt: (id) _apt // { // NSCalendarDate *dateStart, *dateEnd, *aptStart, *aptEnd; // NGCalendarDateRange *dateRange, *aptRange; // dateStart = self->currentDate; // dateEnd = [dateStart dateByAddingYears:0 months:0 days:0 // hours:1 minutes:0 seconds:0]; // dateRange = [NGCalendarDateRange calendarDateRangeWithStartDate:dateStart // endDate:dateEnd]; // aptStart = [self->appointment valueForKey:@"startDate"]; // aptEnd = [self->appointment valueForKey:@"endDate"]; // aptRange = [NGCalendarDateRange calendarDateRangeWithStartDate:aptStart // endDate:aptEnd]; // return [dateRange doesIntersectWithDateRange:aptRange]; // } // - (NSArray *) dateRange // { // /* default range is from dayStartHour to dayEndHour. Any values before // or after are also fine */ // NSCalendarDate *min, *max; // NSArray *aptDateRanges; // min = [[self startDate] hour:[self dayStartHour] minute:0]; // max = [[self startDate] hour:[self dayEndHour] minute:0]; // aptDateRanges = [[self appointments] valueForKey: @"startDate"]; // if([aptDateRanges count] != 0) { // NSCalendarDate *d; // aptDateRanges // = [aptDateRanges sortedArrayUsingSelector: @selector(compareAscending:)]; // d = [aptDateRanges objectAtIndex:0]; // if ([d isDateOnSameDay:min]) // min = (NSCalendarDate *)[d earlierDate:min]; // d = [aptDateRanges objectAtIndex:[aptDateRanges count] - 1]; // if ([d isDateOnSameDay:max]) // max = (NSCalendarDate *)[d laterDate:max]; // } // return [self _getDatesFrom:min to:max]; // } // - (NSArray *) _getDatesFrom: (NSCalendarDate *) _from // to: (NSCalendarDate *) _to // { // NSMutableArray *dates; // unsigned i, count, offset; // offset = [_from hourOfDay]; // count = ([_to hourOfDay] + 1) - offset; // dates = [[NSMutableArray alloc] initWithCapacity:count]; // for(i = 0; i < count; i++) { // NSCalendarDate *date; // date = [_from hour:offset + i minute:0]; // [dates addObject:date]; // } // return [dates autorelease]; // } /* URLs */ - (NSDictionary *) dayBeforePrevDayQueryParameters { return [self _dateQueryParametersWithOffset: -2]; } - (NSDictionary *) prevDayQueryParameters { return [self _dateQueryParametersWithOffset: -1]; } - (NSDictionary *) nextDayQueryParameters { return [self _dateQueryParametersWithOffset: 1]; } - (NSDictionary *) dayAfterNextDayQueryParameters { return [self _dateQueryParametersWithOffset: 2]; } - (NSDictionary *) currentDateQueryParameters { NSMutableDictionary *qp; NSString *hmString; NSCalendarDate *date; date = [self selectedDate]; hmString = [NSString stringWithFormat:@"%.2d%.2d", [date hourOfDay], [date minuteOfHour]]; qp = [[self queryParameters] mutableCopy]; [self setSelectedDateQueryParameter:date inDictionary:qp]; [qp setObject: hmString forKey:@"hm"]; return [qp autorelease]; } /* fetching */ - (NSCalendarDate *) startDate { return [[self selectedDate] beginOfDay]; } /* appointments */ // - (NSArray *)allDayApts { // NSCalendarDate *start; // NSArray *apts; // NSMutableArray *filtered; // unsigned i, count; // if (self->allDayApts) // return self->allDayApts; // start = [self startDate]; // apts = [self appointments]; // filtered = [[NSMutableArray alloc] initWithCapacity:1]; // count = [apts count]; // for (i = 0; i < count; i++) { // id apt; // NSNumber *bv; // apt = [apts objectAtIndex:i]; // bv = [apt valueForKey:@"isallday"]; // if ([bv boolValue]) { // [filtered addObject:apt]; // } // else { // NSCalendarDate *aptStartDate; // aptStartDate = [apt valueForKey:@"startDate"]; // if([aptStartDate isLessThan:start]) { // [filtered addObject:apt]; // } // } // } // ASSIGN(self->allDayApts, filtered); // [filtered release]; // return self->allDayApts; // } // - (BOOL) hasAptsForCurrentDate // { // return [[self aptsForCurrentDate] count] != 0; // } - (NSString *) _dayNameWithOffsetFromToday: (int) offset { NSCalendarDate *date; date = [[self selectedDate] dateByAddingYears: 0 months: 0 days: offset]; return [self localizedNameForDayOfWeek: [date dayOfWeek]]; } - (NSString *) dayBeforeYesterdayName { return [self _dayNameWithOffsetFromToday: -2]; } - (NSString *) yesterdayName { return [self _dayNameWithOffsetFromToday: -1]; } - (NSString *) currentDayName { return [self _dayNameWithOffsetFromToday: 0]; } - (NSString *) tomorrowName { return [self _dayNameWithOffsetFromToday: 1]; } - (NSString *) dayAfterTomorrowName { return [self _dayNameWithOffsetFromToday: 2]; } @end SOGo-2.1.1b/UI/Scheduler/NorwegianNynorsk.lproj/0000755000000000000000000000000012247657030020065 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/NorwegianNynorsk.lproj/Localizable.strings0000644000000000000000000003704312247657030023730 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Opprett en ny hendelse"; "Create a new task" = "Opprett en ny oppgave"; "Edit this event or task" = "Endre hendelse eller oppgave"; "Delete this event or task" = "Slett denne hendelsen eller oppgaven"; "Go to today" = "GÃ¥ til i dag"; "Switch to day view" = "Endre til dagsvisning"; "Switch to week view" = "Endre til ukesvisning"; "Switch to month view" = "Endre til mÃ¥nedsvisning"; "Reload all calendars" = "Last pÃ¥ nytt alle kalendre"; /* Tabs */ "Date" = "Dato"; "Calendars" = "Kalendere"; /* Day */ "DayOfTheMonth" = "Dag i mÃ¥neden"; "dayLabelFormat" = "%Y-%m-%d"; "today" = "Idag"; "Previous Day" = "Forrige dag"; "Next Day" = "Neste dag"; /* Week */ "Week" = "Uke"; "this week" = "denne uken"; "Week %d" = "Uke %d"; "Previous Week" = "Forrige uke"; "Next Week" = "Neste uke"; /* Month */ "this month" = "denne mÃ¥neden"; "Previous Month" = "Forrige mÃ¥ned"; "Next Month" = "Neste mÃ¥ned"; /* Year */ "this year" = "dette Ã¥r"; /* Menu */ "Calendar" = "Kalender"; "Contacts" = "Kontakter"; "New Calendar..." = "Ny kalender..."; "Delete Calendar" = "Slett kalender"; "Unsubscribe Calendar" = "Avslutt abonnement pÃ¥ kalender"; "Sharing..." = "Deling..."; "Export Calendar..." = "Eksorter kalender..."; "Import Events..." = "Importer hendelser..."; "Import Events" = "Importer hendelser"; "Select an iCalendar file (.ics)." = "Velg en iCalendar fil (.ics)."; "Upload" = "Last opp"; "Publish Calendar..." = "Publiser Kalender..."; "Reload Remote Calendars" = "Last pÃ¥ nytt fjernkalendre"; "Properties" = "Egenskaper"; "Done" = "Klar"; "An error occurred while importing calendar." = "En feil har oppstÃ¥tt under kalenderimporten."; "No event was imported." = "Ingen hendelser ble importert."; "A total of %{0} events were imported in the calendar." = "Totalt %{0} hendelser ble importert til kalenderen."; "Compose E-Mail to All Attendees" = "Skriv en e-post til alle deltakere"; "Compose E-Mail to Undecided Attendees" = "Skriv en e-post til alle deltakere som ikke har svart"; /* Folders */ "Personal calendar" = "Personlig kalender"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Forbudt"; /* acls */ "User rights for:" = "Brukerrettigheter for:"; "Any Authenticated User" = "Enhver autentisert bruker"; "Public Access" = "Felles adgang"; "label_Public" = "Felles"; "label_Private" = "Privat"; "label_Confidential" = "Konfidensielt"; "label_Viewer" = "Vis alle"; "label_DAndTViewer" = "Vis tid og dato"; "label_Modifier" = "Endre"; "label_Responder" = "Svar"; "label_None" = "Ingen"; "View All" = "Vis alle"; "View the Date & Time" = "Vis tid og dato"; "Modify" = "Endra"; "Respond To" = "Svar"; "None" = "Ingen"; "This person can create objects in my calendar." = "Personen kan opprette objekt i min kalender."; "This person can erase objects from my calendar." = "Personen kan fjerne objekt i min kalender."; /* Button Titles */ "New Calendar..." = "Ny kalender..."; "Subscribe to a Calendar..." = "Abonnere pÃ¥ en kalender..."; "Remove the selected Calendar" = "Slett markert kalender"; "Name of the Calendar" = "Navn pÃ¥ kalenderen"; "new" = "Ny"; "printview" = "Skriv ut"; "edit" = "Endre"; "delete" = "Slett"; "proposal" = "ForeslÃ¥"; "Save and Close" = "Lagre og lukk"; "Close" = "Lukk"; "Invite Attendees" = "Inviter deltagere"; "Attach" = "Vedlegg"; "Update" = "Oppdater"; "Cancel" = "Avbryt"; "show_rejected_apts" = "Vis avbrutte møter"; "hide_rejected_apts" = "Skjul avbrutte møter"; /* Schedule */ "Schedule" = "Planlegg"; "No appointments found" = "Ingen avtaler funnet"; "Meetings proposed by you" = "Møter foreslÃ¥tt av deg"; "Meetings proposed to you" = "Møter foreslÃ¥tt til deg"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Handling"; "accept" = "Godta"; "decline" = "AvslÃ¥"; "more attendees" = "Flere deltagere"; "Hide already accepted and rejected appointments" = "Skjul allerede aksepterte og avviste avtaler"; "Show already accepted and rejected appointments" = "Vis aksepterte og avviste avtaler"; /* Appointments */ "Appointment viewer" = "Avtaleviser"; "Appointment editor" = "Avtaleredigerer"; "Appointment proposal" = "Avtaleforslag"; "Appointment on" = "Møteavtale"; "Start:" = "Starter:"; "End:" = "Slutter:"; "Due Date:" = "Dato:"; "Title:" = "Tittel:"; "Calendar:" = "Kalender:"; "Name" = "Navn"; "Email" = "E-post"; "Status:" = "Status:"; "% complete" = "% utført"; "Location:" = "Plass:"; "Priority:" = "Prioritet:"; "Privacy" = "Personvern"; "Cycle" = "Intervall"; "Cycle End" = "Intervall slutter"; "Categories" = "Kategorier"; "Classification" = "Klassifisering"; "Duration" = "Varighet"; "Attendees:" = "Deltakere:"; "Resources" = "Ressurser"; "Organizer:" = "Organisatør:"; "Description:" = "Beskrivelse:"; "Document:" = "Dokument:"; "Category:" = "Kategori:"; "Repeat:" = "Gjenta:"; "Reminder:" = "PÃ¥minnelse:"; "General:" = "Generell:"; "Reply:" = "Svar:"; "Target:" = "MÃ¥l:"; "attributes" = "attributter"; "attendees" = "deltakere"; "delegated from" = "delegert fra"; /* checkbox title */ "is private" = "er privat"; /* classification */ "Public" = "Felles"; "Private" = "Privat"; /* text used in overviews and tooltips */ "empty title" = "Ingen tittel"; "private appointment" = "Privat møte"; "Change..." = "Endra..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Trenger handling"; "partStat_ACCEPTED" = "Jeg kan delta"; "partStat_DECLINED" = "Jeg kan ikke delta"; "partStat_TENTATIVE" = "Jeg kommer tilbake"; "partStat_DELEGATED" = "Jeg delegerer"; "partStat_OTHER" = "Annet"; /* Appointments (error messages) */ "Conflicts found!" = "Konflikter funnet!"; "Invalid iCal data!" = "Ugyldig iCal data!"; "Could not create iCal data!" = "Kunne ikke opprette iCal data!"; /* Searching */ "view_all" = "Alle"; "view_today" = "I dag"; "view_next7" = "Neste 7 dager"; "view_next14" = "Neste 14 dager"; "view_next31" = "Neste 31 dager"; "view_thismonth" = "Denne mÃ¥neden"; "view_future" = "Alle fremtidige hendelser"; "view_selectedday" = "Valgt dag"; "View:" = "Vis:"; "Title or Description" = "Tittel eller beskrivelse"; "Search" = "Søk"; "Search attendees" = "Søk deltakere"; "Search resources" = "Søk ressurser"; "Search appointments" = "Søk avtaler"; "All day Event" = "Heldagshendelse"; "check for conflicts" = "Kontroller konflikter"; "Browse URL" = "URL"; "newAttendee" = "Legg til deltakere"; /* calendar modes */ "Overview" = "Oversikt"; "Chart" = "Diagram"; "List" = "Liste"; "Columns" = "Kolonner"; /* Priorities */ "prio_0" = "Ikke spesifisert"; "prio_1" = "Høy"; "prio_2" = "Høy"; "prio_3" = "Høy"; "prio_4" = "Høy"; "prio_5" = "Normal"; "prio_6" = "Lav"; "prio_7" = "Lav"; "prio_8" = "Lav"; "prio_9" = "Lav"; /* access classes (privacy) */ "PUBLIC_vevent" = "Felles hendelse"; "CONFIDENTIAL_vevent" = "Konfidensiell hendelse"; "PRIVATE_vevent" = "Privat hendelse"; "PUBLIC_vtodo" = "Felles oppgave"; "CONFIDENTIAL_vtodo" = "Konfidensiell oppgave"; "PRIVATE_vtodo" = "Privat oppgave"; /* status type */ "status_" = "Ikke angitt"; "status_NOT-SPECIFIED" = "Ikke spesifisert"; "status_TENTATIVE" = "Foreløpig"; "status_CONFIRMED" = "Bekreftet"; "status_CANCELLED" = "Avlyst"; "status_NEEDS-ACTION" = "Trenger handling"; "status_IN-PROCESS" = "PÃ¥gÃ¥ende"; "status_COMPLETED" = "Utført"; /* Cycles */ "cycle_once" = "en gang"; "cycle_daily" = "hver dag"; "cycle_weekly" = "hver uke"; "cycle_2weeks" = "annenhver uke"; "cycle_4weeks" = "hver 4. uke"; "cycle_monthly" = "hver mÃ¥ned"; "cycle_weekday" = "hver ukedag"; "cycle_yearly" = "hvert Ã¥r"; "cycle_end_never" = "intervall slutter aldri"; "cycle_end_until" = "intervall slutter"; "Recurrence pattern" = "Regelmessighetsmønsteret"; "Range of recurrence" = "OmrÃ¥de for regelmessighet"; "Repeat" = "Gjenta"; "Daily" = "Daglig"; "Weekly" = "Ukentlig"; "Monthly" = "MÃ¥nedlig"; "Yearly" = "Ã…rlig"; "Every" = "Hver"; "Days" = "Dager"; "Week(s)" = "Uke(r)"; "On" = "PÃ¥"; "Month(s)" = "MÃ¥ned(er)"; "The" = "The"; "Recur on day(s)" = "Gjentas pÃ¥ dag(er)"; "Year(s)" = "Ã…r"; "cycle_of" = "av"; "No end date" = "Ingen sluttdato"; "Create" = "Oprett"; "appointment(s)" = "avtale(r)"; "Repeat until" = "Gjenta til"; "First" = "Første"; "Second" = "Andre"; "Third" = "Tredje"; "Fourth" = "Fjerde"; "Fift" = "Femte"; "Last" = "Siste"; /* Appointment categories */ "category_none" = "Ingen"; "category_labels" = "Arbeid,Diverse,Favoritter,Fødselsdager,Helgdager,Idéer,Konkurranser,Kunder,Ledighet,Leverandører,Oppfølging,Personlig,Presenter,Prosjekt,Møter,Reiser,Status,Telefonsamtaler,Ærend"; "repeat_NEVER" = "Ikke gjenta"; "repeat_DAILY" = "Daglig"; "repeat_WEEKLY" = "Ukentlig"; "repeat_BI-WEEKLY" = "Annenhver uke"; "repeat_EVERY WEEKDAY" = "Hver ukedag"; "repeat_MONTHLY" = "MÃ¥nedlig"; "repeat_YEARLY" = "Hvert Ã¥r"; "repeat_CUSTOM" = "Valgfri..."; "reminder_NONE" = "Ingen pÃ¥minnelse"; "reminder_5_MINUTES_BEFORE" = "5 minutter før"; "reminder_10_MINUTES_BEFORE" = "10 minutter før"; "reminder_15_MINUTES_BEFORE" = "15 minutter før"; "reminder_30_MINUTES_BEFORE" = "30 minutter før"; "reminder_45_MINUTES_BEFORE" = "45 minutter før"; "reminder_1_HOUR_BEFORE" = "1 time før"; "reminder_2_HOURS_BEFORE" = "2 timer før"; "reminder_5_HOURS_BEFORE" = "5 timer før"; "reminder_15_HOURS_BEFORE" = "15 timer før"; "reminder_1_DAY_BEFORE" = "1 dag før"; "reminder_2_DAYS_BEFORE" = "2 dager før"; "reminder_1_WEEK_BEFORE" = "1 uke før"; "reminder_CUSTOM" = "Valgfri..."; "reminder_MINUTES" = "minutter"; "reminder_HOURS" = "timer"; "reminder_DAYS" = "dager"; "reminder_BEFORE" = "før"; "reminder_AFTER" = "etter"; "reminder_START" = "hendelser starter"; "reminder_END" = "hendelser slutter"; "Reminder Details" = "PÃ¥minnelsedetaljer"; "Choose a Reminder Action" = "Velg en pÃ¥minnelsesmÃ¥te"; "Show an Alert" = "Vis en alarm"; "Send an E-mail" = "Send en E-post"; "Email Organizer" = "E-post organisator"; "Email Attendees" = "E-post deltakere"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Vis tid som ledig"; /* validation errors */ validate_notitle = "Ingen tittel er angitt, fortsette?"; validate_invalid_startdate = "Feil startdato!"; validate_invalid_enddate = "Feil sluttdato!"; validate_endbeforestart = "Angitt sluttdato inntreffer før angitt startdato."; "Tasks" = "Oppgaver"; "Show completed tasks" = "Vis utførte oppgave"; /* tabs */ "Task" = "Oppgave"; "Event" = "Hendelse"; "Recurrence" = "Regelmessighet"; /* toolbar */ "New Event" = "Ny hendelse"; "New Task" = "Ny oppgave"; "Edit" = "Endre"; "Delete" = "Slett"; "Go to Today" = "GÃ¥ til i dag"; "Day View" = "Dagsvisning"; "Week View" = "Ukesvisning"; "Month View" = "MÃ¥nedsvisning"; "Reload" = "Last pÃ¥ nytt"; "eventPartStatModificationError" = "Din deltakerstatus kunne ikke endres."; /* menu */ "New Event..." = "Ny hendelse..."; "New Task..." = "Ny oppgave..."; "Edit Selected Event..." = "Endre hendelse..."; "Delete Selected Event" = "Slett hendelse"; "Select All" = "Velg alle"; "Workweek days only" = "Bare arbeidsdager"; "Tasks in View" = "Oppgaver i visning"; "eventDeleteConfirmation" = "Sletting av hendelsen er permanent.\nVil du fortsette?"; "taskDeleteConfirmation" = "Sletting av oppgaven er permanent.\nVil du fortsette?"; "You cannot remove nor unsubscribe from your personal calendar." = "Du kan ikke slette eller avbryta abonnement pÃ¥ en personlig kalender."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Er du sikker pÃ¥ at du vil slette kalenderen \"%{0}\"?"; /* Legend */ "Participant" = "Deltakelse kreves"; "Optional Participant" = "Deltakelse valgfritt"; "Non Participant" = "Ingen deltaker"; "Chair" = "Stol"; "Needs action" = "Trenger handling"; "Accepted" = "Akseptert"; "Declined" = "Avvist"; "Tentative" = "Foreløpig"; "Free" = "Ledig"; "Busy" = "Opptatt"; "Maybe busy" = "Kanskje opptatt"; "No free-busy information" = "Ingen ledig/opptatt informasjon"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "ForeslÃ¥ tid:"; "Zoom:" = "Zoom:"; "Previous slot" = "Forrige spor"; "Next slot" = "Neste spor"; "Previous hour" = "Forrige time"; "Next hour" = "Neste time"; "Work days only" = "Bare arbeidsdager"; "The whole day" = "Hele dagen"; "Between" = "Mellom"; "and" = "og"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "En tidskonflikt eksisterer med en eller flere detakere.\nVil du likevel beholde de nÃ¥værende innstillingene?"; /* apt list */ "Title" = "Tittel"; "Start" = "Start"; "End" = "Slutt"; "Due Date" = "Dato"; "Location" = "Plass"; "(Private Event)" = "(Privat hendelse)"; vevent_class0 = "(Offentlig hendelse)"; vevent_class1 = "(Privat hendelse)"; vevent_class2 = "(Konfidensiell hendelse)"; vtodo_class0 = "(Offentlig oppgave)"; vtodo_class1 = "(Privat oppgave)"; vtodo_class2 = "(Konfidensiell oppgave)"; "closeThisWindowMessage" = "Takk! Du kan lukke vinduet eller din visning"; "Multicolumn Day View" = "Flerkolonne dagsvisning"; "Please select an event or a task." = "Marker en hendelse eller oppgave."; "editRepeatingItem" = "Objektet du redigerer har gjentakelser. Vil du redigere alle forekomster eller bare denne forekomsten?"; "button_thisOccurrenceOnly" = "Bare denne forekomsten"; "button_allOccurrences" = "Alle forekomster"; /* Properties dialog */ "Name:" = "Navn:"; "Color:" = "Farge:"; "Include in free-busy" = "Inkluder i fritt opptatt"; "Synchronization" = "Synkronisering"; "Synchronize" = "Synkroniser"; "Tag:" = "Merkelapp:"; "Display" = "Vis"; "Show alarms" = "Vis alarm"; "Show tasks" = "Vis oppgaver"; "Links to this Calendar" = "Linker til denne kalenderen"; "Authenticated User Access" = "Authenticated User Access"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Angi en numerisk verdi i dagsfeltet større enn eller lik 1."; "weekFieldInvalid" = "Angi en numerisk verdi i ukefeltet større enn eller lik 1."; "monthFieldInvalid" = "Angi en numerisk verdi i mÃ¥nedsfeltet større enn eller lik 1."; "monthDayFieldInvalid" = "Angi en numerisk verdi i dag i mÃ¥nedsfeltet større en eller lik 1."; "yearFieldInvalid" = "Angi en numerisk verdi i Ã¥rsfeltet større enn eller lik 1."; "appointmentFieldInvalid" = "Angi en numerisk verdi i møtesfeltet større enn eller lik 1."; "recurrenceUnsupported" = "Denne type gjentakelse støttes ikke i dag."; "Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Du mÃ¥ angi en merkelapp om du vil synkronisere kalenderen."; "tagAlreadyExists" = "Merkelappen du spesifiserte er allerede knyttet til en annen kalender."; "tagHasChanged" = "Om du endrer merkelappen pÃ¥ din kalender trenger du Ã¥ laste dataene i din mobiltelefon pÃ¥ nytt.\nFortsätta?"; "tagWasAdded" = "Om du vil synkronisere kalenderen trenger du Ã¥ laste dataene i din mobiltelefon pÃ¥ nytt.\nFortsette?"; "tagWasRemoved" = "Om fjerner kalenderen fra synkronisering trenger du Ã¥ laste dataene i din mobiltelefon pÃ¥ nytt.\nFortsetta?"; "DestinationCalendarError" = "Kilde- og mÃ¥lkalendere er de samme. Prøv Ã¥ kopiere til en annen kalender."; "EventCopyError" = "Kopiering feilet. Vennligst prøv Ã¥ kopiere til en annen kalender."; "Open Task..." = "Ã…pne oppgave..."; "Mark Completed" = "Merk utført"; "Delete Task" = "Slett oppgave"; "Delete Event" = "Slett hendelse"; "Copy event to my calendar" = "Copy event to my calendar"; "Subscribe to a web calendar..." = "Abonnere pÃ¥ en internett-kalender..."; "URL of the Calendar" = "URL til kalenderen"; "Web Calendar" = "Internett-kalender"; "Reload on login" = "Last pÃ¥ nytt ved innlogging"; "Invalid number." = "Ugyldig tall."; "Category" = "Kategori"; "Priority" = "Prioritet"; SOGo-2.1.1b/UI/Scheduler/UIxCalFilterPanel.m0000644000000000000000000000541212247657030017056 0ustar rootroot/* UIxContactsFilterPanel.m - this file is part of SOGo * * Copyright (C) 2006-2009 Inverse inc. * * 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 #import #import #import #import #import "UIxCalFilterPanel.h" static NSArray *filters = nil; @implementation UIxCalFilterPanel + (void) initialize { static NSString *quals[] = { // @"view_all", @"view_today", @"view_next7", @"view_next14", @"view_next31", @"view_thismonth", @"view_future", @"view_selectedday" }; if (!filters) { filters = [NSArray arrayWithObjects: quals count: 7]; [filters retain]; } } - (id) init { if ((self = [super init])) { searchText = nil; searchCriteria = nil; } return self; } - (void) dealloc { [searchCriteria release]; [searchText release]; [super dealloc]; } /* accessors */ - (void) setSearchText: (NSString *)_txt { ASSIGN (searchText, _txt); } - (void) setSearchCriteria: (NSString *)_txt { ASSIGN (searchText, _txt); } - (NSString *) searchText { if (!searchText) searchText = [[self queryParameterForKey: @"search"] copy]; return searchText; } - (NSString *) searchCriteria { if (!searchCriteria) searchCriteria = [[self queryParameterForKey: @"criteria"] copy]; return searchCriteria; } /* filters */ - (NSArray *) filters { return filters; } /* qualifiers */ - (NSString *) filterLabel { return [self labelForKey: [self valueForKey:@"filter"]]; } - (NSString *) selectedFilter { NSString *selectedFilter; SOGoUserSettings *us; selectedFilter = [self queryParameterForKey: @"filterpopup"]; if (![selectedFilter length]) { us = [[context activeUser] userSettings]; selectedFilter = [us objectForKey: @"CalendarDefaultFilter"]; } if (![selectedFilter length]) selectedFilter = @"view_today"; return selectedFilter; } @end /* UIxCalFilterPanel */ SOGo-2.1.1b/UI/Scheduler/Swedish.lproj/0000755000000000000000000000000012247657030016156 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Swedish.lproj/Localizable.strings0000644000000000000000000003737312247657030022027 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Skapa en händelse"; "Create a new task" = "Skapa en uppgift"; "Edit this event or task" = "Ändra händelse eller uppgift"; "Delete this event or task" = "Ta bort händelse eller uppgift"; "Go to today" = "GÃ¥ till idag"; "Switch to day view" = "Ändra till dagsvy"; "Switch to week view" = "Ändra till veckovy"; "Switch to month view" = "Ändra till mÃ¥nadsvy"; "Reload all calendars" = "Ladda om alla kalendrar"; /* Tabs */ "Date" = "Datum"; "Calendars" = "Kalendrar"; /* Day */ "DayOfTheMonth" = "Dag i mÃ¥naden"; "dayLabelFormat" = "%Y-%m-%d"; "today" = "Idag"; "Previous Day" = "FöregÃ¥ende dag"; "Next Day" = "Nästa dag"; /* Week */ "Week" = "Vecka"; "this week" = "denna vecka"; "Week %d" = "Vecka %d"; "Previous Week" = "FöregÃ¥ende vecka"; "Next Week" = "Nästa vecka"; /* Month */ "this month" = "denna mÃ¥nad"; "Previous Month" = "FöregÃ¥ende mÃ¥nad"; "Next Month" = "Nästa mÃ¥nad"; /* Year */ "this year" = "detta Ã¥r"; /* Menu */ "Calendar" = "Kalender"; "Contacts" = "Kontakter"; "New Calendar..." = "Ny kalender..."; "Delete Calendar" = "Ta bort kalender"; "Unsubscribe Calendar" = "Avluta prenumeration av kalender"; "Sharing..." = "Dela ut..."; "Export Calendar..." = "Exportera kalender..."; "Import Events..." = "Importera händelser..."; "Import Events" = "Importera händelser"; "Select an iCalendar file (.ics)." = "Välj en iCalendar fil (.ics)."; "Upload" = "Ladda upp"; "Publish Calendar..." = "Publisera Kalender..."; "Reload Remote Calendars" = "Ladda om fjärrkalendrar"; "Properties" = "Egenskaper"; "Done" = "Klar"; "An error occurred while importing calendar." = "Ett fel har inträffat under kalenderimporten."; "No event was imported." = "Inga händeler importerades."; "A total of %{0} events were imported in the calendar." = "Totalt %{0} händelser importerades till kalendern."; "Compose E-Mail to All Attendees" = "Skriv ett meddelande till alla deltagare"; "Compose E-Mail to Undecided Attendees" = "Skriv ett meddelande till alla deltagare som inte svarat"; /* Folders */ "Personal calendar" = "Personlig kalender"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Förbjuden"; /* acls */ "User rights for:" = "Användarrättigheter för:"; "Any Authenticated User" = "Alla autentiserade användare"; "Public Access" = "Allmän Ã¥tkomst"; "label_Public" = "Publikt"; "label_Private" = "Privat"; "label_Confidential" = "Konfidentiellt"; "label_Viewer" = "Visa alla"; "label_DAndTViewer" = "Visa tid och datum"; "label_Modifier" = "Ändra"; "label_Responder" = "Svara"; "label_None" = "Ingen"; "View All" = "Visa alla"; "View the Date & Time" = "Visa tid och datum"; "Modify" = "Ändra"; "Respond To" = "Svara"; "None" = "Ingen"; "This person can create objects in my calendar." = "Personen kan skapa objekt i min kalender."; "This person can erase objects from my calendar." = "Personen kan radera objekt i min kalender."; /* Button Titles */ "New Calendar..." = "Ny kalender..."; "Subscribe to a Calendar..." = "Prenumrera pÃ¥ en kalender..."; "Remove the selected Calendar" = "Ta bort markerad kalender"; "Name of the Calendar" = "Namn pÃ¥ kalendern"; "new" = "Ny"; "printview" = "Skriv ut"; "edit" = "Ändra"; "delete" = "Ta bort"; "proposal" = "FöreslÃ¥"; "Save and Close" = "Spara och stäng"; "Close" = "Stäng"; "Invite Attendees" = "Bjud in deltagare"; "Attach" = "Bifoga"; "Update" = "Uppdatera"; "Cancel" = "Avbryt"; "show_rejected_apts" = "Visa avböjda möten"; "hide_rejected_apts" = "Dölj avböjda möten"; /* Schedule */ "Schedule" = "Schema"; "No appointments found" = "Inga möten hittade"; "Meetings proposed by you" = "Möten föreslagna av dig"; "Meetings proposed to you" = "Möten föreslagna till dig"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Ã…tgärd"; "accept" = "Acceptera"; "decline" = "Avböj"; "more attendees" = "Fler deltagare"; "Hide already accepted and rejected appointments" = "Dölj accepterade och avböjda möten"; "Show already accepted and rejected appointments" = "Visa accepterade och avböjda möten"; /* Appointments */ "Appointment viewer" = "Mötesvisare"; "Appointment editor" = "Mötesredigerare"; "Appointment proposal" = "Mötesförslag"; "Appointment on" = "Möte"; "Start:" = "Startar:"; "End:" = "Slutar:"; "Due Date:" = "Datum:"; "Title:" = "Titel:"; "Calendar:" = "Kalender:"; "Name" = "Namn"; "Email" = "E-post"; "Status:" = "Status:"; "% complete" = "% utfört"; "Location:" = "Plats:"; "Priority:" = "Prioritet:"; "Privacy" = "Sekretess"; "Cycle" = "Intervall"; "Cycle End" = "Intervall slutar"; "Categories" = "Kategorier"; "Classification" = "Klassifiering"; "Duration" = "Längd"; "Attendees:" = "Deltagare:"; "Resources" = "Resurser"; "Organizer:" = "Organisatör:"; "Description:" = "Beskrivning:"; "Document:" = "Dokument:"; "Category:" = "Kategori:"; "Repeat:" = "Upprepa:"; "Reminder:" = "PÃ¥minnelse:"; "General:" = "Allmännt:"; "Reply:" = "Svara:"; "Target:" = "MÃ¥l:"; "attributes" = "attribut"; "attendees" = "deltagare"; "delegated from" = "delegerad frÃ¥n"; /* checkbox title */ "is private" = "är privat"; /* classification */ "Public" = "Publik"; "Private" = "Privat"; /* text used in overviews and tooltips */ "empty title" = "Tom titel"; "private appointment" = "Privat möte"; "Change..." = "Ändra..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Behöver Ã¥tgärd"; "partStat_ACCEPTED" = "Jag kan deltaga"; "partStat_DECLINED" = "Jag kan inte deltaga"; "partStat_TENTATIVE" = "Jag Ã¥terkommer"; "partStat_DELEGATED" = "Jag delegerar"; "partStat_OTHER" = "Annat"; /* Appointments (error messages) */ "Conflicts found!" = "Konflikter hittade!"; "Invalid iCal data!" = "Ogiltig iCal data!"; "Could not create iCal data!" = "Kunde inte skapa iCal data!"; /* Searching */ "view_all" = "Alla"; "view_today" = "Idag"; "view_next7" = "Nästa 7 dagar"; "view_next14" = "Nästa 14 dagar"; "view_next31" = "Nästa 31 dagar"; "view_thismonth" = "Denna mÃ¥nad"; "view_future" = "Alla framtida händelser"; "view_selectedday" = "Vald dag"; "View:" = "Visa:"; "Title or Description" = "Titel eller beskrivning"; "Search" = "Sök"; "Search attendees" = "Sök deltagare"; "Search resources" = "Sök resurser"; "Search appointments" = "Sök möten"; "All day Event" = "Heldagshändelse"; "check for conflicts" = "Kontrollera konflikter"; "Browse URL" = "URL"; "newAttendee" = "Lägg till deltagare"; /* calendar modes */ "Overview" = "Översikt"; "Chart" = "Schema"; "List" = "Lista"; "Columns" = "Kolumner"; /* Priorities */ "prio_0" = "Inte angiven"; "prio_1" = "Hög"; "prio_2" = "Hög"; "prio_3" = "Hög"; "prio_4" = "Hög"; "prio_5" = "Normal"; "prio_6" = "LÃ¥g"; "prio_7" = "LÃ¥g"; "prio_8" = "LÃ¥g"; "prio_9" = "LÃ¥g"; /* access classes (privacy) */ "PUBLIC_vevent" = "Publik händelse"; "CONFIDENTIAL_vevent" = "Konfidentiell händelse"; "PRIVATE_vevent" = "Privat händelse"; "PUBLIC_vtodo" = "Publik uppgift"; "CONFIDENTIAL_vtodo" = "Konfidentiell uppgift"; "PRIVATE_vtodo" = "Privat uppgift"; /* status type */ "status_" = "Inte angiven"; "status_NOT-SPECIFIED" = "Inte angiven"; "status_TENTATIVE" = "Preliminär"; "status_CONFIRMED" = "Bekräftad"; "status_CANCELLED" = "Inställd"; "status_NEEDS-ACTION" = "Behöver Ã¥tgärd"; "status_IN-PROCESS" = "PÃ¥gÃ¥ende"; "status_COMPLETED" = "Utförd"; /* Cycles */ "cycle_once" = "en gÃ¥ng"; "cycle_daily" = "varje dag"; "cycle_weekly" = "varje vecka"; "cycle_2weeks" = "varannan vecka"; "cycle_4weeks" = "var 4:e veckor"; "cycle_monthly" = "varje mÃ¥nad"; "cycle_weekday" = "varje vardag"; "cycle_yearly" = "varje Ã¥r"; "cycle_end_never" = "intervall slutar aldrig"; "cycle_end_until" = "intervall slutar"; "Recurrence pattern" = "Upprepningsmönster"; "Range of recurrence" = "Omfattning av upprepning"; "Repeat" = "Upprepning"; "Daily" = "Varje dag"; "Weekly" = "Varje vecka"; "Monthly" = "Varje mÃ¥nad"; "Yearly" = "Varje Ã¥r"; "Every" = "Varje"; "Days" = "Dagar"; "Week(s)" = "Vecka(or)"; "On" = "PÃ¥"; "Month(s)" = "MÃ¥nad(er)"; "The" = "The"; "Recur on day(s)" = "Ã…terkommer pÃ¥ dag(ar)"; "Year(s)" = "Ã…r"; "cycle_of" = "av"; "No end date" = "Inget slutdatum"; "Create" = "Skapa"; "appointment(s)" = "möte(n)"; "Repeat until" = "Upprepa till"; "First" = "Första"; "Second" = "Andra"; "Third" = "Tredje"; "Fourth" = "Fjärde"; "Fift" = "Femte"; "Last" = "Sista"; /* Appointment categories */ "category_none" = "Ingen"; "category_labels" = "Arbete,Diverse,Favoriter,Födelsedagar,Helgdagar,Idéer,Kunder,Ledighet,Leverantörer,Personligt,Presenter,Projekt,Möte,Resor,Status,Telefonsamtal,Tävlingar,Uppföljning,Ärenden"; "repeat_NEVER" = "Upprepar inte"; "repeat_DAILY" = "Varje dag"; "repeat_WEEKLY" = "Varje vecka"; "repeat_BI-WEEKLY" = "Varannan vecka"; "repeat_EVERY WEEKDAY" = "Varje vardag"; "repeat_MONTHLY" = "Varje mÃ¥nad"; "repeat_YEARLY" = "Varje Ã¥r"; "repeat_CUSTOM" = "Valfri..."; "reminder_NONE" = "Ingen pÃ¥minnelse"; "reminder_5_MINUTES_BEFORE" = "5 minuter före"; "reminder_10_MINUTES_BEFORE" = "10 minuter före"; "reminder_15_MINUTES_BEFORE" = "15 minuter före"; "reminder_30_MINUTES_BEFORE" = "30 minuter före"; "reminder_45_MINUTES_BEFORE" = "45 minuter före"; "reminder_1_HOUR_BEFORE" = "1 timme före"; "reminder_2_HOURS_BEFORE" = "2 timmar före"; "reminder_5_HOURS_BEFORE" = "5 timmar före"; "reminder_15_HOURS_BEFORE" = "15 timmar före"; "reminder_1_DAY_BEFORE" = "1 dag före"; "reminder_2_DAYS_BEFORE" = "2 dagar före"; "reminder_1_WEEK_BEFORE" = "1 vecka före"; "reminder_CUSTOM" = "Valfri..."; "reminder_MINUTES" = "minuter"; "reminder_HOURS" = "timmar"; "reminder_DAYS" = "dagar"; "reminder_BEFORE" = "före"; "reminder_AFTER" = "efter"; "reminder_START" = "händelserna startar"; "reminder_END" = "händelserna slutar"; "Reminder Details" = "PÃ¥minnelsedetaljer"; "Choose a Reminder Action" = "Välj en pÃ¥minnelsehändelse"; "Show an Alert" = "Visa larmmeddelande"; "Send an E-mail" = "Skicka ett meddelande"; "Email Organizer" = "Skicka meddelande till arrangör"; "Email Attendees" = "Skicka meddelande till deltagare"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Visa tid som ledig"; /* validation errors */ validate_notitle = "Ingen titel är angiven, fortsätta?"; validate_invalid_startdate = "Oriktigt startdatum!"; validate_invalid_enddate = "Oriktigt slutdatum!"; validate_endbeforestart = "Angivet slutdatumet inträffar före angivet startdatum."; "Tasks" = "Uppgifter"; "Show completed tasks" = "Visa utförda uppgifter"; /* tabs */ "Task" = "Uppgift"; "Event" = "Händelse"; "Recurrence" = "Ã…terkommande"; /* toolbar */ "New Event" = "Ny händelse"; "New Task" = "Ny uppgift"; "Edit" = "Ändra"; "Delete" = "Ta bort"; "Go to Today" = "GÃ¥ till idag"; "Day View" = "Dagsvy"; "Week View" = "Veckovy"; "Month View" = "MÃ¥nadsvy"; "Reload" = "Ladda om"; "eventPartStatModificationError" = "Din deltagarstatus kunde inte ändras."; /* menu */ "New Event..." = "Ny händelse..."; "New Task..." = "Ny uppgift..."; "Edit Selected Event..." = "Ändra händelse..."; "Delete Selected Event" = "Ta bort händelse"; "Select All" = "Markera alla"; "Workweek days only" = "Bara arbetsdagar"; "Tasks in View" = "Uppgifter i vy"; "eventDeleteConfirmation" = "Radering av händelsen är permanent.\nVill du fortsätta?"; "taskDeleteConfirmation" = "Radering av uppgiften är permanent.\nVill du fortsätta?"; "You cannot remove nor unsubscribe from your personal calendar." = "Du kan inte ta bort eller avbryta prenumration pÃ¥ en personlig kalender."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Är du säker pÃ¥ att du vill ta bort kalendern \"%{0}\"?"; /* Legend */ "Participant" = "Deltagande krävs"; "Optional Participant" = "Deltagande valfritt"; "Non Participant" = "Icke deltagande"; "Chair" = "Stol"; "Needs action" = "Behöver Ã¥tgärd"; "Accepted" = "Accepterad"; "Declined" = "Avböjd"; "Tentative" = "Preliminär"; "Free" = "Ledig"; "Busy" = "Upptagen"; "Maybe busy" = "Kanske upptagen"; "No free-busy information" = "Ingen ledig/upptagen information"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "FöreslÃ¥ tid:"; "Zoom:" = "Zoom:"; "Previous slot" = "FöregÃ¥ende tid"; "Next slot" = "Nästa tid"; "Previous hour" = "FöregÃ¥ende timme"; "Next hour" = "Nästa timme"; "Work days only" = "Endast vardagar"; "The whole day" = "Hela dagen"; "Between" = "Mellan"; "and" = "and"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "En tidskonflikt finns för en eller flera deltagare.\nVill du trots detta behÃ¥lla nuvarande tid?"; /* apt list */ "Title" = "Titel"; "Start" = "Start"; "End" = "Slut"; "Due Date" = "Datum"; "Location" = "Plats"; "(Private Event)" = "(Privat händelse)"; vevent_class0 = "(Publik händelse)"; vevent_class1 = "(Privat händelse)"; vevent_class2 = "(Konfidentiell händelse)"; vtodo_class0 = "(Publik uppgift)"; vtodo_class1 = "(Privat uppgift)"; vtodo_class2 = "(Konfidentiell uppgift)"; "closeThisWindowMessage" = "Tack! Du kan stänga fönstret eller din vy"; "Multicolumn Day View" = "Multikolumn dagsvy"; "Please select an event or a task." = "Markera en händelse eller uppgift."; "editRepeatingItem" = "Objektet du redigerar har upprepning. Vill du redigera alla förekomster eller bara denna förekomst?"; "button_thisOccurrenceOnly" = "Denna förekomst bara"; "button_allOccurrences" = "Alla förekomster"; /* Properties dialog */ "Name:" = "Namn:"; "Color:" = "Färg:"; "Include in free-busy" = "Inkludera i ledig/upptagen"; "Synchronization" = "Synkronisering"; "Synchronize" = "Synkronisera"; "Tag:" = "Etikett:"; "Display" = "Visa"; "Show alarms" = "Visa alarm"; "Show tasks" = "Visa uppgifter"; "Links to this Calendar" = "Länkar till denna kalender"; "Authenticated User Access" = "Authenticated User Access"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Ange ett numeriskt värde in dagsfältet större än eller lika med 1."; "weekFieldInvalid" = "Ange ett numeriskt värde in veckofältet större än eller lika med 1."; "monthFieldInvalid" = "Ange ett numeriskt värde in mÃ¥nadsfältet större än eller lika med 1."; "monthDayFieldInvalid" = "Ange ett numeriskt värde in dag i mÃ¥nadsfältet större än eller lika med 1."; "yearFieldInvalid" = "Ange ett numeriskt värde in Ã¥rsfältet större än eller lika med 1."; "appointmentFieldInvalid" = "Ange ett numeriskt värde in mötesfältet större än eller lika med 1."; "recurrenceUnsupported" = "Denna upprepningstyp stöds för närvarande inte."; "Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Du mÃ¥ste ange en etikett om du vill synkronisera kalendern."; "tagAlreadyExists" = "Etiketten du angett är redan associerad till en annan kalender."; "tagHasChanged" = "Om du ändrar etiketten pÃ¥ din kalender, behöver du ladda om datat i din mobiltelefon.\nFortsätta?"; "tagWasAdded" = "Om du vill synkronisera kalendern, behöver du ladda om datat i din mobiltelefon.\nFortsätta?"; "tagWasRemoved" = "Om du tar bort kalendern frÃ¥n synkronisering, behöver du ladda om datat i din mobiltelefon.\nFortsätta?"; "DestinationCalendarError" = "Destinationskalendern är samma som källkalendern. Kopiera till en annan kalender."; "EventCopyError" = "Kopieringen misslyckades. Kopiera till en annan kalender."; "Open Task..." = "Öppna uppgift..."; "Mark Completed" = "Märk utförd"; "Delete Task" = "Ta bort uppgift"; "Delete Event" = "Ta bort händelse"; "Copy event to my calendar" = "Copy event to my calendar"; "Subscribe to a web calendar..." = "Prenumrera pÃ¥ en webbkalender..."; "URL of the Calendar" = "URL till kalendern"; "Web Calendar" = "Webbkalender"; "Reload on login" = "Ladda om vid login"; "Invalid number." = "Ogiltigt nummer."; "Category" = "Kategori"; "Priority" = "Prioritet"; SOGo-2.1.1b/UI/Scheduler/Danish.lproj/0000755000000000000000000000000012247657027015764 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Danish.lproj/Localizable.strings0000644000000000000000000004066012247657027021626 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Opret en ny begivenhed"; "Create a new task" = "Opret en ny opgave"; "Edit this event or task" = "Rediger denne begivenhed eller opgave"; "Delete this event or task" = "Slet denne begivenhed eller opgave"; "Go to today" = "GÃ¥ til i dag"; "Switch to day view" = "Skift til dagsvisning"; "Switch to week view" = "Skift til ugevisning"; "Switch to month view" = "Skift til mÃ¥nedsvisning"; "Reload all calendars" = "Genindlæs alle kalendere"; /* Tabs */ "Date" = "Dato"; "Calendars" = "Kalendere"; /* Day */ "DayOfTheMonth" = "Dag i mÃ¥neden"; "dayLabelFormat" = "%m/%d/%Y"; "today" = "I dag"; "Previous Day" = "Forrige dag"; "Next Day" = "Næste dag"; /* Week */ "Week" = "Uge"; "this week" = "Denne uge"; "Week %d" = "Uge%d"; "Previous Week" = "Forrige uge"; "Next Week" = "Næste uge"; /* Month */ "this month" = "Denne mÃ¥ned"; "Previous Month" = "Forrige mÃ¥ned"; "Next Month" = "Næste mÃ¥ned"; /* Year */ "this year" = "I Ã¥r"; /* Menu */ "Calendar" = "Kalender"; "Contacts" = "Kontakter"; "New Calendar..." = "Ny kalender ..."; "Delete Calendar" = "Slet Kalender ..."; "Unsubscribe Calendar" = "Afmeld Kalender"; "Sharing..." = "Deling ..."; "Export Calendar..." = "Eksportér kalender ..."; "Import Events..." = "Importér begivenheder ..."; "Import Events" = "Importér begivenheder"; "Select an iCalendar file (.ics)." = "Vælg en iCalendar-fil (.ics)."; "Upload" = "Indlæs"; "Uploading" = "Uploader"; "Publish Calendar..." = "Publicér kalender ..."; "Reload Remote Calendars" = "Opdatér kalendere"; "Properties" = "Egenskaber"; "Done" = "Udført"; "An error occurred while importing calendar." = "Der opstod en fejl under importering af kalender."; "No event was imported." = "Ingen begivenhed blev importeret."; "A total of %{0} events were imported in the calendar." = "I alt %{0} begivenheder blev importeret i kalenderen."; "Compose E-Mail to All Attendees" = "Skriv besked til alle deltagere"; "Compose E-Mail to Undecided Attendees" = "Skriv besked til ikke ubestemte deltagere"; /* Folders */ "Personal calendar" = "Personlig kalender"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Forbudt"; /* acls */ "Access rights to" = "Adgangsrettigheder til"; "For user" = "For bruger"; "Any Authenticated User" = "Enhver godkendt bruger"; "Public Access" = "Offentlig adgang"; "label_Public" = "Offentlig"; "label_Private" = "Privat"; "label_Confidential" = "Hemmelig"; "label_Viewer" = "Vis alle"; "label_DAndTViewer" = "Se dato og klokkeslæt"; "label_Modifier" = "Redigér"; "label_Responder" = "Reagér pÃ¥"; "label_None" = "Ingen"; "View All" = "Vis alle"; "View the Date & Time" = "Se dato og klokkeslæt"; "Modify" = "Redigér"; "Respond To" = "Reagér pÃ¥"; "None" = "Ingen"; "This person can create objects in my calendar." = "Denne person kan oprette emner i min kalender."; "This person can erase objects from my calendar." = "Denne person kan slette emner fra min kalender."; /* Button Titles */ "Subscribe to a Calendar..." = "Abonnér pÃ¥ en kalender ..."; "Remove the selected Calendar" = "Fjern den valgte kalender"; "Name of the Calendar" = "Navn pÃ¥ Kalender"; "new" = "Ny"; "printview" = "Udskriftsvisning"; "edit" = "Redigér"; "delete" = "Slet"; "proposal" = "Forslag"; "Save and Close" = "Gem og luk"; "Close" = "Luk"; "Invite Attendees" = "Invitér deltagere"; "Attach" = "Vedhæft"; "Update" = "Opdatér"; "Cancel" = "Annullér"; "show_rejected_apts" = "Vis afviste aftaler"; "hide_rejected_apts" = "Skjul afviste aftaler"; /* Schedule */ "Schedule" = "Planlæg"; "No appointments found" = "Ingen fundne aftaler"; "Meetings proposed by you" = "Møder foreslÃ¥et af dig"; "Meetings proposed to you" = "Møder foreslÃ¥et til dig"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Handling"; "accept" = "Acceptér"; "decline" = "Afvis"; "more attendees" = "Flere deltagere"; "Hide already accepted and rejected appointments" = "Skjul allerede accepterede og afviste aftaler"; "Show already accepted and rejected appointments" = "Vis allerede accepterede og afviste aftaler"; /* Appointments */ "Appointment viewer" = "Aftale viser"; "Appointment editor" = "Aftale editor"; "Appointment proposal" = "Aftale Forslag"; "Appointment on" = "Aftale pÃ¥"; "Start:" = "Start:"; "End:" = "Slut:"; "Due Date:" = "Forfaldsdato:"; "Title:" = "Titel:"; "Calendar:" = "Kalender:"; "Name" = "Navn"; "Email" = "E-mail"; "Status:" = "Status:"; "% complete" = "% Færdig"; "Location:" = "Sted:"; "Priority:" = "Prioritet:"; "Privacy" = "Beskyttelse af personlige oplysninger"; "Cycle" = "Cyklus"; "Cycle End" = "Cyklus sluttidspunkt"; "Categories" = "Kategorier"; "Classification" = "Klassifikation"; "Duration" = "Varighed"; "Attendees:" = "Deltagere:"; "Resources" = "Ressourcer"; "Organizer:" = "Arrangør:"; "Description:" = "Beskrivelse:"; "Document:" = "Dokument:"; "Category:" = "Kategori:"; "Repeat:" = "Gentag:"; "Reminder:" = "PÃ¥mindelse:"; "General:" = "Generelt:"; "Reply:" = "Svar:"; "Target:" = "MÃ¥l:"; "attributes" = "attributter"; "attendees" = "deltagere"; "delegated from" = "delegeret fra"; /* checkbox title */ "is private" = "er privat"; /* classification */ "Public" = "Offentlig"; "Private" = "Privat"; /* text used in overviews and tooltips */ "empty title" = "Tom titel"; "private appointment" = "Privat aaftale"; "Change..." = "Skift ..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Jeg vil bekræfte senere"; "partStat_ACCEPTED" = "Jeg vil deltage"; "partStat_DECLINED" = "Jeg vil ikke deltage"; "partStat_TENTATIVE" = "Jeg vil mÃ¥ske deltage"; "partStat_DELEGATED" = "Jeg uddelegerer"; "partStat_OTHER" = "Andre"; /* Appointments (error messages) */ "Conflicts found!" = "Konflikter fundet!"; "Invalid iCal data!" = "Ugyldig iCal data!"; "Could not create iCal data!" = "Kunne ikke oprette iCal data!"; /* Searching */ "view_all" = "Alle"; "view_today" = "I dag"; "view_next7" = "Næste 7 dage"; "view_next14" = "Næste 14 dage"; "view_next31" = "Næste 31 dage"; "view_thismonth" = "Denne mÃ¥ned"; "view_future" = "Alle fremtidige begivenheder"; "view_selectedday" = "Valgte dag"; "View:" = "Vis:"; "Title or Description" = "Titel eller Beskrivelse"; "Search" = "Søg"; "Search attendees" = "Søg deltagere"; "Search resources" = "Søg ressourcer"; "Search appointments" = "Søg aftaler"; "All day Event" = "Heldags arrangement"; "check for conflicts" = "Kontrollér for konflikter"; "Browse URL" = "Gennemse URL"; "newAttendee" = "Tilføj deltager"; /* calendar modes */ "Overview" = "Oversigt"; "Chart" = "Top"; "List" = "Liste"; "Columns" = "Kolonner"; /* Priorities */ "prio_0" = "Ikke specificeret"; "prio_1" = "Høj"; "prio_2" = "Høj"; "prio_3" = "Høj"; "prio_4" = "Høj"; "prio_5" = "Normal"; "prio_6" = "Lav"; "prio_7" = "Lav"; "prio_8" = "Lav"; "prio_9" = "Lav"; /* access classes (privacy) */ "PUBLIC_vevent" = "Offentlig begivenhed"; "CONFIDENTIAL_vevent" = "Hemmelig begivenhed"; "PRIVATE_vevent" = "Privat begivenhed"; "PUBLIC_vtodo" = "Offentlig opgave"; "CONFIDENTIAL_vtodo" = "Hemmelig opgave"; "PRIVATE_vtodo" = "Privat opgave"; /* status type */ "status_" = "Ikke specificeret"; "status_NOT-SPECIFIED" = "Ikke specificeret"; "status_TENTATIVE" = "Tentativ"; "status_CONFIRMED" = "Bekræftet"; "status_CANCELLED" = "Annulleret"; "status_NEEDS-ACTION" = "Kræver handling"; "status_IN-PROCESS" = "I gang"; "status_COMPLETED" = "Afsluttet den"; /* Cycles */ "cycle_once" = "cycle_once"; "cycle_daily" = "cycle_daily"; "cycle_weekly" = "cycle_weekly"; "cycle_2weeks" = "cycle_2weeks"; "cycle_4weeks" = "cycle_4weeks"; "cycle_monthly" = "cycle_monthly"; "cycle_weekday" = "cycle_weekday"; "cycle_yearly" = "cycle_yearly"; "cycle_end_never" = "cycle_end_never"; "cycle_end_until" = "cycle_end_until"; "Recurrence pattern" = "Gentagelsesmønster"; "Range of recurrence" = "Gentagelsesinterval"; "Repeat" = "Gentag"; "Daily" = "Dagligt"; "Weekly" = "Ugentligt"; "Monthly" = "MÃ¥nedligt"; "Yearly" = "Ã…rligt"; "Every" = "Hver"; "Days" = "Dag"; "Week(s)" = "Uge(r)"; "On" = "den"; "Month(s)" = "MÃ¥ned (er)"; "The" = "Den"; "Recur on day(s)" = "Gentages pÃ¥ dag(e)"; "Year(s)" = "Ã…r"; "cycle_of" = "af"; "No end date" = "Ingen slutdato"; "Create" = "Opret"; "appointment(s)" = "aftale(r)"; "Repeat until" = "Gentag indtil"; "First" = "Første"; "Second" = "Anden"; "Third" = "Tredje"; "Fourth" = "Fjerde"; "Fift" = "Femte"; "Last" = "Sidste"; /* Appointment categories */ "category_none" = "Ingen"; "category_labels" = "Jubilæum, fødselsdag, forretning, kald, klienter, konkurrence, kunde, favoritter, opfølgning, gaver, helligdage, idéer, møde, problemer, diverse, personlig, projekter, offentlig helligdag, status, Leverandører, Rejser, Ferie"; "repeat_NEVER" = "Gentages ikke"; "repeat_DAILY" = "Dagligt"; "repeat_WEEKLY" = "Ugentligt"; "repeat_BI-WEEKLY" = "En gang om ugen"; "repeat_EVERY WEEKDAY" = "Alle hverdage"; "repeat_MONTHLY" = "MÃ¥nedligt"; "repeat_YEARLY" = "Ã…rligt"; "repeat_CUSTOM" = "Tilpasset ..."; "reminder_NONE" = "Ingen pÃ¥mindelse"; "reminder_5_MINUTES_BEFORE" = "5 minutter før"; "reminder_10_MINUTES_BEFORE" = "10 minutter før"; "reminder_15_MINUTES_BEFORE" = "15 minutter før"; "reminder_30_MINUTES_BEFORE" = "30 minutter før"; "reminder_45_MINUTES_BEFORE" = "45 minutter før"; "reminder_1_HOUR_BEFORE" = "1 time før"; "reminder_2_HOURS_BEFORE" = "2 timer før"; "reminder_5_HOURS_BEFORE" = "5 timer før"; "reminder_15_HOURS_BEFORE" = "15 timer før"; "reminder_1_DAY_BEFORE" = "1 dag før"; "reminder_2_DAYS_BEFORE" = "2 dage før"; "reminder_1_WEEK_BEFORE" = "1 uge før"; "reminder_CUSTOM" = "Tilpasset ..."; "reminder_MINUTES" = "Minutter"; "reminder_HOURS" = "Timer"; "reminder_DAYS" = "Dage"; "reminder_BEFORE" = "Før"; "reminder_AFTER" = "Efter"; "reminder_START" = "Begivenheden starter"; "reminder_END" = "Begivenheden slutter"; "Reminder Details" = "PÃ¥mindelsesdetaljer"; "Choose a Reminder Action" = "Vælg en pÃ¥mindelseshandling"; "Show an Alert" = "Vis en alarm"; "Send an E-mail" = "Send en e-mail"; "Email Organizer" = "Email arrangør"; "Email Attendees" = "E-mail deltagere"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Vis tidspunkt som ledig"; /* validation errors */ validate_notitle = "Ingen titel er indtastet, vil du fortsætte?"; validate_invalid_startdate = "Forkert startdato!"; validate_invalid_enddate = "Forkert slutdato!"; validate_endbeforestart = "Indtastet slutdato ligger før startdato."; "Events" = "Opgaver"; "Tasks" = "Opgaver"; "Show completed tasks" = "Vis udførte opgaver"; /* tabs */ "Task" = "Opgave"; "Event" = "Begivenhed"; "Recurrence" = "Gentagelse"; /* toolbar */ "New Event" = "Ny begivenhed"; "New Task" = "Ny opgave"; "Edit" = "Redigér"; "Delete" = "Slet"; "Go to Today" = "GÃ¥ til i dag"; "Day View" = "Dagsvisning"; "Week View" = "Ugevisning"; "Month View" = "MÃ¥nedsvisning"; "Reload" = "Opdatér"; "eventPartStatModificationError" = "Din deltagelsesstatus kunne ikke ændres."; /* menu */ "New Event..." = "Ny begivenhed ..."; "New Task..." = "Ny opgave ..."; "Edit Selected Event..." = "Redigér valgte begivenhed ..."; "Delete Selected Event" = "Slet valgte begivenhed"; "Select All" = "Vælg alle"; "Workweek days only" = "Arbejdsuge dage kun"; "Tasks in View" = "Opgaver i visning"; "eventDeleteConfirmation" = "Følgende begivenhed er/bliver slettet: \n%{0}\nFortsæt?"; "taskDeleteConfirmation" = "Følgende opgave(r) bliver slettet: \n%{0}\nFortsæt?"; "You cannot remove nor unsubscribe from your personal calendar." = "Du kan ikke fjerne eller afmelde din personlige kalender."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Er du sikker pÃ¥ du vil slette kalenderen \"%{0}\"?"; /* Legend */ "Participant" = "Deltager"; "Optional Participant" = "Valgfri deltager"; "Non Participant" = "Deltager ikke"; "Chair" = "Sæde"; "Needs action" = "Kræver handling"; "Accepted" = "Accepteret"; "Declined" = "Afvist"; "Tentative" = "Tentativ"; "Free" = "Ledig"; "Busy" = "Optaget"; "Maybe busy" = "MÃ¥ske optaget"; "No free-busy information" = "Ingen ledig/optaget information "; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "ForeslÃ¥ tidsinterval:"; "Zoom:" = "Zoom:"; "Previous slot" = "Forrige interval"; "Next slot" = "Næste interval"; "Previous hour" = "Forrige time"; "Next hour" = "Næste time"; "Work days only" = "Kun pÃ¥ hverdage"; "The whole day" = "Hele dagen"; "Between" = "Mellem"; "and" = "og"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "En tidskonflikt med en eller flere deltagere. \nBehold de aktuelle indstillinger alligevel?"; /* apt list */ "Title" = "Titel"; "Start" = "Start"; "End" = "Slut"; "Due Date" = "Forfaldsdato"; "Location" = "Sted"; "(Private Event)" = "(Privat begivenhed)"; vevent_class0 = "(Offentlig begivenhed)"; vevent_class1 = "(Privat begivenhed)"; vevent_class2 = "(Hemmelig begivenhed)"; "Priority" = "Prioritet"; "Category" = "Kategori"; vtodo_class0 = "(Offentlig opgave)"; vtodo_class1 = "(Privat opgave)"; vtodo_class2 = "(Hemmelig opgave)"; "closeThisWindowMessage" = "Tak! Du kan nu lukke dette vindue, eller se din"; "Multicolumn Day View" = "Flersøjle dagsvisning"; "Please select an event or a task." = "Vælg venligst en begivenhed eller en opgave."; "editRepeatingItem" = "Det element, du redigerer, er et gentaget element. Ønsker du at redigere alle forekomster af det eller kun dette ene tilfælde?"; "button_thisOccurrenceOnly" = "Kun denne forekomst"; "button_allOccurrences" = "Alle forekomster"; /* Properties dialog */ "Name:" = "Navn:"; "Color:" = "Farve:"; "Include in free-busy" = "Medtag i ledig-optaget"; "Synchronization" = "Synkronisering"; "Synchronize" = "Synkronisér"; "Tag:" = "Mærke"; "Display" = "Display"; "Show alarms" = "Vis alarmer"; "Show tasks" = "Vis opgaver"; "Notifications" = "Notifikationer"; "Receive a mail when I modify my calendar" = "Modtag en mail, nÃ¥r jeg ændrer min kalender"; "Receive a mail when someone else modifies my calendar" = "Modtag en mail, nÃ¥r andre ændrer min kalender"; "When I modify my calendar, send a mail to:" = "NÃ¥r jeg ændrer min kalender, sÃ¥ send en mail til:"; "Links to this Calendar" = "Links til denne kalender"; "Authenticated User Access" = "Godkendt brugeradgang"; "CalDAV URL" = "CalDAV URL"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Angiv venligst en numerisk værdi i feltet Dag(e) skal være større end eller lig med 1."; "weekFieldInvalid" = "Angiv venligst en numerisk værdi i feltet. Uge(r) skal være større end eller lig med 1."; "monthFieldInvalid" = "Angiv venligst en numerisk værdi i feltet. mÃ¥ned(er) skal være større end eller lig med 1."; "monthDayFieldInvalid" = "Angiv venligst en numerisk værdi i feltet. mÃ¥nedsdag(e) skal være større end eller lig med 1."; "yearFieldInvalid" = "Angiv venligst en numerisk værdi i feltet. Ã…rstal skal være større end eller lig med 1."; "appointmentFieldInvalid" = "Angiv venligst en numerisk værdi i feltet. Aftale skal være større end eller lig med 1."; "recurrenceUnsupported" = "Denne type gentagelser er i øjeblikket ikke understøttet."; "Please specify a calendar name." = "Angiv venligst et kalender navn."; "tagNotDefined" = "Du skal angive et mærkat, hvis du ønsker at synkronisere denne kalender."; "tagAlreadyExists" = "Mærkatet du har angivet er allerede knyttet til en anden kalender."; "tagHasChanged" = "Hvis du ændrer din kalenders mærkat, skal du genindlæse data pÃ¥ din mobile enhed.\nFortsæt?"; "tagWasAdded" = "Hvis du ønsker at synkronisere denne kalender, skal du genindlæse data pÃ¥ din mobile enhed.\nFortsæt?"; "tagWasRemoved" = "Hvis du fjerner denne kalender fra synkronisering, skal du genindlæse data pÃ¥ din mobile enhed.\nFortsæt?"; "DestinationCalendarError" = "Kilde og destination kalendere er de samme. Prøv at kopiere til en anden kalender."; "EventCopyError" = "Kopieringen mislykkedes. Prøv at kopiér til en anden kalender."; "Open Task..." = "Ã…bn opgave ..."; "Mark Completed" = "Markér afsluttet"; "Delete Task" = "Slet opgave"; "Delete Event" = "Slet begivenhed"; "Copy event to my calendar" = "Kopiér begivenhed til min kalender"; "View Raw Source" = "Vis kilde"; "Subscribe to a web calendar..." = "Abonnér pÃ¥ en online kalender ..."; "URL of the Calendar" = "Kalenderens URL"; "Web Calendar" = "Online kalender"; "Reload on login" = "Genindlæs ved login"; "Invalid number." = "Ugyldigt nummer."; "Please identify yourself to %{0}" = "Identificer dig selv til %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxCalFilterPanel.h0000644000000000000000000000216312247657030017051 0ustar rootroot/* UIxContactsFilterPanel.h - this file is part of SOGo * * Copyright (C) 2006 Inverse inc. * * 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 UIXCONTACTSFILTERPANEL_H #define UIXCONTACTSFILTERPANEL_H #import @class NSString; @interface UIxCalFilterPanel : UIxComponent { NSString *searchText; NSString *searchCriteria; } @end #endif /* UIXCONTACTSFILTERPANEL_H */ SOGo-2.1.1b/UI/Scheduler/SchedulerUIProduct.m0000644000000000000000000000163312247657030017321 0ustar rootroot/* Copyright (C) 2000-2003 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. */ #import @interface SchedulerUIProduct : NSObject @end @implementation SchedulerUIProduct @end /* SchedulerUIProduct */ SOGo-2.1.1b/UI/Scheduler/UIxOccurenceDialog.h0000644000000000000000000000242512247657030017253 0ustar rootroot/* UIxOccurenceDialog.h - this file is part of SOGo * * Copyright (C) 2008 Inverse inc. * * 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 UIXRECURRENCEEDITOR_H #define UIXRECURRENCEEDITOR_H #import @class NSString; @interface UIxOccurenceDialog : UIxComponent { NSString *action; } - (NSString *) action; - (NSString *) calendarFolder; - (NSString *) componentName; - (NSString *) recurrenceName; - (id ) defaultAction; - (id ) confirmDeletionAction; @end #endif /* UIXRECURRENCEEDITOR_H */ SOGo-2.1.1b/UI/Scheduler/Polish.lproj/0000755000000000000000000000000012247657030016006 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Polish.lproj/Localizable.strings0000644000000000000000000004202612247657030021646 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Utwórz nowe wydarzenie"; "Create a new task" = "Utwórz nowe zadanie"; "Edit this event or task" = "Edytuj to wydarzenie lub zadanie"; "Delete this event or task" = "UsuÅ„ to wydarzenie lub zadanie"; "Go to today" = "Przejdź do dnia dzisiejszego"; "Switch to day view" = "Przełącz na widok dnia"; "Switch to week view" = "Przełącz na widok tygodnia"; "Switch to month view" = "Przełącz na widok miesiÄ…ca"; "Reload all calendars" = "PrzeÅ‚aduj wszystkie kalendarze"; /* Tabs */ "Date" = "Data"; "Calendars" = "Kalendarze"; /* Day */ "DayOfTheMonth" = "DzieÅ„ miesiÄ…ca"; "dayLabelFormat" = "%d.%m.%Y"; "today" = "Dzisiaj"; "Previous Day" = "Poprzedni dzieÅ„"; "Next Day" = "NastÄ™pny dzieÅ„"; /* Week */ "Week" = "TydzieÅ„"; "this week" = "ten tydzieÅ„"; "Week %d" = "TydzieÅ„ %d"; "Previous Week" = "Poprzedni tydzieÅ„"; "Next Week" = "NastÄ™pny tydzieÅ„"; /* Month */ "this month" = "ten miesiÄ…c"; "Previous Month" = "Poprzedni miesiÄ…c"; "Next Month" = "NastÄ™pny miesiÄ…c"; /* Year */ "this year" = "ten rok"; /* Menu */ "Calendar" = "Kalendarz"; "Contacts" = "Kontakty"; "New Calendar..." = "Nowy kalendarz"; "Delete Calendar" = "UsuÅ„ kalendarz"; "Unsubscribe Calendar" = "Wyłącz subskrypcjÄ™ kalendarza"; "Sharing..." = "UdostÄ™pnianie"; "Export Calendar..." = "Eksportuj kalendarz"; "Import Events..." = "Importuj wydarzenia"; "Import Events" = "Importowanie wydarzeÅ„"; "Select an iCalendar file (.ics)." = "Wybierz plik iCalendar (.ics)."; "Upload" = "WyÅ›lij"; "Uploading" = "WysyÅ‚anie"; "Publish Calendar..." = "Opublikuj kalendarz"; "Reload Remote Calendars" = "PrzeÅ‚aduj zdalne kalendarze"; "Properties" = "WÅ‚aÅ›ciwoÅ›ci"; "Done" = "Zrobione"; "An error occurred while importing calendar." = "Błąd w trakcie importu kalendarza."; "No event was imported." = "Nie zaimportowano żadnego wydarzenia."; "A total of %{0} events were imported in the calendar." = "Do kalendarza zaimportowano razem %{0} wydarzeÅ„(nia)."; "Compose E-Mail to All Attendees" = "Utwórz wiadomość e-mail do wszystkich uczestników"; "Compose E-Mail to Undecided Attendees" = "Utwórz wiadomość e-mail do niezdecydowanych uczestników"; /* Folders */ "Personal calendar" = "Kalendarz osobisty"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Zabronione"; /* acls */ "Access rights to" = "Uprawnienia dla"; "For user" = "Dla użytkownika"; "Any Authenticated User" = "Każdy zalogowany użytkownik"; "Public Access" = "DostÄ™p publiczny"; "label_Public" = "Publiczne"; "label_Private" = "Prywatne"; "label_Confidential" = "Poufne"; "label_Viewer" = "Pokaż wszystko"; "label_DAndTViewer" = "Pokaż datÄ™ i czas"; "label_Modifier" = "ZmieÅ„"; "label_Responder" = "Odpowiedz na"; "label_None" = "Brak"; "View All" = "Pokaż wszystko"; "View the Date & Time" = "Pokaż datÄ™ i czas"; "Modify" = "ZmieÅ„"; "Respond To" = "Odpowiedz na"; "None" = "Brak"; "This person can create objects in my calendar." = "Ta osoba może tworzyć obiekty w moim kalendarzu."; "This person can erase objects from my calendar." = "Ta osoba może usuwać obiekty z mojego kalendarza."; /* Button Titles */ "Subscribe to a Calendar..." = "Subskrybuj kalendarz użytkownika"; "Remove the selected Calendar" = "UsuÅ„ zaznaczony kalendarz"; "Name of the Calendar" = "Nazwa kalendarza"; "new" = "Nowy"; "printview" = "Widok wydruku"; "edit" = "Edytuj"; "delete" = "UsuÅ„"; "proposal" = "Propozycja"; "Save and Close" = "Zapisz i zamknij"; "Close" = "Zamknij"; "Invite Attendees" = "ZaproÅ› uczestników"; "Attach" = "Załącz"; "Update" = "Zaktualizuj"; "Cancel" = "Anuluj"; "show_rejected_apts" = "Pokaż odrzucone spotkania"; "hide_rejected_apts" = "Ukryj odrzucone spotkania"; /* Schedule */ "Schedule" = "Harmonogram"; "No appointments found" = "Brak spotkaÅ„"; "Meetings proposed by you" = "Spotkania zaproponowane przez ciebie"; "Meetings proposed to you" = "Spotkania zaproponowane tobie"; "sched_startDateFormat" = "%d.%m %H:%M"; "action" = "Akcja"; "accept" = "Zaakceptuj"; "decline" = "Odmów"; "more attendees" = "WiÄ™cej uczestników"; "Hide already accepted and rejected appointments" = "Ukryj zaakceptowane i odrzucone spoktania"; "Show already accepted and rejected appointments" = "Pokaż zaakceptowane i odrzucone spotkania"; /* Appointments */ "Appointment viewer" = "PrzeglÄ…darka spoktaÅ„"; "Appointment editor" = "Edytor spotkaÅ„"; "Appointment proposal" = "Propozycja spotkania"; "Appointment on" = "Spotkanie w"; "Start:" = "PoczÄ…tek:"; "End:" = "Koniec:"; "Due Date:" = "Termin:"; "Title:" = "TytuÅ‚:"; "Calendar:" = "Kalendarz:"; "Name" = "Nazwa"; "Email" = "E-mail"; "Status:" = "Status:"; "% complete" = "% wykonania"; "Location:" = "Miejsce:"; "Priority:" = "Priorytet:"; "Privacy" = "Prywatność"; "Cycle" = "Powtarzaj"; "Cycle End" = "Koniec powtarzania"; "Categories" = "Kategorie"; "Classification" = "Klasyfikacja"; "Duration" = "Czas trwania"; "Attendees:" = "Uczestnicy:"; "Resources" = "Zasoby"; "Organizer:" = "Organizator:"; "Description:" = "Opis:"; "Document:" = "Dokument:"; "Category:" = "Kategoria:"; "Repeat:" = "Powtórz:"; "Reminder:" = "Przypomnienie:"; "General:" = "Ogólne:"; "Reply:" = "Odpowiedź:"; "Created by:" = "Stworzone przez:"; "Target:" = "Cel:"; "attributes" = "atrybuty"; "attendees" = "uczestnicy"; "delegated from" = "oddelegowane przez"; /* checkbox title */ "is private" = "jest prywatne"; /* classification */ "Public" = "Publiczne"; "Private" = "Prywtne"; /* text used in overviews and tooltips */ "empty title" = "Pusty tytuÅ‚"; "private appointment" = "Spotkanie prywatne"; "Change..." = "ZmieÅ„"; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "PotwierdzÄ™ poźniej"; "partStat_ACCEPTED" = "WezmÄ™ udziaÅ‚"; "partStat_DECLINED" = "Nie wezmÄ™ udziaÅ‚u"; "partStat_TENTATIVE" = "Być może wezmÄ™ udziaÅ‚"; "partStat_DELEGATED" = "OddelegujÄ™"; "partStat_OTHER" = "Inne"; /* Appointments (error messages) */ "Conflicts found!" = "Znaleziono konflikty!"; "Invalid iCal data!" = "Niepoprawne dane iCal!"; "Could not create iCal data!" = "Nie można byÅ‚o utworzyć danych iCal!"; /* Searching */ "view_all" = "Wszystko"; "view_today" = "Dzisiaj"; "view_next7" = "NastÄ™pne 7 dni"; "view_next14" = "NastÄ™pne 14 dni"; "view_next31" = "NastÄ™pne 31 dni"; "view_thismonth" = "Ten miesiÄ…c"; "view_future" = "wszystkie przyszÅ‚e wydarzenia"; "view_selectedday" = "Zaznaczony dzieÅ„"; "View:" = "Widok:"; "Title or Description" = "TytuÅ‚ lub opis"; "Search" = "Szukaj"; "Search attendees" = "Szukaj uczestników"; "Search resources" = "Szukaj zasobów"; "Search appointments" = "Szukaj spotkania"; "All day Event" = "Wydarzenie caÅ‚odniowe"; "check for conflicts" = "Sprawdź konflikty"; "Browse URL" = "PrzeglÄ…daj URL"; "newAttendee" = "Dodaj uczestnika"; /* calendar modes */ "Overview" = "PrzeglÄ…d"; "Chart" = "Wykres"; "List" = "Lista"; "Columns" = "Kolumny"; /* Priorities */ "prio_0" = "NieokreÅ›lony"; "prio_1" = "Wysoki"; "prio_2" = "Wysoki"; "prio_3" = "Wysoki"; "prio_4" = "Wysoki"; "prio_5" = "Normalny"; "prio_6" = "Niski"; "prio_7" = "Niski"; "prio_8" = "Niski"; "prio_9" = "Niski"; /* access classes (privacy) */ "PUBLIC_vevent" = "Wydarzenie publiczne"; "CONFIDENTIAL_vevent" = "Wydarzenie poufne"; "PRIVATE_vevent" = "Wydarzenie prywatne"; "PUBLIC_vtodo" = "Zadanie publiczne"; "CONFIDENTIAL_vtodo" = "Zadanie poufne"; "PRIVATE_vtodo" = "Zadanie prywatne"; /* status type */ "status_" = "NieokreÅ›lone"; "status_NOT-SPECIFIED" = "NieokreÅ›lone"; "status_TENTATIVE" = "Niepewne"; "status_CONFIRMED" = "Potwierdzone"; "status_CANCELLED" = "Anulowane"; "status_NEEDS-ACTION" = "Wymaga akcji"; "status_IN-PROCESS" = "Trwa"; "status_COMPLETED" = "ZakoÅ„czone"; /* Cycles */ "cycle_once" = "powtórz raz"; "cycle_daily" = "powtadzaj codziennie"; "cycle_weekly" = "powtarzaj co tydzieÅ„"; "cycle_2weeks" = "powtarzaj co 2 tygodnie"; "cycle_4weeks" = "powtarzaj co 4 tygodnie"; "cycle_monthly" = "powtarzaj co miesiÄ…c"; "cycle_weekday" = "powtarzaj w dni powszednie"; "cycle_yearly" = "powtarzaj co rok"; "cycle_end_never" = "powtarzaj bezterminowo"; "cycle_end_until" = "powtarzaj do"; "Recurrence pattern" = "Schemat powtórzeÅ„"; "Range of recurrence" = "Zakres powtórzeÅ„"; "Repeat" = "Powtórz"; "Daily" = "Codziennie"; "Weekly" = "Co tydzieÅ„"; "Monthly" = "Co miesiÄ…c"; "Yearly" = "Co rok"; "Every" = "Co"; "Days" = "Dni"; "Week(s)" = "Tygodni(e)"; "On" = "w"; "Month(s)" = "MiesiÄ…ce(cy)"; "The" = " "; "Recur on day(s)" = "Powtarzaj w dni"; "Year(s)" = "Lat(a)"; "cycle_of" = " "; "No end date" = "Bez daty koÅ„cowej"; "Create" = "Utwórz"; "appointment(s)" = "spotkanie(a)"; "Repeat until" = "Powtarzaj do"; "First" = "Pierwszy"; "Second" = "Drugi"; "Third" = "Trzeci"; "Fourth" = "Czwarty"; "Fift" = "PiÄ…ty"; "Last" = "Ostatni"; /* Appointment categories */ "category_none" = "Brak"; "category_labels" = "Rocznica,Urodziny,Biznes,Telefony,Klienci,Konkurencja,Klient,Ulubione,NawiÄ…zania,Podarunki,ÅšwiÄ™ta,Idee,Spotkanie,Problemy,Różne,Osobiste,Projekty,ÅšwiÄ™ta publiczne,Status,Dostawcy,Podróż,Wakacje"; "repeat_NEVER" = "Bez powtórzeÅ„"; "repeat_DAILY" = "Codziennie"; "repeat_WEEKLY" = "Co tydzieÅ„"; "repeat_BI-WEEKLY" = "Co dwa tygodnie"; "repeat_EVERY WEEKDAY" = "W dni powszednie"; "repeat_MONTHLY" = "Co miesiÄ…c"; "repeat_YEARLY" = "Co rok"; "repeat_CUSTOM" = "Inaczej"; "reminder_NONE" = "Bez przypomnienia"; "reminder_5_MINUTES_BEFORE" = "5 minut przed"; "reminder_10_MINUTES_BEFORE" = "10 minut przed"; "reminder_15_MINUTES_BEFORE" = "15 minut przed"; "reminder_30_MINUTES_BEFORE" = "30 minut przed"; "reminder_45_MINUTES_BEFORE" = "45 minut przed"; "reminder_1_HOUR_BEFORE" = "1 godzinÄ™ przed"; "reminder_2_HOURS_BEFORE" = "2 godziny przed"; "reminder_5_HOURS_BEFORE" = "5 godzin przed"; "reminder_15_HOURS_BEFORE" = "15 godzin przed"; "reminder_1_DAY_BEFORE" = "1 dzieÅ„ przed"; "reminder_2_DAYS_BEFORE" = "2 dni przed"; "reminder_1_WEEK_BEFORE" = "1 tydzieÅ„ przed"; "reminder_CUSTOM" = "Inaczej"; "reminder_MINUTES" = "minut(y)"; "reminder_HOURS" = "godzin(y)"; "reminder_DAYS" = "dni"; "reminder_BEFORE" = "przed"; "reminder_AFTER" = "po"; "reminder_START" = "rozpoczÄ™ciem wydarzenia"; "reminder_END" = "koÅ„cem wydarzenia"; "Reminder Details" = "Szczegóły przypomnienia"; "Choose a Reminder Action" = "Wybierz sposób przypomnienia"; "Show an Alert" = "Pokaż ostrzeżenie"; "Send an E-mail" = "WyÅ›lij e-mail"; "Email Organizer" = "E-mail do organizatora"; "Email Attendees" = "E-mail do uczestników"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Pokaż czas jako wolny"; /* email notifications */ "Send Appointment Notifications" = "WyÅ›lij powiadomienia o spotkaniu"; /* validation errors */ validate_notitle = "Nie podano tytuÅ‚u, kontynuować?"; validate_invalid_startdate = "Niepoprawna wartość w polu daty poczÄ…tkowej!"; validate_invalid_enddate = "Niepoprawna wartość w polu daty koÅ„cowej!"; validate_endbeforestart = "Podana data koÅ„ca jest wczeÅ›niejsza niż data poczÄ…tku."; "Events" = "Wydarzenia"; "Tasks" = "Zadania"; "Show completed tasks" = "Pokaż ukoÅ„czone zadania"; /* tabs */ "Task" = "Zadanie"; "Event" = "Wydarzenie"; "Recurrence" = "Powtórzenia"; /* toolbar */ "New Event" = "Nowe wydarzenie"; "New Task" = "Nowe zadanie"; "Edit" = "Edytuj"; "Delete" = "UsuÅ„"; "Go to Today" = "Idź do dzisiaj"; "Day View" = "Widok dnia"; "Week View" = "Widok tygodnia"; "Month View" = "Widok miesiÄ…ca"; "Reload" = "PrzeÅ‚aduj"; "eventPartStatModificationError" = "Twój status uczestnictwa nie mógÅ‚ być zmodyfikowany."; /* menu */ "New Event..." = "Nowe wydarzenie"; "New Task..." = "Nowe zadanie"; "Edit Selected Event..." = "Edytuj zaznaczone wydarzenie"; "Delete Selected Event" = "UsuÅ„ zaznaczone wydarzenie"; "Select All" = "Zaznacz wszystkie"; "Workweek days only" = "Tylko dni powszednie"; "Tasks in View" = "Zadania w widoku"; "eventDeleteConfirmation" = "UsuniÄ™cie tego wydarzenia bÄ™dzie trwaÅ‚e.\nCzy chcesz kontynuować?"; "taskDeleteConfirmation" = "UsuniÄ™cie tego zadania bÄ™dzie trwaÅ‚e.\nCzy chcesz kontynuować?"; "You cannot remove nor unsubscribe from your personal calendar." = "Nie możesz usunąć ani zrezygnować z subskrypcji kalendarza osobistego."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Czy na pewno chcesz usunąć kalendarz \"%{0}\"?"; /* Legend */ "Participant" = "Uczestnik"; "Optional Participant" = "Uczestnik opcjonalny"; "Non Participant" = "Nie uczestniczy"; "Chair" = "ProwadzÄ…cy"; "Needs action" = "Wymaga akcji"; "Accepted" = "Zaakceptowane"; "Declined" = "Odmówione"; "Tentative" = "Niepewne"; "Free" = "Wolny"; "Busy" = "ZajÄ™ty"; "Maybe busy" = "Być może zajÄ™ty"; "No free-busy information" = "Brak informacji wolny-zajÄ™ty"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Proponuj przedziaÅ‚ czasowy:"; "Zoom:" = "PowiÄ™kszenie:"; "Previous slot" = "Poprzedni przedziaÅ‚"; "Next slot" = "NastÄ™pny przedziaÅ‚"; "Previous hour" = "Poprzednia godzina"; "Next hour" = "NastÄ™na godzina"; "Work days only" = "Tylko dni robocze"; "The whole day" = "CaÅ‚y dzieÅ„"; "Between" = "PomiÄ™dzy"; "and" = "i"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Istnieje konflikt czasowy z jednym lub wiÄ™kszÄ… liczbÄ… uczestników.\nCzy chcesz zachować obecne ustawienia mimo wszystko?"; /* apt list */ "Title" = "TytuÅ‚"; "Start" = "PoczÄ…tek"; "End" = "Koniec"; "Due Date" = "Termin"; "Location" = "Miejsce"; "(Private Event)" = "(Wydarzenie prywatne)"; vevent_class0 = "(Wydarzenie publiczne)"; vevent_class1 = "(Wydarzenie prywatne)"; vevent_class2 = "(Wydarzenie poufne)"; "Priority" = "Priorytet"; "Category" = "Kategoria"; vtodo_class0 = "(Zadanie publiczne)"; vtodo_class1 = "(Zadanie prywatne)"; vtodo_class2 = "(Zadanie poufne)"; "closeThisWindowMessage" = "DziÄ™kujÄ™! Możesz teraz zamknąć to okno lub wyÅ›wietlić twoje "; "Multicolumn Day View" = "Wielokolumnowy widok dnia"; "Please select an event or a task." = "Zaznacz wydarzenie lub zadanie."; "editRepeatingItem" = "Element który edytujesz ma powtórzenia. Czy chcesz edytować wszystkie czy tylko pojedyncze wystÄ…pienie?"; "button_thisOccurrenceOnly" = "Tylko to wystÄ…pienie"; "button_allOccurrences" = "Wszystkie wystÄ…pienia"; /* Properties dialog */ "Name:" = "Nazwa:"; "Color:" = "Kolor:"; "Include in free-busy" = "UwzglÄ™dnij w wolny-zajÄ™ty"; "Synchronization" = "Synchronizacja"; "Synchronize" = "Synchronizuj"; "Tag:" = "Znacznik:"; "Display" = "Pokaż"; "Show alarms" = "Pokaż alarmy"; "Show tasks" = "Pokaż zadania"; "Notifications" = "Powiadomienia"; "Receive a mail when I modify my calendar" = "PrzyÅ›lij e-mail, gdy zmieniam swój kalendarz"; "Receive a mail when someone else modifies my calendar" = "PrzyÅ›lij e-mail, gdy ktoÅ› zmienia mój kalendarz"; "When I modify my calendar, send a mail to:" = "Gdy zmieniam swój kalendarz, wyÅ›lij e-mail do:"; "Links to this Calendar" = "OdnoÅ›niki do tego kalendarza"; "Authenticated User Access" = "DostÄ™p dla zalogowanych użytkowników"; "CalDAV URL" = "CalDAV URL"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "W polu Dni wprowadź liczbÄ™ równÄ… lub wiÄ™kszÄ… od 1."; "weekFieldInvalid" = "W polu Tygodnie wprowadź liczbÄ™ równÄ… lub wiÄ™kszÄ… od 1."; "monthFieldInvalid" = "W polu MiesiÄ…ce wprowadź liczbÄ™ równÄ… lub wiÄ™kszÄ… od 1."; "monthDayFieldInvalid" = "W polu DzieÅ„ miesiÄ…ca wprowadź liczbÄ™ równÄ… lub wiÄ™kszÄ… od 1."; "yearFieldInvalid" = "W polu Lata wprowadź liczbÄ™ równÄ… lub wiÄ™kszÄ… od 1."; "appointmentFieldInvalid" = "W polu Spotkania wprowadź liczbÄ™ równÄ… lub wiÄ™kszÄ… od 1."; "recurrenceUnsupported" = "Ten typ powtórzeÅ„ obecnie nie jest obsÅ‚ugiwany."; "Please specify a calendar name." = "ProszÄ™ podać nazwÄ™ kalendarza."; "tagNotDefined" = "Musisz podać znacznik, jeÅ›li chcesz synchronizować ten kalendarz."; "tagAlreadyExists" = "Podany znacznik jest już skojarzony z innym kalendarzem."; "tagHasChanged" = "JeÅ›li zmienisz znacznik kalendarza, musisz przeÅ‚adować dane na swoim urzÄ…dzeniu mobilnym.\nKontynuować?"; "tagWasAdded" = "JeÅ›li chesz synchronizować ten kalendarz, bÄ™dziesz musiaÅ‚(a) przeÅ‚adować dane na swoim urzÄ…dzeniu mobilnym.\nKontynuować?"; "tagWasRemoved" = "JeÅ›li usuniesz ten kalendarz z synchronizacji, bÄ™dziesz musiaÅ‚(a) przeÅ‚adować dane na swoim urzÄ…dzeniu mobilnym.\nKontynuować?"; "DestinationCalendarError" = "Chcesz kopiować do tego samego kalendarza. Musisz wybrać inny kalendarz."; "EventCopyError" = "Kopiowanie nie udaÅ‚o siÄ™. Wybierz inny kalendarz."; "Open Task..." = "Otwórz zadanie"; "Mark Completed" = "Oznacz jako ukoÅ„czone"; "Delete Task" = "UsuÅ„ zadanie"; "Delete Event" = "UsuÅ„ wydarzenie"; "Copy event to my calendar" = "Kopiuj wydarzenie do mojego kalendarza"; "View Raw Source" = "Obejrzyj źródÅ‚o"; "Subscribe to a web calendar..." = "Subskrybuj sieciowy kalendarz"; "URL of the Calendar" = "URL do kalendarza"; "Web Calendar" = "Kalendarz sieciowy"; "Reload on login" = "PrzeÅ‚aduj przy logowaniu"; "Invalid number." = "Błędna liczba."; "Please identify yourself to %{0}" = "Zaloguj siÄ™ w %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxCalWeekView.h0000644000000000000000000000263512247657030016376 0ustar rootroot/* UIxCalWeekView.h - this file is part of SOGo * * Copyright (C) 2006 Inverse inc. * * 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 __SOGo_UIxCalWeekView_H__ #define __SOGo_UIxCalWeekView_H__ #include "UIxCalView.h" @class NSDictionary; @interface UIxCalWeekView : UIxCalView - (NSDictionary *) weekBeforePrevWeekQueryParameters; - (NSDictionary *) prevWeekQueryParameters; - (NSDictionary *) nextWeekQueryParameters; - (NSDictionary *) weekAfterNextWeekQueryParameters; - (NSString *) weekBeforeLastWeekName; - (NSString *) lastWeekName; - (NSString *) currentWeekName; - (NSString *) nextWeekName; - (NSString *) weekAfterNextWeekName; @end #endif /* __SOGo_UIxCalWeekView_H__ */ SOGo-2.1.1b/UI/Scheduler/UIxReminderEditor.h0000644000000000000000000000235212247657030017140 0ustar rootroot/* UIxReminderEditor.h - this file is part of SOGo * * Copyright (C) 2009 Inverse inc. * * Author: Francis Lachapelle * * 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 UIXREMINDEREDITOR_H #define UIXREMINDEREDITOR_H #import @interface UIxReminderEditor : UIxComponent { NSString *item, *repeat; NSCalendarDate *aptStartDate; } - (NSArray *) unitsList; - (NSArray *) referencesList; - (NSArray *) relationsList; - (void) setItem: (NSString *) theItem; - (NSString *) item; @end #endif /* UIXREMINDEREDITOR_H */ SOGo-2.1.1b/UI/Scheduler/NSArray+Scheduler.h0000644000000000000000000000653012247657030017031 0ustar rootroot/* NSArray+Scheduler.m - this file is part of SOGo * * Copyright (C) 2007-2010 Inverse inc. * * 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 NSARRAY_SCHEDULER_H #define NSARRAY_SCHEDULER_H #import // See [UIxCalListingActions initialize] #define eventNameIndex 0 #define eventFolderIndex 1 #define eventCalendarNameIndex 2 #define eventStatusIndex 3 #define eventTitleIndex 4 #define eventStartDateIndex 5 #define eventEndDateIndex 6 #define eventLocationIndex 7 #define eventIsAllDayIndex 8 #define eventClassificationIndex 9 #define eventCategoryIndex 10 #define eventPartMailsIndex 11 #define eventPartStatesIndex 12 #define eventOwnerIndex 13 #define eventIsCycleIndex 14 #define eventNextAlarmIndex 15 #define eventRecurrenceIdIndex 16 #define eventIsExceptionIndex 17 #define eventEditableIndex 18 #define eventErasableIndex 19 #define eventOwnerIsOrganizerIndex 20 // See [UIxCalListingActions initialize] #define taskNameIndex 0 #define taskFolderIndex 1 #define taskCalendarNameIndex 2 #define taskStatusIndex 3 #define taskTitleIndex 4 #define taskEndDateIndex 5 #define taskClassificationIndex 6 #define taskLocationIndex 7 #define taskCategoryIndex 8 #define taskEditableIndex 9 #define taskErasableIndex 10 #define taskPriorityIndex 11 @interface NSArray (SOGoEventComparison) - (NSComparisonResult) compareEventsStartDateAscending: (NSArray *) otherEvent; - (NSComparisonResult) compareEventsEndDateAscending: (NSArray *) otherEvent; - (NSComparisonResult) compareEventsTitleAscending: (NSArray *) otherEvent; - (NSComparisonResult) compareEventsLocationAscending: (NSArray *) otherEvent; - (NSComparisonResult) compareEventsCalendarNameAscending: (NSArray *) otherEvent; - (NSComparisonResult) compareTasksAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksPriorityAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksTitleAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksEndAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksLocationAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksCategoryAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksCalendarNameAscending: (NSArray *) otherTask; - (NSArray *) reversedArray; @end @interface NSMutableArray (SOGoEventComparison) - (void) reverseArray; @end #endif /* NSARRAY_SCHEDULER_H */ SOGo-2.1.1b/UI/Scheduler/UIxCalMonthOverview.m0000644000000000000000000000375312247657030017473 0ustar rootroot #import #import #import #import "UIxCalMonthOverview.h" @implementation UIxCalMonthOverview - (void)dealloc { [currentWeekStart release]; [super dealloc]; } - (void)configureFormatters { [super configureFormatters]; [aptFormatter setShortTitleOnly]; [privateAptFormatter setPrivateTitleOnly]; } - (void)setDayIndex:(int)_idx { dayIndex = _idx; } - (int)dayIndex { return dayIndex; } - (void)setDayOfWeek:(int)_day { dayOfWeek = _day; } - (int)dayOfWeek { return dayOfWeek; } - (void)setCurrentWeekStartDate:(NSCalendarDate *)_date { ASSIGN(currentWeekStart, _date); } - (NSCalendarDate *)currentWeekStartDate { return currentWeekStart; } - (void)setWeekOfYear:(int)_week { NSCalendarDate *date; weekOfYear = _week; if(_week == 52 || _week == 53) date = [[self startOfMonth] mondayOfWeek]; else date = [self startOfMonth]; date = [date mondayOfWeek:_week]; [self setCurrentWeekStartDate:date]; } - (int)weekOfYear { return weekOfYear; } - (int)year { return [[self startOfMonth] yearOfCommonEra]; } - (int)month { return [[self startOfMonth] monthOfYear]; } - (NSString *)localizedDayOfWeekName { return [self localizedNameForDayOfWeek:dayOfWeek]; } - (NSDictionary *)currentWeekQueryParameters { return [self queryParametersBySettingSelectedDate:currentWeekStart]; } /* style sheet */ - (NSString *)weekStyle { if([currentWeekStart isDateInSameWeek:[NSCalendarDate date]]) return @"monthoverview_week_hilite"; return @"monthoverview_week"; } - (NSString *)contentStyle { if([currentDay isToday]) return @"monthoverview_content_hilite"; else if([currentDay monthOfYear] != [[self startOfMonth] monthOfYear]) return @"monthoverview_content_dimmed"; return @"monthoverview_content"; } /* appointments */ // - (NSArray *)appointments { // return [self fetchCoreAppointmentsInfos]; // } @end /* UIxCalMonthOverview */ SOGo-2.1.1b/UI/Scheduler/Hungarian.lproj/0000755000000000000000000000000012247657030016464 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Hungarian.lproj/Localizable.strings0000644000000000000000000004276012247657030022331 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Új esemény hozzáadása"; "Create a new task" = "Új feladat hozzáadása"; "Edit this event or task" = "Esemény vagy feladat szerkesztése"; "Delete this event or task" = "Esemény vagy feladat törlése"; "Go to today" = "Ugrás a mai napra"; "Switch to day view" = "Napi nézetre váltás"; "Switch to week view" = "Heti nézetre váltás"; "Switch to month view" = "Havi nézetre váltás"; "Reload all calendars" = "Az összes naptár frissítése"; /* Tabs */ "Date" = "Dátum"; "Calendars" = "Naptárak"; /* Day */ "DayOfTheMonth" = "A hónap napja"; "dayLabelFormat" = "%Y.%m.%d"; "today" = "Ma"; "Previous Day" = "ElÅ‘zÅ‘ nap"; "Next Day" = "KövetkezÅ‘ nap"; /* Week */ "Week" = "Hét"; "this week" = "aktuális hét"; "Week %d" = "%d. hét"; "Previous Week" = "ElÅ‘zÅ‘ hét"; "Next Week" = "KövetkezÅ‘ hét"; /* Month */ "this month" = "aktuális hónap"; "Previous Month" = "ElÅ‘zÅ‘ hónap"; "Next Month" = "KövetkezÅ‘ hónap"; /* Year */ "this year" = "aktuális év"; /* Menu */ "Calendar" = "Naptár"; "Contacts" = "Kapcsolatok"; "New Calendar..." = "Új naptár..."; "Delete Calendar" = "Naptár törlése"; "Unsubscribe Calendar" = "Leíratkozás a naptárról "; "Sharing..." = "Megosztás..."; "Export Calendar..." = "Naptár exportálása..."; "Import Events..." = "Események importálása..."; "Import Events" = "Események importálása"; "Select an iCalendar file (.ics)." = "Válasszon egy iCalendar fájlt (.ics)."; "Upload" = "Feltöltés"; "Uploading" = "Feltöltés"; "Publish Calendar..." = "Naptár közzététele..."; "Reload Remote Calendars" = "Távoli naptárak frissítése"; "Properties" = "Tulajdonságok"; "Done" = "Kész"; "An error occurred while importing calendar." = "Hiba történt a naptár importálásakor."; "No event was imported." = "Nem volt importált esemény."; "A total of %{0} events were imported in the calendar." = "Összesen %{0} esemény lett importálva a naptárba."; "Compose E-Mail to All Attendees" = "Üzenet küldése az összes résztvevÅ‘nek"; "Compose E-Mail to Undecided Attendees" = "Üzenet küldése az bizonytalan résztvevÅ‘nek"; /* Folders */ "Personal calendar" = "Személyes naptár"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Tiltott"; /* acls */ "Access rights to" = "Hozzáférés az alábbiaknak:"; "For user" = "Felhasználónak"; "Any Authenticated User" = "Bejelentkezett felhasználók"; "Public Access" = "Mindenki (publikus hozzáférés)"; "label_Public" = "Nyilvános"; "label_Private" = "Magán"; "label_Confidential" = "Bizalmas"; "label_Viewer" = "Összes információ megtekintése"; "label_DAndTViewer" = "Dátum és idÅ‘ megtekintése"; "label_Modifier" = "Módosítás"; "label_Responder" = "Megválaszolás"; "label_None" = "Semmi"; "View All" = "Összes adat megtekintése"; "View the Date & Time" = "Dátum és idÅ‘ megtekintése"; "Modify" = "Módosítás"; "Respond To" = "Megválaszolás"; "None" = "Semmi"; "This person can create objects in my calendar." = "Ez a személy új naptárbejegyzéseket hozhat létre."; "This person can erase objects from my calendar." = "Ez a személy naptárbejegyzéseket törölhet."; /* Button Titles */ "Subscribe to a Calendar..." = "Feliratkozás naptárra..."; "Remove the selected Calendar" = "Kijelölt naptár törlése"; "Name of the Calendar" = "A naptár neve:"; "new" = "Új"; "printview" = "Nyomtatási nézet"; "edit" = "Szerkesztés"; "delete" = "Törlés"; "proposal" = "Javaslat"; "Save and Close" = "Mentés és bezárás"; "Close" = "Bezárás"; "Invite Attendees" = "RésztvevÅ‘k meghívása"; "Attach" = "Csatolás"; "Update" = "Mentés"; "Cancel" = "Mégsem"; "show_rejected_apts" = "Visszautasított találkozók mutatása"; "hide_rejected_apts" = "Visszautasított találkozók elrejtése"; /* Schedule */ "Schedule" = "Ütemezés"; "No appointments found" = "Nincs találkozó"; "Meetings proposed by you" = "Ön által javasolt találkozók"; "Meetings proposed to you" = "Önnek javasolt találkozók"; "sched_startDateFormat" = "%m.%d %H:%M"; "action" = "Válasz"; "accept" = "Elfogadás"; "decline" = "Visszautasítás"; "more attendees" = "További résztvevÅ‘k"; "Hide already accepted and rejected appointments" = "Már elfogadott, valamint visszautasított találkozók elrejtése."; "Show already accepted and rejected appointments" = "Már elfogadott, valamint visszautasított találkozók megmutatása"; /* Appointments */ "Appointment viewer" = "Találkozó betekintÅ‘"; "Appointment editor" = "Találkozó szerkesztÅ‘"; "Appointment proposal" = "Találkozó ajánló"; "Appointment on" = "Találkozó ekkor"; "Start:" = "Kezdete:"; "End:" = "Vége:"; "Due Date:" = "Lejárat:"; "Title:" = "Cím:"; "Calendar:" = "Naptár:"; "Name" = "Név"; "Email" = "Email"; "Status:" = "Ãllapot"; "% complete" = "% kész"; "Location:" = "Hely:"; "Priority:" = "Prioritás:"; "Privacy" = "Adatvédelem"; "Cycle" = "IsmétlÅ‘dés"; "Cycle End" = "IsmétlÅ‘dés vége"; "Categories" = "Kategória"; "Classification" = "Besorolás"; "Duration" = "IdÅ‘tartam"; "Attendees:" = "RésztvevÅ‘k:"; "Resources" = "ErÅ‘források"; "Organizer:" = "SzervezÅ‘:"; "Description:" = "Leírás:"; "Document:" = "Dokumentum:"; "Category:" = "Kategória:"; "Repeat:" = "Ismétlés:"; "Reminder:" = "EmlékeztetÅ‘:"; "General:" = "Ãltalános:"; "Reply:" = "Válasz:"; "Created by:" = "Létrehozta:"; "Target:" = "Cél:"; "attributes" = "tulajdonságok"; "attendees" = "résztvevÅ‘k"; "delegated from" = "Jogok átruházója:"; /* checkbox title */ "is private" = "magán"; /* classification */ "Public" = "nyilvános"; "Private" = "magán"; /* text used in overviews and tooltips */ "empty title" = "Üres cím"; "private appointment" = "Magántalálkozó"; "Change..." = "Módosít..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Foglalkozni kell vele"; "partStat_ACCEPTED" = "Részt veszek"; "partStat_DECLINED" = "Nem veszek rész"; "partStat_TENTATIVE" = "KésÅ‘bb döntök"; "partStat_DELEGATED" = "Ãtadott"; "partStat_OTHER" = "Egyéb"; /* Appointments (error messages) */ "Conflicts found!" = "Ütközés van!"; "Invalid iCal data!" = "Érvénytelen iCal adat!"; "Could not create iCal data!" = "Nem lehet iCal adatot létrehozni!"; /* Searching */ "view_all" = "Összes"; "view_today" = "Mai"; "view_next7" = "KövetkezÅ‘ 7 nap"; "view_next14" = "KövetkezÅ‘ 14 nap"; "view_next31" = "KövetkezÅ‘ 31 nap"; "view_thismonth" = "Aktuális hónap"; "view_future" = "Összes jövÅ‘beni esemény"; "view_selectedday" = "Kijelölt nap"; "View:" = "Nézet:"; "Title or Description" = "Cím vagy leírás"; "Search" = "Keresés"; "Search attendees" = "RésztvevÅ‘k keresése"; "Search resources" = "ErÅ‘források keresése"; "Search appointments" = "Találkozók keresése"; "All day Event" = "Egésznapos esemény"; "check for conflicts" = "Ütközés ellenÅ‘rzése"; "Browse URL" = "URL tallózása"; "newAttendee" = "RésztvevÅ‘ hozzáadása"; /* calendar modes */ "Overview" = "Ãttekintés"; "Chart" = "Diagram"; "List" = "Lista"; "Columns" = "Oszlopok"; /* Priorities */ "prio_0" = "Nincs megadva"; "prio_1" = "Magas"; "prio_2" = "Magas"; "prio_3" = "Magas"; "prio_4" = "Magas"; "prio_5" = "Normál"; "prio_6" = "Alacsony"; "prio_7" = "Alacsony"; "prio_8" = "Alacsony"; "prio_9" = "Alacsony"; /* access classes (privacy) */ "PUBLIC_vevent" = "Nyilvános esemény"; "CONFIDENTIAL_vevent" = "Bizalmas esemény"; "PRIVATE_vevent" = "Magán esemény"; "PUBLIC_vtodo" = "Nyilvános feladat"; "CONFIDENTIAL_vtodo" = "Bizalmas feladat"; "PRIVATE_vtodo" = "Magán feladat"; /* status type */ "status_" = "Nincs megadva"; "status_NOT-SPECIFIED" = "Nincs megadva"; "status_TENTATIVE" = "Bizonytalan"; "status_CONFIRMED" = "MegerÅ‘sített"; "status_CANCELLED" = "Törölt"; "status_NEEDS-ACTION" = "Foglalkozni kell vele"; "status_IN-PROCESS" = "Folyamatban"; "status_COMPLETED" = "Kész van "; /* Cycles */ "cycle_once" = "egyszer"; "cycle_daily" = "naponta"; "cycle_weekly" = "hetente"; "cycle_2weeks" = "kéthetente"; "cycle_4weeks" = "négyhetente"; "cycle_monthly" = "havonta"; "cycle_weekday" = "minden hétköznap"; "cycle_yearly" = "évente"; "cycle_end_never" = "nincs befejezés"; "cycle_end_until" = "eddig a napig"; "Recurrence pattern" = "IsmétlÅ‘dés ciklusa"; "Range of recurrence" = "IsmétlÅ‘dés tartománya"; "Repeat" = "IsmétlÅ‘dik"; "Daily" = "Naponta"; "Weekly" = "Hetente"; "Monthly" = "Havonta"; "Yearly" = "Évente"; "Every" = "Minden"; "Days" = "naponként"; "Week(s)" = "hetenként"; "On" = "Be"; "Month(s)" = "hónaponként"; "The" = "A"; "Recur on day(s)" = "Az alábbi napon"; "Year(s)" = "Év"; "cycle_of" = "ciklus"; "No end date" = "Nincs befejezés"; "Create" = "Létrehozás"; "appointment(s)" = "találkozó(k)"; "Repeat until" = "IsmétlÅ‘dés eddig"; "First" = "ElsÅ‘"; "Second" = "Második"; "Third" = "Harmadik"; "Fourth" = "Negyedik"; "Fift" = "Ötödik"; "Last" = "Utolsó"; /* Appointment categories */ "category_none" = "Nincs"; "category_labels" = "Évforduló,Születésnap,Üzleti,Meghívás,Ügyfelek,Versenytársak,VevÅ‘,Kedvencek,Nyomonkövetés,Ajándékozás,Szabadság,Ötletek,Megbeszélés,Ügyek,Egyéb,Személyes,Projektek,Ãllami ünnep,Ãllapot,Szállítók,Utazás,SzünidÅ‘"; "repeat_NEVER" = "Nem ismétlÅ‘dik"; "repeat_DAILY" = "Naponta"; "repeat_WEEKLY" = "Hetente"; "repeat_BI-WEEKLY" = "Kéthetente"; "repeat_EVERY WEEKDAY" = "Minden hétköznap"; "repeat_MONTHLY" = "Havonta"; "repeat_YEARLY" = "Évente"; "repeat_CUSTOM" = "Egyéni..."; "reminder_NONE" = "Nincs emlékeztetÅ‘"; "reminder_5_MINUTES_BEFORE" = "5 perccel elÅ‘tte"; "reminder_10_MINUTES_BEFORE" = "10 perccel elÅ‘tte"; "reminder_15_MINUTES_BEFORE" = "15 perccel elÅ‘tte"; "reminder_30_MINUTES_BEFORE" = "30 perccel elÅ‘tte"; "reminder_45_MINUTES_BEFORE" = "45 perccel elÅ‘tte"; "reminder_1_HOUR_BEFORE" = "1 órával elÅ‘tte"; "reminder_2_HOURS_BEFORE" = "2 órával elÅ‘tte"; "reminder_5_HOURS_BEFORE" = "5 órával elÅ‘tte"; "reminder_15_HOURS_BEFORE" = "15 órával elÅ‘tte"; "reminder_1_DAY_BEFORE" = "1 nappal elÅ‘tte"; "reminder_2_DAYS_BEFORE" = "2 nappal elÅ‘tte"; "reminder_1_WEEK_BEFORE" = "1 héttel elÅ‘tte"; "reminder_CUSTOM" = "Egyéni..."; "reminder_MINUTES" = "perccel"; "reminder_HOURS" = "órával"; "reminder_DAYS" = "nappal"; "reminder_BEFORE" = "elÅ‘tte"; "reminder_AFTER" = "utána"; "reminder_START" = "az esemény kezdÅ‘dik"; "reminder_END" = "az esemény végzÅ‘dik"; "Reminder Details" = "EmlékeztetÅ‘ részletei"; "Choose a Reminder Action" = "Válasszon egy emlékeztetÅ‘ műveletet"; "Show an Alert" = "Riasztás"; "Send an E-mail" = "Email küldése"; "Email Organizer" = "Email szervezÅ‘"; "Email Attendees" = "Email résztvevÅ‘"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Ne jelezzen foglaltságot"; /* email notifications */ "Send Appointment Notifications" = "Találkozó értesítések küldése"; /* validation errors */ validate_notitle = "A cím nincs megadva, folytatja?"; validate_invalid_startdate = "Événytelen kezdÅ‘dátum!"; validate_invalid_enddate = "Érvénytelen befejezÅ‘ dátum!"; validate_endbeforestart = "A megadott befejezÅ‘ dátum korábbi, mint a kezdÅ‘dátum."; "Events" = "Események"; "Tasks" = "Feladatok"; "Show completed tasks" = "Befejezett feladatok megjelenítése"; /* tabs */ "Task" = "Feladat"; "Event" = "Esemény"; "Recurrence" = "IsmétlÅ‘dés"; /* toolbar */ "New Event" = "Új esemény"; "New Task" = "Új feladat"; "Edit" = "Szerkesztés"; "Delete" = "Törlés"; "Go to Today" = "Mai nap"; "Day View" = "Napi nézet"; "Week View" = "Heti nézet"; "Month View" = "Havi nézet"; "Reload" = "Frissítés"; "eventPartStatModificationError" = "A résztvevÅ‘i állapota nem módosítható."; /* menu */ "New Event..." = "Új esemény..."; "New Task..." = "Új feladat..."; "Edit Selected Event..." = "Kijelölt esemény szerkesztése..."; "Delete Selected Event" = "Kijelölt esemény törlése"; "Select All" = "Összes kijelölése"; "Workweek days only" = "Csak hétköznapok"; "Tasks in View" = "Feladatok megjelenítése"; "eventDeleteConfirmation" = "Az alábbi esemény(eke)t törli: \n%{0}\nFolytatja?"; "taskDeleteConfirmation" = "A feladat törlése végleges.\nFolytatja?"; "You cannot remove nor unsubscribe from your personal calendar." = "Nem törölhet, valamint nem iratkozhat le egy személyes naptárról."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Biztosan törli ezt a naptárat: \"%{0}\"?"; /* Legend */ "Participant" = "KötelezÅ‘ résztvevÅ‘"; "Optional Participant" = "Nem kötelezÅ‘ résztvevÅ‘"; "Non Participant" = "Nem résztvevÅ‘"; "Chair" = "Szék"; "Needs action" = "Foglalkozni kell vele"; "Accepted" = "Elfogadott"; "Declined" = "Visszautasított"; "Tentative" = "Bizonytalan"; "Free" = "Szabad"; "Busy" = "Foglalt"; "Maybe busy" = "Bizonytalan"; "No free-busy information" = "Nincs foglaltsági információ"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Javasolt idÅ‘ablak:"; "Zoom:" = "Nagyítás:"; "Previous slot" = "ElÅ‘zÅ‘ ablak"; "Next slot" = "KövetkezÅ‘ ablak"; "Previous hour" = "ElÅ‘zÅ‘ óra"; "Next hour" = "KövetkezÅ‘ óra"; "Work days only" = "Csak munkanapok"; "The whole day" = "Az egész nap"; "Between" = "Között"; "and" = "and"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Egy vagy több résztvevÅ‘ között időütközés van.\nMegtartja ennek ellenére a beállításokat?"; /* apt list */ "Title" = "Cím"; "Start" = "Kezdés"; "End" = "Befejezés"; "Due Date" = "Lejárat"; "Location" = "Hely"; "(Private Event)" = "(Magán esemény)"; vevent_class0 = "(Nyilvános esemény)"; vevent_class1 = "(Magán esemény)"; vevent_class2 = "(Bizalmas esemény)"; "Priority" = "Fontosság"; "Category" = "Kategória"; vtodo_class0 = "(Nyilvános feladat)"; vtodo_class1 = "(Magán feladat)"; vtodo_class2 = "(Bizalmas feladat)"; "closeThisWindowMessage" = "Köszönjük! Most már bezárhatja az ablakot vagy megtekintheti a "; "Multicolumn Day View" = "Többoszlopos napi nézet"; "Please select an event or a task." = "Kérem válasszon egy eseményt vagy feladatot."; "editRepeatingItem" = "Ön egy ismétlÅ‘dÅ‘ eseményt jelölt ki. Az összes elÅ‘fordulását szerkeszti, vagy csak ezt az idÅ‘pontot?"; "button_thisOccurrenceOnly" = "Csak ezt az egy idÅ‘pontot"; "button_allOccurrences" = "Az összes elÅ‘fordulást"; /* Properties dialog */ "Name:" = "Név:"; "Color:" = "Szín:"; "Include in free-busy" = "Foglaltság mutatása"; "Synchronization" = "Szinkronizáció"; "Synchronize" = "Szinkronizálás"; "Tag:" = "Cimke:"; "Display" = "Kijelez"; "Show alarms" = "Riasztások megjelenítése"; "Show tasks" = "Feladatok megjelenítése"; "Notifications" = "Értesítések"; "Receive a mail when I modify my calendar" = "Kapjak email értesítést, amikor módosítok a naptáramon"; "Receive a mail when someone else modifies my calendar" = "Kapjak email értesítést, amikor mások módosítják a naptáramat"; "When I modify my calendar, send a mail to:" = "Email értesítés küldése az alábbi címre a naptáram módosításakor"; "Links to this Calendar" = "Hivatkozások ehhez a naptárhoz"; "Authenticated User Access" = "Belépett felhasználók"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Kérem adjon meg egy számértéket a Napok mezÅ‘ben, amely egyenlÅ‘ vagy nagyobb, mint 1."; "weekFieldInvalid" = "Kérem adjon meg egy számértéket a Hét mezÅ‘ben, amely egyenlÅ‘ vagy nagyobb, mint 1."; "monthFieldInvalid" = "Kérem adjon meg egy számértéket a Hónap mezÅ‘ben, amely egyenlÅ‘ vagy nagyobb, mint 1."; "monthDayFieldInvalid" = "Kérem adjon meg egy számértéket a Hónap napja mezÅ‘ben, amely egyenlÅ‘ vagy nagyobb, mint 1."; "yearFieldInvalid" = "Kérem adjon meg egy számértéket az Év mezÅ‘ben, amely egyenlÅ‘ vagy nagyobb, mint 1."; "appointmentFieldInvalid" = "Kérem adjon meg egy számértéket a Találkozó mezÅ‘ben, amely egyenlÅ‘ vagy nagyobb, mint 1."; "recurrenceUnsupported" = "Ez a típusú ismétlÅ‘dés jelenleg nem támogatott."; "Please specify a calendar name." = "Kérem adjon meg egy nevet a naptárnak."; "tagNotDefined" = "Meg kell adnia egy címkét, amennyiben szinkronizálni akarja a naptárat."; "tagAlreadyExists" = "A megadott címke már egy másik naptárhoz lett hozzárendeve."; "tagHasChanged" = "A naptár címkéjének megváltoztatása után frissíteni kell az adatokat a mobil készülékén.\nFolytatja?"; "tagWasAdded" = "A naptár szinkronizálásához frissíteni kell az adatokat a mobil készülékén."; "tagWasRemoved" = "Amennyiben nem szinkronizálja a továbbiakban a naptárat, frissíteni kell az adatokat a mobil készülékén."; "DestinationCalendarError" = "A forrás- és cél naptár ugyanaz. Kérem válasszon egy másik naptárat."; "EventCopyError" = "Hiba történt a másoláskor. Kérem válasszon egy másik naptárat."; "Open Task..." = "Feladat megnyitása..."; "Mark Completed" = "A jelölés befejezÅ‘dött."; "Delete Task" = "Feladat törlése"; "Delete Event" = "Esemény törlése"; "Copy event to my calendar" = "Esemény másolása a naptáromba"; "View Raw Source" = "Forrás megtekintése"; "Subscribe to a web calendar..." = "Internetes naptár becsatolása"; "URL of the Calendar" = "A naptár URL címe"; "Web Calendar" = "Internetes naptár"; "Reload on login" = "Frissítés bejelentkezéskor"; "Invalid number." = "Érvénytelen szám"; "Please identify yourself to %{0}" = "A %{0} kérésére adja meg azonosító adatait"; SOGo-2.1.1b/UI/Scheduler/UIxCalMulticolumnDayView.m0000644000000000000000000001630012247657030020450 0ustar rootroot/* UIxCalMulticolumnDayView.h - this file is part of SOGo * * Copyright (C) 2006 Inverse inc. * * 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 #import #import #import #import #import #import #import "UIxCalMulticolumnDayView.h" @implementation UIxCalMulticolumnDayView : UIxCalDayView - (id) init { if ((self = [super init])) { // allAppointments = nil; subscriptionUsers = nil; hoursToDisplay = nil; currentTableUser = nil; currentTableHour = nil; // dateFormatter = [[SOGoDateFormatter alloc] // initWithLocale: [self locale]]; } return self; } - (void) dealloc { // [allAppointments release]; [subscriptionUsers release]; [hoursToDisplay release]; // [dateFormatter release]; [super dealloc]; } - (void) setCSSClass: (NSString *) aCssClass { cssClass = aCssClass; } - (NSString *) cssClass { return cssClass; } - (void) setCSSId: (NSString *) aCssId { cssId = aCssId; } - (NSString *) cssId { return cssId; } - (NSArray *) hoursToDisplay { unsigned int currentHour, lastHour; if (!hoursToDisplay) { currentHour = [self dayStartHour]; lastHour = [self dayEndHour]; hoursToDisplay = [NSMutableArray new]; while (currentHour < lastHour) { [hoursToDisplay addObject: [NSString stringWithFormat: @"%d", currentHour]]; currentHour++; } [hoursToDisplay addObject: [NSString stringWithFormat: @"%d", currentHour]]; } return hoursToDisplay; } - (NSArray *) subscriptionUsers { SOGoUser *activeUser; NSString *userList, *currentUserLogin; NSEnumerator *users; if (!subscriptionUsers) { subscriptionUsers = [NSMutableArray new]; activeUser = [context activeUser]; userList = [[activeUser userDefaults] objectForKey: @"calendaruids"]; users = [[userList componentsSeparatedByString: @","] objectEnumerator]; currentUserLogin = [users nextObject]; while (currentUserLogin) { if (![currentUserLogin hasPrefix: @"-"]) [subscriptionUsers addObject: currentUserLogin]; currentUserLogin = [users nextObject]; } } return subscriptionUsers; } - (void) setCurrentTableUser: (NSString *) aTableUser; { currentTableUser = aTableUser; } - (NSString *) currentTableUser; { return currentTableUser; } - (void) setCurrentTableHour: (NSString *) aTableHour { currentTableHour = aTableHour; } - (NSString *) currentTableHour { return currentTableHour; } - (NSString *) currentAppointmentHour { return [NSString stringWithFormat: @"%.2d00", [currentTableHour intValue]]; } - (NSDictionary *) _adjustedAppointment: (NSDictionary *) anAppointment forStart: (NSCalendarDate *) start andEnd: (NSCalendarDate *) end { NSMutableDictionary *newMutableAppointment; NSDictionary *newAppointment; BOOL startIsEarlier, endIsLater; startIsEarlier = ([[anAppointment objectForKey: @"startDate"] laterDate: start] == start); endIsLater = ([[anAppointment objectForKey: @"endDate"] earlierDate: end] == end); if (startIsEarlier || endIsLater) { newMutableAppointment = [NSMutableDictionary dictionaryWithDictionary: anAppointment]; if (startIsEarlier) [newMutableAppointment setObject: start forKey: @"startDate"]; if (endIsLater) [newMutableAppointment setObject: end forKey: @"endDate"]; newAppointment = newMutableAppointment; } else newAppointment = anAppointment; return newAppointment; } /* fetching */ // - (NSCalendarDate *) startDate // { // return [[self selectedDate] beginOfDay]; // } // - (NSCalendarDate *) endDate // { // return [[self selectedDate] endOfDay]; // } // - (NSArray *) appointmentsForCurrentUser // { // NSMutableArray *filteredAppointments; // NSEnumerator *aptsEnumerator; // NSDictionary *userAppointment; // NSCalendarDate *start, *end; // int endHour; // if (!allAppointments) // { // allAppointments = [self fetchCoreAppointmentsInfos]; // [allAppointments retain]; // } // start = [[self selectedDate] hour: [self dayStartHour] minute: 0]; // endHour = [self dayEndHour]; // if (endHour < 24) // end = [[self selectedDate] hour: [self dayEndHour] minute: 59]; // else // end = [[[self selectedDate] tomorrow] hour: 0 minute: 0]; // filteredAppointments = [NSMutableArray new]; // [filteredAppointments autorelease]; // aptsEnumerator = [allAppointments objectEnumerator]; // userAppointment = [aptsEnumerator nextObject]; // while (userAppointment) // { // if ([[userAppointment objectForKey: @"owner"] // isEqualToString: currentTableUser]) // [filteredAppointments // addObject: [self _adjustedAppointment: userAppointment // forStart: start andEnd: end]]; // userAppointment = [aptsEnumerator nextObject]; // } // return filteredAppointments; // } // - (void) setCurrentAppointment: (NSDictionary *) newCurrentAppointment // { // currentAppointment = newCurrentAppointment; // } // - (NSDictionary *) currentAppointment // { // return currentAppointment; // } // - (NSString *) appointmentsClasses // { // return @"appointments appointmentsFor1Days"; // } - (NSString *) currentUserClasses { NSArray *users; NSString *lastDayUser; users = [self subscriptionUsers]; if (currentTableUser == [users lastObject]) lastDayUser = @" lastDayUser"; else lastDayUser = @""; return [NSString stringWithFormat: @"day appointmentsOf%@%@", currentTableUser, lastDayUser]; } - (NSString *) clickableHourCellClass { return [NSString stringWithFormat: @"clickableHourCell clickableHourCell%@", currentTableHour]; } - (NSNumber *) dayWidthPercentage { NSArray *users; users = [self subscriptionUsers]; return [NSNumber numberWithFloat: (100.0 / [users count])]; } - (NSNumber *) currentTableUserDayLeftPercentage { NSArray *users; users = [self subscriptionUsers]; return [NSNumber numberWithFloat: ([users indexOfObject: currentTableUser] * (100.0 / [users count]))]; } @end SOGo-2.1.1b/UI/Scheduler/English.lproj/0000755000000000000000000000000012247657027016147 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/English.lproj/Localizable.strings0000644000000000000000000004020212247657030021773 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Create a new event"; "Create a new task" = "Create a new task"; "Edit this event or task" = "Edit this event or task"; "Delete this event or task" = "Delete this event or task"; "Go to today" = "Go to today"; "Switch to day view" = "Switch to day view"; "Switch to week view" = "Switch to week view"; "Switch to month view" = "Switch to month view"; "Reload all calendars" = "Reload all calendars"; /* Tabs */ "Date" = "Date"; "Calendars" = "Calendars"; /* Day */ "DayOfTheMonth" = "Day of the month"; "dayLabelFormat" = "%m/%d/%Y"; "today" = "Today"; "Previous Day" = "Previous Day"; "Next Day" = "Next Day"; /* Week */ "Week" = "Week"; "this week" = "this week"; "Week %d" = "Week %d"; "Previous Week" = "Previous Week"; "Next Week" = "Next Week"; /* Month */ "this month" = "this month"; "Previous Month" = "Previous Month"; "Next Month" = "Next Month"; /* Year */ "this year" = "this year"; /* Menu */ "Calendar" = "Calendar"; "Contacts" = "Contacts"; "New Calendar..." = "New Calendar..."; "Delete Calendar" = "Delete Calendar..."; "Unsubscribe Calendar" = "Unsubscribe Calendar"; "Sharing..." = "Sharing..."; "Export Calendar..." = "Export Calendar..."; "Import Events..." = "Import Events..."; "Import Events" = "Import Events"; "Select an iCalendar file (.ics)." = "Select an iCalendar file (.ics)."; "Upload" = "Upload"; "Uploading" = "Uploading"; "Publish Calendar..." = "Publish Calendar..."; "Reload Remote Calendars" = "Reload Remote Calendars"; "Properties" = "Properties"; "Done" = "Done"; "An error occurred while importing calendar." = "An error occurred while importing calendar."; "No event was imported." = "No event was imported."; "A total of %{0} events were imported in the calendar." = "A total of %{0} events were imported in the calendar."; "Compose E-Mail to All Attendees" = "Compose E-Mail to All Attendees"; "Compose E-Mail to Undecided Attendees" = "Compose E-Mail to Undecided Attendees"; /* Folders */ "Personal calendar" = "Personal calendar"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Forbidden"; /* acls */ "Access rights to" = "Access rights to"; "For user" = "For user"; "Any Authenticated User" = "Any Authenticated User"; "Public Access" = "Public Access"; "label_Public" = "Public"; "label_Private" = "Private"; "label_Confidential" = "Confidential"; "label_Viewer" = "View All"; "label_DAndTViewer" = "View the Date & Time"; "label_Modifier" = "Modify"; "label_Responder" = "Respond To"; "label_None" = "None"; "View All" = "View All"; "View the Date & Time" = "View the Date & Time"; "Modify" = "Modify"; "Respond To" = "Respond To"; "None" = "None"; "This person can create objects in my calendar." = "This person can create objects in my calendar."; "This person can erase objects from my calendar." = "This person can erase objects from my calendar."; /* Button Titles */ "Subscribe to a Calendar..." = "Subscribe to a Calendar..."; "Remove the selected Calendar" = "Remove the selected Calendar"; "Name of the Calendar" = "Name of the Calendar"; "new" = "New"; "printview" = "Print View"; "edit" = "Edit"; "delete" = "Delete"; "proposal" = "Proposal"; "Save and Close" = "Save and Close"; "Close" = "Close"; "Invite Attendees" = "Invite Attendees"; "Attach" = "Attach"; "Update" = "Update"; "Cancel" = "Cancel"; "show_rejected_apts" = "Show rejected appointments"; "hide_rejected_apts" = "Hide rejected appointments"; /* Schedule */ "Schedule" = "Schedule"; "No appointments found" = "No appointments found"; "Meetings proposed by you" = "Meetings proposed by you"; "Meetings proposed to you" = "Meetings proposed to you"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Action"; "accept" = "Accept"; "decline" = "Decline"; "more attendees" = "More Attendees"; "Hide already accepted and rejected appointments" = "Hide already accepted and rejected appointments"; "Show already accepted and rejected appointments" = "Show already accepted and rejected appointments"; /* Appointments */ "Appointment viewer" = "Appointment Viewer"; "Appointment editor" = "Appointment Editor"; "Appointment proposal" = "Appointment Proposal"; "Appointment on" = "Appointment on"; "Start:" = "Start:"; "End:" = "End:"; "Due Date:" = "Due Date:"; "Title:" = "Title:"; "Calendar:" = "Calendar:"; "Name" = "Name"; "Email" = "Email"; "Status:" = "Status:"; "% complete" = "% complete"; "Location:" = "Location:"; "Priority:" = "Priority:"; "Privacy" = "Privacy"; "Cycle" = "Cycle"; "Cycle End" = "Cycle End"; "Categories" = "Categories"; "Classification" = "Classification"; "Duration" = "Duration"; "Attendees:" = "Attendees:"; "Resources" = "Resources"; "Organizer:" = "Organizer:"; "Description:" = "Description:"; "Document:" = "Document:"; "Category:" = "Category:"; "Repeat:" = "Repeat:"; "Reminder:" = "Reminder:"; "General:" = "General:"; "Reply:" = "Reply:"; "Created by:" = "Created by:"; "Target:" = "Target:"; "attributes" = "attributes"; "attendees" = "attendees"; "delegated from" = "delegated from"; /* checkbox title */ "is private" = "is private"; /* classification */ "Public" = "Public"; "Private" = "Private"; /* text used in overviews and tooltips */ "empty title" = "Empty title"; "private appointment" = "Private appointment"; "Change..." = "Change..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "I will confirm later"; "partStat_ACCEPTED" = "I will attend"; "partStat_DECLINED" = "I will not attend"; "partStat_TENTATIVE" = "I might attend"; "partStat_DELEGATED" = "I delegate"; "partStat_OTHER" = "Other"; /* Appointments (error messages) */ "Conflicts found!" = "Conflicts found!"; "Invalid iCal data!" = "Invalid iCal data!"; "Could not create iCal data!" = "Could not create iCal data!"; /* Searching */ "view_all" = "All"; "view_today" = "Today"; "view_next7" = "Next 7 days"; "view_next14" = "Next 14 days"; "view_next31" = "Next 31 days"; "view_thismonth" = "This Month"; "view_future" = "All Future Events"; "view_selectedday" = "Selected Day"; "View:" = "View:"; "Title or Description" = "Title or Description"; "Search" = "Search"; "Search attendees" = "Search attendees"; "Search resources" = "Search resources"; "Search appointments" = "Search appointments"; "All day Event" = "All day Event"; "check for conflicts" = "Check for conflicts"; "Browse URL" = "Browse URL"; "newAttendee" = "Add attendee"; /* calendar modes */ "Overview" = "Overview"; "Chart" = "Chart"; "List" = "List"; "Columns" = "Columns"; /* Priorities */ "prio_0" = "Not specified"; "prio_1" = "High"; "prio_2" = "High"; "prio_3" = "High"; "prio_4" = "High"; "prio_5" = "Normal"; "prio_6" = "Low"; "prio_7" = "Low"; "prio_8" = "Low"; "prio_9" = "Low"; /* access classes (privacy) */ "PUBLIC_vevent" = "Public Event"; "CONFIDENTIAL_vevent" = "Confidential Event"; "PRIVATE_vevent" = "Private Event"; "PUBLIC_vtodo" = "Public Task"; "CONFIDENTIAL_vtodo" = "Confidential Task"; "PRIVATE_vtodo" = "Private Task"; /* status type */ "status_" = "Not specified"; "status_NOT-SPECIFIED" = "Not specified"; "status_TENTATIVE" = "Tentative"; "status_CONFIRMED" = "Confirmed"; "status_CANCELLED" = "Cancelled"; "status_NEEDS-ACTION" = "Needs Action"; "status_IN-PROCESS" = "In Process"; "status_COMPLETED" = "Completed on"; /* Cycles */ "cycle_once" = "cycle_once"; "cycle_daily" = "cycle_daily"; "cycle_weekly" = "cycle_weekly"; "cycle_2weeks" = "cycle_2weeks"; "cycle_4weeks" = "cycle_4weeks"; "cycle_monthly" = "cycle_monthly"; "cycle_weekday" = "cycle_weekday"; "cycle_yearly" = "cycle_yearly"; "cycle_end_never" = "cycle_end_never"; "cycle_end_until" = "cycle_end_until"; "Recurrence pattern" = "Recurrence pattern"; "Range of recurrence" = "Range of recurrence"; "Repeat" = "Repeat"; "Daily" = "Daily"; "Weekly" = "Weekly"; "Monthly" = "Monthly"; "Yearly" = "Yearly"; "Every" = "Every"; "Days" = "Days"; "Week(s)" = "Week(s)"; "On" = "On"; "Month(s)" = "Month(s)"; "The" = "The"; "Recur on day(s)" = "Recur on day(s)"; "Year(s)" = "Year(s)"; "cycle_of" = "of"; "No end date" = "No end date"; "Create" = "Create"; "appointment(s)" = "appointment(s)"; "Repeat until" = "Repeat until"; "First" = "First"; "Second" = "Second"; "Third" = "Third"; "Fourth" = "Fourth"; "Fift" = "Fift"; "Last" = "Last"; /* Appointment categories */ "category_none" = "None"; "category_labels" = "Anniversary,Birthday,Business,Calls,Clients,Competition,Customer,Favorites,Follow up,Gifts,Holidays,Ideas,Meeting,Issues,Miscellaneous,Personal,Projects,Public Holiday,Status,Suppliers,Travel,Vacation"; "repeat_NEVER" = "Does not repeat"; "repeat_DAILY" = "Daily"; "repeat_WEEKLY" = "Weekly"; "repeat_BI-WEEKLY" = "Bi-weekly"; "repeat_EVERY WEEKDAY" = "Every Weekday"; "repeat_MONTHLY" = "Monthly"; "repeat_YEARLY" = "Yearly"; "repeat_CUSTOM" = "Custom..."; "reminder_NONE" = "No reminder"; "reminder_5_MINUTES_BEFORE" = "5 minutes before"; "reminder_10_MINUTES_BEFORE" = "10 minutes before"; "reminder_15_MINUTES_BEFORE" = "15 minutes before"; "reminder_30_MINUTES_BEFORE" = "30 minutes before"; "reminder_45_MINUTES_BEFORE" = "45 minutes before"; "reminder_1_HOUR_BEFORE" = "1 hour before"; "reminder_2_HOURS_BEFORE" = "2 hours before"; "reminder_5_HOURS_BEFORE" = "5 hours before"; "reminder_15_HOURS_BEFORE" = "15 hours before"; "reminder_1_DAY_BEFORE" = "1 day before"; "reminder_2_DAYS_BEFORE" = "2 days before"; "reminder_1_WEEK_BEFORE" = "1 week before"; "reminder_CUSTOM" = "Custom..."; "reminder_MINUTES" = "minutes"; "reminder_HOURS" = "hours"; "reminder_DAYS" = "days"; "reminder_BEFORE" = "before"; "reminder_AFTER" = "after"; "reminder_START" = "the event starts"; "reminder_END" = "the event ends"; "Reminder Details" = "Reminder Details"; "Choose a Reminder Action" = "Choose a Reminder Action"; "Show an Alert" = "Show an Alert"; "Send an E-mail" = "Send an E-mail"; "Email Organizer" = "Email Organizer"; "Email Attendees" = "Email Attendees"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Show Time as Free"; /* email notifications */ "Send Appointment Notifications" = "Send Appointment Notifications"; /* validation errors */ validate_notitle = "No title is set, continue?"; validate_invalid_startdate = "Incorrect startdate field!"; validate_invalid_enddate = "Incorrect enddate field!"; validate_endbeforestart = "The end date that you entered occurs before the start date."; "Events" = "Events"; "Tasks" = "Tasks"; "Show completed tasks" = "Show completed tasks"; /* tabs */ "Task" = "Task"; "Event" = "Event"; "Recurrence" = "Recurrence"; /* toolbar */ "New Event" = "New Event"; "New Task" = "New Task"; "Edit" = "Edit"; "Delete" = "Delete"; "Go to Today" = "Go to Today"; "Day View" = "Day View"; "Week View" = "Week View"; "Month View" = "Month View"; "Reload" = "Reload"; "eventPartStatModificationError" = "Your participation status could not be modified."; /* menu */ "New Event..." = "New Event..."; "New Task..." = "New Task..."; "Edit Selected Event..." = "Edit Selected Event..."; "Delete Selected Event" = "Delete Selected Event"; "Select All" = "Select All"; "Workweek days only" = "Workweek days only"; "Tasks in View" = "Tasks in View"; "eventDeleteConfirmation" = "The following event(s) will be erased: \n%{0}\nWould you like to continue?"; "taskDeleteConfirmation" = "The following task(s) will be erased: \n%{0}\nWould you like to continue?"; "You cannot remove nor unsubscribe from your personal calendar." = "You cannot remove nor unsubscribe from your personal calendar."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Are you sure you want to delete the calendar \"%{0}\"?"; /* Legend */ "Participant" = "Participant"; "Optional Participant" = "Optional Participant"; "Non Participant" = "Non Participant"; "Chair" = "Chair"; "Needs action" = "Needs action"; "Accepted" = "Accepted"; "Declined" = "Declined"; "Tentative" = "Tentative"; "Free" = "Free"; "Busy" = "Busy"; "Maybe busy" = "Maybe busy"; "No free-busy information" = "No free-busy information"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Suggest time slot:"; "Zoom:" = "Zoom:"; "Previous slot" = "Previous slot"; "Next slot" = "Next slot"; "Previous hour" = "Previous hour"; "Next hour" = "Next hour"; "Work days only" = "Work days only"; "The whole day" = "The whole day"; "Between" = "Between"; "and" = "and"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"; /* apt list */ "Title" = "Title"; "Start" = "Start"; "End" = "End"; "Due Date" = "Due Date"; "Location" = "Location"; "(Private Event)" = "(Private Event)"; vevent_class0 = "(Public event)"; vevent_class1 = "(Private event)"; vevent_class2 = "(Confidential event)"; "Priority" = "Priority"; "Category" = "Category"; vtodo_class0 = "(Public task)"; vtodo_class1 = "(Private task)"; vtodo_class2 = "(Confidential task)"; "closeThisWindowMessage" = "Thank you! You may now close this window or view your "; "Multicolumn Day View" = "Multicolumn Day View"; "Please select an event or a task." = "Please select an event or a task."; "editRepeatingItem" = "The item you are editing is a repeating item. Do you want to edit all occurences of it or only this single instance?"; "button_thisOccurrenceOnly" = "This occurence only"; "button_allOccurrences" = "All occurences"; /* Properties dialog */ "Name:" = "Name:"; "Color:" = "Color:"; "Include in free-busy" = "Include in free-busy"; "Synchronization" = "Synchronization"; "Synchronize" = "Synchronize"; "Tag:" = "Tag:"; "Display" = "Display"; "Show alarms" = "Show alarms"; "Show tasks" = "Show tasks"; "Notifications" = "Notifications"; "Receive a mail when I modify my calendar" = "Receive a mail when I modify my calendar"; "Receive a mail when someone else modifies my calendar" = "Receive a mail when someone else modifies my calendar"; "When I modify my calendar, send a mail to:" = "When I modify my calendar, send a mail to:"; "Links to this Calendar" = "Links to this Calendar"; "Authenticated User Access" = "Authenticated User Access"; "CalDAV URL" = "CalDAV URL"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Please specify a numerical value in the Days field greater or equal to 1."; "weekFieldInvalid" = "Please specify a numerical value in the Week(s) field greater or equal to 1."; "monthFieldInvalid" = "Please specify a numerical value in the Month(s) field greater or equal to 1."; "monthDayFieldInvalid" = "Please specify a numerical value in the month day field greater or equal to 1."; "yearFieldInvalid" = "Please specify a numerical value in the Year(s) field greater or equal to 1."; "appointmentFieldInvalid" = "Please specify a numerical value in the Appointment(s) field greater or equal to 1."; "recurrenceUnsupported" = "This type of recurrence is currently unsupported."; "Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "You must specify a tag if you want to synchronize this calendar."; "tagAlreadyExists" = "The tag you specified is already associated to another calendar."; "tagHasChanged" = "If you change your calendar's tag, you'll need to reload the data on your mobile device.\nContinue?"; "tagWasAdded" = "If you want to synchronize this calendar, you'll need to reload the data on your mobile device.\nContinue?"; "tagWasRemoved" = "If you remove this calendar from synchronization, you'll need to reload the data on your mobile device.\nContinue?"; "DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; "EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; "Open Task..." = "Open Task..."; "Mark Completed" = "Mark Completed"; "Delete Task" = "Delete Task"; "Delete Event" = "Delete Event"; "Copy event to my calendar" = "Copy event to my calendar"; "View Raw Source" = "View Raw Source"; "Subscribe to a web calendar..." = "Subscribe to a web calendar..."; "URL of the Calendar" = "URL of the Calendar"; "Web Calendar" = "Web Calendar"; "Reload on login" = "Reload on login"; "Invalid number." = "Invalid number."; "Please identify yourself to %{0}" = "Please identify yourself to %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxCalDayTable.h0000644000000000000000000000333012247657030016326 0ustar rootroot/* UIxCalDayTable.h - this file is part of $PROJECT_NAME_HERE$ * * Copyright (C) 2006 Inverse inc. * * 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 UIXCALDAYTABLE_H #define UIXCALDAYTABLE_H #import "UIxCalView.h" @class NSArray; @class NSCalendarDay; @class NSDictionary; @class NSNumber; @class NSString; @class SOGoDateFormatter; @interface UIxCalDayTable : UIxCalView { unsigned int numberOfDays; NSCalendarDate *startDate; NSCalendarDate *currentTableDay; NSString *currentTableHour; NSMutableArray *daysToDisplay; NSMutableArray *hoursToDisplay; NSArray *weekDays; SOGoDateFormatter *dateFormatter; NSString *timeFormat; } - (void) setNumberOfDays: (NSNumber *) aNumber; - (NSNumber *) numberOfDays; - (void) setStartDate: (NSCalendarDate *) aStartDate; - (NSCalendarDate *) startDate; - (NSCalendarDate *) endDate; - (NSArray *) daysToDisplay; - (void) setCurrentTableDay: (NSCalendarDate *) aTableDay; - (NSCalendarDate *) currentTableDay; @end #endif /* UIXCALDAYTABLE_H */ SOGo-2.1.1b/UI/Scheduler/UIxCalUserRightsEditor.m0000644000000000000000000001231112247657030020113 0ustar rootroot/* UIxCalUserRightsEditor.m - this file is part of SOGo * * Copyright (C) 2007-2010 Inverse inc. * * 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 #import #import #import "UIxCalUserRightsEditor.h" @implementation UIxCalUserRightsEditor - (id) init { if ((self = [super init])) { currentRight = nil; currentRightType = nil; rights = [NSMutableDictionary new]; [rights setObject: @"None" forKey: @"Public"]; [rights setObject: @"None" forKey: @"Private"]; [rights setObject: @"None" forKey: @"Confidential"]; } return self; } - (void) dealloc { [currentRight release]; [currentRightType release]; [rights release]; [super dealloc]; } - (void) prepareRightsForm { NSEnumerator *roles, *types; NSString *role, *type; unsigned int length; roles = [userRights objectEnumerator]; role = [roles nextObject]; while (role) { types = [[self rightTypes] objectEnumerator]; type = [types nextObject]; while (type) { if ([role hasPrefix: type]) { length = [type length]; [rights setObject: [role substringFromIndex: length] forKey: type]; } type = [types nextObject]; } role = [roles nextObject]; } } - (NSArray *) _rightsForType: (NSString *) type { NSMutableArray *rightsForType; NSEnumerator *commonRights; NSString *currentCommonRight; rightsForType = [NSMutableArray arrayWithCapacity: 5]; commonRights = [[self objectRights] objectEnumerator]; while ((currentCommonRight = [commonRights nextObject])) [rightsForType addObject: [NSString stringWithFormat: @"%@%@", type, currentCommonRight]]; return rightsForType; } - (void) updateRights { NSEnumerator *types; NSString *currentType, *currentValue; NSArray *rightsForType; WORequest *request; request = [context request]; types = [[self rightTypes] objectEnumerator]; currentType = [types nextObject]; while (currentType) { rightsForType = [self _rightsForType: currentType]; currentValue = [request formValueForKey: [NSString stringWithFormat: @"%@Right", currentType]]; if ([currentValue isEqualToString: @"None"]) [self removeAllRightsFromList: rightsForType]; else [self appendExclusiveRight: [NSString stringWithFormat: @"%@%@", currentType, currentValue] fromList: rightsForType]; currentType = [types nextObject]; } if ([[request formValueForKey: @"ObjectCreator"] length] > 0) [self appendRight: SOGoRole_ObjectCreator]; else [self removeRight: SOGoRole_ObjectCreator]; if ([[request formValueForKey: @"ObjectEraser"] length] > 0) [self appendRight: SOGoRole_ObjectEraser]; else [self removeRight: SOGoRole_ObjectEraser]; } - (NSArray *) objectRights { return ([uid isEqualToString: @"anonymous"] ? [NSArray arrayWithObjects: @"None", @"DAndTViewer", @"Viewer", nil] : [NSArray arrayWithObjects: @"None", @"DAndTViewer", @"Viewer", @"Responder", @"Modifier", nil]); } - (void) setCurrentRight: (NSString *) newCurrentRight { ASSIGN (currentRight, newCurrentRight); } - (NSString *) currentRight { return currentRight; } - (NSArray *) rightTypes { return [NSArray arrayWithObjects: @"Public", @"Confidential", @"Private", nil]; } - (void) setCurrentRightType: (NSString *) newCurrentRightType { ASSIGN (currentRightType, newCurrentRightType); } - (NSString *) currentRightType { return currentRightType; } - (NSString *) currentRightLabel { return [self labelForKey: [NSString stringWithFormat: @"label_%@", currentRight]]; } - (NSString *) currentRightTypeLabel { return [self labelForKey: [NSString stringWithFormat: @"label_%@", currentRightType]]; } - (NSString *) currentRightTypeName { return [NSString stringWithFormat: @"%@Right", currentRightType]; } - (NSString *) currentRightSelection { return [rights objectForKey: currentRightType]; } - (void) setUserCanCreateObjects: (BOOL) userCanCreateObjects { [self appendRight: SOGoRole_ObjectCreator]; } - (BOOL) userCanCreateObjects { return [userRights containsObject: SOGoRole_ObjectCreator]; } - (void) setUserCanEraseObjects: (BOOL) userCanEraseObjects { [self appendRight: SOGoRole_ObjectEraser]; } - (BOOL) userCanEraseObjects { return [userRights containsObject: SOGoRole_ObjectEraser]; } @end SOGo-2.1.1b/UI/Scheduler/UIxCalendarSelector.m0000644000000000000000000001124712247657030017446 0ustar rootroot/* UIxCalendarSelector.m - this file is part of SOGo * * Copyright (C) 2007-2011 Inverse inc. * * 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 #import #import #import #import #import #import #import "UIxCalendarSelector.h" static inline unsigned int _intValueFromHexChar (unichar hexChar) { unichar base; if (hexChar >= '0' && hexChar <= '9') base = '0'; else if (hexChar >= 'A' && hexChar <= 'F') base = 'A' - 10; else base = 'a' - 10; return (hexChar - base); } static inline unsigned int _intValueFromHex (NSString *hexString) { unsigned int value, count, max; value = 0; max = [hexString length]; for (count = 0; count < max; count++) value = (value * 16 + _intValueFromHexChar([hexString characterAtIndex: count])); return value; } @implementation UIxCalendarSelector - (id) init { if ((self = [super init])) { calendars = nil; currentCalendar = nil; } return self; } - (void) dealloc { [calendars release]; [currentCalendar release]; [super dealloc]; } - (NSArray *) calendars { NSArray *folders; SOGoAppointmentFolders *co; SOGoAppointmentFolder *folder; NSMutableDictionary *calendar; unsigned int count, max; NSString *folderName, *fDisplayName; NSNumber *isActive; if (!calendars) { co = [self clientObject]; folders = [co subFolders]; max = [folders count]; calendars = [[NSMutableArray alloc] initWithCapacity: max]; for (count = 0; count < max; count++) { folder = [folders objectAtIndex: count]; calendar = [NSMutableDictionary dictionary]; folderName = [folder nameInContainer]; fDisplayName = [folder displayName]; if (fDisplayName == nil) fDisplayName = @""; if ([fDisplayName isEqualToString: [co defaultFolderName]]) fDisplayName = [self labelForKey: fDisplayName]; [calendar setObject: [NSString stringWithFormat: @"/%@", folderName] forKey: @"id"]; [calendar setObject: fDisplayName forKey: @"displayName"]; [calendar setObject: folderName forKey: @"folder"]; [calendar setObject: [folder calendarColor] forKey: @"color"]; isActive = [NSNumber numberWithBool: [folder isActive]]; [calendar setObject: isActive forKey: @"active"]; [calendar setObject: [folder ownerInContext: context] forKey: @"owner"]; [calendars addObject: calendar]; } } return calendars; } - (void) setCurrentCalendar: (NSDictionary *) newCalendar { ASSIGN (currentCalendar, newCalendar); } - (NSDictionary *) currentCalendar { return currentCalendar; } - (NSString *) currentCalendarClass { return [currentCalendar keysWithFormat: @"colorBox calendarFolder%{folder}"]; } - (NSString *) currentCalendarStyle { return [currentCalendar keysWithFormat: @"color: %{color}; background-color: %{color};"]; } /* code taken from Lightning 0.7 */ - (NSString *) contrastingTextColor { NSString *bgColor; unsigned int red, green, blue; float brightness; bgColor = [[currentCalendar objectForKey: @"color"] substringFromIndex: 1]; red = _intValueFromHex ([bgColor substringFromRange: NSMakeRange (0, 2)]); green = _intValueFromHex ([bgColor substringFromRange: NSMakeRange (2, 2)]); blue = _intValueFromHex ([bgColor substringFromRange: NSMakeRange (4, 2)]); brightness = (0.299 * red) + (0.587 * green) + (0.114 * blue); return ((brightness < 144) ? @"white" : @"black"); } - (WOResponse *) calendarsListAction { WOResponse *response; response = [self responseWithStatus: 200]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; [response appendContentString: [[self calendars] jsonRepresentation]]; return response; } @end /* UIxCalendarSelector */ SOGo-2.1.1b/UI/Scheduler/UIxCalDateSelector.h0000644000000000000000000000263112247657030017222 0ustar rootroot/* UIxCalDateSelector.h - this file is part of SOGo * * Copyright (C) 2006 Inverse inc. * * 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 UIXCALDATESELECTOR_H #define UIXCALDATESELECTOR_H #include "UIxCalMonthOverview.h" @interface UIxCalDateSelector : UIxCalMonthOverview { NSCalendarDate *selectedDate; NSString *style; NSString *headerStyle; NSString *weekStyle; NSString *todayWeekStyle; NSString *dayHeaderStyle; NSString *dayBodyStyle; NSString *todayBodyStyle; NSString *inactiveDayBodyStyle; NSString *selectedDayExtraStyle; NSString *daySelectionHref; NSString *weekSelectionHref; NSString *monthSelectionHref; } @end #endif /* UIXCALDATESELECTOR_H */ SOGo-2.1.1b/UI/Scheduler/Catalan.lproj/0000755000000000000000000000000012247657027016121 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Catalan.lproj/Localizable.strings0000644000000000000000000004143612247657027021765 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Crear un esdeveniment nou en el calendari"; "Create a new task" = "Crear una tasca nova"; "Edit this event or task" = "Modificar aquest esdeveniment o tasca"; "Delete this event or task" = "Esborrar aquest esdeveniment o tasca"; "Go to today" = "Anar a avui"; "Switch to day view" = "Canviar a vista diària"; "Switch to week view" = "Canviar a vista setmanal"; "Switch to month view" = "Canviar a vista mensual"; "Reload all calendars" = "Actualitzar tots els calendaris"; /* Tabs */ "Date" = "Data"; "Calendars" = "Calendaris"; /* Day */ "DayOfTheMonth" = "Dia del mes"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "Avui"; "Previous Day" = "Dia anterior"; "Next Day" = "Dia següent"; /* Week */ "Week" = "Setmana"; "this week" = "Aquesta setmana"; "Week %d" = "Setmana %d"; "Previous Week" = "Setmana anterior"; "Next Week" = "Setmana següent"; /* Month */ "this month" = "Aquest mes"; "Previous Month" = "Mes anterior"; "Next Month" = "Mes següent"; /* Year */ "this year" = "enguany"; /* Menu */ "Calendar" = "Calendari"; "Contacts" = "Contactes"; "New Calendar..." = "Calendari nou..."; "Delete Calendar" = "Esborrar calendari"; "Unsubscribe Calendar" = "Cancel·lar subscripció calendari"; "Sharing..." = "Compartir..."; "Export Calendar..." = "Exportar calendari..."; "Import Events..." = "Importar esdeveniments..."; "Import Events" = "Importar esdeveniments"; "Select an iCalendar file (.ics)." = "Seleccionar un fitxer iCalendar (.ics)."; "Upload" = "Carregar"; "Uploading" = "carregant "; "Publish Calendar..." = "Publicar calendari..."; "Reload Remote Calendars" = "Actualitzar calendaris remots"; "Properties" = "Propietats"; "Done" = "Fet"; "An error occurred while importing calendar." = "Hi ha hagut un error en importar el calendari."; "No event was imported." = "No s'ha importat cap esdeveniment."; "A total of %{0} events were imported in the calendar." = "Han estat importats %{0} esdeveniments al calendari."; "Compose E-Mail to All Attendees" = "Crear correu per a tots els assistents"; "Compose E-Mail to Undecided Attendees" = "Crear correu per a tots els assistents indecisos (sense confirmació)"; /* Folders */ "Personal calendar" = "Calendari personal"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Prohibit"; /* acls */ "Access rights to" = "Drets d'accés a"; "For user" = "Per a l'usuari"; "Any Authenticated User" = "Qualsevol usuari autenticat"; "Public Access" = "Accés públic"; "label_Public" = "Públic"; "label_Private" = "Privat"; "label_Confidential" = "Confidencial"; "label_Viewer" = "Veure-ho tot"; "label_DAndTViewer" = "Veure data i hora"; "label_Modifier" = "Modificar"; "label_Responder" = "Respondre a"; "label_None" = "Cap"; "View All" = "Veure-ho tot"; "View the Date & Time" = "Veure data i hora"; "Modify" = "Modificar"; "Respond To" = "Respondre a"; "None" = "Cap"; "This person can create objects in my calendar." = "Aquesta persona pot crear elements en el meu calendari."; "This person can erase objects from my calendar." = "Aquesta persona pot eliminar elements del meu calendari."; /* Button Titles */ "Subscribe to a Calendar..." = "Subscriure a un calendari..."; "Remove the selected Calendar" = "Esborrar calendari seleccionat"; "Name of the Calendar" = "Nom del calendari"; "new" = "Nou"; "printview" = "Vista preliminar"; "edit" = "Modificar"; "delete" = "Esborrar"; "proposal" = "Proposta"; "Save and Close" = "Desar i tancar"; "Close" = "Tancar"; "Invite Attendees" = "Invitar assistents"; "Attach" = "Adjuntar"; "Update" = "Actualitzar"; "Cancel" = "Cancel·lar"; "show_rejected_apts" = "Mostrar cites rebutjades"; "hide_rejected_apts" = "Ocultar cites rebutjades"; /* Schedule */ "Schedule" = "Agenda d'esdeveniments"; "No appointments found" = "No hi ha cites"; "Meetings proposed by you" = "Reunions que heu proposat"; "Meetings proposed to you" = "Reunions que us han proposat"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Acció"; "accept" = "Confirmar"; "decline" = "Rebutjar"; "more attendees" = "Més assistents"; "Hide already accepted and rejected appointments" = "Ocultar cites confirmades o rebutjades"; "Show already accepted and rejected appointments" = "Mostrar cites confirmades o rebutjades"; /* Appointments */ "Appointment viewer" = "Mostrar cita"; "Appointment editor" = "Modificar cita"; "Appointment proposal" = "Proposta de cita"; "Appointment on" = "Cita sobre"; "Start:" = "Des de:"; "End:" = "Fins a:"; "Due Date:" = "Data límit:"; "Title:" = "Títol:"; "Calendar:" = "Calendari:"; "Name" = "Nom"; "Email" = "Correu"; "Status:" = "Estat:"; "% complete" = "% complet"; "Location:" = "Lloc:"; "Priority:" = "Prioritat:"; "Privacy" = "Privacitat"; "Cycle" = "Repetir"; "Cycle End" = "Final repetició"; "Categories" = "Categories"; "Classification" = "Privacitat"; "Duration" = "Duració"; "Attendees:" = "Assistents:"; "Resources" = "Recursos"; "Organizer:" = "Organitzador:"; "Description:" = "Descripció:"; "Document:" = "Document:"; "Category:" = "Categoria:"; "Repeat:" = "Repetir:"; "Reminder:" = "Recordatori:"; "General:" = "General:"; "Reply:" = "Respondre:"; "Target:" = "URL document:"; "attributes" = "atributs"; "attendees" = "assistents"; "delegated from" = "delegat de"; /* checkbox title */ "is private" = "és privat"; /* classification */ "Public" = "Públic"; "Private" = "Privat"; /* text used in overviews and tooltips */ "empty title" = "Sense títol"; "private appointment" = "Cita privada"; "Change..." = "Modificar..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Requereix acció"; "partStat_ACCEPTED" = "Hi assistiré"; "partStat_DECLINED" = "No hi assistiré"; "partStat_TENTATIVE" = "Ho confirmaré més tard"; "partStat_DELEGATED" = "Delegat"; "partStat_OTHER" = "Altre"; /* Appointments (error messages) */ "Conflicts found!" = "Hi ha conflictes!"; "Invalid iCal data!" = "Dades iCal no vàlides!"; "Could not create iCal data!" = "No es poden crear dades en format iCal!"; /* Searching */ "view_all" = "Tots els esdeveniments"; "view_today" = "Avui"; "view_next7" = "Els pròxims 7 dies"; "view_next14" = "Els pròxims 14 dies"; "view_next31" = "Els pròxims 31 dies"; "view_thismonth" = "Aquest mes"; "view_future" = "Tots els esdeveniments futurs"; "view_selectedday" = "Dia seleccionat"; "View:" = "Veure:"; "Title or Description" = "Títol o descripció"; "Search" = "Cercar"; "Search attendees" = "Cercar assistents"; "Search resources" = "Cercar recursos"; "Search appointments" = "Cercar cites"; "All day Event" = "Tot el dia"; "check for conflicts" = "Cercar conflictes"; "Browse URL" = "Anar a URL"; "newAttendee" = "Afegir assistent"; /* calendar modes */ "Overview" = "Resum"; "Chart" = "Taula"; "List" = "Llista"; "Columns" = "Columnes"; /* Priorities */ "prio_0" = "No especificada"; "prio_1" = "Alta"; "prio_2" = "Alta"; "prio_3" = "Alta"; "prio_4" = "Alta"; "prio_5" = "Normal"; "prio_6" = "Baixa"; "prio_7" = "Baixa"; "prio_8" = "Baixa"; "prio_9" = "Baixa"; /* access classes (privacy) */ "PUBLIC_vevent" = "Esdeveniment públic"; "CONFIDENTIAL_vevent" = "Esdeveniment confidencial"; "PRIVATE_vevent" = "Esdeveniment privat"; "PUBLIC_vtodo" = "Tasca pública"; "CONFIDENTIAL_vtodo" = "Tasca confidencial"; "PRIVATE_vtodo" = "Tasca privada"; /* status type */ "status_" = "No especifat"; "status_NOT-SPECIFIED" = "No especificat"; "status_TENTATIVE" = "Provisional"; "status_CONFIRMED" = "Confirmat"; "status_CANCELLED" = "Cancel·lat"; "status_NEEDS-ACTION" = "Necessita intervenció"; "status_IN-PROCESS" = "En procés"; "status_COMPLETED" = "Completat"; /* Cycles */ "cycle_once" = "sense repetició"; "cycle_daily" = "diàriament"; "cycle_weekly" = "setmanalment"; "cycle_2weeks" = "bisetmanalment"; "cycle_4weeks" = "cada 4 setmanes"; "cycle_monthly" = "mensualment"; "cycle_weekday" = "cada dia laborable"; "cycle_yearly" = "anualment"; "cycle_end_never" = "per sempre"; "cycle_end_until" = "fins a: "; "Recurrence pattern" = "Patró de repetició"; "Range of recurrence" = "Rang de repetició"; "Repeat" = "Repetir"; "Daily" = "diàriament"; "Weekly" = "setmanalment"; "Monthly" = "mensualment"; "Yearly" = "anualment"; "Every" = "cada"; "Days" = "dies"; "Week(s)" = "setmana/es"; "On" = "en"; "Month(s)" = "mes/mesos"; "The" = "El"; "Recur on day(s)" = "Repetir en dia/dies"; "Year(s)" = "any/s"; "cycle_of" = "de"; "No end date" = "Sense data final"; "Create" = "Fins a crear"; "appointment(s)" = "cita/es"; "Repeat until" = "Fins a: "; "First" = "Primer"; "Second" = "Segon"; "Third" = "Tercer"; "Fourth" = "Quart"; "Fift" = "Cinquè"; "Last" = "Últim"; /* Appointment categories */ "category_none" = "Cap"; "category_labels" = "Aniversari,Natalici,Negocis,Telefonades,Clients,Competició,Feina,Favorits,Seguiment,Regals,Festes,Idees,Reunió,Assumptes,Altres,Personal,Projectes,Vacances públiques,Estat,Proveïdors,Viatges,Vacances"; "repeat_NEVER" = "sense repetició"; "repeat_DAILY" = "diàriament"; "repeat_WEEKLY" = "setmanalment"; "repeat_BI-WEEKLY" = "bisetmanalment"; "repeat_EVERY WEEKDAY" = "cada dia laborable"; "repeat_MONTHLY" = "mensualment"; "repeat_YEARLY" = "anualment"; "repeat_CUSTOM" = "personalitzar..."; "reminder_NONE" = "Sense recordatori"; "reminder_5_MINUTES_BEFORE" = "5 minuts abans"; "reminder_10_MINUTES_BEFORE" = "10 minuts abans"; "reminder_15_MINUTES_BEFORE" = "15 minuts abans"; "reminder_30_MINUTES_BEFORE" = "30 minuts abans"; "reminder_45_MINUTES_BEFORE" = "45 minuts abans"; "reminder_1_HOUR_BEFORE" = "1 hora abans"; "reminder_2_HOURS_BEFORE" = "2 hores abans"; "reminder_5_HOURS_BEFORE" = "5 hores abans"; "reminder_15_HOURS_BEFORE" = "15 hores abans"; "reminder_1_DAY_BEFORE" = "1 dia abans"; "reminder_2_DAYS_BEFORE" = "2 dies abans"; "reminder_1_WEEK_BEFORE" = "1 setmana abans"; "reminder_CUSTOM" = "personalitzar..."; "reminder_MINUTES" = "minuts"; "reminder_HOURS" = "hores"; "reminder_DAYS" = "dia"; "reminder_BEFORE" = "abans"; "reminder_AFTER" = "després"; "reminder_START" = "l'esdeveniment comença"; "reminder_END" = "l'esdeveniment acaba"; "Reminder Details" = "Detalls del recordatori"; "Choose a Reminder Action" = "Acció per al recordatori"; "Show an Alert" = "Mostrar un avís"; "Send an E-mail" = "Enviar un correu"; "Email Organizer" = "Correu a l'organitzador/a"; "Email Attendees" = "Correu als assistents"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Mostrar temps com a lliure"; /* validation errors */ validate_notitle = "Sense títol, continuar?"; validate_invalid_startdate = "Data de començament incorrecta"; validate_invalid_enddate = "Data d'acabament incorrecta"; validate_endbeforestart = "La data/hora de començament és posterior a la d'acabament."; "Events" = "Esdeveniments"; "Tasks" = "Tasques"; "Show completed tasks" = "Mostrar tasques completades"; /* tabs */ "Task" = "Tasca"; "Event" = "Esdeveniment"; "Recurrence" = "Repetició"; /* toolbar */ "New Event" = "Esdeveniment nou"; "New Task" = "Tasca nova"; "Edit" = "Modificar"; "Delete" = "Esborrar"; "Go to Today" = "Anar a avui"; "Day View" = "Vista diària"; "Week View" = "Vista setmanal"; "Month View" = "Vista mensual"; "Reload" = "Actualitzar"; "eventPartStatModificationError" = "L'estat de participació no pot ser actualitzat."; /* menu */ "New Event..." = "Esdeveniment nou..."; "New Task..." = "Tasca nova..."; "Edit Selected Event..." = "Modificar esdeveniment seleccionat..."; "Delete Selected Event" = "Esborrar esdeveniment seleccionat"; "Select All" = "Seleccionar tot"; "Workweek days only" = "Només dies laborables"; "Tasks in View" = "Mostrar tasques"; "eventDeleteConfirmation" = "El següent esdeveniment (s) s'esborrarà: \n%{0}\nVoleu continuar?"; "taskDeleteConfirmation" = "Aquesta tasca s'esborrarà definitivament. Voleu continuar?"; "You cannot remove nor unsubscribe from your personal calendar." = "No podeu cancel·lar la subscripció al calendari personal o esborrar-lo."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Voleu esborrar el calendari \"%{0}\"?"; /* Legend */ "Participant" = "Assistent"; "Optional Participant" = "Assistent opcional"; "Non Participant" = "No assistent"; "Chair" = "President"; "Needs action" = "Requereix intervenció"; "Accepted" = "Confirmada"; "Declined" = "Rebutjada"; "Tentative" = "Provisional"; "Free" = "Lliure"; "Busy" = "Ocupat"; "Maybe busy" = "Possiblement ocupat"; "No free-busy information" = "Sense informació de disponibilitat."; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Proposar interval temporal:"; "Zoom:" = "Ampliació:"; "Previous slot" = "Interval anterior"; "Next slot" = "Interval següent"; "Previous hour" = "Hora anterior"; "Next hour" = "Hora següent"; "Work days only" = "Només els dies de feina"; "The whole day" = "Tot el dia"; "Between" = "Entre"; "and" = "i"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Hi ha un conflicte temporal amb un o més assistents.\nTot i així, voleu mantenir la cita?"; /* apt list */ "Title" = "Títol"; "Start" = "Inici"; "End" = "Final"; "Due Date" = "Data límit"; "Location" = "Lloc"; "(Private Event)" = "(Esdeveniment privat)"; vevent_class0 = "(Esdeveniment públic)"; vevent_class1 = "(Esdeveniment privat)"; vevent_class2 = "(Esdeveniment confidencial)"; "Priority" = "Prioritat"; "Category" = "Categoria"; vtodo_class0 = "(Tasca pública)"; vtodo_class1 = "(Tasca privada)"; vtodo_class2 = "(Tasca confidencial)"; "closeThisWindowMessage" = "Gràcies! Ja podeu tancar la finestra."; "Multicolumn Day View" = "Vista diària multicolumna"; "Please select an event or a task." = "Si us plau, seleccioneu un esdeveniment o una tasca"; "editRepeatingItem" = "L'element que editeu és un element repetitiu. Voleu editar-ne totes les ocurrències o només la que heu assenyalat?"; "button_thisOccurrenceOnly" = "Només aquesta ocurrència"; "button_allOccurrences" = "Totes les ocurrències"; /* Properties dialog */ "Name:" = "Nom:"; "Color:" = "Color:"; "Include in free-busy" = "Inclòs en lliure-ocupat"; "Synchronization" = "Sincronització"; "Synchronize" = "Sincronitza"; "Tag:" = "Redacció:"; "Display" = "Mostra"; "Show alarms" = "Mostra les alarmes"; "Show tasks" = "Mostra les tasques"; "Notifications" = "Notificacions"; "Receive a mail when I modify my calendar" = "Rebre un correu de notificació quan modifique el meu calendari"; "Receive a mail when someone else modifies my calendar" = "Rebre un correu de notificació quan altra persona modifique el meu calendari "; "When I modify my calendar, send a mail to:" = "Quan modifique el meu calendari, enviar un correu a: "; "Links to this Calendar" = "Enllaços a aquest calendari"; "Authenticated User Access" = "Accés autenticat"; "CalDAV URL" = "url CalDAV"; "WebDAV ICS URL" = "url WebDAV ICS"; "WebDAV XML URL" = "url WebDAV XML"; /* Error messages */ "dayFieldInvalid" = "Cal especificar un valor numèric per al camp Dies major o igual que 1."; "weekFieldInvalid" = "Cal especificar un valor numèric per al camp Setmana/es major o igual que 1."; "monthFieldInvalid" = "Cal especificar un valor numèric per al camp Mes/Mesos major o igual que 1."; "monthDayFieldInvalid" = "Cal especificar un valor numèric per al camp Dia del mes major o igual que 1."; "yearFieldInvalid" = "Cal especificar un valor numèric per al camp Any/s major o igual que 1."; "appointmentFieldInvalid" = "Cal especificar un valor numèric per al camp Cita/es major o igual que 1."; "recurrenceUnsupported" = "Aquest tipus de repetició no funciona encara."; "Please specify a calendar name." = "Per favor especifiqueu un nom de calendari"; "tagNotDefined" = "Especifiqueu una etiqueta si voleu sincronitzar aquest calendari."; "tagAlreadyExists" = "L'etiqueta especificada ja està associada a un altre calendari."; "tagHasChanged" = "Si canvieu l'etiqueta d'aquest calendari, haureu de recarregar les dades en el dispositiu mòbil.\nVoleu continuar?"; "tagWasAdded" = "Si voleu sincronitzar aquest calendari, haureu de recarregar les dades en el dispositiu mòbil.\nVoleu continuar?"; "tagWasRemoved" = "Si tragueu aquest calendari de la sincronització, haureu de recarregar les dades en el dispositiu mòbil.\nVoleu continuar?"; "DestinationCalendarError" = "El calendari origen i destinació són el mateix. Intenteu copiar-lo en un calendari diferent."; "EventCopyError" = "Error de còpia. Intenteu-lo copiar en un calendari diferent."; "Open Task..." = "Obrir tasca..."; "Mark Completed" = "Marcar com a completada"; "Delete Task" = "Esborrar tasca"; "Delete Event" = "Esorrar esdeveniment"; "Copy event to my calendar" = "Copiar l'esdeveniment al meu calendari"; "View Raw Source" = "Veure l'original"; "Subscribe to a web calendar..." = "Subscriure's a un calendari web..."; "URL of the Calendar" = "URL del calendari"; "Web Calendar" = "Calendari Web"; "Reload on login" = "Actualitzar en connectar-se"; "Invalid number." = "Número incorrecte"; SOGo-2.1.1b/UI/Scheduler/UIxCalWeekView.m0000644000000000000000000000632612247657030016404 0ustar rootroot/* UIxCalWeekView.m - this file is part of SOGo * * Copyright (C) 2006 Inverse inc. * * 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 #import #import #import #import #import #include "UIxCalWeekView.h" @implementation UIxCalWeekView - (id ) defaultAction { [super setCurrentView: @"weekview"]; return self; } - (NSCalendarDate *) startDate { NSCalendarDate *date; date = [[context activeUser] firstDayOfWeekForDate: [super startDate]]; return [date beginOfDay]; } - (NSCalendarDate *) endDate { unsigned offset; SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; if ([ud calendarShouldDisplayWeekend]) offset = 7; else offset = 5; return [[[self startDate] dateByAddingYears: 0 months: 0 days: offset hours: 0 minutes: 0 seconds: 0] endOfDay]; } // - (NSArray *) appointments // { // return [self fetchCoreAppointmentsInfos]; // } /* URLs */ - (NSDictionary *) weekBeforePrevWeekQueryParameters { return [self _dateQueryParametersWithOffset: -14]; } - (NSDictionary *) prevWeekQueryParameters { return [self _dateQueryParametersWithOffset: -7]; } - (NSDictionary *) nextWeekQueryParameters { return [self _dateQueryParametersWithOffset: 7]; } - (NSDictionary *) weekAfterNextWeekQueryParameters { return [self _dateQueryParametersWithOffset: 14]; } - (NSString *) _weekNumberWithOffsetFromToday: (int) offset { NSCalendarDate *date; NSString *format; unsigned int weekNbr; SOGoUser *user; user = [context activeUser]; date = [[self startDate] dateByAddingYears: 0 months: 0 days: (offset * 7) + 6 hours: 0 minutes: 0 seconds: 0]; weekNbr = [user weekNumberForDate: date]; format = [self labelForKey: @"Week %d"]; return [NSString stringWithFormat: format, weekNbr]; } - (NSString *) weekBeforeLastWeekName { return [self _weekNumberWithOffsetFromToday: -2]; } - (NSString *) lastWeekName { return [self _weekNumberWithOffsetFromToday: -1]; } - (NSString *) currentWeekName { return [self _weekNumberWithOffsetFromToday: 0]; } - (NSString *) nextWeekName { return [self _weekNumberWithOffsetFromToday: 1]; } - (NSString *) weekAfterNextWeekName { return [self _weekNumberWithOffsetFromToday: 2]; } @end /* UIxCalWeekView */ SOGo-2.1.1b/UI/Scheduler/GNUmakefile.preamble0000644000000000000000000000011212247657030017255 0ustar rootroot# compile settings ADDITIONAL_INCLUDE_DIRS += \ -I.. -I../.. -I../../.. SOGo-2.1.1b/UI/Scheduler/UIxCalendarProperties.m0000644000000000000000000001702112247657030020016 0ustar rootroot/* UIxCalendarProperties.m - this file is part of SOGo * * Copyright (C) 2008-2012 Inverse inc. * * Author: Wolfgang Sourdeau * Ludovic Marcotte * * 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 #import #import #import #import #import #import #import "UIxCalendarProperties.h" @implementation UIxCalendarProperties - (id) init { if ((self = [super init])) { calendar = [self clientObject]; baseCalDAVURL = nil; basePublicCalDAVURL = nil; reloadTasks = NO; } return self; } - (void) dealloc { [baseCalDAVURL release]; [basePublicCalDAVURL release]; [super dealloc]; } - (NSString *) calendarID { return [calendar folderReference]; } - (NSString *) calendarName { return [calendar displayName]; } - (void) setCalendarName: (NSString *) newName { [calendar renameTo: newName]; } - (NSString *) calendarColor { return [calendar calendarColor]; } - (void) setCalendarColor: (NSString *) newColor { [calendar setCalendarColor: newColor]; } - (BOOL) includeInFreeBusy { return [calendar includeInFreeBusy]; } - (void) setIncludeInFreeBusy: (BOOL) newInclude { [calendar setIncludeInFreeBusy: newInclude]; } - (BOOL) synchronizeCalendar { return [self mustSynchronize] || [calendar synchronizeCalendar]; } - (void) setSynchronizeCalendar: (BOOL) new { [calendar setSynchronizeCalendar: new]; } - (NSString *) originalCalendarSyncTag { return [calendar syncTag]; } - (NSString *) allCalendarSyncTags { SOGoUserSettings *settings; NSMutableDictionary *calendarSettings; NSMutableDictionary *syncTags; NSEnumerator *keysList; NSMutableArray *tags; NSString *key, *result; settings = [[context activeUser] userSettings]; calendarSettings = [settings objectForKey: @"Calendar"]; tags = nil; if (calendarSettings) { syncTags = [calendarSettings objectForKey: @"FolderSyncTags"]; if (syncTags) { tags = [NSMutableArray arrayWithCapacity: [syncTags count]]; keysList = [syncTags keyEnumerator]; while ((key = (NSString*)[keysList nextObject])) { if (![key isEqualToString: [calendar folderReference]]) [tags addObject: [syncTags objectForKey: key]]; } } } if (!tags) result = @""; else result = [tags componentsJoinedByString: @","]; return result; } - (BOOL) mustSynchronize { return [[calendar nameInContainer] isEqualToString: @"personal"]; } - (NSString *) calendarSyncTag { return [calendar syncTag]; } - (void) setCalendarSyncTag: (NSString *) newTag { [calendar setSyncTag: newTag]; } - (BOOL) showCalendarAlarms { return [calendar showCalendarAlarms]; } - (void) setShowCalendarAlarms: (BOOL) new { if (new != [calendar showCalendarAlarms]) reloadTasks = YES; [calendar setShowCalendarAlarms: new]; } - (BOOL) showCalendarTasks { return [calendar showCalendarTasks]; } - (void) setShowCalendarTasks: (BOOL) new { if (new != [calendar showCalendarTasks]) reloadTasks = YES; [calendar setShowCalendarTasks: new]; } - (BOOL) userIsOwner { NSString *userLogin; userLogin = [[context activeUser] login]; return ([userLogin isEqualToString: [calendar ownerInContext: context]]); } - (BOOL) isPublicAccessEnabled { // NOTE: This method is the same found in Common/UIxAclEditor.m return [[SOGoSystemDefaults sharedSystemDefaults] enablePublicAccess]; } - (BOOL) isWebCalendar { return ([calendar isKindOfClass: [SOGoWebAppointmentFolder class]]); } - (NSString *) webCalendarURL { return [calendar folderPropertyValueInCategory: @"WebCalendars"]; } - (void) setReloadOnLogin: (BOOL) newReloadOnLogin { if ([calendar respondsToSelector: @selector (setReloadOnLogin:)]) [(SOGoWebAppointmentFolder *) calendar setReloadOnLogin: newReloadOnLogin]; } - (BOOL) reloadOnLogin { BOOL rc; if ([calendar respondsToSelector: @selector (reloadOnLogin)]) rc = [(SOGoWebAppointmentFolder *) calendar reloadOnLogin]; else rc = NO; return rc; } - (BOOL) shouldTakeValuesFromRequest: (WORequest *) request inContext: (WOContext*) context { NSString *method; method = [[request uri] lastPathComponent]; return [method isEqualToString: @"saveProperties"]; } - (id ) savePropertiesAction { NSString *action; if (reloadTasks) action = @"refreshTasks()"; else action = nil; return [self jsCloseWithRefreshMethod: action]; } - (NSString *) _baseCalDAVURL { NSString *davURL; if (!baseCalDAVURL) { davURL = [[calendar realDavURL] absoluteString]; if ([davURL hasSuffix: @"/"]) baseCalDAVURL = [davURL substringToIndex: [davURL length] - 1]; else baseCalDAVURL = davURL; [baseCalDAVURL retain]; } return baseCalDAVURL; } - (NSString *) _basePublicCalDAVURL { NSString *davURL; if (!basePublicCalDAVURL) { davURL = [[calendar publicDavURL] absoluteString]; if ([davURL hasSuffix: @"/"]) basePublicCalDAVURL = [davURL substringToIndex: [davURL length] - 1]; else basePublicCalDAVURL = davURL; [basePublicCalDAVURL retain]; } return basePublicCalDAVURL; } - (NSString *) calDavURL { return [NSString stringWithFormat: @"%@/", [self _baseCalDAVURL]]; } - (NSString *) webDavICSURL { return [NSString stringWithFormat: @"%@.ics", [self _baseCalDAVURL]]; } - (NSString *) webDavXMLURL { return [NSString stringWithFormat: @"%@.xml", [self _baseCalDAVURL]]; } - (NSString *) publicCalDavURL { return [NSString stringWithFormat: @"%@/", [self _basePublicCalDAVURL]]; } - (NSString *) publicWebDavICSURL { return [NSString stringWithFormat: @"%@.ics", [self _basePublicCalDAVURL]]; } - (NSString *) publicWebDavXMLURL { return [NSString stringWithFormat: @"%@.xml", [self _basePublicCalDAVURL]]; } - (BOOL) notifyOnPersonalModifications { return [calendar notifyOnPersonalModifications]; } - (void) setNotifyOnPersonalModifications: (BOOL) b { [calendar setNotifyOnPersonalModifications: b]; } - (BOOL) notifyOnExternalModifications { return [calendar notifyOnExternalModifications]; } - (void) setNotifyOnExternalModifications: (BOOL) b { [calendar setNotifyOnExternalModifications: b]; } - (BOOL) notifyUserOnPersonalModifications { return [calendar notifyUserOnPersonalModifications]; } - (void) setNotifyUserOnPersonalModifications: (BOOL) b { [calendar setNotifyUserOnPersonalModifications: b]; } - (NSString *) notifiedUserOnPersonalModifications { return [calendar notifiedUserOnPersonalModifications]; } - (void) setNotifiedUserOnPersonalModifications: (NSString *) theUser { [calendar setNotifiedUserOnPersonalModifications: theUser]; } @end SOGo-2.1.1b/UI/Scheduler/UIxOccurenceDialog.m0000644000000000000000000000431312247657030017256 0ustar rootroot/* UIxOccurenceDialog.m - this file is part of SOGo * * Copyright (C) 2008 Inverse inc. * * 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 #import #import "UIxOccurenceDialog.h" @implementation UIxOccurenceDialog - (id) init { if ((self = [super init])) action = nil; return self; } - (void) dealloc { [action release]; [super dealloc]; } - (NSString *) action { return action; } - (NSString *) calendarFolder { SOGoCalendarComponent *component; component = [[self clientObject] container]; return [[component container] nameInContainer]; } - (NSString *) componentName { SOGoCalendarComponent *component; component = [[self clientObject] container]; return [component nameInContainer]; } - (NSString *) recurrenceName { return [[self clientObject] nameInContainer]; } - (id ) defaultAction { ASSIGN (action, @"edit"); return self; } - (id ) confirmDeletionAction { ASSIGN (action, @"delete"); return self; } - (id ) confirmAdjustmentAction { ASSIGN (action, @"adjust"); return self; } - (WOResponse *) deleteAction { SOGoCalendarComponent *component; WOResponse *response; component = [self clientObject]; response = (WOResponse *) [component prepareDelete]; if (!response) response = [self responseWithStatus: 204]; return response; } @end SOGo-2.1.1b/UI/Scheduler/UIxAppointmentEditor.h0000644000000000000000000000357112247657030017675 0ustar rootroot/* UIxAppointmentEditor.h - this file is part of SOGo * * Copyright (C) 2007-2013 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef UIXAPPOINTMENTEDITOR_H #define UIXAPPOINTMENTEDITOR_H #import @class iCalEvent; @class NSString; @interface UIxAppointmentEditor : UIxComponent { iCalEvent *event; BOOL isAllDay, isTransparent, sendAppointmentNotifications; NSCalendarDate *aptStartDate; NSCalendarDate *aptEndDate; NSString *item; SOGoAppointmentFolder *componentCalendar; SOGoDateFormatter *dateFormatter; } /* template values */ - (NSString *) saveURL; - (iCalEvent *) event; /* icalendar values */ - (void) setIsAllDay: (BOOL) newIsAllDay; - (BOOL) isAllDay; - (void) setIsTransparent: (BOOL) newIsOpaque; - (BOOL) isTransparent; - (void) setSendAppointmentNotifications: (BOOL) theBOOL; - (BOOL) sendAppointmentNotifications; - (void) setAptStartDate: (NSCalendarDate *) newAptStartDate; - (NSCalendarDate *) aptStartDate; - (void) setAptEndDate: (NSCalendarDate *) newAptEndDate; - (NSCalendarDate *) aptEndDate; - (NSString *) aptStartDateText; - (NSString *) aptStartDateTimeText; - (NSString *) aptEndDateTimeText; @end #endif /* UIXAPPOINTMENTEDITOR_H */ SOGo-2.1.1b/UI/Scheduler/SpanishSpain.lproj/0000755000000000000000000000000012247657030017150 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/SpanishSpain.lproj/Localizable.strings0000644000000000000000000004167412247657030023020 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Crear un nuevo evento"; "Create a new task" = "Crear una nueva tarea"; "Edit this event or task" = "Modificar éste evento o tarea"; "Delete this event or task" = "Borrar éste evento o tarea"; "Go to today" = "Ir a hoy"; "Switch to day view" = "Cambiar a vista diaria"; "Switch to week view" = "Cambiar a vista semanal"; "Switch to month view" = "Cambiar a vista mensual"; "Reload all calendars" = "Recargar todos los calendarios"; /* Tabs */ "Date" = "Fecha"; "Calendars" = "Calendarios"; /* Day */ "DayOfTheMonth" = "Día del mes"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "Hoy"; "Previous Day" = "Día anterior"; "Next Day" = "Próximo día"; /* Week */ "Week" = "Semana"; "this week" = "ésta semana"; "Week %d" = "Semana %d"; "Previous Week" = "Semana anterior"; "Next Week" = "Próxima semana"; /* Month */ "this month" = "éste mes"; "Previous Month" = "Mes anterior"; "Next Month" = "Próximo mes"; /* Year */ "this year" = "éste año"; /* Menu */ "Calendar" = "Calendario"; "Contacts" = "Contactos"; "New Calendar..." = "Nuevo calendario..."; "Delete Calendar" = "Borrar calendario"; "Unsubscribe Calendar" = "Darse de baja del calendario"; "Sharing..." = "Compartir..."; "Export Calendar..." = "Exportar calendario..."; "Import Events..." = "Importar Eventos..."; "Import Events" = "Importar Eventos"; "Select an iCalendar file (.ics)." = "Seleccionar un fichero iCalendar (.ics)."; "Upload" = "Cargar"; "Uploading" = "Cargando"; "Publish Calendar..." = "Publicar calendario..."; "Reload Remote Calendars" = "Recargar calendarios remotos"; "Properties" = "Propiedades"; "Done" = "Hecho"; "An error occurred while importing calendar." = "Ha ocurido un error mientras importaba el calendario."; "No event was imported." = "El evento no fue importado."; "A total of %{0} events were imported in the calendar." = "Un total de %{0} eventos fueron importados al calendario."; "Compose E-Mail to All Attendees" = "Crear correo para todos los asistentes"; "Compose E-Mail to Undecided Attendees" = "Crear correo para todos los asistentes indecisos"; /* Folders */ "Personal calendar" = "Calendario personal"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Prohibido"; /* acls */ "Access rights to" = "Derechos de accesos a"; "For user" = "Para usuario"; "Any Authenticated User" = "Cualquier Usuario Autenticado "; "Public Access" = "Acceso Público"; "label_Public" = "Público"; "label_Private" = "Privado"; "label_Confidential" = "Confidencial"; "label_Viewer" = "Ver todo"; "label_DAndTViewer" = "Ver fecha y hora"; "label_Modifier" = "Modificar"; "label_Responder" = "Responder a"; "label_None" = "Ninguno"; "View All" = "Ver todo"; "View the Date & Time" = "Ver fecha y hora"; "Modify" = "Modificar"; "Respond To" = "Responder a"; "None" = "Ninguno"; "This person can create objects in my calendar." = "Esta persona puede crear elementos en mi calendario."; "This person can erase objects from my calendar." = "Esta persona puede eliminar elementos de mi calendario."; /* Button Titles */ "Subscribe to a Calendar..." = "Darse de alta en un calendario..."; "Remove the selected Calendar" = "Borrar calendario seleccionado"; "Name of the Calendar" = "Nombre del calendario"; "new" = "Nuevo"; "printview" = "Vista previa"; "edit" = "Modificar"; "delete" = "Borrar"; "proposal" = "Propuesta"; "Save and Close" = "Guardar y cerrar"; "Close" = "Cerrar"; "Invite Attendees" = "Invitar asistentes"; "Attach" = "Adjuntar"; "Update" = "Actualizar"; "Cancel" = "Cancelar"; "show_rejected_apts" = "Mostrar citas rechazadas"; "hide_rejected_apts" = "Ocultar citas rechazadas"; /* Schedule */ "Schedule" = "Agenda"; "No appointments found" = "No hay eventos encontrados"; "Meetings proposed by you" = "Eventos propuestos por Ud."; "Meetings proposed to you" = "Eventos propuestos para Ud"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Acción"; "accept" = "Aceptar"; "decline" = "Rechazar"; "more attendees" = "Más asistentes"; "Hide already accepted and rejected appointments" = "Ocultar eventos ya confirmados o rechazados"; "Show already accepted and rejected appointments" = "Mostrar eventos ya confirmados o rechazados"; /* Appointments */ "Appointment viewer" = "Visor de eventos"; "Appointment editor" = "Editor de eventos"; "Appointment proposal" = "Propuesta de evento"; "Appointment on" = "Evento"; "Start:" = "Desde:"; "End:" = "Hasta:"; "Due Date:" = "Vencimiento:"; "Title:" = "Título:"; "Calendar:" = "Calendario:"; "Name" = "Nombre"; "Email" = "Correo"; "Status:" = "Estado:"; "% complete" = "% completo"; "Location:" = "Lugar:"; "Priority:" = "Prioridad:"; "Privacy" = "Privacidad"; "Cycle" = "Repetir"; "Cycle End" = "Fin repetición"; "Categories" = "Categorías"; "Classification" = "Privacidad"; "Duration" = "Duración"; "Attendees:" = "Asistentes:"; "Resources" = "Recursos"; "Organizer:" = "Organizador:"; "Description:" = "Descripción:"; "Document:" = "Documento:"; "Category:" = "Categoría:"; "Repeat:" = "Repetir:"; "Reminder:" = "Recordatorio:"; "General:" = "General:"; "Reply:" = "Responder:"; "Created by:" = "Creado por:"; "Target:" = "URL documento:"; "attributes" = "atributos"; "attendees" = "asistentes"; "delegated from" = "delegado de"; /* checkbox title */ "is private" = "es privado"; /* classification */ "Public" = "Público"; "Private" = "Privado"; /* text used in overviews and tooltips */ "empty title" = "Sin título"; "private appointment" = "Evento privado"; "Change..." = "Modificar..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Requiere acción"; "partStat_ACCEPTED" = "Asistiré"; "partStat_DECLINED" = "No asistiré"; "partStat_TENTATIVE" = "Lo confirmaré más tarde"; "partStat_DELEGATED" = "Delegado"; "partStat_OTHER" = "Otro"; /* Appointments (error messages) */ "Conflicts found!" = "Hay conflictos!"; "Invalid iCal data!" = "Datos iCal no válidos!"; "Could not create iCal data!" = "No se pueden crear datos en formato iCal!"; /* Searching */ "view_all" = "Todos los eventos"; "view_today" = "Hoy"; "view_next7" = "Próximos 7 días"; "view_next14" = "Próximos 14 días"; "view_next31" = "Próximos 31 días"; "view_thismonth" = "Este mes"; "view_future" = "Todos los eventos futuros"; "view_selectedday" = "Día seleccionado"; "View:" = "Ver:"; "Title or Description" = "Título o descripción"; "Search" = "Buscar"; "Search attendees" = "Buscar asistentes"; "Search resources" = "Buscar recursos"; "Search appointments" = "Buscar eventos"; "All day Event" = "Todo el día"; "check for conflicts" = "Buscar conflictos"; "Browse URL" = "Ir a URL"; "newAttendee" = "Añadir asistente"; /* calendar modes */ "Overview" = "Resumen"; "Chart" = "Tabla"; "List" = "Lista"; "Columns" = "Columnas"; /* Priorities */ "prio_0" = "No especificada"; "prio_1" = "Alta"; "prio_2" = "Alta"; "prio_3" = "Alta"; "prio_4" = "Alta"; "prio_5" = "Normal"; "prio_6" = "Baja"; "prio_7" = "Baja"; "prio_8" = "Baja"; "prio_9" = "Baja"; /* access classes (privacy) */ "PUBLIC_vevent" = "Evento público"; "CONFIDENTIAL_vevent" = "Evento confidencial"; "PRIVATE_vevent" = "Evento privado"; "PUBLIC_vtodo" = "Tarea pública"; "CONFIDENTIAL_vtodo" = "Tarea confidencial"; "PRIVATE_vtodo" = "Tarea privada"; /* status type */ "status_" = "No especifado"; "status_NOT-SPECIFIED" = "No specificado"; "status_TENTATIVE" = "Tentativo"; "status_CONFIRMED" = "Confirmado"; "status_CANCELLED" = "Cancelado"; "status_NEEDS-ACTION" = "Necesita intervención"; "status_IN-PROCESS" = "En proceso"; "status_COMPLETED" = "Completado"; /* Cycles */ "cycle_once" = "una repetición"; "cycle_daily" = "diariamente"; "cycle_weekly" = "semanalmente"; "cycle_2weeks" = "bisemanalmente"; "cycle_4weeks" = "cada 4 semanas"; "cycle_monthly" = "mensualmente"; "cycle_weekday" = "cada día laborable"; "cycle_yearly" = "anualmente"; "cycle_end_never" = "para siempre"; "cycle_end_until" = "hasta: "; "Recurrence pattern" = "Patrón de frecuencia"; "Range of recurrence" = "Rango de frecuencia"; "Repeat" = "Repetir"; "Daily" = "diariamente"; "Weekly" = "semanalmente"; "Monthly" = "mensualmente"; "Yearly" = "anualmente"; "Every" = "cada"; "Days" = "días"; "Week(s)" = "semana(s)"; "On" = "en"; "Month(s)" = "mes(es)"; "The" = "El"; "Recur on day(s)" = "Repetir en día(s)"; "Year(s)" = "año(s)"; "cycle_of" = "de"; "No end date" = "Sin fecha fin"; "Create" = "Crear"; "appointment(s)" = "evento(s)"; "Repeat until" = "Repetir hasta: "; "First" = "Primero"; "Second" = "Segundo"; "Third" = "Tercero"; "Fourth" = "Cuarto"; "Fift" = "Quinto"; "Last" = "Último"; /* Appointment categories */ "category_none" = "Ninguna"; "category_labels" = "Aniversario,Cumpleaños,Negocios,Llamadas,Clientes,Competición,Trabajo,Favoritos,Seguimiento,Regalos,Fiestas,Ideas,Reunión,Asuntos,Varios,Personal,Proyectos,Vacaciones públicas,Estado,Proveedores,Viajes,Vacaciones"; "repeat_NEVER" = "sin repetición"; "repeat_DAILY" = "diariamente"; "repeat_WEEKLY" = "semanalmente"; "repeat_BI-WEEKLY" = "bisemanalmente"; "repeat_EVERY WEEKDAY" = "cada día laborable"; "repeat_MONTHLY" = "mensualmente"; "repeat_YEARLY" = "anualmente"; "repeat_CUSTOM" = "personalizado..."; "reminder_NONE" = "Sin recordatorio"; "reminder_5_MINUTES_BEFORE" = "5 minutos antes"; "reminder_10_MINUTES_BEFORE" = "10 minutos antes"; "reminder_15_MINUTES_BEFORE" = "15 minutos antes"; "reminder_30_MINUTES_BEFORE" = "30 minutos antes"; "reminder_45_MINUTES_BEFORE" = "45 minutos antes"; "reminder_1_HOUR_BEFORE" = "1 hora antes"; "reminder_2_HOURS_BEFORE" = "2 horas antes"; "reminder_5_HOURS_BEFORE" = "5 horas antes"; "reminder_15_HOURS_BEFORE" = "15 horas antes"; "reminder_1_DAY_BEFORE" = "1 día antes"; "reminder_2_DAYS_BEFORE" = "2 días antes"; "reminder_1_WEEK_BEFORE" = "1 semana antes"; "reminder_CUSTOM" = "personalizado..."; "reminder_MINUTES" = "minutos"; "reminder_HOURS" = "horas"; "reminder_DAYS" = "dias"; "reminder_BEFORE" = "antes"; "reminder_AFTER" = "despues"; "reminder_START" = "el evento empieza"; "reminder_END" = "el evento termina"; "Reminder Details" = "Detalles del recordatorio"; "Choose a Reminder Action" = "Elegir una accion de recordatorio"; "Show an Alert" = "Mostrar un alerta"; "Send an E-mail" = "Enviar un correo"; "Email Organizer" = "Enviar correo al organizador"; "Email Attendees" = "Enviar correo a los asistentes"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Mostrar tiempo como disponible"; /* email notifications */ "Send Appointment Notifications" = "Enviar avisos de evento"; /* validation errors */ validate_notitle = "Sin título, ¿continuar?"; validate_invalid_startdate = "Fecha de inicio incorrecta"; validate_invalid_enddate = "Fecha de fin incorrecta"; validate_endbeforestart = "La fecha/hora de inicio es posterior a la de fin."; "Events" = "Eventos"; "Tasks" = "Tareas"; "Show completed tasks" = "Mostrar tareas completadas"; /* tabs */ "Task" = "Tarea"; "Event" = "Evento"; "Recurrence" = "Frecuencia"; /* toolbar */ "New Event" = "Nuevo evento"; "New Task" = "Nueva tarea"; "Edit" = "Modificar"; "Delete" = "Borrar"; "Go to Today" = "Ir a hoy"; "Day View" = "Vista diaria"; "Week View" = "Vista semanal"; "Month View" = "Vista mensual"; "Reload" = "Recargar"; "eventPartStatModificationError" = "Su estado de participación no puede ser actualizado."; /* menu */ "New Event..." = "Nuevo evento..."; "New Task..." = "Nueva tarea..."; "Edit Selected Event..." = "Modificar evento seleccionado..."; "Delete Selected Event" = "Borrar evento seleccionado"; "Select All" = "Seleccionar todo"; "Workweek days only" = "Sólo días laborables"; "Tasks in View" = "Mostrar tareas"; "eventDeleteConfirmation" = "Se eliminarán el/los siguiente(s) evento(s) : \n%{0}\n¿Desea proceder?"; "taskDeleteConfirmation" = "No se puede deshacer el borrado de esta tarea. ¿Desea continuar?"; "You cannot remove nor unsubscribe from your personal calendar." = "No se puede quitar ni darse de baja de su calendario personal."; "Are you sure you want to delete the calendar \"%{0}\"?" = "¿Está seguro/a que desea borrar el calendario \"%{0}\"?"; /* Legend */ "Participant" = "Asistente"; "Optional Participant" = "Asistentes opcionales"; "Non Participant" = "No Asistente"; "Chair" = "Presidente"; "Needs action" = "Requiere intervención"; "Accepted" = "Confirmada"; "Declined" = "Rechazada"; "Tentative" = "Tentativo"; "Free" = "Libre"; "Busy" = "Ocupado"; "Maybe busy" = "Posiblemente ocupado"; "No free-busy information" = "Sin información de disponibilidad."; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Proponer intervalo de tiempo:"; "Zoom:" = "Ampliación:"; "Previous slot" = "Intervalo anterior"; "Next slot" = "Intervalo siguiente"; "Previous hour" = "Hora anterior"; "Next hour" = "Hora siguiente"; "Work days only" = "Sólo día laboral"; "The whole day" = "El día entero"; "Between" = "entre"; "and" = "y"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Existe un conflicto de disponibilidad con uno o más asistentes.\n¿Quiere guardar ésta propuesta de todas formas?"; /* apt list */ "Title" = "Título"; "Start" = "Inicio"; "End" = "Fin"; "Due Date" = "Vencimiento"; "Location" = "Lugar"; "(Private Event)" = "(Evento privado)"; vevent_class0 = "(Evento público)"; vevent_class1 = "(Evento privado)"; vevent_class2 = "(Evento confidencial)"; "Priority" = "Prioridad"; "Category" = "Categoria"; vtodo_class0 = "(Tarea pública)"; vtodo_class1 = "(Tarea privada)"; vtodo_class2 = "(Tarea confidencial)"; "closeThisWindowMessage" = "¡Gracias! Ya puede cerrar esta ventana."; "Multicolumn Day View" = "Vista diaria multicolumna"; "Please select an event or a task." = "Seleccione un evento o tarea, por favor"; "editRepeatingItem" = "El elemento que está editando es un elemento repetitivo. ¿Quiere editar todas las apariciones o sólo la que ha señalado?"; "button_thisOccurrenceOnly" = "Sólo esta aparicion"; "button_allOccurrences" = "Todas las apariciones"; /* Properties dialog */ "Name:" = "Nombre:"; "Color:" = "Color:"; "Include in free-busy" = "Incluye en tiempo libre-ocupado"; "Synchronization" = "Sincronización"; "Synchronize" = "Sincroniza"; "Tag:" = "Redacción:"; "Display" = "Ver"; "Show alarms" = "Muestra alarmas"; "Show tasks" = "Muestra tareas"; "Notifications" = "Notificaciones"; "Receive a mail when I modify my calendar" = "Recibir un correo electrónico cuando modifico mi calendario"; "Receive a mail when someone else modifies my calendar" = "Recibir un correo electrónico cuando alguien distinto modifica mi calendario"; "When I modify my calendar, send a mail to:" = "Cuando modifico mi calendario, envir un correo electrónico a:"; "Links to this Calendar" = "Vínculos a éste calendario"; "Authenticated User Access" = "Acceso a usuario autenticado"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Por favor, especificar un valor númerico en el campo día superior o igual a 1."; "weekFieldInvalid" = "Por favor, especificar un valor númerico en el campo semana(s) superior o igual a 1."; "monthFieldInvalid" = "Por favor, especificar un valor númerico en el campo mes superior o igual a 1."; "monthDayFieldInvalid" = "Por favor, especificar un valor númerico en el campo día del mes superior o igual a 1."; "yearFieldInvalid" = "Por favor, especificar un valor númerico en el campo año superior o igual a 1."; "appointmentFieldInvalid" = "Por favor, especificar un valor númerico en el campo cita(s) superior o igual a 1."; "recurrenceUnsupported" = "Este tipo de frecuencia no esta soportado."; "Please specify a calendar name." = "Por favor, especifique el nombre del calendario."; "tagNotDefined" = "Tiene que especificar un marcador si quiere sincronizar este calendario."; "tagAlreadyExists" = "El marcador especificado ya esta asociado a otro calendario."; "tagHasChanged" = "Si cambia el marcador de este calendario, necesitara recargar los datos en su teléfono móvil.\n¿Continuar?"; "tagWasAdded" = "Si quiere sincronizar con este calendario, necesitara recargar los datos en su teléfono móvil.\n¿Continuar?"; "tagWasRemoved" = "Si quita este calendario de la sincronización, necesitará recargar los datos en su teléfono móvil.\n¿Continuar?"; "DestinationCalendarError" = "El calendario origen y el destino son iguales. Por favor, intente copiar a otro calendario."; "EventCopyError" = "La copia falló. Por favor, intente copiar a un calendario distinto."; "Open Task..." = "Abrir tarea..."; "Mark Completed" = "Marcar como completo"; "Delete Task" = "Borrar tarea"; "Delete Event" = "Borrar evento"; "Copy event to my calendar" = "Copiar evento a mi calendario"; "View Raw Source" = "Ver fuente Raw"; "Subscribe to a web calendar..." = "Subscribir a calendario Web..."; "URL of the Calendar" = "URL del calendario"; "Web Calendar" = "Calendario Web"; "Reload on login" = "Recargar al reconectar"; "Invalid number." = "número invalido."; "Please identify yourself to %{0}" = "Por favor, identificase con %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxTimeDateControl.m0000644000000000000000000001015112247657030017262 0ustar rootroot/* Copyright (C) 2004 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import #import #import #import #import #import #import "UIxTimeDateControl.h" @implementation UIxTimeDateControl - (id)init { self = [super init]; if (self) { displayTimeControl = YES; isDisabled = NO; } return self; } - (void)dealloc { [controlID release]; [label release]; [date release]; [time release]; [day release]; [month release]; [year release]; [super dealloc]; } /* accessors */ - (void)setControlID:(NSString *)_controlID { ASSIGNCOPY(controlID, _controlID); } - (NSString *)controlID { return controlID; } - (void)setLabel:(NSString *)_label { ASSIGNCOPY(label, _label); } - (NSString *)label { return label; } - (void) setDate: (NSCalendarDate *) _date { SOGoUserDefaults *ud; if (!_date) _date = [NSCalendarDate date]; ud = [[context activeUser] userDefaults]; [_date setTimeZone: [ud timeZone]]; [self _setDate: _date]; [self setTime: [_date descriptionWithCalendarFormat: @"%H:%M"]]; [self setYear: [NSNumber numberWithInt: [_date yearOfCommonEra]]]; [self setMonth: [NSNumber numberWithInt: [_date monthOfYear]]]; [self setDay: [NSNumber numberWithInt: [_date dayOfMonth]]]; } - (void)_setDate:(NSCalendarDate *)_date { ASSIGN(date, _date); } - (NSCalendarDate *)date { return date; } - (void) setTime: (NSString *)_time { ASSIGN(time, _time); } - (NSString *) time { return time; } - (void)setDay:(id)_day { ASSIGN(day, _day); } - (id)day { return day; } - (void)setMonth:(id)_month { ASSIGN(month, _month); } - (id)month { return month; } - (void)setYear:(id)_year { ASSIGN(year, _year); } - (id)year { return year; } - (NSString *) timeID { return [[self controlID] stringByAppendingString:@"_time"]; } - (NSString *) dateID { return [[self controlID] stringByAppendingString:@"_date"]; } - (void) setDisplayTimeControl: (BOOL) _displayTimeControl { displayTimeControl = _displayTimeControl; } - (BOOL) displayTimeControl { return displayTimeControl; } /* processing request */ - (void) takeValuesFromRequest: (WORequest *) _rq inContext: (WOContext *) _ctx { NSCalendarDate *d; unsigned _year, _month, _day, _hour, _minute;//, _second; SOGoUserDefaults *ud; NSArray *_time; /* call super, so that the form values are applied on the popups */ [super takeValuesFromRequest:_rq inContext:_ctx]; _year = [[self year] intValue]; if (_year > 0) { [self setTime: [_rq formValueForKey: [self timeID]]]; _month = [[self month] intValue]; _day = [[self day] intValue]; _time = [[self time] componentsSeparatedByString: @":"]; _hour = [[_time objectAtIndex: 0] intValue]; _minute = [[_time objectAtIndex: 1] intValue]; // _second = [[self second] intValue]; ud = [[context activeUser] userDefaults]; d = [NSCalendarDate dateWithYear: _year month: _month day: _day hour: _hour minute: _minute second: 0 timeZone: [ud timeZone]]; [self _setDate: d]; } } - (void) setDisabled: (BOOL) disabled { isDisabled = disabled; } - (BOOL) disabled { return isDisabled; } @end /* UIxTimeDateControl */ SOGo-2.1.1b/UI/Scheduler/bundle-info.plist0000644000000000000000000000040212247657030016676 0ustar rootroot{ "__cvs__" = "$Id: bundle-info.plist,v 1.1 2003/11/24 01:24:40 helge Exp $"; requires = { bundleManagerVersion = 1; classes = ( { name = NSObject; } ); }; provides = { classes = ( ); WOComponents = ( ); }; } SOGo-2.1.1b/UI/Scheduler/UIxAppointmentActions.h0000644000000000000000000000205712247657030020045 0ustar rootroot/* UIxAppointmentActions.h - this file is part of SOGo * * Copyright (C) 2010 Inverse inc. * * 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 UIXAPPOINTMENTACTIONS_H #define UIXAPPOINTMENTACTIONS_H #import @interface UIxAppointmentActions : WODirectAction @end #endif /* UIXAPPOINTMENTACTIONS_H */ SOGo-2.1.1b/UI/Scheduler/cycles.plist0000644000000000000000000000105712247657030015765 0ustar rootroot( { "label" = "cycle_once"; }, { "label" = "cycle_daily"; "rule" = "FREQ=DAILY"; }, { "label" = "cycle_weekly"; "rule" = "FREQ=WEEKLY"; }, { "label" = "cycle_2weeks"; "rule" = "FREQ=WEEKLY;INTERVAL=2"; }, { "label" = "cycle_4weeks"; "rule" = "FREQ=WEEKLY;INTERVAL=4"; }, { "label" = "cycle_monthly"; "rule" = "FREQ=MONTHLY"; }, { "label" = "cycle_weekday"; "rule" = "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"; }, { "label" = "cycle_yearly"; "rule" = "FREQ=YEARLY"; } )SOGo-2.1.1b/UI/Scheduler/UIxCalUserRightsEditor.h0000644000000000000000000000336212247657030020114 0ustar rootroot/* UIxCalUserRightsEditor.h - this file is part of SOGo * * Copyright (C) 2007 Inverse inc. * * 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 UIXCALUSERRIGHTSEDITOR_H #define UIXCALUSERRIGHTSEDITOR_H #import @class NSArray; @class NSString; @class NSMutableDictionary; @interface UIxCalUserRightsEditor : UIxUserRightsEditor { NSString *currentRight; NSString *currentRightType; NSMutableDictionary *rights; } - (NSArray *) objectRights; - (void) setCurrentRight: (NSString *) newCurrentRight; - (NSString *) currentRight; - (NSArray *) rightTypes; - (void) setCurrentRightType: (NSString *) newCurrentRightType; - (NSString *) currentRightType; - (NSString *) currentRightTypeLabel; - (NSString *) currentRightTypeName; - (NSString *) currentRightSelection; - (void) setUserCanCreateObjects: (BOOL) userCanCreateObjects; - (BOOL) userCanCreateObjects; - (void) setUserCanEraseObjects: (BOOL) userCanEraseObjects; - (BOOL) userCanEraseObjects; @end #endif /* UIXCALUSERRIGHTSEDITOR_H */ SOGo-2.1.1b/UI/Scheduler/Dutch.lproj/0000755000000000000000000000000012247657027015625 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Dutch.lproj/Localizable.strings0000644000000000000000000004206412247657027021467 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Maak een nieuwe gebeurtenis"; "Create a new task" = "Maak een nieuwe taak"; "Edit this event or task" = "Bewerk deze gebeurtenis of taak"; "Delete this event or task" = "Verwijder deze gebeurtenis of taak"; "Go to today" = "Naar vandaag gaan"; "Switch to day view" = "Overschakelen naar dagweergave"; "Switch to week view" = "Overschakelen naar weekweergave"; "Switch to month view" = "Overschakelen naar maandweergave"; "Reload all calendars" = "Alle agenda's herladen"; /* Tabs */ "Date" = "Datum"; "Calendars" = "Agenda's"; /* Day */ "DayOfTheMonth" = "Dag van de maand"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "vandaag"; "Previous Day" = "Vorige dag"; "Next Day" = "Volgende dag"; /* Week */ "Week" = "Week"; "this week" = "deze week"; "Week %d" = "Week %d"; "Previous Week" = "Vorige week"; "Next Week" = "Volgende week"; /* Month */ "this month" = "deze maand"; "Previous Month" = "Vorige maand"; "Next Month" = "Volgende maand"; /* Year */ "this year" = "dit jaar"; /* Menu */ "Calendar" = "Agenda"; "Contacts" = "Adresboek"; "New Calendar..." = "Nieuwe agenda..."; "Delete Calendar" = "Agenda verwijderen"; "Unsubscribe Calendar" = "Afmelden van agenda"; "Sharing..." = "Delen..."; "Export Calendar..." = "Agenda exporteren..."; "Import Events..." = "Gebeurtenissen importeren..."; "Import Events" = "Gebeurtenissen importeren"; "Select an iCalendar file (.ics)." = "Selecteer een iCalendar-bestand (.ics)."; "Upload" = "Uploaden"; "Uploading" = "Uploaden"; "Publish Calendar..." = "Agenda publiceren..."; "Reload Remote Calendars" = "Externe agenda herladen"; "Properties" = "Instellingen"; "Done" = "Klaar"; "An error occurred while importing calendar." = "Er is een fout opgetreden bij het importeren van de kalender."; "No event was imported." = "Geen enkele gebeurtenis werd geïmporteerd."; "A total of %{0} events were imported in the calendar." = "Een totaal van %{0} gebeurtenissen werd geïmporteerd in de kalender."; "Compose E-Mail to All Attendees" = "E-mail aan alle deelnemers opstellen"; "Compose E-Mail to Undecided Attendees" = "E-mail aan deelnemers opstellen die nog niet hebben gereageerd"; /* Folders */ "Personal calendar" = "Persoonlijke agenda"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Toegang geweigerd"; /* acls */ "Access rights to" = "Toegangsrechten voor"; "For user" = "Voor gebruiker"; "Any Authenticated User" = "Elke geauthenticeerde gebruiker"; "Public Access" = "Publieke toegang"; "label_Public" = "Publiek"; "label_Private" = "Privaat"; "label_Confidential" = "Vertrouwelijk"; "label_Viewer" = "Alles inzien"; "label_DAndTViewer" = "Alleen datum & tijd inzien"; "label_Modifier" = "Aanpassen"; "label_Responder" = "Reageren op"; "label_None" = "Geen toegang"; "View All" = "Alles inzien"; "View the Date & Time" = "Alleen datum & tijd inzien"; "Modify" = "Aanpassen"; "Respond To" = "Reageren op"; "None" = "Geen toegang"; "This person can create objects in my calendar." = "Deze persoon mag afspraken in mijn agenda plaatsen."; "This person can erase objects from my calendar." = "Deze persoon mag afspraken verwijderen uit mijn agenda."; /* Button Titles */ "Subscribe to a Calendar..." = "Abonneren op een agenda..."; "Remove the selected Calendar" = "Agenda verwijderen"; "Name of the Calendar" = "Naam van de agenda"; "new" = "Nieuw"; "printview" = "Afdrukvoorbeeld"; "edit" = "Aanpassen"; "delete" = "Verwijderen"; "proposal" = "Voorstel"; "Save and Close" = "Opslaan en sluiten"; "Close" = "Sluiten"; "Invite Attendees" = "Deelnemers uitnodigen"; "Attach" = "Koppelen"; "Update" = "Opslaan"; "Cancel" = "Annuleren"; "show_rejected_apts" = "Geweigerde afspraken weergeven"; "hide_rejected_apts" = "Geweigerde afspraken verbergen"; /* Schedule */ "Schedule" = "Planning"; "No appointments found" = "Geen afspraken gevonden"; "Meetings proposed by you" = "Door u voorgestelde vergaderingen"; "Meetings proposed to you" = "Aan u voorgestelde vergaderingen"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Actie"; "accept" = "Accepteren"; "decline" = "Weigeren"; "more attendees" = "Andere deelnemers"; "Hide already accepted and rejected appointments" = "Reeds geaccepteerde/geweigerde afspraken verbergen"; "Show already accepted and rejected appointments" = "Reeds geaccepteerde/geweigerde afspraken weergeven"; /* Appointments */ "Appointment viewer" = "Afspraak inzien"; "Appointment editor" = "Afspraak aanpassen"; "Appointment proposal" = "Afspraak voorstellen"; "Appointment on" = "Afspraak op"; "Start:" = "Begin:"; "End:" = "Einde:"; "Due Date:" = "Verloopdatum:"; "Title:" = "Titel:"; "Calendar:" = "Agenda:"; "Name" = "Naam"; "Email" = "E-mail"; "Status:" = "Status:"; "% complete" = "% voltooid"; "Location:" = "Plaats:"; "Priority:" = "Prioriteit:"; "Privacy" = "Privacy"; "Cycle" = "Herhalen"; "Cycle End" = "Einde herhaling"; "Categories" = "Categoriën"; "Classification" = "Classificatie"; "Duration" = "Duur"; "Attendees:" = "Deelnemers:"; "Resources" = "Middelen"; "Organizer:" = "Organisator:"; "Description:" = "Omschrijving:"; "Document:" = "Document:"; "Category:" = "Categorie:"; "Repeat:" = "Herhalen:"; "Reminder:" = "Alarm:"; "General:" = "Algemeen:"; "Reply:" = "Antwoord:"; "Created by:" = "Aangemaakt door:"; "Target:" = "Bestemming:"; "attributes" = "attributen"; "attendees" = "deelnemers"; "delegated from" = "gedelegeerd van"; /* checkbox title */ "is private" = "is privé"; /* classification */ "Public" = "Publiek"; "Private" = "Privé"; /* text used in overviews and tooltips */ "empty title" = "geen titel"; "private appointment" = "Privé-afspraak"; "Change..." = "Aanpassen..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Actie vereist"; "partStat_ACCEPTED" = "Ik zal aanwezig zijn"; "partStat_DECLINED" = "Ik zal niet aanwezig zijn"; "partStat_TENTATIVE" = "Ik zal later bevestigen"; "partStat_DELEGATED" = "Ik delegeer"; "partStat_OTHER" = "Anders"; /* Appointments (error messages) */ "Conflicts found!" = "Er zijn een of meerdere conflicten gevonden."; "Invalid iCal data!" = "Ongeldige iCal data..."; "Could not create iCal data!" = "Kon geen iCal data aanmaken..."; /* Searching */ "view_all" = "Alle afspraken"; "view_today" = "Vandaag"; "view_next7" = "Afspraken in de volgende 7 dagen"; "view_next14" = "Afspraken in de volgende 14 dagen"; "view_next31" = "Afspraken in de volgende 31 dagen"; "view_thismonth" = "Afspraken in deze kalendermaand"; "view_future" = "Alle toekomstige afspraken"; "view_selectedday" = "Afspraken op de geselecteerde dag"; "View:" = "Bekijken:"; "Title or Description" = "Titel of omschrijving"; "Search" = "Zoeken"; "Search attendees" = "Deelnemers zoeken"; "Search resources" = "Middelen zoeken"; "Search appointments" = "Afspraken zoeken"; "All day Event" = "Afspraak duurt de hele dag"; "check for conflicts" = "Op conflicten controleren"; "Browse URL" = "Naar URL gaan"; "newAttendee" = "Voeg deelnemer toe"; /* calendar modes */ "Overview" = "Overzicht"; "Chart" = "Tabel"; "List" = "Lijst"; "Columns" = "Kolommen"; /* Priorities */ "prio_0" = "Niet opgegeven"; "prio_1" = "Zeer hoog"; "prio_2" = "Hoog"; "prio_3" = "Hoog"; "prio_4" = "Hoog"; "prio_5" = "Gemiddeld"; "prio_6" = "Laag"; "prio_7" = "Laag"; "prio_8" = "Laag"; "prio_9" = "Zeer laag"; /* access classes (privacy) */ "PUBLIC_vevent" = "Publieke afspraak"; "CONFIDENTIAL_vevent" = "Vertrouwelijke afspraak"; "PRIVATE_vevent" = "Privé-afspraak"; "PUBLIC_vtodo" = "Publieke taak"; "CONFIDENTIAL_vtodo" = "Vertrouwelijke taak"; "PRIVATE_vtodo" = "Privétaak"; /* status type */ "status_" = "Niet opgegeven"; "status_NOT-SPECIFIED" = "Niet opgegeven"; "status_TENTATIVE" = "Onder voorbehoud"; "status_CONFIRMED" = "Bevestigd"; "status_CANCELLED" = "Geannuleerd"; "status_NEEDS-ACTION" = "Actie vereist"; "status_IN-PROCESS" = "In behandeling"; "status_COMPLETED" = "Voltooid"; /* Cycles */ "cycle_once" = "herhaalt zich niet"; "cycle_daily" = "dagelijks"; "cycle_weekly" = "wekelijks"; "cycle_2weeks" = "twee-wekelijks"; "cycle_4weeks" = "vier-wekelijks"; "cycle_monthly" = "maandelijks"; "cycle_weekday" = "op werkdagen"; "cycle_yearly" = "jaarlijks"; "cycle_end_never" = "Herhaal oneindig vaak"; "cycle_end_until" = "Herhalen tot:"; "Recurrence pattern" = "Herhalingsschema"; "Range of recurrence" = "Herhalingsbereik"; "Repeat" = "Herhalen"; "Daily" = "Dagelijks"; "Weekly" = "Wekelijks"; "Monthly" = "Maandelijks"; "Yearly" = "Jaarlijks"; "Every" = "Iedere"; "Days" = "Dagen"; "Week(s)" = "Weken"; "On" = "Op"; "Month(s)" = "Maand"; "The" = "De"; "Recur on day(s)" = "Herhaling op dagen"; "Year(s)" = "Jaren"; "cycle_of" = "van"; "No end date" = "Geen einddatum"; "Create" = "Aanmaken"; "appointment(s)" = "afspraken"; "Repeat until" = "Herhalen tot"; "First" = "Eerste"; "Second" = "Tweede"; "Third" = "Derde"; "Fourth" = "Vierde"; "Fift" = "Vijfde"; "Last" = "Laatste"; /* Appointment categories */ "category_none" = "Geen categorie"; "category_labels" = "Cliënten,Concurrentie,Diversen,Favorieten,Giften,Ideeën,Klant,Kwesties,Leveranciers,Nationale feestdag,Persoonlijk,Projecten,Meeting,Reizen,Status,Telefoongesprekken,Trouwdag,Vakantie,Verjaardag,Vervolggesprek,Vrije dagen,Zaken"; "repeat_NEVER" = "herhaalt zich niet"; "repeat_DAILY" = "dagelijks"; "repeat_WEEKLY" = "wekelijks"; "repeat_BI-WEEKLY" = "tweewekelijks"; "repeat_EVERY WEEKDAY" = "op werkdagen"; "repeat_MONTHLY" = "maandelijks"; "repeat_YEARLY" = "jaarlijks"; "repeat_CUSTOM" = "aangepast..."; "reminder_NONE" = "Geen herinnering"; "reminder_5_MINUTES_BEFORE" = "5 minuten van tevoren"; "reminder_10_MINUTES_BEFORE" = "10 minuten van tevoren"; "reminder_15_MINUTES_BEFORE" = "15 minuten van tevoren"; "reminder_30_MINUTES_BEFORE" = "30 minuten van tevoren"; "reminder_45_MINUTES_BEFORE" = "45 minuten van tevoren"; "reminder_1_HOUR_BEFORE" = "1 uur van tevoren"; "reminder_2_HOURS_BEFORE" = "2 uren van tevoren"; "reminder_5_HOURS_BEFORE" = "5 uren van tevoren"; "reminder_15_HOURS_BEFORE" = "15 uren van tevoren"; "reminder_1_DAY_BEFORE" = "1 dag van tevoren"; "reminder_2_DAYS_BEFORE" = "2 dagen van tevoren"; "reminder_1_WEEK_BEFORE" = "1 week van tevoren"; "reminder_CUSTOM" = "aangepast..."; "reminder_MINUTES" = "minuten"; "reminder_HOURS" = "uren"; "reminder_DAYS" = "dagen"; "reminder_BEFORE" = "voor"; "reminder_AFTER" = "na"; "reminder_START" = "De gebeurtenis start"; "reminder_END" = "de gebeurtenis eindigt"; "Reminder Details" = "Details van de herinnering"; "Choose a Reminder Action" = "Kies een herinneringsactie"; "Show an Alert" = "Toon een waarschuwing"; "Send an E-mail" = "Stuur een E-mail"; "Email Organizer" = "E-mail organisator"; "Email Attendees" = "E-mail deelnemers"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Toon tijd als vrij"; /* email notifications */ "Send Appointment Notifications" = "Stuur afspraakmeldingen"; /* validation errors */ validate_notitle = "U heeft geen titel opgegeven. Wilt u doorgaan?"; validate_invalid_startdate = "Ongeldige begindatum!"; validate_invalid_enddate = "Ongeldige einddatum!"; validate_endbeforestart = "Het einde is voor de begindatum."; "Events" = "Afspraken"; "Tasks" = "Taken"; "Show completed tasks" = "Voltooide taken weergeven"; /* tabs */ "Task" = "Taak"; "Event" = "Afspraak"; "Recurrence" = "Herhaling"; /* toolbar */ "New Event" = "Nieuwe afspraak"; "New Task" = "Nieuwe taak"; "Edit" = "Aanpassen"; "Delete" = "Verwijderen"; "Go to Today" = "Ga naar vandaag"; "Day View" = "Dagoverzicht"; "Week View" = "Weekoverzicht"; "Month View" = "Maandoverzicht"; "Reload" = "Herlaad"; "eventPartStatModificationError" = "Uw participatiestatus kon niet worden gewijzigd."; /* menu */ "New Event..." = "Nieuwe afspraak..."; "New Task..." = "Nieuwe taak..."; "Edit Selected Event..." = "Afspraak aanpassen..."; "Delete Selected Event" = "Afspraak verwijderen..."; "Select All" = "Alles selecteren"; "Workweek days only" = "Alleen werkdagen weergeven"; "Tasks in View" = "Taken in binnen het zicht"; "eventDeleteConfirmation" = "Weet u zeker dat u de volgende afspraken wilt verwijderen?\n%{0}"; "taskDeleteConfirmation" = "Weet u zeker dat u de volgende taken wilt verwijderen?\n%{0}"; "You cannot remove nor unsubscribe from your personal calendar." = "U kunt niet uw persoonlijke agenda verwijderen of opzeggen."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Weet u zeker dat u de agenda \"%{0}\" wilt verwijderen?"; /* Legend */ "Participant" = "Deelnemer"; "Optional Participant" = "Gewenste deelnemer"; "Non Participant" = "Geen deelnemer"; "Chair" = "Voorzitter"; "Needs action" = "Actie vereist"; "Accepted" = "Geaccepteerd"; "Declined" = "Geweigerd"; "Tentative" = "Onder voorbehoud"; "Free" = "Beschikbaar"; "Busy" = "Bezet"; "Maybe busy" = "Waarschijnlijk bezet"; "No free-busy information" = "Geen beschikbaarheidsinformatie"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Tijdvak voorstellen:"; "Zoom:" = "Zoom:"; "Previous slot" = "Vorige"; "Next slot" = "Volgende"; "Previous hour" = "Vorig uur"; "Next hour" = "Volgend uur"; "Work days only" = "Alleen op werkdagen"; "The whole day" = "De hele dag"; "Between" = "Tussen"; "and" = "en"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Een tijdsconflict bestaat met een of meer deelnemers.\nWilt u toch de huidige instellingen houden?"; /* apt list */ "Title" = "Titel"; "Start" = "Begin"; "End" = "Eind"; "Due Date" = "Verloopdatum"; "Location" = "Plaats"; "(Private Event)" = "(Privé-afspraak)"; vevent_class0 = "(Publieke afspraak)"; vevent_class1 = "(Privé-afspraak)"; vevent_class2 = "(Vertrouwelijke afspraak)"; "Priority" = "Prioriteit"; "Category" = "Categorie"; vtodo_class0 = "(Publieke taak)"; vtodo_class1 = "(Privétaak)"; vtodo_class2 = "(Vertrouwelijke taak)"; "closeThisWindowMessage" = "Hartelijk bedankt. U kunt dit venster nu sluiten."; "Multicolumn Day View" = "Meerkolommige dagweergave"; "Please select an event or a task." = "Selecteer een afspraak of een taak."; "editRepeatingItem" = "Het item dat u bewerkt is een herhalend item. Wilt u alle items of enkel dit item bewerken?"; "button_thisOccurrenceOnly" = "Enkel dit item"; "button_allOccurrences" = "Alle herhalingen"; /* Properties dialog */ "Name:" = "Naam:"; "Color:" = "Kleur:"; "Include in free-busy" = "In de beschikbaarheid insluiten"; "Synchronization" = "Synchronisatie"; "Synchronize" = "Synchroniseren"; "Tag:" = "Markering:"; "Display" = "Tonen"; "Show alarms" = "Alarmen tonen"; "Show tasks" = "Taken tonen"; "Notifications" = "Notificaties"; "Receive a mail when I modify my calendar" = "Ontvang een e-mail als ik mijn agenda verander"; "Receive a mail when someone else modifies my calendar" = "Ontvang een e-mail als iemand anders mijn agenda verandert"; "When I modify my calendar, send a mail to:" = "Als ik mijn agenda verader, stuur een e-mail naar:"; "Links to this Calendar" = "Koppelingen naar deze agenda"; "Authenticated User Access" = "Toegang voor geauthenticeerde gebruikers"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Vul een numerieke waarde in het veld Dagen in groter dan of gelijk aan 1."; "weekFieldInvalid" = "Vul een numerieke waarde in het Week/Weken veld groter of gelijk aan 1."; "monthFieldInvalid" = "Vul een numerieke waarde in het Maand(en) veld groter of gelijk aan 1."; "monthDayFieldInvalid" = "Vul een numerieke waarde in het maand dag veld groter of gelijk aan 1."; "yearFieldInvalid" = "Vul een numerieke waarde in het Jaar/Jaren veld groter of gelijk aan 1."; "appointmentFieldInvalid" = "Vul een numerieke waarde in het Afspraken veld groter of gelijk aan 1."; "recurrenceUnsupported" = "Dit soort herhaling wordt op dit moment niet ondersteund."; "Please specify a calendar name." = "Geef een agendanaam op."; "tagNotDefined" = "U moet een tag opgeven als u deze agenda wil synchroniseren."; "tagAlreadyExists" = "De tag die u hebt opgegeven is al gekoppeld aan een andere agenda.."; "tagHasChanged" = "Als u uw agenda-tag wijzigt, moet u de gegevens opnieuw te laden op uw mobiele apparaat.\nDoorgaan?"; "tagWasAdded" = "Wilt u deze agenda synchroniseren, dan moet u de gegevens opnieuw laden op uw mobiele apparaat.\nDoorgaan?"; "tagWasRemoved" = "Als u deze agenda wil verwijderen van de synchronisatie, moet u de gegevens opnieuw laden op uw mobiele apparaat.\nDoorgaan?"; "DestinationCalendarError" = "De bron en bestemming agenda's zijn hetzelfde. Probeer te kopiëren naar een andere agenda."; "EventCopyError" = "De kopie is mislukt. Probeer te kopiëren naar een verschil-agenda."; "Open Task..." = "Taak openen..."; "Mark Completed" = "Markeren als voltooid"; "Delete Task" = "Taak verwijderen"; "Delete Event" = "Afspraak verwijderen"; "Copy event to my calendar" = "Kopieer gebeurtenis naar mijn agenda"; "View Raw Source" = "Bekijk broncode"; "Subscribe to a web calendar..." = "Abonneren op een web-agenda..."; "URL of the Calendar" = "URL van de Agenda"; "Web Calendar" = "Web Agenda"; "Reload on login" = "Herladen bij inloggen"; "Invalid number." = "Ongeldig nummer."; "Please identify yourself to %{0}" = "Identificeer u alstublieft tegenover %{0}"; SOGo-2.1.1b/UI/Scheduler/Icelandic.lproj/0000755000000000000000000000000012247657030016423 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Icelandic.lproj/Localizable.strings0000644000000000000000000004162412247657030022266 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Búa til nýjan viðburð"; "Create a new task" = "Búa til nýtt verkefni"; "Edit this event or task" = "Breyta þessum viðburði eða verkefni"; "Delete this event or task" = "Eyða þessum viðburði eða verkefni"; "Go to today" = "Skoða daginn í dag"; "Switch to day view" = "Skifta í dagasýn"; "Switch to week view" = "Skifta í vikusýn"; "Switch to month view" = "Skifta í mánaðarsýn"; "Reload all calendars" = "Sækja öll dagatöl aftur"; /* Tabs */ "Date" = "Dagsetning"; "Calendars" = "Dagatöl"; /* Day */ "DayOfTheMonth" = "Dagur mánaðarins"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "à dag"; "Previous Day" = "Fyrri dagur"; "Next Day" = "Næsti dagur"; /* Week */ "Week" = "Vika"; "this week" = "þessi vika"; "Week %d" = "Vika %d"; "Previous Week" = "Fyrri vika"; "Next Week" = "Næsta vika"; /* Month */ "this month" = "þessi mánuður"; "Previous Month" = "Fyrri mánuður"; "Next Month" = "Næsti mánuður"; /* Year */ "this year" = "þetta ár"; /* Menu */ "Calendar" = "Dagatal"; "Contacts" = "Tengiliðir"; "New Calendar..." = "Nýtt dagatal..."; "Delete Calendar" = "Eyða dagatali..."; "Unsubscribe Calendar" = "Segja upp áskrift að dagatali"; "Sharing..." = "Samnýting..."; "Export Calendar..." = "Flytja dagatal út..."; "Import Events..." = "Flytja inn viðburði..."; "Import Events" = "Flytja inn viðburði"; "Select an iCalendar file (.ics)." = "Velja iCalendar skrá (.ics)."; "Upload" = "Hala upp"; "Publish Calendar..." = "Gefa dagatal út..."; "Reload Remote Calendars" = "Reload Remote Calendars"; "Properties" = "Eiginleikar"; "Done" = "Ljúka"; "An error occurred while importing calendar." = "Villa kom upp þegar dagatalið var flutt inn."; "No event was imported." = "Enginn viðburður var fluttur inn."; "A total of %{0} events were imported in the calendar." = "Alls voru %{0} viðburðir fluttir inn í dagatalið."; "Compose E-Mail to All Attendees" = "Skrifa tölvubréf til allra þáttakenda"; "Compose E-Mail to Undecided Attendees" = "Skrifa tölvubréf til þáttakenda sem ekki hafa ákveðið sig"; /* Folders */ "Personal calendar" = "Einkadagatal"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Bannað"; /* acls */ "User rights for:" = "Notandanréttindi fyrir:"; "Any Authenticated User" = "Sérhvern innskráðan notanda"; "Public Access" = "Opinber aðgangur"; "label_Public" = "Almennt"; "label_Private" = "Heima"; "label_Confidential" = "Leynilegt"; "label_Viewer" = "Skoða allt"; "label_DAndTViewer" = "Skoða dagsetninguna og tímann"; "label_Modifier" = "Breyta"; "label_Responder" = "Svara til"; "label_None" = "Engin"; "View All" = "Skoða allt"; "View the Date & Time" = "Skoða dagsetninguna og tímann"; "Modify" = "Breyta"; "Respond To" = "Svara til"; "None" = "Engin"; "This person can create objects in my calendar." = "Þessi manneskja getur búið til viðföng í dagatalinu mínu."; "This person can erase objects from my calendar." = "Þessi manneskja getur eytt viðföngum úr dagatalinu mínu."; /* Button Titles */ "New Calendar..." = "Nýtt dagatal..."; "Subscribe to a Calendar..." = "Gerast áskrifandi að dagatali..."; "Remove the selected Calendar" = "Fjarlægja valið dagatal"; "Name of the Calendar" = "Heiti dagatalsins"; "new" = "Nýtt"; "printview" = "Prenta sýn"; "edit" = "Breyta"; "delete" = "Eyða"; "proposal" = "Tillaga"; "Save and Close" = "Vista og loka"; "Close" = "Loka"; "Invite Attendees" = "Bjóða þáttakendum"; "Attach" = "Setja inn"; "Update" = "Uppfæra"; "Cancel" = "Hætta við"; "show_rejected_apts" = "Sýna tímapantanir sem hefur verið hafnað"; "hide_rejected_apts" = "Fela tímapantanir sem hefur verið hafnað"; /* Schedule */ "Schedule" = "Skipulag/Dagbók"; "No appointments found" = "Engar tímapantanir fundust"; "Meetings proposed by you" = "Tillögur um fundi sem þú hefur lagt fram"; "Meetings proposed to you" = "Tillögur um fundi sem þú hefur fengið"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Aðgerð"; "accept" = "Samþykkja"; "decline" = "Hafna"; "more attendees" = "Fleiri þáttakendur"; "Hide already accepted and rejected appointments" = "Fela tímapantanir sem þegar eru samþykktar eða hefur verið hafnað"; "Show already accepted and rejected appointments" = "Sýna tímapantanir sem þegar eru samþykktar eða hefur verið hafnað"; /* Appointments */ "Appointment viewer" = "Skoða tímapantanir"; "Appointment editor" = "Sýsla með tímapantanir"; "Appointment proposal" = "Tillaga um tímapöntun"; "Appointment on" = "Tímapöntun á"; "Start:" = "Byrjun:"; "End:" = "Endir:"; "Due Date:" = "Lokadagur:"; "Title:" = "Titill:"; "Calendar:" = "Dagatal:"; "Name" = "Nafn"; "Email" = "Tölvupóstur"; "Status:" = "Staða:"; "% complete" = "% lokið"; "Location:" = "Staðsetning:"; "Priority:" = "Mikilvægi:"; "Privacy" = "Friðhelgi"; "Cycle" = "Cycle"; "Cycle End" = "Cycle End"; "Categories" = "Flokkar"; "Classification" = "Classification"; "Duration" = "Tímalengd"; "Attendees:" = "Þáttakendur:"; "Resources" = "Tilföng"; "Organizer:" = "Skipuleggjandi:"; "Description:" = "Lýsing:"; "Document:" = "Skjal:"; "Category:" = "Flokkun:"; "Repeat:" = "Endurtaka:"; "Reminder:" = "Ãminning:"; "General:" = "Almennt:"; "Reply:" = "Reply:"; "Target:" = "Target:"; "attributes" = "attributes"; "attendees" = "þáttakendur"; "delegated from" = "Skipaður fulltrúi var"; /* checkbox title */ "is private" = "er í einkaeigu"; /* classification */ "Public" = "Almennt"; "Private" = "Heima"; /* text used in overviews and tooltips */ "empty title" = "Ãn titils"; "private appointment" = "Stefnumót"; "Change..." = "Breyta..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Ég staðfesti seinna"; "partStat_ACCEPTED" = "Ég tek þátt"; "partStat_DECLINED" = "Ég tek ekki þátt"; "partStat_TENTATIVE" = "Ég tek kannski þátt"; "partStat_DELEGATED" = "Ég skipa fulltrúa"; "partStat_OTHER" = "Annað"; /* Appointments (error messages) */ "Conflicts found!" = "Conflicts found!"; "Invalid iCal data!" = "Ógild ICal gögn!"; "Could not create iCal data!" = "Ekki tókst að búa til iCal gögn!"; /* Searching */ "view_all" = "Allar"; "view_today" = "à dag"; "view_next7" = "Næstu 7 dagar"; "view_next14" = "Næstu 14 dagar"; "view_next31" = "Næsti 31 dagur"; "view_thismonth" = "Þessi mánuður"; "view_future" = "Allir framtíðarviðburðir"; "view_selectedday" = "Valinn Dagur"; "View:" = "Sýn:"; "Title or Description" = "Titill eða Lýsing"; "Search" = "Leita"; "Search attendees" = "Leita að þáttakendum"; "Search resources" = "Leita í tilföngum:"; "Search appointments" = "Leita í tímapöntunum"; "All day Event" = "Heilsdagsviðburður"; "check for conflicts" = "Athuga með árekstra"; "Browse URL" = "Browse URL"; "newAttendee" = "Bæta þáttakanda við"; /* calendar modes */ "Overview" = "Yfirlit"; "Chart" = "Línurit"; "List" = "Listi"; "Columns" = "Dálkar"; /* Priorities */ "prio_0" = "Ótilgreint"; "prio_1" = "Hátt"; "prio_2" = "Hátt"; "prio_3" = "Hátt"; "prio_4" = "Hátt"; "prio_5" = "Venjulegur"; "prio_6" = "Lágt"; "prio_7" = "Lágt"; "prio_8" = "Lágt"; "prio_9" = "Lágt"; /* access classes (privacy) */ "PUBLIC_vevent" = "Almennur viðburður"; "CONFIDENTIAL_vevent" = "Einkaviðburður"; "PRIVATE_vevent" = "Viðburður er trúnaðarmál"; "PUBLIC_vtodo" = "Almennt verkefni"; "CONFIDENTIAL_vtodo" = "Verkefni er trúnaðarmál"; "PRIVATE_vtodo" = "Einkaverkefni"; /* status type */ "status_" = "Ótilgreint"; "status_NOT-SPECIFIED" = "Ótilgreint"; "status_TENTATIVE" = "Til bráðabirgða"; "status_CONFIRMED" = "Staðfest"; "status_CANCELLED" = "Aflýst"; "status_NEEDS-ACTION" = "nauðsynlegt að aðhafast"; "status_IN-PROCESS" = "à vinnslu"; "status_COMPLETED" = "Lokið á"; /* Cycles */ "cycle_once" = "cycle_once"; "cycle_daily" = "cycle_daily"; "cycle_weekly" = "cycle_weekly"; "cycle_2weeks" = "cycle_2weeks"; "cycle_4weeks" = "cycle_4weeks"; "cycle_monthly" = "cycle_monthly"; "cycle_weekday" = "cycle_weekday"; "cycle_yearly" = "cycle_yearly"; "cycle_end_never" = "cycle_end_never"; "cycle_end_until" = "cycle_end_until"; "Recurrence pattern" = "Endurtekningarmynstur"; "Range of recurrence" = "Endurtekningartímabil"; "Repeat" = "Endurtaka"; "Daily" = "Daglega"; "Weekly" = "Vikulega"; "Monthly" = "Mánaðalega"; "Yearly" = "Ãrlega"; "Every" = "Hverjar"; "Days" = "Dagar"; "Week(s)" = "Vika/Vikur"; "On" = "á"; "Month(s)" = "Mánuður(ir)"; "The" = "þann"; "Recur on day(s)" = "Endurtekið á degi/dögum"; "Year(s)" = "Ãr"; "cycle_of" = "af"; "No end date" = "Engin lokadagsetning"; "Create" = "Búðu til"; "appointment(s)" = "tímapöntun/tímapantanir"; "Repeat until" = "Endurtaka þar til"; "First" = "Fyrsta"; "Second" = "Næsta"; "Third" = "Þriðja"; "Fourth" = "Fjórða"; "Fift" = "Fimmta"; "Last" = "Síðasta"; /* Appointment categories */ "category_none" = "Engin"; "category_labels" = "Ãrdagur,Afmælisdagur,Viðskipti,Símtöl,Skjólstæðingar,Samkeppni,Viðskiptavinur,Uppáhald,Eftirfylgni,Gjafir,Helgidagar,Hugmyndir,Fundur,Úrlausnarefni,Ãmislegt,Persónulegt,Verkefni,Almenn Frí,Staða,Birgjar,Ferðalög,Frí"; "repeat_NEVER" = "Ekki endurtekið"; "repeat_DAILY" = "Daglega"; "repeat_WEEKLY" = "Vikulega"; "repeat_BI-WEEKLY" = "Aðra hverja viku"; "repeat_EVERY WEEKDAY" = "Hvern vikudag"; "repeat_MONTHLY" = "Mánaðalega"; "repeat_YEARLY" = "Ãrlega"; "repeat_CUSTOM" = "Sérsniðið..."; "reminder_NONE" = "Engin áminning"; "reminder_5_MINUTES_BEFORE" = "5 mínútum áður"; "reminder_10_MINUTES_BEFORE" = "10 mmínútum áður"; "reminder_15_MINUTES_BEFORE" = "15 mmínútum áður"; "reminder_30_MINUTES_BEFORE" = "30 mínútum áður"; "reminder_45_MINUTES_BEFORE" = "45 mínútum áður"; "reminder_1_HOUR_BEFORE" = "1 klukkustund áður"; "reminder_2_HOURS_BEFORE" = "2 klukkustundum áður"; "reminder_5_HOURS_BEFORE" = "5 klukkustundum áður"; "reminder_15_HOURS_BEFORE" = "15 klukkustundum áður"; "reminder_1_DAY_BEFORE" = "1 degi áður"; "reminder_2_DAYS_BEFORE" = "2 dögum áður"; "reminder_1_WEEK_BEFORE" = "1 viku áður"; "reminder_CUSTOM" = "Sérsniðið..."; "reminder_MINUTES" = "mínútur"; "reminder_HOURS" = "klst."; "reminder_DAYS" = "daga"; "reminder_BEFORE" = "áður"; "reminder_AFTER" = "eftir"; "reminder_START" = "viðburðurinn byrjar"; "reminder_END" = "viðburðurinn endar"; "Reminder Details" = "Reminder Details"; "Choose a Reminder Action" = "Velja aðgerð við áminningu"; "Show an Alert" = "Sýna viðvörun"; "Send an E-mail" = "Senda tölvubréf"; "Email Organizer" = "Senda til skipuleggjanda"; "Email Attendees" = "Senda þáttakendum"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Sýna sem lausan tíma"; /* validation errors */ validate_notitle = "Enginn titill gefinn, halda áfram?"; validate_invalid_startdate = "Byrjunardagsetning er ekki rétt!"; validate_invalid_enddate = "Lokadagsetning er ekki rétt!"; validate_endbeforestart = "Lokadagurinn sem er tilgreindur, er fyrr en byrjunardagurinn."; "Tasks" = "Verkefni"; "Show completed tasks" = "Sýna verkefni sem hefur verið lokið"; /* tabs */ "Task" = "Verkefni"; "Event" = "Atburður"; "Recurrence" = "Endurtekning"; /* toolbar */ "New Event" = "Nýr viðburður"; "New Task" = "Nýtt verkefni"; "Edit" = "Breyta"; "Delete" = "Eyða"; "Go to Today" = "Skoða daginn í dag"; "Day View" = "Dagasýn"; "Week View" = "Vikusýn"; "Month View" = "Mánaðarsýn"; "Reload" = "Endurnýja"; "eventPartStatModificationError" = "Ekki var hægt að breyta þáttökustöðu þinni."; /* menu */ "New Event..." = "Nýr viðburður..."; "New Task..." = "Nýtt verkefni..."; "Edit Selected Event..." = "Sýsla með valinn Viðburð..."; "Delete Selected Event" = "Eyða völdum viðburði"; "Select All" = "Velja allt"; "Workweek days only" = "Aðeins vinnudagar"; "Tasks in View" = "Sýnd verkefni"; "eventDeleteConfirmation" = "Eftirfarandi viðburði/viðburðum verður eytt: \n%{0}\nViltu halda áfram?"; "taskDeleteConfirmation" = "Eftirfarandi verkefni/verkefnum verður eytt: \n%{0}\nViltu halda áfram?"; "You cannot remove nor unsubscribe from your personal calendar." = "Ekki er hægt að fjarlægja eða segja upp áskrift að sínu eigin persónulega dagatali."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Ertu viss um að þú viljir eyða dagatalinu \"%{0}\"?"; /* Legend */ "Participant" = "Þáttakandi"; "Optional Participant" = "viðstaddur/viðstödd"; "Non Participant" = "Engir þáttakendur"; "Chair" = "Stjórnandi"; "Needs action" = "nauðsynlegt að aðhafast"; "Accepted" = "Samþykkt"; "Declined" = "Hafnað"; "Tentative" = "Til bráðabirgða"; "Free" = "Laust"; "Busy" = "Upptekið"; "Maybe busy" = "Kannski upptekið"; "No free-busy information" = "Engar upplýsingar um lausan og upptekinn tíma"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Stinga upp á tímabili"; "Zoom:" = "Stækkun:"; "Previous slot" = "Fyrra tímabil"; "Next slot" = "Næsta tímabil"; "Previous hour" = "Fyrri klst."; "Next hour" = "Næsta klst."; "Work days only" = "Aðeins vinnudagar"; "The whole day" = "Allan daginn"; "Between" = "Milli"; "and" = "og"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Ãrekstur við tíma hjá einum eða fleiri þáttakendum.\nEiga núverandi stillingar vera óbreyttar?"; /* apt list */ "Title" = "Titill"; "Start" = "Byrjun"; "End" = "Endir"; "Due Date" = "Lokadagur"; "Location" = "Staðsetning"; "(Private Event)" = "(Einkaviðburður)"; vevent_class0 = "(Almennur viðburður)"; vevent_class1 = "(Einkaviðburður)"; vevent_class2 = "(Viðburður er trúnaðarmál)"; vtodo_class0 = "(Almennt verkefni)"; vtodo_class1 = "(Einkaverkefni)"; vtodo_class2 = "(Verkefni er trúnaðarmál)"; "closeThisWindowMessage" = "Takk fyrir! Þú getur nú lokað þessum glugga og skoðan annann glugga "; "Multicolumn Day View" = "Dagsýn í fleiri dálkum"; "Please select an event or a task." = "Hér þarf að velja viðburð eða verkefni."; "editRepeatingItem" = "Viðburðurinn eða verkefnið sem verið er að breyta, endurtekur sig reglulega. à að breyta öllum endurtekningum eða bara þessu eina atviki?"; "button_thisOccurrenceOnly" = "Einungis þessu atviki"; "button_allOccurrences" = "Öllum atvikum"; /* Properties dialog */ "Name:" = "Nafn:"; "Color:" = "Litur:"; "Include in free-busy" = "Taka með í upplýsingum um lausan og upptekin tíma"; "Synchronization" = "Samstilling"; "Synchronize" = "Samstilla"; "Tag:" = "Tag:"; "Display" = "Sýna"; "Show alarms" = "Sýna vekjara"; "Show tasks" = "Sýna verkefni"; "Links to this Calendar" = "Tenglar í þetta dagatal"; "Authenticated User Access" = "Aðgangur fyrir sannvottaðan notanda"; "CalDAV URL" = "CalDAV URL"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Hér þarf að tilgreina fyrir Dagana, tölugildi sem er 1 eða stærra."; "weekFieldInvalid" = "Hér þarf að tilgreina fyrir vikuna/vikurnar tölugildi sem er 1 eða stærra."; "monthFieldInvalid" = "Hér þarf að tilgreina fyrir mánuðinn/mánuðina, tölugildi sem er 1 eða stærra."; "monthDayFieldInvalid" = "Hér þarf að tilgreina fyrir mánaðardag tölugildi sem er 1 eða stærra."; "yearFieldInvalid" = "Hér þarf að tilgreina fyrir árið/árin, tölugildi sem er 1 eða stærra."; "appointmentFieldInvalid" = "Hér þarf að tilgreina fyrir tímapantanir, tölugildi sem er 1 eða stærra."; "recurrenceUnsupported" = "Þessa tegund endurtekningar er ekki hægt að styðja enn sem komið er."; "Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Þú þarft að tilgreina merki ef þú vilt samhæfa þetta dagatal."; "tagAlreadyExists" = "Merkið sem þú tilgreindir er nú þegar bendlað við annað dagatal."; "tagHasChanged" = "Ef þú breytir merkingunni á dagatalinu þínu, þarftu að endurhlaða gögnum inn á farsíman þinn.\nHalda áfram?"; "tagWasAdded" = "Ef þú vilt samhæfa þetta dagatal, þarftu að endurhlaða gögnum inn á farsíman þinn.\nHalda áfram?"; "tagWasRemoved" = "Ef þú tekur þetta dagatali úr samhæfingu, þarftu að endurhlaða gögnum inn á farsíman þinn.\nHalda áfram?"; "DestinationCalendarError" = "Upphafið og ákvörðunarstaðurinn á dagatölunum er sá sami. Betra væri að afrita gögn yfir í annað dagatal."; "EventCopyError" = "Afritun mistókst. Það væri reynandi að afrita í annað dagatal."; "Open Task..." = "Opna Verkefni..."; "Mark Completed" = "Merkja sem lokið"; "Delete Task" = "Eyða verkefni"; "Delete Event" = "Eyða viðburði"; "Copy event to my calendar" = "Afrita viðburð í mitt dagatal"; "Subscribe to a web calendar..." = "Gerast áskrifandi að vefdagatali"; "URL of the Calendar" = "URL dagatalsins"; "Web Calendar" = "Vefdagatal"; "Reload on login" = "Sækja allt aftur við innskráningu"; "Invalid number." = "Ógild tala."; "Category" = "Flokkun"; "Priority" = "Mikilvægi"; SOGo-2.1.1b/UI/Scheduler/Toolbars/0000755000000000000000000000000012247657030015210 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Toolbars/SOGoTaskObject.toolbar0000644000000000000000000000076612247657030021366 0ustar rootroot( /* the toolbar groups -*-cperl-*- */ ( { link = "#"; label = "Save and Close"; onclick = "return saveEvent();"; image = "tb-compose-save-flat-24x24.png"; }, { link = "#"; hasMenu = YES; label = "Privacy"; onclick = "return onSelectClassification(event);"; image = "tb-compose-security-flat-24x24.png"; }, { link = "#"; label = "Attach"; onclick = "return onPopupAttachWindow();"; image = "tb-compose-attach-flat-24x24.png"; } ) ) SOGo-2.1.1b/UI/Scheduler/Toolbars/SOGoAppointmentObject.toolbar0000644000000000000000000000122512247657030022751 0ustar rootroot( /* the toolbar groups -*-cperl-*- */ ( { link = "#"; label = "Save and Close"; onclick = "return saveEvent();"; image = "tb-compose-save-flat-24x24.png"; }, { link = "#"; label = "Invite Attendees"; onclick = "return onPopupAttendeesWindow();"; image = "tb-compose-contacts-flat-24x24.png"; }, { link = "#"; hasMenu = YES; label = "Privacy"; onclick = "return onSelectClassification(event);"; image = "tb-compose-security-flat-24x24.png"; }, { link = "#"; label = "Attach"; onclick = "return onPopupAttachWindow();"; image = "tb-compose-attach-flat-24x24.png"; } ) ) SOGo-2.1.1b/UI/Scheduler/Toolbars/SOGoAppointmentObjectAcceptOrDecline.toolbar0000644000000000000000000000057012247657030025660 0ustar rootroot( /* the toolbar groups -*-cperl-*- */ ( { link = "#"; isSafe = NO; label = "accept"; onclick = "return modifyEvent(this, 'accept');"; image = "tb-ab-properties-flat-24x24.png"; }, { link = "#"; isSafe = NO; label = "decline"; onclick = "return modifyEvent(this, 'decline');"; image = "tb-mail-stop-flat-24x24.png"; } ) ) SOGo-2.1.1b/UI/Scheduler/Toolbars/SOGoAppointmentObjectDecline.toolbar0000644000000000000000000000032012247657030024230 0ustar rootroot( /* the toolbar groups -*-cperl-*- */ ( { link = "#"; isSafe = NO; label = "decline"; onclick = "return modifyEvent(this, 'decline');"; image = "tb-mail-stop-flat-24x24.png"; } ) ) SOGo-2.1.1b/UI/Scheduler/Toolbars/SOGoEmpty.toolbar0000644000000000000000000000005112247657030020416 0ustar rootroot( /* the toolbar groups -*-cperl-*- */ ) SOGo-2.1.1b/UI/Scheduler/Toolbars/SOGoComponentClose.toolbar0000644000000000000000000000030712247657030022254 0ustar rootroot( /* the toolbar groups -*-cperl-*- */ ( { link = "#"; isSafe = NO; label = "Close"; onclick = "window.close(); return false;"; image = "tb-mail-stop-flat-24x24.png"; } ) ) SOGo-2.1.1b/UI/Scheduler/Toolbars/SOGoAppointmentFolders.toolbar0000644000000000000000000000315112247657030023141 0ustar rootroot( /* the toolbar groups -*-java-*- */ ( { link = "#"; isSafe = NO; label = "New Event"; onclick = "return newEvent('event');"; image = "new-event.png"; tooltip = "Create a new event"; }, { link = "#"; label="New Task"; image = "new-task.png"; onclick = "return newEvent('task');"; image = "new-task.png"; tooltip = "Create a new task"; } ), ( { link = "#"; label="Go to Today"; onclick = "return gotoToday();"; image = "goto-today.png"; tooltip = "Go to today"; } ), ( { link = "#"; label="Day View"; onclick = "return onDayOverview();"; image = "day-view.png"; tooltip = "Switch to day view"; }, /* disabled until we fix the view */ /* { link = "#"; label="Multicolumn Day View"; onclick = "return onMulticolumnDayOverview();"; image = "day-view-multicolumn.png"; tooltip = ""; }, */ { link = "#"; label="Week View"; onclick = "return onWeekOverview();"; image = "week-view.png"; tooltip = "Switch to week view"; }, { link = "#"; label="Month View"; onclick = "return onMonthOverview();"; image = "month-view.png"; tooltip = "Switch to month view"; } ), ( { link = "#"; label="Delete"; onclick = "return deleteEvent(this);"; image = "tb-mail-delete-flat-24x24.png"; tooltip = "Delete this event or task"; } ), ( { link = "#"; label = "Reload"; onclick = "return onCalendarReload();"; image = "calendar-reload.png"; tooltip = "Reload all calendars"; } ) ) SOGo-2.1.1b/UI/Scheduler/Toolbars/SOGoAppointmentObjectAccept.toolbar0000644000000000000000000000032212247657030024066 0ustar rootroot( /* the toolbar groups -*-cperl-*- */ ( { link = "#"; isSafe = NO; label = "accept"; onclick = "return modifyEvent(this, 'accept');"; image = "tb-ab-properties-flat-24x24.png"; } ) ) SOGo-2.1.1b/UI/Scheduler/Arabic.lproj/0000755000000000000000000000000012247657027015737 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Arabic.lproj/Localizable.strings0000644000000000000000000005016512247657027021602 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "إنشاء حدث جديد"; "Create a new task" = "إنشاء مهمة جديدة"; "Edit this event or task" = "تحرير هذا الحدث أو المهمة"; "Delete this event or task" = "حذ٠هذا الحدث أو المهمة"; "Go to today" = "انتقل إلى اليوم"; "Switch to day view" = "التبديل إلى طريقة عرض اليوم"; "Switch to week view" = "التبديل إلى طريقة عرض الأسبوع"; "Switch to month view" = "التبديل إلى طريقة عرض الشهر"; "Reload all calendars" = "تحديث جميع التقاويم"; /* Tabs */ "Date" = "تاريخ"; "Calendars" = "تقاويم"; /* Day */ "DayOfTheMonth" = "يوم من الشهر"; "dayLabelFormat" = "%m/%d/%Y"; "today" = "اليوم"; "Previous Day" = "اليوم السابق"; "Next Day" = "اليوم اللاحق"; /* Week */ "Week" = "اسبوع"; "this week" = "هذا الاسبوع"; "Week %d" = "أسبوع %d"; "Previous Week" = "الأسبوع السابق"; "Next Week" = "الأسبوع القادم"; /* Month */ "this month" = "هذا الشهر"; "Previous Month" = "الشهر السابق"; "Next Month" = "الشهر القادم"; /* Year */ "this year" = "هذه السنة"; /* Menu */ "Calendar" = "تقويم"; "Contacts" = "جهة اتصال"; "New Calendar..." = "تقويم جديد..."; "Delete Calendar" = "إلغاء تقويم..."; "Unsubscribe Calendar" = "إلغاء مشاركة تقويم"; "Sharing..." = "مشاركة..."; "Export Calendar..." = "تصدير التقويم ..."; "Import Events..." = "استيراد الأحداث ..."; "Import Events" = "استيراد الأحداث"; "Select an iCalendar file (.ics)." = "إختار مل٠iCalendar file (.ics)."; "Upload" = "تحميل"; "Uploading" = "تحميل"; "Publish Calendar..." = "نشر التقويم ..."; "Reload Remote Calendars" = "تحديث التقويمات من خادم أخر"; "Properties" = "خصائص"; "Done" = "تم"; "An error occurred while importing calendar." = "حدث خطأ أثناء استيراد تقويم."; "No event was imported." = "لم يتم استيراد أي حدث."; "A total of %{0} events were imported in the calendar." = "ما مجموعه%{0} من الأحداث تم استيرادها ÙÙŠ التقويم."; "Compose E-Mail to All Attendees" = "إنشاء رسالة بريد إلكتروني لجميع الحاضرين"; "Compose E-Mail to Undecided Attendees" = "إنشاء رسالة بريد إلكتروني الى الحضور الغير مؤكد حضورهم."; /* Folders */ "Personal calendar" = "تقويم شخصي"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "ممنوع"; /* acls */ "Access rights to" = "صلاحية الدخول الى"; "For user" = "للمستخدم"; "Any Authenticated User" = "أي مستخدم مسجل"; "Public Access" = "وصول عام"; "label_Public" = "عام"; "label_Private" = "خاص"; "label_Confidential" = "سري"; "label_Viewer" = "عرض الكل"; "label_DAndTViewer" = "عرض التاريخ والوقت"; "label_Modifier" = "تعديل"; "label_Responder" = "الاستجابة الى"; "label_None" = "لا شئ"; "View All" = "عرض الكل"; "View the Date & Time" = "عرض التاريخ والوقت"; "Modify" = "تعديل"; "Respond To" = "الاستجابة الى"; "None" = "لا شئ"; "This person can create objects in my calendar." = "يمكن لهذا الشخص إنشاء الكائنات ÙÙŠ تقويمي."; "This person can erase objects from my calendar." = "يمكن لهذا الشخص مسح الكائنات ÙÙŠ تقويمي."; /* Button Titles */ "Subscribe to a Calendar..." = "اشترك ÙÙŠ تقويم"; "Remove the selected Calendar" = "مسح التقويم المحدد"; "Name of the Calendar" = "اسم التقويم"; "new" = "جديد"; "printview" = "معاينة قبل الطباعة"; "edit" = "تعديل"; "delete" = "مسح"; "proposal" = "اقتراح"; "Save and Close" = "Ø­ÙØ¸ وإغلاق"; "Close" = "إغلاق"; "Invite Attendees" = "دعوة لمشاركين"; "Attach" = "Ø¥Ø±ÙØ§Ù‚"; "Update" = "تحديث"; "Cancel" = "إلغاء"; "show_rejected_apts" = "إظهار المواعيد المرÙوضة"; "hide_rejected_apts" = "Ø¥Ø®ÙØ§Ø¡ المواعيد المرÙوضة"; /* Schedule */ "Schedule" = "جدول"; "No appointments found" = "لا يوجد مواعيد"; "Meetings proposed by you" = "الاجتماعات التي اقترحتها"; "Meetings proposed to you" = "الاجتماعات التي اقترحت لك"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "تصرÙ"; "accept" = "قبول"; "decline" = "Ø±ÙØ¶"; "more attendees" = "مزيد من الحضور"; "Hide already accepted and rejected appointments" = "Ø¥Ø®ÙØ§Ø¡ المواعيد المقبولة والمرÙوضة"; "Show already accepted and rejected appointments" = "إظهار المواعيد المقبولة والمرÙوضة"; /* Appointments */ "Appointment viewer" = "عارض المواعيد"; "Appointment editor" = "محرر المواعيد"; "Appointment proposal" = "اقتراح المواعيد"; "Appointment on" = "تشغيل المواعيد"; "Start:" = "البدء:"; "End:" = "النهاية:"; "Due Date:" = "تاريخ الاستحقاق:"; "Title:" = "العنوان:"; "Calendar:" = "الحالة:"; "Name" = "الاسم"; "Email" = "البريد الإلكتروني"; "Status:" = "الحالة:"; "% complete" = "اكتمل %c"; "Location:" = "المكان:"; "Priority:" = "الأولوية:"; "Privacy" = "الخصوصية"; "Cycle" = "الدورة"; "Cycle End" = "نهاية الدورة"; "Categories" = "Ø§Ù„ØªØµÙ†ÙŠÙØ§Øª"; "Classification" = "التصنيÙ"; "Duration" = "المدة"; "Attendees:" = "الحضور:"; "Resources" = "الموارد"; "Organizer:" = "المنظم:"; "Description:" = "الوصÙ:"; "Document:" = "المستند:"; "Category:" = "التصنيÙ:"; "Repeat:" = "التكرار:"; "Reminder:" = "التنبيه:"; "General:" = "العام:"; "Reply:" = "الرد:"; "Target:" = "الهدÙ:"; "attributes" = "ØµÙØ§Øª"; "attendees" = "حضور"; "delegated from" = "Ù…Ùوض من"; /* checkbox title */ "is private" = "خاص؟"; /* classification */ "Public" = "عام"; "Private" = "خاص"; /* text used in overviews and tooltips */ "empty title" = "عنوان ÙØ§Ø±Øº"; "private appointment" = "موعد خاص"; "Change..." = "ØºÙŠÙ‘ÙØ± ..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "سأؤكد الأمر لاحقًا"; "partStat_ACCEPTED" = "Ø³Ø£Ø­Ø¶ÙØ±"; "partStat_DECLINED" = "لن Ø£Ø­Ø¶ÙØ±"; "partStat_TENTATIVE" = "قد Ø£Ø­Ø¶ÙØ±"; "partStat_DELEGATED" = "Ø£ÙÙˆÙ‘ÙØ¶"; "partStat_OTHER" = "أخرى"; /* Appointments (error messages) */ "Conflicts found!" = "هنالك تعارضات!"; "Invalid iCal data!" = "بيانات iCal غير صالح!"; "Could not create iCal data!" = "Ø¹Ø§Ø¬ÙØ² عن إنشاء بيانات iCal!"; /* Searching */ "view_all" = "الكل"; "view_today" = "اليوم"; "view_next7" = "السبعة أيام القادمة"; "view_next14" = "الأربعة عشر يومًا القادمة"; "view_next31" = "الواحد وثلاثون يومًا القادمة"; "view_thismonth" = "هذا الشهر"; "view_future" = "جميع الأحداث المستقبلية"; "view_selectedday" = "اليوم المحدد"; "View:" = "العرض:"; "Title or Description" = "العنوان أو الوصÙ"; "Search" = "ابحث"; "Search attendees" = "ابحث عن الحضور"; "Search resources" = "ابحث عن الموارد"; "Search appointments" = "ابحث عن المواعيد"; "All day Event" = "حدث طوال اليوم"; "check for conflicts" = "Ø§ÙØ­Øµ التعارضات"; "Browse URL" = "ØªØµÙØ­ عنوان الويب"; "newAttendee" = "أضÙ٠أحد الحضور"; /* calendar modes */ "Overview" = "رؤية عامة"; "Chart" = "المخطط"; "List" = "القائمة"; "Columns" = "الأعمدة"; /* Priorities */ "prio_0" = "غير محدد"; "prio_1" = "Ù…Ø±ØªÙØ¹Ø©"; "prio_2" = "Ù…Ø±ØªÙØ¹Ø©"; "prio_3" = "Ù…Ø±ØªÙØ¹Ø©"; "prio_4" = "Ù…Ø±ØªÙØ¹Ø©"; "prio_5" = "عادية"; "prio_6" = "Ù…Ù†Ø®ÙØ¶Ø©"; "prio_7" = "Ù…Ù†Ø®ÙØ¶Ø©"; "prio_8" = "Ù…Ù†Ø®ÙØ¶Ø©"; "prio_9" = "Ù…Ù†Ø®ÙØ¶Ø©"; /* access classes (privacy) */ "PUBLIC_vevent" = "حدث عام"; "CONFIDENTIAL_vevent" = "حدث سري"; "PRIVATE_vevent" = "حدث خاص"; "PUBLIC_vtodo" = "مهمة عامة"; "CONFIDENTIAL_vtodo" = "مهمة سرية"; "PRIVATE_vtodo" = "مهمة خاصة"; /* status type */ "status_" = "غير محدد"; "status_NOT-SPECIFIED" = "غير محدد"; "status_TENTATIVE" = "مؤقت"; "status_CONFIRMED" = "مؤكد"; "status_CANCELLED" = "Ù…Ùلغَى"; "status_NEEDS-ACTION" = "يحتاج٠إجراءًا"; "status_IN-PROCESS" = "يتم العمل Ùيه"; "status_COMPLETED" = "اكتمل ÙÙŠ"; /* Cycles */ "cycle_once" = "دورة واحدة"; "cycle_daily" = "دورة يومية"; "cycle_weekly" = "دورة أسبوعية"; "cycle_2weeks" = "دورة كل أسبوعين"; "cycle_4weeks" = "دورة كل 4 أسابيع"; "cycle_monthly" = "دورة شهريّة"; "cycle_weekday" = "دورة يومًا كل أسبوع"; "cycle_yearly" = "دورة سنوية"; "cycle_end_never" = "دورة لا تنتهي"; "cycle_end_until" = "دورة تنتهي ÙÙŠ"; "Recurrence pattern" = "نمط التكرار"; "Range of recurrence" = "نطاق التكرار"; "Repeat" = "التكرار"; "Daily" = "يوميًا"; "Weekly" = "أسبوعيًا"; "Monthly" = "شهريًّا"; "Yearly" = "سنويًّا"; "Every" = "كل"; "Days" = "أيام"; "Week(s)" = "أسبوع (أسابيع)"; "On" = "ÙØ¹Ù‘ÙÙ„"; "Month(s)" = "شهر (شهور)"; "The" = "الـ"; "Recur on day(s)" = "يتكرر ÙÙŠ يوم/أيام"; "Year(s)" = "عام (أعوام)"; "cycle_of" = "من"; "No end date" = "لا يوجد تاريخ نهائي"; "Create" = "أنشئ"; "appointment(s)" = "موعد/مواعيد"; "Repeat until" = "تكرار حتى"; "First" = "الأول"; "Second" = "الثاني"; "Third" = "الثالث"; "Fourth" = "الرابع"; "Fift" = "الخامس"; "Last" = "الأخير"; /* Appointment categories */ "category_none" = "بلا"; "category_labels" = "السنوية,يوم الميلاد,الأعمال,المكالمات,العملاء,Ø§Ù„Ù…Ù†Ø§ÙØ³Ø©,العميل,Ø§Ù„Ù…ÙØ¶Ù„ات,المتابعة,الهدايا,العطلات،الأÙكار,الاجتماع,المشاكل,منوعات,شخصي,المشاريع,العطلة العامة,الحالة,الموردون,Ø§Ù„Ø³ÙØ±,الأجازة"; "repeat_NEVER" = "لا ØªÙƒØ±Ù‘ÙØ±"; "repeat_DAILY" = "يوميًا"; "repeat_WEEKLY" = "أسبوعيًّا"; "repeat_BI-WEEKLY" = "كل أسبوعين"; "repeat_EVERY WEEKDAY" = "يوم كل أسبوع"; "repeat_MONTHLY" = "شهريًّا"; "repeat_YEARLY" = "سنويًّا"; "repeat_CUSTOM" = "مخصص..."; "reminder_NONE" = "لا تنبيه"; "reminder_5_MINUTES_BEFORE" = "5 دقائق قبل"; "reminder_10_MINUTES_BEFORE" = "10 دقائق قبل"; "reminder_15_MINUTES_BEFORE" = "15 دقيقة قبل"; "reminder_30_MINUTES_BEFORE" = "30 دقيقة قبل"; "reminder_45_MINUTES_BEFORE" = "45 دقيقة قبل"; "reminder_1_HOUR_BEFORE" = "1 ساعة قبل"; "reminder_2_HOURS_BEFORE" = "2 ساعتان قبل"; "reminder_5_HOURS_BEFORE" = "5 ساعات قبل"; "reminder_15_HOURS_BEFORE" = "15 ساعة قبل"; "reminder_1_DAY_BEFORE" = "1 يوم قبل"; "reminder_2_DAYS_BEFORE" = "2 يومان قبل"; "reminder_1_WEEK_BEFORE" = "1 أسبوع قبل"; "reminder_CUSTOM" = "مخصص..."; "reminder_MINUTES" = "دقائق"; "reminder_HOURS" = "ساعات"; "reminder_DAYS" = "أيام"; "reminder_BEFORE" = "قبل"; "reminder_AFTER" = "بعد"; "reminder_START" = "يبدأ الحدث"; "reminder_END" = "ينتهي الحدث"; "Reminder Details" = "ØªÙØ§ØµÙŠÙ„ التنبيه"; "Choose a Reminder Action" = "اختر إجراءًا للتنبيه"; "Show an Alert" = "اعرض تنبيهًا"; "Send an E-mail" = "أرسÙÙ„ رسالة إلكترونية"; "Email Organizer" = "منظم البريد الإلكتروني"; "Email Attendees" = "البريد الإلكتروني للحضور"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "اعرض الوقت ÙƒÙ…ØªÙØ±Øº"; /* validation errors */ validate_notitle = "لم يضبط العنوان، استمرار؟"; validate_invalid_startdate = "حقل تاريخ البدء غير صالح"; validate_invalid_enddate = "حقل تاريخ الانتهاء غير صالح"; validate_endbeforestart = "تاريخ الانتهاء الذي أدخلته يحدث قبل تاريخ البدء."; "Events" = "الأحداث"; "Tasks" = "المهام"; "Show completed tasks" = "اعرض المهام المكتملة"; /* tabs */ "Task" = "المهمة"; "Event" = "الحدث"; "Recurrence" = "التكرار"; /* toolbar */ "New Event" = "حدث جديد"; "New Task" = "مهمة جديدة"; "Edit" = "حرر"; "Delete" = "احذÙ"; "Go to Today" = "اذهب الي اليوم"; "Day View" = "عرض اليوم"; "Week View" = "عرض الاسبوع"; "Month View" = "عرض الشهر"; "Reload" = "تحديث"; "eventPartStatModificationError" = "حالة المشاركة الخاصة بك لا يمكن تعديلها."; /* menu */ "New Event..." = "حدث جديد..."; "New Task..." = "مهمة جديدة..."; "Edit Selected Event..." = "حرر الحدث المحدد..."; "Delete Selected Event" = "احذ٠الحدث المحدد"; "Select All" = "اختر الكل"; "Workweek days only" = "ايام العمل الأسبوعية Ùقط"; "Tasks in View" = "المهمات ÙÙŠ العرض"; "eventDeleteConfirmation" = "الحدث (الأحداث) الآتية ستÙمحى: \n%{0}\nهل تريد المتابعة؟"; "taskDeleteConfirmation" = "المهمة (المهام) التالية ستمحى: \n %{0}\n هل تريد المتابعة؟"; "You cannot remove nor unsubscribe from your personal calendar." = "لا يمكنك حذ٠أو إلغاء اشتراكك من تقويمك الشخصي."; "Are you sure you want to delete the calendar \"%{0}\"?" = "هل انت متأكد من حذ٠التقويم \"%{0}\"ØŸ"; /* Legend */ "Participant" = "المشارك"; "Optional Participant" = "المشارك الاختياري"; "Non Participant" = "غير مشارك"; "Chair" = "مقعد"; "Needs action" = "بحاجة إلى إجراء"; "Accepted" = "مقبول"; "Declined" = "مرÙوض"; "Tentative" = "مؤقت"; "Free" = "متاح"; "Busy" = "مشغول"; "Maybe busy" = "ربما يكون مشغولًا"; "No free-busy information" = "لا معلومات عن حالة Ø§Ù„ØªÙˆÙØ±-الانشغال"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "اقترح ÙØªØ±Ø© زمنية: "; "Zoom:" = "تقريب:"; "Previous slot" = "Ø§Ù„ÙØªØ±Ø© السابقة"; "Next slot" = "Ø§Ù„ÙØªØ±Ø© التالية"; "Previous hour" = "الساعة الماضية"; "Next hour" = "الساعة التالية"; "Work days only" = "أيام العمل Ùقط"; "The whole day" = "اليوم المكتمل"; "Between" = "بين"; "and" = "Ùˆ"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "هنالك تعارض ÙÙŠ الوقت مع أحد الحضور. \nهل تريد الابقاء على الإعدادات الحالية رغم ذلك؟"; /* apt list */ "Title" = "العنوان"; "Start" = "البداية"; "End" = "النهاية"; "Due Date" = "تاريخ الاستحقاق"; "Location" = "المكان"; "(Private Event)" = "(الحدث الخاص)"; vevent_class0 = "(الحدث العام)"; vevent_class1 = "(حدث خاص)"; vevent_class2 = "(حدث سري)"; "Priority" = "الأولوية"; "Category" = "Ø§Ù„ØªØµÙ†ÙŠÙØ§Øª"; vtodo_class0 = "(مهمة عامة)"; vtodo_class1 = "(مهمة خاصة)"; vtodo_class2 = "(مهمة سرية)"; "closeThisWindowMessage" = "شكرًا لك! يمكنك إغلاق هذه Ø§Ù„Ù†Ø§ÙØ°Ø© أو عرض الخاص بك"; "Multicolumn Day View" = "عرض اليوم متعدد الأعمدة"; "Please select an event or a task." = "من ÙØ¶Ù„Ùƒ اختر حدثًا أو مهمة."; "editRepeatingItem" = "العنصر الذي ØªÙØ­Ø±Ø±Ù‡ هو عنصر متكرر. هل تريد تحرير جميع التكرارات أم هذا الحدث الواحد Ùقط؟"; "button_thisOccurrenceOnly" = "هذا الحدث Ùقط"; "button_allOccurrences" = "كل التكرارات"; /* Properties dialog */ "Name:" = "الاسم:"; "Color:" = "اللون:"; "Include in free-busy" = "ضمن حالة Ø§Ù„ØªÙˆÙØ±-الانشغال"; "Synchronization" = "المزامنة"; "Synchronize" = "زامن"; "Tag:" = "علامة:"; "Display" = "عرض"; "Show alarms" = "إظهار الانذارات"; "Show tasks" = "عرض المهام"; "Notifications" = "الإشعارات"; "Receive a mail when I modify my calendar" = "تلقي البريد عندما أقوم بتعديل التقويم الخاص بي"; "Receive a mail when someone else modifies my calendar" = "تلقي البريد عندما يقوم شخص آخر بتعديل التقويم الخاص بي"; "When I modify my calendar, send a mail to:" = "عندما أقوم بتعديل التقويم الخاص بي، أرسل رسالة بريد إلكتروني إلى:"; "Links to this Calendar" = "روابط لهذا التقويم"; "Authenticated User Access" = "مصادقة وصول المستخدم"; "CalDAV URL" = "CalDAV URL"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "يرجى تحديد قيمة رقمية ÙÙŠ حقل الأيام أكبر من أو يساوي 1."; "weekFieldInvalid" = "يرجى تحديد قيمة رقمية ÙÙŠ حقل الأسبوع (الأسابيع) أكبر من أو يساوي 1."; "monthFieldInvalid" = "يرجى تحديد قيمة رقمية ÙÙŠ حقل الشهر (الشهور) أكبر من أو يساوي 1."; "monthDayFieldInvalid" = "يرجى تحديد قيمة رقمية ÙÙŠ حقل أيام الشهر أكبر من أو يساوي 1."; "yearFieldInvalid" = "يرجى تحديد قيمة رقمية ÙÙŠ حقل السنة (السنوات) أكبر من أو يساوي 1."; "appointmentFieldInvalid" = "يرجى تحديد قيمة رقمية ÙÙŠ مجال موعد (مواعيد) أكبر من أو يساوي 1."; "recurrenceUnsupported" = "هذا النوع من التكرار غير معتمد."; "Please specify a calendar name." = "الرجاء تحديد اسم التقويم."; "tagNotDefined" = "يجب تحديد علامة إذا كنت تريد أن تزامن هذا التقويم."; "tagAlreadyExists" = "العلامة التى حددتها يرتبط Ø¨Ø§Ù„ÙØ¹Ù„ بتقويم آخر."; "tagHasChanged" = "إذا غيرت وسم تقويمك، ستحتاج إلى تحديث البيانات على هاتÙÙƒ المحمول.\nهل تريد المتابعة؟"; "tagWasAdded" = "إذا أردت مزامنة هذا التقويم، ستحتاج إلى تحديث البيانات على جهازك المحمول. \nهل تريد المتابعة؟"; "tagWasRemoved" = "إذا Ø­Ø°ÙØª التقويم من المزامنة، ستحتاج إلى تحديث البيانات على هاتÙÙƒ المحمول.\nهل تريد المتابعة؟"; "DestinationCalendarError" = "التقويم المصدر والتقويم الهد٠متطابقان. من ÙØ¶Ù„Ùƒ حاول النسخ إلى تقويم مختلÙ."; "EventCopyError" = "ÙØ´Ù„ النسخ. من ÙØ¶Ù„Ùƒ حاول النسخ من تقويم مختلÙ."; "Open Task..." = "Ø§ÙØªØ­ مهمة..."; "Mark Completed" = "علم كمكتمل"; "Delete Task" = "احذ٠المهمة"; "Delete Event" = "احذ٠الحدث"; "Copy event to my calendar" = "انسخ إلى تقويمي"; "View Raw Source" = "عرض المصدر الخام"; "Subscribe to a web calendar..." = "اشترك ÙÙŠ تقويم شابكة..."; "URL of the Calendar" = "عنوان موقع التقويم"; "Web Calendar" = "تقويم الشابكة"; "Reload on login" = "حدث عند تسجيل الدخول"; "Invalid number." = "عدد غير صحيح."; "Please identify yourself to %{0}" = "من ÙØ¶Ù„Ùƒ Ø¹Ø±Ù Ù†ÙØ³Ùƒ لـ %{0}"; SOGo-2.1.1b/UI/Scheduler/Italian.lproj/0000755000000000000000000000000012247657030016131 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Italian.lproj/Localizable.strings0000644000000000000000000004157012247657030021774 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Crea un nuovo evento"; "Create a new task" = "Crea una nuova attività"; "Edit this event or task" = "Modifica questo evento o attività"; "Delete this event or task" = "Cancella questo evento o attività"; "Go to today" = "Vai a Oggi"; "Switch to day view" = "Giorno"; "Switch to week view" = "Settimana"; "Switch to month view" = "Mese"; "Reload all calendars" = "Ricarica tutto i calendari"; /* Tabs */ "Date" = "Data"; "Calendars" = "Calendari"; /* Day */ "DayOfTheMonth" = "Giorno del mese"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "Oggi"; "Previous Day" = "Giorno precedente"; "Next Day" = "Giorno successivo"; /* Week */ "Week" = "Settimana"; "this week" = "questa settimana"; "Week %d" = "Settimana %d"; "Previous Week" = "Settimana precedente"; "Next Week" = "Settimana successiva"; /* Month */ "this month" = "questo mese"; "Previous Month" = "Mese precedente"; "Next Month" = "Mese successivo"; /* Year */ "this year" = "quest'anno"; /* Menu */ "Calendar" = "Calendario"; "Contacts" = "Contatti"; "New Calendar..." = "Nuovo calendario..."; "Delete Calendar" = "Rimuovi calendario..."; "Unsubscribe Calendar" = "Rimuovi la sottoscrizione al calendario"; "Sharing..." = "Condivisione"; "Export Calendar..." = "Esporta calendario..."; "Import Events..." = "Importa gli eventi..."; "Import Events" = "Importa gli eventi"; "Select an iCalendar file (.ics)." = "Seleziona un file iCalendar (.ics)."; "Upload" = "Upload"; "Uploading" = "Uploading"; "Publish Calendar..." = "Pubblica calendario..."; "Reload Remote Calendars" = "Aggiorna calendari remoti"; "Properties" = "Proprietà"; "Done" = "Fatto"; "An error occurred while importing calendar." = "Si è verificato un errore durante l'importazione del calendario."; "No event was imported." = "Nessun evento è stato importato."; "A total of %{0} events were imported in the calendar." = "Un totale di %{0} sono stati importati nel calendario."; "Compose E-Mail to All Attendees" = "Invia Email a tutti gli invitati"; "Compose E-Mail to Undecided Attendees" = "Invia Email agli invitati indecisi"; /* Folders */ "Personal calendar" = "Calendario personale"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Vietato"; /* acls */ "Access rights to" = "Permessi di accesso a"; "For user" = "Per utente"; "Any Authenticated User" = "Utenti autenticati"; "Public Access" = "Accesso pubblico"; "label_Public" = "Pubblico"; "label_Private" = "Privato"; "label_Confidential" = "Confidenziale"; "label_Viewer" = "Vedi tutto"; "label_DAndTViewer" = "Vedi data e ora"; "label_Modifier" = "Modifica"; "label_Responder" = "Rispondi a"; "label_None" = "Nessuno"; "View All" = "Vedi tutto"; "View the Date & Time" = "Vedi data e ora"; "Modify" = "Modifica"; "Respond To" = "Rispondi a"; "None" = "Nessuno"; "This person can create objects in my calendar." = "Questa persona può inserire elementi nel mio calendario."; "This person can erase objects from my calendar." = "Questa persona può rimuovere elementi dal mio calendario."; /* Button Titles */ "Subscribe to a Calendar..." = "Sottoscrivi un calendario..."; "Remove the selected Calendar" = "Rimuovi il calendario selezionato..."; "Name of the Calendar" = "Nome del calendario"; "new" = "Nuovo"; "printview" = "Anteprima di Stampa"; "edit" = "Modifica"; "delete" = "Cancella"; "proposal" = "Proposta"; "Save and Close" = "Salva e chiudi"; "Close" = "Chiudi"; "Invite Attendees" = "Invita partecipanti"; "Attach" = "Allega"; "Update" = "Aggiorna"; "Cancel" = "Annulla"; "show_rejected_apts" = "Visualizza appuntamenti rifiutati"; "hide_rejected_apts" = "Nascondi appuntamenti rifiutati"; /* Schedule */ "Schedule" = "Schedula"; "No appointments found" = "Nessun appuntamento trovato"; "Meetings proposed by you" = "Incontri proposti da te"; "Meetings proposed to you" = "Incontri a cui sei stato invitato"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Azione"; "accept" = "Accetta"; "decline" = "Declina"; "more attendees" = "Altri partecipanti"; "Hide already accepted and rejected appointments" = "Nascondi gli appuntamenti già accettati o declinati"; "Show already accepted and rejected appointments" = "Visualizza gli appuntamenti già accettati o declinati"; /* Appointments */ "Appointment viewer" = "Visualizza appuntamenti"; "Appointment editor" = "Modifica appuntamenti"; "Appointment proposal" = "Proponi appuntamenti"; "Appointment on" = "Appuntamento del"; "Start:" = "Inizio:"; "End:" = "Fine:"; "Due Date:" = "Scadenza:"; "Title:" = "Titolo:"; "Calendar:" = "Calendario:"; "Name" = "Nome"; "Email" = "Email"; "Status:" = "Stato:"; "% complete" = "% completato"; "Location:" = "Luogo:"; "Priority:" = "Priorità:"; "Privacy" = "Privacy"; "Cycle" = "Ricorrenza"; "Cycle End" = "Termine ricorrenza"; "Categories" = "Categorie"; "Classification" = "Classificazione"; "Duration" = "Durata"; "Attendees:" = "Partecipanti:"; "Resources" = "Risorse"; "Organizer:" = "Proprietario:"; "Description:" = "Descrizione:"; "Document:" = "Documento:"; "Category:" = "Categoria:"; "Repeat:" = "Ripeti:"; "Reminder:" = "Promemoria:"; "General:" = "Generale:"; "Reply:" = "Risposta:"; "Target:" = "Percorso:"; "attributes" = "attributi"; "attendees" = "invitati"; "delegated from" = "delegato da"; /* checkbox title */ "is private" = "contrassegna come privato"; /* classification */ "Public" = "Pubblico"; "Private" = "Privato"; /* text used in overviews and tooltips */ "empty title" = "Senza titolo"; "private appointment" = "Appuntamento privato"; "Change..." = "Modifica..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Richiede un'azione"; "partStat_ACCEPTED" = "Parteciperò"; "partStat_DECLINED" = "Non parteciperò"; "partStat_TENTATIVE" = "Confermerò più tardi"; "partStat_DELEGATED" = "Inviata delega"; "partStat_OTHER" = "Altro"; /* Appointments (error messages) */ "Conflicts found!" = "Individuato conflitto!"; "Invalid iCal data!" = "Dati iCal non validi!"; "Could not create iCal data!" = "Impossibile creare dati iCal!"; /* Searching */ "view_all" = "Tutti"; "view_today" = "Oggi"; "view_next7" = "Prossimi 7 giorni"; "view_next14" = "Prossimi 14 giorni"; "view_next31" = "Prossimi 31 giorni"; "view_thismonth" = "Questo mese"; "view_future" = "Tutti i prossimi eventi"; "view_selectedday" = "Giorno selezionato"; "View:" = "Visualizza:"; "Title or Description" = "Titolo o descrizione"; "Search" = "Cerca"; "Search attendees" = "Cerca invitati"; "Search resources" = "Cerca risorse"; "Search appointments" = "Cerca appuntamenti"; "All day Event" = "Tutta la giornata"; "check for conflicts" = "Controlla conflitti"; "Browse URL" = "Mostra URL"; "newAttendee" = "Nuovo partecipante"; /* calendar modes */ "Overview" = "Panoramica"; "Chart" = "Grafico"; "List" = "Lista"; "Columns" = "Colonne"; /* Priorities */ "prio_0" = "Nessuna"; "prio_1" = "Alta"; "prio_2" = "Alta"; "prio_3" = "Alta"; "prio_4" = "Alta"; "prio_5" = "Normale"; "prio_6" = "Bassa"; "prio_7" = "Bassa"; "prio_8" = "Bassa"; "prio_9" = "Bassa"; /* access classes (privacy) */ "PUBLIC_vevent" = "Evento pubblico"; "CONFIDENTIAL_vevent" = "Evento confidenziale"; "PRIVATE_vevent" = "Evento privato"; "PUBLIC_vtodo" = "Attività pubblica"; "CONFIDENTIAL_vtodo" = "Attività confidenziale"; "PRIVATE_vtodo" = "Attività privata"; /* status type */ "status_" = "Non specificato"; "status_NOT-SPECIFIED" = "Non specificato"; "status_TENTATIVE" = "Tentativo"; "status_CONFIRMED" = "Confermato"; "status_CANCELLED" = "Cancellato"; "status_NEEDS-ACTION" = "Richiede un'azione"; "status_IN-PROCESS" = "In esecuzione"; "status_COMPLETED" = "Completato il "; /* Cycles */ "cycle_once" = "ricorre una volta"; "cycle_daily" = "ricorre una volta al giorno"; "cycle_weekly" = "ricorrenza settimanale"; "cycle_2weeks" = "ricorre per 2 settimane"; "cycle_4weeks" = "ricorre per 4 settimane"; "cycle_monthly" = "ricorre per 1 mese"; "cycle_weekday" = "ricorre un giorno alla settimana"; "cycle_yearly" = "ricorre annualmente"; "cycle_end_never" = "nessuna data di fine"; "cycle_end_until" = "ricorrenza fino al"; "Recurrence pattern" = "Modello di ricorrenza"; "Range of recurrence" = "Intervallo di ricorrenza"; "Repeat" = "Ripetizione"; "Daily" = "Giornaliera"; "Weekly" = "Settimanale"; "Monthly" = "Mensile"; "Yearly" = "Annuale"; "Every" = "Ogni"; "Days" = "Giorni"; "Week(s)" = "Settimana/e"; "On" = "Il"; "Month(s)" = "Mese/i"; "The" = "Il"; "Recur on day(s)" = "Ricorre il giorno/i"; "Year(s)" = "Anno/i"; "cycle_of" = "di"; "No end date" = "Nessuna data di fine"; "Create" = "Crea"; "appointment(s)" = "Appuntamento/i"; "Repeat until" = "Ripeti fino "; "First" = "Primo"; "Second" = "Secondo"; "Third" = "Terzo"; "Fourth" = "Quarto"; "Fift" = "Quinto"; "Last" = "Ultimo"; /* Appointment categories */ "category_none" = "Nessuna"; "category_labels" = "Anniversari,Compleanni,Lavoro,Chiamate,Clienti,Competizioni,Compratori,Preferiti,Incontri,Regali,Vacanze,Idee,Meeting,Problemi,Varie,Personale,Progetti,Giorno festivo,Stato,Fornitori,Viaggio,Chiusura"; "repeat_NEVER" = "Non si ripete"; "repeat_DAILY" = "Quotidianamente"; "repeat_WEEKLY" = "Settimanalmente"; "repeat_BI-WEEKLY" = "Bisettimanalmente"; "repeat_EVERY WEEKDAY" = "Nei giorni lavorativi"; "repeat_MONTHLY" = "Mensilmente"; "repeat_YEARLY" = "Annualmente"; "repeat_CUSTOM" = "Personalizza..."; "reminder_NONE" = "Nessun promemoria"; "reminder_5_MINUTES_BEFORE" = "5 minuti prima"; "reminder_10_MINUTES_BEFORE" = "10 minuti prima"; "reminder_15_MINUTES_BEFORE" = "15 minuti prima"; "reminder_30_MINUTES_BEFORE" = "30 minuti prima"; "reminder_45_MINUTES_BEFORE" = "45 minuti prima"; "reminder_1_HOUR_BEFORE" = "1 ora prima"; "reminder_2_HOURS_BEFORE" = "2 ore prima"; "reminder_5_HOURS_BEFORE" = "5 ore prima"; "reminder_15_HOURS_BEFORE" = "15 ore prima"; "reminder_1_DAY_BEFORE" = "1 giorno prima"; "reminder_2_DAYS_BEFORE" = "2 giorni prima"; "reminder_1_WEEK_BEFORE" = "1 settimana prima"; "reminder_CUSTOM" = "Personalizza..."; "reminder_MINUTES" = "minuti"; "reminder_HOURS" = "ore"; "reminder_DAYS" = "giorni"; "reminder_BEFORE" = "prima"; "reminder_AFTER" = "dopo"; "reminder_START" = "l'evento inizia"; "reminder_END" = "l'evento termina"; "Reminder Details" = "Dettagli promemoria"; "Choose a Reminder Action" = "Scegli l'azione dell'allarme"; "Show an Alert" = "Mostra un allarme"; "Send an E-mail" = "Invia una Email"; "Email Organizer" = "Email dell'Organizzatore"; "Email Attendees" = "Email dei Partecipanti"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Mostra comunque come libero"; /* validation errors */ validate_notitle = "Nessun titolo inserito, continuare?"; validate_invalid_startdate = "Data iniziale non corretta!"; validate_invalid_enddate = "Data finale non corretta!"; validate_endbeforestart = "La data finale specificata è precedente alla data di inizio."; "Tasks" = "Attività"; "Show completed tasks" = "Visualizza attività completate"; /* tabs */ "Task" = "Attività"; "Event" = "Evento"; "Recurrence" = "Ricorrenza"; /* toolbar */ "New Event" = "Nuovo evento"; "New Task" = "Nuova attività"; "Edit" = "Modifica"; "Delete" = "Rimuovi"; "Go to Today" = "Oggi"; "Day View" = "Giorno"; "Week View" = "Settimana"; "Month View" = "Mese"; "Reload" = "Ricarica"; "eventPartStatModificationError" = "Lo stato della tua partecipazione non può essere modificato."; /* menu */ "New Event..." = "Nuovo evento..."; "New Task..." = "Nuova attività..."; "Edit Selected Event..." = "Modifica evento selezionato..."; "Delete Selected Event" = "Rimuovi evento selezionato..."; "Select All" = "Seleziona tutti"; "Workweek days only" = "Solo giorni lavorativi"; "Tasks in View" = "Attività in elenco"; "eventDeleteConfirmation" = "Il seguente evento(i) sarà cancellato: \n%{0}\nVuoi continuare?"; "taskDeleteConfirmation" = "Stai per cancellare in maniera permanente il l'attività.\nVuoi procedere?"; "You cannot remove nor unsubscribe from your personal calendar." = "Non puoi rimuovere la sottoscrizione del tuo calendario personale."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Sei sicuro di voler cancellare il calendario \"%{0}\"?"; /* Legend */ "Participant" = "Partecipante"; "Optional Participant" = "Partecipante non necessario"; "Non Participant" = "Non Partecipante"; "Chair" = "Presidente"; "Needs action" = "Richiede un'azione"; "Accepted" = "Accettato"; "Declined" = "Declinato"; "Tentative" = "Tentativo"; "Free" = "Libero"; "Busy" = "Occupato"; "Maybe busy" = "Probabilmente occupato"; "No free-busy information" = "Informazione non disponibile"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Periodo suggerito:"; "Zoom:" = "Zoom:"; "Previous slot" = "Precedente"; "Next slot" = "Successivo"; "Previous hour" = "Ora precedente"; "Next hour" = "Ora successiva"; "Work days only" = "Solo giorni lavorativi"; "The whole day" = "Intera giornata"; "Between" = "Tra"; "and" = "e"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "C'è un conflitto di orari con uno o più partecipanti.\nVuoi mantenere lo stesso questa impostazione?"; /* apt list */ "Title" = "Titolo"; "Start" = "Inizio"; "End" = "Fine"; "Due Date" = "Scadenza"; "Location" = "Luogo"; "(Private Event)" = "(Evento privato)"; vevent_class0 = "(Evento pubblico)"; vevent_class1 = "(Evento privato)"; vevent_class2 = "(Evento confidenziale)"; vtodo_class0 = "(Attività pubblica)"; vtodo_class1 = "(Attività privata)"; vtodo_class2 = "(Attività confidenziale)"; "closeThisWindowMessage" = "Grazie! Ora puoi chiudere la finestra "; "Multicolumn Day View" = "Vista per giorno multi-colonna"; "Please select an event or a task." = "Per favore seleziona un evento o un'attività."; "editRepeatingItem" = "L'elemento che si sta modificando è un elemento ripetuto. Si vogliono modificare tutte le sue occorrenze o solo questa?"; "button_thisOccurrenceOnly" = "Solamente questa occorrenza"; "button_allOccurrences" = "Tutte le occorrenze"; /* Properties dialog */ "Name:" = "Nome:"; "Color:" = "Colore:"; "Include in free-busy" = "Includi nel libero-occupato"; "Synchronization" = "Sincronizzazione"; "Synchronize" = "Sincronizza"; "Tag:" = "Etichetta:"; "Display" = "Visualizza"; "Show alarms" = "Mostra allarmi"; "Show tasks" = "Mostra attività"; "Receive a mail when I modify my calendar" = "Ricevi una mail quando io modifico il mio calendario"; "Receive a mail when someone else modifies my calendar" = "Ricevi una mail quando qualcuno modifica il mio calendario"; "When I modify my calendar, send a mail to:" = "Quando modifico il mio calendario, invia una mail a:"; "Links to this Calendar" = "Link a questo Calendario"; "Authenticated User Access" = "Tutti gli utenti autenticati"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Prego specificare nel campo Giorni un valore numerico maggiore o ugale a 1."; "weekFieldInvalid" = "Prego specificare nel campo Settimana(e) un valore numerico maggiore o uguale a 1."; "monthFieldInvalid" = "Prego specificare nel campo Mese(i) un valore numerico maggiore o uguale a 1."; "monthDayFieldInvalid" = "Prego specificare nel campo giorno del mese un valore numerico maggiore o uguale a 1."; "yearFieldInvalid" = "Prego specificare nel campo Anno(i) un valore numerico maggiore o uguale a 1."; "appointmentFieldInvalid" = "Prego specificare nel campo Appuntamento(i) un valore numerico maggiore o uguale a 1."; "recurrenceUnsupported" = "Questo tipo di ricorrenza non è attualmente supportata."; "Please specify a calendar name." = "Prego specificare il nome del calendario"; "tagNotDefined" = "E' necessario specificare un etichetta se si vuole sincronizzare questo calendario."; "tagAlreadyExists" = "L'etichetta specificata è già associata ad un altro calendario."; "tagHasChanged" = "Cambiando l'etichetta del calendario è necessario ricaricare tutti i dati sul dispositivo mobile.\nContinuare?"; "tagWasAdded" = "Sincronizzando questo calendario sarà necessario ricaricare i dati sul dispositivo mobile.\nContinuare?"; "tagWasRemoved" = "Rimuovendo questo calendario dalla sincronizzazione, sarà necessario ricaricare i dati sul dispositivo mobile.\nCotinuare?"; "DestinationCalendarError" = "La sorgente e la destinazione dei calendari sono le stesse. Prego provare a copiare in un calendario differente."; "EventCopyError" = "La copia è fallita. Provare a copiare su un calendario differente."; "Open Task..." = "Apri attività..."; "Mark Completed" = "Segna come completata"; "Delete Task" = "Elimina attività"; "Delete Event" = "Elimina evento"; "Copy event to my calendar" = "Copia gli eventi sul mio calendario"; "View Raw Source" = "Vedi sorgente"; "Subscribe to a web calendar..." = "Sottoscrivi un calendario remoto..."; "URL of the Calendar" = "URL del calendario"; "Web Calendar" = "Calendario remoto"; "Reload on login" = "Ricarica al login"; "Invalid number." = "Numero non valido."; "Category" = "Categoria"; "Priority" = "Priorità"; SOGo-2.1.1b/UI/Scheduler/UIxCalMonthOverview.h0000644000000000000000000000306612247657030017463 0ustar rootroot/* Copyright (C) 2004 SKYRIX Software AG This file is part of OpenGroupware.org. 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: UIxCalMonthOverview.h 181 2004-08-11 15:13:25Z helge $ #import "UIxCalMonthViewOld.h" @class NSCalendarDate, NSString, NSDictionary, NSArray; @interface UIxCalMonthOverview : UIxCalMonthViewOld { int dayIndex; int dayOfWeek; int weekOfYear; NSCalendarDate *currentWeekStart; } - (void)setDayIndex:(int)_idx; - (int)dayIndex; - (void)setDayOfWeek:(int)_day; - (int)dayOfWeek; - (void)setCurrentWeekStartDate:(NSCalendarDate *)_date; - (NSCalendarDate *)currentWeekStartDate; - (void)setWeekOfYear:(int)_week; - (int)weekOfYear; - (int)year; - (int)month; - (NSString *)localizedDayOfWeekName; - (NSDictionary *)currentWeekQueryParameters; /* style sheet */ - (NSString *)weekStyle; - (NSString *)contentStyle; /* appointments */ // - (NSArray *)appointments; @end SOGo-2.1.1b/UI/Scheduler/Russian.lproj/0000755000000000000000000000000012247657030016174 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Russian.lproj/Localizable.strings0000644000000000000000000005642312247657030022042 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Создать новое Ñобытие"; "Create a new task" = "Создать новую задачу"; "Edit this event or task" = "Редактировать Ñто Ñобытие или задачу"; "Delete this event or task" = "Удалить Ñто Ñобытие или задачу"; "Go to today" = "Перейти на ÑегоднÑ"; "Switch to day view" = "Перейти к обзору днÑ"; "Switch to week view" = "Перейти к обзору недели"; "Switch to month view" = "Перейти к обзору меÑÑца"; "Reload all calendars" = "Перезагрузить вÑе календари"; /* Tabs */ "Date" = "Дата"; "Calendars" = "Календари"; /* Day */ "DayOfTheMonth" = "DayOfTheMonth"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "СегоднÑ"; "Previous Day" = "Предыдущий день"; "Next Day" = "Следующий день"; /* Week */ "Week" = "ÐеделÑ"; "this week" = "Ñта неделÑ"; "Week %d" = "ÐÐµÐ´ÐµÐ»Ñ %d"; "Previous Week" = "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð½ÐµÐ´ÐµÐ»Ñ"; "Next Week" = "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½ÐµÐ´ÐµÐ»Ñ"; /* Month */ "this month" = "Ñтот меÑÑц"; "Previous Month" = "Предыдущий меÑÑц"; "Next Month" = "Следующий меÑÑц"; /* Year */ "this year" = "Ñтот год"; /* Menu */ "Calendar" = "Календарь"; "Contacts" = "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°"; "New Calendar..." = "Ðовый календарь..."; "Delete Calendar" = "Удалить календарь"; "Unsubscribe Calendar" = "Удалить подпиÑку на календарь"; "Sharing..." = "Общий доÑтуп..."; "Export Calendar..." = "ЭкÑпортировать календарь..."; "Import Events..." = "Импорт Ñобытий..."; "Import Events" = "Импорт Ñобытий"; "Select an iCalendar file (.ics)." = "Выберите iCalendar файл (.ics)."; "Upload" = "Загрузить"; "Uploading" = "ЗакачиваетÑÑ"; "Publish Calendar..." = "Опубликовать календарь..."; "Reload Remote Calendars" = "Обновить удаленные календари"; "Properties" = "СвойÑтва"; "Done" = "Готово"; "An error occurred while importing calendar." = "Ошибка при импорте календарÑ."; "No event was imported." = "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð½Ðµ были импортированы."; "A total of %{0} events were imported in the calendar." = " Ð’Ñего %{0} Ñобытий было импортировано в календарь."; "Compose E-Mail to All Attendees" = "СоÑтавить Ñообщение ко вÑем приглашенным"; "Compose E-Mail to Undecided Attendees" = "СоÑтавить Ñообщение ко вÑем не решившим приглашенным"; /* Folders */ "Personal calendar" = "ПерÑональный календарь"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Запрешено"; /* acls */ "Access rights to" = "Права доÑтупа к"; "For user" = "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"; "Any Authenticated User" = "Любой аутентифицированный пользователь"; "Public Access" = "Публичный доÑтуп"; "label_Public" = "Публичное Ñобытие"; "label_Private" = "Личное Ñобытие"; "label_Confidential" = "Конфиденциальное"; "label_Viewer" = "Показать вÑе"; "label_DAndTViewer" = "Показать дату и времÑ"; "label_Modifier" = "Изменить"; "label_Responder" = "Ответить на"; "label_None" = "Ðичего"; "View All" = "Показать вÑе"; "View the Date & Time" = "Показывать Ð²Ñ€ÐµÐ¼Ñ Ð¸ дату"; "Modify" = "Изменить"; "Respond To" = "Ответить"; "None" = "Ðет"; "This person can create objects in my calendar." = "Этот учаÑтник может Ñоздавать запиÑи в моем календаре."; "This person can erase objects from my calendar." = "Этот учаÑтник может удалÑть запиÑи в моем календаре."; /* Button Titles */ "Subscribe to a Calendar..." = "ПодпиÑатьÑÑ Ð½Ð° календарь..."; "Remove the selected Calendar" = "Удалить выделенный календарь"; "Name of the Calendar" = "Ðазвание календарÑ"; "new" = "Ðовый"; "printview" = "Печатать"; "edit" = "Изменить"; "delete" = "Удалить"; "proposal" = "Предложение"; "Save and Close" = "Сохранить и закрыть"; "Close" = "Закрыть"; "Invite Attendees" = "ПриглаÑить учаÑтников"; "Attach" = "Прикрепить вложение"; "Update" = "Обновить"; "Cancel" = "Отменить"; "show_rejected_apts" = "Показать отклоненные вÑтречи"; "hide_rejected_apts" = "СпрÑтать отклоненные вÑтречи"; /* Schedule */ "Schedule" = "РаÑпиÑание"; "No appointments found" = "Ðе найдено назначенных вÑтреч"; "Meetings proposed by you" = "Ваши Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾ вÑтрече"; "Meetings proposed to you" = "Предложенные Вам вÑтречи"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "ДейÑтвие"; "accept" = "СоглаÑитьÑÑ"; "decline" = "ОтказатьÑÑ"; "more attendees" = "ПриглаÑить еще"; "Hide already accepted and rejected appointments" = "Скрыть ÑоглаÑившихÑÑ Ð¸ отказавшихÑÑ."; "Show already accepted and rejected appointments" = "Показать ÑоглаÑившихÑÑ Ð¸ отказавшихÑÑ."; /* Appointments */ "Appointment viewer" = "ПроÑмотр вÑтреч"; "Appointment editor" = "Редактор вÑтреч"; "Appointment proposal" = "Предложение вÑтреч"; "Appointment on" = "Ð’Ñтреча"; "Start:" = "Ðачало:"; "End:" = "Конец:"; "Due Date:" = "К дате:"; "Title:" = "Заголовок:"; "Calendar:" = "Календарь:"; "Name" = "ИмÑ"; "Email" = "Email"; "Status:" = "СтатуÑ:"; "% complete" = "% выполнено"; "Location:" = "МеÑто:"; "Priority:" = "Приоритет:"; "Privacy" = "ПриватноÑть"; "Cycle" = "Цикл"; "Cycle End" = "Конец цикла"; "Categories" = "Категории"; "Classification" = "КлаÑÑификациÑ"; "Duration" = "ПродолжительноÑть"; "Attendees:" = "УчаÑтники:"; "Resources" = "РеÑурÑÑ‹"; "Organizer:" = "Организатор:"; "Description:" = "ОпиÑание:"; "Document:" = "Документ:"; "Category:" = "КатегориÑ:"; "Repeat:" = "ПовторÑть:"; "Reminder:" = "Ðапоминание:"; "General:" = "Общее:"; "Reply:" = "Ответ:"; "Created by:" = "Создано:"; "Target:" = "Цель:"; "attributes" = "атрибуты"; "attendees" = "учаÑтники"; "delegated from" = "делегировано от"; /* checkbox title */ "is private" = "личное"; /* classification */ "Public" = "Публичное"; "Private" = "Личное"; /* text used in overviews and tooltips */ "empty title" = "ПуÑтой заголовок"; "private appointment" = "Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð²Ñтреча"; "Change..." = "Изменить..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Требует дейÑтвиÑ"; "partStat_ACCEPTED" = "Я буду учаÑтвовать"; "partStat_DECLINED" = "Я не буду учаÑтвовать"; "partStat_TENTATIVE" = "Я подтвержу позже"; "partStat_DELEGATED" = "Я делегирую"; "partStat_OTHER" = "Другое"; /* Appointments (error messages) */ "Conflicts found!" = "Ð’Ñ‹Ñвлены конфликты!"; "Invalid iCal data!" = "Ðеверные данные iCal !"; "Could not create iCal data!" = "Ðе могу Ñоздать данные в формате iCal!"; /* Searching */ "view_all" = "Ð’Ñе"; "view_today" = "СегоднÑ"; "view_next7" = "Следующие 7 дней"; "view_next14" = "Следующие 14 дней"; "view_next31" = "Следующий 31 день"; "view_thismonth" = "Этот меÑÑц"; "view_future" = "Ð’Ñе будущие мероприÑтиÑ"; "view_selectedday" = "Выбранный день"; "View:" = "Вид:"; "Title or Description" = "Заголовок или опиÑание"; "Search" = "ПоиÑк"; "Search attendees" = "ПоиÑк учаÑтников"; "Search resources" = "ПоиÑк реÑурÑов"; "Search appointments" = "ПоиÑк вÑтреч"; "All day Event" = "МероприÑтие на целый день"; "check for conflicts" = "Проверить на конфликты"; "Browse URL" = "ПроÑмотреть URL"; "newAttendee" = "Добавить учаÑтника"; /* calendar modes */ "Overview" = "Обзор"; "Chart" = "Карта"; "List" = "СпиÑок"; "Columns" = "Колонки"; /* Priorities */ "prio_0" = "Ðе указано"; "prio_1" = "Ð’Ñ‹Ñший"; "prio_2" = "Очень выÑокий"; "prio_3" = "Ð’Ñ‹Ñокий"; "prio_4" = "Выше Ñреднего"; "prio_5" = "Ðормальный"; "prio_6" = "Ðиже Ñреднего"; "prio_7" = "Ðизкий"; "prio_8" = "Очень низкий"; "prio_9" = "Ðизший"; /* access classes (privacy) */ "PUBLIC_vevent" = "Публичное Ñобытие"; "CONFIDENTIAL_vevent" = "Конфиденциальное Ñобытие"; "PRIVATE_vevent" = "Приватное Ñобытие"; "PUBLIC_vtodo" = "Публичное задание"; "CONFIDENTIAL_vtodo" = "Конфиденциальное задание"; "PRIVATE_vtodo" = "ЧаÑтное задание"; /* status type */ "status_" = "не указан"; "status_NOT-SPECIFIED" = "Ðе указан"; "status_TENTATIVE" = "Предварительный"; "status_CONFIRMED" = "Подтвержденный"; "status_CANCELLED" = "Отмененный"; "status_NEEDS-ACTION" = "Требует дейÑтвий"; "status_IN-PROCESS" = "Ð’ процеÑÑе"; "status_COMPLETED" = "Завершено "; /* Cycles */ "cycle_once" = "цикл_однажды"; "cycle_daily" = "цикл_ежедневно"; "cycle_weekly" = "цикл_еженедельно"; "cycle_2weeks" = "цикл_каждые_2_недели"; "cycle_4weeks" = "цикл_каждые_4_недели"; "cycle_monthly" = "цикл_помеÑÑчно"; "cycle_weekday" = "цикл_по_рабочим_днÑм"; "cycle_yearly" = "цикл_ежегодно"; "cycle_end_never" = "цикл_не_завершаетÑÑ_никогда"; "cycle_end_until" = "цикл_завершаетÑÑ_до"; "Recurrence pattern" = "Шаблон повторений"; "Range of recurrence" = "Диапазон повторений"; "Repeat" = "ПовторÑть"; "Daily" = "Ежедневно"; "Weekly" = "Еженедельно"; "Monthly" = "ЕжемеÑÑчно"; "Yearly" = "Ежегодно"; "Every" = "Каждые "; "Days" = "дней"; "Week(s)" = "недель(и)"; "On" = "Ðа"; "Month(s)" = "меÑÑца(цев)"; "The" = " "; "Recur on day(s)" = "ПовторÑетÑÑ Ð² дни"; "Year(s)" = "год(года)"; "cycle_of" = " "; "No end date" = "Ðет даты завершениÑ"; "Create" = "Создать"; "appointment(s)" = "вÑтреча(вÑтречи)"; "Repeat until" = "ПовторÑть до"; "First" = "Первый"; "Second" = "Второй"; "Third" = "Третий"; "Fourth" = "Четвертый"; "Fift" = "ПÑтый"; "Last" = "ПоÑледний"; /* Appointment categories */ "category_none" = "Ðикаих"; "category_labels" = "Годовщина,День рождениÑ,Дела,Звонки,Клиенты,Конкуренты,Потребители,Избранное,Ð’ Ñлед Ñобытию,Подарки,Праздники,Идеи,Ð’Ñтречи,Проблемы,Разное,Личное,Проекты,ГоÑударÑтвенный праздник,СтатуÑ,ПоÑтавщики,ПутешеÑтвие,Каникулы"; "repeat_NEVER" = "Ðе повторÑетÑÑ"; "repeat_DAILY" = "Ежедневно"; "repeat_WEEKLY" = "Еженедельно"; "repeat_BI-WEEKLY" = "Каждые две недели"; "repeat_EVERY WEEKDAY" = "Каждый рабочий день недели"; "repeat_MONTHLY" = "ЕжемеÑÑчно"; "repeat_YEARLY" = "Ежегодно"; "repeat_CUSTOM" = "По-другому..."; "reminder_NONE" = "Ðет напоминаниÑ"; "reminder_5_MINUTES_BEFORE" = "за 5 минут"; "reminder_10_MINUTES_BEFORE" = "за 10 минут"; "reminder_15_MINUTES_BEFORE" = "за 15 минут"; "reminder_30_MINUTES_BEFORE" = "за 30 минут"; "reminder_45_MINUTES_BEFORE" = "за 45 минут"; "reminder_1_HOUR_BEFORE" = "за 1 чаÑ"; "reminder_2_HOURS_BEFORE" = "за 2 чаÑа"; "reminder_5_HOURS_BEFORE" = "за 5 чаÑов"; "reminder_15_HOURS_BEFORE" = "за 15 чаÑов"; "reminder_1_DAY_BEFORE" = "за 1 день"; "reminder_2_DAYS_BEFORE" = "за 2 днÑ"; "reminder_1_WEEK_BEFORE" = "за 1 неделю"; "reminder_CUSTOM" = "По-другому..."; "reminder_MINUTES" = "минут"; "reminder_HOURS" = "чаÑов"; "reminder_DAYS" = "дней"; "reminder_BEFORE" = "до"; "reminder_AFTER" = "поÑле"; "reminder_START" = "начала ÑобытиÑ"; "reminder_END" = "конца ÑобытиÑ"; "Reminder Details" = "ПодробноÑти напоминаниÑ"; "Choose a Reminder Action" = "Выбор дейÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ð½Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ"; "Show an Alert" = "Показать Alert"; "Send an E-mail" = "ПоÑлать Ñообщение e-mail"; "Email Organizer" = "Email организатору"; "Email Attendees" = "Email учаÑтникам"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Отображать Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº Ñвободное"; /* email notifications */ "Send Appointment Notifications" = "ОтправлÑть Ð½Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ вÑтречах"; /* validation errors */ validate_notitle = "Ðет названиÑ. Продолжить?"; validate_invalid_startdate = "Ðеверное дата начала!"; validate_invalid_enddate = "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° конца!"; validate_endbeforestart = "Дата начала позже даты конца"; "Events" = "СобытиÑ"; "Tasks" = "Задачи"; "Show completed tasks" = "Показать выполненные задачи"; /* tabs */ "Task" = "Задача"; "Event" = "Событие"; "Recurrence" = "Повторение"; /* toolbar */ "New Event" = "Ðовое Ñобытие"; "New Task" = "ÐÐ¾Ð²Ð°Ñ Ð·Ð°Ð´Ð°Ñ‡Ð°"; "Edit" = "Изменить"; "Delete" = "Удалить"; "Go to Today" = "СегоднÑ"; "Day View" = "День"; "Week View" = "По неделÑм"; "Month View" = "МеÑÑц"; "Reload" = "Перезагрузить"; "eventPartStatModificationError" = "Ðевозможно изменить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð’Ð°ÑˆÐµÐ³Ð¾ учаÑтиÑ."; /* menu */ "New Event..." = "Ðовое Ñобытие..."; "New Task..." = "Ðовое задание..."; "Edit Selected Event..." = "Редактировать выбранное задание..."; "Delete Selected Event" = "Удалить выбранное задание"; "Select All" = "Выбрать вÑе"; "Workweek days only" = "Только рабочие дни недели"; "Tasks in View" = "Ð—Ð°Ð´Ð°Ð½Ð¸Ñ Ð² виде"; "eventDeleteConfirmation" = "Следующие ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ удалены: \n%{0}\nПродолжить удаление?"; "taskDeleteConfirmation" = "Событие будет удалено безвозвратно.\nПродолжить?"; "You cannot remove nor unsubscribe from your personal calendar." = "Ð’Ñ‹ не можете удалить перÑональный календарь, равно как и выключить подпиÑку на него."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Ð’Ñ‹ уверены что хотите удалить календарь \"%{0}\"?"; /* Legend */ "Participant" = "УчаÑтник"; "Optional Participant" = "Возможный учаÑтник"; "Non Participant" = "Ðе учаÑтник"; "Chair" = "Оргкомитет"; "Needs action" = "Требует дейÑтвиÑ"; "Accepted" = "ПринÑто"; "Declined" = "Отклонено"; "Tentative" = "Предварительно"; "Free" = "Свободно"; "Busy" = "ЗанÑто"; "Maybe busy" = "Возможно занÑто"; "No free-busy information" = "Ðет информации о занÑтоÑти"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Предложите временной интервал:"; "Zoom:" = "Увеличить:"; "Previous slot" = "Предыдущий интервал"; "Next slot" = "Следующий интервал"; "Previous hour" = "Предыдущий чаÑ"; "Next hour" = "Следующий чаÑ"; "Work days only" = "Только рабочии дни"; "The whole day" = "ВеÑÑŒ день"; "Between" = "Между"; "and" = "и"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "У одного или неÑкольких приглашенных еÑть конфликт по времени.\nÐ’Ñ‹ хотите Ñохранить текущие наÑтройки неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° конфликт?"; /* apt list */ "Title" = "Ðазвание"; "Start" = "Ðачало"; "End" = "Конец"; "Due Date" = "К дате"; "Location" = "МеÑто"; "(Private Event)" = "(Приватное Ñобытие)"; vevent_class0 = "(Публичное Ñобытие)"; vevent_class1 = "(Приватное Ñобытие)"; vevent_class2 = "(Конфиденциальное Ñобытие)"; "Priority" = "ВажноÑть"; "Category" = "КатегориÑ"; vtodo_class0 = "(Публичное задание)"; vtodo_class1 = "(Приватное задание)"; vtodo_class2 = "(Конфиденциальное задание)"; "closeThisWindowMessage" = "СпаÑибо! Ð’Ñ‹ можете закрыть Ñто окно или поÑмотреть "; "Multicolumn Day View" = "Отображать день в неÑклько колонок"; "Please select an event or a task." = "ПожалуйÑта выберите Ñобытие или задачу."; "editRepeatingItem" = "Ð’Ñ‹ выбрали Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÑющееÑÑ Ñобытие. ИзменÑÑ ÑвойÑтва Ñтого ÑобытиÑ, вы можете изменить их Ð´Ð»Ñ Ð²Ñех повторов или только Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑобытиÑ. Что вы хотите изменить?"; "button_thisOccurrenceOnly" = "Только Ñто Ñобытие"; "button_allOccurrences" = "Ð’Ñе повторы"; /* Properties dialog */ "Name:" = "Ðазвание:"; "Color:" = "Цвет:"; "Include in free-busy" = "Включить в free-busy"; "Synchronization" = "СинхронизациÑ"; "Synchronize" = "Синхронизировать"; "Tag:" = "Метка:"; "Display" = "Вид"; "Show alarms" = "Показать Ñигналы"; "Show tasks" = "Показать заданиÑ"; "Notifications" = "ÐапоминаниÑ"; "Receive a mail when I modify my calendar" = "Получать пиÑьмо в Ñлучае еÑли Ñ Ð¸Ð·Ð¼ÐµÐ½ÑŽ Ñвой календарь"; "Receive a mail when someone else modifies my calendar" = "Получать пиÑьмо еÑли кто-то изменит мой календарь"; "When I modify my calendar, send a mail to:" = "ЕÑли Ñ Ð¸Ð·Ð¼ÐµÐ½ÑŽ Ñвой календарь, отправить пиÑьмо на адреÑ: "; "Links to this Calendar" = "СÑылки на Ñтот календарь"; "Authenticated User Access" = "ДоÑтуп авторизированных пользователей"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "ПожалуйÑта, укажите чиÑловое значение в поле дней, большее или равное 1."; "weekFieldInvalid" = "ПожалуйÑта, укажите чиÑло большее Ð½ÑƒÐ»Ñ Ð² поле количеÑтва недель."; "monthFieldInvalid" = "ПожалуйÑта, укажите чиÑловое значение в поле меÑÑцев, большее или равное 1."; "monthDayFieldInvalid" = "ПожалуйÑта, укажите чиÑловое значение в поле меÑÑцев, большее или равное 1."; "yearFieldInvalid" = "ПожалуйÑта, укажите чиÑловое значение в поле лет, большее или равное 1."; "appointmentFieldInvalid" = "ПожалуйÑта, укажите чиÑловое значение в поле вÑтреч, большее или равное 1."; "recurrenceUnsupported" = "Этот тип повторений пока не поддерживаетÑÑ."; "Please specify a calendar name." = "ПожалуйÑта, укажите Ð¸Ð¼Ñ ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ"; "tagNotDefined" = "Ð’Ñ‹ должны указать метку (tag) еÑли хотите Ñинхронизировать Ñтот календарь."; "tagAlreadyExists" = "Ð£ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° уже иÑпользуетÑÑ Ð² другом календаре."; "tagHasChanged" = "ЕÑли Ð’Ñ‹ Ñмените метку в Ñтом календаре, то будет необходимо заново Ñинхронизировать данные на Вашем мобильном уÑтройÑтве. \nПродолжить?"; "tagWasAdded" = "ЕÑли Ð’Ñ‹ захотите Ñинхронизировать Ñтот календарь, то будет необходимо заново Ñинхронизировать данные на Вашем мобильном уÑтройÑтве. \nПродолжить?"; "tagWasRemoved" = "ЕÑли вы удалите Ñтот календарь, то будет необходимо заново Ñинхронизировать данные на Вашем мобильном уÑтройÑтве.\n Продолжить?"; "DestinationCalendarError" = "ИÑходный и целевой календари Ñовпадают. ПожалуйÑта, выберите другой целевой календарь."; "EventCopyError" = "Копирование не удалоÑÑŒ. ПожалуйÑта, попытайтеÑÑŒ Ñкопировать в другой календарь."; "Open Task..." = "Открыть задание..."; "Mark Completed" = "Пометить как завершенное"; "Delete Task" = "Удалить задачу"; "Delete Event" = "Удалить Ñобытие"; "Copy event to my calendar" = "Копировать Ñобытие в мой календарь"; "View Raw Source" = "Показать иÑходный код ÑообщениÑ"; "Subscribe to a web calendar..." = "ПодпиÑатьÑÑ Ð½Ð° калентарь в Ñети..."; "URL of the Calendar" = "URL календарÑ"; "Web Calendar" = "Web Calendar"; "Reload on login" = "Перезагружать при входе"; "Invalid number." = "ЧиÑло неверно."; "Please identify yourself to %{0}" = "ПожалуйÑта, предÑтавьте ÑÐµÐ±Ñ %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxCalMonthViewOld.m0000644000000000000000000000157012247657030017231 0ustar rootroot#import #import #import #import "UIxCalMonthViewOld.h" @implementation UIxCalMonthViewOld - (NSCalendarDate *) startOfMonth { return [[[super startDate] firstDayOfMonth] beginOfDay]; } - (NSCalendarDate *) startDate { return [[self startOfMonth] mondayOfWeek]; } /* URLs */ - (NSDictionary *) prevMonthQueryParameters { NSCalendarDate *date; date = [[self startOfMonth] dateByAddingYears:0 months:-1 days:0 hours:0 minutes:0 seconds:0]; return [self queryParametersBySettingSelectedDate:date]; } - (NSDictionary *)nextMonthQueryParameters { NSCalendarDate *date; date = [[self startOfMonth] dateByAddingYears:0 months:1 days:0 hours:0 minutes:0 seconds:0]; return [self queryParametersBySettingSelectedDate:date]; } @end /* UIxCalMonthView */ SOGo-2.1.1b/UI/Scheduler/SpanishArgentina.lproj/0000755000000000000000000000000012247657030020006 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/SpanishArgentina.lproj/Localizable.strings0000644000000000000000000004160712247657030023652 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Crear un nuevo evento"; "Create a new task" = "Crear una nueva tarea"; "Edit this event or task" = "Modificar éste evento o tarea"; "Delete this event or task" = "Borrar éste evento o tarea"; "Go to today" = "Ir a hoy"; "Switch to day view" = "Cambiar a vista diaria"; "Switch to week view" = "Cambiar a vista semanal"; "Switch to month view" = "Cambiar a vista mensual"; "Reload all calendars" = "Recargar todos los calendarios"; /* Tabs */ "Date" = "Fecha"; "Calendars" = "Calendarios"; /* Day */ "DayOfTheMonth" = "Día del mes"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "Hoy"; "Previous Day" = "Día anterior"; "Next Day" = "Próximo día"; /* Week */ "Week" = "Semana"; "this week" = "ésta semana"; "Week %d" = "Semana %d"; "Previous Week" = "Semana anterior"; "Next Week" = "Próxima semana"; /* Month */ "this month" = "éste mes"; "Previous Month" = "Mes anterior"; "Next Month" = "Próximo mes"; /* Year */ "this year" = "éste año"; /* Menu */ "Calendar" = "Calendario"; "Contacts" = "Contactos"; "New Calendar..." = "Nuevo calendario..."; "Delete Calendar" = "Borrar calendario"; "Unsubscribe Calendar" = "Darse de baja del calendario"; "Sharing..." = "Compartir..."; "Export Calendar..." = "Exportar calendario..."; "Import Events..." = "Importar Eventos..."; "Import Events" = "Importar Eventos"; "Select an iCalendar file (.ics)." = "Seleccionar un fichero iCalendar (.ics)."; "Upload" = "Subir"; "Uploading" = "Cargando"; "Publish Calendar..." = "Publicar calendario..."; "Reload Remote Calendars" = "Recargar calendarios remotos"; "Properties" = "Propiedades"; "Done" = "Hecho"; "An error occurred while importing calendar." = "Ha ocurrido un error mientras importaba el calendario."; "No event was imported." = "El evento no fue importado."; "A total of %{0} events were imported in the calendar." = "Un total de %{0} eventos fueron importados al calendario."; "Compose E-Mail to All Attendees" = "Crear correo para todos los asistentes"; "Compose E-Mail to Undecided Attendees" = "Crear correo para todos los asistentes que aún no se han decidido"; /* Folders */ "Personal calendar" = "Calendario personal"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Prohibido"; /* acls */ "Access rights to" = "Permisos de acceso a"; "For user" = "Para el usuario"; "Any Authenticated User" = "Cualquier Usuario Autenticado "; "Public Access" = "Acceso Público"; "label_Public" = "Público"; "label_Private" = "Privado"; "label_Confidential" = "Confidencial"; "label_Viewer" = "Ver todo"; "label_DAndTViewer" = "Ver fecha y hora"; "label_Modifier" = "Modificar"; "label_Responder" = "Responder a"; "label_None" = "Ninguno"; "View All" = "Ver todo"; "View the Date & Time" = "Ver fecha y hora"; "Modify" = "Modificar"; "Respond To" = "Responder a"; "None" = "Ninguno"; "This person can create objects in my calendar." = "Esta persona puede crear elementos en mi calendario."; "This person can erase objects from my calendar." = "Esta persona puede eliminar elementos de mi calendario."; /* Button Titles */ "Subscribe to a Calendar..." = "Darse de alta en un calendario..."; "Remove the selected Calendar" = "Borrar calendario seleccionado"; "Name of the Calendar" = "Nombre del calendario"; "new" = "Nuevo"; "printview" = "Vista previa"; "edit" = "Modificar"; "delete" = "Borrar"; "proposal" = "Propuesta"; "Save and Close" = "Guardar y cerrar"; "Close" = "Cerrar"; "Invite Attendees" = "Invitar asistentes"; "Attach" = "Adjuntar"; "Update" = "Actualizar"; "Cancel" = "Cancelar"; "show_rejected_apts" = "Mostrar citas rechazadas"; "hide_rejected_apts" = "Ocultar citas rechazadas"; /* Schedule */ "Schedule" = "Agenda"; "No appointments found" = "No se han encontrado eventos"; "Meetings proposed by you" = "Eventos propuestos por usted"; "Meetings proposed to you" = "Eventos propuestos para usted"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Acción"; "accept" = "Aceptar"; "decline" = "Rechazar"; "more attendees" = "Más asistentes"; "Hide already accepted and rejected appointments" = "Ocultar eventos ya confirmados o rechazados"; "Show already accepted and rejected appointments" = "Mostrar eventos ya confirmados o rechazados"; /* Appointments */ "Appointment viewer" = "Visor de eventos"; "Appointment editor" = "Editor de eventos"; "Appointment proposal" = "Propuesta de evento"; "Appointment on" = "Evento"; "Start:" = "Desde:"; "End:" = "Hasta:"; "Due Date:" = "Vencimiento:"; "Title:" = "Título:"; "Calendar:" = "Calendario:"; "Name" = "Nombre"; "Email" = "Correo"; "Status:" = "Estado:"; "% complete" = "% completo"; "Location:" = "Lugar:"; "Priority:" = "Prioridad:"; "Privacy" = "Privacidad"; "Cycle" = "Repetir"; "Cycle End" = "Fin repetición"; "Categories" = "Categorías"; "Classification" = "Privacidad"; "Duration" = "Duración"; "Attendees:" = "Asistentes:"; "Resources" = "Recursos"; "Organizer:" = "Organizador:"; "Description:" = "Descripción:"; "Document:" = "Documento:"; "Category:" = "Categoría:"; "Repeat:" = "Repetir:"; "Reminder:" = "Recordatorio:"; "General:" = "General:"; "Reply:" = "Responder:"; "Target:" = "URL documento:"; "attributes" = "atributos"; "attendees" = "asistentes"; "delegated from" = "delegado de"; /* checkbox title */ "is private" = "es privado"; /* classification */ "Public" = "Público"; "Private" = "Privado"; /* text used in overviews and tooltips */ "empty title" = "Sin título"; "private appointment" = "Evento privado"; "Change..." = "Modificar..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Requiere acción"; "partStat_ACCEPTED" = "Asistiré"; "partStat_DECLINED" = "No asistiré"; "partStat_TENTATIVE" = "Lo confirmaré más tarde"; "partStat_DELEGATED" = "Delegado"; "partStat_OTHER" = "Otro"; /* Appointments (error messages) */ "Conflicts found!" = "Hay conflictos!"; "Invalid iCal data!" = "¡Datos iCal no válidos!"; "Could not create iCal data!" = "¡No se pueden crear datos en formato iCal!"; /* Searching */ "view_all" = "Todos los eventos"; "view_today" = "Hoy"; "view_next7" = "Próximos 7 días"; "view_next14" = "Próximos 14 días"; "view_next31" = "Próximos 31 días"; "view_thismonth" = "Este mes"; "view_future" = "Todos los eventos futuros"; "view_selectedday" = "Día seleccionado"; "View:" = "Ver:"; "Title or Description" = "Título o descripción"; "Search" = "Buscar"; "Search attendees" = "Buscar asistentes"; "Search resources" = "Buscar recursos"; "Search appointments" = "Buscar eventos"; "All day Event" = "Todo el día"; "check for conflicts" = "Buscar conflictos"; "Browse URL" = "Ir a URL"; "newAttendee" = "Añadir asistente"; /* calendar modes */ "Overview" = "Resumen"; "Chart" = "Tabla"; "List" = "Lista"; "Columns" = "Columnas"; /* Priorities */ "prio_0" = "No especificada"; "prio_1" = "Alta"; "prio_2" = "Alta"; "prio_3" = "Alta"; "prio_4" = "Alta"; "prio_5" = "Normal"; "prio_6" = "Baja"; "prio_7" = "Baja"; "prio_8" = "Baja"; "prio_9" = "Baja"; /* access classes (privacy) */ "PUBLIC_vevent" = "Evento público"; "CONFIDENTIAL_vevent" = "Evento confidencial"; "PRIVATE_vevent" = "Evento privado"; "PUBLIC_vtodo" = "Tarea pública"; "CONFIDENTIAL_vtodo" = "Tarea confidencial"; "PRIVATE_vtodo" = "Tarea privada"; /* status type */ "status_" = "No especificado"; "status_NOT-SPECIFIED" = "No especificado"; "status_TENTATIVE" = "Tentativo"; "status_CONFIRMED" = "Confirmado"; "status_CANCELLED" = "Cancelado"; "status_NEEDS-ACTION" = "Necesita intervención"; "status_IN-PROCESS" = "En proceso"; "status_COMPLETED" = "Completado"; /* Cycles */ "cycle_once" = "una repetición"; "cycle_daily" = "diariamente"; "cycle_weekly" = "semanalmente"; "cycle_2weeks" = "cada 2 semanas"; "cycle_4weeks" = "cada 4 semanas"; "cycle_monthly" = "mensualmente"; "cycle_weekday" = "cada día laboral"; "cycle_yearly" = "anualmente"; "cycle_end_never" = "para siempre"; "cycle_end_until" = "hasta: "; "Recurrence pattern" = "Patrón de frecuencia"; "Range of recurrence" = "Rango de frecuencia"; "Repeat" = "Repetir"; "Daily" = "diariamente"; "Weekly" = "semanalmente"; "Monthly" = "mensualmente"; "Yearly" = "anualmente"; "Every" = "cada"; "Days" = "días"; "Week(s)" = "semana(s)"; "On" = "en"; "Month(s)" = "mes(es)"; "The" = "El"; "Recur on day(s)" = "Repetir en día(s)"; "Year(s)" = "año(s)"; "cycle_of" = "de"; "No end date" = "Sin fecha de finalización"; "Create" = "Crear"; "appointment(s)" = "evento(s)"; "Repeat until" = "Repetir hasta: "; "First" = "Primero"; "Second" = "Segundo"; "Third" = "Tercero"; "Fourth" = "Cuarto"; "Fift" = "Quinto"; "Last" = "Último"; /* Appointment categories */ "category_none" = "Ninguna"; "category_labels" = "Aniversario,Cumpleaños,Negocios,Llamadas,Clientes,Competencia,Trabajo,Favoritos,Seguimiento,Regalos,Fiestas,Ideas,Reunión,Asuntos,Varios,Personal,Proyectos,Vacaciones públicas,Estado,Proveedores,Viajes,Vacaciones"; "repeat_NEVER" = "sin repetición"; "repeat_DAILY" = "diariamente"; "repeat_WEEKLY" = "semanalmente"; "repeat_BI-WEEKLY" = "cada dos semanas"; "repeat_EVERY WEEKDAY" = "cada día laboral"; "repeat_MONTHLY" = "mensualmente"; "repeat_YEARLY" = "anualmente"; "repeat_CUSTOM" = "personalizado..."; "reminder_NONE" = "Sin recordatorio"; "reminder_5_MINUTES_BEFORE" = "5 minutos antes"; "reminder_10_MINUTES_BEFORE" = "10 minutos antes"; "reminder_15_MINUTES_BEFORE" = "15 minutos antes"; "reminder_30_MINUTES_BEFORE" = "30 minutos antes"; "reminder_45_MINUTES_BEFORE" = "45 minutos antes"; "reminder_1_HOUR_BEFORE" = "1 hora antes"; "reminder_2_HOURS_BEFORE" = "2 horas antes"; "reminder_5_HOURS_BEFORE" = "5 horas antes"; "reminder_15_HOURS_BEFORE" = "15 horas antes"; "reminder_1_DAY_BEFORE" = "1 día antes"; "reminder_2_DAYS_BEFORE" = "2 días antes"; "reminder_1_WEEK_BEFORE" = "1 semana antes"; "reminder_CUSTOM" = "personalizado..."; "reminder_MINUTES" = "minutos"; "reminder_HOURS" = "horas"; "reminder_DAYS" = "días"; "reminder_BEFORE" = "antes"; "reminder_AFTER" = "después"; "reminder_START" = "el evento empieza"; "reminder_END" = "el evento termina"; "Reminder Details" = "Detalles del recordatorio"; "Choose a Reminder Action" = "Elegir una acción para el recordatorio"; "Show an Alert" = "Mostrar un alerta"; "Send an E-mail" = "Enviar un correo"; "Email Organizer" = "Enviar correo al organizador"; "Email Attendees" = "Enviar correo a los asistentes"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Mostrar tiempo como disponible"; /* validation errors */ validate_notitle = "No ha escrito un título, ¿Desea continuar?"; validate_invalid_startdate = "Fecha de inicio incorrecta"; validate_invalid_enddate = "Fecha de fin incorrecta"; validate_endbeforestart = "La fecha/hora de inicio es posterior a la de fin."; "Events" = "Eventos"; "Tasks" = "Tareas"; "Show completed tasks" = "Mostrar tareas completadas"; /* tabs */ "Task" = "Tarea"; "Event" = "Evento"; "Recurrence" = "Frecuencia"; /* toolbar */ "New Event" = "Nuevo evento"; "New Task" = "Nueva tarea"; "Edit" = "Modificar"; "Delete" = "Borrar"; "Go to Today" = "Ir a hoy"; "Day View" = "Vista diaria"; "Week View" = "Vista semanal"; "Month View" = "Vista mensual"; "Reload" = "Recargar"; "eventPartStatModificationError" = "Su estado de participación no puede ser actualizado."; /* menu */ "New Event..." = "Nuevo evento..."; "New Task..." = "Nueva tarea..."; "Edit Selected Event..." = "Modificar evento seleccionado..."; "Delete Selected Event" = "Borrar evento seleccionado"; "Select All" = "Seleccionar todo"; "Workweek days only" = "Sólo días laborales"; "Tasks in View" = "Mostrar tareas"; "eventDeleteConfirmation" = "Se eliminarán el/los siguiente(s) evento(s) : \n%{0}\n¿Desea proceder?"; "taskDeleteConfirmation" = "No se puede deshacer el borrado de esta tarea. ¿Desea continuar?"; "You cannot remove nor unsubscribe from your personal calendar." = "No puede quitarse ni darse de baja de su calendario personal."; "Are you sure you want to delete the calendar \"%{0}\"?" = "¿Está seguro/a que desea borrar el calendario \"%{0}\"?"; /* Legend */ "Participant" = "Asistente"; "Optional Participant" = "Asistentes opcionales"; "Non Participant" = "No asistente"; "Chair" = "Presidente"; "Needs action" = "Requiere intervención"; "Accepted" = "Confirmada"; "Declined" = "Rechazada"; "Tentative" = "Tentativo"; "Free" = "Libre"; "Busy" = "Ocupado"; "Maybe busy" = "Posiblemente ocupado"; "No free-busy information" = "Sin información de disponibilidad."; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Proponer intervalo de tiempo:"; "Zoom:" = "Ampliación:"; "Previous slot" = "Intervalo anterior"; "Next slot" = "Intervalo siguiente"; "Previous hour" = "Hora anterior"; "Next hour" = "Hora siguiente"; "Work days only" = "Sólo día laboral"; "The whole day" = "El día entero"; "Between" = "entre"; "and" = "y"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Existe un conflicto de disponibilidad con uno o más asistentes.\n¿Quiere guardar ésta propuesta de todas formas?"; /* apt list */ "Title" = "Título"; "Start" = "Inicio"; "End" = "Fin"; "Due Date" = "Vencimiento"; "Location" = "Lugar"; "(Private Event)" = "(Evento privado)"; vevent_class0 = "(Evento público)"; vevent_class1 = "(Evento privado)"; vevent_class2 = "(Evento confidencial)"; "Priority" = "Prioridad"; "Category" = "Categoría"; vtodo_class0 = "(Tarea pública)"; vtodo_class1 = "(Tarea privada)"; vtodo_class2 = "(Tarea confidencial)"; "closeThisWindowMessage" = "¡Gracias! Ya puede cerrar esta ventana."; "Multicolumn Day View" = "Vista diaria multicolumna"; "Please select an event or a task." = "Por favor, seleccione un evento o tarea"; "editRepeatingItem" = "El elemento que está editando es un elemento repetitivo. ¿Quiere editar todas las apariciones o sólo esta instancia?"; "button_thisOccurrenceOnly" = "Sólo esta aparición"; "button_allOccurrences" = "Todas las apariciones"; /* Properties dialog */ "Name:" = "Nombre:"; "Color:" = "Color:"; "Include in free-busy" = "Incluye en tiempo libre-ocupado"; "Synchronization" = "Sincronización"; "Synchronize" = "Sincronizar"; "Tag:" = "Etiqueta:"; "Display" = "Mostrar"; "Show alarms" = "Mostrar alarmas"; "Show tasks" = "Mostrar tareas"; "Notifications" = "Notificaciones"; "Receive a mail when I modify my calendar" = "Recibir un correo de notificación cuando modifique mi calendario"; "Receive a mail when someone else modifies my calendar" = "Recibir un correo de notificación cuando otra persona modifique mi calendario"; "When I modify my calendar, send a mail to:" = "Cuando modifique mi calendario enviar un correo a: "; "Links to this Calendar" = "Vínculos a éste calendario"; "Authenticated User Access" = "Acceso a usuario autenticado"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "URL ICS WebDAV"; "WebDAV XML URL" = "URL XML WebDAV"; /* Error messages */ "dayFieldInvalid" = "Por favor, especificar un valor numérico en el campo día superior o igual a 1."; "weekFieldInvalid" = "Por favor, especificar un valor numérico en el campo semana(s) superior o igual a 1."; "monthFieldInvalid" = "Por favor, especificar un valor numérico en el campo mes superior o igual a 1."; "monthDayFieldInvalid" = "Por favor, especificar un valor numérico en el campo día del mes superior o igual a 1."; "yearFieldInvalid" = "Por favor, especificar un valor numérico en el campo año superior o igual a 1."; "appointmentFieldInvalid" = "Por favor, especificar un valor numérico en el campo cita(s) superior o igual a 1."; "recurrenceUnsupported" = "Este tipo de frecuencia no esta soportado."; "Please specify a calendar name." = "Por favor ingrese el nombre del calendario."; "tagNotDefined" = "Tiene que especificar una etiqueta si quiere sincronizar este calendario."; "tagAlreadyExists" = "La etiqueta especificada ya esta asociada a otro calendario."; "tagHasChanged" = "Si cambia la etiqueta de este calendario, necesitará recargar los datos en su teléfono móvil.\n¿Continuar?"; "tagWasAdded" = "Si quiere sincronizar con este calendario, necesitará recargar los datos en su teléfono móvil.\n¿Continuar?"; "tagWasRemoved" = "Si quita este calendario de la sincronización, necesitará recargar los datos en su teléfono móvil.\n¿Continuar?"; "DestinationCalendarError" = "El calendario de origen y el de destino son iguales. Por favor, intente copiar a otro calendario."; "EventCopyError" = "La copia falló. Por favor, intente copiar a un calendario distinto."; "Open Task..." = "Abrir tarea..."; "Mark Completed" = "Marcar como completo"; "Delete Task" = "Borrar tarea"; "Delete Event" = "Borrar evento"; "Copy event to my calendar" = "Copiar evento a mi calendario"; "View Raw Source" = "Ver el original"; "Subscribe to a web calendar..." = "Subscribir a calendario Web..."; "URL of the Calendar" = "URL del calendario"; "Web Calendar" = "Calendario Web"; "Reload on login" = "Recargar al reconectar"; "Invalid number." = "Número invalido."; "Please identify yourself to %{0}" = "Por favor autentíquese en %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxAppointmentEditor.m0000644000000000000000000004701212247657030017700 0ustar rootroot/* UIxAppointmentEditor.m - this file is part of SOGo * * Copyright (C) 2007-2013 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "UIxComponentEditor.h" #import "UIxAppointmentEditor.h" @implementation UIxAppointmentEditor - (id) init { SOGoUser *user; if ((self = [super init])) { aptStartDate = nil; aptEndDate = nil; item = nil; event = nil; isAllDay = NO; isTransparent = NO; sendAppointmentNotifications = YES; componentCalendar = nil; user = [[self context] activeUser]; ASSIGN (dateFormatter, [user dateFormatterInContext: context]); } return self; } - (void) dealloc { [item release]; [[event parent] release]; [aptStartDate release]; [aptEndDate release]; [dateFormatter release]; [componentCalendar release]; [super dealloc]; } /* template values */ - (iCalEvent *) event { if (!event) { event = (iCalEvent *) [[self clientObject] occurence]; [[event parent] retain]; } return event; } - (NSString *) saveURL { return [NSString stringWithFormat: @"%@/saveAsAppointment", [[self clientObject] baseURL]]; } /* icalendar values */ - (BOOL) isAllDay { NSString *hm; hm = [self queryParameterForKey: @"hm"]; return (isAllDay || [hm isEqualToString: @"allday"]); } - (void) setIsAllDay: (BOOL) newIsAllDay { isAllDay = newIsAllDay; } - (BOOL) isTransparent { return isTransparent; } - (void) setIsTransparent: (BOOL) newIsTransparent { isTransparent = newIsTransparent; } - (void) setSendAppointmentNotifications: (BOOL) theBOOL { sendAppointmentNotifications = theBOOL; } - (BOOL) sendAppointmentNotifications { return sendAppointmentNotifications; } - (void) setAptStartDate: (NSCalendarDate *) newAptStartDate { ASSIGN (aptStartDate, newAptStartDate); } - (NSCalendarDate *) aptStartDate { return aptStartDate; } - (void) setAptEndDate: (NSCalendarDate *) newAptEndDate { ASSIGN (aptEndDate, newAptEndDate); } - (NSCalendarDate *) aptEndDate { return aptEndDate; } - (void) setItem: (NSString *) newItem { ASSIGN (item, newItem); } - (NSString *) item { return item; } - (SOGoAppointmentFolder *) componentCalendar { return componentCalendar; } - (void) setComponentCalendar: (SOGoAppointmentFolder *) _componentCalendar { ASSIGN (componentCalendar, _componentCalendar); } /* read-only event */ - (NSString *) aptStartDateText { return [dateFormatter formattedDate: aptStartDate]; } - (NSString *) aptStartDateTimeText { return [dateFormatter formattedDateAndTime: aptStartDate]; } - (NSString *) aptEndDateText { return [dateFormatter formattedDate: aptEndDate]; } - (NSString *) aptEndDateTimeText { return [dateFormatter formattedDateAndTime: aptEndDate]; } - (BOOL) startDateIsEqualToEndDate { return [aptStartDate isEqualToDate: aptEndDate]; } /* actions */ - (NSCalendarDate *) newStartDate { NSCalendarDate *newStartDate, *now; NSTimeZone *timeZone; SOGoUserDefaults *ud; int hour, minute; unsigned int uStart, uEnd; newStartDate = [self selectedDate]; if (![[self queryParameterForKey: @"hm"] length]) { ud = [[context activeUser] userDefaults]; timeZone = [ud timeZone]; now = [NSCalendarDate calendarDate]; [now setTimeZone: timeZone]; uStart = [ud dayStartHour]; if ([now isDateOnSameDay: newStartDate]) { uEnd = [ud dayEndHour]; hour = [now hourOfDay]; minute = [now minuteOfHour]; if (minute % 15) minute += 15 - (minute % 15); if (hour < uStart) newStartDate = [now hour: uStart minute: 0]; else if (hour > uEnd) newStartDate = [[now tomorrow] hour: uStart minute: 0]; else newStartDate = [now hour: [now hourOfDay] minute: minute]; } else newStartDate = [newStartDate hour: uStart minute: 0]; } return newStartDate; } - (id ) defaultAction { NSCalendarDate *startDate, *endDate; NSString *duration; NSTimeZone *timeZone; unsigned int total, hours, minutes; signed int offset; SOGoObject *co; SOGoUserDefaults *ud; [self event]; co = [self clientObject]; ud = [[context activeUser] userDefaults]; timeZone = [ud timeZone]; if ([co isNew] && [co isKindOfClass: [SOGoCalendarComponent class]]) { startDate = [self newStartDate]; duration = [self queryParameterForKey:@"duration"]; if ([duration length] > 0) { total = [duration intValue]; hours = total / 100; minutes = total % 100; } else { hours = 1; minutes = 0; } endDate = [startDate dateByAddingYears: 0 months: 0 days: 0 hours: hours minutes: minutes seconds: 0]; sendAppointmentNotifications = YES; } else { startDate = [event startDate]; isAllDay = [event isAllDay]; endDate = [event endDate]; if (isAllDay) { endDate = [endDate dateByAddingYears: 0 months: 0 days: -1]; // Convert the dates to the user's timezone offset = [timeZone secondsFromGMTForDate: startDate]; startDate = [startDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:-offset]; endDate = [endDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:-offset]; } isTransparent = ![event isOpaque]; sendAppointmentNotifications = ([event firstChildWithTag: @"X-SOGo-Send-Appointment-Notifications"] ? NO : YES); } [startDate setTimeZone: timeZone]; ASSIGN (aptStartDate, startDate); [endDate setTimeZone: timeZone]; ASSIGN (aptEndDate, endDate); return self; } - (id ) newAction { NSString *objectId, *method, *uri; id result; SOGoAppointmentFolder *co; SoSecurityManager *sm; co = [self clientObject]; objectId = [co globallyUniqueObjectId]; if ([objectId length]) { sm = [SoSecurityManager sharedSecurityManager]; if (![sm validatePermission: SoPerm_AddDocumentsImagesAndFiles onObject: co inContext: context]) method = [NSString stringWithFormat:@"%@/%@.ics/editAsAppointment", [co soURL], objectId] ; else method = [NSString stringWithFormat: @"%@/Calendar/personal/%@.ics/editAsAppointment", [self userFolderPath], objectId]; uri = [self completeHrefForMethod: method]; result = [self redirectToLocation: uri]; } else result = [NSException exceptionWithHTTPStatus: 500 /* Internal Error */ reason: @"could not create a unique ID"]; return result; } - (void) _adjustRecurrentRules { iCalRecurrenceRule *rule; NSEnumerator *rules; NSCalendarDate *untilDate; SOGoUserDefaults *ud; NSTimeZone *timeZone; rules = [[event recurrenceRules] objectEnumerator]; ud = [[context activeUser] userDefaults]; timeZone = [ud timeZone]; while ((rule = [rules nextObject])) { untilDate = [rule untilDate]; if (untilDate) { // The until date must match the time of the end date NSCalendarDate *date; date = [[event endDate] copy]; [date setTimeZone: timeZone]; [untilDate setTimeZone: timeZone]; untilDate = [untilDate dateByAddingYears:0 months:0 days:0 hours:[date hourOfDay] minutes:[date minuteOfHour] seconds:0]; [rule setUntilDate: untilDate]; [date release]; } } } - (id ) saveAction { SOGoAppointmentFolder *previousCalendar; SOGoAppointmentObject *co; NSString *jsonResponse; SoSecurityManager *sm; NSException *ex; co = [self clientObject]; if ([co isKindOfClass: [SOGoAppointmentOccurence class]]) co = [co container]; previousCalendar = [co container]; sm = [SoSecurityManager sharedSecurityManager]; ex = nil; if ([event hasRecurrenceRules]) [self _adjustRecurrentRules]; if ([co isNew]) { if (componentCalendar && ![[componentCalendar ocsPath] isEqualToString: [previousCalendar ocsPath]]) { // New event in a different calendar -- make sure the user can // write to the selected calendar since the rights were verified // on the calendar specified in the URL, not on the selected // calendar of the popup menu. if (![sm validatePermission: SoPerm_AddDocumentsImagesAndFiles onObject: componentCalendar inContext: context]) co = [componentCalendar lookupName: [co nameInContainer] inContext: context acquire: NO]; } // Save the event. ex = [co saveComponent: event]; } else { // The event was modified -- save it. ex = [co saveComponent: event]; if (componentCalendar && ![[componentCalendar ocsPath] isEqualToString: [previousCalendar ocsPath]]) { // The event was moved to a different calendar. if (![sm validatePermission: SoPerm_DeleteObjects onObject: previousCalendar inContext: context]) { if (![sm validatePermission: SoPerm_AddDocumentsImagesAndFiles onObject: componentCalendar inContext: context]) ex = [co moveToFolder: componentCalendar]; } } } if (ex) jsonResponse = [NSDictionary dictionaryWithObjectsAndKeys: @"failure", @"status", [ex reason], @"message", nil]; else jsonResponse = [NSDictionary dictionaryWithObjectsAndKeys: @"success", @"status", nil]; return [self responseWithStatus: 200 andString: [jsonResponse jsonRepresentation]]; } - (id ) viewAction { WOResponse *result; NSDictionary *data; NSCalendarDate *eventStartDate, *eventEndDate; NSTimeZone *timeZone; SOGoUserDefaults *ud; SOGoCalendarComponent *co; NSString *created_by; BOOL resetAlarm; unsigned int snoozeAlarm; [self event]; result = [self responseWithStatus: 200]; ud = [[context activeUser] userDefaults]; timeZone = [ud timeZone]; eventStartDate = [event startDate]; eventEndDate = [event endDate]; [eventStartDate setTimeZone: timeZone]; [eventEndDate setTimeZone: timeZone]; co = [self clientObject]; if (!componentCalendar) { componentCalendar = [co container]; if ([componentCalendar isKindOfClass: [SOGoCalendarComponent class]]) componentCalendar = [componentCalendar container]; [componentCalendar retain]; } if ([event hasAlarms] && ![event hasRecurrenceRules]) { iCalAlarm *anAlarm; resetAlarm = [[[context request] formValueForKey: @"resetAlarm"] boolValue]; snoozeAlarm = [[[context request] formValueForKey: @"snoozeAlarm"] intValue]; if (resetAlarm) { iCalTrigger *aTrigger; anAlarm = [[event alarms] objectAtIndex: 0]; aTrigger = [anAlarm trigger]; [aTrigger setValue: 0 ofAttribute: @"x-webstatus" to: @"triggered"]; [co saveComponent: event]; } else if (snoozeAlarm) { anAlarm = [[event alarms] objectAtIndex: 0]; if ([[anAlarm action] caseInsensitiveCompare: @"DISPLAY"] == NSOrderedSame) [co snoozeAlarm: snoozeAlarm]; } } created_by = [event createdBy]; data = [NSDictionary dictionaryWithObjectsAndKeys: [componentCalendar displayName], @"calendar", [event tag], @"component", [dateFormatter formattedDate: eventStartDate], @"startDate", [dateFormatter formattedTime: eventStartDate], @"startTime", [dateFormatter formattedDate: eventEndDate], @"endDate", [dateFormatter formattedTime: eventEndDate], @"endTime", //([event hasRecurrenceRules] ? @"1": @"0"), @"isRecurring", ([event isAllDay] ? @"1": @"0"), @"isAllDay", [event summary], @"summary", [event location], @"location", created_by, @"created_by", [event comment], @"description", nil]; [result appendContentString: [data jsonRepresentation]]; return result; } - (BOOL) shouldTakeValuesFromRequest: (WORequest *) request inContext: (WOContext*) context { NSString *actionName; actionName = [[request requestHandlerPath] lastPathComponent]; return ([[self clientObject] conformsToProtocol: @protocol (SOGoComponentOccurence)] && [actionName hasPrefix: @"save"]); } - (void) takeValuesFromRequest: (WORequest *) _rq inContext: (WOContext *) _ctx { int nbrDays; iCalDateTime *startDate; iCalTimeZone *tz; NSCalendarDate *allDayStartDate; NSTimeZone *timeZone; SOGoUserDefaults *ud; signed int offset; id o; [self event]; [super takeValuesFromRequest: _rq inContext: _ctx]; if (isAllDay) { nbrDays = ((float) abs ([aptEndDate timeIntervalSinceDate: aptStartDate]) / 86400) + 1; // Convert all-day start date to GMT (floating date) ud = [[context activeUser] userDefaults]; timeZone = [ud timeZone]; offset = [timeZone secondsFromGMTForDate: aptStartDate]; allDayStartDate = [aptStartDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:offset]; [event setAllDayWithStartDate: allDayStartDate duration: nbrDays]; } else { [event setStartDate: aptStartDate]; [event setEndDate: aptEndDate]; } if (!isAllDay) { // Make sure there's a vTimeZone associated to the event unless it // is an all-day event. startDate = (iCalDateTime *)[event uniqueChildWithTag: @"dtstart"]; if (![startDate timeZone]) { ud = [[context activeUser] userDefaults]; tz = [iCalTimeZone timeZoneForName: [ud timeZoneName]]; if ([[event parent] addTimeZone: tz]) { [startDate setTimeZone: tz]; [(iCalDateTime *)[event uniqueChildWithTag: @"dtend"] setTimeZone: tz]; } } } else if (![[self clientObject] isNew]) { // Remove the vTimeZone when dealing with an all-day event. startDate = (iCalDateTime *)[event uniqueChildWithTag: @"dtstart"]; tz = [startDate timeZone]; if (tz) { [startDate setTimeZone: nil]; [(iCalDateTime *)[event uniqueChildWithTag: @"dtend"] setTimeZone: nil]; [[event parent] removeChild: tz]; } } [event setTransparency: (isTransparent? @"TRANSPARENT" : @"OPAQUE")]; o = [event firstChildWithTag: @"X-SOGo-Send-Appointment-Notifications"]; if (!sendAppointmentNotifications && !o) [event addChild: [CardElement simpleElementWithTag: @"X-SOGo-Send-Appointment-Notifications" value: @"NO"]]; else if (sendAppointmentNotifications && o) [event removeChild: o]; } - (id) _statusChangeAction: (NSString *) newStatus { [[self clientObject] changeParticipationStatus: newStatus withDelegate: nil]; return [self responseWith204]; } - (id) acceptAction { return [self _statusChangeAction: @"ACCEPTED"]; } - (id) declineAction { return [self _statusChangeAction: @"DECLINED"]; } - (id) needsActionAction { return [self _statusChangeAction: @"NEEDS-ACTION"]; } - (id) tentativeAction { return [self _statusChangeAction: @"TENTATIVE"]; } - (id) delegateAction { // BOOL receiveUpdates; NSString *delegatedEmail, *delegatedUid; iCalPerson *delegatedAttendee; SOGoUser *user; WORequest *request; WOResponse *response; response = nil; request = [context request]; delegatedEmail = [request formValueForKey: @"to"]; if ([delegatedEmail length]) { user = [context activeUser]; delegatedAttendee = [iCalPerson new]; [delegatedAttendee autorelease]; [delegatedAttendee setEmail: delegatedEmail]; delegatedUid = [delegatedAttendee uid]; if (delegatedUid) { SOGoUser *delegatedUser; delegatedUser = [SOGoUser userWithLogin: delegatedUid]; [delegatedAttendee setCn: [delegatedUser cn]]; } [delegatedAttendee setRole: @"REQ-PARTICIPANT"]; [delegatedAttendee setRsvp: @"TRUE"]; [delegatedAttendee setParticipationStatus: iCalPersonPartStatNeedsAction]; [delegatedAttendee setDelegatedFrom: [NSString stringWithFormat: @"mailto:%@", [[user allEmails] objectAtIndex: 0]]]; // receiveUpdates = [[request formValueForKey: @"receiveUpdates"] boolValue]; // if (receiveUpdates) // [delegatedAttendee setRole: @"NON-PARTICIPANT"]; response = (WOResponse*)[[self clientObject] changeParticipationStatus: @"DELEGATED" withDelegate: delegatedAttendee]; } else response = [NSException exceptionWithHTTPStatus: 400 reason: @"missing 'to' parameter"]; if (!response) response = [self responseWith204]; return response; } @end SOGo-2.1.1b/UI/Scheduler/UIxTaskEditor.m0000644000000000000000000003336512247657030016312 0ustar rootroot/* UIxTaskEditor.m - this file is part of SOGo * * Copyright (C) 2007-2009 Inverse inc. * * 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "UIxComponentEditor.h" #import "UIxTaskEditor.h" @implementation UIxTaskEditor - (id) init { SOGoUser *user; if ((self = [super init])) { taskStartDate = nil; taskDueDate = nil; statusDate = nil; hasStartDate = NO; hasDueDate = NO; status = nil; statusPercent = nil; item = nil; todo = nil; user = [[self context] activeUser]; ASSIGN (dateFormatter, [user dateFormatterInContext: context]); } return self; } - (void) dealloc { [taskStartDate release]; [taskDueDate release]; [statusDate release]; [status release]; [statusPercent release]; [dateFormatter release]; [[todo parent] release]; [super dealloc]; } /* template values */ - (iCalToDo *) todo { if (!todo) { todo = (iCalToDo *) [[self clientObject] component: YES secure: YES]; [[todo parent] retain]; } return todo; } - (NSString *) saveURL { return [NSString stringWithFormat: @"%@/saveAsTask", [[self clientObject] baseURL]]; } /* icalendar values */ - (void) setTaskStartDate: (NSCalendarDate *) newTaskStartDate { ASSIGN (taskStartDate, newTaskStartDate); } - (NSCalendarDate *) taskStartDate { return taskStartDate; } - (void) setHasStartDate: (BOOL) newHasStartDate { hasStartDate = newHasStartDate; } - (BOOL) hasStartDate { return hasStartDate; } - (BOOL) startDateDisabled { return !hasStartDate; } - (void) setTaskDueDate: (NSCalendarDate *) newTaskDueDate { ASSIGN (taskDueDate, newTaskDueDate); } - (NSCalendarDate *) taskDueDate { return taskDueDate; } - (void) setHasDueDate: (BOOL) newHasDueDate { hasDueDate = newHasDueDate; } - (BOOL) hasDueDate { return hasDueDate; } - (BOOL) dueDateDisabled { return !hasDueDate; } - (NSArray *) statusList { static NSArray *statusItems = nil; if (!statusItems) { statusItems = [NSArray arrayWithObjects: @"NEEDS-ACTION", @"IN-PROCESS", @"COMPLETED", @"CANCELLED", nil]; [statusItems retain]; } return statusItems; } - (NSString *) itemStatusText { if (!item) { item = status; if (!item) item = @"NOT-SPECIFIED"; } return [self labelForKey: [NSString stringWithFormat: @"status_%@", item]]; } - (void) setItem: (NSString *) newItem { item = newItem; } - (NSString *) item { return item; } - (NSString *) status { return status; } - (void) setStatus: (NSString *) newStatus { status = newStatus; } - (void) setStatusDate: (NSCalendarDate *) newStatusDate { ASSIGN (statusDate, newStatusDate); } - (NSCalendarDate *) statusDate { return statusDate; } - (BOOL) statusDateDisabled { return ![status isEqualToString: @"COMPLETED"]; } - (BOOL) statusPercentDisabled { return ([status length] == 0 || [status isEqualToString: @"CANCELLED"]); } - (void) setStatusPercent: (NSString *) newStatusPercent { ASSIGN (statusPercent, newStatusPercent); } - (NSString *) statusPercent { return statusPercent; } /* viewing read-only tasks */ - (NSString *) taskStartDateTimeText { return [dateFormatter formattedDateAndTime: taskStartDate]; } - (NSString *) taskDueDateTimeText { return [dateFormatter formattedDateAndTime: taskDueDate]; } - (NSString *) statusDateText { return [dateFormatter formattedDate: statusDate]; } /* actions */ - (NSCalendarDate *) newStartDate { NSCalendarDate *newStartDate, *now; NSTimeZone *timeZone; SOGoUserDefaults *ud; int hour, minute; unsigned int uStart, uEnd; newStartDate = [self selectedDate]; if (![[self queryParameterForKey: @"hm"] length]) { ud = [[context activeUser] userDefaults]; timeZone = [ud timeZone]; now = [NSCalendarDate calendarDate]; [now setTimeZone: timeZone]; uStart = [ud dayStartHour]; if ([now isDateOnSameDay: newStartDate]) { uEnd = [ud dayEndHour]; hour = [now hourOfDay]; minute = [now minuteOfHour]; if (minute % 15) minute += 15 - (minute % 15); if (hour < uStart) newStartDate = [now hour: uStart minute: 0]; else if (hour > uEnd) newStartDate = [[now tomorrow] hour: uStart minute: 0]; else newStartDate = [now hour: [now hourOfDay] minute: minute]; } else newStartDate = [newStartDate hour: uStart minute: 0]; } return newStartDate; } - (id ) defaultAction { NSCalendarDate *startDate, *dueDate; NSString *duration; NSTimeZone *timeZone; SOGoUserDefaults *ud; unsigned int minutes; ud = [[context activeUser] userDefaults]; timeZone = [ud timeZone]; [self todo]; if (todo) { startDate = [todo startDate]; dueDate = [todo due]; if (startDate) hasStartDate = YES; else startDate = [self newStartDate]; if (dueDate) hasDueDate = YES; else dueDate = [self newStartDate]; ASSIGN (status, [todo status]); if ([status isEqualToString: @"COMPLETED"]) { ASSIGN (statusDate, [todo completed]); [statusDate setTimeZone: timeZone]; } else { ASSIGN (statusDate, [self newStartDate]); } ASSIGN (statusPercent, [todo percentComplete]); } else { startDate = [self newStartDate]; duration = [self queryParameterForKey:@"dur"]; if ([duration length] > 0) minutes = [duration intValue]; else minutes = 60; dueDate = [startDate dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: minutes seconds: 0]; hasStartDate = NO; hasDueDate = NO; ASSIGN (statusDate, [self newStartDate]); ASSIGN (status, @""); ASSIGN (statusPercent, @""); } [startDate setTimeZone: timeZone]; ASSIGN (taskStartDate, startDate); [dueDate setTimeZone: timeZone]; ASSIGN (taskDueDate, dueDate); /* here comes the code for initializing repeat, reminder and isAllDay... */ return self; } - (id ) newAction { NSString *objectId, *method, *uri; id result; SOGoAppointmentFolder *co; SoSecurityManager *sm; co = [self clientObject]; objectId = [co globallyUniqueObjectId]; if ([objectId length] > 0) { sm = [SoSecurityManager sharedSecurityManager]; if (![sm validatePermission: SoPerm_AddDocumentsImagesAndFiles onObject: co inContext: context]) { method = [NSString stringWithFormat:@"%@/%@.ics/editAsTask", [co soURL], objectId]; } else { method = [NSString stringWithFormat: @"%@/Calendar/personal/%@.vcf/editAsTask", [self userFolderPath], objectId]; } uri = [self completeHrefForMethod: method]; result = [self redirectToLocation: uri]; } else result = [NSException exceptionWithHTTPStatus: 500 /* Internal Error */ reason: @"could not create a unique ID"]; return result; } #warning this method could be replaced with a method common with UIxAppointmentEditor... - (id ) saveAction { NSString *newCalendar; SOGoAppointmentFolder *thisFolder, *newFolder; SOGoTaskObject *co; SoSecurityManager *sm; co = [self clientObject]; [co saveComponent: todo]; newCalendar = [self queryParameterForKey: @"moveToCalendar"]; if ([newCalendar length]) { sm = [SoSecurityManager sharedSecurityManager]; thisFolder = [co container]; if (![sm validatePermission: SoPerm_DeleteObjects onObject: thisFolder inContext: context]) { newFolder = [[thisFolder container] lookupName: newCalendar inContext: context acquire: NO]; if (![sm validatePermission: SoPerm_AddDocumentsImagesAndFiles onObject: newFolder inContext: context]) [co moveToFolder: newFolder]; } } return [self jsCloseWithRefreshMethod: @"refreshTasks()"]; } // - (id ) saveAction // { // SOGoTaskObject *clientObject; // NSString *iCalString; // clientObject = [self clientObject]; // iCalString = [[clientObject calendar: NO secure: NO] versitString]; // [clientObject saveContentString: iCalString]; // return [self jsCloseWithRefreshMethod: @"refreshTasks()"]; // } - (id ) viewAction { WOResponse *result; NSDictionary *data; NSCalendarDate *startDate, *dueDate; NSTimeZone *timeZone; SOGoUserDefaults *ud; BOOL resetAlarm; [self todo]; result = [self responseWithStatus: 200]; ud = [[context activeUser] userDefaults]; timeZone = [ud timeZone]; startDate = [todo startDate]; [startDate setTimeZone: timeZone]; dueDate = [todo due]; [dueDate setTimeZone: timeZone]; resetAlarm = [[[context request] formValueForKey: @"resetAlarm"] boolValue]; if (resetAlarm && [todo hasAlarms] && ![todo hasRecurrenceRules]) { iCalAlarm *anAlarm; iCalTrigger *aTrigger; SOGoCalendarComponent *co; anAlarm = [[todo alarms] objectAtIndex: 0]; aTrigger = [anAlarm trigger]; [aTrigger setValue: 0 ofAttribute: @"x-webstatus" to: @"triggered"]; co = [self clientObject]; [co saveComponent: todo]; } data = [NSDictionary dictionaryWithObjectsAndKeys: [todo tag], @"component", (startDate? (id)[dateFormatter formattedDate: startDate] : (id)@""), @"startDate", (startDate? (id)[dateFormatter formattedTime: startDate] : (id)@""), @"startTime", (dueDate? (id)[dateFormatter formattedDate: dueDate] : (id)@""), @"dueDate", (dueDate? (id)[dateFormatter formattedTime: dueDate] : (id)@""), @"dueTime", ([todo hasRecurrenceRules]? @"1": @"0"), @"isReccurent", [todo summary], @"summary", [todo location], @"location", [todo comment], @"description", nil]; [result appendContentString: [data jsonRepresentation]]; return result; } - (BOOL) shouldTakeValuesFromRequest: (WORequest *) request inContext: (WOContext*) context { NSString *actionName; actionName = [[request requestHandlerPath] lastPathComponent]; return ([[self clientObject] conformsToProtocol: @protocol (SOGoComponentOccurence)] && [actionName hasPrefix: @"save"]); } - (void) takeValuesFromRequest: (WORequest *) _rq inContext: (WOContext *) _ctx { SOGoUserDefaults *ud; iCalTimeZone *tz; [self todo]; [super takeValuesFromRequest: _rq inContext: _ctx]; if (hasStartDate) [todo setStartDate: taskStartDate]; else { [todo setStartDate: nil]; [todo removeAllAlarms]; } if (hasDueDate) [todo setDue: taskDueDate]; else [todo setDue: nil]; if ([status isEqualToString: @"COMPLETED"]) [todo setCompleted: statusDate]; else [todo setCompleted: nil]; if ([status length] > 0) { [todo setStatus: status]; [todo setPercentComplete: statusPercent]; } else { [todo setStatus: @""]; [todo setPercentComplete: @""]; } if ([[self clientObject] isNew]) { ud = [[context activeUser] userDefaults]; tz = [iCalTimeZone timeZoneForName: [ud timeZoneName]]; if (hasStartDate || hasDueDate) { [[todo parent] addTimeZone: tz]; } if (hasStartDate) [(iCalDateTime *)[todo uniqueChildWithTag: @"dtstart"] setTimeZone: tz]; if (hasDueDate) [(iCalDateTime *)[todo uniqueChildWithTag: @"due"] setTimeZone: tz]; } } // TODO: add tentatively // - (id) acceptOrDeclineAction: (BOOL) _accept // { // [[self clientObject] changeParticipationStatus: // _accept ? @"ACCEPTED" : @"DECLINED"]; // return self; // } // - (id) acceptAction // { // return [self acceptOrDeclineAction: YES]; // } // - (id) declineAction // { // return [self acceptOrDeclineAction: NO]; // } - (id) changeStatusAction { NSString *newStatus; [self todo]; if (todo) { newStatus = [self queryParameterForKey: @"status"]; if ([newStatus intValue]) [todo setCompleted: [NSCalendarDate date]]; else { [todo setCompleted: nil]; [todo setPercentComplete: @"0"]; [todo setStatus: @"IN-PROCESS"]; } [[self clientObject] saveComponent: todo]; } return [self responseWith204]; } @end SOGo-2.1.1b/UI/Scheduler/UIxCalDayTable.m0000644000000000000000000002227112247657030016340 0ustar rootroot/* UIxCalDayTable.m - this file is part of SOGo * * Copyright (C) 2006-2009 Inverse inc. * * 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 #import #import #import /* for locale string constants */ #import #import #import #import #import #import #import #import #import "UIxCalDayTable.h" @class SOGoAppointment; @implementation UIxCalDayTable - (id) init { SOGoUser *user; SOGoUserDefaults *ud; if ((self = [super init])) { user = [context activeUser]; ud = [user userDefaults]; ASSIGN (timeFormat, [ud timeFormat]); daysToDisplay = nil; hoursToDisplay = nil; numberOfDays = 1; startDate = nil; currentTableDay = nil; currentTableHour = nil; weekDays = [locale objectForKey: NSShortWeekDayNameArray]; [weekDays retain]; dateFormatter = [user dateFormatterInContext: context]; [dateFormatter retain]; } return self; } - (void) dealloc { // if (allAppointments) // [allAppointments release]; [weekDays release]; [daysToDisplay release]; [hoursToDisplay release]; [dateFormatter release]; [timeFormat release]; [super dealloc]; } - (void) setNumberOfDays: (NSNumber *) aNumber { numberOfDays = [aNumber intValue]; [daysToDisplay release]; daysToDisplay = nil; } - (NSNumber *) numberOfDays { return [NSNumber numberWithUnsignedInt: numberOfDays]; } - (void) setStartDate: (NSCalendarDate *) aStartDate { startDate = [aStartDate beginOfDay]; [daysToDisplay release]; daysToDisplay = nil; } - (NSCalendarDate *) startDate { if (!startDate) startDate = [[super startDate] beginOfDay]; return startDate; } - (NSCalendarDate *) endDate { NSCalendarDate *endDate; endDate = [[self startDate] dateByAddingYears: 0 months: 0 days: numberOfDays - 1]; return [endDate endOfDay]; } - (NSArray *) hoursToDisplay { unsigned int currentHour, lastHour; if (!hoursToDisplay) { hoursToDisplay = [NSMutableArray new]; currentHour = [self dayStartHour]; lastHour = [self dayEndHour]; while (currentHour < lastHour) { [hoursToDisplay addObject: [NSNumber numberWithInt: currentHour]]; currentHour++; } [hoursToDisplay addObject: [NSNumber numberWithInt: currentHour]]; } return hoursToDisplay; } - (NSString *) currentHourId { return [NSString stringWithFormat: @"hour%d", [currentTableHour intValue]]; } - (NSArray *) daysToDisplay { NSCalendarDate *currentDate; int count; if (!daysToDisplay) { daysToDisplay = [NSMutableArray new]; currentDate = [[self startDate] hour: [self dayStartHour] minute: 0]; for (count = 0; count < numberOfDays; count++) { [daysToDisplay addObject: currentDate]; currentDate = [currentDate tomorrow]; } } return daysToDisplay; } - (void) setCurrentTableDay: (NSCalendarDate *) aTableDay { currentTableDay = aTableDay; } - (NSCalendarDate *) currentTableDay { return currentTableDay; } - (void) setCurrentTableHour: (NSString *) aTableHour { currentTableHour = aTableHour; } - (NSString *) currentTableHour { int hour; NSCalendarDate *tmp; NSString *formatted = currentTableHour, *parse; hour = [currentTableHour intValue]; parse = [NSString stringWithFormat: @"2000-01-01 %02d:00", hour]; tmp = [NSCalendarDate dateWithString: parse calendarFormat: @"%Y-%m-%d %H:%M"]; if (tmp) formatted = [tmp descriptionWithCalendarFormat: timeFormat]; return formatted; } - (NSString *) currentAllDayId { return [NSString stringWithFormat: @"allDay%@", [currentTableDay shortDateString]]; } - (NSString *) currentDayId { return [NSString stringWithFormat: @"day%@", [currentTableDay shortDateString]]; } - (int) currentDayNumber { return [daysToDisplay indexOfObject: currentTableDay]; } - (NSString *) currentAppointmentHour { return [NSString stringWithFormat: @"%.2d00", [currentTableHour intValue]]; } - (NSString *) labelForDay { return [weekDays objectAtIndex: [currentTableDay dayOfWeek]]; } - (NSString *) labelForDate { return [dateFormatter shortFormattedDate: currentTableDay]; } // - (NSDictionary *) _adjustedAppointment: (NSDictionary *) anAppointment // forStart: (NSCalendarDate *) start // andEnd: (NSCalendarDate *) end // { // NSMutableDictionary *newMutableAppointment; // NSDictionary *newAppointment; // BOOL startIsEarlier, endIsLater; // startIsEarlier // = ([[anAppointment objectForKey: @"startDate"] laterDate: start] == start); // endIsLater // = ([[anAppointment objectForKey: @"endDate"] earlierDate: end] == end); // if (startIsEarlier || endIsLater) // { // newMutableAppointment // = [NSMutableDictionary dictionaryWithDictionary: anAppointment]; // if (startIsEarlier) // [newMutableAppointment setObject: start // forKey: @"startDate"]; // if (endIsLater) // [newMutableAppointment setObject: end // forKey: @"endDate"]; // newAppointment = newMutableAppointment; // } // else // newAppointment = anAppointment; // return newAppointment; // } // - (NSArray *) appointmentsForCurrentDay // { // NSMutableArray *filteredAppointments; // NSEnumerator *aptsEnumerator; // NSDictionary *currentDayAppointment; // NSCalendarDate *start, *end; // int endHour; // if (!allAppointments) // { // allAppointments = [self fetchCoreAppointmentsInfos]; // [allAppointments retain]; // } // filteredAppointments = [NSMutableArray new]; // [filteredAppointments autorelease]; // start = [currentTableDay hour: [self dayStartHour] minute: 0]; // endHour = [self dayEndHour]; // if (endHour < 24) // end = [currentTableDay hour: [self dayEndHour] minute: 59]; // else // end = [[currentTableDay tomorrow] hour: 0 minute: 0]; // aptsEnumerator = [allAppointments objectEnumerator]; // currentDayAppointment = [aptsEnumerator nextObject]; // while (currentDayAppointment) // { // if (([end laterDate: [currentDayAppointment // valueForKey: @"startDate"]] == end) // && ([start earlierDate: [currentDayAppointment // valueForKey: @"endDate"]] == start)) // [filteredAppointments // addObject: [self _adjustedAppointment: currentDayAppointment // forStart: start andEnd: end]]; // currentDayAppointment = [aptsEnumerator nextObject]; // } // return filteredAppointments; // } // - (void) setCurrentAppointment: (NSDictionary *) newCurrentAppointment // { // currentAppointment = newCurrentAppointment; // } // - (NSDictionary *) currentAppointment // { // return currentAppointment; // } - (NSString *) appointmentsClasses { return [NSString stringWithFormat: @"appointments appointmentsFor%dDays", numberOfDays]; } - (NSString *) daysViewClasses { return [NSString stringWithFormat: @"daysView daysViewFor%dDays", numberOfDays]; } - (NSString *) dayClasses { NSMutableString *classes; unsigned int currentDayNbr, realDayOfWeek; currentDayNbr = [daysToDisplay indexOfObject: currentTableDay]; realDayOfWeek = [currentTableDay dayOfWeek]; classes = [NSMutableString string]; [classes appendFormat: @"day day%d", currentDayNbr]; if (numberOfDays > 1) { if (realDayOfWeek == 0 || realDayOfWeek == 6) [classes appendString: @" weekEndDay"]; if ([currentTableDay isToday]) [classes appendString: @" dayOfToday"]; } return classes; } - (NSString *) clickableHourCellClass { NSMutableString *cellClass; int hour; SOGoUserDefaults *ud; cellClass = [NSMutableString string]; hour = [currentTableHour intValue]; ud = [[context activeUser] userDefaults]; [cellClass appendFormat: @"clickableHourCell clickableHourCell%d", hour]; if (hour < [ud dayStartHour] || hour > [ud dayEndHour] - 1) [cellClass appendString: @" outOfDay"]; return cellClass; } @end SOGo-2.1.1b/UI/Scheduler/product.plist0000644000000000000000000002570312247657030016167 0ustar rootroot{ /* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ requires = ( MAIN, MainUI, CommonUI, Appointments, Contacts, ContactsUI ); publicResources = ( previous_week.gif, next_week.gif, icon_view_overview.gif, icon_view_overview_inactive.gif, icon_view_chart.gif, icon_view_chart_inactive.gif, icon_view_list.gif, icon_view_list_inactive.gif, icon_view_columns.gif, icon_view_columns_inactive.gif, icon_popupcalendar.gif, first.gif, previous.gif, next.gif, last.gif, skycalendar.html, skycalendar.js, green_corner.gif, invisible_space_2.gif, cycles.plist, ); factories = { }; categories = { SOGoAppointmentFolders = { slots = { toolbar = { protectedBy = "View"; value = "SOGoAppointmentFolders.toolbar"; }; }; methods = { view = { protectedBy = "View"; pageName = "UIxCalMainView"; }; addWebCalendar = { protectedBy = "View"; actionClass = "UIxCalMainActions"; actionName = "addWebCalendar"; }; saveDragHandleState = { protectedBy = "View"; pageName = "UIxCalMainView"; actionName = "saveDragHandleState"; }; saveSelectedList = { protectedBy = "View"; pageName = "UIxCalMainView"; actionName = "saveSelectedList"; }; saveListState = { protectedBy = "View"; pageName = "UIxCalMainView"; actionName = "saveListState"; }; dateselector = { protectedBy = "View"; pageName = "UIxCalDateSelector"; }; calendarslist = { protectedBy = "View"; pageName = "UIxCalendarSelector"; actionName = "calendarsList"; }; alarmslist = { protectedBy = "View"; actionClass = "UIxCalListingActions"; actionName = "alarmsList"; }; eventslist = { protectedBy = "View"; actionClass = "UIxCalListingActions"; actionName = "eventsList"; }; eventsblocks = { protectedBy = "View"; actionClass = "UIxCalListingActions"; actionName = "eventsBlocks"; }; taskslist = { protectedBy = "View"; actionClass = "UIxCalListingActions"; actionName = "tasksList"; }; dayview = { protectedBy = "View"; pageName = "UIxCalDayView"; }; multicolumndayview = { protectedBy = "View"; pageName = "UIxCalMulticolumnDayView"; }; weekview = { protectedBy = "View"; pageName = "UIxCalWeekView"; }; monthview = { protectedBy = "View"; pageName = "UIxCalMonthView"; }; show = { protectedBy = "View"; pageName = "UIxCalView"; actionName = "redirectForUIDs"; }; userRights = { protectedBy = "ReadAcls"; pageName = "UIxCalUserRightsEditor"; }; saveUserRights = { protectedBy = "Change Permissions"; pageName = "UIxCalUserRightsEditor"; actionName = "saveUserRights"; }; editAttendees = { protectedBy = "View"; pageName = "UIxAttendeesEditor"; }; editRecurrence = { protectedBy = "View"; pageName = "UIxRecurrenceEditor"; }; editReminder = { protectedBy = "View"; pageName = "UIxReminderEditor"; }; }; }; SOGoAppointmentFolder = { methods = { properties = { protectedBy = "Access Contents Information"; pageName = "UIxCalendarProperties"; }; saveProperties = { protectedBy = "Access Contents Information"; pageName = "UIxCalendarProperties"; actionName = "saveProperties"; }; show = { protectedBy = "View"; pageName = "UIxCalView"; actionName = "redirectForUIDs"; }; import = { protectedBy = "Add Documents, Images, and Files"; actionClass = "UIxCalFolderActions"; actionName = "import"; }; userRights = { protectedBy = "ReadAcls"; pageName = "UIxCalUserRightsEditor"; }; saveUserRights = { protectedBy = "Change Permissions"; pageName = "UIxCalUserRightsEditor"; actionName = "saveUserRights"; }; newevent = { protectedBy = ""; pageName = "UIxAppointmentEditor"; actionName = "new"; }; newtask = { protectedBy = ""; pageName = "UIxTaskEditor"; actionName = "new"; }; }; }; SOGoWebAppointmentFolder = { methods = { reload = { protectedBy = "View"; actionClass = "UIxCalFolderActions"; actionName = "reload"; }; "set-credentials" = { protectedBy = "View"; actionClass = "UIxCalFolderActions"; actionName = "setCredentials"; }; }; }; SOGoAppointmentFolderICS = { methods = { export = { protectedBy = "View"; actionClass = "UIxCalFolderActions"; actionName = "export"; }; }; }; SOGoCalendarComponent = { }; SOGoAppointmentObject = { slots = { toolbar = { protectedBy = "View"; value = "SOGoAppointmentObject.toolbar"; }; }; methods = { view = { protectedBy = "ViewAllComponent"; pageName = "UIxAppointmentEditor"; actionName = "view"; }; edit = { protectedBy = "ViewAllComponent"; pageName = "UIxAppointmentEditor"; }; editAsAppointment = { protectedBy = "ViewAllComponent"; pageName = "UIxAppointmentEditor"; }; save = { protectedBy = "ModifyComponent"; pageName = "UIxAppointmentEditor"; actionName = "save"; }; saveAsAppointment = { protectedBy = "ModifyComponent"; pageName = "UIxAppointmentEditor"; actionName = "save"; }; copy = { protectedBy = "ViewAllComponent"; actionClass = "UIxAppointmentActions"; actionName = "copy"; }; raw = { protectedBy = "ViewAllComponent"; actionClass = "UIxComponentEditor"; actionName = "raw"; }; accept = { protectedBy = "RespondToComponent"; pageName = "UIxAppointmentEditor"; actionName = "accept"; }; decline = { protectedBy = "RespondToComponent"; pageName = "UIxAppointmentEditor"; actionName = "decline"; }; delegate = { protectedBy = "RespondToComponent"; pageName = "UIxAppointmentEditor"; actionName = "delegate"; }; tentative = { protectedBy = "RespondToComponent"; pageName = "UIxAppointmentEditor"; actionName = "tentative"; }; needsaction = { protectedBy = "RespondToComponent"; pageName = "UIxAppointmentEditor"; actionName = "needsAction"; }; adjust = { protectedBy = "ModifyComponent"; actionClass = "UIxAppointmentActions"; actionName = "adjust"; }; }; }; SOGoTaskObject = { slots = { toolbar = { protectedBy = "View"; value = "SOGoAppointmentObject.toolbar"; }; }; methods = { view = { protectedBy = "ViewAllComponent"; pageName = "UIxTaskEditor"; actionName = "view"; }; edit = { protectedBy = "ViewAllComponent"; pageName = "UIxTaskEditor"; }; editAsTask = { protectedBy = "ViewAllComponent"; pageName = "UIxTaskEditor"; }; save = { protectedBy = "ModifyComponent"; pageName = "UIxTaskEditor"; actionName = "save"; }; saveAsTask = { protectedBy = "ModifyComponent"; pageName = "UIxTaskEditor"; actionName = "save"; }; changeStatus = { protectedBy = "ModifyComponent"; pageName = "UIxTaskEditor"; actionName = "changeStatus"; }; raw = { protectedBy = "ViewAllComponent"; pageName = "UIxComponentEditor"; actionName = "raw"; }; }; }; SOGoComponentOccurence = { methods = { confirmEditing = { protectedBy = "ViewAllComponent"; pageName = "UIxOccurenceDialog"; }; confirmAdjustment = { protectedBy = "ViewAllComponent"; pageName = "UIxOccurenceDialog"; actionName = "confirmAdjustment"; }; confirmDeletion = { protectedBy = "Delete Object"; pageName = "UIxOccurenceDialog"; actionName = "confirmDeletion"; }; }; }; SOGoAppointmentOccurence = { slots = { toolbar = { protectedBy = "View"; value = "SOGoAppointmentObject.toolbar"; }; }; methods = { edit = { protectedBy = "ViewAllComponent"; pageName = "UIxAppointmentEditor"; }; save = { protectedBy = "ModifyComponent"; pageName = "UIxAppointmentEditor"; actionName = "save"; }; delete = { protectedBy = "Delete Object"; pageName = "UIxOccurenceDialog"; actionName = "delete"; }; adjust = { protectedBy = "ModifyComponent"; actionClass = "UIxAppointmentActions"; actionName = "adjust"; }; }; }; SOGoTaskOccurence = { slots = { toolbar = { protectedBy = "View"; value = "SOGoTaskObject.toolbar"; }; }; methods = { edit = { protectedBy = "ViewAllComponent"; pageName = "UIxTaskEditor"; }; save = { protectedBy = "ModifyComponent"; pageName = "UIxTaskEditor"; actionName = "save"; }; }; }; }; } SOGo-2.1.1b/UI/Scheduler/UIxComponentEditor.h0000644000000000000000000001233312247657031017336 0ustar rootroot/* UIxComponentEditor.h - this file is part of SOGo * * Copyright (C) 2006-2012 Inverse inc. * * 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 UIXCOMPONENTEDITOR_H #define UIXCOMPONENTEDITOR_H #import @class NSArray; @class NSCalendarDate; @class NSDictionary; @class NSString; @class iCalPerson; @class iCalRecurrenceRule; @class iCalRepeatableEntityObject; @interface UIxComponentEditor : UIxComponent { iCalRepeatableEntityObject *component; id item; id attendee; NSString *saveURL; NSMutableArray *calendarList; //NSMutableArray *organizerList; //NSDictionary *organizerIdentity; NSDictionary *organizerProfile; /* individual values */ NSCalendarDate *cycleUntilDate; NSString *title; NSString *location; SOGoAppointmentFolder *componentCalendar; NSString *comment; NSString *attachUrl; NSString *priority; NSString *classification; NSString *status; NSString *category; NSArray *categories; NSDictionary *cycle; NSString *cycleEnd; iCalPerson *organizer; iCalPerson *ownerAsAttendee; NSString *componentOwner; NSString *dateFormat; NSMutableDictionary *jsonAttendees; NSString *reminder; NSString *reminderQuantity; NSString *reminderUnit; NSString *reminderRelation; NSString *reminderReference; NSString *reminderAction; BOOL reminderEmailOrganizer; BOOL reminderEmailAttendees; /* ugly */ NSString *repeat; NSString *repeatType; NSString *repeat1; NSString *repeat2; NSString *repeat3; NSString *repeat4; NSString *repeat5; NSString *repeat6; NSString *repeat7; NSString *range1; NSString *range2; } - (NSString *) toolbar; - (void) setComponent: (iCalRepeatableEntityObject *) newComponent; - (void) setSaveURL: (NSString *) newSaveURL; - (NSString *) saveURL; - (void) setItem: (id) _item; - (id) item; - (SOGoAppointmentFolder *) componentCalendar; - (NSArray *) calendarList; - (NSString *) calendarsFoldersList; - (NSString *) calendarDisplayName; - (SOGoAppointmentFolder *) componentCalendar; - (void) setComponentCalendar: (SOGoAppointmentFolder *) _componentCalendar; - (NSArray *) categoryList; - (void) setCategories: (NSArray *) _categories; - (NSArray *) categories; - (NSArray *) priorities; - (void) setPriority: (NSString *) _priority; - (NSString *) priority; - (NSString *) itemPriorityText; - (NSArray *) classificationClasses; - (void) setClassification: (NSString *) _classification; - (NSString *) classification; - (NSString *) itemClassificationText; - (void) setStatus: (NSString *) _status; - (NSString *) status; - (NSString *) itemStatusText; - (void) setTitle: (NSString *) _value; - (NSString *) title; - (void) setLocation: (NSString *) _value; - (NSString *) location; - (NSString *) location; - (void) setComment: (NSString *) _value; - (NSString *) comment; - (void) setAttach: (NSString *) _attachUrl; - (NSString *) attach; - (BOOL) hasAttendees; - (BOOL) hasCreatedBy; - (NSString *) createdBy; - (NSString *) createdByLink; - (NSString *) createdByName; - (NSString *) jsonAttendees; - (NSString *) repeat; - (void) setRepeat: (NSString *) newRepeat; - (NSString *) reminder; - (void) setReminder: (NSString *) newReminder; ////////////////////////////////// JUNK //////////////////////////////////////// ////////////////////////////////// JUNK //////////////////////////////////////// ////////////////////////////////// JUNK //////////////////////////////////////// - (NSArray *) cycles; - (void) setCycle: (NSDictionary *) _cycle; - (NSDictionary *) cycle; - (BOOL) hasCycle; - (NSString *) cycleLabel; - (void) setCycleUntilDate: (NSCalendarDate *) _cycleUntilDate; - (NSCalendarDate *) cycleUntilDate; - (iCalRecurrenceRule *) rrule; - (void) adjustCycleControlsForRRule: (iCalRecurrenceRule *) _rrule; - (NSDictionary *) cycleMatchingRRule: (iCalRecurrenceRule *) _rrule; - (NSArray *) cycleEnds; - (void) setCycleEnd: (NSString *) _cycleEnd; - (NSString *) cycleEnd; - (BOOL) isCycleEndUntil; - (void) setIsCycleEndUntil; - (void) setIsCycleEndNever; ////////////////////////////////// JUNK //////////////////////////////////////// ////////////////////////////////// JUNK //////////////////////////////////////// ////////////////////////////////// JUNK //////////////////////////////////////// /* access */ - (BOOL) isMyComponent; - (BOOL) canEditComponent; - (unsigned int) firstDayOfWeek; /* helpers */ - (NSString *) completeURIForMethod: (NSString *) _method; - (BOOL) isWriteableClientObject; - (NSException *) validateObjectForStatusChange; @end #endif /* UIXCOMPONENTEDITOR_H */ SOGo-2.1.1b/UI/Scheduler/NSArray+Scheduler.m0000644000000000000000000001776412247657030017051 0ustar rootroot/* NSArray+Scheduler.m - this file is part of SOGo * * Copyright (C) 2007 Inverse inc. * * 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 #import #import #import #import #import "NSArray+Scheduler.h" @implementation NSArray (SOGoEventComparison) - (NSComparisonResult) _compareCompletionWithStatus1: (NSNumber *) status1 andStatus2: (NSNumber *) status2 { NSComparisonResult result; unsigned int ts1, ts2; ts1 = [status1 intValue]; ts2 = [status2 intValue]; if (ts1 == 1 && ts2 != 1) result = NSOrderedDescending; else if (ts1 != 1 && ts2 == 1) result = NSOrderedAscending; else result = NSOrderedSame; return result; } - (NSComparisonResult) compareEventsStartDateAscending: (NSArray *) otherEvent { NSComparisonResult result; unsigned int selfTime, otherTime; selfTime = [[self objectAtIndex: eventStartDateIndex] intValue]; otherTime = [[otherEvent objectAtIndex: eventStartDateIndex] intValue]; if (selfTime > otherTime) result = NSOrderedDescending; else if (selfTime < otherTime) result = NSOrderedAscending; else result = NSOrderedSame; return result; } - (NSComparisonResult) compareEventsEndDateAscending: (NSArray *) otherEvent { NSComparisonResult result; unsigned int selfTime, otherTime; selfTime = [[self objectAtIndex: eventEndDateIndex] intValue]; otherTime = [[otherEvent objectAtIndex: eventEndDateIndex] intValue]; if (selfTime > otherTime) result = NSOrderedDescending; else if (selfTime < otherTime) result = NSOrderedAscending; else result = NSOrderedSame; return result; } - (NSComparisonResult) compareEventsTitleAscending: (NSArray *) otherEvent { NSString *selfTitle, *otherTitle; selfTitle = [self objectAtIndex: eventTitleIndex]; otherTitle = [otherEvent objectAtIndex: eventTitleIndex]; return [selfTitle caseInsensitiveCompare: otherTitle]; } - (NSComparisonResult) compareEventsLocationAscending: (NSArray *) otherEvent { NSString *selfTitle, *otherTitle; selfTitle = [self objectAtIndex: eventLocationIndex]; otherTitle = [otherEvent objectAtIndex: eventLocationIndex]; return [selfTitle caseInsensitiveCompare: otherTitle]; } - (NSComparisonResult) compareEventsCalendarNameAscending: (NSArray *) otherEvent { NSString *selfCalendarName, *otherCalendarName; selfCalendarName = [self objectAtIndex: eventCalendarNameIndex]; otherCalendarName = [otherEvent objectAtIndex: eventCalendarNameIndex]; return [selfCalendarName caseInsensitiveCompare: otherCalendarName]; } - (NSComparisonResult) compareTasksAscending: (NSArray *) otherTask { NSComparisonResult result; unsigned int selfTime, otherTime; result = [self _compareCompletionWithStatus1: [self objectAtIndex: taskCalendarNameIndex] andStatus2: [otherTask objectAtIndex: taskCalendarNameIndex]]; if (result == NSOrderedSame) { // End date selfTime = [[self objectAtIndex: taskEndDateIndex] intValue]; otherTime = [[otherTask objectAtIndex: taskEndDateIndex] intValue]; if (selfTime && !otherTime) result = NSOrderedAscending; else if (!selfTime && otherTime) result = NSOrderedDescending; else { if (selfTime > otherTime) result = NSOrderedDescending; else if (selfTime < otherTime) result = NSOrderedAscending; else { // Calendar ID result = [[self objectAtIndex: taskFolderIndex] compare: [otherTask objectAtIndex: taskFolderIndex]]; if (result == NSOrderedSame) // Task name result = [[self objectAtIndex: taskTitleIndex] compare: [otherTask objectAtIndex: taskTitleIndex] options: NSCaseInsensitiveSearch]; } } } return result; } - (NSComparisonResult) compareTasksPriorityAscending: (NSArray *) otherTask { NSComparisonResult result; int selfPriority, otherPriority; selfPriority = [[self objectAtIndex: taskPriorityIndex] intValue]; otherPriority = [[otherTask objectAtIndex: taskPriorityIndex] intValue]; if (selfPriority && !otherPriority) result = NSOrderedAscending; else if (!selfPriority && otherPriority) result = NSOrderedDescending; else { if (selfPriority > otherPriority) result = NSOrderedDescending; else if (selfPriority < otherPriority) result = NSOrderedAscending; else result = NSOrderedSame; } return result; } - (NSComparisonResult) compareTasksTitleAscending: (NSArray *) otherTask { NSString *selfTitle, *otherTitle; selfTitle = [self objectAtIndex: taskTitleIndex]; otherTitle = [otherTask objectAtIndex: taskTitleIndex]; return [selfTitle caseInsensitiveCompare: otherTitle]; } - (NSComparisonResult) compareTasksEndAscending: (NSArray *) otherTask { NSComparisonResult result; unsigned int selfTime, otherTime; // End date selfTime = [[self objectAtIndex: taskEndDateIndex] intValue]; otherTime = [[otherTask objectAtIndex: taskEndDateIndex] intValue]; if (selfTime && !otherTime) result = NSOrderedAscending; else if (!selfTime && otherTime) result = NSOrderedDescending; else { if (selfTime > otherTime) result = NSOrderedDescending; else if (selfTime < otherTime) result = NSOrderedAscending; else { // Calendar ID result = [[self objectAtIndex: taskFolderIndex] compare: [otherTask objectAtIndex: taskFolderIndex]]; if (result == NSOrderedSame) // Task name result = [[self objectAtIndex: taskTitleIndex] compare: [otherTask objectAtIndex: taskTitleIndex] options: NSCaseInsensitiveSearch]; } } return result; } - (NSComparisonResult) compareTasksLocationAscending: (NSArray *) otherTask { NSString *selfLocation, *otherLocation; selfLocation = [self objectAtIndex: taskLocationIndex]; otherLocation = [otherTask objectAtIndex: taskLocationIndex]; return [selfLocation caseInsensitiveCompare: otherLocation]; } - (NSComparisonResult) compareTasksCategoryAscending: (NSArray *) otherTask { NSString *selfCategory, *otherCategory; NSComparisonResult result; selfCategory = [self objectAtIndex: taskCategoryIndex]; otherCategory = [otherTask objectAtIndex: taskCategoryIndex]; if ([selfCategory isNotNull] && [otherCategory isNotNull]) result = [selfCategory caseInsensitiveCompare: otherCategory]; else if ([selfCategory isNotNull]) result = NSOrderedAscending; else if ([otherCategory isNotNull]) result = NSOrderedDescending; else result = NSOrderedSame; return result; } - (NSComparisonResult) compareTasksCalendarNameAscending: (NSArray *) otherTask { NSString *selfCalendarName, *otherCalendarName; selfCalendarName = [self objectAtIndex: taskCalendarNameIndex]; otherCalendarName = [otherTask objectAtIndex: taskCalendarNameIndex]; return [selfCalendarName caseInsensitiveCompare: otherCalendarName]; } - (NSArray *) reversedArray { return [[self reverseObjectEnumerator] allObjects]; } @end @implementation NSMutableArray (SOGoEventComparison) - (void) reverseArray { [self setArray: [self reversedArray]]; } @end SOGo-2.1.1b/UI/Scheduler/UIxCalView.m0000644000000000000000000003457012247657030015572 0ustar rootroot/* UIxCalView.m - this file is part of SOGo * * Copyright (C) 2006-2009 Inverse inc. * * 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "UIxCalView.h" @interface UIxCalView (PrivateAPI) - (NSString *) _userFolderURI; @end @implementation UIxCalView - (id) init { SOGoUserDefaults *ud; self = [super init]; if (self) { ud = [[context activeUser] userDefaults]; ASSIGN (timeZone, [ud timeZone]); aptFormatter = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: timeZone]; aptTooltipFormatter = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: timeZone]; privateAptFormatter = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: timeZone]; privateAptTooltipFormatter = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: timeZone]; componentsData = [NSMutableDictionary new]; } return self; } - (void) dealloc { [componentsData release]; [appointments release]; [allDayApts release]; [appointment release]; [currentDay release]; [aptFormatter release]; [aptTooltipFormatter release]; [privateAptFormatter release]; [privateAptTooltipFormatter release]; [timeZone release]; [super dealloc]; } /* subclasses should override this */ - (void) configureFormatters { NSString *title; [aptFormatter setFullDetails]; [aptTooltipFormatter setTooltip]; [privateAptFormatter setPrivateDetails]; [privateAptTooltipFormatter setPrivateTooltip]; title = [self labelForKey: @"empty title"]; [aptFormatter setTitlePlaceholder: title]; [aptTooltipFormatter setTitlePlaceholder: title]; title = [self labelForKey: @"private appointment"]; [privateAptFormatter setPrivateTitle: title]; [privateAptTooltipFormatter setPrivateTitle: title]; } - (NSArray *) filterAppointments:(NSArray *) _apts { NSMutableArray *filtered; NSUInteger i, count, p, pCount; NSString *email, *partmailsString, *state, *pEmail; NSDictionary *info, *primaryIdentity; NSArray *partmails, *partstates; BOOL shouldAdd; if ([self shouldDisplayRejectedAppointments]) return _apts; { count = [_apts count]; filtered = [[[NSMutableArray alloc] initWithCapacity: count] autorelease]; primaryIdentity = [[context activeUser] primaryIdentity]; email = [primaryIdentity objectForKey: @"email"]; for (i = 0; i < count; i++) { shouldAdd = YES; info = [_apts objectAtIndex: i]; partmailsString = [info objectForKey: @"partmails"]; if ([partmailsString isNotNull]) { partmails = [partmailsString componentsSeparatedByString: @"\n"]; pCount = [partmails count]; for (p = 0; p < pCount; p++) { pEmail = [partmails objectAtIndex: p]; if ([pEmail isEqualToString: email]) { partstates = [[info objectForKey: @"partstates"] componentsSeparatedByString: @"\n"]; state = [partstates objectAtIndex: p]; if ([state intValue] == iCalPersonPartStatDeclined) shouldAdd = NO; break; } } } if (shouldAdd) [filtered addObject: info]; } } return filtered; } /* accessors */ - (void) setAppointments:(NSArray *) _apts { _apts = [self filterAppointments: _apts]; ASSIGN(appointments, _apts); } - (NSArray *) appointments { return appointments; } - (void) setAppointment:(id) _apt { ASSIGN (appointment, _apt); } - (id) appointment { return appointment; } - (BOOL) isMyApt { return aptFlags.isMyApt ? YES : NO; } - (BOOL) canAccessApt { return aptFlags.canAccessApt ? YES : NO; } - (BOOL) canNotAccessApt { return aptFlags.canAccessApt ? NO : YES; } - (NSDictionary *) aptTypeDict { return nil; } - (NSString *) aptTypeLabel { return @"aptLabel"; } - (NSString *) aptTypeIcon { return @""; } - (SOGoAptFormatter *) aptFormatter { if (![aptFormatter titlePlaceholder]) [self configureFormatters]; if (aptFlags.canAccessApt) return aptFormatter; return privateAptFormatter; } - (SOGoAptFormatter *) aptTooltipFormatter { if (![aptTooltipFormatter titlePlaceholder]) [self configureFormatters]; if (aptFlags.canAccessApt) return aptTooltipFormatter; return privateAptTooltipFormatter; } - (void) setTasks: (NSArray *) _tasks { ASSIGN(tasks, _tasks); } - (NSArray *) tasks { return tasks; } /* TODO: remove this */ - (NSString *) shortTextForApt { [self warnWithFormat: @"%s IS DEPRECATED!", __PRETTY_FUNCTION__]; if (![self canAccessApt]) return @""; return [[self aptFormatter] stringForObjectValue: appointment]; } - (NSString *) shortTitleForApt { NSString *title; [self warnWithFormat: @"%s IS DEPRECATED!", __PRETTY_FUNCTION__]; if (![self canAccessApt]) return @""; title = [appointment valueForKey: @"title"]; if ([title length] > 12) title = [[title substringToIndex: 11] stringByAppendingString: @"..."]; return title; } - (NSString *) tooltipForApt { [self warnWithFormat: @"%s IS DEPRECATED!", __PRETTY_FUNCTION__]; return [[self aptTooltipFormatter] stringForObjectValue: appointment referenceDate: [self currentDay]]; } - (NSString *) aptStyle { return nil; } - (NSCalendarDate *) referenceDateForFormatter { return [self selectedDate]; } - (NSCalendarDate *) thisMonth { return [self selectedDate]; } - (NSCalendarDate *) nextMonth { NSCalendarDate *date = [self thisMonth]; return [date dateByAddingYears: 0 months: 1 days: 0 hours: 0 minutes: 0 seconds: 0]; } - (NSCalendarDate *) prevMonth { NSCalendarDate *date = [self thisMonth]; return [date dateByAddingYears: 0 months:-1 days: 0 hours: 0 minutes: 0 seconds: 0]; } - (NSString *) prevMonthAsString { return [self dateStringForDate: [self prevMonth]]; } - (NSString *) nextMonthAsString { return [self dateStringForDate: [self nextMonth]]; } - (void) setCurrentView: (NSString *) theView { SOGoUser *activeUser; NSString *module; SOGoUserSettings *us; NSMutableDictionary *moduleSettings; SOGoAppointmentFolders *clientObject; activeUser = [context activeUser]; clientObject = [self clientObject]; module = [clientObject nameInContainer]; us = [activeUser userSettings]; moduleSettings = [us objectForKey: module]; if (!moduleSettings) { moduleSettings = [NSMutableDictionary dictionary]; [us setObject: moduleSettings forKey: module]; } if (![theView isEqualToString: (NSString*)[moduleSettings objectForKey: @"View"]]) { [moduleSettings setObject: theView forKey: @"View"]; [us synchronize]; } } - (NSString *) collapseBtnClass { NSString *module, *state; NSMutableDictionary *moduleSettings; SOGoUser *activeUser; SOGoAppointmentFolders *clientObject; SOGoUserSettings *us; activeUser = [context activeUser]; clientObject = [self clientObject]; module = [clientObject nameInContainer]; us = [activeUser userSettings]; moduleSettings = [us objectForKey: module]; state = [moduleSettings objectForKey: @"ListState"]; return (state && [state compare: @"collapse"] == NSOrderedSame)? @"rise" : @"collapse"; } /* current day related */ - (void) setCurrentDay:(NSCalendarDate *) _day { [_day setTimeZone: timeZone]; ASSIGN (currentDay, _day); } - (NSCalendarDate *) currentDay { return currentDay; } - (NSString *) currentDayName { return [self localizedNameForDayOfWeek: [currentDay dayOfWeek]]; } - (id) holidayInfo { return nil; } - (NSArray *) allDayApts { NSArray *apts; NSMutableArray *filtered; NSUInteger i, count; if (allDayApts) return allDayApts; apts = [self appointments]; count = [apts count]; filtered = [[NSMutableArray alloc] initWithCapacity: 3]; for (i = 0; i < count; i++) { id apt; NSNumber *bv; apt = [apts objectAtIndex: i]; bv = [apt valueForKey: @"isallday"]; if ([bv boolValue]) [filtered addObject: apt]; } ASSIGN(allDayApts, filtered); [filtered release]; return allDayApts; } /* special appointments */ - (BOOL) hasDayInfo { return [self hasHoldidayInfo] || [self hasAllDayApts]; } - (BOOL) hasHoldidayInfo { return [self holidayInfo] != nil; } - (BOOL) hasAllDayApts { return [[self allDayApts] count] != 0; } /* defaults */ - (BOOL) showFullNames { return YES; } - (BOOL) showAMPMDates { return NO; } - (unsigned) dayStartHour { return 0; } - (unsigned) dayEndHour { return 23; } /* URLs */ - (NSString *) appointmentViewURL { id pkey; if (![(pkey = [[self appointment] valueForKey: @"uid"]) isNotNull]) return nil; return [[[self clientObject] baseURLForAptWithUID: [pkey stringValue] inContext: [self context]] stringByAppendingString: @"/view"]; } /* fetching */ - (NSCalendarDate *) startDate { return [self selectedDate]; } - (NSCalendarDate *) endDate { return [[self startDate] tomorrow]; } /* query parameters */ - (BOOL) shouldDisplayRejectedAppointments { NSString *bv; bv = [self queryParameterForKey: @"dr"]; if (!bv) return NO; return [bv boolValue]; } - (NSDictionary *) toggleShowRejectedAptsQueryParameters { NSMutableDictionary *qp; BOOL shouldDisplay; shouldDisplay = ![self shouldDisplayRejectedAppointments]; qp = [[[self queryParameters] mutableCopy] autorelease]; [qp setObject: shouldDisplay ? @"1" : @"0" forKey: @"dr"]; return qp; } - (NSString *) toggleShowRejectedAptsLabel { if (![self shouldDisplayRejectedAppointments]) return @"show_rejected_apts"; return @"hide_rejected_apts"; } /* date selection & conversion */ - (NSDictionary *) _dateQueryParametersWithOffset: (int) daysOffset { NSCalendarDate *date; date = [[self startDate] dateByAddingYears: 0 months: 0 days: daysOffset hours: 0 minutes: 0 seconds: 0]; return [self queryParametersBySettingSelectedDate: date]; } - (NSDictionary *) todayQueryParameters { return [self queryParametersBySettingSelectedDate: [NSCalendarDate date]]; } - (NSDictionary *) currentDayQueryParameters { return [self queryParametersBySettingSelectedDate: currentDay]; } /* Actions */ - (NSString *) _userFolderURI { WOContext *ctx; id obj; NSURL *url; ctx = [self context]; obj = [[ctx objectTraversalStack] objectAtIndex: 1]; url = [NSURL URLWithString: [obj baseURLInContext: ctx]]; return [[url path] stringByUnescapingURL]; } - (id) redirectForUIDsAction { NSMutableString *uri; NSString *uidsString, *loc, *prevMethod, *userFolderID; id r; BOOL useGroups; NSUInteger index; uidsString = [self queryParameterForKey: @"userUIDString"]; uidsString = [uidsString stringByTrimmingSpaces]; [self setQueryParameter: nil forKey: @"userUIDString"]; prevMethod = [self queryParameterForKey: @"previousMethod"]; if (prevMethod == nil) prevMethod = @""; uri = [[NSMutableString alloc] initWithString: [self _userFolderURI]]; /* if we have more than one entry, use groups - otherwise don't */ useGroups = [uidsString rangeOfString: @","].length > 0; userFolderID = [uri lastPathComponent]; if (useGroups) { NSArray *uids; uids = [uidsString componentsSeparatedByString: @","]; /* guarantee that our id is the first */ if (((index = [uids indexOfObject: userFolderID]) != NSNotFound) && (index != 0)) { uids = [[uids mutableCopy] autorelease]; [(NSMutableArray *) uids removeObjectAtIndex: index]; [(NSMutableArray *) uids insertObject: userFolderID atIndex: 0]; uidsString = [uids componentsJoinedByString: @","]; } [uri appendString: @"Groups/_custom_"]; [uri appendString: uidsString]; [uri appendString: @"/"]; NSLog (@"Group URI = '%@'", uri); } else { /* check if lastPathComponent is the base that we want to have */ if ((([uidsString length] != 0) && (![userFolderID isEqualToString: uidsString]))) { NSRange r; /* uri ends with an '/', so we have to adjust the range a little */ r = NSMakeRange(0, [uri length] - 1); r = [uri rangeOfString: @"/" options: NSBackwardsSearch range: r]; r = NSMakeRange(r.location + 1, [uri length] - r.location - 2); [uri replaceCharactersInRange: r withString: uidsString]; } } [uri appendString: @"Calendar/"]; [uri appendString: prevMethod]; #if 0 NSLog(@"%s redirect uri:%@", __PRETTY_FUNCTION__, uri); #endif loc = [self completeHrefForMethod: uri]; /* this might return uri! */ r = [self redirectToLocation: loc]; [uri release]; return r; } @end /* UIxCalView */ SOGo-2.1.1b/UI/Scheduler/French.lproj/0000755000000000000000000000000012247657030015755 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/French.lproj/Localizable.strings0000644000000000000000000004351512247657030021621 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Créer un nouvel événement"; "Create a new task" = "Créer une nouvelle tâche"; "Edit this event or task" = "Modifier l'événement ou la tâche sélectionnée"; "Delete this event or task" = "Supprimer l'événement ou la tâche sélectionnée"; "Go to today" = "Revenir à la date d'aujourd'hui"; "Switch to day view" = "Afficher la journée"; "Switch to week view" = "Afficher la semaine"; "Switch to month view" = "Afficher le mois"; "Reload all calendars" = "Actualiser tous les agendas"; /* Tabs */ "Date" = "Date"; "Calendars" = "Agendas"; /* Day */ "DayOfTheMonth" = "Jour du mois"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "Aujourd'hui"; "Previous Day" = "Jour précédent"; "Next Day" = "Jour suivant"; /* Week */ "Week" = "Semaine"; "this week" = "cette semaine"; "Week %d" = "Semaine nº %d"; "Previous Week" = "Semaine précédente"; "Next Week" = "Semaine suivante"; /* Month */ "this month" = "ce mois"; "Previous Month" = "Mois précédent"; "Next Month" = "Mois suivant"; /* Year */ "this year" = "Cette année"; /* Menu */ "Calendar" = "Agenda"; "Contacts" = "Contacts"; "New Calendar..." = "Nouvel agenda..."; "Delete Calendar" = "Effacer l'agenda..."; "Unsubscribe Calendar" = "Se désabonner de l'agenda"; "Sharing..." = "Partage..."; "Export Calendar..." = "Exporter l'agenda..."; "Import Events..." = "Importer des événements..."; "Import Events" = "Importer des événements"; "Select an iCalendar file (.ics)." = "Sélectionner un fichier. iCalendar (*.ics)."; "Upload" = "Ajouter"; "Uploading" = "Téléversement en cours"; "Publish Calendar..." = "Publier l'agenda..."; "Reload Remote Calendars" = "Recharger les agendas distants"; "Properties" = "Propriétés"; "Done" = "Terminer"; "An error occurred while importing calendar." = "Une erreur s'est produite lors de l'importation."; "No event was imported." = "Aucun événement n'a été importé."; "A total of %{0} events were imported in the calendar." = "Un total de %{0} événements ont été importés dans le calendrier."; "Compose E-Mail to All Attendees" = "Rédiger un courriel pour tous les participants"; "Compose E-Mail to Undecided Attendees" = "Rédiger un courriel pour les participants indécis"; /* Folders */ "Personal calendar" = "Agenda personnel"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Accès non autorisée"; /* acls */ "Access rights to" = "Droits d'accès à"; "For user" = "Pour l'utilisateur"; "Any Authenticated User" = "Tout utilisateur identifié"; "Public Access" = "Accès public"; "label_Public" = "Public"; "label_Private" = "Privé"; "label_Confidential" = "Confidentiel"; "label_Viewer" = "Voir tout"; "label_DAndTViewer" = "Voir la date & l'heure"; "label_Modifier" = "Modifier"; "label_Responder" = "Répondre"; "label_None" = "Aucun"; "View All" = "Voir tout"; "View the Date & Time" = "Voir la date & l'heure"; "Modify" = "Modifier"; "Respond To" = "Répondre"; "None" = "Aucun"; "This person can create objects in my calendar." = "Cette personne peut ajouter des objets à mon agenda."; "This person can erase objects from my calendar." = "Cette personne peut effacer des objets de mon agenda."; /* Button Titles */ "Subscribe to a Calendar..." = "S'inscrire à un agenda..."; "Remove the selected Calendar" = "Enlever l'agenda sélectionné"; "Name of the Calendar" = "Nom de l'agenda"; "new" = "Nouveau"; "printview" = "Version imprimable"; "edit" = "Éditer"; "delete" = "Supprimer"; "proposal" = "Recherche de plages horaires"; "Save and Close" = "Enregistrer et fermer"; "Close" = "Fermer"; "Invite Attendees" = "Participants"; "Attach" = "Joindre"; "Update" = "Mettre à jour"; "Cancel" = "Annuler"; "show_rejected_apts" = "Afficher les rendez-vous refusés"; "hide_rejected_apts" = "Cacher les rendez-vous refusés"; /* Schedule */ "Schedule" = "Suivi de rendez-vous"; "No appointments found" = "Aucun rendez-vous"; "Meetings proposed by you" = "Rendez-vous que vous proposez"; "Meetings proposed to you" = "Rendez-vous qui vous sont proposés"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Action"; "accept" = "Accepter"; "decline" = "Refuser"; "more attendees" = "Autres participants"; "Hide already accepted and rejected appointments" = "Cacher les invitations refusées"; "Show already accepted and rejected appointments" = "Montrer aussi les invitations refusées"; /* Appointments */ "Appointment viewer" = "Visualisation de rendez-vous"; "Appointment editor" = "Edition de rendez-vous"; "Appointment proposal" = "Proposition de rendez-vous"; "Appointment on" = "Rendez-vous le"; "Start:" = "Début :"; "End:" = "Au :"; "Due Date:" = "Fin prévue :"; "Title:" = "Titre :"; "Calendar:" = "Agenda :"; "Name" = "Nom"; "Email" = "Courrier"; "Status:" = "Statut :"; "% complete" = "% d'achèvement"; "Location:" = "Lieu :"; "Priority:" = "Priorité"; "Privacy" = "Confidentialité"; "Cycle" = "Récurrence"; "Cycle End" = "s'arreter"; "Categories" = "Catégories"; "Classification" = "Classification"; "Duration" = "Durée"; "Attendees:" = "Participants :"; "Resources" = "Ressources"; "Organizer:" = "Organisateur :"; "Description:" = "Description :"; "Document:" = "Document :"; "Category:" = "Catégorie :"; "Repeat:" = "Répétition :"; "Reminder:" = "Rappel :"; "General:" = "Général:"; "Reply:" = "Réponse:"; "Created by:" = "Créé par:"; "Target:" = "Destination :"; "attributes" = "Attributs"; "attendees" = "Participants"; "delegated from" = "délégué par"; /* checkbox title */ "is private" = "Rendez-vous privé"; /* classification */ "Public" = "Public"; "Private" = "Privé"; /* text used in overviews and tooltips */ "empty title" = "Titre vide"; "private appointment" = "Rendez-vous privé"; "Change..." = "Modifier..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Je confirmerai plus tard"; "partStat_ACCEPTED" = "Je participerai"; "partStat_DECLINED" = "Je ne participerai pas"; "partStat_TENTATIVE" = "Je participerai peut-être"; "partStat_DELEGATED" = "Je délègue"; "partStat_OTHER" = "???"; /* Appointments (error messages) */ "Conflicts found!" = "Un ou plusieurs conflicts ont été détectés"; "Invalid iCal data!" = "Données iCal non valides ..."; "Could not create iCal data!" = "Les données iCal n'ont pu être crées ..."; /* Searching */ "view_all" = "Tous les événements"; "view_today" = "Événements du jour"; "view_next7" = "Événements des 7 prochains jours"; "view_next14" = "Événements des 14 prochains jours"; "view_next31" = "Événements des 31 prochains jours"; "view_thismonth" = "Événements du mois en cours"; "view_future" = "Tous les événements futurs"; "view_selectedday" = "Jour courant"; "View:" = "Voir :"; "Title or Description" = "Le titre ou la description"; "Search" = "Rechercher"; "Search attendees" = "Recherche de participants"; "Search resources" = "Recherche de ressources"; "Search appointments" = "Recherche de rendez-vous"; "All day Event" = "Événement sur la journée"; "check for conflicts" = "Vérifier les conflits"; "Browse URL" = "Visiter l'URL"; "newAttendee" = "Ajouter un participant"; /* calendar modes */ "Overview" = "Vue synthétique"; "Chart" = "Vue avec repères horaires"; "List" = "Vue multi-agenda"; "Columns" = "Vue avec repères mensuels"; /* Priorities */ "prio_0" = "Non-spécifiée"; "prio_1" = "Haute"; "prio_2" = "Haute"; "prio_3" = "Haute"; "prio_4" = "Haute"; "prio_5" = "Normale"; "prio_6" = "Basse"; "prio_7" = "Basse"; "prio_8" = "Basse"; "prio_9" = "Basse"; /* access classes (privacy) */ "PUBLIC_vevent" = "Événement public"; "CONFIDENTIAL_vevent" = "Événement confidentiel"; "PRIVATE_vevent" = "Événement privé"; "PUBLIC_vtodo" = "Tâche publique"; "CONFIDENTIAL_vtodo" = "Tâche confidentielle"; "PRIVATE_vtodo" = "Tâche privée"; /* status type */ "status_" = "Non-spécifié"; "status_NOT-SPECIFIED" = "Non spécifié"; "status_TENTATIVE" = "Tentatif"; "status_CONFIRMED" = "Confirmé"; "status_CANCELLED" = "Annulé"; "status_NEEDS-ACTION" = "En attente"; "status_IN-PROCESS" = "En cours"; "status_COMPLETED" = "Complété le"; /* Cycles */ "cycle_once" = "Sans récurrence"; "cycle_daily" = "Chaque jour"; "cycle_weekly" = "Chaque semaine"; "cycle_2weeks" = "Toutes les deux semaines"; "cycle_4weeks" = "Toutes les quatre semaines "; "cycle_monthly" = "Tous les mois"; "cycle_weekday" = "À chaque même jour de la semaine"; "cycle_yearly" = "Chaque année"; "cycle_end_never" = "Jamais"; "cycle_end_until" = "À la date :"; "Recurrence pattern" = "Définir la fréquence"; "Range of recurrence" = "Fenêtre de répétition"; "Repeat" = "Répétition"; "Daily" = "quotidienne"; "Weekly" = "hebdomadaire"; "Monthly" = "mensuelle"; "Yearly" = "annuelle"; "Every" = "Chaque"; "Days" = "Jours"; "Week(s)" = "Semaine(s)"; "On" = "Le"; "Month(s)" = "Mois"; "The" = "Le"; "Recur on day(s)" = "Se répète le(s) jour(s)"; "Year(s)" = "Année(s)"; "cycle_of" = "de"; "No end date" = "Pas de date de fin"; "Create" = "Créer"; "appointment(s)" = "rendez-vous"; "Repeat until" = "Répéter jusqu'à"; "First" = "premier"; "Second" = "deuxieme"; "Third" = "troisieme"; "Fourth" = "quatrieme"; "Fift" = "cinquieme"; "Last" = "dernier"; /* Appointment categories */ "category_none" = "Aucune"; "category_labels" = "Anniversaire,Affaire,Appels,Clients,Compétitions,Congrès,Consommation,Préférés,Suivis,Cadeaux,Congés,Idées,Réunion,Problèmes,Divers,Personnel,Projets,Jour férié,Statut,Fournisseurs,Voyages,Professionnel"; "repeat_NEVER" = "Jamais"; "repeat_DAILY" = "Quotidienne"; "repeat_WEEKLY" = "Hebdomadaire"; "repeat_BI-WEEKLY" = "Toutes les deux semaines"; "repeat_EVERY WEEKDAY" = "Chaque jour ouvrable"; "repeat_MONTHLY" = "Mensuelle"; "repeat_YEARLY" = "Annuelle"; "repeat_CUSTOM" = "Personnaliser..."; "reminder_NONE" = "Pas de rappel"; "reminder_5_MINUTES_BEFORE" = "5 minutes avant"; "reminder_10_MINUTES_BEFORE" = "10 minutes avant"; "reminder_15_MINUTES_BEFORE" = "15 minutes avant"; "reminder_30_MINUTES_BEFORE" = "30 minutes avant"; "reminder_45_MINUTES_BEFORE" = "45 minutes avant"; "reminder_1_HOUR_BEFORE" = "1 heure avant"; "reminder_2_HOURS_BEFORE" = "2 heures avant"; "reminder_5_HOURS_BEFORE" = "5 heures avant"; "reminder_15_HOURS_BEFORE" = "15 heures avant"; "reminder_1_DAY_BEFORE" = "1 jour avant"; "reminder_2_DAYS_BEFORE" = "2 jours avant"; "reminder_1_WEEK_BEFORE" = "1 semaine avant"; "reminder_CUSTOM" = "Personnaliser..."; "reminder_MINUTES" = "minutes"; "reminder_HOURS" = "heures"; "reminder_DAYS" = "jours"; "reminder_BEFORE" = "avant"; "reminder_AFTER" = "après"; "reminder_START" = "le début de l'événement"; "reminder_END" = "la fin de l'événement"; "Reminder Details" = "Détails du rappel"; "Choose a Reminder Action" = "Choisir une action pour le rappel"; "Show an Alert" = "Afficher une alerte"; "Send an E-mail" = "Envoyer un courrier"; "Email Organizer" = "À l'organisateur"; "Email Attendees" = "Aux invités"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Affiché comme disponible"; /* email notifications */ "Send Appointment Notifications" = "Envoyer les notifications des événements"; /* validation errors */ validate_notitle = "Le titre n'est pas rempli. Continuer quand-même ?"; validate_invalid_startdate = "La date de début est invalide !"; validate_invalid_enddate = "La date de fin est invalide !"; validate_endbeforestart = "La date de fin est avant la date de début."; "Events" = "Événements"; "Tasks" = "Tâches"; "Show completed tasks" = "Afficher les tâches accomplies"; /* tabs */ "Task" = "Tâche"; "Event" = "Événement"; "Recurrence" = "Répétition"; /* toolbar */ "New Event" = "Nouvel événement"; "New Task" = "Nouvelle tâche"; "Edit" = "Éditer"; "Delete" = "Effacer"; "Go to Today" = "Aujourd'hui"; "Day View" = "Journée"; "Week View" = "Semaine"; "Month View" = "Mois"; "Reload" = "Actualiser"; "eventPartStatModificationError" = "Votre état de participation à l'événement n'a pas pu être modifié."; /* menu */ "New Event..." = "Nouvel événement..."; "New Task..." = "Nouvelle tâche..."; "Edit Selected Event..." = "Modifier l'événement sélectionné..."; "Delete Selected Event" = "Supprimer l'événement sélectionné"; "Select All" = "Tout sélectionner"; "Workweek days only" = "Semaine de travail seulement"; "Tasks in View" = "Afficher les tâches"; "eventDeleteConfirmation" = "Le ou les événements suivants seront supprimés :\n%{0}\nVoulez-vous continuer?"; "taskDeleteConfirmation" = "Le ou les tâches suivantes seront supprimées :\n%{0}\nVoulez-vous continuer?"; "You cannot remove nor unsubscribe from your personal calendar." = "Vous ne pouvez pas supprimer ni vous désabonner de votre agenda personnel."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Voulez-vous vraiment supprimer l'agenda «%{0}»?"; /* Legend */ "Participant" = "Invité"; "Optional Participant" = "Invité optionnel"; "Non Participant" = "Non-invité"; "Chair" = "Président"; "Needs action" = "En attente"; "Accepted" = "Accepté"; "Declined" = "Décliné"; "Tentative" = "Tentatif"; "Free" = "Libre"; "Busy" = "Occupé"; "Maybe busy" = "Peut-être occupé"; "No free-busy information" = "Pas d'information"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Suggérer un créneau horaire :"; "Zoom:" = "Zoom:"; "Previous slot" = "Précédent"; "Next slot" = "Prochain"; "Previous hour" = "Heure précédente"; "Next hour" = "Prochaine heure"; "Work days only" = "Seulement les jours ouvrables"; "The whole day" = "La journée complète"; "Between" = "Entre"; "and" = "et"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Il y a un conflit avec l'horaire d'un ou plusieurs participants.\nVoulez-vous conserver les paramètres actuel malgré tout?"; /* apt list */ "Title" = "Titre"; "Start" = "Début"; "End" = "Fin"; "Due Date" = "Fin prévue"; "Location" = "Lieu"; "(Private Event)" = "(Événement privé)"; vevent_class0 = "(Événement public)"; vevent_class1 = "(Événement privé)"; vevent_class2 = "(Événement confidentiel)"; "Priority" = "Priorité"; "Category" = "Catégorie"; vtodo_class0 = "(Tâche publique)"; vtodo_class1 = "(Tâche privée)"; vtodo_class2 = "(Tâche confidentielle)"; "closeThisWindowMessage" = "Merci! Vous pouvez maintenant fermer cette fenêtre ou consulter votre "; "Multicolumn Day View" = "Multicolonne"; "Please select an event or a task." = "Veuillez sélectionner un événement ou une tâche."; "editRepeatingItem" = "L'élément que vous éditez est récurrent. Voulez-vous modifier toutes ses occurrences ou seulement celle-ci ?"; "button_thisOccurrenceOnly" = "Cette occurence seulement"; "button_allOccurrences" = "Toutes les occurences"; /* Properties dialog */ "Name:" = "Nom :"; "Color:" = "Couleur :"; "Include in free-busy" = "Inclure dans la disponibilité"; "Synchronization" = "Synchronisation"; "Synchronize" = "Synchroniser"; "Tag:" = "Label :"; "Display" = "Affichage"; "Show alarms" = "Afficher les alarmes"; "Show tasks" = "Afficher les tâches"; "Notifications" = "Notifications"; "Receive a mail when I modify my calendar" = "Émettre un courrier quand je modifie mon agenda"; "Receive a mail when someone else modifies my calendar" = "Émettre un courrier quand quelqu'un d'autre modifie mon agenda"; "When I modify my calendar, send a mail to:" = "Quand je modifie mon agenda, émettre un courrier à :"; "Links to this Calendar" = "Liens vers cet agenda"; "Authenticated User Access" = "Accès aux utilisateurs authentifiés"; "CalDAV URL" = "Accès en CalDAV"; "WebDAV ICS URL" = "Représentation ICS en WebDAV"; "WebDAV XML URL" = "Représentation XML en WebDAV"; /* Error messages */ "dayFieldInvalid" = "Veuillez spécifier un chiffre supérieur ou égal à 1 dans le champ Jours."; "weekFieldInvalid" = "Veuillez spécifier un chiffre supérieur ou égal à 1 dans le champ Semaine(s)."; "monthFieldInvalid" = "Veuillez spécifier un chiffre supérieur ou égal à 1 dans le champ Mois."; "monthDayFieldInvalid" = "Veuillez spécifier un chiffre supérieur ou égal à 1 dans la journée du mois."; "yearFieldInvalid" = "Veuillez spécifier un chiffre supérieur ou égal à 1 dans le champ Année(s)."; "appointmentFieldInvalid" = "Veuillez spécifier un chiffre supérieur ou égal à 1 dans le champ rendez-vous."; "recurrenceUnsupported" = "Ce type de récurrence n\\\'est pas supporté."; "Please specify a calendar name." = "Veuillez définir un nom au calendrier."; "tagNotDefined" = "Vous devez spécifier un label si vous désirez synchroniser ce calendrier."; "tagAlreadyExists" = "Le label spécifié est déjà associé à un autre calendrier. Choisissez-en un autre."; "tagHasChanged" = "En changeant le label de ce calendrier, vous devrez recharger les données sur votre appareil mobile.\nVoulez-vous continuer?"; "tagWasAdded" = "Afin de synchroniser ce calendrier, vous devrez recharger les données sur votre appareil mobile.\nVoulez-vous continuer?"; "tagWasRemoved" = "Afin de ne plus synchroniser ce calendrier, vous devrez recharger les données sur votre appareil mobile.\nVoulez-vous continuer?"; "DestinationCalendarError" = "Le calendrier de destination est le même que celui de l'événement. Choisissez un calendrier de destination différent."; "EventCopyError" = "La copie a échouée. Choisissez un calendrier de destination différent."; "Open Task..." = "Ouvrir la tâche..."; "Mark Completed" = "Marquer comme accomplie"; "Delete Task" = "Supprimer la tâche"; "Delete Event" = "Supprimer l'événement"; "Copy event to my calendar" = "Copier l'événement dans mon agenda"; "View Raw Source" = "Afficher le contenu original"; "Subscribe to a web calendar..." = "S'inscrire à un agenda en ligne..."; "URL of the Calendar" = "URL de l'agenda"; "Web Calendar" = "Calendrier web"; "Reload on login" = "Rafraîchir à la connexion"; "Invalid number." = "Nombre invalide."; "Please identify yourself to %{0}" = "Veuillez vous authentifier à %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxCalendarSelector.h0000644000000000000000000000253112247657030017435 0ustar rootroot/* UIxCalendarSelector.h - this file is part of SOGo * * Copyright (C) 2007, 2008 Inverse inc. * * 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 UIXCALENDARSELECTOR_H #define UIXCALENDARSELECTOR_H #import @class NSArray; @class NSMutableArray; @class NSDictionary; @class NSString; @interface UIxCalendarSelector : UIxComponent { NSMutableArray *calendars; NSDictionary *currentCalendar; } - (NSArray *) calendars; - (void) setCurrentCalendar: (NSDictionary *) newCalendar; - (NSDictionary *) currentCalendar; - (WOResponse *) calendarsListAction; @end #endif /* UIXCALENDARSELECTOR_H */ SOGo-2.1.1b/UI/Scheduler/UIxCalFolderActions.m0000644000000000000000000001071512247657030017407 0ustar rootroot/* Copyright (C) 2006-2013 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG This file is part of SOGo SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import #import #import #import "UIxCalFolderActions.h" @implementation UIxCalFolderActions - (WOResponse *) exportAction { WOResponse *response; SOGoAppointmentFolderICS *folderICS; NSString *disposition; folderICS = [self clientObject]; response = [self responseWithStatus: 200 andString: [folderICS contentAsString]]; [response setHeader: @"text/calendar; charset=utf-8" forKey: @"content-type"]; disposition = [NSString stringWithFormat: @"attachment; filename=\"%@.ics\"", [folderICS displayName]]; [response setHeader: disposition forKey: @"Content-Disposition"]; return response; } - (WOResponse *) importAction { SOGoAppointmentFolder *folder; NSMutableDictionary *rc; iCalCalendar *additions; NSString *fileContent; WOResponse *response; WORequest *request; NSArray *cals; id data; int i, imported; imported = 0; rc = [NSMutableDictionary dictionary]; request = [context request]; folder = [self clientObject]; data = [request formValueForKey: @"calendarFile"]; if ([data respondsToSelector: @selector(isEqualToString:)]) fileContent = (NSString *) data; else { fileContent = [[NSString alloc] initWithData: (NSData *) data encoding: NSUTF8StringEncoding]; if (fileContent == nil) fileContent = [[NSString alloc] initWithData: (NSData *) data encoding: NSISOLatin1StringEncoding]; [fileContent autorelease]; } if (fileContent && [fileContent length] && [fileContent hasPrefix: @"BEGIN:"]) { cals = [iCalCalendar parseFromSource: fileContent]; for (i = 0; i < [cals count]; i++) { additions = [cals objectAtIndex: i]; imported += [folder importCalendar: additions]; } } [rc setObject: [NSNumber numberWithInt: imported] forKey: @"imported"]; response = [self responseWithStatus: 200]; [response setHeader: @"text/html" forKey: @"content-type"]; [(WOResponse*)response appendContentString: [rc jsonRepresentation]]; return response; } /* These methods are only available on instance of SOGoWebAppointmentFolder. */ - (WOResponse *) reloadAction { WOResponse *response; NSDictionary *results; response = [self responseWithStatus: 200]; [response setHeader: @"application/json" forKey: @"content-type"]; results = [[self clientObject] loadWebCalendar]; [response appendContentString: [results jsonRepresentation]]; return response; } - (WOResponse *) setCredentialsAction { WORequest *request; WOResponse *response; NSString *username, *password; request = [context request]; username = [[request formValueForKey: @"username"] stringByTrimmingSpaces]; password = [[request formValueForKey: @"password"] stringByTrimmingSpaces]; if ([username length] > 0 && [password length] > 0) { [[self clientObject] setUsername: username andPassword: password]; response = [self responseWith204]; } else response = (WOResponse *) [NSException exceptionWithHTTPStatus: 400 reason: @"missing 'username' and/or" @" 'password' parameters"]; return response; } @end /* UIxCalFolderActions */ SOGo-2.1.1b/UI/Scheduler/NorwegianBokmal.lproj/0000755000000000000000000000000012247657030017627 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/NorwegianBokmal.lproj/Localizable.strings0000644000000000000000000004013712247657030023470 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Opprett en ny hendelse"; "Create a new task" = "Opprett en ny oppgave"; "Edit this event or task" = "Endre hendelse eller oppgave"; "Delete this event or task" = "Slett denne hendelsen eller oppgaven"; "Go to today" = "GÃ¥ til i dag"; "Switch to day view" = "Endre til dagsvisning"; "Switch to week view" = "Endre til ukesvisning"; "Switch to month view" = "Endre til mÃ¥nedsvisning"; "Reload all calendars" = "Last pÃ¥ nytt alle kalendre"; /* Tabs */ "Date" = "Dato"; "Calendars" = "Kalendere"; /* Day */ "DayOfTheMonth" = "Dag i mÃ¥neden"; "dayLabelFormat" = "%Y-%m-%d"; "today" = "Idag"; "Previous Day" = "Forrige dag"; "Next Day" = "Neste dag"; /* Week */ "Week" = "Uke"; "this week" = "denne uken"; "Week %d" = "Uke %d"; "Previous Week" = "Forrige uke"; "Next Week" = "Neste uke"; /* Month */ "this month" = "denne mÃ¥neden"; "Previous Month" = "Forrige mÃ¥ned"; "Next Month" = "Neste mÃ¥ned"; /* Year */ "this year" = "dette Ã¥r"; /* Menu */ "Calendar" = "Kalender"; "Contacts" = "Kontakter"; "New Calendar..." = "Ny kalender..."; "Delete Calendar" = "Slett kalender..."; "Unsubscribe Calendar" = "Avslutt abonnement pÃ¥ kalender"; "Sharing..." = "Deling..."; "Export Calendar..." = "Eksporter kalender..."; "Import Events..." = "Importer hendelser..."; "Import Events" = "Importer hendelser"; "Select an iCalendar file (.ics)." = "Velg en iCalendar-fil (.ics)."; "Upload" = "Last opp"; "Uploading" = "Laster opp"; "Publish Calendar..." = "Publiser kalender..."; "Reload Remote Calendars" = "Last pÃ¥ nytt fjernkalendre"; "Properties" = "Egenskaper"; "Done" = "Klar"; "An error occurred while importing calendar." = "En feil har oppstÃ¥tt under kalenderimporten."; "No event was imported." = "Ingen hendelser ble importert."; "A total of %{0} events were imported in the calendar." = "Totalt %{0} hendelser ble importert til kalenderen."; "Compose E-Mail to All Attendees" = "Skriv en e-post til alle deltakere"; "Compose E-Mail to Undecided Attendees" = "Skriv en e-post til alle deltakere som ikke har svart"; /* Folders */ "Personal calendar" = "Personlig kalender"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Forbudt"; /* acls */ "Access rights to" = "Tilgangsrettigheter til"; "For user" = "For bruker"; "Any Authenticated User" = "Enhver autentisert bruker"; "Public Access" = "Felles adgang"; "label_Public" = "Felles"; "label_Private" = "Privat"; "label_Confidential" = "Konfidensielt"; "label_Viewer" = "Vis alle"; "label_DAndTViewer" = "Vis tid og dato"; "label_Modifier" = "Endre"; "label_Responder" = "Svar"; "label_None" = "Ingen"; "View All" = "Vis alle"; "View the Date & Time" = "Vis tid og dato"; "Modify" = "Endre"; "Respond To" = "Svar"; "None" = "Ingen"; "This person can create objects in my calendar." = "Personen kan opprette objekter i min kalender."; "This person can erase objects from my calendar." = "Personen kan fjerne objekter i min kalender."; /* Button Titles */ "Subscribe to a Calendar..." = "Abonnere pÃ¥ en kalender..."; "Remove the selected Calendar" = "Slett markert kalender"; "Name of the Calendar" = "Navn pÃ¥ kalenderen"; "new" = "Ny"; "printview" = "Skriv ut"; "edit" = "Endre"; "delete" = "Slett"; "proposal" = "ForeslÃ¥"; "Save and Close" = "Lagre og lukk"; "Close" = "Lukk"; "Invite Attendees" = "Inviter deltagere"; "Attach" = "Vedlegg"; "Update" = "Oppdater"; "Cancel" = "Avbryt"; "show_rejected_apts" = "Vis avbrutte møter"; "hide_rejected_apts" = "Skjul avbrutte møter"; /* Schedule */ "Schedule" = "Planlegg"; "No appointments found" = "Ingen avtaler funnet"; "Meetings proposed by you" = "Møter foreslÃ¥tt av deg"; "Meetings proposed to you" = "Møter foreslÃ¥tt til deg"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Handling"; "accept" = "Godta"; "decline" = "AvslÃ¥"; "more attendees" = "Flere deltagere"; "Hide already accepted and rejected appointments" = "Skjul allerede aksepterte og avviste avtaler"; "Show already accepted and rejected appointments" = "Vis aksepterte og avviste avtaler"; /* Appointments */ "Appointment viewer" = "Avtaleviser"; "Appointment editor" = "Avtaleredigerer"; "Appointment proposal" = "Avtaleforslag"; "Appointment on" = "Møteavtale"; "Start:" = "Starter:"; "End:" = "Slutter:"; "Due Date:" = "Dato:"; "Title:" = "Tittel:"; "Calendar:" = "Kalender:"; "Name" = "Navn"; "Email" = "E-post"; "Status:" = "Status:"; "% complete" = "% utført"; "Location:" = "Sted:"; "Priority:" = "Prioritet:"; "Privacy" = "Personvern"; "Cycle" = "Intervall"; "Cycle End" = "Intervall slutter"; "Categories" = "Kategorier"; "Classification" = "Klassifisering"; "Duration" = "Varighet"; "Attendees:" = "Deltakere:"; "Resources" = "Ressurser"; "Organizer:" = "Organisator:"; "Description:" = "Beskrivelse:"; "Document:" = "Dokument:"; "Category:" = "Kategori:"; "Repeat:" = "Gjenta:"; "Reminder:" = "PÃ¥minnelse:"; "General:" = "Generell:"; "Reply:" = "Svar:"; "Target:" = "MÃ¥l:"; "attributes" = "attributter"; "attendees" = "deltakere"; "delegated from" = "delegert fra"; /* checkbox title */ "is private" = "er privat"; /* classification */ "Public" = "Felles"; "Private" = "Privat"; /* text used in overviews and tooltips */ "empty title" = "Ingen tittel"; "private appointment" = "Privat møte"; "Change..." = "Endre..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Jeg vil bekrefte senere"; "partStat_ACCEPTED" = "Jeg vil delta"; "partStat_DECLINED" = "Jeg kan ikke delta"; "partStat_TENTATIVE" = "Jeg kommer kanskje"; "partStat_DELEGATED" = "Jeg delegerer"; "partStat_OTHER" = "Annet"; /* Appointments (error messages) */ "Conflicts found!" = "Konflikter funnet!"; "Invalid iCal data!" = "Ugyldig iCal-data!"; "Could not create iCal data!" = "Kunne ikke opprette iCal-data!"; /* Searching */ "view_all" = "Alle"; "view_today" = "I dag"; "view_next7" = "Neste 7 dager"; "view_next14" = "Neste 14 dager"; "view_next31" = "Neste 31 dager"; "view_thismonth" = "Denne mÃ¥neden"; "view_future" = "Alle fremtidige hendelser"; "view_selectedday" = "Valgt dag"; "View:" = "Vis:"; "Title or Description" = "Tittel eller beskrivelse"; "Search" = "Søk"; "Search attendees" = "Søk deltakere"; "Search resources" = "Søk ressurser"; "Search appointments" = "Søk avtaler"; "All day Event" = "Heldagshendelse"; "check for conflicts" = "Kontroller konflikter"; "Browse URL" = "URL"; "newAttendee" = "Legg til deltakere"; /* calendar modes */ "Overview" = "Oversikt"; "Chart" = "Diagram"; "List" = "Liste"; "Columns" = "Kolonner"; /* Priorities */ "prio_0" = "Ikke spesifisert"; "prio_1" = "Høy"; "prio_2" = "Høy"; "prio_3" = "Høy"; "prio_4" = "Høy"; "prio_5" = "Normal"; "prio_6" = "Lav"; "prio_7" = "Lav"; "prio_8" = "Lav"; "prio_9" = "Lav"; /* access classes (privacy) */ "PUBLIC_vevent" = "Felles hendelse"; "CONFIDENTIAL_vevent" = "Konfidensiell hendelse"; "PRIVATE_vevent" = "Privat hendelse"; "PUBLIC_vtodo" = "Felles oppgave"; "CONFIDENTIAL_vtodo" = "Konfidensiell oppgave"; "PRIVATE_vtodo" = "Privat oppgave"; /* status type */ "status_" = "Ikke angitt"; "status_NOT-SPECIFIED" = "Ikke spesifisert"; "status_TENTATIVE" = "Foreløpig"; "status_CONFIRMED" = "Bekreftet"; "status_CANCELLED" = "Avlyst"; "status_NEEDS-ACTION" = "Trenger handling"; "status_IN-PROCESS" = "PÃ¥gÃ¥ende"; "status_COMPLETED" = "Utført"; /* Cycles */ "cycle_once" = "en gang"; "cycle_daily" = "hver dag"; "cycle_weekly" = "hver uke"; "cycle_2weeks" = "annenhver uke"; "cycle_4weeks" = "hver 4. uke"; "cycle_monthly" = "hver mÃ¥ned"; "cycle_weekday" = "hver ukedag"; "cycle_yearly" = "hvert Ã¥r"; "cycle_end_never" = "intervall slutter aldri"; "cycle_end_until" = "intervall slutter"; "Recurrence pattern" = "Regelmessighetsmønsteret"; "Range of recurrence" = "OmrÃ¥de for regelmessighet"; "Repeat" = "Gjenta"; "Daily" = "Daglig"; "Weekly" = "Ukentlig"; "Monthly" = "MÃ¥nedlig"; "Yearly" = "Ã…rlig"; "Every" = "Hver"; "Days" = "Dager"; "Week(s)" = "Uke(r)"; "On" = "PÃ¥"; "Month(s)" = "MÃ¥ned(er)"; "The" = " Den"; "Recur on day(s)" = "Gjentas pÃ¥ dag(er)"; "Year(s)" = "Ã…r"; "cycle_of" = "av"; "No end date" = "Ingen sluttdato"; "Create" = "Opprett"; "appointment(s)" = "avtale(r)"; "Repeat until" = "Gjenta til"; "First" = "Første"; "Second" = "Andre"; "Third" = "Tredje"; "Fourth" = "Fjerde"; "Fift" = "Femte"; "Last" = "Siste"; /* Appointment categories */ "category_none" = "Ingen"; "category_labels" = "Arbeid,Diverse,Favoritter,Fødselsdager,Helgdager,Idéer,Konkurranser,Kunder,Ledighet,Leverandører,Oppfølging,Personlig,Presenter,Prosjekt,Møter,Reiser,Status,Telefonsamtaler,Ærend"; "repeat_NEVER" = "Gjentas ikke"; "repeat_DAILY" = "Daglig"; "repeat_WEEKLY" = "Ukentlig"; "repeat_BI-WEEKLY" = "Annenhver uke"; "repeat_EVERY WEEKDAY" = "Hver ukedag"; "repeat_MONTHLY" = "MÃ¥nedlig"; "repeat_YEARLY" = "Hvert Ã¥r"; "repeat_CUSTOM" = "Valgfri..."; "reminder_NONE" = "Ingen pÃ¥minnelse"; "reminder_5_MINUTES_BEFORE" = "5 minutter før"; "reminder_10_MINUTES_BEFORE" = "10 minutter før"; "reminder_15_MINUTES_BEFORE" = "15 minutter før"; "reminder_30_MINUTES_BEFORE" = "30 minutter før"; "reminder_45_MINUTES_BEFORE" = "45 minutter før"; "reminder_1_HOUR_BEFORE" = "1 time før"; "reminder_2_HOURS_BEFORE" = "2 timer før"; "reminder_5_HOURS_BEFORE" = "5 timer før"; "reminder_15_HOURS_BEFORE" = "15 timer før"; "reminder_1_DAY_BEFORE" = "1 dag før"; "reminder_2_DAYS_BEFORE" = "2 dager før"; "reminder_1_WEEK_BEFORE" = "1 uke før"; "reminder_CUSTOM" = "Valgfri..."; "reminder_MINUTES" = "minutter"; "reminder_HOURS" = "timer"; "reminder_DAYS" = "dager"; "reminder_BEFORE" = "før"; "reminder_AFTER" = "etter"; "reminder_START" = "hendelsen starter"; "reminder_END" = "hendelsen slutter"; "Reminder Details" = "PÃ¥minnelsedetaljer"; "Choose a Reminder Action" = "Velg en pÃ¥minnelsesmÃ¥te"; "Show an Alert" = "Vis en alarm"; "Send an E-mail" = "Send en E-post"; "Email Organizer" = "E-post-organisator"; "Email Attendees" = "E-post-deltakere"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Vis tid som ledig"; /* email notifications */ /* validation errors */ validate_notitle = "Ingen tittel er angitt, fortsette?"; validate_invalid_startdate = "Feil startdato!"; validate_invalid_enddate = "Feil sluttdato!"; validate_endbeforestart = "Angitt sluttdato inntreffer før angitt startdato."; "Events" = "Hendelser"; "Tasks" = "Oppgaver"; "Show completed tasks" = "Vis utførte oppgave"; /* tabs */ "Task" = "Oppgave"; "Event" = "Hendelse"; "Recurrence" = "Regelmessighet"; /* toolbar */ "New Event" = "Ny hendelse"; "New Task" = "Ny oppgave"; "Edit" = "Endre"; "Delete" = "Slett"; "Go to Today" = "GÃ¥ til i dag"; "Day View" = "Dagsvisning"; "Week View" = "Ukesvisning"; "Month View" = "MÃ¥nedsvisning"; "Reload" = "Last pÃ¥ nytt"; "eventPartStatModificationError" = "Din deltakerstatus kunne ikke endres."; /* menu */ "New Event..." = "Ny hendelse..."; "New Task..." = "Ny oppgave..."; "Edit Selected Event..." = "Endre hendelse..."; "Delete Selected Event" = "Slett valgt hendelse"; "Select All" = "Velg alle"; "Workweek days only" = "Bare arbeidsdager"; "Tasks in View" = "Oppgaver i visning"; "eventDeleteConfirmation" = "Sletting av hendelsen er permanent.\nVil du fortsette?"; "taskDeleteConfirmation" = "Sletting av oppgaven er permanent.\nVil du fortsette?"; "You cannot remove nor unsubscribe from your personal calendar." = "Du kan ikke slette eller avbryte abonnement pÃ¥ en personlig kalender."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Er du sikker pÃ¥ at du vil slette kalenderen \"%{0}\"?"; /* Legend */ "Participant" = "Deltakelse kreves"; "Optional Participant" = "Deltakelse valgfritt"; "Non Participant" = "Ingen deltakelse"; "Chair" = "Stol"; "Needs action" = "Trenger handling"; "Accepted" = "Akseptert"; "Declined" = "Avvist"; "Tentative" = "Foreløpig"; "Free" = "Ledig"; "Busy" = "Opptatt"; "Maybe busy" = "Kanskje opptatt"; "No free-busy information" = "Ingen ledig/opptatt-informasjon"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "ForeslÃ¥ tid:"; "Zoom:" = "Forstørr:"; "Previous slot" = "Forrige tidspunkt"; "Next slot" = "Neste tidspunkt"; "Previous hour" = "Forrige time"; "Next hour" = "Neste time"; "Work days only" = "Bare arbeidsdager"; "The whole day" = "Hele dagen"; "Between" = "Mellom"; "and" = "og"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "En tidskonflikt eksisterer med en eller flere deltakere.\nVil du likevel beholde de nÃ¥værende innstillingene?"; /* apt list */ "Title" = "Tittel"; "Start" = "Start"; "End" = "Slutt"; "Due Date" = "Forfallsdato"; "Location" = "Sted"; "(Private Event)" = "(Privat hendelse)"; vevent_class0 = "(Offentlig hendelse)"; vevent_class1 = "(Privat hendelse)"; vevent_class2 = "(Konfidensiell hendelse)"; "Priority" = "Prioritet"; "Category" = "Kategori"; vtodo_class0 = "(Offentlig oppgave)"; vtodo_class1 = "(Privat oppgave)"; vtodo_class2 = "(Konfidensiell oppgave)"; "closeThisWindowMessage" = "Takk! Du kan nÃ¥ lukke vinduet eller se din"; "Multicolumn Day View" = "Flerkolonne dagsvisning"; "Please select an event or a task." = "Markér en hendelse eller oppgave."; "editRepeatingItem" = "Objektet du redigerer har gjentakelser. Vil du redigere alle forekomster eller bare denne forekomsten?"; "button_thisOccurrenceOnly" = "Bare denne forekomsten"; "button_allOccurrences" = "Alle forekomster"; /* Properties dialog */ "Name:" = "Navn:"; "Color:" = "Farge:"; "Include in free-busy" = "Inkluder i fritt opptatt"; "Synchronization" = "Synkronisering"; "Synchronize" = "Synkroniser"; "Tag:" = "Merkelapp:"; "Display" = "Vis"; "Show alarms" = "Vis alarmer"; "Show tasks" = "Vis oppgaver"; "Notifications" = "Varslinger"; "Receive a mail when I modify my calendar" = "Motta e-post nÃ¥r jeg oppdaterer kalenderen min"; "Receive a mail when someone else modifies my calendar" = "Motta e-post nÃ¥r andre oppdaterer kalenderen min"; "When I modify my calendar, send a mail to:" = "NÃ¥r jeg endrer kalenderen, send e-post til:"; "Links to this Calendar" = "Linker til denne kalenderen"; "Authenticated User Access" = "Autentisert brukertilgang"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Angi en numerisk verdi i dagsfeltet større enn eller lik 1."; "weekFieldInvalid" = "Angi en numerisk verdi i ukefeltet større enn eller lik 1."; "monthFieldInvalid" = "Angi en numerisk verdi i mÃ¥nedsfeltet større enn eller lik 1."; "monthDayFieldInvalid" = "Angi en numerisk verdi i dag i mÃ¥nedsfeltet større en eller lik 1."; "yearFieldInvalid" = "Angi en numerisk verdi i Ã¥rsfeltet større enn eller lik 1."; "appointmentFieldInvalid" = "Angi en numerisk verdi i møtesfeltet større enn eller lik 1."; "recurrenceUnsupported" = "Denne type gjentakelse støttes ikke i dag."; "Please specify a calendar name." = "Vennligst angi et kalendernavn."; "tagNotDefined" = "Du mÃ¥ angi en merkelapp om du vil synkronisere kalenderen."; "tagAlreadyExists" = "Merkelappen du spesifiserte er allerede knyttet til en annen kalender."; "tagHasChanged" = "Om du endrer merkelappen pÃ¥ din kalender trenger du Ã¥ laste dataene i din mobiltelefon pÃ¥ nytt.\nFortsette?"; "tagWasAdded" = "Om du vil synkronisere kalenderen trenger du Ã¥ laste dataene i din mobiltelefon pÃ¥ nytt.\nFortsette?"; "tagWasRemoved" = "Om du fjerner kalenderen fra synkronisering trenger du Ã¥ laste dataene i din mobiltelefon pÃ¥ nytt.\nFortsette?"; "DestinationCalendarError" = "Kilde- og mÃ¥lkalendere er de samme. Prøv Ã¥ kopiere til en annen kalender."; "EventCopyError" = "Kopiering feilet. Vennligst prøv Ã¥ kopiere til en annen kalender."; "Open Task..." = "Ã…pne oppgave..."; "Mark Completed" = "Merk utført"; "Delete Task" = "Slett oppgave"; "Delete Event" = "Slett hendelse"; "Copy event to my calendar" = "Kopier hendelse til min kalender"; "View Raw Source" = "Vis kilde"; "Subscribe to a web calendar..." = "Abonnere pÃ¥ en internett-kalender..."; "URL of the Calendar" = "URL til kalenderen"; "Web Calendar" = "Internett-kalender"; "Reload on login" = "Last pÃ¥ nytt ved innlogging"; "Invalid number." = "Ugyldig tall."; "Please identify yourself to %{0}" = "Vennligst identifiser deg for %{0}"; SOGo-2.1.1b/UI/Scheduler/Finnish.lproj/0000755000000000000000000000000012247657030016146 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Finnish.lproj/Localizable.strings0000644000000000000000000004241412247657030022007 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Luo uusi tapahtuma"; "Create a new task" = "Luo uusi tehtävä"; "Edit this event or task" = "Muokkaa tapahtumaa tai tehtävää"; "Delete this event or task" = "Poista tapahtuma tai tehtävä"; "Go to today" = "Siirry tähän päivään"; "Switch to day view" = "Siirry päivänäkymään"; "Switch to week view" = "Siirry viikkonäkymään"; "Switch to month view" = "Siirry kuukausinäkymään"; "Reload all calendars" = "Päivitä kaikki kalenterit"; /* Tabs */ "Date" = "Päivämäärä"; "Calendars" = "Kalenterit"; /* Day */ "DayOfTheMonth" = "Kuukaudenpäivä"; "dayLabelFormat" = "%m/%d/%Y"; "today" = "Tänään"; "Previous Day" = "Edellinen päivä"; "Next Day" = "Seuraava päivä"; /* Week */ "Week" = "Viikko"; "this week" = "Tämä viikko"; "Week %d" = "Viikko %d"; "Previous Week" = "Edellinen viikko"; "Next Week" = "Seuraava viikko"; /* Month */ "this month" = "Tämä kuukausi"; "Previous Month" = "Edellinen kuukausi"; "Next Month" = "Seuraava kuukausi"; /* Year */ "this year" = "tänä vuonna"; /* Menu */ "Calendar" = "Kalenteri"; "Contacts" = "Yhteystiedot"; "New Calendar..." = "Uusi kalenteri..."; "Delete Calendar" = "Poista kalenteri..."; "Unsubscribe Calendar" = "Lopeta kalenterin tilaus"; "Sharing..." = "Jakaminen..."; "Export Calendar..." = "Vie kalenteri..."; "Import Events..." = "Tuo tapahtumia..."; "Import Events" = "Tuo tapahtumia"; "Select an iCalendar file (.ics)." = "Valitse iCalendar tiedosto (.ics)."; "Upload" = "Lataa"; "Uploading" = "Lataa"; "Publish Calendar..." = "Julkinen kalenteri..."; "Reload Remote Calendars" = "Päivitä etäkalenterit"; "Properties" = "Ominaisuudet"; "Done" = "Tehty"; "An error occurred while importing calendar." = "Kalenterin tuonnissa tapahtui virhe."; "No event was imported." = "Ei tuotuja tehtäviä."; "A total of %{0} events were imported in the calendar." = "%{0} tehtävää tuotiin kalenteriin."; "Compose E-Mail to All Attendees" = "Luo sähköpostiviesti kaikille osallistujille"; "Compose E-Mail to Undecided Attendees" = "Luo sähköpostiviesti epävarmoille osallistujille"; /* Folders */ "Personal calendar" = "Henkilökohtainen kalenteri"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Kielletty"; /* acls */ "Access rights to" = "Käyttöoikeudet"; "For user" = "Käyttäjälle"; "Any Authenticated User" = "Kuka tahansa kirjautunut käyttäjä"; "Public Access" = "Julkinen pääsy"; "label_Public" = "Julkinen"; "label_Private" = "Yksityinen"; "label_Confidential" = "Luottamuksellinen"; "label_Viewer" = "Näytä kaikki"; "label_DAndTViewer" = "Naytä päivä ja aika"; "label_Modifier" = "Muokkaa"; "label_Responder" = "Vastaa"; "label_None" = "Ei mitään"; "View All" = "Näytä kaikki"; "View the Date & Time" = "Naytä päivä ja aika"; "Modify" = "Muokkaa"; "Respond To" = "Vastaa"; "None" = "Ei mitään"; "This person can create objects in my calendar." = "Tällä henkilöllä on oikeus luoda kohteita kalenteriini."; "This person can erase objects from my calendar." = "Tällä henkilöllä on oikeus poistaa kohteita kalenteristani."; /* Button Titles */ "Subscribe to a Calendar..." = "Tilaa kalenteri..."; "Remove the selected Calendar" = "Poista valittu kalenteri"; "Name of the Calendar" = "Kalenterin nimi"; "new" = "Uusi"; "printview" = "Tulostusnäkymä"; "edit" = "Muokkaa"; "delete" = "Poista"; "proposal" = "Ehdotus"; "Save and Close" = "Tallenna ja sulje"; "Close" = "Sulje"; "Invite Attendees" = "Kutsu osallistujia"; "Attach" = "Liitä"; "Update" = "Päivitä"; "Cancel" = "Peruuta"; "show_rejected_apts" = "Näytä hylätyt tapaamiset"; "hide_rejected_apts" = "Piilota hylätyt tapaamiset"; /* Schedule */ "Schedule" = "Aikataulu"; "No appointments found" = "Tapaamisia ei löytynyt"; "Meetings proposed by you" = "Ehdottamasi tapaamiset"; "Meetings proposed to you" = "Sinulle ehdotetut tapaamiset"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Toiminta"; "accept" = "Hyväksy"; "decline" = "Kieltäydy"; "more attendees" = "Lisää osanottajia"; "Hide already accepted and rejected appointments" = "Piilota hyväksytyt ja hylätyt tapaamiset"; "Show already accepted and rejected appointments" = "Näytä hyväksytyt ja hylätyt tapaamiset"; /* Appointments */ "Appointment viewer" = "Tapaamisnäkymä"; "Appointment editor" = "Tapaamisen muokkain"; "Appointment proposal" = "Tapaamisehdotus"; "Appointment on" = "Tapaaminen"; "Start:" = "Alkaa:"; "End:" = "Päättyy:"; "Due Date:" = "Määräpäivä:"; "Title:" = "Otsikko:"; "Calendar:" = "Kalenteri:"; "Name" = "Nimi"; "Email" = "Sähköposti"; "Status:" = "Tila:"; "% complete" = "% valmiina"; "Location:" = "Paikka:"; "Priority:" = "Prioriteetti:"; "Privacy" = "Yksityisyys"; "Cycle" = "Kierto"; "Cycle End" = "Kierto päättyy"; "Categories" = "Luokat"; "Classification" = "Luokittelu"; "Duration" = "Kesto"; "Attendees:" = "Osallistujat:"; "Resources" = "Resurssit"; "Organizer:" = "Järjestäjä:"; "Description:" = "Kuvaus:"; "Document:" = "Tiedosto:"; "Category:" = "Luokka:"; "Repeat:" = "Toista:"; "Reminder:" = "Muistuttaja:"; "General:" = "Yleinen:"; "Reply:" = "Vastaus:"; "Created by:" = "Luonut:"; "Target:" = "Kohde:"; "attributes" = "ominaisuudet"; "attendees" = "osallistujat"; "delegated from" = "valtuuttaja"; /* checkbox title */ "is private" = "on yksityinen"; /* classification */ "Public" = "Julkinen"; "Private" = "Yksityinen"; /* text used in overviews and tooltips */ "empty title" = "Tyhjä otsikko"; "private appointment" = "Yksityinen tapaaminen"; "Change..." = "Vaihda..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Vahvistan myöhemmin"; "partStat_ACCEPTED" = "Osallistun"; "partStat_DECLINED" = "En osallistu"; "partStat_TENTATIVE" = "Osallistun ehkä"; "partStat_DELEGATED" = "valtuutan"; "partStat_OTHER" = "Muuta"; /* Appointments (error messages) */ "Conflicts found!" = "Ristiriitoja löytyi"; "Invalid iCal data!" = "Epäkelpo iCal aineisto!"; "Could not create iCal data!" = "Ei voitu luoda iCal aineistoa!"; /* Searching */ "view_all" = "Kaikki"; "view_today" = "Tänään"; "view_next7" = "Seuraavat 7 päivää"; "view_next14" = "Seuraavat 14 päivää"; "view_next31" = "Seuraavat 31 päivää"; "view_thismonth" = "Tämä kuukausi"; "view_future" = "Kaikki tulevat tapahtumat"; "view_selectedday" = "Valittu päivä"; "View:" = "Näytä:"; "Title or Description" = "Otsikko tai kuvaus"; "Search" = "Etsi"; "Search attendees" = "Etsi osallistujia"; "Search resources" = "Etsi resursseja"; "Search appointments" = "Etsi tapaamisia"; "All day Event" = "Koko päivän tapahtuma"; "check for conflicts" = "Tarkista ristiriitojen varalta"; "Browse URL" = "Selaa linkkiä"; "newAttendee" = "Lisää osallistuja"; /* calendar modes */ "Overview" = "Yleiskatsaus"; "Chart" = "Taulukko"; "List" = "Lista"; "Columns" = "Sarakkeet"; /* Priorities */ "prio_0" = "Ei määritetty"; "prio_1" = "Korkea"; "prio_2" = "Korkea"; "prio_3" = "Korkea"; "prio_4" = "Korkea"; "prio_5" = "Normaali"; "prio_6" = "Matala"; "prio_7" = "Matala"; "prio_8" = "Matala"; "prio_9" = "Matala"; /* access classes (privacy) */ "PUBLIC_vevent" = "Julkinen tapahtuma"; "CONFIDENTIAL_vevent" = "Luottamuksellinen tapahtuma"; "PRIVATE_vevent" = "Yksityinen tapahtuma"; "PUBLIC_vtodo" = "Julkinen tehtävä"; "CONFIDENTIAL_vtodo" = "Luottamuksellinen tehtävä"; "PRIVATE_vtodo" = "Yksityinen tehtävä"; /* status type */ "status_" = "Ei määritetty"; "status_NOT-SPECIFIED" = "Ei määritetty"; "status_TENTATIVE" = "Alustava"; "status_CONFIRMED" = "Vahvistettu"; "status_CANCELLED" = "Peruutettu"; "status_NEEDS-ACTION" = "Vaatii toimenpiteitä"; "status_IN-PROCESS" = "Työn alla"; "status_COMPLETED" = "Valmistunut"; /* Cycles */ "cycle_once" = "cycle_once"; "cycle_daily" = "cycle_daily"; "cycle_weekly" = "cycle_weekly"; "cycle_2weeks" = "cycle_2weeks"; "cycle_4weeks" = "cycle_4weeks"; "cycle_monthly" = "cycle_monthly"; "cycle_weekday" = "cycle_weekday"; "cycle_yearly" = "cycle_yearly"; "cycle_end_never" = "cycle_end_never"; "cycle_end_until" = "cycle_end_until"; "Recurrence pattern" = "Toistuvuussääntö"; "Range of recurrence" = "Toistuvuussalue"; "Repeat" = "Toista"; "Daily" = "Päivittäin"; "Weekly" = "Viikoittain"; "Monthly" = "Kuukausittain"; "Yearly" = "Vuosittain"; "Every" = "Joka"; "Days" = "Päivät"; "Week(s)" = "Viikko/Viikot"; "On" = " "; "Month(s)" = "Kuukausi/kuukaudet"; "The" = " "; "Recur on day(s)" = "Toista päiv(in)ä"; "Year(s)" = "Vuosi(na)"; "cycle_of" = " "; "No end date" = "Ei päättymispäivää"; "Create" = "Luo"; "appointment(s)" = "tapaaminen/tapaamiset"; "Repeat until" = "Toista kunnes"; "First" = "Ensimmäinen"; "Second" = "Toinen"; "Third" = "Kolmas"; "Fourth" = "Neljäs"; "Fift" = "Viides"; "Last" = "Viimeinen"; /* Appointment categories */ "category_none" = "Ei mitään"; "category_labels" = "Vuosipäivä,Syntymäpäivä,Kaupankäynti,Puhelut,Toimeksiantajat,Kilpailu,Asiakas,Suosikit,Seuranta,Lahjat,Juhlapyhät,Ideat,Kokous,Asiat,Muut,Henkilökohtaiset,Projektit,Yleinen vapaapäivä,Tilanne,Tavarantoimittajat,Matkailu,Loma"; "repeat_NEVER" = "Ei toistu"; "repeat_DAILY" = "Päivittäin"; "repeat_WEEKLY" = "Viikoittain"; "repeat_BI-WEEKLY" = "Joka toinen viikko"; "repeat_EVERY WEEKDAY" = "Joka viikonpäivä"; "repeat_MONTHLY" = "Kuukausittain"; "repeat_YEARLY" = "Vuosittain"; "repeat_CUSTOM" = "Määritetty..."; "reminder_NONE" = "Ei muistutusta"; "reminder_5_MINUTES_BEFORE" = "5 minuuttia ennen"; "reminder_10_MINUTES_BEFORE" = "10 minuuttia ennen"; "reminder_15_MINUTES_BEFORE" = "15 minuuttia ennen"; "reminder_30_MINUTES_BEFORE" = "30 minuuttia ennen"; "reminder_45_MINUTES_BEFORE" = "45 minuuttia ennen"; "reminder_1_HOUR_BEFORE" = "1 tunti ennen"; "reminder_2_HOURS_BEFORE" = "2 tuntia ennen"; "reminder_5_HOURS_BEFORE" = "5 tuntia ennen"; "reminder_15_HOURS_BEFORE" = "15 tuntia ennen"; "reminder_1_DAY_BEFORE" = "1 päivä ennen"; "reminder_2_DAYS_BEFORE" = "2 päivää ennen"; "reminder_1_WEEK_BEFORE" = "1 viikko ennen"; "reminder_CUSTOM" = "Määritetty..."; "reminder_MINUTES" = "minuuttia"; "reminder_HOURS" = "tuntia"; "reminder_DAYS" = "päivää"; "reminder_BEFORE" = "ennen"; "reminder_AFTER" = "jälkeen"; "reminder_START" = "tapahtuma alkaa"; "reminder_END" = "tapahtuma päättyy"; "Reminder Details" = "Muistuttajan yksityiskohdat"; "Choose a Reminder Action" = "Valitse muistuttajan toiminne"; "Show an Alert" = "Näytä hälytys"; "Send an E-mail" = "Lähetä sähköposti"; "Email Organizer" = "Sähköposti järjestäjälle"; "Email Attendees" = "Sähköposti osallistujille"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Näytä aika vapaana"; /* email notifications */ "Send Appointment Notifications" = "Lähetä tapaamismuistutukset"; /* validation errors */ validate_notitle = "Otsikkoa ei ole asetettu, jatka?"; validate_invalid_startdate = "Virheellinen alkupäiväkenttä!"; validate_invalid_enddate = "Virheellinen loppupäiväkenttä!"; validate_endbeforestart = "Syöttämäsi loppupäivä on ennen alkupäivää."; "Events" = "Tapahtumat"; "Tasks" = "Tehtävät"; "Show completed tasks" = "Näytä valmistuneet tehtävät"; /* tabs */ "Task" = "Tehtävät"; "Event" = "Tapahtuma"; "Recurrence" = "Toistuvuus"; /* toolbar */ "New Event" = "Uusi tapahtuma"; "New Task" = "Uusi tehtävä"; "Edit" = "Muokkaa"; "Delete" = "Poista"; "Go to Today" = "Siirry tähän päivään"; "Day View" = "Päivänäkymä"; "Week View" = "Viikkonäkymä"; "Month View" = "Kuukausinäkymä"; "Reload" = "Päivitä"; "eventPartStatModificationError" = "Osallistumistilaasi ei voitu muokata."; /* menu */ "New Event..." = "Uusi tapahtuma..."; "New Task..." = "Uusi tehtävä"; "Edit Selected Event..." = "Muokkaa valittuja tapahtumia..."; "Delete Selected Event" = "Poista valitut tapahtumat"; "Select All" = "Valitse kaikki"; "Workweek days only" = "Vain työpäivät"; "Tasks in View" = "Tehtävät näkymässä"; "eventDeleteConfirmation" = "Seuraava(t) tapahtuma(t) poistetaan: ⎠%{0}⎠Jatketaanko?"; "taskDeleteConfirmation" = "Seuraava(t) tehtävä(t) poistetaan: ⎠%{0}⎠Jatketaanko?"; "You cannot remove nor unsubscribe from your personal calendar." = "Et voi poistaa tai kirjautua ulos henkilökohtaisesta kalenteristasi."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Oletko varma että haluat poistaa kalenterin \"%{0}\"?"; /* Legend */ "Participant" = "Osallistuja"; "Optional Participant" = "Vaihtoehtoiset osallistujat"; "Non Participant" = "Ei osallistu"; "Chair" = "Puheenjohtaja"; "Needs action" = "Vaatii toimenpiteitä"; "Accepted" = "Hyväksytty"; "Declined" = "Hylätty"; "Tentative" = "Alustava"; "Free" = "Vapaa"; "Busy" = "Varattu"; "Maybe busy" = "Ehkä varattu"; "No free-busy information" = "Ei vapaa-varattu tietoa"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Ehdota aikaväliä"; "Zoom:" = "Lähennä:"; "Previous slot" = "Edellinen aikaväli"; "Next slot" = "Seuraava aikaväli"; "Previous hour" = "Edellinen tunti"; "Next hour" = "Seuraava tunti"; "Work days only" = "Vain työpäivät"; "The whole day" = "Koko päivä"; "Between" = "Välillä"; "and" = "ja"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Aikaristiriita yhdentai useamman osallistujan kanssa.⎠Haluatko silti säilyttää nykyiset asetukset?"; /* apt list */ "Title" = "Otsikko"; "Start" = "Alkaa"; "End" = "Loppuu"; "Due Date" = "Määräpäivä"; "Location" = "Paikka"; "(Private Event)" = "(Yksityinen tapahtuma)"; vevent_class0 = "(Julkinen tapahtuma)"; vevent_class1 = "(Yksityinen tapahtuma)"; vevent_class2 = "(Luottamuksellinen tapahtuma)"; "Priority" = "Tärkeysaste"; "Category" = "Luokka"; vtodo_class0 = "(Julkinen tehtävä)"; vtodo_class1 = "(Yksityinen tehtävä)"; vtodo_class2 = "(Luottamuksellinen tehtävä)"; "closeThisWindowMessage" = "Kiitos! voit nyt sulkea selaimen tai katsella"; "Multicolumn Day View" = "Monisarakkeinen päivänäkymä"; "Please select an event or a task." = "Ole hyvä ja valitse tapahtuma tai tehtävä."; "editRepeatingItem" = "Merkintä jota olet muokkaamassa on toistuva merkintä. Haluatko muokata kaikkia esiintymiä vai ainoastaan tätä nimenomaista merkintää?"; "button_thisOccurrenceOnly" = "Vain tätä merkintää"; "button_allOccurrences" = "Kaikki esiintymät"; /* Properties dialog */ "Name:" = "Nimi:"; "Color:" = "Väri:"; "Include in free-busy" = "Sisällytä vapaa-varattuun"; "Synchronization" = "Synkronointi"; "Synchronize" = "Synkronoi"; "Tag:" = "Tägi:"; "Display" = "Näyttö"; "Show alarms" = "Näytä hälytykset"; "Show tasks" = "Näytä tehtävät"; "Notifications" = "Ilmoitukset"; "Receive a mail when I modify my calendar" = "Vastaanota sähköposti kun muokkaan kalenteriani"; "Receive a mail when someone else modifies my calendar" = "Vastaanota sähköposti kun joku muu muokkaa kalenteriani"; "When I modify my calendar, send a mail to:" = "Kun muokkaan kalenteriani lähetä viesti osoitteeseen:"; "Links to this Calendar" = "Linkit tähän kalenteriin"; "Authenticated User Access" = "Kirjautuneiden käyttäjien pääsy"; "CalDAV URL" = "CalDAV URL"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Ole hyvä ja syötä Päivä -kenttään luku joka on suurempi tai yhtäsuuri kuin 1. "; "weekFieldInvalid" = "Ole hyvä ja syötä Viikko -kenttään luku joka on suurempi tai yhtäsuuri kuin 1. "; "monthFieldInvalid" = "Ole hyvä ja syötä Kuukausi -kenttään luku joka on suurempi tai yhtäsuuri kuin 1. "; "monthDayFieldInvalid" = "Ole hyvä ja syötä Kuukaudenpäivä oka on suurempi tai yhtäsuuri kuin 1. "; "yearFieldInvalid" = "Ole hyvä ja syötä Vuosi -kenttään luku joka on suurempi tai yhtäsuuri kuin 1. "; "appointmentFieldInvalid" = "Ole hyvä ja syötä Tapaamiset -kenttään luku joka on suurempi tai yhtäsuuri kuin 1. "; "recurrenceUnsupported" = "Tämäntyyppistä toistuvuutta ei tällä hetkellä tueta."; "Please specify a calendar name." = "Ole hyvä ja anna kalenterin nimi."; "tagNotDefined" = "Sinun täytyy määrittää tägi mikäli haluat synkronoida tämän kalenterin."; "tagAlreadyExists" = "Määrittämäsi tägi on jo liitetty toiseen kalenteriin."; "tagHasChanged" = "Mobiililaitteesi kalenteritiedot on päivitettävä mikäli muutat kalenterisi tägiä.⎠Jatketaanko?"; "tagWasAdded" = "Mobiililaitteesi kalenteritiedot on päivitettävä mikäli muutat kalenterisi tägiä.⎠Jatketaanko?"; "tagWasRemoved" = "Mobiililaitteesi kalenteritiedot on päivitettävä mikäli haluat poistaa tämän kalenterin synkronoinnista.⎠Jatketaanko?"; "DestinationCalendarError" = "Lähde- ja kohdekalenterit ovat samoja. Ole hyvä ja yritä kopiointia toiseen kalenteriin."; "EventCopyError" = "Kopiointi epäonnistui. Ole hyvä ja yritä kopiointia toiseen kalenteriin."; "Open Task..." = "Avaa tehtävä..."; "Mark Completed" = "Merkitse valmistuneeksi"; "Delete Task" = "Poista tehtävä"; "Delete Event" = "Poista tapahtuma"; "Copy event to my calendar" = "Kopioi tapahtumat kalenteriini"; "View Raw Source" = "Näytä lähdekoodi"; "Subscribe to a web calendar..." = "Liity web-kalenteriin..."; "URL of the Calendar" = "Kalenterin URL"; "Web Calendar" = "Web kalenteri"; "Reload on login" = "Päivitä kirjauduttaessa"; "Invalid number." = "Virheellinen numero."; "Please identify yourself to %{0}" = "Ole hyvä ja tunnistaudu kohteeseen %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxAptTableView.m0000644000000000000000000000315612247657030016563 0ustar rootroot/* Copyright (C) 2000-2003 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. */ #import @class NSArray, NSCalendarDate; @interface UIxAptTableView : SoComponent { NSArray *appointments; id appointment; } /* accessors */ - (NSArray *)appointments; - (id)appointment; @end @implementation UIxAptTableView - (void)dealloc { [self->appointment release]; [self->appointments release]; [super dealloc]; } /* accessors */ - (void)setAppointments:(NSArray *)_apts { ASSIGN(self->appointments, _apts); } - (NSArray *)appointments { return self->appointments; } - (void)setAppointment:(id)_apt { ASSIGN(self->appointment, _apt); } - (id)appointment { return self->appointment; } - (NSString *)appointmentViewURL { id pkey; if ((pkey = [[self appointment] valueForKey:@"dateId"]) == nil) return nil; return [NSString stringWithFormat:@"%@/view", pkey]; } @end /* UIxAptTableView */ SOGo-2.1.1b/UI/Scheduler/UIxCalMonthViewOld.h0000644000000000000000000000071712247657030017226 0ustar rootroot// $Id: UIxCalMonthView.h 163 2004-08-02 12:59:28Z znek $ #ifndef __SOGo_UIxCalMonthViewOld_H__ #define __SOGo_UIxCalMonthViewOld_H__ #include "UIxCalView.h" /* UIxCalMonthView Abstract superclass for views which display months. */ @interface UIxCalMonthViewOld : UIxCalView - (NSCalendarDate *) startOfMonth; - (NSDictionary *) prevMonthQueryParameters; - (NSDictionary *) nextMonthQueryParameters; @end #endif /* __SOGo_UIxCalMonthViewOld_H__ */ SOGo-2.1.1b/UI/Scheduler/Slovak.lproj/0000755000000000000000000000000012247657030016007 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Slovak.lproj/Localizable.strings0000644000000000000000000004223212247657030021646 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "VytvoriÅ¥ novú udalosÅ¥"; "Create a new task" = "VytvoriÅ¥ novú úlohu"; "Edit this event or task" = "UpraviÅ¥ túto udalosÅ¥ alebo úlohu"; "Delete this event or task" = "OdstrániÅ¥ túto udalosÅ¥ alebo úlohu"; "Go to today" = "PrejsÅ¥ na dneÅ¡ný deň"; "Switch to day view" = "Prepnúť na denné zobrazenie"; "Switch to week view" = "Prepnúť na týždenné zobrazenie"; "Switch to month view" = "Prepnúť na mesaÄné zobrazenie"; "Reload all calendars" = "AktualizovaÅ¥ vÅ¡etky kalendáre"; /* Tabs */ "Date" = "Dátum"; "Calendars" = "Kalendáre"; /* Day */ "DayOfTheMonth" = "Deň v mesiaci"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "Dnes"; "Previous Day" = "Predchádzajúci deň"; "Next Day" = "Nasledujúci deň"; /* Week */ "Week" = "Týždeň"; "this week" = "tento týždeň"; "Week %d" = "Týždeň %d"; "Previous Week" = "Predchádzajúci týždeň"; "Next Week" = "Nasledujúci týždeň"; /* Month */ "this month" = "tento mesiac"; "Previous Month" = "Predchádzajúci mesiac"; "Next Month" = "Nasledujúci mesiac"; /* Year */ "this year" = "tento rok"; /* Menu */ "Calendar" = "Kalendár"; "Contacts" = "Kontakty"; "New Calendar..." = "Nový kalendár..."; "Delete Calendar" = "OdstrániÅ¥ kalendár"; "Unsubscribe Calendar" = "OdhlásiÅ¥ odber kalendára"; "Sharing..." = "Zdieľanie..."; "Export Calendar..." = "ExportovaÅ¥ kalendár..."; "Import Events..." = "ImportovaÅ¥ udalosti..."; "Import Events" = "ImportovaÅ¥ udalosti"; "Select an iCalendar file (.ics)." = "Zvoľte súbor iCalendar (*.ics)."; "Upload" = "NahraÅ¥"; "Uploading" = "Nahrávanie"; "Publish Calendar..." = "PublikovaÅ¥ kalendár..."; "Reload Remote Calendars" = "AktualizovaÅ¥ vzdialené kalendáre"; "Properties" = "Vlastnosti"; "Done" = "Hotovo"; "An error occurred while importing calendar." = "PoÄas importovania kalendáru nastala chyba"; "No event was imported." = "Nebola naimportovaná žiadna udalosÅ¥."; "A total of %{0} events were imported in the calendar." = "Do kalendára bolo naimportovaných %{0} udalostí."; "Compose E-Mail to All Attendees" = "VytvoriÅ¥ e-mail pre vÅ¡etkých úÄastníkov"; "Compose E-Mail to Undecided Attendees" = "VytvoriÅ¥ e-mail pre nerozhodnutých úÄastníkov"; /* Folders */ "Personal calendar" = "Osobný kalendár"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Zakázané"; /* acls */ "Access rights to" = "Prítupové práva"; "For user" = "pre užívateľa"; "Any Authenticated User" = "Každý overený užívateľ"; "Public Access" = "Verejný prístup"; "label_Public" = "Verejné"; "label_Private" = "Súkromné"; "label_Confidential" = "Dôverné"; "label_Viewer" = "ZobraziÅ¥ vÅ¡etko"; "label_DAndTViewer" = "ZobraziÅ¥ dátum a Äas"; "label_Modifier" = "UpraviÅ¥"; "label_Responder" = "OdpovedaÅ¥ komu"; "label_None" = "Žiadny"; "View All" = "ZobraziÅ¥ vÅ¡etko"; "View the Date & Time" = "ZobraziÅ¥ dátum a Äas"; "Modify" = "UpraviÅ¥"; "Respond To" = "OdpovedaÅ¥ komu"; "None" = "Žiadny"; "This person can create objects in my calendar." = "Táto osoba môže vytváraÅ¥ objekty v mojom kalendári."; "This person can erase objects from my calendar." = "Táto osoba môže odstraňovaÅ¥ objekty z môjho kalendára."; /* Button Titles */ "Subscribe to a Calendar..." = "OdoberaÅ¥ kalendár..."; "Remove the selected Calendar" = "OdstrániÅ¥ zvolený kalendár"; "Name of the Calendar" = "Názov kalendára"; "new" = "Nový"; "printview" = "Náhľad tlaÄe"; "edit" = "UpraviÅ¥"; "delete" = "OdstrániÅ¥"; "proposal" = "Návrh"; "Save and Close" = "UložiÅ¥ a zatvoriÅ¥"; "Close" = "ZatvoriÅ¥"; "Invite Attendees" = "Pozvat úÄastníkov"; "Attach" = "PripojiÅ¥"; "Update" = "Aktualizácia"; "Cancel" = "Storno"; "show_rejected_apts" = "UkázaÅ¥ odmietnuté schôdzky"; "hide_rejected_apts" = "SkryÅ¥ odmietnuté schôdzky"; /* Schedule */ "Schedule" = "Plán"; "No appointments found" = "Neboli nájdené žiadne schôdzky"; "Meetings proposed by you" = "Schôdzky navrhnuté Vami"; "Meetings proposed to you" = "Schôdzky navrhnuté Vám"; "sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Akcia"; "accept" = "PrijaÅ¥"; "decline" = "OdmietnuÅ¥"; "more attendees" = "Viac úÄastníkov"; "Hide already accepted and rejected appointments" = "SkryÅ¥ prijaté a odmietnuté schôdzky"; "Show already accepted and rejected appointments" = "ZobraziÅ¥ prijaté a odmietnuté schôdzky"; /* Appointments */ "Appointment viewer" = "ZobraziÅ¥ schôdzky"; "Appointment editor" = "EditovaÅ¥ schôdzky"; "Appointment proposal" = "Navrhnúť schôdzku"; "Appointment on" = "Schôdzka na"; "Start:" = "ZaÄiatok:"; "End:" = "Koniec:"; "Due Date:" = "Dátum splnenia:"; "Title:" = "Názov:"; "Calendar:" = "Kalendár:"; "Name" = "Meno"; "Email" = "E-Mail"; "Status:" = "Stav:"; "% complete" = "% hotovo"; "Location:" = "Miesto:"; "Priority:" = "Priorita:"; "Privacy" = "Súkromie"; "Cycle" = "Cyklus opakovania"; "Cycle End" = "Koniec cyklu"; "Categories" = "Kategórie"; "Classification" = "Klasifikácia"; "Duration" = "Trvanie"; "Attendees:" = "ÚÄastníci:"; "Resources" = "Zdroje"; "Organizer:" = "Organizátor:"; "Description:" = "Popis:"; "Document:" = "Dokument:"; "Category:" = "Kategória:"; "Repeat:" = "Opakovanie:"; "Reminder:" = "Pripomenutie:"; "General:" = "Hlavný:"; "Reply:" = "OdpoveÄ:"; "Target:" = "Cieľ:"; "attributes" = "atribúty"; "attendees" = "úÄastníci"; "delegated from" = "delegované od"; /* checkbox title */ "is private" = "je súkromný/á"; /* classification */ "Public" = "Verejný"; "Private" = "Súkromný"; /* text used in overviews and tooltips */ "empty title" = "Prázdný názov"; "private appointment" = "Súkromná schôdzka"; "Change..." = "ZmeniÅ¥..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Potvrdím neskôr"; "partStat_ACCEPTED" = "ZúÄastním sa"; "partStat_DECLINED" = "NezúÄastním sa"; "partStat_TENTATIVE" = "Potvrdzujem nezáväzne"; "partStat_DELEGATED" = "Delegujem"; "partStat_OTHER" = "Ostatní"; /* Appointments (error messages) */ "Conflicts found!" = "Boli nájdené konflikty!"; "Invalid iCal data!" = "Neplatné iCal údaje!"; "Could not create iCal data!" = "Nebolo možné vytvoriÅ¥ iCal údaje!"; /* Searching */ "view_all" = "VÅ¡etky"; "view_today" = "DneÅ¡né udalosti"; "view_next7" = "Nasledujúcich 7 dní"; "view_next14" = "Nasledujúcich 14 dní"; "view_next31" = "Nasledujúcich 31 dní"; "view_thismonth" = "Tento mesiac"; "view_future" = "VÅ¡etky budúce udalosti"; "view_selectedday" = "Zvolený deň"; "View:" = "ZobraziÅ¥:"; "Title or Description" = "Názov alebo popis"; "Search" = "VyhľadaÅ¥"; "Search attendees" = "VyhľadaÅ¥ úÄastníkov"; "Search resources" = "VyhľadaÅ¥ zdroje"; "Search appointments" = "VyhľadaÅ¥ schôdzky"; "All day Event" = "Celodenná udalosÅ¥"; "check for conflicts" = "SkontrolovaÅ¥ konflikty"; "Browse URL" = "PreskúmaÅ¥ URL"; "newAttendee" = "PridaÅ¥ úÄastníka"; /* calendar modes */ "Overview" = "Prehľad"; "Chart" = "Tabuľka"; "List" = "Zoznam"; "Columns" = "Stĺpce"; /* Priorities */ "prio_0" = "NeÅ¡pecifikovaná"; "prio_1" = "Vysoká"; "prio_2" = "Vysoká"; "prio_3" = "Vysoká"; "prio_4" = "Vysoká"; "prio_5" = "Normálna"; "prio_6" = "Nízka"; "prio_7" = "Nízka"; "prio_8" = "Nízka"; "prio_9" = "Nízka"; /* access classes (privacy) */ "PUBLIC_vevent" = "Verejná udalosÅ¥"; "CONFIDENTIAL_vevent" = "Dôverná udalosÅ¥"; "PRIVATE_vevent" = "Súkromná udalosÅ¥"; "PUBLIC_vtodo" = "Verejná úloha"; "CONFIDENTIAL_vtodo" = "Dôverná úloha"; "PRIVATE_vtodo" = "Osobná úloha"; /* status type */ "status_" = "NeÅ¡pecifikovaný"; "status_NOT-SPECIFIED" = "NeÅ¡pecifikovaný"; "status_TENTATIVE" = "Nezáväzný"; "status_CONFIRMED" = "Potvrdený"; "status_CANCELLED" = "ZruÅ¡ený"; "status_NEEDS-ACTION" = "Vyžaduje akciu"; "status_IN-PROCESS" = "Prebieha"; "status_COMPLETED" = "Hotovo"; /* Cycles */ "cycle_once" = "bez opakovania"; "cycle_daily" = "denne"; "cycle_weekly" = "týždenne"; "cycle_2weeks" = "každý druhý týždeň"; "cycle_4weeks" = "každý Å¡tvrtý týždeň"; "cycle_monthly" = "mesaÄne"; "cycle_weekday" = "každý pracovný deň"; "cycle_yearly" = "roÄne"; "cycle_end_never" = "nekoneÄné opakovanie"; "cycle_end_until" = "opakovanie do"; "Recurrence pattern" = "Vzor opakovania"; "Range of recurrence" = "Rozsah opakovania"; "Repeat" = "Opakovanie"; "Daily" = "Denné"; "Weekly" = "Týždenné"; "Monthly" = "MesaÄné"; "Yearly" = "RoÄné"; "Every" = "Každých"; "Days" = "Dní"; "Week(s)" = "Týždňov"; "On" = "V"; "Month(s)" = "Mesiacov"; "The" = "Ten"; "Recur on day(s)" = "OpakovaÅ¥ v dňoch"; "Year(s)" = "rokoch"; "cycle_of" = "s"; "No end date" = "Bez dátumu ukonÄenia"; "Create" = "VytvoriÅ¥"; "appointment(s)" = "schôdzku/y"; "Repeat until" = "OpakovaÅ¥ do"; "First" = "Prvý"; "Second" = "Druhý"; "Third" = "Tretí"; "Fourth" = "Å tvrtý"; "Fift" = "Piaty"; "Last" = "Posledný"; /* Appointment categories */ "category_none" = "Žiadny"; "category_labels" = "VýroÄie,Narodeniny,Obchod,Hovory,Klienti,Súťaže,Zákazník,Obľúbené,Sledovanie,DarÄeky,Voľno,Nápady,Stretnutie,Problémy,Rôzne,Osobné,Projekty,Å tátne sviatky,Stav,Dodávatelia,Cesta,Dovolenka"; "repeat_NEVER" = "Neopakuje sa"; "repeat_DAILY" = "Denne"; "repeat_WEEKLY" = "Týždenne"; "repeat_BI-WEEKLY" = "Každé dva týždne"; "repeat_EVERY WEEKDAY" = "Každý pracovný deň"; "repeat_MONTHLY" = "MesaÄne"; "repeat_YEARLY" = "RoÄne"; "repeat_CUSTOM" = "Vlastný..."; "reminder_NONE" = "Bez pripomenutia"; "reminder_5_MINUTES_BEFORE" = "5 minút pred"; "reminder_10_MINUTES_BEFORE" = "10 minút pred"; "reminder_15_MINUTES_BEFORE" = "15 minút pred"; "reminder_30_MINUTES_BEFORE" = "30 minút pred"; "reminder_45_MINUTES_BEFORE" = "45 minút pred"; "reminder_1_HOUR_BEFORE" = "1 hodinu pred"; "reminder_2_HOURS_BEFORE" = "2 hodiny pred"; "reminder_5_HOURS_BEFORE" = "5 hodín pred"; "reminder_15_HOURS_BEFORE" = "15 hodín pred"; "reminder_1_DAY_BEFORE" = "1 deň pred"; "reminder_2_DAYS_BEFORE" = "2 dni pred"; "reminder_1_WEEK_BEFORE" = "1 týždeň pred"; "reminder_CUSTOM" = "Vlastný..."; "reminder_MINUTES" = "minúty"; "reminder_HOURS" = "hodiny"; "reminder_DAYS" = "dni"; "reminder_BEFORE" = "pred"; "reminder_AFTER" = "po"; "reminder_START" = "zaÄiatku/om udalosti"; "reminder_END" = "konci udalosti"; "Reminder Details" = "Podrobnosti pripomenutia"; "Choose a Reminder Action" = "ZvoliÅ¥ akciu"; "Show an Alert" = "ZobraziÅ¥ výstrahu"; "Send an E-mail" = "PoslaÅ¥ e-mail"; "Email Organizer" = "E-mail organizátorovi"; "Email Attendees" = "E-mail úÄastníkom"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "ÄŒas zobraziÅ¥ ako voľný"; /* validation errors */ validate_notitle = "Názov nebol nastavený, pokraÄovaÅ¥?"; validate_invalid_startdate = "Chybný dátum zaÄiatku!"; validate_invalid_enddate = "Chybný dátum konca!"; validate_endbeforestart = "Zadaný dátum konca je pred zaÄiatkom udalosti."; "Events" = "Události"; "Tasks" = "Úlohy"; "Show completed tasks" = "ZobraziÅ¥ dokonÄené úlohy"; /* tabs */ "Task" = "Úloha"; "Event" = "UdalosÅ¥"; "Recurrence" = "Opakovanie"; /* toolbar */ "New Event" = "Nová udalosÅ¥"; "New Task" = "Nová úloha"; "Edit" = "UpraviÅ¥"; "Delete" = "OdstrániÅ¥"; "Go to Today" = "DneÅ¡ný deň"; "Day View" = "Deň"; "Week View" = "Týždeň"; "Month View" = "Mesiac"; "Reload" = "AktualizovaÅ¥"; "eventPartStatModificationError" = "Status vaÅ¡ej úÄasti nemohol byÅ¥ zmenený."; /* menu */ "New Event..." = "Nová udalosÅ¥..."; "New Task..." = "Nová úloha..."; "Edit Selected Event..." = "UpraviÅ¥ oznaÄenú udalosÅ¥..."; "Delete Selected Event" = "OdstrániÅ¥ oznaÄenú udalosÅ¥"; "Select All" = "VybraÅ¥ vÅ¡etko"; "Workweek days only" = "Len pracovné dni"; "Tasks in View" = "Zobrazené úlohy"; "eventDeleteConfirmation" = "Nasledujúca udalosÅ¥(i) bude odstránená:\n%{0}\nChcete pokraÄovaÅ¥?"; "taskDeleteConfirmation" = "Odstránenie nasledujúcej úlohy(oh) je nevratné.\n%{0}\nChcete pokraÄovaÅ¥?"; "You cannot remove nor unsubscribe from your personal calendar." = "Nemôžete odstrániÅ¥ ani sa odhlásiÅ¥ z odoberania svojho vlastného kalendára."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Naozaj chcete odstrániÅ¥ kalendár \"%{0}\"?"; /* Legend */ "Participant" = "ÚÄastník"; "Optional Participant" = "Nepovinný úÄastník"; "Non Participant" = "Na vedomie"; "Chair" = "Predsedajúci"; "Needs action" = "Vyžaduje akciu"; "Accepted" = "ZúÄastní sa"; "Declined" = "NezúÄastní sa"; "Tentative" = "Nezáväzne"; "Free" = "Voľno"; "Busy" = "Nie je voľno"; "Maybe busy" = "Možno nie je voľno"; "No free-busy information" = "Bez informácií"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Navrhnúť Äas"; "Zoom:" = "PriblížiÅ¥:"; "Previous slot" = "Predchádzajúci Äas"; "Next slot" = "Nasledujúci Äas"; "Previous hour" = "Predchádzajúca hodina"; "Next hour" = "Nasledujúca hodina"; "Work days only" = "Len pracovné dni"; "The whole day" = "Celý deň"; "Between" = "medzi"; "and" = "a"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Medzi úÄastníkmi dochádza k Äasovému konfliktu.\nPonecháte súÄasné nastavenie aj napriek tomu?"; /* apt list */ "Title" = "Názov"; "Start" = "ZaÄiatok"; "End" = "Koniec"; "Due Date" = "Platí do"; "Location" = "Miesto"; "(Private Event)" = "(Súkromná udalosÅ¥)"; vevent_class0 = "(Verejná udalosÅ¥)"; vevent_class1 = "(Súkromná udalosÅ¥)"; vevent_class2 = "(Dôverná udalosÅ¥)"; "Priority" = "Priorita"; "Category" = "Kategória"; vtodo_class0 = "(Verejná úloha)"; vtodo_class1 = "(Súkromná úloha)"; vtodo_class2 = "(Dôverná úloha)"; "closeThisWindowMessage" = "Dakujeme! Teraz môžete okno zatvoriÅ¥ alebo sa pozrieÅ¥ na vaÅ¡e "; "Multicolumn Day View" = "Viacstĺpcové denné zobrazenie"; "Please select an event or a task." = "Vyberte prosím udalosÅ¥ alebo úlohu."; "editRepeatingItem" = "Položka, ktorú upravujete, se opakuje. Chcete opraviÅ¥ vÅ¡etky opakovania alebo len toto?"; "button_thisOccurrenceOnly" = "Len toto opakovanie"; "button_allOccurrences" = "VÅ¡etky opakovania"; /* Properties dialog */ "Name:" = "Názov:"; "Color:" = "Farba:"; "Include in free-busy" = "Zahrnúť do voľný-obsadený"; "Synchronization" = "Synchronizácia"; "Synchronize" = "SynchronizovaÅ¥"; "Tag:" = "Å títok:"; "Display" = "Zobrazenie"; "Show alarms" = "ZobraziÅ¥ pripomenutie"; "Show tasks" = "ZobraziÅ¥ úlohy"; "Notifications" = "Oznámenia"; "Receive a mail when I modify my calendar" = "Informuj emailom keÄ upravím môj kalendár"; "Receive a mail when someone else modifies my calendar" = "Informuj emailom keÄ niekto iný upraví môj kalendár"; "When I modify my calendar, send a mail to:" = "KeÄ upravím svoj kalendár, poÅ¡li email:"; "Links to this Calendar" = "Odkazy na tento kalendár"; "Authenticated User Access" = "Prístup pre overeného užívateľa"; "CalDAV URL" = "CalDAV url"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "V políÄku Dni zadajte Äíselnú hodnotu väÄÅ¡iu alebo rovnú 1."; "weekFieldInvalid" = "V políÄku Týždeň zadajte Äíselnú hodnotu väÄÅ¡iu alebo rovnú 1."; "monthFieldInvalid" = "V políÄku Mesiac zadajte Äíselnú hodnotu väÄÅ¡iu alebo rovnú 1."; "monthDayFieldInvalid" = "V políÄku Deň v mesiaci zadajte Äíselnú hodnotu väÄÅ¡iu alebo rovnú 1."; "yearFieldInvalid" = "V políÄku Rok zadajte Äíselnú hodnotu väÄÅ¡iu alebo rovnú 1."; "appointmentFieldInvalid" = "V políÄku Pripomenutie zadajte Äíselnú hodnotu väÄÅ¡iu alebo rovnú 1."; "recurrenceUnsupported" = "Tento typ opakovania nie je podporovaný."; "Please specify a calendar name." = "Prosím zadajte meno kalendára."; "tagNotDefined" = "Ak chcete synchronizovaÅ¥ tento kalendár, musíte zadaÅ¥ jeho Å¡títok."; "tagAlreadyExists" = "Zadaný Å¡títok je už priradený inému kalendáru."; "tagHasChanged" = "Ak zmeníte Å¡títok svojho kalendára, budete musieÅ¥ znovu naÄítaÅ¥ údaje do svojho mobilného zariadenia.\nPokraÄovaÅ¥?"; "tagWasAdded" = "Ak chcete synchronizovaÅ¥ tento kalendár, budete musieÅ¥ znovu naÄítaÅ¥ údaje do svojho mobilného zariadenia.\nPokraÄovaÅ¥?"; "tagWasRemoved" = "Ak odstránite v tomto kalendári synchronizáciu, budete musieÅ¥ znovu naÄítaÅ¥ údaje do svojho mobilného zariadenia.\nPokraÄovaÅ¥?"; "DestinationCalendarError" = "Zdrojový a cieľový kalendár sú rovnaké. Prosím, skúste kopírovaÅ¥ iný kalendár."; "EventCopyError" = "Kopírovanie sa nepodarilo. Prosím, skúste kopírovaÅ¥ iný kalendár."; "Open Task..." = "OtvoriÅ¥ úlohu..."; "Mark Completed" = "OznaÄiÅ¥ ako dokonÄené"; "Delete Task" = "OdstrániÅ¥ úlohu"; "Delete Event" = "OdstrániÅ¥ udalosÅ¥"; "Copy event to my calendar" = "KopírovaÅ¥ udalosÅ¥ do môjho kalendára"; "View Raw Source" = "Zobrazit zdroj"; "Subscribe to a web calendar..." = "OdoberaÅ¥ vzdialený kalendár na webe"; "URL of the Calendar" = "Adresa vzdialeného kalendára na webe"; "Web Calendar" = "Vzdialený kalendár na webe"; "Reload on login" = "AktualizovaÅ¥ pri prihlásení"; "Invalid number." = "Neplatné Äíslo."; "Please identify yourself to %{0}" = "Identifikujte sa na %{0}"; SOGo-2.1.1b/UI/Scheduler/UIxAttendeesEditor.h0000644000000000000000000000234312247657030017307 0ustar rootroot/* UIxAttendeesEditor.h - this file is part of SOGo * * Copyright (C) 2007-2012 Inverse inc. * * 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 UIXATTENDEESEDITOR_H #define UIXATTENDEESEDITOR_H #import @interface UIxAttendeesEditor : UIxComponent { NSString *item; } - (void) setItem: (NSString *) newItem; - (NSString *) item; - (NSArray *) zoomList; - (void) setZoom: (NSString *) zoom; - (NSString *) zoom; - (NSString *) itemZoomText; @end #endif /* UIXATTENDEESEDITOR_H */ SOGo-2.1.1b/UI/Scheduler/UIxCalMainView.h0000644000000000000000000000331512247657030016363 0ustar rootroot/* UIxCalMainView.h - this file is part of SOGo * * Copyright (C) 2006-2009 Inverse inc. * * 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 UIXCALMAINVIEW_H #define UIXCALMAINVIEW_H @class NSArray; @class NSNumber; @class NSString; #import "UIxCalView.h" @interface UIxCalMainView : UIxCalView { NSString *monthMenuItem; NSNumber *yearMenuItem; SOGoUserSettings *us; NSMutableDictionary *moduleSettings; BOOL contextIsSetup; } - (NSArray *) monthMenuItems; - (NSArray *) yearMenuItems; - (void) setMonthMenuItem: (NSString *) aMonthMenuItem; - (NSString *) monthMenuItem; - (NSString *) monthMenuItemLabel; - (void) setYearMenuItem: (NSNumber *) aYearMenuItem; - (NSNumber *) yearMenuItem; - (NSString *) verticalDragHandleStyle; - (NSString *) horizontalDragHandleStyle; - (NSString *) eventsListViewStyle; - (WOResponse *) saveDragHandleStateAction; - (unsigned int) firstDayOfWeek; - (unsigned int) dayStartHour; - (NSString *) currentView; @end #endif /* UIXCALMAINVIEW_H */ SOGo-2.1.1b/UI/Scheduler/Ukrainian.lproj/0000755000000000000000000000000012247657030016471 5ustar rootrootSOGo-2.1.1b/UI/Scheduler/Ukrainian.lproj/Localizable.strings0000644000000000000000000005330512247657030022333 0ustar rootroot/* this file is in UTF-8 format! */ /* Tooltips */ "Create a new event" = "Створити нову подію"; "Create a new task" = "Створити нове завданнÑ"; "Edit this event or task" = "Редагувати цю подію або завданнÑ"; "Delete this event or task" = "Вилучити цю подію або завданнÑ"; "Go to today" = "Перейти на Ñьогодні"; "Switch to day view" = "Перейти до оглÑду днів"; "Switch to week view" = "Перейти до оглÑду тижнів"; "Switch to month view" = "Перейти до оглÑду міÑÑців"; "Reload all calendars" = "Перевантажити вÑÑ– календарі"; /* Tabs */ "Date" = "Дата"; "Calendars" = "Календарі"; /* Day */ "DayOfTheMonth" = "День міÑÑцÑ"; "dayLabelFormat" = "%d.%m.%Y"; "today" = "Сьогодні"; "Previous Day" = "Одинь день назад"; "Next Day" = "Один день вперед"; /* Week */ "Week" = "Тиждень"; "this week" = "цей тиждень"; "Week %d" = "Тиждень %d"; "Previous Week" = "Один тиждень назад"; "Next Week" = "Один тиждень вперед"; /* Month */ "this month" = "цей міÑÑць"; "Previous Month" = "Один міÑÑць назад"; "Next Month" = "Один міÑÑць вперед"; /* Year */ "this year" = "цей рік"; /* Menu */ "Calendar" = "Календар"; "Contacts" = "ÐдреÑна книга"; "New Calendar..." = "Ðовий календар..."; "Delete Calendar" = "Вилучити календар"; "Unsubscribe Calendar" = "ВідпиÑатиÑÑŒ від календарÑ"; "Sharing..." = "Спільний доÑтуп..."; "Export Calendar..." = "ЕкÑпортувати календар..."; "Import Events..." = "Імпортувати події..."; "Import Events" = "Імпортувати події"; "Select an iCalendar file (.ics)." = "Вибрати файл iCalendar (.ics)"; "Upload" = "Завантажити"; "Publish Calendar..." = "Опублікувати календар..."; "Reload Remote Calendars" = "Перевантажити віддалені календарі"; "Properties" = "ВлаÑтивоÑті"; "Done" = "Зроблено"; "An error occurred while importing calendar." = "Виникла помилка під Ñ‡Ð°Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ календарÑ."; "No event was imported." = "Жодну подію не було імпортовано."; "A total of %{0} events were imported in the calendar." = "Разом %{0} подій було імпортовано в цьому календарі."; "Compose E-Mail to All Attendees" = "Створити Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²ÑÑ–Ñ… учаÑників"; "Compose E-Mail to Undecided Attendees" = "Створити Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ вÑÑ–Ñ… учаÑників, що ще не визначилиÑÑŒ з учаÑтю"; /* Folders */ "Personal calendar" = "ПерÑональний календар"; /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Заборонено"; /* acls */ "Access rights to" = "Права доÑтупу до"; "For user" = "Ð”Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"; "Any Authenticated User" = "Будь-Ñкий авторизований кориÑтувач"; "Public Access" = "Публічний доÑтуп"; "label_Public" = "Публічна подіÑ"; "label_Private" = "ОÑобиÑта подіÑ"; "label_Confidential" = "Показувати лише Ñ‡Ð°Ñ Ñ‚Ð° дату"; "label_Viewer" = "Показувати вÑе"; "label_DAndTViewer" = "Показувати дату та чаÑ"; "label_Modifier" = "Змінити"; "label_Responder" = "ВідповіÑти на"; "label_None" = "Ðічого"; "View All" = "ДивитиÑÑŒ вÑе"; "View the Date & Time" = "ДивитиÑÑŒ дату та чаÑ"; "Modify" = "Змінити"; "Respond To" = "ВідповіÑти"; "None" = "Жодне"; "This person can create objects in my calendar." = "Цей учаÑник може додавати запиÑи до мого календарÑ."; "This person can erase objects from my calendar." = "Цей учаÑник може вилучати запиÑи з мого календарÑ."; /* Button Titles */ "Subscribe to a Calendar..." = "ПідпиÑатиÑÑŒ на календар..."; "Remove the selected Calendar" = "Вилучити вибраний календар"; "Name of the Calendar" = "Ðазва календарÑ"; "new" = "Ðовий"; "printview" = "Друкувати"; "edit" = "Змінити"; "delete" = "Вилучити"; "proposal" = "ПропозиціÑ"; "Save and Close" = "Зберегти Ñ– закрити"; "Close" = "Закрити"; "Invite Attendees" = "ЗапроÑити до зуÑтрічі"; "Attach" = "ВклаÑти"; "Update" = "Перевантажити"; "Cancel" = "СкаÑувати"; "show_rejected_apts" = "Показати відхилені зуÑтрічі"; "hide_rejected_apts" = "Сховати відхилені зуÑтрічі"; /* Schedule */ "Schedule" = "Розклад"; "No appointments found" = "Ðе знайдено призначених зуÑтрічей"; "Meetings proposed by you" = "Ваші пропозиції про зуÑтрічі"; "Meetings proposed to you" = "Пропозиції зуÑтрічі Вам"; "sched_startDateFormat" = "%d.%m.%Y %H:%M"; "action" = "ДіÑ"; "accept" = "ПогодитиÑÑŒ"; "decline" = "ВідмовитиÑÑŒ"; "more attendees" = "ЗапроÑити ще"; "Hide already accepted and rejected appointments" = "Приховати учаÑників, Ñкі погодилиÑÑŒ або відмовилиÑÑŒ."; "Show already accepted and rejected appointments" = "Показати учаÑників, Ñкі погодилиÑÑŒ або відмовилиÑÑŒ."; /* Appointments */ "Appointment viewer" = "ПереглÑд зуÑтрічі"; "Appointment editor" = "Зміна зуÑтрічі"; "Appointment proposal" = "ÐŸÑ€Ð¾Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ Ð·ÑƒÑтрічі"; "Appointment on" = "ЗуÑтріч"; "Start:" = "Початок:"; "End:" = "Кінець:"; "Due Date:" = "ДійÑно до:"; "Title:" = "Ðазва:"; "Calendar:" = "Календар:"; "Name" = "Ім’Ñ"; "Email" = "E-Mail"; "Status:" = "Стан:"; "% complete" = "% виконано"; "Location:" = "МіÑце:"; "Priority:" = "Пріоритет:"; "Privacy" = "КонфіденційніÑть"; "Cycle" = "Цикл"; "Cycle End" = "Ð—Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ†Ð¸ÐºÐ»Ñƒ"; "Categories" = "Категорії"; "Classification" = "ВизначеннÑ"; "Duration" = "Термін"; "Attendees:" = "УчаÑники:"; "Resources" = "РеÑурÑи"; "Organizer:" = "Організатор:"; "Description:" = "ОпиÑ:"; "Document:" = "Документ:"; "Category:" = "КатегоріÑ:"; "Repeat:" = "Повтор:"; "Reminder:" = "ÐагадуваннÑ:"; "General:" = "Загальне:"; "Reply:" = "Відповідь:"; "Target:" = "Введіть веб-Ñторінку або міÑце документа:"; "attributes" = "атрибути"; "attendees" = "учаÑники"; "delegated from" = "переÑлано від"; /* checkbox title */ "is private" = "оÑобиÑте"; /* classification */ "Public" = "Загальна"; "Private" = "ОÑобиÑта"; /* text used in overviews and tooltips */ "empty title" = "Порожній заголовок"; "private appointment" = "ОÑобиÑте запрошеннÑ"; "Change..." = "Змінити..."; /* Appointments (participation state) */ "partStat_NEEDS-ACTION" = "Вимагає дії"; "partStat_ACCEPTED" = "ПрийнÑто"; "partStat_DECLINED" = "Відхилено"; "partStat_TENTATIVE" = "Під питаннÑм"; "partStat_DELEGATED" = "ПереÑлано"; "partStat_OTHER" = "Інше"; /* Appointments (error messages) */ "Conflicts found!" = "Виникли конфлікти!"; "Invalid iCal data!" = "Ðеправильні дані iCal!"; "Could not create iCal data!" = "Ðе можу додати дані iCal!"; /* Searching */ "view_all" = "Ð’ÑÑ–"; "view_today" = "Сьогодні"; "view_next7" = "ÐаÑтупні 7 днів"; "view_next14" = "ÐаÑтупні 14 днів"; "view_next31" = "ÐаÑтупні 31 день"; "view_thismonth" = "Цей міÑÑць"; "view_future" = "Ð’ÑÑ– майбутні події"; "view_selectedday" = "Вибраний день"; "View:" = "ПереглÑд:"; "Title or Description" = "Ðазва або опиÑ"; "Search" = "Пошук"; "Search attendees" = "Пошук учаÑників"; "Search resources" = "Пошук реÑурÑів"; "Search appointments" = "Пошук зуÑтрічей"; "All day Event" = "ÐŸÐ¾Ð´Ñ–Ñ Ð²Ñього днÑ"; "check for conflicts" = "Перевірити на конфлікти"; "Browse URL" = "Перейти до адреÑи"; "newAttendee" = "Додати учаÑника"; /* calendar modes */ "Overview" = "ОглÑд"; "Chart" = "Діаграма"; "List" = "Перелік"; "Columns" = "Стовпці"; /* Priorities */ "prio_0" = "Ðе зазначено"; "prio_1" = "ВиÑокий"; "prio_2" = "ВиÑокий"; "prio_3" = "ВиÑокий"; "prio_4" = "ВиÑокий"; "prio_5" = "Ðормальний"; "prio_6" = "Ðизький"; "prio_7" = "Ðизький"; "prio_8" = "Ðизький"; "prio_9" = "Ðизький"; /* access classes (privacy) */ "PUBLIC_vevent" = "Публічна подіÑ"; "CONFIDENTIAL_vevent" = "Конфіденційна подіÑ"; "PRIVATE_vevent" = "ОÑобиÑта подіÑ"; "PUBLIC_vtodo" = "ЗагальнодоÑтупне завданнÑ"; "CONFIDENTIAL_vtodo" = "Конфіденційне завданнÑ"; "PRIVATE_vtodo" = "ОÑобиÑте завданнÑ"; /* status type */ "status_" = "Ðе вибрано"; "status_NOT-SPECIFIED" = "Ðе зазначено"; "status_TENTATIVE" = "Під питаннÑм"; "status_CONFIRMED" = "Підтверджено"; "status_CANCELLED" = "СкаÑовано"; "status_NEEDS-ACTION" = "Вимагає дії"; "status_IN-PROCESS" = "Ð’ процеÑÑ–"; "status_COMPLETED" = "Виконано"; /* Cycles */ "cycle_once" = "cycle_once"; "cycle_daily" = "cycle_daily"; "cycle_weekly" = "cycle_weekly"; "cycle_2weeks" = "cycle_2weeks"; "cycle_4weeks" = "cycle_4weeks"; "cycle_monthly" = "cycle_monthly"; "cycle_weekday" = "cycle_weekday"; "cycle_yearly" = "cycle_yearly"; "cycle_end_never" = "cycle_end_never"; "cycle_end_until" = "cycle_end_until"; "Recurrence pattern" = "Шаблон повтореннÑ"; "Range of recurrence" = "Діапазон повтору"; "Repeat" = "Повтор"; "Daily" = "щоднÑ"; "Weekly" = "щотижнÑ"; "Monthly" = "щоміÑÑцÑ"; "Yearly" = "щороку"; "Every" = "Кожні"; "Days" = "День(дні)"; "Week(s)" = "Тиждень(ні)"; "On" = "Увімкнено"; "Month(s)" = "МіÑÑць(Ñ–)"; "The" = "The"; "Recur on day(s)" = "Повторювати по днÑÑ…"; "Year(s)" = "Рік(роки)"; "cycle_of" = "з"; "No end date" = "Без кінцÑ"; "Create" = "Створити"; "appointment(s)" = "зуÑтріч(Ñ–)"; "Repeat until" = "Повтор до"; "First" = "перший"; "Second" = "другий"; "Third" = "третій"; "Fourth" = "четвертий"; "Fift" = "п’Ñтий"; "Last" = "оÑтанній"; /* Appointment categories */ "category_none" = "Без категорії"; "category_labels" = "Важливий день,День народженнÑ,Справи,Дзвінки,Клієнти,Поточне,КориÑтувачі,Обране,ПродовженнÑ,Подарунки,СвÑто,Думки,ЗуÑтріч,ПитаннÑ,Різне,ОÑобиÑте,Проекти,Публічне ÑвÑто,Поточне,ПоÑтачальники,Поїздка,ВідпуÑтка"; "repeat_NEVER" = "без повтору"; "repeat_DAILY" = "щоднÑ"; "repeat_WEEKLY" = "щотижнÑ"; "repeat_BI-WEEKLY" = "щодругий тиждень"; "repeat_EVERY WEEKDAY" = "уÑÑ– робочі дні"; "repeat_MONTHLY" = "щоміÑÑцÑ"; "repeat_YEARLY" = "щороку"; "repeat_CUSTOM" = "влаÑне..."; "reminder_NONE" = "без нагадуваннÑ"; "reminder_5_MINUTES_BEFORE" = "за 5 хвилин"; "reminder_10_MINUTES_BEFORE" = "за 10 хвилин"; "reminder_15_MINUTES_BEFORE" = "за 15 хвилин"; "reminder_30_MINUTES_BEFORE" = "за 30 хвилин"; "reminder_45_MINUTES_BEFORE" = "за 45 хвилин"; "reminder_1_HOUR_BEFORE" = "за 1 годину"; "reminder_2_HOURS_BEFORE" = "за 2 години"; "reminder_5_HOURS_BEFORE" = "за 5 годин"; "reminder_15_HOURS_BEFORE" = "за 15 годин"; "reminder_1_DAY_BEFORE" = "за 1 день"; "reminder_2_DAYS_BEFORE" = "за 2 дні"; "reminder_1_WEEK_BEFORE" = "за 1 тиждень"; "reminder_CUSTOM" = "влаÑне..."; "reminder_MINUTES" = "хвилин"; "reminder_HOURS" = "годин"; "reminder_DAYS" = "днів"; "reminder_BEFORE" = "до"; "reminder_AFTER" = "піÑлÑ"; "reminder_START" = "початку події"; "reminder_END" = "ÐºÑ–Ð½Ñ†Ñ Ð¿Ð¾Ð´Ñ–Ñ—"; "Reminder Details" = "Деталі нагадуваннÑ"; "Choose a Reminder Action" = "Вибріть дію з нагадуваннÑ"; "Show an Alert" = "Показати нагадуваннÑ"; "Send an E-mail" = "ÐадіÑлати E-Mail"; "Email Organizer" = "E-Mail організатора"; "Email Attendees" = "E-Mail учаÑників"; "zoom_400" = "400%"; "zoom_200" = "200%"; "zoom_100" = "100%"; "zoom_50" = "50%"; "zoom_25" = "25%"; /* transparency */ "Show Time as Free" = "Ð’ цей Ñ‡Ð°Ñ Ñ Ð²Ñ–Ð»ÑŒÐ½Ð¸Ð¹"; /* validation errors */ validate_notitle = "Ðе зазначено назву, продовжити?"; validate_invalid_startdate = "Ðеправильна дата початку!"; validate_invalid_enddate = "Ðеправильна дата кінцÑ!"; validate_endbeforestart = "Дата Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ÑƒÑ” даті початку."; "Tasks" = "ЗавданнÑ"; "Show completed tasks" = "Показати виконані завданнÑ"; /* tabs */ "Task" = "ЗавданнÑ"; "Event" = "ПодіÑ"; "Recurrence" = "ПовтореннÑ"; /* toolbar */ "New Event" = "Ðова подіÑ"; "New Task" = "Ðове завданнÑ"; "Edit" = "Змінити"; "Delete" = "Вилучити"; "Go to Today" = "Сьогодні"; "Day View" = "День"; "Week View" = "Тиждень"; "Month View" = "МіÑÑць"; "Reload" = "Перевантажити"; "eventPartStatModificationError" = "Ðеможливо змінити Ñтан Вашої учаÑті."; /* menu */ "New Event..." = "Ðова подіÑ..."; "New Task..." = "Ðове завданнÑ..."; "Edit Selected Event..." = "Редагувати виділену подію..."; "Delete Selected Event" = "Вилучити виділену подію"; "Select All" = "Виділити вÑе"; "Workweek days only" = "Лише робочі дні"; "Tasks in View" = "ПереглÑд завдань"; "eventDeleteConfirmation" = "Ці події буде вилучено: \n%{0}\nПродовжити?"; "taskDeleteConfirmation" = "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ вилучено назавжди.\nПродовжити?"; "You cannot remove nor unsubscribe from your personal calendar." = "Ви не можете вилучити перÑональнтй календар,а також відпиÑатиÑÑŒ від нього."; "Are you sure you want to delete the calendar \"%{0}\"?" = "Ви точно бажаєте вилучити календар \"%{0}\"?"; /* Legend */ "Participant" = "УчаÑник"; "Optional Participant" = "Ðеобов’Ñзковий учаÑник"; "Non Participant" = "Ðе Ñ” учаÑником"; "Chair" = "Ведучий"; "Needs action" = "Вимагає дії"; "Accepted" = "ПрийнÑто"; "Declined" = "СкаÑовано"; "Tentative" = "Під питаннÑм"; "Free" = "Вільно"; "Busy" = "ЗайнÑто"; "Maybe busy" = "Можливо зайнÑто"; "No free-busy information" = "Без інформації про зайнÑтіÑть"; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Запропонувати діапазон чаÑу:"; "Zoom:" = "МаÑштаб:"; "Previous slot" = "Попередній діапазон"; "Next slot" = "ÐаÑтупний діапазон"; "Previous hour" = "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð³Ð¾Ð´Ð¸Ð½Ð°"; "Next hour" = "ÐаÑтупна година"; "Work days only" = "Лише у робочі дні"; "The whole day" = "ПротÑгом вÑього днÑ"; "Between" = "між"; "and" = "та"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Ðеузгоджений Ñ‡Ð°Ñ Ð· одним з учаÑників.\nІгнорувати та зберегти поточні налаштуваннÑ?"; /* apt list */ "Title" = "Ðазва"; "Start" = "Початок"; "End" = "Кінець"; "Due Date" = "ДійÑно до"; "Location" = "МіÑце"; "(Private Event)" = "(ОÑобиÑта подіÑ)"; vevent_class0 = "(Публічна подіÑ)"; vevent_class1 = "(ОÑобиÑта подіÑ)"; vevent_class2 = "(Конфіденційна подіÑ)"; vtodo_class0 = "(Спільне завданнÑ)"; vtodo_class1 = "(ОÑобиÑте завданнÑ)"; vtodo_class2 = "(Конфіденційне завданнÑ)"; "closeThisWindowMessage" = "Thank you! You may now close this window or view your "; "Multicolumn Day View" = "Multicolumn Day View"; "Please select an event or a task." = "Будь лаÑка, виберіть подію або завданнÑ."; "editRepeatingItem" = "Ви збираєтеÑÑŒ змінити подію, що повторюєтьÑÑ. Ви можете змінити влаÑтивоÑті або виключно цієї події, але й вÑÑ–Ñ… Ñ—Ñ— повторень в майбутньому. Що Ви бажаєте змінити?"; "button_thisOccurrenceOnly" = "Тільки цю подію"; "button_allOccurrences" = "Ð’ÑÑ– повтореннÑ"; /* Properties dialog */ "Name:" = "Ðазва:"; "Color:" = "Колір:"; "Include in free-busy" = "Ð’Ñтавити до free-busy"; "Synchronization" = "СинхронізаціÑ"; "Synchronize" = "Синхронізувати"; "Tag:" = "Теґ:"; "Display" = "Показати"; "Show alarms" = "СповіщеннÑ"; "Show tasks" = "ЗавданнÑ"; "Links to this Calendar" = "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° цей Календар"; "Authenticated User Access" = "ДоÑтуп Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ… кориÑтувачів"; "CalDAV URL" = "CalDAV URL"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Будь лаÑка, зазначте чиÑлове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі дні, що більше або рівно 1."; "weekFieldInvalid" = "Будь лаÑка, зазначте чиÑлове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі тиждень(Ñ–), що більше або рівно 1."; "monthFieldInvalid" = "Будь лаÑка, зазначте чиÑлове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі міÑÑць(Ñ–), що більше або рівно 1."; "monthDayFieldInvalid" = "Будь лаÑка, зазначте чиÑлове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі день міÑÑцÑ, що більше або рівно 1."; "yearFieldInvalid" = "Будь лаÑка, зазначте чиÑлове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі рік, що більше або рівно 1."; "appointmentFieldInvalid" = "Будь лаÑка, зазначте чиÑлове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі запрошеннÑ, що більше або рівно 1."; "recurrenceUnsupported" = "Цей тип Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– не підтримуєтьÑÑ."; "Please specify a calendar name." = "Будь лаÑка, зазначте назву календарÑ."; "tagNotDefined" = "Вам потрібно зазначити теґ, щоб Ñинхронізувати цей календар."; "tagAlreadyExists" = "Зазначений теґ вже ÑпівÑтавлено з іншим календарем."; "tagHasChanged" = "Якщо Ви змінете теґ вашого календарÑ, то потрібно буде перевантажити дані на Вашому мобільному приÑтрої.\nПродовжити?"; "tagWasAdded" = "Якшр Ви хочете Ñинхронізувати цей календар, то потрібно буде перевантажити дані на Вашому мобільному приÑтрої.\nПродовжити?"; "tagWasRemoved" = "Якщо Ви ÑкаÑуєте режим Ñинхронізації Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ календарÑ, то потрібно буде перевантажити дані на Вашому мобільному приÑтрої.\nПродовжити?"; "DestinationCalendarError" = "Календарі Ñпівпадають. Спробуйте Ñкопіювати до іншого календарÑ."; "EventCopyError" = "Помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ. Спробуйте Ñкопіювати до іншого календарÑ."; "Open Task..." = "Відкрити завданнÑ..."; "Mark Completed" = "Позначити виконаним"; "Delete Task" = "Вилучити завданнÑ"; "Delete Event" = "Вилучити подію"; "Copy event to my calendar" = "Копіювати подію до мого календарÑ"; "Subscribe to a web calendar..." = "ПідпиÑатиÑÑŒ на веб-календар..."; "URL of the Calendar" = "URL календарÑ"; "Web Calendar" = "Веб-календар"; "Reload on login" = "Перевантажувати під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку"; "Invalid number." = "Ðеправильний номер."; "Category" = "КатегоріÑ"; "Priority" = "Пріоритет"; SOGo-2.1.1b/UI/Scheduler/UIxAttendeesEditor.m0000644000000000000000000000401612247657030017313 0ustar rootroot/* UIxAttendeesEditor.m - this file is part of SOGo * * Copyright (C) 2007-2012 Inverse inc. * * 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 #import #import #import #import "UIxAttendeesEditor.h" @implementation UIxAttendeesEditor - (id) defaultAction { [[self parent] setToolbar: @""]; return self; } - (void) setItem: (NSString *) newItem { item = newItem; } - (NSString *) item { return item; } - (NSArray *) zoomList { static NSArray *zoomItems = nil; if (!zoomItems) { zoomItems = [NSArray arrayWithObjects: @"400", @"200", @"100", @"50", @"25", nil]; [zoomItems retain]; } return zoomItems; } - (void) setZoom: (NSString *) zoom { // ASSIGN (zoom, _zoom); } - (NSString *) zoom { return @"100"; // return zoom; } - (NSString *) itemZoomText { return [self labelForKey: [NSString stringWithFormat: @"zoom_%@", item]]; } - (unsigned int) dayStartHour { SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; return [ud dayStartHour]; } - (unsigned int) dayEndHour { SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; return [ud dayEndHour]; } @end SOGo-2.1.1b/UI/Scheduler/NSDictionary+Scheduler.h0000644000000000000000000000201712247657030020054 0ustar rootroot/* NSDictionary+Scheduler.h - this file is part of SOGo * * Copyright (C) 2008 Inverse inc. * * 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 @interface NSDictionary (SOGoEventComparison) - (NSComparisonResult) compareEventByStart: (NSDictionary *) otherEvent; @end SOGo-2.1.1b/UI/Scheduler/UIxCalListingActions.h0000644000000000000000000000306112247657030017574 0ustar rootroot/* UIxCalListingActions.h - this file is part of SOGo * * Copyright (C) 2006-2009 Inverse inc. * * 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 UIXCALLISTINGACTIONVIEW_H #define UIXCALLISTINGACTIONVIEW_H #import @class NSCalendarDate; @class NSMutableDictionary; @class NSString; @class NSTimeZone; @class SOGoDateFormatter; @class WOResponse; @class WORequest; @interface UIxCalListingActions : WODirectAction { NSMutableDictionary *componentsData; NSCalendarDate *startDate; NSCalendarDate *endDate; NSString *title; NSString *userLogin; BOOL dayBasedView; WORequest *request; SOGoDateFormatter *dateFormatter; NSTimeZone *userTimeZone; } - (WOResponse *) alarmsListAction; - (WOResponse *) eventsListAction; - (WOResponse *) tasksListAction; @end #endif /* UIXCALLISTINGACTION_H */ SOGo-2.1.1b/UI/MainUI/0000755000000000000000000000000012247657027012635 5ustar rootrootSOGo-2.1.1b/UI/MainUI/SOGoBrowsersPanel.m0000644000000000000000000000265512247657027016341 0ustar rootroot/* SOGoBrowsersPanel.m - this file is part of SOGo * * Copyright (C) 2008 Inverse * * 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 #import "SOGoBrowsersPanel.h" @implementation SOGoBrowsersPanel - (BOOL) isIE7Compatible { WEClientCapabilities *cc; cc = [[context request] clientCapabilities]; return ([cc isWindowsBrowser] && ([[cc userAgent] rangeOfString: @"NT 5.1"].location != NSNotFound || [[cc userAgent] rangeOfString: @"NT 6"].location != NSNotFound)); } - (BOOL) isMac { WEClientCapabilities *cc; cc = [[context request] clientCapabilities]; return [cc isMacBrowser]; } @end SOGo-2.1.1b/UI/MainUI/OCSFolderInfo-oracle.sql0000644000000000000000000000203712247657027017217 0ustar rootroot-- -- (C) 2007 Inverse inc. -- CREATE TABLE @{tableName} ( c_folder_id INTEGER, c_path VARCHAR(255) PRIMARY KEY, -- the full path to the folder c_path1 VARCHAR(255) NOT NULL, -- parts (for fast queries) c_path2 VARCHAR(255) NULL, -- parts (for fast queries) c_path3 VARCHAR(255) NULL, -- parts (for fast queries) c_path4 VARCHAR(255) NULL, -- parts (for fast queries) c_foldername VARCHAR(255) NOT NULL, -- last path component c_location VARCHAR(2048) NOT NULL, -- URL to folder c_quick_location VARCHAR(2048) NULL, -- URL to quicktable of folder c_acl_location VARCHAR(2048) NULL, -- URL to quicktable of folder c_folder_type VARCHAR(255) NOT NULL -- the folder type ... ); CREATE SEQUENCE @{tableName}_seq; CREATE OR REPLACE TRIGGER @{tableName}_autonumber BEFORE INSERT ON @{tableName} FOR EACH ROW BEGIN IF :new.c_folder_id IS NULL THEN SELECT @{tableName}_seq.nextval INTO :new.c_folder_id FROM DUAL; END IF; END; / SOGo-2.1.1b/UI/MainUI/German.lproj/0000755000000000000000000000000012247657027015173 5ustar rootrootSOGo-2.1.1b/UI/MainUI/German.lproj/Locale0000644000000000000000000000314212247657027016315 0ustar rootroot/* German */ { NSLanguageName = "German"; NSFormalName = "Deutsch"; NSLocaleCode = "de"; /* ISO 639-1 */ NSLanguageCode = "deu"; /* ISO 639-2 */ NSParentContext = ""; NSCurrencySymbol = " €"; NSDateFormatString = "%A, %d. %B %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = (letzte, letzte, letzte, letzte); NSHourNameDesignations = ((0, Mitternacht), (12, Mittag), (10, Morgen), (14, Nachmittag), (19, Abend)); NSInternationalCurrencyString = EUR; /* ISO 4217 */ NSLaterTimeDesignations = ("nächste", "nächste", "nächste", "nächste"); NSMonthNameArray = (Januar, Februar, "März", April, Mai, Juni, Juli, August, September, Oktober, November, Dezember); NSNextDayDesignations = (morgen); NSNextNextDayDesignations = ("übermorgen"); NSPriorDayDesignations = (gestern); NSShortDateFormatString = "%d.%m.%Y"; NSShortMonthNameArray = (Jan, Feb, "Mär", Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez); NSShortTimeDateFormatString = "%d.%m.%Y %H:%M"; NSShortWeekDayNameArray = (So, Mo, Di, Mi, Do, Fr, Sa); NSThisDayDesignations = ("heute"); NSThousandsSeparator = "."; NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; /* no space before and after colons*/ NSWeekDayNameArray = (Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag); NSYearMonthWeekDesignations = (Jahr, Monat, Woche); NSAMPMDesignation = (AM, PM); NSPositiveCurrencyFormatString = "9.999,00€"; NSNegativeCurrencyFormatString = "-9.999,00€"; } SOGo-2.1.1b/UI/MainUI/German.lproj/Localizable.strings0000644000000000000000000001151612247657027021033 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Benutzername:"; "Password:" = "Passwort:"; "Domain:" = "Domain:"; "Remember username" = "Benutzername merken"; "Connect" = "Anmelden"; "Wrong username or password." = "Falscher Benutzername oder falsches Passwort"; "cookiesNotEnabled" = "Anmeldung an SOGo ist nicht möglich, da Cookies in Ihrem Browser deaktiviert sind. Bitte aktivieren Sie Cookies in Ihrem Browser und versuchen Sie es erneut."; "browserNotCompatible" = "Wir haben festgestellt, dass Ihre Browserversion im Moment nicht von SOGo unterstützt wird. Wir empfehlen Firefox zu verwenden. Klicken Sie unten auf den Link, um die aktuelle Version dieses Browsers zu installieren."; "alternativeBrowsers" = "Sie können auch die folgenden Browser benutzen"; "alternativeBrowserSafari" = "Sie können auch Safari benutzen."; "Download" = "Herunterladen"; "Language:" = "Sprache:"; "choose" = "Auswählen ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk BokmÃ¥l"; "NorwegianNynorsk" = "Norsk Nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentinien)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Über"; "AboutBox" = "Entwickelt von Inverse. SOGo ist ein vollständiger Groupware-Server mit Fokus auf Skalierbarkeit und Unkompliziertheit.

\nSOGo bietet ein umfangreiches, auf AJAX basierendes Web-Interface. Durch die Verwendung von Protokollstandards wie etwa CalDAV und CardDAV werden verschiedene native Clients unterstützt.

\nSOGo wird unter der GNU GPLv2 oder höher, Teile unter der GNU LGPLv2 angeboten. Dies ist freie Software: Sie haben die Freiheit sie zu verändern und erneut zu verbreiten. Es besteht KEINE GEWÄHRLEISTUNG, soweit dies gesetzlich zulässig ist.

\nAuf dieser Seite (in englischer Sprache) können Sie sich über weitere Support-Möglichkeiten informieren."; "Your account was locked due to too many failed attempts." = "Ihr Konto wurde wegen zu vieler fehlgeschlagener Anmeldeversuche gesperrt."; "Your account was locked due to an expired password." = "Ihr Konto wurde wegen eines abgelaufenen Passwortes gesperrt."; "Login failed due to unhandled error case: " = "Die Anmeldung ist aufgrund eines unbehandelten Fehlers fehlgeschlagen: "; "Change your Password" = "Bitte Passwort ändern"; "The password was changed successfully." = "Das Passwort wurde erfolgreich geändert."; "Your password has expired, please enter a new one below:" = "Ihr Passwort ist abgelaufen. Bitte geben Sie unten ein neues an:"; "Password must not be empty." = "Passwort darf nicht leer sein."; "The passwords do not match. Please try again." = "Die Passwörter stimmen nicht überein. Bitte noch einmal eingeben."; "Password Grace Period" = "Passwort-Schonfrist"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Sie haben noch %{0} Anmeldeversuch(e) bevor Ihr Konto gesperrt wird. Bitte ändern Sie das Passwort im Einstellungsdialog."; "Password about to expire" = "Ihr Passwort läuft bald ab"; "Your password is going to expire in %{0} %{1}." = "Ihr Passwort läuft in %{0} %{1} ab."; "days" = "Tagen"; "hours" = "Stunden"; "minutes" = "Minuten"; "seconds" = "Sekunden"; "Password change failed" = "Passwortänderung fehlgeschlagen"; "Password change failed - Permission denied" = "Passwortänderung fehlgeschlagen - Zugriff verweigert"; "Password change failed - Insufficient password quality" = "Passwortänderung fehlgeschlagen - Passwortqualität nicht ausreichend"; "Password change failed - Password is too short" = "Passwortänderung fehlgeschlagen - Passwort ist zu kurz"; "Password change failed - Password is too young" = "Passwortänderung fehlgeschlagen - Passwort ist zu jung"; "Password change failed - Password is in history" = "Passwortänderung fehlgeschlagen - Passwort wurde bereits früher verwendet"; "Unhandled policy error: %{0}" = "Unbehandelter Richtlinienfehler: %{0}"; "Unhandled error response" = "Unbehandelte Fehlerantwort"; "Password change is not supported." = "Passwortänderung wird nicht unterstützt."; "Unhandled HTTP error code: %{0}" = "Unbehandelter HTTP-Fehlercode: %{0}"; "New password:" = "Neues Passwort:"; "Confirmation:" = "Bestätigung:"; "Cancel" = "Abbrechen"; "Please wait..." = "Bitte warten..."; SOGo-2.1.1b/UI/MainUI/UIxLoading.h0000644000000000000000000000177212247657027015020 0ustar rootroot/* UIxLoading.h - this file is part of SOGo * * Copyright (C) 2011 Inverse inc. * * Author: Francis Lachapelle * * 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 UIXLOADING_H #define UIXLOADING_H #import @interface UIxLoading : UIxComponent { } @end #endif /* UIXLOADING_H */ SOGo-2.1.1b/UI/MainUI/GNUmakefile0000644000000000000000000000167412247657027014717 0ustar rootroot# GNUstep makefile include ../common.make BUNDLE_NAME = MainUI MainUI_PRINCIPAL_CLASS = MainUIProduct MainUI_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh MainUI_OBJC_FILES += \ MainUIProduct.m \ SOGoRootPage.m \ SOGoUserHomePage.m \ SOGoBrowsersPanel.m \ UIxLoading.m \ ifeq ($(saml2_config), yes) MainUI_OBJC_FILES += SOGoSAML2Actions.m endif MainUI_RESOURCE_FILES += \ product.plist \ SOGoProfile.sql \ SOGoProfile-oracle.sql \ OCSFolderInfo.sql \ OCSFolderInfo-oracle.sql \ MainUI_LOCALIZED_RESOURCE_FILES += \ Locale Localizable.strings ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble SOGo-2.1.1b/UI/MainUI/SOGoBrowsersPanel.h0000644000000000000000000000174012247657027016326 0ustar rootroot/* SOGoBrowsersPanel.h - this file is part of SOGo * * Copyright (C) 2008 Inverse * * 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 @interface SOGoBrowsersPanel : UIxComponent - (BOOL) isIE7Compatible; - (BOOL) isMac; @end SOGo-2.1.1b/UI/MainUI/Czech.lproj/0000755000000000000000000000000012247657027015016 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Czech.lproj/Locale0000644000000000000000000000320112247657027016134 0ustar rootroot/* Czech */ { NSLanguageName = "ÄŒesky"; NSFormalName = "Czech"; NSLocaleCode = "cs"; /* ISO 639-1 */ NSLanguageCode = "cze"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (dop., odp.); NSCurrencySymbol = "CZK"; NSDateFormatString = "%A, %e %B, %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = ("pÅ™ed", "poslední", "uplynulý", "pÅ™ede"); NSHourNameDesignations = ((0, "půlnoc"), (10, "ráno"), (12, "poledne"), (14, "odpoledne"), (19, "veÄer")); NSInternationalCurrencyString = CZK; /* ISO 4217 */ NSLaterTimeDesignations = ("následující"); NSMonthNameArray = (Leden, "Únor", "BÅ™ezen", Duben, "KvÄ›ten", "ÄŒerven", "ÄŒervenec", Srpen, "Září", "Říjen", Listopad, Prosinec); NSNextDayDesignations = ("zítra"); NSNextNextDayDesignations = ("následující den"); NSPriorDayDesignations = ("vÄera"); NSShortDateFormatString = "%e-%b-%y"; NSShortMonthNameArray = (Led, "Úno", "BÅ™e", Dub, "KvÄ›", "ÄŒer", "ÄŒvc", Srp, "Zář", "Říj", Lis, Pro); NSShortTimeDateFormatString = "%e.%m.%y %H:%M"; NSShortWeekDayNameArray = (Ne, Po, "Út", St, "ÄŒt", "Pá", So); NSThisDayDesignations = (dnes, "nyní"); NSThousandsSeparator = ","; NSTimeDateFormatString = "%A, %e %B, %Y %H:%M %Z"; NSTimeFormatString = "%H:%M"; NSWeekDayNameArray = ("NedÄ›le", "PondÄ›lí", "Úterý", "StÅ™eda", "ÄŒtvrtek", "Pátek", "Sobota"); NSYearMonthWeekDesignations = (rok, "mÄ›síc", "týden"); NSPositiveCurrencyFormatString = "9,999.00 CZK"; NSNegativeCurrencyFormatString = "-9,999.00 CZK"; } SOGo-2.1.1b/UI/MainUI/Czech.lproj/Localizable.strings0000644000000000000000000001105312247657027020652 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Uživatelské jméno:"; "Password:" = "Heslo:"; "Domain:" = "Doména"; "Remember username" = "Pamatovat si uživatelské jméno"; "Connect" = "PÅ™ipojit"; "Wrong username or password." = "Å patné uživatelské jméno nebo heslo."; "cookiesNotEnabled" = "Nemůžete se pÅ™ihlásit, protože nemáte povoleny cookies ve VaÅ¡em prohlížeÄi. Povolte prosím cookies v nastavení VaÅ¡eho prohlížeÄe a akci opakujte."; "browserNotCompatible" = "Tento systém nepodporuje souÄasnou verzi VaÅ¡eho prohlížeÄe. DoporuÄujeme použít Firefox. KliknÄ›te na níže uvedený odkaz pro stažení aktuální verze tohoto prohlížeÄe."; "alternativeBrowsers" = "Můžete vÅ¡ak použít i následující kompatibilní prohlížeÄe"; "alternativeBrowserSafari" = "Můžete vÅ¡ak použít i Safari."; "Download" = "Stáhnout"; "Language:" = "Jazyk:"; "choose" = "Vybrat ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "O aplikaci"; "AboutBox" = "SOGo je plnÄ› vybavený groupwarový server vyvíjený Inverse, který je zaměřený na jednoduchost a Å¡kálovatelnost.

\nSOGo poskytuje bohaté webové prostředí založené na technologii AJAX a podporuje i mnoho kalendářových klientů pracujících se standardními protokoly CalDAV a CardDAV.

\nSOGo je distribuováno pod licencí GNU GPL verze 2 nebo novÄ›jší a nÄ›které Äásti jsou distribuovány pod licencí GNU LGPL verze 2. Toto je svobodný software: můžete ho svobodnÄ› mÄ›nit a šířit dále. Neexistuje ŽÃDNà ZÃRUKA v rozsahu upraveném zákonem.

\nRůzné možnosti podpory naleznete na této stránce."; "Your account was locked due to too many failed attempts." = "Váš úÄet byl zablokován z důvodu mnoha neúspěšných pokusů o pÅ™ihlášení."; "Your account was locked due to an expired password." = "Váš úÄet byl zablokován z důvodu expirovaného hesla."; "Login failed due to unhandled error case: " = "PÅ™ihlášení selhalo z důvodu chyby: "; "Change your Password" = "Změňte své heslo"; "The password was changed successfully." = "Heslo bylo úspěšnÄ› zmÄ›nÄ›no."; "Your password has expired, please enter a new one below:" = "VaÅ¡e heslo expirovalo, prosím zadejte nové:"; "Password must not be empty." = "Heslo nesmí být prázdné."; "The passwords do not match. Please try again." = "Hesla se neshodují. Prosím zadejte znovu."; "Password Grace Period" = "Doba platnosti hesla"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Zbývá Vám %{0} pÅ™ihlášení pÅ™ed zablokováním úÄtu. Prosím změňte si heslo v dialogovém oknÄ› pÅ™edvoleb."; "Password about to expire" = "Expirace hesla"; "Your password is going to expire in %{0} %{1}." = "VaÅ¡e heslo expiruje ve %{0} %{1}."; "days" = "dnech"; "hours" = "hodinách"; "minutes" = "minutách"; "seconds" = "sekundách"; "Password change failed" = "ZmÄ›na hesla selhala"; "Password change failed - Permission denied" = "ZmÄ›na hesla selhala - Přístup odepÅ™en"; "Password change failed - Insufficient password quality" = "ZmÄ›na hesla selhala - NepostaÄující kvalita hesla"; "Password change failed - Password is too short" = "ZmÄ›na hesla selhala - PříliÅ¡ krátké heslo"; "Password change failed - Password is too young" = "ZmÄ›na hesla selhala - PříliÅ¡ nové heslo"; "Password change failed - Password is in history" = "ZmÄ›na hesla selhala - Heslo je v historii"; "Unhandled policy error: %{0}" = "NeoÅ¡etÅ™ená chyba: %{0}"; "Unhandled error response" = "NeoÅ¡etÅ™ená chyba"; "Password change is not supported." = "ZmÄ›na hesla není podporována."; "Unhandled HTTP error code: %{0}" = "NeoÅ¡etÅ™ený HTTP chybový kód: %{0}"; "New password:" = "Nové heslo:"; "Confirmation:" = "Potvrzení:"; "Cancel" = "Storno"; "Please wait..." = "Prosím Äekejte..."; SOGo-2.1.1b/UI/MainUI/Welsh.lproj/0000755000000000000000000000000012247657027015044 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Welsh.lproj/Locale0000644000000000000000000000302012247657027016161 0ustar rootroot/* English */ { NSLanguageName = "Welsh"; NSFormalName = "Welsh"; NSLocaleCode = "en"; /* ISO 639-1 */ NSLanguageCode = "eng"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = "$"; NSDateFormatString = "%A, %B %e, %Y"; NSDateTimeOrdering = MDYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = (prior, last, past, ago); NSHourNameDesignations = ((0, midnight), (10, morning), (12, noon, lunch), (14, afternoon), (19, dinner)); NSInternationalCurrencyString = USD; /* ISO 4217 */ NSLaterTimeDesignations = (next); NSMonthNameArray = (January, February, March, April, May, June, July, August, September, October, November, December); NSNextDayDesignations = (tomorrow); NSNextNextDayDesignations = (nextday); NSPriorDayDesignations = (yesterday); NSShortDateFormatString = "%m/%e/%y"; NSShortMonthNameArray = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); NSShortTimeDateFormatString = "%m/%e/%y %I:%M %p"; NSShortWeekDayNameArray = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); NSThisDayDesignations = (today, now); NSThousandsSeparator = ","; NSTimeDateFormatString = "%A, %B %e, %Y %I:%M:%S %p %Z"; NSTimeFormatString = "%I:%M:%S %p"; NSWeekDayNameArray = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday); NSYearMonthWeekDesignations = (year, month, week); NSPositiveCurrencyFormatString = "$9,999.00"; NSNegativeCurrencyFormatString = "-$9,999.00"; } SOGo-2.1.1b/UI/MainUI/Welsh.lproj/Localizable.strings0000644000000000000000000001052212247657027020700 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Enw defnyddiwr:"; "Password:" = "Cyfrinair:"; "Domain:" = "Domain:"; "Connect" = "Cysylltu"; "Wrong username or password." = "enw defnyddiwr neu cyfrinair anghywir."; "cookiesNotEnabled" = "Ni ellir logio i fewn oherwydd bod cookies eich porwr wedi eu analluogi. Galluogwch y cookies yng ngosodiadau'ch porwr a cheisiwch eto."; "browserNotCompatible" = "Nid yw fersiwn eich porwr yn cael ei gynnal ar hyn o bryd gan y safle hwn. Rydym yn cymeradwyo defnyddio Firefox. Cliciwch ar y linc isod i lawrlwytho y fersiwn mwyaf cyfredol o'r porwr yma."; "alternativeBrowsers" = "Medrwch hefyd defnyddio y porwyr gytun yma"; "alternativeBrowserSafari" = "Medrwch hefyd defnyddio Safari."; "Download" = "Lawrlwytho"; "Language:" = "Iaith:"; "choose" = "Dewis ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "About"; "AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

See this page for various support options."; "Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; "Your account was locked due to an expired password." = "Your account was locked due to an expired password."; "Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; "Change your Password" = "Change your Password"; "The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; "Password must not be empty." = "Password must not be empty."; "The passwords do not match. Please try again." = "The passwords do not match. Please try again."; "Password Grace Period" = "Password Grace Period"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; "Password about to expire" = "Password about to expire"; "Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; "days" = "days"; "hours" = "hours"; "minutes" = "minutes"; "seconds" = "seconds"; "Password change failed" = "Password change failed"; "Password change failed - Permission denied" = "Password change failed - Permission denied"; "Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; "Password change failed - Password is too short" = "Password change failed - Password is too short"; "Password change failed - Password is too young" = "Password change failed - Password is too young"; "Password change failed - Password is in history" = "Password change failed - Password is in history"; "Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; "Unhandled error response" = "Unhandled error response"; "Password change is not supported." = "Password change is not supported."; "Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; "Please wait..." = "Please wait..."; SOGo-2.1.1b/UI/MainUI/BrazilianPortuguese.lproj/0000755000000000000000000000000012247657027017760 5ustar rootrootSOGo-2.1.1b/UI/MainUI/BrazilianPortuguese.lproj/Locale0000644000000000000000000000315012247657027021101 0ustar rootroot/* Brazilian Portuguese */ { NSLanguageName = "BrazilianPortuguese"; NSFormalName = "Portuguese"; NSLocaleCode = "pt_BR"; /* ISO 639-1 */ NSLanguageCode = "por"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = "R$"; NSDateFormatString = "%A, %B de %e de %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = (anterior, "último", passado, "atrás"); NSHourNameDesignations = ((0, meia-noite), (10, "manhã"), (12, meio-dia, "almoço"), (14, tarde), (19, noite)); NSInternationalCurrencyString = BRL; /* ISO 4217 */ NSLaterTimeDesignations = ("próxima"); NSMonthNameArray = (Janeiro, Fevereiro, "Março", Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro); NSNextDayDesignations = ("amanhã"); NSNextNextDayDesignations = ("dia seguinte"); NSPriorDayDesignations = (ontem); NSShortDateFormatString = "%e/%m/%y"; NSShortMonthNameArray = (Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez); NSShortTimeDateFormatString = "%e/%m/%y %I:%M %p"; NSShortWeekDayNameArray = (Dom, Seg, Ter, Qua, Qui, Sex, Sab); NSThisDayDesignations = (hoje, agora); NSThousandsSeparator = "."; NSTimeDateFormatString = "%A, %B de %e de %Y %I:%M:%S %p %Z"; NSTimeFormatString = "%I:%M:%S %p"; NSWeekDayNameArray = (Domingo, Segunda, "Terça", Quarta, Quinta, Sexta, "Sábado"); NSYearMonthWeekDesignations = (ano, "mês", semana); NSPositiveCurrencyFormatString = "R$9.999,00"; NSNegativeCurrencyFormatString = "(R$9.999,00)"; } SOGo-2.1.1b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings0000644000000000000000000001071212247657027023615 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Usuário:"; "Password:" = "Senha:"; "Domain:" = "Domínio:"; "Remember username" = "Lembrar login"; "Connect" = "Conectar"; "Wrong username or password." = "Usuário ou Senha Inválido."; "cookiesNotEnabled" = "Você não pode logar por a opção cookies está desabilitada. Por favor, habilite os cookies nas configurações de seu navegador e tente novamente."; "browserNotCompatible" = "Foi detectado que a atual versão de seu navegador não é suportado neste site. Recomentamos que use o Firefox. Clique no link abaixo para baixar a versão atual deste navegador."; "alternativeBrowsers" = "Alternativamente, você pode usar os seguinte navegadores compatíveis"; "alternativeBrowserSafari" = "Alternativamente, você pode usar o Safari."; "Download" = "Download"; "Language:" = "Idioma:"; "choose" = "Escolha ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Noruega (Norsk bokmÃ¥l)"; "NorwegianNynorsk" = "Noruega (Norsk nynorsk)"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Espanhol (Espanha)"; "SpanishArgentina" = "Espanhol (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Sobre"; "AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

⎠\nSOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

⎠\nSOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

⎠\nSee this page for various support options."; "Your account was locked due to too many failed attempts." = "Sua conta foi bloqueada devido a muitas tentativas fracassadas."; "Your account was locked due to an expired password." = "Sua conta foi bloqueada devido a uma senha expirada."; "Login failed due to unhandled error case: " = "O Login falhou pelo seguinte erro:"; "Change your Password" = "Altere sua Senha"; "The password was changed successfully." = "Senha alterada com sucesso."; "Your password has expired, please enter a new one below:" = "Sua senha expirou, por favor, informe uma nova abaixo:"; "Password must not be empty." = "A Senha não pode ser vazia."; "The passwords do not match. Please try again." = "As senhas não conferem. Por favor, tente novamente."; "Password Grace Period" = "Periodo de carência da Senha"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Você tem %{0} logins restantes antes de bloquear sua conta. Por favor, altere sua senha no menu preferências."; "Password about to expire" = "Senha prestes a expirar"; "Your password is going to expire in %{0} %{1}." = "Sua senha vai expirar em %{0} %{1}."; "days" = "dias"; "hours" = "horas"; "minutes" = "minutos"; "seconds" = "segundos"; "Password change failed" = "Alteração da senha falhou"; "Password change failed - Permission denied" = "Alteração da senha falhou - Permissão negada"; "Password change failed - Insufficient password quality" = "Alteração da senha falhou - Senha muito fraca"; "Password change failed - Password is too short" = "Alteração da senha falhou - Senha muito curta"; "Password change failed - Password is too young" = "Alteração da senha falhou - Senha usada recentemente"; "Password change failed - Password is in history" = "Password is too young - Senha está no histórico"; "Unhandled policy error: %{0}" = "Política de erro não tratada: %{0}"; "Unhandled error response" = "Erro de resposta não tratado"; "Password change is not supported." = "Alteração da senha não suportada."; "Unhandled HTTP error code: %{0}" = "Erro HTTP não tratado: %{0}"; "New password:" = "Nova senha:"; "Confirmation:" = "Confirmação:"; "Cancel" = "Cancelar"; "Please wait..." = "Por favor, aguarde..."; SOGo-2.1.1b/UI/MainUI/NorwegianNynorsk.lproj/0000755000000000000000000000000012247657027017277 5ustar rootrootSOGo-2.1.1b/UI/MainUI/NorwegianNynorsk.lproj/Locale0000644000000000000000000000301712247657027020422 0ustar rootroot/* Norwegian */ { NSLanguageName = "Norwegian (Nynorsk)"; NSFormalName = "Norsk nynorsk"; NSLocaleCode = "nn"; /* ISO 639-1 */ NSLanguageCode = "nor"; /* ISO 639-2 */ NSParentContext = ""; NSCurrencySymbol = " kr"; NSDateFormatString = "%A %e. %B %Y"; NSDateTimeOrdering = MDHY; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = (forrige, siste, tidligere); NSHourNameDesignations = ((0, midnatt), (10, formiddag), (12, lunch), (14, ettermiddag), (19, kveld)); NSInternationalCurrencyString = NOK; /* ISO 4217 */ NSLaterTimeDesignations = (neste); NSMonthNameArray = (Januar, Februar, Mars, April, Mai, Juni, Juli, August, September, Oktober, November, Desember); NSNextDayDesignations = ("i morgen"); NSNextNextDayDesignations = (overmorgen); NSPriorDayDesignations = ("i gÃ¥r"); NSShortDateFormatString = "%d.%m.%Y"; NSShortMonthNameArray = (Jan, Feb, Mar, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Des); NSShortTimeDateFormatString = "%d.%m.%Y %H:%M"; NSShortWeekDayNameArray = ("Søn", Man, Tir, Ons, Tor, Fre, "Lør"); NSThisDayDesignations = ("i dag", "nÃ¥"); NSThousandsSeparator = " "; NSTimeDateFormatString = "%A %e. %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("Søndag", Mandag, Tirsdag, Onsdag, Torsdag, Fredag, "Lørdag"); NSYearMonthWeekDesignations = ("Ã¥r", "mÃ¥ned", uke); NSPositiveCurrencyFormatString = "9,999.00 $"; NSNegativeCurrencyFormatString = "-9,999.00 $"; } SOGo-2.1.1b/UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings0000644000000000000000000001073512247657027023141 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Brukernavn:"; "Password:" = "Passord:"; "Domain:" = "Domain:"; "Remember username" = "Husk brukernavn"; "Connect" = "Logg inn"; "Wrong username or password." = "Feil brukernavn eller passord."; "cookiesNotEnabled" = "Du kan ikke logge inn fordi nettleser ikke har aktivert infokapsler (cookies). Endre innstillinger i nettleseren din slik at infokapsler (cookies) er tillatt."; "browserNotCompatible" = "Versjonen av nettleseren du anvender støttes ikke av denne webmailen. Vi anbefaler at du bruker Firefox. Klikk pÃ¥ linken under for Ã¥ laste ned den siste versionen av Firefox."; "alternativeBrowsers" = "Alternativt kan du ogsÃ¥ forsøke følgende kompatible nettlesere"; "alternativeBrowserSafari" = "Alternativt kan du ogsÃ¥ bruke Safari."; "Download" = "Last ned"; "Language:" = "SprÃ¥k:"; "choose" = "Velg ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Om"; "AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

See this page for various support options."; "Your account was locked due to too many failed attempts." = "Din konto har blitt lÃ¥st pÃ¥ grunn av for mange misslykkete innlogginger."; "Your account was locked due to an expired password." = "Din konto har blitt lÃ¥st fordi ditt passord er utløpt."; "Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; "Change your Password" = "Endre ditt passord"; "The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Ditt passord har utløpt, vennligst fyll ut et nytt under:"; "Password must not be empty." = "Passordet mÃ¥ ikke være tomt."; "The passwords do not match. Please try again." = "Passordene stemmer ikke overens. Vennligst prøv igjen."; "Password Grace Period" = "Password Grace Period"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Du har %{0} gjenværende innlogginger før din konto blir lÃ¥st. Vennligst endre ditt passord i preferanse-dialogen."; "Password about to expire" = "Passordet er pÃ¥ tur til Ã¥ utløpe"; "Your password is going to expire in %{0} %{1}." = "Ditt passord vil utløpe om %{0} %{1}."; "days" = "dager"; "hours" = "timer"; "minutes" = "minutter"; "seconds" = "sekunder"; "Password change failed" = "Feil ved endring av passord"; "Password change failed - Permission denied" = "Feil ved endring av passord - tillatelse nektet"; "Password change failed - Insufficient password quality" = "Feil ved endring av passord - Utilstrekkelig passordkvalitet"; "Password change failed - Password is too short" = "Feil ved endring av passord - Passordet er for kort"; "Password change failed - Password is too young" = "Feil ved endring av passord - Password is too young"; "Password change failed - Password is in history" = "Feil ved endring av passord - Password is in history"; "Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; "Unhandled error response" = "Unhandled error response"; "Password change is not supported." = "Password change is not supported."; "Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; "New password:" = "Nytt passord:"; "Confirmation:" = "Bekreftelse:"; "Cancel" = "Avbryt"; "Please wait..." = "Vennligst vent..."; SOGo-2.1.1b/UI/MainUI/Swedish.lproj/0000755000000000000000000000000012247657027015370 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Swedish.lproj/Locale0000644000000000000000000000301512247657027016511 0ustar rootroot/* Swedish */ { NSLanguageName = "Swedish"; NSFormalName = "Svenska"; NSLocaleCode = "sv"; /* ISO 639-1 */ NSLanguageCode = "swe"; /* ISO 639-2 */ NSParentContext = ""; NSCurrencySymbol = " kr"; NSDateFormatString = "%A %e %B %Y"; NSDateTimeOrdering = YMDH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = ("föregÃ¥ende", senaste, tidigare); NSHourNameDesignations = ((0, midnatt), (10, "förmiddag"), (12, lunch), (14, eftermiddag), (19, "kväll")); NSInternationalCurrencyString = SEK; /* ISO 4217 */ NSLaterTimeDesignations = ("nästa"); NSMonthNameArray = (Januari, Februari, Mars, April, Maj, Juni, Juli, Augusti, September, Oktober, November, December); NSNextDayDesignations = (imorgon); NSNextNextDayDesignations = ("övermorgon"); NSPriorDayDesignations = ("igÃ¥r"); NSShortDateFormatString = "%Y-%m-%d"; NSShortMonthNameArray = (Jan, Feb, Mar, Apr, Maj, Jun, Jul, Aug, Sep, Okt, Nov, Dec); NSShortTimeDateFormatString = "%Y-%m-%d %H:%M"; NSShortWeekDayNameArray = ("Sön", "MÃ¥n", Tis, Ons, Tor, Fre, "Lör"); NSThisDayDesignations = (idag, nu); NSThousandsSeparator = " "; NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("Söndag", "MÃ¥ndag", Tisdag, Onsdag, Torsdag, Fredag, "Lördag"); NSYearMonthWeekDesignations = ("Ã¥r", "mÃ¥nad", vecka); NSPositiveCurrencyFormatString = "9,999.00 $"; NSNegativeCurrencyFormatString = "-9,999.00 $"; } SOGo-2.1.1b/UI/MainUI/Swedish.lproj/Localizable.strings0000644000000000000000000001117312247657027021227 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Användarnamn:"; "Password:" = "Lösenord:"; "Domain:" = "Domain:"; "Connect" = "Logga in"; "Wrong username or password." = "fel användarnamn eller lösenord."; "cookiesNotEnabled" = "Du kan inte logga in eftersom din nätbläddrare inte har funktionen kakor(cookies) pÃ¥slagen. Ändra dina inställningar i nätbläddraren sÃ¥ att funktionen kakor tillÃ¥ts och prova igen."; "browserNotCompatible" = "Den version av nätbläddrare du använder stöds inte av webbplatsen. Vi rekommenderar att du använder Firefox. Klicka pÃ¥ länken nedan för att ladda ner den senaste versionen av Firefox."; "alternativeBrowsers" = "Alternativt kan du ocksÃ¥ använda följande kompatibla nätbläddrare"; "alternativeBrowserSafari" = "Alternativt kan du ocksÃ¥ använda Safari."; "Download" = "Ladda ner"; "Language:" = "SprÃ¥k:"; "choose" = "Välj ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Om"; "AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

See this page for various support options."; "Your account was locked due to too many failed attempts." = "Ditt konto är spärrat pga för mÃ¥nga misslyckade inloggningsförsök."; "Your account was locked due to an expired password." = "Ditt konto är spärrat pga att lösenordet har slutat gälla."; "Login failed due to unhandled error case: " = "Inloggningen misslyckades pga ett okänt fel: "; "Change your Password" = "Ändra ditt lösenord"; "The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Ditt lösenord har slutat gälla, mata in ett nytt lösenord nedan:"; "Password must not be empty." = "Lösenordet fÃ¥r inte vara tomt."; "The passwords do not match. Please try again." = "Felaktigt lösenord. Försök igen."; "Password Grace Period" = "Tillfälligt lösenord"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Du har %{0} inloggningar kvar innan ditt konto blir lÃ¥st. Byt ditt lösenord i inställningar."; "Password about to expire" = "Lösenordet är pÃ¥ väg att sluta gälla"; "Your password is going to expire in %{0} %{1}." = "Ditt lösenord kommer sluta gälla om %{0} %{1}."; "days" = "dagar"; "hours" = "timmar"; "minutes" = "minuter"; "seconds" = "sekunder"; "Password change failed" = "Ändringen av lösendordet misslyckades"; "Password change failed - Permission denied" = "Ändringen av lösendordet misslyckades - Behörighet nekad"; "Password change failed - Insufficient password quality" = "Ändringen av lösendordet misslyckades - Otillräcklig kvalitet pÃ¥ lösenordet"; "Password change failed - Password is too short" = "Ändringen av lösendordet misslyckades - Lösenordet är för kort"; "Password change failed - Password is too young" = "Ändringen av lösendordet misslyckades - Lösenordet har använts för kort tid"; "Password change failed - Password is in history" = "Ändringen av lösendordet misslyckades - Lösenordet har använts tidigare"; "Unhandled policy error: %{0}" = "Ohanterat behörighetsfel har inträffat: %{0}"; "Unhandled error response" = "Ohanterat fel har inträffat"; "Password change is not supported." = "Stöd saknas för ändring av lösenord."; "Unhandled HTTP error code: %{0}" = "Ohanterat HTTP felkod: %{0}"; "New password:" = "Nytt lösenord:"; "Confirmation:" = "Bekräfta:"; "Cancel" = "Avbryt"; "Please wait..." = "Var god vänta..."; SOGo-2.1.1b/UI/MainUI/Danish.lproj/0000755000000000000000000000000012247657027015170 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Danish.lproj/Locale0000644000000000000000000000303612247657027016314 0ustar rootroot/* Danish */ { NSLanguageName = "Danish (Denmark)"; NSFormalName = "Danish"; NSLocaleCode = "da_DK"; /* ISO 639-1 */ NSLanguageCode = "dan"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = "$"; NSDateFormatString = "%A, %B %e, %Y"; NSDateTimeOrdering = MDYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = (prior, last, past, ago); NSHourNameDesignations = ((0, midnight), (10, morning), (12, noon, lunch), (14, afternoon), (19, dinner)); NSInternationalCurrencyString = USD; /* ISO 4217 */ NSLaterTimeDesignations = (next); NSMonthNameArray = (January, February, March, April, May, June, July, August, September, October, November, December); NSNextDayDesignations = (tomorrow); NSNextNextDayDesignations = (nextday); NSPriorDayDesignations = (yesterday); NSShortDateFormatString = "%m/%e/%y"; NSShortMonthNameArray = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); NSShortTimeDateFormatString = "%m/%e/%y %I:%M %p"; NSShortWeekDayNameArray = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); NSThisDayDesignations = (today, now); NSThousandsSeparator = ","; NSTimeDateFormatString = "%A, %B %e, %Y %I:%M:%S %p %Z"; NSTimeFormatString = "%I:%M:%S %p"; NSWeekDayNameArray = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday); NSYearMonthWeekDesignations = (year, month, week); NSPositiveCurrencyFormatString = "$9,999.00"; NSNegativeCurrencyFormatString = "-$9,999.00"; } SOGo-2.1.1b/UI/MainUI/Danish.lproj/Localizable.strings0000644000000000000000000001101012247657027021015 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "Sogo"; "Username:" = "Brugernavn:"; "Password:" = "Adgangskode:"; "Domain:" = "Domæne:"; "Remember username" = "Husk brugernavn"; "Connect" = "Tilslut"; "Wrong username or password." = "Forkert brugernavn eller adgangskode."; "cookiesNotEnabled" = "Du kan ikke logge ind fordi din browsers cookies er slÃ¥et fra. Du skal aktivere cookies i din browsers indstillinger og derefter prøve igen."; "browserNotCompatible" = "Vi har registreret, at din browsers version ikke understøttes pÃ¥ denne hjemmeside. Vores anbefaling er at bruge Firefox. Klik pÃ¥ linket nedenfor for at downloade den nyeste version af denne browser."; "alternativeBrowsers" = "Alternativt kan du ogsÃ¥ bruge følgende kompatible browsere"; "alternativeBrowserSafari" = "Alternativt kan du ogsÃ¥ bruge Safari."; "Download" = "Download"; "Language:" = "Sprog:"; "choose" = "Vælg ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk"; "NorwegianNynorsk" = "Nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Spansk (Spanien)"; "SpanishArgentina" = "Spansk (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Om"; "AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

⎠SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

⎠SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

⎠See this page for various support options."; "Your account was locked due to too many failed attempts." = "Din konto er lÃ¥st pÃ¥ grund af for mange mislykkede forsøg."; "Your account was locked due to an expired password." = "Din konto er lÃ¥st pÃ¥ grund af en udløbet adgangskode."; "Login failed due to unhandled error case: " = "Login mislykkedes pÃ¥ grund af denne fejl:"; "Change your Password" = "Skift din adgangskode"; "The password was changed successfully." = "Adgangskoden er ændret."; "Your password has expired, please enter a new one below:" = "Din adgangskode er udløbet, indtast venligst et nyt nedenfor:"; "Password must not be empty." = "Adgangskode mÃ¥ ikke være tomt."; "The passwords do not match. Please try again." = "De indtastede adgangskoder stemmer ikke overens. Prøv venligst igen."; "Password Grace Period" = "Adgangskodens varighed"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Du har %{0} loginforsøg tilbage, før din konto bliver lÃ¥st. Vær venlig at ændre din adgangskode i dialogboksen."; "Password about to expire" = "Adgangskode er ved at udløbe"; "Your password is going to expire in %{0} %{1}." = "Din adgangskode udløber om %{0}%{1}."; "days" = "dage"; "hours" = "timer"; "minutes" = "minutter"; "seconds" = "sekunder"; "Password change failed" = "Ændring af adgangskode mislykkedes"; "Password change failed - Permission denied" = "Ændring af adgangskode mislykkedes - Adgang nægtet"; "Password change failed - Insufficient password quality" = "Ændring af adgangskode mislykkedes - Utilstrækkelig adgangskode kvalitet"; "Password change failed - Password is too short" = "Ændring af adgangskode mislykkedes - adgangskoden er for kort"; "Password change failed - Password is too young" = "Ændring af adgangskode mislykkedes - Adgangskoden er brugt for nyligt"; "Password change failed - Password is in history" = "Ændring af adgangskode mislykkedes - Adgangskoden er i historikken"; "Unhandled policy error: %{0}" = "Fejl: %{0}"; "Unhandled error response" = "fejlreaktion"; "Password change is not supported." = "Ændring af adgangskoden er ikke understøttet."; "Unhandled HTTP error code: %{0}" = "HTTP fejlkode: %{0}"; "New password:" = "Ny adgangskode:"; "Confirmation:" = "Bekræftelse:"; "Cancel" = "Annullér"; "Please wait..." = "Vent venligst ..."; SOGo-2.1.1b/UI/MainUI/Polish.lproj/0000755000000000000000000000000012247657027015220 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Polish.lproj/Locale0000644000000000000000000000325612247657027016350 0ustar rootroot/* Polish */ { NSLanguageName = "Polish"; NSFormalName = "Polski"; NSLocaleCode = "pl"; /* ISO 639-1 */ NSLanguageCode = "pol"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = "zÅ‚"; NSDateFormatString = "%A, %B %e %Y"; NSDateTimeOrdering = YMDH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = ("przed", "ostatni", "po", "temu"); NSHourNameDesignations = ((0, "północ"), (10, "rano"), (12, "poÅ‚udnie", "lunch"), (14, "popoÅ‚udnie"), (19, "wieczór")); NSInternationalCurrencyString = PLN; /* ISO 4217 */ NSLaterTimeDesignations = ("nastÄ™pny"); NSMonthNameArray = ("StyczeÅ„", "Luty", "Marzec", "KwiecieÅ„", "Maj", "Czerwiec", "Lipiec", "SierpieÅ„", "WrzesieÅ„", "Październik", "Listopad", "GrudzieÅ„"); NSNextDayDesignations = ("jutro"); NSNextNextDayDesignations = ("nastÄ™pny dzieÅ„"); NSPriorDayDesignations = ("wczoraj"); NSShortDateFormatString = "%e/%m/%y"; NSShortMonthNameArray = ("Sty", "Lut", "Mar", "Kwi", "Maj", "Cze", "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru"); NSShortTimeDateFormatString = "%y-%m-%e %H:%M"; NSShortWeekDayNameArray = ("Nie", "Pon", "Wto", "Åšro", "Czw", "PiÄ…", "Sob"); NSThisDayDesignations = ("dzisiaj", "teraz"); NSThousandsSeparator = " "; NSTimeDateFormatString = "%A, %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("Niedziela", "PoniedziaÅ‚ek", "Wtorek", "Åšroda", "Czwartek", "PiÄ…tek", "Sobota"); NSYearMonthWeekDesignations = ("rok", "miesiÄ…c", "tydzieÅ„"); NSPositiveCurrencyFormatString = "9,999.00$"; NSNegativeCurrencyFormatString = "-9,999.00$"; } SOGo-2.1.1b/UI/MainUI/Polish.lproj/Localizable.strings0000644000000000000000000001153212247657027021056 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Nazwa użytkownika:"; "Password:" = "HasÅ‚o:"; "Domain:" = "Domena:"; "Remember username" = "PamiÄ™taj nazwÄ™ użytkownika"; "Connect" = "Zaloguj"; "Wrong username or password." = "ZÅ‚a nazwa użytkownika lub hasÅ‚o."; "cookiesNotEnabled" = "Nie możesz siÄ™ zalogować ponieważ twoja przeglÄ…darka ma zablokowanÄ… obsÅ‚ugÄ™ ciasteczek (cookies). Włącz obsÅ‚ugÄ™ ciasteczek w ustawieniach twojej przeglÄ…darki i spróbuj ponownie."; "browserNotCompatible" = "Używasz przeglÄ…darki WWW, która nie jest obecnie obsÅ‚ugiwana przez tÄ™ stronÄ™. RekomendowanÄ… przeglÄ…darkÄ… jest Firefox. Kliknij poniższy odnoÅ›nik aby pobrać najnowszÄ… wersjÄ™ tej przeglÄ…darki."; "alternativeBrowsers" = "Alternatywnie możesz także używać nastÄ™pujÄ…cych przeglÄ…darek"; "alternativeBrowserSafari" = "Alternatywnie możesz używać również przeglÄ…darki Safari."; "Download" = "Pobierz"; "Language:" = "JÄ™zyk:"; "choose" = "Wybierz ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "O programie"; "AboutBox" = "SOGo, opracowane przez Inverse, jest bogato wyposażonym serwerem dla grup roboczych, w którym szczególnÄ… uwagÄ™ zwrócono na prostotÄ™ obsÅ‚ugi i skalowalność.

âŽSOGo udostÄ™pnia rozbudowany interfejs WWW, oparty na technologii AJAX i wspierajÄ…cy różne aplikacje pocztowe poprzez standardowe protokoÅ‚y takie jak CalDAV i CardDAV.

âŽSOGo udostÄ™pnione jest na licencji GNU GPL w wersji 2 lub nowszej, a niektóre fragmenty na licencji GNU LGPL w wersji 2. To jest wolne oprogramowanie - możesz je dowolnie modyfikować oraz rozpowszechniać. Oprogramowanie to NIE MA GWARANCJI, w zakresie dopuszczalnym przez prawo.

⎠W poszukiwaniu pomocy technicznej sprawdź tÄ… stronÄ™."; "Your account was locked due to too many failed attempts." = "Twoje konto zostaÅ‚o zablokowane wkutek zbyt wielu nieudanych prób logowania."; "Your account was locked due to an expired password." = "Twoje konto zostaÅ‚o zblokowane z powodu wygaÅ›niÄ™cia ważnoÅ›ci hasÅ‚a."; "Login failed due to unhandled error case: " = "Logowanie nie powiodÅ‚o siÄ™ z powodu niezidentyfikowanego błędu: "; "Change your Password" = "ZmieÅ„ swoje hasÅ‚o"; "The password was changed successfully." = "HasÅ‚o zostaÅ‚o zmienione."; "Your password has expired, please enter a new one below:" = "Ważność twojego hasÅ‚a wygasÅ‚a, wprowadź niżej nowe hasÅ‚o:"; "Password must not be empty." = "HasÅ‚o nie może być puste."; "The passwords do not match. Please try again." = "HasÅ‚a nie sÄ… zgodne. Spróbuj jeszcze raz."; "Password Grace Period" = "Okres pobÅ‚ażliwoÅ›ci hasÅ‚a"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "PozostaÅ‚o Ci %{0} logowaÅ„ zanim konto zostanie zablokowane. ZmieÅ„ swoje hasÅ‚o w oknie wÅ‚aÅ›ciwoÅ›ci."; "Password about to expire" = "Wkrótce wygaÅ›nie ważność hasÅ‚a"; "Your password is going to expire in %{0} %{1}." = "Ważność twojego hasÅ‚a wygaÅ›nie za %{0} %{1}."; "days" = "dni"; "hours" = "godz."; "minutes" = "min."; "seconds" = "sek."; "Password change failed" = "Zmiana hasÅ‚a nie powiodÅ‚a siÄ™"; "Password change failed - Permission denied" = "Zmiana hasÅ‚a nie powiodÅ‚a siÄ™ - odmowa dostÄ™pu"; "Password change failed - Insufficient password quality" = "Zmiana hasÅ‚a nie powiodÅ‚a siÄ™ - niewystarczajÄ…ca jakość hasÅ‚a"; "Password change failed - Password is too short" = "Zmiana hasÅ‚a nie powiodÅ‚a siÄ™ - hasÅ‚o jest zbyt krótkie"; "Password change failed - Password is too young" = "Zmiana hasÅ‚a nie powiodÅ‚a siÄ™ - hasÅ‚o jest zbyt Å›wieże"; "Password change failed - Password is in history" = "Zmiana hasÅ‚a nie powiodÅ‚a siÄ™ - hasÅ‚o znajduje siÄ™ w historii"; "Unhandled policy error: %{0}" = "Niezidentyfikowany błąd zabezpieczeÅ„: %{0}"; "Unhandled error response" = "Niezidentyfikowany błąd"; "Password change is not supported." = "Zmiana hasÅ‚a nie jest obsÅ‚ugiwana."; "Unhandled HTTP error code: %{0}" = "NieobsÅ‚ugiwany kod błędu HTTP: %{0}"; "New password:" = "Nowe hasÅ‚o:"; "Confirmation:" = "Potwierdzenie:"; "Cancel" = "Anuluj"; "Please wait..." = "Zaczekaj proszÄ™..."; SOGo-2.1.1b/UI/MainUI/UIxLoading.m0000644000000000000000000000223512247657027015020 0ustar rootroot/* UIxLoading.m - this file is part of SOGo * * Copyright (C) 2011 Inverse inc. * * Author: Francis Lachapelle * * 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 "UIxLoading.h" @implementation UIxLoading - (NSString *) doctype { return (@"\n" @""); } @end SOGo-2.1.1b/UI/MainUI/MainUIProduct.m0000644000000000000000000000253212247657027015500 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import @interface MainUIProduct : NSObject { } @end #import @implementation MainUIProduct + (NSString *)pathToLocaleForLanguageNamed:(NSString *)_name { // TODO: this is kind of a hack, we reuse the class registry to find // resources ... NSBundle *bundle; NSString *ldir, *path; bundle = [NSBundle bundleForClass:self]; ldir = [_name stringByAppendingPathExtension:@"lproj"]; path = [bundle pathForResource:@"Locale" ofType:nil inDirectory:ldir]; return path; } @end /* MainUIProduct */ SOGo-2.1.1b/UI/MainUI/OCSFolderInfo.sql0000644000000000000000000000150012247657027015746 0ustar rootroot-- -- (C) 2004-2005 SKYRIX Software AG -- (C) 2006-2007 Inverse inc. -- CREATE TABLE @{tableName} ( c_folder_id SERIAL, c_path VARCHAR(255) PRIMARY KEY, -- the full path to the folder c_path1 VARCHAR(255) NOT NULL, -- parts (for fast queries) c_path2 VARCHAR(255) NULL, -- parts (for fast queries) c_path3 VARCHAR(255) NULL, -- parts (for fast queries) c_path4 VARCHAR(255) NULL, -- parts (for fast queries) c_foldername VARCHAR(255) NOT NULL, -- last path component c_location VARCHAR(2048) NOT NULL, -- URL to folder c_quick_location VARCHAR(2048) NULL, -- URL to quicktable of folder c_acl_location VARCHAR(2048) NULL, -- URL to quicktable of folder c_folder_type VARCHAR(255) NOT NULL -- the folder type ... ); SOGo-2.1.1b/UI/MainUI/Hungarian.lproj/0000755000000000000000000000000012247657027015676 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Hungarian.lproj/Locale0000644000000000000000000000315412247657027017023 0ustar rootroot/* Hungarian */ { NSLanguageName = "Magyar"; NSFormalName = "Magyar"; NSLocaleCode = "hu"; /* ISO 639-1 */ NSLanguageCode = "hun"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = "Ft"; NSDateFormatString = "%Y %B %e, %A"; NSDateTimeOrdering = YMDH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = ("elÅ‘tte", "elÅ‘zÅ‘", "késÅ‘bb", "korábban"); NSHourNameDesignations = ((0, "éjfél"), (10, reggel), (12, "dél"), (14, "délután"), (19, este)); NSInternationalCurrencyString = HUF; /* ISO 4217 */ NSLaterTimeDesignations = ("késÅ‘bb"); NSMonthNameArray = ("Január", "Február", "Március", "Ãprilis", "Május", "Június", "Július", Augusztus, Szeptember, "Október", November, December); NSNextDayDesignations = (holnap); NSNextNextDayDesignations = ("holnapután"); NSPriorDayDesignations = (tegnap); NSShortDateFormatString = "%y.%m.%e"; NSShortMonthNameArray = (Jan, Feb, "Már", "Ãpr", "Máj", "Jún", "Júl", Aug, Szep, Okt, Nov, Dec); NSShortTimeDateFormatString = "%y.%m.%e %H:%M"; NSShortWeekDayNameArray = (Vas, "Hét", Ked, Sze, "Csü", "Pén", Szo); NSThisDayDesignations = (ma, most); NSThousandsSeparator = " "; NSTimeDateFormatString = "%Y %B %e, %A %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("Vasárnap", "HétfÅ‘", Kedd, Szerda, "Csütörtök", "Péntek", Szombat); NSYearMonthWeekDesignations = (year, month, week); NSPositiveCurrencyFormatString = "9 999,00 Ft"; NSNegativeCurrencyFormatString = "-9 999,00 Ft"; } SOGo-2.1.1b/UI/MainUI/Hungarian.lproj/Localizable.strings0000644000000000000000000001156712247657027021544 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Felhasználó:"; "Password:" = "Jelszó:"; "Domain:" = "Tartomány:"; "Remember username" = "Felhasználónév megjegyzése"; "Connect" = "Kapcsolódás"; "Wrong username or password." = "Hibás felhasználónév vagy jelszó."; "cookiesNotEnabled" = "Nem tud bejelentkezni, mivel a böngészÅ‘jében a cookie-k ki vannak kapcsolva. Kérem engedélyezze a cookie-kat a böngészÅ‘je beállításaiban, majd próbálja újra."; "browserNotCompatible" = "A böngészÅ‘je nem támogatja ennek az oldalnak a megjelnítését. Javasoljuk a Firefox használatát. Kattintson az alábbi hivatkozásra a legújabb verzió letöltéséhez."; "alternativeBrowsers" = "További megoldásként az alábbi, kompatibilis böngészÅ‘ket használhatja"; "alternativeBrowserSafari" = "A Safari böngészÅ‘ is használható."; "Download" = "Letöltés"; "Language:" = "Nyelv:"; "choose" = "Válasszon ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Névjegy"; "AboutBox" = "Az Inverse által fejlesztett SOGo egy teljes funkcionalitású csoportmunka kiszolgáló, melynek fÅ‘ célkitűzései az egyszerűség és az igény szerinti növekedés (skálázhatóság).

\nA SOGo egy AJAX alapú modern webes felhasználói felületet biztosít, továbbá szabványos protokolok alkalmazásával, mint pl. CalDAV, CardDAV támogatja telepített alkalmazások használatát is.

\nA SOGo a GNU GPL 2. ill. magasabb verziói, továbbá egyes részei a GNU LGPL 2. verziója alatt kerül kiadásra. Ez egy ingyenes szoftver, a módosítása és újra kiadása megengedett.NINCS GARANCIA, a törvény által megengedett mértékben.

âŽ\nLátogassa meg ezt az oldalt a különbözÅ‘ támogatási lehetÅ‘ségek megismeréséhez. "; "Your account was locked due to too many failed attempts." = "A fiókja zárolva lett a túl sok sikertelen belépési kísérlet miatt."; "Your account was locked due to an expired password." = "A fiókja zárolva lett a lejért jelszó miatt."; "Login failed due to unhandled error case: " = "A bejelentkezés sikertelen volt az alábbi nem kezelt hiba miatt: "; "Change your Password" = "Változtassa meg jelszavát"; "The password was changed successfully." = "A jelszó megváltoztatása sikeres."; "Your password has expired, please enter a new one below:" = "A jelszava lejárt, kérem adjon meg egy újat:"; "Password must not be empty." = "A jelszó nem lehet üres."; "The passwords do not match. Please try again." = "Jelszavak nem egyeznek meg, kérem próbálja meg újra."; "Password Grace Period" = "Jelszóváltoztatás türelmi idÅ‘szak"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Önnek %{0} bejelentkezése maradt mielÅ‘tt a fiókja zárolásra kerül. Kérem változtassa meg a jelszavát a beállítások űrlapon."; "Password about to expire" = "A jelszava hamarosan lejár"; "Your password is going to expire in %{0} %{1}." = "A jelszava az alábbi idÅ‘pontban jár le: %{0} %{1}."; "days" = "nap"; "hours" = "óra"; "minutes" = "perc"; "seconds" = "másodperc"; "Password change failed" = "Jelszó változtatása sikertelen"; "Password change failed - Permission denied" = "Jelszó változtatása sikertelen - hozzáférés megtagadva"; "Password change failed - Insufficient password quality" = "Jelszó változtatása sikertelen - a jelszó erÅ‘ssége nem megfelelÅ‘"; "Password change failed - Password is too short" = "Jelszó változtatása sikertelen - a jelszó túl rövid"; "Password change failed - Password is too young" = "Jelszó változtatása sikertelen - a jelszó túl egyszerű"; "Password change failed - Password is in history" = "Jelszó változtatása sikertelen - korábbi jelszó nem használható "; "Unhandled policy error: %{0}" = "Nem kezelt jogosultsági hiba: %{0}"; "Unhandled error response" = "Nem kezelt hiba"; "Password change is not supported." = "A jelszó megváltoztatása nem támogatott."; "Unhandled HTTP error code: %{0}" = "Nem kezelt HTTP hibakód: /{0}"; "New password:" = "Új jelszó:"; "Confirmation:" = "MegerÅ‘sítés:"; "Cancel" = "Törlés"; "Please wait..." = "Kérem várjon ..."; SOGo-2.1.1b/UI/MainUI/English.lproj/0000755000000000000000000000000012247657027015353 5ustar rootrootSOGo-2.1.1b/UI/MainUI/English.lproj/Locale0000644000000000000000000000302412247657027016474 0ustar rootroot/* English */ { NSLanguageName = "English"; NSFormalName = "English"; NSLocaleCode = "en"; /* ISO 639-1 */ NSLanguageCode = "eng"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = "$"; NSDateFormatString = "%A, %B %e, %Y"; NSDateTimeOrdering = MDYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = (prior, last, past, ago); NSHourNameDesignations = ((0, midnight), (10, morning), (12, noon, lunch), (14, afternoon), (19, dinner)); NSInternationalCurrencyString = USD; /* ISO 4217 */ NSLaterTimeDesignations = (next); NSMonthNameArray = (January, February, March, April, May, June, July, August, September, October, November, December); NSNextDayDesignations = (tomorrow); NSNextNextDayDesignations = (nextday); NSPriorDayDesignations = (yesterday); NSShortDateFormatString = "%m/%e/%y"; NSShortMonthNameArray = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); NSShortTimeDateFormatString = "%m/%e/%y %I:%M %p"; NSShortWeekDayNameArray = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); NSThisDayDesignations = (today, now); NSThousandsSeparator = ","; NSTimeDateFormatString = "%A, %B %e, %Y %I:%M:%S %p %Z"; NSTimeFormatString = "%I:%M:%S %p"; NSWeekDayNameArray = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday); NSYearMonthWeekDesignations = (year, month, week); NSPositiveCurrencyFormatString = "$9,999.00"; NSNegativeCurrencyFormatString = "-$9,999.00"; } SOGo-2.1.1b/UI/MainUI/English.lproj/Localizable.strings0000644000000000000000000001061012247657027021205 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Username:"; "Password:" = "Password:"; "Domain:" = "Domain:"; "Remember username" = "Remember username"; "Connect" = "Connect"; "Wrong username or password." = "Wrong username or password."; "cookiesNotEnabled" = "You cannot login because your browser's cookies are disabled. Please enable cookies in your browser's settings and try again."; "browserNotCompatible" = "We've detected that your browser version is currently not supported on this site. Our recommendation is to use Firefox. Click on the link below to download the most current version of this browser."; "alternativeBrowsers" = "Alternatively, you can also use the following compatible browsers"; "alternativeBrowserSafari" = "Alternatively, you can also use Safari."; "Download" = "Download"; "Language:" = "Language:"; "choose" = "Choose ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "About"; "AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

See this page for various support options."; "Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; "Your account was locked due to an expired password." = "Your account was locked due to an expired password."; "Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; "Change your Password" = "Change your Password"; "The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; "Password must not be empty." = "Password must not be empty."; "The passwords do not match. Please try again." = "The passwords do not match. Please try again."; "Password Grace Period" = "Password Grace Period"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; "Password about to expire" = "Password about to expire"; "Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; "days" = "days"; "hours" = "hours"; "minutes" = "minutes"; "seconds" = "seconds"; "Password change failed" = "Password change failed"; "Password change failed - Permission denied" = "Password change failed - Permission denied"; "Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; "Password change failed - Password is too short" = "Password change failed - Password is too short"; "Password change failed - Password is too young" = "Password change failed - Password is too young"; "Password change failed - Password is in history" = "Password change failed - Password is in history"; "Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; "Unhandled error response" = "Unhandled error response"; "Password change is not supported." = "Password change is not supported."; "Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; "Please wait..." = "Please wait..."; SOGo-2.1.1b/UI/MainUI/Catalan.lproj/0000755000000000000000000000000012247657027015325 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Catalan.lproj/Locale0000644000000000000000000000330512247657027016450 0ustar rootroot/* Catalan */ /* this file is in UTF-8 format! */ /* Author: erny@yaco.es */ /* Based on: rev 1397 */ /* Last update: 2008-04-02 */ { NSLanguageName = "Catalan"; NSFormalName = "Català"; NSLocaleCode = "ca"; /* ISO 639-1 */ NSLanguageCode = "cat; Catalan"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = "€"; NSDateFormatString = "%A %e %B %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = ("passat","últim","anterior"); NSHourNameDesignations = ((0, "mitjanit"), (10, "matí"), (12, "migdia"), (14, "tarda"), (20, "vespre"), (22, "nit")); NSInternationalCurrencyString = EUR; /* ISO 4217 */ NSLaterTimeDesignations = ("que ve","següent"); NSMonthNameArray = (gener, febrer, marc, abril, maig, juny, juliol, agost, setembre, octubre, novembre, desembre); NSNextDayDesignations = ("demà"); NSNextNextDayDesignations = ("demà passat"); NSPriorDayDesignations = (ahir); NSShortDateFormatString = "%e/%m/%y"; NSShortMonthNameArray = (gen, feb, marc, abr, maig, juny, jul, ag, set, oct, nov, des); NSShortTimeDateFormatString = "%e/%m/%y %H:%M"; NSShortWeekDayNameArray = ("dg", "dl", "dt", "dc", "dj", "dV", "ds"); NSThisDayDesignations = ("avui"); NSThousandsSeparator = "."; NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte"); NSYearMonthWeekDesignations = ("any", "mes", "setmana"); NSPositiveCurrencyFormatString = "$9,999.00$"; NSNegativeCurrencyFormatString = "-$9,999.00$"; } SOGo-2.1.1b/UI/MainUI/Catalan.lproj/Localizable.strings0000644000000000000000000001113512247657027021162 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Usuari:"; "Password:" = "Contrasenya:"; "Domain:" = "Domini:"; "Remember username" = "recordar usuari"; "Connect" = "Connectar"; "Wrong username or password." = "Usuari o contrasenya incorrectes."; "cookiesNotEnabled" = "No us hi podeu connectar perquè les galetes estan deshabilitades. Habiliteu les galetes en el navegador i torneu a intentar-ho."; "browserNotCompatible" = "Aquesta versió del navegador no és compatible amb el sistema. Us recomanem l'ús de Firefox. Feu clic en l'enllaç següent per descarregar-vos la versió más recent d'aquest navegador."; "alternativeBrowsers" = "També podeu utilitza un d'aquests navegadors compatibles: "; "alternativeBrowserSafari" = "Safari."; "Download" = "Descàrrega"; "Language:" = "Llengua:"; "choose" = "Triar ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Informació"; "AboutBox" = "Desenvolupat per Inverse, Sogo és un servidor amb totes les funcions de treball en grup amb un enfocament en la escalabilitat i simplicitat.
⎠Sogo ofereix una rica interfície web basada en AJAX i suporta múltiples clients natius mitjançant l'ús de protocols estàndard, com CalDAV i CardDAV.
⎠Sogo es distribueix sota la GNU GPL versió 2 o posterior, i parts es distribueixen sota la llicència GNU LGPL versió 2. Aquest és programari lliure: és lliure de canviar i redistribuir. NO hi ha cap garantia, en la mesura permesa per la llei.
⎠Veure
aquesta pàgina per a les opcions de suport."; "Your account was locked due to too many failed attempts." = "El vostre compte ha estat bloquejat per un excés d'intents fallits."; "Your account was locked due to an expired password." = "El vostre compte ha estat bloquejat perquè la contrasenya ha caducat."; "Login failed due to unhandled error case: " = "Connexió fallida a causa d'un error inesperat: "; "Change your Password" = "Canvieu la contrasenya"; "The password was changed successfully." = "La contrasenya s'ha canviat correctament"; "Your password has expired, please enter a new one below:" = "La contrasenya ha caducat; introduïu-ne una de nova:"; "Password must not be empty." = "Heu d'escriure la contrasenya."; "The passwords do not match. Please try again." = "Les contrasenyes no coincideixen. Torneu-ho a intentar."; "Password Grace Period" = "Període de validesa de la contrasenya"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Us resten %{0} connexions abans que se us bloquegi el compte. Si us plau, canvieu la contrasenya en el panell de preferències."; "Password about to expire" = "La contrasenya està a punt de caducar"; "Your password is going to expire in %{0} %{1}." = "La contrasenya caducarà d'aquí a %{0} %{1}."; "days" = "dies"; "hours" = "hores"; "minutes" = "minuts"; "seconds" = "segons"; "Password change failed" = "Canvi de contrasenya sense èxit"; "Password change failed - Permission denied" = "Canvi de contrasenya no vàlid - Permís denegat"; "Password change failed - Insufficient password quality" = "Canvi de contrasenya no vàlid - Contrasenya massa simple"; "Password change failed - Password is too short" = "Canvi de contrasenya no vàlid - Contrasenya massa curta"; "Password change failed - Password is too young" = "Canvi de contrasenya no vàlid - Contrasenya massa recent"; "Password change failed - Password is in history" = "Canvi de contrasenya no vàlid - La contrasenya es troba en l'historial"; "Unhandled policy error: %{0}" = "Error en política no previst: %{0}"; "Unhandled error response" = "Error no previst"; "Password change is not supported." = "No s'admet canvi de contrasenyes."; "Unhandled HTTP error code: %{0}" = "Error HTTP no previst. Codi: %{0}"; "New password:" = "Contrasenya nova:"; "Confirmation:" = "Confirmació:"; "Cancel" = "Cancel·lar"; "Please wait..." = "Si us plau, espereu-vos..."; SOGo-2.1.1b/UI/MainUI/SOGoSAML2Actions.m0000644000000000000000000000720512247657027015706 0ustar rootroot/* SOGoSAML2Actions.m - this file is part of SOGo * * Copyright (C) 2012 Inverse inc * * 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 #import #import #import #import #import #import #import #import #import #import #import @interface SOGoSAML2Actions : WODirectAction @end @implementation SOGoSAML2Actions - (WOResponse *) saml2MetadataAction { WOResponse *response; NSString *metadata; response = [context response]; [response setHeader: @"application/xml; charset=utf-8" forKey: @"content-type"]; metadata = [SOGoSAML2Session metadataInContext: context]; [response setContentEncoding: NSUTF8StringEncoding]; [response appendContentString: metadata]; return response; } - (WOCookie *) _authLocationResetCookieWithName: (NSString *) cookieName { WOCookie *locationCookie; NSString *appName; WORequest *rq; NSCalendarDate *date; rq = [context request]; locationCookie = [WOCookie cookieWithName: cookieName value: [rq uri]]; appName = [rq applicationName]; [locationCookie setPath: [NSString stringWithFormat: @"/%@/", appName]]; date = [NSCalendarDate calendarDate]; [date setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @"GMT"]]; [locationCookie setExpires: [date yesterday]]; return locationCookie; } - (WOResponse *) saml2SignOnPOSTAction { WORequest *rq; WOResponse *response; SoApplication *application; SOGoSAML2Session *newSession; WOCookie *authCookie; NSString *login, *oldLocation, *newLocation; SOGoWebAuthenticator *auth; rq = [context request]; if ([[rq method] isEqualToString: @"POST"]) { newSession = [SOGoSAML2Session SAML2SessionInContext: context]; [newSession processAuthnResponse: [rq formValueForKey: @"SAMLResponse"]]; login = [newSession login]; application = [SoApplication application]; auth = [application authenticatorInContext: context]; authCookie = [auth cookieWithUsername: login andPassword: [newSession identifier] inContext: context]; oldLocation = [[context clientObject] baseURLInContext: context]; newLocation = [NSString stringWithFormat: @"%@/%@", oldLocation, [login stringByEscapingURL]]; response = [context response]; [response setStatus: 302]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; [response setHeader: newLocation forKey: @"location"]; [response addCookie: authCookie]; } return response; } @end SOGo-2.1.1b/UI/MainUI/GNUmakefile.preamble0000644000000000000000000000042012247657027016471 0ustar rootroot# compile settings ADDITIONAL_CPPFLAGS += \ -DSOGO_MAJOR_VERSION=$(MAJOR_VERSION) \ -DSOGO_MINOR_VERSION=$(MINOR_VERSION) \ -DSOGO_SUBMINOR_VERSION=$(SUBMINOR_VERSION) ifeq ($(HAS_LIBRARY_lasso), yes) ADDITIONAL_CPPFLAGS += $(LASSO_CFLAGS) endif SOGo-2.1.1b/UI/MainUI/SpanishSpain.lproj/0000755000000000000000000000000012247657027016362 5ustar rootrootSOGo-2.1.1b/UI/MainUI/SpanishSpain.lproj/Locale0000644000000000000000000000315012247657027017503 0ustar rootroot/* Spanish */ { NSLanguageName = "Spanish"; NSFormalName = "Castellano"; NSLocaleCode = "es"; /* ISO 639-1 */ NSLanguageCode = "spa; Castillan"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = "€"; NSDateFormatString = "%A %e %B %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = ("pasado","último","anterior"); NSHourNameDesignations = ((0, "medianoche"), (10, "mañana"), (12, "mediodía"), (14, "tarde"), (19, "noche")); NSInternationalCurrencyString = EUR; /* ISO 4217 */ NSLaterTimeDesignations = ("próximo","siguiente","que viene"); NSMonthNameArray = (Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre); NSNextDayDesignations = ("mañana"); NSNextNextDayDesignations = ("pasado mañana"); NSPriorDayDesignations = (ayer); NSShortDateFormatString = "%e/%m/%y"; NSShortMonthNameArray = (Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic); NSShortTimeDateFormatString = "%e/%m/%y %H:%M"; NSShortWeekDayNameArray = ("Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"); NSThisDayDesignations = ("hoy"); NSThousandsSeparator = "."; NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"); NSYearMonthWeekDesignations = ("año", "mes", "semana"); NSPositiveCurrencyFormatString = "$9,999.00$"; NSNegativeCurrencyFormatString = "-$9,999.00$"; } SOGo-2.1.1b/UI/MainUI/SpanishSpain.lproj/Localizable.strings0000644000000000000000000001144312247657027022221 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Usuario:"; "Password:" = "Contraseña:"; "Domain:" = "Dominio:"; "Remember username" = "Recordar usuario"; "Connect" = "Conectar"; "Wrong username or password." = "Nombre de usuario o contraseña incorrectos."; "cookiesNotEnabled" = "No se puede conectar dado que su navegador no acepta cookies. Por favor, habilite las cookies en la configuración de su navegador y pruebe de nuevo."; "browserNotCompatible" = "Hemos detectado que éste sistema no soporta su versión del navegador. Recomendamos usar Firefox. Haga click en el siguiente enlace para descargar la versión más reciente de este navegador."; "alternativeBrowsers" = "Como alternativa, también puede usar uno se los siguientes navegadores compatibles: "; "alternativeBrowserSafari" = "Como alternativa, puede usar Safari."; "Download" = "Descarga"; "Language:" = "Idioma:"; "choose" = "Elija ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Acerca de"; "AboutBox" = "Desarrollado por Inverse, SOGo es un servidor groupware (software colaborativo) con todas las características necesarias con un focus para simlicidad y capacidad de ampliación.

\nSOGo facilita una interface web rica basada en AJAX Web y soporta una multitud de clientes a través del soporte de protocolos estándares como CalDAV y CardDAV.

\nSOGo esta distribuido bajo
GNU GPL versión 2 o siguiente, y partes bajo la licencia GNU LGPL versión 2. Esto es software libre: esta autorizado el cambio y la redistribución del mismo. No hay garantías, dentro del límite de la ley.

\nVer esta página para las diferentes opciones de soporte."; "Your account was locked due to too many failed attempts." = "Su cuenta ha sido bloqueada debido a un número excesivo de errores de conexión."; "Your account was locked due to an expired password." = "Su cuenta ha sido bloqueada debido a una contraseña caducada."; "Login failed due to unhandled error case: " = "Conexión fallida debido a un error desconocido: "; "Change your Password" = "Cambie su contraseña"; "The password was changed successfully." = "La contraseña se ha cambiado correctamente."; "Your password has expired, please enter a new one below:" = "Su contraseña ha caducado, por favor, introduzca una nueva abajo:"; "Password must not be empty." = "La contraseña no puede estar vacía."; "The passwords do not match. Please try again." = "La contraseña no es igual. Por favor, intentelo de nuevo."; "Password Grace Period" = "Periodo de gracia de contraseña"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Le quedan %{0} intentos de conexión antes de que su cuenta sea bloqueada. Por favor, cambie su contraseña en el diálogo de preferencias."; "Password about to expire" = "Contraseña a punto de caducar"; "Your password is going to expire in %{0} %{1}." = "Su contraseña caducará en %{0} %{1}."; "days" = "días"; "hours" = "horas"; "minutes" = "minutos"; "seconds" = "segundos"; "Password change failed" = "Cambio de contraseña fallido"; "Password change failed - Permission denied" = "Cambio de contraseña fallido - Permiso denegado"; "Password change failed - Insufficient password quality" = "Cambio de contraseña fallido - Calidad de la contraseña insuficiente"; "Password change failed - Password is too short" = "Cambio de contraseña fallido - Contraseña demasiado corta"; "Password change failed - Password is too young" = "Cambio de contraseña fallido - Contraseña demasiado reciente"; "Password change failed - Password is in history" = "Cambio de contraseña fallido - Contraseña existe en el histórico de contraseñas"; "Unhandled policy error: %{0}" = "error de política desatendido: %{0}"; "Unhandled error response" = "error de respuesta desatendido"; "Password change is not supported." = "Cambio de contraseña no soportado."; "Unhandled HTTP error code: %{0}" = "Codigo de Error HTTP desatendido: %{0}"; "New password:" = "Nueva contraseña:"; "Confirmation:" = "Confirmación:"; "Cancel" = "Cancelar"; "Please wait..." = "Por favor, espere..."; SOGo-2.1.1b/UI/MainUI/Dutch.lproj/0000755000000000000000000000000012247657027015031 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Dutch.lproj/Locale0000644000000000000000000000313512247657027016155 0ustar rootroot/* Dutch */ { NSLanguageName = "Dutch"; NSFormalName = "Nederlands"; NSLocaleCode = "nl"; /* ISO 639-1 */ NSLanguageCode = "nld"; /* ISO 639-2 */ NSParentContext = ""; NSCurrencySymbol = " €"; NSDateFormatString = "%A %e %B %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = (vorige, vorige, vorige, vorige); NSHourNameDesignations = ((0, Middernacht), (12, Middag), (10, Ochtend), (14, Namiddag), (19, Avond)); NSInternationalCurrencyString = EUR; /* ISO 4217 */ NSLaterTimeDesignations = (volgende, volgende, volgende, volgende); NSMonthNameArray = (Januari, Februari, Maart, April, Mei, Juni, Juli, Augustus, September, Oktober, November, December); NSNextDayDesignations = (morgen); NSNextNextDayDesignations = (overmorgen); NSPriorDayDesignations = (gisteren); NSShortDateFormatString = "%e/%m/%y"; NSShortMonthNameArray = (Jan, Feb, Maa, Apr, Mei, Jun, Jul, Aug, Sep, Okt, Nov, Dec); NSShortTimeDateFormatString = "%e/%m/%y %H:%M"; NSShortWeekDayNameArray = (Zo, Ma, Di, Wo, Do, Vr, Za); NSThisDayDesignations = (vandaag); NSThousandsSeparator = " "; /* space */ NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; /* no space before and after colons*/ NSWeekDayNameArray = (Zondag, Maandag, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag); NSYearMonthWeekDesignations = (Jaar, Maand, Week); NSAMPMDesignation = (AM, PM); NSPositiveCurrencyFormatString = "$ 9,999.00"; NSNegativeCurrencyFormatString = "$ -9,999.00"; } SOGo-2.1.1b/UI/MainUI/Dutch.lproj/Localizable.strings0000644000000000000000000001116112247657027020665 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Gebruikersnaam:"; "Password:" = "Wachtwoord:"; "Domain:" = "Domein:"; "Remember username" = "Onthoud gebruikersnaam"; "Connect" = "Inloggen"; "Wrong username or password." = "Onjuiste gebruikersnaam of wachtwoord."; "cookiesNotEnabled" = "U kunt niet inloggen omdat de browser geen cookies accepteert. Verander de cookie-instellingen van de browser en probeer het opnieuw."; "browserNotCompatible" = "We hebben gedetecteerd dat de browser die u op dit moment gebruikt niet word ondersteund voor deze site. Onze aanbeveling is Firefox te gebruiken. Hieronder staat een link om de laatste versie van deze browser te downloaden."; "alternativeBrowsers" = "Als alternatief kun u ook de volgende compatible browsers gebruiken."; "alternativeBrowserSafari" = "Als alternatief kunt u ook Safari gebruiken."; "Download" = "Download"; "Language:" = "Taal:"; "choose" = "Kies..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk BokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Over"; "AboutBox" = "SOGO is een volledig uitgeruste groupware server met focus op schaalbaarheid en eenvoud ontwikkeld door Inverse.

SOGO biedt een rijke AJAX-gebaseerde web-interface en ondersteunt meerdere native clients door gebruik van standaard protocollen als CalDAV en CardDAV.

SOGO wordt gedistribueerd onder de GNU GPL versie 2 of hoger en onderdelen worden verspreid onder de GNU LGPL versie 2. Dit is vrije software: je bent vrij om het te veranderen en verspreiden. Er is GEEN GARANTIE, voor zover toegestaan ​​door de wet.

Zie deze pagina voor diverse support opties."; "Your account was locked due to too many failed attempts." = "Uw account is geblokkeerd wegens te veel mislukte pogingen."; "Your account was locked due to an expired password." = "Uw account is geblokkeerd wegens een verlopen wachtwoord."; "Login failed due to unhandled error case: " = "Inloggen mislukt wegens onverwerkte fout:"; "Change your Password" = "Verander uw wachtwoord"; "The password was changed successfully." = "Het wachtwoord is met succes veranderd."; "Your password has expired, please enter a new one below:" = "Uw wachtwoord is verlopen, vul hieronder een nieuw wachtwoord in:"; "Password must not be empty." = "Wachtwoord mag niet leeg zijn."; "The passwords do not match. Please try again." = "De wachtwoorden komen niet overeen. Probeer het opnieuw."; "Password Grace Period" = "Wachtwoord-respijtperiode"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "U heeft nog %{0} logins voordat uw account is vergrendeld. Wijzig uw wachtwoord alstublieft in het dialoogvenster voorkeuren."; "Password about to expire" = "Wachtwoord vervalt bijna"; "Your password is going to expire in %{0} %{1}." = "Uw wachtwoord gaat verlopen in %{0}%{1}."; "days" = "dagen"; "hours" = "uren"; "minutes" = "minuten"; "seconds" = "seconden"; "Password change failed" = "Wachtwoordwijziging mislukt"; "Password change failed - Permission denied" = "Wachtwoordwijziging mislukt - Toestemming geweigerd"; "Password change failed - Insufficient password quality" = "Wachtwoordwijziging is mislukt - Wachtwoord heeft onvoldoende kwaliteit"; "Password change failed - Password is too short" = "Wachtwoordwijziging is mislukt - Wachtwoord is te kort"; "Password change failed - Password is too young" = "Wachtwoordwijziging is mislukt - Wachtwoord is te jong"; "Password change failed - Password is in history" = "Wachtwoord te wijzigen is mislukt - Wachtwoord zit in wachtwoordgeschiedenis"; "Unhandled policy error: %{0}" = "Onverwerkte beleidsfout: %{0}"; "Unhandled error response" = "Onverwerkte foutmelding"; "Password change is not supported." = "Wachtwoordwijziging wordt niet ondersteund."; "Unhandled HTTP error code: %{0}" = "Onverwerkte HTTP-foutcode: %{0}"; "New password:" = "Nieuw wachtwoord:"; "Confirmation:" = "Bevestiging:"; "Cancel" = "Annuleren"; "Please wait..." = "Een ogenblik geduld ..."; SOGo-2.1.1b/UI/MainUI/SOGoRootPage.h0000644000000000000000000000205112247657027015254 0ustar rootroot/* SOGoRootPage.h - this file is part of SOGo * * Copyright (C) 2007-2010 Inverse inc. * * 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 SOGOROOTPAGE_H #define SOGOROOTPAGE_H #import @interface SOGoRootPage : UIxComponent { id item; NSString *cookieLogin; } @end #endif /* SOGOROOTPAGE_H */ SOGo-2.1.1b/UI/MainUI/SOGoRootPage.m0000644000000000000000000004222212247657027015265 0ustar rootroot/* Copyright (C) 2006-2011 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with SOGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #if defined(SAML2_CONFIG) #import #endif /* SAML2_ENABLE */ #import #import #import #import #import #import "SOGoRootPage.h" @implementation SOGoRootPage - (id) init { if ((self = [super init])) { cookieLogin = nil; } return self; } - (void) dealloc { [cookieLogin release]; [super dealloc]; } /* accessors */ - (NSString *) connectURL { return [NSString stringWithFormat: @"%@/connect", [self applicationPath]]; } - (NSString *) cookieUsername { NSString *value; if (cookieLogin == nil) { value = [[context request] cookieValueForKey: @"SOGoLogin"]; cookieLogin = [value isNotNull]? [value stringByDecodingBase64] : @""; [cookieLogin retain]; } return cookieLogin; } - (BOOL) rememberLogin { return ([[self cookieUsername] length]); } - (WOCookie *) _cookieWithUsername: (NSString *) username { WOCookie *loginCookie; NSString *appName; NSCalendarDate *date; appName = [[context request] applicationName]; date = [NSCalendarDate calendarDate]; [date setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @"GMT"]]; if (username) { // Cookie expires in one month loginCookie = [WOCookie cookieWithName: @"SOGoLogin" value: [username stringByEncodingBase64] path: nil domain: nil expires: [date dateByAddingYears:0 months:1 days:0 hours:0 minutes:0 seconds:0] isSecure: NO]; } else { loginCookie = [WOCookie cookieWithName: @"SOGoLogin" value: nil]; [loginCookie setExpires: [date yesterday]]; } [loginCookie setPath: [NSString stringWithFormat: @"/%@/", appName]]; return loginCookie; } - (WOCookie *) _authLocationCookie: (BOOL) cookieReset withName: (NSString *) cookieName { WOCookie *locationCookie; NSString *appName; WORequest *rq; NSCalendarDate *date; rq = [context request]; locationCookie = [WOCookie cookieWithName: cookieName value: [rq uri]]; appName = [rq applicationName]; [locationCookie setPath: [NSString stringWithFormat: @"/%@/", appName]]; if (cookieReset) { date = [NSCalendarDate calendarDate]; [date setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @"GMT"]]; [locationCookie setExpires: [date yesterday]]; } return locationCookie; } // // // - (WOResponse *) _responseWithLDAPPolicyError: (int) error { NSDictionary *jsonError; jsonError = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: error] forKey: @"LDAPPasswordPolicyError"]; return [self responseWithStatus: 403 andJSONRepresentation: jsonError]; } // // // - (id ) connectAction { WOResponse *response; WORequest *request; WOCookie *authCookie; SOGoWebAuthenticator *auth; SOGoAppointmentFolders *calendars; SOGoUserDefaults *ud; SOGoSystemDefaults *sd; SOGoUser *loggedInUser; NSString *username, *password, *language, *domain, *remoteHost; NSArray *supportedLanguages; SOGoPasswordPolicyError err; int expire, grace; BOOL rememberLogin, b; err = PolicyNoError; expire = grace = -1; auth = [[WOApplication application] authenticatorInContext: context]; request = [context request]; username = [request formValueForKey: @"userName"]; password = [request formValueForKey: @"password"]; language = [request formValueForKey: @"language"]; rememberLogin = [[request formValueForKey: @"rememberLogin"] boolValue]; domain = [request formValueForKey: @"domain"]; /* this will always be set to something more or less useful by * [WOHttpTransaction applyAdaptorHeadersWithHttpRequest] */ remoteHost = [request headerForKey:@"x-webobjects-remote-host"]; if ((b = [auth checkLogin: username password: password domain: &domain perr: &err expire: &expire grace: &grace useCache: NO]) && (err == PolicyNoError) // no password policy && ((expire < 0 && grace < 0) // no password policy or everything is alright || (expire < 0 && grace > 0) // password expired, grace still permits login || (expire >= 0 && grace == -1))) // password about to expire OR ppolicy activated and passwd never changed { NSDictionary *json; [self logWithFormat: @"successful login from '%@' for user '%@' - expire = %d grace = %d", remoteHost, username, expire, grace]; json = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt: expire], @"expire", [NSNumber numberWithInt: grace], @"grace", nil]; response = [self responseWithStatus: 200 andJSONRepresentation: json]; if ([domain isNotNull]) { sd = [SOGoSystemDefaults sharedSystemDefaults]; if ([sd enableDomainBasedUID]) username = [NSString stringWithFormat: @"%@@%@", username, domain]; } authCookie = [auth cookieWithUsername: username andPassword: password inContext: context]; [response addCookie: authCookie]; supportedLanguages = [[SOGoSystemDefaults sharedSystemDefaults] supportedLanguages]; loggedInUser = [SOGoUser userWithLogin: username]; [context setActiveUser: loggedInUser]; if (language && [supportedLanguages containsObject: language]) { ud = [loggedInUser userDefaults]; [ud setLanguage: language]; [ud synchronize]; } calendars = [loggedInUser calendarsFolderInContext: context]; if ([calendars respondsToSelector: @selector (reloadWebCalendars:)]) [calendars reloadWebCalendars: NO]; } else { [self logWithFormat:@"Login from '%@' for user '%@' might not have worked - password policy: %d grace: %d expire: %d bound: %d", remoteHost, username, err, grace, expire, b]; response = [self _responseWithLDAPPolicyError: err]; } if (rememberLogin) [response addCookie: [self _cookieWithUsername: username]]; else [response addCookie: [self _cookieWithUsername: nil]]; return response; } - (NSDictionary *) _casRedirectKeys { NSDictionary *redirectKeys; NSURL *soURL; NSString *serviceURL; soURL = [[WOApplication application] soURL]; // appending 'index' to /SOGo/so/. Matches serviceURL sent by _pgtUrlFromURL serviceURL = [NSString stringWithFormat: @"%@index", [soURL absoluteString]]; redirectKeys = [NSDictionary dictionaryWithObject: serviceURL forKey: @"service"]; return redirectKeys; } - (id ) casProxyAction { SOGoCache *cache; WORequest *request; NSString *pgtId, *pgtIou; request = [context request]; pgtId = [request formValueForKey: @"pgtId"]; pgtIou = [request formValueForKey: @"pgtIou"]; if ([pgtId length] && [pgtIou length]) { cache = [SOGoCache sharedCache]; [cache setCASPGTId: pgtId forPGTIOU: pgtIou]; } return [self responseWithStatus: 200]; } - (id ) _casDefaultAction { WOResponse *response; NSString *login, *logoutRequest, *newLocation, *oldLocation, *ticket; SOGoCASSession *casSession; SOGoWebAuthenticator *auth; WOCookie *casCookie, *casLocationCookie; WORequest *rq; casCookie = nil; casLocationCookie = nil; newLocation = nil; login = [[context activeUser] login]; if ([login isEqualToString: @"anonymous"]) login = nil; if (!login) { rq = [context request]; ticket = [rq formValueForKey: @"ticket"]; if ([ticket length]) { casSession = [SOGoCASSession CASSessionWithTicket: ticket fromProxy: NO]; login = [casSession login]; if ([login length]) { auth = [[WOApplication application] authenticatorInContext: context]; casCookie = [auth cookieWithUsername: login andPassword: [casSession identifier] inContext: context]; [casSession updateCache]; newLocation = [rq cookieValueForKey: @"cas-location"]; /* login callback, we expire the "cas-location" cookie, created below */ casLocationCookie = [self _authLocationCookie: YES withName: @"cas-location"]; } } else { /* anonymous and no ticket, possibly a logout request from CAS * See: https://wiki.jasig.org/display/CASUM/Single+Sign+Out */ logoutRequest = [rq formValueForKey: @"logoutRequest"]; if ([logoutRequest length]) { [SOGoCASSession handleLogoutRequest: logoutRequest]; return [self responseWithStatus: 200]; } } } else ticket = nil; if (login) { /* We redirect the user to his "homepage" when newLocation could not be deduced from the "cas-location" cookie and the current action is not a login callback (ticket != nil). */ if (!newLocation || !ticket) { oldLocation = [[self clientObject] baseURLInContext: context]; newLocation = [NSString stringWithFormat: @"%@%@", oldLocation, [login stringByEscapingURL]]; } } else { newLocation = [SOGoCASSession CASURLWithAction: @"login" andParameters: [self _casRedirectKeys]]; casLocationCookie = [self _authLocationCookie: NO withName: @"cas-location"]; } response = [self redirectToLocation: newLocation]; if (casCookie) [response addCookie: casCookie]; if (casLocationCookie) [response addCookie: casLocationCookie]; return response; } #if defined(SAML2_CONFIG) - (id ) _saml2DefaultAction { WOResponse *response; NSString *login, *newLocation, *oldLocation; WOCookie *saml2LocationCookie; WORequest *rq; saml2LocationCookie = nil; newLocation = nil; login = [[context activeUser] login]; if ([login isEqualToString: @"anonymous"]) login = nil; if (login) { rq = [context request]; newLocation = [rq cookieValueForKey: @"saml2-location"]; if (newLocation) saml2LocationCookie = [self _authLocationCookie: YES withName: @"saml2-location"]; else { oldLocation = [[self clientObject] baseURLInContext: context]; newLocation = [NSString stringWithFormat: @"%@%@", oldLocation, [login stringByEscapingURL]]; } } else { newLocation = [SOGoSAML2Session authenticationURLInContext: context]; saml2LocationCookie = [self _authLocationCookie: NO withName: @"saml2-location"]; } response = [self redirectToLocation: newLocation]; if (saml2LocationCookie) [response addCookie: saml2LocationCookie]; return response; } #endif /* SAML2_CONFIG */ - (id ) _standardDefaultAction { NSObject *response; NSString *login, *oldLocation; login = [[context activeUser] login]; if ([login isEqualToString: @"anonymous"]) login = nil; if (login) { oldLocation = [[self clientObject] baseURLInContext: context]; response = [self redirectToLocation: [NSString stringWithFormat: @"%@%@", oldLocation, [login stringByEscapingURL]]]; } else { oldLocation = [[context request] uri]; if ([context clientObject] && ![oldLocation hasSuffix: @"/"] && ![oldLocation hasSuffix: @"/view"]) response = [self redirectToLocation: [NSString stringWithFormat: @"%@/", oldLocation]]; else response = self; } return response; } - (id ) defaultAction { NSString *authenticationType; id result; authenticationType = [[SOGoSystemDefaults sharedSystemDefaults] authenticationType]; if ([authenticationType isEqualToString: @"cas"]) result = [self _casDefaultAction]; #if defined(SAML2_CONFIG) else if ([authenticationType isEqualToString: @"saml2"]) result = [self _saml2DefaultAction]; #endif /* SAML2_CONFIG */ else result = [self _standardDefaultAction]; return result; } - (BOOL) isPublicInContext: (WOContext *) localContext { return YES; } - (NSString *) loginSuffix { return [[SOGoSystemDefaults sharedSystemDefaults] loginSuffix]; } - (BOOL) hasLoginSuffix { return ([[self loginSuffix] length]); } - (NSArray *) loginDomains { return [[SOGoSystemDefaults sharedSystemDefaults] loginDomains]; } - (BOOL) hasLoginDomains { return ([[self loginDomains] count] > 0); } - (void) setItem: (id) _item { ASSIGN (item, _item); } - (id) item { return item; } - (NSArray *) languages { return [[SOGoSystemDefaults sharedSystemDefaults] supportedLanguages]; } - (NSString *) languageText { NSString *text; text = [self labelForKey: item]; return text; } - (NSString *) version { NSString *aString; aString = [NSString stringWithString: SOGoVersion ]; return aString; } - (WOResponse *) changePasswordAction { NSString *username, *domain, *password, *newPassword, *value; NSDictionary *message; WOCookie *authCookie; NSArray *creds; SOGoUserManager *um; SOGoPasswordPolicyError error; SOGoSystemDefaults *sd; SOGoWebAuthenticator *auth; WOResponse *response; WORequest *request; request = [context request]; message = [[request contentAsString] objectFromJSONString]; auth = [[WOApplication application] authenticatorInContext: context]; value = [[context request] cookieValueForKey: [auth cookieNameInContext: context]]; creds = [auth parseCredentials: value]; [SOGoSession decodeValue: [SOGoSession valueForSessionKey: [creds objectAtIndex: 1]] usingKey: [creds objectAtIndex: 0] login: &username domain: &domain password: &password]; newPassword = [message objectForKey: @"newPassword"]; um = [SOGoUserManager sharedUserManager]; // This will also update the cached password in memcached. if ([um changePasswordForLogin: username inDomain: domain oldPassword: password newPassword: newPassword perr: &error]) { // We delete the previous session [SOGoSession deleteValueForSessionKey: [creds objectAtIndex: 1]]; if ([domain isNotNull]) { sd = [SOGoSystemDefaults sharedSystemDefaults]; if ([sd enableDomainBasedUID]) username = [NSString stringWithFormat: @"%@@%@", username, domain]; } response = [self responseWith204]; authCookie = [auth cookieWithUsername: username andPassword: newPassword inContext: context]; [response addCookie: authCookie]; } else response = [self _responseWithLDAPPolicyError: error]; return response; } @end /* SOGoRootPage */ SOGo-2.1.1b/UI/MainUI/Icelandic.lproj/0000755000000000000000000000000012247657027015635 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Icelandic.lproj/Locale0000644000000000000000000000324312247657027016761 0ustar rootroot/* Icelandic */ { NSLanguageName = "Icelandic"; NSFormalName = "Ãslenska"; NSLocaleCode = "is"; /* ISO 639-1 */ NSLanguageCode = "ice"; /* ISO 639-2 */ NSParentContext = ""; NSCurrencySymbol = " kr"; NSDateFormatString = "%A %e %B %Y"; NSDateTimeOrdering = YMDH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = ("áður", "seinasti", "fyrri"); NSHourNameDesignations = ((0, "miðnætti"), (10, "morgunn"), (12, "hádegi"), (14, "síðdegi"), (19, "kvöld")); NSInternationalCurrencyString = ISK; /* ISO 4217 */ NSLaterTimeDesignations = ("næsti"); NSMonthNameArray = ("Januar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Augúst", "September", "Október", "Nóvember", "Desember"); NSNextDayDesignations = ("á morgunn", "komandi", "næsti"); NSNextNextDayDesignations = ("hinn"); NSPriorDayDesignations = ("í gær"); NSShortDateFormatString = "%Y-%m-%d"; NSShortMonthNameArray = ("Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ãgú", "Sep", "Okt", "Nóv","Des"); NSShortTimeDateFormatString = "%Y-%m-%d %H:%M"; NSShortWeekDayNameArray = ("sun", "mán", "þri", "mið", "fim", "fös", "lau"); NSThisDayDesignations = ("í dag", "nú"); NSThousandsSeparator = " "; NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("sunnudagur", "mánudagur", "þriðjudagur", "miðvikudagur", "fimmtudagur", "föstudagur", "laugardagur"); NSYearMonthWeekDesignations = ("ár", "mánuður", "vika"); NSPositiveCurrencyFormatString = "9,999.00 $"; NSNegativeCurrencyFormatString = "-9,999.00 $"; } SOGo-2.1.1b/UI/MainUI/Icelandic.lproj/Localizable.strings0000644000000000000000000001112012247657027021464 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Notandanafn:"; "Password:" = "Lykilorð:"; "Domain:" = "Domain:"; "Connect" = "Tengjast"; "Wrong username or password." = "Rangt notandanafn eða lykilorð."; "cookiesNotEnabled" = "Innskráning mistókst vegna þess að slökkt er á smygildum (cookies) í vafranum. Leyfa þarf smygildi í vafranum og reyna svo aftur."; "browserNotCompatible" = "Sú útgáfa af vafra sem þú notar virðist ekki styðja þessa vefsíðu. Mælt er með að nota Firefox. Smella má á tengilinn að neðan til að hala niður nýjastu útgáfunni af þessum vafra."; "alternativeBrowsers" = "Einnig er hægt að nota eftirfarandi vafra"; "alternativeBrowserSafari" = "Einnig er hægt að nota Safari."; "Download" = "Hala niður"; "Language:" = "Tungumál:"; "choose" = "Velja..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Um"; "AboutBox" = "Hugbúnaðarþróun Inverse hefur framleitt SOGo sem er hópvinnukerfi með öllum þáttum og nýjungum, sem hefur það að markmiði að vera einfalt og skalast vel.

SOGo býður upp á auðugt vefviðmót sem byggt er á AJAX viðmóti og það styður fjölda af biðlaraforritum með því að nota staðlaðar samskiptareglur eins og t.d. CalDAV og CardDAV.

SOGo er dreift í samkvæmt hugbúnaðarleyfinu GNU GPL útgáfu 2 eða nýrri og sumum hlutum er dreift samkvæmt GNU LGPL útgáfu 2. Þetta er frjáls og opinn hugbúnaður: þér er frjálst að breyta honum og dreifa honum. Það er ENGIN ÃBYRGÃ, að því marki sem leyfilegt er, lögum samkvæmt.

Sjá þessa síðu til að skoða ýmsa möguleika á þjónustu."; "Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; "Your account was locked due to an expired password." = "Your account was locked due to an expired password."; "Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; "Change your Password" = "Breyta lykilorði"; "The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; "Password must not be empty." = "Password must not be empty."; "The passwords do not match. Please try again." = "The passwords do not match. Please try again."; "Password Grace Period" = "Password Grace Period"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; "Password about to expire" = "Password about to expire"; "Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; "days" = "daga"; "hours" = "klst."; "minutes" = "mínútur"; "seconds" = "sekúndur"; "Password change failed" = "Password change failed"; "Password change failed - Permission denied" = "Password change failed - Permission denied"; "Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; "Password change failed - Password is too short" = "Password change failed - Password is too short"; "Password change failed - Password is too young" = "Password change failed - Password is too young"; "Password change failed - Password is in history" = "Password change failed - Password is in history"; "Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; "Unhandled error response" = "Unhandled error response"; "Password change is not supported." = "Ekki er hægt að breyta lykilorði í póstkerfinu. Notið Ugluna."; "Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; "New password:" = "Nýtt lykilorð:"; "Confirmation:" = "Staðfesting:"; "Cancel" = "Hætta við"; "Please wait..." = "Augnablik..."; SOGo-2.1.1b/UI/MainUI/Arabic.lproj/0000755000000000000000000000000012247657027015143 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Arabic.lproj/Locale0000644000000000000000000000364212247657027016272 0ustar rootroot/* Arabic */ { NSLanguageName = "Arabic"; NSFormalName = "العربية"; NSLocaleCode = "ar"; /* ISO 639-1 */ NSLanguageCode = "ara"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = ("ص", "Ù…"); NSCurrencySymbol = "$"; NSDateFormatString = "%A, %B %e, %Y"; NSDateTimeOrdering = MDYH; NSDecimalDigits = ("Ù ", "Ù¡", "Ù¢", "Ù£", "Ù¤", "Ù¥", "Ù¦", "Ù§", "Ù¨", "Ù©"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = ("قبل", "آخر", "الماضي", "منذ"); NSHourNameDesignations = ((0, "منتص٠الليل"), (10, "صباحاÙ"), (12, "ظهراÙ", "الغداء"), (14, "عصراÙ"), (19, "عشاءاÙ")); NSInternationalCurrencyString = EGP; /* ISO 4217 */ NSLaterTimeDesignations = ("التالي"); NSMonthNameArray = ("يناير", "ÙØ¨Ø±Ø§ÙŠØ±", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوÙمبر", "ديسمبر"); NSNextDayDesignations = ("غدا"); NSNextNextDayDesignations = ("اليوم التالي"); NSPriorDayDesignations = ("أمس"); NSShortDateFormatString = "%m/%e/%y"; NSShortMonthNameArray = ("يناير", "ÙØ¨Ø±Ø§ÙŠØ±", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوÙمبر", "ديسمبر"); NSShortTimeDateFormatString = "%m/%e/%y %I:%M %p"; NSShortWeekDayNameArray = ("Ø­", "Ù†", "Ø«", "ر", "Ø®", "ج", "س"); NSThisDayDesignations = ("اليوم", "الآن"); NSThousandsSeparator = ","; NSTimeDateFormatString = "%A, %B %e, %Y %I:%M:%S %p %Z"; NSTimeFormatString = "%I:%M:%S %p"; NSWeekDayNameArray = ("الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"); NSYearMonthWeekDesignations = ("سنة", "شهر", "أسبوع"); NSPositiveCurrencyFormatString = "$9,999.00"; NSNegativeCurrencyFormatString = "-$9,999.00"; } SOGo-2.1.1b/UI/MainUI/Arabic.lproj/Localizable.strings0000644000000000000000000001315512247657027021004 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "سوجو"; "Username:" = "اسم المستخدم:"; "Password:" = "كلمة السر:"; "Domain:" = "النطاق:"; "Remember username" = "تذكر اسم المستخدم"; "Connect" = "اتصل"; "Wrong username or password." = "اسم المستخدم أو كلمة المرور خطأ."; "cookiesNotEnabled" = "لا يمكنك الدخول لأنه تم تعطيل الكوكيز Ø¨Ø§Ù„Ù…ØªØµÙØ­ الخاص بك . يرجى تمكين الكوكيز ÙÙŠ إعدادات Ø§Ù„Ù…ØªØµÙØ­ الخاص بك وحاول مرة أخرى."; "browserNotCompatible" = "لقد اكتشÙنا ان إصدار Ø§Ù„Ù…ØªØµÙØ­ الخاص بك غير معتمد على هذا الموقع. نحن نوصي بإستخدام ÙØ§ÙŠØ±Ùوكس. انقر على الرابط أدناه لتحميل الإصدار الأحدث من هذا Ø§Ù„Ù…ØªØµÙØ­."; "alternativeBrowsers" = "بدلا من ذلك، يمكنك أيضا استخدام Ø§Ù„Ù…ØªØµÙØ­Ø§Øª التالية المتواÙقة"; "alternativeBrowserSafari" = "بدلا من ذلك، يمكنك أيضا استخدام Ø³ÙØ§Ø±ÙŠ."; "Download" = "نزّÙÙ„"; "Language:" = "اللغة:"; "choose" = "إختار ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "حول"; "AboutBox" = "قام بالبرمجة شركة Ø¥Ù†ÙØ±Ø²ØŒ سوجو هو برنامج خدمي كامل المزايا مع التركيز على التوسع والبساطة.
âŽ\nسوجو ÙŠÙˆÙØ± واجهة غنية بتقنية AJAX ويدعم Ù…ØªØµÙØ­Ø§Øª متعددة من خلال استخدام البروتوكولات القياسية مثل اCalDAV ÙˆCardDAV.
âŽ\nسوجو موزع بموجب GNU GPL النسخة 2 او الاحدث وبعض الاجزاء موزعة تحت GNU GPL النسخة 2. هذا البرنامج مجاني: أنت حر ÙÙŠ تغييره وإعادة توزيعه. لا يوجد أي ضمان، إلى الحد الذي يسمح به القانون.
âŽ\nانظر this page لخيارات الدعم Ø§Ù„Ù…Ø®ØªÙ„ÙØ©."; "Your account was locked due to too many failed attempts." = "تم وق٠الدخول على حسابك بسبب الكثير من المحاولات Ø§Ù„ÙØ§Ø´Ù„Ø©."; "Your account was locked due to an expired password." = "تم وق٠الدخول على حسابك بسبب إنتهاء صلاحية كلمة السر."; "Login failed due to unhandled error case: " = "ÙØ´Ù„ تسجيل الدخول بسبب حالة خطأ غير Ù…Ø¹Ø±ÙˆÙØ©:"; "Change your Password" = "تغيير كلمة السر الخاصة بك"; "The password was changed successfully." = "تم تغيير كلمة المرور بنجاح."; "Your password has expired, please enter a new one below:" = "كلمة السر الخاصة بك قد انتهت صلاحيتها، الرجاء إدخال واحدة جديدة Ùيما يلي:"; "Password must not be empty." = "كلمة السر يجب ان لا تكون ÙØ§Ø±ØºØ©."; "The passwords do not match. Please try again." = "كلمات المرور لا تتطابق. يرجى المحاولة مرة أخرى."; "Password Grace Period" = "ÙØªØ±Ø© السماح لكلمة السر "; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "لديك عدد %{0} تسجيلات متبقية قبل وق٠الدخول على حسابك. الرجاء تغيير كلمة السر ÙÙŠ جزء الخيارات."; "Password about to expire" = "صلاحية كلمة السر على وشك الانتهاء"; "Your password is going to expire in %{0} %{1}." = "صلاحية كلمة السر الخاصة بك سو٠تنتهي ÙÙŠ %{0} %{1} ."; "days" = "أيام"; "hours" = "ساعات"; "minutes" = "دقائق"; "seconds" = "ثواني"; "Password change failed" = "ÙØ´Ù„ تغيير كلمة المرور"; "Password change failed - Permission denied" = "ÙØ´Ù„ تغيير كلمة المرور - تم Ø±ÙØ¶ الإذن"; "Password change failed - Insufficient password quality" = "ÙØ´Ù„ تغيير كلمة المرور - عدم ÙƒÙØ§ÙŠØ© جودة كلمة السر"; "Password change failed - Password is too short" = "ÙØ´Ù„ تغيير كلمة المرور - كلمة قصيرة جدا"; "Password change failed - Password is too young" = "ÙØ´Ù„ تغيير كلمة المرور - كلمة السر هي صغيرة جدا"; "Password change failed - Password is in history" = "ÙØ´Ù„ تغيير كلمة المرور - كلمة السر مستخدمة سابقا"; "Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; "Unhandled error response" = "خطأ استجابة غير معالجة"; "Password change is not supported." = "لا يتم اعتماد تغيير كلمة المرور."; "Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; "New password:" = "كلمة مرور جديدة:"; "Confirmation:" = "تأكيد:"; "Cancel" = "إلغاء"; "Please wait..." = "يرجى الانتظار ..."; SOGo-2.1.1b/UI/MainUI/Italian.lproj/0000755000000000000000000000000012247657027015343 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Italian.lproj/Locale0000644000000000000000000000303012247657027016461 0ustar rootroot/* Italian */ { NSLanguageName = "Italian"; NSFormalName = "Italian"; NSLocaleCode = "it"; /* ISO 639-1 */ NSLanguageCode = "ita"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = "â¬"; NSDateFormatString = "%A, %e %B, %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = (prima, scorso, dopo, fa); NSHourNameDesignations = ((0, notte), (10, mattina), (12, giorno), (14, pomeriggio), (19, sera)); NSInternationalCurrencyString = EUR; /* ISO 4217 */ NSLaterTimeDesignations = (dopo); NSMonthNameArray = (Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre); NSNextDayDesignations = (domani); NSNextNextDayDesignations = (dopodomani); NSPriorDayDesignations = (ieri); NSShortDateFormatString = "%d/%m/%y"; NSShortMonthNameArray = (Gen, Feb, Mar, Apr, Mag, Giu, Lug, Ago, Set, Ott, Nov, Dic); NSShortTimeDateFormatString = "%d/%m/%y %H:%M"; NSShortWeekDayNameArray = (Dom, Lun, Mar, Mer, Gio, Ven, Sab); NSThisDayDesignations = (oggi, ora); NSThousandsSeparator = ","; NSTimeDateFormatString = "%A, %e %B, %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = (Domenica, Lunedi, Martedi, Mercoledi, Giovedi, Venerdi, Sabato); NSYearMonthWeekDesignations = (anno, mese, settimana); NSPositiveCurrencyFormatString = "⬠9,999.00"; NSNegativeCurrencyFormatString = "-⬠9,999.00"; } SOGo-2.1.1b/UI/MainUI/Italian.lproj/Localizable.strings0000644000000000000000000001073512247657027021205 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Nome utente:"; "Password:" = "Password:"; "Domain:" = "Dominio"; "Remember username" = "Ricorda il nome utente"; "Connect" = "Entra"; "Wrong username or password." = "Username o password non corretti."; "cookiesNotEnabled" = "Non è possibile eseguire il login perchè il browser non ha i cookies abilitati. Prego abilitare i cookies nel preferenze del proprio bowser e riprovare."; "browserNotCompatible" = "La versione del browser utilizzato non è supportata. Raccomandiamo l'utilizzo di Firefox. Clicca sul link per scaricarne l'ultima versione disponibile."; "alternativeBrowsers" = "Alternativamente, puoi utilizzare questi browser compatibili"; "alternativeBrowserSafari" = "Alternativamente, puoi utilizzare Safari."; "Download" = "Scarica"; "Language:" = "Lingua:"; "choose" = "Scegli..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Informazioni"; "AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

âŽ\nSOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

âŽ\nSOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

âŽ\nSee this page for various support options."; "Your account was locked due to too many failed attempts." = "Account bloccato a causa di troppi tentativi falliti."; "Your account was locked due to an expired password." = "Account bloccato per password scaduta."; "Login failed due to unhandled error case: " = "Login fallito a causa di un errore non gestito: "; "Change your Password" = "Cambia la tua password"; "The password was changed successfully." = "La password è stata cambiata con successo."; "Your password has expired, please enter a new one below:" = "La tua password è scaduta, prego inserire la nuova password qui sotto:"; "Password must not be empty." = "La password non può essere vuota."; "The passwords do not match. Please try again." = "Le password non coincidono. Prego riprovare."; "Password Grace Period" = "Periodo di tolleranza password"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Hai %{0} login rimamenti prima che il tuo account sia bloccato. Prego cambiare la tua password nel pannello delle preferenze."; "Password about to expire" = "Password in scadenza"; "Your password is going to expire in %{0} %{1}." = "La tua password scadrà in %{0} %{1}."; "days" = "giorni"; "hours" = "ore"; "minutes" = "minuti"; "seconds" = "secondi"; "Password change failed" = "Cambio password fallito"; "Password change failed - Permission denied" = "Cambio password fallito - Permesso negato"; "Password change failed - Insufficient password quality" = "Cambio password fallito - Qualità password insufficente"; "Password change failed - Password is too short" = "Cambio password fallito - La password è troppo corta"; "Password change failed - Password is too young" = "Cambio password fallito - Password cambiata troppo di recente"; "Password change failed - Password is in history" = "Cambio password fallito - La password è nello storico"; "Unhandled policy error: %{0}" = "Errore di policy non gestito: %{0}"; "Unhandled error response" = "Risposta con errore non gestito"; "Password change is not supported." = "Cambio di password non supportato."; "Unhandled HTTP error code: %{0}" = "Codice errore HTTP non gestito: %{0}"; "New password:" = "Nuova password:"; "Confirmation:" = "Conferma:"; "Cancel" = "Cancella"; "Please wait..." = "Prego attendere..."; SOGo-2.1.1b/UI/MainUI/Russian.lproj/0000755000000000000000000000000012247657027015406 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Russian.lproj/Locale0000644000000000000000000000363612247657027016540 0ustar rootroot/* Russian */ { NSLanguageName = "Russian"; NSFormalName = "РуÑÑкий"; NSLocaleCode = "ru"; /* ISO 639-1 */ NSLanguageCode = "rus"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = " руб."; NSDateFormatString = "%A %e %B %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = ("первый", "поÑледний", "прошедший", "назад"); NSHourNameDesignations = ((0, "полночь"), (10, "утро"), (12, "полдень", "обед"), (14, "день"), (19, "вечер")); NSInternationalCurrencyString = RUB; /* ISO 4217 */ NSLaterTimeDesignations = ("позже"); NSMonthNameArray = ("Январь", "Февраль", "Март", "Ðпрель", "Май", "Июнь", "Июль", "ÐвгуÑÑ‚", "СентÑбрь", "ОктÑбрь", "ÐоÑбрь", "Декабрь"); NSNextDayDesignations = ("завтра"); NSNextNextDayDesignations = ("завтра"); NSPriorDayDesignations = ("вчера"); NSShortDateFormatString = "%e/%m/%y"; NSShortMonthNameArray = ("Янв", "Фев", "Мар", "Ðпр", "Май", "Июн", "Июл", "Ðвг", "Сен", "Окт", "ÐоÑ", "Дек"); NSShortTimeDateFormatString = "%e/%m/%y %H:%M"; NSShortWeekDayNameArray = ("Ð’Ñ", "Пн", "Ð’Ñ‚", "Ср", "Чт", "Пт", "Сб"); NSThisDayDesignations = ("ÑегоднÑ", "ÑейчаÑ"); NSThousandsSeparator = " "; NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("ВоÑкреÑенье", "Понедельник", "Вторник", "Среда", "Четверг", "ПÑтница", "Суббота"); NSYearMonthWeekDesignations = ("год", "меÑÑц", "неделÑ"); NSPositiveCurrencyFormatString = "9 999.00$"; NSNegativeCurrencyFormatString = "-9 999.00$"; } SOGo-2.1.1b/UI/MainUI/Russian.lproj/Localizable.strings0000644000000000000000000001512012247657027021241 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Логин:"; "Password:" = "Пароль:"; "Domain:" = "Домен:"; "Remember username" = "Запомнить Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"; "Connect" = "Соединение"; "Wrong username or password." = "Ðеправильный логин или пароль."; "cookiesNotEnabled" = "Ð’Ñ‹ не можете войти в ÑиÑтему, так как в Вашем броузере (программа Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтраниц в интернете) выключены cookies. ПожалуйÑта разрешите нашему Ñайту иÑпользовать cookies в наÑтройках Вашего броузера."; "browserNotCompatible" = "Мы определили что Ваша программа проÑмотра интернет-Ñтраниц (browser) не поддерживает иÑпользуемую на нашем Ñайте технологию. Мы рекомендуем иÑпользовать одину из ÑовмеÑтимых программ (в порÑдке лучшей ÑовмеÑтимоÑти): Firefox, Internet Explorer, Safari, Google Chrome. Скачать Ñвежий Firefox можно тут:"; "alternativeBrowsers" = "Ð’ качеÑтве альтернативы можно иÑпользовать Ñледующие программы:"; "alternativeBrowserSafari" = "Также можно иÑпользовать Safari."; "Download" = "Скачать"; "Language:" = "Язык:"; "choose" = "Выбрать ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "О ÑиÑтеме"; "AboutBox" = "Разработанный Inverse, SOGO Ñто полнофункциональный Groupware Server Ñ Ð°ÐºÑ†ÐµÐ½Ñ‚Ð¾Ð¼ на маÑштабируемоÑть и проÑтоту.

SOGO обеÑпечивает богатый, оÑнованный на AJAX веб-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¸ поддерживает неÑколько ÑобÑтвенных клиентов за Ñчет иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтандартных протоколов, таких как CalDAV и CardDAV.

SOGO раÑпроÑтранÑетÑÑ Ð¿Ð¾Ð´ лицензией GNU GPL верÑии 2 или более поздней верÑии и детали раÑпроÑтранÑетÑÑ Ð¿Ð¾Ð´ лицензией GNU LGPL верÑии 2. Это Ñвободное программное обеÑпечение: вы можете Ñвободно изменÑть и раÑпроÑтранÑть его. Ðе ÑущеÑтвует ÐИКÐКИХ ГÐРÐÐТИЙ в пределах, допуÑкаемых законом.

Смотрите Ñту Ñтраницу Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… вариантов поддержки."; "Your account was locked due to too many failed attempts." = "Ваш аккаунт был заблокирован из-за Ñлишком большого чиÑла неудачных попыток."; "Your account was locked due to an expired password." = "Ваш аккаунт был заблокирован в ÑвÑзи Ñ Ð¸Ñтечение Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ."; "Login failed due to unhandled error case: " = "Войти не удалоÑÑŒ из-за необработанного ÑÐ»ÑƒÑ‡Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¸:"; "Change your Password" = "Смените Ваш пароль"; "The password was changed successfully." = "Пароль был уÑпешно изменен."; "Your password has expired, please enter a new one below:" = "Ваш пароль иÑтек, введите новый ниже:"; "Password must not be empty." = "Пароль не должен быть пуÑтым."; "The passwords do not match. Please try again." = "Пароли не Ñовпадают. ПожалуйÑта, попробуйте еще раз."; "Password Grace Period" = "Льготный период дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "У Ð²Ð°Ñ Ð¾ÑталоÑÑŒ % {0}входов до блокировки Вашей учетной запиÑи. ПожалуйÑта, Ñмените Ваш пароль в диалоговом окне предпочтениÑ."; "Password about to expire" = "Пароль иÑтекает в ближайшее времÑ"; "Your password is going to expire in %{0} %{1}." = "Ваш пароль будет годен до % {0}% {1}."; "days" = "дней"; "hours" = "чаÑов"; "minutes" = "минут"; "seconds" = "Ñекунд"; "Password change failed" = "Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ"; "Password change failed - Permission denied" = "Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ - ДоÑтуп запрещен"; "Password change failed - Insufficient password quality" = "Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ - недоÑтаточное качеÑтво паролÑ"; "Password change failed - Password is too short" = "Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ - пароль Ñлишком короткий"; "Password change failed - Password is too young" = "Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ - пароль Ñлишком молод"; "Password change failed - Password is in history" = "Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ - пароль уже еÑть в иÑтории"; "Unhandled policy error: %{0}" = "Ðеобработанные ошибки политики:% {0}"; "Unhandled error response" = "Unhandled error response"; "Password change is not supported." = "Смена Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ðµ поддерживаетÑÑ."; "Unhandled HTTP error code: %{0}" = "Ðеобработанные ошибки HTTP-код:% {0}"; "New password:" = "Ðовый пароль:"; "Confirmation:" = "Подтверждение:"; "Cancel" = "Отменить"; "Please wait..." = "ПожалуйÑта, подождите ..."; SOGo-2.1.1b/UI/MainUI/SOGoProfile-oracle.sql0000644000000000000000000000022412247657027016747 0ustar rootroot-- -- (C) 2007 Inverse inc. -- CREATE TABLE @{tableName} ( c_uid VARCHAR(255) NOT NULL PRIMARY KEY, c_defaults CLOB, c_settings CLOB ); SOGo-2.1.1b/UI/MainUI/SpanishArgentina.lproj/0000755000000000000000000000000012247657027017220 5ustar rootrootSOGo-2.1.1b/UI/MainUI/SpanishArgentina.lproj/Locale0000644000000000000000000000315012247657027020341 0ustar rootroot/* Spanish */ { NSLanguageName = "Spanish"; NSFormalName = "Castellano"; NSLocaleCode = "es"; /* ISO 639-1 */ NSLanguageCode = "spa; Castillan"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = "€"; NSDateFormatString = "%A %e %B %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = ("pasado","último","anterior"); NSHourNameDesignations = ((0, "medianoche"), (10, "mañana"), (12, "mediodía"), (14, "tarde"), (19, "noche")); NSInternationalCurrencyString = EUR; /* ISO 4217 */ NSLaterTimeDesignations = ("próximo","siguiente","que viene"); NSMonthNameArray = (Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre); NSNextDayDesignations = ("mañana"); NSNextNextDayDesignations = ("pasado mañana"); NSPriorDayDesignations = (ayer); NSShortDateFormatString = "%e/%m/%y"; NSShortMonthNameArray = (Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic); NSShortTimeDateFormatString = "%e/%m/%y %H:%M"; NSShortWeekDayNameArray = ("Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"); NSThisDayDesignations = ("hoy"); NSThousandsSeparator = "."; NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"); NSYearMonthWeekDesignations = ("año", "mes", "semana"); NSPositiveCurrencyFormatString = "$9,999.00$"; NSNegativeCurrencyFormatString = "-$9,999.00$"; } SOGo-2.1.1b/UI/MainUI/SpanishArgentina.lproj/Localizable.strings0000644000000000000000000001144212247657027023056 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Usuario:"; "Password:" = "Contraseña:"; "Domain:" = "Dominio:"; "Remember username" = "Recordar el nombre de usuario"; "Connect" = "Conectar"; "Wrong username or password." = "Nombre de usuario o contraseña incorrectos."; "cookiesNotEnabled" = "No se puede conectar dado que su navegador no acepta cookies. Por favor, habilite las cookies en la configuración de su navegador y pruebe de nuevo."; "browserNotCompatible" = "Hemos detectado que éste sistema no soporta su versión del navegador. Recomendamos usar Firefox. Haga click en el siguiente enlace para descargar la versión más reciente de este navegador."; "alternativeBrowsers" = "Como alternativa, también puede usar uno se los siguientes navegadores compatibles: "; "alternativeBrowserSafari" = "Como alternativa, puede usar Safari."; "Download" = "Descarga"; "Language:" = "Idioma:"; "choose" = "Elija ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Acerca de"; "AboutBox" = "Desarrollado por Inverse, SOGo es un servidor groupware (software colaborativo) con todas las características necesarias con un focus para simlicidad y capacidad de ampliación.

\nSOGo facilita una interface web rica basada en AJAX Web y soporta una multitud de clientes a través del soporte de protocolos estándares como CalDAV y CardDAV.

\nSOGo esta distribuido bajo GNU GPL versión 2 o siguiente, y partes bajo la licencia GNU LGPL versión 2. Esto es software libre: esta autorizado el cambio y la redistribución del mismo. No hay garantías, dentro del límite de la ley.

\nVer esta página para las diferentes opciones de soporte."; "Your account was locked due to too many failed attempts." = "Su cuenta ha sido bloqueada debido a un número excesivo de errores de conexión."; "Your account was locked due to an expired password." = "Su cuenta ha sido bloqueada debido a una contraseña caducada."; "Login failed due to unhandled error case: " = "Conexión fallida debido a un error desconocido: "; "Change your Password" = "Cambie su contraseña"; "The password was changed successfully." = "El cambio de clave fue exitoso"; "Your password has expired, please enter a new one below:" = "Su contraseña ha caducado, por favor, introduzca una nueva abajo:"; "Password must not be empty." = "La contraseña no puede estar vacía."; "The passwords do not match. Please try again." = "La contraseña no es igual. Por favor, intentelo de nuevo."; "Password Grace Period" = "Periodo de gracia de contraseña"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Le quedan %{0} intentos de conexión antes de que su cuenta sea bloqueada. Por favor, cambie su contraseña en el diálogo de preferencias."; "Password about to expire" = "Contraseña a punto de caducar"; "Your password is going to expire in %{0} %{1}." = "Su contraseña caducará en %{0} %{1}."; "days" = "días"; "hours" = "horas"; "minutes" = "minutos"; "seconds" = "segundos"; "Password change failed" = "Cambio de contraseña fallido"; "Password change failed - Permission denied" = "Cambio de contraseña fallido - Permiso denegado"; "Password change failed - Insufficient password quality" = "Cambio de contraseña fallido - Calidad de la contraseña insuficiente"; "Password change failed - Password is too short" = "Cambio de contraseña fallido - Contraseña demasiado corta"; "Password change failed - Password is too young" = "Cambio de contraseña fallido - Contraseña demasiado reciente"; "Password change failed - Password is in history" = "Cambio de contraseña fallido - Contraseña existe en el histórico de contraseñas"; "Unhandled policy error: %{0}" = "error de política desatendido: %{0}"; "Unhandled error response" = "error de respuesta desatendido"; "Password change is not supported." = "Cambio de contraseña no soportado."; "Unhandled HTTP error code: %{0}" = "Codigo de Error HTTP desatendido: %{0}"; "New password:" = "Nueva contraseña:"; "Confirmation:" = "Confirmación:"; "Cancel" = "Cancelar"; "Please wait..." = "Por favor, espere..."; SOGo-2.1.1b/UI/MainUI/product.plist0000644000000000000000000001620012247657027015371 0ustar rootroot{ /* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ requires = ( MAIN, Appointments, CommonUI ); publicResources = (); factories = { }; classes = { SOGoRootPage = { superclass = "SoComponent"; protectedBy = ""; defaultRoles = { "View" = ( "Authenticated", "PublicUser" ); }; }; SOGoObject = { protectedBy = ""; defaultAccess = "allow"; defaultRoles = { "View" = ( "Owner", "ObjectViewer" ); "Change Images And Files" = ( "Owner", "ObjectEditor", "PROPPATCHer" ); "Access Object" = ( "Owner", "ObjectViewer", "ObjectEditor", "ObjectCreator", "ObjectEraser" ); "Access Contents Information" = ( "Owner", "ObjectViewer" ); "Add Documents, Images, and Files" = ( "Owner", "ObjectCreator" ); "Add Folders" = ( "Owner", "FolderCreator" ); "ReadAcls" = ( "Owner" ); "Change Permissions" = ( "Owner" ); "Delete Object" = ( "Owner", "ObjectEraser" ); "WebDAV Access" = ( "Owner", "ObjectViewer", "ObjectEditor", "ObjectCreator", "ObjectEraser" ); }; methods = { DELETE = { protectedBy = "Delete Object"; }; GET = { protectedBy = "Access Contents Information"; }; PUT = { protectedBy = "Change Images And Files"; }; }; }; SOGoContentObject = { superclass = "SOGoObject"; defaultAccess = "allow"; /* defaultAccess = "Access Contents Information"; */ protectedBy = "Access Object"; defaultRoles = { "Access Contents Information" = ( "Owner", "ObjectViewer", "ObjectEditor" ); "Change Images And Files" = ( "Owner", "ObjectEditor" ); "Delete Objects" = ( "Owner", "ObjectEraser" ); }; }; SOGoFolder = { superclass = "SOGoObject"; protectedBy = "Access Object"; defaultRoles = { "Change Images And Files" = ( "Owner", "ObjectEditor", "PROPPATCHer" ); "View" = ( "Owner", "ObjectViewer", "ObjectEditor" ); "Access Object" = ( "Owner", "AuthorizedSubscriber" ); "Access Contents Information" = ( "Owner", "ObjectViewer", "ObjectEditor", "ObjectCreator", "ObjectEraser" ); "WebDAV Access" = ( "Owner", "AuthorizedSubscriber", "ObjectCreator", "ObjectEraser" ); "Delete Object" = ( "Owner" ); "Delete Objects" = ( "Owner", "ObjectEraser" ); }; }; SOGoParentFolder = { superclass = "SOGoFolder"; protectedBy = ""; defaultRoles = { "Access Contents Information" = ( "Authenticated", "PublicUser" ); "WebDAV Access" = ( "Authenticated", "PublicUser" ); "Add Folders" = ( "Owner" ); }; }; SOGoUserFolder = { superclass = "SOGoFolder"; protectedBy = "Access Contents Information"; defaultRoles = { "Access Contents Information" = ( "Authenticated", "PublicUser" ); "WebDAV Access" = ( "Authenticated", "PublicUser" ); "View" = ( "Authenticated" ); }; }; SOGoGCSFolder = { superclass = "SOGoFolder"; }; SOGoPublicBaseFolder = { superclass = "SOGoFolder"; protectedBy = "Access Contents Information"; defaultRoles = { "Access Contents Information" = ( "Authenticated", "PublicUser" ); "WebDAV Access" = ( "Authenticated", "PublicUser" ); "View" = ( "Authenticated" ); }; }; }; categories = { SOGo = { // TODO: move decls to class slots = { toolbar = { value = "none"; // keep this in order to avoid lookups on username // "toolbar" }; }; methods = { view = { protectedBy = ""; pageName = "SOGoRootPage"; }; index = { protectedBy = ""; pageName = "SOGoRootPage"; }; casProxy = { protectedBy = ""; pageName = "SOGoRootPage"; actionName = "casProxy"; }; saml2-metadata = { protectedBy = ""; actionClass = "SOGoSAML2Actions"; actionName = "saml2Metadata"; }; saml2-signon-post = { protectedBy = ""; actionClass = "SOGoSAML2Actions"; actionName = "saml2SignOnPOST"; }; /* saml2-signon-redirect = { protectedBy = ""; actionClass = "SOGoSAML2Actions"; actionName = "saml2SignOnRedirect"; }; saml2-signon-soap = { protectedBy = ""; actionClass = "SOGoSAML2Actions"; actionName = "saml2SignOnSOAP"; }; crash = { protectedBy = ""; pageName = "SOGoRootPage"; actionName = "crash"; }; exception = { protectedBy = ""; pageName = "SOGoRootPage"; actionName = "exception"; }; raisedException = { protectedBy = ""; pageName = "SOGoRootPage"; actionName = "raisedException"; }; */ connect = { protectedBy = ""; pageName = "SOGoRootPage"; actionName = "connect"; }; changePassword = { protectedBy = ""; pageName = "SOGoRootPage"; actionName = "changePassword"; }; loading = { protectedBy = ""; pageName = "UIxLoading"; }; GET = { // more or less a hack, see README of dbd protectedBy = ""; pageName = "SOGoRootPage"; }; }; }; SOGoRootPage = { }; SOGoUserFolder = { methods = { view = { protectedBy = ""; pageName = "SOGoUserHomePage"; }; recover = { protectedBy = "View"; pageName = "SOGoUserHomePage"; actionName = "recover"; }; logoff = { protectedBy = ""; pageName = "SOGoUserHomePage"; actionName = "logoff"; }; usersSearch = { protectedBy = "View"; pageName = "SOGoUserHomePage"; actionName = "usersSearch"; }; foldersSearch = { protectedBy = "View"; pageName = "SOGoUserHomePage"; actionName = "foldersSearch"; }; }; }; // SOGoGroupsFolder = { // methods = { // index = { // protectedBy = "View"; // pageName = "SOGoGroupsPage"; // }; // }; // }; // SOGoGroupFolder = { // methods = { // index = { // protectedBy = "View"; // pageName = "SOGoGroupPage"; // }; // }; // }; SOGoFreeBusyObject = { methods = { ajaxRead = { protectedBy = ""; pageName = "SOGoUserHomePage"; actionName = "readFreeBusy"; }; }; }; // SOGoCustomGroupFolder = { // methods = { // }; // }; }; } SOGo-2.1.1b/UI/MainUI/French.lproj/0000755000000000000000000000000012247657027015167 5ustar rootrootSOGo-2.1.1b/UI/MainUI/French.lproj/Locale0000644000000000000000000000320512247657027016311 0ustar rootroot/* French */ { NSLanguageName = "French"; NSFormalName = "Français"; NSLocaleCode = "fr"; /* ISO 639-1 */ NSLanguageCode = "fra"; /* ISO 639-2 */ NSParentContext = ""; NSCurrencySymbol = " €"; NSDateFormatString = "%A %e %B %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = (dernier, "dernière", derniers, "dernières"); NSHourNameDesignations = ((0, minuit), (12, midi), (10, matin), (14, "après-midi"), (19, soir)); NSInternationalCurrencyString = EUR; /* ISO 4217 */ NSLaterTimeDesignations = (prochain, prochaine, prochains, prochaines); NSMonthNameArray = (Janvier, "Février", Mars, Avril, Mai, Juin, Juillet, "Août", Septembre, Octobre, Novembre, "Décembre"); NSNextDayDesignations = (demain); NSNextNextDayDesignations = ("après-demain"); NSPriorDayDesignations = (hier); NSShortDateFormatString = "%e/%m/%y"; NSShortMonthNameArray = (Jan, "Fév", Mar, Avr, Mai, Jun, Jul, "Aoû", Sep, Oct, Nov, "Déc"); NSShortTimeDateFormatString = "%e/%m/%y %H:%M"; NSShortWeekDayNameArray = (Dim, Lun, Mar, Mer, Jeu, Ven, Sam); NSThisDayDesignations = ("aujourd'hui"); NSThousandsSeparator = " "; /* space */ NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; /* no space before and after colons*/ NSWeekDayNameArray = (Dimanche, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi); NSYearMonthWeekDesignations = ("année", mois, semaine); NSAMPMDesignation = (AM, PM); NSPositiveCurrencyFormatString = "9,999.00$"; NSNegativeCurrencyFormatString = "-9,999.00$"; } SOGo-2.1.1b/UI/MainUI/French.lproj/Localizable.strings0000644000000000000000000001166212247657027021031 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Nom d'utilisateur :"; "Password:" = "Mot de passe :"; "Domain:" = "Domaine :"; "Remember username" = "Se souvenir de moi"; "Connect" = "Connexion"; "Wrong username or password." = "Mauvais nom d'utilisateur ou mot de passe."; "cookiesNotEnabled" = "Vous ne pouvez vous authentifier car les témoins (cookies) de votre navigateur Web sont désactivés. Activez les témoins dans votre navigateur Web et essayez de nouveau."; "browserNotCompatible" = "La version de votre navigateur Web n'est présentement pas supportée par ce site. Nous recommandons d'utiliser Firefox. Vous trouverez un lien vers la plus récente version de ce navigateur ci-dessous:"; "alternativeBrowsers" = "Comme alternative, vous pouvez aussi utiliser les navigateurs suivants:"; "alternativeBrowserSafari" = "Comme alternative, vous pouvez aussi utiliser Safari."; "Download" = "Télécharger"; "Language:" = "Langue:"; "choose" = "Choisir ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "À propos"; "AboutBox" = "Développé par la compagnie Inverse, SOGo est un collecticiel complet mettant l'emphase sur la simplicité et l'extensibilité.

\nSOGo propose une interface Web moderne basée sur AJAX ainsi qu'un accès par de nombreux clients natifs (comme Mozilla Thunderbird et Lightning et Apple iCal) par l'utilisation de protocoles standards tel que CalDAV et CardDAV.

\nCe programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier conformément aux dispositions de la Licence Publique Générale GNU, telle que publiée par la Free Software Foundation ; version 2 de la licence, ou encore (à votre choix) toute version ultérieure. Ce programme est distribué dans l’espoir qu’il sera utile, mais SANS AUCUNE GARANTIE.

\nPlusieurs types de soutien sont offerts."; "Your account was locked due to too many failed attempts." = "Votre compte a été bloqué dû à un nombre élevé de tentative d'authentification infructueuse."; "Your account was locked due to an expired password." = "Votre compte a été bloqué car votre mot de passe est expiré."; "Login failed due to unhandled error case: " = "Authentification a échouée pour une raison inconnue: "; "Change your Password" = "Changez votre mot de passe"; "The password was changed successfully." = "Votre mot de passe a bien été changé."; "Your password has expired, please enter a new one below:" = "Votre mot de passe est expiré, veuillez entrer un nouveau mot de passe:"; "Password must not be empty." = "Le mot de passe ne doit pas être vide."; "The passwords do not match. Please try again." = "Les mots de passe ne sont pas identiques. Essayez de nouveau."; "Password Grace Period" = "Période de grâce pour le mot de passe"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Vous avez %{0} connexions restantes avant que votre compte ne soit bloqué. Veuillez changer votre mot de passe à partir du panneau de préférences."; "Password about to expire" = "Expiration du mot de passe"; "Your password is going to expire in %{0} %{1}." = "Votre mot de passe va expirer dans %{0} %{1}."; "days" = "jours"; "hours" = "heures"; "minutes" = "minutes"; "seconds" = "secondes"; "Password change failed" = "Échec au changement"; "Password change failed - Permission denied" = "Échec au changement - mauvaises permissions"; "Password change failed - Insufficient password quality" = "Échec au changement - qualité insuffisante"; "Password change failed - Password is too short" = "Échec au changement - mot de passe trop court"; "Password change failed - Password is too young" = "Échec au changement - mot de passe trop récent"; "Password change failed - Password is in history" = "Échec au changement - mot de passe dans l'historique"; "Unhandled policy error: %{0}" = "Erreur inconnue pour le ppolicy: %{0}"; "Unhandled error response" = "Erreur inconnue"; "Password change is not supported." = "Changement de mot de passe non-supporté."; "Unhandled HTTP error code: %{0}" = "Code HTTP non-géré: %{0}"; "New password:" = "Nouveau mot de passe:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Annuler"; "Please wait..." = "Veuillez patienter..."; SOGo-2.1.1b/UI/MainUI/NorwegianBokmal.lproj/0000755000000000000000000000000012247657027017041 5ustar rootrootSOGo-2.1.1b/UI/MainUI/NorwegianBokmal.lproj/Locale0000644000000000000000000000301312247657027020160 0ustar rootroot/* Norwegian */ { NSLanguageName = "NorwegianBokmal"; NSFormalName = "Norsk bokmÃ¥l"; NSLocaleCode = "nb"; /* ISO 639-1 */ NSLanguageCode = "nor"; /* ISO 639-2 */ NSParentContext = ""; NSCurrencySymbol = " kr"; NSDateFormatString = "%A %e. %B %Y"; NSDateTimeOrdering = MDHY; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = (forrige, siste, tidligere); NSHourNameDesignations = ((0, midnatt), (10, formiddag), (12, lunch), (14, ettermiddag), (19, kveld)); NSInternationalCurrencyString = NOK; /* ISO 4217 */ NSLaterTimeDesignations = (neste); NSMonthNameArray = (Januar, Februar, Mars, April, Mai, Juni, Juli, August, September, Oktober, November, Desember); NSNextDayDesignations = ("i morgen"); NSNextNextDayDesignations = (overmorgen); NSPriorDayDesignations = ("i gÃ¥r"); NSShortDateFormatString = "%d.%m.%Y"; NSShortMonthNameArray = (Jan, Feb, Mar, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Des); NSShortTimeDateFormatString = "%d.%m.%Y %H:%M"; NSShortWeekDayNameArray = ("Søn", Man, Tir, Ons, Tor, Fre, "Lør"); NSThisDayDesignations = ("i dag", "nÃ¥"); NSThousandsSeparator = " "; NSTimeDateFormatString = "%A %e. %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("Søndag", Mandag, Tirsdag, Onsdag, Torsdag, Fredag, "Lørdag"); NSYearMonthWeekDesignations = ("Ã¥r", "mÃ¥ned", uke); NSPositiveCurrencyFormatString = "9,999.00 $"; NSNegativeCurrencyFormatString = "-9,999.00 $"; } SOGo-2.1.1b/UI/MainUI/NorwegianBokmal.lproj/Localizable.strings0000644000000000000000000001073512247657027022703 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Brukernavn:"; "Password:" = "Passord:"; "Domain:" = "Domene:"; "Remember username" = "Husk brukernavn"; "Connect" = "Koble til"; "Wrong username or password." = "Feil brukernavn eller passord."; "cookiesNotEnabled" = "Du kan ikke logge inn fordi nettleser ikke har aktivert infokapsler (cookies). Endre innstillinger i nettleseren din slik at infokapsler er tillatt."; "browserNotCompatible" = "Versjonen av nettleseren du anvender støttes ikke av denne webmailen. Vi anbefaler at du bruker Firefox. Klikk pÃ¥ lenken under for Ã¥ laste ned den siste versjonen av Firefox."; "alternativeBrowsers" = "Alternativt kan du ogsÃ¥ forsøke følgende kompatible nettlesere"; "alternativeBrowserSafari" = "Alternativt kan du ogsÃ¥ bruke Safari."; "Download" = "Last ned"; "Language:" = "SprÃ¥k:"; "choose" = "Velg ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Om"; "AboutBox" = "Utviklet av Inverse, SOGo er en komplett gruppevaretjener med fokus pÃ¥ skalerbarhet og enkel bruk.

\nSOGo tilbyr ett rikt AJAX-basert webgrensesnitt, og støtter mange 3. parts klienter gjennom standardprotokoller som CalDAV og CardDAV.

\nSOGo er distribuert under GNU GPL versjon 2 eller senere, og enkelte deler er distribuert under GNU LGPL versjon 2. Dette er fri programvare: du stÃ¥r fritt til Ã¥ endre og videredistribuere den. Den kommer med ABSOLUTT INGEN GARANTI, i det omfang som er tillatt av anvendelig lov. Sjekk denne siden for support-muligheter."; "Your account was locked due to too many failed attempts." = "Din konto har blitt lÃ¥st pÃ¥ grunn av for mange mislykkede innlogginger."; "Your account was locked due to an expired password." = "Din konto har blitt lÃ¥st fordi ditt passord er utløpt."; "Login failed due to unhandled error case: " = "Innlogging feilet av uventet Ã¥rsak:"; "Change your Password" = "Endre ditt passord"; "The password was changed successfully." = "Passordet ble endret."; "Your password has expired, please enter a new one below:" = "Ditt passord har utløpt, vennligst fyll ut et nytt under:"; "Password must not be empty." = "Passordet mÃ¥ ikke være tomt."; "The passwords do not match. Please try again." = "Passordene stemmer ikke overens. Vennligst prøv igjen."; "Password Grace Period" = "Sett forvarsel før passordet mÃ¥ byttes"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Du har %{0} gjenværende innlogginger før din konto blir lÃ¥st. Vennligst endre ditt passord i preferanse-dialogen."; "Password about to expire" = "Passordet utløper snart"; "Your password is going to expire in %{0} %{1}." = "Ditt passord vil utløpe om %{0} %{1}."; "days" = "dager"; "hours" = "timer"; "minutes" = "minutter"; "seconds" = "sekunder"; "Password change failed" = "Feil ved endring av passord"; "Password change failed - Permission denied" = "Feil ved endring av passord - tillatelse nektet"; "Password change failed - Insufficient password quality" = "Feil ved endring av passord - Utilstrekkelig passordkvalitet"; "Password change failed - Password is too short" = "Feil ved endring av passord - Passordet er for kort"; "Password change failed - Password is too young" = "Feil ved endring av passord - Passordet er nylig brukt"; "Password change failed - Password is in history" = "Feil ved endring av passord - Passordet har blitt brukt før"; "Unhandled policy error: %{0}" = "UhÃ¥ndtert policyfeil: %{0}"; "Unhandled error response" = "UhÃ¥ndtert feilmelding."; "Password change is not supported." = "Passordendring er ikke støttet."; "Unhandled HTTP error code: %{0}" = "UhÃ¥ndtert HTTP-feilkode: %{0}"; "New password:" = "Nytt passord:"; "Confirmation:" = "Bekreftelse:"; "Cancel" = "Avbryt"; "Please wait..." = "Vennligst vent..."; SOGo-2.1.1b/UI/MainUI/Finnish.lproj/0000755000000000000000000000000012247657027015360 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Finnish.lproj/Locale0000644000000000000000000000317712247657027016512 0ustar rootroot/* Finnish */ { NSLanguageName = "Finnish"; NSFormalName = "Suomi"; NSLocaleCode = "fi"; /* ISO 639-1 */ NSLanguageCode = "fin"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AP, IP); NSCurrencySymbol = "$"; NSDateFormatString = "%A, %B %e, %Y"; NSDateTimeOrdering = MDYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = (ennen, viimeksi, yli, sitten); NSHourNameDesignations = ((0, "keskiyö"), (10, aamu), (12, "keskipäivä", "lounas"), (14, "iltapäivä"), (19, "päivällinen")); NSInternationalCurrencyString = EUR; /* ISO 4217 */ NSLaterTimeDesignations = (seuraava); NSMonthNameArray = (Tammikuu, Helmikuu, Maaliskuu, Huhtikuu, Toukokuu, "Kesäkuu", "Heinäkuu", Elokuu, Syyskuu, Lokakuu, Marraskuu, Joulukuu); NSNextDayDesignations = (huomenna); NSNextNextDayDesignations = ("seuraava päivä"); NSPriorDayDesignations = (eilen); NSShortDateFormatString = "%m/%e/%y"; NSShortMonthNameArray = (Tammi, Helmi, Maalis, Huhti, Touko, "Kesä", "Heinä", Elo, Syys, Loka, Marras, Joulu); NSShortTimeDateFormatString = "%m/%e/%y %I:%M %p"; NSShortWeekDayNameArray = (Su, Ma, Ti, Ke, To, Pe, La); NSThisDayDesignations = ("tänään", nyt); NSThousandsSeparator = ","; NSTimeDateFormatString = "%A, %B %e, %Y %I:%M:%S %p %Z"; NSTimeFormatString = "%I:%M:%S %p"; NSWeekDayNameArray = (Sunnuntai, Maanantai, Tiistai, Keskiviikko, Torstai, Perjantai, Lauantai); NSYearMonthWeekDesignations = (vuosi, kuukausi, viikko); NSPositiveCurrencyFormatString = "$9,999.00"; NSNegativeCurrencyFormatString = "-$9,999.00"; } SOGo-2.1.1b/UI/MainUI/Finnish.lproj/Localizable.strings0000644000000000000000000001111212247657027021210 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Käyttäjätunnus:"; "Password:" = "Salasana:"; "Domain:" = "Domain:"; "Remember username" = "Muista käyttäjätunnus"; "Connect" = "Yhdistä"; "Wrong username or password." = "Väärä käyttäjätunnus tai salasana."; "cookiesNotEnabled" = "Et voi kirjautua koska selaimesi evästeet eivät ole käytössä. Salli evästeet selaimen asetuksista ja yritä uudelleen."; "browserNotCompatible" = "Olemme havainneet että selaimesi versiota ei tällä hetkellä tueta tällä sivustolla. Suosituksemme on käyttää Firefoxia. Napsauta alla olevaa linkkiä ladataksesi uusimman version tästä selaimesta."; "alternativeBrowsers" = "Vaihtoehtoisesti voit myös käyttää seuraavia yhteensopivia selaimia"; "alternativeBrowserSafari" = "Vaihtoehtoisesti voit myös käyttää Safaria."; "Download" = "Lataa"; "Language:" = "Kieli:"; "choose" = "Valitse ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Tietoa"; "AboutBox" = "Kehittänyt Inverse, SOGo on täysiverinen groupware palvelin jossa on keskitytty skaalautuvuuteen ja yksinkertaisuuteen.

⎠SOGo tarjoaa rikkaan AJAX-pohjaisen web-käyttöliittymän ja tukee useita natiivi asiakasohjelmistoja käyttämällä protokolla standardeja kuten CalDAV ja CardDAV.
⎠SOGon jakelu tapahtuu GNU GPL version 2 tai uudempi lisenssillä ja osat jaetaan GNU LGPL version 2 lisenssillä. Tämä on vapaa ohjelma: voit vapaasti muuttaa ja jakaa sitä edelleen. Ohjelmistolla EI OLE TAKUUTA lain sallimissa puitteissa.
⎠Katso
tämä sivu saadaksesi tietoa eri tukivaihtoehdoista."; "Your account was locked due to too many failed attempts." = "Tilisi on lukittu liian monen epäonnistuneen yrityksen vuoksi."; "Your account was locked due to an expired password." = "Tilisi on lukittu vanhentuneen salasanan vuoksi."; "Login failed due to unhandled error case: " = "Sisäänkirjaus epäonnistui käsittelemättömään virheeseen:"; "Change your Password" = "Vaihda salasana"; "The password was changed successfully." = "Salasana on vaihdettu onnistuneesti."; "Your password has expired, please enter a new one below:" = "Salasanasi on vanhentunut, ole hyvä ja anna uusi:"; "Password must not be empty." = "Salasana ei saa olla tyhjä."; "The passwords do not match. Please try again." = "Salasanat eivät täsmää. Ole hyvä ja yrita uudelleen."; "Password Grace Period" = "Salasanan vaihtoaika"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Sinulla on %{0} kirjautumista jäljellä ennen tilisi lukkiutumista. Ole hyvä ja vaihda salasanasi asetusvalikossa."; "Password about to expire" = "Salasanasi on vanhenemassa"; "Your password is going to expire in %{0} %{1}." = "Salasanasi vanhenee %{0} %{1}."; "days" = "päivää"; "hours" = "tuntia"; "minutes" = "minuuttia"; "seconds" = "sekuntia"; "Password change failed" = "Salasanan vaihtaminen epäonnistui"; "Password change failed - Permission denied" = "Salasanan vaihto epäonnistui - Käyttö estetty"; "Password change failed - Insufficient password quality" = "Salasanan vaihto epäonnistui. Salasanan laatu ei riitä."; "Password change failed - Password is too short" = "Salasanan vaihto epäonnistui - Salasana on liian lyhyt"; "Password change failed - Password is too young" = "Salasanan vaihto epäonnistui - Salasana on liian tuore"; "Password change failed - Password is in history" = "Salasanan vaihto epäonnistui - Salasana on jo käytetty"; "Unhandled policy error: %{0}" = "Käsittelemätön menetelmävirhe: %{0}"; "Unhandled error response" = "Käsittelemätön virhe"; "Password change is not supported." = "Salasanan vaihto ei ole tuettu."; "Unhandled HTTP error code: %{0}" = "Käsittelemätön HTTP virhe: %{0}"; "New password:" = "Uusi salasana:"; "Confirmation:" = "Vahvistus:"; "Cancel" = "Peruuta"; "Please wait..." = "Odota hetki..."; SOGo-2.1.1b/UI/MainUI/Slovak.lproj/0000755000000000000000000000000012247657027015221 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Slovak.lproj/Locale0000644000000000000000000000316512247657027016350 0ustar rootroot/* Slovak */ { NSLanguageName = "Slovensky"; NSFormalName = "Slovak"; NSLocaleCode = "sk"; /* ISO 639-1 */ NSLanguageCode = "slk"; /* ISO 639-2 */ NSParentContext = ""; NSCurrencySymbol = "€"; NSDateFormatString = "%A, %d. %B %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = ("predchádzajúci", "posledný", "minulý", "pred"); NSHourNameDesignations = ((0, "polnoc"), (10, "ráno"), (12, "poludnie", "obed"), (14, "poobedie"), (19, "veÄer")); NSInternationalCurrencyString = EUR; /* ISO 4217 */ NSLaterTimeDesignations = ("nasledujúci"); NSMonthNameArray = ("Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"); NSNextDayDesignations = ("zajtra"); NSNextNextDayDesignations = ("pozajtra"); NSPriorDayDesignations = ("vÄera"); NSShortDateFormatString = "%d.%m.%Y"; NSShortMonthNameArray = ("Jan", "Feb", "Mar", "Apr", "Máj", "Jún", "Júl", "Aug", "Sep", "Okt", "Nov", "Dec"); NSShortTimeDateFormatString = "%H:%M %d.%m.%Y"; NSShortWeekDayNameArray = ("Ne", "Po", "Ut", "St", "Å t", "Pi", "So"); NSThisDayDesignations = ("dnes"); NSThousandsSeparator = "."; NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("Nedela", "Pondelok", "Utorok", "Streda", "Å tvrtok", "Piatok", "Sobota"); NSYearMonthWeekDesignations = ("rok", "mesiac", "týždeň"); NSPositiveCurrencyFormatString = "9.999,00 €"; NSNegativeCurrencyFormatString = "-9.999,00 €"; } SOGo-2.1.1b/UI/MainUI/Slovak.lproj/Localizable.strings0000644000000000000000000001100712247657027021054 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Užívateľské meno:"; "Password:" = "Heslo:"; "Domain:" = "Doména:"; "Remember username" = "ZapamätaÅ¥ uživateľské meno"; "Connect" = "PripojiÅ¥"; "Wrong username or password." = "Nesprávne uživateľské meno alebo heslo."; "cookiesNotEnabled" = "Nemôžete sa prihlásiÅ¥, pretože vo svojom prehliadaÄi máte zakázané cookies. Prosím povoľte cookies vo vaÅ¡om prehliadaÄi a skúste to znova."; "browserNotCompatible" = "Zistili sme že Váš prehliadaÄ nie je naÅ¡ou stránkou momentálne podporovaný. OdporúÄame používaÅ¥ Firefox. Kliknite na odkaz nižšie a stiahnite si aktuálnu verziu tohoto prehliadaÄa"; "alternativeBrowsers" = "Prípadne môžete tiež použiÅ¥ nasledujúce kompatibilné prehliadaÄe"; "alternativeBrowserSafari" = "Alternatívne je možné použiÅ¥ aj Safari."; "Download" = "StiahnuÅ¥"; "Language:" = "Jazyk:"; "choose" = "Výber ..."; "Arabic" = "العربية"; "Catalan" = "Katalánsky"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Holandsky"; "English" = "Anglicky"; "Finnish" = "Suomi"; "French" = "Francúzsky"; "German" = "Nemecky"; "Hungarian" = "MaÄarsky"; "Icelandic" = "IslandÄina"; "Italian" = "Taliansky"; "NorwegianBokmal" = "NórÄina bokmÃ¥l"; "NorwegianNynorsk" = "NórÄina nynorsk"; "Polish" = "Poľština"; "BrazilianPortuguese" = "Portugalská brazílÅ¡tina"; "Russian" = "RuÅ¡tina"; "Slovak" = "Slovensky"; "SpanishSpain" = "Å panielÄina (Å panielsko)"; "SpanishArgentina" = "Å panielÄina (Argentína)"; "Swedish" = "Å védÄina"; "Ukrainian" = "UkrajinÄina"; "Welsh" = "GalÄina"; "About" = "O"; "AboutBox" = "Vyvinuté Inverse, SOGo je plne vybavený groupware server s dôrazom na Å¡kálovateľnosÅ¥ a jednoduchosÅ¥.

\nSOGo ponúka bohaté Web rozhranie na báze AJAX-u a natívne podporuje mnoho klientov použitím štandardov ako sú CalDAV a CardDAV.

\nSOGo je distribuované pod licenciou
GNU GPL verzie 2 alebo novÅ¡ej a niektoré Äasti pod licenciou GNU LGPL verzie 2. Toto je voľne šíritelný softvér: môžete ho meniÅ¥ a šíriÅ¥ Äalej. Neexistuje ŽIADNA ZÃRUKA, v rozsahu povolenom zákonom.

\nPozrite si túto stránku pre rôzne možnosti podpory."; "Your account was locked due to too many failed attempts." = "Váš úÄet bol uzamknutý kvôli príliÅ¡ mnohých neúspeÅ¡ným pokusom."; "Your account was locked due to an expired password." = "Váš úÄet bol uzamknutý kvôli neplatnému heslu."; "Login failed due to unhandled error case: " = "Prihlásenie zlyhalo kvôli neoÅ¡etrenej prípade chyby:"; "Change your Password" = "ZmeniÅ¥ heslo"; "The password was changed successfully." = "VaÅ¡e heslo bolo zmené."; "Your password has expired, please enter a new one below:" = "VaÅ¡e heslo vyprÅ¡alo, zadajte prosím nové nižšie:"; "Password must not be empty." = "Heslo nesmie byÅ¥ prázdne."; "The passwords do not match. Please try again." = "Heslá sa nezhodujú. Skúste to znova."; "Password Grace Period" = "Doba platnosti hesla"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Ostáva Vám % {0} prihlásení do uzamknutia Vášho úÄtu. Zmeňte prosím VaÅ¡e heslo."; "Password about to expire" = "Heslo Äoskoro vyprší"; "Your password is going to expire in %{0} %{1}." = "VaÅ¡e heslo vyprší za % {0} {1}%."; "days" = "dni"; "hours" = "hodiny"; "minutes" = "minúty"; "seconds" = "sekundy"; "Password change failed" = "Zmena hesla zlyhala"; "Password change failed - Permission denied" = "Zmena hesla zlyhala - oprávnenie bolo odopreté"; "Password change failed - Insufficient password quality" = "Zmena hesla zlyhala - nedostatoÄná kvalita hesla"; "Password change failed - Password is too short" = "Zmena hesla zlyhala - heslo je príliÅ¡ krátke"; "Password change failed - Password is too young" = "Zmena hesla nebola úspeÅ¡ná - heslo sa nesmie opakovaÅ¥"; "Password change failed - Password is in history" = "Zmena hesla zlyhala - heslo je v histórii"; "Unhandled policy error: %{0}" = "Nespracovaná politika. Chyba:% {0}"; "Unhandled error response" = "Nespracované chyby na odpoveÄ"; "Password change is not supported." = "Zmena hesla nieje povolená."; "Unhandled HTTP error code: %{0}" = "Nespracované HTTP. Kód chyby:% {0}"; "New password:" = "Nové heslo:"; "Confirmation:" = "PotvrdiÅ¥:"; "Cancel" = "ZruÅ¡iÅ¥"; "Please wait..." = "Prosím Äakajte ..."; SOGo-2.1.1b/UI/MainUI/Ukrainian.lproj/0000755000000000000000000000000012247657027015703 5ustar rootrootSOGo-2.1.1b/UI/MainUI/Ukrainian.lproj/Locale0000644000000000000000000000367312247657027017036 0ustar rootroot/* English */ { NSLanguageName = "Ukrainian"; NSFormalName = "УкраїнÑька"; NSLocaleCode = "uk"; /* ISO 639-1 */ NSLanguageCode = "ukr"; /* ISO 639-2 */ NSParentContext = ""; NSAMPMDesignation = (AM, PM); NSCurrencySymbol = " грн."; NSDateFormatString = "%A %e %B %Y"; NSDateTimeOrdering = DMYH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSEarlierTimeDesignations = ("перший", "оÑтанній", "минулий", "назад"); NSHourNameDesignations = ((0, "північ"), (10, "ранок"), (12, "південь", "обід"), (14, "день"), (19, "вечір")); NSInternationalCurrencyString = UAH; /* ISO 4217 */ NSLaterTimeDesignations = ("пізніше"); NSMonthNameArray = ("Січень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень", "Серпень", "ВереÑень", "Жовтень", "ЛиÑтопад", "Грудень"); NSNextDayDesignations = ("завтра"); NSNextNextDayDesignations = ("завтра"); NSPriorDayDesignations = ("вчора"); NSShortDateFormatString = "%e.%m.%y"; NSShortMonthNameArray = ("Ñіч", "лют", "бер", "кві", "тра", "чер", "лип", "Ñер", "вер", "жов", "лиÑ", "гру"); NSShortTimeDateFormatString = "%e.%m.%y %H:%M"; NSShortWeekDayNameArray = ("Ðд", "Пн", "Ð’Ñ‚", "Ср", "Чт", "Пт", "Сб"); NSThisDayDesignations = ("Ñьогодні", "нині"); NSThousandsSeparator = " "; NSTimeDateFormatString = "%A %e %B %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("ÐеділÑ", "Понеділок", "Вівторок", "Середа", "Четвер", "П’ÑтницÑ", "Субота"); NSYearMonthWeekDesignations = ("рік", "міÑÑць", "тиждень"); NSPositiveCurrencyFormatString = "9 999.00 $"; NSNegativeCurrencyFormatString = "-9 999.00 $"; } SOGo-2.1.1b/UI/MainUI/Ukrainian.lproj/Localizable.strings0000644000000000000000000001531612247657027021545 0ustar rootroot/* this file is in UTF-8 format! */ "title" = "SOGo"; "Username:" = "Лоґін:"; "Password:" = "Пароль:"; "Domain:" = "Домен:"; "Remember username" = "Пам’Ñтати мене"; "Connect" = "Увійти"; "Wrong username or password." = "Ðеправильний лоґін та/або пароль."; "cookiesNotEnabled" = "Ви не можете увійти до ÑиÑтеми, оÑкільки у Вашому Інтернет-переглÑдачі вимкнено cookies. ПроÑимо дозволити Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ñайту викориÑÑ‚Ð°Ð½Ð½Ñ cookies в налаштуваннÑÑ… Вашого переглÑдача."; "browserNotCompatible" = "Ми визначили, що Ваш Інтернет-переглÑдач (browser) не підтримує технології, що викориÑтані на нашому Ñайті. Рекомендуємо одну з ÑуміÑних програм: Firefox, Internet Explorer, Safari, Google Chrome. Звантажити оÑтанню верÑÑ–ÑŽ Firefox можна тут:"; "alternativeBrowsers" = "Ðльтернативно можна викориÑтовувати такі програми:"; "alternativeBrowserSafari" = "Також можна викориÑтовувати Safari."; "Download" = "Звантажити"; "Language:" = "Мова:"; "choose" = "Вибрати ..."; "Arabic" = "العربية"; "Catalan" = "Català"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; "English" = "English"; "Finnish" = "Suomi"; "French" = "Français"; "German" = "Deutsch"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk bokmÃ¥l"; "Polish" = "Polski"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; "About" = "Про ÑиÑтему"; "AboutBox" = "SOGo - це Ñервер групового Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ð±ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ð¹ на оÑнові проекту OpenGroupware.org (OGo) та Ñерверу додатків SOPE. ОÑновна його перевага - це маÑштабованіÑть.

\nSOGo забезпечує зручний веб-Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½Ð° оÑнові технології AJAX та підтримує багато клієнтÑьких програм, заÑтоÑовуючи такі Ñтандартні протоколи: CalDAV, CardDAV та GroupDAV.

\nÐ’ÑÑ– права заÑтережено © 2006-2009 Inverse inc.
\nÐ’ÑÑ– права заÑтережено © 2002-2005 SKYRIX Software AG

\nЦе програмне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¿Ð¾Ð²ÑюджуєтьÑÑ Ð¿Ñ–Ð´ ліцензією GNU GPL верÑÑ–Ñ 2.
\nОкремі чаÑтини цього програмного Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¿Ð¾Ð²ÑюджуютьÑÑ Ð¿Ñ–Ð´ ліцензією GNU LGPL верÑÑ–Ñ 2.

\nЦе вільне програмне забезпеченнÑ: ви можете вільно змінювати його та розповÑюджувати. Ðа це програмне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÑÑƒÑ‚Ð½Ñ Ð“ÐРÐÐТІЯ в межах, визначених законодавÑтвом."; "Your account was locked due to too many failed attempts." = "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾ через велику кількіÑть невдалих Ñпроб авторизації."; "Your account was locked due to an expired password." = "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾, оÑкільки закінчивÑÑ Ñ‚ÐµÑ€Ð¼Ñ–Ð½ дії паролÑ."; "Login failed due to unhandled error case: " = "Ðевдала Ñпроба Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ñ‡ÐµÑ€ÐµÐ· невизначену помилку: "; "Change your Password" = "Змініть Ваш пароль"; "The password was changed successfully." = "Пароль уÑпішно змінено."; "Your password has expired, please enter a new one below:" = "ЗакінчивÑÑ Ñ‚ÐµÑ€Ð¼Ñ–Ð½ дії Вашого паролÑ, будь лаÑка, введіть новий нижче:"; "Password must not be empty." = "Пароль не може бути порожнім."; "The passwords do not match. Please try again." = "Паролі не Ñпівпадають. Будь лаÑка, Ñпробуйте ще раз."; "Password Grace Period" = "Термін дії паролÑ"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "У Ð’Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð¾ÑÑŒ %{0} Ñпроб авторизації, піÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ´Ðµ заблоковано. Будь лаÑка, змініть Ваш пароль в налаштуваннÑÑ… ÑиÑтеми."; "Password about to expire" = "ЗакінчуєтьÑÑ Ñ‚ÐµÑ€Ð¼Ñ–Ð½ дії паролÑ"; "Your password is going to expire in %{0} %{1}." = "Термін дії Вашого Ð¿Ð°Ñ€Ð¾Ð»Ñ Ñпливе через %{0} %{1}."; "days" = "днів"; "hours" = "годин"; "minutes" = "хвилин"; "seconds" = "Ñекунд"; "Password change failed" = "Ðевдала Ñпроба зміни паролÑ"; "Password change failed - Permission denied" = "Ðевдала Ñпроба зміни Ð¿Ð°Ñ€Ð¾Ð»Ñ - ДоÑтуп заборонено"; "Password change failed - Insufficient password quality" = "Ðевдала Ñпроба зміни Ð¿Ð°Ñ€Ð¾Ð»Ñ - ÐедоÑÑ‚Ð°Ñ‚Ð½Ñ ÑтійкіÑть паролÑ"; "Password change failed - Password is too short" = "Ðевдала Ñпроба зміни Ð¿Ð°Ñ€Ð¾Ð»Ñ - Пароль замалий"; "Password change failed - Password is too young" = "Ðевдала Ñпроба зміни Ð¿Ð°Ñ€Ð¾Ð»Ñ - Паролт дуже проÑтий"; "Password change failed - Password is in history" = "Ðевдала Ñпроба зміни Ð¿Ð°Ñ€Ð¾Ð»Ñ - Такий пароль вже вводивÑÑ"; "Unhandled policy error: %{0}" = "Ðевизначена помилка політики: %{0}"; "Unhandled error response" = "Ðевизначений результат помилки"; "Password change is not supported." = "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð·Ð¼Ñ–Ð½Ð¸ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ðµ підтримуєтьÑÑ."; "Unhandled HTTP error code: %{0}" = "Ðевизначений код помилкий HTTP: %{0}"; "New password:" = "Ðовий пароль:"; "Confirmation:" = "ПідтвердженнÑ:"; "Cancel" = "СкаÑувати"; "Please wait..." = "Будь лаÑка, зачекайте..."; SOGo-2.1.1b/UI/MainUI/SOGoUserHomePage.m0000644000000000000000000003463412247657027016101 0ustar rootroot/* SOGoUserHomePage.m - this file is part of SOGo * * Copyright (C) 2007-2010 Inverse inc. * * 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #define intervalSeconds 900 /* 15 minutes */ @interface SOGoUserHomePage : UIxComponent @end @implementation SOGoUserHomePage - (id ) defaultAction { SOGoUserFolder *co; NSString *loginModule; SOGoUserDefaults *ud; NSURL *moduleURL; ud = [[context activeUser] userDefaults]; loginModule = [ud loginModule]; if (!([loginModule isEqualToString: @"Calendar"] || [loginModule isEqualToString: @"Contacts"] || [loginModule isEqualToString: @"Mail"])) { [self errorWithFormat: @"login module '%@' not accepted (must be" @"'Calendar', 'Contacts' or 'Mail')", loginModule]; loginModule = @"Calendar"; } co = [self clientObject]; moduleURL = [NSURL URLWithString: loginModule relativeToURL: [co soURL]]; return [self redirectToLocation: [moduleURL absoluteString]]; } - (void) _fillFreeBusyItems: (unsigned int *) items count: (unsigned int) itemCount withRecords: (NSArray *) records fromStartDate: (NSCalendarDate *) startDate toEndDate: (NSCalendarDate *) endDate { NSArray *emails, *partstates; NSCalendarDate *currentDate; NSDictionary *record; SOGoUser *user; int recordCount, recordMax, count, startInterval, endInterval, i, type; recordMax = [records count]; user = [SOGoUser userWithLogin: [[self clientObject] ownerInContext: context] roles: nil]; for (recordCount = 0; recordCount < recordMax; recordCount++) { record = [records objectAtIndex: recordCount]; if ([[record objectForKey: @"c_isopaque"] boolValue]) { type = 0; // If the event has NO organizer (which means it's the user that has created it) OR // If we are the organizer of the event THEN we are automatically busy if ([[record objectForKey: @"c_orgmail"] length] == 0 || [user hasEmail: [record objectForKey: @"c_orgmail"]]) { type = 1; } else { // We check if the user has accepted/declined or needs action // on the current event. emails = [[record objectForKey: @"c_partmails"] componentsSeparatedByString: @"\n"]; for (i = 0; i < [emails count]; i++) { if ([user hasEmail: [emails objectAtIndex: i]]) { // We now fetch the c_partstates array and get the participation // status of the user for the event partstates = [[record objectForKey: @"c_partstates"] componentsSeparatedByString: @"\n"]; if (i < [partstates count]) { type = ([[partstates objectAtIndex: i] intValue] < 2 ? 1 : 0); } break; } } } currentDate = [record objectForKey: @"startDate"]; if ([currentDate earlierDate: startDate] == currentDate) startInterval = 0; else startInterval = ([currentDate timeIntervalSinceDate: startDate] / intervalSeconds); currentDate = [record objectForKey: @"endDate"]; if ([currentDate earlierDate: endDate] == endDate) endInterval = itemCount - 1; else endInterval = ([currentDate timeIntervalSinceDate: startDate] / intervalSeconds); if (type == 1) for (count = startInterval; count < endInterval; count++) *(items + count) = 1; } } } - (NSString *) _freeBusyFromStartDate: (NSCalendarDate *) startDate toEndDate: (NSCalendarDate *) endDate forFreeBusy: (SOGoFreeBusyObject *) fb andContact: (NSString *) uid { NSMutableArray *freeBusy; unsigned int *freeBusyItems; NSTimeInterval interval; unsigned int count, intervals; interval = [endDate timeIntervalSinceDate: startDate] + 60; intervals = interval / intervalSeconds; /* slices of 15 minutes */ freeBusyItems = NSZoneCalloc (NULL, intervals, sizeof (int)); [self _fillFreeBusyItems: freeBusyItems count: intervals withRecords: [fb fetchFreeBusyInfosFrom: startDate to: endDate forContact: uid] fromStartDate: startDate toEndDate: endDate]; freeBusy = [NSMutableArray arrayWithCapacity: intervals]; for (count = 0; count < intervals; count++) [freeBusy addObject: [NSString stringWithFormat: @"%d", *(freeBusyItems + count)]]; NSZoneFree (NULL, freeBusyItems); return [freeBusy componentsJoinedByString: @","]; } - (id ) readFreeBusyAction { WOResponse *response; SOGoFreeBusyObject *freebusy; NSCalendarDate *startDate, *endDate; NSString *queryDay, *uid; NSTimeZone *uTZ; SOGoUser *user; user = [context activeUser]; uTZ = [[user userDefaults] timeZone]; uid = [self queryParameterForKey: @"uid"]; queryDay = [self queryParameterForKey: @"sday"]; if ([queryDay length] == 8) { startDate = [NSCalendarDate dateFromShortDateString: queryDay andShortTimeString: @"0000" inTimeZone: uTZ]; queryDay = [self queryParameterForKey: @"eday"]; if ([queryDay length] == 8) { endDate = [NSCalendarDate dateFromShortDateString: queryDay andShortTimeString: @"2359" inTimeZone: uTZ]; if ([startDate earlierDate: endDate] == endDate) response = [self responseWithStatus: 403 andString: @"Start date is later than end date."]; else { freebusy = [self clientObject]; response = [self responseWithStatus: 200 andString: [self _freeBusyFromStartDate: startDate toEndDate: endDate forFreeBusy: freebusy andContact: uid]]; } } else response = [self responseWithStatus: 403 andString: @"Invalid end date."]; } else response = [self responseWithStatus: 403 andString: @"Invalid start date."]; return response; } - (NSString *) _logoutRedirectURL { NSString *redirectURL; SOGoSystemDefaults *sd; id container; sd = [SOGoSystemDefaults sharedSystemDefaults]; if ([[sd authenticationType] isEqualToString: @"cas"]) redirectURL = [SOGoCASSession CASURLWithAction: @"logout" andParameters: nil]; else { container = [[self clientObject] container]; redirectURL = [container baseURLInContext: context]; } return redirectURL; } - (WOCookie *) _logoutCookieWithDate: (NSCalendarDate *) date { SOGoWebAuthenticator *auth; NSString *cookieName, *appName; WOCookie *cookie; cookie = nil; auth = [[self clientObject] authenticatorInContext: context]; if ([auth respondsToSelector: @selector (cookieNameInContext:)]) { cookieName = [auth cookieNameInContext: context]; if ([cookieName length]) { cookie = [WOCookie cookieWithName: cookieName value: @"discard"]; appName = [[context request] applicationName]; [cookie setPath: [NSString stringWithFormat: @"/%@/", appName]]; [cookie setExpires: [date yesterday]]; } } return cookie; } - (id ) logoffAction { SOGoWebAuthenticator *auth; NSString *userName, *value; WOResponse *response; NSCalendarDate *date; WOCookie *cookie; NSArray *creds; userName = [[context activeUser] login]; [self logWithFormat: @"user '%@' logged off", userName]; response = [self redirectToLocation: [self _logoutRedirectURL]]; date = [NSCalendarDate calendarDate]; [date setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @"GMT"]]; // We cleanup the memecached/database session cache. We do this before // invoking _logoutCookieWithDate: in order to obtain its value. auth = [[self clientObject] authenticatorInContext: context]; if ([auth respondsToSelector: @selector (cookieNameInContext:)]) { value = [[context request] cookieValueForKey: [auth cookieNameInContext: context]]; creds = [auth parseCredentials: value]; if ([creds count] > 1) [SOGoSession deleteValueForSessionKey: [creds objectAtIndex: 1]]; } cookie = [self _logoutCookieWithDate: date]; if (cookie) [response addCookie: cookie]; [response setHeader: [date rfc822DateString] forKey: @"Last-Modified"]; [response setHeader: @"no-store, no-cache, must-revalidate," @" max-age=0, post-check=0, pre-check=0" forKey: @"Cache-Control"]; [response setHeader: @"no-cache" forKey: @"Pragma"]; return response; } - (NSMutableArray *) _usersForResults: (NSArray *) users inDomain: (NSString *) domain { NSString *uid; NSDictionary *contact; NSString *contactInfo, *login; NSMutableArray *jsonResponse, *jsonLine; NSArray *allUsers; int count, max; BOOL activeUserIsInDomain; login = [[context activeUser] login]; activeUserIsInDomain = ([domain length] == 0 || [[[context activeUser] domain] isEqualToString: domain]); // We sort our array - this is pretty useful for the Web // interface of SOGo. allUsers = [users sortedArrayUsingSelector: @selector (caseInsensitiveDisplayNameCompare:)]; max = [allUsers count]; jsonResponse = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { contact = [allUsers objectAtIndex: count]; uid = [contact objectForKey: @"c_uid"]; // We do NOT return the current authenticated user if (!activeUserIsInDomain || ![uid isEqualToString: login]) { jsonLine = [NSMutableArray arrayWithCapacity: 4]; if ([domain length]) uid = [NSString stringWithFormat: @"%@@%@", uid, domain]; [jsonLine addObject: uid]; [jsonLine addObject: [contact objectForKey: @"cn"]]; [jsonLine addObject: [contact objectForKey: @"c_email"]]; [jsonLine addObject: [NSNumber numberWithBool: [[contact objectForKey: @"isGroup"] boolValue]]]; contactInfo = [contact objectForKey: @"c_info"]; if (contactInfo) [jsonLine addObject: contactInfo]; [jsonResponse addObject: jsonLine]; } } return jsonResponse; } - (id ) usersSearchAction { NSMutableArray *users; NSArray *currentUsers; NSString *contact, *domain, *uidDomain; NSEnumerator *visibleDomains; id result; SOGoUserManager *um; SOGoSystemDefaults *sd; contact = [self queryParameterForKey: @"search"]; if ([contact length]) { um = [SOGoUserManager sharedUserManager]; sd = [SOGoSystemDefaults sharedSystemDefaults]; domain = [[context activeUser] domain]; uidDomain = [sd enableDomainBasedUID]? domain : nil; users = [self _usersForResults: [um fetchUsersMatching: contact inDomain: domain] inDomain: uidDomain]; if ([domain length]) { // Add results from visible domains visibleDomains = [[sd visibleDomainsForDomain: domain] objectEnumerator]; while ((domain = [visibleDomains nextObject])) { currentUsers = [self _usersForResults: [um fetchUsersMatching: contact inDomain: domain] inDomain: uidDomain]; [users addObjectsFromArray: currentUsers]; } } result = [self responseWithStatus: 200 andJSONRepresentation: users]; } else result = [NSException exceptionWithHTTPStatus: 400 reason: @"missing 'search' parameter"]; return result; } - (WOResponse *) _foldersResponseForResults: (NSArray *) folders { WOResponse *response; NSEnumerator *foldersEnum; NSDictionary *currentFolder; response = [context response]; [response setStatus: 200]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"Content-Type"]; foldersEnum = [folders objectEnumerator]; while ((currentFolder = [foldersEnum nextObject])) [response appendContentString: [currentFolder keysWithFormat: @";%{displayName}:%{name}:%{type}"]]; return response; } - (id ) foldersSearchAction { NSString *folderType; NSArray *folders; id result; SOGoUserFolder *userFolder; folderType = [self queryParameterForKey: @"type"]; userFolder = [self clientObject]; folders = [userFolder foldersOfType: folderType forUID: [userFolder ownerInContext: context]]; result = [self _foldersResponseForResults: folders]; return result; } - (id) recoverAction { return [self responseWithStatus: 200 andString: @"Full recovery in place."]; } @end SOGo-2.1.1b/UI/MainUI/SOGoProfile.sql0000644000000000000000000000027512247657027015512 0ustar rootroot-- -- (C) 2004-2005 SKYRIX Software AG -- (C) 2006-2007 Inverse inc. -- CREATE TABLE @{tableName} ( c_uid VARCHAR(255) NOT NULL PRIMARY KEY, c_defaults TEXT, c_settings TEXT ); SOGo-2.1.1b/UI/MailPartViewers/0000755000000000000000000000000012247657031014564 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/German.lproj/0000755000000000000000000000000012247657027017127 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/German.lproj/Localizable.strings0000644000000000000000000000335312247657027022767 0ustar rootrootACCEPTED = "akzeptiert"; COMPLETED = "abgeschlossen"; DECLINED = "zurückgewiesen"; DELEGATED = "delegiert"; "IN-PROCESS" = "in Bearbeitung"; "NEEDS-ACTION" = "Reaktion erwartet"; TENTATIVE = "vorläufig"; organized_by_you = "von Ihnen organisiert"; you_are_an_attendee = "Sie sind ein Teilnehmer"; add_info_text = "iMIP 'ADD' Anfragen werden von SOGo noch nicht unterstützt."; publish_info_text = "Der Absender informiert Sie über den angefügten Termin."; cancel_info_text = "Ihre Einladung zu dem Termin, oder der gesamte Termin wurde abgesagt."; request_info_no_attendee = "schlägt den Teilnehmern einen Termin vor. Sie sind kein vorgesehener Teilnehmer und erhalten diese Nachricht lediglich als Hinweis."; Appointment = "Termin"; "Status Update" = "Statusänderung"; was = "war"; Organizer = "Organisator"; Time = "Zeit"; Attendees = "Teilnehmer"; request_info = "lädt sie ein, an einem Treffen teilzunehmen."; "Add to calendar" = "Zum Kalender hinzufügen"; "Delete from calendar" = "Aus dem Kalender entfernen"; "Update status" = "Status aktualisieren"; Accept = "Annehmen"; Decline = "Ablehnen"; Tentative = "Vorläufig"; "Delegate ..." = "Delegieren ..."; "Delegated to" = "Delegiert an"; "Update status in calendar" = "Kalender Status aktualisieren"; "delegated from" = "delegiert von"; reply_info_no_attendee = "Sie haben eine Antwort auf eine Termineinladung von einem Nicht-Teilnehmer erhalten."; reply_info = "Dies ist eine Anwort auf eine Termineinladung von Ihnen."; "to" = "an"; "Untitled" = "Ohne Titel"; "Size" = "Größe"; "Digital signature is not valid" = "Digitale Signatur ist nicht gültig"; "Message is signed" = "Nachricht ist signiert"; "Subject" = "Betreff"; "From" = "Von"; "Date" = "Datum"; "To" = "An"; "Issuer" = "Aussteller"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartICalViewer.m0000644000000000000000000002763112247657027021032 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG Copyright (C) 2006-2013 Inverse inc. This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with SOGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* UIxMailPartICalViewer Show plain/calendar mail parts. */ #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "UIxMailPartICalViewer.h" @implementation UIxMailPartICalViewer - (void) dealloc { [storedEventObject release]; [storedEvent release]; [attendee release]; [item release]; [inCalendar release]; [dateFormatter release]; [super dealloc]; } /* maintain caches */ - (void) resetPathCaches { [super resetPathCaches]; inEvent = nil; [inCalendar release]; inCalendar = nil; [storedEventObject release]; storedEventObject = nil; [storedEvent release]; storedEvent = nil; /* not strictly path-related, but useless without it anyway: */ [attendee release]; attendee = nil; [item release]; item = nil; } /* accessors */ - (iCalCalendar *) inCalendar { if (!inCalendar) { inCalendar = [iCalCalendar parseSingleFromSource: [self flatContentAsString]]; [inCalendar retain]; } return inCalendar; } - (BOOL) couldParseCalendar { return ([self inCalendar] != nil); } - (iCalEvent *) inEvent { NSArray *events; if (!inEvent) { events = [[self inCalendar] events]; if ([events count] > 0) inEvent = [events objectAtIndex: 0]; } return inEvent; } /* formatters */ - (SOGoDateFormatter *) dateFormatter { if (!dateFormatter) { dateFormatter = [[context activeUser] dateFormatterInContext: context]; [dateFormatter retain]; } return dateFormatter; } /* below is copied from UIxAppointmentView, can we avoid that? */ - (void) setAttendee: (id) _attendee { ASSIGN (attendee, _attendee); } - (id) attendee { return attendee; } - (NSString *) _personForDisplay: (iCalPerson *) person { NSString *fn, *email, *result; fn = [person cnWithoutQuotes]; email = [person rfc822Email]; if ([fn length]) result = [NSString stringWithFormat: @"%@ <%@>", fn, email]; else result = email; return result; } - (NSString *) attendeeForDisplay { return [self _personForDisplay: attendee]; } - (void) setItem: (id) _item { ASSIGN(item, _item); } - (id) item { return item; } - (NSCalendarDate *) startCalendarDate { NSCalendarDate *date; SOGoUserDefaults *ud; date = [[self inEvent] startDate]; ud = [[context activeUser] userDefaults]; [date setTimeZone: [ud timeZone]]; return date; } - (NSString *) startDate { return [[self dateFormatter] formattedDate: [self startCalendarDate]]; } - (NSString *) startTime { return [[self dateFormatter] formattedTime: [self startCalendarDate]]; } - (NSCalendarDate *) endCalendarDate { NSCalendarDate *date; SOGoUserDefaults *ud; date = [[self inEvent] endDate]; ud = [[context activeUser] userDefaults]; [date setTimeZone: [ud timeZone]]; return date; } - (NSString *) endDate { NSCalendarDate *aDate; if ([[self inEvent] isAllDay]) aDate = [[self endCalendarDate] dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:-1]; else aDate = [self endCalendarDate]; return [[self dateFormatter] formattedDate: aDate]; } - (NSString *) endTime { return [[self dateFormatter] formattedTime: [self endCalendarDate]]; } - (BOOL) isEndDateOnSameDay { NSCalendarDate *aDate; if ([[self inEvent] isAllDay]) aDate = [[self endCalendarDate] dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:-1]; else aDate = [self endCalendarDate]; return [[self startCalendarDate] isDateOnSameDay: aDate]; } - (NSTimeInterval) duration { return [[self endCalendarDate] timeIntervalSinceDate:[self startCalendarDate]]; } /* calendar folder support */ - (SOGoAppointmentFolder *) calendarFolder { /* return scheduling calendar of currently logged-in user */ SOGoUser *user; id folder; user = [context activeUser]; folder = [[user homeFolderInContext: context] lookupName: @"Calendar" inContext: context acquire: NO]; return [folder lookupName: @"personal" inContext: context acquire: NO]; } - (BOOL) hasCalendarAccess { return [[context activeUser] canAccessModule: @"Calendar"]; } - (SOGoAppointmentObject *) storedEventObject { /* lookup object in the users Calendar */ SOGoAppointmentFolder *calendar; NSString *filename; if (!storedEventFetched) { if ([self hasCalendarAccess]) { calendar = [self calendarFolder]; if ([calendar isKindOfClass: [NSException class]]) [self errorWithFormat:@"Did not find Calendar folder: %@", calendar]; else { filename = [calendar resourceNameForEventUID:[[self inEvent] uid]]; if (filename) { storedEventObject = [calendar lookupName: filename inContext: [self context] acquire: NO]; if ([storedEventObject isKindOfClass: [NSException class]]) storedEventObject = nil; else [storedEventObject retain]; } } } storedEventFetched = YES; } return storedEventObject; } - (BOOL) isEventStoredInCalendar { NSCalendarDate *recurrenceId; NSString *recurrenceTime; BOOL isInCalendar; recurrenceId = [[self inEvent] recurrenceId]; if (recurrenceId) { recurrenceTime = [NSString stringWithFormat: @"%f", [recurrenceId timeIntervalSince1970]]; isInCalendar = ([[self storedEventObject] lookupOccurrence: recurrenceTime] != nil); } else isInCalendar = ([self storedEventObject] != nil); return isInCalendar; } - (iCalEvent *) storedEvent { if (!storedEvent) { NSCalendarDate *recurrenceId; recurrenceId = [[self inEvent] recurrenceId]; if (recurrenceId == nil) storedEvent = [[self storedEventObject] component: NO secure: NO]; else { // Find the specific occurence within the repeating vEvent. NSString *recurrenceTime; iCalPerson *organizer; recurrenceTime = [NSString stringWithFormat: @"%f", [recurrenceId timeIntervalSince1970]]; storedEvent = (iCalEvent*)[[self storedEventObject] lookupOccurrence: recurrenceTime]; if (storedEvent == nil) // If no occurence found, create one storedEvent = (iCalEvent*)[storedEventObject newOccurenceWithID: recurrenceTime]; // Add organizer to occurence if not present organizer = [storedEvent organizer]; if (organizer == nil || [organizer isVoid]) { organizer = [(iCalEntityObject *)[[storedEvent parent] firstChildWithTag: [storedEventObject componentTag]] organizer]; [storedEvent setOrganizer: organizer]; } } [storedEvent retain]; } return storedEvent; } /* organizer tracking */ - (NSString *) loggedInUserEMail { NSDictionary *identity; identity = [[context activeUser] primaryIdentity]; return [identity objectForKey: @"email"]; } - (iCalEvent *) authorativeEvent { iCalEvent *authorativeEvent; [self storedEvent]; if (!storedEvent || ([storedEvent compare: [self inEvent]] == NSOrderedAscending)) authorativeEvent = inEvent; else authorativeEvent = [self storedEvent]; return authorativeEvent; } - (BOOL) isLoggedInUserTheOrganizer { return [[self authorativeEvent] userIsOrganizer: [context activeUser]]; } - (BOOL) isLoggedInUserAnAttendee { return [[self authorativeEvent] userIsAttendee: [context activeUser]]; } - (NSString *) currentAttendeeClass { NSString *cssClass; cssClass = [[attendee partStatWithDefault] lowercaseString]; if ([[attendee rfc822Email] isEqualToString: [self loggedInUserEMail]]) cssClass = [cssClass stringByAppendingString: @" attendeeUser"]; return cssClass; } /* derived fields */ - (NSString *) organizerDisplayName { iCalPerson *organizer; NSString *value; organizer = [[self authorativeEvent] organizer]; if ([organizer isVoid]) value = @"[todo: no organizer set, use 'from']"; else value = [self _personForDisplay: organizer]; return value; } /* replies */ - (NGImap4EnvelopeAddress *) replySenderAddress { /* The iMIP reply is the sender of the mail, the 'attendees' are NOT set to the actual attendees. BUT the attendee field contains the reply-status! */ id tmp; tmp = [[self clientObject] fromEnvelopeAddresses]; if ([tmp count] == 0) return nil; return [tmp objectAtIndex:0]; } - (NSString *) replySenderEMail { return [[self replySenderAddress] email]; } - (NSString *) replySenderBaseEMail { return [[self replySenderAddress] baseEMail]; } - (iCalPerson *) inReplyAttendee { NSArray *attendees; attendees = [[self inEvent] attendees]; if ([attendees count] == 0) return nil; if ([attendees count] > 1) [self warnWithFormat:@"More than one attendee in REPLY: %@", attendees]; return [attendees objectAtIndex:0]; } - (iCalPerson *) currentUserAttendee { iCalPerson *currentUser; currentUser = [[self authorativeEvent] userAsAttendee: [context activeUser]]; return currentUser; } - (iCalPerson *) storedReplyAttendee { /* TODO: since an attendee can have multiple email addresses, maybe we should translate the email to an internal uid and then retrieve all emails addresses for matching the participant. Note: -findAttendeeWithEmail: does not parse the email! */ iCalEvent *e; iCalPerson *p; p = nil; e = [self storedEvent]; if (e) { p = [e findAttendeeWithEmail: [self replySenderBaseEMail]]; if (!p) p = [e findAttendeeWithEmail:[self replySenderEMail]]; } return p; } - (BOOL) isReplySenderAnAttendee { return ([self storedReplyAttendee] != nil); } - (iCalPerson *) _emailParticipantWithEvent: (iCalEvent *) event { NSString *emailFrom; SOGoMailObject *mailObject; NGImap4EnvelopeAddress *address; mailObject = [[self clientObject] mailObject]; address = [[mailObject fromEnvelopeAddresses] objectAtIndex: 0]; emailFrom = [address baseEMail]; return [event findAttendeeWithEmail: emailFrom]; } - (BOOL) hasSenderStatusChanged { iCalPerson *emailParticipant, *calendarParticipant; [self inEvent]; [self storedEvent]; emailParticipant = [self _emailParticipantWithEvent: inEvent]; calendarParticipant = [self _emailParticipantWithEvent: storedEvent]; return ([[emailParticipant partStat] caseInsensitiveCompare: [calendarParticipant partStat]] != NSOrderedSame); } - (BOOL) canOriginalEventBeUpdated { return ([self hasCalendarAccess] && [self hasSenderStatusChanged] && ([[inEvent sequence] compare: [storedEvent sequence]] != NSOrderedAscending)); } @end /* UIxMailPartICalViewer */ SOGo-2.1.1b/UI/MailPartViewers/UIxMailSizeFormatter.m0000644000000000000000000000274612247657027021007 0ustar rootroot/* Copyright (C) 2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import "UIxMailSizeFormatter.h" @implementation UIxMailSizeFormatter + (id)sharedMailSizeFormatter { static UIxMailSizeFormatter *fmt = nil; // THREAD if (fmt == nil) fmt = [[self alloc] init]; return fmt; } /* formatting */ - (NSString *)stringForSize:(unsigned int)size { char buf[128]; if (size < 1024) sprintf(buf, "%d", size); else if (size < 1024 * 1024) sprintf(buf, "%.1fK", ((double)size / 1024)); else sprintf(buf, "%.1fM", ((double)size / 1024 / 1024)); return [NSString stringWithCString:buf]; } - (NSString *)stringForObjectValue:(id)_object { return [self stringForSize:[_object unsignedIntValue]]; } @end /* UIxMailSizeFormatter */ SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartHTMLViewer.h0000644000000000000000000000234412247657031020746 0ustar rootroot/* UIxMailPartHTMLViewer.h - this file is part of SOGo * * Copyright (C) 2007, 2008 Inverse inc. * * 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 UIXMAILPARTHTMLVIEWER_H #define UIXMAILPARTHTMLVIEWER_H #import "UIxMailPartViewer.h" @interface UIxMailPartHTMLViewer : UIxMailPartViewer { id handler; } - (NSString *) flatContentAsString; @end @interface UIxMailPartExternalHTMLViewer : UIxMailPartViewer { id handler; } - (NSString *) flatContentAsString; @end #endif /* UIXMAILPARTHTMLVIEWER_H */ SOGo-2.1.1b/UI/MailPartViewers/GNUmakefile0000644000000000000000000000232012247657027016640 0ustar rootroot# GNUstep makefile include ../common.make BUNDLE_NAME = MailPartViewers MailPartViewers_PRINCIPAL_CLASS = MailPartViewersProduct MailPartViewers_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh MailPartViewers_OBJC_FILES += \ MailPartViewersProduct.m \ \ UIxMailRenderingContext.m \ UIxMailSizeFormatter.m \ \ UIxMailPartViewer.m \ UIxMailPartTextViewer.m \ UIxMailPartHTMLViewer.m \ UIxMailPartImageViewer.m \ UIxMailPartLinkViewer.m \ UIxMailPartMixedViewer.m \ UIxMailPartSignedViewer.m \ UIxMailPartAlternativeViewer.m \ UIxMailPartMessageViewer.m \ UIxMailPartICalViewer.m \ \ UIxMailPartICalActions.m MailPartViewers_RESOURCE_FILES += \ product.plist \ MailPartViewers_LOCALIZED_RESOURCE_FILES += \ Localizable.strings # make ADDITIONAL_INCLUDE_DIRS += $(shell xml2-config --cflags) ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ -L../../SoObjects/Mailer/obj -L../../SoObjects/Appointments/obj -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartImageViewer.m0000644000000000000000000000176212247657027021241 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import #import "UIxMailPartViewer.h" @interface UIxMailPartImageViewer : UIxMailPartViewer { } @end @implementation UIxMailPartImageViewer @end /* UIxMailPartImageViewer */ SOGo-2.1.1b/UI/MailPartViewers/COPYING0000644000000000000000000006130312247657027015627 0ustar rootroot GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartAlternativeViewer.m0000644000000000000000000001106112247657027022466 0ustar rootroot/* Copyright (C) 2007-2009 Inverse inc. Copyright (C) 2004 SKYRIX Software AG This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import #import #import "UIxMailPartViewer.h" #import "UIxMailRenderingContext.h" /* UIxMailPartAlternativeViewer Display multipart/alternative parts. Most common application is for messages which contain text/html and text/plain, but it is also used in other contexts, eg in OGo appointment mails. TODO: We might want to give the user the possibility to access all parts of the alternative set. */ @interface UIxMailPartAlternativeViewer : UIxMailPartViewer { id childInfo; NSUInteger childIndex; } @end @implementation UIxMailPartAlternativeViewer - (void) dealloc { [childInfo release]; [super dealloc]; } /* caches */ - (void) resetBodyInfoCaches { [childInfo release]; childInfo = nil; childIndex = 0; [super resetBodyInfoCaches]; } /* part selection */ - (NSArray *) childPartTypes { NSMutableArray *types; NSUInteger i, count; NSArray *childParts; childParts = [[self bodyInfo] valueForKey:@"parts"]; count = [childParts count]; types = [NSMutableArray arrayWithCapacity:count]; for (i = 0; i < count; i++) { NSString *mt, *st; mt = [[[childParts objectAtIndex:i] valueForKey:@"type"] lowercaseString]; st = [[[childParts objectAtIndex:i] valueForKey:@"subtype"] lowercaseString]; mt = [[mt stringByAppendingString:@"/"] stringByAppendingString:st]; [types addObject:mt ? (id)mt : (id)[NSNull null]]; } return types; } - (NSUInteger) _preferredTypesPart: (NSArray *) types { NSUInteger count, max; NSUInteger part; const NSString *priorities[] = { @"multipart/related", @"multipart/mixed", @"text/calendar", @"text/html", @"text/plain" }; part = NSNotFound; max = sizeof (priorities) / sizeof (NSString *); for (count = 0; count < max; count++) { part = [types indexOfObject: priorities[count]]; if (part != NSNotFound) break; } return part; } - (int) _selectPartIndexFromTypes: (NSArray *) _types { /* returns the index of the selected part or NSNotFound */ NSUInteger count, max, part; part = [self _preferredTypesPart: _types]; if (part == NSNotFound) { max = [_types count]; /* then we scan for other text types and choose the first one found */ for (count = 0; count < max; count++) if ([[_types objectAtIndex: count] hasPrefix:@"text/"]) { part = count; break; } } if (part == NSNotFound) part = 0; /* as a fallback, we select the first available part */ return part; } - (void) selectChildInfo { NSUInteger idx; [childInfo release]; childInfo = nil; childIndex = 0; idx = [self _selectPartIndexFromTypes: [self childPartTypes]]; if (idx == NSNotFound) { [self errorWithFormat:@"could not select a part of types: %@", [self childPartTypes]]; return; } childIndex = idx + 1; childInfo = [[[[self bodyInfo] valueForKey:@"parts"] objectAtIndex:idx] retain]; } /* accessors */ - (id) childInfo { if (!childInfo) [self selectChildInfo]; return childInfo; } - (NSUInteger) childIndex { if (!childIndex) [self selectChildInfo]; return childIndex - 1; } - (NSString *) childPartName { return [NSString stringWithFormat: @"%u", (unsigned int) ([self childIndex] + 1)]; } - (id) childPartPath { NSArray *pp; pp = [self partPath]; return [pp count] > 0 ? (id)[pp arrayByAddingObject:[self childPartName]] : (id)[NSArray arrayWithObject:[self childPartName]]; } /* nested viewers */ - (id) contentViewerComponent { id info; info = [self childInfo]; return [[[self context] mailRenderingContext] viewerForBodyInfo:info]; } @end /* UIxMailPartAlternativeViewer */ SOGo-2.1.1b/UI/MailPartViewers/Czech.lproj/0000755000000000000000000000000012247657027016752 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Czech.lproj/Localizable.strings0000644000000000000000000000333512247657027022612 0ustar rootrootACCEPTED = "zúÄastní se"; COMPLETED = "hotové"; DECLINED = "nezúÄastní se"; DELEGATED = "delegované"; "IN-PROCESS" = "probíhající"; "NEEDS-ACTION" = "vyžaduje akci"; TENTATIVE = "nezávaznÄ›"; organized_by_you = "vámi organizované"; you_are_an_attendee = "úÄastníte se"; add_info_text = "iMIP 'PŘIDAT' žádosti jeÅ¡tÄ› není v SOGo podporováno."; publish_info_text = "Odesílatel Vás informuje o pÅ™iložené události."; cancel_info_text = "VaÅ¡e pozvánka nebo celá událost byla zruÅ¡ena."; request_info_no_attendee = "navrhuje setkání úÄastníků. Tento mail jste obdrželi jako oznámení, nejste nastaveni jako úÄastník."; Appointment = "Schůzka"; "Status Update" = "Aktualizace stavu"; was = "bylo"; Organizer = "Organizátor"; Time = "ÄŒas"; Attendees = "ÚÄastníci"; request_info = "Vás zve k úÄasti na setkání."; "Add to calendar" = "PÅ™idat do kalendáře"; "Delete from calendar" = "Vymazat z kalendáře"; "Update status" = "Aktualizovat status"; Accept = "ZúÄastním se"; Decline = "NezúÄastním se"; Tentative = "NezávaznÄ›"; "Delegate ..." = "Delegovat ..."; "Delegated to" = "Delegovat na"; "Update status in calendar" = "Aktualizovat status v kalendáři"; "delegated from" = "delegováno od"; reply_info_no_attendee = "Obdrželi jste odpovÄ›Ä k plánované události, ale odesílatel se události neúÄastní."; reply_info = "Toto je odpovÄ›Ä na pozvánku k událost, kterou jste vytvoÅ™ili vy."; "to" = "komu"; "Untitled" = "Bez názvu"; "Size" = "Velikost"; "Digital signature is not valid" = "Elektronický podpis není validní"; "Message is signed" = "Zpráva je podepsána"; "Subject" = "PÅ™edmÄ›t"; "From" = "Odesílatel"; "Date" = "Datum"; "To" = "Komu"; "Issuer" = "Vydavatel"; SOGo-2.1.1b/UI/MailPartViewers/Welsh.lproj/0000755000000000000000000000000012247657027017000 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Welsh.lproj/Localizable.strings0000644000000000000000000000311112247657027022630 0ustar rootrootACCEPTED = "Derbynwyd"; COMPLETED = "Cwblhawyd"; DECLINED = "gwrthodwyd"; DELEGATED = "dirprwyedig"; "IN-PROCESS" = "mewn proses"; "NEEDS-ACTION" = "angen gweithred"; TENTATIVE = "petrus"; organized_by_you = "trefnwyd gennych chi"; you_are_an_attendee = "yr ydych yn mynychu"; add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; publish_info_text = "Mae'r anfonwr yn eich hysbysu o'r digwyddiad atodol."; cancel_info_text = "Cafodd eich gwahoddiad i'r holl ddigwyddiad ei ganslo."; request_info_no_attendee = "yn cynnig cyfarfod i'r holl rhai sy'n mynychu. Rydych yn derbyn yr ebost yma fel hysbysiad, nid ydych wedi cael eich rhestri fel cyfrannogwr."; Appointment = "Apwyntiad"; Organizer = "Trefnwr"; Time = "Amser"; Attendees = "Mynychwyr"; request_info = "yn eich gwahodd i gyfarfod."; "Add to calendar" = "Ychwanegu i'r calendr"; "Delete from calendar" = "Dileu o'r calendr"; "Update status" = "Diweddaru statws"; Accept = "Derbyn"; Decline = "Gwrthod"; Tentative = "Petrus"; "Delegate ..." = "Delegate ..."; "Delegated to" = "Delegated to"; "Update status in calendar" = "Diweddaru statws yn y calendr"; "delegated from" = "delegated from"; reply_info_no_attendee = "Rydych wedi derbyn ymateb i digwyddiad ond nid yw'r anfonwr yn cyfranogwr."; reply_info = "Dyma ymateb i wahoddiad i digwyddiad a wnaed gennych chi."; "to" = "at"; "Untitled" = "heb deitl"; "Size" = "maint"; "Digital signature is not valid" = "Digital signature is not valid"; "Message is signed" = "Message is signed"; "Subject" = "Subject"; "From" = "From"; "Date" = "Date"; "To" = "To"; "Issuer" = "Issuer"; SOGo-2.1.1b/UI/MailPartViewers/BrazilianPortuguese.lproj/0000755000000000000000000000000012247657027021714 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings0000644000000000000000000000324312247657027025552 0ustar rootrootACCEPTED = "aceitado"; COMPLETED = "completado"; DECLINED = "declinado"; DELEGATED = "apagado"; "IN-PROCESS" = "em processamento"; "NEEDS-ACTION" = "ações necessárias"; TENTATIVE = "tentativa"; organized_by_you = "organizado por você"; you_are_an_attendee = "você é um participante"; add_info_text = "As solicitações iMIP 'ADD' ainda não são suportadas pelo SOGo."; publish_info_text = "O solicitante lhe informa sobre um evento anexo."; cancel_info_text = "Seu convite ou evento foi cancelado."; request_info_no_attendee = "está propondo um reunião aos participantes. Você está recebendo este email como uma notificação, você não está agendado como um particiopante."; Appointment = "Apontamento"; Organizer = "Organizador"; Time = "Hora"; Attendees = "Participantes"; request_info = "convidou você para participar de uma reunião."; "Add to calendar" = "Adicionar ao calendário"; "Delete from calendar" = "Apagar do calendário"; "Update status" = "Atualizar status"; Accept = "Aceitar"; Decline = "Declinar"; Tentative = "Tentativa"; "Delegate ..." = "Delegado ..."; "Delegated to" = "Delegado para"; "Update status in calendar" = "Atualizar status no calendário"; "delegated from" = "delegado de"; reply_info_no_attendee = "Você recebeu uma resposta de um evento agendado, mas o remetente da resposta não é um participante."; reply_info = "Esta é uma resposta de um convite feito por você."; "to" = "para"; "Untitled" = "Sem título"; "Size" = "Tamanho"; "Digital signature is not valid" = "Assinatura digital inválida"; "Message is signed" = "A Mensagem é assinada"; "Subject" = "Assunto"; "From" = "De"; "Date" = "Data"; "To" = "Para"; "Issuer" = "Emissor"; SOGo-2.1.1b/UI/MailPartViewers/NorwegianNynorsk.lproj/0000755000000000000000000000000012247657027021233 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/NorwegianNynorsk.lproj/Localizable.strings0000644000000000000000000000307312247657027025072 0ustar rootrootACCEPTED = "akseptert"; COMPLETED = "avsluttet"; DECLINED = "avvist"; DELEGATED = "delegert"; "IN-PROCESS" = "pÃ¥gÃ¥ende"; "NEEDS-ACTION" = "behøver handling"; TENTATIVE = "foreløpig"; organized_by_you = "organisert av deg"; you_are_an_attendee = "du er en deltager"; add_info_text = "iMIP 'ADD' støttes ikke enda av SOGo."; publish_info_text = "Avsenderen informerer deg om vedlagte arrangement."; cancel_info_text = "Din invitasjon eller hele arrangementet er avlyst."; request_info_no_attendee = "forslÃ¥r et møte til deltakerene. Du har fÃ¥tt meldingen for informasjon, men er ikke palnlagt som en deltaker."; Appointment = "Møte"; Organizer = "Arrangør"; Time = "Tid"; Attendees = "Deltakere"; request_info = "inviterer deg til Ã¥ delta i et møte."; "Add to calendar" = "Legg inn i kalenderen"; "Delete from calendar" = "Ta bort fra kalenderen"; "Update status" = "Oppdatere status"; Accept = "Godta"; Decline = "AvslÃ¥"; Tentative = "Foreløpig"; "Delegate ..." = "Delegere ..."; "Delegated to" = "Delegert til"; "Update status in calendar" = "Oppdater status i kalenderen"; "delegated from" = "delegert fra"; reply_info_no_attendee = "Du har fÃ¥tt svar angÃ¥ende en planlagt begivenhet som avsenderen ikke er invitert til."; reply_info = "Du har fÃ¥tt et svar angÃ¥ende en begivenhet invitert av deg."; "to" = "til"; "Untitled" = "Ingen emne"; "Size" = "Størrelse"; "Digital signature is not valid" = "Digital signatur er ikke gyldig"; "Message is signed" = "Meldingen er signert"; "Subject" = "Emne"; "From" = "Fra"; "Date" = "Dato"; "To" = "Til"; "Issuer" = "Utført av"; SOGo-2.1.1b/UI/MailPartViewers/Swedish.lproj/0000755000000000000000000000000012247657027017324 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Swedish.lproj/Localizable.strings0000644000000000000000000000312412247657027023160 0ustar rootrootACCEPTED = "accepterad"; COMPLETED = "avslutad"; DECLINED = "avböjd"; DELEGATED = "delegerad"; "IN-PROCESS" = "pÃ¥gÃ¥ende"; "NEEDS-ACTION" = "behöver Ã¥tgärd"; TENTATIVE = "preliminär"; organized_by_you = "organiserad av dig"; you_are_an_attendee = "du är en deltagare"; add_info_text = "iMIP 'ADD' stöds inte ännu av SOGo."; publish_info_text = "Avsändaren informerar dig om bifogad händelse."; cancel_info_text = "Din inbjudan eller hela händelsen har ställts in."; request_info_no_attendee = "föreslÃ¥r ett möte till deltagarna. Du har fÃ¥tt meddelandet som information, men är inte planerad som deltagare."; Appointment = "Möte"; Organizer = "Organisatör"; Time = "Tid"; Attendees = "Deltagare"; request_info = "bjuder in dig att delta i ett möte."; "Add to calendar" = "Lägg till i kalendern"; "Delete from calendar" = "Ta bort frÃ¥n kalendern"; "Update status" = "Uppdatera status"; Accept = "Acceptera"; Decline = "Avböj"; Tentative = "Preliminär"; "Delegate ..." = "Delegera ..."; "Delegated to" = "Delegerad till"; "Update status in calendar" = "Uppdatera status i kalendern"; "delegated from" = "delegerad frÃ¥n"; reply_info_no_attendee = "Du har fÃ¥tt ett svar till en planerad händelse som avsändaren inte är inbjuden till."; reply_info = "Du har fÃ¥tt ett svar till en händelse inbjuden av dig."; "to" = "till"; "Untitled" = "Ingen rubrik"; "Size" = "Storlek"; "Digital signature is not valid" = "Digital signatur är ogiltig"; "Message is signed" = "Meddelandet är signerat"; "Subject" = "Ämne"; "From" = "FrÃ¥n"; "Date" = "Datum"; "To" = "Till"; "Issuer" = "Utfärdat av"; SOGo-2.1.1b/UI/MailPartViewers/Danish.lproj/0000755000000000000000000000000012247657027017124 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Danish.lproj/Localizable.strings0000644000000000000000000000310512247657027022757 0ustar rootrootACCEPTED = "accepteret"; COMPLETED = "afsluttet"; DECLINED = "Afvist"; DELEGATED = "uddelegeret"; "IN-PROCESS" = "i gang"; "NEEDS-ACTION" = "kræver handling"; TENTATIVE = "Tentativ"; organized_by_you = "arrangeret af dig"; you_are_an_attendee = "du er deltager"; add_info_text = "iMIP 'Tilføj' anmodning er endnu ikke understøttet af Sogo."; publish_info_text = "Afsenderen informerer dig om vedlagte begivenheden."; cancel_info_text = "Din invitation eller hele begivenheden er aflyst."; request_info_no_attendee = "ForeslÃ¥r et møde til deltagerne. Du modtager denne besked som en notifikation, du er ikke deltager"; Appointment = "Aftale"; Organizer = "Arrangør"; Time = "Tid"; Attendees = "Deltagere"; request_info = "inviterer dig til at deltage i et møde."; "Add to calendar" = "Tilføj til kalender"; "Delete from calendar" = "Slet fra kalender"; "Update status" = "Opdatér status"; Accept = "Acceptér"; Decline = "Afvis"; Tentative = "Tentativ"; "Delegate ..." = "Uddelegér ..."; "Delegated to" = "Uddelegeret til"; "Update status in calendar" = "Opdatér status i kalender"; "delegated from" = "Uddelegeret fra"; reply_info_no_attendee = "Du har modtaget et svar til en planlagt begivenhed, men afsenderen af svaret er ikke en deltager"; reply_info = "Dette er et svar pÃ¥ en begivenhed inviteret af dig."; "to" = "til"; "Untitled" = "Ikke navngivet"; "Size" = "Størrelse"; "Digital signature is not valid" = "Digital signatur ikke er gyldig"; "Message is signed" = "Beskeden er signeret"; "Subject" = "Emne"; "From" = "Fra"; "Date" = "Dato"; "To" = "Til"; "Issuer" = "Udsteder"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartSignedViewer.m0000644000000000000000000001111312247657027021417 0ustar rootroot/* UIxMailPartSignedViewer.m - this file is part of SOGo * * Copyright (C) 2009 Inverse inc. * * Author: Wolfgang Sourdeau * Ludovic Marcotte * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #ifdef HAVE_OPENSSL #include #include #include #include #endif #import #import #import #import "UIxMailPartSignedViewer.h" @implementation UIxMailPartSignedViewer : UIxMailPartMixedViewer #ifdef HAVE_OPENSSL - (BOOL) supportsSMIME { return YES; } - (X509_STORE *) _setupVerify { X509_STORE *store; X509_LOOKUP *lookup; BOOL success; success = NO; store = X509_STORE_new (); OpenSSL_add_all_algorithms (); if (store) { lookup = X509_STORE_add_lookup (store, X509_LOOKUP_file()); if (lookup) { X509_LOOKUP_load_file (lookup, NULL, X509_FILETYPE_DEFAULT); lookup = X509_STORE_add_lookup (store, X509_LOOKUP_hash_dir()); if (lookup) { X509_LOOKUP_add_dir (lookup, NULL, X509_FILETYPE_DEFAULT); ERR_clear_error(); success = YES; } } } if (!success) { if (store) { X509_STORE_free(store); store = NULL; } } return store; } - (void) _processMessage { NSString *issuer, *subject; NSData *signedData; STACK_OF(X509) *certs; X509_STORE *x509Store; BIO *msgBio, *inData; char sslError[1024]; PKCS7 *p7; int err, i; memset(sslError, 0, 1024); ERR_clear_error(); signedData = [[self clientObject] content]; msgBio = BIO_new_mem_buf ((void *) [signedData bytes], [signedData length]); inData = NULL; p7 = SMIME_read_PKCS7(msgBio, &inData); subject = nil; issuer = nil; certs = NULL; if (p7) { i = OBJ_obj2nid(p7->type); if (i == NID_pkcs7_signed) { X509 *x; certs=p7->d.sign->cert; if (sk_X509_num(certs) > 0) { BIO *buf; char p[256]; memset(p, 0, 256); x = sk_X509_value(certs,0); buf = BIO_new(BIO_s_mem()); X509_NAME_print_ex(buf, X509_get_subject_name(x), 0, XN_FLAG_ONELINE & ~ASN1_STRFLGS_ESC_MSB); BIO_gets(buf, p, 256); subject = [NSString stringWithUTF8String: p]; memset(p, 0, 256); X509_NAME_print_ex(buf, X509_get_issuer_name(x), 0, XN_FLAG_ONELINE & ~ASN1_STRFLGS_ESC_MSB); BIO_gets(buf, p, 256); issuer = [NSString stringWithUTF8String: p]; BIO_free(buf); } } err = ERR_get_error(); if (err) { ERR_error_string_n (err, sslError, 1023); validSignature = NO; } else { x509Store = [self _setupVerify]; validSignature = (PKCS7_verify(p7, NULL, x509Store, inData, NULL, PKCS7_DETACHED) == 1); err = ERR_get_error(); if (err) ERR_error_string_n(err, sslError, 1023); if (x509Store) X509_STORE_free (x509Store); } } BIO_free (msgBio); if (inData) BIO_free (inData); validationMessage = [NSMutableString string]; if (!validSignature) [validationMessage appendString: [self labelForKey: @"Digital signature is not valid"]]; else [validationMessage appendString: [self labelForKey: @"Message is signed"]]; if (issuer && subject) [validationMessage appendFormat: @"\n%@: %@\n%@: %@", [self labelForKey: @"Subject"], subject, [self labelForKey: @"Issuer"], issuer]; processed = YES; } - (BOOL) validSignature { if (!processed) [self _processMessage]; return validSignature; } - (NSString *) validationMessage { if (!processed) [self _processMessage]; return validationMessage; } #else - (BOOL) supportsSMIME { return NO; } - (BOOL) validSignature { return NO; } - (NSString *) validationMessage { return nil; } #endif @end SOGo-2.1.1b/UI/MailPartViewers/Polish.lproj/0000755000000000000000000000000012247657027017154 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Polish.lproj/Localizable.strings0000644000000000000000000000322712247657027023014 0ustar rootrootACCEPTED = "zaakceptowane"; COMPLETED = "zakoÅ„czone"; DECLINED = "odrzucone"; DELEGATED = "przekazane"; "IN-PROCESS" = "przetwarzane"; "NEEDS-ACTION" = "wymaga akcji"; TENTATIVE = "niepewny"; organized_by_you = "organizowane przez ciebie"; you_are_an_attendee = "jesteÅ› uczestnikiem"; add_info_text = "żądania iMIP 'ADD' nie sÄ… jeszcze obsÅ‚ugiwane przez SOGo."; publish_info_text = "Nadawca informuje ciÄ™ o załączonym wydarzeniu."; cancel_info_text = "Twoje zaproszenie lub caÅ‚e wydarzenie zostaÅ‚o anulowane."; request_info_no_attendee = "proponuje uczestnikom spotkanie. Otrzymujesz tÄ™ wiadomość jako powiadomienie, nie jesteÅ› planowany jako uczestnik."; Appointment = "Spotkanie"; "Status Update" = "Aktualizacja Statusu"; was = "byÅ‚o"; Organizer = "Organizator"; Time = "Czas"; Attendees = "Uczestnicy"; request_info = "zaprasza ciÄ™ na spotkanie."; "Add to calendar" = "Dodaj do kalendarza"; "Delete from calendar" = "UsuÅ„ z kalendarza"; "Update status" = "Zaktualizuj status"; Accept = "Akceptuj"; Decline = "Odmów"; Tentative = "Niepewny"; "Delegate ..." = "Przekaż"; "Delegated to" = "Przekazane do"; "Update status in calendar" = "Zaktualizuj status w kalendarzu"; "delegated from" = "przekazane z"; reply_info_no_attendee = "OtrzymaÅ‚eÅ› odpowiedź do wydarzenia ale nadawca nie jest uczestnikiem."; reply_info = "To jest odpowiedź do utworzonego przez ciebie wydarzenia"; "to" = "do"; "Untitled" = "Bez tytuÅ‚u"; "Size" = "Rozmiar"; "Digital signature is not valid" = "Podpis elektroniczny nie jest poprawny"; "Message is signed" = "Wiadomość jest podpisana"; "Subject" = "Temat"; "From" = "Od"; "Date" = "Data"; "To" = "Do"; "Issuer" = "Wystawca"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartTextViewer.h0000644000000000000000000000216212247657027021131 0ustar rootroot/* UIxMailPartTextViewer.h - this file is part of $PROJECT_NAME_HERE$ * * Copyright (C) 2006 Inverse inc. * * 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 UIXMAILPARTTEXTVIEWER_H #define UIXMAILPARTTEXTVIEWER_H #import "UIxMailPartViewer.h" @class NSString; @interface UIxMailPartTextViewer : UIxMailPartViewer - (NSString *) flatContentAsString; @end #endif /* UIXMAILPARTTEXTVIEWER_H */ SOGo-2.1.1b/UI/MailPartViewers/Hungarian.lproj/0000755000000000000000000000000012247657027017632 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Hungarian.lproj/Localizable.strings0000644000000000000000000000340512247657027023470 0ustar rootrootACCEPTED = "elfogadott"; COMPLETED = "befejezett"; DECLINED = "elutasított"; DELEGATED = "továbbküldött"; "IN-PROCESS" = "folyamatban"; "NEEDS-ACTION" = "intézkedés szükséges"; TENTATIVE = "bizonytalan"; organized_by_you = "ön által szervezett"; you_are_an_attendee = "ön egy résztvevÅ‘"; add_info_text = "iMIP 'ADD' kérés a SOGo által nem támogatott."; publish_info_text = "Ez az üzenet egy eseményrÅ‘l szóló meghívót tartalmaz."; cancel_info_text = "A meghívást vagy az eseményt törölték."; request_info_no_attendee = "javasol egy találkozót a résztvevÅ‘knek. Ön tájékoztatásul kapja ezt az üzenetet, nincs a résztvevÅ‘k között."; Appointment = "Találkozó"; "Status Update" = "Ãllapot frissítés"; was = "elÅ‘zÅ‘"; Organizer = "SzervezÅ‘"; Time = "IdÅ‘"; Attendees = "RésztvevÅ‘k"; request_info = "meghívja önt résztvevÅ‘nek egy találkozóra."; "Add to calendar" = "Hozzáadás a naptárhoz"; "Delete from calendar" = "Törlés a naptárból"; "Update status" = "Frissítés állapota"; Accept = "Elfogad"; Decline = "Elutasít"; Tentative = "Bizonytalan"; "Delegate ..." = "Jogok átruházása..."; "Delegated to" = "Jogok átruházása az alábiaknak:"; "Update status in calendar" = "Ãllapot frissítése a naptárban"; "delegated from" = "Jogok átruházója:"; reply_info_no_attendee = "Ön választ kapott egy találkozóra, a feladó azonban nem résztvevÅ‘."; reply_info = "Ez egy válasz az ön által kiküldött meghívásra."; "to" = "címzett"; "Untitled" = "Névtelen"; "Size" = "Méret"; "Digital signature is not valid" = "Az elektronikus aláírás nem érvényes"; "Message is signed" = "Az üzenet alá van írva"; "Subject" = "Tárgy"; "From" = "Feladó"; "Date" = "Dátum"; "To" = "Címzett"; "Issuer" = "Tanúsító"; SOGo-2.1.1b/UI/MailPartViewers/English.lproj/0000755000000000000000000000000012247657027017307 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/English.lproj/Localizable.strings0000644000000000000000000000314112247657027023142 0ustar rootrootACCEPTED = "accepted"; COMPLETED = "completed"; DECLINED = "declined"; DELEGATED = "delegated"; "IN-PROCESS" = "in process"; "NEEDS-ACTION" = "needs action"; TENTATIVE = "tentative"; organized_by_you = "organized by you"; you_are_an_attendee = "you are an attendee"; add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; publish_info_text = "The sender informs you of the attached event."; cancel_info_text = "Your invitation or the whole event was canceled."; request_info_no_attendee = "is proposing a meeting to the attendees. You receive this mail as a notification, you are not scheduled as a participant."; Appointment = "Appointment"; "Status Update" = "Status Update"; was = "was"; Organizer = "Organizer"; Time = "Time"; Attendees = "Attendees"; request_info = "invites you to participate in a meeting."; "Add to calendar" = "Add to calendar"; "Delete from calendar" = "Delete from calendar"; "Update status" = "Update status"; Accept = "Accept"; Decline = "Decline"; Tentative = "Tentative"; "Delegate ..." = "Delegate ..."; "Delegated to" = "Delegated to"; "Update status in calendar" = "Update status in calendar"; "delegated from" = "delegated from"; reply_info_no_attendee = "You received a reply to a scheduling event but the sender of the reply is not a participant."; reply_info = "This is a reply to an event invitation done by you."; "to" = "to"; "Untitled" = "Untitled"; "Size" = "Size"; "Digital signature is not valid" = "Digital signature is not valid"; "Message is signed" = "Message is signed"; "Subject" = "Subject"; "From" = "From"; "Date" = "Date"; "To" = "To"; "Issuer" = "Issuer"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailRenderingContext.h0000644000000000000000000000357012247657027021462 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #ifndef __Mailer_UIxMailRenderingContext_H__ #define __Mailer_UIxMailRenderingContext_H__ #import #include /* UIxMailRenderingContext The rendering context is used to track nesting of mail part viewers. */ @class NSArray; @class NSData; @class NSDictionary; @class WOComponent; @interface UIxMailRenderingContext : NSObject { WOComponent *viewer; /* non-retained! */ WOContext *context; /* non-retained! */ NSDictionary *flatContents; /* IMAP4 name to NSData */ } - (id) initWithViewer: (WOComponent *) _viewer context: (WOContext *) _ctx; /* state */ - (void) reset; /* fetching */ - (NSDictionary *) flatContents; - (NSData *) flatContentForPartPath: (NSArray *) _partPath; /* viewer components */ - (WOComponent *) viewerForBodyInfo: (id)_info; @end @interface WOContext(UIxMailPart) - (void) pushMailRenderingContext: (UIxMailRenderingContext *) _mctx; - (UIxMailRenderingContext *) popMailRenderingContext; - (UIxMailRenderingContext *) mailRenderingContext; @end #endif /* __Mailer_UIxMailRenderingContext_H__ */ SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartMixedViewer.m0000644000000000000000000000370412247657027021263 0ustar rootroot/* Copyright (C) 2007-2009 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import "UIxMailRenderingContext.h" #import "UIxMailPartMixedViewer.h" @implementation UIxMailPartMixedViewer - (void)dealloc { [self->childInfo release]; [super dealloc]; } /* caches */ - (void)resetBodyInfoCaches { [self->childInfo release]; self->childInfo = nil; [super resetBodyInfoCaches]; } /* accessors */ - (void)setChildInfo:(id)_info { ASSIGN(self->childInfo, _info); } - (id)childInfo { return self->childInfo; } - (void)setChildIndex:(unsigned int)_index { self->childIndex = _index; } - (unsigned int)childIndex { return self->childIndex; } - (NSString *)childPartName { char buf[8]; sprintf(buf, "%d", [self childIndex] + 1); return [NSString stringWithCString:buf]; } - (id)childPartPath { NSArray *pp; pp = [self partPath]; return [pp count] > 0 ? (id)[pp arrayByAddingObject:[self childPartName]] : (id)[NSArray arrayWithObject:[self childPartName]]; } /* nested viewers */ - (id)contentViewerComponent { id info; info = [self childInfo]; return [[[self context] mailRenderingContext] viewerForBodyInfo:info]; } @end /* UIxMailPartMixedViewer */ SOGo-2.1.1b/UI/MailPartViewers/MailPartViewersProduct.m0000644000000000000000000000166612247657027021377 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import @interface MailPartViewersProduct : NSObject @end @implementation MailPartViewersProduct @end /* MailPartViewersProduct */ SOGo-2.1.1b/UI/MailPartViewers/Catalan.lproj/0000755000000000000000000000000012247657027017261 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Catalan.lproj/Localizable.strings0000644000000000000000000000313612247657027023120 0ustar rootrootACCEPTED = "confirmat"; COMPLETED = "completat"; DECLINED = "rebutjat"; DELEGATED = "delegat"; "IN-PROCESS" = "en curs"; "NEEDS-ACTION" = "necessita acció"; TENTATIVE = "provisional"; organized_by_you = "en sou l'organitzador."; you_are_an_attendee = "hi participeu"; add_info_text = "iMIP 'ADD' encara no funciona."; publish_info_text = "El remitent us informa de l'esdeveniment adjunt."; cancel_info_text = "La vostra invitació o l'esdeveniment han estat \ncancel·lats."; request_info_no_attendee = "Heu proposat un esdeveniment. Rebeu aquest correu com a notificació, però no hi figureu com a participant."; Appointment = "Cita"; Organizer = "Organitzador"; Time = "Hora"; Attendees = "Participants"; request_info = "us invita a un esdeveniment."; "Add to calendar" = "Afegir al calendari"; "Delete from calendar" = "Esborrar del calendari"; "Update status" = "Actualitzar estat"; Accept = "Confirmar"; Decline = "Rebutjar"; Tentative = "Provisional"; "Delegate ..." = "Delegat ..."; "Delegated to" = "Delegat a"; "Update status in calendar" = "Actualitzar l'estat en el calendari"; "delegated from" = "delegat per"; reply_info_no_attendee = "Heu rebut una resposta a una invitació d'esdeveniment, però el remitent no hi figura com a participant."; reply_info = "Aquesta és la resposta a una invitació d'esdeveniment que heu fet."; "to" = "per a"; "Untitled" = "Sense títol"; "Size" = "Mida"; "Digital signature is not valid" = "La signatura digital no és vàlida"; "Message is signed" = "El missatge està signat"; "Subject" = "Assumpte"; "From" = "De"; "Date" = "Data"; "To" = "Per a"; "Issuer" = "Emissor"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartICalViewer.h0000644000000000000000000000246112247657027021017 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #ifndef UIXMAILPARTICALVIEWER_H #define UIXMAILPARTICALVIEWER_H #import "UIxMailPartViewer.h" @class iCalEvent; @class iCalCalendar; @class SOGoAppointmentObject; @class SOGoDateFormatter; @interface UIxMailPartICalViewer : UIxMailPartViewer { iCalCalendar *inCalendar; iCalEvent *inEvent; id attendee; SOGoDateFormatter *dateFormatter; id item; SOGoAppointmentObject *storedEventObject; BOOL storedEventFetched; iCalEvent *storedEvent; } - (iCalEvent *) authorativeEvent; @end #endif /* UIXMAILPARTICALVIEWER_H */ SOGo-2.1.1b/UI/MailPartViewers/GNUmakefile.preamble0000644000000000000000000000056012247657027020432 0ustar rootrootifeq ($(HAS_LIBRARY_ssl),yes) ADDITIONAL_CPPFLAGS += -DHAVE_OPENSSL=1 BUNDLE_LIBS += -lcrypto endif ADDITIONAL_CPPFLAGS += \ -Wall -DCOMPILE_FOR_GSTEP_MAKE=1 \ -DUIX_MAILER_MAJOR_VERSION="@\"$(MAJOR_VERSION)\"" \ -DUIX_MAILER_MINOR_VERSION="@\"$(MINOR_VERSION)\"" \ -DUIX_MAILER_SUBMINOR_VERSION="@\"$(SUBMINOR_VERSION)\"" SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartICalActions.m0000644000000000000000000003024512247657027021164 0ustar rootroot/* UIxMailPartICalActions.m - this file is part of SOGo * * Copyright (C) 2007-2011 Inverse inc. * * 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 #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "UIxMailPartICalActions.h" @implementation UIxMailPartICalActions - (iCalEvent *) _emailEvent { iCalCalendar *emailCalendar; NSString *eventString; NSData *content; content = [[self clientObject] fetchBLOB]; eventString = [[NSString alloc] initWithData: content encoding: NSUTF8StringEncoding]; if (!eventString) eventString = [[NSString alloc] initWithData: content encoding: NSISOLatin1StringEncoding]; emailCalendar = [iCalCalendar parseSingleFromSource: eventString]; [eventString release]; return (iCalEvent *) [emailCalendar firstChildWithTag: @"vevent"]; } // // // - (SOGoAppointmentObject *) _eventObjectWithUID: (NSString *) uid forUser: (SOGoUser *) user { SOGoAppointmentFolder *folder; SOGoAppointmentObject *eventObject; NSArray *folders; NSEnumerator *e; NSString *cname, *userLogin; eventObject = nil; userLogin = [user login]; folders = [[user calendarsFolderInContext: context] subFolders]; e = [folders objectEnumerator]; while (eventObject == nil && (folder = [e nextObject])) { if ([[folder ownerInContext: nil] isEqualToString: userLogin]) { cname = [folder resourceNameForEventUID: uid]; if (cname) { eventObject = [folder lookupName: cname inContext: context acquire: NO]; if ([eventObject isKindOfClass: [NSException class]]) eventObject = nil; } } } if (!eventObject) { folder = [user personalCalendarFolderInContext: context]; eventObject = [SOGoAppointmentObject objectWithName: uid inContainer: folder]; [eventObject setIsNew: YES]; } return eventObject; } // // // - (SOGoAppointmentObject *) _eventObjectWithUID: (NSString *) uid { #warning this will not work if Bob reads emails of Alice and accepts events for her return [self _eventObjectWithUID: uid forUser: [context activeUser]]; } // // // - (void) _fixOrganizerInEvent: (iCalEvent *) brokenEvent { iCalPerson *organizer; SOGoMailObject *mail; NSArray *addresses; NGImap4EnvelopeAddress *from; id value; organizer = nil; mail = [[self clientObject] mailObject]; addresses = [mail replyToEnvelopeAddresses]; if (![addresses count]) addresses = [mail fromEnvelopeAddresses]; if ([addresses count] > 0) { from = [addresses objectAtIndex: 0]; value = [from baseEMail]; if ([value isNotNull]) { organizer = [iCalPerson elementWithTag: @"organizer"]; [organizer setEmail: value]; value = [from personalName]; if ([value isNotNull]) [organizer setCn: value]; [brokenEvent setOrganizer: organizer]; } } if (!organizer) [self errorWithFormat: @"no organizer could be found, SOGo will crash" @" if the user replies"]; } // // // - (iCalEvent *) _setupChosenEventAndEventObject: (SOGoAppointmentObject **) eventObject { iCalEvent *emailEvent, *calendarEvent, *chosenEvent; iCalPerson *organizer; emailEvent = [self _emailEvent]; if (emailEvent) { *eventObject = [self _eventObjectWithUID: [emailEvent uid]]; if ([*eventObject isNew]) { chosenEvent = emailEvent; [*eventObject saveContentString: [[emailEvent parent] versitString]]; } else { if ([emailEvent recurrenceId]) { // Event attached to email is not complete -- retrieve it // from the database. NSString *recurrenceTime; recurrenceTime = [NSString stringWithFormat: @"%f", [[emailEvent recurrenceId] timeIntervalSince1970]]; calendarEvent = (iCalEvent *)[*eventObject lookupOccurrence: recurrenceTime]; } else calendarEvent = (iCalEvent *) [*eventObject component: NO secure: NO]; if (calendarEvent != nil) { // Calendar event still exists -- verify which of the calendar // and email events is the most recent. We must also update // the event (or recurrence-id) with the email's content, otherwise // we would never get major properties updates if ([calendarEvent compare: emailEvent] == NSOrderedAscending) { iCalCalendar *parent; parent = [calendarEvent parent]; [parent removeChild: calendarEvent]; [parent addChild: emailEvent]; [*eventObject saveContentString: [parent versitString]]; [*eventObject flush]; chosenEvent = emailEvent; } else { chosenEvent = calendarEvent; if (![[[chosenEvent parent] method] length]) [[chosenEvent parent] setMethod: [[emailEvent parent] method]]; } } else chosenEvent = emailEvent; } organizer = [chosenEvent organizer]; if (![[organizer rfc822Email] length]) [self _fixOrganizerInEvent: chosenEvent]; } else chosenEvent = nil; return chosenEvent; } // // // - (WOResponse *) _changePartStatusAction: (NSString *) newStatus withDelegate: (iCalPerson *) delegate { WOResponse *response; SOGoAppointmentObject *eventObject; iCalEvent *chosenEvent; //NSException *ex; chosenEvent = [self _setupChosenEventAndEventObject: &eventObject]; if (chosenEvent) { response = (WOResponse*)[eventObject changeParticipationStatus: newStatus withDelegate: delegate forRecurrenceId: [chosenEvent recurrenceId]]; // if (ex) // response = ex; //[self responseWithStatus: 500]; // else if (!response) response = [self responseWith204]; } else { response = [context response]; [response setStatus: 409]; } return response; } - (WOResponse *) acceptAction { return [self _changePartStatusAction: @"ACCEPTED" withDelegate: nil]; } - (WOResponse *) declineAction { return [self _changePartStatusAction: @"DECLINED" withDelegate: nil]; } - (WOResponse *) tentativeAction { return [self _changePartStatusAction: @"TENTATIVE" withDelegate: nil]; } - (WOResponse *) delegateAction { // BOOL receiveUpdates; NSString *delegatedEmail, *delegatedUid; iCalPerson *delegatedAttendee; SOGoUser *user; WORequest *request; WOResponse *response; request = [context request]; delegatedEmail = [request formValueForKey: @"to"]; if ([delegatedEmail length]) { user = [context activeUser]; delegatedAttendee = [iCalPerson new]; [delegatedAttendee autorelease]; [delegatedAttendee setEmail: delegatedEmail]; delegatedUid = [delegatedAttendee uid]; if (delegatedUid) { SOGoUser *delegatedUser; delegatedUser = [SOGoUser userWithLogin: delegatedUid]; [delegatedAttendee setCn: [delegatedUser cn]]; } [delegatedAttendee setRole: @"REQ-PARTICIPANT"]; [delegatedAttendee setRsvp: @"TRUE"]; [delegatedAttendee setParticipationStatus: iCalPersonPartStatNeedsAction]; [delegatedAttendee setDelegatedFrom: [NSString stringWithFormat: @"mailto:%@", [[user allEmails] objectAtIndex: 0]]]; // receiveUpdates = [[request formValueForKey: @"receiveUpdates"] boolValue]; // if (receiveUpdates) // [delegatedAttendee setRole: @"NON-PARTICIPANT"]; response = [self _changePartStatusAction: @"DELEGATED" withDelegate: delegatedAttendee]; } else response = [NSException exceptionWithHTTPStatus: 400 reason: @"missing 'to' parameter"]; return response; } - (WOResponse *) addToCalendarAction { iCalEvent *emailEvent; SOGoAppointmentObject *eventObject; NSString *iCalString; WOResponse *response; emailEvent = [self _emailEvent]; if (emailEvent) { eventObject = [self _eventObjectWithUID: [emailEvent uid]]; if ([eventObject isNew]) { iCalString = [[emailEvent parent] versitString]; [eventObject saveContentString: iCalString]; response = [self responseWith204]; } else { response = [self responseWithStatus: 409]; } } else { response = [context response]; [response setStatus: 409]; response = [self responseWithStatus: 404]; } return response; } - (WOResponse *) deleteFromCalendarAction { iCalEvent *emailEvent; SOGoAppointmentObject *eventObject; WOResponse *response; emailEvent = [self _emailEvent]; if (emailEvent) { eventObject = [self _eventObjectWithUID: [emailEvent uid]]; [eventObject delete]; response = [self responseWith204]; } else { response = [context response]; [response setStatus: 409]; } return response; } - (iCalPerson *) _emailParticipantWithEvent: (iCalEvent *) event { NSString *emailFrom; SOGoMailObject *mailObject; NGImap4EnvelopeAddress *address; mailObject = [[self clientObject] mailObject]; address = [[mailObject fromEnvelopeAddresses] objectAtIndex: 0]; emailFrom = [address baseEMail]; return [event findAttendeeWithEmail: emailFrom]; } - (BOOL) _updateParticipantStatusInEvent: (iCalEvent *) calendarEvent fromEvent: (iCalEvent *) emailEvent inObject: (SOGoAppointmentObject *) eventObject { iCalPerson *calendarParticipant, *mailParticipant; NSString *partStat; BOOL result; calendarParticipant = [self _emailParticipantWithEvent: calendarEvent]; mailParticipant = [self _emailParticipantWithEvent: emailEvent]; if (calendarParticipant && mailParticipant) { result = YES; partStat = [mailParticipant partStat]; if ([partStat caseInsensitiveCompare: [calendarParticipant partStat]] != NSOrderedSame) { [calendarParticipant setPartStat: [partStat uppercaseString]]; [eventObject saveComponent: calendarEvent]; } } else result = NO; return result; } - (WOResponse *) updateUserStatusAction { iCalEvent *emailEvent, *calendarEvent; SOGoAppointmentObject *eventObject; WOResponse *response; response = nil; emailEvent = [self _emailEvent]; if (emailEvent) { eventObject = [self _eventObjectWithUID: [emailEvent uid]]; calendarEvent = [eventObject component: NO secure: NO]; if (calendarEvent) { if (([[emailEvent sequence] compare: [calendarEvent sequence]] != NSOrderedAscending) && ([self _updateParticipantStatusInEvent: calendarEvent fromEvent: emailEvent inObject: eventObject])) response = [self responseWith204]; } else response = [self responseWithStatus: 404 andString: @"Local event not found."]; } if (!response) { response = [context response]; [response setStatus: 409]; } return response; } @end SOGo-2.1.1b/UI/MailPartViewers/SpanishSpain.lproj/0000755000000000000000000000000012247657027020316 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/SpanishSpain.lproj/Localizable.strings0000644000000000000000000000317712247657027024162 0ustar rootrootACCEPTED = "aceptado"; COMPLETED = "completado"; DECLINED = "rechazado"; DELEGATED = "delegado"; "IN-PROCESS" = "en curso"; "NEEDS-ACTION" = "necesita acción"; TENTATIVE = "tentativo"; organized_by_you = "organizado por Ud."; you_are_an_attendee = "es un participante"; add_info_text = "iMIP 'ADD' aún no está soportado por SOGo."; publish_info_text = "El remitente le informa del evento adjunto."; cancel_info_text = "Su invitación o el evento ha sido cancelado."; request_info_no_attendee = "ha propuesto un evento a los participantes. Ud recibe este correo como notificación, pero no aparece como participante."; Appointment = "Cita"; "Status Update" = "Actualización de Estado"; was = "estaba"; Organizer = "Organizador"; Time = "Hora"; Attendees = "Participantes"; request_info = "le invita a un evento."; "Add to calendar" = "Añadir al calendario"; "Delete from calendar" = "Borrar del calendario"; "Update status" = "Actualizar estado"; Accept = "Confirmar"; Decline = "Rechazar"; Tentative = "Tentativo"; "Delegate ..." = "Delegar a ..."; "Delegated to" = "Delegado a"; "Update status in calendar" = "Actualizar estado en calendario"; "delegated from" = "delegado de"; reply_info_no_attendee = "Ha recibido una respuesta a una invitación de evento pero el remitente no aparece como un participante."; reply_info = "Esta es la respuesta a una invitación de evento hecha por Ud."; "to" = "para"; "Untitled" = "Sin título"; "Size" = "Tamaño"; "Digital signature is not valid" = "Firma Digital no válida"; "Message is signed" = "Mensaje firmado"; "Subject" = "Asunto"; "From" = "De"; "Date" = "Fecha"; "To" = "Para"; "Issuer" = "Remitente"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartLinkViewer.h0000644000000000000000000000276412247657027021112 0ustar rootroot/* Copyright (C) 2007-2013 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __Mailer_UIxMailPartLinkViewer_H__ #define __Mailer_UIxMailPartLinkViewer_H__ #import "UIxMailPartViewer.h" /* UIxMailPartLinkViewer The generic viewer for all kinds of attachments. Renders a link to download the attachment. TODO: show info based on the 'bodyInfo' dictionary: { bodyId = ""; description = ""; encoding = BASE64; parameterList = { "x-unix-mode" = 0666; name = "SOGo.pdf"; }; size = 1314916; subtype = PDF; type = application; } */ @interface UIxMailPartLinkViewer : UIxMailPartViewer { } @end #endif /* __Mailer_UIxMailPartLinkViewer_H__ */ SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartTextViewer.m0000644000000000000000000000264512247657027021144 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ /* UIxMailPartTextViewer Show plaintext mail parts correctly formatted. TODO: add server side wrapping. TODO: add contained link detection. */ #import #import #import #import #import "UIxMailPartTextViewer.h" @implementation UIxMailPartTextViewer - (NSString *) flatContentAsString { NSString *superContent; superContent = [[super flatContentAsString] stringByEscapingHTMLString]; return [[superContent stringByDetectingURLs] stringByConvertingCRLNToHTML]; } @end /* UIxMailPartTextViewer */ SOGo-2.1.1b/UI/MailPartViewers/Dutch.lproj/0000755000000000000000000000000012247657027016765 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Dutch.lproj/Localizable.strings0000644000000000000000000000321212247657027022617 0ustar rootrootACCEPTED = "geaccepteerd"; COMPLETED = "klaar"; DECLINED = "afgewezen"; DELEGATED = "gedelegeerd"; "IN-PROCESS" = "in behandeling"; "NEEDS-ACTION" = "actie vereist"; TENTATIVE = "onder voorbehoud"; organized_by_you = "door u georganiseerd"; you_are_an_attendee = "u bent een deelnemer"; add_info_text = "iMIP 'ADD' requests worden door SOGo nog niet ondersteund."; publish_info_text = "De afzender stelt u op de hoogte van bijgevoegde afspraak."; cancel_info_text = "Uw uitnodiging of de hele afspraak is vervallen.."; request_info_no_attendee = "stelt een afspraak voor met de volgende deelnemers. U ontvangt deze mail als notificatie, u bent geen deelnemer."; Appointment = "afspraak"; Organizer = "Organisator"; Time = "Tijd"; Attendees = "Deelnemers"; request_info = "nodigt u uit deel te nemen aan bijgevoegde afspraak."; "Add to calendar" = "Aan agenda toevoegen"; "Delete from calendar" = "Uit agenda verwijderen"; "Update status" = "Status bijwerken"; Accept = "Accepteren"; Decline = "Weigeren"; Tentative = "Onder voorbehoud"; "Delegate ..." = "Delegeren ..."; "Delegated to" = "Gedelegeerd aan"; "Update status in calendar" = "Afspraak bijwerken in agenda"; "delegated from" = "gedelegeerd door"; reply_info_no_attendee = "U heeft een antwoord betreffende een afspraak ontvangen van een niet-deelnemer."; reply_info = "Dit is een antwoord op een door u verstuurde uitnodiging."; "to" = "naar"; "Untitled" = "Geen titel"; "Size" = "Grootte"; "Digital signature is not valid" = "Digitale handtekening is niet geldig"; "Message is signed" = "Bericht is getekend"; "Subject" = "Onderwerp"; "From" = "Van"; "Date" = "Datum"; "To" = "Aan"; "Issuer" = "Uitgever"; SOGo-2.1.1b/UI/MailPartViewers/Icelandic.lproj/0000755000000000000000000000000012247657027017571 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Icelandic.lproj/Localizable.strings0000644000000000000000000000327712247657027023436 0ustar rootrootACCEPTED = "samþykkt"; COMPLETED = "lokið"; DECLINED = "hafnað"; DELEGATED = "fulltrúi skipaður"; "IN-PROCESS" = "í vinnslu"; "NEEDS-ACTION" = "nauðsynlegt að aðhafast"; TENTATIVE = "til bráðabirgða"; organized_by_you = "eigin skipulagning"; you_are_an_attendee = "er þáttakandi"; add_info_text = "SOGo styður ekki enn iMIP ADD fyrirspurnir."; publish_info_text = "Sendandinn vekur athygli þína á hjálögðum viðburði."; cancel_info_text = "Viðburðinum eða þínu boði í hann var aflýst."; request_info_no_attendee = "gerir tillögu um fund fyrir þáttakendurna. Þú færð þetta bréf sem tilkynningu, þú ert ekki á lista sem þáttakandi. "; Appointment = "Tímapöntun"; Organizer = "Skipuleggjandi"; Time = "Tími"; Attendees = "Þáttakendur"; request_info = "býður þér að taka þátt í fundi."; "Add to calendar" = "Bæta við dagatal"; "Delete from calendar" = "Eyða úr dagatali"; "Update status" = "Uppfæra stöðu"; Accept = "Samþykkja"; Decline = "Hafna"; Tentative = "Til bráðabirgða"; "Delegate ..." = "Skipa fulltrúa..."; "Delegated to" = "Skipaður fulltrúi er"; "Update status in calendar" = "Uppfæra stöðu í dagatali"; "delegated from" = "Skipaður fulltrúi var"; reply_info_no_attendee = "Þú fékkst svar varðandi skipulagðan viðburð, en sendandinn er ekki þáttakandi."; reply_info = "Þetta er svar við boði á viðburð sem þú hefur gert."; "to" = "til"; "Untitled" = "ónefnt"; "Size" = "Stærð"; "Digital signature is not valid" = "Stafræn undirritun er ógild"; "Message is signed" = "Póstur er með rafræna undirskrift"; "Subject" = "Viðfangsefni"; "From" = "Frá"; "Date" = "Dagsetning"; "To" = "Til"; "Issuer" = "Útgefandi"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartICalActions.h0000644000000000000000000000251212247657027021153 0ustar rootroot/* UIxMailPartICalActions.h - this file is part of SOGo * * Copyright (C) 2007 Inverse inc. * * 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 UIXMAILPARTICALACTIONS_H #define UIXMAILPARTICALACTIONS_H #import @class iCalCalendar; @class SOGoMailBodyPart; @class WOResponse; @interface UIxMailPartICalActions : WODirectAction - (WOResponse *) acceptAction; - (WOResponse *) declineAction; - (WOResponse *) tentativeAction; - (WOResponse *) delegateAction; - (WOResponse *) addToCalendarAction; - (WOResponse *) deleteFromCalendarAction; @end #endif /* UIXMAILPARTICALACTIONS_H */ SOGo-2.1.1b/UI/MailPartViewers/Arabic.lproj/0000755000000000000000000000000012247657027017077 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Arabic.lproj/Localizable.strings0000644000000000000000000000346512247657027022743 0ustar rootrootACCEPTED = "مقبول"; COMPLETED = "منجز"; DECLINED = "مرÙوض"; DELEGATED = "Ù…Ùوض"; "IN-PROCESS" = "جاري"; "NEEDS-ACTION" = "بحاجة إلى عمل"; TENTATIVE = "مؤقت"; organized_by_you = "منظم من قبلك"; you_are_an_attendee = "أنت أحد الحضور"; add_info_text = " \"Ø§Ø¶Ø§ÙØ©\" لا يوجد دعم حتى الآن من قبل سوجو."; publish_info_text = "المرسل يعلمك بالحدث المرÙÙ‚."; cancel_info_text = "تم إلغاء دعوتك أو الحدث برمته."; request_info_no_attendee = "يقترح عقد إجتماع للحضور. تلقيت هذه الرسالة بمثابة إشعار، وليس من المقرر لكم المشاركة."; Appointment = "موعد"; Organizer = "منظم"; Time = "الساعة"; Attendees = "الحضور"; request_info = "يدعوك للمشاركة ÙÙŠ الاجتماع."; "Add to calendar" = "Ø¥Ø¶Ø§ÙØ© الى التقويم"; "Delete from calendar" = "مسح من التقويم"; "Update status" = "تحديث الحالة"; Accept = "قبول"; Decline = "Ø±ÙØ¶"; Tentative = "مؤقت"; "Delegate ..." = "تÙويض ..."; "Delegated to" = "تÙويض إلى ..."; "Update status in calendar" = "تحديث الحالة ÙÙ‰ التقويم"; "delegated from" = "Ù…Ùوض من "; reply_info_no_attendee = "تلقيت ردا على الحدث المسجل لكن الراسل ليس مشاركا."; reply_info = "هذا هو الرد على دعوة الحدث التي قمت بها."; "to" = "إلى :"; "Untitled" = "بدون عنوان"; "Size" = "الحجم"; "Digital signature is not valid" = "التوقيع الرقمي غير صالح"; "Message is signed" = "الرسالة موقعة"; "Subject" = "العنوان"; "From" = "من"; "Date" = "التاريخ"; "To" = "إلى"; "Issuer" = "المصدر"; SOGo-2.1.1b/UI/MailPartViewers/Italian.lproj/0000755000000000000000000000000012247657027017277 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Italian.lproj/Localizable.strings0000644000000000000000000000323112247657027023132 0ustar rootrootACCEPTED = "accettato"; COMPLETED = "completato"; DECLINED = "declinato"; DELEGATED = "inviata delega"; "IN-PROCESS" = "in lavorazione"; "NEEDS-ACTION" = "richiede un'azione"; TENTATIVE = "tentativo"; organized_by_you = "organizzata da te"; you_are_an_attendee = "sei uno degli invitati"; add_info_text = "Le richieste IMIP 'ADD' non sono ancora supportate da SOGo."; publish_info_text = "Il mittente ti invia in allegato informazioni sull'evento."; cancel_info_text = "Il tuo invito o l'intero evento sono stati cancellati."; request_info_no_attendee = "sta proponento un incontro agli invitati. Ricevi questa email come notifica, non sei incluso come partecipante."; Appointment = "Appuntamento"; Organizer = "Organizzatore"; Time = "Ora"; Attendees = "Invitati"; request_info = "ti invita a partecipare ad un incontro."; "Add to calendar" = "Aggiungi al calendario"; "Delete from calendar" = "Rimuovi dal calendario"; "Update status" = "Aggiorna lo stato"; Accept = "Accetta"; Decline = "Declina"; Tentative = "Tentativo"; "Delegate ..." = "Delega ..."; "Delegated to" = "Delega a"; "Update status in calendar" = "Aggiorna lo stato nel calendari"; "delegated from" = "delegato da"; reply_info_no_attendee = "Hai ricevuto una risposta relativa all'incontro programmato da un utente che non è incluso come partecipante."; reply_info = "Questa è una risposta ad un invito ad un evento organizzato da te."; "to" = "a"; "Untitled" = "Senza titolo"; "Size" = "Dimensione"; "Digital signature is not valid" = "La firma digitale non è valida"; "Message is signed" = "Il messaggio è firmato"; "Subject" = "Soggetto"; "From" = "Da"; "Date" = "Data"; "To" = "A"; "Issuer" = "Emittente"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartMixedViewer.h0000644000000000000000000000206312247657027021253 0ustar rootroot/* Copyright (C) 2007-2009 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef UIXMAILPARTMIXEDVIEWER_H #define UIXMAILPARTMIXEDVIEWER_H #import "UIxMailPartViewer.h" @interface UIxMailPartMixedViewer : UIxMailPartViewer { id childInfo; unsigned int childIndex; } @end #endif /* UIXMAILPARTMIXEDVIEWER_H */ SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartViewer.h0000644000000000000000000000426612247657027020273 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #ifndef __Mailer_UIxMailPartViewer_H__ #define __Mailer_UIxMailPartViewer_H__ #include /* UIxMailPartViewer This class is the superclass for MIME content viewers. Since part-viewers can be reused for multiple parts, you need to be careful in subclass to properly reset your specific state by overriding - resetPathCaches The part viewers have access to the rendering state using the [[self context] mailRenderingContext] object. This class provides several convenience methods to access mailpart content. */ @class NSArray; @class NSData; @class NSFormatter; @class SOGoMailBodyPart; @interface UIxMailPartViewer : UIxComponent { NSArray *partPath; id bodyInfo; NSData *flatContent; } /* accessors */ - (void)setPartPath:(NSArray *)_path; - (NSArray *)partPath; - (void)setBodyInfo:(id)_info; - (id)bodyInfo; - (SOGoMailBodyPart *) clientPart; - (NSData *)flatContent; - (NSData *)decodedFlatContent; - (NSString *)flatContentAsString; - (NSString *)preferredPathExtension; - (NSString *)filename; - (NSString *)filenameForDisplay; - (NSFormatter *)sizeFormatter; /* caches */ - (void)resetPathCaches; - (void)resetBodyInfoCaches; /* part URLs */ - (NSString *)pathToAttachmentObject; /* link to SoObject */ - (NSString *)pathToAttachment; /* download link */ - (NSString *) mimeImageURL; @end #endif /* __Mailer_UIxMailPartViewer_H__ */ SOGo-2.1.1b/UI/MailPartViewers/Russian.lproj/0000755000000000000000000000000012247657027017342 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Russian.lproj/Localizable.strings0000644000000000000000000000466712247657027023213 0ustar rootrootACCEPTED = "принÑто"; COMPLETED = "закончено"; DECLINED = "отклонено"; DELEGATED = "делегировано"; "IN-PROCESS" = "в процеÑÑе"; "NEEDS-ACTION" = "требует дейÑтвиÑ"; TENTATIVE = "предварительное ÑоглаÑие"; organized_by_you = "организованные Вами"; you_are_an_attendee = "Ñ Ð’Ð°ÑˆÐ¸Ð¼ учаÑтием"; add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; publish_info_text = "Отправитель Ñообщает о приложенном Ñобытии."; cancel_info_text = "Ваше приглашение или вÑе мероприÑтие отменено."; request_info_no_attendee = "предлагает учаÑтникам вÑтретитьÑÑ. Ð’Ñ‹ получили Ñто Ñообщение как приглашенное лицо. Ð’Ñ‹ еще не включены в ÑпиÑок подтвержденных учаÑтников."; Appointment = "Ð’Ñтреча"; "Status Update" = "Обновление ÑтатуÑа"; was = "был"; Organizer = "Организатор"; Time = "ВремÑ"; Attendees = "Приглашенные"; request_info = "приглашает Ð’Ð°Ñ Ð¿Ñ€Ð¸Ð½Ñть учаÑтие в вÑтрече."; "Add to calendar" = "Добавить в календарь"; "Delete from calendar" = "Удалить из календарÑ"; "Update status" = "Обновить ÑтатуÑ"; Accept = "ПринÑть"; Decline = "Отклонить"; Tentative = "предварительно ÑоглаÑитьÑÑ"; "Delegate ..." = "Делегировать ..."; "Delegated to" = "Делегированы"; "Update status in calendar" = "Обновить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð² календаре"; "delegated from" = "делегированные от"; reply_info_no_attendee = "Ð’Ñ‹ получили ответ на запланированное мероприÑтие, но Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½ÐµÑ‚ Ñреди приглашенных."; reply_info = "Это ответ на Ваше приглашение на мероприÑтие."; "to" = "к"; "Untitled" = "Без названиÑ"; "Size" = "Размер"; "Digital signature is not valid" = "Ð¦Ð¸Ñ„Ñ€Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ не дейÑтвительна"; "Message is signed" = "Сообщение подпиÑано"; "Subject" = "Тема"; "From" = "От"; "Date" = "Дата"; "To" = "Кому"; "Issuer" = "Эмитент"; SOGo-2.1.1b/UI/MailPartViewers/SpanishArgentina.lproj/0000755000000000000000000000000012247657027021154 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings0000644000000000000000000000315112247657027025010 0ustar rootrootACCEPTED = "aceptado"; COMPLETED = "completado"; DECLINED = "rechazado"; DELEGATED = "delegado"; "IN-PROCESS" = "en curso"; "NEEDS-ACTION" = "necesita acción"; TENTATIVE = "tentativo"; organized_by_you = "organizado por Ud."; you_are_an_attendee = "es un participante"; add_info_text = "iMIP 'ADD' aún no está soportado por SOGo."; publish_info_text = "El remitente le informa del evento adjunto."; cancel_info_text = "Su invitación o el evento ha sido cancelado."; request_info_no_attendee = "ha propuesto un evento a los participantes. Usted recibe este correo como notificación. Nota: Usted no está registrado como participante"; Appointment = "Cita"; Organizer = "Organizador"; Time = "Hora"; Attendees = "Participantes"; request_info = "lo invita a un evento."; "Add to calendar" = "Añadir al calendario"; "Delete from calendar" = "Borrar del calendario"; "Update status" = "Actualizar estado"; Accept = "Confirmar"; Decline = "Rechazar"; Tentative = "Tentativo"; "Delegate ..." = "Delegar a ..."; "Delegated to" = "Delegado a"; "Update status in calendar" = "Actualizar estado en el calendario"; "delegated from" = "delegado de"; reply_info_no_attendee = "Ha recibido una respuesta a una invitación de evento pero el remitente no aparece como un participante."; reply_info = "Esta es la respuesta a una invitación a un evento hecha que Usted ha organizado."; "to" = "para"; "Untitled" = "Sin título"; "Size" = "Tamaño"; "Digital signature is not valid" = "Firma Digital no válida"; "Message is signed" = "Mensaje firmado"; "Subject" = "Asunto"; "From" = "De"; "Date" = "Fecha"; "To" = "Para"; "Issuer" = "Remitente"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartSignedViewer.h0000644000000000000000000000236712247657027021425 0ustar rootroot/* UIxMailPartSignedViewer.h - this file is part of SOGo * * Copyright (C) 2009 Inverse inc. * * 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 UIXMAILPARTSIGNEDVIEWER_H #define UIXMAILPARTSIGNEDVIEWER_H #import "UIxMailPartMixedViewer.h" @class NSMutableString; @class NGPart; @interface UIxMailPartSignedViewer : UIxMailPartMixedViewer { BOOL processed; BOOL validSignature; NSMutableString *validationMessage; } - (BOOL) validSignature; - (NSString *) validationMessage; @end #endif /* UIXMAILPARTSIGNEDVIEWER_H */ SOGo-2.1.1b/UI/MailPartViewers/UIxMailSizeFormatter.h0000644000000000000000000000215112247657027020770 0ustar rootroot/* Copyright (C) 2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #ifndef __Mailer_UIxMailSizeFormatter_H__ #define __Mailer_UIxMailSizeFormatter_H__ #include /* UIxMailSizeFormatter This class formats the size values for display. */ @interface UIxMailSizeFormatter : NSFormatter { } + (id)sharedMailSizeFormatter; @end #endif /* __Mailer_UIxMailSizeFormatter_H__ */ SOGo-2.1.1b/UI/MailPartViewers/product.plist0000644000000000000000000000324712247657027017334 0ustar rootroot{ /* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ requires = ( MAIN ); publicResources = ( ); factories = { }; categories = { SOGoHTMLMailBodyPart = { methods = { view = { protectedBy = "View"; pageName = "UIxMailPartExternalHTMLViewer"; }; }; }; SOGoCalendarMailBodyPart = { methods = { accept = { protectedBy = "View"; actionClass = "UIxMailPartICalActions"; actionName = "accept"; }; decline = { protectedBy = "View"; actionClass = "UIxMailPartICalActions"; actionName = "decline"; }; tentative = { protectedBy = "View"; actionClass = "UIxMailPartICalActions"; actionName = "tentative"; }; delegate = { protectedBy = "View"; actionClass = "UIxMailPartICalActions"; actionName = "delegate"; }; updateUserStatus = { protectedBy = "View"; actionClass = "UIxMailPartICalActions"; actionName = "updateUserStatus"; }; /* tentative = { protectedBy = "View"; actionClass = "UIxMailPartICalAction"; actionName = "markTentative"; }; */ addToCalendar = { protectedBy = "View"; actionClass = "UIxMailPartICalActions"; actionName = "addToCalendar"; }; deleteFromCalendar = { protectedBy = "View"; actionClass = "UIxMailPartICalActions"; actionName = "deleteFromCalendar"; }; }; }; }; } SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartHTMLViewer.m0000644000000000000000000006601712247657031020762 0ustar rootroot/* UIxMailPartHTMLViewer.m - this file is part of SOGo * * Copyright (C) 2007-2012 Inverse inc. * * Author: Wolfgang Sourdeau * Ludovic Marcotte * Francis Lachapelle * * 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 #import #import #import #import #import #import #import #import #import #import #import #include #import #import #import "UIxMailPartHTMLViewer.h" #if 0 #define showWhoWeAre() NSLog(@"invoked '%@'", NSStringFromSelector(_cmd)) #else #define showWhoWeAre() #endif /* Tags that are forbidden within the body of the html content */ static NSArray *BannedTags = nil; /* Tags that can't have any contents (no end tag) */ static NSArray *VoidTags= nil; static xmlCharEncoding _xmlCharsetForCharset (NSString *charset) { struct { NSString *name; xmlCharEncoding encoding; } xmlEncodings[] = { { @"us-ascii", XML_CHAR_ENCODING_ASCII}, { @"utf-8", XML_CHAR_ENCODING_UTF8}, { @"utf8", XML_CHAR_ENCODING_UTF8}, // broken mailers { @"utf-16le", XML_CHAR_ENCODING_UTF16LE}, { @"utf-16be", XML_CHAR_ENCODING_UTF16BE}, { @"ucs-4le", XML_CHAR_ENCODING_UCS4LE}, { @"ucs-4be", XML_CHAR_ENCODING_UCS4BE}, { @"ebcdic", XML_CHAR_ENCODING_EBCDIC}, // { @"iso-10646" , XML_CHAR_ENCODING_UCS4_2143}, // { , XML_CHAR_ENCODING_UCS4_3412}, // { @"ucs-2", XML_CHAR_ENCODING_UCS2}, { @"iso8859_1", XML_CHAR_ENCODING_8859_1}, { @"iso-8859-1", XML_CHAR_ENCODING_8859_1}, { @"iso-8859-2", XML_CHAR_ENCODING_8859_2}, { @"iso-8859-3", XML_CHAR_ENCODING_8859_3}, { @"iso-8859-4", XML_CHAR_ENCODING_8859_4}, { @"iso-8859-5", XML_CHAR_ENCODING_8859_5}, { @"iso-8859-6", XML_CHAR_ENCODING_8859_6}, { @"iso-8859-7", XML_CHAR_ENCODING_8859_7}, { @"iso-8859-8", XML_CHAR_ENCODING_8859_8}, { @"iso-8859-9", XML_CHAR_ENCODING_8859_9}, { @"iso-8859-13", XML_CHAR_ENCODING_ERROR}, { @"iso-2022-jp", XML_CHAR_ENCODING_2022_JP}, // { @"iso-2022-jp", XML_CHAR_ENCODING_SHIFT_JIS}, { @"koi8-r", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger koi8-r -> utf8 conversion { @"windows-1250", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1250 -> utf8 conversion { @"windows-1251", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1251 -> utf8 conversion { @"windows-1257", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1257 -> utf8 conversion { @"gb2312", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger gb2312 -> utf8 conversion { @"euc-jp", XML_CHAR_ENCODING_EUC_JP}}; unsigned count; xmlCharEncoding encoding; encoding = XML_CHAR_ENCODING_NONE; count = 0; while (encoding == XML_CHAR_ENCODING_NONE && count < (sizeof (xmlEncodings) / sizeof (xmlEncodings[0]))) if ([charset isEqualToString: xmlEncodings[count].name]) encoding = xmlEncodings[count].encoding; else count++; if (encoding == XML_CHAR_ENCODING_NONE) encoding = XML_CHAR_ENCODING_8859_1; return encoding; } // // In order to avoid a libxml bug/limitation, we strip the charset= parameter // to avoid libxml to consider the charset= parameter while it works in UTF-8 // internally, all the time. // // A fix was commited by Daniel Veillard following discussions Inverse had // with him on the issue: // // commit a1bc2f2ba4b5317885205d4f71c7c4b1c99ec870 // Author: Daniel Veillard // Date: Mon May 16 16:03:50 2011 +0800 // // Add options to ignore the internal encoding // // For both XML and HTML, the document can provide an encoding // either in XMLDecl in XML, or as a meta element in HTML head. // This adds options to ignore those encodings if the encoding // is known in advace for example if the content had been converted // before being passed to the parser. // // * parser.c include/libxml/parser.h: add XML_PARSE_IGNORE_ENC option // for XML parsing // * include/libxml/HTMLparser.h HTMLparser.c: adds the // HTML_PARSE_IGNORE_ENC for HTML parsing // * HTMLtree.c: fix the handling of saving when an unknown encoding is // defined in meta document header // * xmllint.c: add a --noenc option to activate the new parser options // // static NSData* _sanitizeContent(NSData *theData) { NSMutableData *d; NSString *found_tag, *tag; NSEnumerator *tags; const char *bytes; char *buf; int i, j, len; BOOL found_delimiter; d = [NSMutableData dataWithData: theData]; bytes = [d bytes]; len = [d length]; i = 0; while (i < len) { // We check if we see in which case, we don't do any kind // of substitution there after. if (i < len-6) { if ((*bytes == '<') && (*(bytes+1) == '/') && (*(bytes+2) == 'h' || *(bytes+2) == 'H') && (*(bytes+3) == 'e' || *(bytes+3) == 'E') && (*(bytes+4) == 'a' || *(bytes+4) == 'A') && (*(bytes+5) == 'd' || *(bytes+5) == 'D') && (*(bytes+6) == '>')) break; } // We search for something like : // // // if (i < len-9) { if ((*bytes == 'c' || *bytes == 'C') && (*(bytes+1) == 'h' || *(bytes+1) == 'H') && (*(bytes+2) == 'a' || *(bytes+2) == 'A') && (*(bytes+3) == 'r' || *(bytes+3) == 'R') && (*(bytes+4) == 's' || *(bytes+4) == 'S') && (*(bytes+5) == 'e' || *(bytes+5) == 'E') && (*(bytes+6) == 't' || *(bytes+6) == 'T') && (*(bytes+7) == '=')) { // We search until we find a '"' or a space j = 8; found_delimiter = YES; while (*(bytes+j) != ' ' && *(bytes+j) != '"' && *(bytes+j) != '\'') { j++; // We haven't found anything, let's return the data untouched if ((i+j) >= len) { found_delimiter = NO; break; } } if (found_delimiter) [d replaceBytesInRange: NSMakeRange(i, j) withBytes: NULL length: 0]; break; } } bytes++; i++; } /* * Replace badly formatted void tags * * A void tag that begins with a slash is considered invalid. * We remove the slash from those tags. * * Ex:
is replaced by
*/ if (!VoidTags) { /* see http://www.w3.org/TR/html4/index/elements.html */ VoidTags = [[NSArray alloc] initWithObjects: @"area", @"base", @"basefont", @"br", @"col", @"frame", @"hr", @"img", @"input", @"isindex", @"link", @"meta", @"param", @"", nil]; } bytes = [d bytes]; len = [d length]; i = 0; while (i < len) { if (i < len-3) { // Search for ending tags if ((*bytes == '<') && (*(bytes+1) == '/')) { i += 2; bytes += 2; j = 0; found_delimiter = YES; while (*(bytes+j) != '>') { j++; if ((i+j) >= len) { found_delimiter = NO; break; } } if (found_delimiter && j > 0) { // Copy the ending tag to a NSString buf = malloc((j+1) * sizeof(char)); memset (buf, 0, j+1); memcpy (buf, bytes, j); found_tag = [NSString stringWithCString: buf encoding: NSUTF8StringEncoding]; tags = [VoidTags objectEnumerator]; tag = [tags nextObject]; while (tag) { if ([tag caseInsensitiveCompare: found_tag] == NSOrderedSame) { // Remove the leading slash NSLog(@"Found void tag with invalid leading slash: ", found_tag); i--; [d replaceBytesInRange: NSMakeRange(i, 1) withBytes: NULL length: 0]; bytes = [d bytes]; bytes += i; len = [d length]; break; } tag = [tags nextObject]; } free(buf); // Continue the parsing after end tag i += j; bytes += j; } } } bytes++; i++; } return d; } @interface _UIxHTMLMailContentHandler : NSObject { NSMutableString *result; NSMutableString *css; NSDictionary *attachmentIds; int ignoredContent; NSString *ignoreTag; BOOL inBody; BOOL inStyle; BOOL inCSSDeclaration; BOOL hasEmbeddedCSS; xmlCharEncoding contentEncoding; } - (NSString *) result; @end @implementation _UIxHTMLMailContentHandler + (void) initialize { if (!BannedTags) BannedTags = [[NSArray alloc] initWithObjects: @"script", @"frameset", @"frame", @"iframe", @"applet", @"link", @"base", @"meta", @"title", nil]; if (!VoidTags) { /* see http://www.w3.org/TR/html4/index/elements.html */ VoidTags = [[NSArray alloc] initWithObjects: @"area", @"base", @"basefont", @"br", @"col", @"frame", @"hr", @"img", @"input", @"isindex", @"link", @"meta", @"param", @"", nil]; } } - (id) init { if ((self = [super init])) { css = nil; result = nil; ignoreTag = nil; attachmentIds = nil; contentEncoding = XML_CHAR_ENCODING_UTF8; } return self; } - (void) dealloc { [result release]; [css release]; [ignoreTag release]; [super dealloc]; } - (void) setContentEncoding: (xmlCharEncoding) newContentEncoding { contentEncoding = newContentEncoding; } - (xmlCharEncoding) contentEncoding { return contentEncoding; } - (void) setAttachmentIds: (NSDictionary *) newAttachmentIds { attachmentIds = newAttachmentIds; } - (NSString *) css { return css; } - (NSString *) result { return result; } /* SaxContentHandler */ - (void) startDocument { showWhoWeAre(); [css release]; [result release]; result = [NSMutableString new]; css = [NSMutableString new]; ignoredContent = 0; [ignoreTag release]; ignoreTag = nil; inBody = NO; inStyle = NO; inCSSDeclaration = NO; hasEmbeddedCSS = NO; } - (void) endDocument { showWhoWeAre(); } - (void) startPrefixMapping: (NSString *)_prefix uri: (NSString *)_uri { showWhoWeAre(); } - (void) endPrefixMapping: (NSString *)_prefix { showWhoWeAre(); } - (void) _appendStyle: (unichar *) _chars length: (int) _len { unsigned int count, length; unichar *start, *currentChar; start = _chars; while (*start < 33) start++; currentChar = start; for (count = 0; count < _len; count++) { currentChar = _chars + count; if (inCSSDeclaration) { if (*currentChar == '}') { inCSSDeclaration = NO; hasEmbeddedCSS = NO; } } else { if (*currentChar < 32) { if (currentChar > start) [css appendString: [NSString stringWithCharacters: start length: (currentChar - start)]]; start = currentChar + 1; } else { if (*currentChar == '{') inCSSDeclaration = YES; else if (*currentChar == ',') hasEmbeddedCSS = NO; else if (!hasEmbeddedCSS) { if (*currentChar == '@') hasEmbeddedCSS = YES; else if (*currentChar > 32) { length = (currentChar - start); [css appendFormat: @"%@\n.SOGoHTMLMail-CSS-Delimiter ", [NSString stringWithCharacters: start length: length]]; hasEmbeddedCSS = YES; start = currentChar; } } } } } if (currentChar > start) [css appendString: [NSString stringWithCharacters: start length: (currentChar - start)]]; } - (void) startElement: (NSString *) _localName namespace: (NSString *) _ns rawName: (NSString *) _rawName attributes: (id ) _attributes { unsigned int count, max; NSString *name, *value, *cid, *lowerName; NSMutableString *resultPart; BOOL skipAttribute; showWhoWeAre(); lowerName = [_localName lowercaseString]; if (inStyle || ignoredContent) ; else if ([lowerName isEqualToString: @"base"]) ; else if ([lowerName isEqualToString: @"meta"]) ; else if ([lowerName isEqualToString: @"body"]) inBody = YES; else if ([lowerName isEqualToString: @"style"]) inStyle = YES; else if (inBody) { if ([BannedTags containsObject: lowerName]) { if (!ignoredContent) ignoreTag = [lowerName copy]; ignoredContent++; } else { resultPart = [NSMutableString string]; [resultPart appendFormat: @"<%@", _rawName]; if ([VoidTags containsObject: lowerName]) { if (!ignoredContent) ignoreTag = [lowerName copy]; ignoredContent++; } max = [_attributes count]; for (count = 0; count < max; count++) { skipAttribute = NO; name = [[_attributes nameAtIndex: count] lowercaseString]; if ([name hasPrefix: @"ON"]) skipAttribute = YES; else if ([name isEqualToString: @"src"]) { value = [_attributes valueAtIndex: count]; if ([value hasPrefix: @"cid:"]) { cid = [NSString stringWithFormat: @"<%@>", [value substringFromIndex: 4]]; value = [attachmentIds objectForKey: cid]; skipAttribute = (value == nil); } else if ([lowerName isEqualToString: @"img"]) { /* [resultPart appendString: @"src=\"/SOGo.woa/WebServerResources/empty.gif\""]; */ name = @"unsafe-src"; } else skipAttribute = YES; } else if (([name isEqualToString: @"data"] || [name isEqualToString: @"classid"]) && [lowerName isEqualToString: @"object"]) { value = [_attributes valueAtIndex: count]; name = [NSString stringWithFormat: @"unsafe-%@", name]; } else if ([name isEqualToString: @"href"] || [name isEqualToString: @"action"]) { value = [_attributes valueAtIndex: count]; skipAttribute = ([value rangeOfString: @"://"].location == NSNotFound && ![value hasPrefix: @"mailto:"] && ![value hasPrefix: @"#"]); } else if ( // Mouse Events [name isEqualToString: @"onclick"] || [name isEqualToString: @"ondblclick"] || [name isEqualToString: @"onmousedown"] || [name isEqualToString: @"onmousemove"] || [name isEqualToString: @"onmouseout"] || [name isEqualToString: @"onmouseup"] || [name isEqualToString: @"onmouseover"] || // Keyboard Events [name isEqualToString: @"onkeydown"] || [name isEqualToString: @"onkeypress"] || [name isEqualToString: @"onkeyup"] || // Frame/Object Events [name isEqualToString: @"onabort"] || [name isEqualToString: @"onerror"] || [name isEqualToString: @"onload"] || [name isEqualToString: @"onresize"] || [name isEqualToString: @"onscroll"] || [name isEqualToString: @"onunload"] || // Form Events [name isEqualToString: @"onblur"] || [name isEqualToString: @"onchange"] || [name isEqualToString: @"onfocus"] || [name isEqualToString: @"onreset"] || [name isEqualToString: @"onselect"] || [name isEqualToString: @"onsubmit"]) { skipAttribute = YES; } else value = [_attributes valueAtIndex: count]; if (!skipAttribute) [resultPart appendFormat: @" %@=\"%@\"", name, [value stringByReplacingString: @"\"" withString: @"\\\""]]; } if ([VoidTags containsObject: lowerName]) [resultPart appendString: @"/"]; [resultPart appendString: @">"]; [result appendString: resultPart]; } } } - (void) _finishCSS { NSRange excessiveDelimiter; [css replaceString: @"" withString: @""]; [css replaceString: @".SOGoHTMLMail-CSS-Delimiter body" withString: @".SOGoHTMLMail-CSS-Delimiter"]; [css replaceString: @";" withString: @" !important;"]; excessiveDelimiter = [css rangeOfString: @".SOGoHTMLMail-CSS-Delimiter " options: NSBackwardsSearch]; if (excessiveDelimiter.location != NSNotFound) { if (NSMaxRange (excessiveDelimiter) == [css length]) [css deleteCharactersInRange: excessiveDelimiter]; } } - (void) endElement: (NSString *) _localName namespace: (NSString *) _ns rawName: (NSString *) _rawName { NSString *lowerName; showWhoWeAre(); lowerName = [_localName lowercaseString]; if (ignoredContent) { if ([lowerName isEqualToString: ignoreTag]) { ignoredContent--; if (!ignoredContent) { [ignoreTag release]; ignoreTag = nil; } } } else { if (inStyle) { if ([lowerName isEqualToString: @"style"]) { inStyle = NO; inCSSDeclaration = NO; } } else if (inBody) { if ([lowerName isEqualToString: @"body"]) { inBody = NO; if (css) [self _finishCSS]; } else { //NSLog (@"%@", _localName); [result appendFormat: @"", _localName]; } } } } - (void) characters: (unichar *) _chars length: (int) _len { showWhoWeAre(); if (!ignoredContent) { if (inStyle) [self _appendStyle: _chars length: _len]; else if (inBody) { NSString *tmpString; tmpString = [NSString stringWithCharacters: _chars length: _len]; // HACK: This is to avoid appending the useless junk in the tag // that Outlook adds. It seems to confuse the XML parser for // forwarded messages as we get this in the _body_ of the email // while we really aren't in it! if (![tmpString hasPrefix: @" xmlns:v=\"urn:schemas-microsoft-com:vml\""]) [result appendString: [tmpString stringByEscapingHTMLString]]; } } } - (void) ignorableWhitespace: (unichar *) _chars length: (int) _len { showWhoWeAre(); } - (void) processingInstruction: (NSString *) _pi data: (NSString *) _data { showWhoWeAre(); } - (void) setDocumentLocator: (id ) _locator { showWhoWeAre(); } - (void) skippedEntity: (NSString *) _entityName { showWhoWeAre(); } /* SaxLexicalHandler */ - (void) comment: (unichar *) _chars length: (int) _len { showWhoWeAre(); if (inStyle) [self _appendStyle: _chars length: _len]; } - (void) startDTD: (NSString *) _name publicId: (NSString *) _pub systemId: (NSString *) _sys { showWhoWeAre(); } - (void) endDTD { showWhoWeAre(); } - (void) startEntity: (NSString *) _name { showWhoWeAre(); } - (void) endEntity: (NSString *) _name { showWhoWeAre(); } - (void) startCDATA { showWhoWeAre(); } - (void) endCDATA { showWhoWeAre(); } @end @interface NSDictionary (SOGoDebug) - (void) dump; @end @implementation NSDictionary (SOGoDebug) - (void) dump { NSEnumerator *keys; NSString *key; NSMutableString *dump; dump = [NSMutableString new]; [dump appendFormat: @"\nNSDictionary dump (%@):\n", self]; keys = [[self allKeys] objectEnumerator]; key = [keys nextObject]; while (key) { [dump appendFormat: @"%@: %@\n", key, [self objectForKey: key]]; key = [keys nextObject]; } [dump appendFormat: @"--- end ---\n"]; NSLog(dump); [dump release]; } @end @implementation UIxMailPartHTMLViewer - (id) init { if ((self = [super init])) { handler = nil; } return self; } - (void) dealloc { [handler release]; [super dealloc]; } - (xmlCharEncoding) _xmlCharEncoding { NSString *charset; charset = [[bodyInfo objectForKey:@"parameterList"] objectForKey: @"charset"]; if (![charset length]) charset = @"us-ascii"; return _xmlCharsetForCharset([charset lowercaseString]); } - (void) _parseContent { NSObject *parser; NSData *preparsedContent; SOGoMailObject *mail; xmlCharEncoding enc; mail = [self clientObject]; preparsedContent = _sanitizeContent([super decodedFlatContent]); parser = [[SaxXMLReaderFactory standardXMLReaderFactory] createXMLReaderForMimeType: @"text/html"]; handler = [_UIxHTMLMailContentHandler new]; [handler setAttachmentIds: [mail fetchAttachmentIds]]; // We check if we got an unsupported charset. If so // we convert everything to UTF-16{LE,BE} so it passes // in libxml2 and also in characters: length: defined // in this file (that expects unichar:s) enc = [self _xmlCharEncoding]; if (enc == XML_CHAR_ENCODING_ERROR) { NSString *s; s = [NSString stringWithData: preparsedContent usingEncodingNamed: [[bodyInfo objectForKey:@"parameterList"] objectForKey: @"charset"]]; #if BYTE_ORDER == BIG_ENDIAN preparsedContent = [s dataUsingEncoding: NSUTF16BigEndianStringEncoding]; enc = XML_CHAR_ENCODING_UTF16BE; #else preparsedContent = [s dataUsingEncoding: NSUTF16LittleEndianStringEncoding]; enc = XML_CHAR_ENCODING_UTF16LE; #endif } [handler setContentEncoding: enc]; [parser setContentHandler: handler]; [parser parseFromSource: preparsedContent]; } - (NSString *) cssContent { NSString *cssContent, *css; if (!handler) [self _parseContent]; css = [handler css]; if ([css length]) cssContent = [NSString stringWithFormat: @"", [handler css]]; else cssContent = @""; return cssContent; } - (NSString *) flatContentAsString { if (!handler) [self _parseContent]; return [handler result]; } @end @implementation UIxMailPartExternalHTMLViewer - (id) init { if ((self = [super init])) { handler = nil; } return self; } - (void) dealloc { [handler release]; [super dealloc]; } - (xmlCharEncoding) _xmlCharEncoding { NSString *charset; charset = [[bodyInfo objectForKey:@"parameterList"] objectForKey: @"charset"]; if (![charset length]) charset = @"us-ascii"; return _xmlCharsetForCharset([charset lowercaseString]); } - (void) _parseContent { NSObject *parser; NSData *preparsedContent; SOGoMailObject *mail; SOGoMailBodyPart *part; NSString *encoding; xmlCharEncoding enc; part = [self clientObject]; mail = [part mailObject]; preparsedContent = _sanitizeContent([part fetchBLOB]); parser = [[SaxXMLReaderFactory standardXMLReaderFactory] createXMLReaderForMimeType: @"text/html"]; encoding = [[part partInfo] valueForKey: @"encoding"]; if (![encoding length]) encoding = @"us-ascii"; handler = [_UIxHTMLMailContentHandler new]; [handler setAttachmentIds: [mail fetchAttachmentIds]]; // We check if we got an unsupported charset. If so // we convert everything to UTF-16{LE,BE} so it passes // in libxml2 and also in characters: length: defined // in this file (that expects unichar:s) enc = _xmlCharsetForCharset(encoding); if (enc == XML_CHAR_ENCODING_ERROR) { NSString *s; s = [NSString stringWithData: preparsedContent usingEncodingNamed: [[bodyInfo objectForKey:@"parameterList"] objectForKey: @"charset"]]; #if BYTE_ORDER == BIG_ENDIAN preparsedContent = [s dataUsingEncoding: NSUTF16BigEndianStringEncoding]; enc = XML_CHAR_ENCODING_UTF16BE; #else preparsedContent = [s dataUsingEncoding: NSUTF16LittleEndianStringEncoding]; enc = XML_CHAR_ENCODING_UTF16LE; #endif } [handler setContentEncoding: enc]; [parser setContentHandler: handler]; [parser parseFromSource: preparsedContent]; } - (NSString *) filename { return [[self clientObject] filename]; } - (NSString *) cssContent { NSString *cssContent, *css; if (!handler) [self _parseContent]; css = [handler css]; if ([css length]) cssContent = [NSString stringWithFormat: @"", [handler css]]; else cssContent = @""; return cssContent; } - (NSString *) flatContentAsString { if (!handler) [self _parseContent]; return [handler result]; } @end SOGo-2.1.1b/UI/MailPartViewers/French.lproj/0000755000000000000000000000000012247657027017123 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/French.lproj/Localizable.strings0000644000000000000000000000332312247657027022760 0ustar rootrootACCEPTED = "Accepté"; COMPLETED = "Terminé"; DECLINED = "Refusé"; DELEGATED = "Délégué"; "IN-PROCESS" = "En cours de traitement"; "NEEDS-ACTION" = "Prise de décision nécessaire"; TENTATIVE = "Proposition"; organized_by_you = "vous êtes l'organisateur"; you_are_an_attendee = "vous êtes invité"; add_info_text = "SOGo ne supporte pas la méthode ADD (iMIP) pour le moment."; publish_info_text = "L'expéditeur vous informe de l'événement attaché."; cancel_info_text = "Votre invitation ou l'événement au complet a été annulé."; request_info_no_attendee = "propose une réunion entre les invités. Ce message tient seulement lieu d'avis, vous n'êtes pas indiqué comme invité."; Appointment = "Événement"; "Status Update" = "Changement d'état"; was = "était"; Organizer = "Organisateur"; Time = "Date"; Attendees = "Invités"; request_info = "vous invite à une réunion."; "Add to calendar" = "Ajouter à l'agenda"; "Delete from calendar" = "Effacer de l'agenda"; "Update status" = "Intégrer les modifications"; Accept = "Accepter"; Decline = "Décliner"; Tentative = "Tentatif"; "Delegate ..." = "Déléguer ..."; "Delegated to" = "Délégué à"; "Update status in calendar" = "Mettre l'agenda à jour"; "delegated from" = "délégué par"; reply_info_no_attendee = "Vous avez reçu une réponse à un événement mais l'expéditeur n'est pas un invité."; reply_info = "Ceci est une réponse à un événement que vous avez organisé."; "to" = "à"; "Untitled" = "Sans titre"; "Size" = "Taille"; "Digital signature is not valid" = "Signature digitale non-valide"; "Message is signed" = "Message signé"; "Subject" = "Sujet"; "From" = "Expéditeur"; "Date" = "Date"; "To" = "Destinataire"; "Issuer" = "Émetteur"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailRenderingContext.m0000644000000000000000000001660512247657027021472 0ustar rootroot/* Copyright (C) 2007-2009 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import "UIxMailRenderingContext.h" @interface UIxMailRenderingContext (Private) - (BOOL) _shouldDisplayAsAttachment: (NSDictionary *) info textPart: (BOOL) textPart; @end @implementation UIxMailRenderingContext (Private) - (BOOL) _shouldDisplayAsAttachment: (NSDictionary *) info textPart: (BOOL) textPart { NSString *s; BOOL shouldDisplay; s = [[info objectForKey:@"disposition"] objectForKey: @"type"]; shouldDisplay = (s && ([s caseInsensitiveCompare: @"ATTACHMENT"] == NSOrderedSame)); if (!shouldDisplay && !textPart) shouldDisplay = ([[info objectForKey: @"bodyId"] length] ? YES : NO); return shouldDisplay; } @end @implementation UIxMailRenderingContext static BOOL showNamedTextAttachmentsInline = NO; - (id) initWithViewer: (WOComponent *) _viewer context: (WOContext *) _ctx { if ((self = [super init])) { viewer = _viewer; context = _ctx; } return self; } - (id) init { return [self initWithViewer: nil context: nil]; } - (void) dealloc { [flatContents release]; [super dealloc]; } - (void) reset { [flatContents release]; flatContents = nil; } /* fetching */ - (NSDictionary *) flatContents { if (!flatContents) { flatContents = [[viewer clientObject] fetchPlainTextParts]; [flatContents retain]; // [self debugWithFormat:@"CON: %@", flatContents]; } return flatContents; } - (NSData *) flatContentForPartPath: (NSArray *) _partPath { NSString *pid; NSData *content; pid = _partPath ? (id)[_partPath componentsJoinedByString: @"."] : (id)@""; content = [[self flatContents] objectForKey: pid]; if (!content && ![pid intValue]) content = [flatContents objectForKey: @""]; return content; } /* viewer components */ - (WOComponent *) mixedViewer { /* Note: we cannot cache the multipart viewers, because it can be nested */ return [viewer pageWithName: @"UIxMailPartMixedViewer"]; } - (WOComponent *) signedViewer { /* Note: we cannot cache the multipart viewers, because it can be nested */ // TODO: temporary workaround (treat it like a plain mixed part) return [viewer pageWithName: @"UIxMailPartSignedViewer"]; } - (WOComponent *) alternativeViewer { /* Note: we cannot cache the multipart viewers, because it can be nested */ return [viewer pageWithName: @"UIxMailPartAlternativeViewer"]; } - (WOComponent *) textViewer { return [viewer pageWithName: @"UIxMailPartTextViewer"]; } - (WOComponent *) imageViewer { return [viewer pageWithName: @"UIxMailPartImageViewer"]; } - (WOComponent *) linkViewer { return [viewer pageWithName: @"UIxMailPartLinkViewer"]; } - (WOComponent *) htmlViewer { id o; o = [viewer pageWithName: @"UIxMailPartHTMLViewer"]; return o; } - (WOComponent *) messageViewer { return [viewer pageWithName: @"UIxMailPartMessageViewer"]; } - (WOComponent *) iCalViewer { return [viewer pageWithName: @"UIxMailPartICalViewer"]; } /* main viewer selection */ - (WOComponent *) viewerForBodyInfo: (id) _info { NSString *mt, *st; mt = [[_info valueForKey:@"type"] lowercaseString]; st = [[_info valueForKey:@"subtype"] lowercaseString]; if ([mt isEqualToString:@"multipart"]) { if ([st isEqualToString: @"mixed"] || [st isEqualToString: @"digest"] || [st isEqualToString: @"related"] || [st isEqualToString: @"appledouble"]) return [self mixedViewer]; else if ([st isEqualToString: @"signed"]) return [self signedViewer]; else if ([st isEqualToString: @"alternative"]) return [self alternativeViewer]; if ([st isEqualToString:@"report"]) /* this is used by mail-delivery reports */ return [self mixedViewer]; } else if ([mt isEqualToString:@"text"]) { if ([st isEqualToString:@"plain"] || [st isEqualToString:@"html"]) { if (!showNamedTextAttachmentsInline && [self _shouldDisplayAsAttachment: _info textPart:YES]) return [self linkViewer]; return [st isEqualToString:@"html"] ? [self htmlViewer] : [self textViewer]; } if ([st isEqualToString:@"calendar"]) return [self iCalViewer]; } // TIFF files aren't well-supported and Thunderbird sometimes send PDF // files over as image/pdf ! if ([mt isEqualToString:@"image"] && !([st isEqualToString: @"tiff"] || [st isEqualToString: @"pdf"])) { if ([self _shouldDisplayAsAttachment: _info textPart: NO]) return [self linkViewer]; return [self imageViewer]; } if ([mt isEqualToString:@"message"] && [st isEqualToString:@"rfc822"]) return [self messageViewer]; if ([mt isEqualToString:@"message"] && [st isEqualToString:@"delivery-status"]) { /* Content-Description: Delivery error report Content-Type: message/delivery-status Reporting-MTA: dns; mail.opengroupware.org Arrival-Date: Mon, 18 Jul 2005 12:08:43 +0200 (CEST) Final-Recipient: rfc822; ioioi@plop.com Action: failed Status: 5.0.0 Diagnostic-Code: X-Postfix; host plop.com[64.39.31.55] said: 550 5.7.1 ... Relaying denied */ // Note: we cannot use the text viewer because the body is not pre-fetched return [self linkViewer]; } if ([mt isEqualToString:@"application"]) { // octet-stream (generate download link?, autodetect type?) if ([st isEqualToString:@"ics"]) /* Cooqle K4lendahr - Google Calendar */ return [self iCalViewer]; #if 0 /* the link viewer looks better than plain text ;-) */ if ([st isEqualToString:@"pgp-signature"]) // TODO: real PGP viewer return [self textViewer]; #endif } // TODO: always fallback to octet viewer?! #if 1 [self errorWithFormat:@"found no viewer for MIME type: %@/%@", mt, st]; #endif return [self linkViewer]; } /* debugging */ - (BOOL) isDebuggingEnabled { return NO; } @end /* UIxMailRenderingContext */ @implementation WOContext(UIxMailPart) static NSString *MRK = @"UIxMailRenderingContext"; - (void) pushMailRenderingContext: (UIxMailRenderingContext *) _mctx { [self setObject:_mctx forKey:MRK]; } - (UIxMailRenderingContext *) popMailRenderingContext { UIxMailRenderingContext *mctx; if ((mctx = [self objectForKey:MRK]) == nil) return nil; mctx = [[mctx retain] autorelease]; [self removeObjectForKey:MRK]; return mctx; } - (UIxMailRenderingContext *) mailRenderingContext { return [self objectForKey:MRK]; } @end /* WOContext(UIxMailPart) */ SOGo-2.1.1b/UI/MailPartViewers/NorwegianBokmal.lproj/0000755000000000000000000000000012247657027020775 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/NorwegianBokmal.lproj/Localizable.strings0000644000000000000000000000307212247657027024633 0ustar rootrootACCEPTED = "akseptert"; COMPLETED = "fullført"; DECLINED = "avvist"; DELEGATED = "delegert"; "IN-PROCESS" = "pÃ¥gÃ¥ende"; "NEEDS-ACTION" = "behøver handling"; TENTATIVE = "foreløpig"; organized_by_you = "organisert av deg"; you_are_an_attendee = "du er en deltager"; add_info_text = "iMIP 'ADD'-forespørsler støttes ikke enda av SOGo."; publish_info_text = "Avsenderen informerer deg om vedlagte arrangement."; cancel_info_text = "Din invitasjon eller hele arrangementet er avlyst."; request_info_no_attendee = "foreslÃ¥r et møte til deltakerne. Du har fÃ¥tt informasjon, men er ikke planlagt som en deltaker."; Appointment = "Møte"; Organizer = "Arrangør"; Time = "Tid"; Attendees = "Deltakere"; request_info = "inviterer deg til Ã¥ delta i et møte."; "Add to calendar" = "Legg inn i kalenderen"; "Delete from calendar" = "Ta bort fra kalenderen"; "Update status" = "Oppdater status"; Accept = "Godta"; Decline = "AvslÃ¥"; Tentative = "Foreløpig"; "Delegate ..." = "Delegere ..."; "Delegated to" = "Delegert til"; "Update status in calendar" = "Oppdater status i kalenderen"; "delegated from" = "delegert fra"; reply_info_no_attendee = "Du har fÃ¥tt svar angÃ¥ende en planlagt begivenhet som avsenderen ikke er invitert til."; reply_info = "Du har fÃ¥tt et svar angÃ¥ende en begivenhet invitert av deg."; "to" = "til"; "Untitled" = "Ingen emne"; "Size" = "Størrelse"; "Digital signature is not valid" = "Digital signatur er ikke gyldig"; "Message is signed" = "Meldingen er signert"; "Subject" = "Emne"; "From" = "Fra"; "Date" = "Dato"; "To" = "Til"; "Issuer" = "Utført av"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartLinkViewer.m0000644000000000000000000000160512247657027021110 0ustar rootroot/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. 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. */ #import "UIxMailPartLinkViewer.h" @implementation UIxMailPartLinkViewer @end /* UIxMailPartLinkViewer */ SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartMessageViewer.m0000644000000000000000000001136512247657027021603 0ustar rootroot/* Copyright (C) 2007-2009 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import "UIxMailRenderingContext.h" #import "UIxMailPartViewer.h" /* UIxMailPartMessageViewer Show message/rfc822 mail parts. Note that the IMAP4 server already returns a proper body structure of the message. Relevant body-info keys: to/sender/from/cc/bcc/in-reply-to/reply-to - array of addr-dicts type/subtype - message/RFC822 size subject parameterList - dict (eg 'name') messageId date encoding - 7BIT bodyLines - 83 bodyId - (empty string?) description - (empty string?, content-description?) body - a body structure? Addr-Dict: hostName / mailboxName / personalName / sourceRoute */ @class NGImap4Envelope; @interface UIxMailPartMessageViewer : UIxMailPartViewer { NGImap4Envelope *envelope; } @end @implementation UIxMailPartMessageViewer - (void) dealloc { [envelope release]; [super dealloc]; } /* cache maintenance */ - (void) resetBodyInfoCaches { [super resetBodyInfoCaches]; [envelope release]; envelope = nil; } /* nested body structure */ - (id) contentInfo { return [[self bodyInfo] valueForKey:@"body"]; } - (id) contentPartPath { /* Path processing is a bit weird in the context of message/rfc822. If we have a multipart, the multipart itself has no own identifier! Instead the children of the multipart are directly mapped into the message namespace. If the message has just a plain content, ids seems to be as expected (that is, its just a "1"). */ NSArray *pp; NSString *mt; mt = [[[self contentInfo] valueForKey:@"type"] lowercaseString]; if ([mt isEqualToString:@"multipart"]) return [self partPath]; pp = [self partPath]; return (([pp count] > 0) ? (id)[pp arrayByAddingObject: @"1"] : (id)[NSArray arrayWithObject: @"1"]); } - (id) contentViewerComponent { UIxMailRenderingContext *mailContext; mailContext = [[self context] mailRenderingContext]; return [mailContext viewerForBodyInfo: [self contentInfo]]; } /* generating envelope */ - (NGImap4Envelope *) envelope { if (!envelope) envelope = [[NGImap4Envelope alloc] initWithBodyStructureInfo: [self bodyInfo]]; return envelope; } - (NSString *) formattedComponents: (NSArray *) components { NSMutableArray *formattedComponents; unsigned int count, max; NSString *component; max = [components count]; formattedComponents = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { component = [[components objectAtIndex: count] email]; if (component) [formattedComponents addObject: [component decodedHeader]]; } return [formattedComponents componentsJoinedByString: @", "]; } - (NSString *) messageSubject { id baseSubject; NSString *subject; baseSubject = [[self envelope] subject]; // We avoid uber-lamenesses in SOPE - see sope-core/NGExtensions/NGQuotedPrintableCoding.m // -stringByDecodingQuotedPrintable for all details if ([baseSubject isKindOfClass: [NSString class]]) baseSubject = [baseSubject dataUsingEncoding: NSASCIIStringEncoding]; subject = [baseSubject decodedHeader]; if (![subject length]) subject = @""; return subject; } - (NSString *) fromAddresses { NSArray *from; from = [[self envelope] from]; return [self formattedComponents: from]; } - (NSString *) toAddresses { NSArray *to; to = [[self envelope] to]; return [self formattedComponents: to]; } - (NSString *) ccAddresses { NSArray *cc; cc = [[self envelope] cc]; return [self formattedComponents: cc]; } /* links to recipients */ - (NSString *) linkToEnvelopeAddress: (NGImap4EnvelopeAddress *) _address { // TODO: make some web-link, eg open a new compose panel? return [@"mailto:" stringByAppendingString:[_address baseEMail]]; } @end /* UIxMailPartMessageViewer */ SOGo-2.1.1b/UI/MailPartViewers/Finnish.lproj/0000755000000000000000000000000012247657027017314 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Finnish.lproj/Localizable.strings0000644000000000000000000000313612247657027023153 0ustar rootrootACCEPTED = "hyväksytty"; COMPLETED = "valmistunut"; DECLINED = "hylätty"; DELEGATED = "valtuutettu"; "IN-PROCESS" = "meneillään"; "NEEDS-ACTION" = "vaatii toimenpiteitä"; TENTATIVE = "alustava"; organized_by_you = "sinun järjestämä"; you_are_an_attendee = "olet osallistuja"; add_info_text = "SOGo ei vielä tue iMIP 'ADD' pyyntöjä."; publish_info_text = "Lähettäjä ilmoittaa sinulle liitteenä olevan tapahtuman."; cancel_info_text = "Kutsusi tai tapahtuma on peruttu."; request_info_no_attendee = "ehdottaa kokousta osallistujille. Saat tämän sähköpostin ilmoituksena, et osallistujana."; Appointment = "Tapahtuma"; "Status Update" = "Tilapäivitys"; was = "oli"; Organizer = "Järjestäjä"; Time = "Aika"; Attendees = "Osallistujat"; request_info = "kutsuu sinut osallistumaan tapaamiseen."; "Add to calendar" = "Lisää kalenteriin"; "Delete from calendar" = "Poista kalenterista"; "Update status" = "Päivitä tila"; Accept = "Hylkää"; Decline = "Hylkää"; Tentative = "Alustava"; "Delegate ..." = "Valtuuta ..."; "Delegated to" = "Valtuutettu"; "Update status in calendar" = "Päivitä tila kalenterissa"; "delegated from" = "valtuuttaja"; reply_info_no_attendee = "Olet saanut vastauksen kalenteritapahtumaan, mutta vastaaja ei ole osallistuja."; reply_info = "Tämä on vastaus tapahtumakutsuusi."; "to" = " "; "Untitled" = "Nimetön"; "Size" = "Koko"; "Digital signature is not valid" = "Digitaalinen allekirjoitus ei kelpaa"; "Message is signed" = "Viesti on allekirjoitettu"; "Subject" = "Aihe"; "From" = "Lähettäjä"; "Date" = "Päiväys"; "To" = "Vastaanottaja"; "Issuer" = "Julkaisija"; SOGo-2.1.1b/UI/MailPartViewers/Slovak.lproj/0000755000000000000000000000000012247657027017155 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Slovak.lproj/Localizable.strings0000644000000000000000000000315312247657027023013 0ustar rootrootACCEPTED = "akceptovaný"; COMPLETED = "kompeltný"; DECLINED = "zamietnutý"; DELEGATED = "delegovaný"; "IN-PROCESS" = "v procesu"; "NEEDS-ACTION" = "vyžaduje akciu"; TENTATIVE = "nerozhodný"; organized_by_you = "organizovaný Vami"; you_are_an_attendee = "ste úÄastník"; add_info_text = "iMIP 'Pridaj' žiadosÅ¥ zatiaľ nie je SOGo-m podporovaná."; publish_info_text = "Odosielateľ Vás informuje o priloženej udalosti."; cancel_info_text = "VaÅ¡a pozvánka alebo celá udalosÅ¥ bola zruÅ¡ená."; request_info_no_attendee = "navrhuje stretnutie úÄastníkom. Tento email je notifikácia, nie ste dohodnutý úÄastník."; Appointment = "Schôdzka"; Organizer = "Organizátor"; Time = "ÄŒas"; Attendees = "ÚÄastníci"; request_info = "Vás pozýva na úÄasÅ¥ na stretnutí"; "Add to calendar" = "PridaÅ¥ do kalendára"; "Delete from calendar" = "VymazaÅ¥ z kalendára"; "Update status" = "AktualizovaÅ¥ stav"; Accept = "PrijaÅ¥"; Decline = "ZamietnuÅ¥"; Tentative = "Nerozhodný"; "Delegate ..." = "DelegovaÅ¥ ..."; "Delegated to" = "Delegované na"; "Update status in calendar" = "AktualizovaÅ¥ stav v kalendári"; "delegated from" = "delegované od"; reply_info_no_attendee = "Dostali ste odpoveÄ o dohadovaní stretnutia ale odosielateľ tejto správy nie je úÄastník."; reply_info = "Toto je odpoveÄ na VaÅ¡u pozvánku na udalosÅ¥."; "to" = "pre"; "Untitled" = "Bez mena"; "Size" = "VeľkosÅ¥"; "Digital signature is not valid" = "Digitálny podpis nie je platný"; "Message is signed" = "Správa je podpísaná"; "Subject" = "Predmet"; "From" = "Od"; "Date" = "Dátum"; "To" = "Komu"; "Issuer" = "Vystavovateľ"; SOGo-2.1.1b/UI/MailPartViewers/UIxMailPartViewer.m0000644000000000000000000001760512247657027020301 0ustar rootroot/* Copyright (C) 2007-2013 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG This file is part of SOGo. SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import #import #import #import #import #import #import #import "MailerUI/WOContext+UIxMailer.h" #import "UIxMailRenderingContext.h" #import "UIxMailSizeFormatter.h" #import "SOGoUI/UIxComponent.h" #import "UIxMailPartViewer.h" @implementation UIxMailPartViewer - (void) dealloc { [flatContent release]; [bodyInfo release]; [partPath release]; [super dealloc]; } /* caches */ - (void) resetPathCaches { /* this is called when -setPartPath: is called */ [flatContent release]; flatContent = nil; } - (void) resetBodyInfoCaches { } /* notifications */ - (void) sleep { [self resetPathCaches]; [self resetBodyInfoCaches]; [partPath release]; [bodyInfo release]; partPath = nil; bodyInfo = nil; [super sleep]; } /* accessors */ - (void) setPartPath: (NSArray *) _path { if ([_path isEqual: partPath]) return; ASSIGN(partPath, _path); [self resetPathCaches]; } - (NSArray *) partPath { return partPath; } - (void) setBodyInfo: (id) _info { ASSIGN(bodyInfo, _info); } - (id) bodyInfo { return bodyInfo; } - (NSData *) flatContent { if (flatContent != nil) return [flatContent isNotNull] ? (id)flatContent : nil; flatContent = [[[context mailRenderingContext] flatContentForPartPath: partPath] retain]; return flatContent; } - (NSData *) decodedFlatContent { NSString *enc; enc = [[bodyInfo objectForKey:@"encoding"] lowercaseString]; return [[self flatContent] bodyDataFromEncoding: enc]; } - (SOGoMailBodyPart *) clientPart { id currentObject; NSString *currentPart; NSEnumerator *parts; currentObject = [self clientObject]; parts = [partPath objectEnumerator]; while ((currentPart = [parts nextObject])) currentObject = [currentObject lookupName: currentPart inContext: context acquire: NO]; return currentObject; } - (NSData *) content { return [[self clientObject] fetchBLOB]; } - (NSString *) flatContentAsString { /* Note: we even have the line count in the body-info! */ NSString *charset, *s; NSData *content; content = [self decodedFlatContent]; if (content) { charset = [[bodyInfo objectForKey:@"parameterList"] objectForKey: @"charset"]; s = [content bodyStringFromCharset: charset]; } else { [self errorWithFormat:@"got no text content: %@", [partPath componentsJoinedByString:@"."]]; s = nil; } return s; } /* path extension */ - (NSString *) pathExtensionForType: (NSString *) _mt subtype: (NSString *) _st { // TODO: support /etc/mime.types if (![_mt isNotNull] || ![_st isNotNull]) return nil; if ([_mt length] == 0) return nil; if ([_st length] == 0) return nil; _mt = [_mt lowercaseString]; _st = [_st lowercaseString]; if ([_mt isEqualToString:@"image"]) { if ([_st isEqualToString:@"gif"]) return @"gif"; if ([_st isEqualToString:@"jpeg"]) return @"jpg"; if ([_st isEqualToString:@"png"]) return @"png"; } else if ([_mt isEqualToString:@"text"]) { if ([_st isEqualToString:@"plain"]) return @"txt"; if ([_st isEqualToString:@"xml"]) return @"xml"; if ([_st isEqualToString:@"calendar"]) return @"ics"; if ([_st isEqualToString:@"x-vcard"]) return @"vcf"; } else if ([_mt isEqualToString:@"message"]) { if ([_st isEqualToString:@"rfc822"]) return @"mail"; } else if ([_mt isEqualToString:@"application"]) { if ([_st isEqualToString:@"pdf"]) return @"pdf"; } return nil; } - (NSString *) preferredPathExtension { return [self pathExtensionForType: [bodyInfo valueForKey:@"type"] subtype: [bodyInfo valueForKey:@"subtype"]]; } - (NSString *) filename { return [bodyInfo filename]; } - (NSString *) filenameForDisplay { NSString *s; if ((s = [self filename]) != nil) return s; s = [partPath componentsJoinedByString:@"-"]; return ([s length] > 0) ? (id)[@"untitled-" stringByAppendingString:s] : (id)@"untitled"; } - (NSFormatter *) sizeFormatter { return [UIxMailSizeFormatter sharedMailSizeFormatter]; } /* URL generation */ - (NSString *) pathToAttachmentObject { /* this points to the SoObject representing the part, no modifications */ NSString *url, *n; /* path to mail controller object */ url = [[self clientObject] baseURLInContext:context]; if (![url hasSuffix: @"/"]) url = [url stringByAppendingString: @"/"]; /* if we get a message with an image-* or application-* Content-Type, we must generate a 'fake' part since our decoded mail won't have any. Also see SOGoMailBodyPart: -fetchBLOB and SOGoMailObject: -lookupImap4BodyPartKey: inContext for other workarounds */ if (!partPath || [partPath count] == 0) partPath = [NSArray arrayWithObject: @"0"]; /* mail relative path to body-part eg this was nil for a draft containing an HTML message */ if ([(n = [partPath componentsJoinedByString:@"/"]) isNotNull]) url = [url stringByAppendingString:n]; return url; } - (NSString *) _filenameForAttachment: (SOGoMailBodyPart *) bodyPart { NSMutableString *filename; NSString *extension; filename = [NSMutableString stringWithString: [self filename]]; if (![filename length]) [filename appendFormat: @"%@-%@", [self labelForKey: @"Untitled"], [bodyPart nameInContainer]]; if (![[filename pathExtension] length]) { extension = [self preferredPathExtension]; if (extension) [filename appendFormat: @".%@", extension]; } return [filename stringByEscapingURL]; } - (NSString *) pathToAttachment { NSMutableString *url; NSString *s, *attachment; SOGoMailBodyPart *bodyPart; bodyPart = [self clientPart]; s = [bodyPart baseURLInContext: [self context]]; url = [NSMutableString stringWithString: s]; if (![url hasSuffix: @"/"]) [url appendString: @"/"]; // s = [[self partPath] componentsJoinedByString: @"/"]; if ([bodyPart isKindOfClass: [SOGoMailBodyPart class]]) attachment = [self _filenameForAttachment: bodyPart]; else attachment = @"0"; [url appendString: attachment]; return url; } - (NSString *) mimeImageURL { NSString *mimeImageFile, *mimeImageUrl; mimeImageFile = [NSString stringWithFormat: @"mime-%@-%@.png", [bodyInfo objectForKey: @"type"], [bodyInfo objectForKey: @"subtype"]]; mimeImageUrl = [self urlForResourceFilename: mimeImageFile]; if ([mimeImageUrl length] == 0) { mimeImageFile = [NSString stringWithFormat: @"mime-%@.png", [bodyInfo objectForKey: @"type"]]; mimeImageUrl = [self urlForResourceFilename: mimeImageFile]; } if ([mimeImageUrl length] == 0) { mimeImageUrl = [self urlForResourceFilename: @"mime-unknown.png"]; } return mimeImageUrl; } @end /* UIxMailPartViewer */ SOGo-2.1.1b/UI/MailPartViewers/Ukrainian.lproj/0000755000000000000000000000000012247657027017637 5ustar rootrootSOGo-2.1.1b/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings0000644000000000000000000000445412247657027023502 0ustar rootrootACCEPTED = "прийнÑто"; COMPLETED = "закінчено"; DECLINED = "відхилено"; DELEGATED = "делеговано"; "IN-PROCESS" = "в процеÑÑ–"; "NEEDS-ACTION" = "вимагає дій"; TENTATIVE = "попереднє погодженнÑ"; organized_by_you = "організоване Вами"; you_are_an_attendee = "за Вашої учаÑті"; add_info_text = "запити iMIP 'ADD' ще не підтримуютьÑÑ Ñƒ SOGo."; publish_info_text = "Відправник повідомлÑÑ” про вкладену подію."; cancel_info_text = "Ваше Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð°Ð±Ð¾ вÑÑ– заходи ÑкаÑовано."; request_info_no_attendee = "пропонує учаÑникам зуÑтрітиÑÑŒ. Ви отримали це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñк запрошена оÑоба. Ви ще не долучені до ÑпиÑку підтверджених учаÑників."; Appointment = "ЗуÑтріч"; Organizer = "Організатор"; Time = "ЧаÑ"; Attendees = "Запрошені"; request_info = "запрошує Ð’Ð°Ñ Ð²Ð·Ñти учаÑть в зуÑтрічі."; "Add to calendar" = "Додати до календарÑ"; "Delete from calendar" = "Вилучити з календарÑ"; "Update status" = "Поновити ÑтатуÑ"; Accept = "ПрийнÑти"; Decline = "Відхилити"; Tentative = "попередьно погодитиÑÑŒ"; "Delegate ..." = "Делегуват ..."; "Delegated to" = "Делегувати"; "Update status in calendar" = "Поновити ÑÑ‚Ð°Ñ‚ÑƒÑ Ð² календарі"; "delegated from" = "делеговано від"; reply_info_no_attendee = "Ви отримали відповідь на запланований захід, але відправник Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ñутній Ñеред запрошених."; reply_info = "Це відповідь на Ваше Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð²Ð·Ñти учаÑть у заході."; "to" = "до"; "Untitled" = "Без назви"; "Size" = "Розмір"; "Digital signature is not valid" = "Ðеправильний цифровий підпиÑ"; "Message is signed" = "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñане"; "Subject" = "Тема"; "From" = "Від"; "Date" = "Дата"; "To" = "До"; "Issuer" = "ПідпиÑант"; SOGo-2.1.1b/UI/WebServerResources/0000755000000000000000000000000012247657030015304 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/XMLHttpRequest.js0000644000000000000000000002677012247657030020527 0ustar rootroot// XMLHttpRequest.js Copyright (C) 2008 Sergey Ilinsky (http://www.ilinsky.com) // // This work 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 work 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., // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (function () { // Save reference to earlier defined object implementation (if any) var oXMLHttpRequest = window.XMLHttpRequest; // Define on browser type var bGecko = !!window.controllers, bIE = window.document.all && !window.opera; // Constructor function cXMLHttpRequest() { this._object = oXMLHttpRequest ? new oXMLHttpRequest : new window.ActiveXObject("Microsoft.XMLHTTP"); this._listeners = []; }; // BUGFIX: Firefox with Firebug installed would break pages if not executed if (bGecko && oXMLHttpRequest.wrapped) cXMLHttpRequest.wrapped = oXMLHttpRequest.wrapped; // Constants cXMLHttpRequest.UNSENT = 0; cXMLHttpRequest.OPENED = 1; cXMLHttpRequest.HEADERS_RECEIVED = 2; cXMLHttpRequest.LOADING = 3; cXMLHttpRequest.DONE = 4; // Public Properties cXMLHttpRequest.prototype.readyState = cXMLHttpRequest.UNSENT; cXMLHttpRequest.prototype.responseText = ''; cXMLHttpRequest.prototype.responseXML = null; cXMLHttpRequest.prototype.status = 0; cXMLHttpRequest.prototype.statusText = ''; // Instance-level Events Handlers cXMLHttpRequest.prototype.onreadystatechange = null; // Class-level Events Handlers cXMLHttpRequest.onreadystatechange = null; cXMLHttpRequest.onopen = null; cXMLHttpRequest.onsend = null; cXMLHttpRequest.onabort = null; // Public Methods cXMLHttpRequest.prototype.open = function(sMethod, sUrl, bAsync, sUser, sPassword) { // When bAsync parameter value is ommited, use true as default if (arguments.length < 3) bAsync = true; // Save async parameter for fixing Gecko bug with missing readystatechange in synchronous requests this._async = bAsync; // Set the onreadystatechange handler var oRequest = this, nState = this.readyState, fOnUnload; // BUGFIX: IE - memory leak on page unload (inter-page leak) if (bIE && bAsync) { fOnUnload = function() { if (oRequest._object.readyState != cXMLHttpRequest.DONE) { fCleanTransport(oRequest); // Safe to abort here since onreadystatechange handler removed oRequest.abort(); } }; window.attachEvent("onunload", fOnUnload); } this._object.onreadystatechange = function() { if (bGecko && !bAsync) return; // Synchronize state oRequest.readyState = oRequest._object.readyState; // fSynchronizeValues(oRequest); // BUGFIX: Firefox fires unneccesary DONE when aborting if (oRequest._aborted) { // Reset readyState to UNSENT oRequest.readyState = cXMLHttpRequest.UNSENT; // Return now return; } if (oRequest.readyState == cXMLHttpRequest.DONE) { // fCleanTransport(oRequest); // Uncomment this block if you need a fix for IE cache /* // BUGFIX: IE - cache issue if (!oRequest._object.getResponseHeader("Date")) { // Save object to cache oRequest._cached = oRequest._object; // Instantiate a new transport object cXMLHttpRequest.call(oRequest); // Re-send request oRequest._object.open(sMethod, sUrl, bAsync, sUser, sPassword); oRequest._object.setRequestHeader("If-Modified-Since", oRequest._cached.getResponseHeader("Last-Modified") || new window.Date(0)); // Copy headers set if (oRequest._headers) for (var sHeader in oRequest._headers) if (typeof oRequest._headers[sHeader] == "string") // Some frameworks prototype objects with functions oRequest._object.setRequestHeader(sHeader, oRequest._headers[sHeader]); oRequest._object.onreadystatechange = function() { // Synchronize state oRequest.readyState = oRequest._object.readyState; if (oRequest._aborted) { // oRequest.readyState = cXMLHttpRequest.UNSENT; // Return return; } if (oRequest.readyState == cXMLHttpRequest.DONE) { // Clean Object fCleanTransport(oRequest); // get cached request if (oRequest.status == 304) oRequest._object = oRequest._cached; // delete oRequest._cached; // fSynchronizeValues(oRequest); // fReadyStateChange(oRequest); // BUGFIX: IE - memory leak in interrupted if (bIE && bAsync) window.detachEvent("onunload", fOnUnload); } }; oRequest._object.send(null); // Return now - wait untill re-sent request is finished return; }; */ // BUGFIX: IE - memory leak in interrupted if (bIE && bAsync) window.detachEvent("onunload", fOnUnload); } // BUGFIX: Some browsers (Internet Explorer, Gecko) fire OPEN readystate twice if (nState != oRequest.readyState) fReadyStateChange(oRequest); nState = oRequest.readyState; }; // Add method sniffer if (cXMLHttpRequest.onopen) cXMLHttpRequest.onopen.apply(this, arguments); if (arguments.length > 4) this._object.open(sMethod, sUrl, bAsync, sUser, sPassword); else if (arguments.length > 3) this._object.open(sMethod, sUrl, bAsync, sUser); else this._object.open(sMethod, sUrl, bAsync); // BUGFIX: Gecko - missing readystatechange calls in synchronous requests if (!bAsync && bGecko) { this.readyState = cXMLHttpRequest.OPENED; fReadyStateChange(this); } }; cXMLHttpRequest.prototype.send = function(vData) { // Add method sniffer if (cXMLHttpRequest.onsend) cXMLHttpRequest.onsend.apply(this, arguments); // BUGFIX: Safari - fails sending documents created/modified dynamically, so an explicit serialization required // BUGFIX: IE - rewrites any custom mime-type to "text/xml" in case an XMLNode is sent // BUGFIX: Gecko - fails sending Element (this is up to the implementation either to standard) if (vData && vData.nodeType) { vData = window.XMLSerializer ? new window.XMLSerializer().serializeToString(vData) : vData.xml; if (!this._headers["Content-Type"]) this._object.setRequestHeader("Content-Type", "application/xml"); } this._object.send(vData); // BUGFIX: Gecko - missing readystatechange calls in synchronous requests if (bGecko && !this._async) { this.readyState = cXMLHttpRequest.OPENED; // Synchronize state fSynchronizeValues(this); // Simulate missing states while (this.readyState < cXMLHttpRequest.DONE) { this.readyState++; fReadyStateChange(this); // Check if we are aborted if (this._aborted) return; } } }; cXMLHttpRequest.prototype.abort = function() { // Add method sniffer if (cXMLHttpRequest.onabort) cXMLHttpRequest.onabort.apply(this, arguments); // BUGFIX: Gecko - unneccesary DONE when aborting if (this.readyState > cXMLHttpRequest.UNSENT) this._aborted = true; this._object.abort(); // BUGFIX: IE - memory leak fCleanTransport(this); }; cXMLHttpRequest.prototype.getAllResponseHeaders = function() { return this._object.getAllResponseHeaders(); }; cXMLHttpRequest.prototype.getResponseHeader = function(sName) { return this._object.getResponseHeader(sName); }; cXMLHttpRequest.prototype.setRequestHeader = function(sName, sValue) { // BUGFIX: IE - cache issue if (!this._headers) this._headers = {}; this._headers[sName] = sValue; return this._object.setRequestHeader(sName, sValue); }; // EventTarget interface implementation cXMLHttpRequest.prototype.addEventListener = function(sName, fHandler, bUseCapture) { for (var nIndex = 0, oListener; oListener = this._listeners[nIndex]; nIndex++) if (oListener[0] == sName && oListener[1] == fHandler && oListener[2] == bUseCapture) return; // Add listener this._listeners.push([sName, fHandler, bUseCapture]); }; cXMLHttpRequest.prototype.removeEventListener = function(sName, fHandler, bUseCapture) { for (var nIndex = 0, oListener; oListener = this._listeners[nIndex]; nIndex++) if (oListener[0] == sName && oListener[1] == fHandler && oListener[2] == bUseCapture) break; // Remove listener if (oListener) this._listeners.splice(nIndex, 1); }; cXMLHttpRequest.prototype.dispatchEvent = function(oEvent) { var oEvent = { 'type': oEvent.type, 'target': this, 'currentTarget':this, 'eventPhase': 2, 'bubbles': oEvent.bubbles, 'cancelable': oEvent.cancelable, 'timeStamp': oEvent.timeStamp, 'stopPropagation': function() {}, // There is no flow 'preventDefault': function() {}, // There is no default action 'initEvent': function() {} // Original event object should be inited }; // Execute onreadystatechange if (oEvent.type == "readystatechange" && this.onreadystatechange) (this.onreadystatechange.handleEvent || this.onreadystatechange).apply(this, [oEvent]); // Execute listeners for (var nIndex = 0, oListener; oListener = this._listeners[nIndex]; nIndex++) if (oListener[0] == oEvent.type && !oListener[2]) (oListener[1].handleEvent || oListener[1]).apply(this, [oEvent]); }; // cXMLHttpRequest.prototype.toString = function() { return '[' + "object" + ' ' + "XMLHttpRequest" + ']'; }; cXMLHttpRequest.toString = function() { return '[' + "XMLHttpRequest" + ']'; }; // Helper function function fReadyStateChange(oRequest) { // Sniffing code if (cXMLHttpRequest.onreadystatechange) cXMLHttpRequest.onreadystatechange.apply(oRequest); // Fake event oRequest.dispatchEvent({ 'type': "readystatechange", 'bubbles': false, 'cancelable': false, 'timeStamp': new Date + 0 }); }; function fGetDocument(oRequest) { var oDocument = oRequest.responseXML; // Try parsing responseText if (bIE && oDocument && !oDocument.documentElement && oRequest.getResponseHeader("Content-Type").match(/[^\/]+\/[^\+]+\+xml/)) { oDocument = new window.ActiveXObject("Microsoft.XMLDOM"); oDocument.loadXML(oRequest.responseText); } // Check if there is no error in document if (oDocument) if ((bIE && oDocument.parseError != 0) || !oDocument.documentElement || (oDocument.documentElement && oDocument.documentElement.tagName == "parsererror")) return null; return oDocument; }; function fSynchronizeValues(oRequest) { try { oRequest.responseText = oRequest._object.responseText; } catch (e) {} try { oRequest.responseXML = fGetDocument(oRequest._object); } catch (e) {} try { oRequest.status = oRequest._object.status; } catch (e) {} try { oRequest.statusText = oRequest._object.statusText; } catch (e) {} }; function fCleanTransport(oRequest) { // BUGFIX: IE - memory leak (on-page leak) oRequest._object.onreadystatechange = new window.Function; // Delete private properties delete oRequest._headers; }; // Internet Explorer 5.0 (missing apply) if (!window.Function.prototype.apply) { window.Function.prototype.apply = function(oRequest, oArguments) { if (!oArguments) oArguments = []; oRequest.__func = this; oRequest.__func(oArguments[0], oArguments[1], oArguments[2], oArguments[3], oArguments[4]); delete oRequest.__func; }; }; // Register new object with window window.XMLHttpRequest = cXMLHttpRequest; })(); SOGo-2.1.1b/UI/WebServerResources/tb-mail-delete-flat-24x24.png0000644000000000000000000000313212247657030022303 0ustar rootroot‰PNG  IHDR°çá»gAMA±Ž|ûQ“bKGDÿÿÿÿÿÿ X÷Ü oFFs0\K): pHYs``zxE vpAgp`ì’ÊFÀIDATXÃí—ML[ÇÏ-~O[:íЦ*4P‚$@XÀh£1‘… hâNX.$~$ÆÄF‰FÆ…†ø‘BT@QtQ!­Ð¦„¶‚”h;Ó¯™vÞâ¾nx"à×¼³™dÚ{ïÿwï9ÿs ‚ ügCô»ü°ÑkµZ­L6<¬R©Tfó¯4:ªÑh4eeN§Ùl6?y22¢V«Õ““[xþ\¥R©ŽÂB­V«]\´ZKKKKÉI‹Åb™šÂ<¸S‚ûûBˆ >|(***:{V§£(ŠšœL$’ÉdR&ãùd2™liÙh>NÓ4]VVP@Ó4}ïð,ËVU…Ãáp8ÜÓÓÜ‹Åb½½‚ð}›ùÀð0I’äÚšXL¡ÑX,‹ÅPXXQQQ R©T Ã0Óét~þì÷ÀáÃv;Ã0Ìû÷-85eµZ­mmM~~~þ­[ kk««««­­v;˲ìààV7â5 ‚páÏsÇe2333333oÞ ¬­y½^/€Á`0”—Ûívûž=••••••cc/_’$I>œ›íÜ9„‰>}ª®®®¾t‰¦F£ñîÝùùùùùùL& ‡Ãa‡c»Â7<\ŒŽ* …՚͊D"Ñ©S‚€Bíí!„XLÓUU r¹\°²âñx<™ŒËår¹\ÝÝåå6›ÍÖØ(•J¥RiKËÇn·ÛÍ0©Ã0ŒÃÑØ˜H$ïÞmWø¦ëchˆ$I²¢‚ A®\‰D¢æf‚ ‚¨©©©©© I“ÉdH¥Âáp€ã8Žã&&&&&&x>•bY–miijŠÇãñ§OTøwRèÛ±,‹MMábµÛ!›ÍfÛÚÒét:…œN§ÓéH&C¡P@"‘H$–eY–H§S©Tª¿§„o`}473 à d³©T*UWWQa³Ùlñ8N€¹¹¹¹¹9F£ÑhŠ‹KJJJ::p_Ù·ï· ¿£®®¡¡¡áâE£Ñd2™Šéééééi€ÙÙÙÙÙYl·:N§Ó‘¤Éd6›Í#„Iþ6¿¿¶¶¶öôi¼Ã­­@ `[̹÷ËËËËËË<Ÿ2 ƒaï^‚0›Íæ¾¾_àv[­V«Ã¡Óéõzý™3 ƒûAÎnÀ¨³3W+¡P( qÜâââââ"M CGÇ«WEQ‡ýt€·o¥R©T¯§iš¦é;w²Ùl6›ÍËóù|>Ÿ€çyžçY÷‘“'sã°¿?|ˆÁ::–—ƒÁ`0“ÁÅV«Õjµ}}##b±XŒ[äO ¨ââââë×±»Á`0 D"‘H$€ ÂÕ«Ø¥¾|Y?¾©)‹ÅîßÇýäĉ¥¥¥¥¥%A ±X,ÞµK&£(ŠêéÙq€±1Š¢(‡C¥"I’lmŶ Ëy¼ã‘H:-‰D—/o6_ss4^»†SëömœZ2™\.—wwÊd2YaáŽà"=§B¹s àæÍ¢Ñhtuu«  Ã0]]x— ÷ ™L­V«ÕꭟĦÇó°Ë)‰„T*•ÎÌà“ÈËÃÅo2mø]{ý§<_¼P*•ÊcÇð—¡Çƒ%#´Ñÿ·|jüñÈc8MP[IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-postscript.png0000644000000000000000000000661212247657030023457 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW IDATxÚí[[lÕþffgwfgw½ë¬½¾$vlïúVS‡šbJ!Um$„"ZZ*PQ•‡>TŠÊ‘¨*PHÕR*U•ZÑ„*„Z!n¥RcBESJ$•Hlol'!ÄëkÖ»™½ÍL§sÙ3{±× ü’å9÷s¾ÿü—󟳜a†aà ºNÄ_ï |Þé \gòÔÛ@UUUå ã?['^~ûu õÜ¢”òÆšQ2RöºDµ±\%µ×Èv¾”÷¬¯ÿ<ÜIÛŒ­ßÞÖ lOm÷ô >É'ù$Ž»`³ˆ«×¼õÖ¿Ä£9úc 8"1´"öi{Ž»~ qR>_(äó†Q,‹ù<°¼¼²²¼ ̭Οõ©ñ…¿,ÛƆx`äûÃ÷ÝðÀó<Ïó×nu3àϡކqß•{ ß[ [\tÝ0tpög¦ÉóÏܯ4]¹ž³Ü^¯<Ÿäò¼ ð< (² ²,˲ ,----,““ÿ8³èãà¡{žýúCw~uY—õÍgDÝ6@ûCéOŧÉnç8Ž«Úßt-m—»þ¼Ñüæêßï¤é“äæ1b (‡ØM…8YâÆ k»j,¨¼5ßšG¿EQ= ›UÕL†HÆÊ (J(´_h»Ø1ôë»Üû[à»ß¼uü÷À‚±8›J5žu{AN ¬ðZ~å•—^zí5 P(òy7Ð+³‘…E£--[¶cc·Þº{7`„Ç#Š€ ð¼Ç|òÉÂÂåË@GG{{g'P(£‰D"‘Ð÷ÓÄ/û¾ýï›Óã!à›_þFÏÞeÈð¾¹yã6¢n°ö?Í£;™ã€{îÙ·ïî»ÝÛ²l†µžÓH;ó­ã±Œ¶3ŸÎKˆQ‡ç‰[](º®ëºøý²¬(Ô‹¨$•Ý»J0~öè«Gú€}í÷Üyï´axÞ€7°~F¬K±õ|9`ì´ÙžãØ6£ëÍ¥–×´«'û—iš©M‡H„ P÷ðù|>IdÙç“e@8ŽçØLì\lŸ kM¯ÿ~êÕcÇÖ »I PAv@ qc ÂZ˜QAÖ´•!Ö9rœ 8Ïsœ Ç¿ûî;ï•Y(‚ Š¢(Šß¯(@0 @oOߎÞpräƒÅS_>š¸Øz!i]_Ýæíîª_Ö¡‚XÐ’åZ½šéé©©éi² b±Ö¾ÙÆ›UnÅŠòrë·¦iš®¥R©T*‘t©DÒšfª¤@ ôûÉyB€x<ïëzçûŒž'—O=üþc@¶=Ûý\½h6Ä”/•ã€ÁÁþþr@;Òý»Ü›²3ÀÌ­f[XL¢çƒ|>—Ëç\.—Ëå€\.Ÿ'ÿiš”S÷õôéÓ§ÏœFGGGGGs§æzÎí.pùƒù†Ñ¾³}gÇMµKBü º#é×ÔÔÔT2 ‹¦°`Xç¤Ý%ÀÎÄÚ•’•D‘¨˜ÞÞ¾¾žÀç“$IB!r°,‰dP QUU½zX[[[[[R©T hßßñ³ŽÛ€™ùÙ_Ì@;Úwvhµ£¹.ä–CŒ*IQ `1ŒêáJ^Û·a˜¬²3£±÷^¯×ëõšã‡B¡P(Äb±X,f©xAÿsÀį&&&Æü®¾qÖ¥‚X %áÜ™™drf(‹E« (—‚jû¸ò\ܨ©©©©© hoïèhk«¿ïJDæNG"ÍÍ@º”iIÿúÓ wÖÞWC¼ ë´(0ñx"Ñ×ç^¯\ḛ_*-•otØÌ=be/‘$I’e@¿QûŠ6\ÿ8 PAöà ~¶»¿n=Ùc6•ú7ûd"®•³„ã¯W½^Žsº µRCTP%Ý›´ŸTYÒƒRy ›X1 úÁ-Ÿy¹·V¹ßõÁßä¶€ƒ|ôQÓcõBlÆæ\ãx<$úyøðáÃO>iÕ³g“ÉÙYb› ;Äî«1Û;Ukí¸¸Ì³ÞåÃ8UùEÃPU@}>V?Ô_^^YI§I¬X:;ÛÛ[[Ëëë:™çkgX¡†®[ƒþþþþx¼–un—ÚhÃ*ˆ.̃‰Fý~­‚?¬ëE¯H§×Ö4 H§ççíÛ·nmi1CËË««™ ÐÜåýe2Ùl.GÂÊ’dJeÇ‘˜N2™Lž=k?ŸT[#`J@"ÁfàuSANB¿[ZE×ké/ôzI ¯× ;öþû³³ä*QžžÖV ©‰ô›Í’(æùóóó++$¼Ìq€$ñ¼,mmÑh0HhçÀÀÀ9ŸTZ!û»\6ÎaÜtø–-•%ÀIW®d2ù<à÷{½‚D"ŠÂqÀm·íØÑÖF¼ A u5 àyM+lvm-î¸c×®®.Åôx¬õL à8 ™œžN&«Ç¨œ;šJ@"Ñ(ø¤‚LV˜ùÑh­@H× …R ˜½tiy¼^¢¢D±X$;ßÙ¿× œ8ñᇥK’¦Á ßÏ[‚ìôƒ)ƒƒõ¯³º±¾FÀ–r?½¥EQX  “}ªiÄÄbMM^/0<ÜÙ‡=ÿü™3@&³¶¦(@<ÞÚ›ý?>5µ´Üÿí·wt--á0Þ:.UM”ÓÓ$FU(P/ÈÖõR ¨¤Â>*ˆ2"õû­ ŠŠBn¢$ <Iòùˆ—¢ë€¦åóÅ" i¹œaO<ñàƒñ8pàÀ3Ïœ> Œõ÷ŒGž<¹°ìÚ‡Ã@gg4*Šd –Ä9UÐààÐP% p»Ë®—MdÛ ²çAt°,“'¢B|¾þþ±1Àãin6ë—J©Ô©S@>?3sâ‰v‡=ð@O°wïcML/¼ðÈ###À 7twSà+ÙàϬ¦¦Ì{ »TŽªŠ"‘€ÁA¢Â*]Ín*X2ÀbD0(I¤q9®³³·ถ–›o&pøý–‰xZ[o¹UM¥Ã˜ŸŸ›vïN$ü~ “QUMvíêí•eÀçÅZœÉàiˆdhhhhpÐøê·p}Ñä<„‘…ê:]8ÙŸ‚ÀóäH–Ï_¹B–q劵QEºÎq$ ¬ëVàTµPÐ4àÒ¥¥¥Bèînm%ÊŒMÖˆ5´199995U.²ì÷Ë2H$,/‡êåâgSÀÈi ž~z|Ü0€ÙÙTJUIÞ{ïÙÿ×CwÝ5664:tä@ÜÒJndgg$"À{ösOæ7<<<<4äomÀ׃K5Z‡ rÚ§&éýûüÅižÝIu¦Í<û'lÖÏ=ßNõÇ›( åççÅÐF¨áhö¬èZ¯—ö~ja ëŽÙ™c½hµ^‰:×ñPAöôô49q‹¦®­¼ÃË{¬\îxµ¹9¡®\f? Vëå5Ú° r#ê®YApfu;Ü=íÞ=mm]ÎÖkÖË»j¯26J TAv¢þ¶)ì[9m|ç×*nëaã¼^òŠ‚J«Ÿëª‚œTØëTÖý¬t-;¾úºÊt±%dc¸l˜ö)¹ÓÔÔä$‘3æ²àó9u/-uOÄzüÅzà΄JÀ¯÷ö—M53€Ÿ¯.'®@9I:Òét:øïòû¸ÒÍÈv¹\"LÀLÝm=Иiëgç³g\­¼Vb?½tn û: ƒÿÿÿ ›Íf³«æU*yin¿¾te}L/ϳÙl6›‚ niJç~sž›ÛôlÙÞÜÛB¾v¯t®7Qàg¹sÜ,D>ŒŒ<dcÙG²÷Š¢(ŠbâHâ$WЂ@žeÓ÷öXÞØsôÒ‘×ìMÙç³ozLïÔ#l͹¾g‡×¶]½Ä­r‹ÜU ôãPWHF.~éáÑ ôœÌß°ÿ?Õ&Lm€ªªªª~úKyÕ”U¤ªêóB’D^SÓr f>ý=²Ïçóù||½Zw õ‚(àôÙ¶ÓX}^ˆ*\ºÃéC0ÊZ½ º)ÿ5–þ°zD{màIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-video.png0000644000000000000000000001626012247657030020052 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW;IDATxÚí[ixTåÙ¾gß“™Éd²¯dƒ•@ÙwA–JAmÕÚª­´VDÛÒ*µV+E+|î¨ÐŠ¢(Ù"°&ÙÉFB23™ì™%“Ù·óýx}=‹ U¿~×åóç½ÞÉ™3ç<÷óÜÏö†Ã0 Ã0ø/^§×éu2ŒP*” ¥Îÿõó|]áÿ_?«ÕjµZÆh6š»j€¡“hp°Œ±F[f‘¹Ö|püÜù€ÃøÏjý{ï=ž§½ÓGßa„;Džø“y¹ü•€l»ô5™PyÔ¹êY€ºCÕ­> „ÉÕ^ ˆUǪãò¥R©T*¿?9ß·ª Õús Ó¸«I©Ð¥ê÷uÞßÖ 2kÇêÆeÊݪWÃò;d¿”¯S„“„¹¯˜[Â-8&މkF?0È0Á Ì fs€`{ðR°`Am0p†:ýN5`‹ ŒË?-ÌÇŽ-¯·ÿ æ9Á @Â`üý‰€Ì[3#Æâ§ÅMM˜ñíó@0L SÛY]TY«+/¾ Äl)޽˜ðpþw¡ù!KCóN%§’S ¸Ýn·Ë˜L&“ɘLf³É  °{—Ëét:Çëõx®z!‡Ãáyyyy&jµJp8Ã~ à÷Ók‰D,–H‘H$‰ÿ‡Ýþ"`8i8Ô\®n;Új†‡÷Xfù¯å t@'7)À<Ü80ß:íeíem- srÊiÛñý@®"{jþv saæ=™g7g7wà÷ûý>àóùý~?PRRRR\ ètz½N„ì Yj&¿<É:y&“kbE®"7d õI}RU‡£ÓémÕ sèÐáw–3gΘ1kÌ fs“ÿ8µõø@^!Û)Ÿ ¸¶¹_t¯|ïúª½ii©©@||\\\ —+ €õxó( SuFw,:ßԯ갳¬3çd)acÆ¥ÞüÍøÖ(û[ùæ3Ï0LOgï!c<°Ä{sòÒr/á%üpËÜ2·ÐWë«uˆˆˆˆˆ@( E" ƒA «Ëh4€††úúº: óXçóº(`P;0oè§@Ã3 Ï\êÚÛÛ‘ܑܑ\À%t ]B`çÎ;wìòòòóóòXŠ:tèСÇA‹`6?X¿ó‘I®¸\.—Ëåp†‚&ÿPaš_kÞÙ´ hx½á§uf@ðð_Â`üøÌ̬,@­V«Õj€/çÉøÑ@…¯ÂW$E&k“†›ÄS¥Ó„_ˆÿ€“u§ºÀ0Áð`?ók`rjáô)vÀepw¹ €^o0èõÀÙ góÎL¤^Iµt7`yÀú‚¥ HÿQÚšŒ@ZZZZz: •J$R)¡ hhhhhhŽ----ÚÚ::t:€Ëåpx<–²òòrr²³»îZ»vÍÀçóù|>Àb1›­VàñÇ7nܸ éãô»Ïžíî]À3—ÿ:ü×aàÇSW¥ýx*`kµÉm­€©Íd >]z$õp xAð¢p ™9vì¸q€T*“Éå@ÜŸbÿ· ¨;]·»&PîS5ª3–OŸ;ëþ¯â†èëëïïëc˜òmå¿9í½½ðä’›k•µÊZE8|høôÓ’’ÇÛ­^qûl !;>%q2‡csÙ\Æ9W®þÜûÀÃC¿xX Lûdú¡éwÞ¹víw±±1111ÄC ††€––Ë—ÛÚ€`xNNNVVf&Àãñx<ûœûöíßœ— (ryH ‘H$b1{¿@€èƒaàô}<¯×ëü~âY<Ÿ/N§Ã12hµZmDáÖº"•ÀeOÛ‚V+°té-X>ëúÜp`4v »rñ.ÑÑ.`°i i àó€ÍR.{/¿ÒªŠ?åÏf˜–Üæg›/¾·ý%¾Í@™¡ÌPþ6°øe-_(•*•R h4*•JÄÆÆÅÅÆ²¿ë÷“ M-ÿßA¿3Œ×K¤ÑJ4¶¶¶¶ŽÀbl6›md8y²´ôèQ ?„Ü\3qæq{㞊kbF/þ€YÌ}$–EEÝÝÝÝÝÝ@êú”GÒÖ]Ïo3tþñez¼a¸wâ1ÎF·œ-€×ëóy½„{½^ ++33;2Ešz€BÁ$Uá_€9•³ sd€H$š,¿/ùÝÑ%äžÄòˆR·Z‰‚‡†IZ©TËôùX põþê•Þw÷î>øè# ³S¯×ëYÊR« àuuµµuu@FÆøñÙÙ@¤2âHø€Ñ1 òÊY€ŒŸd$f8€ˆ­ ¿¼ßÏ÷_«l¹¾o˜‚nþdˆa 3&mš<°ÕÛêmg³Ùb1›ñyf,‰Å"qU·°Zm¶áaÀb±Z­VàĉcÇŽ”JF£êë/]jjzzº»{zX˦ϹjÕÊ•·Þ ,Z4þœ9¯—p³@´µ]¹ÒÙɘœœ˜˜p¹<— |>ôôôõ GŽ””;tvêtz=püø‘#ÅÅ@nîĉ“'“4T.4š°0µˆZ93|°(j~ü¼(b V+˜Ÿ˜D‰>Ý´pZ9-K€¥X²yYâw@A“´]¨NÜ{úÅãÏ‹#FÜ Øív»ÝN‚”Ý0 )Œž~ëÖ­[Y …Da••gÏ–•K–,_¾|9 ú| ‹Åb1˽$]¦M›2eòdr§‹IUTtàÀ¡CÀ©SeegÏb1 Ž.yŽÙ³§OŸ6 ˜1ƒ¬jµJ Ü~ûêÕ+W²@FF†…)•€ø¢ôôp1X›ÚËx+e+TËB—Ëív»iëÈÌÌÌ?(^Zœh'° quÑ]_­Çÿ8 }¾áOüýV†Iצ=ñ07dŽj®”-¨Ù´±¡áÒ¥úzÀ8¦»¥;xfáÓ[ŸYÈÀår8Á ˆÏ'øýÀܹsæÌ›äççåeg³ ðù|¾@ظñÉ'ŸzŠJ"‘J¥Râ|> ž^/À0$6L˜Ìš5cÆôé$(K¥·›Y¡ ÞQQ¤n T˜œœ””œL*îü|àSÕ§ŠÃ@ç˺ùÀ/×>°oÝaä%¶ÞøÖ<@_¯¯××3ŒYeÖXô@wdOLO8°gçÞw>x¸õÖåËW®¢££¢bb€öö+WÚÚˆóò€œ@nn.ôÜmîþ)`µŽŒØí@X±@ŸX>À0v;PX8iRA`6“V„JE8{÷î÷ßß½P(Äb>Ÿ6õ€ÁÁÞ^£ñ3+ã@är $„ÄòòŠŠsç€òò³gÏn¾yá €yófÏž1ƒkŽ|7d)ì–[/¾åö¾ï½÷î»ï¼´Ä·Å´kL` ƒí€Î®³ëì@\ . @0 ¡Jˆoì„[æÀÖƒÞÿOÀ¶Ø~qd*`?îXá< ôõõõõö²ŸßOšl"q}ï‹ÀPCCCBBCI:ÉRÁÐÕe05555UU$v]¹’ 1݉@ÃKo¶¼Å& "i©$>ŸLx67?Ǭ~yÕm«_þ"R)¡È¯ µ| @UUõ•ª* þÙ†žúg¤‡’‘¼hjjnnld]”Š×Ë4áz‡¬I86%%%%=ˆŒŒŒŒŒ”ÊÐP¥’(<$„ Î×*ò‹Üêõz½^/ÃP¡- ›Íf³ÙHf±°žh0 Iw€@ÀïHVg±JÅÆ™L*•Éà4]¶Ù€®Â®¼ž óEÃÆ®ÇÅ,ܶ0øÅ”ŸåÝû2©°e²€¾µèψgÄlÉzáàßW7«­_ܘž°¼fzèïèï'®éñ©d©en=PÿÓlŠzB @€¡½¢ÐÐÐÐÀãq»½^Àét»N‹ü~ <\« š›››[Z€¬¬ñãÇ:::;;;ÜÜÜÜœ`hˆ´J¨¥Ÿ{´jnÝB ëÏ™‡ÆËü±Ä€´uY k[Y[Y[ðÞïÞ_óîsÀjË*ëm€}§ó´}'`4vwwu±”tüøÉ“g΂ãü*þ»@ÖòqÛ2hRÔUŠÍ›+6¥ºR]©à¹ø#<¸6éž„;H c=D,&TC[^/ápÚ«¡@ÛÒr¹L¦PH$¬G&&&&&&²Ôd6›ÍfóÕIbÍûµÚðp­–dc. xWWW—Ñ„‡“º†ê¶ù½–¿Öm~¨ò—ÀŒ[§M6õ‚°Ûív»Ý,Ô#j u{j @ÑŽOJ÷–>uËSËÿh##òÃ@_QÿÞ},Çwt§¡áÒ¥æf çO½ ¦QÕÚ$m x]¾A¶¨åÖ ÕݨDÊdEpùrKKk+±\‹…UXx¸VN™hµ¤F¥–Mä÷“a·;v;¤ív’…©T„j¨ê¢£££££¹\.—ÉXÀ"#I0§ß§I‚B!—+$† ³€%%%%¥¤ç«+‹k€Ûß,zcõ7Â× Æví(ïtu”û2?~{ï_Ù2é«Ò(`Nï쮹Í@¨S%Õ–c–ã–£€ÅB*g“‰(´§‡äÝýýýýƒƒ€PH,<%%991‘µèŽŽÎN½(---=yî𯬂yÙù§‚×Äë¤ËŸ? H$¤`S( ™Œ(J&#AX¡BBBBär–¢èûQ*¡õŒFC—‹Œ" å8‡ËŒŒØí6áv†ø|8+œN—Ëᆇ  ™Lxâ‘T¡UÊs!gå­!««ØŠ™R ¾år£Ñhìîfƒ5fk³gÏš5o°nÝ#lØð-0Zˆe²€PÞ ƒÞ \Wí»X´?Ö¾µ½ðÚ}c½—Ô¦>–2D–F4F~„”+ß }o½¡¸ «Eéb5À½—÷3î½ó4ó"óôU]Ð ²ÀÀ»Ús›w5àcüV¿p=ä^âºùÈVd+쿱ß?²0¯·¬µ¬:ÏvÈ;.Þ'ýQþeÇ{GxàÞâÞî]ôÖ÷=Ø»àiøj~ ]¡¢Y¨ã•w+W‘µÒü´&BBØôY,&uLh¨R©V¯¾º}ûŽß£…m É¢®¿Z,V½Å´[Û‚m\ O×Ó÷`zÓüª)°$[þiÎ-Ž c?àëðûªïßÞ<¶G›pÂÁ{€ÿ¨à>þÓ€,MÙÀ2M9¨š¨yª4õL@ËhWEÌ’lI!I6@© *•ìý(ÇÓX3Ø:4bj®Ttìéð-Vq«¨ÕÔ¯¯ºç÷úzc€Ä;ãî‰yˆsô@EÅ… UUijŽï€¯òê”Ó©âè~töòùpýª~ ÀÞ—ME¹œ®ThÚJóùÑ3Ý€îéýÉçìÉs1̉öSO]¶þë¥ÖW^úö¿Þ׌“˜46¶¶¶·³|ï³èƒÓ-ôE®]©áŒ^GËh FWÄŒŸñ3~ÀËõr}N€çáyx¡€ËⲸ‚€Élæ[€öÁózÀä73f0Xº¢Œ© SýaõÚê+@KCÛm@.ž".¤[%ýâÛ¤ö¸¸˜wïßµâ¾$ íníéêéb˜Òǯœ¨NÅŸÙæ@·K÷3ýÀ¶ÙYìh¼¿ràÙÿ}Ãøí w÷5îK€¸Q\$ú2“™)€È$:/*Dkø÷ñï¤Se“d€,D2M2МÐÔ©ÛñÑJÑ vÚßßßßÛ ’ÂÎã!½§èh ±ñò厎CAfN§c˜§KŸ}ó¹^ íÉ+¿nD <]“hfªïP¯$é)dHzHÓDïÚÊ”Ç#ƒvO]ýÚ=—ËãO =já,5‘–@ @Tù|$§•,=hEó{–®½ž~Î õz`‹\Çájòù¼^Ÿìö襤8Úd®¬¼p¡²’¼— X­Ëð0Û$¤Çpš›ÛÛu:Þ¦M›6mÚÌš<þÂ…›6%¿”ôAìS@ÒÝqœ˜ Še R+WÚÛÛÚÈÌ—ÇNœ8qâÔ)òb1päHqqI ªP‡!§¨>|èPq1 “‘>~IÉ‘#G²/|âDié‰l—³¬ìÌ™²2²€òrvp#.œ?_YIö"P]]UU]MŽŸH¥€^¯Ó lšI+nzj‚Ã!Py½8¹\.—ËÈȨ¨ˆ£<Àl&iðƒþâ?ÿùŸÿü¹ääLœXXÈ0wܱzõòå¤wsø0« —Ëét¹Ø “†¶«›c|>´®^¯r£Wú=b“_ ÂW[09I7ÚÒ¿Ùç_IIŸg6f §ŶDȵÀ•+¤'$•@iŒêwp°¿ßdzCM­æZàÜÎÓM§:¿$SÅÓJ*^"!£¾‘RzS‹¦Í1>ÿZ †‡Éu*ݦ$ú=›mdÄfcÛÃ,±ÇL ¯¯··¿Ÿ}>JM~¿ßO‡ðÛÝŒgϽž´DH ãzBgÔ*9G[”‚¸\â”zrbÕá ¤ÝNF£Ò·¤Sdš«¿ÞRÑàAgŸR)„ =¨DÓ44­¸\ú Ô²XÎ'*áJ:iºúº«?gWÊÆD(WSéuôóo[FwWéé‹ÑžBÏ!Ñc.8¯—ŒNs_ÉžžÃÞ÷¿æÿþÛe´âé>$+½½====ÄSûúØàÍwˆŽI>nY³¸bq{ßøLFxô`M/©ÂiïˆÆD¡P ‰ØŠÞf#ƒÚ ¾(z^ü" -Žx+r90'eÖ/gže+‚ÿ:’#£k€í€_+ô:½žË ¸\ àré7¶gDÒïÑ•ŠÍfµ>_ à󑬄VÒ>{]o/™QÓJ›a®=ÀE¥³³££³“].—Ëåv“™´PÈûé&†$ tŸ”Dæ4™ÈÈ;6=ý½œœÜÜìlÖ_ÓÒ22ÒÒØ¡~L Éžl6»Ýéäw+g©ozÔ¯5ËÆS-ÛÚ·—ršÿÔú$0qÆÄ•…vþqû¹7N¯>ñ?—·îáp´±áòpù×8=º8þüù Øü—ŽÚÆŽ;vìX6-¤'€æÄWyá\MI$7¡ÿˆAÎ̱¤åv“†*žV¢¾UÞe¾å€ÿOøŸ˜bæ¼x—ùæú ä †I‚ö´Þÿ«þ×&$0Î?ð?xŽù-à‘û"}IsWàaÿïo¸oŠ6 É“8Ä€ìqY²<(’²@57T¢ú wwÜ¢ØI@ª;eiŠHR'º4@ÚŒÔ%©K€¯RðWÉucí.ÒÿŠ‹KHˆú·˜~fÚ¸âžïMê64–µÕ‚ülÞ8@Ð!úX´f‹¹# N[E>@¸Np(Ë啲&@rBò7ñÇ€8^²L2ˆJW _H‡¥?’I­$Jú.¢P\RôÂWD?íÄÄáb Ø(?)»ÍB…ÈH"%¡âD@þÙlr…Ñ@-}Jò ÓH¹R. lùEd!ÒJéù/Q\€oT­__¾ÄHoúÌæ’‚m‚,!Xû¯Û]k4@aÈÄEwɱIã’Æ®€+àþÿùÿÜÿ¡dgLšÄ0?Çý¸ 3%}ÆÀLÃìiÜ{`ß_†X®×þa½±õ ÔÚvåQíÀNó›Ž7{´q©·¤üáËþ®ä ¼i}õþW^R'¥$ŽÑü øï\¨+ìÚ³ûÈû¯ÿ@1ß÷úy¦£ÀëcÿA¾ùÞ‡ò?ȵò4no"ÿ A(Ú„åê«IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/month-view.png0000644000000000000000000000243612247657030020114 0ustar rootroot‰PNG  IHDR°çá»gAMA±Ž|ûQ“bKGDÿÿÿÿÿÿ X÷Ü oFFsEW8Ô pHYs``zxE vpAgp`ì’ÊF„IDATXÃÍW]H“m¾Þíko")®a4·,ˆˆ<°×-­вõgt Ñ™ †'­@BJ<˜'B’؉3¡aô3O*FÔþ(dý¬±·÷éàáéýwÓø¾û`÷½û¾žëzîçgã!„µ“'ÛÚÚÛ»»¿}K$æçw²Zm¶ÉÉÁÁ¾>¯·»»8Â_ÂeŠ»víßøp8œJe2Ù,!Ì/µþoáþļzuçΩSƽ8qbóf“Iò+*,Žs8ŠÕ³åâº\/ú|÷GS´aÃÞ½j V¯þõ+“‘|³™çy¨­Ý³ÇãY.}`åʯ_þ,wnnbblLòÿE*  …Þ¿×+ŒÇS)ÀnߺõèQ`vvv62Î/ÕB¡h4™6nt»â¸Œ§F@¡P(|øðöí»wÚÂpøûwB€úzAp»–—Ëé4Î/բѥáVW—•­X¡ÛQEÀfãy³Y[X^^U•Ï—/ïÞm·N§ÍV^”•Y,zù¥ÚRqO°/¶o?wN[h±Ð±¶V/–O~y¸/^ô÷t€`Ç·Ûå’Œ^‰±±`0ýwäK±C‡jj$zúùó{÷t°VfÍÍ‚°v­ä?z Æã€Ç#v»„7>>3‹lÛf·g2øý¯_ËóY…ß?3K·£š§®=‚ê‚b611=m6ÎÍIñ¦¦5kV­š›ëëÙC¤\ ýùE‘ãÔ| n!JTMxhhr21&<4ôô©ü{A¨«£#ÀóÊÜ\ÎÏ(¾„ ¢Hë­Dkkc#m1µK—úúæç©©/_’IíJ÷ö¶µÙlRüþýgÏb1-N±¸(Òë]ÍÓ°F†Ž“7Sêêr9 ··©iýz€Àd†‡§¦ôw0øæÅܾ|ü¨ÜÚÚØ¨?o‰ÈçóyvˆåWX:ÍŠ"08„ÃÚ |¾@@°Ï÷ä‰|KlÙ²iåd2Ú|‰°Òg vpAg00ÎîŒW ð¾ úñ”H|¨*T!RU$â$¨„¬Ò ‘Ti»éÞÅæÎ/ìÛì=wù0vwvfo÷¼Ž#¥ét;³3³3¿ßü3³+Y–eYÞ•]y·;ð Ë»ì²ÄÃV0 Ã0dËú{qþ•×Oµ—VÒµ8`mY]«æ.KLßÀù™½(ë¥jÉë©)`Ï {ÔÜ&P²ŠŸ+€µñ釀T:•N¥%é^€Í)¬xíµ¿&Î6-ëá'wޤ<Æ¿[_’vo ¬´Zív«eYN§ÓjkkëëkkÀÂÆÂÛ7S@m®þ»úià¡ñÃyXŽ|ù‘gÞÿ@–eY–ïÝ8BðÛ‘ß'~³Ï²žùïÉöëd`++€iZ–il{všüÛ?{¾Ò´9ö¾»œ7ŸäÊr,&Ë€¢d2ÃÃ@&“Éd2Àêêêj½¼9ÿ柯®ædÀ±Ÿxöø@ÆÌ˜sç‰íz¿ìþºó2Û%I’úOÓì•xpô¿„û®$ysì;@¯×ëõzÀúúÆÆÊ pûöÒR¥ŒŽŽŽîÛ<ú‰ÇN”¯*ùÌð‡Ü)ý•O«wVï¬lì||š{Æõš_Þ]Ó]Ão¾±÷œÀ³„¸ÿ !±X<†Ñl išvë0<¬(ÃÃÀ¡™™Ù÷îÔÕõÀ™Ñsz ¨§ëéÿ¼µsD @€b‘ a)‘á¬×‚~À;óyô:‘H$âq@× £Ñ š±¾d³Š22LÜ×&€©óÓKS?Î|æÜGç~Ô­•›µZôD„Ž‚X œð:^^^ZZ^z=Óìvݵœ6š—v>ÅÙ¦Sch¾$y}\–eH$âñXÌÖª¦Ùë™&°¼\«--““…Ðn§Ëår¹0ý­C?˜þÀ» I@±X, ^€¼°‹®ý5Àn§ßúƒ]Q [­f³ÕšÍf³ÙšÍV‹ü“´$5›²lkÌ•+W®\½ ÌÎÎÎÎ΋—.>,]Zºtû–5qtâèäãÁ5!²(ˆÎHz¥i•Jµjkkûù$úçSÓâ&‘=yïð…:_ê”c±X,Òét:“††ˆ ’åXL’€­­­­­- ^¯Õj5`â¹ÉïM~¸qûæ÷oÄ€ LìGs $Ê!N•¤¨ð£±¼ŸS]³ˆ4!*aÛÌçóyWtwË| Àüççççü<\û™ Þ@‰=µÁ­T4ÍéØñ´@tÍ3[ýnÛY–$²ŽH¥’I`lllllŒhŠ,ÛÏß³'—6»ý›?¾[ùø mH-Ë©ür^Ħîò%êm3ñ³Üã ¦Ê|¬÷¡Þ#០rß±,bM«U·Õ âÂìE%6Ìd<¥R©T*Ùiúìd2‘H&íõxØçDb‚x-ˆøÍt:Àí€ËÛ ;&¿Ñ…t0ø#0A¢T*Õjµ ˜&»vCd_Ge°VúÁF¦ˆªª*«ápáK&ˆtˆµT*‹E>À¼-'®­„sÐ`Û&ˆ‚ÏÂV©Ø> çŠ‹ý.íÜÐ^¨ªªªªXvͱ¢×Ôi‰ãD´ß/¾9Ûžø0Å%¨lÛ‰fDµJwCÉž‹$1ÜþG’ÞÜ(µÁ>o°}ÑþsvÕÑ+gÇœàŒüÅ{SÁçþÎàÎñ+4@HÚØ>€®„YàX¿ûü;µ êœuÂHä&ˆ‚Q*‹DúŸåò}AзŒø>hPe‡Å%¨D±T«šV­@Ö|Àýf¯è¸Wnû«ÞÞªMo¹\.;5Àïh6ŒDb‚x ‹ªJ×nÀE3Û»žpì¿b|=ÝßÒ¶6&˜ >ÀšFwCÉÁG¿×F¼m‰\tÐ]Øqñóm PÕrÙÎám§ß3À{;³éÒ‡…uÞî<',À|"¢&À{2—~2€ b} «4 b6ñ3@íu@¹\.ÛOs mG"ÜŽö®ˆàäYLP0"‚®7Ü ó€çßgϤݭÞ&ÈÖ4ï:€?óý§½€‡ syóòi]§У×]ñEUÝ{AìLw¦£^æò}ïmþûENˆÅGªƒJ„&È-š¦išFÞ@#Q¿ KÀТ ããùüø8¯ý£%ö¨“={æŸE‹qÙUÄ »ê§î2áL’³g4ßùêWÐmb¿W"£ÄeÛííŽ5Ø òÒ< ýžmŸÂz=ù3×[Ž×v?Ÿ4, *¿èt:NG̳è¥]ï³¹vûýò½¯«‡Éw¶ï<ß “—‘ƒÓÓ—òŠže5F£Áóþþ+B1b"øžý‰ˆáÝ¿_h>Å©ÕjµZ­þDMe’4lnnnnnòä§¥¯ÑuwÚZ;í^ÈØ€¹—òÞ6l"Êç÷8ŒËôïó–`ÇiYò×ågåoº®ëúýÚ’¾ÔkY¢¯/…Ðw&é^Ž®ëº®ÿÞûž°øÓ·¥…½ÀÁ½F§öS wê„öþ üMiQº)¹羓û çõoë_EQÅÆ‘ŠZ!‹Åb1»ÁC'§¯^Î;[=} Ð×_Ö_̼Y0süý sò^× +Ò†´"ÝF¾1¢Ž$€#ÚûžŸ=(S'ŠŸøÿ·Ó¯ÃÔ†aÆÝ/å [#è ÔT=(’N§Óé4L&“É$Íf³Ù¬O¿GN¥R©TÊg³<茡Qœ~zä" ¡—Îðxœ|H !é‡Ip÷›üE݆—%ËIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-x-office-document.png0000644000000000000000000000661212247657030022260 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW IDATxÚí[[lÕþffgwfgw½ë¬½¾$vlïúVS‡šbJ!Um$„"ZZ*PQ•‡>TŠÊ‘¨*PHÕR*U•ZÑ„*„Z!n¥RcBESJ$•Hlol'!ÄëkÖ»™½ÍL§sÙ3{±× ü’å9÷s¾ÿü—󟳜a†aà ºNÄ_ï |Þé \gòÔÛ@UUUå ã?['^~ûu õÜ¢”òÆšQ2RöºDµ±\%µ×Èv¾”÷¬¯ÿ<ÜIÛŒ­ßÞÖ lOm÷ô >É'ù$Ž»`³ˆ«×¼õÖ¿Ä£9úc 8"1´"öi{Ž»~ qR>_(äó†Q,‹ù<°¼¼²²¼ ̭Οõ©ñ…¿,ÛƆx`äûÃ÷ÝðÀó<Ïó×nu3àϡކqß•{ ß[ [\tÝ0tpög¦ÉóÏܯ4]¹ž³Ü^¯<Ÿäò¼ ð< (² ²,˲ ,----,““ÿ8³èãà¡{žýúCw~uY—õÍgDÝ6@ûCéOŧÉnç8Ž«Úßt-m—»þ¼Ñüæêßï¤é“äæ1b (‡ØM…8YâÆ k»j,¨¼5ßšG¿EQ= ›UÕL†HÆÊ (J(´_h»Ø1ôë»Üû[à»ß¼uü÷À‚±8›J5žu{AN ¬ðZ~å•—^zí5 P(òy7Ð+³‘…E£--[¶cc·Þº{7`„Ç#Š€ ð¼Ç|òÉÂÂåË@GG{{g'P(£‰D"‘Ð÷ÓÄ/û¾ýï›Óã!à›_þFÏÞeÈð¾¹yã6¢n°ö?Í£;™ã€{îÙ·ïî»ÝÛ²l†µžÓH;ó­ã±Œ¶3ŸÎKˆQ‡ç‰[](º®ëºøý²¬(Ô‹¨$•Ý»J0~öè«Gú€}í÷Üyï´axÞ€7°~F¬K±õ|9`ì´ÙžãØ6£ëÍ¥–×´«'û—iš©M‡H„ P÷ðù|>IdÙç“e@8ŽçØLì\lŸ kM¯ÿ~êÕcÇÖ »I PAv@ qc ÂZ˜QAÖ´•!Ö9rœ 8Ïsœ Ç¿ûî;ï•Y(‚ Š¢(Šß¯(@0 @oOߎÞpräƒÅS_>š¸Øz!i]_Ýæíîª_Ö¡‚XÐ’åZ½šéé©©éi² b±Ö¾ÙÆ›UnÅŠòrë·¦iš®¥R©T*‘t©DÒšfª¤@ ôûÉyB€x<ïëzçûŒž'—O=üþc@¶=Ûý\½h6Ä”/•ã€ÁÁþþr@;Òý»Ü›²3ÀÌ­f[XL¢çƒ|>—Ëç\.—Ëå€\.Ÿ'ÿiš”S÷õôéÓ§ÏœFGGGGGs§æzÎí.pùƒù†Ñ¾³}gÇMµKBü º#é×ÔÔÔT2 ‹¦°`Xç¤Ý%ÀÎÄÚ•’•D‘¨˜ÞÞ¾¾žÀç“$IB!r°,‰dP QUU½zX[[[[[R©T hßßñ³ŽÛ€™ùÙ_Ì@;Úwvhµ£¹.ä–CŒ*IQ `1ŒêáJ^Û·a˜¬²3£±÷^¯×ëõšã‡B¡P(Äb±X,f©xAÿsÀį&&&Æü®¾qÖ¥‚X %áÜ™™drf(‹E« (—‚jû¸ò\ܨ©©©©© hoïèhk«¿ïJDæNG"ÍÍ@º”iIÿúÓ wÖÞWC¼ ë´(0ñx"Ñ×ç^¯\ḛ_*-•otØÌ=be/‘$I’e@¿QûŠ6\ÿ8 PAöà ~¶»¿n=Ùc6•ú7ûd"®•³„ã¯W½^Žsº µRCTP%Ý›´ŸTYÒƒRy ›X1 úÁ-Ÿy¹·V¹ßõÁßä¶€ƒ|ôQÓcõBlÆæ\ãx<$úyøðáÃO>iÕ³g“ÉÙYb› ;Äî«1Û;Ukí¸¸Ì³ÞåÃ8UùEÃPU@}>V?Ô_^^YI§I¬X:;ÛÛ[[Ëëë:™çkgX¡†®[ƒþþþþx¼–un—ÚhÃ*ˆ.̃‰Fý~­‚?¬ëE¯H§×Ö4 H§ççíÛ·nmi1CËË««™ ÐÜåýe2Ùl.GÂÊ’dJeÇ‘˜N2™Lž=k?ŸT[#`J@"ÁfàuSANB¿[ZE×ké/ôzI ¯× ;öþû³³ä*QžžÖV ©‰ô›Í’(æùóóó++$¼Ìq€$ñ¼,mmÑh0HhçÀÀÀ9ŸTZ!û»\6ÎaÜtø–-•%ÀIW®d2ù<à÷{½‚D"ŠÂqÀm·íØÑÖF¼ A u5 àyM+lvm-î¸c×®®.Åôx¬õL à8 ™œžN&«Ç¨œ;šJ@"Ñ(ø¤‚LV˜ùÑh­@H× …R ˜½tiy¼^¢¢D±X$;ßÙ¿× œ8ñᇥK’¦Á ßÏ[‚ìôƒ)ƒƒõ¯³º±¾FÀ–r?½¥EQX  “}ªiÄÄbMM^/0<ÜÙ‡=ÿü™3@&³¶¦(@<ÞÚ›ý?>5µ´Üÿí·wt--á0Þ:.UM”ÓÓ$FU(P/ÈÖõR ¨¤Â>*ˆ2"õû­ ŠŠBn¢$ <Iòùˆ—¢ë€¦åóÅ" i¹œaO<ñàƒñ8pàÀ3Ïœ> Œõ÷ŒGž<¹°ìÚ‡Ã@gg4*Šd –Ä9UÐààÐP% p»Ë®—MdÛ ²çAt°,“'¢B|¾þþ±1Àãin6ë—J©Ô©S@>?3sâ‰v‡=ð@O°wïcML/¼ðÈ###À 7twSà+ÙàϬ¦¦Ì{ »TŽªŠ"‘€ÁA¢Â*]Ín*X2ÀbD0(I¤q9®³³·ถ–›o&pøý–‰xZ[o¹UM¥Ã˜ŸŸ›vïN$ü~ “QUMvíêí•eÀçÅZœÉàiˆdhhhhpÐøê·p}Ñä<„‘…ê:]8ÙŸ‚ÀóäH–Ï_¹B–q劵QEºÎq$ ¬ëVàTµPÐ4àÒ¥¥¥Bèînm%ÊŒMÖˆ5´199995U.²ì÷Ë2H$,/‡êåâgSÀÈi ž~z|Ü0€ÙÙTJUIÞ{ïÙÿ×CwÝ5664:tä@ÜÒJndgg$"À{ösOæ7<<<<4äomÀ׃K5Z‡ rÚ§&éýûüÅižÝIu¦Í<û'lÖÏ=ßNõÇ›( åççÅÐF¨áhö¬èZ¯—ö~ja ëŽÙ™c½hµ^‰:×ñPAöôô49q‹¦®­¼ÃË{¬\îxµ¹9¡®\f? Vëå5Ú° r#ê®YApfu;Ü=íÞ=mm]ÎÖkÖË»j¯26J TAv¢þ¶)ì[9m|ç×*nëaã¼^òŠ‚J«Ÿëª‚œTØëTÖý¬t-;¾úºÊt±%dc¸l˜ö)¹ÓÔÔä$‘3æ²àó9u/-uOÄzüÅzà΄JÀ¯÷ö—M53€Ÿ¯.'®@9I:Òét:øïòû¸ÒÍÈv¹\"LÀLÝm=Иiëgç³g\­¼Vb?½tn û: ƒÿÿÿ ›Íf³«æU*yin¿¾te}L/ϳÙl6›‚ niJç~sž›ÛôlÙÞÜÛB¾v¯t®7Qàg¹sÜ,D>ŒŒ<dcÙG²÷Š¢(ŠbâHâ$WЂ@žeÓ÷öXÞØsôÒ‘×ìMÙç³ozLïÔ#l͹¾g‡×¶]½Ä­r‹ÜU ôãPWHF.~éáÑ ôœÌß°ÿ?Õ&Lm€ªªªª~úKyÕ”U¤ªêóB’D^SÓr f>ý=²Ïçóù||½Zw õ‚(àôÙ¶ÓX}^ˆ*\ºÃéC0ÊZ½ º)ÿ5–þ°zD{màIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/SOGoRootPage.css0000644000000000000000000000424212247657030020270 0ustar rootrootBODY { background-color: #E6E7E6; text-align: center; } IMG#preparedAnimation { width: 0px; height: 0px; } DIV.linkbanner A#about { float: right; margin: 0px; padding: 0px .5em; } DIV#aboutBox { position: absolute; z-index: 1000; left: 0px; top: 30px; width: 100%; text-align: center; } DIV#aboutBox DIV { background-color: #fff; border: 1px solid #222; margin: auto; padding-bottom: 20px; width: 550px; } DIV#aboutBox SPAN.buildDate { color: #666; } A#aboutClose { position: relative; margin-right: 10px; top: -10px; } A, A:link, A:visited { color: #54b948; } DIV A.button { color: #000; } DIV#aboutBox P.logo { background-color: #222; margin-top: 0; margin-bottom: 10px; } DIV#aboutBox P.scroll { border: 1px solid #222; height: 120px; margin: auto; padding: 5px; width: 350px; text-align: left; overflow-y: auto; } DIV#aboutBox P.links { margin: 0 0 20px 0; } DIV.linkbanner { text-align: right; } DIV.linkbanner A { padding-right: .5em; } DIV#loginScreen { clear: both; margin: 0px auto; padding-top: 5em; border: 2px solid transparent; text-align: center; } DIV#loginScreen TABLE { margin: auto; } DIV#loginScreen TABLE TD { text-align: right; } DIV#loginScreen TABLE TD#loginCell { border-left: 1px solid #fff; padding-left: 10px; vertical-align: top; } LABEL { display: inline-block; padding: 10px; } DIV#loginScreen LABEL { display: block; padding: 5px; } #animation { margin: 0px auto; padding: 0px; } IMG#splash { border: 0; margin: 0px; padding: 0px 0px 0px 0px; } DIV#loginScreen INPUT.textField { width: 187px; } DIV#loginScreen A#submit, DIV#loginScreen A#submit SPAN { color: #535D6D; } IMG#progressIndicator { width: 16px; height: 16px; margin-top: 20px; margin-left: 5px; } #errorMessage { color: #f00; width: 400px; margin: 0px auto; text-align: center; } P.browser { background-color: #fff; border-top: 1px solid #888; border-left: 1px solid #888; border-right: 1px solid #eee; border-bottom: 1px solid #eee; line-height: 32px; padding-right: 5px; } P.browser IMG { padding: 0 2px; margin: 0; vertical-align: middle; } #passwordChangeDialog INPUT { width: 150px; } SOGo-2.1.1b/UI/WebServerResources/tentative.png0000644000000000000000000000064412247657030020021 0ustar rootroot‰PNG  IHDR Vu\çbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ  .As~1IDAT(Ï‘1‹ò@EÏ›·Ñ  ±RB ÿaa&h,lBŠàLLff‹eöƒïÖçÞï oiÛ69çx½^Ìf3òGUDc ªŠªâ½çù|bBXk-¿ÇC–eXk !`¼÷¨êŸð{éÛbº®ãÓuÝ—!„@ŒñŸ`Œñçb¦( êºfÇ?K1FÆq¤®kŠ¢À”e)mÛRUÃ00M1FbŒLÓÄ0 TUEÛ¶ǯÇ5M“.— ûýžÍfÀãñàv»P–%»ÝNä]>ŸÓõzå~¿°Ýn9œN§îm&œ×)‡IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tbtv_corner_minus_17x22.png0000644000000000000000000000042512247657030022420 0ustar rootroot‰PNG  IHDR&hwBÜIDAT8í’=n1…¿±wmH) ¤Hˆ&9Q¸À6œ#{½Ñžc ª¤DH ˆ_ÑPÁk\Ìèó{z7(Ïs½eïþz0'ÌŠR‘˱Ó¯“AŒ†Z sïÍöu–ßÅ¥N'Ÿr‚H༡×xåÜ¡‰Å |jqéeÄ(Ä{ÃxÐdدóÞ®Ñm9Þ^,õD@×À¡µ`Ù9Q4+Û¿³,“(ï,ÕÏj!5B"á:ƒqt­,–ÿA@5_™Ãè|¥JèNT9®÷©‡Ð†f7—JbXIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-applix-word.png0000644000000000000000000000661212247657030023760 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW IDATxÚí[[lÕþffgwfgw½ë¬½¾$vlïúVS‡šbJ!Um$„"ZZ*PQ•‡>TŠÊ‘¨*PHÕR*U•ZÑ„*„Z!n¥RcBESJ$•Hlol'!ÄëkÖ»™½ÍL§sÙ3{±× ü’å9÷s¾ÿü—󟳜a†aà ºNÄ_ï |Þé \gòÔÛ@UUUå ã?['^~ûu õÜ¢”òÆšQ2RöºDµ±\%µ×Èv¾”÷¬¯ÿ<ÜIÛŒ­ßÞÖ lOm÷ô >É'ù$Ž»`³ˆ«×¼õÖ¿Ä£9úc 8"1´"öi{Ž»~ qR>_(äó†Q,‹ù<°¼¼²²¼ ̭Οõ©ñ…¿,ÛƆx`äûÃ÷ÝðÀó<Ïó×nu3àϡކqß•{ ß[ [\tÝ0tpög¦ÉóÏܯ4]¹ž³Ü^¯<Ÿäò¼ ð< (² ²,˲ ,----,““ÿ8³èãà¡{žýúCw~uY—õÍgDÝ6@ûCéOŧÉnç8Ž«Úßt-m—»þ¼Ñüæêßï¤é“äæ1b (‡ØM…8YâÆ k»j,¨¼5ßšG¿EQ= ›UÕL†HÆÊ (J(´_h»Ø1ôë»Üû[à»ß¼uü÷À‚±8›J5žu{AN ¬ðZ~å•—^zí5 P(òy7Ð+³‘…E£--[¶cc·Þº{7`„Ç#Š€ ð¼Ç|òÉÂÂåË@GG{{g'P(£‰D"‘Ð÷ÓÄ/û¾ýï›Óã!à›_þFÏÞeÈð¾¹yã6¢n°ö?Í£;™ã€{îÙ·ïî»ÝÛ²l†µžÓH;ó­ã±Œ¶3ŸÎKˆQ‡ç‰[](º®ëºøý²¬(Ô‹¨$•Ý»J0~öè«Gú€}í÷Üyï´axÞ€7°~F¬K±õ|9`ì´ÙžãØ6£ëÍ¥–×´«'û—iš©M‡H„ P÷ðù|>IdÙç“e@8ŽçØLì\lŸ kM¯ÿ~êÕcÇÖ »I PAv@ qc ÂZ˜QAÖ´•!Ö9rœ 8Ïsœ Ç¿ûî;ï•Y(‚ Š¢(Šß¯(@0 @oOߎÞpräƒÅS_>š¸Øz!i]_Ýæíîª_Ö¡‚XÐ’åZ½šéé©©éi² b±Ö¾ÙÆ›UnÅŠòrë·¦iš®¥R©T*‘t©DÒšfª¤@ ôûÉyB€x<ïëzçûŒž'—O=üþc@¶=Ûý\½h6Ä”/•ã€ÁÁþþr@;Òý»Ü›²3ÀÌ­f[XL¢çƒ|>—Ëç\.—Ëå€\.Ÿ'ÿiš”S÷õôéÓ§ÏœFGGGGGs§æzÎí.pùƒù†Ñ¾³}gÇMµKBü º#é×ÔÔÔT2 ‹¦°`Xç¤Ý%ÀÎÄÚ•’•D‘¨˜ÞÞ¾¾žÀç“$IB!r°,‰dP QUU½zX[[[[[R©T hßßñ³ŽÛ€™ùÙ_Ì@;Úwvhµ£¹.ä–CŒ*IQ `1ŒêáJ^Û·a˜¬²3£±÷^¯×ëõšã‡B¡P(Äb±X,f©xAÿsÀį&&&Æü®¾qÖ¥‚X %áÜ™™drf(‹E« (—‚jû¸ò\ܨ©©©©© hoïèhk«¿ïJDæNG"ÍÍ@º”iIÿúÓ wÖÞWC¼ ë´(0ñx"Ñ×ç^¯\ḛ_*-•otØÌ=be/‘$I’e@¿QûŠ6\ÿ8 PAöà ~¶»¿n=Ùc6•ú7ûd"®•³„ã¯W½^Žsº µRCTP%Ý›´ŸTYÒƒRy ›X1 úÁ-Ÿy¹·V¹ßõÁßä¶€ƒ|ôQÓcõBlÆæ\ãx<$úyøðáÃO>iÕ³g“ÉÙYb› ;Äî«1Û;Ukí¸¸Ì³ÞåÃ8UùEÃPU@}>V?Ô_^^YI§I¬X:;ÛÛ[[Ëëë:™çkgX¡†®[ƒþþþþx¼–un—ÚhÃ*ˆ.̃‰Fý~­‚?¬ëE¯H§×Ö4 H§ççíÛ·nmi1CËË««™ ÐÜåýe2Ùl.GÂÊ’dJeÇ‘˜N2™Lž=k?ŸT[#`J@"ÁfàuSANB¿[ZE×ké/ôzI ¯× ;öþû³³ä*QžžÖV ©‰ô›Í’(æùóóó++$¼Ìq€$ñ¼,mmÑh0HhçÀÀÀ9ŸTZ!û»\6ÎaÜtø–-•%ÀIW®d2ù<à÷{½‚D"ŠÂqÀm·íØÑÖF¼ A u5 àyM+lvm-î¸c×®®.Åôx¬õL à8 ™œžN&«Ç¨œ;šJ@"Ñ(ø¤‚LV˜ùÑh­@H× …R ˜½tiy¼^¢¢D±X$;ßÙ¿× œ8ñᇥK’¦Á ßÏ[‚ìôƒ)ƒƒõ¯³º±¾FÀ–r?½¥EQX  “}ªiÄÄbMM^/0<ÜÙ‡=ÿü™3@&³¶¦(@<ÞÚ›ý?>5µ´Üÿí·wt--á0Þ:.UM”ÓÓ$FU(P/ÈÖõR ¨¤Â>*ˆ2"õû­ ŠŠBn¢$ <Iòùˆ—¢ë€¦åóÅ" i¹œaO<ñàƒñ8pàÀ3Ïœ> Œõ÷ŒGž<¹°ìÚ‡Ã@gg4*Šd –Ä9UÐààÐP% p»Ë®—MdÛ ²çAt°,“'¢B|¾þþ±1Àãin6ë—J©Ô©S@>?3sâ‰v‡=ð@O°wïcML/¼ðÈ###À 7twSà+ÙàϬ¦¦Ì{ »TŽªŠ"‘€ÁA¢Â*]Ín*X2ÀbD0(I¤q9®³³·ถ–›o&pøý–‰xZ[o¹UM¥Ã˜ŸŸ›vïN$ü~ “QUMvíêí•eÀçÅZœÉàiˆdhhhhpÐøê·p}Ñä<„‘…ê:]8ÙŸ‚ÀóäH–Ï_¹B–q劵QEºÎq$ ¬ëVàTµPÐ4àÒ¥¥¥Bèînm%ÊŒMÖˆ5´199995U.²ì÷Ë2H$,/‡êåâgSÀÈi ž~z|Ü0€ÙÙTJUIÞ{ïÙÿ×CwÝ5664:tä@ÜÒJndgg$"À{ösOæ7<<<<4äomÀ׃K5Z‡ rÚ§&éýûüÅižÝIu¦Í<û'lÖÏ=ßNõÇ›( åççÅÐF¨áhö¬èZ¯—ö~ja ëŽÙ™c½hµ^‰:×ñPAöôô49q‹¦®­¼ÃË{¬\îxµ¹9¡®\f? Vëå5Ú° r#ê®YApfu;Ü=íÞ=mm]ÎÖkÖË»j¯26J TAv¢þ¶)ì[9m|ç×*nëaã¼^òŠ‚J«Ÿëª‚œTØëTÖý¬t-;¾úºÊt±%dc¸l˜ö)¹ÓÔÔä$‘3æ²àó9u/-uOÄzüÅzà΄JÀ¯÷ö—M53€Ÿ¯.'®@9I:Òét:øïòû¸ÒÍÈv¹\"LÀLÝm=Иiëgç³g\­¼Vb?½tn û: ƒÿÿÿ ›Íf³«æU*yin¿¾te}L/ϳÙl6›‚ niJç~sž›ÛôlÙÞÜÛB¾v¯t®7Qàg¹sÜ,D>ŒŒ<dcÙG²÷Š¢(ŠbâHâ$WЂ@žeÓ÷öXÞØsôÒ‘×ìMÙç³ozLïÔ#l͹¾g‡×¶]½Ä­r‹ÜU ôãPWHF.~éáÑ ôœÌß°ÿ?Õ&Lm€ªªªª~úKyÕ”U¤ªêóB’D^SÓr f>ý=²Ïçóù||½Zw õ‚(àôÙ¶ÓX}^ˆ*\ºÃéC0ÊZ½ º)ÿ5–þ°zD{màIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/calendar-reload.png0000644000000000000000000000321612247657030021031 0ustar rootroot‰PNG  IHDRàw=øsRGB®ÎébKGDÿÿÿ ½§“ pHYsaa¨?§itIMEÙ.µ°lðtEXtCommentCreated with GIMPWéIDATHǵ•klS÷Æçø_ãØ$vÈu8iCœYiJ/jGh´Vh«º¡©TÕØzY«î¢I»µêÑ aŒµkËÖMÓ…M $bÚ8œ›sq‚qìÄö±Ï9û²!&Ø>lï—ÿ‡¿þï£÷ÿ<ïóº®óÿ,é6wN]×ï¿4^û—Ö/–F&\hª„&ªó9ч—ßy¡®ªä( GЭš·˜ .Ð?øÂ {>\ݸÈm.+*c~‰i^z<ÈÔ`œŽÌ©öý‡-?qßW=¯‹¢ð÷ÿ @ÓôG^|k÷[ÞÚóž—n`Í„ÅFŸbBëÜ#Ò«ÞKL…‹§[9{øóÉ]¯lù‘Å,ÿö¶ºÎƒOÿüO{“YÆ’½Ïꤒa„¶QÇ;k¸u/S“v:Ï®FIV_Ë*!ÐíçØ¾Sñ¿¾ögFiï­Jw¼wòýw:ÄúmÏÍðèü#dˆG'D?ÎL’»%“©b>øä9Ô+V+Ü‘ á‘£¨ÝSƒ¿y¹éqAàÔõ¦â—§apôÚ“ï¶Åê‚|ûŸ™%L’*iTf±&&™'¥Bàò˜ƒù¨*L' û \¸RNØb->~úâVÀ~³ŠÊÞ>Ðþ¸æ¬ASþ€ÓtŽ$e¤‘)ÒŒ¦t,ÖN¿Þ»ŽPHúæ^`Hñ@ã~ÿñ±¯/­ôl¬|úꛣûÝ. àêtâ¡O{”Ò°IÀ$Ñ—’%4D,@…S`çßjؾ¿‰ë‹Xõ„ˆl‹ Ó1ðùÒ´âήÌÎ},°t pg‹§»ú¿¦Ù=b,>K_O ¾^ ~ÒÌ IŠY|Ã2Û›7²é™Älßeóýà¿SqXÙ(óã×˱•×òç«®ÿQ8çï_˜’—ÊÄ¥:Û¼~åK”¾KŒÇ¼ìÞµ‰{šb4ƒyòó ó!¥@dBˆ+ðÝ'møãŒ‡#v ªÃdË¡çóõTöô2h™æƒ7—M¬#6k¦Û7K[s7è*X] )”®ð°fQ‚‘kЂŠüÉTEQ×5 I1YlLÇè8Ñ„Í,QU߳ȉi"`Œr—wˆÊ G&xvŒ¯N°`8l ‹`o(*t]#Ã(KȲ [Ž‹¡áÍ:°£9—LFÄ2?Ž;7AI±NŽ#ƒY ‚~’Qªëø/A:¦$ô ÞdvuÕe=û;Fª­–24-ƒÉhÂhr’P  ®ÄefEÝ{uT.9@UM !Mkëz®Œ~®Ã]t}$8§zY4è;¿בnr|VùæC[ßß5å^+' ¬63f« «Y¢íÓAÈrü»‹Å£¬Ýø+6?ÜÌ9¿› —Ó]/"^‹pð«~R^ìÜ d$€,«ñø†•Eý^ÝäÂ`‘e’,C–ƒ7ÞÈ#™†Œ6ŽœŽC¬»¯™Œ÷Ô‡i?ë%ž´a6ß9ÞÒmh(/æ—€zŽá§6.ߣMú°% ¢ˆÈ’Àä ô†árf ©dÙ¢´{€Œ]`ÇïžàDËÆÃvÆ$çÔš?d@»Ñì\GÛ{š·í ­35`4°Y$޵‡yùgy„ã0«€ªBnÌÄàÌ™4}IÒ)¼™Åµ½3ú®»V„¸1Ñ&W5T¼²uøê‚-ŸÕJ—!²ç­k‹IÁPÒ:xªe×É(*ØÌð«œ|){·(C0geâMÔù·ljxêù5ö“Qÿ‡¤FÎðqüà¥J\sþ£(0ƒá)“ ã#°D‰}qo•ù5 ¨·‹ÌÂX<ù̶WnÞÓéÍGK±È"0Y‚kQ!Þ: A` í3lY¬}öÓ&û·€ þå·¸¾#ÕÇ:ãß>xøè£’¨%Ѹ30,8—.]v¾´0o,š”M–öÒ|éB¶Õðfå?…þÿ¬þLá…´ $ÛSIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/green_corner.gif0000644000000000000000000000011212247657030020435 0ustar rootrootGIF89a ‘ÿÿÿÿ™Ì™ÀÀÀ!ù, @Œ!'ãï’iO²ˆ(T°{š¤a“÷qèP¢;SOGo-2.1.1b/UI/WebServerResources/title_attachment_14x14.png0000644000000000000000000000065612247657030022213 0ustar rootroot‰PNG  IHDRH-Ñ pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF$IDATxÚbüÿÿ?9 €˜° nZ·ì¿¾®ÎVV0Ö×Óý¿yýrˆ›êjÿµ4ÕòrÒÀü “f2ܺ}‡áÚõ›Œ05ÄÒˆŽÿ=°ý?ŒbƒÄÕІà@¿ÿPüÇ'„¢&‰¬›™ €ÈÖ@,ØÁpìàŽÿЀª €0BóØ¡ÿµµ4þèý74Ðý¯££ á¡ @(6JJˆ3>rœarêµÀbá¡ ‡Žc–’D± €Pl¬¯)ûÏÇÇû¿¹¡úÿþ=›À¸©¡ê?/Ïÿƺr#òA äþ³°°€±¢‚<Ø tuÄHn"0‹‡{PfIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/abcard.png0000644000000000000000000000075512247657030017235 0ustar rootroot‰PNG  IHDRóÿatIMEÖ ;ÂEíL pHYs''”iQgAMA± üa|IDATxÚÅS»NA=»;(BÌJ4š¨ `Aa¢•?`çXÙù1þ½±¶·ÓD:‰Bb1*,ìö1ëY6‹”Ä„Ùܹó¸÷œ3wfE7åæ±ó „ksæ÷˜çqýâdKWÂINÆÏ3¤‚öý+ýCûÐ ¹wò×›IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tb-compose-send-flat-24x24.png0000644000000000000000000000221212247657030022513 0ustar rootroot‰PNG  IHDR°çá»gAMA± üabKGDÿÿÿÿÿÿ X÷Ü pHYs''”iQ vpAgðH8àaIDATXÃíVMhAþvvm`»$ñ/z©Å VÄ"Õ…UH¥Á£ÁâMDA¨ATb‘BÕƒ{ò èEAðêEE*˜C…ÄCN=ˆ”$•¬„$fgwÖÃ8ìf7›¤±~‡Ìî›73ïûÞ›·þã?þ R>ÿìY.·±!I’$I‰„ëº.¸.òb‘ëŒuÚ»ù÷š÷ölcŽã8µÚÙ³·o?y’J‰õ ŸN$2™K—™ ž­Ø¶ãð†ÐP?\Í0¡;wž>õgFàþý‹)lÛql;<¯Ø¶ã8Nw…‚vÔ›@8P¯4¸Òvè–DZmJùØMhÅ?ÁFêN…;S®ý({wŒ Bè1Á¥½÷S”±^JGÙfgÛí°Bà¾\×u9èƒ6§hÐΉ »mG”˜©Ú¬rÂT®¿ÝËTwÛ â²•(óù|>¼°[ÇèæsôèñãÇŽy©êöícc€$"Ë@«ešëë¼€Ûm€ø(ËÞ»×l"3 ”˜š:qÂ0†Wš1ÆüíO–GFT¸{÷Ý»{÷€l6“ÉfUåíœÒVË4:ÿ%„ˆ(!J{e T*>}êì:ýµ÷C’üO'OîÙsè°¼üùóò2°ºúõëê*ËÍÌärÀÌÌøx&XV³iš<ÛæñEf ÛŠ92559I¤–ƒ§”ƒ ?BáïéôáÃé4°¸øþýâ"0==66= ܺuêÔÍ›€¦É²¦®+öéñJˆé¼K* DQBdyÛ6€Eác,¨êŽûöš–J8ŒŽîÞN££»víߨêÎããž_gN€x<ÇÃ0 ÃÖÖZ­µ5àüùW¯fg¾}ûø¸pa~~iÉ¿òÏ^g³çÎU«\Ñd²ßŸ0ÿ÷ÚuË——–^¾”åÓ§_¼8s Ôq( „móÒÐu]×uF9šÍf³ÙÊår¹\ cï^Ã`leåË—••TªP˜›+~üè{РÐõGtýׯ‰‰ƒ'&b±A×K*!\­V«Õj@µº±Q­~ÿΘã0võêPÿ>{¡^¯×ëõ°¢ Æc D’‰Åx5Äã[N R©T*•Áý5MÓ4-zÞ²,˲€vÛ²Úí7o(µ,J¯\)•nÜ(•Ö×·Œ€i2fš‰Ä þÉ$!ÉäÏŸF£Ñh„KŽ—o¤ÀõëÅâµkÅâóçA¿-Lòæ î ït^a¥£öÙòÚ,„ÒœH´Òÿ ×Þ¾¥”RJçæú)…ß ¾+Ü×3ªIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/inverse.png0000644000000000000000000000603512247657030017471 0ustar rootroot‰PNG  IHDRª5^$çC äIDATxœí›kwÛ6ÒÇg¼‹’lY‰]·›tÏfÛý’ý’O·gû$Ý$N|‘­)Š̾Pš&¶$ÒqÜäÔú½‚€þp.ìx¨°/=_’üšüšüšüšüšüšüšüñ¥'°ã³CÓ²~~¶ì'âoƒ·˜îäÿ«¡k÷ü´¨ M <Æ[Œw‡ÿ_ eœ6‘è2WÛwòÿÕˆ$ÏB Ξ ÂíÆ¸ëøýõ°Î-”“É·[îäÐ|rèwsÓl‹0?Ó8׌?íŸ> áÞK힥†·{#!®žjxã'ÊOÆ:ëˆ8C)™ ³tÖ‘u興#rŽœ­Ÿ.çŒb ÛhÙGÎZ°Ž@0ðZ,ˆßšJmÁ:‡ˆ ›ã-ãœuàˆ‚'n¿P\½‹±¦©ÞV~**3Îõ¼4Um­#"â ã@õÃ,öZîî‹©š,´ªmmiµ‡<Žq ÷RÑ‹%cýLÚ¸ÿ{5«-" ‘ÝDöï6› ·„ºªsDŒaŠÃ~˜Er‹Ç\ÎÕÛqõì( %¿­GÎJýü¬x:Œ»±¿ÉFÕv\èiQ—º¶BO ³à ë#6{óŠÚпOæûà¨ßúÝBþ¥6¯/—ã\aðnìùG†Æ¸I®~>™ïGGý¨Ñ7ˆ`^jk) =é1ùûî6Ö•ÊåeýŸy‡âÉA”†òýSœáã^ ‘ ¶¤j[TæÅYñÆÃãýè kXçŠRÙ“Ërœ×„û¼ŸH)cP7ÉëŸ_Ï¿Ý÷ÂM+H¡´ͪoے鵜O•uÉõ?¸qît¼<›¨Ú’ïaz¾ÇCK—õóóbZê'ÃXŠV™9·TN×hÙ ?­ÊF“\??ÏkKYð(“Qà}XN:ê‡/G‹—£r©ì߆‘Ç·¹#"|ØÙô¹Ù¼¼Xüû$v”fÑ» 8{Ü>´tD³RŸ\-=]¨šŽ÷ÃÍžA0Îõ‹³¢v4ì™ûâ£%ì¹—ï— Ž7G‹|¯Ÿú£¹>ì‡bë¯Q)3)êa×—Þš§*mþÿ´˜•¦›ˆÃ^˜Fžøàä#¢³éòåEYiû÷Çi´ñXDlu:ñŸ~ú©i˜ú×·ãøÃô°J]+%r†½Tro'U^š4ß²O·ˆHÖOä8×Ó…Ùïx×¾Z†’ï§r©íÙDE>ü?Í8׿¾Ígÿ<ì<êRðK€^*9âé¤Ê—u‰µ›Xp<›T¡ídxÇét9/ÍÓat3¨´ýåM^(ûä |2L"_\ 1 EŠ«\ŸÏ*_²-Ë\a-M«$ÝXn·l8L@ÕæÅyÎ8<;êlúñ?’JÛŸ_Í'…Þ>òö×J}³–ÊÌÊz‹rƾ”F>}µ4Ö­K% ÒöùyÁ8>;J;DÀ£½ðGi©íϯòébMɬzI$ÎgÑúwÝÄX{9SYäÝ”ˆþ{±(+óä >ìÇ Ù¦¹ucÿ_ÇPòÿ¼)N.ËÏ•®7~KèÍxYi:Þ“?öûFïí'þÇ)ð—7óÓÉò.3KBO0X(»Åf•†yœöüRÙYY¯ÛÛIU÷ÝAÔÆe÷Rùãq‡süå¤8Ÿ^_">Ê‚¼2³Ò´Œþ¦‹zY»aWÞ8õh²ÐãBtƒÇ½ qœ@ò¾édòÕ¨|~–[×üio¤A~mÜ8¯;¡7È6Æ«ƒqàýxœe‘÷Ûùâ.g@DëZmó,–‚á¬Ô7=R{•ëN(iÐB0À$ðþuÜI#ñÛy9[\_B/ñ|Á.fUï'€‹iIžÅþÍ2Ãh¦8ÃÃþ–¨å#{ÁÙߧǃè|ªN.Ë4Ð ¡¬®]/ä‡Ξ>ŠÇ«¦–ÔqÆß.©“÷=,Õ‡(*S×®—zÛ[Ÿ×ð:Œá*× +8;È䤨—zÛÉTTõli™ÏÙõX²¶¶Xš$‘»ªÉñ~ؽ«¢¶®íh òç IÐ2¡ ÎGc?mrD@«oG'ja1ßãµq7O‹RY@Hn©­ðó8w3ÕÆýN£Yóæ¾œU q?]3©ÚiKIxÛ‰!¾gÝj±wª}5È?]Ô‚3]ºrhã^œ-Fsý¨ç·– cÖ‘»!mgmO‘–„RôS9š«ÚÚ-þ§»Êu?•þºtßX""_l ÷þ ~\mC&nSu¼Õ†ü ŠNÖQ©ì8×£¹ª­;êßâÖƒ[wÝœ¬#†¬µúm§—35.ôpsÅé*Wµ¡ƒl}X·ªvnÍÛp§ ©ìÎ]æJðæwQˆ¸)+ýXj—/ëyYÏ+«µå ²X>îi$>[Áe®ø†úÁG¶‰Ï£Àk´ì„^‰‹‰tüµe|G0š©$iÈ hmðn‹;Ò U¥í›«VA¦st¸~ ÿ¶…Yç®æz”«biˆ ˜^¶¤‘ôÛ•6¯±ée¾dÈàä²Uj‰Žûqùá žŸyi²uåy©‹Ê~ÿ(ÙÞãù’â7ÊÿÃ7©µØ6‚cˆDˆïì7>5)ôËÑ¢R6Å·ûa'–¡ÇØØø³pԵȪ‡þPëfßõcË~"O<~>Uk忘UR°½´y'}AägÈØ'õ„‰ÈÑõ:ÇêK5W¿ž¡äÏŽ;ÝXÞóöGÆ€Á§Ä}î%¬¯Ä ŽƒL¾½Z–*Œüz€K½*ò⮟öûå¾&g,YK×âPÆýw´}ñÃq§{_öèÛŽµd-p†[ޱAæ#ÃÑ\]Û"—sMDƒL~éÓ½{’+m¥P^¾ÐUí¾é‡Rܺeþ'³¬­um½.x¢ŸÈÑLÕæ} ˆŒs—sÕ½ÈÿªO~¸?ïŸ.j†„×ÖKåÃøÖµŽ/À´¨£ÈoH@2¿6n\¼oMá´ÐKm²à«ÞÝp?ò“ªÍU®ã@Dþõñ ±Eö¥©j;.tx]¢4”iä]Ì”#G@Dt1«"Ÿgñ×îúp?òãëËRÕîq/¸™j’[k«ú3t«îz=Z(cwÖ”—#°ëË:/ ÊÌK3èÈ6e†/Îç"ЫQq>ÕƒŽ·ßYÓaËB3<›.én½Š{ƒèÕÅâb¦¯ÓªÏÙKdà±ói—3Åûí¼'¨uý9¿Á¥¶'—ËÑLõùdßl°Q Ùa?|9ZJ¾8D_›‹¬.^Ìõ^â=&-{„‚±Aæ¿«ÙB_åu?•¡ÇïX޽m«•ü³Rs•^(¹L0d«»dލ6n¡Ìd¡Ç¹qDG}ÿx¬½œ¼j¹íEÆÑÛÉrZÖÃ,ÈbÏ÷{9ÈZçtíJe±Á=‰æ =)ê$äÇ=œ1ÄwWg9m¨Tv\èI¡ˆà›ýàxïv[s¿œMÔ‹óÂZdm.|^è÷B˼¬#ßc°•üD0)ÌÅL!C‚qÄUmÏYÒÖ9GR°ýŽfþhÿ:ˆðÝA’Eòt²|5*árÕZeœ"ëÈrD@4ì…-å'€MWCÀ]ê|æVwW%gøû}}ë¨6ÎHŽƒŽÐ ’À»m=¬—z§cÕMDÚ:¯qŸzg‹ˆ>¾ï…t1[ŽóšæË:’¼ŸxØtµý“—sT«´](;+TeÀ:·ºÒOd/a ä­+\Tj·(Í(¯JzèBßË’ ò1ð¸ׯ•nj\TKmw£MWC#eìR»RÕãE­kë@"d¿‰Ø÷¼Oj7¼[‹ª_]VÞߋÚT{¨ÒælV»2â–·)hRÔ…6‡½€!à»*5æõo9èÆÞwQТM¿û߃æëмvüÉìäÐìäÐìäÐìäÐìäÐìäÐìäÐìäÐüyïÝVÒÍ’IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-archive.png0000644000000000000000000000512612247657030023132 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/layout2or3_xlib.txt0000644000000000000000000002301312247657030021105 0ustar rootroot ------------------------------------------------------------------------------ X Library, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com). Distributed under the terms of the GNU LGPL. This file contains contributor copyrights, license information and documentation for a customized X library. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA layout2or3_xlib.txt compiled with XC v0.22b for layout2or3_xlib.js ------------------------------------------------------------------------------ globals, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r2, ?, mf, added more sniffer vars r1, 31Mar04, mf, put in it's own file for use with XC [Description] The following global variables are available. xVersion - X version string (in _header.js) xUA - lowercase user-agent string xIE4Up - true if browser is IE 4 or greater xIE4 - true if browser is IE 4.x xIE5 - true if browser is IE 5.x xNN4 - true if browser is Netscape Navigator 4.x xOp5or6 - true if browser is Opera 5.x or 6.x xOp7 - true if browser is Opera 7.x xMoz - true if browser is Mozilla, etc. xMac - true if OS is Mac For some browsers, the window resize and scroll events are simulated. Some of the following variables may be used. xPCW - previous clientWidth xPCH - previous clientHeight xREL - resize event listener xPSL - previous scrollLeft xPST - previous scrollTop xSEL - scroll event listener [Invocation] [Parameters] [Return] [Dependencies] [Demos] [Notes] As much as possible, object-detection is used instead of browser-detection. ------------------------------------------------------------------------------ xGetElementById, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r1, 31Mar04, mf, put in it's own file for use with XC [Description] [Invocation] xGetElementById(ele) [Parameters] ele - id string or object reference [Return] [Dependencies] [Demos] [Notes] ------------------------------------------------------------------------------ xStr, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r1, 31Mar04, mf, put in it's own file for use with XC [Description] [Invocation] xStr(ref[, etc]) [Parameters] [Return] Returns true if all its arguments are 'string' type. [Dependencies] [Demos] [Notes] ------------------------------------------------------------------------------ xScrollLeft, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r2, ?, mf, added external window support r1, 31Mar04, mf, put in it's own file for use with XC [Description] [Invocation] xScrollLeft(e, bWin) [Parameters] ele - id string or object reference. If undefined return document scrollLeft. [Return] Return the number of pixels the element (or window) has scrolled horizontally. [Dependencies] xGetElementById, xDef, xNum [Demos] [Notes] ------------------------------------------------------------------------------ xScrollTop, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r2, ?, mf, added external window support r1, 31Mar04, mf, put in it's own file for use with XC [Description] [Invocation] xScrollTop(ele) [Parameters] ele - id string or object reference. If undefined return document scrollTop. [Return] Return the number of pixels the element (or window) has scrolled vertically. [Dependencies] xGetElementById, xDef, xNum [Demos] [Notes] ------------------------------------------------------------------------------ xHeight, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r3, 12Mar05, mf, Changed xSetCH to use xGetComputedStyle and removed xGetCS. Made xSetCH inline. Reduces width/height funtions about 200 bytes. r2, 14May04, mf, xHeight now accepts zero as valid r1, 31Mar04, mf, put in it's own file for use with XC [Description] Return and optionally set the element's height. [Invocation] xHeight(ele[, uH]) [Parameters] ele - id string or object reference uH - unsigned integer height; it is rounded to an integer [Return] [Dependencies] xgetelementbyid, xnum, xdef, xstr, xgetcomputedstyle [Demos] [Notes] ------------------------------------------------------------------------------ xClientWidth, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r2, 27Jan05, mf, Moz update for xClientWidth/xClientHeight, check for 'CSS1Compat' (experimental?). r1, 31Mar04, mf, put in it's own file for use with XC [Description] [Invocation] xClientWidth() [Parameters] None [Return] [Dependencies] xOp5or6, xDef [Demos] [Notes] ------------------------------------------------------------------------------ xClientHeight, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r2, 27Jan05, mf, Moz update for xClientWidth/xClientHeight, check for 'CSS1Compat' (experimental?). r1, 31Mar04, mf, put in it's own file for use with XC [Description] [Invocation] xClientHeight() [Parameters] None [Return] [Dependencies] xOp5or6, xDef [Demos] [Notes] ------------------------------------------------------------------------------ xAddEventListener, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r2, 14Mar05, mf, reduced 136 bytes with shorter parameter names. r1, 31Mar04, mf, put in it's own file for use with XC [Description] Register an event listener on the element. For some browsers the window.onscroll and window.onresize events are simulated. [Invocation] xAddEventListener(ele, sEventType, fnEventListener[, bCapture]) [Parameters] ele - id string or object reference sEventType - string event type ('mousemove', 'click', 'resize', etc.) fnEventListener - reference to the listener function bCapture - boolean capture event flag [Return] void [Dependencies] xGetElementById, xIE4Up, xOp7, xClientWidth, xClientHeight, xScrollLeft, xScrollTop [Demos] [Notes] 13Mar05, mf, The 2 sim events add a lot of weight - find a solution!!! ------------------------------------------------------------------------------ xGetComputedStyle, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r5, 14Mar05, mf, reduced by about 20 bytes r4, 12Mar05, mf, return null on error r3, ?, mf, added some error checking r2, 23Aug04, mf, option to parseInt or return string r1, 31Mar04, mf, put in it's own file for use with XC [Description] For sProp use the css property name, not the object property name. For finding width this works in Moz and Op, but in IE this only works if padding and border use pixel units in the CSS. [Invocation] xGetComputedStyle(oEle, sProp[, bInt]) [Parameters] oEle - element object sProp - css property name bInt - if true, return value is an integer [Return] [Dependencies] [Demos] [Notes] ------------------------------------------------------------------------------ xShow, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r3, 27Jan05, mf, Bug-fixes for xShow/xHide (Dave/dlowther). r2, ?, mf, changed to use xVisibility r1, 31Mar04, mf, put in it's own file for use with XC [Description] Set the element's visibility to 'visible' ('show' for NN4). [Invocation] xShow(ele) [Parameters] ele - id string or object reference [Return] [Dependencies] xVisibility [Demos] [Notes] ------------------------------------------------------------------------------ xDef, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r1, 31Mar04, mf, put in it's own file for use with XC [Description] [Invocation] xDef(ref[, ...]) [Parameters] Can take any number and any type of arguments. [Return] Return true if all arguments are defined. [Dependencies] [Demos] [Notes] ------------------------------------------------------------------------------ xNum, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r2, 2Apr05, mf, also return false if isNaN, suggested by pgira at SPF r1, 31Mar04, mf, put in it's own file for use with XC [Description] [Invocation] xNum(ref, etc) [Parameters] [Return] Return true if all arguments are of type 'number', else false. Also returns false if isNaN. [Dependencies] None [Demos] [Notes] ------------------------------------------------------------------------------ xVisibility, Copyright (C) 2001,2002,2003,2004,2005 Michael Foster (Cross-Browser.com) [Revisions] r1 [Description] Return and optionally set the element's visibility. [Invocation] xVisibility(ele, bShow) [Parameters] ele - id string or object reference bShow - true = show, false = hide [Return] [Dependencies] xGetElementById, xDef [Demos] [Notes] SOGo-2.1.1b/UI/WebServerResources/UIxRecurrenceEditor.css0000644000000000000000000000262512247657030021715 0ustar rootrootDIV#windowButtonz { position: absolute; bottom: 0px; left: 0px; right: 0px; height: 2em; margin: 1em; text-align: right; } DIV#windowButtons { position: absolute; bottom: 0px; left: 0px; right: 15px; height: 3em; line-height: 2em; vertical-align: middle; text-align: right; } DIV#pageContent { padding: 1em; } TABLE.frame TH { font-weight: normal; text-align: right; width: 5em; } TABLE TD { text-align: left; } TABLE TD.label { width: 11em; } INPUT.textField { margin: 0px 0.7em; width: 2em; } SPAN.datePicker INPUT.textField { width: 6em; } SPAN.datePicker SPAN IMG { vertical-align: top; } /* Days selectors */ DIV#week, DIV#month { background-color: #fff; border-top: 1px solid #fff; border-left: 1px solid #fff; border-right: 1px solid #999; border-bottom: 1px solid #999; } DIV#week { width: 210px; /* 7*(28+2)px */ } DIV#month { width: 140px; /* 7*(18+2)px */ } SPAN.week { clear: both; display: block; } SPAN.week DIV { border: 1px solid #fff; cursor: pointer; display: block; float: left; } SPAN.week DIV._selected { background-color: #4b6983; border-color: #4b6983; color: #fff; } SPAN.week DIV P { display: block; margin: 2px 0px; padding: 0px; text-align: center; } DIV#week SPAN.week DIV P { width: 28px; } DIV#month SPAN.week DIV P { width: 18px; } SPAN.week DIV:hover { border: 1px solid #4b6983; } A.calendarButton { right: 240px; } SOGo-2.1.1b/UI/WebServerResources/mime-stock_addressbook.png0000644000000000000000000001242512247657030022446 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW IDATxÚí\yp×™ÿõLÏ¥™Ñ­Ñ=BÇ Bg%@ÆàØkC‚+Žñ;xãM¥âdÖÞªu*ö:޳ÙÄ×’ØNœeco †€ §1‡@Bht¢k$1£¹ïyûÇã¥çÔHB •Ô~URëu¿iuÿ¾ë÷}ïI!„‚ÿ—›$übÝÈôû ä™]¯>õÑ¿û\Çìzp<ëúwËÍ~ÍåÏÊ~ Üg\Û²¬xöŸ¿ñÄzˆx^ Ž[è}¹Åò€çþû3Ÿ8 ùðÌ©¯ô> ·ænd2‰„_45ß<ñx|>¿¸zÏ0™¨6Uß2¬—OÖ=òÖ­ù7A$H‚$HÈÐùáà Ü=ýÇÿÇT¿U¯? &“Ë8ß³á»qQ(d2žrsÓÓ“’€nY÷Á¾Ç€ö·wþöÄÂ0oÛ´Zm6«•ö¸ähõø&ú¹Àý ϸÿS@²š/âk·Ûç €Ã‡_zéÞ{ädµ:%eáz³Ååòx¼^B¾þõŸüäðaÀvÜ‘áþößW4׉–~kÏÌ!ïvÿ¨­ÈýQŽ3ß,Y¢Õ óÄb‘ˆã€•+ËËsr¥2)I©¼Ùð-\¼^ŸÏã!Äl6›ÆÅ¿BðŸÏKé»<¸«× ”Ý_ü]})õ‹èù•áΞ3€X,Ò‹DÀgŸ;×Õx½^¯ÏìÛ÷ÑGgΰ»ýõó-©T*•H¨¡‰Å€ßï÷ƒ„ð<ÏSÓ›Ÿ$TÀÕ÷G=xÐÝ]òOåk‡Ãá°Ù€éóÓ_Î]ê?.骫+^*úðÀ÷ܳr% V+•2ÙÍ*‘ªYî‹—…ë¡g«Õáðx€>Ø¿ÿÌàgïœ>1|¯öï›ÖÌÿ9&á‹;:Ο'¤¼\§«¨z{ûû/_rÙŸËOÖ}ÿÙÍÙÀŽGþñ·÷™€þþÉI§˜™q8|¾›§€x€ÆS€6û[))IIR)PR¢Ñ(ÀÏßysû2àâÇï?±H˜‡ÃnœN‡Ãá,‹ÅbRª“-©€¥ÏVí| P*år©°ZN¯¡ÇÑQ  ƒÁ›|¬clEătl³¹\^/ PÐ÷µôÙª]?î¼ó‡?”J Ù´é—¿”ÉÙRñÖÃÉý„ì{¾óðË¿Žoâ‰s@¦Çç«Ün·Ûí8Ž~±·t|TH¥‰èI€@Àë|¾ññ®.`Íš‚žŽëê²Z‹[[Íf ®®¾¾ªêÏx,Ðñì–.|>Þ|jF‘¿gûö»ï~æ ¨H¯ÏÉÜnß{×>ü_Ù¿lîE%¾ãyz€b\aMÚ ÷÷ÅÅEE¥¥€¢GîV|<÷ܶmK–ÀÄÄ™3ÀC­__V|õ«›7¯_¬][ZêõW¯ÿù,–Úl´åÓóÁàü3imµÛwíNž´Xvîd2žW(¯Áßì-ÿÜ = ²lÙÚê­ÀÇ…Ÿ¨ÿXøZ|Ç|ZmaaQPY¹lYUàóù|>píšÉtípüøñãGf³ßäææåeeýyÎE=?|œ(æGz!4Î'ÊÁ 0—˜P“§¦›Ç;€;-·Yï²ÝÝ—.ÇKŽÕÎ×<¿ô¿ˆDb±X X,ÏÃä$ÇF£ËUX¬XQ_¯ÕÞ8àóU@"@ÿÇA‘–™ÑÄb€ÒS@*ü~BE6½}•- È—æJ %€J¥V+•À=§ÿNºñ2Ððå‡w¿ñ{àÅŸ~ú¡‡ƒ¡·×dT*­–@¥Z8è±ÑéòòT* ºº¨(5()ÉÎV©€”¥R"¤Rž‰‹…²0“Én÷x€ÎΡ!‹8¾¯ïÚ5zÞë¯A±Ñžªˆ?ÉsœLH$"‘\NçÍ…t$T@<T^§³Tê›ÃŒÚc?MÚ……Zmn. ‰D¢Y2O¤¥k4J%pß} ùùÀ’%R™˜îef&'ËdÂQ¯ÏËKN6mjl,( ¤¥åÒ%£øÃ>ûlxðx¼Þ`pnžÀqBŽa"sœT*(‚zÉ"(`¾,ÈX ŠL–«W/]š™ lÞ¼jUa!UÇq\ @m¯«ëêU‹èî¾zÕjÆÇÍf§ðzýþ`P«årž 23“’€+JK32h3M¡à¸;ÉɪªŠŠRS ùéOwïîì<#QˆTÃ𼊂A Xü‰]î_-° CO_߯‚¦B¦¦ÎXPiiI‰NOs3ðÊ+ÎÌ ˆ÷‚«VQà·lY³F«,½§gtÔj%d×®'††€ÉI‹ÅíµÐØ9¢­mpÐlöí;{vdX¹R§ËÌ$dË–¦¦¢"@£II‘Ë9î‰'6n¬¨ äÅÿûŽZÏø|ñïÌnßÁà"å€ÅfAñ "­6++)I°x&§NõôLOòÞ{'N ÒO£gK¢§O_¾<5 NNÚíÀŽ_übe%!Ì3|píÚâbB^ýÀË—c+€‚rse²ª* °P.ÏÊl6gföòÇd݀Ǥ€¹³ Úœš™ñzyèë£,hbÂå*(–/¯«ÓjãóíM›V®,(`ÝTŽ3ÆÇm6Bš›ˆžŸž®VËd@SSEEV••œ,— •øÑ£F# —K$b1MÞÉÉ€Ëåõúý@KË¥KÀË/ïÛ×Ý <õÔ—¾TSCHCƒ^Ÿ™Éqû÷Ÿ;72BÈà Ñh· Êr@d’õxöìùùϵº¼Ôjzþ;'¤ùÒ“$¿:Gˆf]™o{½àÙ‹Æ‚ž{î©§¾òÚ+2™¥²° ¤dö‡%ÙÒÒœ•Jˆñ¿ýí'Ÿ „² ú]¯ÏÏW«Çÿüç—.¥+n±º«V•—k4„´·ÓÔРÓedpœÉd³y<„9ÒÖ6> cc6pþ¼Á0= Ô×ët™™@SSe¥F LLØl‚'‰DÂ{„EŠÊ[o}æ`õê[n©¨Îûý^¯ýMàÂÝìøöÀÆW†í!Ÿ»á^T @£ãààÀëÑó€ÐSaЍ©Y²$-M¸Ogçð°ÅLO[­n·ð¢r¹T*_ûÚºueeðLa'NtuMNräH{ûÄ„ ²úz.##ö»…†Â³g¯\™ž®éõyy))±*âð [¸—Û}ä :ï¾+Åb©T¥|-Þ-yô3$T@ rÇaA"< 0»»¦&­Öé‚A›m|ho¿x±»;:ètyyÌ]àÂ…þþk×¢çÕ×—•ed*•B!‘ßÜ|ôèÀðöÛ‡÷õÑq?ð‹_ìÝÛÓƒëËåÂ|+¤ØýGF¦§á9²²RRŸoq…Xd%L×¾9N.=Î^,Z/H&3›/\¶nݰ¡¬ ضõ‚Êʼ^`ttdÄhŒî.¦¦ÒŠÉääÌL¨å³ùK–h4¡E³ü“'»»Æð^ !”žÎÌFãÌŒËÝ4MΌՄÅób1‹õ¡=¤x…@+`€ãŠP̾6ñ`A&“Ïdggggf†¾Èu__ìfbµº\¡ô}©T”×3±Ûé<ŸòþH8Øçi̲³SS)0ìzøs¤§«T¡ H¡44Ra±ÀqÔ˜„Bì†0WÄqŒ¹Ýb1ÐÛKYÐø¸Ã‘ŸTW×ÖDÓE§Óíöûää¤$‰P(¤R±8:ù:^oha£TÊ塞¯³”pÛîÕ×ëõ™™Â¬+WFG-–X´™ÜèÄqá!ˆö¼³) ab,ˆ­…F² ^ؽÛlx^«½ýv`lL"©®d²œœŠ  ¨¨´´¨ˆ6ëD¢pW&„®œÑž ZE{ÀÐÑh³…X/sÇ­XAsC$PZmV–Jäæfd$%E¿S—^ŸŸŸœ ÜrKeeNŽp½¥¥½}|<ñÍ\d¶m9‹Ú b,(íÿsǹ¹¹¹ÙÙÔSB0ÆÆ¬V ˜R)°¢Ó§{z¦¦„ûž>}ùòô4íåhµ„Èd‰XÌq>º~½NäçÓý:ß6,_žŸ„e2ʦydÃŽÖÙÙ€DBÕOêê2 ik '¡žÛ¡@B+t‚ 5°y{À\YÇ> ™L½½Àm·•”Ðq8&&€ÎÎŽŽžžh¸pÖ LêêhÏ&=]¥b¡ƒz íj¾õÖGõö²%(bãÆÆF­–ã¶lij*.æ8µš†´¶¶“I€J¥’Ë%Ž»ãŽÚÚ¼<Ž£À‡_¼8:JÈë¯øa$[ 5°È1Ž“HJJè±¢‚++ŸÏížš$·IßWºàsï9ííÀÃßu—N'ô‚q»››×^;tÈj***+—.BKOmª v;!ÅÅÙÙ*ÇmÝzûí%%„üìg{ötu ó™gf³Ë¬[·|y^!99ii `6ÓfÚÁƒçÏŒyyÔ3ÒÒ”J©”òúúÆÇ­VàÔ©ÎN£¸zuzšV¼±“.œã»¾L|¾7ß|ùe ­­¹9޲ÃÒÕÒæü¼Ou†´Ñ[Wm¯ç¸„»"l#v»m„Æ‚Ò[R¥‡° ºã-š ƒÁœ<ÙÖ64?>8¨V••µµË– –‹wìØ¼¹ª   Ž;t¨µut”ææ––¾¾èBn¡ . mQ8´5ϲ#-Ÿf2 ºº¸8#xãßýîÐ!àĉ'Ÿ”˼<&55G¿ßí¶Ûö=õPsïÎÍvÇ- bÑÝlf,ˆî#s8rr€òòÊʼ¼ð }1æ »v?>0|ùËk×–”6ÔÕåçsœF“šªPòöÛ‡÷öSS¬^ˆ:V³Ž†*`Ó¦U«ŠŠ€5khÒݱcçÎO?XV"ÄST0h0¼÷ šLᬋŠX\^¾mÈwí¹^oYÄ^Ðw¿ûøã_ø044–¥Ç÷T kdëày <ÝŽ:“šÜ=`î,(ìéi›XXs»ßy‡² › Ðé–.---‰†Ž¢=„ÙÚÚÛ;=Ÿ­D7»eÏ}>åAÑu°H$•RúI ?JË ÄVO¼9‰çÅúm±ÿ‰… ±8\SSSSSS€R©T*•„Ðcâ| °¼©fÊïöúñÞiÀçóÝâëœÿ¾ œœœœÌÌèŸ ‰%:Æ/ì~ñg³@í›çy^,®šL&“ÉDÿfŒõ–!D¥R©TªøŠH¨žã9žÖ¬nܾÖ|Vx6ãÓ4àèı‰£K÷{ÞÝþWi@‰»Ýç“H„1¶/¨®®¡A«¥ `¾XÐü%…õ”èçIo*ÎKê§Óét:‰D"‘H™L&“É…B¡P(¡ï­ˆ„ `MÌ‹y> ¨ìY6\“X†,Ëyàͺ;ÿ Éý‚rXu¡á•e?jk‹ŠÄb ¶vnÎ-°Ì]ë~‘³ÜnÇçNÜæ‡Ýÿ¬û×å{s^D߉D3=e¸Åɾ‰ÚÑL\.—Ëå"ÄjµZ­VÀf³Ùl6Àâ´úm"àG÷½Þõ2pôÅöw'>8u­ðµÎ²¿a¿ötõÙJà±»îKªRÉÉÉÉ* V«Õj5''3ˆ¯‚yÿ«ë q8(-¥Š¡ìõ K’ìø·&,„²£T*•J¥ h–„Y(Jœ„oøŸu°dÃ’žÿÖ„çyžnC§ `ã¸ô3ü#ÄÐÌ+íIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/account-settings.png0000644000000000000000000000425312247657030021310 0ustar rootroot‰PNG  IHDR szzôtIMEÔ 1é!Ac pHYs''”iQgAMA± üa:IDATxÚ­W[lWþfwgw½¶c{}[“[]µu+vn$Dâb“ªuÔ´Ü$m•R^JZâ^òÐäÔH´¥•"¬…D•!@c7N¨í´¶k›:õ}½ÞëìÌììefùÿ3ëkìº ŽõûxfÎùÿï|ÿíXÂ1N:ëb‡#[8ù<f>W ôw>‡U'æ7¹Äqrêà盤ÊÊraLUu$U ™lv•1°®#WžHràê­üy| Ï|ç«Ä¢1%¹ùùýá‘ot÷¼sÐÜùÀñìÄð-·\ä«][·ÖÂét 8ÆG“³ë*vÐw–Í : Àž{ ŸªÙ‚¤–ƒn8á–eTWùÑpß½;úCÓ/€ïÒò]\NYv ߆Â1ZèþÄY1;;…ógÈh‡´b×gw£l 5Û¶‘/´TŽ˜´È-$ÄžiZ(öùà­ P¯ŠW˜¸èd Àét y„æƒxóòñîȃG±uÛŽ;\ºØ‰Hx¥¥¥¸qý*¡ X Ú€ ]K9‘%㉤UÓ §R0Œ4\2E·Sþ Ìl90ýÀ4Y–íå?œya¡| þÚu O?ó,X+‡®©"K**JÐÚò ZZZ0×ð£3W0Š@v¹DP*S‘X %I.Q‘ÖÕ4÷‘ oŠv‡Ù½  @ìÉë<|åðPº¶¶Fss³¨):a¥‡c¨¿ÒâbA=Ÿ<žPD ‘h ÆäÈmO’¤Á€C*³ÈdÜE"»Ý”Fnñ¼6>dzÞ¿?t]Â#KÙÓèVqñj7îkhû ÙŽF™L¤nuÑÒ~’¸ÀþÏSòb¨Eåüì<$²ÕdD"±Ÿ ÷ôô`hè´>t g¿Ý‚Ÿ_ü;ÞURA{jr$˜xk¹L/mÿ IZÄ@6GF¥ü*K§ö¸©.³°Àìì,z{{Ñß?€o~ë)¼ø½Âå’á//ÁËß/¼ð"^{ãW½Ñ¹ .> $}$]$S¢Y”©| Û@·M9ŸžK°³†ªóho?ûØ…‡~G¶Qð‰o¤VŽ‘îl:A¯^'¹Iá“/UBv3 l`%‹Æ=¯ø¶–šêZ4ù(eŸ‚Ð'@/®É‚|"÷©Á™ôŠûÀUNàBÁÀršeÒâ±(jjª .p Y› ÜSp“gÅMK ã\¾‰† ‹™ƒc ͉Zï–%xd‡òò2ª Þ½Ù+Òtñý*!clØë‘©æ3çÒ7Jƒš” `ãá0‰´‘‹Ý´qQ|”×'Nœ ¿¶â­\Á|pfÕw·@Y⑈"žÝÎ¥o NÛ ,¿q .à…"ð¸ ú:ûœ«ØÞ½{ÑØØˆ—ù ´µµá®O7áw]×089‡™)u>'ûˆìrØû¹›Ææ |z8œ [Až~TUEYYYNž<‰ŸýþëÅ#­Gðèç‰æÕÿþ ^½õžð”€Ùäà³ch™uˆZÈ—ŠlÎ$¶¨T¹:::022"蜚ÇG²?}þIìÙU²7ʶ”âžú»ÐØÔˆ×ú& e¬¥ý¬OÄ@¡ŒoÌ€¹Ì@6kŠ’Ì£¶&€cÇŽãÂ…?! bÐQ…ǵÅv¦ˆ«™dßž8õŠË*Ðy­O·~A|çÛÒ'd€ƒp™.J,»÷ìCqI)Ž?ö5ºˆ¸1<BIIâJV÷úT* ƒ¯eÄÇL߇Sbo&kŠ›Ç€µy ˜‚i‰;bü"êï¾WDpMm-®œþ Â1)ÃîˆzÊ@,G2©B£F”28K…ŽÉé ºð^jDù\Žò|£k¹úE<*üUKÁywu>ý7¹¦Z¼ã‹…’LÚ}>‘¤^¯ b{Ý=ýPUñüÜ !]UÇå¦i¨ë†¨nkŸäñ}MøÉ¹KØ·»QÜš2Ù U;]ôyn³JÙúÂQäÈ%ÁÙôÝìµFGûFHÅ4Ih]”:yrˆ¼þ÷F°c{(¡šžxÖIh3]^»®ß@eUu<§pH'8DYñîµBI$ÈÿJNIÄããƒãÑè<¸ » ­—9EM&ËøâÁ´†"K§^¬`É|ýÚbh8$[‚*9‘§.-®•'BÚ`2Feƒ¡Äã4ÇHƒB['HþFrƒÕ¬ €rö±á¡g·×ß'*Å¥k 9OÌšªššžÔ4ò%)W%‘T”H<™ŒÇ$Š($Tx'¡ ðÆÝHjhh(ÝYßôÛ"¯¯M‚íëI²Ë¤D5: 1Ž'±3D§38Ž 'Ýìÿ—e…¹–ä’=$…|XXçDâ"ù¿Ú †+`ÿêÿ¿ m4þ¬DƲëÖîIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/remove-calendar.png0000644000000000000000000000171112247657030021056 0ustar rootroot‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYsaa¨?§itIME×:ØoýÕVIDATHÇí•OlTUÆo:)S¡šbˆ‰XÒX í0mñï‚ ‰”"®4,%aK$&&&ˆ.P„DL ¨Pm”ÊØ`©¡˜ØDŒ˜ Ì´%íÌ{ïÞs\Ü÷^ß”¶ì7¹¹ß9÷Ü{îùÎyçÁÿãËÁ…MšÏ:Q{e€âNª¡‹ÖˆcÂZ·Æ2D8bÐèœQøêÜ0] 9°a˜ÐkDAlJgÅÙ¦÷¯Ñ=w9À§T*1ë Fc#‚±Šµ‡FQŒuÓZuXœ áê…“lMH¡P ½³ˆ¡£°ƒŽB"–î'ØÚ݇ªPØù]=O#ªŽBï XQŠ}»èêÝ…Ì‹ q aÀd5âÛjB“u|K„c½Õ9zD#[°a°¸‘˜OMxMÇŽDõ«ÎNAb½B¶6ã¾Ä¥ÊTUÁ( c%Š#_`¯–Ml¼ßJì½þ wúϦGi¨Or&• V]…X‘èÕ.Sóᛓtnlâ¯Á÷8›_/òÈÙwxpå®|þÑö±üC+€©lš"«®ôŒˆ£+ŵs®hcŽðÅC ü6[×X2ýGŸÝ@ÛðUîÏÌ24±Œ–ƒGNwôôNÕWQÔ%m~bÓ9Ðu- >ü<£ÕU4{>ûòc43ȷӼζG'Hrè.Œ^jSIŽ(:W-ÕÆåÜlé¦ê×h(Oá5þÞØÇ¤fþÐlðÃÀ·[ehð<ÆV„‹ßň`E<c”õ¿ÿL{e€|ÆçÚí*›ò]?c4÷ °ûîv-aÀ¶OÖõk£¾׸*Ø §xlò{Vâ3”i¥|ø]Ê'ÞdÛô×¼vëËõ^9q<Ûþú¦.‚ÃÞó•õ”—¦±ÉçÌ?køò¾ÍÔÞû€FÚ¸üɳö¹ñË­3²˜N7õº>¾Ô0•ÊêŸ~¸¥yï«?-[»v6ÖårîæÉãÛ›÷íY·ió[ÿŸþ¿PwÔ5ç½IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/PasswordPolicy.js0000644000000000000000000000776612247657030020644 0ustar rootrootvar PolicyPasswordChangeUnsupported = -3; var PolicyPasswordSystemUnknown = -2; var PolicyPasswordUnknown = -1; var PolicyPasswordExpired = 0; var PolicyAccountLocked = 1; var PolicyChangeAfterReset = 2; var PolicyPasswordModNotAllowed = 3; var PolicyMustSupplyOldPassword = 4; var PolicyInsufficientPasswordQuality = 5; var PolicyPasswordTooShort = 6; var PolicyPasswordTooYoung = 7; var PolicyPasswordInHistory = 8; var PolicyNoError = 65535; function _passwordPolicyAjaxCallback(http) { if (http.readyState == 4) { var policy = http.callbackData; policy.callback(http); } } function PasswordPolicy(userName, password) { this.userName = userName; this.password = password; } PasswordPolicy.prototype = { userName: null, password: null, successCallback: null, failureCallback: null, setCallbacks: function(successCallback, failureCallback) { this.successCallback = successCallback; this.failureCallback = failureCallback; }, changePassword: function (newPassword) { var content = Object.toJSON({ userName: this.userName, password: this.password, newPassword: newPassword }); var urlParts = ApplicationBaseURL.split("/"); var url = "/" + urlParts[1] + "/so/changePassword"; triggerAjaxRequest(url, _passwordPolicyAjaxCallback, this, content, {"content-type": "application/json"} ); }, callback: function(http) { if (isHttpStatus204(http.status)) { if (this.successCallback) this.successCallback(_("The password was changed successfully.")); } else { if (this.failureCallback) { var perr = PolicyPasswordUnknown; var error = ""; switch (http.status) { case 403: if (http.getResponseHeader("content-type") == "application/json") { var jsonResponse = http.responseText.evalJSON(false); perr = jsonResponse["LDAPPasswordPolicyError"]; // Normal password change failed if (perr == PolicyNoError) { error = _("Password change failed"); } else if (perr == PolicyPasswordModNotAllowed) { error = _("Password change failed - Permission denied"); } else if (perr == PolicyInsufficientPasswordQuality) { error = _("Password change failed - Insufficient password quality"); } else if (perr == PolicyPasswordTooShort) { error = _("Password change failed - Password is too short"); } else if (perr == PolicyPasswordTooYoung) { error = _("Password change failed - Password is too young"); } else if (perr == PolicyPasswordInHistory) { error = _("Password change failed - Password is in history"); } else { error = _("Unhandled policy error: %{0}").formatted(perr); perr = PolicyPasswordUnknown; } } else { perr = PolicyPasswordSystemUnknown; error = _("Unhandled error response"); } break; case 404: perr = PolicyPasswordChangeUnsupported; error = _("Password change is not supported."); break; default: perr = PolicyPasswordSystemUnknown; error = _("Unhandled HTTP error code: %{0}").formatted(http.status); } this.failureCallback(perr, error); // showPasswordMessage(error); } } } }; SOGo-2.1.1b/UI/WebServerResources/iefixes.css0000644000000000000000000001112112247657030017446 0ustar rootroot/* SOGoRootPage */ HTML { overflow: hidden; } FORM { padding: 0px; margin: 0px; } DIV#loginScreen A.button SPAN { padding: 0; } /* generic */ SPAN.disabledToolbarButton { filter: alpha(opacity=40); } DIV.javascriptPopupBackground { filter: alpha(opacity=60); } DIV.javascriptMessagePseudoWindow, DIV.javascriptMessagePseudoTopWindow { filter: alpha(opacity=100); } DIV#windowButtons { height: 3em; } INPUT.button { border: 1px solid #fff; border-right: 1px solid #666; border-bottom: 1px solid #666; } .menu LI.disabled:hover { background-color: #E6E7E6; } UL#userList { top: 35px; } DIV.tabsContainer > DIV.scrollToolbar > A > SPAN { line-height: 12px; } DIV#popupFrame IFRAME { height: expression(document.body.clientHeight - 88 + "px") } DIV#bgFrameDiv, DIV#bgDialogDiv { background-color: #555; filter: alpha(opacity=40); } DIV.colorBox { line-height: 15px; } /* MailerUI */ IMG.dragMessage { filter: alpha(opacity=70); } TABLE.messageList TD { white-space: pre; } TABLE.messageList TR._selected TD { border-right: 1px solid #9ABCD8 !important; } TABLE.messageList TR.openedThread TD, TABLE.messageList TR.closedThread TD, TABLE.messageList TR.thread .messageThreadColumn { border-right: 1px solid #DDD; } TABLE.messageList TR.thread TD { border-right: 1px solid #EEE; } /* ContactsUI */ /*DIV#contactFoldersList SPAN.toolbarButton { padding: 2px; } */ /* UIxContactEditor */ DIV#editorTabs TABLE.frame INPUT.textField { margin: 0px; } INPUT.textField._invalid, INPUT.comboBoxField._invalid { background: #f66 !important; } /* SchedulerUI */ DIV.eventInside.tentative, DIV.eventInside.needs-action { filter: alpha(opacity=70); } DIV.eventInside.delegated, DIV.eventInside.declined { filter: alpha(opacity=40); } #calendarList DIV.colorBox, #schedulerTabs DIV.colorBox { *display: inline; /* for IE7 */ } /* UIxAppointmentEditor */ DIV#attendeesMenu LI.separator { padding-left: 0px; } #eventView SPAN.content A { line-height: 2.5em; } #eventView SPAN.content > INPUT.textField { width: 99%; } /* UIxAttendeesEditor */ DIV#attendeesView { left: 0.5em; } TABLE#freeBusyAttendees TD.attendeeStatus, TABLE#freeBusyAttendees TD.attendeeStatus DIV { width: 24px; } TABLE#freeBusyData TD.noFreeBusy { height: 25px } TABLE { empty-cells: show; /* no impact? */ } /* UIxCalendarProperties */ BUTTON#colorButton { margin-top: 2px; } DIV#propertiesTabs FIELDSET { padding: 5px; } DIV#propertiesTabs LEGEND { margin-bottom: 5px; } /* UIxMailPartICalViewer */ #iCalAttendees SPAN { display: block; height: 18px; border: 0px; margin: 0px; padding: 0px; } #iCalAttendees DIV.status-icon { margin-top: 2px; border: 0px; padding: 0px; } .clear { padding-top: 0; } #messageContent FIELDSET { padding: 0.5em 1.0em; } #messageContent FIELDSET DIV, #messageContent FIELDSET P { margin: 1.0em; } /* UIxMailEditor */ DIV#headerArea { padding-bottom: 0px; } TABLE#categoriesList { width: auto; } DIV#windowButtons { bottom: 11px; } TABLE.frame { margin-top: -4px; } TABLE.framenocaption { margin-top: 17px; } TABLE.frame TBODY { padding: 20px; } UL#calendarList, UL#contactFolders { margin-top: 2px; } A.toolbarButton SPAN, A.toolbarButton:hover SPAN { height: 50px; padding: 5px 2px 6px 5px; } A.smallToolbarButton, A.smallToolbarButton:hover { height: 34px; } A.toolbarButton:active SPAN { background-position: auto; /*broken*/ } A.toolbarButton, A.toolbarButton SPAN, A.button, A.button SPAN { color: #262B33; } DIV#toolbar { overflow: hidden; } INPUT#statusPercent { width: 2em !important; } DIV#referencesListWrapper { margin-bottom: 0px; } DIV#listEditor TABLE TBODY TR TD:first-child { margin-bottom: 0px; padding-bottom: 0px; } A#aboutClose { top: 25px;} .dialog h3 { font-size: 14px; } .dialog p { margin: 0px; } /* UIxPreferences */ DIV#filtersListWrapper { overflow-x: hidden; } dl.dl-horizontal { margin-top: 2px; margin-bottom: 2px; } /* UIxComponentEditor */ .SOGoTimePickerMenu > DIV { width: 310px; } /* UIx*UserRights */ BODY.popup DIV.dialog.none { left: 50%; width: 350px; margin-left: -175px; } /* SOGoDragHandles */ .safetyBlock { background-color: #fff; filter: alpha(opacity=0); } /* datepicker pseudo-elements fix for IE7 */ .datepicker .prev, .datepicker .next { *zoom: expression( this.runtimeStyle.zoom="1", this.appendChild( document.createElement("small") ).className="ie-after" ); } .datepicker .prev .ie-after { zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '«'); } .datepicker .next .ie-after { zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '»'); }SOGo-2.1.1b/UI/WebServerResources/mime-application-x-font-bdf.png0000644000000000000000000001161712247657030023212 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWIDATxÚí[y\”Õúÿξ13ˆl"W!Dd©4Q0l¹-H^ïïWWË2Ë6K­®Ù¢¶˜¹d.™¶—fW£Rð*FŠ""²Ï Û,̰ ³¼÷·Óà˜¼¢Ôí>ÿœÏûÎ÷9Ï÷ÙÏ9 Š¢(ŠÂÿh„ˆ9Ò üÑé m æ.Šš4顇>ý”¢ÈóH3úßJ â‚úúúûívŠšóåËõ߯úý9(¸m¬LÄ_dý=tÖóŸÏå²Ù ÆH3~9¢~¦Ò²²gÇ>-0H“E_Åíaš ­è_dÝnÝ~x<ðEàFV\PìG@Vâ=áw«š4ÁµNU—º³ÙDQçKªÎ7Ê\Õ6õ& éGå]ªé@c{“°Q 4å)+U 0èØÃGW.§_xa뎵ÇOQT¥õý®·€ Ýã׬ΉªŸk^ Œ^èñ ðêÃóŸKžüÛ€üà‰Ü¦¼MÀÎ[wùí½Óû²{s€ÈȈˆðpÀÏO¡P(&“Íf2вÛ ««§§»hnniioÊ•ºªàÉÉg-ŽdRY²ÏÃÀ ë^ÊZ™ DD„‡‡…žž^^ ðù|> |>ÐÙÙÕÕÙ èfê›;§»Óv|²íîËË‹q ö¸¥®ž¢6žú¦ |x!ζ`±X,&p8§8QâU÷:°xò]©Ñ¯³Ã’?+HðŸ”ï¸Þ½RÁ¯ÝýÖëoïN,9µ˜»#ëƒ{¶õõ õõ€Z­R)•Q™ÆÏ”ëÛÞ–Ÿ_vìùf sü¬»3’þ `2™L&ƒ±â±çv.½Ÿ¢n-LžµðwØüíY@DDppP ÕjµZí¥ÏçÓ1Àh4;;I?ÆÞ8 à=Écó†¬üfxkÎ;×§…}'K =€;d( (õ?#wi"‹Åfs8@ͨ†fU#°¶iuõëÇÔ ”»“³‡n±±@,3AÕAŸŒy…¢(?êªèêêíí,‹å×€¦&µº¥˜½(sõí¦¡¯ó7ÀÇ›>ÛÿùfŠÊï:¶3ŸÜyçìÙ·ÍΔŒ>£LF“ÑhD"‘8·£jkÝNàÅ‚åõËßRƒR‚¯Dðîä=ZZè ب~tWº\š{Ç€Á`0 €Ïçñx<@¯×ëF unJJò¡ï7S —”–/Ë£¨kvfí|¸í¶ŒŒ™3ŠŠŠŠòrz:þyzJ¥JÕÚ Ü[zÏË÷l2’gÏX|õ1ÊqƹÍѰÙl6íÛ æ¯H‰Ç£ßÝÝÝÝÛ 1‚: ?¡¯¯¯ïÐùq ­†V£‰¢žÿrEÒ‹v }Ñô•ÓÖ--ÍÍÍÍ@{»FÓÞxyyyyy==½½}}€Ø(Qz~,ºaኇ>~ºº·vë]ha§c  …B! × ò|êwWþ½à­9ëϽ{ë }<è;zP[[WWSp¹\.— ˆDb±Hœ_\=¿þa`Õ®—öüýÀar˜æðeg-{Z?iÛˆD"‘HD» ‡Ã%x„@@û~Î`0›–'G%K~G8}¸øEþT4ãä€ óܹªªsç\óär¹\&ÚÚÚÚ´Z -wúÛÓË?ý)2rüøá¼¥ÇÒcé¡(sš¹Ê̡ǣ Q‡Ã%x‡Ãápú €q/3ˆ}CÊ•÷ºa’w¿>åÔ7Õ@ÊŠÉ/%¼¨TtÕ×××××…"‘PxxˆD@ÃëÊ9åÉÀ:Çë2‡Ÿ¯2ÝÙ’òý@`àèÑ `³Ùlv»ë÷K]OG‡Á¤Ü”tß)À, ÓÙ+ýîu·€C…yÊÛû¶¬þ/h …@KKKKK‹KÓär™L&TªææÖV`Öû3y3þø…ù…ùІ¿ >>ÛûeÞWÛUª*R™$'O™2y2PYYYYU5@ ? ž¸’•µ·Ó5© ’ÙW“v^wš Ü­ú  éÒÝáp:íöËç×V+½³$qHz$Ò«ÿ~ÅÑÊÊsŠÚÒþþá­%Àý÷geÝuÐØØØØØH[$É÷ žðG¶fMšžíš$ŽMHIHÿ`zÓÄ1EÑm[‡vÀ¥¦ÎçÓ®€àé!'iøÏ¿KöŒŸxç)ù3?÷³²CÿE+€Ó —•]Úõ$|‘¤@¯7Ìf n|ì‚= d Ù®ËõWŸ©)©£¨wžÙðýÆbŠêh14š‡~Œçšàp:œ'EõuY¬³éö€Æ‡»ÆN'EÑõ@&“ÉtåßmÕ·Ú µðÁÇ>^<˜uSÆgSëéôÖÇøúë}ûrr\f2™LÀ@…àñx<>èè ›m‰û²Ê\ß©)ªmª;IQ‹º—t<©´]¡æÀŸ#²~˜ó¹‹€Åd1YLƒ9‹ËŒðþg“v׸ÎNzÇ),,$$8(ZR¼¡ø„+_§›be·Ûív;EÙl6›ÍFQV«ÕjµRÔ)mÑÓ‡)jî»ÿø@pK|jïäx 44,,$øöÛœœC‡\õ…BA§Ãë ÁçÓà›à?'~±«i÷´réèçôÀCeVÿµÈȘ1#- `Äã+äšNJ[9¸œ®¹ 5Y¾IþW:ý´Ùh“çp.Õ8µZ¥jnbb&N¼áàûå¹å¦{÷~£úFEgG&“kTÕ«5j °nɆ'6n–Æ-»ùL`nМMw}„„„†¹¹¹¹GŽgÏVVž?ˆÅb±‡ÝThIÚI|>‹0™´¢X÷Ùîµ'r_™B6X¼å©Ÿ> Äœy=ê4àççëëë ¬[·aÃÆÀ¬ééòô 6dâĘ›FpO˜hl´ì†£>ŒF£IÀÃ^¸Óét:ô\°Xh P©”J• x¤ço>ódÀ»v½³k=ðå¡=ܽ{\ÿ¿}¾æNÍ~àïÔQ‰àé÷žúò‘=®46///ïèQ þ†Æ½ªÀœ´{2ïÞ œú¨ØRTF¶Y.¶D€n7³ÙôÆÕ pnfNcÅ‹^[²ëÉ °Õ¶_:pszJJòt`ÿþrr±Sü¸—xüÉEq.ºœ† €‹]Ýεـ©Æ›97ýxGù®rÃZ 11!!6–¶VëÅ…œ?_UU] „‡<ñÄ¢E &“ÙlÞCôð4H¥`Œì`™Ø@MMMM}=PZZZZQè6jŒÏh–ì}¢(ÜpêÃ"1 Ñíd§ób×Cvx€¿¿B1j¼:è ^:ˆ½5vZL pøð?ÿyäPõ ‘µv`û‰-ÒÍ«p€¬¢Øl:öÑ–u©E\5ûdòìã&MŒ˜pª¹\^>Ðn0˜‚éºÀÓèììì$çl²W__WWW455665Ñó%€Á FNì±ÙL&› œ9sölEÀì`ø±Oî_ðÀü{ «Ÿ ôè{í­Ø"Öt‰ €@l0 z=’’’’˜è Ú?üpèPn.pv~…¥J ¼‘ýZö«+‰@¬+€þþþþþ~W¥OFz#‡âZ)“ĺÜ,BîóHptÿÉNÑð%«Û¸¨(Ù^¶¬òIWLðñññ‘É\ $Ašd'Ä'@Ùl‹ÃŒF“ÉbrW}¹àU`L] !è6`îÒ¬´{·v‰ÍÇæãrmÒÇ=·JzèBÏhtm)’˜D¾Ëáp8\®ë½FCïI8ðÝw ûUGµÍ¯ÞñÊ@€ÌßÛßÛµ^2^N.DnD®¿œ Ýt”>:YýëgCOÒgC›JŸ Í " v¹wÍwOžKJJÊ Àú#6×£„ò§¤_AAcÆÐAR,vG %­–>ÛYW×РTR»×x¯J ==1}?0æÆÀŒk¡¿hØÏÕFµQmÀúŠM·méüMþ/(Šéîì˜1G÷ù-–®®înúŒg[P3©6¢~ªH±¥ìæ…eÏÊ> xxyx‰ú][”ÄÕÑý½û3ie\õéh‚è幑¬:t$¯æp;ðSiáÇ…I€r¡zfó&€µ‚¹„ñàwZ‘¨è—…?ijbÓ':À)²™ (wÁ»Â"·È-rà‡õ¹i‡gå««"Ï KåÏ]üN*|•@|Bœ,¶¸Õ8•qËBÀ/Ü×ß×ÿRA&x÷‘œÄûÅÜïd¿Aß°&Ò÷x'éûŸ/Úýˆ ‰IºàþÞÝ„/gÊ쪕{ï‰<»ÒNúýÀÄ@HÆ‹ƒêå}ñïÿæxº;ãäFÌ}3ÿ¾&g?ðÕ¡—ŸÏ¼öö ñô¸òîéB&hw_€+¼;îáŒ;ƒâÄ•vIC]Àµ"ÐP?Ø8ƒƒ1\mèß tºf­ˆo«Ž¿WßÅÒí¦¬¼ñ˰!´aÿhT¸òLV]Ðo\Ðõ‰ëÊ×ÿ,àÑu³BÄǽöèÇeEe@Ñ” *ÍÛ€a›)·'sä.ù]o"Áû!¯Â ¡0bŒâi`Å{ó&&L¼´¶ Lþñ+;ÿ–Ï`<–|‡6úÍ‘ÇÈY?‘Çå:ÿ«F˜Fü†Ìþ‘`p<°‹°"IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-text-x-zsh.png0000644000000000000000000000744512247657030021004 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW°IDATxÚí[{lGþvo÷v÷^ñù|¾ØNÎöÙŽ]Ç&U¨Mj7 ÔTý£P}„´QТ (›Ò(‰@¢éCB B©M›6qÇmš„RZêG'1>¿Îw·÷¾[þ†ÝÛÛõÝ¹Ž #æfvgwæû~óÍoË(Š¢( > KØ¥®Àÿ{øˆ€%\¹âñx<Î*Êéý8ù|aR r€Q2J0ÿ^"mÆ7—ì-d9!hý@=~wX©¬¸{eÐlàšÚADAd˜ÅÛ(0åŽÇŽà_K(Ê ›ZÓ"àC5|ÿ.Ï0K×}H&S©dRQÒét:™¦§gf¦§¡ÐÐ¥A™øíÄ+@ÛòÖ 7°@ǽíŸï¼`Y–eÙÅkGÙüÆõ;þ×UŠòùÙϦ¾8A69 ärŠ’Ëúç©i«?Õ^izîûô×óï+Ì'¹,k±°,`·K’Ó H’$I055551ü½ÿﯿ?䎀EØü\÷Ÿè¤œ”“rןˆ²Ç€ì/2/¦Ÿ&ÖÎ0 SxšÖÿ3o½b|GþU†)ÌQ¯Ùl6›Í33¡Ðä$píÚØØ•+@eeeeU°öÖu[××öívŸdþä~IþÃíÀTl*6ºþþaÙ¨W hãûóKæ—˜ËÞô×´Àë É ! Çq'ñ80::::28v»Ó ´47¯YåüS ’ÿÏÀ«•GC/ßLˆâø?®ó  b3 ÑSbF†¶\1 НÍ׿Ñÿ<ÏóÈr<’ž138v»ËÔŒ,­½McŸ¯Þyt㑟Êä`0¸ðDÌà 5—#"TàõD˜7¦/HQÊžþã8ŽãyÀbaYŽÆÇ'&ÆÆ`·“Øív»Ýn éá–5}xí£¸€™ÜLnzzመ—ééІùùF}Á8]N0Þ8•ÿÏb!ƒ²ÅÂq, ¤Óét&är¹\.Øl’d·6›Íæp±¢²ð¯­ßê#ƒ¯ýé•N MESÑOļ$ÈXçó½šükÆå¦RÈÎÂ;óå)ÿŸ:4Ó1Ábá8Ò#,ê~‚ ¢H’ H`±0 ˾߰ï"P1\‘]öGàÔûB½½þyLÄ %(P=!fDAX ÅÒ¦µ„hëÈ0*à,Ë0 ðæ›o½ÕפR©T*X,<Ïó€Ýn³Ùí€Óér9@ ±imÀœï87ù—[€Ëý£Õ#ÿPÿM+­õþòÝÖè…þ¼4z!2¦Ò‚Þýœ+môŽS{Ç©^ð¬ÅÄb²‹oéòeàÂ… .^TÝÚÀµ&¥ñ8p~ú/_9û½ù´`Þ˜k&Ms•œ?ét&“É@r9 »ž"mŠHV‚,-ù’¤yH&“Édxï½÷Þ{ÿ} ¢¢¢ÂíR×R©Àع±s×Þ.¿% A´ùÿÌäCQŒ-“z5æ\‡ggc1àߨ»÷'?‡ÃnžzêС‡DQA}2¼ áµxIb@DQ—‹L,)Á™ ‰ãñx<"‘H$&&‚Á`¨ÙYûXm0pmð 5ëk³¥£¹`ó€Ò¯ëÿëUÚØA ‡ÃaYöïâ‰Ã‡;îøÌgî¸hmýØÇ:;Ç?xðùçD"‘H& -Þ,¦DÐùÕjµZ­Dûm6Àår¹\.Àçóù–/š›››››ÚÚººÚZ`åHÝåCÀµƒ×ú¯)͘ Ó@–#æ¦Êˆ„b‡Ã±þÙg›nêêÚ°hkkk[µ ðû›š ºº®®¾8pàС^ D¤R¥QN̲êãv»ÝÎD½áß/Å-ÞL~Ì€6–žÙYÕâŸy¸ùæîîööÕ«[[ññ©©ÙYÀé$–ZYY[»b IË–y½ù=b>DPǵðºêÖ2 ‘û,ñj¥]Œ€â¸,…¯)ÖeG"² <öÑøîî-[º»ŽŽŽŽÖV`z:’eµ<žZ¼“ü±±`0<§Ón\.›Mh4K& n¾yýz`õêÎÎÎN §çûßÏ'¢Ô1À¬,‘­µtµ!äGß¿ÿÀgž6mÚ²åÖ[ÎNøXLë&RKW×Z¾ÅB—H}<·Ûá¶nÝ´©£ðû—/w»cÇúû/^l¶Š ¯¨®®©Y±‚ôˆÃ‡Í‰(€%’ 3 õM§3™løêWwïþá-[n»móf`íÚ5kÚÛ™2ÁbYx­…ë§ñÛoÿõ¯##ꢙ×KÈår9EÞzëwFF€ñqÒC._¾refFí 55uu+W>¸k×O¨ Òz\o *{&¬MaEÔž¡Þp™èx½UUn70; …BªõPí¦ÀéËÓ·d³™L.\½úφB€ÕJzDKK àóOE…Ýœ=KˆÉfÓél²¸&I‚ÀóÏ“rÑh$7ÜÐÖÖØHˆµXÌfí´¶Åq)5,ˆi‰0 ¨Å>ýôSOíÙ\º444< ô÷÷õ9d2(z_<žL¦ÓêóGFFG§§ÉÉééhh4M$Y&q4*ËÉ$‰´(â—-³ÛEhiil¬®Þ|³¯¯¯  û÷?úèÎ幡ú1`‰¼ ã bä'‚`µ>úï<ð088008¼ñÆÑ£Ç«§óçß}÷òeàƒ††ÆÇ‰tLMCCÁ jÑë×wvÖ×€ßïõ³³DÊD‘\w8ðÍÍ ÕÕÀ™3§OàEQQ€}ûöî½ÿ~u)Bïç—ê†Rã\„`&Aù{¶êrpþ ¬%‚ç >d2Éd4 œ}êÔÉ“€ÕJ,~ß¾½{·m+¾ØXö_ï™n–/Š´G<òÈŽ@*•LF"À»ïž?îÐÒB,×é”$AÐaµràóUU¹\êâpØl‚44¬\éñ§N8qâ^Q€oû›ß4¾Üù€~j¹¤TàfD¥é‘GöíÛ¾ˆÇc±ÙYàüù³gÏœ†¯p8$IµC§Ïolôû«ª€ÞÞÞÞÞ^²Ñ’Í?¼gÏ}÷Í|©î§Ù†ÏüÂHP~EŒˆ0œ¦éS2I–‘…¤¿þõݻロ¬ÿOOgÎô÷÷÷€=rÒM€x\–É"9PxüxoïÉ“ä‰ðÐC_þò]w‘A>VߓͷØ|Ì2^ï•iqY´1ÀèEfçç©ùt£#“!§R©T*™ ²óDR`×®;3 Ó§‰÷44TU ÄâßxãØ±'€ÑÑ«WGG;¶mÛº•œz À“çÒ=_ú~jå¿^ÐÇ‘±ÄlLÐzEF¤ÅeÑfÂÆTœ£4Ï[­dfJE]ºÈf3™tÈfIÏp»IÏ8tèÀ¯}M}*ÁÒUR‹…xEðùN !?À‚JP¹”\ï` ¼6¯#)—%õ‚J)9×ó㌅[Å>^2;£j¯Ci­ý¯“ ½at|Q›.|º±ýiƒJ„þý;ŒŸWÚ >£üù®ý…’{ñ§Íy6;´[Ø@ócês5ÔìûóO—òOm—š¯}þÜÀÂd~Q:=E H$‰DBQ¢Ñh4-¥ë÷æ& Ò×ÿæ– =ÐÅï3î4ŸâDæ'ʼn0• Ê$è„Ãáp8 °_`ïbvÐê=up£R'\ù¢¤–)ô:h“Ìòk\ìz©¡ÐÀ ïзSQØ]ìì@–eY©§¯‰û«(f__š@?X SuY–eYœ¿tz–áŸ^b†<@£§¡2à¥@/¶§³t?È 3ƒ àþ›û»î²Oþ–|ùÒÆnWq¤„èƒ)´¸Ð¶|¶éƒÖiàÕͯ]}å%@¾Qþ•|Èùru9·ÑÀ6?ï`±Ë•˜3ÉÄ×n—ßÅ£«¿²¦°Nê÷ÆÀÿç9Å*LÇ€x<Çÿý¥|\ítq‹JÕÿKEršš.i8‡Ã¡æÓï‘AÁ\JþP›zAúÕD3¿ú=PÁ¥®®mÑ5&Žã¸â’\ö—ò…… ÿ×Ò>(’IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.rn-realmedia-vbr.png0000644000000000000000000001626012247657030025162 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW;IDATxÚí[ixTåÙ¾gß“™Éd²¯dƒ•@ÙwA–JAmÕÚª­´VDÛÒ*µV+E+|î¨ÐŠ¢(Ù"°&ÙÉFB23™ì™%“Ù·óýx}=‹ U¿~×åóç½ÞÉ™3ç<÷óÜÏö†Ã0 Ã0ø/^§×éu2ŒP*” ¥Îÿõó|]áÿ_?«ÕjµZÆh6š»j€¡“hp°Œ±F[f‘¹Ö|püÜù€ÃøÏjý{ï=ž§½ÓGßa„;Džø“y¹ü•€l»ô5™PyÔ¹êY€ºCÕ­> „ÉÕ^ ˆUǪãò¥R©T*¿?9ß·ª Õús Ó¸«I©Ð¥ê÷uÞßÖ 2kÇêÆeÊݪWÃò;d¿”¯S„“„¹¯˜[Â-8&މkF?0È0Á Ì fs€`{ðR°`Am0p†:ýN5`‹ ŒË?-ÌÇŽ-¯·ÿ æ9Á @Â`üý‰€Ì[3#Æâ§ÅMM˜ñíó@0L SÛY]TY«+/¾ Äl)޽˜ðpþw¡ù!KCóN%§’S ¸Ýn·Ë˜L&“ɘLf³É  °{—Ëét:Çëõx®z!‡Ãáyyyy&jµJp8Ã~ à÷Ók‰D,–H‘H$‰ÿ‡Ýþ"`8i8Ô\®n;Új†‡÷Xfù¯å t@'7)À<Ü80ß:íeíem- srÊiÛñý@®"{jþv saæ=™g7g7wà÷ûý>àóùý~?PRRRR\ ètz½N„ì Yj&¿<É:y&“kbE®"7d õI}RU‡£ÓémÕ sèÐáw–3gΘ1kÌ fs“ÿ8µõø@^!Û)Ÿ ¸¶¹_t¯|ïúª½ii©©@||\\\ —+ €õxó( SuFw,:ßԯ갳¬3çd)acÆ¥ÞüÍøÖ(û[ùæ3Ï0LOgï!c<°Ä{sòÒr/á%üpËÜ2·ÐWë«uˆˆˆˆˆ@( E" ƒA «Ëh4€††úúº: óXçóº(`P;0oè§@Ã3 Ï\êÚÛÛ‘ܑܑ\À%t ]B`çÎ;wìòòòóóòXŠ:tèСÇA‹`6?X¿ó‘I®¸\.—Ëåp†‚&ÿPaš_kÞÙ´ hx½á§uf@ðð_Â`üøÌ̬,@­V«Õj€/çÉøÑ@…¯ÂW$E&k“†›ÄS¥Ó„_ˆÿ€“u§ºÀ0Áð`?ók`rjáô)vÀepw¹ €^o0èõÀÙ góÎL¤^Iµt7`yÀú‚¥ HÿQÚšŒ@ZZZZz: •J$R)¡ hhhhhhŽ----ÚÚ::t:€Ëåpx<–²òòrr²³»îZ»vÍÀçóù|>Àb1›­VàñÇ7nܸ éãô»Ïžíî]À3—ÿ:ü×aàÇSW¥ýx*`kµÉm­€©Íd >]z$õp xAð¢p ™9vì¸q€T*“Éå@ÜŸbÿ· ¨;]·»&PîS5ª3–OŸ;ëþ¯â†èëëïïëc˜òmå¿9í½½ðä’›k•µÊZE8|høôÓ’’ÇÛ­^qûl !;>%q2‡csÙ\Æ9W®þÜûÀÃC¿xX Lûdú¡éwÞ¹víw±±1111ÄC ††€––Ë—ÛÚ€`xNNNVVf&Àãñx<ûœûöíßœ— (ryH ‘H$b1{¿@€èƒaàô}<¯×ëü~âY<Ÿ/N§Ã12hµZmDáÖº"•ÀeOÛ‚V+°té-X>ëúÜp`4v »rñ.ÑÑ.`°i i àó€ÍR.{/¿ÒªŠ?åÏf˜–Üæg›/¾·ý%¾Í@™¡ÌPþ6°øe-_(•*•R h4*•JÄÆÆÅÅÆ²¿ë÷“ M-ÿßA¿3Œ×K¤ÑJ4¶¶¶¶ŽÀbl6›md8y²´ôèQ ?„Ü\3qæq{㞊kbF/þ€YÌ}$–EEÝÝÝÝÝÝ@êú”GÒÖ]Ïo3tþñez¼a¸wâ1ÎF·œ-€×ëóy½„{½^ ++33;2Ešz€BÁ$Uá_€9•³ sd€H$š,¿/ùÝÑ%äžÄòˆR·Z‰‚‡†IZ©TËôùX põþê•Þw÷î>øè# ³S¯×ëYÊR« àuuµµuu@FÆøñÙÙ@¤2âHø€Ñ1 òÊY€ŒŸd$f8€ˆ­ ¿¼ßÏ÷_«l¹¾o˜‚nþdˆa 3&mš<°ÕÛêmg³Ùb1›ñyf,‰Å"qU·°Zm¶áaÀb±Z­VàĉcÇŽ”JF£êë/]jjzzº»{zX˦ϹjÕÊ•·Þ ,Z4þœ9¯—p³@´µ]¹ÒÙɘœœ˜˜p¹<— |>ôôôõ GŽ””;tvêtz=püø‘#ÅÅ@nîĉ“'“4T.4š°0µˆZ93|°(j~ü¼(b V+˜Ÿ˜D‰>Ý´pZ9-K€¥X²yYâw@A“´]¨NÜ{úÅãÏ‹#FÜ Øív»ÝN‚”Ý0 )Œž~ëÖ­[Y …Da••gÏ–•K–,_¾|9 ú| ‹Åb1˽$]¦M›2eòdr§‹IUTtàÀ¡CÀ©SeegÏb1 Ž.yŽÙ³§OŸ6 ˜1ƒ¬jµJ Ü~ûêÕ+W²@FF†…)•€ø¢ôôp1X›ÚËx+e+TËB—Ëív»iëÈÌÌÌ?(^Zœh'° quÑ]_­Çÿ8 }¾áOüýV†Iצ=ñ07dŽj®”-¨Ù´±¡áÒ¥úzÀ8¦»¥;xfáÓ[ŸYÈÀår8Á ˆÏ'øýÀܹsæÌ›äççåeg³ ðù|¾@ظñÉ'ŸzŠJ"‘J¥Râ|> ž^/À0$6L˜Ìš5cÆôé$(K¥·›Y¡ ÞQQ¤n T˜œœ””œL*îü|àSÕ§ŠÃ@ç˺ùÀ/×>°oÝaä%¶ÞøÖ<@_¯¯××3ŒYeÖXô@wdOLO8°gçÞw>x¸õÖåËW®¢££¢bb€öö+WÚÚˆóò€œ@nn.ôÜmîþ)`µŽŒØí@X±@ŸX>À0v;PX8iRA`6“V„JE8{÷î÷ßß½P(Äb>Ÿ6õ€ÁÁÞ^£ñ3+ã@är $„ÄòòŠŠsç€òò³gÏn¾yá €yófÏž1ƒkŽ|7d)ì–[/¾åö¾ï½÷î»ï¼´Ä·Å´kL` ƒí€Î®³ëì@\ . @0 ¡Jˆoì„[æÀÖƒÞÿOÀ¶Ø~qd*`?îXá< ôõõõõö²ŸßOšl"q}ï‹ÀPCCCBBCI:ÉRÁÐÕe05555UU$v]¹’ 1݉@ÃKo¶¼Å& "i©$>ŸLx67?Ǭ~yÕm«_þ"R)¡È¯ µ| @UUõ•ª* þÙ†žúg¤‡’‘¼hjjnnld]”Š×Ë4áz‡¬I86%%%%=ˆŒŒŒŒŒ”ÊÐP¥’(<$„ Î×*ò‹Üêõz½^/ÃP¡- ›Íf³ÙHf±°žh0 Iw€@ÀïHVg±JÅÆ™L*•Éà4]¶Ù€®Â®¼ž óEÃÆ®ÇÅ,ܶ0øÅ”ŸåÝû2©°e²€¾µèψgÄlÉzáàßW7«­_ܘž°¼fzèïèï'®éñ©d©en=PÿÓlŠzB @€¡½¢ÐÐÐÐÀãq»½^Àét»N‹ü~ <\« š›››[Z€¬¬ñãÇ:::;;;ÜÜÜÜœ`hˆ´J¨¥Ÿ{´jnÝB ëÏ™‡ÆËü±Ä€´uY k[Y[Y[ðÞïÞ_óîsÀjË*ëm€}§ó´}'`4vwwu±”tüøÉ“g΂ãü*þ»@ÖòqÛ2hRÔUŠÍ›+6¥ºR]©à¹ø#<¸6éž„;H c=D,&TC[^/ápÚ«¡@ÛÒr¹L¦PH$¬G&&&&&&²Ôd6›ÍfóÕIbÍûµÚðp­–dc. xWWW—Ñ„‡“º†ê¶ù½–¿Öm~¨ò—ÀŒ[§M6õ‚°Ûív»Ý,Ô#j u{j @ÑŽOJ÷–>uËSËÿh##òÃ@_QÿÞ},Çwt§¡áÒ¥æf çO½ ¦QÕÚ$m x]¾A¶¨åÖ ÕݨDÊdEpùrKKk+±\‹…UXx¸VN™hµ¤F¥–Mä÷“a·;v;¤ív’…©T„j¨ê¢£££££¹\.—ÉXÀ"#I0§ß§I‚B!—+$† ³€%%%%¥¤ç«+‹k€Ûß,zcõ7Â× Æví(ïtu”û2?~{ï_Ù2é«Ò(`Nï쮹Í@¨S%Õ–c–ã–£€ÅB*g“‰(´§‡äÝýýýýƒƒ€PH,<%%991‘µèŽŽÎN½(---=yî𯬂yÙù§‚×Äë¤ËŸ? H$¤`S( ™Œ(J&#AX¡BBBBär–¢èûQ*¡õŒFC—‹Œ" å8‡ËŒŒØí6áv†ø|8+œN—Ëᆇ  ™Lxâ‘T¡UÊs!gå­!««ØŠ™R ¾år£Ñhìîfƒ5fk³gÏš5o°nÝ#lØð-0Zˆe²€PÞ ƒÞ \Wí»X´?Ö¾µ½ðÚ}c½—Ô¦>–2D–F4F~„”+ß }o½¡¸ «Eéb5À½—÷3î½ó4ó"óôU]Ð ²ÀÀ»Ús›w5àcüV¿p=ä^âºùÈVd+쿱ß?²0¯·¬µ¬:ÏvÈ;.Þ'ýQþeÇ{GxàÞâÞî]ôÖ÷=Ø»àiøj~ ]¡¢Y¨ã•w+W‘µÒü´&BBØôY,&uLh¨R©V¯¾º}ûŽß£…m É¢®¿Z,V½Å´[Û‚m\ O×Ó÷`zÓüª)°$[þiÎ-Ž c?àëðûªïßÞ<¶G›pÂÁ{€ÿ¨à>þÓ€,MÙÀ2M9¨š¨yª4õL@ËhWEÌ’lI!I6@© *•ìý(ÇÓX3Ø:4bj®Ttìéð-Vq«¨ÕÔ¯¯ºç÷úzc€Ä;ãî‰yˆsô@EÅ… UUijŽï€¯òê”Ó©âè~töòùpýª~ ÀÞ—ME¹œ®ThÚJóùÑ3Ý€îéýÉçìÉs1̉öSO]¶þë¥ÖW^úö¿Þ׌“˜46¶¶¶·³|ï³èƒÓ-ôE®]©áŒ^GËh FWÄŒŸñ3~ÀËõr}N€çáyx¡€ËⲸ‚€Élæ[€öÁózÀä73f0Xº¢Œ© SýaõÚê+@KCÛm@.ž".¤[%ýâÛ¤ö¸¸˜wïßµâ¾$ íníéêéb˜Òǯœ¨NÅŸÙæ@·K÷3ýÀ¶ÙYìh¼¿ràÙÿ}Ãøí w÷5îK€¸Q\$ú2“™)€È$:/*Dkø÷ñï¤Se“d€,D2M2МÐÔ©ÛñÑJÑ vÚßßßßÛ ’ÂÎã!½§èh ±ñò厎CAfN§c˜§KŸ}ó¹^ íÉ+¿nD <]“hfªïP¯$é)dHzHÓDïÚÊ”Ç#ƒvO]ýÚ=—ËãO =já,5‘–@ @Tù|$§•,=hEó{–®½ž~Î õz`‹\Çájòù¼^Ÿìö襤8Úd®¬¼p¡²’¼— X­Ëð0Û$¤Çpš›ÛÛu:Þ¦M›6mÚÌš<þÂ…›6%¿”ôAìS@ÒÝqœ˜ Še R+WÚÛÛÚÈÌ—ÇNœ8qâÔ)òb1päHqqI ªP‡!§¨>|èPq1 “‘>~IÉ‘#G²/|âDié‰l—³¬ìÌ™²2²€òrvp#.œ?_YIö"P]]UU]MŽŸH¥€^¯Ó lšI+nzj‚Ã!Py½8¹\.—ËÈȨ¨ˆ£<Àl&iðƒþâ?ÿùŸÿü¹ääLœXXÈ0wܱzõòå¤wsø0« —Ëét¹Ø “†¶«›c|>´®^¯r£Wú=b“_ ÂW[09I7ÚÒ¿Ùç_IIŸg6f §ŶDȵÀ•+¤'$•@iŒêwp°¿ßdzCM­æZàÜÎÓM§:¿$SÅÓJ*^"!£¾‘RzS‹¦Í1>ÿZ †‡Éu*ݦ$ú=›mdÄfcÛÃ,±ÇL ¯¯··¿Ÿ}>JM~¿ßO‡ðÛÝŒgϽž´DH ãzBgÔ*9G[”‚¸\â”zrbÕá ¤ÝNF£Ò·¤Sdš«¿ÞRÑàAgŸR)„ =¨DÓ44­¸\ú Ô²XÎ'*áJ:iºúº«?gWÊÆD(WSéuôóo[FwWéé‹ÑžBÏ!Ñc.8¯—ŒNs_ÉžžÃÞ÷¿æÿþÛe´âé>$+½½====ÄSûúØàÍwˆŽI>nY³¸bq{ßøLFxô`M/©ÂiïˆÆD¡P ‰ØŠÞf#ƒÚ ¾(z^ü" -Žx+r90'eÖ/gže+‚ÿ:’#£k€í€_+ô:½žË ¸\ àré7¶gDÒïÑ•ŠÍfµ>_ à󑬄VÒ>{]o/™QÓJ›a®=ÀE¥³³££³“].—Ëåv“™´PÈûé&†$ tŸ”Dæ4™ÈÈ;6=ý½œœÜÜìlÖ_ÓÒ22ÒÒØ¡~L Éžl6»Ýéäw+g©ozÔ¯5ËÆS-ÛÚ·—ršÿÔú$0qÆÄ•…vþqû¹7N¯>ñ?—·îáp´±áòpù×8=º8þüù Øü—ŽÚÆŽ;vìX6-¤'€æÄWyá\MI$7¡ÿˆAÎ̱¤åv“†*žV¢¾UÞe¾å€ÿOøŸ˜bæ¼x—ùæú ä †I‚ö´Þÿ«þ×&$0Î?ð?xŽù-à‘û"}IsWàaÿïo¸oŠ6 É“8Ä€ìqY²<(’²@57T¢ú wwÜ¢ØI@ª;eiŠHR'º4@ÚŒÔ%©K€¯RðWÉucí.ÒÿŠ‹KHˆú·˜~fÚ¸âžïMê64–µÕ‚ülÞ8@Ð!úX´f‹¹# N[E>@¸Np(Ë啲&@rBò7ñÇ€8^²L2ˆJW _H‡¥?’I­$Jú.¢P\RôÂWD?íÄÄáb Ø(?)»ÍB…ÈH"%¡âD@þÙlr…Ñ@-}Jò ÓH¹R. lùEd!ÒJéù/Q\€oT­__¾ÄHoúÌæ’‚m‚,!Xû¯Û]k4@aÈÄEwɱIã’Æ®€+àþÿùÿÜÿ¡dgLšÄ0?Çý¸ 3%}ÆÀLÃìiÜ{`ß_†X®×þa½±õ ÔÚvåQíÀNó›Ž7{´q©·¤üáËþ®ä ¼i}õþW^R'¥$ŽÑü øï\¨+ìÚ³ûÈû¯ÿ@1ß÷úy¦£ÀëcÿA¾ùÞ‡ò?ȵò4no"ÿ A(Ú„åê«IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxFilterEditor.js0000644000000000000000000006425012247657030020673 0ustar rootroot/* -*- Mode: java; tab-width: 2; c-label-minimum-indentation: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* Cyrus: comparator-i;ascii-numeric fileinto reject vacation imapflags notify envelope relational regex subaddress copy */ var sieveCapabilities = []; var filter; var selectedRuleDiv = null; var selectedActionDiv = null; var fieldLabels; var methodLabels; var operatorLabels; var operatorRequirements; var methodRequirements; var flagLabels; var mailboxes = []; function onLoadHandler() { setupConstants(); setupEventHandlers(); if (window.opener) sieveCapabilities = window.opener.getSieveCapabilitiesFromEditor(); if (!window.opener || filterId == "new") { setupNewFilterData(); } else { filter = window.opener.getFilterFromEditor(filterId).evalJSON(); } if (!window.opener || window.opener.userMailboxes) { setupFilterViews(); } else { loadMailboxes(); } } function loadMailboxes() { var url = ApplicationBaseURL + "Mail/0/mailboxes"; triggerAjaxRequest(url, onLoadMailboxesCallback); } function onLoadMailboxesCallback(http) { if (http.readyState == 4) { // log("http.status: " + http.status); if (http.status == 200) { checkAjaxRequestsState(); if (http.responseText.length > 0) { var jsonResponse = http.responseText.evalJSON(true); window.opener.setupMailboxesFromJSON(jsonResponse); } } setupFilterViews(); } } function setupConstants() { fieldLabels = { "subject": _("Subject"), "from": _("From"), "to": _("To"), "cc": _("Cc"), "to_or_cc": _("To or Cc"), "size": _("Size (Kb)"), "header": _("Header") }; methodLabels = { "addflag": _("Flag the message with:"), "discard": _("Discard the message"), "fileinto": _("File the message in:"), "keep": _("Keep the message"), "redirect": _("Forward the message to:"), "reject": _("Send a reject message:"), "vacation": _("Send a vacation message"), "stop": _("Stop processing filter rules") }; operatorLabels = { "under": _("is under"), "over": _("is over"), "is": _("is"), "is_not": _("is not"), "contains": _("contains"), "contains_not": _("does not contain"), "matches": _("matches"), "matches_not": _("does not match"), "regex": _("matches regex"), "regex_not": _("does not match regex") }; flagLabels = { "seen": _("Seen"), "deleted": _("Deleted"), "answered": _("Answered"), "flagged": _("Flagged"), "junk": _("Junk"), "not_junk": _("Not Junk") }; for (var name in mailTags) { flagLabels[name] = _( mailTags[name][0] ); } } function setupEventHandlers() { var filterName = $($("mainForm").filterName); if (filterName) { var boundCB = onFilterNameChange .bindAsEventListener(filterName); filterName.observe("change", boundCB); } var matchTypeSelect = $("matchType"); if (matchTypeSelect) { var boundCB = onMatchTypeChange .bindAsEventListener(matchTypeSelect); matchTypeSelect.observe("change", boundCB); } var filterRules = $("filterRules"); var boundCB = onFilterRulesDivClick .bindAsEventListener(filterRules); filterRules.observe("click", boundCB); var ruleAdd = $("ruleAdd"); if (ruleAdd) { var boundCB = onRuleAddClick.bindAsEventListener(ruleAdd); ruleAdd.observe("click", boundCB); } var ruleDelete = $("ruleDelete"); if (ruleDelete) { var boundCB = onRuleDeleteClick.bindAsEventListener(ruleDelete); ruleDelete.observe("click", boundCB); } var filterActions = $("filterActions"); var boundCB = onFilterActionsDivClick .bindAsEventListener(filterActions); filterActions.observe("click", boundCB); var actionAdd = $("actionAdd"); if (actionAdd) { var boundCB = onActionAddClick.bindAsEventListener(actionAdd); actionAdd.observe("click", boundCB); } var actionDelete = $("actionDelete"); if (actionDelete) { var boundCB = onActionDeleteClick .bindAsEventListener(actionDelete); actionDelete.observe("click", boundCB); } } function onFilterNameChange(event) { filter.name = this.value; } function onMatchTypeChange() { var matchType = this.value; filter.match = matchType; var container = $("filterRulesContainer"); var otherContainer = $("filterActionsContainer"); var otherContainerTop; if (matchType == "allmessages") { container.hide(); otherContainerTop = 130; } else { container.show(); otherContainerTop = 240; } otherContainer.setStyle({ top: otherContainerTop + "px" }); } function onFilterRulesDivClick(event) { setSelectedRuleDiv(null); Event.stop(event); } function onFilterActionsDivClick(event) { setSelectedActionDiv(null); Event.stop(event); } function createFilterRule() { return { field: "subject", operator: "contains", value: "" }; } function createFilterAction() { return { method: "fileinto", argument: "INBOX" }; } function setupNewFilterData() { var newFilterTemplate = $({ name: _("Untitled Filter"), match: "any", active: true }); newFilterTemplate.rules = $([ createFilterRule() ]); newFilterTemplate.actions = $([ createFilterAction() ]); filter = newFilterTemplate; } function setupFilterViews() { var filterName = $("mainForm").filterName; if (filterName) { filterName.value = filter.name; if (filterId == "new") { filterName.focus(); $(filterName).selectText(0, filterName.value.length); } } var matchTypeSelect = $("matchType"); if (matchTypeSelect) { matchTypeSelect.value = filter.match; } if (filter.match != "allmessages") { var filterRules = $("filterRules"); if (filterRules && filter.rules) { for (var i = 0; i < filter.rules.length; i++) { appendRule(filterRules, filter.rules[i]); } } } onMatchTypeChange.apply(matchTypeSelect); var filterActions = $("filterActions"); if (filterActions && filter.actions) { for (var i = 0; i < filter.actions.length; i++) { appendAction(filterActions, filter.actions[i]); } } } function appendRule(container, rule) { var ruleDiv = createElement("div", null, "rule", { rule: rule }, null, container); var boundCB = onRuleDivClick.bindAsEventListener(ruleDiv); ruleDiv.observe("click", boundCB); ensureRuleRepresentation(ruleDiv); return ruleDiv; } function onRuleDivClick(event) { setSelectedRuleDiv(this); Event.stop(event); } function setSelectedRuleDiv(newDiv) { if (selectedRuleDiv) { selectedRuleDiv.removeClassName("_selected"); } selectedRuleDiv = newDiv; if (selectedRuleDiv) { selectedRuleDiv.addClassName("_selected"); } } function ensureRuleRepresentation(container) { ensureFieldRepresentation(container); ensureOperatorRepresentation(container); ensureValueRepresentation(container); } function ensureFieldRepresentation(container) { var fieldSpans = container.select("SPAN.fieldContainer"); var fieldSpan; if (fieldSpans.length) fieldSpan = fieldSpans[0]; else { while (container.firstChild) { container.removeChild(container.firstChild); } fieldSpan = createElement("span", null, "fieldContainer", null, null, container); } ensureFieldSelectRepresentation(container, fieldSpan); ensureFieldCustomHeaderRepresentation(container, fieldSpan); } function ensureFieldSelectRepresentation(container, fieldSpan) { var fields = [ "subject", "from", "to", "cc", "to_or_cc", "size", "header" ]; var selects = fieldSpan.select("SELECT"); var select; if (selects.length) select = selects[0]; else { select = createElement("select"); select.rule = container.rule; var boundCB = onFieldSelectChange.bindAsEventListener(select); select.observe("change", boundCB); for (var i = 0; i < fields.length; i++) { var field = fields[i]; var fieldOption = createElement("option", null, null, { value: field }, null, select); fieldOption.appendChild(document .createTextNode(fieldLabels[field])); } fieldSpan.appendChild(select); } select.value = container.rule.field; container.rule.field = select.value; } function onFieldSelectChange(event) { this.rule.field = this.value; var fieldSpan = this.parentNode; var container = fieldSpan.parentNode; ensureFieldCustomHeaderRepresentation(container, fieldSpan); ensureOperatorRepresentation(container); ensureValueRepresentation(container); } function ensureFieldCustomHeaderRepresentation(container, fieldSpan) { var headerInputs = fieldSpan.select("INPUT"); var headerInput = null; if (headerInputs.length) { headerInput = headerInputs[0]; } if (container.rule.field == "header") { if (!headerInput) { headerInput = createElement("input", null, null, { type: "text" }, null, fieldSpan); headerInput.rule = container.rule; if (!container.rule.custom_header) container.rule.custom_header = ""; headerInput.value = container.rule.custom_header; var boundCB = onFieldCustomHeaderChange.bindAsEventListener(headerInput); headerInput.observe("change", boundCB); headerInput.focus(); } } else { if (headerInput) { if (container.rule.custom_header) container.rule.custom_header = null; fieldSpan.removeChild(headerInput); } } } function onFieldCustomHeaderChange(event) { this.rule.custom_header = this.value; } function ensureOperatorRepresentation(container) { var operatorSpans = container.select("SPAN.operatorContainer"); var operatorSpan; if (operatorSpans.length) operatorSpan = operatorSpans[0]; else operatorSpan = createElement("span", null, "operatorContainer", null, null, container); ensureOperatorSelectRepresentation(container, operatorSpan); } function ensureOperatorSelectRepresentation(container, operatorSpan) { var operators = determineOperators(container.rule.field); var ruleField = container.rule.field; var selects = operatorSpan.select("SELECT"); var select = null; if (selects.length) { select = selects[0]; if ((ruleField == "size" && !select.sizeOperator) || (ruleField != "size" && select.sizeOperator)) { operatorSpan.removeChild(select); select = null; } } if (!select) { select = createElement("select"); select.rule = container.rule; select.sizeOperator = (ruleField == "size"); var boundCB = onOperatorSelectChange.bindAsEventListener(select); select.observe("change", boundCB); for (var i = 0; i < operators.length; i++) { var operator = operators[i]; var operatorOption = createElement("option", null, null, { value: operator }, null, select); operatorOption.appendChild(document .createTextNode(operatorLabels[operator])); } operatorSpan.appendChild(select); } if (container.rule.operator && operators.indexOf(container.rule.operator) == -1) { container.rule.operator = operators[0]; } select.value = container.rule.operator; container.rule.operator = select.value; } function onOperatorSelectChange(event) { this.rule.operator = this.value; var valueSpans = this.parentNode.parentNode.select("SPAN.valueContainer"); if (valueSpans.length) { var valueInputs = valueSpans[0].select("INPUT"); if (valueInputs.length) { valueInputs[0].focus(); } } } function determineOperators(field) { var operators; if (field == "size") { operators = [ "under", "over" ]; } else { var baseOperators = [ "is", "contains", "matches" ]; if (sieveCapabilities.indexOf("regex") > -1) { baseOperators.push("regex"); } operators = []; for (var i = 0; i < baseOperators.length; i++) { operators.push(baseOperators[i]); operators.push(baseOperators[i] + "_not"); } } return operators; } function ensureValueRepresentation(container) { var valueSpans = container.select("SPAN.valueContainer"); var valueSpan; if (valueSpans.length) valueSpan = valueSpans[0]; else valueSpan = createElement("span", null, "valueContainer", null, null, container); ensureValueInputRepresentation(container, valueSpan); } function ensureValueInputRepresentation(container, valueSpan) { var inputs = valueSpan.select("INPUT"); var input; if (inputs.length) { input = inputs[0]; } else { input = createElement("input", null, "textField"); input.rule = container.rule; var boundCB = onValueInputChange.bindAsEventListener(input); input.observe("change", boundCB); valueSpan.appendChild(input); } input.value = container.rule.value; ensureFieldValidity(input); } function ensureFieldValidity(input) { var valid = ensureFieldIsNotEmpty(input); if (valid && input.rule.field == "size") { valid = ensureFieldIsNumerical(input); } return valid; } function onValueInputChange(event) { if (ensureFieldValidity(this)) this.rule.value = this.value; else this.rule.value = ""; } function ensureFieldIsNumerical(input) { var valid = !isNaN(input.value); if (valid) { input.removeClassName("_invalid"); } else { input.addClassName("_invalid"); } return valid; } function ensureFieldIsNotEmpty(input) { var valid = !input.value.blank(); if (valid) { input.removeClassName("_invalid"); } else { input.addClassName("_invalid"); } return valid; } function appendAction(container, action) { var actionDiv = createElement("div", null, "action", { action: action }, null, container); var boundCB = onActionDivClick.bindAsEventListener(actionDiv); actionDiv.observe("click", boundCB); ensureActionRepresentation(actionDiv); return actionDiv; } function onActionDivClick(event) { setSelectedActionDiv(this); Event.stop(event); } function setSelectedActionDiv(newSpan) { if (selectedActionDiv) { selectedActionDiv.removeClassName("_selected"); } selectedActionDiv = newSpan; if (selectedActionDiv) { selectedActionDiv.addClassName("_selected"); } } function ensureActionRepresentation(container) { ensureMethodRepresentation(container); ensureArgumentRepresentation(container); } function ensureMethodRepresentation(container) { var methodSpans = container.select("SPAN.methodContainer"); var methodSpan; if (methodSpans.length) methodSpan = methodSpans[0]; else { while (container.firstChild) { container.removeChild(container.firstChild); } methodSpan = createElement("span", null, "methodContainer", null, null, container); } ensureMethodSelectRepresentation(container, methodSpan); } function ensureMethodSelectRepresentation(container, methodSpan) { var methods = [ "redirect", "discard", "keep" ]; if (sieveCapabilities.indexOf("reject") > -1) { methods.push("reject"); } if (sieveCapabilities.indexOf("fileinto") > -1) { methods.push("fileinto"); } if (sieveCapabilities.indexOf("imapflags") > -1) { methods.push("addflag"); } methods.push("stop"); /* TODO: those are currently unimplemented */ // if (sieveCapabilities.indexOf("notify") > -1) { // methods.push("notify"); // } // if (sieveCapabilities.indexOf("vacation") > -1) { // methods.push("vacation"); // } var selects = methodSpan.select("SELECT"); var select; if (selects.length) select = selects[0]; else { select = createElement("select"); select.action = container.action; var boundCB = onMethodSelectChange.bindAsEventListener(select); select.observe("change", boundCB); for (var i = 0; i < methods.length; i++) { var method = methods[i]; var methodOption = createElement("option", null, null, { value: method }, null, select); methodOption.appendChild(document .createTextNode(methodLabels[method])); } methodSpan.appendChild(select); } select.value = container.action.method; } function onMethodSelectChange(event) { this.action.method = this.value; var methodSpan = this.parentNode; var container = methodSpan.parentNode; ensureArgumentRepresentation(container); } function ensureArgumentRepresentation(container) { var argumentWidgetMethods = { "addflag": ensureFlagArgRepresentation, "fileinto": ensureMailboxArgRepresentation, "redirect": ensureRedirectArgRepresentation, "reject": ensureRejectArgRepresentation, "vacation": ensureVacationArgRepresentation }; var widgetMethod = argumentWidgetMethods[container.action.method]; var spanClass = container.action.method + "Argument"; var argumentSpans = container.select("SPAN.argumentContainer"); var argumentSpan; if (argumentSpans.length) { argumentSpan = argumentSpans[0]; if (argumentSpan && (!widgetMethod || !argumentSpan.hasClassName(spanClass))) { container.removeChild(argumentSpan); container.action.argument = null; argumentSpan = null; } } else argumentSpan = null; if (!argumentSpan && widgetMethod) { argumentSpan = createElement("span", null, ["argumentContainer", spanClass], null, null, container); widgetMethod(container, argumentSpan); } } function ensureFlagArgRepresentation(container, argumentSpan) { var flags = [ "seen", "deleted", "answered", "flagged", "junk", "not_junk" ]; for (var i = 1; i < 6; i++) { flags.push("label" + i); } var selects = argumentSpan.select("SELECT"); var select; if (selects.length) select = selects[0]; else { select = createElement("select"); select.action = container.action; var boundCB = onFlagArgumentSelectChange.bindAsEventListener(select); select.observe("change", boundCB); for (var i = 0; i < flags.length; i++) { var flag = flags[i]; var flagOption = createElement("option", null, null, { value: flag }, null, select); var label = flagLabels[flag]; flagOption.appendChild(document.createTextNode(label)); } argumentSpan.appendChild(select); } /* 1) initialize the value if null 2) set the SELECT to the corresponding value 3) if value was not null in 1, we must ensure the SELECT contains it */ if (!container.action.argument) container.action.argument = "seen"; select.value = container.action.argument; container.action.argument = select.value; } function onFlagArgumentSelectChange(event) { this.action.argument = this.value; } function ensureMailboxArgRepresentation(container, argumentSpan) { var selects = argumentSpan.select("SELECT"); var select; if (selects.length) select = selects[0]; else { select = createElement("select"); select.action = container.action; if (!container.action.argument) container.action.argument = "INBOX"; var boundCB = onMailboxArgumentSelectChange.bindAsEventListener(select); select.observe("change", boundCB); var mailboxes = (window.opener ? window.opener.userMailboxes : ["INBOX" ]); for (var i = 0; i < mailboxes.length; i++) { var mailbox = mailboxes[i]; var mboxOption = createElement("option", null, null, { value: mailbox }, null, select); mboxOption.appendChild(document.createTextNode(mailbox)); } argumentSpan.appendChild(select); } select.value = container.action.argument; container.action.argument = select.value; } function onMailboxArgumentSelectChange(event) { this.action.argument = this.value; } function ensureRedirectArgRepresentation(container, argumentSpan) { var emailInputs = argumentSpan.select("INPUT"); var emailInput = null; if (emailInputs.length) { emailInput = emailInputs[0]; } if (!emailInput) { emailInput = createElement("input", null, "textField", { type: "text" }, null, argumentSpan); emailInput.action = container.action; if (!container.action.argument) container.action.argument = ""; var boundCB = onEmailArgumentChange.bindAsEventListener(emailInput); emailInput.observe("change", boundCB); emailInput.focus(); } emailInput.value = container.action.argument; } function onEmailArgumentChange(event) { this.action.argument = this.value; } function ensureRejectArgRepresentation(container, argumentSpan) { var msgAreas = argumentSpan.select("TEXTAREA"); var msgArea = null; if (msgAreas.length) { msgArea = msgAreas[0]; } if (!msgArea) { msgArea = createElement("textarea", null, null, { action: container.action }, null, argumentSpan); if (!container.action.argument) container.action.argument = ""; var boundCB = onMsgArgumentChange.bindAsEventListener(msgArea); msgArea.observe("change", boundCB); msgArea.focus(); } msgArea.value = container.action.argument; } function onMsgArgumentChange(event) { this.action.argument = this.value; } function ensureVacationArgRepresentation(container, argumentSpan) { } function onRuleAddClick(event) { var filterRules = $("filterRules"); if (filterRules) { var newRule = createFilterRule(); if (!filter.rules) filter.rules = []; filter.rules.push(newRule); var newRuleDiv = appendRule(filterRules, newRule); setSelectedRuleDiv(newRuleDiv); filterRules.scrollTop = newRuleDiv.offsetTop; } Event.stop(event); } function onRuleDeleteClick(event) { if (selectedRuleDiv) { var ruleIndex = filter.rules.indexOf(selectedRuleDiv.rule); filter.rules.splice(ruleIndex, 1); var nextSelected = selectedRuleDiv.next(); if (!nextSelected) nextSelected = selectedRuleDiv.previous(); selectedRuleDiv.parentNode.removeChild(selectedRuleDiv); setSelectedRuleDiv(nextSelected); } Event.stop(event); } function onActionAddClick(event) { var filterActions = $("filterActions"); if (filterActions) { var newAction = createFilterAction(); filter.actions.push(newAction); var newActionDiv = appendAction(filterActions, newAction); setSelectedActionDiv(newActionDiv); filterActions.scrollTop = newActionDiv.offsetTop; } Event.stop(event); } function onActionDeleteClick(event) { if (selectedActionDiv) { var actionIndex = filter.actions.indexOf(selectedActionDiv.action); filter.actions.splice(actionIndex, 1); var nextSelected = selectedActionDiv.next(); if (!nextSelected) nextSelected = selectedActionDiv.previous(); selectedActionDiv.parentNode.removeChild(selectedActionDiv); setSelectedActionDiv(nextSelected); } Event.stop(event); } function savePreferences(event) { var valid = true; var container = $('filterRulesContainer'); if (container.visible()) { var rules = container.select("DIV#filterRules DIV.rule"); if (rules.length == 0) { onRuleAddClick(event); valid = false; } else { var inputs = $$("DIV#filterRules input"); inputs.each(function(input) { if (input.hasClassName("_invalid")) valid = false; }); } } var actions = $$("DIV#filterActions DIV.action"); if (actions.length == 0) { onActionAddClick(event); valid = false; } if (valid) { if (window.opener) { window.opener.updateFilterFromEditor(filterId, Object.toJSON(filter)); } window.close(); } return false; } // function configureDragHandles() { // var handle = $("splitter"); // if (handle) { // handle.addInterface(SOGoDragHandlesInterface); // handle.upperBlock = $("filterRulesContainer"); // handle.lowerBlock = $("filterActionsContainer"); // } // } document.observe("dom:loaded", onLoadHandler); SOGo-2.1.1b/UI/WebServerResources/input_bg.gif0000644000000000000000000000467412247657030017615 0ustar rootrootGIF89a È‘—º×¨ÅÞÌÝì!ù !ÿüICCRGBG1012°appl mntrRGB XYZ Ò acspAPPLapplöÖÓ-applKVOÒã6­Ž²KؽU rXYZ gXYZ4bXYZHwtpt\chadp,rTRCœgTRCœbTRCœdesc@ocÿprt8vcgt¬0ndinÜ8dscmLòXYZ tK>ËXYZ Zs¬¦&XYZ (W¸3XYZ óRÏsf32 BÞÿÿó&’ý‘ÿÿû¢ÿÿý£ÜÀlcurvÍvcgt¸R¸R¸Rndin8¡HW ÿK…šá'®¶P T9€€€textCopyright 2007 Apple Inc., all rights reserved.mluc enUS&~esES&‚daDK.êdeDE,¨fiFI(ÜfrFU(*itIT(VnlNL(nbNO&ptBR&‚svSE&jaJPRkoKÿR@zhTWlzhCNÔruRU"¤plPL,ÆYleinen RGB-profiiliGenerisk RGB-profilProfil Générique RVBN‚, RGB 0×0í0Õ0¡0¤0ëu( RGB ‚r_icÏðPerfil RGB GenérÿicoAllgemeines RGB-Profilfn RGB cÏðe‡NöGenerel RGB-beskrivelseAlgemeen RGB-profielÇ|¼ RGB Õ¸\Ó Ç|Profilo RGB GenericoGeneric RGB ProfiÃle1I89 ?@>D8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB Profile, ÈÿDŽ©Ëí£œ´Ú‹³Þ¼û†âH–扦êÊf ÇòL×öçúÎ÷þ ‡Ä¢ñˆL*—̦ó J§T` ŠÍj·Ü®÷ ‹Çä²™z=«×ì¶û ËçôvºŽÏë÷ü¾ÿ¸wHXhxˆ˜¨¸¸6Èø)9IY©çh™©¹ÉÙéù9ƒ :JZjzŠ*&šÊÚêú +°*[k{‹›ÛG«Ûëû ,Å+\l|ŒœLœÌÜìü|º =M]m}(}­½ÍÝ}–í.>N¾^Žž®¾sÎþOí._oßK¿Ïßoªï/ À‘<ˆ0!ƒ :|ø ¢Ä‰Ý0¬ˆ1£F"ÿ7zü2TÈ‘$Kêèh2¥J‚(Wº|i¯%Ì™4Ñɬ‰3§¶›:{údÆó§Ð¡¾‚=Š–ѤL›’Zê4ªTKP§Z½ª¨*Ö­\ýhí 6¬œ¯bËš5Cö¬Úµ\Ò²} ŠÛ¸të™k7¯^x÷úý+£/àÁ{>L×0âÅk3~,Ö1äÉ[%S¾,Õ2æÍI5sþ,Ô3èÑ9E“> Ó4êÕ)U³~Ò5ìÙeÓ¾=Ñ6îÝ uóþ͸𫾇¿Wü¸rxÉ—;O×ü¹tqѧ[ßVýºöyÛ»·ö~döðäƒ/^×ùôìk­oßÕûøô£Õ¿p>þýœôóÿÿ_‰‰€˜ˆ.Hˆ‚ >¸ „^ãà„Žua†ÍT¨a‡y"0†H¢#–ˆb'¦Èâ0-¾ØÊŠ0Θ„Œ4ÞÈŽ:vbãŽ>îÐãBÚäF¶sd’ *Éd!E6ùã“Pî(å”8Vi%Xf ã–\¶èå—)†)f‰d–â™hz¨æš¶éæ…pÆ9áœtBhç æ©'‚|öIàŸ€(è üj(~ˆ&ZߢŒÆçè£íE*iz”VZÞ¥˜†§é¦Þuêév †zݨ¤Ngê©Ï¥ªêr¬¶zÜ«°'ë¬ÀÕj+o¸æŠÛ®¼Òæë¯°+,kċڱÈÉ’¦ì² 5ë,gÐF‹Ù´ÔRfíµe«-cÜv‹Ø·à&•k®_覫׺ìÚåÉûh¼ô¾eï½ékh¾üšåï¿‘ ÜgÀweðÁ•)Lg [åðÙI¼fÄ7eñÅi,fÆåñÇ¡‰œeÈ$÷dòÉ¥© eÊ,Óäò˩ɬdÌ4¯dóÍßémôFH'ÑÒLWäôÓ¹I­%Õ3FmµCXg­ÐÖ\#äõ×Á‰bØdçwv‰;SOGo-2.1.1b/UI/WebServerResources/new-event.png0000644000000000000000000000253412247657030017726 0ustar rootroot‰PNG  IHDR°çá»gAMA±Ž|ûQ“bKGDÿÿÿÿÿÿ X÷Ü pHYs``zxE vpAgp`ì’ÊF×IDATXýXmHS_ν³å -_"´@Ú‡æzÑÍ 4¶‚„Ú©¡$I°„>Hº ?Aë‹HdßB‚êÃ’,d+D"™ Á5óe[¾Œ¹—{ïéÃát¯»»nëoÿß—³sžçüîï¹Ï9Ï9wcŒ1†´¸v­µµ½Ýjýõ+ ëê¶m+,,*r8ûûm6«5=ÃÆòü ]k2Õ×[,>_$ÆbÓ~¦ó7š‡¶*È»w}}­­Ê¹hhØ»7/OìoÙ²iÃìÜ™nÞFñœËŠº²È Y4Æ#PVVRRP“CýhÄ“ÚU*–eY:smðRÁJ`YbÏ:4r»ÝížžÐh6o&B·›ãFGgfB!9áñ㥥……uuƒôÀJ}Ó‘H4ÊóâóT*–Eè/2 R©T ‹%‚`±ÔÔ”—‹oúÞ½gÏÞ¿hooh8|XNh³=>>ÐÝ}ýzMt)’ ;SS.ÔÖîÞ pñâË—µµržÁAŸüª¨¸t)ã Ä0ÑhÅ pYRË)+Ùauc€?HÉ"E¡ô‹‹Ü¢wÉ å“Ý…(º»¯^MU&ÿ§Nݾ1À«W/^ˆ¢é3ë쬪’Î –±±û÷?|G¤Zg m4Þ¼yðÀí–›ÍmmÀÜÏâ ‚i™u:=[ç“’~ù<|xó¦Åòۥ%ž_ïäVJþ[!„*-ý¿äŸ8ÑÒräˆßŸÎO)¿×„”h›6IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/minus.png0000644000000000000000000000522612247657030017152 0ustar rootroot‰PNG  IHDR ×Oö"sRGB7ÇMS tiCCPiccxÚí™gPiÇß†œÃ$J@rN$‹ Ìa„!)`BW`‘¤" ¸àêdQ ˆ‚tY”uqQQ¹ýàUÝÕ}º/W7χ·õï§êíðTõ¯ªHb'§Á†$sÓyþ®Ê!¡aÊØ²€Lq$;-ÅÞ×× JØ þ¥ÞHx¼§÷ïÏÿÇ"r’¹ œ€8Ñil§ 8Ž“ÌæBÎJOd°“€é<Á 8DÈQß8IȱßxçמG—€#Å~eÂQ!G}eê)!³ãxÉÈv úÕ¿íûµÄµ„7¡ÏMæq#“´Á»þi/±4áʈOJ׋çþî#œ—oôÆúë@ŒÊïÙfÁ;`½)ýž©€²€ÎÞïYÔqºJ~ÊÎàe~ËP ‚9¤ Ô€ÐÆÀX;à <€¡`#`ƒ8 x ä‚] RpTƒ:КA8ºÀyp\·À]0 >˜/Áx–!ÂBdˆÉ@J¤ C,Èr†¼ (Š€b!.”åB»¡"¨ ª†ê¡fèètº C¡Ihúú#0 ¦Ã °&l³`{Ø€7À±p*œ çÃûàJ¸>w—á[ð(̇_‹@ˆQAôâˆø aH ÂC¶#…HÒ€´!=Èrá#óÈEC)£ôPV(7T ŠJEmG£ªQ'Q¨~Ô=Ô$jõMFË£uÑ–hwt:….@W ›Ðè«èQô4úƒa`˜sŒ&“€ÉÁccÚ1—0Ø)Ì"‹•Áêb­±>ØHl:¶[…=…½ˆÁNcßãˆ8%œ1Άãâòp¸\/n7ƒ[Æ‹ã5ð–x<¿_‚oÄ÷àïà§ñË “`M $v* m„«„ Â"‘¨J´ úã‰;‰•ÄÓÄëÄI╤Cr$…“2HûH'H—HIoÈd²&ÙŽFN'ï#7“¯Ÿ’ß‹ÑÄôÅÜÅ8b;ÄjÄ:ÅFÄ^Qð Š=e#%›RA9K¹C™Ç‹kŠ;ŠGŠo¯?'>.¾(A“0’ð‘H–(–h‘¸!1KÅR5©ÎT5ŸzŒz…:EChj4G›¶›ÖH»J›¦cèLº;=^Dÿ™>D_¤JšHIn‘¬‘¼ Ég M†;#‰QÂ8Ãc|”R²—Š–Ú+Õ&5"µ$-'m'-](Ý.=*ýQFYÆY&Qf¿L—ÌY”¬Ž¬Ÿl–ìÙ«²órt9+9¶\¡Ü¹Gò°¼Ž¼¿|Žü1ùAùEEW……*…+ óŠ E;ÅÅrÅ^Å9%š’R¼R¹ÒE¥Ê’ÊöÊIÊ•ÊýÊ *ò*n**õ*C*˪LÕ@Õ<ÕvÕ'j5–ZŒZ¹ZŸÚ‚º’º·z®z«ú# ¼K#NãÆ€Æ’&S3Xsf—æ,SšéÎÌf¶2'´ÈZ¶Z©Z Z÷µ1Ú,íDíÃÚwu`S8;º°®™n¼îaÝáUèU«¸«Vë‘ôìõ2õZõ&õú^úyú]ú¯ Ô Â ö |145L2l4|lD5ò0Ê3ê1úÛXǘm\c|5yµËê«»W¿6Ñ5‰69bòÀ”fêmºÇ´Ïô³™¹ϬÍlÎ\Ý<¼Ö|œEgù²ŠY×-Ð;,Î[|°4³L·óÒñâyõxÃÞÞ¼'Öj¬å®íò>î>|žø2}S}óÃøùúÕø=÷7òÏõXG[·i]˺w%µ3û‚(AáAÍAKÁNÁeÁüƒm!·BeCãC»Ã°aAaMa‹ë×\?n^>¶¹aˆe7&m¼°‰²)rÓÙtDpDKħHŸÈ†ÈÅ(÷¨Ú¨¶#ûû%ÇŽSΙ‹¶Ž.‹ž‰±Ž)‹™µŽ=;gW7ï_ÿ:Á-¡.a)Ñ'ñDâJRpR{2.9"ù—ÊMäöoVܼeópŠnJA ?Õ2õ`êϓה¥mHëN§ >̃Z?dLfÚdÖd¾Ï Ê:»Eb wËàV­{·Îd»dÏAå°súrUrwåNn³ßV¿Úµ½o‡ÚŽüÓ;]wžÜEØ•¸ëvža^YÞÛÝÁ»{òòwæOýàúCkX¯`|ÕžºQ?Æÿ8´wõÞª½_ 9…7‹ ‹*Š>³‹oþdôSåO+ûbö •˜•)Å”rKÇöÛî?Y&Q–]6uÀû@g¹ryaùÛƒ›Þ¨0©¨;D8”qˆ_éUÙ]¥^UZõ©:®z´Æ¡¦½V¾voíÒaÎá‘#vGÚêêŠê>?ú Þµ¾³A³¡âæXæ±çAÇYÇ››d›Šš>ŸàžàŸô?ÙßlÞÜÜ"ßRÒ ·f´Î ?u÷g§Ÿ»ÛôÚêÛíE§ÁéŒÓ/~‰øeìŒç™¾³¬³m¿jüZÛAë(ì„:·v.tÅuñ»C»‡Ïyœëë±êéøMÿ·çUÎ×\¼PÒKèÍï]¹˜}qñRÊ¥ù˱—§ú6õ=¾rå~¿_ÿÐUϫׯ¹\»2`?pñºõõó7,oœ»ÉºÙuËìVç é`ÇmÓÛCfCwÌïtßµ¸Û3¼f¸wÄväò=§{×î»ß¿5ºvtx,pìÁxø8ÿçÁì䇯e>Z~¼s=QøDüIÅSù§ ¿kÿÞÎ7ã_˜tš|¶îÙã)öÔË?Òþø4ÿœü¼bFi¦yÖxöüœËÜÝë_L¿Ly¹<_ð§ÄŸµ¯´^ýú—Ý_ƒ ! Ó¯y¯Wþ.~#óæÄ[“·}‹¾‹Oß%¿[^*|/óþäÖ‡Ág–³>a?U~ÖþÜóÅóËÄJòÊŠÈD. r‘ ˆ\@ä"¹€ÈD. r‘ ˆ\@ä"ø?v¯ÿn…—cãäàu€ªj4c „ÿñÂr¾'%®QPLTE|ŒÅ|ŒÃ|Ä{Ä|ŒÄª·à»ÆéÂÍìÊÕïÒÝòÚåöÊÖì{ŒÃâíùêôüñúþÿÿÿ}Ä}ŽÄ÷üÿüþÿþþÿÌ×íàäñ|ŒÂxŒÀ9m¼3"zTXtauthorxÚs+JÌKÎ,VðILÎH,HÍÉI?qÒÏÚD’EIDAT×%ÌG€@ CQ'¡Ì€)C‡ûþêI– ˆzVAê¦M¹ë £ALŸÒìbÉ%2¬>mûa3p7ãÏ | bƒùIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-vcard.png0000644000000000000000000001242512247657030020042 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW IDATxÚí\yp×™ÿõLÏ¥™Ñ­Ñ=BÇ Bg%@ÆàØkC‚+Žñ;xãM¥âdÖÞªu*ö:޳ÙÄ×’ØNœeco †€ §1‡@Bht¢k$1£¹ïyûÇã¥çÔHB •Ô~URëu¿iuÿ¾ë÷}ïI!„‚ÿ—›$übÝÈôû ä™]¯>õÑ¿û\Çìzp<ëúwËÍ~ÍåÏÊ~ Üg\Û²¬xöŸ¿ñÄzˆx^ Ž[è}¹Åò€çþû3Ÿ8 ùðÌ©¯ô> ·ænd2‰„_45ß<ñx|>¿¸zÏ0™¨6Uß2¬—OÖ=òÖ­ù7A$H‚$HÈÐùáà Ü=ýÇÿÇT¿U¯? &“Ë8ß³á»qQ(d2žrsÓÓ“’€nY÷Á¾Ç€ö·wþöÄÂ0oÛ´Zm6«•ö¸ähõø&ú¹Àý ϸÿS@²š/âk·Ûç €Ã‡_zéÞ{ädµ:%eáz³Ååòx¼^B¾þõŸüäðaÀvÜ‘áþößW4׉–~kÏÌ!ïvÿ¨­ÈýQŽ3ß,Y¢Õ óÄb‘ˆã€•+ËËsr¥2)I©¼Ùð-\¼^ŸÏã!Äl6›ÆÅ¿BðŸÏKé»<¸«× ”Ý_ü]})õ‹èù•áΞ3€X,Ò‹DÀgŸ;×Õx½^¯ÏìÛ÷ÑGgΰ»ýõó-©T*•H¨¡‰Å€ßï÷ƒ„ð<ÏSÓ›Ÿ$TÀÕ÷G=xÐÝ]òOåk‡Ãá°Ù€éóÓ_Î]ê?.骫+^*úðÀ÷ܳr% V+•2ÙÍ*‘ªYî‹—…ë¡g«Õáðx€>Ø¿ÿÌàgïœ>1|¯öï›ÖÌÿ9&á‹;:Ο'¤¼\§«¨z{ûû/_rÙŸËOÖ}ÿÙÍÙÀŽGþñ·÷™€þþÉI§˜™q8|¾›§€x€ÆS€6û[))IIR)PR¢Ñ(ÀÏßysû2àâÇï?±H˜‡ÃnœN‡Ãá,‹ÅbRª“-©€¥ÏVí| P*år©°ZN¯¡ÇÑQ  ƒÁ›|¬clEătl³¹\^/ PÐ÷µôÙª]?î¼ó‡?”J Ù´é—¿”ÉÙRñÖÃÉý„ì{¾óðË¿Žoâ‰s@¦Çç«Ün·Ûí8Ž~±·t|TH¥‰èI€@Àë|¾ññ®.`Íš‚žŽëê²Z‹[[Íf ®®¾¾ªêÏx,Ðñì–.|>Þ|jF‘¿gûö»ï~æ ¨H¯ÏÉÜnß{×>ü_Ù¿lîE%¾ãyz€b\aMÚ ÷÷ÅÅEE¥¥€¢GîV|<÷ܶmK–ÀÄÄ™3ÀC­__V|õ«›7¯_¬][ZêõW¯ÿù,–Úl´åÓóÁàü3imµÛwíNž´Xvîd2žW(¯Áßì-ÿÜ = ²lÙÚê­ÀÇ…Ÿ¨ÿXøZ|Ç|ZmaaQPY¹lYUàóù|>píšÉtípüøñãGf³ßäææåeeýyÎE=?|œ(æGz!4Î'ÊÁ 0—˜P“§¦›Ç;€;-·Yï²ÝÝ—.ÇKŽÕÎ×<¿ô¿ˆDb±X X,ÏÃä$ÇF£ËUX¬XQ_¯ÕÞ8àóU@"@ÿÇA‘–™ÑÄb€ÒS@*ü~BE6½}•- È—æJ %€J¥V+•À=§ÿNºñ2Ððå‡w¿ñ{àÅŸ~ú¡‡ƒ¡·×dT*­–@¥Z8è±ÑéòòT* ºº¨(5()ÉÎV©€”¥R"¤Rž‰‹…²0“Én÷x€ÎΡ!‹8¾¯ïÚ5zÞë¯A±Ñžªˆ?ÉsœLH$"‘\NçÍ…t$T@<T^§³Tê›ÃŒÚc?MÚ……Zmn. ‰D¢Y2O¤¥k4J%pß} ùùÀ’%R™˜îef&'ËdÂQ¯ÏËKN6mjl,( ¤¥åÒ%£øÃ>ûlxðx¼Þ`pnžÀqBŽa"sœT*(‚zÉ"(`¾,ÈX ŠL–«W/]š™ lÞ¼jUa!UÇq\ @m¯«ëêU‹èî¾zÕjÆÇÍf§ðzýþ`P«årž 23“’€+JK32h3M¡à¸;ÉɪªŠŠRS ùéOwïîì<#QˆTÃ𼊂A Xü‰]î_-° CO_߯‚¦B¦¦ÎXPiiI‰NOs3ðÊ+ÎÌ ˆ÷‚«VQà·lY³F«,½§gtÔj%d×®'††€ÉI‹ÅíµÐØ9¢­mpÐlöí;{vdX¹R§ËÌ$dË–¦¦¢"@£II‘Ë9î‰'6n¬¨ äÅÿûŽZÏø|ñïÌnßÁà"å€ÅfAñ "­6++)I°x&§NõôLOòÞ{'N ÒO£gK¢§O_¾<5 NNÚíÀŽ_übe%!Ì3|píÚâbB^ýÀË—c+€‚rse²ª* °P.ÏÊl6gföòÇd݀Ǥ€¹³ Úœš™ñzyèë£,hbÂå*(–/¯«ÓjãóíM›V®,(`ÝTŽ3ÆÇm6Bš›ˆžŸž®VËd@SSEEV••œ,— •øÑ£F# —K$b1MÞÉÉ€Ëåõúý@KË¥KÀË/ïÛ×Ý <õÔ—¾TSCHCƒ^Ÿ™Éqû÷Ÿ;72BÈà Ñh· Êr@d’õxöìùùϵº¼Ôjzþ;'¤ùÒ“$¿:Gˆf]™o{½àÙ‹Æ‚ž{î©§¾òÚ+2™¥²° ¤dö‡%ÙÒÒœ•Jˆñ¿ýí'Ÿ „² ú]¯ÏÏW«Çÿüç—.¥+n±º«V•—k4„´·ÓÔРÓedpœÉd³y<„9ÒÖ6> cc6pþ¼Á0= Ô×ët™™@SSe¥F LLØl‚'‰DÂ{„EŠÊ[o}æ`õê[n©¨Îûý^¯ýMàÂÝìøöÀÆW†í!Ÿ»á^T @£ãààÀëÑó€ÐSaЍ©Y²$-M¸Ogçð°ÅLO[­n·ð¢r¹T*_ûÚºueeðLa'NtuMNräH{ûÄ„ ²úz.##ö»…†Â³g¯\™ž®éõyy))±*âð [¸—Û}ä :ï¾+Åb©T¥|-Þ-yô3$T@ rÇaA"< 0»»¦&­Öé‚A›m|ho¿x±»;:ètyyÌ]àÂ…þþk×¢çÕ×—•ed*•B!‘ßÜ|ôèÀðöÛ‡÷õÑq?ð‹_ìÝÛÓƒëËåÂ|+¤ØýGF¦§á9²²RRŸoq…Xd%L×¾9N.=Î^,Z/H&3›/\¶nݰ¡¬ ضõ‚Êʼ^`ttdÄhŒî.¦¦ÒŠÉääÌL¨å³ùK–h4¡E³ü“'»»Æð^ !”žÎÌFãÌŒËÝ4MΌՄÅób1‹õ¡=¤x…@+`€ãŠP̾6ñ`A&“Ïdggggf†¾Èu__ìfbµº\¡ô}©T”×3±Ûé<ŸòþH8Øçi̲³SS)0ìzøs¤§«T¡ H¡44Ra±ÀqÔ˜„Bì†0WÄqŒ¹Ýb1ÐÛKYÐø¸Ã‘ŸTW×ÖDÓE§Óíöûää¤$‰P(¤R±8:ù:^oha£TÊ塞¯³”pÛîÕ×ëõ™™Â¬+WFG-–X´™ÜèÄqá!ˆö¼³) ab,ˆ­…F² ^ؽÛlx^«½ýv`lL"©®d²œœŠ  ¨¨´´¨ˆ6ëD¢pW&„®œÑž ZE{ÀÐÑh³…X/sÇ­XAsC$PZmV–Jäæfd$%E¿S—^ŸŸŸœ ÜrKeeNŽp½¥¥½}|<ñÍ\d¶m9‹Ú b,(íÿsǹ¹¹¹ÙÙÔSB0ÆÆ¬V ˜R)°¢Ó§{z¦¦„ûž>}ùòô4íåhµ„Èd‰XÌq>º~½NäçÓý:ß6,_žŸ„e2ʦydÃŽÖÙÙ€DBÕOêê2 ik '¡žÛ¡@B+t‚ 5°y{À\YÇ> ™L½½Àm·•”Ðq8&&€ÎÎŽŽžžh¸pÖ LêêhÏ&=]¥b¡ƒz íj¾õÖGõö²%(bãÆÆF­–ã¶lij*.æ8µš†´¶¶“I€J¥’Ë%Ž»ãŽÚÚ¼<Ž£À‡_¼8:JÈë¯øa$[ 5°È1Ž“HJJè±¢‚++ŸÏížš$·IßWºàsï9ííÀÃßu—N'ô‚q»››×^;tÈj***+—.BKOmª v;!ÅÅÙÙ*ÇmÝzûí%%„üìg{ötu ó™gf³Ë¬[·|y^!99ii `6ÓfÚÁƒçÏŒyyÔ3ÒÒ”J©”òúúÆÇ­VàÔ©ÎN£¸zuzšV¼±“.œã»¾L|¾7ß|ùe ­­¹9޲ÃÒÕÒæü¼Ou†´Ñ[Wm¯ç¸„»"l#v»m„Æ‚Ò[R¥‡° ºã-š ƒÁœ<ÙÖ64?>8¨V••µµË– –‹wìØ¼¹ª   Ž;t¨µut”ææ––¾¾èBn¡ . mQ8´5ϲ#-Ÿf2 ºº¸8#xãßýîÐ!àĉ'Ÿ”˼<&55G¿ßí¶Ûö=õPsïÎÍvÇ- bÑÝlf,ˆî#s8rr€òòÊʼ¼ð }1æ »v?>0|ùËk×–”6ÔÕåçsœF“šªPòöÛ‡÷öSS¬^ˆ:V³Ž†*`Ó¦U«ŠŠ€5khÒݱcçÎO?XV"ÄST0h0¼÷ šLᬋŠX\^¾mÈwí¹^oYÄ^Ðw¿ûøã_ø044–¥Ç÷T kdëày <ÝŽ:“šÜ=`î,(ìéi›XXs»ßy‡² › Ðé–.---‰†Ž¢=„ÙÚÚÛ;=Ÿ­D7»eÏ}>åAÑu°H$•RúI ?JË ÄVO¼9‰çÅúm±ÿ‰… ±8\SSSSSS€R©T*•„Ðcâ| °¼©fÊïöúñÞiÀçóÝâëœÿ¾ œœœœÌÌèŸ ‰%:Æ/ì~ñg³@í›çy^,®šL&“ÉDÿfŒõ–!D¥R©TªøŠH¨žã9žÖ¬nܾÖ|Vx6ãÓ4àèı‰£K÷{ÞÝþWi@‰»Ýç“H„1¶/¨®®¡A«¥ `¾XÐü%…õ”èçIo*ÎKê§Óét:‰D"‘H™L&“É…B¡P(¡ï­ˆ„ `MÌ‹y> ¨ìY6\“X†,Ëyàͺ;ÿ Éý‚rXu¡á•e?jk‹ŠÄb ¶vnÎ-°Ì]ë~‘³ÜnÇçNÜæ‡Ýÿ¬û×å{s^D߉D3=e¸Åɾ‰ÚÑL\.—Ëå"ÄjµZ­VÀf³Ùl6Àâ´úm"àG÷½Þõ2pôÅöw'>8u­ðµÎ²¿a¿ötõÙJà±»îKªRÉÉÉÉ* V«Õj5''3ˆ¯‚yÿ«ë q8(-¥Š¡ìõ K’ìø·&,„²£T*•J¥ h–„Y(Jœ„oøŸu°dÃ’žÿÖ„çyžnC§ `ã¸ô3ü#ÄÐÌ+íIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-text-x-preview.png0000644000000000000000000000431112247657030021646 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWTIDATxÚí[KŒEþº{fv^ìî@ <„a!Á@ŒŠˆ&ƒ1r@4LÔD./zÑ›‰&Jˆˆ<šèA1r@H"ˆ+*&Få±+ìö)ÌNïìΣËCSvwuUWuoïþÍfºë]ßWõÿ=Z#„Bp[$z£p«Ëm,‰°ÊÅñ‘r‘SožÊØ <9ôÍàC%52àMk«6¾‚ R{Ó•ÀXnÌ66ùýùE3ŠÀ‚'æ•®Vnº{ÉÊk@º%Ý’iÖ´1gaÛÕßc³¿Ûwt!WH?鳉eÝxQN£~kµZ­V#¤X½~ÁÁááBzzz{/_&䨿ãŽa«Á*Hu!¦îñ‡ÇL,1¨ À|`yD­'Â/èT…jzY~ÿVÐý(U‰åPž¨`‘‘fe¿1æoªâ"“*ˆ4'z§fJâ$bjàñ8ý'D~†§"1nG‹d<…äŒ|X"T×,loˆÛ+r/ÎØ~Ü*H½è(F4ø Àí7ü=s vÍ?ç]Fž2ÜM 5ðU€V^ìuñê_&pîy÷^½ŒKÕÅp9WU¦ï슭OmÓOþ.Ã% 2‘ˆFAð6ñ·ÿÒoðµ]ñUÞ¯¼ j½½éTëCÈîðøK—”8º™MÁßJæù2þÞåÙ€˜Œ(Ï€jµZ­VÅ<‹.íú;ÈvL­£¢ïüáì¯SJ¸»ü`àùF˜~ƒãããããã„Ð[Áò©+÷‚‰à¤<û¬‚X åéø3€†Sœìï äDUe’~˜P,‹Å" o×·j/Ñ YÁ1n´Ataææx5"¯ƒvIÎoqø3,¾ø˜?ÛOBŒWŒÆk€iš¦YtnO'“Éd2IˆsH‘˲,Ëêõz½^¿Q° ̘ïkÙ ti]mï‹g-žy×l ôt{: |§Ö¥]ЀV´~Rؘ¦ù´ùËår¹œƒ#%„!4ƒaØ_ŠÐÛÿZš^¶øö쑽‡×¥Ãf×èf€Ì!óI+ϰEó¦;_XÑ®iCÚÐòróƒ-I`Õ«½§Èm´qr¾9ãÿ_9²SP.—Ëå2@錨T*•JÅù†êV‘tÚþ‚&•J¥R) ŸÏçóy'<“Éd2 ©©©©©)`³\uÄP/ˆnÛ±_ýöóVúq%Ä~W8LºÕ€»Ùä_\ öûi}÷IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/dot.png0000644000000000000000000000023612247657030016601 0ustar rootroot‰PNG  IHDR&/œŠgAMAÖØÔOX2tEXtSoftwareAdobe ImageReadyqÉe<0IDAT8Ëcüÿÿ?%€qÔüÌš5 ,™––ÆH²0Í0€ËÚ@±FÓñòE9åm½]IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/browser_chrome.gif0000644000000000000000000000250612247657030021016 0ustar rootrootGIF87a ÷vg/ m¹j­j­q¿%s³yËyË}Ò}Ò3Ž98˜<8˜<=¥==“C>¥@>¥@B±>U¥>g9u˜(h®7c°9CžFCžFM›RE©DE©DE©DE©DI¸EI¸EI¸EI¸ET«JU¨WQ³IZ¹XZ¹XZ¹Xl•Hd¥ik¼ez°~FÁIkÄgkÄguÇmuÇmzÇwzÇwzÇwÙÙ&†Û&†Û0Å0‹Ý:‘Ý:‘Ý6Žá6ŽáE†½qŸ·x¥·x¥·IŒÇG—ÞG—ÞG—ÞXÁR›ÞHšäHšäW ßW ßZ¤äZ¤äZ¤äZ¤äZ¤äjªßg©ág©ág©án°æ|¿ð¾%Y-†p7¦A)¦A)ÉÐÐÛ#Û#Û#Û#Æ$!Ü#'Ü#'Ü#'á(*á(*á(*â0.ã84ã84ã84æC;æC;æC;ä}ÝJKßsnßvvçJBçJBçJBçJBêVHêVHêVHê_Wê_WëaWëaWêebên}îxoñ}nŽ´&²½£¯!½»y…É}®ÆtÇ¿Ü£Ü£Ú¡ë‚ ç‚ç‚ñ˜â«â«á«ê¶ê¶ê¶ê¶ê¶ì»ñ½à¯0î}í’añ‚uã·FèÇ èÇ èÇ îÇøÈøÈøÈøÈøÈøÍþÑþÑÿØîÅ4ôË)ÿÚ$êÂMèÅ_ûÛEûÛEôÓ\ëÇkëÇkëÙrÿæzŸ¸˜‘µºƒ°Úɞɞ Ùž©Ì©©Ì©¨É¹¨É¹®Ô¬³Ï¾»Õ½›Èê¥ÀË·ËÉ·ËɨÍê¨Íê¸ÐèЊ–¢¦ìŒë‘ñ†ô˜ò™•õ¥™õ«¥õ«¥ö²ª÷·²÷·²ê͉ìÓ•ðÛ©þé†ùå™ùå™ïè¹øè§øè§øè§øè§øè§ÊÍÜÃÕÃÃÕÃÛÎÖÇðË×éÙ×éÙ×éÙÞíà÷ÆÅ÷ÆÅ÷ÆÅù×Õù×Õ÷ìÓýóÈýóÈýôÖýôÖüéèüéèûöçûöçûöçþþþ, ÿÿ H° Áƒ*\¨Ÿ¾‡úø1d8Û´Oƒ2J³OßDƒÙåé§äÈ:uüPóøQ_§:nꌜ™¥›5kÁ›8N71Q …ysš:;ê¤çO P‹UsÆMR„sÈœQÃÕ©Wœ\ψýRgÂuY´ŠÝJuëšµgÈùB÷K ƒübDÐòEîZ>Ô°e«æ)ΣÈEÂgÆôÕ MݲcÇ–±GjS©R«B¯òfð—‡ÓXºÐ֬Д(°«,§J´èY ¶8íA•.rÎ19¢„‰q%J–å²ZãüJðö€ +:†Ù~dˆ&ᘇÿ¶GßôÞZœ1±¡#»w9 ƒÅ¼”¸òΣxv„†hÉÐg[)ß”§Áy$è¢6D(! < ÓJ}÷A'Ýt ‹ ¢ˆ!Žx¥G"ùMWB1B@ÀŒ€C2³Ô÷ÊsÓÀy¼ Œ`¤Èà‚b-¹ ôŽ ž÷1»üðÂ$J}›dXP/ Dy^ /¼ ‚ŠXÊ&®4IÐ;#< æy<@—š$ˆ0È äilÚg›TbËB½ô©ÁœhPÈ*Ÿ­YI%±¸‰P/, ç¢VÊš›l" %²Xš1)8°À‹j`H¡•H+" 'Û|:+8 €,âk# pcêGü¼c 0‡Ø²M7õ kë³ÐF;P@;SOGo-2.1.1b/UI/WebServerResources/mime-application-wordperfect.png0000644000000000000000000000661212247657030023571 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW IDATxÚí[[lÕþffgwfgw½ë¬½¾$vlïúVS‡šbJ!Um$„"ZZ*PQ•‡>TŠÊ‘¨*PHÕR*U•ZÑ„*„Z!n¥RcBESJ$•Hlol'!ÄëkÖ»™½ÍL§sÙ3{±× ü’å9÷s¾ÿü—󟳜a†aà ºNÄ_ï |Þé \gòÔÛ@UUUå ã?['^~ûu õÜ¢”òÆšQ2RöºDµ±\%µ×Èv¾”÷¬¯ÿ<ÜIÛŒ­ßÞÖ lOm÷ô >É'ù$Ž»`³ˆ«×¼õÖ¿Ä£9úc 8"1´"öi{Ž»~ qR>_(äó†Q,‹ù<°¼¼²²¼ ̭Οõ©ñ…¿,ÛƆx`äûÃ÷ÝðÀó<Ïó×nu3àϡކqß•{ ß[ [\tÝ0tpög¦ÉóÏܯ4]¹ž³Ü^¯<Ÿäò¼ ð< (² ²,˲ ,----,““ÿ8³èãà¡{žýúCw~uY—õÍgDÝ6@ûCéOŧÉnç8Ž«Úßt-m—»þ¼Ñüæêßï¤é“äæ1b (‡ØM…8YâÆ k»j,¨¼5ßšG¿EQ= ›UÕL†HÆÊ (J(´_h»Ø1ôë»Üû[à»ß¼uü÷À‚±8›J5žu{AN ¬ðZ~å•—^zí5 P(òy7Ð+³‘…E£--[¶cc·Þº{7`„Ç#Š€ ð¼Ç|òÉÂÂåË@GG{{g'P(£‰D"‘Ð÷ÓÄ/û¾ýï›Óã!à›_þFÏÞeÈð¾¹yã6¢n°ö?Í£;™ã€{îÙ·ïî»ÝÛ²l†µžÓH;ó­ã±Œ¶3ŸÎKˆQ‡ç‰[](º®ëºøý²¬(Ô‹¨$•Ý»J0~öè«Gú€}í÷Üyï´axÞ€7°~F¬K±õ|9`ì´ÙžãØ6£ëÍ¥–×´«'û—iš©M‡H„ P÷ðù|>IdÙç“e@8ŽçØLì\lŸ kM¯ÿ~êÕcÇÖ »I PAv@ qc ÂZ˜QAÖ´•!Ö9rœ 8Ïsœ Ç¿ûî;ï•Y(‚ Š¢(Šß¯(@0 @oOߎÞpräƒÅS_>š¸Øz!i]_Ýæíîª_Ö¡‚XÐ’åZ½šéé©©éi² b±Ö¾ÙÆ›UnÅŠòrë·¦iš®¥R©T*‘t©DÒšfª¤@ ôûÉyB€x<ïëzçûŒž'—O=üþc@¶=Ûý\½h6Ä”/•ã€ÁÁþþr@;Òý»Ü›²3ÀÌ­f[XL¢çƒ|>—Ëç\.—Ëå€\.Ÿ'ÿiš”S÷õôéÓ§ÏœFGGGGGs§æzÎí.pùƒù†Ñ¾³}gÇMµKBü º#é×ÔÔÔT2 ‹¦°`Xç¤Ý%ÀÎÄÚ•’•D‘¨˜ÞÞ¾¾žÀç“$IB!r°,‰dP QUU½zX[[[[[R©T hßßñ³ŽÛ€™ùÙ_Ì@;Úwvhµ£¹.ä–CŒ*IQ `1ŒêáJ^Û·a˜¬²3£±÷^¯×ëõšã‡B¡P(Äb±X,f©xAÿsÀį&&&Æü®¾qÖ¥‚X %áÜ™™drf(‹E« (—‚jû¸ò\ܨ©©©©© hoïèhk«¿ïJDæNG"ÍÍ@º”iIÿúÓ wÖÞWC¼ ë´(0ñx"Ñ×ç^¯\ḛ_*-•otØÌ=be/‘$I’e@¿QûŠ6\ÿ8 PAöà ~¶»¿n=Ùc6•ú7ûd"®•³„ã¯W½^Žsº µRCTP%Ý›´ŸTYÒƒRy ›X1 úÁ-Ÿy¹·V¹ßõÁßä¶€ƒ|ôQÓcõBlÆæ\ãx<$úyøðáÃO>iÕ³g“ÉÙYb› ;Äî«1Û;Ukí¸¸Ì³ÞåÃ8UùEÃPU@}>V?Ô_^^YI§I¬X:;ÛÛ[[Ëëë:™çkgX¡†®[ƒþþþþx¼–un—ÚhÃ*ˆ.̃‰Fý~­‚?¬ëE¯H§×Ö4 H§ççíÛ·nmi1CËË««™ ÐÜåýe2Ùl.GÂÊ’dJeÇ‘˜N2™Lž=k?ŸT[#`J@"ÁfàuSANB¿[ZE×ké/ôzI ¯× ;öþû³³ä*QžžÖV ©‰ô›Í’(æùóóó++$¼Ìq€$ñ¼,mmÑh0HhçÀÀÀ9ŸTZ!û»\6ÎaÜtø–-•%ÀIW®d2ù<à÷{½‚D"ŠÂqÀm·íØÑÖF¼ A u5 àyM+lvm-î¸c×®®.Åôx¬õL à8 ™œžN&«Ç¨œ;šJ@"Ñ(ø¤‚LV˜ùÑh­@H× …R ˜½tiy¼^¢¢D±X$;ßÙ¿× œ8ñᇥK’¦Á ßÏ[‚ìôƒ)ƒƒõ¯³º±¾FÀ–r?½¥EQX  “}ªiÄÄbMM^/0<ÜÙ‡=ÿü™3@&³¶¦(@<ÞÚ›ý?>5µ´Üÿí·wt--á0Þ:.UM”ÓÓ$FU(P/ÈÖõR ¨¤Â>*ˆ2"õû­ ŠŠBn¢$ <Iòùˆ—¢ë€¦åóÅ" i¹œaO<ñàƒñ8pàÀ3Ïœ> Œõ÷ŒGž<¹°ìÚ‡Ã@gg4*Šd –Ä9UÐààÐP% p»Ë®—MdÛ ²çAt°,“'¢B|¾þþ±1Àãin6ë—J©Ô©S@>?3sâ‰v‡=ð@O°wïcML/¼ðÈ###À 7twSà+ÙàϬ¦¦Ì{ »TŽªŠ"‘€ÁA¢Â*]Ín*X2ÀbD0(I¤q9®³³·ถ–›o&pøý–‰xZ[o¹UM¥Ã˜ŸŸ›vïN$ü~ “QUMvíêí•eÀçÅZœÉàiˆdhhhhpÐøê·p}Ñä<„‘…ê:]8ÙŸ‚ÀóäH–Ï_¹B–q劵QEºÎq$ ¬ëVàTµPÐ4àÒ¥¥¥Bèînm%ÊŒMÖˆ5´199995U.²ì÷Ë2H$,/‡êåâgSÀÈi ž~z|Ü0€ÙÙTJUIÞ{ïÙÿ×CwÝ5664:tä@ÜÒJndgg$"À{ösOæ7<<<<4äomÀ׃K5Z‡ rÚ§&éýûüÅižÝIu¦Í<û'lÖÏ=ßNõÇ›( åççÅÐF¨áhö¬èZ¯—ö~ja ëŽÙ™c½hµ^‰:×ñPAöôô49q‹¦®­¼ÃË{¬\îxµ¹9¡®\f? Vëå5Ú° r#ê®YApfu;Ü=íÞ=mm]ÎÖkÖË»j¯26J TAv¢þ¶)ì[9m|ç×*nëaã¼^òŠ‚J«Ÿëª‚œTØëTÖý¬t-;¾úºÊt±%dc¸l˜ö)¹ÓÔÔä$‘3æ²àó9u/-uOÄzüÅzà΄JÀ¯÷ö—M53€Ÿ¯.'®@9I:Òét:øïòû¸ÒÍÈv¹\"LÀLÝm=Иiëgç³g\­¼Vb?½tn û: ƒÿÿÿ ›Íf³«æU*yin¿¾te}L/ϳÙl6›‚ niJç~sž›ÛôlÙÞÜÛB¾v¯t®7Qàg¹sÜ,D>ŒŒ<dcÙG²÷Š¢(ŠbâHâ$WЂ@žeÓ÷öXÞØsôÒ‘×ìMÙç³ozLïÔ#l͹¾g‡×¶]½Ä­r‹ÜU ôãPWHF.~éáÑ ôœÌß°ÿ?Õ&Lm€ªªªª~úKyÕ”U¤ªêóB’D^SÓr f>ý=²Ïçóù||½Zw õ‚(àôÙ¶ÓX}^ˆ*\ºÃéC0ÊZ½ º)ÿ5–þ°zD{màIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/new-task.png0000644000000000000000000000410512247657030017543 0ustar rootroot‰PNG  IHDR°çá»gAMA±Ž|ûQ“bKGDÿÿÿÿÿÿ X÷Ü oFFsh˜ú0M pHYs``zxE vpAgp`ì’ÊF«IDATXÃÍWkLU~fö>€i„P.ň-Mš¬ÄTˆ¡‚%©ih¬±HKHhKŠ•4Ñ4±P£$ÄÞ£Á„”Z#ýѦÅþ¨nÓÄJÀåÒ.Ò½¸\ÊÎ.KYö {›™ãã8À‚ÒïÓÄ'™¼{îïsÞÛYB!ÀEž={òdUÕÛo ôõݸ‘Htt|þùûïŸ?àÀž=Û¶¥¥­žÿ|âDccS!V«Íf·"¢(ŠJ[_o}CÃÞ½Û·—”X,##‘H 0774DÈÝ»wî rñâ7ß´·ÿøãêuj¬‚ÛítºÝ„Ü¿óæW_„‚€$8@J ÐÛ;00: $±ØÒàvÏÏûý@kë™355Àñã§O·´>ŸÇ35Ô××Õ>LHYYiéÎ@^žÁàóo¼qâÄë¯ùù[·nßLNö÷_½ ˆb4 ѨÏdf®Öƒ]ÝárŽÞºäçíÚ”””—¿òŠ"ïÝãùx¸uëöm“ èèèììê4Žã€éé™§sý¶<_^?5µ° ÔÔN§ÙÜÛ ,-…ÃKKÀÈÈÐÙ W®\»V[ËüY_æO_úFcgç™3„ïÙSUÄbÁ Ç£Œ75}ôQWpéÒåËׯfóø¸Í¦Œ;<ïr99[¶dg'·eˆ¢×k³EE»vedáðÌÌÄ0?ÿàÅØíVëÄàõúý, ?ÞÖÖÝýøãtu"Ae,–äB’$I’¤(n2™LtC»}vðx<ž… »ûÊ•ž¬ ‹Åb “Û¡Ðü¼ËTT”•ed’Çb€ÏÇóàñÌÎ>|¡F¤¥¥§Ëj›6QIÝ X#D‘ÅD"l6›Íåšš>þ¸£‡ÛÛÛÚ€K—¾ûîÛo±a0 !¢Ô×:T\ ”—““¿þÚÓøý>_  MN/¾øÒKUU€Åb³9ò.zýÊ]ÿ„H’ ÐhEe¼®®®îèQ`ß¾}ûª«7N€çïß7ƒkk_}˜š2™nÜÃáÅE`|ÜbyððzŽAEQTΗ¤•’$‰„ ˆ" I‚„Ðdäææææå)òïpçNoï?ÕÕVUÅr÷.°¸x½€Ýn³MO……û÷€Ãqý:@ˆ $€$-Ñ¥%*#ÙIYH¶ I”9!Ô¥T*êb“ÓÓ““ãã@ffV!€$-.F£€ÏçrÙíÏ;n7[¶Ï>[^N]@£¡ûètúÏk¨ …¨ŒÇ×$  ÅP!‰ÄFd4 †Ã€×;3c2yyùù;v³³Vk_°°àõú|€Ý>5 ÅÅ••G,KËjµZͲÇ Z- ×ët¬]$B³¦ È%qM¢¾O- ‰Ç%û®ÑÑááÛ·ââ;KJž§u%…B!`ttllbضmïÞ“'†ã{ Ðj ƒA¹ñ”N­^]±å+U°f/¯ 2VFÂú‡yÞj––rrÒÒ€¹¹ÙY¯øí7«Õá6mzæ™ýû'ŸÌÉ), ƒãŽã¸”@«U«U*j •jÙ›g¬‘FE1™'퀋oÞ<äy ²2;{óf ôûý~`dÄlv8€´´§žª¬vìxþùêjEñÓ§ûûWf³Š èï÷z§¦ 7ŽÙ Ù…’ûiò ‡#AÞ{ïµ×ŠŠh|@oïO?Mjjz:`6ŒŒ[·VT;dfææ>ý4`0¤¤¤¤Z­Ñ’Dcçüùúú®®äs.\hhx (Yh5xœeD‚¨R±,ËrdŒ™ÍÃÀѦ¦‡>|ì ×s\j* ÓéõÀ² C—$†‰ÅþÊ% ‰ÅÑ…Ö& “x\$ `Y™E}}cã»ïmmÝÝ šúÄ›7*•J¥Vï¼sùò /¬VNùí÷KR0˜œ($)%xùå/¾(-%DžÁ0tõºA,¿ùä`¹.47ýõà Òf†aY@§Ójõz@«¥YDÙ7‘$ µµ¹ùÜ¹ä š›„‡—«FÃgϾõVk«BL&ýÁŸ~zîÜš1HÍ hµZ­VKUP«7߬©yî9l+í(I´zò¼ ¸Ý+ošºýV+ºìáÌÈý £ì·†èÊŠË. ÕrÜFÔ^ŸN$BàtR«•T•ó¾ìr• PËÈû%úJOOOOOvï.)),ŒÆööS§þñ8!@OOKËÕ«ŠÒ2‰Ý»[ZJK—¯ #ÃÃ~80 ô,†Yƒ!4;üüóÀÀ½{@nnV–ÁdggeÑŒü¿¡²¨­Mîoh¸víûïGçç•–Óì/¿|ùåðpò[ ‰À‘#ÍÍŸ}\¸ðÉ'§N}}Jú7ˆ¢üT{0ë•jš…–ÿ üwPVÖØXRÂó7o= ü~qpuÝøIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/GNUmakefile0000644000000000000000000000145312247657030017361 0ustar rootroot# GNUstep makefile include ../common.make WEBSERVER_RESOURCE_FILES = $(shell ls *css *ico *js *gif *png *html *txt 2> /dev/null) all :: install :: @if [ -L "$(SOGO_WEBSERVERRESOURCESDIR)" ]; then \ echo "$(SOGO_WEBSERVERRESOURCESDIR) is a symbolic link (for development?). Installation skipped."; \ else \ mkdir -p $(SOGO_WEBSERVERRESOURCESDIR); \ cp $(WEBSERVER_RESOURCE_FILES) $(SOGO_WEBSERVERRESOURCESDIR)/; \ cp -r ckeditor $(SOGO_WEBSERVERRESOURCESDIR)/; \ rm -rf $(SOGO_WEBSERVERRESOURCESDIR)/ckeditor/_source; \ fi check :: clean :: distclean :: clean uninstall :: @if [ -L "$(SOGO_WEBSERVERRESOURCESDIR)" ]; then \ echo "$(SOGO_WEBSERVERRESOURCESDIR) is a symbolic link (for development?). Uninstallation skipped."; \ else \ rm -rf $(SOGO_WEBSERVERRESOURCESDIR); \ fi SOGo-2.1.1b/UI/WebServerResources/UIxContactsUserFolders.css0000644000000000000000000000147112247657030022403 0ustar rootrootDIV.filterPanel { position: absolute; text-align: center; width: auto; top: 0; left: 0; padding: 3px 1em 0; } SPAN.searchBox { float: none !important; } IMG#progressIndicator { float: none; position: absolute; right: 1em; margin: 7px 5px; }} INPUT[name="search"] { margin: 0px; } INPUT[name="search"].notfound { color: #f00 !important; } DIV#folders { position: absolute; left: 1em; right: 1em; top: 3em; bottom: 3em; background-color: #CCDDEC; padding: .5em; padding-top: 0px; overflow: auto; border-top: 1px solid #909090; border-left: 1px solid #909090; border-bottom: 1px solid #FFFFFF; border-right: 1px solid #FFFFFF; } DIV#folders DIV { width: auto; } DIV#buttons { position: absolute; text-align: center; height: 1.5em; left: 1em; right: 1em; bottom: 1em; } SOGo-2.1.1b/UI/WebServerResources/mime-font-x-generic.png0000644000000000000000000001161712247657030021572 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWIDATxÚí[y\”Õúÿξ13ˆl"W!Dd©4Q0l¹-H^ïïWWË2Ë6K­®Ù¢¶˜¹d.™¶—fW£Rð*FŠ""²Ï Û,̰ ³¼÷·Óà˜¼¢Ôí>ÿœÏûÎ÷9Ï÷ÙÏ9 Š¢(ŠÂÿh„ˆ9Ò üÑé m æ.Šš4顇>ý”¢ÈóH3úßJ â‚úúúûívŠšóåËõ߯úý9(¸m¬LÄ_dý=tÖóŸÏå²Ù ÆH3~9¢~¦Ò²²gÇ>-0H“E_Åíaš ­è_dÝnÝ~x<ðEàFV\PìG@Vâ=áw«š4ÁµNU—º³ÙDQçKªÎ7Ê\Õ6õ& éGå]ªé@c{“°Q 4å)+U 0èØÃGW.§_xa뎵ÇOQT¥õý®·€ Ýã׬ΉªŸk^ Œ^èñ ðêÃóŸKžüÛ€üà‰Ü¦¼MÀÎ[wùí½Óû²{s€ÈȈˆðpÀÏO¡P(&“Íf2вÛ ««§§»hnniioÊ•ºªàÉÉg-ŽdRY²ÏÃÀ ë^ÊZ™ DD„‡‡…žž^^ ðù|> |>ÐÙÙÕÕÙ èfê›;§»Óv|²íîËË‹q ö¸¥®ž¢6žú¦ |x!ζ`±X,&p8§8QâU÷:°xò]©Ñ¯³Ã’?+HðŸ”ï¸Þ½RÁ¯ÝýÖëoïN,9µ˜»#ëƒ{¶õõ õõ€Z­R)•Q™ÆÏ”ëÛÞ–Ÿ_vìùf sü¬»3’þ `2™L&ƒ±â±çv.½Ÿ¢n-LžµðwØüíY@DDppP ÕjµZí¥ÏçÓ1Àh4;;I?ÆÞ8 à=Écó†¬üfxkÎ;×§…}'K =€;d( (õ?#wi"‹Åfs8@ͨ†fU#°¶iuõëÇÔ ”»“³‡n±±@,3AÕAŸŒy…¢(?êªèêêíí,‹å×€¦&µº¥˜½(sõí¦¡¯ó7ÀÇ›>ÛÿùfŠÊï:¶3ŸÜyçìÙ·ÍΔŒ>£LF“ÑhD"‘8·£jkÝNàÅ‚åõËßRƒR‚¯Dðîä=ZZè ب~tWº\š{Ç€Á`0 €Ïçñx<@¯×ëF unJJò¡ï7S —”–/Ë£¨kvfí|¸í¶ŒŒ™3ŠŠŠŠòrz:þyzJ¥JÕÚ Ü[zÏË÷l2’gÏX|õ1ÊqƹÍѰÙl6íÛ æ¯H‰Ç£ßÝÝÝÝÛ 1‚: ?¡¯¯¯ïÐùq ­†V£‰¢žÿrEÒ‹v }Ñô•ÓÖ--ÍÍÍÍ@{»FÓÞxyyyyy==½½}}€Ø(Qz~,ºaኇ>~ºº·vë]ha§c  …B! × ò|êwWþ½à­9ëϽ{ë }<è;zP[[WWSp¹\.— ˆDb±Hœ_\=¿þa`Õ®—öüýÀar˜æðeg-{Z?iÛˆD"‘HD» ‡Ã%x„@@û~Î`0›–'G%K~G8}¸øEþT4ãä€ óܹªªsç\óär¹\&ÚÚÚÚ´Z -wúÛÓË?ý)2rüøá¼¥ÇÒcé¡(sš¹Ê̡ǣ Q‡Ã%x‡Ãápú €q/3ˆ}CÊ•÷ºa’w¿>åÔ7Õ@ÊŠÉ/%¼¨TtÕ×××××…"‘PxxˆD@ÃëÊ9åÉÀ:Çë2‡Ÿ¯2ÝÙ’òý@`àèÑ `³Ùlv»ë÷K]OG‡Á¤Ü”tß)À, ÓÙ+ýîu·€C…yÊÛû¶¬þ/h …@KKKKK‹KÓär™L&TªææÖV`Öû3y3þø…ù…ùІ¿ >>ÛûeÞWÛUª*R™$'O™2y2PYYYYU5@ ? ž¸’•µ·Ó5© ’ÙW“v^wš Ü­ú  éÒÝáp:íöËç×V+½³$qHz$Ò«ÿ~ÅÑÊÊsŠÚÒþþá­%Àý÷geÝuÐØØØØØH[$É÷ žðG¶fMšžíš$ŽMHIHÿ`zÓÄ1EÑm[‡vÀ¥¦ÎçÓ®€àé!'iøÏ¿KöŒŸxç)ù3?÷³²CÿE+€Ó —•]Úõ$|‘¤@¯7Ìf n|ì‚= d Ù®ËõWŸ©)©£¨wžÙðýÆbŠêh14š‡~Œçšàp:œ'EõuY¬³éö€Æ‡»ÆN'EÑõ@&“ÉtåßmÕ·Ú µðÁÇ>^<˜uSÆgSëéôÖÇøúë}ûrr\f2™LÀ@…àñx<>èè ›m‰û²Ê\ß©)ªmª;IQ‹º—t<©´]¡æÀŸ#²~˜ó¹‹€Åd1YLƒ9‹ËŒðþg“v׸ÎNzÇ),,$$8(ZR¼¡ø„+_§›be·Ûív;EÙl6›ÍFQV«ÕjµRÔ)mÑÓ‡)jî»ÿø@pK|jïäx 44,,$øöÛœœC‡\õ…BA§Ãë ÁçÓà›à?'~±«i÷´réèçôÀCeVÿµÈȘ1#- `Äã+äšNJ[9¸œ®¹ 5Y¾IþW:ý´Ùh“çp.Õ8µZ¥jnbb&N¼áàûå¹å¦{÷~£úFEgG&“kTÕ«5j °nɆ'6n–Æ-»ùL`nМMw}„„„†¹¹¹¹GŽgÏVVž?ˆÅb±‡ÝThIÚI|>‹0™´¢X÷Ùîµ'r_™B6X¼å©Ÿ> Äœy=ê4àççëëë ¬[·aÃÆÀ¬ééòô 6dâĘ›FpO˜hl´ì†£>ŒF£IÀÃ^¸Óét:ô\°Xh P©”J• x¤ço>ódÀ»v½³k=ðå¡=ܽ{\ÿ¿}¾æNÍ~àïÔQ‰àé÷žúò‘=®46///ïèQ þ†Æ½ªÀœ´{2ïÞ œú¨ØRTF¶Y.¶D€n7³ÙôÆÕ pnfNcÅ‹^[²ëÉ °Õ¶_:pszJJòt`ÿþrr±Sü¸—xüÉEq.ºœ† €‹]Ýεـ©Æ›97ýxGù®rÃZ 11!!6–¶VëÅ…œ?_UU] „‡<ñÄ¢E &“ÙlÞCôð4H¥`Œì`™Ø@MMMM}=PZZZZQè6jŒÏh–ì}¢(ÜpêÃ"1 Ñíd§ób×Cvx€¿¿B1j¼:è ^:ˆ½5vZL pøð?ÿyäPõ ‘µv`û‰-ÒÍ«p€¬¢Øl:öÑ–u©E\5ûdòìã&MŒ˜pª¹\^>Ðn0˜‚éºÀÓèììì$çl²W__WWW455665Ñó%€Á FNì±ÙL&› œ9sölEÀì`ø±Oî_ðÀü{ «Ÿ ôè{í­Ø"Öt‰ €@l0 z=’’’’˜è Ú?üpèPn.pv~…¥J ¼‘ýZö«+‰@¬+€þþþþþ~W¥OFz#‡âZ)“ĺÜ,BîóHptÿÉNÑð%«Û¸¨(Ù^¶¬òIWLðñññ‘É\ $Ašd'Ä'@Ùl‹ÃŒF“ÉbrW}¹àU`L] !è6`îÒ¬´{·v‰ÍÇæãrmÒÇ=·JzèBÏhtm)’˜D¾Ëáp8\®ë½FCïI8ðÝw ûUGµÍ¯ÞñÊ@€ÌßÛßÛµ^2^N.DnD®¿œ Ýt”>:YýëgCOÒgC›JŸ Í " v¹wÍwOžKJJÊ Àú#6×£„ò§¤_AAcÆÐAR,vG %­–>ÛYW×РTR»×x¯J ==1}?0æÆÀŒk¡¿hØÏÕFµQmÀúŠM·méüMþ/(Šéîì˜1G÷ù-–®®înúŒg[P3©6¢~ªH±¥ìæ…eÏÊ> xxyx‰ú][”ÄÕÑý½û3ie\õéh‚è幑¬:t$¯æp;ðSiáÇ…I€r¡zfó&€µ‚¹„ñàwZ‘¨è—…?ijbÓ':À)²™ (wÁ»Â"·È-rà‡õ¹i‡gå««"Ï KåÏ]üN*|•@|Bœ,¶¸Õ8•qËBÀ/Ü×ß×ÿRA&x÷‘œÄûÅÜïd¿Aß°&Ò÷x'éûŸ/Úýˆ ‰IºàþÞÝ„/gÊ쪕{ï‰<»ÒNúýÀÄ@HÆ‹ƒêå}ñïÿæxº;ãäFÌ}3ÿ¾&g?ðÕ¡—ŸÏ¼öö ñô¸òîéB&hw_€+¼;îáŒ;ƒâÄ•vIC]Àµ"ÐP?Ø8ƒƒ1\mèß tºf­ˆo«Ž¿WßÅÒí¦¬¼ñ˰!´aÿhT¸òLV]Ðo\Ðõ‰ëÊ×ÿ,àÑu³BÄǽöèÇeEe@Ñ” *ÍÛ€a›)·'sä.ù]o"Áû!¯Â ¡0bŒâi`Å{ó&&L¼´¶ Lþñ+;ÿ–Ï`<–|‡6úÍ‘ÇÈY?‘Çå:ÿ«F˜Fü†Ìþ‘`p<°‹°"IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.oasis.opendocument.spreadsheet.png0000644000000000000000000000670712247657030030163 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW RIDATxÚí[{lTUÿÝ;Ï;3vKiJ[Yp¥P }ª±¬Ê+k+`²Æ³‚<%qcb"f…#D¢n6 X#Ùè&+""-…N[ÛeyIŸØb§ié¼wÿ8ž½wî£óhKIôKÚ;çœïœ{¾Çý}ß9÷\†çyžçñ+M±S=_:ýj€)&m¢¼^¯×ËòüÅY—NÕ~ôý½ßاø;|ˆï‹æ%Ц pcÁÞDö3ôéor´×Ó²m#Àl~ÖfÏæôÍÑæÍ FƒÑ`d˜»¡l%bçÎÕèÎøxþÁGç LGÆÏýfê‘’ßøý< ƒ~?088448´¹Ú:n€¾ÓÎOœ_ógÌ+~­]PùÐs˲,ËÞ=96ÀI맺ïãùÊáÕgD°þ~ áùHŽ'”ÉUøü•–Çæ“¶GóÉëI-Ëj4, ˜Íg±Çq&0000àtW.]9ûß! r,¼Àc–?ÿx9ÀE¸™|C$‡Cÿþx;Ã0LlÅÓ²ô—ºp´E™#º•aä5B ‡Ãá004är ==½½·nÓ¦M›–ž,~$Õ’LÀüGsg>·}á>õ0àðô»&??LØ‚ÇÅR´2tÏècù›´M¬x©A¢¯Ä V«Õ^¯Ïçõ]]]]@JŠÙœ’Ì}à‡“dÌá²ÿ|eÿÚõï Àitº>y†H8Ë‹ÔìÞýÑG/*Bé—¼¿šˆrãÊ9Åõê@þÓ'¢ `Á»°Z­ÖÔTášÙ9£;« `ϳ}ìà«·¿.9ý°’¯¸ùÄ«<ŸÎÜ—7}úÄASš@ªÞÅ‹—.]¸P®„ææ¦¦Ë—ü|ÚÝ“–¤|jPOj€ææ¦¦ÖV`ñâ‚‚… –ežÒÓF¿øé'§³·ÈÊÊÌœ9HжÙl6› ÈÛ1÷¯yÏgþóõµÓVàÉßþ.gÕ ÏÛXk·ßIAÔÑÁP7ÖXã£ø”‰D" ñ<Ën·Ï ‘úH0™8ÎlL&“Ébìv»Ýn²ß¿*Ûœ¾yæó/£ÑÀèø%H ‚ÆR4õ85jnnl¤í £#¨‡‹Ÿ“±ø¤³ó2 ÐÒ=^( …B@nnz:ÏÏððð0°råÊ•O<pœÁÀq€ßObFÆí×€Ñö;áюչΟ{ýQKŪ»h9‘òœ9Fcg'PVVVVR"UPSSSS[ TVVUUV*ŒS_____ÊÛi¹¡Ááp8€eË–-+(ˆž•8 mlllll–.-(XºT¸# Æ>Ÿ×ëó­­­­­­@mmmí¹s€F£Óét€Ùl2™Í@JŠÕj±¹9y‹s-@ó¢ïú[J®KÝÓ;¯ó|öŠÙúû³‡¤$ Hꉱ'ÚË¥:þǘfDâ Hž%EßG«Õh´Z@«%ÙÍ–†e5Àãq»= »»»»« ¸zõêÕkׄ žÛ“Çç| 4¶lhz-ù¹'AjÊ%†©©©©¹pAIñ„êëëë/]Š­v‡ƒxx,jhhhhhˆž‘_SSSSSS4Ï eY†aY ££££½‡ D…Báp$BøB!àÖ­îîîn ¢båÊŠ  ½¥-§}=Ðû]ïw=<Ÿ¹$sIVAüOÂfA„ÊÊÊÊŠ‹åõÔ0……Ë—¯X!çɤ5 …aÕ×*,Œnó76,[¶l™\jj üüüüü| ¤ W¯×ëõx€ÖÖï¿omz{{{oß2×gý%ëà‡ž›oý 2‘¹$+¿6“‚ D "ï/ýM½%9(’î? ë`ñ/1ÄD_)‘= @¯×ëõz‚ý&YX­@FFFÆŒ@jjjªÕ dgggÏž ÌîœÙ5« èy³çÒ­Ó‰Ï?)RR­C9‚b‘‚Ææ‹Er¨JžOcÒÒl6» ¦ìý™áñøõ9!Y¸UÈ‚¢I A˗˳v:ŽÃA …BXjxªxʧ†ºR>5’ò©Þᨯw8„'Èh49ˆä‡ à ׿lE$>ù/Ý»;p YMt?–o\€¤dù(` ÀF K§Óëfì uš—cCñp5r¹FF§ÓéìïêOž¬®þì3 ªê™gž~ÈÉÉÉÉÍz÷Ý#G„z5~§³¯Ïé”×Sjhhllirsɸ”Nœˆæ·ÙäH •œú“xpôè>Ìóë׿ðÂÆ sëVOOg'ÏWWWWúilª¬¬¬/Ä!ȯƒ:|xíµ]»víJ\ cø}bj{ã7ßܽش饗6n²²f̘5‹aÞ{ïÈ‘ƒyþÅ7lØ´)þ4t² ±mµíay–Bþªª*+W¯z<øî»ï¼£ÐÑátzÞ¸  ¤þXà#MiI)ÏC¸zz8‰ð<`³Y,c)Ôï'Ћ/qœ^¯ÑrŠ!Hª—»ƺ‘°¤ŒÙ.\¸P[«Ô“pçääääåÉ ›’ÂqZ•ÙNæBŽ3Ä÷•®èãÕ‹%AÒ=‘²²òòÒRyºB.----/W ±äoïÞýûCPZšÉ¤×+ÍFé|Üød×Z­F#ŒM!hûö­[_~9¹{‰i·£•=^m= nc¬t—’RZ މ+\'å8£Q¼p\·n͵,èƒ eákjjkÏŸÚ¤íj{A6›Å¢×'v~4YËg0ètÄcoòMI‰fArÅÔ•QŠÞu¡ü{öìÛ§A~øþûdWtjhÛ¶-[vì hçÎ{‚bQ|þ)… ­[‰à±=_}9˜È%ùÄ5t/HI/÷© M!H-}µÛÉ'úâC˜îF+BŸ{Žì×S¢õRÅIë©LÇŽ?NëÅ/Ž(ÿSO=ùdEy3cÆø ð±ýûس‡ç·lÙ¼ydžéïèëãyµ¼^\_Y()•żjõcØ!¨LÊ¡t‚O©^\NMµZÓÒæí·÷î}ë-žß¹sûöW^™„7bÁ`0 ª›+Ö¡]Aå3œ±Uú„I¹^ù¦xëåŸH)ÏGíŒ,9È¿KÇ4€Ïçóù| vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-tarz.png0000644000000000000000000000512612247657030022471 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-compressed-tar.png0000644000000000000000000000512612247657030024441 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/datepicker.css0000644000000000000000000003074512247657030020142 0ustar rootroot/*! * Datepicker for Bootstrap * * Copyright 2012 Stefan Petre * Improvements by Andrew Rowls * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * */ .datepicker { top: 0; left: 0; padding: 4px; margin-top: 1px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; /*.dow { border-top: 1px solid #ddd !important; }*/ } .datepicker:before { content: ''; display: inline-block; border-left: 7px solid transparent; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; border-bottom-color: rgba(0, 0, 0, 0.2); position: absolute; top: -7px; left: 6px; } .datepicker:after { content: ''; display: inline-block; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid #ffffff; position: absolute; top: -6px; left: 7px; } .datepicker > div { display: none; } .datepicker.days div.datepicker-days { display: block; } .datepicker.months div.datepicker-months { display: block; } .datepicker.years div.datepicker-years { display: block; } .datepicker table { margin: 0; } .datepicker td, .datepicker th { text-align: center; width: 20px; height: 20px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .datepicker td.day:hover { background: #eeeeee; cursor: pointer; } .datepicker td.old, .datepicker td.new { color: #999999; } .datepicker td.disabled, .datepicker td.disabled:hover { background: none; color: #999999; cursor: default; } .datepicker td.today, .datepicker td.today:hover, .datepicker td.today.disabled, .datepicker td.today.disabled:hover { background-color: #fde19a; background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); background-image: linear-gradient(top, #fdd49a, #fdf59a); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); border-color: #fdf59a #fdf59a #fbed50; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); } .datepicker td.today:hover, .datepicker td.today:hover:hover, .datepicker td.today.disabled:hover, .datepicker td.today.disabled:hover:hover, .datepicker td.today:active, .datepicker td.today:hover:active, .datepicker td.today.disabled:active, .datepicker td.today.disabled:hover:active, .datepicker td.today.active, .datepicker td.today:hover.active, .datepicker td.today.disabled.active, .datepicker td.today.disabled:hover.active, .datepicker td.today.disabled, .datepicker td.today:hover.disabled, .datepicker td.today.disabled.disabled, .datepicker td.today.disabled:hover.disabled, .datepicker td.today[disabled], .datepicker td.today:hover[disabled], .datepicker td.today.disabled[disabled], .datepicker td.today.disabled:hover[disabled] { background-color: #fdf59a; } .datepicker td.today:active, .datepicker td.today:hover:active, .datepicker td.today.disabled:active, .datepicker td.today.disabled:hover:active, .datepicker td.today.active, .datepicker td.today:hover.active, .datepicker td.today.disabled.active, .datepicker td.today.disabled:hover.active { background-color: #fbf069 \9; } .datepicker td.range, .datepicker td.range:hover, .datepicker td.range.disabled, .datepicker td.range.disabled:hover { background: #eeeeee; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .datepicker td.selected, .datepicker td.selected:hover, .datepicker td.selected.disabled, .datepicker td.selected.disabled:hover { background-color: #9e9e9e; background-image: -moz-linear-gradient(top, #b3b3b3, #808080); background-image: -ms-linear-gradient(top, #b3b3b3, #808080); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); background-image: -webkit-linear-gradient(top, #b3b3b3, #808080); background-image: -o-linear-gradient(top, #b3b3b3, #808080); background-image: linear-gradient(top, #b3b3b3, #808080); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); border-color: #808080 #808080 #595959; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker td.selected:hover, .datepicker td.selected:hover:hover, .datepicker td.selected.disabled:hover, .datepicker td.selected.disabled:hover:hover, .datepicker td.selected:active, .datepicker td.selected:hover:active, .datepicker td.selected.disabled:active, .datepicker td.selected.disabled:hover:active, .datepicker td.selected.active, .datepicker td.selected:hover.active, .datepicker td.selected.disabled.active, .datepicker td.selected.disabled:hover.active, .datepicker td.selected.disabled, .datepicker td.selected:hover.disabled, .datepicker td.selected.disabled.disabled, .datepicker td.selected.disabled:hover.disabled, .datepicker td.selected[disabled], .datepicker td.selected:hover[disabled], .datepicker td.selected.disabled[disabled], .datepicker td.selected.disabled:hover[disabled] { background-color: #808080; } .datepicker td.selected:active, .datepicker td.selected:hover:active, .datepicker td.selected.disabled:active, .datepicker td.selected.disabled:hover:active, .datepicker td.selected.active, .datepicker td.selected:hover.active, .datepicker td.selected.disabled.active, .datepicker td.selected.disabled:hover.active { background-color: #666666 \9; } .datepicker td.active, .datepicker td.active:hover, .datepicker td.active.disabled, .datepicker td.active.disabled:hover { background-color: #006dcc; background-image: -moz-linear-gradient(top, #0088cc, #0044cc); background-image: -ms-linear-gradient(top, #0088cc, #0044cc); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); background-image: -o-linear-gradient(top, #0088cc, #0044cc); background-image: linear-gradient(top, #0088cc, #0044cc); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker td.active:hover, .datepicker td.active:hover:hover, .datepicker td.active.disabled:hover, .datepicker td.active.disabled:hover:hover, .datepicker td.active:active, .datepicker td.active:hover:active, .datepicker td.active.disabled:active, .datepicker td.active.disabled:hover:active, .datepicker td.active.active, .datepicker td.active:hover.active, .datepicker td.active.disabled.active, .datepicker td.active.disabled:hover.active, .datepicker td.active.disabled, .datepicker td.active:hover.disabled, .datepicker td.active.disabled.disabled, .datepicker td.active.disabled:hover.disabled, .datepicker td.active[disabled], .datepicker td.active:hover[disabled], .datepicker td.active.disabled[disabled], .datepicker td.active.disabled:hover[disabled] { background-color: #0044cc; } .datepicker td.active:active, .datepicker td.active:hover:active, .datepicker td.active.disabled:active, .datepicker td.active.disabled:hover:active, .datepicker td.active.active, .datepicker td.active:hover.active, .datepicker td.active.disabled.active, .datepicker td.active.disabled:hover.active { background-color: #003399 \9; } .datepicker td span { display: block; width: 23%; height: 54px; line-height: 54px; float: left; margin: 1%; cursor: pointer; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .datepicker td span:hover { background: #eeeeee; } .datepicker td span.disabled, .datepicker td span.disabled:hover { background: none; color: #999999; cursor: default; } .datepicker td span.active, .datepicker td span.active:hover, .datepicker td span.active.disabled, .datepicker td span.active.disabled:hover { background-color: #006dcc; background-image: -moz-linear-gradient(top, #0088cc, #0044cc); background-image: -ms-linear-gradient(top, #0088cc, #0044cc); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); background-image: -o-linear-gradient(top, #0088cc, #0044cc); background-image: linear-gradient(top, #0088cc, #0044cc); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker td span.active:hover, .datepicker td span.active:hover:hover, .datepicker td span.active.disabled:hover, .datepicker td span.active.disabled:hover:hover, .datepicker td span.active:active, .datepicker td span.active:hover:active, .datepicker td span.active.disabled:active, .datepicker td span.active.disabled:hover:active, .datepicker td span.active.active, .datepicker td span.active:hover.active, .datepicker td span.active.disabled.active, .datepicker td span.active.disabled:hover.active, .datepicker td span.active.disabled, .datepicker td span.active:hover.disabled, .datepicker td span.active.disabled.disabled, .datepicker td span.active.disabled:hover.disabled, .datepicker td span.active[disabled], .datepicker td span.active:hover[disabled], .datepicker td span.active.disabled[disabled], .datepicker td span.active.disabled:hover[disabled] { background-color: #0044cc; } .datepicker td span.active:active, .datepicker td span.active:hover:active, .datepicker td span.active.disabled:active, .datepicker td span.active.disabled:hover:active, .datepicker td span.active.active, .datepicker td span.active:hover.active, .datepicker td span.active.disabled.active, .datepicker td span.active.disabled:hover.active { background-color: #003399 \9; } .datepicker td span.old { color: #999999; } .datepicker th.switch { width: 145px; } .datepicker thead tr:first-child th, .datepicker tfoot tr:first-child th { cursor: pointer; } .datepicker thead tr:first-child th:hover, .datepicker tfoot tr:first-child th:hover { background: #eeeeee; } .input-append.date .add-on i, .input-prepend.date .add-on i { display: block; cursor: pointer; width: 16px; height: 16px; } .input-daterange input { text-align: center; } .input-daterange input:first-child { -webkit-border-radius: 3px 0 0 3px; -moz-border-radius: 3px 0 0 3px; border-radius: 3px 0 0 3px; } .input-daterange input:last-child { -webkit-border-radius: 0 3px 3px 0; -moz-border-radius: 0 3px 3px 0; border-radius: 0 3px 3px 0; } .input-daterange .add-on { display: inline-block; width: auto; min-width: 16px; height: 18px; padding: 4px 5px; font-weight: normal; line-height: 18px; text-align: center; text-shadow: 0 1px 0 #ffffff; vertical-align: middle; background-color: #eeeeee; border: 1px solid #ccc; margin-left: -5px; margin-right: -5px; } .datepicker.dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; float: left; display: none; min-width: 160px; list-style: none; background-color: #ffffff; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; *border-right-width: 2px; *border-bottom-width: 2px; color: #333333; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; line-height: 18px; } .datepicker.dropdown-menu th, .datepicker.dropdown-menu td { padding: 4px 5px; } .datepicker .prev, .datepicker .next { font-style: normal; } .datepicker .prev:after { content: "«"; } .datepicker .next:after { content: "»"; } SOGo-2.1.1b/UI/WebServerResources/mime-spreadsheet.png0000644000000000000000000000670712247657030021260 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW RIDATxÚí[{lTUÿÝ;Ï;3vKiJ[Yp¥P }ª±¬Ê+k+`²Æ³‚<%qcb"f…#D¢n6 X#Ùè&+""-…N[ÛeyIŸØb§ié¼wÿ8ž½wî£óhKIôKÚ;çœïœ{¾Çý}ß9÷\†çyžçñ+M±S=_:ýj€)&m¢¼^¯×ËòüÅY—NÕ~ôý½ßاø;|ˆï‹æ%Ц pcÁÞDö3ôéor´×Ó²m#Àl~ÖfÏæôÍÑæÍ FƒÑ`d˜»¡l%bçÎÕèÎøxþÁGç LGÆÏýfê‘’ßøý< ƒ~?088448´¹Ú:n€¾ÓÎOœ_ógÌ+~­]PùÐs˲,ËÞ=96ÀI맺ïãùÊáÕgD°þ~ áùHŽ'”ÉUøü•–Çæ“¶GóÉëI-Ëj4, ˜Íg±Çq&0000àtW.]9ûß! r,¼Àc–?ÿx9ÀE¸™|C$‡Cÿþx;Ã0LlÅÓ²ô—ºp´E™#º•aä5B ‡Ãá004är ==½½·nÓ¦M›–ž,~$Õ’LÀüGsg>·}á>õ0àðô»&??LØ‚ÇÅR´2tÏècù›´M¬x©A¢¯Ä V«Õ^¯Ïçõ]]]]@JŠÙœ’Ì}à‡“dÌá²ÿ|eÿÚõï Àitº>y†H8Ë‹ÔìÞýÑG/*Bé—¼¿šˆrãÊ9Åõê@þÓ'¢ `Á»°Z­ÖÔTášÙ9£;« `ϳ}ìà«·¿.9ý°’¯¸ùÄ«<ŸÎÜ—7}úÄASš@ªÞÅ‹—.]¸P®„ææ¦¦Ë—ü|ÚÝ“–¤|jPOj€ææ¦¦ÖV`ñâ‚‚… –ežÒÓF¿øé'§³·ÈÊÊÌœ9HжÙl6› ÈÛ1÷¯yÏgþóõµÓVàÉßþ.gÕ ÏÛXk·ßIAÔÑÁP7ÖXã£ø”‰D" ñ<Ën·Ï ‘úH0™8ÎlL&“Ébìv»Ýn²ß¿*Ûœ¾yæó/£ÑÀèø%H ‚ÆR4õ85jnnl¤í £#¨‡‹Ÿ“±ø¤³ó2 ÐÒ=^( …B@nnz:ÏÏððð0°råÊ•O<pœÁÀq€ßObFÆí×€Ñö;áюչΟ{ýQKŪ»h9‘òœ9Fcg'PVVVVR"UPSSSS[ TVVUUV*ŒS_____ÊÛi¹¡Ááp8€eË–-+(ˆž•8 mlllll–.-(XºT¸# Æ>Ÿ×ëó­­­­­­@mmmí¹s€F£Óét€Ùl2™Í@JŠÕj±¹9y‹s-@ó¢ïú[J®KÝÓ;¯ó|öŠÙúû³‡¤$ Hꉱ'ÚË¥:þǘfDâ Hž%EßG«Õh´Z@«%ÙÍ–†e5Àãq»= »»»»« ¸zõêÕkׄ žÛ“Çç| 4¶lhz-ù¹'AjÊ%†©©©©¹pAIñ„êëëë/]Š­v‡ƒxx,jhhhhhˆž‘_SSSSSS4Ï eY†aY ££££½‡ D…Báp$BøB!àÖ­îîîn ¢båÊŠ  ½¥-§}=Ðû]ïw=<Ÿ¹$sIVAüOÂfA„ÊÊÊÊŠ‹åõÔ0……Ë—¯X!çɤ5 …aÕ×*,Œnó76,[¶l™\jj üüüüü| ¤ W¯×ëõx€ÖÖï¿omz{{{oß2×gý%ëà‡ž›oý 2‘¹$+¿6“‚ D "ï/ýM½%9(’î? ë`ñ/1ÄD_)‘= @¯×ëõz‚ý&YX­@FFFÆŒ@jjjªÕ dgggÏž ÌîœÙ5« èy³çÒ­Ó‰Ï?)RR­C9‚b‘‚Ææ‹Er¨JžOcÒÒl6» ¦ìý™áñøõ9!Y¸UÈ‚¢I A˗˳v:ŽÃA …BXjxªxʧ†ºR>5’ò©Þᨯw8„'Èh49ˆä‡ à ׿lE$>ù/Ý»;p YMt?–o\€¤dù(` ÀF K§Óëfì uš—cCñp5r¹FF§ÓéìïêOž¬®þì3 ªê™gž~ÈÉÉÉÉÍz÷Ý#G„z5~§³¯Ïé”×Sjhhllirsɸ”Nœˆæ·ÙäH •œú“xpôè>Ìóë׿ðÂÆ sëVOOg'ÏWWWWúilª¬¬¬/Ä!ȯƒ:|xíµ]»víJ\ cø}bj{ã7ßܽش饗6n²²f̘5‹aÞ{ïÈ‘ƒyþÅ7lØ´)þ4t² ±mµíay–Bþªª*+W¯z<øî»ï¼£ÐÑátzÞ¸  ¤þXà#MiI)ÏC¸zz8‰ð<`³Y,c)Ôï'Ћ/qœ^¯ÑrŠ!Hª—»ƺ‘°¤ŒÙ.\¸P[«Ô“pçääääåÉ ›’ÂqZ•ÙNæBŽ3Ä÷•®èãÕ‹%AÒ=‘²²òòÒRyºB.----/W ±äoïÞýûCPZšÉ¤×+ÍFé|Üød×Z­F#ŒM!hûö­[_~9¹{‰i·£•=^m= nc¬t—’RZ މ+\'å8£Q¼p\·n͵,èƒ eákjjkÏŸÚ¤íj{A6›Å¢×'v~4YËg0ètÄcoòMI‰fArÅÔ•QŠÞu¡ü{öìÛ§A~øþûdWtjhÛ¶-[vì hçÎ{‚bQ|þ)… ­[‰à±=_}9˜È%ùÄ5t/HI/÷© M!H-}µÛÉ'úâC˜îF+BŸ{Žì×S¢õRÅIë©LÇŽ?NëÅ/Ž(ÿSO=ùdEy3cÆø ð±ýûس‡ç·lÙ¼ydžéïèëãyµ¼^\_Y()•żjõcØ!¨LÊ¡t‚O©^\NMµZÓÒæí·÷î}ë-žß¹sûöW^™„7bÁ`0 ª›+Ö¡]Aå3œ±Uú„I¹^ù¦xëåŸH)ÏGíŒ,9È¿KÇ4€Ïçóù| DIV.calendar { text-align: center; } DIV.contactSelection INPUT.button { font-size: 8pt; margin-top: .25em; padding: 0px; } DIV.contactSelection SPAN#selectionLabel { float: left; } DIV#dragDropVisual { background-image: url(abcard.png); background-repeat: no-repeat; background-position: 4px 2px; width: 5px; height: 20px; padding-left: 24px; padding-top: 5px; } DIV.copy { background-image: url(add-contact.gif) !important; background-position: 1px -2px !important; } @media print { div#linkBanner, div#contactFoldersList, div#dragHandle, div#rightDragHandle, div.menu, div#filterPanel, div#contactsListContent { display: none; } div#contactView, div#rightPanel { color: black; top: 0px; left: 0px; margin: 0px; border: none; display: block; visibility: visible; width: 100%; height: 100%; } div.contactColumn h4 { background: none; } } SOGo-2.1.1b/UI/WebServerResources/day-view.png0000644000000000000000000000223212247657030017536 0ustar rootroot‰PNG  IHDR°çá»gAMA±Ž|ûQ“bKGDÿÿÿÿÿÿ X÷Ü oFFsH»:¦– pHYs``zxE vpAgp`ì’ÊFIDATXÃÅWMhAþÆÖÄP,VƒÂ69µ µ¢†ÄR©z° ´ˆÁƒ ½Øƒ"*¢P¤^ÄK)èI/­BÅKŠEƒxUˆÄm,ÖcÝl²;ãaxÎ&»Ûlk«ßeó^æ½ù¾}oßì2!„uqøð±c§N ~ýúå˧O;v´´¬\>ztýúÈÈ¥Kƒƒõ3,R^Pïºsçž={÷êúÌL©dšB4~±ò6’gφ‡ñ¯ÅÁƒ6,Y¢ìææPˆ±X¬^\=Ì7o2yüøµkŒý@ŠÚÛ{{ûûÝ«VýüY*)»¡!‡¶¶Ý»ûúæKX¶lzúÇày_¿ÎdîÝSöœK““ùü«W^SS33€¦mܸoËårù¼ÿú Èç …bX»6•êç%ž.¶mÛBoÞ<þâ…;P׿}ز%‘H¥€t:™ŒÇý×E¡0·¼«WG"K—zV€sÎh4nhp65µ´XpâÄ®]šÄãÑhS‰„B^ëƒb®y‰§GèmÛÜ¡¼¶µUûm{þäç—÷éÓ«W}* ÐÝJ%“Gj1ñäI6{劇U‰Ó§oܘšººÚÛþÿ…þþDBÓÜ<«¡žòÎÎX̲€¾¾D"SccON‡uu1æÜ¢ÚhV?¨]ot4›•¼¤M<}+@­D¨µ½Z¯²k©y$;Ø!HçÔ,°m)€1gÊÛ·³ÙBÁðèÑ‘‘ÆF`bâÇb1…¹¡§gÍšåËîî­[+€s9æ‰ç¬Ó¬T„èéimU7oNL ÀǺ>= œ;—N¯_¿ð††ÆÇ_¾‰ÎÎ+TÀ²,‹s¹Ð¶Ã0M§M ¿e•JÅ"ðàA.W./¼Êo¦ÙܬÆ*ñô¨€œK…Œ†Q.“bg/“ÿׯϟ߾>~üþ½£cáP~Ã(—5 B>‹ÄÓC€TFS¨T*—9†‡ïÞ}÷νÁöí­­‘Éd2ι¼PèííèX·Nñàœnp ÐBÃ'O¦Óñ¸ ¸|y|\×ÑÑ¡¡Í›¥oÓ&y•¯ÅŒÉÖ“Sˆ1ùÛÏ®cBH¿ÌsáÂ;¶-ùÍZzÇ 9kš•ŠV=FÉï|+”¤hzjBŠVµí%À™‡ö£šõ]Èù¥cYraí'§òW[€ÒÒ牴…ð³½Á9cÎJÑ~ª>XµÇÖÅ‹·néº{£³gÇÆä½ù7 ^µ««…„=væÌþýÎùï†J£šÃiUXEyàÔ ¾-D=}ÿþùóéô¿»³ VÛãŒ1Ƙ¦ýob~|ß¿'û7 ߨ 3ŽIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.lotus-1-2-3.png0000644000000000000000000000670712247657030023643 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW RIDATxÚí[{lTUÿÝ;Ï;3vKiJ[Yp¥P }ª±¬Ê+k+`²Æ³‚<%qcb"f…#D¢n6 X#Ùè&+""-…N[ÛeyIŸØb§ié¼wÿ8ž½wî£óhKIôKÚ;çœïœ{¾Çý}ß9÷\†çyžçñ+M±S=_:ýj€)&m¢¼^¯×ËòüÅY—NÕ~ôý½ßاø;|ˆï‹æ%Ц pcÁÞDö3ôéor´×Ó²m#Àl~ÖfÏæôÍÑæÍ FƒÑ`d˜»¡l%bçÎÕèÎøxþÁGç LGÆÏýfê‘’ßøý< ƒ~?088448´¹Ú:n€¾ÓÎOœ_ógÌ+~­]PùÐs˲,ËÞ=96ÀI맺ïãùÊáÕgD°þ~ áùHŽ'”ÉUøü•–Çæ“¶GóÉëI-Ëj4, ˜Íg±Çq&0000àtW.]9ûß! r,¼Àc–?ÿx9ÀE¸™|C$‡Cÿþx;Ã0LlÅÓ²ô—ºp´E™#º•aä5B ‡Ãá004är ==½½·nÓ¦M›–ž,~$Õ’LÀüGsg>·}á>õ0àðô»&??LØ‚ÇÅR´2tÏècù›´M¬x©A¢¯Ä V«Õ^¯Ïçõ]]]]@JŠÙœ’Ì}à‡“dÌá²ÿ|eÿÚõï Àitº>y†H8Ë‹ÔìÞýÑG/*Bé—¼¿šˆrãÊ9Åõê@þÓ'¢ `Á»°Z­ÖÔTášÙ9£;« `ϳ}ìà«·¿.9ý°’¯¸ùÄ«<ŸÎÜ—7}úÄASš@ªÞÅ‹—.]¸P®„ææ¦¦Ë—ü|ÚÝ“–¤|jPOj€ææ¦¦ÖV`ñâ‚‚… –ežÒÓF¿øé'§³·ÈÊÊÌœ9HжÙl6› ÈÛ1÷¯yÏgþóõµÓVàÉßþ.gÕ ÏÛXk·ßIAÔÑÁP7ÖXã£ø”‰D" ñ<Ën·Ï ‘úH0™8ÎlL&“Ébìv»Ýn²ß¿*Ûœ¾yæó/£ÑÀèø%H ‚ÆR4õ85jnnl¤í £#¨‡‹Ÿ“±ø¤³ó2 ÐÒ=^( …B@nnz:ÏÏððð0°råÊ•O<pœÁÀq€ßObFÆí×€Ñö;áюչΟ{ýQKŪ»h9‘òœ9Fcg'PVVVVR"UPSSSS[ TVVUUV*ŒS_____ÊÛi¹¡Ááp8€eË–-+(ˆž•8 mlllll–.-(XºT¸# Æ>Ÿ×ëó­­­­­­@mmmí¹s€F£Óét€Ùl2™Í@JŠÕj±¹9y‹s-@ó¢ïú[J®KÝÓ;¯ó|öŠÙúû³‡¤$ Hꉱ'ÚË¥:þǘfDâ Hž%EßG«Õh´Z@«%ÙÍ–†e5Àãq»= »»»»« ¸zõêÕkׄ žÛ“Çç| 4¶lhz-ù¹'AjÊ%†©©©©¹pAIñ„êëëë/]Š­v‡ƒxx,jhhhhhˆž‘_SSSSSS4Ï eY†aY ££££½‡ D…Báp$BøB!àÖ­îîîn ¢båÊŠ  ½¥-§}=Ðû]ïw=<Ÿ¹$sIVAüOÂfA„ÊÊÊÊŠ‹åõÔ0……Ë—¯X!çɤ5 …aÕ×*,Œnó76,[¶l™\jj üüüüü| ¤ W¯×ëõx€ÖÖï¿omz{{{oß2×gý%ëà‡ž›oý 2‘¹$+¿6“‚ D "ï/ýM½%9(’î? ë`ñ/1ÄD_)‘= @¯×ëõz‚ý&YX­@FFFÆŒ@jjjªÕ dgggÏž ÌîœÙ5« èy³çÒ­Ó‰Ï?)RR­C9‚b‘‚Ææ‹Er¨JžOcÒÒl6» ¦ìý™áñøõ9!Y¸UÈ‚¢I A˗˳v:ŽÃA …BXjxªxʧ†ºR>5’ò©Þᨯw8„'Èh49ˆä‡ à ׿lE$>ù/Ý»;p YMt?–o\€¤dù(` ÀF K§Óëfì uš—cCñp5r¹FF§ÓéìïêOž¬®þì3 ªê™gž~ÈÉÉÉÉÍz÷Ý#G„z5~§³¯Ïé”×Sjhhllirsɸ”Nœˆæ·ÙäH •œú“xpôè>Ìóë׿ðÂÆ sëVOOg'ÏWWWWúilª¬¬¬/Ä!ȯƒ:|xíµ]»víJ\ cø}bj{ã7ßܽش饗6n²²f̘5‹aÞ{ïÈ‘ƒyþÅ7lØ´)þ4t² ±mµíay–Bþªª*+W¯z<øî»ï¼£ÐÑátzÞ¸  ¤þXà#MiI)ÏC¸zz8‰ð<`³Y,c)Ôï'Ћ/qœ^¯ÑrŠ!Hª—»ƺ‘°¤ŒÙ.\¸P[«Ô“pçääääåÉ ›’ÂqZ•ÙNæBŽ3Ä÷•®èãÕ‹%AÒ=‘²²òòÒRyºB.----/W ±äoïÞýûCPZšÉ¤×+ÍFé|Üød×Z­F#ŒM!hûö­[_~9¹{‰i·£•=^m= nc¬t—’RZ މ+\'å8£Q¼p\·n͵,èƒ eákjjkÏŸÚ¤íj{A6›Å¢×'v~4YËg0ètÄcoòMI‰fArÅÔ•QŠÞu¡ü{öìÛ§A~øþûdWtjhÛ¶-[vì hçÎ{‚bQ|þ)… ­[‰à±=_}9˜È%ùÄ5t/HI/÷© M!H-}µÛÉ'úâC˜îF+BŸ{Žì×S¢õRÅIë©LÇŽ?NëÅ/Ž(ÿSO=ùdEy3cÆø ð±ýûس‡ç·lÙ¼ydžéïèëãyµ¼^\_Y()•żjõcØ!¨LÊ¡t‚O©^\NMµZÓÒæí·÷î}ë-žß¹sûöW^™„7bÁ`0 ª›+Ö¡]Aå3œ±Uú„I¹^ù¦xëåŸH)ÏGíŒ,9È¿KÇ4€Ïçóù| vpAg00ÎîŒW;IDATxÚí[ixTåÙ¾gß“™Éd²¯dƒ•@ÙwA–JAmÕÚª­´VDÛÒ*µV+E+|î¨ÐŠ¢(Ù"°&ÙÉFB23™ì™%“Ù·óýx}=‹ U¿~×åóç½ÞÉ™3ç<÷óÜÏö†Ã0 Ã0ø/^§×éu2ŒP*” ¥Îÿõó|]áÿ_?«ÕjµZÆh6š»j€¡“hp°Œ±F[f‘¹Ö|püÜù€ÃøÏjý{ï=ž§½ÓGßa„;Džø“y¹ü•€l»ô5™PyÔ¹êY€ºCÕ­> „ÉÕ^ ˆUǪãò¥R©T*¿?9ß·ª Õús Ó¸«I©Ð¥ê÷uÞßÖ 2kÇêÆeÊݪWÃò;d¿”¯S„“„¹¯˜[Â-8&މkF?0È0Á Ì fs€`{ðR°`Am0p†:ýN5`‹ ŒË?-ÌÇŽ-¯·ÿ æ9Á @Â`üý‰€Ì[3#Æâ§ÅMM˜ñíó@0L SÛY]TY«+/¾ Äl)޽˜ðpþw¡ù!KCóN%§’S ¸Ýn·Ë˜L&“ɘLf³É  °{—Ëét:Çëõx®z!‡Ãáyyyy&jµJp8Ã~ à÷Ók‰D,–H‘H$‰ÿ‡Ýþ"`8i8Ô\®n;Új†‡÷Xfù¯å t@'7)À<Ü80ß:íeíem- srÊiÛñý@®"{jþv saæ=™g7g7wà÷ûý>àóùý~?PRRRR\ ètz½N„ì Yj&¿<É:y&“kbE®"7d õI}RU‡£ÓémÕ sèÐáw–3gΘ1kÌ fs“ÿ8µõø@^!Û)Ÿ ¸¶¹_t¯|ïúª½ii©©@||\\\ —+ €õxó( SuFw,:ßԯ갳¬3çd)acÆ¥ÞüÍøÖ(û[ùæ3Ï0LOgï!c<°Ä{sòÒr/á%üpËÜ2·ÐWë«uˆˆˆˆˆ@( E" ƒA «Ëh4€††úúº: óXçóº(`P;0oè§@Ã3 Ï\êÚÛÛ‘ܑܑ\À%t ]B`çÎ;wìòòòóóòXŠ:tèСÇA‹`6?X¿ó‘I®¸\.—Ëåp†‚&ÿPaš_kÞÙ´ hx½á§uf@ðð_Â`üøÌ̬,@­V«Õj€/çÉøÑ@…¯ÂW$E&k“†›ÄS¥Ó„_ˆÿ€“u§ºÀ0Áð`?ók`rjáô)vÀepw¹ €^o0èõÀÙ góÎL¤^Iµt7`yÀú‚¥ HÿQÚšŒ@ZZZZz: •J$R)¡ hhhhhhŽ----ÚÚ::t:€Ëåpx<–²òòrr²³»îZ»vÍÀçóù|>Àb1›­VàñÇ7nܸ éãô»Ïžíî]À3—ÿ:ü×aàÇSW¥ýx*`kµÉm­€©Íd >]z$õp xAð¢p ™9vì¸q€T*“Éå@ÜŸbÿ· ¨;]·»&PîS5ª3–OŸ;ëþ¯â†èëëïïëc˜òmå¿9í½½ðä’›k•µÊZE8|høôÓ’’ÇÛ­^qûl !;>%q2‡csÙ\Æ9W®þÜûÀÃC¿xX Lûdú¡éwÞ¹víw±±1111ÄC ††€––Ë—ÛÚ€`xNNNVVf&Àãñx<ûœûöíßœ— (ryH ‘H$b1{¿@€èƒaàô}<¯×ëü~âY<Ÿ/N§Ã12hµZmDáÖº"•ÀeOÛ‚V+°té-X>ëúÜp`4v »rñ.ÑÑ.`°i i àó€ÍR.{/¿ÒªŠ?åÏf˜–Üæg›/¾·ý%¾Í@™¡ÌPþ6°øe-_(•*•R h4*•JÄÆÆÅÅÆ²¿ë÷“ M-ÿßA¿3Œ×K¤ÑJ4¶¶¶¶ŽÀbl6›md8y²´ôèQ ?„Ü\3qæq{㞊kbF/þ€YÌ}$–EEÝÝÝÝÝÝ@êú”GÒÖ]Ïo3tþñez¼a¸wâ1ÎF·œ-€×ëóy½„{½^ ++33;2Ešz€BÁ$Uá_€9•³ sd€H$š,¿/ùÝÑ%äžÄòˆR·Z‰‚‡†IZ©TËôùX põþê•Þw÷î>øè# ³S¯×ëYÊR« àuuµµuu@FÆøñÙÙ@¤2âHø€Ñ1 òÊY€ŒŸd$f8€ˆ­ ¿¼ßÏ÷_«l¹¾o˜‚nþdˆa 3&mš<°ÕÛêmg³Ùb1›ñyf,‰Å"qU·°Zm¶áaÀb±Z­VàĉcÇŽ”JF£êë/]jjzzº»{zX˦ϹjÕÊ•·Þ ,Z4þœ9¯—p³@´µ]¹ÒÙɘœœ˜˜p¹<— |>ôôôõ GŽ””;tvêtz=püø‘#ÅÅ@nîĉ“'“4T.4š°0µˆZ93|°(j~ü¼(b V+˜Ÿ˜D‰>Ý´pZ9-K€¥X²yYâw@A“´]¨NÜ{úÅãÏ‹#FÜ Øív»ÝN‚”Ý0 )Œž~ëÖ­[Y …Da••gÏ–•K–,_¾|9 ú| ‹Åb1˽$]¦M›2eòdr§‹IUTtàÀ¡CÀ©SeegÏb1 Ž.yŽÙ³§OŸ6 ˜1ƒ¬jµJ Ü~ûêÕ+W²@FF†…)•€ø¢ôôp1X›ÚËx+e+TËB—Ëív»iëÈÌÌÌ?(^Zœh'° quÑ]_­Çÿ8 }¾áOüýV†Iצ=ñ07dŽj®”-¨Ù´±¡áÒ¥úzÀ8¦»¥;xfáÓ[ŸYÈÀår8Á ˆÏ'øýÀܹsæÌ›äççåeg³ ðù|¾@ظñÉ'ŸzŠJ"‘J¥Râ|> ž^/À0$6L˜Ìš5cÆôé$(K¥·›Y¡ ÞQQ¤n T˜œœ””œL*îü|àSÕ§ŠÃ@ç˺ùÀ/×>°oÝaä%¶ÞøÖ<@_¯¯××3ŒYeÖXô@wdOLO8°gçÞw>x¸õÖåËW®¢££¢bb€öö+WÚÚˆóò€œ@nn.ôÜmîþ)`µŽŒØí@X±@ŸX>À0v;PX8iRA`6“V„JE8{÷î÷ßß½P(Äb>Ÿ6õ€ÁÁÞ^£ñ3+ã@är $„ÄòòŠŠsç€òò³gÏn¾yá €yófÏž1ƒkŽ|7d)ì–[/¾åö¾ï½÷î»ï¼´Ä·Å´kL` ƒí€Î®³ëì@\ . @0 ¡Jˆoì„[æÀÖƒÞÿOÀ¶Ø~qd*`?îXá< ôõõõõö²ŸßOšl"q}ï‹ÀPCCCBBCI:ÉRÁÐÕe05555UU$v]¹’ 1݉@ÃKo¶¼Å& "i©$>ŸLx67?Ǭ~yÕm«_þ"R)¡È¯ µ| @UUõ•ª* þÙ†žúg¤‡’‘¼hjjnnld]”Š×Ë4áz‡¬I86%%%%=ˆŒŒŒŒŒ”ÊÐP¥’(<$„ Î×*ò‹Üêõz½^/ÃP¡- ›Íf³ÙHf±°žh0 Iw€@ÀïHVg±JÅÆ™L*•Éà4]¶Ù€®Â®¼ž óEÃÆ®ÇÅ,ܶ0øÅ”ŸåÝû2©°e²€¾µèψgÄlÉzáàßW7«­_ܘž°¼fzèïèï'®éñ©d©en=PÿÓlŠzB @€¡½¢ÐÐÐÐÀãq»½^Àét»N‹ü~ <\« š›››[Z€¬¬ñãÇ:::;;;ÜÜÜÜœ`hˆ´J¨¥Ÿ{´jnÝB ëÏ™‡ÆËü±Ä€´uY k[Y[Y[ðÞïÞ_óîsÀjË*ëm€}§ó´}'`4vwwu±”tüøÉ“g΂ãü*þ»@ÖòqÛ2hRÔUŠÍ›+6¥ºR]©à¹ø#<¸6éž„;H c=D,&TC[^/ápÚ«¡@ÛÒr¹L¦PH$¬G&&&&&&²Ôd6›ÍfóÕIbÍûµÚðp­–dc. xWWW—Ñ„‡“º†ê¶ù½–¿Öm~¨ò—ÀŒ[§M6õ‚°Ûív»Ý,Ô#j u{j @ÑŽOJ÷–>uËSËÿh##òÃ@_QÿÞ},Çwt§¡áÒ¥æf çO½ ¦QÕÚ$m x]¾A¶¨åÖ ÕݨDÊdEpùrKKk+±\‹…UXx¸VN™hµ¤F¥–Mä÷“a·;v;¤ív’…©T„j¨ê¢£££££¹\.—ÉXÀ"#I0§ß§I‚B!—+$† ³€%%%%¥¤ç«+‹k€Ûß,zcõ7Â× Æví(ïtu”û2?~{ï_Ù2é«Ò(`Nï쮹Í@¨S%Õ–c–ã–£€ÅB*g“‰(´§‡äÝýýýýƒƒ€PH,<%%991‘µèŽŽÎN½(---=yî𯬂yÙù§‚×Äë¤ËŸ? H$¤`S( ™Œ(J&#AX¡BBBBär–¢èûQ*¡õŒFC—‹Œ" å8‡ËŒŒØí6áv†ø|8+œN—Ëᆇ  ™Lxâ‘T¡UÊs!gå­!««ØŠ™R ¾år£Ñhìîfƒ5fk³gÏš5o°nÝ#lØð-0Zˆe²€PÞ ƒÞ \Wí»X´?Ö¾µ½ðÚ}c½—Ô¦>–2D–F4F~„”+ß }o½¡¸ «Eéb5À½—÷3î½ó4ó"óôU]Ð ²ÀÀ»Ús›w5àcüV¿p=ä^âºùÈVd+쿱ß?²0¯·¬µ¬:ÏvÈ;.Þ'ýQþeÇ{GxàÞâÞî]ôÖ÷=Ø»àiøj~ ]¡¢Y¨ã•w+W‘µÒü´&BBØôY,&uLh¨R©V¯¾º}ûŽß£…m É¢®¿Z,V½Å´[Û‚m\ O×Ó÷`zÓüª)°$[þiÎ-Ž c?àëðûªïßÞ<¶G›pÂÁ{€ÿ¨à>þÓ€,MÙÀ2M9¨š¨yª4õL@ËhWEÌ’lI!I6@© *•ìý(ÇÓX3Ø:4bj®Ttìéð-Vq«¨ÕÔ¯¯ºç÷úzc€Ä;ãî‰yˆsô@EÅ… UUijŽï€¯òê”Ó©âè~töòùpýª~ ÀÞ—ME¹œ®ThÚJóùÑ3Ý€îéýÉçìÉs1̉öSO]¶þë¥ÖW^úö¿Þ׌“˜46¶¶¶·³|ï³èƒÓ-ôE®]©áŒ^GËh FWÄŒŸñ3~ÀËõr}N€çáyx¡€ËⲸ‚€Élæ[€öÁózÀä73f0Xº¢Œ© SýaõÚê+@KCÛm@.ž".¤[%ýâÛ¤ö¸¸˜wïßµâ¾$ íníéêéb˜Òǯœ¨NÅŸÙæ@·K÷3ýÀ¶ÙYìh¼¿ràÙÿ}Ãøí w÷5îK€¸Q\$ú2“™)€È$:/*Dkø÷ñï¤Se“d€,D2M2МÐÔ©ÛñÑJÑ vÚßßßßÛ ’ÂÎã!½§èh ±ñò厎CAfN§c˜§KŸ}ó¹^ íÉ+¿nD <]“hfªïP¯$é)dHzHÓDïÚÊ”Ç#ƒvO]ýÚ=—ËãO =já,5‘–@ @Tù|$§•,=hEó{–®½ž~Î õz`‹\Çájòù¼^Ÿìö襤8Úd®¬¼p¡²’¼— X­Ëð0Û$¤Çpš›ÛÛu:Þ¦M›6mÚÌš<þÂ…›6%¿”ôAìS@ÒÝqœ˜ Še R+WÚÛÛÚÈÌ—ÇNœ8qâÔ)òb1päHqqI ªP‡!§¨>|èPq1 “‘>~IÉ‘#G²/|âDié‰l—³¬ìÌ™²2²€òrvp#.œ?_YIö"P]]UU]MŽŸH¥€^¯Ó lšI+nzj‚Ã!Py½8¹\.—ËÈȨ¨ˆ£<Àl&iðƒþâ?ÿùŸÿü¹ääLœXXÈ0wܱzõòå¤wsø0« —Ëét¹Ø “†¶«›c|>´®^¯r£Wú=b“_ ÂW[09I7ÚÒ¿Ùç_IIŸg6f §ŶDȵÀ•+¤'$•@iŒêwp°¿ßdzCM­æZàÜÎÓM§:¿$SÅÓJ*^"!£¾‘RzS‹¦Í1>ÿZ †‡Éu*ݦ$ú=›mdÄfcÛÃ,±ÇL ¯¯··¿Ÿ}>JM~¿ßO‡ðÛÝŒgϽž´DH ãzBgÔ*9G[”‚¸\â”zrbÕá ¤ÝNF£Ò·¤Sdš«¿ÞRÑàAgŸR)„ =¨DÓ44­¸\ú Ô²XÎ'*áJ:iºúº«?gWÊÆD(WSéuôóo[FwWéé‹ÑžBÏ!Ñc.8¯—ŒNs_ÉžžÃÞ÷¿æÿþÛe´âé>$+½½====ÄSûúØàÍwˆŽI>nY³¸bq{ßøLFxô`M/©ÂiïˆÆD¡P ‰ØŠÞf#ƒÚ ¾(z^ü" -Žx+r90'eÖ/gže+‚ÿ:’#£k€í€_+ô:½žË ¸\ àré7¶gDÒïÑ•ŠÍfµ>_ à󑬄VÒ>{]o/™QÓJ›a®=ÀE¥³³££³“].—Ëåv“™´PÈûé&†$ tŸ”Dæ4™ÈÈ;6=ý½œœÜÜìlÖ_ÓÒ22ÒÒØ¡~L Éžl6»Ýéäw+g©ozÔ¯5ËÆS-ÛÚ·—ršÿÔú$0qÆÄ•…vþqû¹7N¯>ñ?—·îáp´±áòpù×8=º8þüù Øü—ŽÚÆŽ;vìX6-¤'€æÄWyá\MI$7¡ÿˆAÎ̱¤åv“†*žV¢¾UÞe¾å€ÿOøŸ˜bæ¼x—ùæú ä †I‚ö´Þÿ«þ×&$0Î?ð?xŽù-à‘û"}IsWàaÿïo¸oŠ6 É“8Ä€ìqY²<(’²@57T¢ú wwÜ¢ØI@ª;eiŠHR'º4@ÚŒÔ%©K€¯RðWÉucí.ÒÿŠ‹KHˆú·˜~fÚ¸âžïMê64–µÕ‚ülÞ8@Ð!úX´f‹¹# N[E>@¸Np(Ë啲&@rBò7ñÇ€8^²L2ˆJW _H‡¥?’I­$Jú.¢P\RôÂWD?íÄÄáb Ø(?)»ÍB…ÈH"%¡âD@þÙlr…Ñ@-}Jò ÓH¹R. lùEd!ÒJéù/Q\€oT­__¾ÄHoúÌæ’‚m‚,!Xû¯Û]k4@aÈÄEwɱIã’Æ®€+àþÿùÿÜÿ¡dgLšÄ0?Çý¸ 3%}ÆÀLÃìiÜ{`ß_†X®×þa½±õ ÔÚvåQíÀNó›Ž7{´q©·¤üáËþ®ä ¼i}õþW^R'¥$ŽÑü øï\¨+ìÚ³ûÈû¯ÿ@1ß÷úy¦£ÀëcÿA¾ùÞ‡ò?ȵò4no"ÿ A(Ú„åê«IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-audio.png0000644000000000000000000000463612247657030020051 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW )IDATxÚí›{pTÕÇ¿÷înÂ&’ »‘G¢X"  ZELÑ"ЊëÈ0ÎØ–XNÛ¡ÇB*OGìHPAD„¶<ÔSy¶ Jˆ yÇfw³{ïÞçéÇ3—lØ Ä5Ë~ÿ¹sîîÞ{Îïs~¿ß9w—#„BVÄ»÷»ÌÁîÀ÷UZÚ¬YëÖuôaîÿ2ïvÇ•F_rÚ2­öÝÀo^z:û02Å6zàìþ÷zLË—/[–—BǦý¼Se¨^sþæ|à™’•›ÞÿȯX¼gò{„üâµé?37x B€ªªª®ååuun7`2ñ<Nj٠¤(C2“ ›)eì@ ذ¥è§¼À‡“¶Å¹ ÉÉËhíy!“4MÓtPUÕ4@–EÓAðùd¨­miñzAe˜¶dj^V$¿÷­9G’,«*z~9B¨á…ž0ÚŠ¢ª@cck« KddD`#CÉO…[Š®–È=ßï ªš¦i€ªRC«ª?Ã3T¸q£©Éë22Òר²½³>;Tš 49Zë¼îžó„@sÀ­§ nï(Jàry<² d§ÿ>Õ lßµoõÙ²žëw ÀB ]&ÇQQf3ǺÎrÒÐÐÚêõ)WïHz8°ðDVÙFÀíñʾÈ !À? 7Žm(il.l:g½Ü\Oª,®Ö(ú H}>E\.¯W’ût[ÑàÝÀÖµ{¯íœrXÈqd6o€½Íë'.˜ Øþ9pAtpM.¬RÌfŽ#Äø]S“Ë%Š@rNÒ¼%À‡«]ºü2àll|ú½ó„àë…§]Z ¤§ÙÇ%Æ;.®ž7o'FªÏ×´ÔŸL&€z‚(Ê2àtÒ…ê))És?ýïí—>{ÿÞõ;„´ÏÄF~FþÊ6dg6›Í<Ïqo¿õúˆ¹ko}ëXç+@K‹ÃáttÛ´¶ºÝ¢ÄŸí_Òß”äü·°æMàÝ㟞<×Úýž2t]× 1r@ %ZãS¬<ÇmÚ–Ÿ<û qs}õÍ5€( ‚$!©¹™‚°ÿÒ¾aèŸ7ö<:XµsËÖ£W iq;eÁóý„Ì£ˆ»Õ¤g3jÍq‹þ2³dÌ1BöüîèáÒ4 amRvÒ€¦ÑG ȰC#¥} ” (ý þ*ðÑævok,ÑæOLŸâ®ñþJŒ0®_YyøðÊ•?ÚèªVþáù5¹6àÉ&}8ük eq}A]=àr9n·áQ’Ds‹µ.ö'q*øt²o€ xj…ç|‘À˜Ÿ§/\ œ8±cÇ‹/Þùýï[`â8Ž8ní¶åi3F“Œ¿‘–HHዚNUU›«r+]Æ÷cr¢+"7“ …Ã[޼9}ðÐð²’ºð0ï¾à¯s²SÒûqÜŒ9ÙŸ¤½ÍŠ<æw.¶ë÷»ïCP°d…YaAV@2ØN¸·)d¨*ݱö6… M {@Pö€ + ÈRUM ‡  *ìA–¦éz@¥ªªAAT8Y½À=ÿCæë¯*¯56R|ðbQU1ðåþ #«šockW·fÍû9Þe€\®F©Gb#O’õ@”fÙg> $,ìWl-Ò=Ó¿/ðèÌñö À”¼qsÒÆ÷é­¸î~GìÈßO7]=NÈïîš}ò·€âÐ_× AµÉ‰Y@ü’x5ö ЧOŸ> Àó&“ÉDK@’dYQhí¦,Ç#´†SÏßÚæ{OBqÛHOà.ð, 9yèP›ÍÑÜ\[[SsçŽ÷Zªªé:Y±± ô` påZÕú– 3:sÒÈ6 >¾_¿˜Àç£ëtEQ]§rëºQ¿ÏJYõ²ªjšªv,/×4Zt+˲̪ ¥¹¬àÐPV¶oߊ€ÉDAó<Ïó¼Ñæ¾S°ÜuRUºÞÐ4ZµuϾKgÖù7ozV¼:!÷á:Àáðxäï árf³Ùl ˜Š–ÒªU¥>Àf0{ÁB–e™œeIºµÍ󴤊™´+©AÃà·?ÂÚf³ÙLËx ¨¡ ¡†gØy`盿¹¸˜øÂ„ÆQÙ@YY•³Y¢ër€ˆçŽ£3Ïhì1²QÛÙ¾ÂíÖ-nõÿß’(Š¢(§ÜfãmþÞ €ÍtÃû‰MŸ¯oDÑWÀb¶ÏÈ25(›¡g*}™Žy‚®ÓÛP±zvþN¥ë`̨葉€$IÕ’dšMÖf×gmÖŸöG¤ûAtX†ÒÂ:ÖÙqák3ëFMª|××Önìöäd«èÛ—‚‹"}‚ik£GÇëEÀëŸæY6BÎÝžL:ää€yÃs_–ÚqÂ0w:¾öÇîßêuð£ý´ uZŸQC€ò¥Õÿv,ÊŽ]Éÿö_@šÏþÄà\ ))>>!p:=I¼^QT#´°˜¯ªí‡ÇîéŸ3Œ‰BÛ²LCŒ|F˜âN&¬KO8˜ûëÉk8Žïf<]µCWp(öšQ¬ýEÑ9¡Ê l_þqÛ¥§_¾2Q; Ä,ŠÕb\@Ôª¨‘ŸÓå§ÅbäÖE¡¡‡•ʲ$É2 I’$I€V&¿'»ŸàÛ%> ÈŽ)¸<—73"à Lš=zîÇ(æwvþößë~.C™ëùÚ€ÿç¬]qæÆWpö¥ýêbÿL¹âm¨®Ok¸ä~pòŒð-”êúƒá Z¦ðW€¸RkyÔ;@jV¢b½Œÿ8}|â³@VuFBR6`Ÿ:(!ÎÜqyéß”t;C¯sï’ð]ïXR À?ÆйþÉ×?ùì°_H`†öoß)=½/è¶0i§Î“?€ö×éSgn¿ñ þ¬ÛtU².àbÈ®êÿ;¿pŽ÷a¹¬IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.rn-realmedia.png0000644000000000000000000001626012247657030024373 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW;IDATxÚí[ixTåÙ¾gß“™Éd²¯dƒ•@ÙwA–JAmÕÚª­´VDÛÒ*µV+E+|î¨ÐŠ¢(Ù"°&ÙÉFB23™ì™%“Ù·óýx}=‹ U¿~×åóç½ÞÉ™3ç<÷óÜÏö†Ã0 Ã0ø/^§×éu2ŒP*” ¥Îÿõó|]áÿ_?«ÕjµZÆh6š»j€¡“hp°Œ±F[f‘¹Ö|püÜù€ÃøÏjý{ï=ž§½ÓGßa„;Džø“y¹ü•€l»ô5™PyÔ¹êY€ºCÕ­> „ÉÕ^ ˆUǪãò¥R©T*¿?9ß·ª Õús Ó¸«I©Ð¥ê÷uÞßÖ 2kÇêÆeÊݪWÃò;d¿”¯S„“„¹¯˜[Â-8&މkF?0È0Á Ì fs€`{ðR°`Am0p†:ýN5`‹ ŒË?-ÌÇŽ-¯·ÿ æ9Á @Â`üý‰€Ì[3#Æâ§ÅMM˜ñíó@0L SÛY]TY«+/¾ Äl)޽˜ðpþw¡ù!KCóN%§’S ¸Ýn·Ë˜L&“ɘLf³É  °{—Ëét:Çëõx®z!‡Ãáyyyy&jµJp8Ã~ à÷Ók‰D,–H‘H$‰ÿ‡Ýþ"`8i8Ô\®n;Új†‡÷Xfù¯å t@'7)À<Ü80ß:íeíem- srÊiÛñý@®"{jþv saæ=™g7g7wà÷ûý>àóùý~?PRRRR\ ètz½N„ì Yj&¿<É:y&“kbE®"7d õI}RU‡£ÓémÕ sèÐáw–3gΘ1kÌ fs“ÿ8µõø@^!Û)Ÿ ¸¶¹_t¯|ïúª½ii©©@||\\\ —+ €õxó( SuFw,:ßԯ갳¬3çd)acÆ¥ÞüÍøÖ(û[ùæ3Ï0LOgï!c<°Ä{sòÒr/á%üpËÜ2·ÐWë«uˆˆˆˆˆ@( E" ƒA «Ëh4€††úúº: óXçóº(`P;0oè§@Ã3 Ï\êÚÛÛ‘ܑܑ\À%t ]B`çÎ;wìòòòóóòXŠ:tèСÇA‹`6?X¿ó‘I®¸\.—Ëåp†‚&ÿPaš_kÞÙ´ hx½á§uf@ðð_Â`üøÌ̬,@­V«Õj€/çÉøÑ@…¯ÂW$E&k“†›ÄS¥Ó„_ˆÿ€“u§ºÀ0Áð`?ók`rjáô)vÀepw¹ €^o0èõÀÙ góÎL¤^Iµt7`yÀú‚¥ HÿQÚšŒ@ZZZZz: •J$R)¡ hhhhhhŽ----ÚÚ::t:€Ëåpx<–²òòrr²³»îZ»vÍÀçóù|>Àb1›­VàñÇ7nܸ éãô»Ïžíî]À3—ÿ:ü×aàÇSW¥ýx*`kµÉm­€©Íd >]z$õp xAð¢p ™9vì¸q€T*“Éå@ÜŸbÿ· ¨;]·»&PîS5ª3–OŸ;ëþ¯â†èëëïïëc˜òmå¿9í½½ðä’›k•µÊZE8|høôÓ’’ÇÛ­^qûl !;>%q2‡csÙ\Æ9W®þÜûÀÃC¿xX Lûdú¡éwÞ¹víw±±1111ÄC ††€––Ë—ÛÚ€`xNNNVVf&Àãñx<ûœûöíßœ— (ryH ‘H$b1{¿@€èƒaàô}<¯×ëü~âY<Ÿ/N§Ã12hµZmDáÖº"•ÀeOÛ‚V+°té-X>ëúÜp`4v »rñ.ÑÑ.`°i i àó€ÍR.{/¿ÒªŠ?åÏf˜–Üæg›/¾·ý%¾Í@™¡ÌPþ6°øe-_(•*•R h4*•JÄÆÆÅÅÆ²¿ë÷“ M-ÿßA¿3Œ×K¤ÑJ4¶¶¶¶ŽÀbl6›md8y²´ôèQ ?„Ü\3qæq{㞊kbF/þ€YÌ}$–EEÝÝÝÝÝÝ@êú”GÒÖ]Ïo3tþñez¼a¸wâ1ÎF·œ-€×ëóy½„{½^ ++33;2Ešz€BÁ$Uá_€9•³ sd€H$š,¿/ùÝÑ%äžÄòˆR·Z‰‚‡†IZ©TËôùX põþê•Þw÷î>øè# ³S¯×ëYÊR« àuuµµuu@FÆøñÙÙ@¤2âHø€Ñ1 òÊY€ŒŸd$f8€ˆ­ ¿¼ßÏ÷_«l¹¾o˜‚nþdˆa 3&mš<°ÕÛêmg³Ùb1›ñyf,‰Å"qU·°Zm¶áaÀb±Z­VàĉcÇŽ”JF£êë/]jjzzº»{zX˦ϹjÕÊ•·Þ ,Z4þœ9¯—p³@´µ]¹ÒÙɘœœ˜˜p¹<— |>ôôôõ GŽ””;tvêtz=püø‘#ÅÅ@nîĉ“'“4T.4š°0µˆZ93|°(j~ü¼(b V+˜Ÿ˜D‰>Ý´pZ9-K€¥X²yYâw@A“´]¨NÜ{úÅãÏ‹#FÜ Øív»ÝN‚”Ý0 )Œž~ëÖ­[Y …Da••gÏ–•K–,_¾|9 ú| ‹Åb1˽$]¦M›2eòdr§‹IUTtàÀ¡CÀ©SeegÏb1 Ž.yŽÙ³§OŸ6 ˜1ƒ¬jµJ Ü~ûêÕ+W²@FF†…)•€ø¢ôôp1X›ÚËx+e+TËB—Ëív»iëÈÌÌÌ?(^Zœh'° quÑ]_­Çÿ8 }¾áOüýV†Iצ=ñ07dŽj®”-¨Ù´±¡áÒ¥úzÀ8¦»¥;xfáÓ[ŸYÈÀår8Á ˆÏ'øýÀܹsæÌ›äççåeg³ ðù|¾@ظñÉ'ŸzŠJ"‘J¥Râ|> ž^/À0$6L˜Ìš5cÆôé$(K¥·›Y¡ ÞQQ¤n T˜œœ””œL*îü|àSÕ§ŠÃ@ç˺ùÀ/×>°oÝaä%¶ÞøÖ<@_¯¯××3ŒYeÖXô@wdOLO8°gçÞw>x¸õÖåËW®¢££¢bb€öö+WÚÚˆóò€œ@nn.ôÜmîþ)`µŽŒØí@X±@ŸX>À0v;PX8iRA`6“V„JE8{÷î÷ßß½P(Äb>Ÿ6õ€ÁÁÞ^£ñ3+ã@är $„ÄòòŠŠsç€òò³gÏn¾yá €yófÏž1ƒkŽ|7d)ì–[/¾åö¾ï½÷î»ï¼´Ä·Å´kL` ƒí€Î®³ëì@\ . @0 ¡Jˆoì„[æÀÖƒÞÿOÀ¶Ø~qd*`?îXá< ôõõõõö²ŸßOšl"q}ï‹ÀPCCCBBCI:ÉRÁÐÕe05555UU$v]¹’ 1݉@ÃKo¶¼Å& "i©$>ŸLx67?Ǭ~yÕm«_þ"R)¡È¯ µ| @UUõ•ª* þÙ†žúg¤‡’‘¼hjjnnld]”Š×Ë4áz‡¬I86%%%%=ˆŒŒŒŒŒ”ÊÐP¥’(<$„ Î×*ò‹Üêõz½^/ÃP¡- ›Íf³ÙHf±°žh0 Iw€@ÀïHVg±JÅÆ™L*•Éà4]¶Ù€®Â®¼ž óEÃÆ®ÇÅ,ܶ0øÅ”ŸåÝû2©°e²€¾µèψgÄlÉzáàßW7«­_ܘž°¼fzèïèï'®éñ©d©en=PÿÓlŠzB @€¡½¢ÐÐÐÐÀãq»½^Àét»N‹ü~ <\« š›››[Z€¬¬ñãÇ:::;;;ÜÜÜÜœ`hˆ´J¨¥Ÿ{´jnÝB ëÏ™‡ÆËü±Ä€´uY k[Y[Y[ðÞïÞ_óîsÀjË*ëm€}§ó´}'`4vwwu±”tüøÉ“g΂ãü*þ»@ÖòqÛ2hRÔUŠÍ›+6¥ºR]©à¹ø#<¸6éž„;H c=D,&TC[^/ápÚ«¡@ÛÒr¹L¦PH$¬G&&&&&&²Ôd6›ÍfóÕIbÍûµÚðp­–dc. xWWW—Ñ„‡“º†ê¶ù½–¿Öm~¨ò—ÀŒ[§M6õ‚°Ûív»Ý,Ô#j u{j @ÑŽOJ÷–>uËSËÿh##òÃ@_QÿÞ},Çwt§¡áÒ¥æf çO½ ¦QÕÚ$m x]¾A¶¨åÖ ÕݨDÊdEpùrKKk+±\‹…UXx¸VN™hµ¤F¥–Mä÷“a·;v;¤ív’…©T„j¨ê¢£££££¹\.—ÉXÀ"#I0§ß§I‚B!—+$† ³€%%%%¥¤ç«+‹k€Ûß,zcõ7Â× Æví(ïtu”û2?~{ï_Ù2é«Ò(`Nï쮹Í@¨S%Õ–c–ã–£€ÅB*g“‰(´§‡äÝýýýýƒƒ€PH,<%%991‘µèŽŽÎN½(---=yî𯬂yÙù§‚×Äë¤ËŸ? H$¤`S( ™Œ(J&#AX¡BBBBär–¢èûQ*¡õŒFC—‹Œ" å8‡ËŒŒØí6áv†ø|8+œN—Ëᆇ  ™Lxâ‘T¡UÊs!gå­!««ØŠ™R ¾år£Ñhìîfƒ5fk³gÏš5o°nÝ#lØð-0Zˆe²€PÞ ƒÞ \Wí»X´?Ö¾µ½ðÚ}c½—Ô¦>–2D–F4F~„”+ß }o½¡¸ «Eéb5À½—÷3î½ó4ó"óôU]Ð ²ÀÀ»Ús›w5àcüV¿p=ä^âºùÈVd+쿱ß?²0¯·¬µ¬:ÏvÈ;.Þ'ýQþeÇ{GxàÞâÞî]ôÖ÷=Ø»àiøj~ ]¡¢Y¨ã•w+W‘µÒü´&BBØôY,&uLh¨R©V¯¾º}ûŽß£…m É¢®¿Z,V½Å´[Û‚m\ O×Ó÷`zÓüª)°$[þiÎ-Ž c?àëðûªïßÞ<¶G›pÂÁ{€ÿ¨à>þÓ€,MÙÀ2M9¨š¨yª4õL@ËhWEÌ’lI!I6@© *•ìý(ÇÓX3Ø:4bj®Ttìéð-Vq«¨ÕÔ¯¯ºç÷úzc€Ä;ãî‰yˆsô@EÅ… UUijŽï€¯òê”Ó©âè~töòùpýª~ ÀÞ—ME¹œ®ThÚJóùÑ3Ý€îéýÉçìÉs1̉öSO]¶þë¥ÖW^úö¿Þ׌“˜46¶¶¶·³|ï³èƒÓ-ôE®]©áŒ^GËh FWÄŒŸñ3~ÀËõr}N€çáyx¡€ËⲸ‚€Élæ[€öÁózÀä73f0Xº¢Œ© SýaõÚê+@KCÛm@.ž".¤[%ýâÛ¤ö¸¸˜wïßµâ¾$ íníéêéb˜Òǯœ¨NÅŸÙæ@·K÷3ýÀ¶ÙYìh¼¿ràÙÿ}Ãøí w÷5îK€¸Q\$ú2“™)€È$:/*Dkø÷ñï¤Se“d€,D2M2МÐÔ©ÛñÑJÑ vÚßßßßÛ ’ÂÎã!½§èh ±ñò厎CAfN§c˜§KŸ}ó¹^ íÉ+¿nD <]“hfªïP¯$é)dHzHÓDïÚÊ”Ç#ƒvO]ýÚ=—ËãO =já,5‘–@ @Tù|$§•,=hEó{–®½ž~Î õz`‹\Çájòù¼^Ÿìö襤8Úd®¬¼p¡²’¼— X­Ëð0Û$¤Çpš›ÛÛu:Þ¦M›6mÚÌš<þÂ…›6%¿”ôAìS@ÒÝqœ˜ Še R+WÚÛÛÚÈÌ—ÇNœ8qâÔ)òb1päHqqI ªP‡!§¨>|èPq1 “‘>~IÉ‘#G²/|âDié‰l—³¬ìÌ™²2²€òrvp#.œ?_YIö"P]]UU]MŽŸH¥€^¯Ó lšI+nzj‚Ã!Py½8¹\.—ËÈȨ¨ˆ£<Àl&iðƒþâ?ÿùŸÿü¹ääLœXXÈ0wܱzõòå¤wsø0« —Ëét¹Ø “†¶«›c|>´®^¯r£Wú=b“_ ÂW[09I7ÚÒ¿Ùç_IIŸg6f §ŶDȵÀ•+¤'$•@iŒêwp°¿ßdzCM­æZàÜÎÓM§:¿$SÅÓJ*^"!£¾‘RzS‹¦Í1>ÿZ †‡Éu*ݦ$ú=›mdÄfcÛÃ,±ÇL ¯¯··¿Ÿ}>JM~¿ßO‡ðÛÝŒgϽž´DH ãzBgÔ*9G[”‚¸\â”zrbÕá ¤ÝNF£Ò·¤Sdš«¿ÞRÑàAgŸR)„ =¨DÓ44­¸\ú Ô²XÎ'*áJ:iºúº«?gWÊÆD(WSéuôóo[FwWéé‹ÑžBÏ!Ñc.8¯—ŒNs_ÉžžÃÞ÷¿æÿþÛe´âé>$+½½====ÄSûúØàÍwˆŽI>nY³¸bq{ßøLFxô`M/©ÂiïˆÆD¡P ‰ØŠÞf#ƒÚ ¾(z^ü" -Žx+r90'eÖ/gže+‚ÿ:’#£k€í€_+ô:½žË ¸\ àré7¶gDÒïÑ•ŠÍfµ>_ à󑬄VÒ>{]o/™QÓJ›a®=ÀE¥³³££³“].—Ëåv“™´PÈûé&†$ tŸ”Dæ4™ÈÈ;6=ý½œœÜÜìlÖ_ÓÒ22ÒÒØ¡~L Éžl6»Ýéäw+g©ozÔ¯5ËÆS-ÛÚ·—ršÿÔú$0qÆÄ•…vþqû¹7N¯>ñ?—·îáp´±áòpù×8=º8þüù Øü—ŽÚÆŽ;vìX6-¤'€æÄWyá\MI$7¡ÿˆAÎ̱¤åv“†*žV¢¾UÞe¾å€ÿOøŸ˜bæ¼x—ùæú ä †I‚ö´Þÿ«þ×&$0Î?ð?xŽù-à‘û"}IsWàaÿïo¸oŠ6 É“8Ä€ìqY²<(’²@57T¢ú wwÜ¢ØI@ª;eiŠHR'º4@ÚŒÔ%©K€¯RðWÉucí.ÒÿŠ‹KHˆú·˜~fÚ¸âžïMê64–µÕ‚ülÞ8@Ð!úX´f‹¹# N[E>@¸Np(Ë啲&@rBò7ñÇ€8^²L2ˆJW _H‡¥?’I­$Jú.¢P\RôÂWD?íÄÄáb Ø(?)»ÍB…ÈH"%¡âD@þÙlr…Ñ@-}Jò ÓH¹R. lùEd!ÒJéù/Q\€oT­__¾ÄHoúÌæ’‚m‚,!Xû¯Û]k4@aÈÄEwɱIã’Æ®€+àþÿùÿÜÿ¡dgLšÄ0?Çý¸ 3%}ÆÀLÃìiÜ{`ß_†X®×þa½±õ ÔÚvåQíÀNó›Ž7{´q©·¤üáËþ®ä ¼i}õþW^R'¥$ŽÑü øï\¨+ìÚ³ûÈû¯ÿ@1ß÷úy¦£ÀëcÿA¾ùÞ‡ò?ȵò4no"ÿ A(Ú„åê«IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/add-user-addressbook.png0000644000000000000000000000320712247657030022016 0ustar rootroot‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs''”iQtIME× Ú‰hIDATHÇ•–[l\W†¿3sŽg<3_’:ñØÎ;IHí”…ˆPA…Ô‡¨J A©%¼ P…@AU"$ÔD‘x /<”R¡ª @ŠB´‰´IIsú:žñÌØ3sn3gßx1„r)KZÚÒ’öÿ­µ÷ÖÚËâCÚkÏ3aéøÉ„Öz7ð¥õ¨ïß{æø«óÿiŸõaÄ_zþ«-þ¥Öú“RÈ,XÝkrÝN~®ˆòkK¤ÓßšHŽã\:räÈüÿXùþ¾õñX|Ä``¬ÏJ~Z§;;Ú:Ú˜™˜¥£³j­Îr¹Žˆ"ÚÒ-dý2333Í0 Ÿ>vìØË÷ò¿>¼þÆ{…ïmF,ËNv®êÈäú­¶\?‰®n®ž»@¶5F¹Xföý<¹N’m6 w Tò5´R<ùÜMçÐvëøñãbÓÑ£Gó6@ÜN¼’îìØµé ɬ]‹Â„uLXgy~Ž ´€“mcæÎ<Ù¾µ<üØÚÁ­UWy÷ì»Ô—®Ÿüûö<ÆððpêÂ… VJÊ‘˜¤‚)¸} ¡50Æ k.Q³Áäíeb-[>1ÄšÕí4ª‹tuv‘ëí¦w Iji‘F­bzzz,`èÞŤÒwÉ8ËÓsh)1J¡•Â(E‹£5åà5–Ù¸¥—îloqžåR¿æ¢…`–§>—´~ôæw­3WNãyÞ–ýû÷çVJ©±dÒ¡²PFKõ§hY3ÈŽ}_¤{Ã:lå…"¥|åb™ÚR•be™ËvÝ;·òÐö>¦åÛ¶mÛ™H$N:t(iH¡Ç¬O×ËUŒT &Ù…Øþ5”±P‘¢:grô%¶”*$’IB? Zu9ÓxÙî¢h¢ãŽi²wï^òùüGoÞ¼yÀ°”“BÏCIð*„a„Àáw§®1lÀz–æÔk ò¾É3Ûߤ–,‘rÊøÂ&>×oñóÑŸâµú¸‰úWl€bÿµ««¦êñ8ÙZ¹J¶£ c²<ÃÓ6%‡Þuƒ„á 7›¾iÉŸñÄC›4ðE†zT'Ð#_ÊáFóøË‹nå‘€uô¨ÖJomµ)å++œ¹ù{.½õ«û CêØÊŸÞ‰„‚PøøÂ×¾pE7¸BàE‚¦ž}ï9I¡Æl'öÙ¥â2ër` ÆH¦ü, !!h”t°c½L¾ý×/Ž6êØ­wØýD'µ ÉÄ+sdªš‚öMxl d4nYq<×Ç(…1Œá©5WxýbHÉÙJ¢¥% aP«¥‰‚ ef½…»™G‚!'ãV’¹…ÚÅÃ'Þ;»Ò‹NÿàóØ­ébaÁµÞ5Lª5±1fk†™’qÈ¥5½ H^\¼Îâ§,ên“‰ó¸HréJ©UX¿øÕ›Á×÷l>`Œé2Ê&ÛžÂhÑ´¡ÍÑôg4³ŠþŒ¦½E3Ë@‹²831‡žŽØŸîÃq}\_¤DLܰÿ¹j­Î%ñÁba‰¾þU+Ùß]ïV³ãnL4"?ûi!bPk””DR¯¾ „·¬ØÁzÕEKÅß•VÄ£F¿îỡëxR´02÷yK[–\Ùq@I5fY†f#Ä«º4|¯ZÇ«¹xuÑŒ0@$¡)-´“"Õ7Hzó]¹Zs!UŸdùÔ/¿0åV.÷§:ƒD2–:ùú()[#E¤cDÊ¢©bDÆ&µv=mƒ²zÝ&Ò}›H¬^‹1 µÆ4ê¨òäµ?‚áò~´ßþÌi©Ìž¿^,`Œ…Óþ‡hß°™ì†Ídúˆ9‰»b2BV¦‹ÈÒ$ª4‰tKƼœ5M^´ÿ •>g·÷ì~æ0†Ht¬ÂƒÖU/Í^$,N o•§”‘â†e1f ç-eÆãÍóWž|uOï)Ô ÇŠ?׳íãV³87ùÍÂ-š…ÛFùÕpcÆuŒq%xûàËçëÿm`ø·SÅo¿±ë£y£.ë{‚RŽøÍ¥iþOûcé•ÍPêªÚIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/menu-nocheck.gif0000644000000000000000000000011212247657030020341 0ustar rootrootGIF89a €ÿÿÿ!þCreated with The GIMP!ù, Œ©ËíO;SOGo-2.1.1b/UI/WebServerResources/UIxMailUserDelegationEditor.js0000644000000000000000000000643412247657030023163 0ustar rootrootvar contactSelectorAction = 'delegation-contacts'; function addDelegate(delegateName, delegateID) { var result = false; if (!$(delegateID)) { var ul = $("delegateList"); var newNode = nodeForDelegate(delegateName, delegateID); ul.appendChild(newNode); var url = window.location.href; var elements = url.split("/"); elements[elements.length-1] = ("addDelegate?uid=" + delegateID); triggerAjaxRequest(elements.join("/"), addDelegateCallback, newNode); result = true; } return result; } function addDelegateCallback(http) { if (http.readyState == 4) { if (!isHttpStatus204(http.status)) { var node = http.callbackData; node.parentNode.removeChild(node); } } } function setEventsOnDelegateNode(node) { node.observe("mousedown", listRowMouseDownHandler); node.observe("selectstart", listRowMouseDownHandler); node.observe("click", onRowClick); } function nodeForDelegate(delegateName, delegateId) { var node = createElement("li"); node.id = delegateId; var span = createElement("span"); span.addClassName("userFullName"); span.appendChild(document.createTextNode(" " + delegateName)); node.appendChild(span); setEventsOnDelegateNode(node); return node; } function onDelegateAdd(event) { openUserFolderSelector(null, "user"); preventDefault(event); } function removeDelegateCallback(http) { var node = http.callbackData; if (http.readyState == 4 && isHttpStatus204(http.status)) node.parentNode.removeChild(node); else log("error deleting delegate: " + node.getAttribute("id")); } function onDelegateRemove(event) { var delegateList = $("delegateList"); var nodes = delegateList.getSelectedRows(); var url = window.location.href; var elements = url.split("/"); elements[elements.length-1] = "removeDelegate?uid="; var baseURL = elements.join("/"); for (var i = 0; i < nodes.length; i++) { var delegateId = nodes[i].id; triggerAjaxRequest(baseURL + delegateId, removeDelegateCallback, nodes[i]); } preventDefault(event); } function subscribeToFolder(refreshCallback, refreshCallbackData) { var result = true; if (UserLogin != refreshCallbackData["folder"]) { result = addDelegate(refreshCallbackData["folderName"], refreshCallbackData["folder"]); } else refreshCallbackData["window"].alert(_("You cannot subscribe to a folder that you own!")); return result; } function onDelegationLoadHandler() { var ul = $("delegateList"); var lis = ul.childNodesWithTag("li"); for (var i = 0; i < lis.length; i++) setEventsOnDelegateNode(lis[i]); var buttonArea = $("delegateSelectorButtons"); if (buttonArea) { var buttons = buttonArea.childNodesWithTag("a"); $("addDelegate").stopObserving ("click"); $("deleteDelegate").stopObserving ("click"); $("addDelegate").observe("mousedown", onDelegateAdd); $("deleteDelegate").observe("mousedown", onDelegateRemove); } Event.observe(window, "unload", onDelegationCloseHandler); } document.observe("dom:loaded", onDelegationLoadHandler); SOGo-2.1.1b/UI/WebServerResources/calendar-folder-16x16.png0000644000000000000000000000111512247657030021615 0ustar rootroot‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYsaa¨?§itIME×IßPÚIDAT8Ë¥“±nA†?_.± QÛ1 A!¢H(H‰Š†–‰à­hxx$$K Ɖí 9øÎwçÝŠ3Ž(@Yiôï¬VßÌîè‡k® À‡gõ›qeÍ £Ô2ôÜ€i€—ó3€`5âíÎýæ+İ  ¥šZ¹WQL Äø–†Eñ UØÜ§0 àä2Ä–óY ðÊÅøüÅf³ý>è>zÓ§ Þ¯hPÄS1Ä)*Š8ãäëö ¹è {øšÉÁ2>^Á‰áÅP/†—RÇÕï<ŸÿOf9Y^0H³œÁiŸiš1è÷HÓ)'½#’$¥Ü%MR\‘-¦PŠŒÚF‡ÊÊö6Q\¥±u›(®Ò¼u‡•Õ­í=¢µ:­}¢J¼ °0±r„¢—ª:W•RMt ³AAƒD” ÄAQZž‹wWŸüü‚»üMÝ€9£Ñ4™2œ’$ £AŸ$Mö¿0™L8í1™üdÐ뒌πøwI*¬Ö·Èr¥¾¾CQë]œƒFû.ÁC«s .,Ä»w½OŸ7þÕ@‡»µe3\ŒÏoü§e³Ùž]×ÍühZ¬qÈIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxTaskEditor.js0000644000000000000000000002335212247657030020346 0ustar rootroot/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ var contactSelectorAction = 'calendars-contacts'; function uixEarlierDate(date1, date2) { // can this be done in a sane way? if (date1 && date2) { if (date1.getYear() < date2.getYear()) return date1; if (date1.getYear() > date2.getYear()) return date2; // same year if (date1.getMonth() < date2.getMonth()) return date1; if (date1.getMonth() > date2.getMonth()) return date2; // same month if (date1.getDate() < date2.getDate()) return date1; if (date1.getDate() > date2.getDate()) return date2; } // same day return null; } function validateDate(which, label) { var result, dateValue; dateValue = this._getDate(which); if (dateValue == null) { alert(label); result = false; } else result = dateValue; return result; } function validateTaskEditor() { var e, startdate, enddate, tmpdate; e = document.getElementById('summary'); if (e.value.length == 0 && !confirm(labels.validate_notitle)) return false; e = document.getElementById('startTime_date'); if (!e.disabled) { startdate = validateDate('start', labels.validate_invalid_startdate); if (!startdate) return false; } e = document.getElementById('dueTime_date'); if (!e.disabled) { enddate = validateDate('due', labels.validate_invalid_enddate); if (!enddate) return false; } if (startdate && enddate) { tmpdate = uixEarlierDate(startdate, enddate); if (tmpdate == enddate) { // window.alert(cuicui); alert(labels.validate_endbeforestart); return false; } else if (tmpdate == null /* means: same date */) { // TODO: check time var startHour, startMinute, endHour, endMinute; var matches; matches = document.forms[0]['startTime_time'].value.match(/([0-9]+):([0-9]+)/); if (matches) { startHour = parseInt(matches[1]); startMinute = parseInt(matches[2]); matches = document.forms[0]['dueTime_time'].value.match(/([0-9]+):([0-9]+)/); if (matches) { endHour = parseInt(matches[1]); endMinute = parseInt(matches[2]); if (startHour > endHour) { alert(labels.validate_endbeforestart); return false; } else if (startHour == endHour) { if (startMinute > endMinute) { alert(labels.validate_endbeforestart); return false; } } } else { alert(labels.validate_invalid_enddate); return false; } } else { alert(labels.validate_invalid_startdate); return false; } } } return true; } function toggleDetails() { var div = $("details"); var buttons = $("buttons"); var buttonsHeight = buttons.clientHeight * 3; if (div.style.visibility) { div.style.visibility = null; window.resizeBy(0, -(div.clientHeight + buttonsHeight)); $("detailsButton").innerHTML = _("Show Details"); } else { div.style.visibility = 'visible;'; window.resizeBy(0, (div.clientHeight + buttonsHeight)); $("detailsButton").innerHTML = _("Hide Details"); } return false; } function toggleCycleVisibility(node, nodeName, hiddenValue) { var spanNode = $(nodeName); var newVisibility = ((node.value == hiddenValue) ? null : 'visible;'); spanNode.style.visibility = newVisibility; if (nodeName == 'cycleSelectionFirstLevel') { var otherSpanNode = $('cycleSelectionSecondLevel'); if (!newVisibility) { otherSpanNode.superVisibility = otherSpanNode.style.visibility; otherSpanNode.style.visibility = null; } else { otherSpanNode.style.visibility = otherSpanNode.superVisibility; otherSpanNode.superVisibility = null; } } } function addContact(tag, fullContactName, contactId, contactName, contactEmail) { var uids = $('uixselector-participants-uidList'); log ("contactId: " + contactId); if (contactId) { var re = new RegExp("(^|,)" + contactId + "($|,)"); log ("uids: " + uids); if (!re.test(uids.value)) { log ("no match... realling adding"); if (uids.value.length > 0) uids.value += ',' + contactId; else uids.value = contactId; var names = $('uixselector-participants-display'); names.innerHTML += ('
  • ' + contactName + '
  • '); } else log ("match... ignoring contact"); } return false; } function onTimeControlCheck(checkBox) { if (checkBox) { var inputs = checkBox.parentNode.getElementsByTagName("input"); var selects = checkBox.parentNode.getElementsByTagName("select"); for (var i = 0; i < inputs.length; i++) if (inputs[i] != checkBox) inputs[i].disabled = !checkBox.checked; for (var i = 0; i < selects.length; i++) if (selects[i] != checkBox) selects[i].disabled = !checkBox.checked; if (checkBox.id == "startDateCB") $("reminderList").disabled = !checkBox.checked; } } function saveEvent(sender) { if (validateTaskEditor()) document.forms['editform'].submit(); return false; } function startDayAsShortString() { return dayAsShortDateString($('startTime_date')); } function dueDayAsShortString() { return dayAsShortDateString($('dueTime_date')); } this._getDate = function(which) { var date = window.timeWidgets[which]['date'].inputAsDate(); var time = window.timeWidgets[which]['time'].value.split(":"); date.setHours(time[0]); date.setMinutes(time[1]); if (isNaN(date.getTime())) return null; return date; }; this._getShadowDate = function(which) { var date = window.timeWidgets[which]['date'].getAttribute("shadow-value").asDate(); var time = window.timeWidgets[which]['time'].getAttribute("shadow-value").split(":"); date.setHours(time[0]); date.setMinutes(time[1]); return date; }; this.getStartDate = function() { return this._getDate('start'); }; this.getDueDate = function() { return this._getDate('due'); }; this.getShadowStartDate = function() { return this._getShadowDate('start'); }; this.getShadowDueDate = function() { return this._getShadowDate('due'); }; this._setDate = function(which, newDate) { window.timeWidgets[which]['date'].setInputAsDate(newDate); window.timeWidgets[which]['time'].value = newDate.getDisplayHoursString(); // Update date picker var dateComponent = jQuery(window.timeWidgets[which]['date']).closest('.date'); dateComponent.data('date', window.timeWidgets[which]['date'].value); dateComponent.datepicker('update'); }; this.setStartDate = function(newStartDate) { this._setDate('start', newStartDate); }; this.setDueDate = function(newDueDate) { this._setDate('due', newDueDate); }; this.onAdjustTime = function(event) { onAdjustDueTime(event); }; this.onAdjustDueTime = function(event) { if (!window.timeWidgets['due']['date'].disabled) { var dateDelta = (window.getStartDate().valueOf() - window.getShadowStartDate().valueOf()); var newDueDate = new Date(window.getDueDate().valueOf() + dateDelta); window.setDueDate(newDueDate); } window.timeWidgets['start']['date'].updateShadowValue(); window.timeWidgets['start']['time'].updateShadowValue(); }; this.initTimeWidgets = function (widgets) { this.timeWidgets = widgets; jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}); jQuery(widgets['due']['date']).closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}); jQuery('#statusTime_date').closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}); jQuery(widgets['start']['date']).change(onAdjustTime); widgets['start']['time'].on("time:change", onAdjustDueTime); widgets['start']['time'].addInterface(SOGoTimePickerInterface); widgets['due']['time'].addInterface(SOGoTimePickerInterface); }; function onStatusListChange(event) { var value = $("statusList").value; var statusTimeDate = $("statusTime_date"); var statusPercent = $("statusPercent"); if (value == "WONoSelectionString") { statusTimeDate.disabled = true; statusPercent.disabled = true; statusPercent.value = ""; } else if (value == "0") { statusTimeDate.disabled = true; statusPercent.disabled = false; } else if (value == "1") { statusTimeDate.disabled = true; statusPercent.disabled = false; } else if (value == "2") { statusTimeDate.disabled = false; statusPercent.disabled = false; statusPercent.value = "100"; } else if (value == "3") { statusTimeDate.disabled = true; statusPercent.disabled = true; } else { statusTimeDate.disabled = true; } } function initializeStatusLine() { var statusList = $("statusList"); if (statusList) { statusList.observe("change", onStatusListChange); } } function onTaskEditorLoad() { if (readOnly == false) { var widgets = {'start': {'date': $("startTime_date"), 'time': $("startTime_time")}, 'due': {'date': $("dueTime_date"), 'time': $("dueTime_time")}}; initTimeWidgets(widgets); } // Enable or disable the reminder list onTimeControlCheck($("startDateCB")); initializeStatusLine(); } document.observe("dom:loaded", onTaskEditorLoad); SOGo-2.1.1b/UI/WebServerResources/quota-level-alert.png0000644000000000000000000000770612247657030021367 0ustar rootroot‰PNG  IHDR š ÷IiCCPICC Profilex­XuT”MÛŸmº»\BÊ]XéZî•\YJ@PP ¤AÊÂAPQÐG }DEQ:$ä}Þ/Î{¾¾9gïùÍo®˜{®¹çšY8E¼#"B‘€°ð¨H{2ÞÕÍh€Ì@ˆzûÒ" lm-¡È(‹AïzI¤ÛraîÑ©(&ÎË(|ì2øJh¶Hè<[XŸŽ}¶°#ÇFEDA™@:ö ôöƒ8bB¤£½!Ä— f ØÂMtì³…ŸÐqŒo]w,W¸_P8¸Iˆuý(4_ØM÷ëçGó ƒø4Hݰ0*´ÏÑ yY߈H¨Ë± ±}^` ‹ô­Ò mÔÿ›£µPo€Øü¿9™3pp-éßÜœýæ\!øzhþÊJ›æ,d0ÃsÒpl9¬gol¬Vll¬W€àA¨otd̦,|DÿW{ëk `p`€GPBè Ø¸;ŒÆL/Xö°N²S9–¹Òx¸yÏòK Ô©7ŠîkÛˆwHšJ=–6–i•Ó”¯%ÈÏ*²’âw~R¶Q©WTÕè×RÔ>²ë­.A/Nÿ!™ÉÐÖèôînfSC³ó¬8­õlBlóìîÛrdv"9;¸D»æ»Ývð˜Û˹OÑÓÂ+Ð;ͧÔ÷Ž_e2(¤lB M˯¦Þ‰x¾8rжÍ#+§t@;Þ0Á<Ñæ ]’C²Ã!»«T“4ýÃêGˆéø ®£¨£³ÇF2Ÿ¿}¢ìdÆ©ð,‡ÓêÙBÙk9ù÷ÏœËKÈw+P-ä,œ,ê<[^_âpN¾Yú¦ìÆù#åî •ÈʪËÕ‰¬/â/Î^j»|æŠoòUÔÕ¾kåש7tj™kë.ܤÕëßb¹5ØPu;¢Q» ×Ôwç\s@‹RËÚÝÎ{Ù÷Ý[%[¿?¸ý0é‘I{ÛëÇeí  wŸ¤>5ý‹í¯—Ï ŸïíïúÔ}¹'´W±wöEC_ìK—+ý-¯v ¬¿¾;˜øFûÍêÛæ¿ã†Ô‡ßݦ(̼¯ÝÿAéÃÜXÃǸO:ãÈñ§Ÿs¾ì™™XøÚþ­`2ô»á‘KSÓ3ų©s!ó. »U—d—E~r¯°¬b×ÀÚêúʯ• ä:óÄ0ÆäÂüŠÕ‚í ‡.g#7‘ç2Ÿ0® ƒP²ðœ(EìÞL¼ARJ*kû²Œ—l‡üŽ™„ cÅs¤9%cå•15õ(FÍm¥]¡:åº/õÑ$²»a²Qåîvã1“ 3!s% K«PëD›¶Evìëî9v8u;¿vqwûá>ï±²±ëÉâÅå-à#ê+á'C!ø+¨j醇š…Y„[Sm"l÷ÛFÚЬ£,£McŒbõâ4쌗MØ–ÈsáàjÒ÷äáCÝ)÷RkÒ § KwÎÐ;*}ŒåØlæëãÍ'JO:åE>-ž ²‡sîæ‰Î³Ë'` ÞÞ)Ê9\L.,™>×Yz®ŒvÞ¬\¬|¾âieiUdµÉ‘ ÓÛ/]¿B®á«ùvõÁµ3×ázયk¹yºžrK«£áÓíæÆÓMþwtš¹›¿¶<¸[pzߤu[ëòƒ¾‡W¥·y?Öil_ìèï¼ù$çiä_ÏTŸ <_ëíîì¹Þ›ÿ"¹/è¥c¿þ+…‘×̯W'ߌ¼íû»c¨ù]íð…‘’÷¹£™RÆâ>R?ùïùl÷ÅxBë+á›Ø$ÛäÚ÷/?ú¦š§ËfÒfýæÈóÛæ.ô,V-Å,ÿäùù~åòjÄšúÚúúÃ_i†›ñG! (=´& ›‰+g¸ÃØÃô™ÉÊÏFd×çpå ãJáÎå¹ÄÛÂ×Å?,0%¸!Ì*",*+¦´Mo n&a!i-e»ÝZÚ\f·¬ŽœŠ¼Ì#až8¢Ð©x”½“¦ä LRaRSmQ;­î§¡¡‰ÓЪÒÞ¿KW§Ó«[¤ç­/§?eÐ@N040Âýµ;ËØÁ„ßdÈô¼™Ÿ¹œù‹›–±V:Öë¸fìì†í«B•Wœ:s±stu»â顽½§koþ>/OyÏy¯ûÞÇ||Å|¿úݦ¤ú[|¼”l"ò5´),=Ü‘*A‰hÝ*Òƒ&G[ŠjÎñŠ%ÆþŒk?¿7A&a&±åà‘$«dÞäw‡ªR‚SI© i͇“ŽÓ1é™G-ޱëÎÌ:ns‚ýD÷ÉS§¬³X³ºNŸÈ¶ÌaÎy–›yÆ<)ïYþ‰«B¶ÂޢܳÎÅ‚ÅïJÊÏ”KçËZΧ•[VðUŒV^­:Wß…ñ‹—2/ﻢRÃ\óñjëµ’ë‰7§1«¹ µº «Ã£+­§­ïdIÎ1l41f2Ñ4 5«0²´r³>góÉNÑþ C“”s¢Ë ›º{‘ÇÆÞÀ}¯¼Œ¼›|ü.úKTÉßÕk§:ELD&G D7Ä:Æ-ÅŸK4>8“|>Å>áðƒôÄ£ÚÇÖ?:y<Ë%[&gåÌ‹ü«…™gCJìJµÎËTðW±\@_WÀUôuæZþ›Ò·4n[76¾[yÿñƒÏmÌí¤Nç§ ÏʺöŒ¾Xïç ê¾5²v|oÿÁü£î8ñ ÿįoï¿·NÏDÏY.àg—Ÿ¬¯…üÒ¤¯x†ÀÀ!Ò@ èà"ÁpÔ‚Nð¬ xJD8" Q‹x‰XBŠ ÉÈ`d.òrÅ‹2DÑP•¨Wh´š†¾‚ÈbÜ0ù˜WX^¬ ¶û'ƒ£âš° Ž U ‹ŒæŒåŒ?™˜j™Ù™#˜_²h²”³²°`ýÂæÎÖÃnÌÞÊ¡ÍÑÌ©ÍÙʵ›«‹Û•ûO4/–÷,ßN¾§ü~@ LPOðƒP†0Qx@ä(Aô-Œù®mÓøjñ=|/$OIYmgßÞ'](ã)+'» ÷X>oG A—ÈOœUèU¬#åíLT¢(Û«UUÕv¨Kià5ñZ’Úr»”uôumõüô òÈõ†ýFËÆx Óx³«æ£–BVÎÖy6ƒvbö·œÐÎ..×ܰî>÷JîËðœòvóéðS¥\ Ì fÉC‡ŽÀí?NãŠ*ޑޭ?@Ž™èp-97eGjÇaŸtqþ˜~æ‡é§ä³z²£sEδå‡òÝ+ö?Ç^ÚtÞ»‚©²¾zÏEÌ¥kWœk~]«¾aU;³ø¹a¢1ëŽZ󻻇ïZûl“yÜבüDáéð³ì.“îÞ–¾„~½ÜëWo.ýúÎgÄ|TsŒôIñ³ú„ù7Ê÷Ì©;33óÊ‹IË]«Û×nÆ7À @ÇÀÐÆL ‘c>‚äDîFÆ#ë‘ßQò¨ ÔÔ´ üÎ;1¼ ¦ËŠ¥`[q¢¸$Ü3†zFqÆ&,S2Ó*sóK+7üª5ÙúØ#8¸8š8ý¸¸¹:¹“yvñ¬ó>â;Îï* '°.8 T'œ-Bu#o#âEÄÙ$+’óRÓÛ§¥gee×åq;x’DSEORÜÎ3J7•_ª,¨ «j„iiuj/ëìÐõÒ+Ðï%³šeîî2á2u3«4Ÿ²Ô³Ê¶·Õµ+²_vtwju‘uÍsÇxÄï™ÝG…±‹òY÷Ëô¨ ²þšN¢¾ÙŸAÓˆšŒ©ŠÛ/’0t°,™’BH]<ü0ýÔÑ=™„ãë'{²*`ÔLóDóg ÛÏž- /58ÏS>^ÙXqÑé²ø•oWë¯ÇÖª×Í×_kðndojjöhYºw²UøAÅ#ñ¶Âv†ŽˆÎOåÿŠö¨ Ý­ßÕ{þEgßD?òÿ€ÌkÒ êÕ·¤¿e‡„Þ1½›i}_>šôÁmŒôûñõ§KãÑŸÉ_¿ôMäuÿ&òmh²ä»ëÞ=SG§ ¦—gnÀ“ƒÀÜóù¤… ïO/,Í-Wÿt\A¯Ô¯z­±­5¯ûýbûÕ°áNÿÖ}ióNÁdH ¥Fâ- á…çÿµ„…FÃ;Ùfá‚O–pkXÓñ—ˆ([GXóÁß -Æa7¬áÝ Áádlöãý¼, <)>ÐÐbˆ-ý#í!†v®ÁÞæ¶³AL wrøÍÇE„nÞqé2™Qdº¼Ä%Úî?2·âažÜÔ툌¶w‚X Êô‡P-èòt_Ë~£ßcC¢ÃC­-!ÇŒä Š2£Ÿby` ¼áÞ(€,!0úýÄCÛTØK4(÷qSî”óf;èhÿ¦½˜M0uÂ<ƒR#¡­-ëO/ä¼Aø†TCš ­ýimz ÝôúGöþ;³eikt[=AÀJýá}ÿhÐ=‡Ýô)¤ÐrDK£•Ъh2ÜõuÑšs¿ Â}Am€ÖCkÃ>ÍîÉÆÉƲ57>ÿ¼£DoÎHø?ìÿò Ï"`ëîg`áÚ(ñ¤£¢”Côú¿–(J\½mH8…7€ÿ\Px³p_^‰DÒÿà™V7z%ˆæ8IDATc|äàÀ,|||06 +++‚ÃÌÌ äüÿÿH²@(ˆ$Ëß¿ÊP8ÿþýCÈ s¸>¢Œç"DIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/MailerUIdTree.js0000644000000000000000000000526312247657030020303 0ustar rootrootvar MailerUIdTreeExtension = { elementCounter: 1, folderIcons: { account: "tbtv_account_17x17.png", inbox: "tbtv_inbox_17x17.png", sent: "tbtv_sent_17x17.png", draft: "tbtv_drafts_17x17.png", trash: "tbtv_trash_17x17.png" }, folderNames: { inbox: _("InboxFolderName"), sent: _("SentFolderName"), draft: _("DraftsFolderName"), trash: _("TrashFolderName") }, _addFolderNode: function (parent, name, fullName, type, unseen) { var icon = this.folderIcons[type]; if (icon) icon = ResourcesURL + "/" + icon; else icon = ""; var displayName = this.folderNames[type]; if (!displayName) displayName = name; displayName += " (" + parseInt(unseen) + ")"; this.add(this.elementCounter, parent, displayName, 1, '#', fullName, type, '', '', icon, icon, true); this.elementCounter++; }, _addFolder: function (parent, folder) { var thisCounter = this.elementCounter; this._addFolderNode(parent, folder.displayName, folder.fullName(), folder.type, folder.unseen); for (var i = 0; i < folder.children.length; i++) this._addFolder(thisCounter, folder.children[i]); }, addMailAccount: function (mailAccount) { this._addFolder(0, mailAccount); }, setCookie: function(cookieName, cookieValue, expires, path, domain, secure) { }, getCookie: function(cookieName) { return (""); }, updateCookie: function () { if (Mailer.foldersStateTimer) clearTimeout(Mailer.foldersStateTimer); Mailer.foldersStateTimer = setTimeout('saveFoldersState()', 3000); // 3 seconds }, getFoldersState: function () { var expandedFolders = new Array(); for (var n = 0; n < this.aNodes.length; n++) { if (this.aNodes[n]._io && this.aNodes[n].pid != this.root.id) { expandedFolders.push(this.aNodes[n].dataname); } } return Object.toJSON(expandedFolders); }, autoSync: function() { this.config.useCookies = true; }, getMailboxNode: function(mailbox) { var childNode = null; for (var i = 0; (childNode == null) && (i < this.aNodes.length); i++) { var aNode = this.aNodes[i]; if (aNode.dataname == mailbox) { childNode = $("smailboxTree" + aNode.id); } } return ((childNode) ? childNode.parentNode : null); } }; Object.extend(dTree.prototype, MailerUIdTreeExtension); SOGo-2.1.1b/UI/WebServerResources/icon-replied.png0000644000000000000000000000103512247657030020363 0ustar rootroot‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs''”iQtIME× *ÕEW‚tEXtCommentCreated with GIMPWxIDAT8Ëå“¿K[Ç¿—Ô ¸YÐ8‡lO¨HŒ‚‚‚):éßàäà(¸uì¡õWЩƒnB0šE( ÎEžˆ%oð¥h’÷éR!qèÔÛŽ»û÷½;éÿ3 Œw›œ2-þÄTkÕàHR¨Cað¾\-_ûZÈæ¬tU Kr:u¾Î $?'i4ÃÀ§ŠW R[)N®N’’ô¢­x8Ø,n¾Úw÷å?ø’$ï·wqøóжKÛ YH#ƒ#5IÅ'`éîánc-¿ÖëÞ»ŠÇãÊçóšÛÓµm€$iezE‘pdÇÌ|I²Àíjnµ¿ø«¨h4*@®ë>oqlQËSË®ÉfæµjõÚÎú·õ¾B¹ 3S½^—3à(ö2¦´“ÖèÐèIófvÙIÀ×ÁY¶”eòã$‰‰G÷€·@¨›Ý÷GÇåcf¾Ì<ì¹×ÞU¼JÐ š÷Ï´€f7ÿô7þ!0ïvÇmgIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/event-grippy-bottom.png0000644000000000000000000000026312247657030021746 0ustar rootroot‰PNG  IHDRÆŠÌd pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF)IDAT[ÅA0±Uw*QO]&@h"ÿáY”ËÛ¸Œ'ÝDlfh*IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-cd-image.png0000644000000000000000000000764112247657030023163 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW,IDATxÚí[[lS[zþ¶ïŽ/‰ssœä8sH ä20NˆB@ârúP ÚªRGÕ¨óЇ¾´/•Zõ±jG­TUj¥>ŒFUUµ† Ð9\N2’ÀÀq€™9r³I|Mâûm÷a¿Ë^öÆqˆ4s~)ZÞÛ{o¯õÿÿý—µ#ɲ,Ë2¾‘ÕNOà·]¾`‡ESí ‰D"‘PÉòýö©Ÿþü*°ò“€aEÈërV^)¾–Q[y‚{ímç}úݯõ@ÝßÖ9mkÀGrû¹Ú€]+»4®n@oÐôIúÊ.'Rµ1àîÝIí§IYÞ7Ö•9`ìh†ýëû%iç"J*•N§R²œÉd2© …áð:òúÍ+=°rÓÿ?þ@wK×ð>pà÷¯÷•J¥R©>Ü:ªà¿­´ÿÕ(Ëß[ýnú÷ýlaÏËr>ˆÏãÇläÜ^éøÝ׉ß_WzžU©Ôj• 0™ŒF³0Æš  ý~àÅÔ‹ÛÏÃ@þ&THÇ~<úý㣀1oÌóc@îß²ÿ‘ùGfí’$I•OÇâ'åÅÑ7å¯(þV’JÏðo€\.—Ëå€p8 ¯×ç[\êëëë£ß:3èLl²k€+¶«±Ÿž‚ñ`<yÿùaÕp‹«¤èò×ßY|Ç»ìMü®Pñ" Å#D­Öh4 ‘H& `aaaan°XL&‹øxÏžþ½M€3¸Ë輌×ߊ\?ø ~Ãò¯Þ› TÅJ"B¢Fá}• ¨¤øÂó…çè³V«Õj4@,–HD£Ì3ÂaÀl6™¬VÀ1ײÐúèœpù:ÿÿ[Gnþ+à—¯VV¶ˆM¤¡ÊÔR®xåÅl$ ’åêOŸ4F«Ôj•J£–—ý~Ÿ`6&m6›Íf\ññß»~øôÉ­_Þ´á|8 m›¢ 1Ÿ/ç å«‘rŠ/TüI­fAY­ÖhT* “Éd²Y ŸÏçóy ¦Æh4™€ššš³™ÅŠúzÀ9ÐqÆin¾úôÊ^ MGÓÑ­±) *ÏóÅYMñwåï—¤j@aßpu–^YLOÅŸxh¦˜ Vk4Ì#ÔjJ?½^¯7£Q¯7µZ’T*Àþ•}ÖþK n¶.Wû¿Àç?º™˜Øªú7Qˆ•RP±BE@”€(§ÂÂãÕÕH$Þ¼yófnXZZ\ôzX,‹Çx<Çùï›L&SM ³Üš ¹ÙnojœÎާ¨¯oh°Ù8H¤p•J’Ôj`zzfæÞ= N§Ói@­ÖjµZÀdª©1™‹Åj5›ÎÝ®N3ðøÀ£À#ÀüÔBóܯdÙéùH×á¬>m­€R Ë—$%î.T>¿ª.`~~~~axð`zúáC Ëår¹\ÀÁƒ:Äl4F#·èT*•J¥¸——————‡gf=¢ÑX,€¶¶ööÖVæ ͲQ’²Ù\ˆÇСP0 ²zB­öìÙ³Çå:½.y÷gÀãÐ?üÅ_N|ô㎟ToΛ@I¹¥é¤R6±X4‹·oߺu÷. Ëù¼,Ç34466666~ÝúHðqmmmmm X]]]]]åèt:NÇ(D¯:;;;;;žžžžž`}}}}}˜šššššž={öìùsÀív»¿ým–iµ l–SmJ_¿üòË/Ÿ?úûûûûú€Ù/^ïžýà{ä{ä}(ËŽAÇ`ëÁ{Â6PP±eÓ'¥tÓïB!àÆŸýìæM¶þ~®°H„QÏììììì,W0§ 6’åªÕÌ2©à"  šL&“É$÷œS§N:u ðù|>Ÿ¸~ýúõë×#GFF††u57™L6›ÍÙ,‰D"ç@ú|>ßÛ·€ã­ÓzøÊûêï¾R8[sïÕÊ×dùå"‚,¡P(T¨ø±±±±±1Àl6›Íf®pR)–®Ô2!€hT¢(ª¥¥¥¥¥8þüùóçË—/_¾|ðx††ZZŽ–nHV«Õjµv»Ýn·~ãÆíÛÀñãÇ?΂¦ÉÄ-±0m•eU¸x^ô :=ãܹsçÎ&''&îÝãÁ^ü=IbYs›ÍfkhֲѦµKÕjs[ ±òA—drò³Ï>ÿjkkkkkY3Œ·bj¡…ŠŠWR°Òýâ±’gð######ÀÝ»wîLL”€§µ’ ƒÑä¿•sçö”+ØâÄÊÊÊŠßÏ89“aÙÞ=ÊŠ'ÊÇrשT<èRð^i$€)æ„Ãáp8 ´µµµµµV«Åbµóóss ¥Š'OÐé´ZN’6»±»©,h#ÅÓôôÔÔƒÀ‘#ÃÃGŽ0—ŽÅJ-T¤Ñb)Ø’çF£ÁPªpŒž“Ͳt’„®£@YÔÿ[â×Ï‹F£QJWñññññq £ƒÕJ¥ÜtÜf*5ÍÂáP(æ×544444ð¼\´xQƒÁ`0° m2U¶hñ9䄘Ɗ†@B”TWWWWWÇG¯×ëõù€öööö¶¶êõ¢$Û@AÅŠXX˜Ÿ_\öîÝ»·«‹õZ2™RJ!Ë.Ì¿5FfñV«25Ï€S’¨PYfûÑh4º¾Î©Gôyòä °k×®]¼å@BͺJ­ ŠebZ¬¤—ʶeA$µµuuµµÜ(Ÿ§ &N\ôØL&“I§“'OžÔ¬s:;:˜(WÂöc¥Š=ž¡!·˜œœœœœ,íZÒ„Å )z]G !Ï q}}}=å §Q¬ÀEÀ•¨‡¸þÅ‹/^¼†‡‡‡‡†ŠïçkÝŒö¶€2ÎÅ@´·····s ¤Âˆ"*h£#‰R¶¢ÔÆG‘ŠHñ~¿ßï÷sÊêêêîîê*VöŽz€2•dlìØ±ÑQàÚµk×®^å•-mžWÚبB7º¿ ޤxÊÒž>}úôéSàÌ™3gNŸf½¦ÂŠ[¹½C$ -$™d”Aæv»Ýn7pñâÅ‹/rn¥ s« U îJÏ¡63ÉÌÌÌÌÌ pøðáÃn7oYÄãlÙlqïh»2¡m£ Âô1—ã“ͲWÿjkëê¬V ¯¯¿¿·¸páÂ… øf<í“gTëJ@ˆ–Nû”Ü¿ÿþýû@_____O"è•E2(J{•¶J?XP) 7:¨BV«óyµš7ÍÜn·ûÐ!Þå|ò„U°££££££¼ I@Rº©ÔÅ{O"@ÄéÓÓÓÓÓÓÇã9|˜+ž[ö2ÔP‹Šõð ±wSuéÝKtÙ Oôž¾NÇzGÇŽ}ç;G²VÃüo–[aéëøâúeÉ2{NåHQ–§Ë2Y˜MŠ*bñ¸ð•?†Y4=«°ªnllllhöíÛ¿Ÿµ2ˆ{‹ .R =—¾ÓÖJ½Q‘JoöU2@¢:–\È2‹iÊ¿¬!ImXâLÕyÕïJB?È^±¥×Ì7Daû˜T|Ìߨ+þÿ/æQoaÂ'~*UÐÆ (Vz9 Š×)˪?U}_õç_×=>?Fq²ÌŽKg¦€¸!A•åß- µ+Àì?½‘^7»vÕw6ñÚÛÈ„ÿJš•^I€í™í¯l?böØ_Æþ€gubÓQEÄtŽøñw]¿î ãÇ>]ºqˆŒýgìç@ÞžoËÛÊ3çfÖ‡¾¯Z‘"R@ŠÖ?³:­ZàÀBÏû?LLOJ|És*MXŒ…=™XŒ§‡DU¿-BÙÚ3¦óT`VŠþGmÊ‚HáT (máý¦‹XïPRA€l4 ªú?å¿‘í•ÿ­jnÿ²h|áIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/menu-check.gif0000644000000000000000000000014612247657030020013 0ustar rootrootGIF89a ³½½½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù, 0ÈIköâ;—Ÿ·ibUZcFE;SOGo-2.1.1b/UI/WebServerResources/RowEditionController.js0000644000000000000000000001000212247657030021762 0ustar rootroot/* bind method: attachToRowElement(row: TD or LI) * callback methods: notifyStartEditingCallback(this) notifyEndEditingCallback(this) notifyNewValueCallback(this, newValue), */ function RowEditionController() { } RowEditionController.prototype = { initialValue: null, rowElement: null, textField: null, /* notification callbacks */ notifyStartEditingCallback: null, notifyEndEditingCallback: null, notifyNewValueCallback: null, /* bind method */ attachToRowElement: function REC_attachToRowElement(rowElement) { var onRowDblClickBound = this.onRowDblClick.bindAsEventListener(this); rowElement.observe("dblclick", onRowDblClickBound); this.rowElement = rowElement; rowElement.editionController = this; }, /* internal */ emptyRow: function REC_emptyRow() { var rowElement = this.rowElement; while (rowElement.firstChild) { rowElement.removeChild(rowElement.firstChild); } }, startEditing: function REC_startEditing() { var rowElement = this.rowElement; rowElement.addClassName("editing"); var value = ""; for (var i = 0; i < rowElement.childNodes.length; i++) { var child = rowElement.childNodes[i]; if (child.nodeType == Node.TEXT_NODE) { value += child.nodeValue; } } this.initialValue = value; this.emptyRow(); this.showInputField(value); this.onBodyMouseDownBound = this.onBodyMouseDown.bindAsEventListener(this); $(document.body).observe("mousedown", this.onBodyMouseDownBound); if (this.notifyStartEditingCallback) { this.notifyStartEditingCallback(this); } }, showInputField: function REC_showInputField(value) { var textField = createElement("input", null, null, {"type": "text"}); this.textField = textField; if (value) { textField.value = value; } this.rowElement.appendChild(textField); var onInputKeyDownBound = this.onInputKeyDown.bindAsEventListener(this); textField.observe("keydown", onInputKeyDownBound); textField.focus(); textField.select(); }, stopEditing: function REC_stopEditing(accept) { var displayValue = (accept ? this.textField.value : this.initialValue); this.textField = null; this.emptyRow(); var rowElement = this.rowElement; rowElement.removeClassName("editing"); rowElement.appendChild(document.createTextNode(displayValue)); this.initialValue = null; $(document.body).stopObserving("mousedown", this.onBodyMouseDownBound); this.onBodyMouseDownBound = null; if (this.notifyEndEditingCallback) { this.notifyEndEditingCallback(this); } }, acceptEdition: function REC_acceptEdition() { var newValue = this.textField.value; var isValid = (newValue && newValue.length > 0); if (this.initialValue != newValue && isValid && this.notifyNewValueCallback) { this.notifyNewValueCallback(this, newValue); } this.stopEditing(isValid); }, cancelEdition: function REC_acceptEdition() { this.stopEditing(false); }, /* event handlers */ onRowDblClick: function REC_onRowDblClick(event) { if (!this.textField) { this.startEditing(); event.stop(); } }, onInputKeyDown: function REC_onInputKeyDown(event) { if (event.keyCode == Event.KEY_ESC) { this.cancelEdition(); event.stop(); } else if (event.keyCode == Event.KEY_RETURN) { this.acceptEdition(); event.stop(); } else if (event.keyCode == Event.KEY_TAB) { this.acceptEdition(); } }, onBodyMouseDown: function REC_onBodyMouseDown(event) { if (event.target != this.textField) { this.acceptEdition(); } } }; SOGo-2.1.1b/UI/WebServerResources/ContactsUI.js0000644000000000000000000015277112247657030017673 0ustar rootroot/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* JavaScript for SOGoContacts */ var cachedContacts = {}; var usersRightsWindowHeight = 194; var usersRightsWindowWidth = 450; var Contact = { currentAddressBook: "/personal", currentContactId: null }; function openContactsFolder(contactsFolder, reload, idx) { if ((contactsFolder && contactsFolder != Contact.currentAddressBook) || reload) { Contact.currentAddressBook = contactsFolder; var url = URLForFolderID(Contact.currentAddressBook, "Contacts") + "/view?noframe=1"; var searchValue = search["contacts"]["value"]; if (searchValue && searchValue.length > 0) url += ("&search=" + search["contacts"]["criteria"] + "&value=" + escape(searchValue.utf8encode())); var sortAttribute = sorting["attribute"]; if (sortAttribute && sortAttribute.length > 0) url += ("&sort=" + sorting["attribute"] + "&asc=" + sorting["ascending"]); var selection; if (idx) { selection = [idx]; } else if (contactsFolder == Contact.currentAddressBook) { var contactsList = $("contactsList"); if (contactsList) selection = contactsList.getSelectedRowsId(); } else selection = null; if (document.contactsListAjaxRequest) { document.contactsListAjaxRequest.aborted = true; document.contactsListAjaxRequest.abort(); } document.contactsListAjaxRequest = triggerAjaxRequest(url, contactsListCallback, selection); } } function contactsListCallback(http) { if (http.readyState == 4) { if (http.status == 200) { document.contactsListAjaxRequest = null; var div = $("contactsListContent"); var table = $("contactsList"); var tbody = table.tBodies[0]; var rows = tbody.getElementsByTagName("TR"); var fullView = (table.tHead.rows[0].cells.length > 2); var data = []; if (http.responseText.length > 0) data = http.responseText.evalJSON(true); tbody.deselectAll(); div.scrollTop = 0; if (data.length > 0) { // Replace existing rows for (var i = 0; i < data.length && i < rows.length; i++) { var contact = data[i]; var row = rows[i]; row.className = contact["c_component"]; row.setAttribute("id", contact["c_name"]); row.setAttribute("categories", contact["c_categories"]); row.setAttribute("contactname", contact["c_cn"]); var cells = row.getElementsByTagName("TD"); $(cells[0]).update(contact["c_cn"]); cells[0].title = contact["c_cn"]; $(cells[1]).update(contact["c_mail"]); cells[1].title = contact["c_mail"]; if (fullView) { $(cells[2]).update(contact["c_screenname"]); $(cells[3]).update(contact["c_o"]); $(cells[4]).update(contact["c_telephonenumber"]); } } // Add extra rows for (var j = i; j < data.length; j++) { var contact = data[j]; var row = createElement("tr", contact["c_name"], contact["c_component"], null, { categories: contact["c_categories"], contactname: contact["c_cn"] }, tbody); var cell = createElement("td", null, ( "displayName" ), null, null, row); cell.appendChild(document.createTextNode(contact["c_cn"])); cell.title = contact["c_cn"]; cell = document.createElement("td"); row.appendChild(cell); if (contact["c_mail"]) { cell.appendChild(document.createTextNode(contact["c_mail"])); cell.title = contact["c_mail"]; } if (fullView) { cell = document.createElement("td"); row.appendChild(cell); if (contact["c_screenname"]) cell.appendChild(document.createTextNode(contact["c_screenname"])); cell = document.createElement("td"); row.appendChild(cell); if (contact["c_o"]) cell.appendChild(document.createTextNode(contact["c_o"])); cell = document.createElement("td"); row.appendChild(cell); if (contact["c_telephonenumber"]) cell.appendChild(document.createTextNode(contact["c_telephonenumber"])); } } } // Remove unnecessary rows for (i = rows.length - 1; i >= data.length; i--) { tbody.removeChild(rows[i]); } if (sorting["attribute"] && sorting["attribute"].length > 0) { var sortHeader; if (sorting["attribute"] == "c_cn") sortHeader = $("nameHeader"); else if (sorting["attribute"] == "c_mail") sortHeader = $("mailHeader"); else if (sorting["attribute"] == "c_screenname") sortHeader = $("screenNameHeader"); else if (sorting["attribute"] == "c_o") sortHeader = $("orgHeader"); else if (sorting["attribute"] == "c_telephonenumber") sortHeader = $("phoneHeader"); else sortHeader = null; if (sortHeader) { var sortImages = $(table.tHead).select(".sortImage"); $(sortImages).each(function(item) { item.remove(); }); var sortImage = createElement("img", "messageSortImage", "sortImage"); sortHeader.insertBefore(sortImage, sortHeader.firstChild); if (sorting["ascending"]) sortImage.src = ResourcesURL + "/arrow-up.png"; else sortImage.src = ResourcesURL + "/arrow-down.png"; } } // Restore selection and scroll to first selected node var selection = http.callbackData; if (selection && tbody.refreshSelectionByIds(selection) > 0) { for (var i = 0; i < selection.length; i++) { var row = $(selection[i]); if (row) { var rowPosition = row.rowIndex * row.getHeight(); if (div.getHeight() < rowPosition) div.scrollTop = rowPosition; // scroll to selected contact row.selectElement(); break; } } } else tbody.deselectAll(); } else { // No more access to this address book; empty the list var table = $("contactsList"); if (table) { var sortImages = $(table.tHead).select(".sortImage"); $(sortImages).each(function(item) { item.remove(); }); var tBody = $(table.tBodies[0]); var length = tBody.rows.length; for (var i = length - 1; i > -1; i--) tBody.removeChild(tBody.rows[i]); } } configureDraggables(); } else log ("ajax problem 1: status = " + http.status); } function onContactContextMenu(event) { var target = Event.element(event); var contact = target.up('TR'); var contactsList = $("contactsList"); var contacts = contactsList.getSelectedRows(); if (contacts.indexOf(contact) < 0) { onRowClick(event, target); contacts = contactsList.getSelectedRows(); } if (contactsList) { var menu = $("contactMenu"); menu.observe("contextmenu:hide", onContactContextMenuHide); popupMenu(event, "contactMenu", contacts); } } function onContactContextMenuHide(event) { var topNode = $("contactsList"); if (topNode.menuSelectedEntry) { $(topNode.menuSelectedEntry).deselect(); topNode.menuSelectedEntry = null; } if (topNode.menuSelectedRows) { var nodes = topNode.menuSelectedRows; for (var i = 0; i < nodes.length; i++) $(nodes[i]).selectElement(); topNode.menuSelectedRows = null; } this.stopObserving("contextmenu:hide", onContactContextMenuHide); } function _onContactMenuAction(folderItem, action, refresh) { var selectedFolders = $("contactFolders").getSelectedNodes(); var folderId = $(folderItem).readAttribute("folderId"); if (folderId) folderId = folderId.substring (1); if (Object.isArray(document.menuTarget) && selectedFolders.length > 0) { var selectedFolderId = $(selectedFolders[0]).readAttribute("id"); var contactIds = $(document.menuTarget).collect(function(row) { return row.getAttribute("id"); }); for (var i = 0; i < contactIds.length; i++) { if (contactIds[i].endsWith ("vlf")) { showAlertDialog(_("Lists can't be moved or copied.")); return false; } } var url = ApplicationBaseURL + selectedFolderId + "/" + action; if (refresh) triggerAjaxRequest(url, actionContactCallback, selectedFolderId, ('folder='+ folderId + '&uid=' + contactIds.join('&uid=')), { "Content-type": "application/x-www-form-urlencoded" }); else triggerAjaxRequest(url, actionContactCallback, null, ('folder='+ folderId + '&uid=' + contactIds.join('&uid=')), { "Content-type": "application/x-www-form-urlencoded" }); } } function onContactMenuCopy(event) { _onContactMenuAction(this, "copy", false); } function onContactMenuMove(event) { _onContactMenuAction(this, "move", true); } function onMenuExportContact (event) { var selectedFolders = $("contactFolders").getSelectedNodes(); var canExport = (selectedFolders[0].getAttribute("owner") != "nobody"); if (canExport) { var selectedFolderId = $(selectedFolders[0]).readAttribute("id"); var contactIds = document.menuTarget.collect(function(row) { return row.readAttribute("id"); }); var url = ApplicationBaseURL + selectedFolderId + "/export" + "?uid=" + contactIds.join("&uid="); window.location.href = url; } } function onMenuRawContact (event) { var cname = document.menuTarget.collect(function(row) { return row.readAttribute("id"); }); openGenericWindow(URLForFolderID(Contact.currentAddressBook) + "/" + cname + "/raw"); } function actionContactCallback(http) { if (http.readyState == 4) if (isHttpStatus204(http.status)) { var refreshFolderId = http.callbackData; if (refreshFolderId) openContactsFolder(refreshFolderId, true); } else { var html = new Element("div").update(http.responseText); var error = html.select("p").first().firstChild.nodeValue.trim(); log("actionContactCallback failed: error " + http.status + " (" + error + ")"); if (parseInt(http.status) == 403) showAlertDialog(_("You don't have the required privileges to perform the operation.")); else if (error) showAlertDialog(_(error)); refreshCurrentFolder(); } } function loadContact(idx) { if (document.contactAjaxRequest) { document.contactAjaxRequest.aborted = true; document.contactAjaxRequest.abort(); } if (cachedContacts[Contact.currentAddressBook + "/" + idx]) { var div = $('contactView'); Contact.currentContactId = idx; div.innerHTML = cachedContacts[Contact.currentAddressBook + "/" + idx]; } else { var url = (URLForFolderID(Contact.currentAddressBook) + "/" + idx + "/view?noframe=1"); document.contactAjaxRequest = triggerAjaxRequest(url, contactLoadCallback, idx); } } function contactLoadCallback(http) { var div = $('contactView'); if (http.readyState == 4 && http.status == 200) { document.contactAjaxRequest = null; var content = http.responseText; cachedContacts[Contact.currentAddressBook + "/" + http.callbackData] = content; Contact.currentContactId = http.callbackData; div.innerHTML = content; } else { log ("ajax problem 2: " + http.status); refreshCurrentFolder(); } } var rowSelectionCount = 0; validateControls(); function showElement(e, shouldShow) { e.style.display = shouldShow ? "" : "none"; } function enableElement(e, shouldEnable) { if(!e) return; if(shouldEnable) { if(e.hasAttribute("disabled")) e.removeAttribute("disabled"); } else { e.setAttribute("disabled", "1"); } } function validateControls() { var e = $("moveto"); this.enableElement(e, rowSelectionCount > 0); } function moveTo(uri) { alert("MoveTo: " + uri); } /* contact menu entries */ function onContactRowDblClick(event) { var t = getTarget(event); var cname = t.parentNode.getAttribute('id'); openContactWindow(URLForFolderID(Contact.currentAddressBook) + "/" + cname + "/edit", cname); return false; } function onContactSelectionChange(event) { var contactView = $("contactView"); if (event) { // Update rows selection var t = getTarget(event); onRowClick(event, t); } if (contactView) { var rows = this.parentNode.getSelectedRowsId(); if (rows.length == 1) { var node = $(rows[0]); loadContact(node.getAttribute('id')); } else if (rows.length > 1) { $('contactView').update(); Contact.currentContactId = null; } } } function onMenuEditContact(event) { onToolbarEditSelectedContacts(event); } function onMenuWriteToContact(event) { onToolbarWriteToSelectedContacts(event); if (document.body.hasClassName("popup")) window.close(); } function onMenuAIMContact(event) { var contactRow = $(document.menuTarget.getAttribute('id')); var aimCell = contactRow.down('td', 2); window.location.href = "aim:goim?ScreenName=" + aimCell.firstChild.nodeValue; } function onMenuDeleteContact(event) { onToolbarDeleteSelectedContacts(event); } function onToolbarEditSelectedContacts(event) { var contactsList = $('contactsList'); var rows = contactsList.getSelectedRowsId(); if (rows.length == 0) { showAlertDialog(_("Please select a contact.")); return false; } for (var i = 0; i < rows.length; i++) { openContactWindow(URLForFolderID(Contact.currentAddressBook) + "/" + rows[i] + "/edit", rows[i]); } return false; } function onToolbarWriteToSelectedContacts(event) { var contactsList = $('contactsList'); var rows = contactsList.getSelectedRowsId(); var rowsWithEmail = 0; if (rows.length == 0) { showAlertDialog(_("Please select a contact.")); } else { openMailComposeWindow(ApplicationBaseURL + "../Mail/compose" + "?folder=" + Contact.currentAddressBook.substring(1) + "&uid=" + rows.join("&uid=")); if (document.body.hasClassName("popup")) window.close(); } return false; } function onToolbarDeleteSelectedContacts(event) { var contactsList = $('contactsList'); var rows = contactsList.getSelectedRowsId(); if (rows && rows.length) showConfirmDialog(_("Confirmation"), _("Are you sure you want to delete the selected contacts?"), onToolbarDeleteSelectedContactsConfirm); else if (!onAddressBookRemove(event)) showAlertDialog(_("Please select a contact.")); return false; } function onToolbarDeleteSelectedContactsConfirm(dialogId) { disposeDialog(); var contactsList = $('contactsList'); var rowIds = contactsList.getSelectedRowsId(); var urlstr = (URLForFolderID(Contact.currentAddressBook) + "/batchDelete"); for (var i = 0; i < rowIds.length; i++) $(rowIds[i]).hide(); triggerAjaxRequest(urlstr, onContactDeleteEventCallback, rowIds, ('ids=' + rowIds.join("/")), { "Content-type": "application/x-www-form-urlencoded" }); } function onContactDeleteEventCallback(http) { var rowIds = http.callbackData; if (http.readyState == 4) { if (isHttpStatus204(http.status)) { var row; var nextRow = null; for (var i = 0; i < rowIds.length; i++) { delete cachedContacts[Contact.currentAddressBook + "/" + rowIds[i]]; row = $(rowIds[i]); var displayName = row.readAttribute("contactname"); if (Contact.currentContactId == row) { Contact.currentContactId = null; } var nextRow = row.next("tr"); if (!nextRow) nextRow = row.previous("tr"); if (row) { row.deselect(); row.parentNode.removeChild(row); } } if (nextRow) { Contact.currentContactId = nextRow.getAttribute("id"); nextRow.selectElement(); loadContact(Contact.currentContactId); } $("contactView").update(); } else if (parseInt(http.status) == 403) { for (var i = 0; i < rowIds.length; i++) { var row = $(rowIds[i]); row.show(); } var displayName = row.readAttribute("contactname"); showAlertDialog(_("You cannot delete the card of \"%{0}\".").formatted(displayName)); } } } function newEmailTo(sender) { var mailto = sanitizeMailTo(sender.parentNode.parentNode.menuTarget.innerHTML); if (mailto.length > 0) openMailComposeWindow("compose?mailto=" + mailto); return false; /* stop following the link */ } function onHeaderClick(event) { var headerId = this.getAttribute("id"); var newSortAttribute; if (headerId == "nameHeader") newSortAttribute = "c_cn"; else if (headerId == "mailHeader") newSortAttribute = "c_mail"; else if (headerId == "screenNameHeader") newSortAttribute = "c_screenname"; else if (headerId == "orgHeader") newSortAttribute = "c_o"; else if (headerId == "phoneHeader") newSortAttribute = "c_telephonenumber"; if (sorting["attribute"] == newSortAttribute) sorting["ascending"] = !sorting["ascending"]; else { sorting["attribute"] = newSortAttribute; sorting["ascending"] = true; } refreshCurrentFolder(); Event.stop(event); } function newContact(sender) { openContactWindow(URLForFolderID(Contact.currentAddressBook) + "/newcontact"); return false; /* stop following the link */ } function newList(sender) { var li = $(Contact.currentAddressBook); var listEditing = li.getAttribute("list-editing"); if (listEditing && listEditing == "available") openContactWindow(URLForFolderID(Contact.currentAddressBook) + "/newlist"); else showAlertDialog(_("You cannot create a list in a shared address book.")); return false; } function onFolderSelectionChange(event) { var folderList = $("contactFolders"); if (event) { var node = getTarget(event); if (node.tagName == 'UL') return; // Update rows selection onRowClick(event, node); } var nodes = folderList.getSelectedNodes(); $("contactView").update(); Contact.currentContactId = null; if (nodes[0].hasClassName("denied")) { var div = $("contactsListContent"); div.update(); } else { search = {}; $$('[name="search"]').each(function(input) { input.value = "" }); initCriteria(); openContactsFolder(nodes[0].getAttribute("id")); } } function refreshCurrentFolder() { openContactsFolder(Contact.currentAddressBook, true); } /* Only used in UIxMailEditor */ function onConfirmContactSelection(event) { var tag = this.getAttribute("name"); var folder = $("contactFolder"); var currentAddressBookName = folder.textContent; var selectorList = null; var initialValues = null; var contactsList = $("contactsList"); var rows = contactsList.getSelectedRows(); for (i = 0; i < rows.length; i++) { var cid = rows[i].getAttribute("id"); if (cid.endsWith (".vlf")) { addListToOpener (tag, Contact.currentAddressBook, currentAddressBookName, cid); } else { var cname = '' + rows[i].readAttribute("contactname"); var email = '' + rows[i].cells[1].innerHTML; addContact(tag, currentAddressBookName + '/' + cname, cid, cname, email); } } this.blur(); // required by IE Event.stop(event); return false; } function addListToOpener (tag, aBookId, aBookName, listId) { var url = UserFolderURL + "Contacts/" + aBookId + "/" + listId + "/properties"; triggerAjaxRequest (url, addListToOpenerCallback, { "aBookId": aBookId, "aBookName": aBookName, "tag": tag }); } function addListToOpenerCallback (http) { var data = http.callbackData; var received = http.responseText.evalJSON (true); for (var i = 0; i < received.length; i++) { var contact = received[i]; addContact(data.tag, data.aBookName + '/' + contact[1], contact[0], contact[1], contact[2]); } } function refreshContacts(cname) { openContactsFolder(Contact.currentAddressBook, true, cname); delete cachedContacts[Contact.currentAddressBook + "/" + cname]; loadContact(cname); return false; } function onAddressBookNew(event) { showPromptDialog(_("New Addressbook..."), _("Name of the Address Book"), onAddressBookNewConfirm); preventDefault(event); } function onAddressBookNewConfirm() { if (this.value.length > 0) createFolder(this.value, appendAddressBook); disposeDialog(); } function appendAddressBook(name, folder) { var owner; var result = true; if (folder) { owner = getSubscribedFolderOwner(folder); folder = accessToSubscribedFolder(folder); } else folder = "/" + name; if (!owner) owner = UserLogin; if ($(folder)) result = false; else { var contactFolders = $("contactFolders"); var items = contactFolders.childNodesWithTag("li"); var li = document.createElement("li"); li = Element.extend(li); // Add the calendar to the proper place var i = getListIndexForFolder(items, owner, name); if (i != items.length) // User is subscribed to other calendars of the same owner contactFolders.insertBefore(li, items[i]); else contactFolders.appendChild(li); li.setAttribute("id", folder); li.setAttribute("owner", owner); li.setAttribute("list-editing", "available"); li.setAttribute("acl-editing", "available"); li.addClassName("local"); li.appendChild(document.createTextNode(name .replace("<", "<", "g") .replace(">", ">", "g"))); updateAddressBooksMenus(); configureDroppables(); } return result; } function newUserFolderCallback(folderData) { var folder = $(folderData["folder"]); if (!folder) appendAddressBook(folderData["folderName"], folderData["folder"]); } function onAddressBookAdd(event) { openUserFolderSelector(newUserFolderCallback, "contact"); preventDefault(event); } function onFolderUnsubscribeCB(folderId) { var node = $(folderId); node.deselect(); node.parentNode.removeChild(node); var personal = $("/personal"); personal.selectElement(); onFolderSelectionChange(); } function onAddressBookExport(event) { var node = $("contactFolders").getSelectedNodes().first(); var folderID = node.getAttribute("id"); var url = URLForFolderID(folderID) + "/exportFolder"; window.location.href = url; event.stop(); hideMenu(document.currentPopupMenu); } function onAddressBookImport(event) { var node = $("contactFolders").getSelectedNodes().first(); var folderId = node.getAttribute("id"); var url = ApplicationBaseURL + folderId + "/import"; $("uploadForm").action = url; $("contactsFile").value = ""; var cellPosition = node.cumulativeOffset(); var cellDimensions = node.getDimensions(); var left = cellDimensions['width'] - 20; var top = cellPosition[1]; var div = $("uploadDialog"); var res = $("uploadResults"); res.setStyle({ top: top + "px", left: left + "px" }); div.setStyle({ top: top + "px", left: left + "px" }); div.show(); } function hideContactsImport(event) { $("uploadDialog").hide(); } function hideImportResults () { $("uploadResults").hide(); } function validateUploadForm () { rc = false; if ($("contactsFile").value.length) { var btn = jQuery('#uploadSubmit'); jQuery('#uploadCancel').fadeOut('fast'); btn.addClass("disabled"); btn.children('span').text(_('Uploading')); rc = true; } return rc; } function uploadCompleted(response) { jQuery('#uploadCancel').show(); var btn = jQuery('#uploadSubmit'); btn.removeClass("disabled"); btn.children('span').text(_('Upload')); var div = $("uploadResults"); try { data = response.evalJSON(true); if (data.imported <= 0) $("uploadResultsContent").update(_("An error occured while importing contacts.")); else if (data.imported == 0) $("uploadResultsContent").update(_("No card was imported.")); else { $("uploadResultsContent").update(_("A total of %{0} cards were imported in the addressbook.").formatted(data.imported)); refreshCurrentFolder(); } } catch (e) { $("uploadResultsContent").update(_("An error occured while importing contacts.")); } hideContactsImport(); $("uploadResults").show(); } function onAddressBookRemove(event) { var selector = $("contactFolders"); var nodes = selector.getSelectedNodes(); if (nodes.length > 0) { var node = $(nodes[0]); var owner = node.getAttribute("owner"); if (owner == "nobody") { var label = _("You cannot remove nor unsubscribe from a public addressbook."); showAlertDialog(label); } else if (owner == UserLogin) { var folderIdElements = node.getAttribute("id").split(":"); var abId = folderIdElements[0].substr(1); deletePersonalAddressBook(abId); } else { var folderId = node.getAttribute("id"); var folderUrl = ApplicationBaseURL + folderId; unsubscribeFromFolder(folderUrl, owner, onFolderUnsubscribeCB, folderId); } } preventDefault(event); return (nodes.length > 0); } function deletePersonalAddressBook(folderId) { if (folderId == "personal") showAlertDialog(_("You cannot remove nor unsubscribe from your personal addressbook.")); else showConfirmDialog(_("Confirmation"), _("Are you sure you want to delete the selected address book?"), deletePersonalAddressBookConfirm.bind(this, folderId)); return false; } function deletePersonalAddressBookConfirm(folderId) { if (document.deletePersonalABAjaxRequest) { document.deletePersonalABAjaxRequest.aborted = true; document.deletePersonalABAjaxRequest.abort(); } var url = ApplicationBaseURL + folderId + "/delete"; document.deletePersonalABAjaxRequest = triggerAjaxRequest(url, deletePersonalAddressBookCallback, folderId); disposeDialog(); } function deletePersonalAddressBookCallback(http) { if (http.readyState == 4) { if (isHttpStatus204(http.status)) { var ul = $("contactFolders"); var children = ul.childNodesWithTag("li"); var i = 0; var done = false; while (!done && i < children.length) { var currentFolderId = children[i].getAttribute("id").substr(1); if (currentFolderId == http.callbackData) { children[i].deselect(); ul.removeChild(children[i]); done = true; } else i++; } var personal = $("/personal"); personal.selectElement(); onFolderSelectionChange(); } document.deletePersonalABAjaxRequest = null; } else log ("ajax problem 5: " + http.status); } function configureDragHandles() { var handle = $("dragHandle"); if (handle) { handle.addInterface(SOGoDragHandlesInterface); handle.leftBlock = $("contactFoldersList"); handle.rightBlock = $("rightPanel"); handle.leftMargin = 100; } handle = $("rightDragHandle"); if (handle) { handle.addInterface(SOGoDragHandlesInterface); handle.upperBlock = $("contactsListContent"); handle.lowerBlock = $("contactView"); } } function lookupDeniedFolders() { var list = $("contactFolders").childNodesWithTag("li"); for (var i = 0; i < list.length; i++) { var folderID = list[i].getAttribute("id"); var url = URLForFolderID(folderID) + "/canAccessContent"; triggerAjaxRequest(url, deniedFoldersLookupCallback, folderID); } } function deniedFoldersLookupCallback(http) { if (http.readyState == 4) { var denied = ! isHttpStatus204(http.status); var entry = $(http.callbackData); if (denied) entry.addClassName("denied"); else entry.removeClassName("denied"); } } function configureAbToolbar() { var toolbar = $("abToolbar"); if (toolbar) { var links = toolbar.childNodesWithTag("a"); $(links[0]).observe("click", onAddressBookNew); $(links[1]).observe("click", onAddressBookAdd); $(links[2]).observe("click", onAddressBookRemove); } } function configureAddressBooks() { var contactFolders = $("contactFolders"); if (contactFolders) { contactFolders.on("mousedown", onFolderSelectionChange); contactFolders.on("dblclick", onAddressBookModify); contactFolders.on("selectstart", listRowMouseDownHandler); contactFolders.attachMenu("contactFoldersMenu"); lookupDeniedFolders(); configureDroppables(); // Select initial addressbook $(Contact.currentAddressBook).selectElement(); } } function onAddressBookMenuPrepareVisibility() { var selectedFolder = $("contactFolders").getSelectedNodes()[0]; if (selectedFolder) { var selectedFolderId = selectedFolder.readAttribute("id"); $(this).select("li").each(function(menuEntry) { if (menuEntry.readAttribute("folderId") == selectedFolderId) menuEntry.addClassName("disabled"); else menuEntry.removeClassName("disabled"); }); } return true; } function updateAddressBooksMenus() { var contactFoldersList = $("contactFolders"); if (contactFoldersList) { var pageContent = $("pageContent"); var contactFolders = contactFoldersList.select("li"); var contactActions = new Hash({ move: onContactMenuMove, copy: onContactMenuCopy }); var actions = contactActions.keys(); for (var j = 0; j < actions.size(); j++) { var key = actions[j]; var callbacks = new Array(); var menuId = key + "ContactMenu"; var menuDIV = $(menuId); if (menuDIV) menuDIV.parentNode.removeChild(menuDIV); menuDIV = document.createElement("div"); pageContent.appendChild(menuDIV); var menu = document.createElement("ul"); menuDIV.appendChild(menu); $(menuDIV).addClassName("menu"); menuDIV.setAttribute("id", menuId); var submenuIds = new Array(); for (var i = 0; i < contactFolders.length; i++) { if (contactFolders[i].hasClassName("local")) { var menuEntry = new Element("li", { folderId: contactFolders[i].readAttribute("id"), owner: contactFolders[i].readAttribute("owner") } ).update(contactFolders[i].innerHTML); menu.appendChild(menuEntry); callbacks.push(contactActions.get(key)); } } menuDIV.prepareVisibility = onAddressBookMenuPrepareVisibility; initMenu(menuDIV, callbacks); } } } function onAddressBookModify(event) { var folders = $("contactFolders"); var selected = folders.getSelectedNodes()[0]; if (selected.getAttribute("owner") != "nobody") { var currentName = selected.innerHTML.unescapeHTML(); showPromptDialog(_("Properties"), _("Address Book Name"), onAddressBookModifyConfirm, currentName); } } function onAddressBookModifyConfirm() { var folders = $("contactFolders"); var selected = folders.getSelectedNodes()[0]; var newName = this.value; var currentName = this.getAttribute("previousValue"); if (newName && newName.length > 0 && newName != currentName) { var url = (URLForFolderID(selected.getAttribute("id")) + "/renameFolder?name=" + escape(newName.utf8encode())); triggerAjaxRequest(url, folderRenameCallback, {node: selected, name: newName}); } disposeDialog(); } function folderRenameCallback(http) { if (http.readyState == 4) { if (isHttpStatus204(http.status)) { var dict = http.callbackData; dict["node"].innerHTML = dict["name"]; } } } function onMenuSharing(event) { if ($(this).hasClassName("disabled")) return; var folders = $("contactFolders"); var selected = folders.getSelectedNodes()[0]; var aclEditing = selected.getAttribute("acl-editing"); if (aclEditing && aclEditing == "available") { var title = this.innerHTML; var url = URLForFolderID(selected.getAttribute("id")); openAclWindow(url + "/acls", title); } else showAlertDialog(_("The user rights cannot be edited for this object!")); } function onAddressBooksMenuPrepareVisibility() { var folders = $("contactFolders"); var selected = folders.getSelectedNodes(); if (selected.length > 0) { var folderOwner = selected[0].getAttribute("owner"); var menu = $("contactFoldersMenu").down("ul");; var listElements = menu.childNodesWithTag("li"); var modifyOption = listElements[0]; var newListOption = listElements[3]; var removeOption = listElements[5]; var exportOption = listElements[7]; var importOption = listElements[8]; var sharingOption = listElements[listElements.length - 1]; // Disable the "Sharing" and "Modify" options when address book // is not owned by user if (folderOwner == UserLogin || IsSuperUser) { modifyOption.removeClassName("disabled"); // WARNING: will fail // for super users // anyway var aclEditing = selected[0].getAttribute("acl-editing"); if (aclEditing && aclEditing == "available") { sharingOption.removeClassName("disabled"); } else { sharingOption.addClassName("disabled"); } } else { modifyOption.addClassName("disabled"); sharingOption.addClassName("disabled"); } var listEditing = selected[0].getAttribute("list-editing"); if (listEditing && listEditing == "available") { newListOption.removeClassName("disabled"); } else { newListOption.addClassName("disabled"); } /* Disable the "remove" and "export ab" options when address book is public */ if (folderOwner == "nobody") { exportOption.addClassName("disabled"); importOption.addClassName("disabled"); removeOption.addClassName("disabled"); } else { exportOption.removeClassName("disabled"); importOption.removeClassName("disabled"); if (selected[0].getAttribute("id") == "/personal") { removeOption.addClassName("disabled"); } else { removeOption.removeClassName("disabled"); } } return true; } return false; } function onContactMenuPrepareVisibility() { var contactRows = document.menuTarget; var selectedFolder = $("contactFolders").getSelectedNodes().first(); var options = { write: false, aim: false }; var elements = $(this).down("ul").childElements(); var categoriesOption = elements[1]; if (selectedFolder.getAttribute("owner") == UserLogin) { categoriesOption.removeClassName("disabled"); } else { categoriesOption.addClassName("disabled"); } $A(contactRows).each(function(contactRow) { var cells = contactRow.getElementsByTagName('td'); var emailCell = cells[1]; options.write |= (emailCell.firstChild != null); var aimCell = cells[2]; options.aim |= (aimCell.firstChild != null); }); var writeOption = elements[3]; if (options.write) writeOption.removeClassName("disabled"); else writeOption.addClassName("disabled"); var aimOption = elements[4]; if (options.aim) aimOption.removeClassName("disabled"); else aimOption.addClassName("disabled"); var deleteOption = elements[6]; var moveOption = elements[8]; if ($(selectedFolder).hasClassName("remote")) { // Remote address books are always read-only deleteOption.addClassName("disabled"); moveOption.addClassName("disabled"); } else { deleteOption.removeClassName("disabled"); moveOption.removeClassName("disabled"); } var exportOption = elements[10]; var rawOption = elements[11]; if ($(selectedFolder).getAttribute("owner") == "nobody") { // public folders (ldap) cannot export or show raw contacts exportOption.addClassName("disabled"); rawOption.addClassName("disabled"); } else { exportOption.removeClassName("disabled"); rawOption.removeClassName("disabled"); } if (contactRows.length != 1) rawOption.addClassName("disabled"); return true; } var originalGetMenus = null; if (typeof getMenus == 'function') { originalGetMenus = getMenus; } getMenus = function() { var menus = {}; menus["contactFoldersMenu"] = new Array(onAddressBookModify, "-", newContact, newList, "-", onAddressBookRemove, "-", onAddressBookExport, onAddressBookImport, "-", onMenuSharing); menus["contactMenu"] = new Array(onMenuEditContact, "categoriesMenu", "-", onMenuWriteToContact, onMenuAIMContact, "-", onMenuDeleteContact, "-", "moveContactMenu", "copyContactMenu", onMenuExportContact, onMenuRawContact); menus["searchMenu"] = new Array(setSearchCriteria, setSearchCriteria, setSearchCriteria); var contactFoldersMenu = $("contactFoldersMenu"); if (contactFoldersMenu) contactFoldersMenu.prepareVisibility = onAddressBooksMenuPrepareVisibility; var contactMenu = $("contactMenu"); if (contactMenu) contactMenu.prepareVisibility = onContactMenuPrepareVisibility; if (originalGetMenus) { var originalMenus = originalGetMenus(); if (originalMenus) menus = Object.extend(menus, originalMenus); } return menus; } function configureSelectionButtons() { var container = $("contactSelectionButtons"); if (container) { var buttons = container.select("A.button"); for (var i = 0; i < buttons.length; i++) { $(buttons[i]).observe("click", onConfirmContactSelection); } } } function onDocumentKeydown(event) { var target = Event.element(event); if (target.tagName != "INPUT" && target.tagName != "TEXTAREA") { var keyCode = event.keyCode; if (!keyCode) { keyCode = event.charCode; if (keyCode == "a".charCodeAt(0)) { keyCode = "A".charCodeAt(0); } } if (keyCode == Event.KEY_DELETE || keyCode == Event.KEY_BACKSPACE && isMac()) { onToolbarDeleteSelectedContacts(); Event.stop(event); } else if (keyCode == Event.KEY_DOWN || keyCode == Event.KEY_UP) { if (Contact.currentContactId) { var row = $(Contact.currentContactId); var nextRow; if (keyCode == Event.KEY_DOWN) nextRow = row.next("tr"); else nextRow = row.previous("tr"); if (nextRow) { row.up().deselectAll(); // Adjust the scollbar var viewPort = $("contactsListContent"); var divDimensions = viewPort.getDimensions(); var rowScrollOffset = nextRow.cumulativeScrollOffset(); var rowPosition = nextRow.positionedOffset(); var divBottom = divDimensions.height + rowScrollOffset.top; var rowBottom = rowPosition.top + nextRow.getHeight(); if (divBottom < rowBottom) viewPort.scrollTop += rowBottom - divBottom; else if (rowScrollOffset.top > rowPosition.top) viewPort.scrollTop -= rowScrollOffset.top - rowPosition.top; // Select and load the next message nextRow.selectElement(); loadContact(nextRow.readAttribute("id")); } Event.stop(event); } } else if (((isMac() && event.metaKey == 1) || (!isMac() && event.ctrlKey == 1)) && keyCode == "A".charCodeAt(0)) { // Ctrl-A $("contactsList").selectAll(); Event.stop(event); } } } /*function fixSearchFieldPosition () { var panel = $("filterPanel"); if (panel) { panel.style.position = "relative"; panel.style.top = "7px"; } }*/ function initContacts(event) { if ($(document.body).hasClassName("popup")) { configureSelectionButtons(); } var foldersList = $("contactFoldersList"); if (foldersList) { configureAbToolbar(); // Addressbook import form $("uploadCancel").observe("click", hideContactsImport); $("uploadOK").observe("click", hideImportResults); } Event.observe(document, "keydown", onDocumentKeydown); configureAddressBooks(); configureDraggables(); updateAddressBooksMenus(); var table = $("contactsList"); if (table) { // Initialize event delegation on contacts table table.multiselect = true; var tbody = $(table.tBodies[0]); tbody.on("click", onContactSelectionChange); if ($("contactView")) { tbody.on("dblclick", onContactRowDblClick); tbody.on("selectstart", listRowMouseDownHandler); tbody.on("contextmenu", onContactContextMenu); resetCategoriesMenu(); TableKit.Resizable.init(table, {'trueResize' : true, 'keepWidth' : true}); } configureSortableTableHeaders(table); } if (typeof onWindowResize != 'function') { // When loaded from the mail editor, onWindowResize is // already registered onWindowResize = onContactsWindowResize; onWindowResize.defer(); Event.observe(window, "resize", onWindowResize); } // Default sort options sorting["attribute"] = "c_cn"; sorting["ascending"] = true; } onContactsWindowResize = function (event) { var handle = $("dragHandle"); if (handle) handle.adjust(); handle = $("rightDragHandle"); if (handle) handle.adjust(); } function resetCategoriesMenu() { var menu = $("categoriesMenu"); if (menu) { menu.parentNode.removeChild(menu); } menu = createElement("div", "categoriesMenu", "menu"); var menuUL = createElement("ul", null, "choiceMenu"); menu.appendChild(menuUL); if (UserDefaults && UserDefaults["SOGoContactsCategories"]) { for (var i = 0; i < UserDefaults["SOGoContactsCategories"].length; i++) { var catName = UserDefaults["SOGoContactsCategories"][i]; if (catName.length > 0) { var menuLI = createElement("li"); menuLI.observe("mousedown", onCategoriesMenuItemClick); menuLI.category = catName; menuLI.appendChild(document.createTextNode(catName)); menuUL.appendChild(menuLI); } } } menu.prepareVisibility = onCategoriesMenuPrepareVisibility; var pageContent = $("pageContent"); pageContent.appendChild(menu); } function onCategoriesMenuPrepareVisibility() { var contactsList = $("contactsList"); if (contactsList) { var rows = contactsList.getSelectedRows(); if (rows.length > 0) { var catList = rows[0].readAttribute("categories"); var catsArray; if (catList && catList.length > 0) { catsArray = catList.split(","); } else { catsArray = []; } var menu = $("categoriesMenu"); var ul = menu.down("ul"); var listElements = ul.select("li"); for (var i = 0; i < listElements.length; i++) { var li = listElements[i]; if (catsArray.indexOf(li.category) > -1) { li.addClassName("_chosen"); } else { li.removeClassName("_chosen"); } } } } return true; } function onCategoriesMenuItemClick() { var set = !this.hasClassName("_chosen"); var method = (set ? "setCategory" : "unsetCategory"); var contactsList = $("contactsList"); var rowIds = contactsList.getSelectedRowsId(); if (rowIds.length > 0) { for (var i = 0; i < rowIds.length; i++) { var url = (URLForFolderID(Contact.currentAddressBook) + "/" + rowIds[i] + "/" + method); url += "?category=" + encodeURIComponent(this.category); triggerAjaxRequest(url, onCategoriesMenuItemCallback, { 'addressBook' : Contact.currentAddressBook, 'id' : rowIds[i] }); if (set) { setCategoryOnNode($(rowIds[i]), this.category); } else { unsetCategoryOnNode($(rowIds[i]), this.category); } } } } function onCategoriesMenuItemCallback(http) { if (http.readyState == 4) if (isHttpStatus204(http.status)) { var contact = http.callbackData; if (cachedContacts[contact.addressBook + "/" + contact.id]) delete cachedContacts[contact.addressBook + "/" + contact.id]; if (contact.addressBook == Contact.currentAddressBook && contact.id == Contact.currentContactId) loadContact(Contact.currentContactId); } else if (parseInt(http.status) == 403) { log("onCategoriesMenuItemCallback failed: error " + http.status + " (" + http.responseText + ")"); } } function setCategoryOnNode(contactNode, category) { var catList = contactNode.getAttribute("categories"); var catsArray = catList.split(","); if (catsArray.indexOf(category) == -1) { catsArray.push(category); contactNode.setAttribute("categories", catsArray.join(",")); } } function unsetCategoryOnNode(contactNode, category) { var catList = contactNode.getAttribute("categories"); var catsArray = catList.split(","); var catIdx = catsArray.indexOf(category); if (catsArray.indexOf(category) > -1) { catsArray.splice(catIdx, 1); contactNode.setAttribute("categories", catsArray.join(",")); } } function configureDraggables() { if ($("contactFolders")) { var rows = jQuery("tr.vcard"); try { rows.draggable("destroy"); } catch (e) {} rows.draggable({ helper: function (event) { return '
    '; }, start: startDragging, drag: whileDragging, stop: stopDragging, appendTo: 'body', cursorAt: { right: 25 }, scroll: false, distance: 4, zIndex: 20 }); } } function configureDroppables() { jQuery("li.local").droppable({ hoverClass: 'genericHoverClass', drop: dropAction }); } function currentFolderIsRemote() { rc = false; var selectedFolders = $("contactFolders").getSelectedNodes(); if (selectedFolders.length > 0) { var fromObject = $(selectedFolders[0]); rc = fromObject.hasClassName("remote"); } return rc; } function startDragging(event, ui) { var row = event.target; var handle = ui.helper; var contacts = $('contactsList').getSelectedRowsId(); var count = contacts.length; if (count == 0 || contacts.indexOf(row.id) < 0) { onRowClick(event, $(row.id)); contacts = $("contactsList").getSelectedRowsId(); count = contacts.length; } handle.html(count); if (event.shiftKey || currentFolderIsRemote()) { handle.addClass("copy"); } handle.show(); } function whileDragging(event, ui) { if (event) { var handle = ui.helper; if (event.shiftKey || currentFolderIsRemote()) handle.addClass("copy"); else if (handle.hasClass("copy")) handle.removeClass("copy"); } } function stopDragging(event, ui) { var handle = ui.helper; handle.hide(); if (handle.hasClass("copy")) handle.removeClass("copy"); } function dropAction(event, ui) { var action = "move"; if (ui.helper.hasClass("copy")) action = "copy"; else $('contactView').update(); dropSelectedContacts(action, this.id.substr(1)); } function dropSelectedContacts(action, toId) { var selectedFolders = $("contactFolders").getSelectedNodes(); if (selectedFolders.length > 0) { var contactIds = $('contactsList').getSelectedRowsId(); for (var i = 0; i < contactIds.length; i++) { if (contactIds[i].endsWith("vlf")) { showAlertDialog(_("Lists can't be moved or copied.")); return false; } } var fromId = $(selectedFolders[0]).id; if ((!currentFolderIsRemote() || action != "move") && fromId.substring(1) != toId) { var url = ApplicationBaseURL + fromId + "/" + action; triggerAjaxRequest(url, actionContactCallback, fromId, ('folder='+ toId + '&uid=' + contactIds.join('&uid=')), { "Content-type": "application/x-www-form-urlencoded" }); } } } function onContactsReload () { openContactsFolder(Contact.currentAddressBook, true); } document.observe("dom:loaded", initContacts); SOGo-2.1.1b/UI/WebServerResources/important.png0000644000000000000000000000173712247657030020037 0ustar rootroot‰PNG  IHDR q'äw;iCCPICC Profilex…”KhÔP†ÿŒ)‚´‚¨µ”àB‹´%>ЊPÛiµÖ‘qûÐ"È4sgM31™ˆHAÜùZŠˆ‹*âBºPp¥ ‘BëkQq¥"ˆB7RÆÿ&íL*V/$ùrÎÏë†USŽcE4`ØÎ»É®¨vèð€¶xU¨A5¸R†ç´'û}¦V>ç¯é·P¤e²IÆŠõ˜ø´mõýKbïëžöúžùúyo5.ŠFëŠlÀ[%¼Wòɼ“§æˆdc(•&;äF·'ÙA¾A^š ñ`ˆÓÂ3€ª6jr†ã2Nd¹¥hdeÌQ²n§M›<%íiϦ†ýF~ÈYÐÆ•­k€E/+¶½ ¬Z_±5Ô+û±-ÛϤ?¥vÜËlÙì‡Sª£¬éC©ôs=°ø0sµTúu«Tš¹Í¬ã™eÜ¢¯eaÊ+ ¨7ØÍøÉ9Zˆƒž|U p“sì_Ä.×?ˉ g"çÙnpåÅ)ÎèÈ9§]3;”×6ëúv­G+´nÛhnÔR–¥ù.Os…'Ü¢H7cØ*pÎþZÆ{µ°{òÉþ"ç„·{–•‘tª“³D3Ûú’»Éä{sO7¹×TÆÝÓ°²ÑÌw÷é³­8ÏEj"uö`ü™ñÕÉGå<$xŃ2¦o?–Ú— ×Óž<ž‹IM-÷¶êáIV¬3CñY~í’2ï:jî8–ÿͳ¶Ès†6ï64$Ñ…(šàÀEzL*LZ¥_ÐjÂÃñ¿*-$Ê»,*ºð™{>û{N ÀÝ2~¢qŒ4–#hú;ý›þF¿©ßÑ¿^©/4T<#îQÓ¿üqefYŒÔ(ãËš‚ø«m§×B–Öa^AO^Yß®.c_©/{4™C\ŒO‡º¡LMd<Ùµì¾H¶ø&ü|sÙšµ/Î>©«äz£Ž™¬~q6\ kÿ³«`Ò²«ðä. vpAg00ÎîŒWHIDATxÚí[il×}ÿÍìÌœ½IîòoJ%ê0-S§% .’TJ ªcY®QÁv*Eâ/­ƒh£ø‹›6p†øCѵÐ$®aD2jY²-‰´)Z’IY$%").=¹$wöšÝ™~x™Îîì,—KQRÐø»3ï½9ÞûýÞûïý‡’$I’$|“Q¢uþØÓ7<âÄ{C,‹ÅhIúbM÷ûgß¿Œ>¥”ä˾–ˆ6m·”Ø[Íû >ý°¡°Ÿ´×:€iÍŸ×Tõ¾z¦i=`0Œ#E= °µU¬øì³+ì…¸$µ>Õ"´7\pÿþ~ŠztQ§D"™L$$I!‘B¡¹¹P¸¾;>j|çý¿ö¬¯hÙÕJmÇ6ü`Ó_4MÓ4ýðúQ4ÿeý-{¦L’~0$yÔO:¢(I¢¨Ÿ§äÉQù)ãUÎ/}º>ûºÜrRJÓ:Mg2Y,€Éd2™L@0 úýÀ`÷à's€x4bÀþÛ{üé½€I4‰&ñÁQ´HŸNý‡ð&íEQ…—óê³ü“k´¯È®¥¨Ü¥H§Óét˜› ‡`zzfÆãœN§³¬ غï±í•÷—œÛTüÎq–ÿO`4 „¼}X4ʈ+´öõÙwfß±ÔxS×e¯&$ûHÑé†a€X,Å€ÉÉÉɉ Àbá8‹XÛܼe]9P¬7Õž>v^ ÿÏŸ~£ßèzpD¬€€\ˆó‰5%ùÈȼ¯…€Ï,Ï,“ÏY–eàùX,!3cn0›9Îj*'*&«î—›fÿøøÏ.î> ðKQŸoõ‰Xš_´h¡¯&"g–cIRqÀËg Ã0, èt4Í0€×ë÷ÏÌÌf€ãÈÑáp8 éoÖþSÓ3À…¾‹wÎ[9qN …Vˆ‰ 5je˜]®5´óÅ$-àµsÙg:QÊ:ÃÐ4 ‚J¢(Š¢””˜L””””˜ÍDW8@íÖºµFàüè…ß}´ HF’‘däþ‰X‘Ò–óÙVMvöýU )¤F3÷Êlñ”}¦¨fY'èt Cf„N'›Ÿ€Á`0€Éd0˜L€NGQ4 ¸GÜcî;€}Ìž¶}týòóðåË÷ ÿ ±\” ¨š|DhA¸2 ”™Ï$$³¥NÓ¥ÓW¯öô|þ9L&“É$ Ó±,ËWRÂq€ÅbµšÍ@cCÓÖF3ðUÛ@ïà^÷¤kbH’jwÔèëj‹7[WaäÚóZШQ~Á´¼¤6?—Êk½‡a”À0Š•DQ4­ÓÑ(ÏG£ÄZºw¸}ûöí;w³¶qºIj¸|ê=qýïWÒƒÜ|¢i©;ï—‚åçeÑ“)‚tºL"²ERæ‘eD"‘H$€þþþþÀn·Û 9lH¾ Ìܘ¹1}­øž¬‚’;˜}–O|H’öÈ”­u ‡  ³³¯Ïãúú†‡Àï‡c1E¶»\v»Élݺn]y9°cǦM••€ÍÆqz½FÇyÄ›L F£ÑX­Ä±„T*•R)rŒÅb±hX\\\\\ü~ŸÏç*_®ú‡ª'‘éÑÑ•¨l¯J?@òùzun)ÂÔj•ä|¾PˆçS§Þ{¯¯èëòx€Ý»·m‹FššêêÒR ££½}qˆÅ — ˜œôz+*€Ï>ëëóz·ßþÍoúú€½{ÛÛ««—^úÞ÷ÚÚ§Ój5s‰P'½^¯×ë•öZ­V«Õ ¸Ýn·Ûqá„xwîîîî>à­âð¼oOXNd9biªÔ$dæ®]œ^yå¿8wp¹Üî™àĉ瞋D€uë].Àív:Ïœjj**>üp:Žáa ¬¬¬¬¬ ص«££­ xõÕ_ܺE.^zéõ×ÏŸúûÇÆ‚Á\‘TÌ‘¦ãp8¥¥ÀB*R¾ðßÅ¢¹JV9[Ê@Ô¾z{‡†¼^àÍ7ÏœùôSàĉ£GGGx\vîfg M$êë5kl¶òr```ròøq O$ˆÒL&S)2r»º“I¯ïîöïï耛š6n~ö³Ó§;;7ÞøÑöíZZjkÎüƒ$W0f×F£Éˆ¥;ÒŠGs–"²k´m ÜüÜÜâb<üüçï¼ÓÕ?~èPWJ¥Ó¤R¢8< lÚÔÐpæ `4  &'OÉd:ÝÚJ”§Ó ˜ÍzýÃд$óóÑh]ɇB@y¹Ý~ñ"𠇌?ýé[o]¹BDX:½œ‘¯ø™3A¯gY½ž¢Vº±»*"hi{={RN§O¿÷ÞÍ›Àû÷F#ËNL¥¥Ë•+@]]yùåËÀäd °{7 é´(’eoNñ\A’ìvâ¹JÐÒ²fÍûïõõn÷'Ÿ{?³}N'yþîÝííóóÀ¯~uî\.Йbf)b–ÂåPxÑléÚPh~>nܸ}{|¨«s»»º”zQ”$šnݺwïÈ`dÄãùÖ·ˆƒdµë$&¢‡,!¤Ó‹‹@}}EEg'p󿨨3Ï>_8¼aá6[n [[.]Ξíê¢ÑX,•*^',—U" ÷5…¦löêìì뛚¶mÛ¼9$Oäy幃ƒ““ßù0>>;ûøã@2™J‰"H9Y'“‚ð|–u…(J’r¤(@€Phq‘8h%%ƒƒDY?ù$03D"J{eâ´ºoG,·!ryæ¹õcc³³Ï?Oöl¯^ª«Îk×à••ä>Žˆ5“N§ÓJ‘ådƒec1° ’Df†L€úÈqƒ× ƒóó @ÿ½{ßý.ˆ"M+m–­m¯ °\ ¹"H èÜsò_^îp”” 55;ëõ'N>ÜÞ^Œ–oÃgeiDZáæ‘Ùycƒ¢D1‘~ò“çŸß¼èêúòË ¼ÜjÕ뉽Ÿ¹HvýúÈÈ®]Ä*²Û‰ÇLÌLí5('Z¿^Yº‡#‘Ž §çúõ;w€×_ùå;ˆõD¬(uûµÏì—‡f†j½H-ÕyYÈ{®2ÍÍ••f3ðÊ+66o¿ýÁ7on÷·¿ír‘E¹¦&Àl.)Ù³¨ª*+K$”¥ù=&“Á Óee6›É¸\ÇþýÀÅ‹_~ÙÖ Íͯ½vìØ¦M@]ËÅq™{ÀdçËh”—ý”“ÿ|a0™¥IË^n´¢lý±,±F’I`ëÖµkËÊ€“'_xewßýôSކ†<žjjªª|> ´´´Ôj*+íö’2²–“HSSÏÌ ðÅ==ðØcÍÍ6ðÆ?üa{;ñ|­ÖÌ÷“ 9`Ki¿ ¨¶µ#Iùöð0ùyÎçe/M˜Íf3Ç)fY€Á`0 ÊÖàk¯;æp@8’¥Ÿ¬ùýÀÝ»ÓÓ‚ ì¬•–ÚlF#ðä“­­v;ÐÑqäHc#PVf·[,dŸÀ`PF¸Éd2€ÑH‚uå=bµ½Ÿ¹ÑšéœýŠ Â„dæåø£‘.‹¨TŠ,=$“‚Ln·Ë•J--MM55ŠÇ«ÞàÑéH4ƒ²ÙNÖëY–k0èõÙ[ÚAÊž6Z^ÑZ8<2”/³@QdcEŽB`e„fÚåÙ÷ªcEµcGÕ3PîLà•x¢lೕýjˆ`UwÄŠ¥äA'mà3ËŠ l)ŒËCó„WFÁÒ1mùÃsÍÌB/å‹QÕ:nÃòzû'‚Ô6„Vøbf>÷é…–ÄÙ¬¾Býíç-/‚O«|¥kÿZiÙ3@Aòóœ/h7·ƒùÃÔ—êh¾ïrËÕGå=Ë)Ï|þÒÀk+aȵ|z Çãñ¸$E"‘H$²œ©[Ø:Xšm€–¼ú·´R]ø:í —Ë8G³0yE̤ì±.,,,,,ô³ôaêEù…j‹AQnrƒdÇFL±jòYr—ò•k·¸PýrSî˽BÝOI¢ÿŠ>N¿ ð<Ïóa%úšeY–e%)ß×—y ×Ïåh`žçyž,ïXJm>`ì_Æ©»¥@Ci½³±\úa[:.ÉÀRcÔ(8n9þÎñK€wóË?G¾´‘EQ!Dò ß ;6ò×in ï¿0õÑY€ßÆÿ'ß ˆn±Zth)¶•Yû¾b¦T°þµµÖÊm“OlY p'åûmàÿï9…,ë€X,‹Å~ÿ¥|L™êŵ?–${ðr¯Ùl6›ÍJ¹ü=2YbÉ/–ý¡¶lÉ€ËaÛùìêÿïI‰ž #\öàeBH¾°H.úKùoÒê¦ÿ4¬ÀÚ_wc‘IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-rar.png0000644000000000000000000000512612247657030022275 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/submenu-active.gif0000644000000000000000000000011712247657030020721 0ustar rootrootGIF89a€ÿÿÿÿÿÿ!þCreated with The GIMP!ù , Œay¨ßL22u›*;SOGo-2.1.1b/UI/WebServerResources/title_sortdown_12x12.png0000644000000000000000000000040012247657030021721 0ustar rootroot‰PNG  IHDR Vu\ç pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFvIDATxÚbúÿÿ?) €˜HD²€b1òòòþãS8iÒ$F @,¸$ŠAÄ„G!2€Ë!?`8 €0‚-77÷?ÿ?º<@aµX €˜xÃ_IJ†@$G@€)(Y„&ñ/ÑIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-package.png0000644000000000000000000000512612247657030020336 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-executable.png0000644000000000000000000000775212247657030023641 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWuIDATxÚíZixS×µ]’®dIÖh[–å°™øL aHB@)$yfpS0ƒ¿ %´¯ úšfjJ€¤II íÒ ¤Ïdâ‘€±ÁŒipˆñˆ'ðù<äX¡ÉÄbàÂ…ªªæfàüùŠŠÆF@úkå‹Ê€Q)éÛ§X I›Ÿ¹™"â†@¿PI€¿ÿ¥ìËKN==,ðv; x([_ßÜÜÑÁö_ZzñbS ٨ܡü“’¾çÖ›ˆˆF |å3—÷ïξ¼´èé!€ïïù<ž?ðŸÏç&Œ¨Tr¹TÊÞWVvéRs3 ݤzIõ 06eÒž©VàתÍÏìÔÜ8"®{ À—}sø·³[3˳™j<•š†ÈóUjßóôoJNŸÊË;uª¼hkëêêí„B€Ï22&NLJ¬ÛMOv/¾//ûÕ7.`W÷Îç6·]¿qÝ"€ üÏÞYeÌ,#Rãp½½DrX÷÷øp#Áår¹ÜnàÜ¹ŠŠ†¶Zb<¥«¢âûïõz@ö;õ«êƒÀ„ISöÜÆ\ÿˆv^ÛB€//f_ZAª§“žòês¹ç§ÓíªªêëFÀív»½^–*U”ˆÊʪ*ƒP=½;æ `á¤Å{1À­[×ý©sø‰6^ÛòÆ ¹y^oÙ[ßm¹<Xñáê¶¥Ä#‰Æû{|(€CC¯S ¥Òˆ¡0xzÌ0ä˜öC¯ßz"ãì¸KÀª¬5š>üD 9,ð•K®oYZX,D ¥¦€ù|ÏgχKŒB)Ë—/\8u*%—³€ |¾@HŒÁ`4šL@{{g§Å$žJ(‰«Vg­V"†Œ.ðÙ¯¶,«%ß¿Ôþêç¯~½½$Ûêj"AV«Íæt‘‘RiD  …A`D(•„8*Míí]] X”ðO]5“•sðgéÀ“Õ¿]9”D º ~Mïò:Vb¨åÖ”ö¸ÿÿú{.ðNöÿ³g/]ººº»{{™L"‰ˆfÏž>}Ü86IŸ?O¶.ÒÒRR´Z 99>^­ìÇ#DQâÊî)Ÿ[58•_˜sܼ*ÝñÊ`ª¦k&€_¾û»ŸÔÏV}¹Æ³Ì@w8Xàƒª| ØÿnîótùùEE¬çÓò¼y3gŽÄã¹e.w,4ÊËIµÔ×Gæ3qbZšNtoì|¸ãÇÀ¿òÿ‘S4"LøÕ‡)ðDã)Á†Žçûìû—ÛW 1´ *(8}º²’TA0ztbbL ©ÿÇCq(+»x±¹hl4:;ÇA%küx²àëÞÐù`Ç|àl~qÎÉk "ìüZïòVãûú¡ª”ÀªçÚê}z½»Ûlîë¾þúüùÚZàâÅêjƒ š|uºØX¥2påìr‚JJ¾ýöòe@¯omíîf¯Óˆa@ ` ©©!9&zOÌ{š¯€Y ïÚ7‡6ömyâegø9"$»ï)ÉýÔë-ß}qNý,`Í‘dµV+Þf# À`@?ï[+S©Ç––VT45n]H$"‘P¤¦¦¤h4€N§ÑÈ{=òü¹s.Ô×&SOÕÚ_¹ê_¶ÒcJDmm}}[óWÍû±'€»ÎÞ7'xüîÍù;·ÆÊokŠƒÁ»àp9\N×{pçgOûx¨o]ÁÚe€DQ*ªc« :á`(0Á$¨ÿçƒ]ÈqLŒZ-“ …\.³€{}Ž–³äøÂ²7D·>|×ô½\‰ó=æÎ§³“à1*wÔÁį¢¿Ÿ|Ï»8²#}Q)pËŸÒ‘zç"@Ĉ!ŸÇÛûÇ7ö?» øäÝ—}ZœžþŒ £Ùz›zl¸žËJ@¸E,-cKJJK/_:;I•C%¢¯ä‡@ÏÖùÄÒþÚÚHßÖÖÞÞÓèÙìz¡ÿWšÔj¥R*’’¢¢€ÂG¥Ÿdˆ'/špx|Ç£ Ö®®0a'aªiû¶<±S̼¢ywÏùfj5ÐÑA<€öýW?ýÅ‹ï=T*Ž/.þî;vk!˜§ªÕ Ed$0cÆÔ©£G³}Òq—”TW6›ÃárõÁþcð?&nÈår¹D$%‘òõ«Ç  'š¹ês²åÀó>ýðç Ã0Aðdv¦Yfù’wÏ,8]´ÜÙ2͘ʖi••UUz=«©¾žíë‰ÜnW—ÉÔ×”—i¨©!ÚJ=O­V(¤R_eW¶¾ÇJ¥B!‘FR[[G‡Å8dj‹‚M¾þ×U*2Ž”âñ× ü€# XDž Ä,RUF®8ðƒ&€K•¦;Þµo.èÞŽÿ@wšTIv;PWW_ßÑAŠC¯—x˜@ÀzRKK[›Ù Øív»Ó…B&“H€‰Ç‹‹c•ÉPôyÇãñx€Ó§Ïž­ªb‰õí×_É4rh‰‰ññ*P°¢@u, ˆ^:8àiô^WšÎäŸÎ9Õ´>dXÙr 1 ÃÃø†<jc£^ßÙ ¸\d,ùÑ:œ•¥R"”J¢Å ±ô9*q==äW´H•T…BòÚorrB‚Z ,9&Jà {¨¿ˆÑˆx¢•,HfgÍÙ77ˆù›&7¶¨­mhhoï/Y_]Z¸É›Lœ-Cuº¸8¥’­Jh3Z[M& ¦¦®Îh Œ,6 ÓäJ<>>^§S*#÷DÑ+U{¤ÏøûO†øÞ?tГF#âíŽW6 ¢'sN4]·¯j› Œ;ztl, ¹ÉŽ›TYõ÷\ºÒ¥9££ƒ”—Ür×ã!+Ýþ"Ë÷ýÔãˆÔäÍ^à‡€`Dœ8p"ç« ýã ã@jjr²FãKDÿÀp««­T‚ÀõµÁê}ºY¯ÕªTÀ‘»ó˜ü( êá~Ø ¸ Ë €¶ã ãì&Ýî wAD-Õl±X, Ëψ‘ˆa|séG.'ÀÓ=¢ÃóŽ ªèo®ð´ û¯"¼WšÛív»ÝÀ÷íUgê»-g~ÿç]V`~Ö¼ƒ ’m®î@ÜY@¯7º»s„oµÂãQQQQ‘‘@Z‘´þ¶™ ««««¯¨®®­5©T*‰&:Z&¾œ›'?ªÔ{•ëÄ›€§7üOùú÷OÄ#„ú®ðoâ @»\.—Ëåõ:‡ÃáõÚl6›ÍFÊK»HŠL¼56x^ûÔ/q (p¾Y´®2dµÌu:µÚ¿êñõ\vk@L%,Ø–õt¹<22"‚þðÞ¼MyoÊGäÑsÀoVn,Ìùà¶¹m.;^jN§Ó餎4t.;è €S§–Öß¡Î×Õ]6é+€Æï<ùöÀ¨ùüøÿqüÁ„­­F£ÙLIöÝ  ‘ˆÅ"u --5U«Äâˆ"=DÚZ[É7ßÿÛûÙc‡þ È"¥û™Çw>ªËNDAèW®²¹ˆÜÿy{ÖÔÓ©G¨‡°–D@ åzV\œV¤l:¾aþªm@þ”‚Žü#@ËýúeúÛN«U*“3‡Ãn§ïw»³Ùd²Z¡OsCá'6<HdvžX¿íaÍR/ය­®nv<ÁÆÍµtþÔ‡®Gû€µ%D{K¬]å~µm}ÉrpdcÁíGãC–~©~ Õj4r9›t¥‰X»Bÿ`îG£>ß ôÉz]¦iÀƒk×î½ç—€Ëä29#|°ùúã>a@¤Ãë¥Ì– ­66V¥Ö{`ë½Àáù·çņeú%†i€F#“FÝš5*%%:Ø?ç£Q_¼ggsÕÛV|¹À ¸Õnµ«w°Ÿ?µT)Báv p p°ë¡,hSGó—m&à=~® à,ù_‹^¸çy éPÒ¡¤RòeÎáRSÓÒ4à³3‡>ËŸ´Îhn(Vسs:®T5NV³†l‘„k…B¡üÐk ç‡ð›0IBäG¾`¸bBYÚ(ñ\Ë$,fB ¬teI~´øü‹¼§? 4Ý×t_S P(b1ðÖùw?Ý/ôiú©MYÀ’¯ï­™Q x^‡ÇÂöì½A=4È<‚Í›ž·1áßzå†a†ÇóúµÐ u_(/ÓM¶+-Y%?Z äº>9}èç€÷ÏvÏQ³“ÑÚ€¥Žûšg>ˆÒEéB[¨ª…õØP‘îý­†]†Ò¤LrB•+¸ÚK­Þlˆi÷ç]¥/×l~¹ û¶?B±PÌHC>ÔDb ø ùJ˜2P­çÁ•"ÿä\:¸RÀµ×\{­€;ájÖU>Á´9Ü…ÕP}à ·+wš4i üµ†oD °á¶›Ž€ÿ´öoí³Ò›a¹IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/HTMLElement.js0000644000000000000000000003145512247657030017730 0ustar rootroot/* -*- Mode: js-mode; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ["HTMLCollection", "NodeList"].each( function (className) { if (className in window) { var contClass = window[className]; var _each = contClass.prototype.forEach; if (!_each) { _each = function HTMLElement_each(iterator, context) { for (var i = 0, length = this.length >>> 0; i < length; i++) { if (i in this) iterator.call(context, this[i], i, this); } }; } contClass.prototype._each = _each; Object.extend(contClass.prototype, Enumerable); } } ); /* custom extensions to the DOM api */ Element.addMethods({ addInterface: function(element, objectInterface) { element = $(element); Object.extend(element, objectInterface); if (element.bind) element.bind(); }, allTextContent: function(element) { var content = ""; for (var i = 0; i < element.childNodes.length; i++) { var node = $(element.childNodes[i]); if (node.nodeType == Node.TEXT_NODE) { content += node.nodeValue; } else if (node.nodeType === Node.ELEMENT_NODE) { content += Element.allTextContent(node); } } return content; }, childNodesWithTag: function(element, tagName) { element = $(element); var matchingNodes = new Array(); tagName = tagName.toUpperCase(); for (var i = 0; i < element.childNodes.length; i++) { var childNode = $(element.childNodes[i]); if (Object.isElement(childNode) && childNode.tagName && childNode.tagName.toUpperCase() == tagName) matchingNodes.push(childNode); } return matchingNodes; }, getParentWithTagName: function(element, tagName) { element = $(element); var currentElement = element; tagName = tagName.toUpperCase(); currentElement = currentElement.parentNode; while (currentElement && currentElement.tagName != tagName) { currentElement = currentElement.parentNode; } return currentElement; }, cascadeLeftOffset: function(element) { element = $(element); var currentElement = element; var offset = 0; while (currentElement) { offset += currentElement.offsetLeft; currentElement = $(currentElement).getParentWithTagName("div"); } return offset; }, cascadeTopOffset: function(element) { element = $(element); var currentElement = element; var offset = 0; var i = 0; while (currentElement && currentElement.tagName) { offset += currentElement.offsetTop; currentElement = currentElement.parentNode; i++; } return offset; }, dump: function(element, additionalInfo, additionalKeys) { element = $(element); var id = element.getAttribute("id"); var nclass = element.getAttribute("class"); var str = element.tagName; if (id) str += "; id = " + id; if (nclass) str += "; class = " + nclass; if (additionalInfo) str += "; " + additionalInfo; if (additionalKeys) for (var i = 0; i < additionalKeys.length; i++) { var value = element.readAttribute(additionalKeys[i]); if (value) str += "; " + additionalKeys[i] + " = " + value; } log (str); }, getSelectedNodes: function(element) { element = $(element); if (!element.selectedElements) element.selectedElements = new Array(); return element.selectedElements; }, getSelectedNodesId: function(element) { element = $(element); var selArray = null; if (element.selectedIds) { selArray = element.selectedIds; } else { selArray = []; if (element.selectedElements) { for (var i = 0; i < element.selectedElements.length; i++) { var node = element.selectedElements[i]; selArray.push(node.getAttribute("id")); } } } return selArray; }, onContextMenu: function(element, event) { element = $(element); if (document.currentPopupMenu) hideMenu(document.currentPopupMenu); var popup = element.sogoContextMenu; var menuTop = Event.pointerY(event); var menuLeft = Event.pointerX(event); var heightDiff = (window.height() - (menuTop + popup.offsetHeight)); if (heightDiff < 0) menuTop += heightDiff; var leftDiff = (window.width() - (menuLeft + popup.offsetWidth)); if (leftDiff < 0) menuLeft -= popup.offsetWidth; var isVisible = true; if (popup.prepareVisibility) isVisible = popup.prepareVisibility(); Event.stop(event); if (isVisible) { popup.setStyle( { top: menuTop + "px", left: menuLeft + "px", visibility: "visible" } ); document.currentPopupMenu = popup; $(document.body).on("mousedown", onBodyClickMenuHandler); } else log ("Warning: not showing the contextual menu " + element.id); }, attachMenu: function(element, menuName) { element = $(element); element.sogoContextMenu = $(menuName); element.on("contextmenu", element.onContextMenu); }, selectElement: function(element) { element = $(element); element.addClassName('_selected'); var parent = element.up(); if (!parent.selectedElements || !parent.selectedIds) { // Selected nodes are kept in a array at the // container level. parent.selectedElements = new Array(); parent.selectedIds = new Array(); } for (var i = 0; i < parent.selectedElements.length; i++) if (parent.selectedElements[i] == element) return; parent.selectedElements.push(element); // use index instead ? if (element.id) { for (var i = 0; i < parent.selectedIds.length; i++) if (parent.selectedIds[i] == element.id) return; parent.selectedIds.push(element.id); } }, selectRange: function(element, startIndex, endIndex) { element = $(element); var s; var e; var rows; if (startIndex > endIndex) { s = endIndex; e = startIndex; } else { s = startIndex; e = endIndex; } if (element.tagName == 'UL') rows = element.getElementsByTagName('LI'); else rows = element.getElementsByTagName('TR'); while (s <= e) { if (rows[s].nodeType == 1) $(rows[s]).selectElement(); s++; } }, selectAll: function(element) { element = $(element); if (element.tagName == 'UL') rows = element.getElementsByTagName('LI'); else rows = element.select('TBODY TR'); for (var i = 0; i < rows.length; i++) { if (rows[i].nodeType == 1) $(rows[i]).selectElement(); } }, deselect: function(element) { element = $(element); element.removeClassName('_selected'); var parent = element.parentNode; if (parent) { if (parent.selectedElements) parent.selectedElements = parent.selectedElements.without(element); if (parent.selectedIds) parent.selectedIds = parent.selectedIds.without(element.id); } }, deselectAll: function(element) { if (element.tagName == 'TABLE') { var tbody = element.tBodies[0]; if (tbody) element = tbody; } element = $(element); var s = element.select("._selected"); for (var i = 0; i < s.length; i++) s[i].removeClassName("_selected"); element.selectedElements = null; element.selectedIds = null; }, refreshSelectionByIds: function(element, selectedIds) { element = $(element); var selectedCount = 0; if (selectedIds) element.selectedIds = selectedIds; if (element.selectedIds) { for (var i = 0; i < element.selectedIds.length; i++) { //var e = element.down('#'+element.selectedIds[i]); // buggy with IE var e = $(element.selectedIds[i]); if (e) { if (!e.hasClassName('_selected')) e.addClassName('_selected'); selectedCount++; } else { log ("refreshSelectionByIds Error: " + element.tagName + " select by ID " + element.selectedIds[i] + " not found (" + element.childNodes.length + " children)"); } } } return selectedCount; }, setCaretTo: function(element, pos) { element = $(element); if (element.setSelectionRange) { // For Mozilla and Safari element.focus(); element.setSelectionRange(pos, pos); } else if (element.createTextRange) { // For IE var range = element.createTextRange(); range.move("character", pos); range.select(); } }, selectText: function(element, start, end) { element = $(element); if (element.setSelectionRange) { // For Mozilla and Safari element.setSelectionRange(start, end); } else if (element.createTextRange) { // For IE var textRange = element.createTextRange(); textRange.moveStart("character", start); textRange.moveEnd("character", end-element.value.length); textRange.select(); } else { element.select(); } }, getRadioValue: function(element, radioName) { element = $(element); var radioValue; Form.getInputs(element, 'radio', radioName).each(function(input) { if (input.checked) radioValue = input.value; }); return radioValue; }, setRadioValue: function(element, radioName, value) { element = $(element); var i = 0; Form.getInputs(element, 'radio', radioName).each(function(input) { if (i == value) input.checked = 1; i++; }); }, getCheckBoxListValues: function(element, checkboxName) { element = $(element); var values = new Array(); var i = 0; Form.getInputs(element, 'checkbox', checkboxName).each(function(input) { if (input.checked) values.push(i+1); i++; }); return values.join(","); }, setCheckBoxListValues: function(element, checkboxName, values) { element = $(element); var v = values.split(','); var i = 1; Form.getInputs(element, 'checkbox', checkboxName).each(function(input) { if ($(v).indexOf(i+"") != -1) input.checked = 1; i++; }); } }); SOGo-2.1.1b/UI/WebServerResources/mime-font_truetype.png0000644000000000000000000001161712247657030021654 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWIDATxÚí[y\”Õúÿξ13ˆl"W!Dd©4Q0l¹-H^ïïWWË2Ë6K­®Ù¢¶˜¹d.™¶—fW£Rð*FŠ""²Ï Û,̰ ³¼÷·Óà˜¼¢Ôí>ÿœÏûÎ÷9Ï÷ÙÏ9 Š¢(ŠÂÿh„ˆ9Ò üÑé m æ.Šš4顇>ý”¢ÈóH3úßJ â‚úúúûívŠšóåËõ߯úý9(¸m¬LÄ_dý=tÖóŸÏå²Ù ÆH3~9¢~¦Ò²²gÇ>-0H“E_Åíaš ­è_dÝnÝ~x<ðEàFV\PìG@Vâ=áw«š4ÁµNU—º³ÙDQçKªÎ7Ê\Õ6õ& éGå]ªé@c{“°Q 4å)+U 0èØÃGW.§_xa뎵ÇOQT¥õý®·€ Ýã׬ΉªŸk^ Œ^èñ ðêÃóŸKžüÛ€üà‰Ü¦¼MÀÎ[wùí½Óû²{s€ÈȈˆðpÀÏO¡P(&“Íf2вÛ ««§§»hnniioÊ•ºªàÉÉg-ŽdRY²ÏÃÀ ë^ÊZ™ DD„‡‡…žž^^ ðù|> |>ÐÙÙÕÕÙ èfê›;§»Óv|²íîËË‹q ö¸¥®ž¢6žú¦ |x!ζ`±X,&p8§8QâU÷:°xò]©Ñ¯³Ã’?+HðŸ”ï¸Þ½RÁ¯ÝýÖëoïN,9µ˜»#ëƒ{¶õõ õõ€Z­R)•Q™ÆÏ”ëÛÞ–Ÿ_vìùf sü¬»3’þ `2™L&ƒ±â±çv.½Ÿ¢n-LžµðwØüíY@DDppP ÕjµZí¥ÏçÓ1Àh4;;I?ÆÞ8 à=Écó†¬üfxkÎ;×§…}'K =€;d( (õ?#wi"‹Åfs8@ͨ†fU#°¶iuõëÇÔ ”»“³‡n±±@,3AÕAŸŒy…¢(?êªèêêíí,‹å×€¦&µº¥˜½(sõí¦¡¯ó7ÀÇ›>ÛÿùfŠÊï:¶3ŸÜyçìÙ·ÍΔŒ>£LF“ÑhD"‘8·£jkÝNàÅ‚åõËßRƒR‚¯Dðîä=ZZè ب~tWº\š{Ç€Á`0 €Ïçñx<@¯×ëF unJJò¡ï7S —”–/Ë£¨kvfí|¸í¶ŒŒ™3ŠŠŠŠòrz:þyzJ¥JÕÚ Ü[zÏË÷l2’gÏX|õ1ÊqƹÍѰÙl6íÛ æ¯H‰Ç£ßÝÝÝÝÛ 1‚: ?¡¯¯¯ïÐùq ­†V£‰¢žÿrEÒ‹v }Ñô•ÓÖ--ÍÍÍÍ@{»FÓÞxyyyyy==½½}}€Ø(Qz~,ºaኇ>~ºº·vë]ha§c  …B! × ò|êwWþ½à­9ëϽ{ë }<è;zP[[WWSp¹\.— ˆDb±Hœ_\=¿þa`Õ®—öüýÀar˜æðeg-{Z?iÛˆD"‘HD» ‡Ã%x„@@û~Î`0›–'G%K~G8}¸øEþT4ãä€ óܹªªsç\óär¹\&ÚÚÚÚ´Z -wúÛÓË?ý)2rüøá¼¥ÇÒcé¡(sš¹Ê̡ǣ Q‡Ã%x‡Ãápú €q/3ˆ}CÊ•÷ºa’w¿>åÔ7Õ@ÊŠÉ/%¼¨TtÕ×××××…"‘PxxˆD@ÃëÊ9åÉÀ:Çë2‡Ÿ¯2ÝÙ’òý@`àèÑ `³Ùlv»ë÷K]OG‡Á¤Ü”tß)À, ÓÙ+ýîu·€C…yÊÛû¶¬þ/h …@KKKKK‹KÓär™L&TªææÖV`Öû3y3þø…ù…ùІ¿ >>ÛûeÞWÛUª*R™$'O™2y2PYYYYU5@ ? ž¸’•µ·Ó5© ’ÙW“v^wš Ü­ú  éÒÝáp:íöËç×V+½³$qHz$Ò«ÿ~ÅÑÊÊsŠÚÒþþá­%Àý÷geÝuÐØØØØØH[$É÷ žðG¶fMšžíš$ŽMHIHÿ`zÓÄ1EÑm[‡vÀ¥¦ÎçÓ®€àé!'iøÏ¿KöŒŸxç)ù3?÷³²CÿE+€Ó —•]Úõ$|‘¤@¯7Ìf n|ì‚= d Ù®ËõWŸ©)©£¨wžÙðýÆbŠêh14š‡~Œçšàp:œ'EõuY¬³éö€Æ‡»ÆN'EÑõ@&“ÉtåßmÕ·Ú µðÁÇ>^<˜uSÆgSëéôÖÇøúë}ûrr\f2™LÀ@…àñx<>èè ›m‰û²Ê\ß©)ªmª;IQ‹º—t<©´]¡æÀŸ#²~˜ó¹‹€Åd1YLƒ9‹ËŒðþg“v׸ÎNzÇ),,$$8(ZR¼¡ø„+_§›be·Ûív;EÙl6›ÍFQV«ÕjµRÔ)mÑÓ‡)jî»ÿø@pK|jïäx 44,,$øöÛœœC‡\õ…BA§Ãë ÁçÓà›à?'~±«i÷´réèçôÀCeVÿµÈȘ1#- `Äã+äšNJ[9¸œ®¹ 5Y¾IþW:ý´Ùh“çp.Õ8µZ¥jnbb&N¼áàûå¹å¦{÷~£úFEgG&“kTÕ«5j °nɆ'6n–Æ-»ùL`nМMw}„„„†¹¹¹¹GŽgÏVVž?ˆÅb±‡ÝThIÚI|>‹0™´¢X÷Ùîµ'r_™B6X¼å©Ÿ> Äœy=ê4àççëëë ¬[·aÃÆÀ¬ééòô 6dâĘ›FpO˜hl´ì†£>ŒF£IÀÃ^¸Óét:ô\°Xh P©”J• x¤ço>ódÀ»v½³k=ðå¡=ܽ{\ÿ¿}¾æNÍ~àïÔQ‰àé÷žúò‘=®46///ïèQ þ†Æ½ªÀœ´{2ïÞ œú¨ØRTF¶Y.¶D€n7³ÙôÆÕ pnfNcÅ‹^[²ëÉ °Õ¶_:pszJJòt`ÿþrr±Sü¸—xüÉEq.ºœ† €‹]Ýεـ©Æ›97ýxGù®rÃZ 11!!6–¶VëÅ…œ?_UU] „‡<ñÄ¢E &“ÙlÞCôð4H¥`Œì`™Ø@MMMM}=PZZZZQè6jŒÏh–ì}¢(ÜpêÃ"1 Ñíd§ób×Cvx€¿¿B1j¼:è ^:ˆ½5vZL pøð?ÿyäPõ ‘µv`û‰-ÒÍ«p€¬¢Øl:öÑ–u©E\5ûdòìã&MŒ˜pª¹\^>Ðn0˜‚éºÀÓèììì$çl²W__WWW455665Ñó%€Á FNì±ÙL&› œ9sölEÀì`ø±Oî_ðÀü{ «Ÿ ôè{í­Ø"Öt‰ €@l0 z=’’’’˜è Ú?üpèPn.pv~…¥J ¼‘ýZö«+‰@¬+€þþþþþ~W¥OFz#‡âZ)“ĺÜ,BîóHptÿÉNÑð%«Û¸¨(Ù^¶¬òIWLðñññ‘É\ $Ašd'Ä'@Ùl‹ÃŒF“ÉbrW}¹àU`L] !è6`îÒ¬´{·v‰ÍÇæãrmÒÇ=·JzèBÏhtm)’˜D¾Ëáp8\®ë½FCïI8ðÝw ûUGµÍ¯ÞñÊ@€ÌßÛßÛµ^2^N.DnD®¿œ Ýt”>:YýëgCOÒgC›JŸ Í " v¹wÍwOžKJJÊ Àú#6×£„ò§¤_AAcÆÐAR,vG %­–>ÛYW×РTR»×x¯J ==1}?0æÆÀŒk¡¿hØÏÕFµQmÀúŠM·méüMþ/(Šéîì˜1G÷ù-–®®înúŒg[P3©6¢~ªH±¥ìæ…eÏÊ> xxyx‰ú][”ÄÕÑý½û3ie\õéh‚è幑¬:t$¯æp;ðSiáÇ…I€r¡zfó&€µ‚¹„ñàwZ‘¨è—…?ijbÓ':À)²™ (wÁ»Â"·È-rà‡õ¹i‡gå««"Ï KåÏ]üN*|•@|Bœ,¶¸Õ8•qËBÀ/Ü×ß×ÿRA&x÷‘œÄûÅÜïd¿Aß°&Ò÷x'éûŸ/Úýˆ ‰IºàþÞÝ„/gÊ쪕{ï‰<»ÒNúýÀÄ@HÆ‹ƒêå}ñïÿæxº;ãäFÌ}3ÿ¾&g?ðÕ¡—ŸÏ¼öö ñô¸òîéB&hw_€+¼;îáŒ;ƒâÄ•vIC]Àµ"ÐP?Ø8ƒƒ1\mèß tºf­ˆo«Ž¿WßÅÒí¦¬¼ñ˰!´aÿhT¸òLV]Ðo\Ðõ‰ëÊ×ÿ,àÑu³BÄǽöèÇeEe@Ñ” *ÍÛ€a›)·'sä.ù]o"Áû!¯Â ¡0bŒâi`Å{ó&&L¼´¶ Lþñ+;ÿ–Ï`<–|‡6úÍ‘ÇÈY?‘Çå:ÿ«F˜Fü†Ìþ‘`p<°‹°"IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/event-grippy-vertical.png0000644000000000000000000000025212247657030022251 0ustar rootroot‰PNG  IHDR rÿYsRGB®ÎébKGDÿ‡Ì¿ pHYs  šœtIMEÚ "²Àh†.IDAT×cfpch`øÊÈPðÿ #Óÿk îÿ_1þg€7†Å n¨rPflú–Ø’r¹IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-lzma-compressed-tar.png0000644000000000000000000000512612247657030025402 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-cpio.png0000644000000000000000000000512612247657030022443 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-gnome-fs-executable.png0000644000000000000000000000775212247657030022604 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWuIDATxÚíZixS×µ]’®dIÖh[–å°™øL aHB@)$yfpS0ƒ¿ %´¯ úšfjJ€¤II íÒ ¤Ïdâ‘€±ÁŒipˆñˆ'ðù<äX¡ÉÄbàÂ…ªªæfàüùŠŠÆF@úkå‹Ê€Q)éÛ§X I›Ÿ¹™"â†@¿PI€¿ÿ¥ìËKN==,ðv; x([_ßÜÜÑÁö_ZzñbS ٨ܡü“’¾çÖ›ˆˆF |å3—÷ïξ¼´èé!€ïïù<ž?ðŸÏç&Œ¨Tr¹TÊÞWVvéRs3 ݤzIõ 06eÒž©VàתÍÏìÔÜ8"®{ À—}sø·³[3˳™j<•š†ÈóUjßóôoJNŸÊË;uª¼hkëêêí„B€Ï22&NLJ¬ÛMOv/¾//ûÕ7.`W÷Îç6·]¿qÝ"€ üÏÞYeÌ,#Rãp½½DrX÷÷øp#Áår¹ÜnàÜ¹ŠŠ†¶Zb<¥«¢âûïõz@ö;õ«êƒÀ„ISöÜÆ\ÿˆv^ÛB€//f_ZAª§“žòês¹ç§ÓíªªêëFÀív»½^–*U”ˆÊʪ*ƒP=½;æ `á¤Å{1À­[×ý©sø‰6^ÛòÆ ¹y^oÙ[ßm¹<Xñáê¶¥Ä#‰Æû{|(€CC¯S ¥Òˆ¡0xzÌ0ä˜öC¯ßz"ãì¸KÀª¬5š>üD 9,ð•K®oYZX,D ¥¦€ù|ÏgχKŒB)Ë—/\8u*%—³€ |¾@HŒÁ`4šL@{{g§Å$žJ(‰«Vg­V"†Œ.ðÙ¯¶,«%ß¿Ôþêç¯~½½$Ûêj"AV«Íæt‘‘RiD  …A`D(•„8*Míí]] X”ðO]5“•sðgéÀ“Õ¿]9”D º ~Mïò:Vb¨åÖ”ö¸ÿÿú{.ðNöÿ³g/]ººº»{{™L"‰ˆfÏž>}Ü86IŸ?O¶.ÒÒRR´Z 99>^­ìÇ#DQâÊî)Ÿ[58•_˜sܼ*ÝñÊ`ª¦k&€_¾û»ŸÔÏV}¹Æ³Ì@w8Xàƒª| ØÿnîótùùEE¬çÓò¼y3gŽÄã¹e.w,4ÊËIµÔ×Gæ3qbZšNtoì|¸ãÇÀ¿òÿ‘S4"LøÕ‡)ðDã)Á†Žçûìû—ÛW 1´ *(8}º²’TA0ztbbL ©ÿÇCq(+»x±¹hl4:;ÇA%küx²àëÞÐù`Ç|àl~qÎÉk "ìüZïòVãûú¡ª”ÀªçÚê}z½»Ûlîë¾þúüùÚZàâÅêjƒ š|uºØX¥2påìr‚JJ¾ýöòe@¯omíîf¯Óˆa@ ` ©©!9&zOÌ{š¯€Y ïÚ7‡6ömyâegø9"$»ï)ÉýÔë-ß}qNý,`Í‘dµV+Þf# À`@?ï[+S©Ç––VT45n]H$"‘P¤¦¦¤h4€N§ÑÈ{=òü¹s.Ô×&SOÕÚ_¹ê_¶ÒcJDmm}}[óWÍû±'€»ÎÞ7'xüîÍù;·ÆÊokŠƒÁ»àp9\N×{pçgOûx¨o]ÁÚe€DQ*ªc« :á`(0Á$¨ÿçƒ]ÈqLŒZ-“ …\.³€{}Ž–³äøÂ²7D·>|×ô½\‰ó=æÎ§³“à1*wÔÁį¢¿Ÿ|Ï»8²#}Q)pËŸÒ‘zç"@Ĉ!ŸÇÛûÇ7ö?» øäÝ—}ZœžþŒ £Ùz›zl¸žËJ@¸E,-cKJJK/_:;I•C%¢¯ä‡@ÏÖùÄÒþÚÚHßÖÖÞÞÓèÙìz¡ÿWšÔj¥R*’’¢¢€ÂG¥Ÿdˆ'/špx|Ç£ Ö®®0a'aªiû¶<±S̼¢ywÏùfj5ÐÑA<€öýW?ýÅ‹ï=T*Ž/.þî;vk!˜§ªÕ Ed$0cÆÔ©£G³}Òq—”TW6›ÃárõÁþcð?&nÈår¹D$%‘òõ«Ç  'š¹ês²åÀó>ýðç Ã0Aðdv¦Yfù’wÏ,8]´ÜÙ2͘ʖi••UUz=«©¾žíë‰ÜnW—ÉÔ×”—i¨©!ÚJ=O­V(¤R_eW¶¾ÇJ¥B!‘FR[[G‡Å8dj‹‚M¾þ×U*2Ž”âñ× ü€# XDž Ä,RUF®8ðƒ&€K•¦;Þµo.èÞŽÿ@wšTIv;PWW_ßÑAŠC¯—x˜@ÀzRKK[›Ù Øív»Ó…B&“H€‰Ç‹‹c•ÉPôyÇãñx€Ó§Ïž­ªb‰õí×_É4rh‰‰ññ*P°¢@u, ˆ^:8àiô^WšÎäŸÎ9Õ´>dXÙr 1 ÃÃø†<jc£^ßÙ ¸\d,ùÑ:œ•¥R"”J¢Å ±ô9*q==äW´H•T…BòÚorrB‚Z ,9&Jà {¨¿ˆÑˆx¢•,HfgÍÙ77ˆù›&7¶¨­mhhoï/Y_]Z¸É›Lœ-Cuº¸8¥’­Jh3Z[M& ¦¦®Îh Œ,6 ÓäJ<>>^§S*#÷DÑ+U{¤ÏøûO†øÞ?tГF#âíŽW6 ¢'sN4]·¯j› Œ;ztl, ¹ÉŽ›TYõ÷\ºÒ¥9££ƒ”—Ür×ã!+Ýþ"Ë÷ýÔãˆÔäÍ^à‡€`Dœ8p"ç« ýã ã@jjr²FãKDÿÀp««­T‚ÀõµÁê}ºY¯ÕªTÀ‘»ó˜ü( êá~Ø ¸ Ë €¶ã ãì&Ýî wAD-Õl±X, Ëψ‘ˆa|séG.'ÀÓ=¢ÃóŽ ªèo®ð´ û¯"¼WšÛív»ÝÀ÷íUgê»-g~ÿç]V`~Ö¼ƒ ’m®î@ÜY@¯7º»s„oµÂãQQQQ‘‘@Z‘´þ¶™ ««««¯¨®®­5©T*‰&:Z&¾œ›'?ªÔ{•ëÄ›€§7üOùú÷OÄ#„ú®ðoâ @»\.—Ëåõ:‡ÃáõÚl6›ÍFÊK»HŠL¼56x^ûÔ/q (p¾Y´®2dµÌu:µÚ¿êñõ\vk@L%,Ø–õt¹<22"‚þðÞ¼MyoÊGäÑsÀoVn,Ìùà¶¹m.;^jN§Ó餎4t.;è €S§–Öß¡Î×Õ]6é+€Æï<ùöÀ¨ùüøÿqüÁ„­­F£ÙLIöÝ  ‘ˆÅ"u --5U«Äâˆ"=DÚZ[É7ßÿÛûÙc‡þ È"¥û™Çw>ªËNDAèW®²¹ˆÜÿy{ÖÔÓ©G¨‡°–D@ åzV\œV¤l:¾aþªm@þ”‚Žü#@ËýúeúÛN«U*“3‡Ãn§ïw»³Ùd²Z¡OsCá'6<HdvžX¿íaÍR/ය­®nv<ÁÆÍµtþÔ‡®Gû€µ%D{K¬]å~µm}ÉrpdcÁíGãC–~©~ Õj4r9›t¥‰X»Bÿ`îG£>ß ôÉz]¦iÀƒk×î½ç—€Ëä29#|°ùúã>a@¤Ãë¥Ì– ­66V¥Ö{`ë½Àáù·çņeú%†i€F#“FÝš5*%%:Ø?ç£Q_¼ggsÕÛV|¹À ¸Õnµ«w°Ÿ?µT)Báv p p°ë¡,hSGó—m&à=~® à,ù_‹^¸çy éPÒ¡¤RòeÎáRSÓÒ4à³3‡>ËŸ´Îhn(Vسs:®T5NV³†l‘„k…B¡üÐk ç‡ð›0IBäG¾`¸bBYÚ(ñ\Ë$,fB ¬teI~´øü‹¼§? 4Ý×t_S P(b1ðÖùw?Ý/ôiú©MYÀ’¯ï­™Q x^‡ÇÂöì½A=4È<‚Í›ž·1áßzå†a†ÇóúµÐ u_(/ÓM¶+-Y%?Z äº>9}èç€÷ÏvÏQ³“ÑÚ€¥Žûšg>ˆÒEéB[¨ª…õØP‘îý­†]†Ò¤LrB•+¸ÚK­Þlˆi÷ç]¥/×l~¹ û¶?B±PÌHC>ÔDb ø ùJ˜2P­çÁ•"ÿä\:¸RÀµ×\{­€;ájÖU>Á´9Ü…ÕP}à ·+wš4i üµ†oD °á¶›Ž€ÿ´öoí³Ò›a¹IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/dialog-right.png0000644000000000000000000000070512247657030020366 0ustar rootroot‰PNG  IHDRÐU”jgAMAÖØÔOX2tEXtSoftwareAdobe ImageReadyqÉe<WPLTEÿÿÿÝÜÜNNNaaa‘‘‘WWW¸¸¸þþþÕÕÕñðïÆÄÄ¥¥¥~~~ÌÌÌššØÖÖûûú‹‹‹uuu›››PPP}}Ž‹‹\\\ÂÂÂùùùˆˆˆDDDßßßjÛÒtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿY†çjËIDATxÚìÐWÂ@ ÀeSH¥÷åþç$Ú ˆæ}Žd?Ë!]¦bÇô“°œ)˼H±;…WêA²¶fçOiö)^úǾ»Õ‹˜6íØq«&KEÞ¿õ†CL]ùyË:ÛVß÷í&ü{ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ±?µ›UR.Ú{8SIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxMailUserRightsEditor.css0000644000000000000000000000076612247657030022526 0ustar rootrootDIV.title { color: #000; vertical-align: bottom; padding-top: 8px; padding-left: 1em; padding: 5px; background-color: #fff; border-bottom: 1px solid #555; } DIV.title SPAN.value { margin-left: 2em; font-size: 14px; font-weight: bold; } DIV.title LABEL { display: block; } DIV.calendarUserRights, DIV.basicUserRights { margin: 1em;} DIV.buttons { text-align: right; margin: 1em; } DIV.dialog.none { position: absolute; top: 0px; left: 0px; right: 0px; margin: 75px auto; }SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.ms-excel.png0000644000000000000000000000670712247657030023555 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW RIDATxÚí[{lTUÿÝ;Ï;3vKiJ[Yp¥P }ª±¬Ê+k+`²Æ³‚<%qcb"f…#D¢n6 X#Ùè&+""-…N[ÛeyIŸØb§ié¼wÿ8ž½wî£óhKIôKÚ;çœïœ{¾Çý}ß9÷\†çyžçñ+M±S=_:ýj€)&m¢¼^¯×ËòüÅY—NÕ~ôý½ßاø;|ˆï‹æ%Ц pcÁÞDö3ôéor´×Ó²m#Àl~ÖfÏæôÍÑæÍ FƒÑ`d˜»¡l%bçÎÕèÎøxþÁGç LGÆÏýfê‘’ßøý< ƒ~?088448´¹Ú:n€¾ÓÎOœ_ógÌ+~­]PùÐs˲,ËÞ=96ÀI맺ïãùÊáÕgD°þ~ áùHŽ'”ÉUøü•–Çæ“¶GóÉëI-Ëj4, ˜Íg±Çq&0000àtW.]9ûß! r,¼Àc–?ÿx9ÀE¸™|C$‡Cÿþx;Ã0LlÅÓ²ô—ºp´E™#º•aä5B ‡Ãá004är ==½½·nÓ¦M›–ž,~$Õ’LÀüGsg>·}á>õ0àðô»&??LØ‚ÇÅR´2tÏècù›´M¬x©A¢¯Ä V«Õ^¯Ïçõ]]]]@JŠÙœ’Ì}à‡“dÌá²ÿ|eÿÚõï Àitº>y†H8Ë‹ÔìÞýÑG/*Bé—¼¿šˆrãÊ9Åõê@þÓ'¢ `Á»°Z­ÖÔTášÙ9£;« `ϳ}ìà«·¿.9ý°’¯¸ùÄ«<ŸÎÜ—7}úÄASš@ªÞÅ‹—.]¸P®„ææ¦¦Ë—ü|ÚÝ“–¤|jPOj€ææ¦¦ÖV`ñâ‚‚… –ežÒÓF¿øé'§³·ÈÊÊÌœ9HжÙl6› ÈÛ1÷¯yÏgþóõµÓVàÉßþ.gÕ ÏÛXk·ßIAÔÑÁP7ÖXã£ø”‰D" ñ<Ën·Ï ‘úH0™8ÎlL&“Ébìv»Ýn²ß¿*Ûœ¾yæó/£ÑÀèø%H ‚ÆR4õ85jnnl¤í £#¨‡‹Ÿ“±ø¤³ó2 ÐÒ=^( …B@nnz:ÏÏððð0°råÊ•O<pœÁÀq€ßObFÆí×€Ñö;áюչΟ{ýQKŪ»h9‘òœ9Fcg'PVVVVR"UPSSSS[ TVVUUV*ŒS_____ÊÛi¹¡Ááp8€eË–-+(ˆž•8 mlllll–.-(XºT¸# Æ>Ÿ×ëó­­­­­­@mmmí¹s€F£Óét€Ùl2™Í@JŠÕj±¹9y‹s-@ó¢ïú[J®KÝÓ;¯ó|öŠÙúû³‡¤$ Hꉱ'ÚË¥:þǘfDâ Hž%EßG«Õh´Z@«%ÙÍ–†e5Àãq»= »»»»« ¸zõêÕkׄ žÛ“Çç| 4¶lhz-ù¹'AjÊ%†©©©©¹pAIñ„êëëë/]Š­v‡ƒxx,jhhhhhˆž‘_SSSSSS4Ï eY†aY ££££½‡ D…Báp$BøB!àÖ­îîîn ¢båÊŠ  ½¥-§}=Ðû]ïw=<Ÿ¹$sIVAüOÂfA„ÊÊÊÊŠ‹åõÔ0……Ë—¯X!çɤ5 …aÕ×*,Œnó76,[¶l™\jj üüüüü| ¤ W¯×ëõx€ÖÖï¿omz{{{oß2×gý%ëà‡ž›oý 2‘¹$+¿6“‚ D "ï/ýM½%9(’î? ë`ñ/1ÄD_)‘= @¯×ëõz‚ý&YX­@FFFÆŒ@jjjªÕ dgggÏž ÌîœÙ5« èy³çÒ­Ó‰Ï?)RR­C9‚b‘‚Ææ‹Er¨JžOcÒÒl6» ¦ìý™áñøõ9!Y¸UÈ‚¢I A˗˳v:ŽÃA …BXjxªxʧ†ºR>5’ò©Þᨯw8„'Èh49ˆä‡ à ׿lE$>ù/Ý»;p YMt?–o\€¤dù(` ÀF K§Óëfì uš—cCñp5r¹FF§ÓéìïêOž¬®þì3 ªê™gž~ÈÉÉÉÉÍz÷Ý#G„z5~§³¯Ïé”×Sjhhllirsɸ”Nœˆæ·ÙäH •œú“xpôè>Ìóë׿ðÂÆ sëVOOg'ÏWWWWúilª¬¬¬/Ä!ȯƒ:|xíµ]»víJ\ cø}bj{ã7ßܽش饗6n²²f̘5‹aÞ{ïÈ‘ƒyþÅ7lØ´)þ4t² ±mµíay–Bþªª*+W¯z<øî»ï¼£ÐÑátzÞ¸  ¤þXà#MiI)ÏC¸zz8‰ð<`³Y,c)Ôï'Ћ/qœ^¯ÑrŠ!Hª—»ƺ‘°¤ŒÙ.\¸P[«Ô“pçääääåÉ ›’ÂqZ•ÙNæBŽ3Ä÷•®èãÕ‹%AÒ=‘²²òòÒRyºB.----/W ±äoïÞýûCPZšÉ¤×+ÍFé|Üød×Z­F#ŒM!hûö­[_~9¹{‰i·£•=^m= nc¬t—’RZ މ+\'å8£Q¼p\·n͵,èƒ eákjjkÏŸÚ¤íj{A6›Å¢×'v~4YËg0ètÄcoòMI‰fArÅÔ•QŠÞu¡ü{öìÛ§A~øþûdWtjhÛ¶-[vì hçÎ{‚bQ|þ)… ­[‰à±=_}9˜È%ùÄ5t/HI/÷© M!H-}µÛÉ'úâC˜îF+BŸ{Žì×S¢õRÅIë©LÇŽ?NëÅ/Ž(ÿSO=ùdEy3cÆø ð±ýûس‡ç·lÙ¼ydžéïèëãyµ¼^\_Y()•żjõcØ!¨LÊ¡t‚O©^\NMµZÓÒæí·÷î}ë-žß¹sûöW^™„7bÁ`0 ª›+Ö¡]Aå3œ±Uú„I¹^ù¦xëåŸH)ÏGíŒ,9È¿KÇ4€Ïçóù| vpAg00ÎîŒW IDATxÚí\yp×™ÿõLÏ¥™Ñ­Ñ=BÇ Bg%@ÆàØkC‚+Žñ;xãM¥âdÖÞªu*ö:޳ÙÄ×’ØNœeco †€ §1‡@Bht¢k$1£¹ïyûÇã¥çÔHB •Ô~URëu¿iuÿ¾ë÷}ïI!„‚ÿ—›$übÝÈôû ä™]¯>õÑ¿û\Çìzp<ëúwËÍ~ÍåÏÊ~ Üg\Û²¬xöŸ¿ñÄzˆx^ Ž[è}¹Åò€çþû3Ÿ8 ùðÌ©¯ô> ·ænd2‰„_45ß<ñx|>¿¸zÏ0™¨6Uß2¬—OÖ=òÖ­ù7A$H‚$HÈÐùáà Ü=ýÇÿÇT¿U¯? &“Ë8ß³á»qQ(d2žrsÓÓ“’€nY÷Á¾Ç€ö·wþöÄÂ0oÛ´Zm6«•ö¸ähõø&ú¹Àý ϸÿS@²š/âk·Ûç €Ã‡_zéÞ{ädµ:%eáz³Ååòx¼^B¾þõŸüäðaÀvÜ‘áþößW4׉–~kÏÌ!ïvÿ¨­ÈýQŽ3ß,Y¢Õ óÄb‘ˆã€•+ËËsr¥2)I©¼Ùð-\¼^ŸÏã!Äl6›ÆÅ¿BðŸÏKé»<¸«× ”Ý_ü]})õ‹èù•áΞ3€X,Ò‹DÀgŸ;×Õx½^¯ÏìÛ÷ÑGgΰ»ýõó-©T*•H¨¡‰Å€ßï÷ƒ„ð<ÏSÓ›Ÿ$TÀÕ÷G=xÐÝ]òOåk‡Ãá°Ù€éóÓ_Î]ê?.骫+^*úðÀ÷ܳr% V+•2ÙÍ*‘ªYî‹—…ë¡g«Õáðx€>Ø¿ÿÌàgïœ>1|¯öï›ÖÌÿ9&á‹;:Ο'¤¼\§«¨z{ûû/_rÙŸËOÖ}ÿÙÍÙÀŽGþñ·÷™€þþÉI§˜™q8|¾›§€x€ÆS€6û[))IIR)PR¢Ñ(ÀÏßysû2àâÇï?±H˜‡ÃnœN‡Ãá,‹ÅbRª“-©€¥ÏVí| P*år©°ZN¯¡ÇÑQ  ƒÁ›|¬clEătl³¹\^/ PÐ÷µôÙª]?î¼ó‡?”J Ù´é—¿”ÉÙRñÖÃÉý„ì{¾óðË¿Žoâ‰s@¦Çç«Ün·Ûí8Ž~±·t|TH¥‰èI€@Àë|¾ññ®.`Íš‚žŽëê²Z‹[[Íf ®®¾¾ªêÏx,Ðñì–.|>Þ|jF‘¿gûö»ï~æ ¨H¯ÏÉÜnß{×>ü_Ù¿lîE%¾ãyz€b\aMÚ ÷÷ÅÅEE¥¥€¢GîV|<÷ܶmK–ÀÄÄ™3ÀC­__V|õ«›7¯_¬][ZêõW¯ÿù,–Úl´åÓóÁàü3imµÛwíNž´Xvîd2žW(¯Áßì-ÿÜ = ²lÙÚê­ÀÇ…Ÿ¨ÿXøZ|Ç|ZmaaQPY¹lYUàóù|>píšÉtípüøñãGf³ßäææåeeýyÎE=?|œ(æGz!4Î'ÊÁ 0—˜P“§¦›Ç;€;-·Yï²ÝÝ—.ÇKŽÕÎ×<¿ô¿ˆDb±X X,ÏÃä$ÇF£ËUX¬XQ_¯ÕÞ8àóU@"@ÿÇA‘–™ÑÄb€ÒS@*ü~BE6½}•- È—æJ %€J¥V+•À=§ÿNºñ2Ððå‡w¿ñ{àÅŸ~ú¡‡ƒ¡·×dT*­–@¥Z8è±ÑéòòT* ºº¨(5()ÉÎV©€”¥R"¤Rž‰‹…²0“Én÷x€ÎΡ!‹8¾¯ïÚ5zÞë¯A±Ñžªˆ?ÉsœLH$"‘\NçÍ…t$T@<T^§³Tê›ÃŒÚc?MÚ……Zmn. ‰D¢Y2O¤¥k4J%pß} ùùÀ’%R™˜îef&'ËdÂQ¯ÏËKN6mjl,( ¤¥åÒ%£øÃ>ûlxðx¼Þ`pnžÀqBŽa"sœT*(‚zÉ"(`¾,ÈX ŠL–«W/]š™ lÞ¼jUa!UÇq\ @m¯«ëêU‹èî¾zÕjÆÇÍf§ðzýþ`P«årž 23“’€+JK32h3M¡à¸;ÉɪªŠŠRS ùéOwïîì<#QˆTÃ𼊂A Xü‰]î_-° CO_߯‚¦B¦¦ÎXPiiI‰NOs3ðÊ+ÎÌ ˆ÷‚«VQà·lY³F«,½§gtÔj%d×®'††€ÉI‹ÅíµÐØ9¢­mpÐlöí;{vdX¹R§ËÌ$dË–¦¦¢"@£II‘Ë9î‰'6n¬¨ äÅÿûŽZÏø|ñïÌnßÁà"å€ÅfAñ "­6++)I°x&§NõôLOòÞ{'N ÒO£gK¢§O_¾<5 NNÚíÀŽ_übe%!Ì3|píÚâbB^ýÀË—c+€‚rse²ª* °P.ÏÊl6gföòÇd݀Ǥ€¹³ Úœš™ñzyèë£,hbÂå*(–/¯«ÓjãóíM›V®,(`ÝTŽ3ÆÇm6Bš›ˆžŸž®VËd@SSEEV••œ,— •øÑ£F# —K$b1MÞÉÉ€Ëåõúý@KË¥KÀË/ïÛ×Ý <õÔ—¾TSCHCƒ^Ÿ™Éqû÷Ÿ;72BÈà Ñh· Êr@d’õxöìùùϵº¼Ôjzþ;'¤ùÒ“$¿:Gˆf]™o{½àÙ‹Æ‚ž{î©§¾òÚ+2™¥²° ¤dö‡%ÙÒÒœ•Jˆñ¿ýí'Ÿ „² ú]¯ÏÏW«Çÿüç—.¥+n±º«V•—k4„´·ÓÔРÓedpœÉd³y<„9ÒÖ6> cc6pþ¼Á0= Ô×ët™™@SSe¥F LLØl‚'‰DÂ{„EŠÊ[o}æ`õê[n©¨Îûý^¯ýMàÂÝìøöÀÆW†í!Ÿ»á^T @£ãààÀëÑó€ÐSaЍ©Y²$-M¸Ogçð°ÅLO[­n·ð¢r¹T*_ûÚºueeðLa'NtuMNräH{ûÄ„ ²úz.##ö»…†Â³g¯\™ž®éõyy))±*âð [¸—Û}ä :ï¾+Åb©T¥|-Þ-yô3$T@ rÇaA"< 0»»¦&­Öé‚A›m|ho¿x±»;:ètyyÌ]àÂ…þþk×¢çÕ×—•ed*•B!‘ßÜ|ôèÀðöÛ‡÷õÑq?ð‹_ìÝÛÓƒëËåÂ|+¤ØýGF¦§á9²²RRŸoq…Xd%L×¾9N.=Î^,Z/H&3›/\¶nݰ¡¬ ضõ‚Êʼ^`ttdÄhŒî.¦¦ÒŠÉääÌL¨å³ùK–h4¡E³ü“'»»Æð^ !”žÎÌFãÌŒËÝ4MΌՄÅób1‹õ¡=¤x…@+`€ãŠP̾6ñ`A&“Ïdggggf†¾Èu__ìfbµº\¡ô}©T”×3±Ûé<ŸòþH8Øçi̲³SS)0ìzøs¤§«T¡ H¡44Ra±ÀqÔ˜„Bì†0WÄqŒ¹Ýb1ÐÛKYÐø¸Ã‘ŸTW×ÖDÓE§Óíöûää¤$‰P(¤R±8:ù:^oha£TÊ塞¯³”pÛîÕ×ëõ™™Â¬+WFG-–X´™ÜèÄqá!ˆö¼³) ab,ˆ­…F² ^ؽÛlx^«½ýv`lL"©®d²œœŠ  ¨¨´´¨ˆ6ëD¢pW&„®œÑž ZE{ÀÐÑh³…X/sÇ­XAsC$PZmV–Jäæfd$%E¿S—^ŸŸŸœ ÜrKeeNŽp½¥¥½}|<ñÍ\d¶m9‹Ú b,(íÿsǹ¹¹¹ÙÙÔSB0ÆÆ¬V ˜R)°¢Ó§{z¦¦„ûž>}ùòô4íåhµ„Èd‰XÌq>º~½NäçÓý:ß6,_žŸ„e2ʦydÃŽÖÙÙ€DBÕOêê2 ik '¡žÛ¡@B+t‚ 5°y{À\YÇ> ™L½½Àm·•”Ðq8&&€ÎÎŽŽžžh¸pÖ LêêhÏ&=]¥b¡ƒz íj¾õÖGõö²%(bãÆÆF­–ã¶lij*.æ8µš†´¶¶“I€J¥’Ë%Ž»ãŽÚÚ¼<Ž£À‡_¼8:JÈë¯øa$[ 5°È1Ž“HJJè±¢‚++ŸÏížš$·IßWºàsï9ííÀÃßu—N'ô‚q»››×^;tÈj***+—.BKOmª v;!ÅÅÙÙ*ÇmÝzûí%%„üìg{ötu ó™gf³Ë¬[·|y^!99ii `6ÓfÚÁƒçÏŒyyÔ3ÒÒ”J©”òúúÆÇ­VàÔ©ÎN£¸zuzšV¼±“.œã»¾L|¾7ß|ùe ­­¹9޲ÃÒÕÒæü¼Ou†´Ñ[Wm¯ç¸„»"l#v»m„Æ‚Ò[R¥‡° ºã-š ƒÁœ<ÙÖ64?>8¨V••µµË– –‹wìØ¼¹ª   Ž;t¨µut”ææ––¾¾èBn¡ . mQ8´5ϲ#-Ÿf2 ºº¸8#xãßýîÐ!àĉ'Ÿ”˼<&55G¿ßí¶Ûö=õPsïÎÍvÇ- bÑÝlf,ˆî#s8rr€òòÊʼ¼ð }1æ »v?>0|ùËk×–”6ÔÕåçsœF“šªPòöÛ‡÷öSS¬^ˆ:V³Ž†*`Ó¦U«ŠŠ€5khÒݱcçÎO?XV"ÄST0h0¼÷ šLᬋŠX\^¾mÈwí¹^oYÄ^Ðw¿ûøã_ø044–¥Ç÷T kdëày <ÝŽ:“šÜ=`î,(ìéi›XXs»ßy‡² › Ðé–.---‰†Ž¢=„ÙÚÚÛ;=Ÿ­D7»eÏ}>åAÑu°H$•RúI ?JË ÄVO¼9‰çÅúm±ÿ‰… ±8\SSSSSS€R©T*•„Ðcâ| °¼©fÊïöúñÞiÀçóÝâëœÿ¾ œœœœÌÌèŸ ‰%:Æ/ì~ñg³@í›çy^,®šL&“ÉDÿfŒõ–!D¥R©TªøŠH¨žã9žÖ¬nܾÖ|Vx6ãÓ4àèı‰£K÷{ÞÝþWi@‰»Ýç“H„1¶/¨®®¡A«¥ `¾XÐü%…õ”èçIo*ÎKê§Óét:‰D"‘H™L&“É…B¡P(¡ï­ˆ„ `MÌ‹y> ¨ìY6\“X†,Ëyàͺ;ÿ Éý‚rXu¡á•e?jk‹ŠÄb ¶vnÎ-°Ì]ë~‘³ÜnÇçNÜæ‡Ýÿ¬û×å{s^D߉D3=e¸Åɾ‰ÚÑL\.—Ëå"ÄjµZ­VÀf³Ùl6Àâ´úm"àG÷½Þõ2pôÅöw'>8u­ðµÎ²¿a¿ötõÙJà±»îKªRÉÉÉÉ* V«Õj5''3ˆ¯‚yÿ«ë q8(-¥Š¡ìõ K’ìø·&,„²£T*•J¥ h–„Y(Jœ„oøŸu°dÃ’žÿÖ„çyžnC§ `ã¸ô3ü#ÄÐÌ+íIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxMailPartExternalHTMLViewer.css0000644000000000000000000000012612247657030023526 0ustar rootrootHTML, BODY { background-color: #fff; font-size: normal; font-family: sans-serif; }SOGo-2.1.1b/UI/WebServerResources/mime-x-office-calendar.png0000644000000000000000000001067112247657030022213 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWDIDATxÚí[ytTUšÿÕ^•Ú·T%@HX¶aqÃDGh7œFEœqz»µqèE§›ãÒ¢v÷ í2í@ÓèhÛ Œ€2*¢@DÀ@({4$©J%µo¯ÞRwþ¸Þ~•TŠÈ3G¾sàò^Ýûïûî½(!„\åHàоCû¾GÈ&ݦM4„´}ÒöÉÉ®ÿ;“8%œÚ%B6¶nzü݃„´´P·(GÎGLßh?þõBê÷îlÜö5à©÷x<õÀ¦ ïUmPál8Î0ÉX2–Œ²þ†wkÿëNÀ“,¾Ñ^Ûó*pÔÔ$rþ¡) Úµr÷ƒŸï#Ä{­çg ÕjµZ-pðà¡C­­€Íf#ŽJà²Ëf]ù$…â\ûkjkþ q%!ª˜ªLY”––””•]]>_Wppz+¿ßÜ%Ü5ýKν¿¡Êˆ­€¦ ÍÕ€Ñh2@SSssc#àp8N'ÐÑÑñ—Sï_;oè¨Aصk÷î;òòÑ£G|ûº9¿xþq1èѽ®›˜Í&“Ù ¤Óé4ÇÑ• Ñáq‘Šðæáë/òzäëð÷³Ùl6›l6›ÍfF£ÑjkƒõˆíwNëÄùâ$ æ¸tP(hÉd2™Jú'ôWéÞ=ÿ8ŒœÒúƒúâñD"—a+‰¤””Ò0Œ’ïæU|=F£‘@uÂét:JÉq¾eä°FÈð{ ™L$’I@©¤ 8~üĉãÇåzh FNÞ·¯±qß>ªp…ˆD(1ƒ8ß2l‰£Š… -ºãŽÁë———— ÔÕÕÕÕÕÝÝÝÝÐÜÜÔÔÔ====Ã?a‡Ãáp8€šššššyÛ¶mÛ¶mpòäÉ“mm…Û¿óÎÛo¯]Ë æÜ cØÐÕÕÕÕÕEÈëûWn{}?ðhÝ/n}¤(ôýÝ»÷ìÙ½…Âá`:ÅH¨ªªª?˜9sÆŒË. y’¹ÓU(r‘ÏÛ÷}KËþý--´lnœNª¢¢¢"£˜3çºëæÎÍïï·ÏÿÛ²gW÷ÜÿOOÜ{PbñJ,简³¦ ŸúHÃ΄¼óâ²gk%äõŠ_ÓÇÍ ëÖ­¼µ%¯ØžµXL&ÀçkoÏfâbÇë¥Ô“kAýÅãñx< ®®¶¶¶V~ït:.W_(¸…fm )&·}EŘ1€ÑH)‡‰×ëñ””ä'w¼%%@ ‹Ìž]Qa·eËÒÒè—c‹ö¼¼¶¨áæýêÑg‡Žç¯€Î­‡ÇîàË¿š–ZêQÌdb1 äù¢"ÀjµX,–Â+ ŽDÂašñ””x½¥¥€Ëår¹Ý€V«Ñètù@ò<Ï B> Œ¢úד$I’¤üïèõz}Q0fLyyE-ÇŽ•Ãà È{H½½g0Ù,Ï'“€å7–§l§€®G­?‹ÍÃ3V@O][ ùŸ³Ùju8€L†&6™L6«×Sn×ëóW›ØŽõõÛ·Ó„+™”ßoذqㆠ€Ïçóù|25„ÑH$¼ùæ[o­Y#s<“ի׬Yµ èí {{åß#ªèU«V¯^¹R¶ì@ èîÖ­[¿~íZÙ)Ÿ:uêT{;pà@këþý@CÃÞ½ òøØ¦]"‘ɨT€ PŸdµÚín7Xúõ¡æWÎ\CŽ‚8’Hƒ„¬YþÓ=WÌ¿²£ößcǾúª¹hks:ï¹X¼øÁ—.¥–™ÉÈÎŒm9ƒ¡P0TUUVVUÑ æZs’’$IÙ,U(Û¤ù™Êœ2S|…3ç­ÓétCaJcãeoÙ&J¥R©Tòjxþù+ž~šÉ“3™õ늊ñã§Nv¼ù©åýw/þê£S½Âdt:’†¼ºOœÜÖäìÝËJ×Ù¬(f2@0H—äĉ“&Mž,S› Z­V«Õ€Ýn·;Àøñ4ÌdQGŠÐh4†R…^/×Ë8·¾J¥R©ÕùïY™ ü霶Á`0 ´_ƒ!x&Ó¦M›vé¥@OO:­ÕÒŒZûX÷ÏG½,ã4T²îöŸ ìý `že¬+"€äùDÁffΤΠr;Ñ,o¨ÎôÉ'—/æ ¥åÀÖVY1LØ&Þ¬Y3f̘üä'<°x1àv»\Ì©Ÿîû}WNaËõxJKËÊ€ƒ9Îh$IÒiÀrµå«šâ´o 0¦j*æ¬Fø¶~k‡¸¾o½Õù5 i2èíŲ2:Q·»oâ5T€F¡|pñâûî“U*•J•Jn †Bá0pÿý=´d ðøã¿þõòåÀk¯½òÊË/ÖÏàTAFBüþ@ «K6¼l–çãqÀ¶Os[ß–#å;pðË!à:d \Õ~ùþZÀl¶Ù\. ›å¸x…8N§£Q‚ÅB [R¾åŸMI-Æé”òë1_Àd܏РÝœð4a#$™L& B¾ù¦½½­ýû[[›šäz½½©”V He«Õn/.z.þfûþ3ˆ†]i)ëé!D¹A1NÝh—PŽîíM¥80L&»]æn–¡wüÞÿ;?øÁ‚wÞ)‰D£±0oÞM7Ýx#pÿý?þñ½÷þã?ýôƒòÃæ³t:ù¤Ìd’ÃeŸÏïïêÑhL&€çéö¹ÙLƒE½r”ú8^@q3¨,·»ð TÝBšÂ€óϺQ÷â1~Qâ9î¿ä’iÓ¦L)lùg ð` Ü´‰†‘Ì郡P(lß^_ÿÙgÀÍ7ÏŸûíÀÒ¥K–<ôpûíóçÏŸŸÄœ9×^{à ùïc±x<#„m_wuùýT1Z-pÅ—_>s& ut´¶õîG¼(Ÿ t m‹šÂÀXÕ4|ß]ßA)¨[â…/þ X^°ü‡m I½½™ŒÑH7Ï.ºˆÖeÎw8/DIì™Q£¨… ,¸í6`öì+¯¼â àüÓŸÞxCî—|+…˜ŸNH$‰„Bòfa"AOÎŒF“Éd&Nœ8ñâ‹åhˆ%¤Ö7ìkÝ«)n  Ý!(À÷ŸGfîÜ X®s|âõ¢˜N‡Ã²*-5ª¼|àp:à†ZîÚµgÏ_ÈyD¡ÁœccssK °woccS0ujuõ”)ò|X†ÌǶÑÃáH$b%M™zzä0U¥R«U*Àfs:Nš@6K`û[g£€ÿž£ÉÏ~5¸¥ `Qç-_V™'¯Ÿê"¿?z{y¾¤„îÝ8ò .Ëgï·nýä“O?^zé•W^}UVD!gìõÒ=¦»ï¾ë®E‹€E‹î¼3÷|‚eÊÌg±Œ9Å"¹ ©å«Õ4Ü5›Íf“Iõzš—ƒ–²›|@"A·±E‘ã¨Â4«´¿+JÉë"Oùý„-6›×›?΂Ûv4m\Å¥‡*<”z" ‘E(--+5ªo<~¶aæÙ—g~ Â.°-Ÿ:×H$ ‡¢"£±¨p¹è =¶Rð¬dïµÚ¢"«àyIR*©ŒÅ·±ìóJ…Œc!)¨ÿö'b€ÕëxÂ!• `0“1€êêêêêêÂÜ®–zg~æÀwttv¶·rôèñã‡Ë÷‘ØÙ°Ûív»Ýò®' GÕ T ÀŒÓ§Ó­‰TJ§£TŽ2×ó¥ÇBR‚|_Nì¨&þ}u÷¬)@&Ó™>Y„B™LQ ÑÐ<àË/nm•-H¡ ›kJ%ŒrfágVŸ‘ûœ»WÔ·=!J%ÛÄ£íägV¿{ú\YYQQUÕ÷÷¡>K’ H I*•$QêÉfiBªÑP¦ˆFë}®ÔÔZàËuÍ~fp+~zF+ ¶¹çöo6ƒÑh±¢˜J…B€$¢TÊ'KßÝÿàAçm2Ñ»­¢˜Í2 ‡£Ñl¶Ûh}Ïò¶þJž’±°¿«‹ÃßXN9÷€ Äã!”3>ö¾ L!D’¥R’R)À0ÛÄ9še\û×Ï£ ÷ÉÝû¶î«Jß®œˆbja0(/ezr+ ;ÛµZ­V›ñu.·ËB[°¥=ô³]ùÀ¾Déƒý’{® ÷’Û¿ü½gsºñ±9÷Í?èA$–ˆ*•€(Ò„Õ3yôï&Å÷É%û•–šù·üð4 ðÕíéì ªÒu€ðF2ÙÖ¤R™ Äãét6 ìÞýÞ{›7›6Ñò».3g–”HLr\6  ét(8–»£šßöcž/,@%jpKN»¿žˆ…Ãáp8LÈëŸóÝ0 ˜YwM×mO‰Ä±c7‚Löö'„‰UuA;ε“¢žÜ:ý-®»¾µû¶ëi ¥¿ü~òÿ•¿sÿÎ}Ï‚µZ­V(‹Å`ÐhƒA§S©µÚht¹­¶¬¬¶ؽbKûÛíÀõOÿì¦Í¿¤ù…Ý®P¨Óét:&$ ô]êCiO§g?8_ vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/confidential.png0000644000000000000000000000026012247657030020447 0ustar rootroot‰PNG  IHDR Vu\çtEXtSoftwareAdobe ImageReadyqÉe<RIDATxÚ¤QI 13Òû}²C öPZ!LN!q™) Fâî¯l˜Ù"ZJ<±=½¹³ZU<¡B‚N71"¸Ý¿: }{`?M_é`krg¤¬ßÓIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-text-x-script.png0000644000000000000000000000744512247657030021504 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW°IDATxÚí[{lGþvo÷v÷^ñù|¾ØNÎöÙŽ]Ç&U¨Mj7 ÔTý£P}„´QТ (›Ò(‰@¢éCB B©M›6qÇmš„RZêG'1>¿Îw·÷¾[þ†ÝÛÛõÝ¹Ž #æfvgwæû~óÍoË(Š¢( > KØ¥®Àÿ{øˆ€%\¹âñx<Î*Êéý8ù|aR r€Q2J0ÿ^"mÆ7—ì-d9!hý@=~wX©¬¸{eÐlàšÚADAd˜ÅÛ(0åŽÇŽà_K(Ê ›ZÓ"àC5|ÿ.Ï0K×}H&S©dRQÒét:™¦§gf¦§¡ÐÐ¥A™øíÄ+@ÛòÖ 7°@ǽíŸï¼`Y–eÙÅkGÙüÆõ;þ×UŠòùÙϦ¾8A69 ärŠ’Ëúç©i«?Õ^izîûô×óï+Ì'¹,k±°,`·K’Ó H’$I055551ü½ÿﯿ?䎀EØü\÷Ÿè¤œ”“rןˆ²Ç€ì/2/¦Ÿ&ÖÎ0 SxšÖÿ3o½b|GþU†)ÌQ¯Ùl6›Í33¡Ðä$píÚØØ•+@eeeeU°öÖu[××öívŸdþä~IþÃíÀTl*6ºþþaÙ¨W hãûóKæ—˜ËÞô×´Àë É ! Çq'ñ80::::28v»Ó ´47¯YåüS ’ÿÏÀ«•GC/ßLˆâø?®ó  b3 ÑSbF†¶\1 НÍ׿Ñÿ<ÏóÈr<’ž138v»ËÔŒ,­½McŸ¯Þyt㑟Êä`0¸ðDÌà 5—#"TàõD˜7¦/HQÊžþã8ŽãyÀbaYŽÆÇ'&ÆÆ`·“Øív»Ýn éá–5}xí£¸€™ÜLnzzመ—ééІùùF}Á8]N0Þ8•ÿÏb!ƒ²ÅÂq, ¤Óét&är¹\.Øl’d·6›Íæp±¢²ð¯­ßê#ƒ¯ýé•N MESÑOļ$ÈXçó½šükÆå¦RÈÎÂ;óå)ÿŸ:4Ó1Ábá8Ò#,ê~‚ ¢H’ H`±0 ˾߰ï"P1\‘]öGàÔûB½½þyLÄ %(P=!fDAX ÅÒ¦µ„hëÈ0*à,Ë0 ðæ›o½ÕפR©T*X,<Ïó€Ýn³Ùí€Óér9@ ±imÀœï87ù—[€Ëý£Õ#ÿPÿM+­õþòÝÖè…þ¼4z!2¦Ò‚Þýœ+môŽS{Ç©^ð¬ÅÄb²‹oéòeàÂ… .^TÝÚÀµ&¥ñ8p~ú/_9û½ù´`Þ˜k&Ms•œ?ét&“É@r9 »ž"mŠHV‚,-ù’¤yH&“Édxï½÷Þ{ÿ} ¢¢¢ÂíR×R©Àع±s×Þ.¿% A´ùÿÌäCQŒ-“z5æ\‡ggc1àߨ»÷'?‡ÃnžzêС‡DQA}2¼ áµxIb@DQ—‹L,)Á™ ‰ãñx<"‘H$&&‚Á`¨ÙYûXm0pmð 5ëk³¥£¹`ó€Ò¯ëÿëUÚØA ‡ÃaYöïâ‰Ã‡;îøÌgî¸hmýØÇ:;Ç?xðùçD"‘H& -Þ,¦DÐùÕjµZ­Dûm6Àår¹\.Àçóù–/š›››››ÚÚººÚZ`åHÝåCÀµƒ×ú¯)͘ Ó@–#æ¦Êˆ„b‡Ã±þÙg›nêêÚ°hkkk[µ ðû›š ºº®®¾8pàС^ D¤R¥QN̲êãv»ÝÎD½áß/Å-ÞL~Ì€6–žÙYÕâŸy¸ùæîîööÕ«[[ññ©©ÙYÀé$–ZYY[»b IË–y½ù=b>DPǵðºêÖ2 ‘û,ñj¥]Œ€â¸,…¯)ÖeG"² <öÑøîî-[º»ŽŽŽŽÖV`z:’eµ<žZ¼“ü±±`0<§Ón\.›Mh4K& n¾yýz`õêÎÎÎN §çûßÏ'¢Ô1À¬,‘­µtµ!äGß¿ÿÀgž6mÚ²åÖ[ÎNøXLë&RKW×Z¾ÅB—H}<·Ûá¶nÝ´©£ðû—/w»cÇúû/^l¶Š ¯¨®®©Y±‚ôˆÃ‡Í‰(€%’ 3 õM§3™løêWwïþá-[n»móf`íÚ5kÚÛ™2ÁbYx­…ë§ñÛoÿõ¯##ꢙ×KÈår9EÞzëwFF€ñqÒC._¾refFí 55uu+W>¸k×O¨ Òz\o *{&¬MaEÔž¡Þp™èx½UUn70; …BªõPí¦ÀéËÓ·d³™L.\½úφB€ÕJzDKK àóOE…Ýœ=KˆÉfÓél²¸&I‚ÀóÏ“rÑh$7ÜÐÖÖØHˆµXÌfí´¶Åq)5,ˆi‰0 ¨Å>ýôSOíÙ\º444< ô÷÷õ9d2(z_<žL¦ÓêóGFFG§§ÉÉééhh4M$Y&q4*ËÉ$‰´(â—-³ÛEhiil¬®Þ|³¯¯¯  û÷?úèÎ幡ú1`‰¼ ã bä'‚`µ>úï<ð088008¼ñÆÑ£Ç«§óçß}÷òeàƒ††ÆÇ‰tLMCCÁ jÑë×wvÖ×€ßïõ³³DÊD‘\w8ðÍÍ ÕÕÀ™3§OàEQQ€}ûöî½ÿ~u)Bïç—ê†Rã\„`&Aù{¶êrpþ ¬%‚ç >d2Éd4 œ}êÔÉ“€ÕJ,~ß¾½{·m+¾ØXö_ï™n–/Š´G<òÈŽ@*•LF"À»ïž?îÐÒB,×é”$AÐaµràóUU¹\êâpØl‚44¬\éñ§N8qâ^Q€oû›ß4¾Üù€~j¹¤TàfD¥é‘GöíÛ¾ˆÇc±ÙYàüù³gÏœ†¯p8$IµC§Ïolôû«ª€ÞÞÞÞÞ^²Ñ’Í?¼gÏ}÷Í|©î§Ù†ÏüÂHP~EŒˆ0œ¦éS2I–‘…¤¿þõݻロ¬ÿOOgÎô÷÷÷€=rÒM€x\–É"9PxüxoïÉ“ä‰ðÐC_þò]w‘A>VߓͷØ|Ì2^ï•iqY´1ÀèEfçç©ùt£#“!§R©T*™ ²óDR`×®;3 Ó§‰÷44TU ÄâßxãØ±'€ÑÑ«WGG;¶mÛº•œz À“çÒ=_ú~jå¿^ÐÇ‘±ÄlLÐzEF¤ÅeÑfÂÆTœ£4Ï[­dfJE]ºÈf3™tÈfIÏp»IÏ8tèÀ¯}M}*ÁÒUR‹…xEðùN !?À‚JP¹”\ï` ¼6¯#)—%õ‚J)9×ó㌅[Å>^2;£j¯Ci­ý¯“ ½at|Q›.|º±ýiƒJ„þý;ŒŸWÚ >£üù®ý…’{ñ§Íy6;´[Ø@ócês5ÔìûóO—òOm—š¯}þÜÀÂd~Q:=E H$‰DBQ¢Ñh4-¥ë÷æ& Ò×ÿæ– =ÐÅï3î4ŸâDæ'ʼn0• Ê$è„Ãáp8 °_`ïbvÐê=up£R'\ù¢¤–)ô:h“Ìòk\ìz©¡ÐÀ ïзSQØ]ìì@–eY©§¯‰û«(f__š@?X SuY–eYœ¿tz–áŸ^b†<@£§¡2à¥@/¶§³t?È 3ƒ àþ›û»î²Oþ–|ùÒÆnWq¤„èƒ)´¸Ð¶|¶éƒÖiàÕͯ]}å%@¾Qþ•|Èùru9·ÑÀ6?ï`±Ë•˜3ÉÄ×n—ßÅ£«¿²¦°Nê÷ÆÀÿç9Å*LÇ€x<Çÿý¥|\ítq‹JÕÿKEršš.i8‡Ã¡æÓï‘AÁ\JþP›zAúÕD3¿ú=PÁ¥®®mÑ5&Žã¸â’\ö—ò…… ÿ×Ò>(’IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/icon-forwarded.png0000644000000000000000000000104212247657030020712 0ustar rootroot‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs''”iQtIME× *XMZwtEXtCommentCreated with GIMPW}IDAT8ËÝ“=H›qÆŸH¤6 ºI)‚YD+j-¥P(øQÄ­¸iuÄÑ©‚ E)-´–*µšQ-((¤âb4~ ÑH!Á7ÐøÒúþ*E….½åà9îwÇñœôÿP TÜ·ùqÒ²ÇRP“¦×M·ÔcL~  ¦éÉèž0dÜ¨Ú Åñ×8Œ$†BÀn©eyá` (¸Úë:Ïk…EÙ–ÛíRoû}ÿ²í?NØ{’2ìÔ½ÛÒבPµãž¦LÚoçg"£ýk FÊÉÍTü(¥×¯´\WNþ‰:zÊmo–§Ýóþ* KÒÊøèFñôØ–àbŠÏç“1FÑhT|ÔÕWõËã½8‡HšØ %ž-"Úßµ´NÈãöPIe®ÚºËR½žVcÌçëê€Àió‹)Þ<ŸâÛ‡MljOîâÛ_àçR `È»«Á¬ØA`pßÇ¡/ÚúCg£0í£>fkIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tb-mail-replyall-flat-24x24.png0000644000000000000000000000371512247657030022674 0ustar rootroot‰PNG  IHDR°çá»gAMA± üabKGDÿÿÿ ½§“ oFFs`ÒÞ¹” pHYs''”iQ vpAg°H‘Ï`ÅIDATXÃÕW]hUþîÌìf²“ÍncRcl°“þ¼D«Õ*‚`JÀ€UJ)V…úS°AâjiŒ"BÉK©Š¿¤A4”Z¥B¡jkhJª¥M5ÐZ›Ý¶šÌÙÝ™™;s}¸Œ“´ÙV=s™™{Ï=ß9ßwî 9räÝw{zR)B!¤ªŠ1Æf€{oÛW¾¿Ú¼ëyÏý[–mg2?ÜÓóÖ[µµXÀ$Ûf ¨ªZ±¢£cÃIEA` ðxYDÑë A$¿Áçã‹á¯Û6¿ê:À¥šX–a¨*@©®‹€ijZ>hšªjpôè¾}Ÿ~/¸c¥”Zà÷Ër4 ¨j¡`€ahš®Ï ‚ ŠEñ¯G>O’øzîG+*ü~À4 ƒR ›M§s9ž°P Ô²(-7üYlÛ¶- …jjjj€\.™L&éésçΟB)ß±k„¿z½@*•H\¸(J"Á`uuu5§¥€eñxÊöþå—ýý[·šæý÷?þø /HcŒñÒsN¦Ó/^¼\ºtòä7ßðLóÚ¹íÌs¸ëæj̶]YÖBZ‘ÄN—p¸®î†€Éɱ1]V¬X»vÃàßÕ !\+’´V$‡BŒñÌ8»ˆmÛ¶˲¬ÙZÉf§¦~ýðû Ñu ²²²rÑ"N•@À¥N9&Ц(Œ §*!Œš–Ïçr®V*+£ÑhÔÕŠàæTÀ¶/¿·mJÿªV®ñl ”¦Y*•J³Ì}_]}ãuu€a¨j: üøã×_õ•[ÁrÍ™?1qøð¡C@6«(.p ×Öº‰töuâ(5Í«e¼XÌf3 ™L$…SȶÝyŒÍ­”£•ªªšš`8rd÷î]»x;VÕù7M]/•€ï¾|ûmÀ㩨0  ºšû» ²2E@US©ÉI—s iÅy~îÜØØØÐØxûí·Ý?¾oßÀðñÇ==Ï=ˆ¢Çãñ«V=úèO¿üòý÷'Nð}Ls®_ËâÚE —³,B€ÎÎ>$Ã0 ÓÌf÷ïï½wÞ ‡çëë‘H$"Ë¢Èât'§kQj†œ={ìØ?--÷Ý×ÑD"õõ \¤¢äó¦I‹8pð °sgWWg'Ȳßœ:uðàð0ÐØ¸lÙÒ¥¨$²\[ÛÜ ìÝ;1qæ @)ß¿ì~±{÷+¯lÚdš›7?ÿ¼{à©j.—Ë33©T±´´¬YóÐC€(J’Çãv¥S§~ûmzxæ™={>ÿ¸tif&Ÿ‰—_îîv„ìV𧟾ýöÀ`ñâÖÖÖV`jJdX¿þ“OöîB!BË*³S»çÀBZ!„1MsÎYàÃÇÆNœydpph¸é¦¶¶eËfw>Ú¶iÎÌp¸–´¶>ð@g'pèP2Y*ëÖñõ‹5444÷ܳdÉÍ7R¹æÓŠÇSQ!ŠœBºèzEE(twïÙ³?0225¥(ÀªU«W¯^ ø|>ŸsB3äóºn@<žÉè:0229yæ 04tòäéÓ@*Å!._ÞÞÞÞŒ7vu­]{ ÚµkëÖuë’IAA‡%ÉëõùY³æ±Ç6o&DUëêš› yöÙÏ>&Ä4ýþ@hjjjjjâ™%ÄùÖFGGGGGI’$Iü~¿ßïdY–e¨©áe @<ÇãÀ½÷F£á°m¿øâòåK—¦Ó×ufζººÞÞ×_ß²E½^¯wÇŽ††úúúzŸ/ ƒÁë÷ëPVQEQ€L&“ÉdFF¦§s9¯÷ÁþþînM+›BóoR(—_¡P( €®ëº®Ï¿îò.G)¥”†Á»™ªªªª2fÛŒÙöÀ€ 0V*mÙô÷ÇbšæøùÛp,yíµ7Þhiñz††85ÚÚê\n vpAg00ÎîŒWÒIDATxÚí[yl×™ÿÍ=Ã[uY•êŠåvä+qâuÒ )»»(Ò$ÝÅ"XÅöØ¢@‹]´hº‹EÛÍn ¸ ìÒ¶5,Úø@ã¸Q Ç’ÝT>$Ù’lY’mQ”xˆrHÎþñáu†CR—Õj‘ê¨oæñÍ›ßï»Þ›gš¦išØu~½'ð×.¬³l°Î²AÀ:Ëë,"û2¸0¸ðÇs¦yòÓ§÷_ÌAã ™íë=½OŽ(-ŠWÙ <åÙ×øôC@Ïþžý[V†þçýäŸÿãMÓÌår¹\Î4Ùñ ½6šáúzûO\?Þaáû'ÐSº75ð<Ïó<ÇE"‘H8l­[/Ø/µªXκc=Æ[ûyöß´©¡¡©‰ãÒ§W?`Ë@—8~üí·Âápxf²L @Ø¿ÿ³ŸÝ¿¿|?q±ALÓ¾¿¿¿`à/wÇqW¬Ëõ+ž{i-"ÖZ¶mÛ¶mëÖ¥=eQ(>¶vdÀQÈ+ør‰Xì>V³óù|>Ÿ¿÷ût†¢`ÿ¡¦‰âj(š4ÏsižgÀ–"°þ–&€µ ggÊΰ¿Å€çó¸³mï¿zB÷e ª’´ЋÎó@&cÙ,ÇãÉ$PYYQá÷²,Ë¢H¿³@gTZp—Ÿwá['ðàgloÛÛ aý–ƒÇªCS4­4vÀ¡ð…XÇÝnYªª·½qczˆÅâq]B¡––ÚZ ¬ªòûíD0ažPx‹¥,ž,¾à¦Y8õòù\Žyõ[^YêüŠCRg–MmJµË`Å~žzzÚÛh”<â÷¿¸vͺÞSOíÙ³e àvkšª–Ü9oÒÑh<žN^¯Û­(…¡¦Ðòàtž­ëét6 ˆ¢,ó<õc¿³÷_Ü Ö€—KQìly@¡'ä$‚M_óyž\.Uõûçž{æ™Ga¶\¾|íÚô4 56VW>ŸËUÊâésûöÌÌü<àóðªª(‚°4à¦iš4/²øùùhT×`°¢Âí.ޮ˛{ª‚LÓÒí& °€$ í„Pì¶·ÃúYçKe%a:ÎBÍ£>üp[ð»ß ŒííÍÍPWW]íõÚ“%éHd~~ahm­«óû ·nžÚ¹KWO§S)]4­¦ÆN@$2?ŸL~?ì4Xö}Õ!ˆYÈév"ìÕŒpgN(E\)‚ ËÎÂ$üôÓ;w¶·ï¾ûá‡##Vˆ¨¯¯®öx€7¦¦" ¡ˆQUIr&UŽ£äŸJ¢(¦ ¼÷Þ¹s##€Ç£ª’,,¤R©06vëÖì,`6 LNÞ¹Û·oÞ¼iÍÛò˜¤Rk@€ÝŠ `€“¥;w&çr€; cÀY¢¢H’ ÎÉ4gŸ}â‰ÎNàÈ‘·Þ:whn®«óx€ææÚZ·hk«­•eÀ0’ÉÙY “ÉdR) ›5ŒtH&)ÙÏÎÆb©09955= <ÿü“Ovw²,I>°uk{{Eå]{ìêê,âìÖnFÀR²H¢ š&Ë¥ëy+Ô”N²‹Ïó…¡‹!Ùl>$©T6 TWûýªJ!&Ÿt}a!‘nݺukl xé¥Çß²…BL$d2Ñh$bÝ$1-Š i² ܽ‰Äb€ßïrIpåÊèè;ÀÎ==õõ€,{½¢ÔÔøý^o1FKÉ=xýŒY¤¦I°/  5Ï Béã!‹·‰PUUIææ"‘H¼ysh¨¯÷z ƒbµaóóáðíÛ@6›N·¶R•ÄÀ^ŽôövvVUW®ŒÍÌçÏ_¾<= tv66z½@"¡ë†´·76Ë×iÈ« €„ ª²LÀ[I’ÎS€`U¹•:…ý­ó…:ŸÏf“I •ŠFÃa@׉ÙYàêÕÁÁÉI`ppttnèííꪮzzÚÚ*+¯WÓD‘,?›%C—½º±äË_~æ™övà•W~øÃ³g?¾vmføÜçöìii±›äJ Xõ:À A ª‚ÏÛ“%%Ÿòšãr¹B"ì€g³éôÜ ëñx8 †®Çb@&C¡gxxb"x µÕëöìé驪Ž{ûíáaJ®àó¹\¢hy„ªŠ"™ÊÊdpðúõÙY`׮͛ƒAàðá½{›šhÞ«Û‚ ¶Ôê}ÑTj+‚Mˆ… €µ­={èòY]Ç))ÎÍ`™ À¬UYà B¯··£Ãï/6ŠW_=pà¾û€¯}íèÑ €ùù……L¦ÐVb©CCñ8pîÜ•+wïßüæ¡Cäé÷²ùHyÌÊ‘å¤ì©Âõ$y€iŠB+bEáù|Þ~œÚŠÂq†B:=; ˜æüüõë€(ÆíÛ€Ë%Ë™ ­LÀçóx캦¦¢BGÓL“úÖJÜï×4޾÷½_ìîÂáh4~ñ‹ßþöÆ «ßRzròîÝxxç¾¾‰ àÛß>|¸£p»É–;ŽS»\²,€¦©ª¦Y¹mÅàÜÄRQ´œŠ,¨¡“φ®ù|&’D!HQ<V-±,Ab•q….jmz‘Îfi|ºz.g¦ ´·74¨*ðÚk/½ÔÕ|õ«ÇŽ ûö=ø`UpàÀ®]uuÅ÷uéÒñ8ðÆ'ONL?øÁË/wuYÕ»÷• Çñ¼(‚ ª> ié´¦‚@UÝŠ °v4ìÚÕÕåóÍÍÁ ¦'N „ÃÀ[o935=úê«›7[åõ½ÏóŠâó´äyòZ°®˜çþ¸ª ‚aE&vˆhxžWU;àGe'$©²²¾Ūªæf€ç%Éí&©¼ŒÅff€túÎë×É£èºl‹€0ÍB"^{í…ÚÚ€?üat4¾ñŸýìòe`ûvÊ%ï¿?887üò—ßùÎCQòf¡á^€ç8žçÅëx^–½^Àå¢Ï’!Èz>ï´úd³Ùl6 ( °°XiÓšÏjZúsYÇÑþ¾¢´µíÞ ‚ßߨH¿¤]MöK¶=VQÑÒÈrCCw7ÉŒŽž= äróó33€iÒõM“ˆ7M eªJ!î7¾þõûïöìùÖ·úûóçGFb1à£^½·—TÌ"W—dy^’hÖvà9Ž€g„hši.+†a-9 °öÅóùòOĘ…›&œU!D„ ´µíÜ p\ @õ´ ƒ”CìÛÊ…W¦o³³€¢|êS{÷¹ÜÐÐo~˜æÂB,˜&….+$R é쬯W ª©QUàâű±Dhn®ª’¤Õ?Ù³O+bKû|sl¦Ù®$I2™NÛP‘H<^ÊÓ× øX,—s¹€ nÞÌd€>øðþ>`||lltÔÚAhû§Ðý÷=k]¥l"'À9áÂã¢H–Έdés¹ï4ØwÔI ²LãÒÖ…5báÃúX,™´{ÀÍ›33é4°cGGÇZÿ¥/922b=˜jkkmmnZ[C¡Pèîîèhiª«ƒÁÚZ`àÊÅÿíû„'þåI·€rOûöÿÊ+o¾Y*T-艅úÏ#ÎÕµãñTÊNÀ~ôë_'À©SããÎ6ˆ"­ÅÝn¯WÓ‡iÇå<ŸÏí4ÍíÖ4Ú,TUà§?=zôØ1z–‹SS““““@4F£Àtïô#SÛ$òýæÆ…Æ…¦Ç¸áq¹/6}ôÑøøZ¼'ó—’žžmÛz{­6órç}H’$Ià÷Óvs `š¤9ÎçQ$MÕŽ¦ñ¼ªõõ õõ@4‹E£ÀððÐÐÕ«@*¥ëé´µ%3úocÿ8v8pwÅíê!ÀVñÌ…Š XÛ±þ¿‰x¿œ:°·Y?Ž£PØÑÑÑÑ٠ܺ5111A¯ÙP±@ÀN\úø `Û?lýûm*PYYYYÕYü^“XŽ}}uu |ñ‹‡<¸Þ°Ý»°ûe{5š¦iRH»\šærEzptúôéÓ'O;w†B½½@:MUd2I0¯º¯¦¯4ß~Pø"ÐetÖv¿ *]׉·(˲\jû–… ;vïÞ»×IK1QöVñ‘ò¿Xùx¥fºœñXíD@Š"ÕçV» vœáð~ÃÙ†÷6žÚ}ê±€,S¸|úÒ©K}ÀôWîn½Ø6xCÞ7dY8ÓNà9®t¹ó'h¥fšº®ëº¾Þ·»þB¡Âj;ßö`¡Šõcº\¨){öÅãñx<žâ$ñ×* H&η¼°ÿ,Zéu8g½O{CŸätyÂ(:ÖJ¸¥÷|6äÏ)ÿ'¼Î²AÀ:Ëë,ÿ%½¬Ï3)¼ÜIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/collapse.png0000644000000000000000000000170312247657030017615 0ustar rootroot‰PNG  IHDR$$ᘘŠIDATX…íÖ¿kgðïóÊòIbA«ÆK4„¤]²øðUliò0{MÁCâ$K$Ý’ÉCó Þd0xM éfd íx•—¼û|º÷é;!GïéN”PüÀÞ÷î>÷½_º‡0Tív;#„ø%„8_\\ü›ˆX·¾V«e ÈtÇ97Mó‚Cpxx˜uç7f¾…ÅÌ=!ÄZ©T²‚¹F£‘u]w"GÑ#¢µjµj€€³³³ç“ @DYfÞ;88Èsý~bG)•UJíÕjµLùx‘™ADïÈÎMfÞv]wÀ+`æ¢ïÅrˆè¦Rjƒ™ÓD´àÕ”]ó·y[*•^DANç–çy>ì{Á1M3Òi6›·ÇÙð‡×ÿ–«V«õdÿû¨í¢ª^¯?i4‘ÎØ@–e="¢€–”2uÙ0[[[˜¹áºn¤Ȳ¬;J©§þ0ŸÉdž]2Ìf~ Ìœ·m{¬£ $¥L)¥ö Ά™²,«8I)eŠ™÷˜ù‚³½½êhùW#ÿù¼RJv:ëqÙ¶ýŒ™GÏóäÎÎŽÖ äŸÕzÈ1¾SJ­Ä ã?+¡N¿ß×:#VWWÏÜH$·uËòòräë83337 ø­[˜YëLé&ËåòGÃÖétâdÂæææX§Ùl†:fæ|»Ýþ1ê@J©†~Ÿ¿‰è”™Óòõz=ÒqgàÑé ½ñ¿A ̼ g#¢?†ÆoÜóØ œàzàÏ ‚€™]!Äãr¹ü!˜B<$¢‰"r‰èqµZýøí%ï*¥²1œsÃ0Þ‹ÅÞç+vww“½^ï®çy±œd2ù¾R©Œ8_MÑðàªcÄUÇyRÿƒŽñ¿®‘o™”25;;ÛðMÈ>ðéylI)S¶mw™y"Gûµ'¢ßuýàmT˜ÀêLOOkí-K§ÓkºšU?—Ëå¿âf^#"­S©T´Ž6P¡P8I$÷¨`ŽˆZ¥Ré׸a V«¸ODÓ4CЇziié5€_üa׿j—iš‡ˆºÌ<Öû–år¹*½L$+…Báä2`nn®*„xID+þU -mÇÔüü¼‹OoÃÕúúzlçªcÔÕUÇ8Îùê;Æ%?¡´Ù8IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxMailUserRightsEditor.js0000644000000000000000000000267212247657030022350 0ustar rootroot/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ function onUpdateACL(event) { if ($('uid').value == 'anyone') { var inputs = $$('#userRightsForm input[type="checkbox"]'); var enabled = false; for (var i = 0; i < inputs.length; i++) { if (inputs[i].checked) { enabled = true; break; } } if (enabled) { showConfirmDialog(_("Warning"), _("Any user with an account on this system will be able to access your mailbox \"%{0}\". Are you certain you trust them all?").formatted($("folderName").allTextContent()), onUpdateACLConfirm, onUpdateACLCancel, "Give Access", "Keep Private"); return false; } } return onUpdateACLConfirm(event); } function onUpdateACLConfirm(event) { disposeDialog(); $('userRightsForm').submit(); Event.stop(event); return false; } function onUpdateACLCancel(event) { var inputs = $$('#userRightsForm input[type="checkbox"]'); for (var i = 0; i < inputs.length; i++) if (inputs[i].checked) inputs[i].checked = false; disposeDialog(); } function onCancelACL(event) { window.close(); } function initACLButtons() { $("updateButton").observe("click", onUpdateACL); $("cancelButton").observe("click", onCancelACL); } document.observe("dom:loaded", initACLButtons); SOGo-2.1.1b/UI/WebServerResources/btn_span_bg.png0000644000000000000000000000754312247657030020277 0ustar rootroot‰PNG  IHDRÈ.mEV;iCCPICC Profilex…”KhÔP†ÿŒ)‚´‚¨µ”àB‹´%>ЊPÛiµÖ‘qûÐ"È4sgM31™ˆHAÜùZŠˆ‹*âBºPp¥ ‘BëkQq¥"ˆB7RÆÿ&íL*V/$ùrÎÏë†USŽcE4`ØÎ»É®¨vèð€¶xU¨A5¸R†ç´'û}¦V>ç¯é·P¤e²IÆŠõ˜ø´mõýKbïëžöúžùúyo5.ŠFëŠlÀ[%¼Wòɼ“§æˆdc(•&;äF·'ÙA¾A^š ñ`ˆÓÂ3€ª6jr†ã2Nd¹¥hdeÌQ²n§M›<%íiϦ†ýF~ÈYÐÆ•­k€E/+¶½ ¬Z_±5Ô+û±-ÛϤ?¥vÜËlÙì‡Sª£¬éC©ôs=°ø0sµTúu«Tš¹Í¬ã™eÜ¢¯eaÊ+ ¨7ØÍøÉ9Zˆƒž|U p“sì_Ä.×?ˉ g"çÙnpåÅ)ÎèÈ9§]3;”×6ëúv­G+´nÛhnÔR–¥ù.Os…'Ü¢H7cØ*pÎþZÆ{µ°{òÉþ"ç„·{–•‘tª“³D3Ûú’»Éä{sO7¹×TÆÝÓ°²ÑÌw÷é³­8ÏEj"uö`ü™ñÕÉGå<$xŃ2¦o?–Ú— ×Óž<ž‹IM-÷¶êáIV¬3CñY~í’2ï:jî8–ÿͳ¶Ès†6ï64$Ñ…(šàÀEzL*LZ¥_ÐjÂÃñ¿*-$Ê»,*ºð™{>û{N ÀÝ2~¢qŒ4–#hú;ý›þF¿©ßÑ¿^©/4T<#îQÓ¿üqefYŒÔ(ãËš‚ø«m§×B–Öa^AO^Yß®.c_©/{4™C\ŒO‡º¡LMd<Ùµì¾H¶ø&ü|sÙšµ/Î>©«äz£Ž™¬~q6\ kÿ³«`Ò²«ðä. 8Ä–˜íµ}j]èÀѨëïõhŒ‘Èíöž6ÆØqÞÚ=û~ÌEžttË,Ä-:0ÇA‘¶2|¢uj†¾gjké„ Ž•-Ðë1 ò쳘值ßR+¬dÓ§2ŠX3>Ëۘ،\ºF‰l\üd{'VI?æ71é*™þ‹^ÂÖØVœÂ}•Là)Η„3µ}f]š{–¸_Ê-Ö{º‚ðæ¥”´ÜhjCÇ(F·$Å‘pha(C‘w`ïÄò<Ë|í§íŸÄZýÇöUVPÖ@˜ÍK¶†gu[Wùh/¾ë<ëù·9µç…e’+Èl,Ð,,ywÕ TÔô]øÀ髸÷ÿDÿôˆu@ŽØg±Ô-JMcZCB/«Õb“G¾~Wë.lÂÝ…EDÁÓ–dJ!Ÿ‘ÎaÈø¾xk °Ë•;å}tmAî¸OVö \uYtÝjlÂM.«ûºäÀØ °{e>IˉÝú«Bë%”"~¬ÒN`çw•&ð~ž¨‡žøPç³fú(N©°QMÔ^ gúú^Yß½µ©*›"|GæÖt¾®Z†‰žÝ/å+}ŠÕYyP`îÜ– )ÚYÌUJ}œÜ}%àìÑý&­`NàIc:WÂä 8­¨øˆ‘>!<|%wŽàq”˜«”†n_=h®iOmŸZµf±gÑzr‡Xõ+ZDî.ãÐîõŒD×A‰c—±Ád³H,+O‚EŠj6S3Ññ$k£–Éö ¾í±]ê½µ9pŸ›è$ïEê™sÍÎ;z&kXå€ÔwK€V{vFËîÄÞ‰E j™æz·¦Ø æØŽ±[Û8÷ê¾±«°{ «ÞbõíÁy4½Ð‘Z§XKö¶¾Ý‹Eñ–EZž›Ïn=$g‘¼7ì1O±Bòc~š–a§Š€aí{jtÉ(’Í(úñš’ŸŽÔ²`ÄZ²£^ñ)æ{ŒUo±’£þê€àJýQèNïXµ¼s•yóñ"¥ì¬BŸMß"Y[i-*ööÚ½µyô¶†H³µÓûV9 ôn£Þ1× |úÑ´áúVÍ%z'V”‰tzCÑœÎFóìž•d_ú ûØw¬íG÷{ѹ·¶Ï­kÜ)±Jýý‰w$ñ3Hø”Ïï–”ˆ'NÕPìkr°Ë9ìX¦ DU¾Ð,Öge-€•…'†'´wÖŒ&Ç;qÕt‹kѰ>+++‘IF“êQnø˜ 8ÐZõ»»P OŒ¿Xl×ñÔ3Sˆsæt•a`K³ROrêÞ®%@`b<½ ¤Ñð*Óæº—}œ£Z4cѽ€ãéÚߊÁ¼5¶_/m«¥ž®í3ëJÅ®ïÅT<êÇ8Ñÿñ3ˆJøuîÉñÁð‹åˆÖÕÉþåÇ:¶"§DB[ÇÒD”Ì¢KÀz-à¦ÅÄ:Õ]|3¨ÄÜnMGÛ˜z¨dk¢Ú‚8§zX]‰Ô:¶"§Dªo„UHúsÝÈÒ•îOZ—•ŒÊÆ´³Ø»°ÖÊpÞnÚV,š]|âá,ÐK°Ê[‰’/–ö×%yvbGXù€”tRqä(”´*ÁÑž$Ó•göN,˳Ԕ¯’Ù¶:òoµÀÔWÛnn|T_÷ÕökÕEí÷ìì~©Ï “_5qË8ÚkRÌoŠîoºl›ÉE½Vœ‹ï<×1ö<Ž¢{P»ö$y>Ç¾Úæsj¶ã^iϵº²·7ó5¾Âóùú¥ ¦×äê€éÀëׯ_Ÿ¾üõÅ(¯ÉÕ«¥¯oooOׯý¹¶ÃÕ¸ù×þ|ûû[l½´WþçÈéÏÏ/ª ò€¢”Ø~*0þ¡PŠK³x6Ðúj„oëŽ2ÒÇp‚aý‘CŸ_±ÙY[Ô•ã>d)Tz^4ê×Y,Aò}<-}ýªVuÀµ]dÚãס‡c±kæ±9Î1‡'«þ`q4ÎájᤵZžÃœ9ÿ’aÞWð57-ïÄÒ¸$ÏcëÈz@ÒW¹\¼=í*Dû©/8ŠGû5€),_@øfr»²3|–J¡§Î\amóY”›$ÝY¡†Œ%’BOÍ'_Ó8[»&™K ÏbW\A^^\²dÇnnv"@9‰å7`êæ+© ¬Ìòd÷¯ú[+v5B›×Ð%s´‘r˜‹Åôuåo’˜JÚ |•E« ïàû»í—Ä7xQJb©‰ºS;¥7š—¿¸F(,fSXpƸXúQ º†s*PטüüW¥s•¾T­ÔñÞy^%òÉOÖ–¡¨(Âó˜d”×Ô悔Gc6ÊI9|y¬ÄhÀWØfÇñZ±´ÉäT½i4WØp¾ÐÔ‘|yS§Iù_TÉ\á\ žªÓWièæüˆºˆ^!Q‰¦Iù±6Øâ«†Ð ½ Ù.,Ïç~l ßà!æãQÿ¥™cï±ÇN¬^¦a¿^éÀ”wCA“¦åõâ§¥Y?³*æðT7Õ¶çàaÍ X=WúK„ù€äßW•¼øM4Œð]¦MÒè[¼ÅÒÙ#«¦´Ž]¢#¾],&ÁBem#`-ZÌb¶‘5öÔZÈýè¨.вL“F†baX›Š4b?{ 6‚z<ɾХ#ÚLÈXÆuìŸn×Ì-ÖQ"›–fýˆ¾¥E! 1û®°Š-ÛÈV#Þ,)§òËè³¥ÌÜÙÛŸU‘° -™(§^mâl%j ÝY?¢o‰Á>¦¯ü r†_‹ŠÅù¦-·Oç6twâ§pB˜[äþ ê¢ö,Õ†~ÎŽÒ‹Ùˆ¾Ÿ`}Ä~)·XÁǼD0Søn´ÚTcêLް2b…„›BÝŒGØR@?MÀZÇZ/åî•^¸:vs±_›ÃEZ£š­×EÁûkÛÆ7íÂÊ8ÌMU'­8ÛW"[o±*4žJëbgí +–"tYÄ*ÿÊU*$ÇÉnÛ-í)¸Ã$•P‰‚æå/ÿW‹â*‡O²‘ô‘uQ¾GÔF¸¾¤ãO1þØýÂD}DIï›®²]s[Êr3ßájÂ’ß<>(Èà—tŽÒvÆÌ? Š®VlVÊ5ã+ü *s º”TYÑ|LmÒ€{ÖáwÛ/T«½‚ä>´-ðš|åHÊã{@Ùnt‹…MÖÆÉAj}¼Øá=`iÇCOv€€±`!wéѯS±³LÛÚÅáÐ3DóQ¶A>VùÈ–«Åzt_ëyy™yßá*èº^íÅ\<楋4m£æÅØÐhxÎŽ}®È-9û¾³ÙàlÌ%4;Æý|wðD킵Ÿ'ºG9êCz9 ü˵‚[ ÑX>ϦðþF>‡…bû¸”›bèñÍïHÅœ=X¬BŸ‰åZN¢m¬¯xYig]„¼«6ËRf«|£þíÖãûjn±øþ¬»cÛ äÖ1.áŸÃ3;6‹æ)øÏáÖÑÎÈIk´Ì°³®ÂÀåuÓz+Ðð°ÜsUíä{Ës=‡°¼9 1|§])ØþôîN2°aIYY,xö5Aý•4n}ìê~Ý:Ùr`Ë?s ASHºÊj®áŸçØ }…t›Sl"…´²WAd¿6ÏJm¤Å›Hšk“òwÛ/ôan±¸˜IÁÞ‰…m™D7‹ ýì²Y€éÇ6GÌE⬽O:Pz9TÂ8?´1IÛ[‰8–,æ}XÈf1Y ᮑ^¿öç®^Áz®_ûó§¯ðUß]ø/aÏËø vIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-dvi.png0000644000000000000000000000661212247657030022274 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW IDATxÚí[[lÕþffgwfgw½ë¬½¾$vlïúVS‡šbJ!Um$„"ZZ*PQ•‡>TŠÊ‘¨*PHÕR*U•ZÑ„*„Z!n¥RcBESJ$•Hlol'!ÄëkÖ»™½ÍL§sÙ3{±× ü’å9÷s¾ÿü—󟳜a†aà ºNÄ_ï |Þé \gòÔÛ@UUUå ã?['^~ûu õÜ¢”òÆšQ2RöºDµ±\%µ×Èv¾”÷¬¯ÿ<ÜIÛŒ­ßÞÖ lOm÷ô >É'ù$Ž»`³ˆ«×¼õÖ¿Ä£9úc 8"1´"öi{Ž»~ qR>_(äó†Q,‹ù<°¼¼²²¼ ̭Οõ©ñ…¿,ÛƆx`äûÃ÷ÝðÀó<Ïó×nu3àϡކqß•{ ß[ [\tÝ0tpög¦ÉóÏܯ4]¹ž³Ü^¯<Ÿäò¼ ð< (² ²,˲ ,----,““ÿ8³èãà¡{žýúCw~uY—õÍgDÝ6@ûCéOŧÉnç8Ž«Úßt-m—»þ¼Ñüæêßï¤é“äæ1b (‡ØM…8YâÆ k»j,¨¼5ßšG¿EQ= ›UÕL†HÆÊ (J(´_h»Ø1ôë»Üû[à»ß¼uü÷À‚±8›J5žu{AN ¬ðZ~å•—^zí5 P(òy7Ð+³‘…E£--[¶cc·Þº{7`„Ç#Š€ ð¼Ç|òÉÂÂåË@GG{{g'P(£‰D"‘Ð÷ÓÄ/û¾ýï›Óã!à›_þFÏÞeÈð¾¹yã6¢n°ö?Í£;™ã€{îÙ·ïî»ÝÛ²l†µžÓH;ó­ã±Œ¶3ŸÎKˆQ‡ç‰[](º®ëºøý²¬(Ô‹¨$•Ý»J0~öè«Gú€}í÷Üyï´axÞ€7°~F¬K±õ|9`ì´ÙžãØ6£ëÍ¥–×´«'û—iš©M‡H„ P÷ðù|>IdÙç“e@8ŽçØLì\lŸ kM¯ÿ~êÕcÇÖ »I PAv@ qc ÂZ˜QAÖ´•!Ö9rœ 8Ïsœ Ç¿ûî;ï•Y(‚ Š¢(Šß¯(@0 @oOߎÞpräƒÅS_>š¸Øz!i]_Ýæíîª_Ö¡‚XÐ’åZ½šéé©©éi² b±Ö¾ÙÆ›UnÅŠòrë·¦iš®¥R©T*‘t©DÒšfª¤@ ôûÉyB€x<ïëzçûŒž'—O=üþc@¶=Ûý\½h6Ä”/•ã€ÁÁþþr@;Òý»Ü›²3ÀÌ­f[XL¢çƒ|>—Ëç\.—Ëå€\.Ÿ'ÿiš”S÷õôéÓ§ÏœFGGGGGs§æzÎí.pùƒù†Ñ¾³}gÇMµKBü º#é×ÔÔÔT2 ‹¦°`Xç¤Ý%ÀÎÄÚ•’•D‘¨˜ÞÞ¾¾žÀç“$IB!r°,‰dP QUU½zX[[[[[R©T hßßñ³ŽÛ€™ùÙ_Ì@;Úwvhµ£¹.ä–CŒ*IQ `1ŒêáJ^Û·a˜¬²3£±÷^¯×ëõšã‡B¡P(Äb±X,f©xAÿsÀį&&&Æü®¾qÖ¥‚X %áÜ™™drf(‹E« (—‚jû¸ò\ܨ©©©©© hoïèhk«¿ïJDæNG"ÍÍ@º”iIÿúÓ wÖÞWC¼ ë´(0ñx"Ñ×ç^¯\ḛ_*-•otØÌ=be/‘$I’e@¿QûŠ6\ÿ8 PAöà ~¶»¿n=Ùc6•ú7ûd"®•³„ã¯W½^Žsº µRCTP%Ý›´ŸTYÒƒRy ›X1 úÁ-Ÿy¹·V¹ßõÁßä¶€ƒ|ôQÓcõBlÆæ\ãx<$úyøðáÃO>iÕ³g“ÉÙYb› ;Äî«1Û;Ukí¸¸Ì³ÞåÃ8UùEÃPU@}>V?Ô_^^YI§I¬X:;ÛÛ[[Ëëë:™çkgX¡†®[ƒþþþþx¼–un—ÚhÃ*ˆ.̃‰Fý~­‚?¬ëE¯H§×Ö4 H§ççíÛ·nmi1CËË««™ ÐÜåýe2Ùl.GÂÊ’dJeÇ‘˜N2™Lž=k?ŸT[#`J@"ÁfàuSANB¿[ZE×ké/ôzI ¯× ;öþû³³ä*QžžÖV ©‰ô›Í’(æùóóó++$¼Ìq€$ñ¼,mmÑh0HhçÀÀÀ9ŸTZ!û»\6ÎaÜtø–-•%ÀIW®d2ù<à÷{½‚D"ŠÂqÀm·íØÑÖF¼ A u5 àyM+lvm-î¸c×®®.Åôx¬õL à8 ™œžN&«Ç¨œ;šJ@"Ñ(ø¤‚LV˜ùÑh­@H× …R ˜½tiy¼^¢¢D±X$;ßÙ¿× œ8ñᇥK’¦Á ßÏ[‚ìôƒ)ƒƒõ¯³º±¾FÀ–r?½¥EQX  “}ªiÄÄbMM^/0<ÜÙ‡=ÿü™3@&³¶¦(@<ÞÚ›ý?>5µ´Üÿí·wt--á0Þ:.UM”ÓÓ$FU(P/ÈÖõR ¨¤Â>*ˆ2"õû­ ŠŠBn¢$ <Iòùˆ—¢ë€¦åóÅ" i¹œaO<ñàƒñ8pàÀ3Ïœ> Œõ÷ŒGž<¹°ìÚ‡Ã@gg4*Šd –Ä9UÐààÐP% p»Ë®—MdÛ ²çAt°,“'¢B|¾þþ±1Àãin6ë—J©Ô©S@>?3sâ‰v‡=ð@O°wïcML/¼ðÈ###À 7twSà+ÙàϬ¦¦Ì{ »TŽªŠ"‘€ÁA¢Â*]Ín*X2ÀbD0(I¤q9®³³·ถ–›o&pøý–‰xZ[o¹UM¥Ã˜ŸŸ›vïN$ü~ “QUMvíêí•eÀçÅZœÉàiˆdhhhhpÐøê·p}Ñä<„‘…ê:]8ÙŸ‚ÀóäH–Ï_¹B–q劵QEºÎq$ ¬ëVàTµPÐ4àÒ¥¥¥Bèînm%ÊŒMÖˆ5´199995U.²ì÷Ë2H$,/‡êåâgSÀÈi ž~z|Ü0€ÙÙTJUIÞ{ïÙÿ×CwÝ5664:tä@ÜÒJndgg$"À{ösOæ7<<<<4äomÀ׃K5Z‡ rÚ§&éýûüÅižÝIu¦Í<û'lÖÏ=ßNõÇ›( åççÅÐF¨áhö¬èZ¯—ö~ja ëŽÙ™c½hµ^‰:×ñPAöôô49q‹¦®­¼ÃË{¬\îxµ¹9¡®\f? Vëå5Ú° r#ê®YApfu;Ü=íÞ=mm]ÎÖkÖË»j¯26J TAv¢þ¶)ì[9m|ç×*nëaã¼^òŠ‚J«Ÿëª‚œTØëTÖý¬t-;¾úºÊt±%dc¸l˜ö)¹ÓÔÔä$‘3æ²àó9u/-uOÄzüÅzà΄JÀ¯÷ö—M53€Ÿ¯.'®@9I:Òét:øïòû¸ÒÍÈv¹\"LÀLÝm=Иiëgç³g\­¼Vb?½tn û: ƒÿÿÿ ›Íf³«æU*yin¿¾te}L/ϳÙl6›‚ niJç~sž›ÛôlÙÞÜÛB¾v¯t®7Qàg¹sÜ,D>ŒŒ<dcÙG²÷Š¢(ŠbâHâ$WЂ@žeÓ÷öXÞØsôÒ‘×ìMÙç³ozLïÔ#l͹¾g‡×¶]½Ä­r‹ÜU ôãPWHF.~éáÑ ôœÌß°ÿ?Õ&Lm€ªªªª~úKyÕ”U¤ªêóB’D^SÓr f>ý=²Ïçóù||½Zw õ‚(àôÙ¶ÓX}^ˆ*\ºÃéC0ÊZ½ º)ÿ5–þ°zD{màIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-sound.png0000644000000000000000000000463612247657030020100 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW )IDATxÚí›{pTÕÇ¿÷înÂ&’ »‘G¢X"  ZELÑ"ЊëÈ0ÎØ–XNÛ¡ÇB*OGìHPAD„¶<ÔSy¶ Jˆ yÇfw³{ïÞçéÇ3—lØ Ä5Ë~ÿ¹sîîÞ{Îïs~¿ß9w—#„BVÄ»÷»ÌÁîÀ÷UZÚ¬YëÖuôaîÿ2ïvÇ•F_rÚ2­öÝÀo^z:û02Å6zàìþ÷zLË—/[–—BǦý¼Se¨^sþæ|à™’•›ÞÿȯX¼gò{„üâµé?37x B€ªªª®ååuun7`2ñ<Nj٠¤(C2“ ›)eì@ ذ¥è§¼À‡“¶Å¹ ÉÉËhíy!“4MÓtPUÕ4@–EÓAðùd¨­miñzAe˜¶dj^V$¿÷­9G’,«*z~9B¨á…ž0ÚŠ¢ª@cck« KddD`#CÉO…[Š®–È=ßï ªš¦i€ªRC«ª?Ã3T¸q£©Éë22Òר²½³>;Tš 49Zë¼îžó„@sÀ­§ nï(Jàry<² d§ÿ>Õ lßµoõÙ²žëw ÀB ]&ÇQQf3ǺÎrÒÐÐÚêõ)WïHz8°ðDVÙFÀíñʾÈ !À? 7Žm(il.l:g½Ü\Oª,®Ö(ú H}>E\.¯W’ût[ÑàÝÀÖµ{¯íœrXÈqd6o€½Íë'.˜ Øþ9pAtpM.¬RÌfŽ#Äø]S“Ë%Š@rNÒ¼%À‡«]ºü2àll|ú½ó„àë…§]Z ¤§ÙÇ%Æ;.®ž7o'FªÏ×´ÔŸL&€z‚(Ê2àtÒ…ê))És?ýïí—>{ÿÞõ;„´ÏÄF~FþÊ6dg6›Í<Ïqo¿õúˆ¹ko}ëXç+@K‹ÃáttÛ´¶ºÝ¢ÄŸí_Òß”äü·°æMàÝ㟞<×Úýž2t]× 1r@ %ZãS¬<ÇmÚ–Ÿ<û qs}õÍ5€( ‚$!©¹™‚°ÿÒ¾aèŸ7ö<:XµsËÖ£W iq;eÁóý„Ì£ˆ»Õ¤g3jÍq‹þ2³dÌ1BöüîèáÒ4 amRvÒ€¦ÑG ȰC#¥} ” (ý þ*ðÑævok,ÑæOLŸâ®ñþJŒ0®_YyøðÊ•?ÚèªVþáù5¹6àÉ&}8ük eq}A]=àr9n·áQ’Ds‹µ.ö'q*øt²o€ xj…ç|‘À˜Ÿ§/\ œ8±cÇ‹/Þùýï[`â8Ž8ní¶åi3F“Œ¿‘–HHዚNUU›«r+]Æ÷cr¢+"7“ …Ã[޼9}ðÐð²’ºð0ï¾à¯s²SÒûqÜŒ9ÙŸ¤½ÍŠ<æw.¶ë÷»ïCP°d…YaAV@2ØN¸·)d¨*ݱö6… M {@Pö€ + ÈRUM ‡  *ìA–¦éz@¥ªªAAT8Y½À=ÿCæë¯*¯56R|ðbQU1ðåþ #«šockW·fÍû9Þe€\®F©Gb#O’õ@”fÙg> $,ìWl-Ò=Ó¿/ðèÌñö À”¼qsÒÆ÷é­¸î~GìÈßO7]=NÈïîš}ò·€âÐ_× AµÉ‰Y@ü’x5ö ЧOŸ> Àó&“ÉDK@’dYQhí¦,Ç#´†SÏßÚæ{OBqÛHOà.ð, 9yèP›ÍÑÜ\[[SsçŽ÷Zªªé:Y±± ô` påZÕú– 3:sÒÈ6 >¾_¿˜Àç£ëtEQ]§rëºQ¿ÏJYõ²ªjšªv,/×4Zt+˲̪ ¥¹¬àÐPV¶oߊ€ÉDAó<Ïó¼Ñæ¾S°ÜuRUºÞÐ4ZµuϾKgÖù7ozV¼:!÷á:Àáðxäï árf³Ùl ˜Š–ÒªU¥>Àf0{ÁB–e™œeIºµÍ󴤊™´+©AÃà·?ÂÚf³ÙLËx ¨¡ ¡†gØy`盿¹¸˜øÂ„ÆQÙ@YY•³Y¢ër€ˆçŽ£3Ïhì1²QÛÙ¾ÂíÖ-nõÿß’(Š¢(§ÜfãmþÞ €ÍtÃû‰MŸ¯oDÑWÀb¶ÏÈ25(›¡g*}™Žy‚®ÓÛP±zvþN¥ë`̨葉€$IÕ’dšMÖf×gmÖŸöG¤ûAtX†ÒÂ:ÖÙqák3ëFMª|××Önìöäd«èÛ—‚‹"}‚ik£GÇëEÀëŸæY6BÎÝžL:ää€yÃs_–ÚqÂ0w:¾öÇîßêuð£ý´ uZŸQC€ò¥Õÿv,ÊŽ]Éÿö_@šÏþÄà\ ))>>!p:=I¼^QT#´°˜¯ªí‡ÇîéŸ3Œ‰BÛ²LCŒ|F˜âN&¬KO8˜ûëÉk8Žïf<]µCWp(öšQ¬ýEÑ9¡Ê l_þqÛ¥§_¾2Q; Ä,ŠÕb\@Ôª¨‘ŸÓå§ÅbäÖE¡¡‡•ʲ$É2 I’$I€V&¿'»ŸàÛ%> ÈŽ)¸<—73"à Lš=zîÇ(æwvþößë~.C™ëùÚ€ÿç¬]qæÆWpö¥ýêbÿL¹âm¨®Ok¸ä~pòŒð-”êúƒá Z¦ðW€¸RkyÔ;@jV¢b½Œÿ8}|â³@VuFBR6`Ÿ:(!ÎÜqyéß”t;C¯sï’ð]ïXR À?ÆйþÉ×?ùì°_H`†öoß)=½/è¶0i§Î“?€ö×éSgn¿ñ þ¬ÛtU².àbÈ®êÿ;¿pŽ÷a¹¬IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-lhz.png0000644000000000000000000000512612247657030022306 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-text-x-generic-template.png0000644000000000000000000000643712247657030023425 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW ªIDATxÚí[[lWþfgö¾Þ›í¤¹9‰-·¥´PZàQ©!Ä”–Ö·¤´€¯¼ðâ B ñBUBT(N¼NS©„6D*mA¥uÒæÒ$®£z}ÛõÎÎÎì\xøûëÌÌÎìÍG¨ý¥õÙ9>çÌ™ÿòý—9+9Žã8>¢ÛD‘Û½;}$€ÛLJ¯4MÓ´ˆãüóàùç^šVÿ°–XUgÛ1UïX‚¶`€k{ƒœ_½ò?ɪÀ!çà7ެQ&îâ‰x"ž¤Ý`vI½ú€_üGôLÃq?5vðè}À‘KcWÆß¤èv=ˆŸ ]×4ÇÑuÃÐu`cc}}m ¸òصÏ\þ!°ödù©Geï¾ÿžpïÔ=Ý7D"‘H$²{ÏѳžÍþ%úçÇy¬òˆñxx㥥×_,˲,Ë·¸DŸÖÞ7)…ÏN$‰DB\óóp«(²ÙìÐP.¤R©T*”Ëåòê*°´²té­!@zF¾)_~æ¡ã_xHÚI;ißzAôì¬ß™lþJh¼mÛ¶móu7-ÂÇE"ÞÖýú&ÚH$‘eÖÜÖÖ²lÛ4µµrX^~ï½åe`ttddÏà‰?ñ  $¿<Ï' óês_Öëëõµ­[ö,Ò.qÝŽnF… B$ˆáþ–Çãñ8 IÑh4‹²,ânEQdдFCUk×nÜx÷]`h(“Éå€;MÞ}W[?’; <_|a«ôE œ('ÞûÖ ¢x7ÄÈþÚîÖ‰F%‚(•Nž,•€D"O$D¿,û[Y–e ‹Åb1@UëõZ ØÜÜÚÚÜ‚ØwíŽû¯ãg'nŽÿxþ«/|îôo²³vyuuð‚è# õŠ ÄD";ˆ·ß4-Ë4‰áÉ$05555= 4›Íf³éÖ|Y&(â–ÁPäûﯮ޼ d2ét&¤ÓÔ …B¡Lü`ògþóÂÅÓY`ÓÞ´76'ˆ¾ ÈMAÁÕ­ TUUk5¡É~ˆòCŠ¢Q‚¬hTìËR©d2&gÉÅb±X,c÷þÊX8}ù̉Åû£fÔŒÚÎÑ…Y@7ÞÿxúÈ2ÍSEQ@×›M]Œ sÆšŠÊb11O–É·$@2IÆ÷Û{iïÕ½üÕ¼•ûðò/Ïm={, 3õ‡íݶŠBš+|Àü|©$"NŒó[;i/Ëäœ_yåÕWÏŸ^~ùܹ³g¥¥ ––€J¥RÙÞÏ;~tâþñ PþÎÚÚÚ×ëço×®÷o °€î+ hg‚`ÊdÒé¡!àñǧ¦¦¦€z½^WUb¼zH¬É|Í*J,& ‰-DÓ4MÓ€åååå7€ .\¸xQ@ÖøÊ„sôïÀëÿþî«?ÚE h•µ`lwÁÐÓ› ü¢išV¯µZ­V­ ·mÛ¶,¯Ðý¼PÄÔº4 ¨ÙÔõfxë­7ß\Zòù|¾PŒã¨ñ4p󵛯­ü«wKè¹AÂé¶›œ–C)Þgư&ú³dMÓuMŒfKa±³Æó}‰d2™r¹\ζà¨Ê4©­×5MUjµR©Vryuµ\ö=½ÿÇû?\Z¹ü³K2°ûØou~>¦ä0ßûq ¡ÝGQdÙé‹‹§N-.±X4J ˜ß7–ó]æç€h”J¼.[[ "£D޼L&N§I ¹pÇ{÷îÛLNÞyçä$pðà¡Cc×\?tXùéÊùåÓ½«ó2áV-„óe çé‰'(Þ7 Šzüùkx6KãÙ7pÞÐ i^Ap Î]­-û—Ï ÃÃ@Õ¬VÿÚ»A^èé 1^gª0D×u½ÑtÝ0Ú­ÃßFCÓD¿(QïhÝ?_¡§³m~Nê‘$o‘ÏqG’€d’Šö§¬ÏZ÷ì‚ ¨ûæ^Ƕ‡ªª -E–EΕg†aHˆAÉd<žJ 'ÌÄØÍÌUQ¶˜°ÝE"üvÍ–/¾Ó}IÀB<½òsÇä¯NúÛÎù]Ë21š!¡T:uªT¢Q*¬Dx jAŒáb­ç÷ b~û€¢°hŠwÆ—îh`QP«u‰ÿÛ6• …l¶P¦§§§gfHƒëu¯…Ø6Ï ¹ÇqXÊ d çqSSÓÓÓÓ€iÒ}Ä®;±Í ­ŽÃ3ýXÐßá†C?cpð7×FÂh]7ŒF£uœ_Ðù†Vá{DZ÷¡0Vø„ÎasеÄNØß—Z£ níîu›ºiÚ6ÅÛ¶í8@<‰Äãn'LÂÙÒÊé4Ñl›Ö £ZŠwìäs¹¡¡b‘È>¡8ñ ¦_X-¨S©Áo)\ƒñ×õ£QŽóƒ×šK \XóÜ> |žß'P¹ÚŸ£x³õöyM_º¥[‰#¼ý„Ñ–eÛ@¡Ë‹ÀôôÌÌì,A†¦…¯Ëa`¡Í‹ÀÌŒ˜GÔ~^±Hóø~¦IûŠÞ8êiííÌ—[(€` ‹ËÅw¯Sæ¨ÇNv#X&NÈü‚ífݯÙtïß'´²“{‚Wï÷„Ꭳ ?ô´2ÒÛÓlZ–a–E˜Ë©¿ˆË»KèøE Eé@.Gpx|LÕj­V©ˆZ[H«'éœ> /ãüñ×ëK¥“' ƒ)* Ë:ùö"è®ÔÁëðîK%ò ‘¯ÓZ¿ jÃøÒ- ‚Zu¾µŸã÷b1—fffgçæ‚t=<Ÿð÷²©Ó:³³³³ÇŽÍ&¯Ó]"|B>?2B¾dnŽjP¦ÉªÕ _n#u#ÎL›MÓ$ôåVŒƒ AˆuJ¬Ä*Aû#.7‹ÑüæL–ƒµ½ÝÁÉÞi`ÇRÜlt›¯a˜¦ašfî:}ç2vûÒÅö¶ªnoSËÎÒKyÜ&W*ÛÛ››Àæf¥²±!òvf™»"€ ù55žû«EÆ+@1;˜áÜÏå`ݼ.åÝú˯0y]ÎørPmkè‚‚OÆù¯æÆÎÎ Ì7Œ y­Øí×§#I–%IÞ8?8²ct0ãùºRÙÞÞÚL,s¹‘÷þºË'¼â n ßÚ"_À«°…8Ž7ߨ5àÞª›+YÃ9>çþ`ub´ÿZ’¨Ï{XX sA|1Èió¼°ÚTűƻïCy‚÷=ÀNiÇQ“óÝq>CÅ`ShÚÈH±8: ;vìØñãA¿O®ÊºûÚ)?'߇ó ‘'ï«W1æ7›ä MÓ4;a½XS˜¼ÛÑÒ5¿ìë8´>Çÿþ¸Ÿ#u÷ZŸË;ޝM³Ùd†Óž¼oÈv]¼&.Šq]?›Å¸&ÃvÏqGáâþû¿Õjµº¹)U(PfìfCPÂüABð~ã«­­Je}àRH*•J¥Óýp‘¨k¢ãß­ræ(AÄÍ"Î÷?"Ÿ&h-®Ü×|g·nÀ¾ÁzAܧ›~÷}ýQ’Û‚NœXXp?Í#ËìÞ:  Ñh4 Ç©Õj5ª>zEP,æóT—'Ìgòo¬{A3ˆûÙ× S~Áñ:C’Ÿy­Œ„w¿þ–OkˆÚ=¯Ÿ˜Oº®ëºÞY¡Ä’¤…Èä«U òÍÈפoñƇ+?Ž áhB„‡^¬'¬×¤Âúwâ%îäž×?yÆÏBV0±·D"™tùIyZþýnA­ A'ï'ì×—¡àº:Gªªªª ý~h8· \ýõ»Ò•aàèð‘âø(3z0‘Îÿ±^–®J—% ÿlápþ8 ~Iý¯úsú¥ ¿£¶íV§Í*ÿid^pò‘‰wîÚžøÌ{‹ó€úiõOêK€½×>`‚[ÑÁnÏ땤-iMªÙïgDzQàÞâÇÏ}òQÁ'ÿ‘ÆÐu:m˜}Ÿ—ç–-‚!ˆ¡êÃBüûdþÍY&“Éd2¢?™¤ÓÖT G†®¨ÍQ3\8=ñá wÕý{÷¥3$÷üKùh°ô?ÐÍU¹ M|ÆIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-arj.png0000644000000000000000000000512612247657030022265 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-package-x-generic.png0000644000000000000000000000512612247657030022215 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-text-x-sh.png0000644000000000000000000000744512247657030020612 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW°IDATxÚí[{lGþvo÷v÷^ñù|¾ØNÎöÙŽ]Ç&U¨Mj7 ÔTý£P}„´QТ (›Ò(‰@¢éCB B©M›6qÇmš„RZêG'1>¿Îw·÷¾[þ†ÝÛÛõÝ¹Ž #æfvgwæû~óÍoË(Š¢( > KØ¥®Àÿ{øˆ€%\¹âñx<Î*Êéý8ù|aR r€Q2J0ÿ^"mÆ7—ì-d9!hý@=~wX©¬¸{eÐlàšÚADAd˜ÅÛ(0åŽÇŽà_K(Ê ›ZÓ"àC5|ÿ.Ï0K×}H&S©dRQÒét:™¦§gf¦§¡ÐÐ¥A™øíÄ+@ÛòÖ 7°@ǽíŸï¼`Y–eÙÅkGÙüÆõ;þ×UŠòùÙϦ¾8A69 ärŠ’Ëúç©i«?Õ^izîûô×óï+Ì'¹,k±°,`·K’Ó H’$I055551ü½ÿﯿ?䎀EØü\÷Ÿè¤œ”“rןˆ²Ç€ì/2/¦Ÿ&ÖÎ0 SxšÖÿ3o½b|GþU†)ÌQ¯Ùl6›Í33¡Ðä$píÚØØ•+@eeeeU°öÖu[××öívŸdþä~IþÃíÀTl*6ºþþaÙ¨W hãûóKæ—˜ËÞô×´Àë É ! Çq'ñ80::::28v»Ó ´47¯YåüS ’ÿÏÀ«•GC/ßLˆâø?®ó  b3 ÑSbF†¶\1 НÍ׿Ñÿ<ÏóÈr<’ž138v»ËÔŒ,­½McŸ¯Þyt㑟Êä`0¸ðDÌà 5—#"TàõD˜7¦/HQÊžþã8ŽãyÀbaYŽÆÇ'&ÆÆ`·“Øív»Ýn éá–5}xí£¸€™ÜLnzzመ—ééІùùF}Á8]N0Þ8•ÿÏb!ƒ²ÅÂq, ¤Óét&är¹\.Øl’d·6›Íæp±¢²ð¯­ßê#ƒ¯ýé•N MESÑOļ$ÈXçó½šükÆå¦RÈÎÂ;óå)ÿŸ:4Ó1Ábá8Ò#,ê~‚ ¢H’ H`±0 ˾߰ï"P1\‘]öGàÔûB½½þyLÄ %(P=!fDAX ÅÒ¦µ„hëÈ0*à,Ë0 ðæ›o½ÕפR©T*X,<Ïó€Ýn³Ùí€Óér9@ ±imÀœï87ù—[€Ëý£Õ#ÿPÿM+­õþòÝÖè…þ¼4z!2¦Ò‚Þýœ+môŽS{Ç©^ð¬ÅÄb²‹oéòeàÂ… .^TÝÚÀµ&¥ñ8p~ú/_9û½ù´`Þ˜k&Ms•œ?ét&“É@r9 »ž"mŠHV‚,-ù’¤yH&“Édxï½÷Þ{ÿ} ¢¢¢ÂíR×R©Àع±s×Þ.¿% A´ùÿÌäCQŒ-“z5æ\‡ggc1àߨ»÷'?‡ÃnžzêС‡DQA}2¼ áµxIb@DQ—‹L,)Á™ ‰ãñx<"‘H$&&‚Á`¨ÙYûXm0pmð 5ëk³¥£¹`ó€Ò¯ëÿëUÚØA ‡ÃaYöïâ‰Ã‡;îøÌgî¸hmýØÇ:;Ç?xðùçD"‘H& -Þ,¦DÐùÕjµZ­Dûm6Àår¹\.Àçóù–/š›››››ÚÚººÚZ`åHÝåCÀµƒ×ú¯)͘ Ó@–#æ¦Êˆ„b‡Ã±þÙg›nêêÚ°hkkk[µ ðû›š ºº®®¾8pàС^ D¤R¥QN̲êãv»ÝÎD½áß/Å-ÞL~Ì€6–žÙYÕâŸy¸ùæîîööÕ«[[ññ©©ÙYÀé$–ZYY[»b IË–y½ù=b>DPǵðºêÖ2 ‘û,ñj¥]Œ€â¸,…¯)ÖeG"² <öÑøîî-[º»ŽŽŽŽÖV`z:’eµ<žZ¼“ü±±`0<§Ón\.›Mh4K& n¾yýz`õêÎÎÎN §çûßÏ'¢Ô1À¬,‘­µtµ!äGß¿ÿÀgž6mÚ²åÖ[ÎNøXLë&RKW×Z¾ÅB—H}<·Ûá¶nÝ´©£ðû—/w»cÇúû/^l¶Š ¯¨®®©Y±‚ôˆÃ‡Í‰(€%’ 3 õM§3™løêWwïþá-[n»móf`íÚ5kÚÛ™2ÁbYx­…ë§ñÛoÿõ¯##ꢙ×KÈår9EÞzëwFF€ñqÒC._¾refFí 55uu+W>¸k×O¨ Òz\o *{&¬MaEÔž¡Þp™èx½UUn70; …BªõPí¦ÀéËÓ·d³™L.\½úφB€ÕJzDKK àóOE…Ýœ=KˆÉfÓél²¸&I‚ÀóÏ“rÑh$7ÜÐÖÖØHˆµXÌfí´¶Åq)5,ˆi‰0 ¨Å>ýôSOíÙ\º444< ô÷÷õ9d2(z_<žL¦ÓêóGFFG§§ÉÉééhh4M$Y&q4*ËÉ$‰´(â—-³ÛEhiil¬®Þ|³¯¯¯  û÷?úèÎ幡ú1`‰¼ ã bä'‚`µ>úï<ð088008¼ñÆÑ£Ç«§óçß}÷òeàƒ††ÆÇ‰tLMCCÁ jÑë×wvÖ×€ßïõ³³DÊD‘\w8ðÍÍ ÕÕÀ™3§OàEQQ€}ûöî½ÿ~u)Bïç—ê†Rã\„`&Aù{¶êrpþ ¬%‚ç >d2Éd4 œ}êÔÉ“€ÕJ,~ß¾½{·m+¾ØXö_ï™n–/Š´G<òÈŽ@*•LF"À»ïž?îÐÒB,×é”$AÐaµràóUU¹\êâpØl‚44¬\éñ§N8qâ^Q€oû›ß4¾Üù€~j¹¤TàfD¥é‘GöíÛ¾ˆÇc±ÙYàüù³gÏœ†¯p8$IµC§Ïolôû«ª€ÞÞÞÞÞ^²Ñ’Í?¼gÏ}÷Í|©î§Ù†ÏüÂHP~EŒˆ0œ¦éS2I–‘…¤¿þõݻロ¬ÿOOgÎô÷÷÷€=rÒM€x\–É"9PxüxoïÉ“ä‰ðÐC_þò]w‘A>VߓͷØ|Ì2^ï•iqY´1ÀèEfçç©ùt£#“!§R©T*™ ²óDR`×®;3 Ó§‰÷44TU ÄâßxãØ±'€ÑÑ«WGG;¶mÛº•œz À“çÒ=_ú~jå¿^ÐÇ‘±ÄlLÐzEF¤ÅeÑfÂÆTœ£4Ï[­dfJE]ºÈf3™tÈfIÏp»IÏ8tèÀ¯}M}*ÁÒUR‹…xEðùN !?À‚JP¹”\ï` ¼6¯#)—%õ‚J)9×ó㌅[Å>^2;£j¯Ci­ý¯“ ½at|Q›.|º±ýiƒJ„þý;ŒŸWÚ >£üù®ý…’{ñ§Íy6;´[Ø@ócês5ÔìûóO—òOm—š¯}þÜÀÂd~Q:=E H$‰DBQ¢Ñh4-¥ë÷æ& Ò×ÿæ– =ÐÅï3î4ŸâDæ'ʼn0• Ê$è„Ãáp8 °_`ïbvÐê=up£R'\ù¢¤–)ô:h“Ìòk\ìz©¡ÐÀ ïзSQØ]ìì@–eY©§¯‰û«(f__š@?X SuY–eYœ¿tz–áŸ^b†<@£§¡2à¥@/¶§³t?È 3ƒ àþ›û»î²Oþ–|ùÒÆnWq¤„èƒ)´¸Ð¶|¶éƒÖiàÕͯ]}å%@¾Qþ•|Èùru9·ÑÀ6?ï`±Ë•˜3ÉÄ×n—ßÅ£«¿²¦°Nê÷ÆÀÿç9Å*LÇ€x<Çÿý¥|\ítq‹JÕÿKEršš.i8‡Ã¡æÓï‘AÁ\JþP›zAúÕD3¿ú=PÁ¥®®mÑ5&Žã¸â’\ö—ò…… ÿ×Ò>(’IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/abcard-anyone.png0000644000000000000000000000075112247657030020520 0ustar rootroot‰PNG  IHDRóÿasRGB®ÎébKGDj’Ù+YÒ} pHYs''”iQtIMEÚ ; ó¢ÀiIDAT8ËÕ’=KA…Ÿ+o%È•¤°‹’BÛ@ÁDb.­@-µ²KH:-‹ MªüJ$UŠ‚U¬ü¼WÝÙ™“bß‹_8°ÌÌYfæì™…Ç¶ÆÆÎþ¨ÿõ'•Y4çÆzºˆ’€ Ž ^cQû/?š•™È.æÐÛ[155ÈôLëºIÝPº9R ª”‚ìâã§ $ØûwÎÚê/&ß "„î³Â’¨Ì‚ì‡G—lmþåíìæðíÏ1ív¦Óv:ë³ü~I]¼ÐÜXÿÍôL‹Ñ±ç˜¯_4‘D"„jo 0 *Kåì_02úŒì…ò÷Ý3ÎÛùÖô‹Ž³ø®ÜÑ@K+¯°¬¢¼`r¨ïžr.q2ÑcuƒìâÃÊ6æ%·–EÎ…aöRhÝ;–‚*™Êh°°ôwÝ•ÕjK n¯HTWW~öùë^ó!ßPâ”§oÿÂ×(ÿª¹oIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-ogg.png0000644000000000000000000000463612247657030022025 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW )IDATxÚí›{pTÕÇ¿÷înÂ&’ »‘G¢X"  ZELÑ"ЊëÈ0ÎØ–XNÛ¡ÇB*OGìHPAD„¶<ÔSy¶ Jˆ yÇfw³{ïÞçéÇ3—lØ Ä5Ë~ÿ¹sîîÞ{Îïs~¿ß9w—#„BVÄ»÷»ÌÁîÀ÷UZÚ¬YëÖuôaîÿ2ïvÇ•F_rÚ2­öÝÀo^z:û02Å6zàìþ÷zLË—/[–—BǦý¼Se¨^sþæ|à™’•›ÞÿȯX¼gò{„üâµé?37x B€ªªª®ååuun7`2ñ<Nj٠¤(C2“ ›)eì@ ذ¥è§¼À‡“¶Å¹ ÉÉËhíy!“4MÓtPUÕ4@–EÓAðùd¨­miñzAe˜¶dj^V$¿÷­9G’,«*z~9B¨á…ž0ÚŠ¢ª@cck« KddD`#CÉO…[Š®–È=ßï ªš¦i€ªRC«ª?Ã3T¸q£©Éë22Òר²½³>;Tš 49Zë¼îžó„@sÀ­§ nï(Jàry<² d§ÿ>Õ lßµoõÙ²žëw ÀB ]&ÇQQf3ǺÎrÒÐÐÚêõ)WïHz8°ðDVÙFÀíñʾÈ !À? 7Žm(il.l:g½Ü\Oª,®Ö(ú H}>E\.¯W’ût[ÑàÝÀÖµ{¯íœrXÈqd6o€½Íë'.˜ Øþ9pAtpM.¬RÌfŽ#Äø]S“Ë%Š@rNÒ¼%À‡«]ºü2àll|ú½ó„àë…§]Z ¤§ÙÇ%Æ;.®ž7o'FªÏ×´ÔŸL&€z‚(Ê2àtÒ…ê))És?ýïí—>{ÿÞõ;„´ÏÄF~FþÊ6dg6›Í<Ïqo¿õúˆ¹ko}ëXç+@K‹ÃáttÛ´¶ºÝ¢ÄŸí_Òß”äü·°æMàÝ㟞<×Úýž2t]× 1r@ %ZãS¬<ÇmÚ–Ÿ<û qs}õÍ5€( ‚$!©¹™‚°ÿÒ¾aèŸ7ö<:XµsËÖ£W iq;eÁóý„Ì£ˆ»Õ¤g3jÍq‹þ2³dÌ1BöüîèáÒ4 amRvÒ€¦ÑG ȰC#¥} ” (ý þ*ðÑævok,ÑæOLŸâ®ñþJŒ0®_YyøðÊ•?ÚèªVþáù5¹6àÉ&}8ük eq}A]=àr9n·áQ’Ds‹µ.ö'q*øt²o€ xj…ç|‘À˜Ÿ§/\ œ8±cÇ‹/Þùýï[`â8Ž8ní¶åi3F“Œ¿‘–HHዚNUU›«r+]Æ÷cr¢+"7“ …Ã[޼9}ðÐð²’ºð0ï¾à¯s²SÒûqÜŒ9ÙŸ¤½ÍŠ<æw.¶ë÷»ïCP°d…YaAV@2ØN¸·)d¨*ݱö6… M {@Pö€ + ÈRUM ‡  *ìA–¦éz@¥ªªAAT8Y½À=ÿCæë¯*¯56R|ðbQU1ðåþ #«šockW·fÍû9Þe€\®F©Gb#O’õ@”fÙg> $,ìWl-Ò=Ó¿/ðèÌñö À”¼qsÒÆ÷é­¸î~GìÈßO7]=NÈïîš}ò·€âÐ_× AµÉ‰Y@ü’x5ö ЧOŸ> Àó&“ÉDK@’dYQhí¦,Ç#´†SÏßÚæ{OBqÛHOà.ð, 9yèP›ÍÑÜ\[[SsçŽ÷Zªªé:Y±± ô` påZÕú– 3:sÒÈ6 >¾_¿˜Àç£ëtEQ]§rëºQ¿ÏJYõ²ªjšªv,/×4Zt+˲̪ ¥¹¬àÐPV¶oߊ€ÉDAó<Ïó¼Ñæ¾S°ÜuRUºÞÐ4ZµuϾKgÖù7ozV¼:!÷á:Àáðxäï árf³Ùl ˜Š–ÒªU¥>Àf0{ÁB–e™œeIºµÍ󴤊™´+©AÃà·?ÂÚf³ÙLËx ¨¡ ¡†gØy`盿¹¸˜øÂ„ÆQÙ@YY•³Y¢ër€ˆçŽ£3Ïhì1²QÛÙ¾ÂíÖ-nõÿß’(Š¢(§ÜfãmþÞ €ÍtÃû‰MŸ¯oDÑWÀb¶ÏÈ25(›¡g*}™Žy‚®ÓÛP±zvþN¥ë`̨葉€$IÕ’dšMÖf×gmÖŸöG¤ûAtX†ÒÂ:ÖÙqák3ëFMª|××Önìöäd«èÛ—‚‹"}‚ik£GÇëEÀëŸæY6BÎÝžL:ää€yÃs_–ÚqÂ0w:¾öÇîßêuð£ý´ uZŸQC€ò¥Õÿv,ÊŽ]Éÿö_@šÏþÄà\ ))>>!p:=I¼^QT#´°˜¯ªí‡ÇîéŸ3Œ‰BÛ²LCŒ|F˜âN&¬KO8˜ûëÉk8Žïf<]µCWp(öšQ¬ýEÑ9¡Ê l_þqÛ¥§_¾2Q; Ä,ŠÕb\@Ôª¨‘ŸÓå§ÅbäÖE¡¡‡•ʲ$É2 I’$I€V&¿'»ŸàÛ%> ÈŽ)¸<—73"à Lš=zîÇ(æwvþößë~.C™ëùÚ€ÿç¬]qæÆWpö¥ýêbÿL¹âm¨®Ok¸ä~pòŒð-”êúƒá Z¦ðW€¸RkyÔ;@jV¢b½Œÿ8}|â³@VuFBR6`Ÿ:(!ÎÜqyéß”t;C¯sï’ð]ïXR À?ÆйþÉ×?ùì°_H`†öoß)=½/è¶0i§Î“?€ö×éSgn¿ñ þ¬ÛtU².àbÈ®êÿ;¿pŽ÷a¹¬IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tb-mail-addressbook-flat-16x16.png0000644000000000000000000000161012247657030023342 0ustar rootroot‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs''”iQtIME×+I63*IDAT8Ëu“Ík\eÅÏ{ï;wf2“L&“¤™è0I(¥jg!ÅþR!º)vãÆ?@WRJvþ.K"¥´AmIp@Gb¨qÒ&“Ìt&ÉÌܹ÷¾_‹” Ïæ¬Îï‡sþG÷n[ư<ˆæcSŒ!ïSbgÃ^:ãœ÷WWW5ð‡¾ûl%Ÿäü:`]UÆ®g§f*ù7çœÒô”Å“ù??Ý™MÏžt»Ýu_ë¬:ðWÿóÔLõVÒq*¹ò4ÏNN"[*Á&œÂ!˜3ŽÃmänPc÷P7«kkk-N†®9™ÄÇ o/§¹Íƒä)èèÒ€DG(Õ*ø{kµ+7y£Ñx@Ëþd¥~Éó>3:›´$LˆAóLj2{ ²P ŽÁUˆþËkžR»ï²jµºÉ•ÔÛfa·?5VÈÂLÔ fÞ‚âYhÛbi(bp=¤Nž¡’ÈGêõú-ÏóšB(2ûa0\–Q:’ðù4”Ò@0E°Øƒ <ð8FÆÖH´Ÿ±ÊòM^,ßåµne´=±·£•^ ½’8DòGHÊL°b– Ad  a,©±õã·4¸M¿|yç½(¦ÇåJ“y1áüy†@D C!ľ‹~j5Ú‘ý!…M!B?@!Ÿy<Ñk˜Éœ½èÜËܸ÷ðdvO_ö¡…„ê•K˜øÜu, F!‚ÁþÙÉ¢mÑM$ÒMwè.©Î¯AKßõúF^ x~Œ`$á ÀNYÕ €òIÆ·ŸÿÞb‘`Ðw1$qÀ‡É–€ì<œ¥%¤Ës˜M[Pͯë)Ôn2ÁÜVÁN9Ƚy™ÅLÌ_Fb¬ˆDÆ¢TwêhSŠ ÷+¹Ýõ €jÏ+ï_¿ûŵTÆΠ¼!z{Çòàû¶ßùó9ŒÞ"ƒ§LÇÛwîÿæÿgZ™ßÄ[*¡m+ïä‰v{Û¤å>ÚJ¡ýÑý†~}öÿ1ÑÙÚ™;e~IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-stock_certificate.png0000644000000000000000000000547712247657030022441 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW ÊIDATxÚí\mlTU~îÏÎW§3ÓÎLK?°mJª]*Aô‡‚Œ&ÆÄcü`£ˆ¤Š¢Q7ººúgÑ•l6bÙPÐMÜ&&FüAÖ`Û`Xé–*Ðj„δóÝvf:wfîܳ?&¯—árÛÒ:û$ä¦÷œûžsž÷=ï{>ÞcŒ1ư„/u~ïXR@‰±¤€cI%†¶ðÅþûåó‡c§ÿ0ðÞ÷< ½#½+½Uên.^ðæ_æÿ´ÿ²ò›ÿÜU·ñ¯wïä8*/RÀ÷ÿ>mìø£ÿQÿã~€ã8N®>wÌ—œÅÖ.ÛÂcOþã_ï~¸ëí¸û’zE `væb&ùï3gΜ9sˆD¢ÑHÈd2™L0 ƒ°ÛËËív ‹Åb1 ›Ål0™ÊÊL&Àb±X,–âr‹Ål¶X“Éd2™€h4‹F\.—Ëå›ÍjµÙN¯×选‰‰‰‰ @’$I’€òòòòòr€ç9ŽçÉÉ©©ÉI¹ß@.'йœ\®Ñð¼F8‡ÃB:-@<Çã€F£Ñh4€Ëåtº\@2™L&“@29=L:N§ÓGE…ÃLMÅãSS@*•J¥R€^¯×ëõò÷------ż** D<5@˜žžžžž–Ÿ…ˆÇ‰x\~‚¡g¡¥Æb±˜²%G£Ñh4ªÜï`0 ‹ß‹bþßøx 0>^\Nà÷ùýÅí+•ˆ§P(…d(AUdñÔõë;:Ö¯l6›ÍfSûZ í~kù4ƒzz¾þº§GæMm£«¨úÐh4F@Aä©¿ØZhùdôÞh4ŒFu9ª3Àét:NÀçóù|>åõööõ}ó púôÀ@ÿ üZA{ûÊ•«Vk×ÞqǺuò{žçyžªªÜîª*uCPÉ£åõœ]Áår¹\.`ttttt´Xàl@ëøþsÿþ®®¼¥ÂBP;;ÔÔÔÔ,[<øà<ôÐÜåÄ›T@ëm¬DøLA§Ÿîì|æ™Ùl¡0ß;~â­®®¶¶®N¹þ¬÷j],D-T;ôÅ5¨*€|íxgÚ±k¨…’?ÛÀ« *ôe…3Aé©$o¾Ÿ×š|ZUVVVVV^Å*ˆ‰D"‘Èüí®5‹oùTN¼y½׫\Þc!›Íf³YàƒöíÛ³§x?1_ ÓÇíÛŸzjÇùï…Ç]™|)ctt£Æ—êFŒ|ËÎTDÄóÏïØñâ‹ÊòKEÔ¶+ëAõJ’|ÙÂúÖù‡Ú¸»xñ…“¤ÁÁ¶6Æ$ixø¾û“¤þ~‡1ÆB¡®®Ù'ìPëUUUUWuD‡Ãáp¸0ÌܲöïïîÞ·1ºWP¢c¶-ðÖ­[¶lÛ–?¹ukggéïóû_¤lvhÈå**V­tºpxxา²öv€±`ðäI@ëê6m ‡4špøàA€ã<ž—^Rn‡ uÁbÀâÇ @.WVVSèt©”(€$åÍÆÇwîÌSh±M&sþ< I&Sm-‘;“Vþ?¨)@UäL}áçŸ}¾h”±‹‰‰k'鑱D¢·à8Îj³yõj€±x¼§$)&%Šá0d2¡ IvûÊ•c‘ÈÁƒêíOn·Ûív«×W݈‘/SS€$å·±X<žJ‹Éd0¨wà—_üþXŒ±>ûìÄ ÆÂ቉dRVàéÓçÎ1æóƒ““Œõ÷ÿø£ßÏX2™Je2³Q°(NNÊ#ƒɾ>0/wg˘ÕÚÒ0 €Nw¥õü\y›õ>@ ŒIc€Á Óiµy˜ÍÝÝGŽ 2f±˜Lz=ÐÚzà n705•HÐØ¸l™Ó ¬[·zuc#püøÀÀ… ÀÚµ«V-_ŒŒ\¼‰Äôt: 47×Õ¹\@Oω##€(ær’Ę×ërY­€Éd4æ³ìv“ ðz++m6Žãùææ/¾´Ú³g7l²Ù††-[ò¾=8Ž1$³¹© È媪6l$ipðí·£GEñÐ! £cf  ãû9+€‚ Å€D"‘H$”i4 ÏsœÇãtZ­Œ¥Rù ôè£÷ÜÓÖV\ßç …&'›ÍlÖj»ÝbÑ通—kùr¹Þm·ÝtSuuñ÷7®Ysi=BþûrC68Žã¬ÖÛogL«?|`L¯¯¨ÈÝÍ›A¸páÈ|ÿ}`x8lhž}¶»»§ؽû•W¬VÆÖ¯_³¦©©¸ÙÆÕ ìñx<022222U8v»ÉÄq»víÞ=—uôÕBiã'«¾¾« ÐháìÙ| 8v àùóçß}8|ø‡n¹س§··³ˆD¦§ÍfÐë3`Û¶7ßüôSàå—üÎ;ëìÜ´éÖ[eŠÉp‰·«Vå×àÙQúåg1x¾¬,¿¾ko8Žžn÷sÏ'N|õc@,vî\Þ5 0==5u©xçzz€Ï??zthˆ±?~ë­‡–y @(/·Ù®”E¢fºž½^pÿý­­À'Ÿ|ùåÀÍæ±úú>üpûvÀëu¹l6`hè§ŸùùÑG‡< ¸Ý&S*ÔÕiµZí<ijÙd2›D"™¼R ¸^ÐÖÖÔäñpœ(Šb.ǘ ¤ÓÙ,P]æTïÆÝnùIèííëëíeÌl6›ÍfuÏ¡êT”Îp®w¼úêOttmmÍÍÏÌ¿#ž(…ñªg@*%—.§ò;bÒðõ«’Í›ï½÷曋-\ ùCƈ'rÝù=‡òw¿* ¯1¹járŠrOúî»S§¨–Ü æ{æÌVÞ|µüø·ß^¸ ¾ª£öÈQ6v!ÏùäŽÓŠ¢(Š"ctêY(¨¾¾®®¾õùFGå»aŠ n·Çãvcccccc@:-é4`µÚlV+àt:ùÔF¿ßç“/jìv»Ýn—ÓÛI>M]J§v(™ÒZ*+]®ÊJ@«Í;Êv¦~ÓMT&“Íf2ò âõz½^¯œvNY ”~^]]]]]-§ÅÓ“reé{â ”Ê)¢ðJR>%u¹\.Æ´´Áú51Ƈø¤ vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/smalltoolbarbtn_span_bg.png0000644000000000000000000001146012247657030022704 0ustar rootroot‰PNG  IHDRÈF‰âÛ6;iCCPICC Profilex…”KhÔP†ÿŒ)‚´‚¨µ”àB‹´%>ЊPÛiµÖ‘qûÐ"È4sgM31™ˆHAÜùZŠˆ‹*âBºPp¥ ‘BëkQq¥"ˆB7RÆÿ&íL*V/$ùrÎÏë†USŽcE4`ØÎ»É®¨vèð€¶xU¨A5¸R†ç´'û}¦V>ç¯é·P¤e²IÆŠõ˜ø´mõýKbïëžöúžùúyo5.ŠFëŠlÀ[%¼Wòɼ“§æˆdc(•&;äF·'ÙA¾A^š ñ`ˆÓÂ3€ª6jr†ã2Nd¹¥hdeÌQ²n§M›<%íiϦ†ýF~ÈYÐÆ•­k€E/+¶½ ¬Z_±5Ô+û±-ÛϤ?¥vÜËlÙì‡Sª£¬éC©ôs=°ø0sµTúu«Tš¹Í¬ã™eÜ¢¯eaÊ+ ¨7ØÍøÉ9Zˆƒž|U p“sì_Ä.×?ˉ g"çÙnpåÅ)ÎèÈ9§]3;”×6ëúv­G+´nÛhnÔR–¥ù.Os…'Ü¢H7cØ*pÎþZÆ{µ°{òÉþ"ç„·{–•‘tª“³D3Ûú’»Éä{sO7¹×TÆÝÓ°²ÑÌw÷é³­8ÏEj"uö`ü™ñÕÉGå<$xŃ2¦o?–Ú— ×Óž<ž‹IM-÷¶êáIV¬3CñY~í’2ï:jî8–ÿͳ¶Ès†6ï64$Ñ…(šàÀEzL*LZ¥_ÐjÂÃñ¿*-$Ê»,*ºð™{>û{N ÀÝ2~¢qŒ4–#hú;ý›þF¿©ßÑ¿^©/4T<#îQÓ¿üqefYŒÔ(ãËš‚ø«m§×B–Öa^AO^Yß®.c_©/{4™C\ŒO‡º¡LMd<Ùµì¾H¶ø&ü|sÙšµ/Î>©«äz£Ž™¬~q6\ kÿ³«`Ò²«ðä.FZ ñ¤"ÂLÆ5’~‚Xœ¡·@ØËHÝæ£à¨`:0ȪöÖ&Ð…ÒŽ ¦c@q€ÕæV^ ïáÊ9‘cÊ¥ºû<æAžt£!E.‚ßÙò´5âã…ˆ³«ë»R[MÇe0VÖ@]®c@áÁØ«˜|a,‘à›xæ~=smÍêâ¡ ͇¸Ú$WÞ¿¹¡yI¾òFØuã{$=å óç±wb%â}nþ1ô$â×Ä<ÑßVܦvô•3'kJ¾ ¬Ôö™uIîQž8™¯ßƒ‚i°ây[¬rò’+n4µ„ºÂx_K8DŠ2$yöN¬Tót (uÿØYëÛW>‚ûkû̺¸»Zê‹«çKÙbé‚uâs3y˜X>‡éÝñÎ#žEðâ¿F_÷õ5~ºÀf<®òÍ „î òE³Á­HºweÂJx‰äìX‰>óì–sШÌžÚ-ßq/ö×ö5êš?ãùXi¼ërimMc¹èED‡¡z• n¶îÂ&Ü]XD_t¦ŽV\ /ñdh;×ᬙŠï"”Óã{R»oµ¸³Þ‰gˆîì×-6ÍÛøm‹‡ÝlT¯¯comÌûãlT¯®V†>vßj1á·X˜Z·{~wàÏî/ÜSþì~„;_,Ê=!Ó7îÓ3׆C´{ÌÏ a‡&öÜ|Ь¤kGÓ ×¶ÎäâèX­Ìò„"ZÕÎ+*[qÇ_ŒÌ¾¨íèv/Ú1gk“v–™òÚÑíºfpɇ±W±¼§f';'rŒBE~³¾›õŸÁÞƒ…LŒ&5ÁÿÌÈú(+9}l ±Uj ÷ÙŒ­ŒÞ÷]É·{ŒU¶Xî?e;A@eÒ©¹ŸPå(pkØ;±TAN]EÒ}á"‹R¡”‰â m‰§à2ÕûITŽç`U”4E_⢬)©œ0—X ,X±“ x«n {+/âî-ª$ŽN© aD¾Št«Ø;±tA9ª¡uÈ^@Ñf=‹>E•„ëúZ#—Ô™ìzm)ÕÕu—_ÚBÊú ¹C<Ë3ˆˆR"zTÊ|l(RÙŸËÿ¦XI$O6åaìXÌÄòséF÷I‹ì…”‡k|ÁÅÖ¹ÉÏø˜©°Hl×=(¯ª‹ 9Œbx¦¾žÒEƒ²hTXökèIÆ!qPd‚Bˆd>Ž-„¸†EQùe°’ÖU"¢&/[´kTÇk7©e3%6É’Ž´WY¬IÀ#ýÌ@]VW u["Õ×ÃÊ $|’.kO]iþ v0YÉè¨tL=Û‰½ ëXÆÛLëŠY³‹¯@ƒô¬ð"çó¥ýuqžØV\ )WÌñ%oUµ£É»mµúØ;±tæ”7ý¬ÙÖš>“„“2Ô±:3Ïd´íè>ÄÓ˜pÓϯִ‘F®ãdN)Ë(èÛÑí숕c{K,‘¬ÍY8-ˆÇXöìÄò2íÂ'¼¾J_wÔöëBŸ½q±æ´Å¢ëº¸¿œ;ŽhJ㑟։èX^þ˜JäË>µ† ¾6†“3Ú‘¡Lk$:×µ†B}­T7<ê¼®¦L«‹¦•"z+-±8t‚ÑL¹ûNïXšzBžÇï{ö­:3ÏŽEÍ{'Ï£þÌ‹¥y ŽÙ{H\’ûŒúÖ6Öä'éàžßø3:ðzÿ?ã@ßU®uàÇÏŸ?_þúÏ_kÑwÔÝ'ïÀß¿¿Ü‚íÉò]ÞrâŸ`ûû¿/Üwž¹ésõ»#sÏûõÛÊòq´l ñÏa¥Íf®ú 1X¾kTÏÃêÆ¸!;Ò¨YÈXÎ>S›ÙÏü9«XÈ‚ñO P—ã‘_~ac_ŠkJÕã‘êcÀZcÁ‚ñ$6`_(i¬ñk ¹mCâ%ùóë"u%µ†Üfjs#S±ƒŸu/vbÙä'±¾D˜ï Ð×yÔ‰vbÕèI³#ÇQŒ£þ-î=ý®»pZ\wâïÄjñ ú|‘ó™Çžcdž÷¼*bŽ{±FÞ8ç%#¯ˆ˜Ãd/–$3_ž÷{Ž=ÀaÞs=‚"Ó ÷¿x V›®Kfâ{ì¾ß.}f±ìVÀÝʬbgvНÿ?%q,¹ž²ÆÈU–¶‡×E¼]Æ\\OÉ_”Åa!JúPF×/¤Ÿê?б0žW±3¶Xoo²ŠdDº…'Š™E,[0`bág±sÁ9G‚V àÐá+ÌRE²w€¢t ~˜^P±Kð* ©;/ø ©‚¼ƒïw;_ßñCzlu„.Ùjø°?ƒ%áIÞ‚Aóò*á´þ™.µn|äéY<Ý5uQ l¹Âƒ ˵ÆI=ú¬ºˆm͉;áI­Ú<_ÒÍã×ó…ÎÉ/òÂù‹Ðñi„3‚NŠ#\øúI¤]¨íAÌÜ4ék~H÷~Õ„XÅuůhækGnª25&#¬ˆ˜aa¦PWã¯åm)ù~¬yÌõRîV鉫aW9'{òÕ9L¤6ŠÙñº(xmÛø ]XÇ€™©è¤gûJdã«EÛ#¡SÍÏFXDz¶@›u„mý»÷ABˆ5„eÛp~l]D³sm…8®ÍñðT³ì…¹ºÖ£úªÒËÿq‰¹¼•×*·'¸ZÏbá·"cíÀfÒ —Ñaq³ÀXFòJéÙ_pm–åïR_t3ìY!&îuWÔ¶‹ï÷;_ÊÛ¼òQ$´Ø½ºé¡eäö*㪰ì摤ÖNr2¸QE?Ôkž'‡¥Â4k¶J)ò”œ²±lÓÊ‚šSYP=².¢6²+¯Ì© Í(N|Ëó…Êšé'wç–îüaÈ[,y rê†ÕÄ[eP¶¶ÜCY]lÂõ']®=ucBª}¬Øa=`©Ç¡gq€€1a!÷W«‹Øi¦uíì0ôtÑl”î…“¯¨ldÍUc]}¾”-VM¬pvòçË\—i¥ÄJrÝ–i0㼤/hÞ›Fï•ì)çÈ׋ï逗|öÖE˜À§qÇ+áíá)±®á‰Š‰¯sy<î)8åÑX»Œ®AçжõYŸ«ÎÙ÷]å s¬¢xq{ùî䩱öòD'(G\ ooéQD¿ã·zL¿2@ámbkXtË$Ì6.±9ŠM1ôòøÆ[v2G"f¡ÍDsÅÍñºGÚ>vÜYaïªÍòÄü(_¯ÿç°®ïk\ YÞ¡¢9¶O„¬aq  ÌôX4KÁžù%\;ê9I” @%ì¬+10yÍ”ÿü—ulx9ïò5<}µÐ®Õ~1Ïj‹%ê{q®çß³Þg®íŠ#2»@ܾå‡úo\š—#E½……+.>^PAíKrkcg7ÅW„ÆÀšä₦»˜äêþ¦jŒMÒ—3×9ÙÆ’KA*[uDô«ó©™Ô8lcIR+Ú ünç ½ 5uiŒ“º4aB؉eÓµ±áéz¬”Qmó\ä¨t- 45ºJ©&³cÒŽ<›ßîpŒ”Ü”QéZdh%»‹X¼ ÏÉw;ê-¨›Î† çî{°Õc ËXç𹔀ò›9ISdz'Ýqä ²«„q~ÂÔ>NéÛkŽKó²iÌ¢…pj$†÷'é§Zx?{î?ÁöìGø®ïTî?Ávª}wð³wàÿ™ôŽ4Ìý¼ÅIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-package_wordprocessing.png0000644000000000000000000000661212247657030023467 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW IDATxÚí[[lÕþffgwfgw½ë¬½¾$vlïúVS‡šbJ!Um$„"ZZ*PQ•‡>TŠÊ‘¨*PHÕR*U•ZÑ„*„Z!n¥RcBESJ$•Hlol'!ÄëkÖ»™½ÍL§sÙ3{±× ü’å9÷s¾ÿü—󟳜a†aà ºNÄ_ï |Þé \gòÔÛ@UUUå ã?['^~ûu õÜ¢”òÆšQ2RöºDµ±\%µ×Èv¾”÷¬¯ÿ<ÜIÛŒ­ßÞÖ lOm÷ô >É'ù$Ž»`³ˆ«×¼õÖ¿Ä£9úc 8"1´"öi{Ž»~ qR>_(äó†Q,‹ù<°¼¼²²¼ ̭Οõ©ñ…¿,ÛƆx`äûÃ÷ÝðÀó<Ïó×nu3àϡކqß•{ ß[ [\tÝ0tpög¦ÉóÏܯ4]¹ž³Ü^¯<Ÿäò¼ ð< (² ²,˲ ,----,““ÿ8³èãà¡{žýúCw~uY—õÍgDÝ6@ûCéOŧÉnç8Ž«Úßt-m—»þ¼Ñüæêßï¤é“äæ1b (‡ØM…8YâÆ k»j,¨¼5ßšG¿EQ= ›UÕL†HÆÊ (J(´_h»Ø1ôë»Üû[à»ß¼uü÷À‚±8›J5žu{AN ¬ðZ~å•—^zí5 P(òy7Ð+³‘…E£--[¶cc·Þº{7`„Ç#Š€ ð¼Ç|òÉÂÂåË@GG{{g'P(£‰D"‘Ð÷ÓÄ/û¾ýï›Óã!à›_þFÏÞeÈð¾¹yã6¢n°ö?Í£;™ã€{îÙ·ïî»ÝÛ²l†µžÓH;ó­ã±Œ¶3ŸÎKˆQ‡ç‰[](º®ëºøý²¬(Ô‹¨$•Ý»J0~öè«Gú€}í÷Üyï´axÞ€7°~F¬K±õ|9`ì´ÙžãØ6£ëÍ¥–×´«'û—iš©M‡H„ P÷ðù|>IdÙç“e@8ŽçØLì\lŸ kM¯ÿ~êÕcÇÖ »I PAv@ qc ÂZ˜QAÖ´•!Ö9rœ 8Ïsœ Ç¿ûî;ï•Y(‚ Š¢(Šß¯(@0 @oOߎÞpräƒÅS_>š¸Øz!i]_Ýæíîª_Ö¡‚XÐ’åZ½šéé©©éi² b±Ö¾ÙÆ›UnÅŠòrë·¦iš®¥R©T*‘t©DÒšfª¤@ ôûÉyB€x<ïëzçûŒž'—O=üþc@¶=Ûý\½h6Ä”/•ã€ÁÁþþr@;Òý»Ü›²3ÀÌ­f[XL¢çƒ|>—Ëç\.—Ëå€\.Ÿ'ÿiš”S÷õôéÓ§ÏœFGGGGGs§æzÎí.pùƒù†Ñ¾³}gÇMµKBü º#é×ÔÔÔT2 ‹¦°`Xç¤Ý%ÀÎÄÚ•’•D‘¨˜ÞÞ¾¾žÀç“$IB!r°,‰dP QUU½zX[[[[[R©T hßßñ³ŽÛ€™ùÙ_Ì@;Úwvhµ£¹.ä–CŒ*IQ `1ŒêáJ^Û·a˜¬²3£±÷^¯×ëõšã‡B¡P(Äb±X,f©xAÿsÀį&&&Æü®¾qÖ¥‚X %áÜ™™drf(‹E« (—‚jû¸ò\ܨ©©©©© hoïèhk«¿ïJDæNG"ÍÍ@º”iIÿúÓ wÖÞWC¼ ë´(0ñx"Ñ×ç^¯\ḛ_*-•otØÌ=be/‘$I’e@¿QûŠ6\ÿ8 PAöà ~¶»¿n=Ùc6•ú7ûd"®•³„ã¯W½^Žsº µRCTP%Ý›´ŸTYÒƒRy ›X1 úÁ-Ÿy¹·V¹ßõÁßä¶€ƒ|ôQÓcõBlÆæ\ãx<$úyøðáÃO>iÕ³g“ÉÙYb› ;Äî«1Û;Ukí¸¸Ì³ÞåÃ8UùEÃPU@}>V?Ô_^^YI§I¬X:;ÛÛ[[Ëëë:™çkgX¡†®[ƒþþþþx¼–un—ÚhÃ*ˆ.̃‰Fý~­‚?¬ëE¯H§×Ö4 H§ççíÛ·nmi1CËË««™ ÐÜåýe2Ùl.GÂÊ’dJeÇ‘˜N2™Lž=k?ŸT[#`J@"ÁfàuSANB¿[ZE×ké/ôzI ¯× ;öþû³³ä*QžžÖV ©‰ô›Í’(æùóóó++$¼Ìq€$ñ¼,mmÑh0HhçÀÀÀ9ŸTZ!û»\6ÎaÜtø–-•%ÀIW®d2ù<à÷{½‚D"ŠÂqÀm·íØÑÖF¼ A u5 àyM+lvm-î¸c×®®.Åôx¬õL à8 ™œžN&«Ç¨œ;šJ@"Ñ(ø¤‚LV˜ùÑh­@H× …R ˜½tiy¼^¢¢D±X$;ßÙ¿× œ8ñᇥK’¦Á ßÏ[‚ìôƒ)ƒƒõ¯³º±¾FÀ–r?½¥EQX  “}ªiÄÄbMM^/0<ÜÙ‡=ÿü™3@&³¶¦(@<ÞÚ›ý?>5µ´Üÿí·wt--á0Þ:.UM”ÓÓ$FU(P/ÈÖõR ¨¤Â>*ˆ2"õû­ ŠŠBn¢$ <Iòùˆ—¢ë€¦åóÅ" i¹œaO<ñàƒñ8pàÀ3Ïœ> Œõ÷ŒGž<¹°ìÚ‡Ã@gg4*Šd –Ä9UÐààÐP% p»Ë®—MdÛ ²çAt°,“'¢B|¾þþ±1Àãin6ë—J©Ô©S@>?3sâ‰v‡=ð@O°wïcML/¼ðÈ###À 7twSà+ÙàϬ¦¦Ì{ »TŽªŠ"‘€ÁA¢Â*]Ín*X2ÀbD0(I¤q9®³³·ถ–›o&pøý–‰xZ[o¹UM¥Ã˜ŸŸ›vïN$ü~ “QUMvíêí•eÀçÅZœÉàiˆdhhhhpÐøê·p}Ñä<„‘…ê:]8ÙŸ‚ÀóäH–Ï_¹B–q劵QEºÎq$ ¬ëVàTµPÐ4àÒ¥¥¥Bèînm%ÊŒMÖˆ5´199995U.²ì÷Ë2H$,/‡êåâgSÀÈi ž~z|Ü0€ÙÙTJUIÞ{ïÙÿ×CwÝ5664:tä@ÜÒJndgg$"À{ösOæ7<<<<4äomÀ׃K5Z‡ rÚ§&éýûüÅižÝIu¦Í<û'lÖÏ=ßNõÇ›( åççÅÐF¨áhö¬èZ¯—ö~ja ëŽÙ™c½hµ^‰:×ñPAöôô49q‹¦®­¼ÃË{¬\îxµ¹9¡®\f? Vëå5Ú° r#ê®YApfu;Ü=íÞ=mm]ÎÖkÖË»j¯26J TAv¢þ¶)ì[9m|ç×*nëaã¼^òŠ‚J«Ÿëª‚œTØëTÖý¬t-;¾úºÊt±%dc¸l˜ö)¹ÓÔÔä$‘3æ²àó9u/-uOÄzüÅzà΄JÀ¯÷ö—M53€Ÿ¯.'®@9I:Òét:øïòû¸ÒÍÈv¹\"LÀLÝm=Иiëgç³g\­¼Vb?½tn û: ƒÿÿÿ ›Íf³«æU*yin¿¾te}L/ϳÙl6›‚ niJç~sž›ÛôlÙÞÜÛB¾v¯t®7Qàg¹sÜ,D>ŒŒ<dcÙG²÷Š¢(ŠbâHâ$WЂ@žeÓ÷öXÞØsôÒ‘×ìMÙç³ozLïÔ#l͹¾g‡×¶]½Ä­r‹ÜU ôãPWHF.~éáÑ ôœÌß°ÿ?Õ&Lm€ªªªª~úKyÕ”U¤ªêóB’D^SÓr f>ý=²Ïçóù||½Zw õ‚(àôÙ¶ÓX}^ˆ*\ºÃéC0ÊZ½ º)ÿ5–þ°zD{màIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-tgz.png0000644000000000000000000000512612247657030017547 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-font.png0000644000000000000000000001161712247657030017713 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWIDATxÚí[y\”Õúÿξ13ˆl"W!Dd©4Q0l¹-H^ïïWWË2Ë6K­®Ù¢¶˜¹d.™¶—fW£Rð*FŠ""²Ï Û,̰ ³¼÷·Óà˜¼¢Ôí>ÿœÏûÎ÷9Ï÷ÙÏ9 Š¢(ŠÂÿh„ˆ9Ò üÑé m æ.Šš4顇>ý”¢ÈóH3úßJ â‚úúúûívŠšóåËõ߯úý9(¸m¬LÄ_dý=tÖóŸÏå²Ù ÆH3~9¢~¦Ò²²gÇ>-0H“E_Åíaš ­è_dÝnÝ~x<ðEàFV\PìG@Vâ=áw«š4ÁµNU—º³ÙDQçKªÎ7Ê\Õ6õ& éGå]ªé@c{“°Q 4å)+U 0èØÃGW.§_xa뎵ÇOQT¥õý®·€ Ýã׬ΉªŸk^ Œ^èñ ðêÃóŸKžüÛ€üà‰Ü¦¼MÀÎ[wùí½Óû²{s€ÈȈˆðpÀÏO¡P(&“Íf2вÛ ««§§»hnniioÊ•ºªàÉÉg-ŽdRY²ÏÃÀ ë^ÊZ™ DD„‡‡…žž^^ ðù|> |>ÐÙÙÕÕÙ èfê›;§»Óv|²íîËË‹q ö¸¥®ž¢6žú¦ |x!ζ`±X,&p8§8QâU÷:°xò]©Ñ¯³Ã’?+HðŸ”ï¸Þ½RÁ¯ÝýÖëoïN,9µ˜»#ëƒ{¶õõ õõ€Z­R)•Q™ÆÏ”ëÛÞ–Ÿ_vìùf sü¬»3’þ `2™L&ƒ±â±çv.½Ÿ¢n-LžµðwØüíY@DDppP ÕjµZí¥ÏçÓ1Àh4;;I?ÆÞ8 à=Écó†¬üfxkÎ;×§…}'K =€;d( (õ?#wi"‹Åfs8@ͨ†fU#°¶iuõëÇÔ ”»“³‡n±±@,3AÕAŸŒy…¢(?êªèêêíí,‹å×€¦&µº¥˜½(sõí¦¡¯ó7ÀÇ›>ÛÿùfŠÊï:¶3ŸÜyçìÙ·ÍΔŒ>£LF“ÑhD"‘8·£jkÝNàÅ‚åõËßRƒR‚¯Dðîä=ZZè ب~tWº\š{Ç€Á`0 €Ïçñx<@¯×ëF unJJò¡ï7S —”–/Ë£¨kvfí|¸í¶ŒŒ™3ŠŠŠŠòrz:þyzJ¥JÕÚ Ü[zÏË÷l2’gÏX|õ1ÊqƹÍѰÙl6íÛ æ¯H‰Ç£ßÝÝÝÝÛ 1‚: ?¡¯¯¯ïÐùq ­†V£‰¢žÿrEÒ‹v }Ñô•ÓÖ--ÍÍÍÍ@{»FÓÞxyyyyy==½½}}€Ø(Qz~,ºaኇ>~ºº·vë]ha§c  …B! × ò|êwWþ½à­9ëϽ{ë }<è;zP[[WWSp¹\.— ˆDb±Hœ_\=¿þa`Õ®—öüýÀar˜æðeg-{Z?iÛˆD"‘HD» ‡Ã%x„@@û~Î`0›–'G%K~G8}¸øEþT4ãä€ óܹªªsç\óär¹\&ÚÚÚÚ´Z -wúÛÓË?ý)2rüøá¼¥ÇÒcé¡(sš¹Ê̡ǣ Q‡Ã%x‡Ãápú €q/3ˆ}CÊ•÷ºa’w¿>åÔ7Õ@ÊŠÉ/%¼¨TtÕ×××××…"‘PxxˆD@ÃëÊ9åÉÀ:Çë2‡Ÿ¯2ÝÙ’òý@`àèÑ `³Ùlv»ë÷K]OG‡Á¤Ü”tß)À, ÓÙ+ýîu·€C…yÊÛû¶¬þ/h …@KKKKK‹KÓär™L&TªææÖV`Öû3y3þø…ù…ùІ¿ >>ÛûeÞWÛUª*R™$'O™2y2PYYYYU5@ ? ž¸’•µ·Ó5© ’ÙW“v^wš Ü­ú  éÒÝáp:íöËç×V+½³$qHz$Ò«ÿ~ÅÑÊÊsŠÚÒþþá­%Àý÷geÝuÐØØØØØH[$É÷ žðG¶fMšžíš$ŽMHIHÿ`zÓÄ1EÑm[‡vÀ¥¦ÎçÓ®€àé!'iøÏ¿KöŒŸxç)ù3?÷³²CÿE+€Ó —•]Úõ$|‘¤@¯7Ìf n|ì‚= d Ù®ËõWŸ©)©£¨wžÙðýÆbŠêh14š‡~Œçšàp:œ'EõuY¬³éö€Æ‡»ÆN'EÑõ@&“ÉtåßmÕ·Ú µðÁÇ>^<˜uSÆgSëéôÖÇøúë}ûrr\f2™LÀ@…àñx<>èè ›m‰û²Ê\ß©)ªmª;IQ‹º—t<©´]¡æÀŸ#²~˜ó¹‹€Åd1YLƒ9‹ËŒðþg“v׸ÎNzÇ),,$$8(ZR¼¡ø„+_§›be·Ûív;EÙl6›ÍFQV«ÕjµRÔ)mÑÓ‡)jî»ÿø@pK|jïäx 44,,$øöÛœœC‡\õ…BA§Ãë ÁçÓà›à?'~±«i÷´réèçôÀCeVÿµÈȘ1#- `Äã+äšNJ[9¸œ®¹ 5Y¾IþW:ý´Ùh“çp.Õ8µZ¥jnbb&N¼áàûå¹å¦{÷~£úFEgG&“kTÕ«5j °nɆ'6n–Æ-»ùL`nМMw}„„„†¹¹¹¹GŽgÏVVž?ˆÅb±‡ÝThIÚI|>‹0™´¢X÷Ùîµ'r_™B6X¼å©Ÿ> Äœy=ê4àççëëë ¬[·aÃÆÀ¬ééòô 6dâĘ›FpO˜hl´ì†£>ŒF£IÀÃ^¸Óét:ô\°Xh P©”J• x¤ço>ódÀ»v½³k=ðå¡=ܽ{\ÿ¿}¾æNÍ~àïÔQ‰àé÷žúò‘=®46///ïèQ þ†Æ½ªÀœ´{2ïÞ œú¨ØRTF¶Y.¶D€n7³ÙôÆÕ pnfNcÅ‹^[²ëÉ °Õ¶_:pszJJòt`ÿþrr±Sü¸—xüÉEq.ºœ† €‹]Ýεـ©Æ›97ýxGù®rÃZ 11!!6–¶VëÅ…œ?_UU] „‡<ñÄ¢E &“ÙlÞCôð4H¥`Œì`™Ø@MMMM}=PZZZZQè6jŒÏh–ì}¢(ÜpêÃ"1 Ñíd§ób×Cvx€¿¿B1j¼:è ^:ˆ½5vZL pøð?ÿyäPõ ‘µv`û‰-ÒÍ«p€¬¢Øl:öÑ–u©E\5ûdòìã&MŒ˜pª¹\^>Ðn0˜‚éºÀÓèììì$çl²W__WWW455665Ñó%€Á FNì±ÙL&› œ9sölEÀì`ø±Oî_ðÀü{ «Ÿ ôè{í­Ø"Öt‰ €@l0 z=’’’’˜è Ú?üpèPn.pv~…¥J ¼‘ýZö«+‰@¬+€þþþþþ~W¥OFz#‡âZ)“ĺÜ,BîóHptÿÉNÑð%«Û¸¨(Ù^¶¬òIWLðñññ‘É\ $Ašd'Ä'@Ùl‹ÃŒF“ÉbrW}¹àU`L] !è6`îÒ¬´{·v‰ÍÇæãrmÒÇ=·JzèBÏhtm)’˜D¾Ëáp8\®ë½FCïI8ðÝw ûUGµÍ¯ÞñÊ@€ÌßÛßÛµ^2^N.DnD®¿œ Ýt”>:YýëgCOÒgC›JŸ Í " v¹wÍwOžKJJÊ Àú#6×£„ò§¤_AAcÆÐAR,vG %­–>ÛYW×РTR»×x¯J ==1}?0æÆÀŒk¡¿hØÏÕFµQmÀúŠM·méüMþ/(Šéîì˜1G÷ù-–®®înúŒg[P3©6¢~ªH±¥ìæ…eÏÊ> xxyx‰ú][”ÄÕÑý½û3ie\õéh‚è幑¬:t$¯æp;ðSiáÇ…I€r¡zfó&€µ‚¹„ñàwZ‘¨è—…?ijbÓ':À)²™ (wÁ»Â"·È-rà‡õ¹i‡gå««"Ï KåÏ]üN*|•@|Bœ,¶¸Õ8•qËBÀ/Ü×ß×ÿRA&x÷‘œÄûÅÜïd¿Aß°&Ò÷x'éûŸ/Úýˆ ‰IºàþÞÝ„/gÊ쪕{ï‰<»ÒNúýÀÄ@HÆ‹ƒêå}ñïÿæxº;ãäFÌ}3ÿ¾&g?ðÕ¡—ŸÏ¼öö ñô¸òîéB&hw_€+¼;îáŒ;ƒâÄ•vIC]Àµ"ÐP?Ø8ƒƒ1\mèß tºf­ˆo«Ž¿WßÅÒí¦¬¼ñ˰!´aÿhT¸òLV]Ðo\Ðõ‰ëÊ×ÿ,àÑu³BÄǽöèÇeEe@Ñ” *ÍÛ€a›)·'sä.ù]o"Áû!¯Â ¡0bŒâi`Å{ó&&L¼´¶ Lþñ+;ÿ–Ï`<–|‡6úÍ‘ÇÈY?‘Çå:ÿ«F˜Fü†Ìþ‘`p<°‹°"IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/addrbook.png0000644000000000000000000000120712247657030017577 0ustar rootroot‰PNG  IHDRóÿatIME×%«s pHYs''”iQgAMA± üaIDATxÚ•SÍkA}3»Ûm“¦ôƒs(ÖV‚ zRk{õ¦ž< ¥xìmo"¥ôRzÒ›èÁ»AÒϘø[#ÉDz™™Ýñ7kÒš6©øÛËìþ~ïÍ{ovšµ±< Åu]r¨ˆ¡[i­}p>{áùšy·[0Ôlr2Í¢¡-8£i؃#`Œ·¨ ,nî.Ѳ Š"$S)LOG¥ ø¥€Ú§8wå&ÒWgÀTÊel¾3:Z¸#¥"øÕ¤ÖHŽáÒÜuÔ%ðíý²o?clæ.””§,ñc B¥ „DPöÑ(áÖkÈÌ^CékBˆXåÉ:΀šJ(X¶·,°¦­DÒ%âšÖšžî¤@5L¢m˜ [¦‘5úx6Dó¨ ¢Øü&‘ÿOJŸÐˆL2·-„Õÿ"hÐŒþ&%nQõ>7ÎGÇÎÈÀìÚë¸fÅâ¸Ì¦Rè6ô#Q‡U;œIg6Ɔ‡ñ‹ŽL ²8BË="¨ä·t%»S&%OOHyëãÁþÊïOg.fâ?¯j2±1A.—ÓÛÛùÏ[|ö·«µx³±W¸Ü7²špJûÅï7lÇuÇÇ'`÷ô"ŸÏê~øÄ󼥓t¼vëï¤Cf/ö÷§î_˜˜b»{[âÁ‹Wn§Ùî÷–êå£{³šc™ÆJW_Ïušù 6` vpAg00ÎîŒW sIDATxÚí[}PGÿÍÌ~±°»¬ÊÊJ`!‚¢Á/$ŠDO+±R•¤rI1ÆJ¦L™‹©Â‹w¹œw ‰1ueŒæ’ÔUÎxV>êê=/jü¡4*ˆ"FPX@#,Ëî»Ó÷Ç\g‡aÇ]–O=ßþÑ5=Ý=¯ßïõë×ïõ2„BîÑ;Ô ü¿Ó=†˜î0Ĥ ÖÀ^[×R[NÈ¿ÏìþøÛ4 £ªƒsnj¶ƒ“ ‚ „Vâ&„PûêOKãlã(ã àùû–>¶¬ ŸsÿÔÔ‡FÎ'lÞ2î#ûæÅ„<ýÃS†_þ ˆŠŠŠ2§Óéloï» è÷iéóQA‚Ï­÷ùäõAˆø^lOû ‚Ïwû~â¸ÿ÷” ÜnÚ´ŒŒÌL€ç»ºx(\ÿÎS…7m8øþºž]@FûÔÙÙÙét§N•–ž<9˜:}g\¡¼Ñ^£×¬Ü>è ¨«®«¶—òõ·ÿÜõåÀëõz½Þ›@o–~_MH Ó¡T÷výõúˆˆˆà7¯¿òÛ5k€‰I“ÒÓÃX É É¶É kµÆ–’››—´µµµ9¡ –a†aü%˲,û?€eÅú@íh)¾ó· FRµ’jd Ò~wKÛ…J&“Éd6ÇŽ>¬,ø d±X,11@BBBBBÃ8GddpÖ¨ †aXÖÿ̲,KJß+=Ë;  žÖË/t(+*™ÍfóÈ‘ c±TWÇÄ—OÈô†¤®TJ‘ ^ú,×||nÔ*`–í.`Ê— ø¿'‚ åC DDú ¹i‘–úJëC33ÁùQ†K´ý>& ”šH §©r‚ þöõá üüù‹ËÊzŠ@«Õht: %%))5•aV­zùå—^"¤©éƦ¦ÞÇb‰‰±X€Â·ß.,ô×û|¢{;dÒl¹€•€èM§”žžšš‘¡<ÞlÚôá‡Á¿'j6!¼ñá×|:éž1h(™œ@&¦7‚üñuëvF1B¯-ÊÊ;X¸0++1à8–e†Ñé´Z.8¿EEÅŇâr¹Ý.Wèó¤ãÏœ9cFvvOÁÝ÷–A Ðfئ‡®ñ^¯ÏG0yò¤I6ÀóOWðÕWGÖÔ;v|ÿ}e%°yóêÕùù„$''&¦¦7'';;/¯÷+Ž®jj¤‚gQðTáv0Nî­DêNºÝÇõë„TVnÛ¶f !ÅÅk×ff²gÏ’%KOÖ##µZŽ4­V­ÒÓÇ3ˆ‹‹‹³X€Õ«7m:xàyžï긌†|¥Ëç)}ŽAíS4TÉ[–õõû÷ò pâĺu™™€ÁÐÑQTLš›;v, VGDhµ€Ýn·Û턨TÇ0€^¯ÕªTbLE€›7ÛÛy°Ù¬Öèh@¯7¢¢€;©¨ð»€ß› vP4nwRe ®nïÞ-[€¦¦6n²³}4+ °Z““m6@£Ñ룣{ÚN•ŠãXV\*•4˜&ŽÎNžÒÓ““cc={ΜilÚÛÛÛû#8î|C;ô¤>íž=‡ãÚ5 ¶v×® €œœÅ‹gÍFœNèìlm½>6Ö?9EFêt*™™’2b„òoÞ¼uËãñ`4FcpþûË-ݰáÝwß{/ôI¿ DuuûömÝ ¤¤dd$&úO–€ÇÓÚ* °¬V+Š_ʺÓévwu;vìÞ}útðï9.Ï÷>Hª[J‰š8êŽÒMyÈÏrjn>{vï^ 1qþü)SB\®†ðz»ºÄ6 £Ñ§R‰Ï"íÚõÖ[=4444ˆý†ŠŠJJŽ!Äår¹:;{ß_§Óé""€éÓ§LÉÌ Ÿ°oxô™ç;:Z[µZ§3BÚÚD¿[ÔPBñz†W€×ër9@MÍÆóçõõ*•Z­ü%GÔø¹s·l¹tÉ_ß[œ“óàƒsæô~È5_šÈtäBÄÍÕh|>Ñ{a@¨×+n’ô$ÙÚj·ùù+W®] §Ñ˪T¢HÅ~,«V>ŸÇÓÙ ïØ±u+P_____Øl6›ÍÖ{û{ìØñã‡âv{ÊcÐ3BP«££­V .nÑ¢W_ÊË¿ûî›oÀf[°`˜ÄÄ @¯·Z€ãôz «à¸I“ž`˜ÔÔ'žÎžýòËM›€èèÙ³W¬T*½Þd3O&Søx<·7=ò \ „<±3¨Á8¹fÝ&ññóæ-_TW{<<þùæÍ@ZZNÎܹ€Ùœ–öì³ÇEFŽ%Úx§hm½|ùÌàܹ/¾xí5 ::'gÙ2Àlž9óÉ'ƒÁ`0µZ­V«û/šª$øPrÃ}É ôÙ ¥ H3HÒ÷ãÆ-\¸b`2¥§çç55‡}öpáÂöí›7‹#ˆþ;èT@DÄøñ¹¹@|üÊ•_ h4&ÓèÑâu˜¨(@ n+çzKòÌ™RøY^ßÛTå€ BN4c³¥¦&Ó3Ϭ_/Þ+*(ƒiØ–aü›+µñôd«Ñh4_ãM&£Ñl•;%~ý«PnW¤¯Ôoø/Vù/*Ñzé{µZ­V©ÄäµÙzN˜êhæ„%ãC½ÖBÇ6tŸ¼_cä§%˲,Jš —&Ç•oEˆ@( ^ÊÇ`ߊ4h|<Øæ#}/ 8Fàû@„ô_¸WI”QºlÝ x4”±0zæ~z5‘ƒÁ`0™ÂÿðÝF(*îiîª_h†vå~!ìHâï¯J.ž,-òB³à.õ´‡±#Y-;HjëI¶oônèp§ÂÂÂÂÂBB¦M›93#8}úĉ²2      `ø¯Í;þâ%XƒA<'Ðç;…ÄñÀ€¸¡ƒAUçªÎ]òR_õªÝlß¾m[U=°Õ5Õ5U'INLNL™9ŒMQ(îÙp*Ýmî6!äͱ룟EHK‹ÃÑÜLHmm]]u5!=ºo!üäOï¼ñBhû¡æ[©ö&ˆˆ?Rz¥ì›3Û ù¸þÓýíÈRáapãÆO?55ííô/S¢K!\¯×çŽ5=[@3"6j0ý鵙ˀøU÷Å$¼\ÿWãMGøÈ¸§l/øßÓö´?ý÷äÒ¥K–,_Î0-_µli9Ôw¾C••óÏ@)% ºwð—44PÁ©S9½å¤¸|ùÊþê÷Ãâ(«q 09cÒ›³ 4ø“哆·y–gy8÷÷Šg?\î?» @ÂäûÞHx˜¾zÚÊL>|¾år‘ß §|ô¸M>ܸS)\TÝ/ŸÒx{ÏÛÍJÏ÷H$%9Û †|¾[)ÔMø¿M•T:6<ÐIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxPreferences.js0000644000000000000000000011554512247657030020544 0ustar rootrootvar isSieveScriptsEnabled = false; var filters = []; var mailAccounts = null; var dialogs = {}; function savePreferences(sender) { var sendForm = true; var sigList = $("signaturePlacementList"); if (sigList) sigList.disabled = false; if ($("calendarCategoriesListWrapper")) { serializeCalendarCategories(); } if ($("contactsCategoriesListWrapper")) { serializeContactsCategories(); } if ($("mailLabelsListWrapper")) { serializeMailLabels(); } if (typeof mailCustomFromEnabled !== "undefined" && !emailRE.test($("email").value)) { showAlertDialog(_("Please specify a valid sender address.")); sendForm = false; } if ($("replyTo")) { var replyTo = $("replyTo").value; if (!replyTo.blank() && !emailRE.test(replyTo)) { showAlertDialog(_("Please specify a valid reply-to address.")); sendForm = false; } } if ($("dayStartTime")) { var start = $("dayStartTime"); var selectedStart = parseInt(start.options[start.selectedIndex].value); var end = $("dayEndTime"); var selectedEnd = parseInt(end.options[end.selectedIndex].value); if (selectedStart >= selectedEnd) { showAlertDialog (_("Day start time must be prior to day end time.")); sendForm = false; } } if ($("enableVacation") && $("enableVacation").checked) { if ($("autoReplyText").value.strip().length == 0 || $("autoReplyEmailAddresses").value.strip().length == 0) { showAlertDialog(_("Please specify your message and your email addresses for which you want to enable auto reply.")); sendForm = false; } if ($("autoReplyText").value.strip().endsWith('\n.')) { showAlertDialog(_("Your vacation message must not end with a single dot on a line.")); sendForm = false; } if ($("enableVacationEndDate") && $("enableVacationEndDate").checked) { var e = $("vacationEndDate_date"); var endDate = e.inputAsDate(); var now = new Date(); if (isNaN(endDate.getTime()) || endDate.getTime() < now.getTime()) { showAlertDialog(_("End date of your auto reply must be in the future.")); sendForm = false; } } } if ($("enableForward") && $("enableForward").checked) { var addresses = $("forwardAddress").value.split(","); for (var i = 0; i < addresses.length && sendForm; i++) if (!emailRE.test(addresses[i].strip())) { showAlertDialog(_("Please specify an address to which you want to forward your messages.")); sendForm = false; } } if (isSieveScriptsEnabled) { var jsonFilters = prototypeIfyFilters(); $("sieveFilters").setValue(Object.toJSON(jsonFilters)); } if (sendForm) { saveMailAccounts(); $("mainForm").submit(); } return false; } function prototypeIfyFilters() { var newFilters = $([]); for (var i = 0; i < filters.length; i++) { var filter = filters[i]; var newFilter = $({}); newFilter.name = filter.name; newFilter.match = filter.match; newFilter.active = filter.active; if (filter.rules) { newFilter.rules = $([]); for (var j = 0; j < filter.rules.length; j++) { newFilter.rules.push($(filter.rules[j])); } } if (filter.actions) { newFilter.actions = $([]); for (var j = 0; j < filter.actions.length; j++) { newFilter.actions.push($(filter.actions[j])); } } newFilters.push(newFilter); } return newFilters; } function _setupEvents() { var widgets = [ "timezone", "shortDateFormat", "longDateFormat", "timeFormat", "weekStartDay", "dayStartTime", "dayEndTime", "firstWeek", "messageCheck", "sortByThreads", "displayRemoteInlineImages", "subscribedFoldersOnly", "language", "defaultCalendar", "enableVacation" ]; for (var i = 0; i < widgets.length; i++) { var widget = $(widgets[i]); if (widget) { widget.observe("change", onChoiceChanged); } } // We check for non-null elements as replyPlacementList and composeMessagesType // might not be present if ModulesConstraints disable those elements if ($("replyPlacementList")) $("replyPlacementList").on("change", onReplyPlacementListChange); if ($("composeMessagesType")) $("composeMessagesType").on("change", onComposeMessagesTypeChange); // Note: we also monitor changes to the calendar categories. // See functions endEditable and onColorPickerChoice. var valueInputs = [ "calendarCategoriesValue", "calendarCategoriesValue" ]; for (var i = 0; i < valueInputs.length; i++) { var valueInput = $(valueInputs[i]); if (valueInput) valueInput.value = ""; } } function onBodyClickHandler(event) { var target = getTarget(event); if (!target.hasClassName('colorBox')) $("colorPickerDialog").hide(); } function onChoiceChanged(event) { var hasChanged = $("hasChanged"); hasChanged.value = "1"; } function addDefaultEmailAddresses(event) { var defaultAddresses = $("defaultEmailAddresses").value.split(/, */); var addresses = $("autoReplyEmailAddresses").value.trim(); if (addresses) addresses = addresses.split(/, */); else addresses = new Array(); defaultAddresses.each(function(adr) { for (var i = 0; i < addresses.length; i++) if (adr == addresses[i]) break; if (i == addresses.length) addresses.push(adr); }); $("autoReplyEmailAddresses").value = addresses.join(", "); event.stop(); } function initPreferences() { var tabsContainer = $("preferencesTabs"); var controller = new SOGoTabsController(); controller.attachToTabsContainer(tabsContainer); var mailController = new SOGoTabsController(); mailController.attachToTabsContainer($('mailOptionsTabs')); var filtersListWrapper = $("filtersListWrapper"); if (filtersListWrapper) { isSieveScriptsEnabled = true; } _setupEvents(); if (typeof (initAdditionalPreferences) != "undefined") initAdditionalPreferences(); $('colorPickerDialog').on('click', 'span', onColorPickerChoice); $(document.body).on("click", onBodyClickHandler); // Calender categories var wrapper = $("calendarCategoriesListWrapper"); if (wrapper) { var table = wrapper.childNodesWithTag("table")[0]; resetCalendarCategoriesColors(null); var r = $$("#calendarCategoriesListWrapper tbody tr"); for (var i= 0; i < r.length; i++) r[i].identify(); table.multiselect = true; resetCalendarTableActions(); $("calendarCategoryAdd").observe("click", onCalendarCategoryAdd); $("calendarCategoryDelete").observe("click", onCalendarCategoryDelete); wrapper.observe("scroll", onBodyClickHandler); } // Mail labels/tags var wrapper = $("mailLabelsListWrapper"); if (wrapper) { var table = wrapper.childNodesWithTag("table")[0]; resetMailLabelsColors(null); var r = $$("#mailLabelsListWrapper tbody tr"); for (var i= 0; i < r.length; i++) r[i].identify(); table.multiselect = true; resetMailTableActions(); $("mailLabelAdd").observe("click", onMailLabelAdd); $("mailLabelDelete").observe("click", onMailLabelDelete); } // Contact categories wrapper = $("contactsCategoriesListWrapper"); if (wrapper) { var table = wrapper.childNodesWithTag("table")[0]; var r = $$("#contactsCategoriesListWrapper tbody tr"); for (var i= 0; i < r.length; i++) r[i].identify(); table.multiselect = true; resetContactsTableActions(); $("contactsCategoryAdd").observe("click", onContactsCategoryAdd); $("contactsCategoryDelete").observe("click", onContactsCategoryDelete); } if ($("replyPlacementList")) onReplyPlacementListChange(); var button = $("addDefaultEmailAddresses"); if (button) button.observe("click", addDefaultEmailAddresses); button = $("changePasswordBtn"); if (button) button.observe("click", onChangePasswordClick); initSieveFilters(); if ($('mailOptionsView')) initMailAccounts(); button = $("enableVacationEndDate"); if (button) { jQuery("#vacationEndDate_date").closest(".date").datepicker( { autoclose: true, position: 'above', weekStart: $('weekStartDay').getValue() }); button.on("click", function(event) { if (this.checked) $("vacationEndDate_date").enable(); else $("vacationEndDate_date").disable(); }); } } function initSieveFilters() { var table = $("filtersList"); if (table) { var filtersValue = $("sieveFilters").getValue(); if (filtersValue && filtersValue.length) { filters = $(filtersValue.evalJSON(false)); for (var i = 0; i < filters.length; i++) { appendSieveFilterRow(table, i, filters[i]); } } $("filterAdd").observe("click", onFilterAdd); $("filterDelete").observe("click", onFilterDelete); $("filterMoveUp").observe("click", onFilterMoveUp); $("filterMoveDown").observe("click", onFilterMoveDown); } } function appendSieveFilterRow(filterTable, number, filter) { var row = createElement("tr"); row.observe("mousedown", onRowClick); row.observe("dblclick", onFilterEdit.bindAsEventListener(row)); var nameColumn = createElement("td"); nameColumn.appendChild(document.createTextNode(filter["name"])); row.appendChild(nameColumn); var activeColumn = createElement("td", null, "activeColumn"); var cb = createElement("input", null, "checkBox", { type: "checkbox" }, null, activeColumn); cb.checked = filter.active; var bound = onScriptActiveCheck.bindAsEventListener(cb); cb.observe("click", bound); row.appendChild(activeColumn); filterTable.tBodies[0].appendChild(row); } function onScriptActiveCheck(event) { var index = this.parentNode.parentNode.rowIndex - 1; filters[index].active = this.checked; } function updateSieveFilterRow(filterTable, number, filter) { var row = $(filterTable.tBodies[0].rows[number]); var columns = row.childNodesWithTag("td"); var nameColumn = columns[0]; while (nameColumn.firstChild) { nameColumn.removeChild(nameColumn.firstChild); } nameColumn.appendChild(document.createTextNode(filter.name)); var activeColumn = columns[1]; var cb = activeColumn.childNodesWithTag("input"); cb[0].checked = filter.active; } function _editFilter(filterId) { var urlstr = ApplicationBaseURL + "editFilter?filter=" + filterId; var win = window.open(urlstr, "sieve_filter_" + filterId, "width=560,height=380,resizable=0"); if (win) win.focus(); } function onFilterAdd(event) { _editFilter("new"); event.stop(); } function onFilterDelete(event) { var filtersList = $("filtersList").tBodies[0]; var nodes = filtersList.getSelectedNodes(); if (nodes.length > 0) { var deletedFilters = []; for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; deletedFilters.push(node.rowIndex - 1); } deletedFilters = deletedFilters.sort(function(x,y) { return x-y; }); var rows = filtersList.rows; for (var i = 0; i < deletedFilters.length; i++) { var filterNbr = deletedFilters[i]; filters.splice(filterNbr, 1); var row = rows[filterNbr]; row.parentNode.removeChild(row); } } event.stop(); } function onFilterMoveUp(event) { var filtersList = $("filtersList").tBodies[0]; var nodes = filtersList.getSelectedNodes(); if (nodes.length > 0) { var node = nodes[0]; var previous = node.previous(); if (previous) { var count = node.rowIndex - 1; node.parentNode.removeChild(node); filtersList.insertBefore(node, previous); var swapFilter = filters[count]; filters[count] = filters[count - 1]; filters[count - 1] = swapFilter; } } event.stop(); } function onFilterMoveDown(event) { var filtersList = $("filtersList").tBodies[0]; var nodes = filtersList.getSelectedNodes(); if (nodes.length > 0) { var node = nodes[0]; var next = node.next(); if (next) { var count = node.rowIndex - 1; filtersList.removeChild(next); filtersList.insertBefore(next, node); var swapFilter = filters[count]; filters[count] = filters[count + 1]; filters[count + 1] = swapFilter; } } event.stop(); } function onFilterEdit(event) { _editFilter(this.rowIndex - 1); event.stop(); return false; } function copyFilter(originalFilter) { var newFilter = {}; newFilter.name = originalFilter.name; newFilter.match = originalFilter.match; newFilter.active = originalFilter.active; if (originalFilter.rules) { newFilter.rules = []; for (var i = 0; i < originalFilter.rules.length; i++) { newFilter.rules.push(_copyFilterElement(originalFilter.rules[i])); } } newFilter.actions = []; for (var i = 0; i < originalFilter.actions.length; i++) { newFilter.actions.push(_copyFilterElement(originalFilter.actions[i])); } return newFilter; } function _copyFilterElement(filterElement) { /* element = rule or action */ var newElement = {}; for (var k in filterElement) { var value = filterElement[k]; if (typeof(value) == "string" || typeof(value) == "number") { newElement[k] = value; } } return newElement; } function getSieveCapabilitiesFromEditor() { return sieveCapabilities; } function getFilterFromEditor(filterId) { var filter = copyFilter(filters[filterId]); return Object.toJSON(filter); } function setupMailboxesFromJSON(jsonResponse) { var responseMboxes = jsonResponse.mailboxes; userMailboxes = $([]); for (var i = 0; i < responseMboxes.length; i++) { var name = responseMboxes[i].path.substr(1); userMailboxes.push(name); } } function updateFilterFromEditor(filterId, filterJSON) { var filter = filterJSON.evalJSON(); var sanitized = {}; for (var k in filter) { if (!(k == "rules" && filter.match == "allmessages")) { sanitized[k] = filter[k]; } } var table = $("filtersList"); if (filterId == "new") { var newNumber = filters.length; filters.push(sanitized); appendSieveFilterRow(table, newNumber, sanitized); } else { filters[filterId] = sanitized; updateSieveFilterRow(table, filterId, sanitized); } } /* mail accounts */ function initMailAccounts() { var mailAccountsJSON = $("mailAccountsJSON"); mailAccounts = mailAccountsJSON.value.evalJSON(); var mailAccountsList = $("mailAccountsList"); if (mailAccountsList) { var li = createMailAccountLI(mailAccounts[0], true); mailAccountsList.appendChild(li); for (var i = 1; i < mailAccounts.length; i++) { li = createMailAccountLI(mailAccounts[i]); mailAccountsList.appendChild(li); } var lis = mailAccountsList.childNodesWithTag("li"); lis[0].readOnly = true; lis[0].selectElement(); var button = $("mailAccountAdd"); if (button) { button.observe("click", onMailAccountAdd); } button = $("mailAccountDelete"); if (button) { button.observe("click", onMailAccountDelete); } } var inputs = $$("#accountInfo input"); for (var i = 0; i < inputs.length; i++) { $(inputs[i]).observe("change", onMailAccountInfoChange); } inputs = $$("#identityInfo input"); for (var i = 0; i < inputs.length; i++) { $(inputs[i]).observe("change", onMailIdentityInfoChange); } $("actSignature").observe("click", onMailIdentitySignatureClick); displayMailAccount(mailAccounts[0], true); inputs = $$("#returnReceiptsInfo input"); for (var i = 0; i < inputs.length; i++) { $(inputs[i]).observe("change", onMailReceiptInfoChange); } inputs = $$("#returnReceiptsInfo select"); for (var i = 0; i < inputs.length; i++) { $(inputs[i]).observe("change", onMailReceiptActionChange); } } function onMailAccountInfoChange(event) { this.mailAccount[this.name] = this.value; var hasChanged = $("hasChanged"); hasChanged.value = "1"; } function onMailIdentityInfoChange(event) { if (!this.mailAccount["identities"]) { this.mailAccount["identities"] = [{}]; } var identity = this.mailAccount["identities"][0]; identity[this.name] = this.value; var hasChanged = $("hasChanged"); hasChanged.value = "1"; } function onMailReceiptInfoChange(event) { if (!this.mailAccount["receipts"]) { this.mailAccount["receipts"] = {}; } var keyName = this.name.cssIdToHungarianId(); this.mailAccount["receipts"][keyName] = this.value; var popupIds = [ "receipt-non-recipient-action", "receipt-outside-domain-action", "receipt-any-action" ]; var receiptActionsDisable = (this.value == "ignore"); for (var i = 0; i < popupIds.length; i++) { var actionPopup = $(popupIds[i]); actionPopup.disabled = receiptActionsDisable; } } function onMailReceiptActionChange(event) { if (!this.mailAccount["receipts"]) { this.mailAccount["receipts"] = {}; } var keyName = this.name.cssIdToHungarianId(); this.mailAccount["receipts"][keyName] = this.value; } function onMailIdentitySignatureClick(event) { if (!this.readOnly) { var dialogId = "signatureDialog"; var dialog = dialogs[dialogId]; if (!dialog) { var label = _("Please enter your signature below:"); var fields = createElement("p"); fields.appendChild(createElement("textarea", "signature")); fields.appendChild(createButton("okBtn", _("OK"), onMailIdentitySignatureOK)); fields.appendChild(createButton("cancelBtn", _("Cancel"), disposeDialog)); var dialog = createDialog(dialogId, _("Signature"), label, fields, "none"); if (Prototype.Browser.IE) // Overwrite some fixes from iefixes.css dialog.setStyle({ width: 'auto', marginLeft: 'auto' }); document.body.appendChild(dialog); dialogs[dialogId] = dialog; if ($("composeMessagesType").value != 0) { CKEDITOR.replace('signature', { height: "70px", toolbar: [['Bold', 'Italic', '-', 'Link', 'Font','FontSize','-','TextColor', 'BGColor'] ], language: localeCode, scayt_sLang: localeCode }); } } dialog.mailAccount = this.mailAccount; if (!this.mailAccount["identities"]) { this.mailAccount["identities"] = [{}]; } var identity = this.mailAccount["identities"][0]; var area = $("signature"); if (typeof(identity["signature"]) != "undefined") area.value = identity["signature"]; else area.value = ""; $("bgDialogDiv").show(); if (Prototype.Browser.IE) jQuery('#bgDialogDiv').css('opacity', 0.4); jQuery(dialog).fadeIn('fast', function() { if (CKEDITOR.instances["signature"]) focusCKEditor(); else area.focus(); }); Event.stop(event); } } function focusCKEditor() { if (CKEDITOR.status != 'loaded') setTimeout("focusCKEditor()", 100); else CKEDITOR.instances.signature.focus() } function hideSignature() { if (CKEDITOR.status != 'loaded') setTimeout("hideSignature()", 100); else disposeDialog("signatureDialog"); } function onMailIdentitySignatureOK(event) { var dialog = $("signatureDialog"); var mailAccount = dialog.mailAccount; if (!mailAccount["identities"]) { mailAccount["identities"] = [{}]; } var identity = mailAccount["identities"][0]; var content = (CKEDITOR.instances["signature"] ? CKEDITOR.instances["signature"].getData() : $("signature").value); identity["signature"] = content; displayAccountSignature(mailAccount); hideSignature(); dialog.mailAccount = null; var hasChanged = $("hasChanged"); hasChanged.value = "1"; } function createMailAccountLI(mailAccount, readOnly) { var li = createElement("li"); li.appendChild(document.createTextNode(mailAccount["name"])); li.observe("click", onMailAccountEntryClick); li.observe("mousedown", onRowClick); if (readOnly) { li.addClassName("readonly"); } else { var editionCtlr = new RowEditionController(); editionCtlr.attachToRowElement(li); editionCtlr.notifyNewValueCallback = function(ignore, newValue) { mailAccount["name"] = newValue; }; li.editionController = editionCtlr; } li.mailAccount = mailAccount; return li; } function onMailAccountEntryClick(event) { displayMailAccount(this.mailAccount, this.readOnly); } function displayMailAccount(mailAccount, readOnly) { var inputs = $$("#accountInfo input"); inputs.each(function(i) { i.disabled = readOnly; i.mailAccount = mailAccount; }); inputs = $$("#identityInfo input"); inputs.each(function(i) { i.mailAccount = mailAccount; }); if (!mailCustomFromEnabled) { for (var i = 0; i < 2; i++) { inputs[i].disabled = readOnly; } } var form = $("mainForm"); var encryption = "none"; var encRadioValues = [ "none", "ssl", "tls" ]; if (mailAccount["encryption"]) { encryption = mailAccount["encryption"]; } form.setRadioValue("encryption", encRadioValues.indexOf(encryption)); var port; if (mailAccount["port"]) { port = mailAccount["port"]; } else { if (encryption == "ssl") { port = 993; } else { port = 143; } } $("port").value = port; $("serverName").value = mailAccount["serverName"]; $("userName").value = mailAccount["userName"]; $("password").value = mailAccount["password"]; var identity = (mailAccount["identities"] ? mailAccount["identities"][0] : {} ); $("fullName").value = identity["fullName"] || ""; $("email").value = identity["email"] || ""; $("replyTo").value = identity["replyTo"] || ""; displayAccountSignature(mailAccount); var receiptAction = "ignore"; var receiptActionValues = [ "ignore", "allow" ]; if (mailAccount["receipts"] && mailAccount["receipts"]["receiptAction"]) { receiptAction = mailAccount["receipts"]["receiptAction"]; } for (var i = 0; i < receiptActionValues.length; i++) { var keyName = "receipt-action-" + receiptActionValues[i]; var input = $(keyName); input.mailAccount = mailAccount; } form.setRadioValue("receipt-action", receiptActionValues.indexOf(receiptAction)); var popupIds = [ "receipt-non-recipient-action", "receipt-outside-domain-action", "receipt-any-action" ]; var receiptActionsDisable = (receiptAction == "ignore"); for (var i = 0; i < popupIds.length; i++) { var actionPopup = $(popupIds[i]); actionPopup.disabled = receiptActionsDisable; var settingValue = "ignore"; var settingName = popupIds[i].cssIdToHungarianId(); if (mailAccount["receipts"] && mailAccount["receipts"][settingName]) { settingValue = mailAccount["receipts"][settingName]; } actionPopup.value = settingValue; actionPopup.mailAccount = mailAccount; } } function displayAccountSignature(mailAccount) { var actSignature = $("actSignature"); actSignature.mailAccount = mailAccount; var actSignatureValue; var identity = (mailAccount["identities"] ? mailAccount["identities"][0] : {} ); var value = identity["signature"]; if (value && value.length > 0) value = value.stripTags().unescapeHTML().replace(/^[ \n\r]*/, ""); if (value && value.length > 0) { if (value.length < 30) { actSignatureValue = value; } else { actSignatureValue = value.substr(0, 30) + "..."; } } else { actSignatureValue = _("(Click to create)"); } while (actSignature.firstChild) { actSignature.removeChild(actSignature.firstChild); } actSignature.update(actSignatureValue); } function createMailAccount() { var firstIdentity = mailAccounts[0]["identities"][0]; var newIdentity = {}; for (var k in firstIdentity) { newIdentity[k] = firstIdentity[k]; } delete newIdentity["isDefault"]; var newMailAccount = { name: _("New Mail Account"), serverName: "mailserver", userName: UserLogin, password: "", identities: [ newIdentity ] }; return newMailAccount; } function onMailAccountAdd(event) { var newMailAccount = createMailAccount(); mailAccounts.push(newMailAccount); var li = createMailAccountLI(newMailAccount); var mailAccountsList = $("mailAccountsList"); mailAccountsList.appendChild(li); var selection = mailAccountsList.getSelectedNodes(); for (var i = 0; i < selection.length; i++) { selection[i].deselect(); } displayMailAccount(newMailAccount, false); li.selectElement(); li.editionController.startEditing(); var hasChanged = $("hasChanged"); hasChanged.value = "1"; event.stop(); } function onMailAccountDelete(event) { var mailAccountsList = $("mailAccountsList"); var selection = mailAccountsList.getSelectedNodes(); if (selection.length > 0) { var li = selection[0]; if (!li.readOnly) { li.deselect(); li.editionController = null; var next = li.next(); if (!next) { next = li.previous(); } mailAccountsList.removeChild(li); var index = mailAccounts.indexOf(li.mailAccount); mailAccounts.splice(index, 1); next.selectElement(); displayMailAccount(next.mailAccount, next.readOnly); var hasChanged = $("hasChanged"); hasChanged.value = "1"; } } event.stop(); } function saveMailAccounts() { /* This removal enables us to avoid a few warning from SOPE for the inputs that were created dynamically. */ var editor = $("mailAccountEditor"); // Could be null if ModuleConstraints disables email access if (editor) editor.parentNode.removeChild(editor); compactMailAccounts(); var mailAccountsJSON = $("mailAccountsJSON"); if (mailAccountsJSON) mailAccountsJSON.value = Object.toJSON(mailAccounts); } function compactMailAccounts() { if (!mailAccounts) return; for (var i = 1; i < mailAccounts.length; i++) { var account = mailAccounts[i]; var encryption = account["encryption"]; if (encryption) { if (encryption == "none") { delete account["encryption"]; } } else { encryption = "none"; } var port = account["port"]; if (port) { if ((encryption == "ssl" && port == 993) || port == 143) { delete account["port"]; } } } } /* common function between calendar categories and mail labels */ function onColorEdit(e, target) { var view = $(target); view.select('div.colorEditing').each(function(box) { box.removeClassName('colorEditing'); }); this.addClassName("colorEditing"); var cellPosition = this.cumulativeOffset(); var cellDimensions = this.getDimensions(); var div = $('colorPickerDialog'); var divDimensions = div.getDimensions(); var left = cellPosition[0] - divDimensions["width"]; var top = cellPosition[1] - 165 - view.scrollTop; div.setStyle({ left: left + "px", top: top + "px" }); div.writeAttribute('data-target', target); div.show(); } function onColorPickerChoice(event) { var span = getTarget(event); var dialog = span.up('.dialog'); var target = dialog.readAttribute('data-target'); var newColor = "#" + span.className.substr(4); var wrapper = $(target); var div = wrapper.select("div.colorEditing").first(); div.writeAttribute('data-color', newColor); div.style.background = newColor; if (parseInt($("hasChanged").value) == 0) { var hasChanged = $("hasChanged"); hasChanged.value = "1"; } dialog.hide(); } /* calendar categories */ function resetCalendarTableActions() { var r = $$("#calendarCategoriesListWrapper tbody tr"); for (var i = 0; i < r.length; i++) { var row = $(r[i]); row.observe("mousedown", onRowClick); var tds = row.childElements(); var editionCtlr = new RowEditionController(); editionCtlr.attachToRowElement(tds[0]); tds[1].childElements()[0].observe("click", onCalendarColorEdit); } } function onCalendarColorEdit(e) { var onCCE = onColorEdit.bind(this); onCCE(e, "calendarCategoriesListWrapper"); } function onCalendarCategoryAdd(e) { var row = new Element("tr"); var nametd = new Element("td").update(""); var colortd = new Element("td"); var colordiv = new Element("div", {"class": "colorBox", dataColor: "#F0F0F0"}); row.identify(); row.addClassName("categoryListRow"); nametd.addClassName("categoryListCell"); colortd.addClassName("categoryListCell"); colordiv.setStyle({backgroundColor: "#F0F0F0"}); colortd.appendChild(colordiv); row.appendChild(nametd); row.appendChild(colortd); $("calendarCategoriesListWrapper").childNodesWithTag("table")[0].tBodies[0].appendChild(row); resetCalendarTableActions(); nametd.editionController.startEditing(); } function onCalendarCategoryDelete(e) { var list = $('calendarCategoriesListWrapper').down("TABLE").down("TBODY"); var rows = list.getSelectedNodes(); var count = rows.length; for (var i=0; i < count; i++) { rows[i].editionController = null; rows[i].remove(); } } function serializeCalendarCategories() { var r = $$("#calendarCategoriesListWrapper TBODY TR"); var values = []; for (var i = 0; i < r.length; i++) { var tds = r[i].childElements(); var name = $(tds.first()).innerHTML; var color = $(tds.last().childElements().first()).readAttribute('data-color'); values.push("\"" + name + "\": \"" + color + "\""); } $("calendarCategoriesValue").value = "{ " + values.join(",\n") + "}"; } function resetCalendarCategoriesColors(e) { var divs = $$("#calendarCategoriesListWrapper DIV.colorBox"); for (var i = 0; i < divs.length; i++) { var d = divs[i]; var color = d.readAttribute("data-color"); if (color != "undefined") d.setStyle({ backgroundColor: color }); } } /* /calendar categories */ /* mail label/tags */ function resetMailTableActions() { var r = $$("#mailLabelsListWrapper tbody tr"); for (var i = 0; i < r.length; i++) { var row = $(r[i]); row.observe("mousedown", onRowClick); var tds = row.childElements(); var editionCtlr = new RowEditionController(); editionCtlr.attachToRowElement(tds[0]); tds[1].childElements()[0].observe("click", onMailColorEdit); } } function onMailColorEdit(e) { var onMCE = onColorEdit.bind(this); onMCE(e, "mailLabelsListWrapper"); } function onMailLabelAdd(e) { var row = new Element("tr"); var nametd = new Element("td").update(""); var colortd = new Element("td"); var colordiv = new Element("div", {"class": "colorBox", dataColor: "#F0F0F0"}); row.identify(); row.addClassName("labelListRow"); nametd.addClassName("labelListCell"); colortd.addClassName("labelListCell"); colordiv.setStyle({backgroundColor: "#F0F0F0"}); colortd.appendChild(colordiv); row.appendChild(nametd); row.appendChild(colortd); $("mailLabelsListWrapper").childNodesWithTag("table")[0].tBodies[0].appendChild(row); resetMailTableActions(); nametd.editionController.startEditing(); } function onMailLabelDelete(e) { var list = $('mailLabelsListWrapper').down("TABLE").down("TBODY"); var rows = list.getSelectedNodes(); var count = rows.length; for (var i=0; i < count; i++) { rows[i].editionController = null; rows[i].remove(); } } function resetMailLabelsColors(e) { var divs = $$("#mailLabelsListWrapper DIV.colorBox"); for (var i = 0; i < divs.length; i++) { var d = divs[i]; var color = d.readAttribute('data-color'); if (color != "undefined") d.setStyle({ backgroundColor: color }); } } function serializeMailLabels() { var r = $$("#mailLabelsListWrapper TBODY TR"); var values = []; for (var i = 0; i < r.length; i++) { var tds = r[i].childElements(); var name = r[i].readAttribute("data-name"); var label = $(tds.first()).innerHTML; var color = $(tds.last().childElements().first()).readAttribute('data-color'); /* if name is null, that's because we've just added a new tag */ if (!name) { name = label.replace(/[ \(\)\/\{%\*<>\\\"]/g, "_"); } values.push("\"" + name + "\": [\"" + label + "\", \"" + color + "\"]"); } $("mailLabelsValue").value = "{ " + values.join(",\n") + "}"; } /* /mail label/tags */ /* contacts categories */ function resetContactsTableActions() { var r = $$("#contactsCategoriesListWrapper tbody tr"); for (var i = 0; i < r.length; i++) { var row = $(r[i]); row.observe("mousedown", onRowClick); var tds = row.childElements(); var editionCtlr = new RowEditionController(); editionCtlr.attachToRowElement(tds[0]); } } function onContactsCategoryAdd(e) { var row = new Element("tr"); row.identify(); row.addClassName("categoryListRow"); var nametd = new Element("td").update(""); nametd.addClassName("categoryListCell"); row.appendChild(nametd); var list = $('contactsCategoriesListWrapper').down("TABLE").down("TBODY"); list.appendChild(row); resetContactsTableActions (); nametd.editionController.startEditing(); } function onContactsCategoryDelete(e) { var list = $('contactsCategoriesListWrapper').down("TABLE").down("TBODY"); var rows = list.getSelectedNodes(); var count = rows.length; for (var i = 0; i < count; i++) { rows[i].editionController = null; rows[i].remove(); } } function serializeContactsCategories() { var values = []; var tds = $$("#contactsCategoriesListWrapper TBODY TD"); for (var i = 0; i < tds.length; i++) { var td = $(tds[i]); values.push(td.allTextContent()); } $("contactsCategoriesValue").value = Object.toJSON(values); } /* / contact categories */ function onReplyPlacementListChange() { if ($("replyPlacementList").value == 0) { // Reply placement is above quote, signature can be place before of after quote $("signaturePlacementList").disabled = false; } else { // Reply placement is bellow quote, signature is unconditionally placed after quote $("signaturePlacementList").value = 1; $("signaturePlacementList").disabled = true; } } function onComposeMessagesTypeChange(event) { // var textArea = $('signature'); if (this.value == 0) /* text */ { if (CKEDITOR.instances["signature"]) { var content = CKEDITOR.instances["signature"].getData(); var htmlEditorWidget = $('cke_signature'); htmlEditorWidget.parentNode.removeChild(htmlEditorWidget); delete CKEDITOR.instances["signature"]; var textArea = $("signature"); textArea.value = content; textArea.style.display = ""; textArea.style.visibility = ""; } } else { if ($("signature") && !CKEDITOR.instances["signature"]) { CKEDITOR.replace('signature', { height: "70px", toolbar: [['Bold', 'Italic', '-', 'Link', 'Font','FontSize','-','TextColor', 'BGColor'] ], language: localeCode, scayt_sLang: localeCode } ); } } } function onChangePasswordClick(event) { var field = $("newPasswordField"); var confirmationField = $("newPasswordConfirmationField"); if (field && confirmationField) { var password = field.value; if (password == confirmationField.value) { if (password.length > 0) { var loginValues = readLoginCookie(); var policy = new PasswordPolicy(loginValues[0], loginValues[1]); policy.setCallbacks(onPasswordChangeSuccess, onPasswordChangeFailure); policy.changePassword(password); } else SetLogMessage("passwordError", _("Password must not be empty."), "error"); } else { SetLogMessage("passwordError", _("The passwords do not match. Please try again."), "error"); field.focus(); field.select(); } } event.stop(); } function onPasswordChangeSuccess(message) { SetLogMessage("passwordError", message, "info"); } function onPasswordChangeFailure(code, message) { SetLogMessage("passwordError", message, "error"); } document.observe("dom:loaded", initPreferences); SOGo-2.1.1b/UI/WebServerResources/mime-application-x-tar.png0000644000000000000000000000512612247657030022277 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxMailUserDelegationEditor.css0000644000000000000000000000206112247657030023327 0ustar rootrootDIV.delegation { position: absolute; top: 0px; left: 0px; right: 0px; bottom: 0px; padding: 0px; border: 0px; margin: 0px; } DIV.delegation LABEL { white-space: nowrap; width: 100%; } #delegateRoles { position: absolute; top: 5px; left: 0px; right: 0px; bottom: 0px; } #delegateSelectorButtons { margin-left: 5px; padding-bottom: 2px; } UL#delegateList { position: absolute; left: 0px; right: 0px; top: 40px; bottom: 0px; padding: 0px; margin: 0px; white-space: nowrap; overflow: auto; border-bottom: 1px solid #fff; border-right: 1px solid #fff; border-top: 1px solid #909090; border-left: 1px solid #909090; background-color: #CCDDEC; list-style-type: none; list-style-image: none; } UL#delegateList LI { clear: both; cursor: pointer; height: 20px; margin-left: 0px; padding-left: 24px; background-repeat: no-repeat; background-position: 4px center; background-image: url("abcard.png"); } DIV#delegateSelectorButtons A.smallToolbarButton { float: left; } SPAN.userFullName { margin-top: 2px; } SOGo-2.1.1b/UI/WebServerResources/mime-zip.png0000644000000000000000000000512612247657030017545 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/add-icon.png0000644000000000000000000000215512247657030017473 0ustar rootroot‰PNG  IHDRoUt;iCCPICC Profilex…”KhÔP†ÿŒ)‚´‚¨µ”àB‹´%>ЊPÛiµÖ‘qûÐ"È4sgM31™ˆHAÜùZŠˆ‹*âBºPp¥ ‘BëkQq¥"ˆB7RÆÿ&íL*V/$ùrÎÏë†USŽcE4`ØÎ»É®¨vèð€¶xU¨A5¸R†ç´'û}¦V>ç¯é·P¤e²IÆŠõ˜ø´mõýKbïëžöúžùúyo5.ŠFëŠlÀ[%¼Wòɼ“§æˆdc(•&;äF·'ÙA¾A^š ñ`ˆÓÂ3€ª6jr†ã2Nd¹¥hdeÌQ²n§M›<%íiϦ†ýF~ÈYÐÆ•­k€E/+¶½ ¬Z_±5Ô+û±-ÛϤ?¥vÜËlÙì‡Sª£¬éC©ôs=°ø0sµTúu«Tš¹Í¬ã™eÜ¢¯eaÊ+ ¨7ØÍøÉ9Zˆƒž|U p“sì_Ä.×?ˉ g"çÙnpåÅ)ÎèÈ9§]3;”×6ëúv­G+´nÛhnÔR–¥ù.Os…'Ü¢H7cØ*pÎþZÆ{µ°{òÉþ"ç„·{–•‘tª“³D3Ûú’»Éä{sO7¹×TÆÝÓ°²ÑÌw÷é³­8ÏEj"uö`ü™ñÕÉGå<$xŃ2¦o?–Ú— ×Óž<ž‹IM-÷¶êáIV¬3CñY~í’2ï:jî8–ÿͳ¶Ès†6ï64$Ñ…(šàÀEzL*LZ¥_ÐjÂÃñ¿*-$Ê»,*ºð™{>û{N ÀÝ2~¢qŒ4–#hú;ý›þF¿©ßÑ¿^©/4T<#îQÓ¿üqefYŒÔ(ãËš‚ø«m§×B–Öa^AO^Yß®.c_©/{4™C\ŒO‡º¡LMd<Ùµì¾H¶ø&ü|sÙšµ/Î>©«äz£Ž™¬~q6\ kÿ³«`Ò²«ðä.[/[¶à6Œ¢Y9 öO&FvÖÿ ¢qˆãÿ3ýçdøÏÀ ÿþ]C/†çñßÿþ'Â4ýÿý¯h:#Ã.&&æå0q&Qög06ŒÆð&LFÅådüÿߎá?cÿÚ%“Š`âØhªFU ÃæÚQ1:†óç4°ª’ºaIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tbtv_line_17x22.png0000644000000000000000000000014012247657030020636 0ustar rootroot‰PNG  IHDR&hwB'IDAT8c` Lš4é?1êhF]‚ F]‚ F]‚ F]‚ F˜KÙsÈ Á·IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/properties.png0000644000000000000000000000470712247657030020216 0ustar rootroot‰PNG  IHDR°çá»gAMA± üabKGDÿÿÿÿÿÿ X÷Ü oFFs0ÞP±c pHYs''”iQ vpAgH0nG -IDATXØ[leÇÿsÜÙB·;íJh‹Ð.ö 5Ð(¢ÐÊ! "{Qb!Ñp%1ñ„Dƒ ^™xc¢ rˆb£ƒ‹`Z´„V lÁR[Úív»ÝÝvwvÎû]¼ß8Û–~ðùÞ»zõÈ‘ßy§½}Á‚Gå¢vC(ôÑGmm¡ÐÎMM=väÈË/¯\YV&Š@Q@$’ɘ&0:*I¦ $²lš@&£i¹ ë¦™Ë CQPTÄó4 ,\XXHÓÀ’%n7ËÄtàûï/^L$Nœhoxýõ3göíkjúá‡ÿÛ€íÛ?þ¸£ã7Þ~; ?ùä‰'**D‘¦‡†¦¦Lèé‰Çu€š& ë†šF@,ð¹ôšFôN'ËÀš5‹  z<tvööÆb¦yøð?Þ¾½{wkëž=kÖ|úéLNf¦bË–ƒÛÚB¡wßmi©©ùòËúúÊJQ¤é+WFG5 ¸vmlLÓ€ÉIE1M@’ˆ§-C$IUó#`Í%‰\Ÿ©O¥dÙ0€k×"E2U5 à¹ç–-s»)ª¬¬¸¸ `óæXÌïß¼¹»ûζ¶¯¾êíe€•ã»v­_¿lY8¼vm]ß_PÐÑqÿ¾ª7nð|€éà–!Dog³T–‰ÏEÓtPUUÕu@ÓÈ\ÓTUÓ€þþñqI"÷›&ðüóÕÕEéºa˜æÆªºhѦMÇŽýõׯ¿ž<™N³–µµ‹<¸eKcc н½$E:;GFÅN;ˆ4 ÃÈO rlúz¿ŸçT*›Õu ¯olL–r¨Ó4 Ó Þ†}ýìÙ›7% \.Ž^zéé§+*DñÒ¥ÞÞXìÀB½kcy~ÇŽµk—,9z´²²´´°aNœ¸y3“’IbË“Š2·'5 ¨­õzYع³¡A§ž*+àìÙÛ·ãq ›•eU%WU@×ÉsºN"`Í­õîÝK§Õ«ƒAŸœ\®¶6™,/å•Ï?gçÍs88nÛ¶U«–/÷ù8îúõhTQ€ÑÑTJQ¦{,ßC3=iš¦iÀà`,¦i@2)I.0<œL* 0995%I$’dû¹™ëäË¡¡t:“®_L$€•+ƒA¿ŸçOjk»{·¥…mh¨¬,)inæyŽcY »{x8•d9›µBþà lX:mšÀ›o~ýu29û9Øk½Ù높¿ÿÞ×ÕÕMMÁ °ti PTô ¬Ïçv;55ºnšÐßOB¦(Ù¬¢LÏÑm`é­7®ÏWXÈq@ àvOAðÝwƒƒ€¢(ЦÍ^Ï%/A{=rˆDâq@× ©×[TätÖÔ°Çq ãñè:¹}|<™ÌdYV]Ÿ;Ul½ß_XÈóÀ‹/ÖÕy½Àºuµµ¥¥vyþæ› îÜTU–5ÍËͶç@.LM‘4 bÏ3 Ãx<,©!¤ŠdEd™lô0,ýÀ@&#IÀ™3W¯Æl CÓT•ì¤ëD÷ (j:¸¥§iÓdY;¤AØt:›Õõñq—Kh:—âqû 䇨šÛž" Y@¦IªÇìaºP”iZ˜n[OäTTätrœÒKÅbôÈH<žÉôôXu=EA4MQd0 U%ÕÈö % ˆaiy–€ÎêY(Ërè)ŠD’¦s¹™s]·õ–\´Èãq¹ìD"ñx&së}ûöÐP"qþ|"19©(@}}yyqq>àtÐ|Ë£Ó%Ùpæ˜ dKÎ0$¢4M¤5gÙêêÅ‹ý~`l,‘ÈfáበI:žÖ4ÃÐõÖÖ‹oÞŒD4­º:()JK‹Š!ìÁÀ€-­ÔšÑtýÄŸ hIŽ£¨\ŽRX¼ØïE ¬¬¤D®®»wc1UUŠ¢éÖVúܹýû7léèèé9qB’dY×PèÙg—/'åÎ=‘••~ÿüùÀ«¯®]»|9ÉlÒZ¹k׿ÍO> ø|Ä1GÓÀó,KÓ€ dAp8X((žš›W¬¨©2R~»ºúûÇÇkoß¿¿©itôŸ^(M¥$é½÷~úéòå¿ÿÞºuË–ÆÆòrQܰaÅŠª*àçŸ;;oÝ"‡ä´}Ür9 K&ÇOêèÈOš¦(€e†¦íêátPë:ÃÐ4MÛóU«êꪫŸO].àôé+W&&Òét:“Ù·oV7ÚßßÞ~üøÔ˃¡P_ŸÛ]PÀó--ÁàÂ…åpO ŽÆbMp–%Ÿ* cIbI œaϳ,Ã<Ïq 8D ÏsðÌ3uuUU@uuyyYÐÙyçÎØ˜aüö[OÏÈÈöíáð‡nÜxõêœßýý.;ö矦¹téÖ­±Ø¼yËnÚ´bEUU @Q x<@*•NK i¤úX@ù`,;8_²,°`Çãv«W74<þ8x½ÅÅÀ¥K}}Ѩi†ÃÝÝÃûw‡Ã|°nÝÉ“³ª2֯߻÷ܹP¨±qéRŸïÈ‘ææúú@@N’³ÑèÄD*Ü¿Æã@"15EZò>°"aåtq±ËUXhƒŠ¢Ë5>Éq]Âák׆†‰7îÝK$^{->p ¹ùôé¹øj€5¬¶Ûív:áÀ††Š ¯wÇŽúúŠŠâbž/)),t8Š¢(ê¬jêXlrR–îî{÷âqUýãXìøqIJ§³Ù½{ÃáC‡6mzø_ŠG6`.ƒ&—£é–Ò\57[M– °,Ãx½ÖA'_d±X4šLf³==ããé´¢œ?OÓš¦(­­ vpAg00ÎîŒW IDATxÚí\yp×™ÿõLÏ¥™Ñ­Ñ=BÇ Bg%@ÆàØkC‚+Žñ;xãM¥âdÖÞªu*ö:޳ÙÄ×’ØNœeco †€ §1‡@Bht¢k$1£¹ïyûÇã¥çÔHB •Ô~URëu¿iuÿ¾ë÷}ïI!„‚ÿ—›$übÝÈôû ä™]¯>õÑ¿û\Çìzp<ëúwËÍ~ÍåÏÊ~ Üg\Û²¬xöŸ¿ñÄzˆx^ Ž[è}¹Åò€çþû3Ÿ8 ùðÌ©¯ô> ·ænd2‰„_45ß<ñx|>¿¸zÏ0™¨6Uß2¬—OÖ=òÖ­ù7A$H‚$HÈÐùáà Ü=ýÇÿÇT¿U¯? &“Ë8ß³á»qQ(d2žrsÓÓ“’€nY÷Á¾Ç€ö·wþöÄÂ0oÛ´Zm6«•ö¸ähõø&ú¹Àý ϸÿS@²š/âk·Ûç €Ã‡_zéÞ{ädµ:%eáz³Ååòx¼^B¾þõŸüäðaÀvÜ‘áþößW4׉–~kÏÌ!ïvÿ¨­ÈýQŽ3ß,Y¢Õ óÄb‘ˆã€•+ËËsr¥2)I©¼Ùð-\¼^ŸÏã!Äl6›ÆÅ¿BðŸÏKé»<¸«× ”Ý_ü]})õ‹èù•áΞ3€X,Ò‹DÀgŸ;×Õx½^¯ÏìÛ÷ÑGgΰ»ýõó-©T*•H¨¡‰Å€ßï÷ƒ„ð<ÏSÓ›Ÿ$TÀÕ÷G=xÐÝ]òOåk‡Ãá°Ù€éóÓ_Î]ê?.骫+^*úðÀ÷ܳr% V+•2ÙÍ*‘ªYî‹—…ë¡g«Õáðx€>Ø¿ÿÌàgïœ>1|¯öï›ÖÌÿ9&á‹;:Ο'¤¼\§«¨z{ûû/_rÙŸËOÖ}ÿÙÍÙÀŽGþñ·÷™€þþÉI§˜™q8|¾›§€x€ÆS€6û[))IIR)PR¢Ñ(ÀÏßysû2àâÇï?±H˜‡ÃnœN‡Ãá,‹ÅbRª“-©€¥ÏVí| P*år©°ZN¯¡ÇÑQ  ƒÁ›|¬clEătl³¹\^/ PÐ÷µôÙª]?î¼ó‡?”J Ù´é—¿”ÉÙRñÖÃÉý„ì{¾óðË¿Žoâ‰s@¦Çç«Ün·Ûí8Ž~±·t|TH¥‰èI€@Àë|¾ññ®.`Íš‚žŽëê²Z‹[[Íf ®®¾¾ªêÏx,Ðñì–.|>Þ|jF‘¿gûö»ï~æ ¨H¯ÏÉÜnß{×>ü_Ù¿lîE%¾ãyz€b\aMÚ ÷÷ÅÅEE¥¥€¢GîV|<÷ܶmK–ÀÄÄ™3ÀC­__V|õ«›7¯_¬][ZêõW¯ÿù,–Úl´åÓóÁàü3imµÛwíNž´Xvîd2žW(¯Áßì-ÿÜ = ²lÙÚê­ÀÇ…Ÿ¨ÿXøZ|Ç|ZmaaQPY¹lYUàóù|>píšÉtípüøñãGf³ßäææåeeýyÎE=?|œ(æGz!4Î'ÊÁ 0—˜P“§¦›Ç;€;-·Yï²ÝÝ—.ÇKŽÕÎ×<¿ô¿ˆDb±X X,ÏÃä$ÇF£ËUX¬XQ_¯ÕÞ8àóU@"@ÿÇA‘–™ÑÄb€ÒS@*ü~BE6½}•- È—æJ %€J¥V+•À=§ÿNºñ2Ððå‡w¿ñ{àÅŸ~ú¡‡ƒ¡·×dT*­–@¥Z8è±ÑéòòT* ºº¨(5()ÉÎV©€”¥R"¤Rž‰‹…²0“Én÷x€ÎΡ!‹8¾¯ïÚ5zÞë¯A±Ñžªˆ?ÉsœLH$"‘\NçÍ…t$T@<T^§³Tê›ÃŒÚc?MÚ……Zmn. ‰D¢Y2O¤¥k4J%pß} ùùÀ’%R™˜îef&'ËdÂQ¯ÏËKN6mjl,( ¤¥åÒ%£øÃ>ûlxðx¼Þ`pnžÀqBŽa"sœT*(‚zÉ"(`¾,ÈX ŠL–«W/]š™ lÞ¼jUa!UÇq\ @m¯«ëêU‹èî¾zÕjÆÇÍf§ðzýþ`P«årž 23“’€+JK32h3M¡à¸;ÉɪªŠŠRS ùéOwïîì<#QˆTÃ𼊂A Xü‰]î_-° CO_߯‚¦B¦¦ÎXPiiI‰NOs3ðÊ+ÎÌ ˆ÷‚«VQà·lY³F«,½§gtÔj%d×®'††€ÉI‹ÅíµÐØ9¢­mpÐlöí;{vdX¹R§ËÌ$dË–¦¦¢"@£II‘Ë9î‰'6n¬¨ äÅÿûŽZÏø|ñïÌnßÁà"å€ÅfAñ "­6++)I°x&§NõôLOòÞ{'N ÒO£gK¢§O_¾<5 NNÚíÀŽ_übe%!Ì3|píÚâbB^ýÀË—c+€‚rse²ª* °P.ÏÊl6gföòÇd݀Ǥ€¹³ Úœš™ñzyèë£,hbÂå*(–/¯«ÓjãóíM›V®,(`ÝTŽ3ÆÇm6Bš›ˆžŸž®VËd@SSEEV••œ,— •øÑ£F# —K$b1MÞÉÉ€Ëåõúý@KË¥KÀË/ïÛ×Ý <õÔ—¾TSCHCƒ^Ÿ™Éqû÷Ÿ;72BÈà Ñh· Êr@d’õxöìùùϵº¼Ôjzþ;'¤ùÒ“$¿:Gˆf]™o{½àÙ‹Æ‚ž{î©§¾òÚ+2™¥²° ¤dö‡%ÙÒÒœ•Jˆñ¿ýí'Ÿ „² ú]¯ÏÏW«Çÿüç—.¥+n±º«V•—k4„´·ÓÔРÓedpœÉd³y<„9ÒÖ6> cc6pþ¼Á0= Ô×ët™™@SSe¥F LLØl‚'‰DÂ{„EŠÊ[o}æ`õê[n©¨Îûý^¯ýMàÂÝìøöÀÆW†í!Ÿ»á^T @£ãààÀëÑó€ÐSaЍ©Y²$-M¸Ogçð°ÅLO[­n·ð¢r¹T*_ûÚºueeðLa'NtuMNräH{ûÄ„ ²úz.##ö»…†Â³g¯\™ž®éõyy))±*âð [¸—Û}ä :ï¾+Åb©T¥|-Þ-yô3$T@ rÇaA"< 0»»¦&­Öé‚A›m|ho¿x±»;:ètyyÌ]àÂ…þþk×¢çÕ×—•ed*•B!‘ßÜ|ôèÀðöÛ‡÷õÑq?ð‹_ìÝÛÓƒëËåÂ|+¤ØýGF¦§á9²²RRŸoq…Xd%L×¾9N.=Î^,Z/H&3›/\¶nݰ¡¬ ضõ‚Êʼ^`ttdÄhŒî.¦¦ÒŠÉääÌL¨å³ùK–h4¡E³ü“'»»Æð^ !”žÎÌFãÌŒËÝ4MΌՄÅób1‹õ¡=¤x…@+`€ãŠP̾6ñ`A&“Ïdggggf†¾Èu__ìfbµº\¡ô}©T”×3±Ûé<ŸòþH8Øçi̲³SS)0ìzøs¤§«T¡ H¡44Ra±ÀqÔ˜„Bì†0WÄqŒ¹Ýb1ÐÛKYÐø¸Ã‘ŸTW×ÖDÓE§Óíöûää¤$‰P(¤R±8:ù:^oha£TÊ塞¯³”pÛîÕ×ëõ™™Â¬+WFG-–X´™ÜèÄqá!ˆö¼³) ab,ˆ­…F² ^ؽÛlx^«½ýv`lL"©®d²œœŠ  ¨¨´´¨ˆ6ëD¢pW&„®œÑž ZE{ÀÐÑh³…X/sÇ­XAsC$PZmV–Jäæfd$%E¿S—^ŸŸŸœ ÜrKeeNŽp½¥¥½}|<ñÍ\d¶m9‹Ú b,(íÿsǹ¹¹¹ÙÙÔSB0ÆÆ¬V ˜R)°¢Ó§{z¦¦„ûž>}ùòô4íåhµ„Èd‰XÌq>º~½NäçÓý:ß6,_žŸ„e2ʦydÃŽÖÙÙ€DBÕOêê2 ik '¡žÛ¡@B+t‚ 5°y{À\YÇ> ™L½½Àm·•”Ðq8&&€ÎÎŽŽžžh¸pÖ LêêhÏ&=]¥b¡ƒz íj¾õÖGõö²%(bãÆÆF­–ã¶lij*.æ8µš†´¶¶“I€J¥’Ë%Ž»ãŽÚÚ¼<Ž£À‡_¼8:JÈë¯øa$[ 5°È1Ž“HJJè±¢‚++ŸÏížš$·IßWºàsï9ííÀÃßu—N'ô‚q»››×^;tÈj***+—.BKOmª v;!ÅÅÙÙ*ÇmÝzûí%%„üìg{ötu ó™gf³Ë¬[·|y^!99ii `6ÓfÚÁƒçÏŒyyÔ3ÒÒ”J©”òúúÆÇ­VàÔ©ÎN£¸zuzšV¼±“.œã»¾L|¾7ß|ùe ­­¹9޲ÃÒÕÒæü¼Ou†´Ñ[Wm¯ç¸„»"l#v»m„Æ‚Ò[R¥‡° ºã-š ƒÁœ<ÙÖ64?>8¨V••µµË– –‹wìØ¼¹ª   Ž;t¨µut”ææ––¾¾èBn¡ . mQ8´5ϲ#-Ÿf2 ºº¸8#xãßýîÐ!àĉ'Ÿ”˼<&55G¿ßí¶Ûö=õPsïÎÍvÇ- bÑÝlf,ˆî#s8rr€òòÊʼ¼ð }1æ »v?>0|ùËk×–”6ÔÕåçsœF“šªPòöÛ‡÷öSS¬^ˆ:V³Ž†*`Ó¦U«ŠŠ€5khÒݱcçÎO?XV"ÄST0h0¼÷ šLᬋŠX\^¾mÈwí¹^oYÄ^Ðw¿ûøã_ø044–¥Ç÷T kdëày <ÝŽ:“šÜ=`î,(ìéi›XXs»ßy‡² › Ðé–.---‰†Ž¢=„ÙÚÚÛ;=Ÿ­D7»eÏ}>åAÑu°H$•RúI ?JË ÄVO¼9‰çÅúm±ÿ‰… ±8\SSSSSS€R©T*•„Ðcâ| °¼©fÊïöúñÞiÀçóÝâëœÿ¾ œœœœÌÌèŸ ‰%:Æ/ì~ñg³@í›çy^,®šL&“ÉDÿfŒõ–!D¥R©TªøŠH¨žã9žÖ¬nܾÖ|Vx6ãÓ4àèı‰£K÷{ÞÝþWi@‰»Ýç“H„1¶/¨®®¡A«¥ `¾XÐü%…õ”èçIo*ÎKê§Óét:‰D"‘H™L&“É…B¡P(¡ï­ˆ„ `MÌ‹y> ¨ìY6\“X†,Ëyàͺ;ÿ Éý‚rXu¡á•e?jk‹ŠÄb ¶vnÎ-°Ì]ë~‘³ÜnÇçNÜæ‡Ýÿ¬û×å{s^D߉D3=e¸Åɾ‰ÚÑL\.—Ëå"ÄjµZ­VÀf³Ùl6Àâ´úm"àG÷½Þõ2pôÅöw'>8u­ðµÎ²¿a¿ötõÙJà±»îKªRÉÉÉÉ* V«Õj5''3ˆ¯‚yÿ«ë q8(-¥Š¡ìõ K’ìø·&,„²£T*•J¥ h–„Y(Jœ„oøŸu°dÃ’žÿÖ„çyžnC§ `ã¸ô3ü#ÄÐÌ+íIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tab_right_inactive.gif0000644000000000000000000000051312247657030021617 0ustar rootrootGIF89aÕ(îîî>yŠF~Ž—·ÀL‚’F~=yŠ®ÅËD}ŽÑßãÉÚÞÊØÛo›¨j–£Ößâ~¥¯Y‹šªÄ˸ÎÔtžªÅÕÙAz‹GÇØÝìíîa‘ŸT‰—ëí턪´¨ÂʶÍÓ€§²ÙâäæêëP†•˜¶¾ƒ§²_žäéê•´½ÿÿÿ!ù(,h@”pH,Q€Ásl¢ãlB£À j¼—è,Œ±° Jj6 D%¸rR¸TóP N€PV†'[]Œ_‘’E’WdœP&w(¢W (A;SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.sun.xml.calc.png0000644000000000000000000000670712247657030024345 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW RIDATxÚí[{lTUÿÝ;Ï;3vKiJ[Yp¥P }ª±¬Ê+k+`²Æ³‚<%qcb"f…#D¢n6 X#Ùè&+""-…N[ÛeyIŸØb§ié¼wÿ8ž½wî£óhKIôKÚ;çœïœ{¾Çý}ß9÷\†çyžçñ+M±S=_:ýj€)&m¢¼^¯×ËòüÅY—NÕ~ôý½ßاø;|ˆï‹æ%Ц pcÁÞDö3ôéor´×Ó²m#Àl~ÖfÏæôÍÑæÍ FƒÑ`d˜»¡l%bçÎÕèÎøxþÁGç LGÆÏýfê‘’ßøý< ƒ~?088448´¹Ú:n€¾ÓÎOœ_ógÌ+~­]PùÐs˲,ËÞ=96ÀI맺ïãùÊáÕgD°þ~ áùHŽ'”ÉUøü•–Çæ“¶GóÉëI-Ëj4, ˜Íg±Çq&0000àtW.]9ûß! r,¼Àc–?ÿx9ÀE¸™|C$‡Cÿþx;Ã0LlÅÓ²ô—ºp´E™#º•aä5B ‡Ãá004är ==½½·nÓ¦M›–ž,~$Õ’LÀüGsg>·}á>õ0àðô»&??LØ‚ÇÅR´2tÏècù›´M¬x©A¢¯Ä V«Õ^¯Ïçõ]]]]@JŠÙœ’Ì}à‡“dÌá²ÿ|eÿÚõï Àitº>y†H8Ë‹ÔìÞýÑG/*Bé—¼¿šˆrãÊ9Åõê@þÓ'¢ `Á»°Z­ÖÔTášÙ9£;« `ϳ}ìà«·¿.9ý°’¯¸ùÄ«<ŸÎÜ—7}úÄASš@ªÞÅ‹—.]¸P®„ææ¦¦Ë—ü|ÚÝ“–¤|jPOj€ææ¦¦ÖV`ñâ‚‚… –ežÒÓF¿øé'§³·ÈÊÊÌœ9HжÙl6› ÈÛ1÷¯yÏgþóõµÓVàÉßþ.gÕ ÏÛXk·ßIAÔÑÁP7ÖXã£ø”‰D" ñ<Ën·Ï ‘úH0™8ÎlL&“Ébìv»Ýn²ß¿*Ûœ¾yæó/£ÑÀèø%H ‚ÆR4õ85jnnl¤í £#¨‡‹Ÿ“±ø¤³ó2 ÐÒ=^( …B@nnz:ÏÏððð0°råÊ•O<pœÁÀq€ßObFÆí×€Ñö;áюչΟ{ýQKŪ»h9‘òœ9Fcg'PVVVVR"UPSSSS[ TVVUUV*ŒS_____ÊÛi¹¡Ááp8€eË–-+(ˆž•8 mlllll–.-(XºT¸# Æ>Ÿ×ëó­­­­­­@mmmí¹s€F£Óét€Ùl2™Í@JŠÕj±¹9y‹s-@ó¢ïú[J®KÝÓ;¯ó|öŠÙúû³‡¤$ Hꉱ'ÚË¥:þǘfDâ Hž%EßG«Õh´Z@«%ÙÍ–†e5Àãq»= »»»»« ¸zõêÕkׄ žÛ“Çç| 4¶lhz-ù¹'AjÊ%†©©©©¹pAIñ„êëëë/]Š­v‡ƒxx,jhhhhhˆž‘_SSSSSS4Ï eY†aY ££££½‡ D…Báp$BøB!àÖ­îîîn ¢båÊŠ  ½¥-§}=Ðû]ïw=<Ÿ¹$sIVAüOÂfA„ÊÊÊÊŠ‹åõÔ0……Ë—¯X!çɤ5 …aÕ×*,Œnó76,[¶l™\jj üüüüü| ¤ W¯×ëõx€ÖÖï¿omz{{{oß2×gý%ëà‡ž›oý 2‘¹$+¿6“‚ D "ï/ýM½%9(’î? ë`ñ/1ÄD_)‘= @¯×ëõz‚ý&YX­@FFFÆŒ@jjjªÕ dgggÏž ÌîœÙ5« èy³çÒ­Ó‰Ï?)RR­C9‚b‘‚Ææ‹Er¨JžOcÒÒl6» ¦ìý™áñøõ9!Y¸UÈ‚¢I A˗˳v:ŽÃA …BXjxªxʧ†ºR>5’ò©Þᨯw8„'Èh49ˆä‡ à ׿lE$>ù/Ý»;p YMt?–o\€¤dù(` ÀF K§Óëfì uš—cCñp5r¹FF§ÓéìïêOž¬®þì3 ªê™gž~ÈÉÉÉÉÍz÷Ý#G„z5~§³¯Ïé”×Sjhhllirsɸ”Nœˆæ·ÙäH •œú“xpôè>Ìóë׿ðÂÆ sëVOOg'ÏWWWWúilª¬¬¬/Ä!ȯƒ:|xíµ]»víJ\ cø}bj{ã7ßܽش饗6n²²f̘5‹aÞ{ïÈ‘ƒyþÅ7lØ´)þ4t² ±mµíay–Bþªª*+W¯z<øî»ï¼£ÐÑátzÞ¸  ¤þXà#MiI)ÏC¸zz8‰ð<`³Y,c)Ôï'Ћ/qœ^¯ÑrŠ!Hª—»ƺ‘°¤ŒÙ.\¸P[«Ô“pçääääåÉ ›’ÂqZ•ÙNæBŽ3Ä÷•®èãÕ‹%AÒ=‘²²òòÒRyºB.----/W ±äoïÞýûCPZšÉ¤×+ÍFé|Üød×Z­F#ŒM!hûö­[_~9¹{‰i·£•=^m= nc¬t—’RZ މ+\'å8£Q¼p\·n͵,èƒ eákjjkÏŸÚ¤íj{A6›Å¢×'v~4YËg0ètÄcoòMI‰fArÅÔ•QŠÞu¡ü{öìÛ§A~øþûdWtjhÛ¶-[vì hçÎ{‚bQ|þ)… ­[‰à±=_}9˜È%ùÄ5t/HI/÷© M!H-}µÛÉ'úâC˜îF+BŸ{Žì×S¢õRÅIë©LÇŽ?NëÅ/Ž(ÿSO=ùdEy3cÆø ð±ýûس‡ç·lÙ¼ydžéïèëãyµ¼^\_Y()•żjõcØ!¨LÊ¡t‚O©^\NMµZÓÒæí·÷î}ë-žß¹sûöW^™„7bÁ`0 ª›+Ö¡]Aå3œ±Uú„I¹^ù¦xëåŸH)ÏGíŒ,9È¿KÇ4€Ïçóù| vpAg00ÎîŒW ð¾ úñ”H|¨*T!RU$â$¨„¬Ò ‘Ti»éÞÅæÎ/ìÛì=wù0vwvfo÷¼Ž#¥ét;³3³3¿ßü3³+Y–eYÞ•]y·;ð Ë»ì²ÄÃV0 Ã0dËú{qþ•×Oµ—VÒµ8`mY]«æ.KLßÀù™½(ë¥jÉë©)`Ï {ÔÜ&P²ŠŸ+€µñ釀T:•N¥%é^€Í)¬xíµ¿&Î6-ëá'wޤ<Æ¿[_’vo ¬´Zív«eYN§ÓjkkëëkkÀÂÆÂÛ7S@m®þ»úià¡ñÃyXŽ|ù‘gÞÿ@–eY–ïÝ8BðÛ‘ß'~³Ï²žùïÉöëd`++€iZ–il{všüÛ?{¾Ò´9ö¾»œ7ŸäÊr,&Ë€¢d2ÃÃ@&“Éd2Àêêêj½¼9ÿ柯®ædÀ±Ÿxöø@ÆÌ˜sç‰íz¿ìþºó2Û%I’úOÓì•xpô¿„û®$ysì;@¯×ëõzÀúúÆÆÊ pûöÒR¥ŒŽŽŽîÛ<ú‰ÇN”¯*ùÌð‡Ü)ý•O«wVï¬lì||š{Æõš_Þ]Ó]Ão¾±÷œÀ³„¸ÿ !±X<†Ñl išvë0<¬(ÃÃÀ¡™™Ù÷îÔÕõÀ™Ñsz ¨§ëéÿ¼µsD @€b‘ a)‘á¬×‚~À;óyô:‘H$âq@× £Ñ š±¾d³Š22LÜ×&€©óÓKS?Î|æÜGç~Ô­•›µZôD„Ž‚X œð:^^^ZZ^z=Óìvݵœ6š—v>ÅÙ¦Sch¾$y}\–eH$âñXÌÖª¦Ùë™&°¼\«--““…Ðn§Ëår¹0ý­C?˜þÀ» I@±X, ^€¼°‹®ý5Àn§ßúƒ]Q [­f³ÕšÍf³ÙšÍV‹ü“´$5›²lkÌ•+W®\½ ÌÎÎÎÎ΋—.>,]Zºtû–5qtâèäãÁ5!²(ˆÎHz¥i•Jµjkkûù$úçSÓâ&‘=yïð…:_ê”c±X,Òét:“††ˆ ’åXL’€­­­­­- ^¯Õj5`â¹ÉïM~¸qûæ÷oÄ€ LìGs $Ê!N•¤¨ð£±¼ŸS]³ˆ4!*aÛÌçóyWtwË| Àüççççü<\û™ Þ@‰=µÁ­T4ÍéØñ´@tÍ3[ýnÛY–$²ŽH¥’I`lllllŒhŠ,ÛÏß³'—6»ý›?¾[ùø mH-Ë©ür^Ħîò%êm3ñ³Üã ¦Ê|¬÷¡Þ#០rß±,bM«U·Õ âÂìE%6Ìd<¥R©T*Ùiúìd2‘H&íõxØçDb‚x-ˆøÍt:Àí€ËÛ ;&¿Ñ…t0ø#0A¢T*Õjµ ˜&»vCd_Ge°VúÁF¦ˆªª*«ápáK&ˆtˆµT*‹E>À¼-'®­„sÐ`Û&ˆ‚ÏÂV©Ø> çŠ‹ý.íÜÐ^¨ªªªªXvͱ¢×Ôi‰ãD´ß/¾9Ûžø0Å%¨lÛ‰fDµJwCÉž‹$1ÜþG’ÞÜ(µÁ>o°}ÑþsvÕÑ+gÇœàŒüÅ{SÁçþÎàÎñ+4@HÚØ>€®„YàX¿ûü;µ êœuÂHä&ˆ‚Q*‹DúŸåò}AзŒø>hPe‡Å%¨D±T«šV­@Ö|Àýf¯è¸Wnû«ÞÞªMo¹\.;5Àïh6ŒDb‚x ‹ªJ×nÀE3Û»žpì¿b|=ÝßÒ¶6&˜ >ÀšFwCÉÁG¿×F¼m‰\tÐ]Øqñóm PÕrÙÎám§ß3À{;³éÒ‡…uÞî<',À|"¢&À{2—~2€ b} «4 b6ñ3@íu@¹\.ÛOs mG"ÜŽö®ˆàäYLP0"‚®7Ü ó€çßgϤݭÞ&ÈÖ4ï:€?óý§½€‡ syóòi]§У×]ñEUÝ{AìLw¦£^æò}ïmþûENˆÅGªƒJ„&È-š¦išFÞ@#Q¿ KÀТ ããùüø8¯ý£%ö¨“={æŸE‹qÙUÄ »ê§î2áL’³g4ßùêWÐmb¿W"£ÄeÛííŽ5Ø òÒ< ýžmŸÂz=ù3×[Ž×v?Ÿ4, *¿èt:NG̳è¥]ï³¹vûýò½¯«‡Éw¶ï<ß “—‘ƒÓÓ—òŠže5F£Áóþþ+B1b"øžý‰ˆáÝ¿_h>Å©ÕjµZ­þDMe’4lnnnnnòä§¥¯ÑuwÚZ;í^ÈØ€¹—òÞ6l"Êç÷8ŒËôïó–`ÇiYò×ågåoº®ëúýÚ’¾ÔkY¢¯/…Ðw&é^Ž®ëº®ÿÞûž°øÓ·¥…½ÀÁ½F§öS wê„öþ üMiQº)¹羓û çõoë_EQÅÆ‘ŠZ!‹Åb1»ÁC'§¯^Î;[=} Ð×_Ö_̼Y0süý sò^× +Ò†´"ÝF¾1¢Ž$€#ÚûžŸ=(S'ŠŸøÿ·Ó¯ÃÔ†aÆÝ/å [#è ÔT=(’N§Óé4L&“É$Íf³Ù¬O¿GN¥R©TÊg³<茡Qœ~zä" ¡—Îðxœ|H !é‡Ip÷›üE݆—%ËIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-magicpoint.png0000644000000000000000000000635012247657030023376 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW sIDATxÚí[}PGÿÍÌ~±°»¬ÊÊJ`!‚¢Á/$ŠDO+±R•¤rI1ÆJ¦L™‹©Â‹w¹œw ‰1ueŒæ’ÔUÎxV>êê=/jü¡4*ˆ"FPX@#,Ëî»Ó÷Ç\g‡aÇ]–O=ßþÑ5=Ý=¯ßïõë×ïõ2„BîÑ;Ô ü¿Ó=†˜î0Ĥ ÖÀ^[×R[NÈ¿ÏìþøÛ4 £ªƒsnj¶ƒ“ ‚ „Vâ&„PûêOKãlã(ã àùû–>¶¬ ŸsÿÔÔ‡FÎ'lÞ2î#ûæÅ„<ýÃS†_þ ˆŠŠŠ2§Óéloï» è÷iéóQA‚Ï­÷ùäõAˆø^lOû ‚Ïwû~â¸ÿ÷” ÜnÚ´ŒŒÌL€ç»ºx(\ÿÎS…7m8øþºž]@FûÔÙÙÙét§N•–ž<9˜:}g\¡¼Ñ^£×¬Ü>è ¨«®«¶—òõ·ÿÜõåÀëõz½Þ›@o–~_MH Ó¡T÷výõúˆˆˆà7¯¿òÛ5k€‰I“ÒÓÃX É É¶É kµÆ–’››—´µµµ9¡ –a†aü%˲,û?€eÅú@íh)¾ó· FRµ’jd Ò~wKÛ…J&“Éd6ÇŽ>¬,ø d±X,11@BBBBBÃ8GddpÖ¨ †aXÖÿ̲,KJß+=Ë;  žÖË/t(+*™ÍfóÈ‘ c±TWÇÄ—OÈô†¤®TJ‘ ^ú,×||nÔ*`–í.`Ê— ø¿'‚ åC DDú ¹i‘–úJëC33ÁùQ†K´ý>& ”šH §©r‚ þöõá üüù‹ËÊzŠ@«Õht: %%))5•aV­zùå—^"¤©éƦ¦ÞÇb‰‰±X€Â·ß.,ô×û|¢{;dÒl¹€•€èM§”žžšš‘¡<ÞlÚôá‡Á¿'j6!¼ñá×|:éž1h(™œ@&¦7‚üñuëvF1B¯-ÊÊ;X¸0++1à8–e†Ñé´Z.8¿EEÅŇâr¹Ý.Wèó¤ãÏœ9cFvvOÁÝ÷–A Ðfئ‡®ñ^¯ÏG0yò¤I6ÀóOWðÕWGÖÔ;v|ÿ}e%°yóêÕùù„$''&¦¦7'';;/¯÷+Ž®jj¤‚gQðTáv0Nî­DêNºÝÇõë„TVnÛ¶f !ÅÅk×ff²gÏ’%KOÖ##µZŽ4­V­ÒÓÇ3ˆ‹‹‹³X€Õ«7m:xàyžï긌†|¥Ëç)}ŽAíS4TÉ[–õõû÷ò pâĺu™™€ÁÐÑQTLš›;v, VGDhµ€Ýn·Û턨TÇ0€^¯ÕªTbLE€›7ÛÛy°Ù¬Öèh@¯7¢¢€;©¨ð»€ß› vP4nwRe ®nïÞ-[€¦¦6n²³}4+ °Z““m6@£Ñ룣{ÚN•ŠãXV\*•4˜&ŽÎNžÒÓ““cc={ΜilÚÛÛÛû#8î|C;ô¤>íž=‡ãÚ5 ¶v×® €œœÅ‹gÍFœNèìlm½>6Ö?9EFêt*™™’2b„òoÞ¼uËãñ`4FcpþûË-ݰáÝwß{/ôI¿ DuuûömÝ ¤¤dd$&úO–€ÇÓÚ* °¬V+Š_ʺÓévwu;vìÞ}útðï9.Ï÷>Hª[J‰š8êŽÒMyÈÏrjn>{vï^ 1qþü)SB\®†ðz»ºÄ6 £Ñ§R‰Ï"íÚõÖ[=4444ˆý†ŠŠJJŽ!Äår¹:;{ß_§Óé""€éÓ§LÉÌ Ÿ°oxô™ç;:Z[µZ§3BÚÚD¿[ÔPBñz†W€×ër9@MÍÆóçõõ*•Z­ü%GÔø¹s·l¹tÉ_ß[œ“óàƒsæô~È5_šÈtäBÄÍÕh|>Ñ{a@¨×+n’ô$ÙÚj·ùù+W®] §Ñ˪T¢HÅ~,«V>ŸÇÓÙ ïØ±u+P_____Øl6›ÍÖ{û{ìØñã‡âv{ÊcÐ3BP«££­V .nÑ¢W_ÊË¿ûî›oÀf[°`˜ÄÄ @¯·Z€ãôz «à¸I“ž`˜ÔÔ'žÎžýòËM›€èèÙ³W¬T*½Þd3O&Søx<·7=ò \ „<±3¨Á8¹fÝ&ññóæ-_TW{<<þùæÍ@ZZNÎܹ€Ùœ–öì³ÇEFŽ%Úx§hm½|ùÌàܹ/¾xí5 ::'gÙ2Àlž9óÉ'ƒÁ`0µZ­V«û/šª$øPrÃ}É ôÙ ¥ H3HÒ÷ãÆ-\¸b`2¥§çç55‡}öpáÂöí›7‹#ˆþ;èT@DÄøñ¹¹@|üÊ•_ h4&ÓèÑâu˜¨(@ n+çzKòÌ™RøY^ßÛTå€ BN4c³¥¦&Ó3Ϭ_/Þ+*(ƒiØ–aü›+µñôd«Ñh4_ãM&£Ñl•;%~ý«PnW¤¯Ôoø/Vù/*Ñzé{µZ­V©ÄäµÙzN˜êhæ„%ãC½ÖBÇ6tŸ¼_cä§%˲,Jš —&Ç•oEˆ@( ^ÊÇ`ߊ4h|<Øæ#}/ 8Fàû@„ô_¸WI”QºlÝ x4”±0zæ~z5‘ƒÁ`0™ÂÿðÝF(*îiîª_h†vå~!ìHâï¯J.ž,-òB³à.õ´‡±#Y-;HjëI¶oônèp§ÂÂÂÂÂBB¦M›93#8}úĉ²2      `ø¯Í;þâ%XƒA<'Ðç;…ÄñÀ€¸¡ƒAUçªÎ]òR_õªÝlß¾m[U=°Õ5Õ5U'INLNL™9ŒMQ(îÙp*Ýmî6!äͱ룟EHK‹ÃÑÜLHmm]]u5!=ºo!üäOï¼ñBhû¡æ[©ö&ˆˆ?Rz¥ì›3Û ù¸þÓýíÈRáapãÆO?55ííô/S¢K!\¯×çŽ5=[@3"6j0ý鵙ˀøU÷Å$¼\ÿWãMGøÈ¸§l/øßÓö´?ý÷äÒ¥K–,_Î0-_µli9Ôw¾C••óÏ@)% ºwð—44PÁ©S9½å¤¸|ùÊþê÷Ãâ(«q 09cÒ›³ 4ø“哆·y–gy8÷÷Šg?\î?» @ÂäûÞHx˜¾zÚÊL>|¾år‘ß §|ô¸M>ܸS)\TÝ/ŸÒx{ÏÛÍJÏ÷H$%9Û †|¾[)ÔMø¿M•T:6<ÐIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tb-mail-file-flat-24x24.png0000644000000000000000000000336412247657030021767 0ustar rootroot‰PNG  IHDR°çá»gAMA± üabKGDÿÿÿÿÿÿ X÷Ü oFFsx=[9b pHYs''”iQ vpAgðH8àaZIDATXÃÍW[hSY]çÞ&MÒvŒ™ÄŠÚF+U˜q¤#¨”V(Vý­ˆˆhqmñc˜ôk,ý?||Šúá«"VPDÓVë“6±iÔhsóhn“Ü{ΙÛ>Ô¤ó`öÏæœ}{µö¾ûü/eËÚÛ—-[¿žÎ ùñGB!Äç8æÎúûK††>ìèPJ)¥ÔédŒ1Î9gŒRÆJc `L×ÅZì3F)¥ùqãú‰qc-®Óu3ΰxñÊ•›6%“7^½ÚÒâó’œ9C@ÈŠ"Q€sÎ9÷ûÀíÛUUQTµ««D¼Àåš3§®nËBT5™ …UM$††]Ïå @’dY–Y–$áeY’¦ÞÏBˆ$M>c›­¢¢¦ÓiÀåJJ€{÷l¶ÒR›ÍåÊår¹\ÎÞÕVTD£MM¡Ð¶m¡P&c<§Ä8)«µ´tÆ Àjõx–.œNá³Ù±±X H&GF ™ŒÅ “QÕhôËbðz½^¯7_„È2À¹ÕZUüòË¥K[·ååeeåå.— Íf³Ùl.G©$QºeËÄÄÿ`P º>9ÒR»ý«¯gÞ¼ï¿7}&£ª±H(ÊÀHŒŒ Ùl:‹™÷sN©¦™kY¶ÛÝnàá÷o{z€ÁÁx|pðx<H¥R©TJ(ó›7{zöìéé …>u@%†@U /3›Íá°Ù›­ºzÉ ²²ºú»ï€`°¯ïÆ Àëýæ› L '+X^¾<}°Ûív»ÝŒµ"¬¯ïKy”EpžN`*“$3P(‘‡ææóç››LF×' p:N§3Ÿ1Î9 9xpùòööåËO§us]_±B2%Di<þ÷üè(‹E"OŸªúñ#ÐÖV_ßÖ”•••••>ŸÏçóuuuuuu€Ûív»Ý&‹Åb±XÆ3–oœÂùîݽ½{÷öö>.Eü÷0–N‹ö¨iÀë×OŸ^¾ ¬[WSãó UU @ ųË9cœŸ:å÷·´øý§OÿźÁ甊♮g,›(Õõ\дl6’ÉpøæM µuõê}û‡CÓ Çð/%Î9çÏžqn³q¾{÷$ÙElt‹é{΀ dlLQM~ð8r¤©éÈ D¢Q@×u=¿û50^ë›7ûý;wúý“ÛŒd~)u]Ó¦ï9gLñĸ¨ª##Ïž³g‹n·ÿªUû÷‘H$‰˜ e2™L&ˆœL­Š!ÉèŒQªëÓ÷¢¼ÄÉkšé †Ç‡†:;¦¦ùóW®,hlEQhl\¸°±1›¨õO3À¹ rúžsY‰ŠÀôù@)Õ´±1`dd`àÒ% µuÕªŸ~êë½Þúz µÕçûùg‹¥Ðâ.ɾ¦újb.2µojzü—ذ\ntôý{@UÃáÎNàðáµkÿ¸~ýܹŽÑ `± ¼P#Äj9SŒUU@<¾{gjß0ÆûÜsGG‡‡{{‹%— …€W¯º»»º ÏcÚ ”––—û-ðèÑ­['NЉ¼z8‡ÃTVΚ5kVáϼ9~ÍcãÛY!È20<çO,óçWW/Z”ŸØÔš €Q+E T ç¼8!Äbc°Ãaî»\NçŒÅ„0£KÍ¥ºÎØÇ}}¿yãr-XPSãr )|¾wïÞ½;<̹ {ý:|þÜXOý§6þOÏŒ ‰| P^þþý“'••oߦRµµ»v½y34¤(¿ý6wî¼yNç×_×ÖÖֺ݀Õj±Èr~ú’dµn·Ç3{¶®·´;vñ¢Õ ÷ïÏÀtMZ³æÐ¡;wtý‡ÚÚNžloUÕTjÑ¢`0ˆFïì¼qãÅ MëïïïÿðAôqM`µŠ+¼éý &nìØqèÐ… ±Xs󯿞=»w¯ª¦Óº¾tiOOww8|õêµkׯ¿xƒß¾]¼fÿi#ÅÞðÇûömܸnÐìÑ£ŒQÊy,và@GÇ•+ ÿ5€?,¨¬>±çB½IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.ms-powerpoint.png0000644000000000000000000000635012247657030024655 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW sIDATxÚí[}PGÿÍÌ~±°»¬ÊÊJ`!‚¢Á/$ŠDO+±R•¤rI1ÆJ¦L™‹©Â‹w¹œw ‰1ueŒæ’ÔUÎxV>êê=/jü¡4*ˆ"FPX@#,Ëî»Ó÷Ç\g‡aÇ]–O=ßþÑ5=Ý=¯ßïõë×ïõ2„BîÑ;Ô ü¿Ó=†˜î0Ĥ ÖÀ^[×R[NÈ¿ÏìþøÛ4 £ªƒsnj¶ƒ“ ‚ „Vâ&„PûêOKãlã(ã àùû–>¶¬ ŸsÿÔÔ‡FÎ'lÞ2î#ûæÅ„<ýÃS†_þ ˆŠŠŠ2§Óéloï» è÷iéóQA‚Ï­÷ùäõAˆø^lOû ‚Ïwû~â¸ÿ÷” ÜnÚ´ŒŒÌL€ç»ºx(\ÿÎS…7m8øþºž]@FûÔÙÙÙét§N•–ž<9˜:}g\¡¼Ñ^£×¬Ü>è ¨«®«¶—òõ·ÿÜõåÀëõz½Þ›@o–~_MH Ó¡T÷výõúˆˆˆà7¯¿òÛ5k€‰I“ÒÓÃX É É¶É kµÆ–’››—´µµµ9¡ –a†aü%˲,û?€eÅú@íh)¾ó· FRµ’jd Ò~wKÛ…J&“Éd6ÇŽ>¬,ø d±X,11@BBBBBÃ8GddpÖ¨ †aXÖÿ̲,KJß+=Ë;  žÖË/t(+*™ÍfóÈ‘ c±TWÇÄ—OÈô†¤®TJ‘ ^ú,×||nÔ*`–í.`Ê— ø¿'‚ åC DDú ¹i‘–úJëC33ÁùQ†K´ý>& ”šH §©r‚ þöõá üüù‹ËÊzŠ@«Õht: %%))5•aV­zùå—^"¤©éƦ¦ÞÇb‰‰±X€Â·ß.,ô×û|¢{;dÒl¹€•€èM§”žžšš‘¡<ÞlÚôá‡Á¿'j6!¼ñá×|:éž1h(™œ@&¦7‚üñuëvF1B¯-ÊÊ;X¸0++1à8–e†Ñé´Z.8¿EEÅŇâr¹Ý.Wèó¤ãÏœ9cFvvOÁÝ÷–A Ðfئ‡®ñ^¯ÏG0yò¤I6ÀóOWðÕWGÖÔ;v|ÿ}e%°yóêÕùù„$''&¦¦7'';;/¯÷+Ž®jj¤‚gQðTáv0Nî­DêNºÝÇõë„TVnÛ¶f !ÅÅk×ff²gÏ’%KOÖ##µZŽ4­V­ÒÓÇ3ˆ‹‹‹³X€Õ«7m:xàyžï긌†|¥Ëç)}ŽAíS4TÉ[–õõû÷ò pâĺu™™€ÁÐÑQTLš›;v, VGDhµ€Ýn·Û턨TÇ0€^¯ÕªTbLE€›7ÛÛy°Ù¬Öèh@¯7¢¢€;©¨ð»€ß› vP4nwRe ®nïÞ-[€¦¦6n²³}4+ °Z““m6@£Ñ룣{ÚN•ŠãXV\*•4˜&ŽÎNžÒÓ““cc={ΜilÚÛÛÛû#8î|C;ô¤>íž=‡ãÚ5 ¶v×® €œœÅ‹gÍFœNèìlm½>6Ö?9EFêt*™™’2b„òoÞ¼uËãñ`4FcpþûË-ݰáÝwß{/ôI¿ DuuûömÝ ¤¤dd$&úO–€ÇÓÚ* °¬V+Š_ʺÓévwu;vìÞ}útðï9.Ï÷>Hª[J‰š8êŽÒMyÈÏrjn>{vï^ 1qþü)SB\®†ðz»ºÄ6 £Ñ§R‰Ï"íÚõÖ[=4444ˆý†ŠŠJJŽ!Äår¹:;{ß_§Óé""€éÓ§LÉÌ Ÿ°oxô™ç;:Z[µZ§3BÚÚD¿[ÔPBñz†W€×ër9@MÍÆóçõõ*•Z­ü%GÔø¹s·l¹tÉ_ß[œ“óàƒsæô~È5_šÈtäBÄÍÕh|>Ñ{a@¨×+n’ô$ÙÚj·ùù+W®] §Ñ˪T¢HÅ~,«V>ŸÇÓÙ ïØ±u+P_____Øl6›ÍÖ{û{ìØñã‡âv{ÊcÐ3BP«££­V .nÑ¢W_ÊË¿ûî›oÀf[°`˜ÄÄ @¯·Z€ãôz «à¸I“ž`˜ÔÔ'žÎžýòËM›€èèÙ³W¬T*½Þd3O&Søx<·7=ò \ „<±3¨Á8¹fÝ&ññóæ-_TW{<<þùæÍ@ZZNÎܹ€Ùœ–öì³ÇEFŽ%Úx§hm½|ùÌàܹ/¾xí5 ::'gÙ2Àlž9óÉ'ƒÁ`0µZ­V«û/šª$øPrÃ}É ôÙ ¥ H3HÒ÷ãÆ-\¸b`2¥§çç55‡}öpáÂöí›7‹#ˆþ;èT@DÄøñ¹¹@|üÊ•_ h4&ÓèÑâu˜¨(@ n+çzKòÌ™RøY^ßÛTå€ BN4c³¥¦&Ó3Ϭ_/Þ+*(ƒiØ–aü›+µñôd«Ñh4_ãM&£Ñl•;%~ý«PnW¤¯Ôoø/Vù/*Ñzé{µZ­V©ÄäµÙzN˜êhæ„%ãC½ÖBÇ6tŸ¼_cä§%˲,Jš —&Ç•oEˆ@( ^ÊÇ`ߊ4h|<Øæ#}/ 8Fàû@„ô_¸WI”QºlÝ x4”±0zæ~z5‘ƒÁ`0™ÂÿðÝF(*îiîª_h†vå~!ìHâï¯J.ž,-òB³à.õ´‡±#Y-;HjëI¶oônèp§ÂÂÂÂÂBB¦M›93#8}úĉ²2      `ø¯Í;þâ%XƒA<'Ðç;…ÄñÀ€¸¡ƒAUçªÎ]òR_õªÝlß¾m[U=°Õ5Õ5U'INLNL™9ŒMQ(îÙp*Ýmî6!äͱ룟EHK‹ÃÑÜLHmm]]u5!=ºo!üäOï¼ñBhû¡æ[©ö&ˆˆ?Rz¥ì›3Û ù¸þÓýíÈRáapãÆO?55ííô/S¢K!\¯×çŽ5=[@3"6j0ý鵙ˀøU÷Å$¼\ÿWãMGøÈ¸§l/øßÓö´?ý÷äÒ¥K–,_Î0-_µli9Ôw¾C••óÏ@)% ºwð—44PÁ©S9½å¤¸|ùÊþê÷Ãâ(«q 09cÒ›³ 4ø“哆·y–gy8÷÷Šg?\î?» @ÂäûÞHx˜¾zÚÊL>|¾år‘ß §|ô¸M>ܸS)\TÝ/ŸÒx{ÏÛÍJÏ÷H$%9Û †|¾[)ÔMø¿M•T:6<ÐIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-ascii.png0000644000000000000000000000526112247657030020033 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW ð¾ úñ”H|¨*T!RU$â$¨„¬Ò ‘Ti»éÞÅæÎ/ìÛì=wù0vwvfo÷¼Ž#¥ét;³3³3¿ßü3³+Y–eYÞ•]y·;ð Ë»ì²ÄÃV0 Ã0dËú{qþ•×Oµ—VÒµ8`mY]«æ.KLßÀù™½(ë¥jÉë©)`Ï {ÔÜ&P²ŠŸ+€µñ釀T:•N¥%é^€Í)¬xíµ¿&Î6-ëá'wޤ<Æ¿[_’vo ¬´Zív«eYN§ÓjkkëëkkÀÂÆÂÛ7S@m®þ»úià¡ñÃyXŽ|ù‘gÞÿ@–eY–ïÝ8BðÛ‘ß'~³Ï²žùïÉöëd`++€iZ–il{všüÛ?{¾Ò´9ö¾»œ7ŸäÊr,&Ë€¢d2ÃÃ@&“Éd2Àêêêj½¼9ÿ柯®ædÀ±Ÿxöø@ÆÌ˜sç‰íz¿ìþºó2Û%I’úOÓì•xpô¿„û®$ysì;@¯×ëõzÀúúÆÆÊ pûöÒR¥ŒŽŽŽîÛ<ú‰ÇN”¯*ùÌð‡Ü)ý•O«wVï¬lì||š{Æõš_Þ]Ó]Ão¾±÷œÀ³„¸ÿ !±X<†Ñl išvë0<¬(ÃÃÀ¡™™Ù÷îÔÕõÀ™Ñsz ¨§ëéÿ¼µsD @€b‘ a)‘á¬×‚~À;óyô:‘H$âq@× £Ñ š±¾d³Š22LÜ×&€©óÓKS?Î|æÜGç~Ô­•›µZôD„Ž‚X œð:^^^ZZ^z=Óìvݵœ6š—v>ÅÙ¦Sch¾$y}\–eH$âñXÌÖª¦Ùë™&°¼\«--““…Ðn§Ëår¹0ý­C?˜þÀ» I@±X, ^€¼°‹®ý5Àn§ßúƒ]Q [­f³ÕšÍf³ÙšÍV‹ü“´$5›²lkÌ•+W®\½ ÌÎÎÎÎ΋—.>,]Zºtû–5qtâèäãÁ5!²(ˆÎHz¥i•Jµjkkûù$úçSÓâ&‘=yïð…:_ê”c±X,Òét:“††ˆ ’åXL’€­­­­­- ^¯Õj5`â¹ÉïM~¸qûæ÷oÄ€ LìGs $Ê!N•¤¨ð£±¼ŸS]³ˆ4!*aÛÌçóyWtwË| Àüççççü<\û™ Þ@‰=µÁ­T4ÍéØñ´@tÍ3[ýnÛY–$²ŽH¥’I`lllllŒhŠ,ÛÏß³'—6»ý›?¾[ùø mH-Ë©ür^Ħîò%êm3ñ³Üã ¦Ê|¬÷¡Þ#០rß±,bM«U·Õ âÂìE%6Ìd<¥R©T*Ùiúìd2‘H&íõxØçDb‚x-ˆøÍt:Àí€ËÛ ;&¿Ñ…t0ø#0A¢T*Õjµ ˜&»vCd_Ge°VúÁF¦ˆªª*«ápáK&ˆtˆµT*‹E>À¼-'®­„sÐ`Û&ˆ‚ÏÂV©Ø> çŠ‹ý.íÜÐ^¨ªªªªXvͱ¢×Ôi‰ãD´ß/¾9Ûžø0Å%¨lÛ‰fDµJwCÉž‹$1ÜþG’ÞÜ(µÁ>o°}ÑþsvÕÑ+gÇœàŒüÅ{SÁçþÎàÎñ+4@HÚØ>€®„YàX¿ûü;µ êœuÂHä&ˆ‚Q*‹DúŸåò}AзŒø>hPe‡Å%¨D±T«šV­@Ö|Àýf¯è¸Wnû«ÞÞªMo¹\.;5Àïh6ŒDb‚x ‹ªJ×nÀE3Û»žpì¿b|=ÝßÒ¶6&˜ >ÀšFwCÉÁG¿×F¼m‰\tÐ]Øqñóm PÕrÙÎám§ß3À{;³éÒ‡…uÞî<',À|"¢&À{2—~2€ b} «4 b6ñ3@íu@¹\.ÛOs mG"ÜŽö®ˆàäYLP0"‚®7Ü ó€çßgϤݭÞ&ÈÖ4ï:€?óý§½€‡ syóòi]§У×]ñEUÝ{AìLw¦£^æò}ïmþûENˆÅGªƒJ„&È-š¦išFÞ@#Q¿ KÀТ ããùüø8¯ý£%ö¨“={æŸE‹qÙUÄ »ê§î2áL’³g4ßùêWÐmb¿W"£ÄeÛííŽ5Ø òÒ< ýžmŸÂz=ù3×[Ž×v?Ÿ4, *¿èt:NG̳è¥]ï³¹vûýò½¯«‡Éw¶ï<ß “—‘ƒÓÓ—òŠže5F£Áóþþ+B1b"øžý‰ˆáÝ¿_h>Å©ÕjµZ­þDMe’4lnnnnnòä§¥¯ÑuwÚZ;í^ÈØ€¹—òÞ6l"Êç÷8ŒËôïó–`ÇiYò×ågåoº®ëúýÚ’¾ÔkY¢¯/…Ðw&é^Ž®ëº®ÿÞûž°øÓ·¥…½ÀÁ½F§öS wê„öþ üMiQº)¹羓û çõoë_EQÅÆ‘ŠZ!‹Åb1»ÁC'§¯^Î;[=} Ð×_Ö_̼Y0süý sò^× +Ò†´"ÝF¾1¢Ž$€#ÚûžŸ=(S'ŠŸøÿ·Ó¯ÃÔ†aÆÝ/å [#è ÔT=(’N§Óé4L&“É$Íf³Ù¬O¿GN¥R©TÊg³<茡Qœ~zä" ¡—Îðxœ|H !é‡Ip÷›üE݆—%ËIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxReminderEditor.css0000644000000000000000000000226112247657030021361 0ustar rootrootDIV#windowButtons { position: absolute; bottom: 0px; left: 0px; right: 15px; height: 3em; line-height: 2em; vertical-align: middle; text-align: right; } DIV#pageContent { padding: 1em; } TABLE TH { font-weight: normal; text-align: right; width: 5em; } TABLE TD { text-align: left; } TABLE TD.label { width: 11em; } INPUT.textField { margin: 0 0.7em 0 0; width: 2em; } SPAN.datePicker INPUT.textField { width: 6em; } /* Days selectors */ DIV#week, DIV#month { background-color: #fff; border-top: 1px solid #fff; border-left: 1px solid #fff; border-right: 1px solid #999; border-bottom: 1px solid #999; } DIV#week { width: 210px; /* 7*(28+2)px */ } DIV#month { width: 140px; /* 7*(18+2)px */ } SPAN.week { clear: both; display: block; } SPAN.week DIV { border: 1px solid #fff; cursor: pointer; display: block; float: left; } SPAN.week DIV._selected { background-color: #4b6983; border-color: #4b6983; color: #fff; } SPAN.week DIV P { display: block; margin: 2px 0px; padding: 0px; text-align: center; } DIV#week SPAN.week DIV P { width: 28px; } DIV#month SPAN.week DIV P { width: 18px; } SPAN.week DIV:hover { border: 1px solid #4b6983; } SOGo-2.1.1b/UI/WebServerResources/UIxColorPicker.js0000644000000000000000000000045312247657030020506 0ustar rootroot/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ var type; function onLoadColorPicker(event) { showColorPicker(); } function onChooseColor(newColor) { window.opener.onColorPickerChoice(newColor, type); window.close(); } document.observe("dom:loaded", onLoadColorPicker); SOGo-2.1.1b/UI/WebServerResources/new-list.png0000644000000000000000000000245312247657030017560 0ustar rootroot‰PNG  IHDR°çá»gAMA± üabKGDÿÿÿÿÿÿ X÷Ü oFFs5¯68 pHYs''”iQ vpAgH0nG‘IDATXÃÍWÍOMÿM»mÓF»-D Eª­Qz2ñŸðæ`ähâɄˋA=xð¨‰x0‘Ä£á€Ðø‘Ú–ViEQŒUwî²Ý™÷0·ßß¼ïËs™}fæ™ùýæù˜‚mÊýûÏž}ýZ. MUcŒ1€1Î98wÎÆ“­wu1óVývœK]¬ß8nÛŽÃØ¯_Êv B ª/ž=Û߯tµã¼þKêÍ­øb¬ÞØ/Ú›7 Ú³gïÞöv'ëö  ýn»c"Æ)mÜX€Êf³Ù\Ð4]×4w<?t(‘z{ûúúû;jM¨žH­'þÈ”ÊE¥²¹iÀ—/kkß¾5(‹Å• îéÚêtâÍaÌq²“ê˜×Ë9çœÒ®z´Ók¶«Bµ‰Çã€{€'N Žº>|òäÅ J•ÝV]nßž™yóH¥††FFÜqÛvaAH]í¶ê"ñd2?æóÍðkªÐn«.ÒîäÉDB%p©K¢Ê®­.Š×[ Üã‘DZ„Ðn«.Œ>ŸÇS ¸Ñ²ÈüÎjU$‰\h}½RÙÚ*ð¬f`–U­rX¥µ@r¹|^ÌkEõræL29: F"píÚ¥K§Os¾²²¶¶¾ÌÌ<}Z(p^.kÚÖVmsÆ4M‘L\ b£@ TUT¤”R—À¾}½½==¢¿Ön|<‘H&»‡’lc1U€»w§§ùù?æç¥¥÷ï—–&'3™‰‰LæêU´Ef³$P*ŠÄã‰ÄÑ£ÀÛ·¯^-.>ŸßCC‡?ÞLüÝ»R©PhåÖ2>>88: ÌÍ}ÿ>7¤Rcc©!¦I©i^¹’É È'¹µeY–äóÙl: |þüéS©˜¦%Dzxùraáùs`xøÈ‘T Ø¿ÿÀÁAàØ±x|d¤9f“P¶RªUJ«UÀ0 Ã0DZmÇé~/ýÎ˲mÈå2™L(•–—?|p·R¿?t76ÍJes( …tˆÅb±€U¤ à÷ Š}¾V@(!* PjÛâH; ¹uëñã|žÒsçNJ&Ež™Ð\ºl½ÝÀ@4 wî,,LM³³Ë˳³"äj/ÐpXUÃa ‰D"yïp.ÊwíõÊç¶].ÿüY.ÿõ¹qãÑ£\®\QvúWéô¢rœÖ/*QU¹páÞ½óçh´¯/­Ÿ?‘ÕÕÕÕÕÕ¼Ðv%‘˜œL$®_WÕpXU'&!„7ƃÁ`0ôzC¡P("D„ç¦iš¦)ÿƒdq°m]__×õ©©ÿŒ@7›ž£TUUUUE×u]×m;¾|9n7àù¿K‘I»Ó$Þöƒæß'P­RjÛ¦ ˜¦¢H½›Ý®ñ€¸¦¦ Ã4 ccCêÝìþÚ<ÙT ‰ wIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-font-ttf.png0000644000000000000000000001161712247657030023254 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWIDATxÚí[y\”Õúÿξ13ˆl"W!Dd©4Q0l¹-H^ïïWWË2Ë6K­®Ù¢¶˜¹d.™¶—fW£Rð*FŠ""²Ï Û,̰ ³¼÷·Óà˜¼¢Ôí>ÿœÏûÎ÷9Ï÷ÙÏ9 Š¢(ŠÂÿh„ˆ9Ò üÑé m æ.Šš4顇>ý”¢ÈóH3úßJ â‚úúúûívŠšóåËõ߯úý9(¸m¬LÄ_dý=tÖóŸÏå²Ù ÆH3~9¢~¦Ò²²gÇ>-0H“E_Åíaš ­è_dÝnÝ~x<ðEàFV\PìG@Vâ=áw«š4ÁµNU—º³ÙDQçKªÎ7Ê\Õ6õ& éGå]ªé@c{“°Q 4å)+U 0èØÃGW.§_xa뎵ÇOQT¥õý®·€ Ýã׬ΉªŸk^ Œ^èñ ðêÃóŸKžüÛ€üà‰Ü¦¼MÀÎ[wùí½Óû²{s€ÈȈˆðpÀÏO¡P(&“Íf2вÛ ««§§»hnniioÊ•ºªàÉÉg-ŽdRY²ÏÃÀ ë^ÊZ™ DD„‡‡…žž^^ ðù|> |>ÐÙÙÕÕÙ èfê›;§»Óv|²íîËË‹q ö¸¥®ž¢6žú¦ |x!ζ`±X,&p8§8QâU÷:°xò]©Ñ¯³Ã’?+HðŸ”ï¸Þ½RÁ¯ÝýÖëoïN,9µ˜»#ëƒ{¶õõ õõ€Z­R)•Q™ÆÏ”ëÛÞ–Ÿ_vìùf sü¬»3’þ `2™L&ƒ±â±çv.½Ÿ¢n-LžµðwØüíY@DDppP ÕjµZí¥ÏçÓ1Àh4;;I?ÆÞ8 à=Écó†¬üfxkÎ;×§…}'K =€;d( (õ?#wi"‹Åfs8@ͨ†fU#°¶iuõëÇÔ ”»“³‡n±±@,3AÕAŸŒy…¢(?êªèêêíí,‹å×€¦&µº¥˜½(sõí¦¡¯ó7ÀÇ›>ÛÿùfŠÊï:¶3ŸÜyçìÙ·ÍΔŒ>£LF“ÑhD"‘8·£jkÝNàÅ‚åõËßRƒR‚¯Dðîä=ZZè ب~tWº\š{Ç€Á`0 €Ïçñx<@¯×ëF unJJò¡ï7S —”–/Ë£¨kvfí|¸í¶ŒŒ™3ŠŠŠŠòrz:þyzJ¥JÕÚ Ü[zÏË÷l2’gÏX|õ1ÊqƹÍѰÙl6íÛ æ¯H‰Ç£ßÝÝÝÝÛ 1‚: ?¡¯¯¯ïÐùq ­†V£‰¢žÿrEÒ‹v }Ñô•ÓÖ--ÍÍÍÍ@{»FÓÞxyyyyy==½½}}€Ø(Qz~,ºaኇ>~ºº·vë]ha§c  …B! × ò|êwWþ½à­9ëϽ{ë }<è;zP[[WWSp¹\.— ˆDb±Hœ_\=¿þa`Õ®—öüýÀar˜æðeg-{Z?iÛˆD"‘HD» ‡Ã%x„@@û~Î`0›–'G%K~G8}¸øEþT4ãä€ óܹªªsç\óär¹\&ÚÚÚÚ´Z -wúÛÓË?ý)2rüøá¼¥ÇÒcé¡(sš¹Ê̡ǣ Q‡Ã%x‡Ãápú €q/3ˆ}CÊ•÷ºa’w¿>åÔ7Õ@ÊŠÉ/%¼¨TtÕ×××××…"‘PxxˆD@ÃëÊ9åÉÀ:Çë2‡Ÿ¯2ÝÙ’òý@`àèÑ `³Ùlv»ë÷K]OG‡Á¤Ü”tß)À, ÓÙ+ýîu·€C…yÊÛû¶¬þ/h …@KKKKK‹KÓär™L&TªææÖV`Öû3y3þø…ù…ùІ¿ >>ÛûeÞWÛUª*R™$'O™2y2PYYYYU5@ ? ž¸’•µ·Ó5© ’ÙW“v^wš Ü­ú  éÒÝáp:íöËç×V+½³$qHz$Ò«ÿ~ÅÑÊÊsŠÚÒþþá­%Àý÷geÝuÐØØØØØH[$É÷ žðG¶fMšžíš$ŽMHIHÿ`zÓÄ1EÑm[‡vÀ¥¦ÎçÓ®€àé!'iøÏ¿KöŒŸxç)ù3?÷³²CÿE+€Ó —•]Úõ$|‘¤@¯7Ìf n|ì‚= d Ù®ËõWŸ©)©£¨wžÙðýÆbŠêh14š‡~Œçšàp:œ'EõuY¬³éö€Æ‡»ÆN'EÑõ@&“ÉtåßmÕ·Ú µðÁÇ>^<˜uSÆgSëéôÖÇøúë}ûrr\f2™LÀ@…àñx<>èè ›m‰û²Ê\ß©)ªmª;IQ‹º—t<©´]¡æÀŸ#²~˜ó¹‹€Åd1YLƒ9‹ËŒðþg“v׸ÎNzÇ),,$$8(ZR¼¡ø„+_§›be·Ûív;EÙl6›ÍFQV«ÕjµRÔ)mÑÓ‡)jî»ÿø@pK|jïäx 44,,$øöÛœœC‡\õ…BA§Ãë ÁçÓà›à?'~±«i÷´réèçôÀCeVÿµÈȘ1#- `Äã+äšNJ[9¸œ®¹ 5Y¾IþW:ý´Ùh“çp.Õ8µZ¥jnbb&N¼áàûå¹å¦{÷~£úFEgG&“kTÕ«5j °nɆ'6n–Æ-»ùL`nМMw}„„„†¹¹¹¹GŽgÏVVž?ˆÅb±‡ÝThIÚI|>‹0™´¢X÷Ùîµ'r_™B6X¼å©Ÿ> Äœy=ê4àççëëë ¬[·aÃÆÀ¬ééòô 6dâĘ›FpO˜hl´ì†£>ŒF£IÀÃ^¸Óét:ô\°Xh P©”J• x¤ço>ódÀ»v½³k=ðå¡=ܽ{\ÿ¿}¾æNÍ~àïÔQ‰àé÷žúò‘=®46///ïèQ þ†Æ½ªÀœ´{2ïÞ œú¨ØRTF¶Y.¶D€n7³ÙôÆÕ pnfNcÅ‹^[²ëÉ °Õ¶_:pszJJòt`ÿþrr±Sü¸—xüÉEq.ºœ† €‹]Ýεـ©Æ›97ýxGù®rÃZ 11!!6–¶VëÅ…œ?_UU] „‡<ñÄ¢E &“ÙlÞCôð4H¥`Œì`™Ø@MMMM}=PZZZZQè6jŒÏh–ì}¢(ÜpêÃ"1 Ñíd§ób×Cvx€¿¿B1j¼:è ^:ˆ½5vZL pøð?ÿyäPõ ‘µv`û‰-ÒÍ«p€¬¢Øl:öÑ–u©E\5ûdòìã&MŒ˜pª¹\^>Ðn0˜‚éºÀÓèììì$çl²W__WWW455665Ñó%€Á FNì±ÙL&› œ9sölEÀì`ø±Oî_ðÀü{ «Ÿ ôè{í­Ø"Öt‰ €@l0 z=’’’’˜è Ú?üpèPn.pv~…¥J ¼‘ýZö«+‰@¬+€þþþþþ~W¥OFz#‡âZ)“ĺÜ,BîóHptÿÉNÑð%«Û¸¨(Ù^¶¬òIWLðñññ‘É\ $Ašd'Ä'@Ùl‹ÃŒF“ÉbrW}¹àU`L] !è6`îÒ¬´{·v‰ÍÇæãrmÒÇ=·JzèBÏhtm)’˜D¾Ëáp8\®ë½FCïI8ðÝw ûUGµÍ¯ÞñÊ@€ÌßÛßÛµ^2^N.DnD®¿œ Ýt”>:YýëgCOÒgC›JŸ Í " v¹wÍwOžKJJÊ Àú#6×£„ò§¤_AAcÆÐAR,vG %­–>ÛYW×РTR»×x¯J ==1}?0æÆÀŒk¡¿hØÏÕFµQmÀúŠM·méüMþ/(Šéîì˜1G÷ù-–®®înúŒg[P3©6¢~ªH±¥ìæ…eÏÊ> xxyx‰ú][”ÄÕÑý½û3ie\õéh‚è幑¬:t$¯æp;ðSiáÇ…I€r¡zfó&€µ‚¹„ñàwZ‘¨è—…?ijbÓ':À)²™ (wÁ»Â"·È-rà‡õ¹i‡gå««"Ï KåÏ]üN*|•@|Bœ,¶¸Õ8•qËBÀ/Ü×ß×ÿRA&x÷‘œÄûÅÜïd¿Aß°&Ò÷x'éûŸ/Úýˆ ‰IºàþÞÝ„/gÊ쪕{ï‰<»ÒNúýÀÄ@HÆ‹ƒêå}ñïÿæxº;ãäFÌ}3ÿ¾&g?ðÕ¡—ŸÏ¼öö ñô¸òîéB&hw_€+¼;îáŒ;ƒâÄ•vIC]Àµ"ÐP?Ø8ƒƒ1\mèß tºf­ˆo«Ž¿WßÅÒí¦¬¼ñ˰!´aÿhT¸òLV]Ðo\Ðõ‰ëÊ×ÿ,àÑu³BÄǽöèÇeEe@Ñ” *ÍÛ€a›)·'sä.ù]o"Áû!¯Â ¡0bŒâi`Å{ó&&L¼´¶ Lþñ+;ÿ–Ï`<–|‡6úÍ‘ÇÈY?‘Çå:ÿ«F˜Fü†Ìþ‘`p<°‹°"IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tab_span_inactive_bg.png0000644000000000000000000000230612247657030022134 0ustar rootroot‰PNG  IHDRÈ¿f²±;iCCPICC Profilex…”KhÔP†ÿŒ)‚´‚¨µ”àB‹´%>ЊPÛiµÖ‘qûÐ"È4sgM31™ˆHAÜùZŠˆ‹*âBºPp¥ ‘BëkQq¥"ˆB7RÆÿ&íL*V/$ùrÎÏë†USŽcE4`ØÎ»É®¨vèð€¶xU¨A5¸R†ç´'û}¦V>ç¯é·P¤e²IÆŠõ˜ø´mõýKbïëžöúžùúyo5.ŠFëŠlÀ[%¼Wòɼ“§æˆdc(•&;äF·'ÙA¾A^š ñ`ˆÓÂ3€ª6jr†ã2Nd¹¥hdeÌQ²n§M›<%íiϦ†ýF~ÈYÐÆ•­k€E/+¶½ ¬Z_±5Ô+û±-ÛϤ?¥vÜËlÙì‡Sª£¬éC©ôs=°ø0sµTúu«Tš¹Í¬ã™eÜ¢¯eaÊ+ ¨7ØÍøÉ9Zˆƒž|U p“sì_Ä.×?ˉ g"çÙnpåÅ)ÎèÈ9§]3;”×6ëúv­G+´nÛhnÔR–¥ù.Os…'Ü¢H7cØ*pÎþZÆ{µ°{òÉþ"ç„·{–•‘tª“³D3Ûú’»Éä{sO7¹×TÆÝÓ°²ÑÌw÷é³­8ÏEj"uö`ü™ñÕÉGå<$xŃ2¦o?–Ú— ×Óž<ž‹IM-÷¶êáIV¬3CñY~í’2ï:jî8–ÿͳ¶Ès†6ï64$Ñ…(šàÀEzL*LZ¥_ÐjÂÃñ¿*-$Ê»,*ºð™{>û{N ÀÝ2~¢qŒ4–#hú;ý›þF¿©ßÑ¿^©/4T<#îQÓ¿üqefYŒÔ(ãËš‚ø«m§×B–Öa^AO^Yß®.c_©/{4™C\ŒO‡º¡LMd<Ùµì¾H¶ø&ü|sÙšµ/Î>©«äz£Ž™¬~q6\ kÿ³«`Ò²«ðä. vpAg00ÎîŒW°IDATxÚí[{lGþvo÷v÷^ñù|¾ØNÎöÙŽ]Ç&U¨Mj7 ÔTý£P}„´QТ (›Ò(‰@¢éCB B©M›6qÇmš„RZêG'1>¿Îw·÷¾[þ†ÝÛÛõÝ¹Ž #æfvgwæû~óÍoË(Š¢( > KØ¥®Àÿ{øˆ€%\¹âñx<Î*Êéý8ù|aR r€Q2J0ÿ^"mÆ7—ì-d9!hý@=~wX©¬¸{eÐlàšÚADAd˜ÅÛ(0åŽÇŽà_K(Ê ›ZÓ"àC5|ÿ.Ï0K×}H&S©dRQÒét:™¦§gf¦§¡ÐÐ¥A™øíÄ+@ÛòÖ 7°@ǽíŸï¼`Y–eÙÅkGÙüÆõ;þ×UŠòùÙϦ¾8A69 ärŠ’Ëúç©i«?Õ^izîûô×óï+Ì'¹,k±°,`·K’Ó H’$I055551ü½ÿﯿ?䎀EØü\÷Ÿè¤œ”“rןˆ²Ç€ì/2/¦Ÿ&ÖÎ0 SxšÖÿ3o½b|GþU†)ÌQ¯Ùl6›Í33¡Ðä$píÚØØ•+@eeeeU°öÖu[××öívŸdþä~IþÃíÀTl*6ºþþaÙ¨W hãûóKæ—˜ËÞô×´Àë É ! Çq'ñ80::::28v»Ó ´47¯YåüS ’ÿÏÀ«•GC/ßLˆâø?®ó  b3 ÑSbF†¶\1 НÍ׿Ñÿ<ÏóÈr<’ž138v»ËÔŒ,­½McŸ¯Þyt㑟Êä`0¸ðDÌà 5—#"TàõD˜7¦/HQÊžþã8ŽãyÀbaYŽÆÇ'&ÆÆ`·“Øív»Ýn éá–5}xí£¸€™ÜLnzzመ—ééІùùF}Á8]N0Þ8•ÿÏb!ƒ²ÅÂq, ¤Óét&är¹\.Øl’d·6›Íæp±¢²ð¯­ßê#ƒ¯ýé•N MESÑOļ$ÈXçó½šükÆå¦RÈÎÂ;óå)ÿŸ:4Ó1Ábá8Ò#,ê~‚ ¢H’ H`±0 ˾߰ï"P1\‘]öGàÔûB½½þyLÄ %(P=!fDAX ÅÒ¦µ„hëÈ0*à,Ë0 ðæ›o½ÕפR©T*X,<Ïó€Ýn³Ùí€Óér9@ ±imÀœï87ù—[€Ëý£Õ#ÿPÿM+­õþòÝÖè…þ¼4z!2¦Ò‚Þýœ+môŽS{Ç©^ð¬ÅÄb²‹oéòeàÂ… .^TÝÚÀµ&¥ñ8p~ú/_9û½ù´`Þ˜k&Ms•œ?ét&“É@r9 »ž"mŠHV‚,-ù’¤yH&“Édxï½÷Þ{ÿ} ¢¢¢ÂíR×R©Àع±s×Þ.¿% A´ùÿÌäCQŒ-“z5æ\‡ggc1àߨ»÷'?‡ÃnžzêС‡DQA}2¼ áµxIb@DQ—‹L,)Á™ ‰ãñx<"‘H$&&‚Á`¨ÙYûXm0pmð 5ëk³¥£¹`ó€Ò¯ëÿëUÚØA ‡ÃaYöïâ‰Ã‡;îøÌgî¸hmýØÇ:;Ç?xðùçD"‘H& -Þ,¦DÐùÕjµZ­Dûm6Àår¹\.Àçóù–/š›››››ÚÚººÚZ`åHÝåCÀµƒ×ú¯)͘ Ó@–#æ¦Êˆ„b‡Ã±þÙg›nêêÚ°hkkk[µ ðû›š ºº®®¾8pàС^ D¤R¥QN̲êãv»ÝÎD½áß/Å-ÞL~Ì€6–žÙYÕâŸy¸ùæîîööÕ«[[ññ©©ÙYÀé$–ZYY[»b IË–y½ù=b>DPǵðºêÖ2 ‘û,ñj¥]Œ€â¸,…¯)ÖeG"² <öÑøîî-[º»ŽŽŽŽÖV`z:’eµ<žZ¼“ü±±`0<§Ón\.›Mh4K& n¾yýz`õêÎÎÎN §çûßÏ'¢Ô1À¬,‘­µtµ!äGß¿ÿÀgž6mÚ²åÖ[ÎNøXLë&RKW×Z¾ÅB—H}<·Ûá¶nÝ´©£ðû—/w»cÇúû/^l¶Š ¯¨®®©Y±‚ôˆÃ‡Í‰(€%’ 3 õM§3™løêWwïþá-[n»móf`íÚ5kÚÛ™2ÁbYx­…ë§ñÛoÿõ¯##ꢙ×KÈår9EÞzëwFF€ñqÒC._¾refFí 55uu+W>¸k×O¨ Òz\o *{&¬MaEÔž¡Þp™èx½UUn70; …BªõPí¦ÀéËÓ·d³™L.\½úφB€ÕJzDKK àóOE…Ýœ=KˆÉfÓél²¸&I‚ÀóÏ“rÑh$7ÜÐÖÖØHˆµXÌfí´¶Åq)5,ˆi‰0 ¨Å>ýôSOíÙ\º444< ô÷÷õ9d2(z_<žL¦ÓêóGFFG§§ÉÉééhh4M$Y&q4*ËÉ$‰´(â—-³ÛEhiil¬®Þ|³¯¯¯  û÷?úèÎ幡ú1`‰¼ ã bä'‚`µ>úï<ð088008¼ñÆÑ£Ç«§óçß}÷òeàƒ††ÆÇ‰tLMCCÁ jÑë×wvÖ×€ßïõ³³DÊD‘\w8ðÍÍ ÕÕÀ™3§OàEQQ€}ûöî½ÿ~u)Bïç—ê†Rã\„`&Aù{¶êrpþ ¬%‚ç >d2Éd4 œ}êÔÉ“€ÕJ,~ß¾½{·m+¾ØXö_ï™n–/Š´G<òÈŽ@*•LF"À»ïž?îÐÒB,×é”$AÐaµràóUU¹\êâpØl‚44¬\éñ§N8qâ^Q€oû›ß4¾Üù€~j¹¤TàfD¥é‘GöíÛ¾ˆÇc±ÙYàüù³gÏœ†¯p8$IµC§Ïolôû«ª€ÞÞÞÞÞ^²Ñ’Í?¼gÏ}÷Í|©î§Ù†ÏüÂHP~EŒˆ0œ¦éS2I–‘…¤¿þõݻロ¬ÿOOgÎô÷÷÷€=rÒM€x\–É"9PxüxoïÉ“ä‰ðÐC_þò]w‘A>VߓͷØ|Ì2^ï•iqY´1ÀèEfçç©ùt£#“!§R©T*™ ²óDR`×®;3 Ó§‰÷44TU ÄâßxãØ±'€ÑÑ«WGG;¶mÛº•œz À“çÒ=_ú~jå¿^ÐÇ‘±ÄlLÐzEF¤ÅeÑfÂÆTœ£4Ï[­dfJE]ºÈf3™tÈfIÏp»IÏ8tèÀ¯}M}*ÁÒUR‹…xEðùN !?À‚JP¹”\ï` ¼6¯#)—%õ‚J)9×ó㌅[Å>^2;£j¯Ci­ý¯“ ½at|Q›.|º±ýiƒJ„þý;ŒŸWÚ >£üù®ý…’{ñ§Íy6;´[Ø@ócês5ÔìûóO—òOm—š¯}þÜÀÂd~Q:=E H$‰DBQ¢Ñh4-¥ë÷æ& Ò×ÿæ– =ÐÅï3î4ŸâDæ'ʼn0• Ê$è„Ãáp8 °_`ïbvÐê=up£R'\ù¢¤–)ô:h“Ìòk\ìz©¡ÐÀ ïзSQØ]ìì@–eY©§¯‰û«(f__š@?X SuY–eYœ¿tz–áŸ^b†<@£§¡2à¥@/¶§³t?È 3ƒ àþ›û»î²Oþ–|ùÒÆnWq¤„èƒ)´¸Ð¶|¶éƒÖiàÕͯ]}å%@¾Qþ•|Èùru9·ÑÀ6?ï`±Ë•˜3ÉÄ×n—ßÅ£«¿²¦°Nê÷ÆÀÿç9Å*LÇ€x<Çÿý¥|\ítq‹JÕÿKEršš.i8‡Ã¡æÓï‘AÁ\JþP›zAúÕD3¿ú=PÁ¥®®mÑ5&Žã¸â’\ö—ò…… ÿ×Ò>(’IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tbtv_minus_17x22.png0000644000000000000000000000044612247657030021053 0ustar rootroot‰PNG  IHDR&hwBíIDAT8å“1NA†¿7³;C%¡0JLL(( Gò[x‹½€×ÀNoद RH$Æ}À&fß$Û`ÃßL2oæËÿçŸ*ËRÛœ;½Î̉X›OÏï Hs¬€(<>Ìêaf³+&ãú½HžÝ~ ž¯õ7/o‹?§mˆˆ Ñ1ì]6ºTN sOÈ›“ÓÑã».÷×nûÁ…§› 辬ckf98QM4{ˆS…$!ÄàY~þÔr'db×iÆÑJYo¶&`¹ÚÔqŽJT¬Ì_?ë¨òKe_;¹Îì·Ò¿8ÙöË?ñ íûÿIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/arrow-up.png0000644000000000000000000000031312247657030017563 0ustar rootroot‰PNG  IHDR /8ˆbKGDïðó·; pHYs  šœtIMEÕ 4èØltEXtCommentCreated with The GIMPïd%n/IDAT×c` lÛ6‘dMIusþcgħp^S #NÅØLDÖÀHÈjl6P.ǃ7sßIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tb-compose-attach-flat-24x24.png0000644000000000000000000000211212247657030023025 0ustar rootroot‰PNG  IHDR°çá»gAMA± üabKGDÿÿÿÿÿÿ X÷Ü oFFsH9!>Ï pHYs''”iQ vpAgðH8àa°IDATXÃí˜=hqÀïÃz~ ÕžD#U¡Ž‚.nŽ$™\\´¥ÅR¤…R ¥ˆíRi1[1“_ƒA»8 6d±ƒ:ØA¥j¡Ã?Ê©VÏëðr„ ½J“@ÿËñ¿û¿ÿ{¿÷ÞÿãЬ¹y½^¯×«Ñ˜L&“É´»+‰D"Ñö6˲,ËŠÅív»ÝnÿúÕh4F6Ë0 Ã0ÏŸG"‘H$R¯¯ª]—á¡P( ‘¤Ùl6›ÍÅâh4F:]³Ùl6› #ÁÙ™Z­V«Õ$ `·ne2™L&ÓéŒÇãñxl±Äãñx<~r²¬^l]V«Õjµ¾zÕjµZ­–N—N§Óéôñq±X,‹››>ŸÏçómn&“Éd2©TBD2‹Åb±X”J Ã0 {ófU½k …B¡p{»P( Ôxö,‘H$‰³3n\*•J¥R4 ½§Oõz½^¯ç¾nm]xT©‡ÃáA&“Éd2ùöí²ñ‡Ãápüøàó9¼½sçÊæóù|>ç@V—ãÛÖþàÿ ŸÏçóy†q»Ýn·{:]Ö\.—ËåV—[;À¢âe á+·vØen0ÀÀ€ë°¸&nÀbŸ ‚ °…ùQôÏq,{m ß¿+ …B pû¼¸Û„Ãáp8¼³3 ƒ†¡(Š¢h³ymz½^¯×Û߇ë4‚ ƒÁpx ƒÁàé©L&“ÉdŸ>ÕjµZ­ÆÜ?²,ß3|ÍÇãñÔëõz½þúµX,‹Å4ã8Žã¥R©T* EQå÷G£Ñh4º··ìÚ¹¬ ø ‚ß8Õ8~îÌï÷ûýþwïœN§Óé|ÿRI.ŸÍf³ÙìçO¸N3L Ž@Ï «ÕQx€ç(J*•J¥R½"pïWr†ÂènwQ^£Ñh4ƒ*1n±SÔªvðN¡ét:N?†‘K©V›åþýn·Û½À;:ZÕœ/€Íf³Ùl''*•J¥R=zÔï÷ûý¾Õj4Fc¿`_¿BñÎ0v»Ýn·„Ëår¹\Ëår¹\þöm¥R©T*)öða¹\.—˧§ËÚñ×E=ó/^$I’ä‡N§Óé (MÓ4MO&°ˆ»]‰D"‘HH¶Y‚¨V«Õj•e!/_Æb±X, ý³p-›Íf³Ù|^«ÕjµÚR 0žwïÀíÛ°ÿ#ìR_¾À_‹'OÀðh”¯þßÅÌØØ‚žPIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-unknown.png0000644000000000000000000000526112247657030020442 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW ð¾ úñ”H|¨*T!RU$â$¨„¬Ò ‘Ti»éÞÅæÎ/ìÛì=wù0vwvfo÷¼Ž#¥ét;³3³3¿ßü3³+Y–eYÞ•]y·;ð Ë»ì²ÄÃV0 Ã0dËú{qþ•×Oµ—VÒµ8`mY]«æ.KLßÀù™½(ë¥jÉë©)`Ï {ÔÜ&P²ŠŸ+€µñ釀T:•N¥%é^€Í)¬xíµ¿&Î6-ëá'wޤ<Æ¿[_’vo ¬´Zív«eYN§ÓjkkëëkkÀÂÆÂÛ7S@m®þ»úià¡ñÃyXŽ|ù‘gÞÿ@–eY–ïÝ8BðÛ‘ß'~³Ï²žùïÉöëd`++€iZ–il{všüÛ?{¾Ò´9ö¾»œ7ŸäÊr,&Ë€¢d2ÃÃ@&“Éd2Àêêêj½¼9ÿ柯®ædÀ±Ÿxöø@ÆÌ˜sç‰íz¿ìþºó2Û%I’úOÓì•xpô¿„û®$ysì;@¯×ëõzÀúúÆÆÊ pûöÒR¥ŒŽŽŽîÛ<ú‰ÇN”¯*ùÌð‡Ü)ý•O«wVï¬lì||š{Æõš_Þ]Ó]Ão¾±÷œÀ³„¸ÿ !±X<†Ñl išvë0<¬(ÃÃÀ¡™™Ù÷îÔÕõÀ™Ñsz ¨§ëéÿ¼µsD @€b‘ a)‘á¬×‚~À;óyô:‘H$âq@× £Ñ š±¾d³Š22LÜ×&€©óÓKS?Î|æÜGç~Ô­•›µZôD„Ž‚X œð:^^^ZZ^z=Óìvݵœ6š—v>ÅÙ¦Sch¾$y}\–eH$âñXÌÖª¦Ùë™&°¼\«--““…Ðn§Ëår¹0ý­C?˜þÀ» I@±X, ^€¼°‹®ý5Àn§ßúƒ]Q [­f³ÕšÍf³ÙšÍV‹ü“´$5›²lkÌ•+W®\½ ÌÎÎÎÎ΋—.>,]Zºtû–5qtâèäãÁ5!²(ˆÎHz¥i•Jµjkkûù$úçSÓâ&‘=yïð…:_ê”c±X,Òét:“††ˆ ’åXL’€­­­­­- ^¯Õj5`â¹ÉïM~¸qûæ÷oÄ€ LìGs $Ê!N•¤¨ð£±¼ŸS]³ˆ4!*aÛÌçóyWtwË| Àüççççü<\û™ Þ@‰=µÁ­T4ÍéØñ´@tÍ3[ýnÛY–$²ŽH¥’I`lllllŒhŠ,ÛÏß³'—6»ý›?¾[ùø mH-Ë©ür^Ħîò%êm3ñ³Üã ¦Ê|¬÷¡Þ#០rß±,bM«U·Õ âÂìE%6Ìd<¥R©T*Ùiúìd2‘H&íõxØçDb‚x-ˆøÍt:Àí€ËÛ ;&¿Ñ…t0ø#0A¢T*Õjµ ˜&»vCd_Ge°VúÁF¦ˆªª*«ápáK&ˆtˆµT*‹E>À¼-'®­„sÐ`Û&ˆ‚ÏÂV©Ø> çŠ‹ý.íÜÐ^¨ªªªªXvͱ¢×Ôi‰ãD´ß/¾9Ûžø0Å%¨lÛ‰fDµJwCÉž‹$1ÜþG’ÞÜ(µÁ>o°}ÑþsvÕÑ+gÇœàŒüÅ{SÁçþÎàÎñ+4@HÚØ>€®„YàX¿ûü;µ êœuÂHä&ˆ‚Q*‹DúŸåò}AзŒø>hPe‡Å%¨D±T«šV­@Ö|Àýf¯è¸Wnû«ÞÞªMo¹\.;5Àïh6ŒDb‚x ‹ªJ×nÀE3Û»žpì¿b|=ÝßÒ¶6&˜ >ÀšFwCÉÁG¿×F¼m‰\tÐ]Øqñóm PÕrÙÎám§ß3À{;³éÒ‡…uÞî<',À|"¢&À{2—~2€ b} «4 b6ñ3@íu@¹\.ÛOs mG"ÜŽö®ˆàäYLP0"‚®7Ü ó€çßgϤݭÞ&ÈÖ4ï:€?óý§½€‡ syóòi]§У×]ñEUÝ{AìLw¦£^æò}ïmþûENˆÅGªƒJ„&È-š¦išFÞ@#Q¿ KÀТ ããùüø8¯ý£%ö¨“={æŸE‹qÙUÄ »ê§î2áL’³g4ßùêWÐmb¿W"£ÄeÛííŽ5Ø òÒ< ýžmŸÂz=ù3×[Ž×v?Ÿ4, *¿èt:NG̳è¥]ï³¹vûýò½¯«‡Éw¶ï<ß “—‘ƒÓÓ—òŠže5F£Áóþþ+B1b"øžý‰ˆáÝ¿_h>Å©ÕjµZ­þDMe’4lnnnnnòä§¥¯ÑuwÚZ;í^ÈØ€¹—òÞ6l"Êç÷8ŒËôïó–`ÇiYò×ågåoº®ëúýÚ’¾ÔkY¢¯/…Ðw&é^Ž®ëº®ÿÞûž°øÓ·¥…½ÀÁ½F§öS wê„öþ üMiQº)¹羓û çõoë_EQÅÆ‘ŠZ!‹Åb1»ÁC'§¯^Î;[=} Ð×_Ö_̼Y0süý sò^× +Ò†´"ÝF¾1¢Ž$€#ÚûžŸ=(S'ŠŸøÿ·Ó¯ÃÔ†aÆÝ/å [#è ÔT=(’N§Óé4L&“É$Íf³Ù¬O¿GN¥R©TÊg³<茡Qœ~zä" ¡—Îðxœ|H !é‡Ip÷›üE݆—%ËIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tbtv_sent_17x17.png0000644000000000000000000000105312247657030020670 0ustar rootroot‰PNG  IHDROc#"gAMA± üabKGDÿÿÿÿÿÿ X÷Ü oFFs0ÞP±c pHYsN N }™Þ vpAgÀ ‘¾‡‘IDATHÇíT±nÂ0½s"Öð-HÍP±Е±¶®]º±!†°vªÔ1ý– º5±}×átµªT‰vè-—çsîÝ{Žð¿X×ëõÝÝÛ"b¿Ir¢ý>g&b.в¼¹©*cŽmdN‘bÍD1fV¯3§ë¯¯›ÍrY¹÷Þ{Ÿ6è¤D¡Q¼Îêñ ‹Åý½ì‘ê|~{k-€÷Îyɳµ§•ˆŠx]2³ªBf¡RLDÔë1#xomÓ¨ð/˜™Û6u n¤1Ñ9bÅU5›}|Äuçd°ŽÌÞ·íéFAiZWs¿»ß9ÁÎup®m›&(||Ü힟¥½Ź˜NG£² †‚£ˆr×8 g£i£Ó¤qm»}zªë€'“ëë«+c²,Ë‘ŒhLò èâ€N<‡ƒAúU«U"—V2¢1’•ðÖý‘2‰÷Îé-ˆ ‹§ ºƒÄJC=}_ysk­uîýýåeµzx(ŠïþÅ~rćåøþn|.Ü4kïÜúIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/add-web-calendar.png0000644000000000000000000000233012247657030021062 0ustar rootroot‰PNG  IHDRàw=ø pHYsaa¨?§iŠIDATH íUKlU=3ãOl×q’&išF"?‘´¥©ÒðQù”+Ô*b„Ô-UˆHˆR±Cˆ‹®º)P•¦¡Í¯BÚ¤Ÿ“&Nœø7öü?Ü7îLR V¬¸Ö›ûÞ}óÎy÷¼;ÏÀÿö pÞüa'*Ô‡Ž8ô884`=Ö®à-ŠøøñÀ´ëÍ oY€A«ü™Y3¨o²9ö{—ù³Jý{O~ÇèÁí´näæÀÆÔXŠÌûÆbþÅíüûÞèá /»+‘KÖHt¯Ï·c‡íz_¢3¯^Äø‰Q(F=[¦ S‚©Ä¼Fõ’„’sùšƒ•VðºTH@okm»R ùñݹEŒ6Pø–AÈd.(Ú¬1ŠUÓ«9Üåãc8ÒV|×3CXËKXÈÜFOóŸ˜ÜßÇ£‡O`ëæçç!k6©“vlƒF Nß-ôô+R(“HëZ…jw!ˉØÒø±QÂê¹i$ø‡ízÿ ,ÓÀØØFFÇ© l›Àðã¸+Ê·æt´Sÿ`óUìH "žèþ ƒ{g ‹Ä òU %¥Jܯ€û:MÖ%2I'&U6_ÂR¡ùå¤ÒI<Ÿ–Pb X*î†ÁåÀ 8ž§Æau«‚ó kÃ^~60Í]Ý© ™ÿåm*s–ÙM;Ü ðØaM[Æoy›ö3(­sE?Æ@ÿ+Öeª µ<‰™_AªÚ¤DôJ+ú½Œñ}®,lç ¼bÈZ8$ÃTe VY :8A‰Þ'°¨Šf.ž§‘Ë•éïaÐÇÖVDF›B$2ƒnÖ`q®,.C±W¶s¾qGB![ƒJÒé5ËÐÊú§ «!q3h¼‡z‹‡ñå% ëÒeªž;˜ÙÜ·eÂÞB$÷"ħ?wwÎÀŸk~ —2xóäSŸ?ýÊ{;XïžüÅþf\° {_×¹BÍîÍ kÇ¢jº²°Ï]¸‰ Ä`G_…0ò3øæëw¸Æ{üAª*njööp¦²²_sjB<ŽZ1ÕùH¥¬ÂVyœzëÙºúÊký;£1øoûGOŠ]±ÏJFîåf§å[+¯½>uzŠ>ŽÿÐþ3€_‘«Üp~IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.oasis.opendocument.presentation.png0000644000000000000000000000635012247657030030361 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW sIDATxÚí[}PGÿÍÌ~±°»¬ÊÊJ`!‚¢Á/$ŠDO+±R•¤rI1ÆJ¦L™‹©Â‹w¹œw ‰1ueŒæ’ÔUÎxV>êê=/jü¡4*ˆ"FPX@#,Ëî»Ó÷Ç\g‡aÇ]–O=ßþÑ5=Ý=¯ßïõë×ïõ2„BîÑ;Ô ü¿Ó=†˜î0Ĥ ÖÀ^[×R[NÈ¿ÏìþøÛ4 £ªƒsnj¶ƒ“ ‚ „Vâ&„PûêOKãlã(ã àùû–>¶¬ ŸsÿÔÔ‡FÎ'lÞ2î#ûæÅ„<ýÃS†_þ ˆŠŠŠ2§Óéloï» è÷iéóQA‚Ï­÷ùäõAˆø^lOû ‚Ïwû~â¸ÿ÷” ÜnÚ´ŒŒÌL€ç»ºx(\ÿÎS…7m8øþºž]@FûÔÙÙÙét§N•–ž<9˜:}g\¡¼Ñ^£×¬Ü>è ¨«®«¶—òõ·ÿÜõåÀëõz½Þ›@o–~_MH Ó¡T÷výõúˆˆˆà7¯¿òÛ5k€‰I“ÒÓÃX É É¶É kµÆ–’››—´µµµ9¡ –a†aü%˲,û?€eÅú@íh)¾ó· FRµ’jd Ò~wKÛ…J&“Éd6ÇŽ>¬,ø d±X,11@BBBBBÃ8GddpÖ¨ †aXÖÿ̲,KJß+=Ë;  žÖË/t(+*™ÍfóÈ‘ c±TWÇÄ—OÈô†¤®TJ‘ ^ú,×||nÔ*`–í.`Ê— ø¿'‚ åC DDú ¹i‘–úJëC33ÁùQ†K´ý>& ”šH §©r‚ þöõá üüù‹ËÊzŠ@«Õht: %%))5•aV­zùå—^"¤©éƦ¦ÞÇb‰‰±X€Â·ß.,ô×û|¢{;dÒl¹€•€èM§”žžšš‘¡<ÞlÚôá‡Á¿'j6!¼ñá×|:éž1h(™œ@&¦7‚üñuëvF1B¯-ÊÊ;X¸0++1à8–e†Ñé´Z.8¿EEÅŇâr¹Ý.Wèó¤ãÏœ9cFvvOÁÝ÷–A Ðfئ‡®ñ^¯ÏG0yò¤I6ÀóOWðÕWGÖÔ;v|ÿ}e%°yóêÕùù„$''&¦¦7'';;/¯÷+Ž®jj¤‚gQðTáv0Nî­DêNºÝÇõë„TVnÛ¶f !ÅÅk×ff²gÏ’%KOÖ##µZŽ4­V­ÒÓÇ3ˆ‹‹‹³X€Õ«7m:xàyžï긌†|¥Ëç)}ŽAíS4TÉ[–õõû÷ò pâĺu™™€ÁÐÑQTLš›;v, VGDhµ€Ýn·Û턨TÇ0€^¯ÕªTbLE€›7ÛÛy°Ù¬Öèh@¯7¢¢€;©¨ð»€ß› vP4nwRe ®nïÞ-[€¦¦6n²³}4+ °Z““m6@£Ñ룣{ÚN•ŠãXV\*•4˜&ŽÎNžÒÓ““cc={ΜilÚÛÛÛû#8î|C;ô¤>íž=‡ãÚ5 ¶v×® €œœÅ‹gÍFœNèìlm½>6Ö?9EFêt*™™’2b„òoÞ¼uËãñ`4FcpþûË-ݰáÝwß{/ôI¿ DuuûömÝ ¤¤dd$&úO–€ÇÓÚ* °¬V+Š_ʺÓévwu;vìÞ}útðï9.Ï÷>Hª[J‰š8êŽÒMyÈÏrjn>{vï^ 1qþü)SB\®†ðz»ºÄ6 £Ñ§R‰Ï"íÚõÖ[=4444ˆý†ŠŠJJŽ!Äår¹:;{ß_§Óé""€éÓ§LÉÌ Ÿ°oxô™ç;:Z[µZ§3BÚÚD¿[ÔPBñz†W€×ër9@MÍÆóçõõ*•Z­ü%GÔø¹s·l¹tÉ_ß[œ“óàƒsæô~È5_šÈtäBÄÍÕh|>Ñ{a@¨×+n’ô$ÙÚj·ùù+W®] §Ñ˪T¢HÅ~,«V>ŸÇÓÙ ïØ±u+P_____Øl6›ÍÖ{û{ìØñã‡âv{ÊcÐ3BP«££­V .nÑ¢W_ÊË¿ûî›oÀf[°`˜ÄÄ @¯·Z€ãôz «à¸I“ž`˜ÔÔ'žÎžýòËM›€èèÙ³W¬T*½Þd3O&Søx<·7=ò \ „<±3¨Á8¹fÝ&ññóæ-_TW{<<þùæÍ@ZZNÎܹ€Ùœ–öì³ÇEFŽ%Úx§hm½|ùÌàܹ/¾xí5 ::'gÙ2Àlž9óÉ'ƒÁ`0µZ­V«û/šª$øPrÃ}É ôÙ ¥ H3HÒ÷ãÆ-\¸b`2¥§çç55‡}öpáÂöí›7‹#ˆþ;èT@DÄøñ¹¹@|üÊ•_ h4&ÓèÑâu˜¨(@ n+çzKòÌ™RøY^ßÛTå€ BN4c³¥¦&Ó3Ϭ_/Þ+*(ƒiØ–aü›+µñôd«Ñh4_ãM&£Ñl•;%~ý«PnW¤¯Ôoø/Vù/*Ñzé{µZ­V©ÄäµÙzN˜êhæ„%ãC½ÖBÇ6tŸ¼_cä§%˲,Jš —&Ç•oEˆ@( ^ÊÇ`ߊ4h|<Øæ#}/ 8Fàû@„ô_¸WI”QºlÝ x4”±0zæ~z5‘ƒÁ`0™ÂÿðÝF(*îiîª_h†vå~!ìHâï¯J.ž,-òB³à.õ´‡±#Y-;HjëI¶oônèp§ÂÂÂÂÂBB¦M›93#8}úĉ²2      `ø¯Í;þâ%XƒA<'Ðç;…ÄñÀ€¸¡ƒAUçªÎ]òR_õªÝlß¾m[U=°Õ5Õ5U'INLNL™9ŒMQ(îÙp*Ýmî6!äͱ룟EHK‹ÃÑÜLHmm]]u5!=ºo!üäOï¼ñBhû¡æ[©ö&ˆˆ?Rz¥ì›3Û ù¸þÓýíÈRáapãÆO?55ííô/S¢K!\¯×çŽ5=[@3"6j0ý鵙ˀøU÷Å$¼\ÿWãMGøÈ¸§l/øßÓö´?ý÷äÒ¥K–,_Î0-_µli9Ôw¾C••óÏ@)% ºwð—44PÁ©S9½å¤¸|ùÊþê÷Ãâ(«q 09cÒ›³ 4ø“哆·y–gy8÷÷Šg?\î?» @ÂäûÞHx˜¾zÚÊL>|¾år‘ß §|ô¸M>ܸS)\TÝ/ŸÒx{ÏÛÍJÏ÷H$%9Û †|¾[)ÔMø¿M•T:6<ÐIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/options.png0000644000000000000000000000152712247657030017512 0ustar rootroot‰PNG  IHDRàw=øgAMA± üabKGDÿÿÿ ½§“ pHYs''”iQtIMEÚ #Ãj¬•ÔIDATHÇí•;LSaÇÏ×ÛÇm¡–G©<"\C,ÐJR¤& -0©±vp¸šMdq3q¢›‹‘Ië Ý$„ô¶#F!¡ÚЭ¼ÚêýZú¼·‚M"²Ïö}ÉùÿÎ+çü·ÞPá‡Ëår0 s¤“Éd»Ýþat@\(n·ÛÁårMåd6›Ç±g¢ƒ†aJçü~XZZ* >I=÷"½^ÿîÄŠ·Ùl`4Kª(!ädÌf³3™Jí‹?{t4å,º&FåR±ø¡PÖÖÖ-{=¹uó¦“a0™L ªUƒgÞ—u=OÇ_Ü}N¿±?ì+6‡ö @&“ÇcéííÝŸš¦ANdÛ3£ñÍÕjá†äZÿí¡¯¾å!ªU˾­:Ò‘ÄK»Ã>¨GÌ·•$I/Æ8Œá>MÓ,Ë‚Ífƒ4Ÿ¶Ä’!—N±Û[>s:ŠÑN>µš&Ð_Tv÷÷˜£ÑðºÂíZ`¿ àyÞ‹1ÌA0œ°Z­ôÊÊŠsˆpDyÚá91Ïm¶Ç£P>¤$JMt\íª“ÈrC—”hcvοX0==­•Éd^îWŸ?y'0Æ€18²ûç_µU)ršäp™¶³ò™Ä‚> ËÒ¤T½¥­†  Úó3¨È(iU P9›DJ.´´ª+›››@Q¦B,UÓ¨¡ôJàýä¤f‘<4TVHÇkTåTCƒTÕ* (ªê@ÓÑ9ÿ{‰Njî솱EéHæÐEOµç²*“+ '$ ¶å©¼þt÷ò:?;çŸêÖ^Øxa@à“’”ÄÃìéû›ø;oÔiœéT¶/Ã'k )û{€]È—°±óÜÛDŠPg3|W>' tV—ìÅð ]]¥x}¦çrd¸ú C+Ib¼ê"IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tab_a_active_bg.png0000644000000000000000000000172112247657030021064 0ustar rootroot‰PNG  IHDRÐû,Ù;iCCPICC Profilex…”KhÔP†ÿŒ)‚´‚¨µ”àB‹´%>ЊPÛiµÖ‘qûÐ"È4sgM31™ˆHAÜùZŠˆ‹*âBºPp¥ ‘BëkQq¥"ˆB7RÆÿ&íL*V/$ùrÎÏë†USŽcE4`ØÎ»É®¨vèð€¶xU¨A5¸R†ç´'û}¦V>ç¯é·P¤e²IÆŠõ˜ø´mõýKbïëžöúžùúyo5.ŠFëŠlÀ[%¼Wòɼ“§æˆdc(•&;äF·'ÙA¾A^š ñ`ˆÓÂ3€ª6jr†ã2Nd¹¥hdeÌQ²n§M›<%íiϦ†ýF~ÈYÐÆ•­k€E/+¶½ ¬Z_±5Ô+û±-ÛϤ?¥vÜËlÙì‡Sª£¬éC©ôs=°ø0sµTúu«Tš¹Í¬ã™eÜ¢¯eaÊ+ ¨7ØÍøÉ9Zˆƒž|U p“sì_Ä.×?ˉ g"çÙnpåÅ)ÎèÈ9§]3;”×6ëúv­G+´nÛhnÔR–¥ù.Os…'Ü¢H7cØ*pÎþZÆ{µ°{òÉþ"ç„·{–•‘tª“³D3Ûú’»Éä{sO7¹×TÆÝÓ°²ÑÌw÷é³­8ÏEj"uö`ü™ñÕÉGå<$xŃ2¦o?–Ú— ×Óž<ž‹IM-÷¶êáIV¬3CñY~í’2ï:jî8–ÿͳ¶Ès†6ï64$Ñ…(šàÀEzL*LZ¥_ÐjÂÃñ¿*-$Ê»,*ºð™{>û{N ÀÝ2~¢qŒ4–#hú;ý›þF¿©ßÑ¿^©/4T<#îQÓ¿üqefYŒÔ(ãËš‚ø«m§×B–Öa^AO^Yß®.c_©/{4™C\ŒO‡º¡LMd<Ùµì¾H¶ø&ü|sÙšµ/Î>©«äz£Ž™¬~q6\ kÿ³«`Ò²«ðä. vpAg00ÎîŒWHIDATxÚí[il×}ÿÍìÌœ½IîòoJ%ê0-S§% .’TJ ªcY®QÁv*Eâ/­ƒh£ø‹›6p†øCѵÐ$®aD2jY²-‰´)Z’IY$%").=¹$wöšÝ™~x™Îîì,—KQRÐø»3ï½9ÞûýÞûïý‡’$I’$|“Q¢uþØÓ7<âÄ{C,‹ÅhIúbM÷ûgß¿Œ>¥”ä˾–ˆ6m·”Ø[Íû >ý°¡°Ÿ´×:€iÍŸ×Tõ¾z¦i=`0Œ#E= °µU¬øì³+ì…¸$µ>Õ"´7\pÿþ~ŠztQ§D"™L$$I!‘B¡¹¹P¸¾;>j|çý¿ö¬¯hÙÕJmÇ6ü`Ó_4MÓ4ýðúQ4ÿeý-{¦L’~0$yÔO:¢(I¢¨Ÿ§äÉQù)ãUÎ/}º>ûºÜrRJÓ:Mg2Y,€Éd2™L@0 úýÀ`÷à's€x4bÀþÛ{üé½€I4‰&ñÁQ´HŸNý‡ð&íEQ…—óê³ü“k´¯È®¥¨Ü¥H§Óét˜› ‡`zzfÆãœN§³¬ غï±í•÷—œÛTüÎq–ÿO`4 „¼}X4ʈ+´öõÙwfß±ÔxS×e¯&$ûHÑé†a€X,Å€ÉÉÉɉ Àbá8‹XÛܼe]9P¬7Õž>v^ ÿÏŸ~£ßèzpD¬€€\ˆó‰5%ùÈȼ¯…€Ï,Ï,“ÏY–eàùX,!3cn0›9Îj*'*&«î—›fÿøøÏ.î> ðKQŸoõ‰Xš_´h¡¯&"g–cIRqÀËg Ã0, èt4Í0€×ë÷ÏÌÌf€ãÈÑáp8 éoÖþSÓ3À…¾‹wÎ[9qN …Vˆ‰ 5je˜]®5´óÅ$-àµsÙg:QÊ:ÃÐ4 ‚J¢(Š¢””˜L””””˜ÍDW8@íÖºµFàüè…ß}´ HF’‘däþ‰X‘Ò–óÙVMvöýU )¤F3÷Êlñ”}¦¨fY'èt Cf„N'›Ÿ€Á`0€Éd0˜L€NGQ4 ¸GÜcî;€}Ìž¶}týòóðåË÷ ÿ ±\” ¨š|DhA¸2 ”™Ï$$³¥NÓ¥ÓW¯öô|þ9L&“É$ Ó±,ËWRÂq€ÅbµšÍ@cCÓÖF3ðUÛ@ïà^÷¤kbH’jwÔèëj‹7[WaäÚóZШQ~Á´¼¤6?—Êk½‡a”À0Š•DQ4­ÓÑ(ÏG£ÄZºw¸}ûöí;w³¶qºIj¸|ê=qýïWÒƒÜ|¢i©;ï—‚åçeÑ“)‚tºL"²ERæ‘eD"‘H$€þþþþÀn·Û 9lH¾ Ìܘ¹1}­øž¬‚’;˜}–O|H’öÈ”­u ‡  ³³¯Ïãúú†‡Àï‡c1E¶»\v»Élݺn]y9°cǦM••€ÍÆqz½FÇyÄ›L F£ÑX­Ä±„T*•R)rŒÅb±hX\\\\\ü~ŸÏç*_®ú‡ª'‘éÑÑ•¨l¯J?@òùzun)ÂÔj•ä|¾PˆçS§Þ{¯¯èëòx€Ý»·m‹FššêêÒR ££½}qˆÅ — ˜œôz+*€Ï>ëëóz·ßþÍoúú€½{ÛÛ««—^úÞ÷ÚÚ§Ój5s‰P'½^¯×ë•öZ­V«Õ ¸Ýn·Ûqá„xwîîîî>à­âð¼oOXNd9biªÔ$dæ®]œ^yå¿8wp¹Üî™àĉ瞋D€uë].Àív:Ïœjj**>üp:Žáa ¬¬¬¬¬ ص«££­ xõÕ_ܺE.^zéõ×ÏŸúûÇÆ‚Á\‘TÌ‘¦ãp8¥¥ÀB*R¾ðßÅ¢¹JV9[Ê@Ô¾z{‡†¼^àÍ7ÏœùôSàĉ£GGGx\vîfg M$êë5kl¶òr```ròøq O$ˆÒL&S)2r»º“I¯ïîöïï耛š6n~ö³Ó§;;7ÞøÑöíZZjkÎüƒ$W0f×F£Éˆ¥;ÒŠGs–"²k´m ÜüÜÜâb<üüçï¼ÓÕ?~èPWJ¥Ó¤R¢8< lÚÔÐpæ `4  &'OÉd:ÝÚJ”§Ó ˜ÍzýÃд$óóÑh]ɇB@y¹Ý~ñ"𠇌?ýé[o]¹BDX:½œ‘¯ø™3A¯gY½ž¢Vº±»*"hi{={RN§O¿÷ÞÍ›Àû÷F#ËNL¥¥Ë•+@]]yùåËÀäd °{7 é´(’eoNñ\A’ìvâ¹JÐÒ²fÍûïõõn÷'Ÿ{?³}N'yþîÝííóóÀ¯~uî\.Йbf)b–ÂåPxÑléÚPh~>nܸ}{|¨«s»»º”zQ”$šnݺwïÈ`dÄãùÖ·ˆƒdµë$&¢‡,!¤Ó‹‹@}}EEg'p󿨨3Ï>_8¼aá6[n [[.]Ξíê¢ÑX,•*^',—U" ÷5…¦löêìì뛚¶mÛ¼9$Oäy幃ƒ““ßù0>>;ûøã@2™J‰"H9Y'“‚ð|–u…(J’r¤(@€Phq‘8h%%ƒƒDY?ù$03D"J{eâ´ºoG,·!ryæ¹õcc³³Ï?Oöl¯^ª«Îk×à••ä>Žˆ5“N§ÓJ‘ådƒec1° ’Df†L€úÈqƒ× ƒóó @ÿ½{ßý.ˆ"M+m–­m¯ °\ ¹"H èÜsò_^îp”” 55;ëõ'N>ÜÞ^Œ–oÃgeiDZáæ‘Ùycƒ¢D1‘~ò“çŸß¼èêúòË ¼ÜjÕ뉽Ÿ¹HvýúÈÈ®]Ä*²Û‰ÇLÌLí5('Z¿^Yº‡#‘Ž §çúõ;w€×_ùå;ˆõD¬(uûµÏì—‡f†j½H-ÕyYÈ{®2ÍÍ••f3ðÊ+66o¿ýÁ7on÷·¿ír‘E¹¦&Àl.)Ù³¨ª*+K$”¥ù=&“Á Óee6›É¸\ÇþýÀÅ‹_~ÙÖ Íͯ½vìØ¦M@]ËÅq™{ÀdçËh”—ý”“ÿ|a0™¥IË^n´¢lý±,±F’I`ëÖµkËÊ€“'_xewßýôSކ†<žjjªª|> ´´´Ôj*+íö’2²–“HSSÏÌ ðÅ==ðØcÍÍ6ðÆ?üa{;ñ|­ÖÌ÷“ 9`Ki¿ ¨¶µ#Iùöð0ùyÎçe/M˜Íf3Ç)fY€Á`0 ÊÖàk¯;æp@8’¥Ÿ¬ùýÀÝ»ÓÓ‚ ì¬•–ÚlF#ðä“­­v;ÐÑqäHc#PVf·[,dŸÀ`PF¸Éd2€ÑH‚uå=bµ½Ÿ¹ÑšéœýŠ Â„dæåø£‘.‹¨TŠ,=$“‚Ln·Ë•J--MM55ŠÇ«ÞàÑéH4ƒ²ÙNÖëY–k0èõÙ[ÚAÊž6Z^ÑZ8<2”/³@QdcEŽB`e„fÚåÙ÷ªcEµcGÕ3PîLà•x¢lೕýjˆ`UwÄŠ¥äA'mà3ËŠ l)ŒËCó„WFÁÒ1mùÃsÍÌB/å‹QÕ:nÃòzû'‚Ô6„Vøbf>÷é…–ÄÙ¬¾Býíç-/‚O«|¥kÿZiÙ3@Aòóœ/h7·ƒùÃÔ—êh¾ïrËÕGå=Ë)Ï|þÒÀk+aȵ|z Çãñ¸$E"‘H$²œ©[Ø:Xšm€–¼ú·´R]ø:í —Ë8G³0yE̤ì±.,,,,,ô³ôaêEù…j‹AQnrƒdÇFL±jòYr—ò•k·¸PýrSî˽BÝOI¢ÿŠ>N¿ ð<Ïóa%úšeY–e%)ß×—y ×Ïåh`žçyž,ïXJm>`ì_Æ©»¥@Ci½³±\úa[:.ÉÀRcÔ(8n9þÎñK€wóË?G¾´‘EQ!Dò ß ;6ò×in ï¿0õÑY€ßÆÿ'ß ˆn±Zth)¶•Yû¾b¦T°þµµÖÊm“OlY p'åûmàÿï9…,ë€X,‹Å~ÿ¥|L™êŵ?–${ðr¯Ùl6›ÍJ¹ü=2YbÉ/–ý¡¶lÉ€ËaÛùìêÿïI‰ž #\öàeBH¾°H.úKùoÒê¦ÿ4¬ÀÚ_wc‘IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/dialog-left.png0000644000000000000000000000545612247657030020213 0ustar rootroot‰PNG  IHDRÐ ‹dXgAMAÖØÔOX2£iCCPICC Profilex­’½KÃ@ÆŸTDuñ«J©U‚.Dh;¨èPµà.é5ÖBMCrVÅÙ½à¤8ø‚ â$ºåèRAÅIG¡à"ßË!\<¸Ëïž{?òÞ{@ÀÕ-+°jr{f,¦Î/,ªuw¨‡iè̱¢‰Ä”Üý¶¾ÝBúM¿ˆ5»äο Œv5¥ª¶èg'@G¨ªõ¶9àj¨ªU¦ý;QÚKÎòРNiŒµžW u;ÀGÑóÞ<ïã˜rÜ®ÉÖì‚oK?©”¿ö²6]ö€XôÂïÇO–õûöp8Ì5“ÛÀÞÐ{´\‰& Ræ_SÞ•ï××sÙ”­s#­ŠçÏçò¶céÌðÿoáÆõˆç­M;›Yáj”^—V'L6V5-‚O¾uxQúGŠö pHYs  šœ !IDATxíÔÏJ¦uGñךÁÅ4àÆÐbÂ"šiT $7¹hZV ³kQ0t݆W!ˆ øFð \ÎR ²WÁr°sAhÑäÕó}žÏûñÏ`pKsssgïÝÒYÇtØÍ53ûÍFÎÿ nþ ×­­-®®®>ÙÛÛ{q||ü`llldfff099yqÇG^¿óÊï§§ƒ‘Ë~ppðtww÷«•••…ÃÃÃGÃCïúãßîðàò2}ýë°«Wíìì|2<ôåæææÓ“““g§§ïÏÏϦgg¯^öÖ×ggg?Ù[Ë•o–––ž½~ýú·!磣£÷¾yþ|ðíw/®=í;vyîöööØðóëáÓþôæÍ›Çw_..ñdpçÎÝÁéU³Ë›Þåuyyyf}}ýç­­­Ï†Oûá—Ïž½ÿË«Wÿþ6íðýýýGÃ§ÜØØøujjês»öFÛ·ö_ãèèhäÖ;v£æÅÅ™eýjŒä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$g&80e0’3˜2É™ L™Œä̦ÌFrf‚Sf#93Á)3€‘œ™àÀ”ÀHÎLp`Ê `$ÿOÌþøt5„Ø9cIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-xhtml+xml.png0000644000000000000000000001027512247657030023175 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWHIDATxÚí[il×}ÿÍìÌœ½IîòoJ%ê0-S§% .’TJ ªcY®QÁv*Eâ/­ƒh£ø‹›6p†øCѵÐ$®aD2jY²-‰´)Z’IY$%").=¹$wöšÝ™~x™Îîì,—KQRÐø»3ï½9ÞûýÞûïý‡’$I’$|“Q¢uþØÓ7<âÄ{C,‹ÅhIúbM÷ûgß¿Œ>¥”ä˾–ˆ6m·”Ø[Íû >ý°¡°Ÿ´×:€iÍŸ×Tõ¾z¦i=`0Œ#E= °µU¬øì³+ì…¸$µ>Õ"´7\pÿþ~ŠztQ§D"™L$$I!‘B¡¹¹P¸¾;>j|çý¿ö¬¯hÙÕJmÇ6ü`Ó_4MÓ4ýðúQ4ÿeý-{¦L’~0$yÔO:¢(I¢¨Ÿ§äÉQù)ãUÎ/}º>ûºÜrRJÓ:Mg2Y,€Éd2™L@0 úýÀ`÷à's€x4bÀþÛ{üé½€I4‰&ñÁQ´HŸNý‡ð&íEQ…—óê³ü“k´¯È®¥¨Ü¥H§Óét˜› ‡`zzfÆãœN§³¬ غï±í•÷—œÛTüÎq–ÿO`4 „¼}X4ʈ+´öõÙwfß±ÔxS×e¯&$ûHÑé†a€X,Å€ÉÉÉɉ Àbá8‹XÛܼe]9P¬7Õž>v^ ÿÏŸ~£ßèzpD¬€€\ˆó‰5%ùÈȼ¯…€Ï,Ï,“ÏY–eàùX,!3cn0›9Îj*'*&«î—›fÿøøÏ.î> ðKQŸoõ‰Xš_´h¡¯&"g–cIRqÀËg Ã0, èt4Í0€×ë÷ÏÌÌf€ãÈÑáp8 éoÖþSÓ3À…¾‹wÎ[9qN …Vˆ‰ 5je˜]®5´óÅ$-àµsÙg:QÊ:ÃÐ4 ‚J¢(Š¢””˜L””””˜ÍDW8@íÖºµFàüè…ß}´ HF’‘däþ‰X‘Ò–óÙVMvöýU )¤F3÷Êlñ”}¦¨fY'èt Cf„N'›Ÿ€Á`0€Éd0˜L€NGQ4 ¸GÜcî;€}Ìž¶}týòóðåË÷ ÿ ±\” ¨š|DhA¸2 ”™Ï$$³¥NÓ¥ÓW¯öô|þ9L&“É$ Ó±,ËWRÂq€ÅbµšÍ@cCÓÖF3ðUÛ@ïà^÷¤kbH’jwÔèëj‹7[WaäÚóZШQ~Á´¼¤6?—Êk½‡a”À0Š•DQ4­ÓÑ(ÏG£ÄZºw¸}ûöí;w³¶qºIj¸|ê=qýïWÒƒÜ|¢i©;ï—‚åçeÑ“)‚tºL"²ERæ‘eD"‘H$€þþþþÀn·Û 9lH¾ Ìܘ¹1}­øž¬‚’;˜}–O|H’öÈ”­u ‡  ³³¯Ïãúú†‡Àï‡c1E¶»\v»Élݺn]y9°cǦM••€ÍÆqz½FÇyÄ›L F£ÑX­Ä±„T*•R)rŒÅb±hX\\\\\ü~ŸÏç*_®ú‡ª'‘éÑÑ•¨l¯J?@òùzun)ÂÔj•ä|¾PˆçS§Þ{¯¯èëòx€Ý»·m‹FššêêÒR ££½}qˆÅ — ˜œôz+*€Ï>ëëóz·ßþÍoúú€½{ÛÛ««—^úÞ÷ÚÚ§Ój5s‰P'½^¯×ë•öZ­V«Õ ¸Ýn·Ûqá„xwîîîî>à­âð¼oOXNd9biªÔ$dæ®]œ^yå¿8wp¹Üî™àĉ瞋D€uë].Àív:Ïœjj**>üp:Žáa ¬¬¬¬¬ ص«££­ xõÕ_ܺE.^zéõ×ÏŸúûÇÆ‚Á\‘TÌ‘¦ãp8¥¥ÀB*R¾ðßÅ¢¹JV9[Ê@Ô¾z{‡†¼^àÍ7ÏœùôSàĉ£GGGx\vîfg M$êë5kl¶òr```ròøq O$ˆÒL&S)2r»º“I¯ïîöïï耛š6n~ö³Ó§;;7ÞøÑöíZZjkÎüƒ$W0f×F£Éˆ¥;ÒŠGs–"²k´m ÜüÜÜâb<üüçï¼ÓÕ?~èPWJ¥Ó¤R¢8< lÚÔÐpæ `4  &'OÉd:ÝÚJ”§Ó ˜ÍzýÃд$óóÑh]ɇB@y¹Ý~ñ"𠇌?ýé[o]¹BDX:½œ‘¯ø™3A¯gY½ž¢Vº±»*"hi{={RN§O¿÷ÞÍ›Àû÷F#ËNL¥¥Ë•+@]]yùåËÀäd °{7 é´(’eoNñ\A’ìvâ¹JÐÒ²fÍûïõõn÷'Ÿ{?³}N'yþîÝííóóÀ¯~uî\.Йbf)b–ÂåPxÑléÚPh~>nܸ}{|¨«s»»º”zQ”$šnݺwïÈ`dÄãùÖ·ˆƒdµë$&¢‡,!¤Ó‹‹@}}EEg'p󿨨3Ï>_8¼aá6[n [[.]Ξíê¢ÑX,•*^',—U" ÷5…¦löêìì뛚¶mÛ¼9$Oäy幃ƒ““ßù0>>;ûøã@2™J‰"H9Y'“‚ð|–u…(J’r¤(@€Phq‘8h%%ƒƒDY?ù$03D"J{eâ´ºoG,·!ryæ¹õcc³³Ï?Oöl¯^ª«Îk×à••ä>Žˆ5“N§ÓJ‘ådƒec1° ’Df†L€úÈqƒ× ƒóó @ÿ½{ßý.ˆ"M+m–­m¯ °\ ¹"H èÜsò_^îp”” 55;ëõ'N>ÜÞ^Œ–oÃgeiDZáæ‘Ùycƒ¢D1‘~ò“çŸß¼èêúòË ¼ÜjÕ뉽Ÿ¹HvýúÈÈ®]Ä*²Û‰ÇLÌLí5('Z¿^Yº‡#‘Ž §çúõ;w€×_ùå;ˆõD¬(uûµÏì—‡f†j½H-ÕyYÈ{®2ÍÍ••f3ðÊ+66o¿ýÁ7on÷·¿ír‘E¹¦&Àl.)Ù³¨ª*+K$”¥ù=&“Á Óee6›É¸\ÇþýÀÅ‹_~ÙÖ Íͯ½vìØ¦M@]ËÅq™{ÀdçËh”—ý”“ÿ|a0™¥IË^n´¢lý±,±F’I`ëÖµkËÊ€“'_xewßýôSކ†<žjjªª|> ´´´Ôj*+íö’2²–“HSSÏÌ ðÅ==ðØcÍÍ6ðÆ?üa{;ñ|­ÖÌ÷“ 9`Ki¿ ¨¶µ#Iùöð0ùyÎçe/M˜Íf3Ç)fY€Á`0 ÊÖàk¯;æp@8’¥Ÿ¬ùýÀÝ»ÓÓ‚ ì¬•–ÚlF#ðä“­­v;ÐÑqäHc#PVf·[,dŸÀ`PF¸Éd2€ÑH‚uå=bµ½Ÿ¹ÑšéœýŠ Â„dæåø£‘.‹¨TŠ,=$“‚Ln·Ë•J--MM55ŠÇ«ÞàÑéH4ƒ²ÙNÖëY–k0èõÙ[ÚAÊž6Z^ÑZ8<2”/³@QdcEŽB`e„fÚåÙ÷ªcEµcGÕ3PîLà•x¢lೕýjˆ`UwÄŠ¥äA'mà3ËŠ l)ŒËCó„WFÁÒ1mùÃsÍÌB/å‹QÕ:nÃòzû'‚Ô6„Vøbf>÷é…–ÄÙ¬¾Býíç-/‚O«|¥kÿZiÙ3@Aòóœ/h7·ƒùÃÔ—êh¾ïrËÕGå=Ë)Ï|þÒÀk+aȵ|z Çãñ¸$E"‘H$²œ©[Ø:Xšm€–¼ú·´R]ø:í —Ë8G³0yE̤ì±.,,,,,ô³ôaêEù…j‹AQnrƒdÇFL±jòYr—ò•k·¸PýrSî˽BÝOI¢ÿŠ>N¿ ð<Ïóa%úšeY–e%)ß×—y ×Ïåh`žçyž,ïXJm>`ì_Æ©»¥@Ci½³±\úa[:.ÉÀRcÔ(8n9þÎñK€wóË?G¾´‘EQ!Dò ß ;6ò×in ï¿0õÑY€ßÆÿ'ß ˆn±Zth)¶•Yû¾b¦T°þµµÖÊm“OlY p'åûmàÿï9…,ë€X,‹Å~ÿ¥|L™êŵ?–${ðr¯Ùl6›ÍJ¹ü=2YbÉ/–ý¡¶lÉ€ËaÛùìêÿïI‰ž #\öàeBH¾°H.úKùoÒê¦ÿ4¬ÀÚ_wc‘IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxAclEditor.css0000644000000000000000000000264112247657030020315 0ustar rootrootDIV.acls { position: absolute; top: 0px; left: 0px; right: 0px; bottom: 0px; padding: 0px; border: 0px; margin: 0px; } DIV.acls LABEL { white-space: nowrap; width: 100%; } #userRoles { position: absolute; top: 5px; left: 0px; right: 0px; bottom: 0px; } #userSelectorButtons { margin-left: 5px; padding-bottom: 2px; } UL#userList { position: absolute; left: 0px; right: 0px; top: 40px; bottom: 0px; padding: 0px; margin: 0px; white-space: nowrap; overflow: auto; border-bottom: 1px solid #fff; border-right: 1px solid #fff; border-top: 1px solid #909090; border-left: 1px solid #909090; background-color: #CCDDEC; list-style-type: none; list-style-image: none; } UL#userList LI { clear: both; cursor: pointer; height: 20px; text-align: right; margin-left: 0px; padding-left: 24px; background-repeat: no-repeat; background-position: 4px center; } UL#userList LI.normal-user, UL#userList LI.normal-person { background-image: url("abcard.png"); } UL#userList LI.normal-group { background-image: url("ablist.png"); } UL#userList LI.any-user { background-image: url("abcard-anyone.png"); border-top: 1px dotted #555; } UL#userList LI.anonymous-user { background-image: url("abcard-anonymous.png"); } DIV#userSelectorButtons A.smallToolbarButton { float: left; } SPAN.userFullName { float: left; margin-top: 2px; } LABEL.subscriptionArea { padding-right: 5px; } SOGo-2.1.1b/UI/WebServerResources/UIxOccurenceDialog.js0000644000000000000000000000315412247657030021321 0ustar rootroot/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ function onCancelButtonClick(event) { window.close(); } function onThisButtonClick(event) { if (action == 'edit') window.opener.performEventEdition(calendarFolder, componentName, recurrenceName); else if (action == 'delete') window.opener.performEventDeletion(calendarFolder, componentName, recurrenceName); else if (action == 'adjust') { window.opener.performEventAdjustment(calendarFolder, componentName, recurrenceName, queryParameters); } else window.alert("Invalid action: " + action); window.close(); } function onAllButtonClick(event) { if (action == 'edit') window.opener.performEventEdition(calendarFolder, componentName); else if (action == 'delete') window.opener.performEventDeletion(calendarFolder, componentName); else if (action == 'adjust') window.opener.performEventAdjustment(calendarFolder, componentName, null, queryParameters); else window.alert("Invalid action: " + action); window.close(); } function onOccurenceDialogLoad() { var thisButton = $("thisButton"); thisButton.observe("click", onThisButtonClick); var allButton = $("allButton"); allButton.observe("click", onAllButtonClick); var cancelButton = $("cancelButton"); cancelButton.observe("click", onCancelButtonClick); } document.observe("dom:loaded", onOccurenceDialogLoad); SOGo-2.1.1b/UI/WebServerResources/mime-mime_ascii.png0000644000000000000000000000526112247657030021042 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW ð¾ úñ”H|¨*T!RU$â$¨„¬Ò ‘Ti»éÞÅæÎ/ìÛì=wù0vwvfo÷¼Ž#¥ét;³3³3¿ßü3³+Y–eYÞ•]y·;ð Ë»ì²ÄÃV0 Ã0dËú{qþ•×Oµ—VÒµ8`mY]«æ.KLßÀù™½(ë¥jÉë©)`Ï {ÔÜ&P²ŠŸ+€µñ釀T:•N¥%é^€Í)¬xíµ¿&Î6-ëá'wޤ<Æ¿[_’vo ¬´Zív«eYN§ÓjkkëëkkÀÂÆÂÛ7S@m®þ»úià¡ñÃyXŽ|ù‘gÞÿ@–eY–ïÝ8BðÛ‘ß'~³Ï²žùïÉöëd`++€iZ–il{všüÛ?{¾Ò´9ö¾»œ7ŸäÊr,&Ë€¢d2ÃÃ@&“Éd2Àêêêj½¼9ÿ柯®ædÀ±Ÿxöø@ÆÌ˜sç‰íz¿ìþºó2Û%I’úOÓì•xpô¿„û®$ysì;@¯×ëõzÀúúÆÆÊ pûöÒR¥ŒŽŽŽîÛ<ú‰ÇN”¯*ùÌð‡Ü)ý•O«wVï¬lì||š{Æõš_Þ]Ó]Ão¾±÷œÀ³„¸ÿ !±X<†Ñl išvë0<¬(ÃÃÀ¡™™Ù÷îÔÕõÀ™Ñsz ¨§ëéÿ¼µsD @€b‘ a)‘á¬×‚~À;óyô:‘H$âq@× £Ñ š±¾d³Š22LÜ×&€©óÓKS?Î|æÜGç~Ô­•›µZôD„Ž‚X œð:^^^ZZ^z=Óìvݵœ6š—v>ÅÙ¦Sch¾$y}\–eH$âñXÌÖª¦Ùë™&°¼\«--““…Ðn§Ëår¹0ý­C?˜þÀ» I@±X, ^€¼°‹®ý5Àn§ßúƒ]Q [­f³ÕšÍf³ÙšÍV‹ü“´$5›²lkÌ•+W®\½ ÌÎÎÎÎ΋—.>,]Zºtû–5qtâèäãÁ5!²(ˆÎHz¥i•Jµjkkûù$úçSÓâ&‘=yïð…:_ê”c±X,Òét:“††ˆ ’åXL’€­­­­­- ^¯Õj5`â¹ÉïM~¸qûæ÷oÄ€ LìGs $Ê!N•¤¨ð£±¼ŸS]³ˆ4!*aÛÌçóyWtwË| Àüççççü<\û™ Þ@‰=µÁ­T4ÍéØñ´@tÍ3[ýnÛY–$²ŽH¥’I`lllllŒhŠ,ÛÏß³'—6»ý›?¾[ùø mH-Ë©ür^Ħîò%êm3ñ³Üã ¦Ê|¬÷¡Þ#០rß±,bM«U·Õ âÂìE%6Ìd<¥R©T*Ùiúìd2‘H&íõxØçDb‚x-ˆøÍt:Àí€ËÛ ;&¿Ñ…t0ø#0A¢T*Õjµ ˜&»vCd_Ge°VúÁF¦ˆªª*«ápáK&ˆtˆµT*‹E>À¼-'®­„sÐ`Û&ˆ‚ÏÂV©Ø> çŠ‹ý.íÜÐ^¨ªªªªXvͱ¢×Ôi‰ãD´ß/¾9Ûžø0Å%¨lÛ‰fDµJwCÉž‹$1ÜþG’ÞÜ(µÁ>o°}ÑþsvÕÑ+gÇœàŒüÅ{SÁçþÎàÎñ+4@HÚØ>€®„YàX¿ûü;µ êœuÂHä&ˆ‚Q*‹DúŸåò}AзŒø>hPe‡Å%¨D±T«šV­@Ö|Àýf¯è¸Wnû«ÞÞªMo¹\.;5Àïh6ŒDb‚x ‹ªJ×nÀE3Û»žpì¿b|=ÝßÒ¶6&˜ >ÀšFwCÉÁG¿×F¼m‰\tÐ]Øqñóm PÕrÙÎám§ß3À{;³éÒ‡…uÞî<',À|"¢&À{2—~2€ b} «4 b6ñ3@íu@¹\.ÛOs mG"ÜŽö®ˆàäYLP0"‚®7Ü ó€çßgϤݭÞ&ÈÖ4ï:€?óý§½€‡ syóòi]§У×]ñEUÝ{AìLw¦£^æò}ïmþûENˆÅGªƒJ„&È-š¦išFÞ@#Q¿ KÀТ ããùüø8¯ý£%ö¨“={æŸE‹qÙUÄ »ê§î2áL’³g4ßùêWÐmb¿W"£ÄeÛííŽ5Ø òÒ< ýžmŸÂz=ù3×[Ž×v?Ÿ4, *¿èt:NG̳è¥]ï³¹vûýò½¯«‡Éw¶ï<ß “—‘ƒÓÓ—òŠže5F£Áóþþ+B1b"øžý‰ˆáÝ¿_h>Å©ÕjµZ­þDMe’4lnnnnnòä§¥¯ÑuwÚZ;í^ÈØ€¹—òÞ6l"Êç÷8ŒËôïó–`ÇiYò×ågåoº®ëúýÚ’¾ÔkY¢¯/…Ðw&é^Ž®ëº®ÿÞûž°øÓ·¥…½ÀÁ½F§öS wê„öþ üMiQº)¹羓û çõoë_EQÅÆ‘ŠZ!‹Åb1»ÁC'§¯^Î;[=} Ð×_Ö_̼Y0süý sò^× +Ò†´"ÝF¾1¢Ž$€#ÚûžŸ=(S'ŠŸøÿ·Ó¯ÃÔ†aÆÝ/å [#è ÔT=(’N§Óé4L&“É$Íf³Ù¬O¿GN¥R©TÊg³<茡Qœ~zä" ¡—Îðxœ|H !é‡Ip÷›üE݆—%ËIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tab_right_active.gif0000644000000000000000000000051112247657030021266 0ustar rootrootGIF89aÕ(ÿÿÿ1p‚D}ŽF~6s…=yŠ;wˆˆ­·¶ÍÓËÛßuŸ«ÜçêÈÙÞ×äç—·Àòö÷ýþþ±ÉÐ5s…£¿ÇQ†•ðõöo›¨7t†éðña‘Ÿrª3qƒ„ª´a’Ÿûüýùûû¨ÂÊP†•_ž€§²ž¼ÄT‰—d“¡tžªÿÿÿ!ù(,f@”pH,Q@ql“älEÀQ5^¯‡À¨Kü^' Yh¾"¢uûš0„ÈóëB0èæ¯UWN…WV‹a^‘W$'E—_eW %O£W |BA;SOGo-2.1.1b/UI/WebServerResources/SchedulerUI.css0000644000000000000000000006622412247657030020204 0ustar rootrootDIV#leftPanel { position: absolute; top: 80px; left: 0px; width: 19.25em; bottom: 0px; background-color: #CCDDEC; overflow: auto; overflow-x: hidden; } DIV#schedulerTabs { position: absolute; top: 4px; left: 1px; right: 0px; height: 186px; } DIV#schedulerTabs .tabs { right: 5px; } DIV#schedulerTabs .tab { left: 0px; right: 0px; } DIV#calendarSelectorButtons { padding-left: 6px; } DIV.colorBox { display: inline-block; } TD DIV.colorBox, TD DIV.colorBox:hover { border-color: #fff; } UL#calendarList { cursor: default; clear: left; margin: 0px; padding: 0px; list-style-type: none; list-style-image: none; -moz-user-select: none; -khtml-user-select: none; } UL#calendarList LI { cursor: pointer; width: 100%; white-space: nowrap; line-height: 2em; padding-left: 10px; } #tasksList .duelater, #tasksList .duetoday, #tasksList .overdue { font-weight: bold; } #tasksList .overdue, #tasksList .important { color: #f00 !important; } #tasksList .low { color: #666 !important; } #tasksList .duetoday { color: #00f !important; } #tasksList .completed span { text-decoration: line-through; color: #000; } #tasksList .important SPAN { background-image: url(important.png); background-repeat: no-repeat; background-position: 3px 2px; padding-left: 10px; } #tasksList SPAN { padding-left: 2px; } #tasksList ._selected.overdue { color: #fff !important; background-color: #f00 !important; } #tasksList ._selected.duetoday { color: #fff !important; background-color: #00f !important; } #tasksList ._selected.duelater, #tasksList ._selected.completed { color: #fff !important; background-color: #9ABCD8 !important; } DIV#rightPanel { position: absolute; top: 80px; left: 19.25em; right: 0px; bottom: 0px; margin-left: 5px; overflow: hidden; } /* top lists in tabs */ DIV#eventsListView, DIV#tasksListView { cursor: default; background-color: #FFFFFF; overflow: hidden; overflow-y: auto; } DIV#calendarView { position: absolute; background-color: #fff; top: 18em; margin-top: 5px; bottom: 0px; width: 100%; border-top: 1px solid #aaa; border-left: 1px solid #aaa; -moz-user-select: none; -khtml-user-select: none; } DIV#calendarView A { text-decoration: none; font: inherit; color: inherit; } #verticalDragHandle { cursor: e-resize; border: 0px; top: 81px; bottom: 0px; left: 19.25em; width: 5px; } #rightDragHandle { cursor: n-resize; top: 18em; left: 0px; right: 0px; height: 5px; } DIV#dateSelectorView { overflow: hidden; } #dateSelector { margin: 0px auto; background-color: #fff; border-top: 1px solid #909090 !important; border-left: 1px solid #FFFFFF !important; border-bottom: 1px solid #909090 !important; border-right: 1px solid #909090 !important; } #dateSelector > .header { background-color: #efefef; width: 100%; white-space: nowrap; vertical-align: middle; text-align: center; padding: .2em 0px; margin: 0px; border: 0px; } #dateSelector > .header #leftArrow { float: left; margin-top: 3px; } #dateSelector > .header #rightArrow { float: right; margin-top: 3px; margin-right: 2px; } #dateSelector > .header SPAN { cursor: default; font-size: medium; vertical-align: middle; font-weight: bold; border: 1px solid transparent; } #dateSelector > .header SPAN:hover { border-left: 1px solid #fff; border-top: 1px solid #fff; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } #dateSelector .dayOfWeek { color: #00f; } #dateSelector TABLE, #dateSelector TABLE TABLE { border-collapse: collapse; text-align: center; margin: 0px auto; width: 100%; } TABLE#dateSelectorTable { margin-bottom: 5px; } TABLE#dateSelectorTable TD TABLE TD { width: 5px; /* temp hack */ } TABLE#dateSelectorTable TD TABLE TD.activeDay, TABLE#dateSelectorTable TD TABLE TD.inactiveDay, TABLE#dateSelectorTable TD TABLE TD.dayOfToday { width: 100%; } #dateSelector TABLE TABLE TD.activeDay, #dateSelector TABLE TABLE TD.inactiveDay, #dateSelector TABLE TABLE TD.dayOfToday { cursor: pointer; margin: 0px; padding: 0px; border: 1px solid #fff; } #dateSelectorTable TABLE TD.activeDay:hover, #dateSelectorTable TABLE TD.inactiveDay:hover { border: 1px solid #CCDDEC; } #dateSelectorTable TABLE TD.activeDay:active, #dateSelectorTable TABLE TD.inactiveDay:active { background-color: #ddd; } #dateSelectorTable TD SPAN { display: block; color: #000; background: inherit; } #dateSelector TD.inactiveDay SPAN { color: #dedfde; } #dateSelector TD.dayOfToday { background-color: #CCDDEC; border: 1px solid #CCDDEC; } #dateSelectorTable TABLE TD._selected SPAN { color: #fff; } #dateSelectorTable TD.activeDay + TD, #dateSelectorTable TD.inactiveDay + TD, #dateSelectorTable TD.dayOfToday + TD { visibility: hidden; display: none; } TABLE#eventsList, TABLE#tasksList { width: 100%; } TABLE#eventsList .colorBox { margin-right: 4px; } #eventsList TD.headerTitle, #eventsList TD.headerDateTime { width: 30%; } #tasksList .headerPriority { width: 80px;} TABLE#eventsList TD, TABLE#eventsList TH, TABLE#tasksList TD, TABLE#tasksList TH { overflow: hidden; line-height: 1.5em; white-space: nowrap; } /* pre, normal, nowrap */ TABLE#eventsList TH, TABLE#tasksList TH { white-space: pre; } TABLE#tasksList TD#taskCompletedHeader { text-align: center; width: 20px; } TABLE#eventsList THEAD TD:last-child, TABLE#tasksList THEAD TD:last-child { border-right: 0px; } .filterPanel, #schedulerTabs .tab label { display: block; margin: 0; padding: 0 0 5px 5px; background-color: #eee; background-color: #E6E7E6; } DIV#eventDialog { width: 200px; } DIV#eventDialog H1, DIV#eventDialog P { font-size: 13px; margin: 0; padding: 0; } DIV#eventDialog SPAN.label { color: #444; } DIV#eventDialog .description { margin-top: 1em; font-size: 11px; max-height: 125px; overflow: auto; border-top: 1px solid #eee; } ._unfocused#dateSelector TD._selected, UL._unfocused > LI._selected, TABLE._unfocused#eventsList TR._selected TD { background-color: #B3CCE2 !important; color: #fff !important; } SPAN.dayCellLabel { color: #77a; font-weight: bold; } SPAN.daysHeader, SPAN.weeksHeader, SPAN.monthsHeader { display: block; white-space: nowrap; text-align: center; background-color: #DFDFDF; overflow: hidden; width: 100%; margin: 0px; height: 3em; padding: 2px 0px; border-bottom: 1px solid #ccc; } SPAN.daysHeader SPAN, SPAN.weeksHeader SPAN, SPAN.monthsHeader SPAN { font-size: large; margin: .1em; padding: 6px 12px; text-align: center; line-height: 1.5em; border: 1px solid transparent; vertical-align: top; } SPAN.daysHeader A, SPAN.weeksHeader A, SPAN.monthsHeader A { border: 1px solid transparent; line-height: 1.5em; padding: 0px 0.7em; } .day1 A:hover, .week1 A:hover, .month1 A:hover { border-top: 1px solid #fff; border-left: 1px solid #fff; border-bottom: 1px solid #828482; border-right: 1px solid #828482; } .day1 A:active, .week1 A:active, .month1 A:active { border-top: 1px solid #828482; border-left: 1px solid #828482; border-bottom: 1px solid #fff; border-right: 1px solid #fff; } #listCollapse { position: absolute; top: .2em; right: 0; margin: 0.5em 1em; } #listCollapse img { position: absolute; } #listCollapse img.collapse { clip: rect(0 18px 18px 0); left: 0; top: 0; } #listCollapse img.collapse:hover { clip: rect(0 36px 18px 18px); left: -18px; } #listCollapse img.rise { clip: rect(18px 18px 36px 0); left: 0; top: -18px; } #listCollapse img.rise:hover { clip: rect(18px 36px 36px 18px); left: -18px; } DIV#calendarHeader, DIV#daysView { position: absolute; top: 0px; left: 0px; } DIV#daysView { top: 120px; bottom: 0px; border-top: 1px solid #ccc; overflow: auto; overflow-x: hidden; right: 0px;} DIV#calendarHeader { top: 50px; border: 0px; height: 100px; right: 0px; } DIV#calendarHeader DIV.dayLabels, DIV#calendarHeader DIV.days { position: absolute; border-right: 1px solid #ccc; border-top: 1px solid #ccc; left: 50px; /* 'right' is computed from JS code when daysView is first drawn */ overflow: hidden; } DIV#calendarHeader DIV.dayLabels { top: 0px; height: 35px; } DIV#calendarHeader DIV.dayLabels DIV.day { text-align: center; color: #666; background-color: #E7E7E7; } DIV#calendarHeader SPAN.dayOfWeek { font-size: medium; } DIV#calendarHeader DIV.dayLabels { cursor: default; } DIV#calendarHeader DIV.days { cursor: pointer; bottom: 0px; top: 35px; } DIV#calendarHeader DIV.day, DIV#daysView DIV.day { position: absolute; border-left: 1px solid #ccc; } DIV#calendarHeader DIV.day { height: 100%; } DIV#calendarHeader DIV.days DIV.day { overflow: auto; overflow-x: hidden; } .menu LI.currentMonth, .menu LI.currentYear { border-top: 1px solid #aaa; border-left: 1px solid #aaa; border-bottom: 1px solid #fff; border-right: 1px solid #fff; background-color: #ccc; color: #222; } DIV.eventView { display: block; overflow: hidden; white-space: nowrap; border: 1px solid #000; } /* new draggable presentation */ DIV#daysView DIV.hours { position: absolute; top: 0px; left: 0px; height: 960px; width: 50px; } DIV#daysView DIV.hour { position: relative; left: 0px; top: 0px; padding-top: 2px; padding-right: 2px; text-align: right; right: 0px; height: 37px; font-weight: bold; border-bottom: 1px solid #ccc; } DIV#daysView DIV.days { position: relative; margin-left: 50px; } DIV.multicolumnDayView DIV.lastDayUser { border-right: 1px solid #ccc; } DIV.monthView { position: absolute; left: .5em; top: 40px; right: 1em; bottom: 1em; min-width: 20em; min-height: 25em; } DIV.monthView > DIV, DIV.monthView > DIV.days > DIV { position: absolute; } DIV.monthView > DIV.headerDay { text-align: center; cursor: default; padding-top: .5em; border-left: 1px solid #909090 !important; border-top: 1px solid #909090 !important; top: 0px; color: #666; height: 1.5em; font-weight: bold; background-color: #E7E7E7; } DIV.dayOfAnotherMonth { background-color: #e7efef; } DIV.monthView DIV.dayHeader { margin-right: 0px; height: 20px; padding-top: 2px; padding-right: 2px; text-align: right; cursor: pointer; color: #666; -moz-user-select: none; } DIV#monthDaysView DIV.selectedDay DIV.dayHeader { font-weight: bold; } DIV.monthView DIV.days { top: 2em; cursor: pointer; bottom: 0px; left: 0px; right: 0px; } DIV.monthView DIV.day { position: absolute; border-left: 1px solid #909090; border-top: 1px solid #909090; min-height: 40px; overflow: auto; overflow-x: hidden; } DIV#daysView DIV.day DIV.clickableHourCell { cursor: pointer; height: 39px; background-color: #fff; border-bottom: 1px solid #ccc; } DIV#calendarHeader DIV.days DIV.weekEndDay, DIV#daysView DIV.day DIV.clickableHourCell.outOfDay, DIV#daysView DIV.weekEndDay DIV.clickableHourCell, DIV#daysView DIV.weekEndDay DIV.clickableHourCell.outOfDay { background-color: #e6e7e6; } DIV#monthDaysView DIV.dayOfToday, DIV.daysViewFor7Days#calendarHeader DIV.days DIV.dayOfToday, DIV.daysViewFor7Days#daysView DIV.dayOfToday DIV.clickableHourCell { background-color: #d6dfe9; } DIV.daysViewFor7Days#daysView DIV.dayOfToday DIV.clickableHourCell.outOfDay { background-color: #ccddec; } DIV.daysViewFor7Days#calendarHeader DIV.days DIV.selectedDay, DIV.daysViewFor7Days#daysView DIV.selectedDay DIV.clickableHourCell, DIV#monthDaysView DIV.selectedDay { background-color: #ffe79c; } DIV.daysViewFor7Days#calendarHeader DIV.days DIV.selectedDay.weekEndDay, DIV.daysViewFor7Days#daysView DIV.selectedDay.weekEndDay DIV.clickableHourCell, DIV.daysViewFor7Days#daysView DIV.selectedDay DIV.clickableHourCell.outOfDay { background-color: #f5dd92; } .minutes15, .minutes30, .minutes45 { display: block; height: 9px; border-bottom: 1px dotted #eee; } .minutes30 { border-bottom: 1px dotted #ccc; } DIV.weekOf4 { height: 25%; } DIV.weekOf5 { height: 20%; } DIV.weekOf6 { height: 16.666667%; } DIV.monthView DIV.week0of4, DIV.monthView DIV.week0of5, DIV.monthView DIV.week0of6 { top: 0px; } DIV.monthView DIV.week1of4 { top: 25%; } DIV.monthView DIV.week2of4 { top: 50%; } DIV.monthView DIV.week3of4 { top: 75%; } DIV.monthView DIV.week1of5 { top: 20%; } DIV.monthView DIV.week2of5 { top: 40%; } DIV.monthView DIV.week3of5 { top: 60%; } DIV.monthView DIV.week4of5 { top: 80%; } DIV.monthView DIV.week1of6 { top: 16.666667%; } DIV.monthView DIV.week2of6 { top: 33.333333%; } DIV.monthView DIV.week3of6 { top: 50%; } DIV.monthView DIV.week4of6 { top: 66.666667%; } DIV.monthView DIV.week5of6 { top: 83.333333%; } DIV.monthView DIV.week3 { top: 45%; } DIV.monthView DIV.week4 { top: 60%; } DIV.monthView DIV.week5 { top: 75%; } DIV.monthView DIV.week6 { top: 90%; } DIV.monthView DIV.week3of4, DIV.monthView DIV.week4of5, DIV.monthView DIV.week5of6 { border-bottom: 2px solid #909090 !important; } DIV.daysViewFor1Days DIV.day { width: 100%; } DIV.monthView DIV.headerDay, DIV.monthView DIV.day, DIV.daysViewFor7Days DIV.day { width: 14.2857%; } DIV.monthView DIV.day0, DIV.daysViewFor7Days DIV.day0 { left: 0px; } DIV.monthView DIV.day1, DIV.daysViewFor7Days DIV.day1 { left: 14.2857%; } DIV.monthView DIV.day2, DIV.daysViewFor7Days DIV.day2 { left: 28.5714%; } DIV.monthView DIV.day3, DIV.daysViewFor7Days DIV.day3 { left: 42.8571%; } DIV.monthView DIV.day4, DIV.daysViewFor7Days DIV.day4 { left: 57.1428%; } DIV.monthView DIV.day5, DIV.daysViewFor7Days DIV.day5 { left: 71.4285%; } DIV.monthView DIV.day6, DIV.daysViewFor7Days DIV.day6 { left: 85.7142%; border-right: 1px solid #909090; } /* "left" and "width" for #daysView DIV.event are computed in JS code */ #daysView DIV.event { cursor: default; margin-right: 1px; position: absolute; } DIV#daysView DIV.event.starts0 { top: 0px; } DIV#daysView DIV.event.starts1 { top: 10px; } DIV#daysView DIV.event.starts2 { top: 20px; } DIV#daysView DIV.event.starts3 { top: 30px; } DIV#daysView DIV.event.starts4 { top: 40px; } DIV#daysView DIV.event.starts5 { top: 50px; } DIV#daysView DIV.event.starts6 { top: 60px; } DIV#daysView DIV.event.starts7 { top: 70px; } DIV#daysView DIV.event.starts8 { top: 80px; } DIV#daysView DIV.event.starts9 { top: 90px; } DIV#daysView DIV.event.starts10 { top: 100px; } DIV#daysView DIV.event.starts11 { top: 110px; } DIV#daysView DIV.event.starts12 { top: 120px; } DIV#daysView DIV.event.starts13 { top: 130px; } DIV#daysView DIV.event.starts14 { top: 140px; } DIV#daysView DIV.event.starts15 { top: 150px; } DIV#daysView DIV.event.starts16 { top: 160px; } DIV#daysView DIV.event.starts17 { top: 170px; } DIV#daysView DIV.event.starts18 { top: 180px; } DIV#daysView DIV.event.starts19 { top: 190px; } DIV#daysView DIV.event.starts20 { top: 200px; } DIV#daysView DIV.event.starts21 { top: 210px; } DIV#daysView DIV.event.starts22 { top: 220px; } DIV#daysView DIV.event.starts23 { top: 230px; } DIV#daysView DIV.event.starts24 { top: 240px; } DIV#daysView DIV.event.starts25 { top: 250px; } DIV#daysView DIV.event.starts26 { top: 260px; } DIV#daysView DIV.event.starts27 { top: 270px; } DIV#daysView DIV.event.starts28 { top: 280px; } DIV#daysView DIV.event.starts29 { top: 290px; } DIV#daysView DIV.event.starts30 { top: 300px; } DIV#daysView DIV.event.starts31 { top: 310px; } DIV#daysView DIV.event.starts32 { top: 320px; } DIV#daysView DIV.event.starts33 { top: 330px; } DIV#daysView DIV.event.starts34 { top: 340px; } DIV#daysView DIV.event.starts35 { top: 350px; } DIV#daysView DIV.event.starts36 { top: 360px; } DIV#daysView DIV.event.starts37 { top: 370px; } DIV#daysView DIV.event.starts38 { top: 380px; } DIV#daysView DIV.event.starts39 { top: 390px; } DIV#daysView DIV.event.starts40 { top: 400px; } DIV#daysView DIV.event.starts41 { top: 410px; } DIV#daysView DIV.event.starts42 { top: 420px; } DIV#daysView DIV.event.starts43 { top: 430px; } DIV#daysView DIV.event.starts44 { top: 440px; } DIV#daysView DIV.event.starts45 { top: 450px; } DIV#daysView DIV.event.starts46 { top: 460px; } DIV#daysView DIV.event.starts47 { top: 470px; } DIV#daysView DIV.event.starts48 { top: 480px; } DIV#daysView DIV.event.starts49 { top: 490px; } DIV#daysView DIV.event.starts50 { top: 500px; } DIV#daysView DIV.event.starts51 { top: 510px; } DIV#daysView DIV.event.starts52 { top: 520px; } DIV#daysView DIV.event.starts53 { top: 530px; } DIV#daysView DIV.event.starts54 { top: 540px; } DIV#daysView DIV.event.starts55 { top: 550px; } DIV#daysView DIV.event.starts56 { top: 560px; } DIV#daysView DIV.event.starts57 { top: 570px; } DIV#daysView DIV.event.starts58 { top: 580px; } DIV#daysView DIV.event.starts59 { top: 590px; } DIV#daysView DIV.event.starts60 { top: 600px; } DIV#daysView DIV.event.starts61 { top: 610px; } DIV#daysView DIV.event.starts62 { top: 620px; } DIV#daysView DIV.event.starts63 { top: 630px; } DIV#daysView DIV.event.starts64 { top: 640px; } DIV#daysView DIV.event.starts65 { top: 650px; } DIV#daysView DIV.event.starts66 { top: 660px; } DIV#daysView DIV.event.starts67 { top: 670px; } DIV#daysView DIV.event.starts68 { top: 680px; } DIV#daysView DIV.event.starts69 { top: 690px; } DIV#daysView DIV.event.starts70 { top: 700px; } DIV#daysView DIV.event.starts71 { top: 710px; } DIV#daysView DIV.event.starts72 { top: 720px; } DIV#daysView DIV.event.starts73 { top: 730px; } DIV#daysView DIV.event.starts74 { top: 740px; } DIV#daysView DIV.event.starts75 { top: 750px; } DIV#daysView DIV.event.starts76 { top: 760px; } DIV#daysView DIV.event.starts77 { top: 770px; } DIV#daysView DIV.event.starts78 { top: 780px; } DIV#daysView DIV.event.starts79 { top: 790px; } DIV#daysView DIV.event.starts80 { top: 800px; } DIV#daysView DIV.event.starts81 { top: 810px; } DIV#daysView DIV.event.starts82 { top: 820px; } DIV#daysView DIV.event.starts83 { top: 830px; } DIV#daysView DIV.event.starts84 { top: 840px; } DIV#daysView DIV.event.starts85 { top: 850px; } DIV#daysView DIV.event.starts86 { top: 860px; } DIV#daysView DIV.event.starts87 { top: 870px; } DIV#daysView DIV.event.starts88 { top: 880px; } DIV#daysView DIV.event.starts89 { top: 890px; } DIV#daysView DIV.event.starts90 { top: 900px; } DIV#daysView DIV.event.starts91 { top: 910px; } DIV#daysView DIV.event.starts92 { top: 920px; } DIV#daysView DIV.event.starts93 { top: 930px; } DIV#daysView DIV.event.starts94 { top: 940px; } DIV#daysView DIV.event.starts95 { top: 950px; } DIV#daysView DIV.event.lasts0 { height: 0px; } DIV#daysView DIV.event.lasts1 { height: 10px; } DIV#daysView DIV.event.lasts2 { height: 20px; } DIV#daysView DIV.event.lasts3 { height: 30px; } DIV#daysView DIV.event.lasts4 { height: 40px; } DIV#daysView DIV.event.lasts5 { height: 50px; } DIV#daysView DIV.event.lasts6 { height: 60px; } DIV#daysView DIV.event.lasts7 { height: 70px; } DIV#daysView DIV.event.lasts8 { height: 80px; } DIV#daysView DIV.event.lasts9 { height: 90px; } DIV#daysView DIV.event.lasts10 { height: 100px; } DIV#daysView DIV.event.lasts11 { height: 110px; } DIV#daysView DIV.event.lasts12 { height: 120px; } DIV#daysView DIV.event.lasts13 { height: 130px; } DIV#daysView DIV.event.lasts14 { height: 140px; } DIV#daysView DIV.event.lasts15 { height: 150px; } DIV#daysView DIV.event.lasts16 { height: 160px; } DIV#daysView DIV.event.lasts17 { height: 170px; } DIV#daysView DIV.event.lasts18 { height: 180px; } DIV#daysView DIV.event.lasts19 { height: 190px; } DIV#daysView DIV.event.lasts20 { height: 200px; } DIV#daysView DIV.event.lasts21 { height: 210px; } DIV#daysView DIV.event.lasts22 { height: 220px; } DIV#daysView DIV.event.lasts23 { height: 230px; } DIV#daysView DIV.event.lasts24 { height: 240px; } DIV#daysView DIV.event.lasts25 { height: 250px; } DIV#daysView DIV.event.lasts26 { height: 260px; } DIV#daysView DIV.event.lasts27 { height: 270px; } DIV#daysView DIV.event.lasts28 { height: 280px; } DIV#daysView DIV.event.lasts29 { height: 290px; } DIV#daysView DIV.event.lasts30 { height: 300px; } DIV#daysView DIV.event.lasts31 { height: 310px; } DIV#daysView DIV.event.lasts32 { height: 320px; } DIV#daysView DIV.event.lasts33 { height: 330px; } DIV#daysView DIV.event.lasts34 { height: 340px; } DIV#daysView DIV.event.lasts35 { height: 350px; } DIV#daysView DIV.event.lasts36 { height: 360px; } DIV#daysView DIV.event.lasts37 { height: 370px; } DIV#daysView DIV.event.lasts38 { height: 380px; } DIV#daysView DIV.event.lasts39 { height: 390px; } DIV#daysView DIV.event.lasts40 { height: 400px; } DIV#daysView DIV.event.lasts41 { height: 410px; } DIV#daysView DIV.event.lasts42 { height: 420px; } DIV#daysView DIV.event.lasts43 { height: 430px; } DIV#daysView DIV.event.lasts44 { height: 440px; } DIV#daysView DIV.event.lasts45 { height: 450px; } DIV#daysView DIV.event.lasts46 { height: 460px; } DIV#daysView DIV.event.lasts47 { height: 470px; } DIV#daysView DIV.event.lasts48 { height: 480px; } DIV#daysView DIV.event.lasts49 { height: 490px; } DIV#daysView DIV.event.lasts50 { height: 500px; } DIV#daysView DIV.event.lasts51 { height: 510px; } DIV#daysView DIV.event.lasts52 { height: 520px; } DIV#daysView DIV.event.lasts53 { height: 530px; } DIV#daysView DIV.event.lasts54 { height: 540px; } DIV#daysView DIV.event.lasts55 { height: 550px; } DIV#daysView DIV.event.lasts56 { height: 560px; } DIV#daysView DIV.event.lasts57 { height: 570px; } DIV#daysView DIV.event.lasts58 { height: 580px; } DIV#daysView DIV.event.lasts59 { height: 590px; } DIV#daysView DIV.event.lasts60 { height: 600px; } DIV#daysView DIV.event.lasts61 { height: 610px; } DIV#daysView DIV.event.lasts62 { height: 620px; } DIV#daysView DIV.event.lasts63 { height: 630px; } DIV#daysView DIV.event.lasts64 { height: 640px; } DIV#daysView DIV.event.lasts65 { height: 650px; } DIV#daysView DIV.event.lasts66 { height: 660px; } DIV#daysView DIV.event.lasts67 { height: 670px; } DIV#daysView DIV.event.lasts68 { height: 680px; } DIV#daysView DIV.event.lasts69 { height: 690px; } DIV#daysView DIV.event.lasts70 { height: 700px; } DIV#daysView DIV.event.lasts71 { height: 710px; } DIV#daysView DIV.event.lasts72 { height: 720px; } DIV#daysView DIV.event.lasts73 { height: 730px; } DIV#daysView DIV.event.lasts74 { height: 740px; } DIV#daysView DIV.event.lasts75 { height: 750px; } DIV#daysView DIV.event.lasts76 { height: 760px; } DIV#daysView DIV.event.lasts77 { height: 770px; } DIV#daysView DIV.event.lasts78 { height: 780px; } DIV#daysView DIV.event.lasts79 { height: 790px; } DIV#daysView DIV.event.lasts80 { height: 800px; } DIV#daysView DIV.event.lasts81 { height: 810px; } DIV#daysView DIV.event.lasts82 { height: 820px; } DIV#daysView DIV.event.lasts83 { height: 830px; } DIV#daysView DIV.event.lasts84 { height: 840px; } DIV#daysView DIV.event.lasts85 { height: 850px; } DIV#daysView DIV.event.lasts86 { height: 860px; } DIV#daysView DIV.event.lasts87 { height: 870px; } DIV#daysView DIV.event.lasts88 { height: 880px; } DIV#daysView DIV.event.lasts89 { height: 890px; } DIV#daysView DIV.event.lasts90 { height: 900px; } DIV#daysView DIV.event.lasts91 { height: 910px; } DIV#daysView DIV.event.lasts92 { height: 920px; } DIV#daysView DIV.event.lasts93 { height: 930px; } DIV#daysView DIV.event.lasts94 { height: 940px; } DIV#daysView DIV.event.lasts95 { height: 950px; } DIV#daysView DIV.event.lasts96 { height: 960px; } DIV.event > DIV.eventInside { position: absolute; overflow: hidden; padding: 1px; top: 0px; bottom: 0px; left: 2px; right: 1px; -webkit-border-radius: 2px; border-radius: 2px; } DIV.eventInside SPAN.location { font-size: smaller; } DIV.gradient, DIV.text { position: absolute; top: 1px; left: 1px; right: 1px; bottom: 1px; overflow: hidden; } DIV.gradient > IMG { position: absolute; top: 0; bottom: 0; left: 0; right: 0; height: 100%; min-height: 15px; /* for 15-minute events */ width: 100%; } DIV.event._selected > DIV.eventInside > DIV.gradient { display: none; } DIV.text SPAN.icons { float: right; } DIV.text SPAN IMG { vertical-align: middle; } DIV#calendarHeader DIV.event, DIV.monthView DIV.event { position: relative; cursor: default; margin-right: 0px; left: 0px; right: 0px; margin-right: 1px; white-space: nowrap; height: 20px; } DIV.eventInside.tentative, DIV.eventInside.needs-action { -moz-opacity: 0.7; opacity: 0.7; } DIV.eventInside.needs-action { border: 2px dotted #000; } DIV.eventInside.tentative DIV.text, DIV.eventInside.needs-action DIV.text { top: 0px; left: 2px; } DIV.eventInside.delegated, DIV.eventInside.declined { -moz-opacity: 0.4; opacity: 0.4; } /* event DnD */ DIV.event DIV.topDragGrip, DIV.event DIV.bottomDragGrip { position: absolute; border: 0px; left: 1px; right: 1px; height: 5px; background-repeat: no-repeat; background-position: center; } DIV.event DIV.topDragGrip { top: 1px; } DIV.event DIV.bottomDragGrip { bottom: 1px; } DIV.event DIV.leftDragGrip, DIV.event DIV.rightDragGrip { position: absolute; border: 0px; top: 4px; height: 11px; width: 3px; background-repeat: no-repeat; background-position: center; } DIV.event DIV.leftDragGrip { left: 1px; } DIV.event DIV.rightDragGrip { right: 1px; } #daysView DIV.event.dragging { left: 0px !important; right: 0px !important; } DIV.event.dragging > DIV.eventInside { -moz-opacity: 1 !important; border: 1px dashed #555; opacity: 1 !important; background-color: transparent !important; } DIV.event.dragging DIV.text { color: #555; top: 0px; left: 0px; } DIV.event.dragging IMG, DIV.event.dragging DIV.topDragGrip, DIV.event.dragging DIV.bottomDragGrip, DIV.event.dragging DIV.leftDragGrip, DIV.event.dragging DIV.rightDragGrip { display: none; } DIV.event.draggable:hover DIV.topDragGrip { cursor: n-resize; background-image: url(event-grippy-top.png); } DIV.event.draggable:hover DIV.bottomDragGrip { cursor: s-resize; background-image: url(event-grippy-bottom.png); } DIV.event.draggable:hover DIV.leftDragGrip { cursor: w-resize; background-image: url(event-grippy-vertical.png); } DIV.event.draggable:hover DIV.rightDragGrip { cursor: e-resize; background-image: url(event-grippy-vertical.png); } #daysView DIV.eventDragGhost { left: 0px; right: 0px; } #daysView DIV.eventDragGhost > DIV.eventInside { padding: 0px; border-left: 1px solid #555; border-right: 1px solid #555; } #daysView DIV.eventDragGhost.startGhost > DIV.eventInside { border-top: 1px solid #555; } #daysView DIV.eventDragGhost.endGhost > DIV.eventInside { border-bottom: 1px solid #555; } #monthDaysView DIV.eventDragGhost, #calendarHeader DIV.eventDragGhost { position: absolute !important; color: #fff; left: 0px; right: 0px; margin-right: 1px; border-top: 1px solid #555; border-bottom: 1px solid #555; } #monthDaysView DIV.eventDragGhost { top: 21px; } #calendarHeader DIV.eventDragGhost { top: 0px; } #monthDaysView DIV.eventDragGhost.startGhost, #calendarHeader DIV.eventDragGhost.startGhost { border-left: 1px solid #555; } #monthDaysView DIV.eventDragGhost.endGhost, #calendarHeader DIV.eventDragGhost.endGhost { border-right: 1px solid #555; } #ghostStartHour, #ghostEndHour { position: absolute; width: 100%; vertical-align: baseline; height: 14px; left: 0px; color: #222; text-align: center; } #ghostStartHour { top: -14px; } #ghostEndHour { bottom: -14px; } DIV#nowLineDisplay { position: relative; width: 100%; height: 2px; background: red; z-index: 49; } DIV#freeBusyReplicas INPUT.textField { width: 7em; } DIV#freeBusyReplicas a.calendarButton { right: 0px; } DIV#freeBusyReplicas DIV { display: inline-block; height: 2em; } TD.attendees A.button { float: left; left: 19px; margin-top: 5px; } SOGo-2.1.1b/UI/WebServerResources/remove-icon.png0000644000000000000000000000176312247657030020244 0ustar rootroot‰PNG  IHDR€—mJ;iCCPICC Profilex…”KhÔP†ÿŒ)‚´‚¨µ”àB‹´%>ЊPÛiµÖ‘qûÐ"È4sgM31™ˆHAÜùZŠˆ‹*âBºPp¥ ‘BëkQq¥"ˆB7RÆÿ&íL*V/$ùrÎÏë†USŽcE4`ØÎ»É®¨vèð€¶xU¨A5¸R†ç´'û}¦V>ç¯é·P¤e²IÆŠõ˜ø´mõýKbïëžöúžùúyo5.ŠFëŠlÀ[%¼Wòɼ“§æˆdc(•&;äF·'ÙA¾A^š ñ`ˆÓÂ3€ª6jr†ã2Nd¹¥hdeÌQ²n§M›<%íiϦ†ýF~ÈYÐÆ•­k€E/+¶½ ¬Z_±5Ô+û±-ÛϤ?¥vÜËlÙì‡Sª£¬éC©ôs=°ø0sµTúu«Tš¹Í¬ã™eÜ¢¯eaÊ+ ¨7ØÍøÉ9Zˆƒž|U p“sì_Ä.×?ˉ g"çÙnpåÅ)ÎèÈ9§]3;”×6ëúv­G+´nÛhnÔR–¥ù.Os…'Ü¢H7cØ*pÎþZÆ{µ°{òÉþ"ç„·{–•‘tª“³D3Ûú’»Éä{sO7¹×TÆÝÓ°²ÑÌw÷é³­8ÏEj"uö`ü™ñÕÉGå<$xŃ2¦o?–Ú— ×Óž<ž‹IM-÷¶êáIV¬3CñY~í’2ï:jî8–ÿͳ¶Ès†6ï64$Ñ…(šàÀEzL*LZ¥_ÐjÂÃñ¿*-$Ê»,*ºð™{>û{N ÀÝ2~¢qŒ4–#hú;ý›þF¿©ßÑ¿^©/4T<#îQÓ¿üqefYŒÔ(ãËš‚ø«m§×B–Öa^AO^Yß®.c_©/{4™C\ŒO‡º¡LMd<Ùµì¾H¶ø&ü|sÙšµ/Î>©«äz£Ž™¬~q6\ kÿ³«`Ò²«ðä. DIV.highlighted { background-color: #ddf; } */ /* content lists */ td.tbtv_actcell { border-width: 1px; border-style: solid; border-top-color: #808080; border-left-color: #808080; border-bottom-color: #808080; border-right-color: #808080; padding-top: 4px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px; } TD.headerCell, TH.headerCell, TD.tbtv_headercell, TH.tbtv_headercell, TD.tbtv_navcell, TH.tbtv_navcell { vertical-align: middle; background: transparent url('thead_bg.png') repeat-x top right; border: 1px solid #9B9B9B; border-left: none; text-align: left; font-weight: normal; background-color: #E7E7E7; height: 20px; } TD.sortableTableHeader:active, TH.sortableTableHeader:active { background-position: bottom left; } TD.headerCell SPAN, TH.headerCell SPAN, TD.tbtv_headercell SPAN, TH.tbtv_headercell SPAN { float: left; } TD.tbtv_headercell A, TH.tbtv_headercell A { cursor: default; margin: 0px auto; display: block; color: black; } TD.tbtv_headercell A:hover, TH.tbtv_headercell A:hover { margin: 0px auto; display: block; color: black; text-decoration: none; /* background-color: #C4C0B8; */ } IMG.sortImage, TD.headerCell IMG.tbtv_sortcell, TD.tbtv_headercell IMG.tbtv_sortcell, TH.tbtv_headercell IMG.tbtv_sortcell { float: right; text-align: right; border: 0px; width: 12px; height: 12px; } .tableview { cursor: default; vertical-align: top; } TR.tableview TD { white-space: nowrap; padding-left: .3em; padding-right: .3em; } TD.headerDateTime { min-width: 30em; } TD.headerTitle { width: 20%; } TD.headerLocation, TD.headerCalendarName { min-width: 15em; width: 15em; } td img.tbtv_sortcell { float: right; text-align: right; margin-top: .2em; border: 0px; width: 12px; height: 12px; } TD.subjectCell, TD.tbtv_subject_headercell { overflow: hidden; } /* drag handles */ DIV.dragHandle { position: absolute; z-index: 1; background: #E6E7E6 url("dragdot.png") no-repeat center center; } DIV.dragHandle:active { background-color: #99a; } /* search fields */ DIV.filterPanel { height: 2em; vertical-align: middle; width: 100%; padding-top: 3px; } DIV#javascriptSafetyNet { position: absolute; background-color: transparent; left: 0px; right: 0px; top: 0px; bottom: 0px; } DIV.javascriptPopupBackground { position: absolute; background-color: #999; -moz-opacity: 0.6; opacity: 0.6; z-index: 2; top: 0px; left: 0px; right: 0px; bottom: 0px; text-align: center; } DIV.javascriptMessagePseudoWindow, DIV.javascriptMessagePseudoTopWindow { position: absolute; z-index: 2; border-bottom: 2px solid #888; padding: 1em; margin: 0px auto; color: #262B33; background-color: #E6E7E6; -moz-border-bottom-colors: #000 #9c9a94 transparent; -moz-opacity: 1.0; opacity: 1.0; } DIV.javascriptMessagePseudoTopWindow { border-top: 0px; border-left: 0px; border-right: 0px; } DIV.javascriptMessagePseudoWindow { border-top: 2px solid #fff; border-left: 2px solid #fff; border-right: 2px solid #888; -moz-border-top-colors: #efebe7 #fff; -moz-border-left-colors: #efebe7 #fff; -moz-border-right-colors: #000 #9c9a94 transparent; } DIV.noJavascriptErrorMessage { top: 10em; left: 17em; width: 24em; } DIV.noJavascriptErrorMessage A { float: right; margin: 0px auto; } LI.denied { color: #999; } .popupMenu LI:hover, .popupMenu LI.selected, LI._selected, TR._selected > TD, TD._selected { background-color: #9ABCD8 !important; color: #fff; } LI._selected.denied { background-color: #f33; } .hidden { display: none; } /* folder tree (js) )*/ DIV.dTreeNode A SPAN.nodeName { margin: 0px .2em; padding: 0px .2em; display: inline-block; } DIV.dTreeNode A._selected SPAN.nodeName { background-color: #9ABCD8; color: #fff; } /* drag'n'drop */ DIV.dTreeNode SPAN._dragOver { background-color: #9ABCD8; color: #fff; } .genericHoverClass { background-color: #9ABCD8 !important; color: #fff !important; -webkit-border-radius: 4px; border-radius: 4px; } /* resizable columns */ TABLE TD.resize-handle-active, TABLE TH.resize-handle-active { cursor: e-resize; } DIV.resize-handle { cursor: e-resize; width: 2px; border-right: 1px solid #fff; position: absolute; top: 0px; left: 0px; } DIV.dialog { position: absolute; width: 350px; z-index: 1000; background-color: #fff; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; *border-right-width: 2px; *border-bottom-width: 2px; color: #000; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; line-height: 18px; } DIV.dialog > DIV { padding: 5px 10px; } .dialog.left > DIV { padding-right: 5px; } .dialog.left > DIV:before { content: ''; display: inline-block; border-top: 7px solid transparent; border-bottom: 7px solid transparent; border-right: 7px solid #ccc; border-right-color: rgba(0, 0, 0, 0.2); position: absolute; left: -7px; top: 6px; } .dialog.left > DIV:after { content: ''; display: inline-block; border-top: 6px solid transparent; border-bottom: 6px solid transparent; border-right: 6px solid #ffffff; position: absolute; left: -6px; top: 7px; } .dialog.right > DIV { padding-left: 5px; } .dialog.right > DIV:before { content: ''; display: inline-block; border-top: 7px solid transparent; border-bottom: 7px solid transparent; border-left: 7px solid #ccc; border-left-color: rgba(0, 0, 0, 0.2); position: absolute; right: -7px; top: 6px; } .dialog.right > DIV:after { content: ''; display: inline-block; border-top: 6px solid transparent; border-bottom: 6px solid transparent; border-left: 6px solid #ffffff; position: absolute; right: -6px; top: 7px; } DIV.dialog.none { position: relative; margin: 0px; padding: 0px; opacity: 1; margin: 100px auto; /* top margin could be dynamically set depending on window height */ } DIV.dialog.none DIV { padding: 10px; } DIV.dialog HR { clear: both; height: 0px; margin: 0px; padding: 0px; color: #fff; border: 0px; } DIV.dialog H3 { margin: 0; } DIV.dialog.none P { margin: 0px; padding: 5px 0px; } DIV.dialog P.prompt { text-align: right; } DIV.dialog P.list { max-height: 200px; overflow-y: auto; } DIV.dialog .button { font-family: Lucida Grande, Bitstream VeraSans, Tahoma, sans-serif; font-size: 8pt; margin-top: 10px; } DIV#bgFrameDiv { position: absolute; top: 0px; left: 0px; bottom: 0px; right: 0px; z-index: 2; background: -webkit-radial-gradient(ellipse cover,rgba(0, 0, 0, .1) 0,rgba(0, 0, 0, .1) 20%,rgba(0, 0, 0, .7) 80%); background: -moz-linear-gradient(top, rgba(0, 0, 0, .5), rgba(0, 0, 0, .1)); } DIV#bgDialogDiv { position: absolute; top: 0px; left: 0px; bottom: 0px; right: 0px; z-index: 2; background: -webkit-radial-gradient(ellipse cover,rgba(0, 0, 0, .1) 0,rgba(0, 0, 0, .1) 20%,rgba(0, 0, 0, .7) 80%); background: -moz-linear-gradient(top, rgba(0, 0, 0, .5), rgba(0, 0, 0, .1)); } /* INPUT styles */ TEXTAREA { vertical-align: top; } DIV, TEXTAREA, INPUT, SELECT { font-family: inherit; font-size: 8pt; font-size: inherit; } INPUT[type="text"], INPUT[type="password"], INPUT[type="file"], TEXTAREA { border-top: 1px solid #909090; border-left: 1px solid #909090; border-bottom: 1px solid #EFF0EF; border-right: 1px solid #EFF0EF; background-color: #CCDDEC; color: #262B33; } INPUT[disabled], INPUT[readonly], SELECT[disabled], SELECT[readonly], TEXTAREA[disabled], TEXTAREA[readonly] { background: #E6E7E6; border-color: #ccc; color: #9ABCD8; } INPUT[type="text"], INPUT[type="password"], INPUT[type="file"], TEXTAREA { background: url("input_bg.gif"); } TEXTAREA { padding: 0px; padding-left: 2px; } INPUT.textField, INPUT.comboBoxField { margin: 2px; padding: 2px; vertical-align: middle; width: 250px; } INPUT.comboBoxField { margin-right: 0px; } INPUT.textField._invalid, INPUT.comboBoxField._invalid { background-color: #f66 !important; border-color: #f00; } BUTTON.comboBoxButton { background-image: url("arrow-down.png"); background-repeat: no-repeat; background-position: center center; background-color: #e6e7e6; width: 20px; height: 20px; margin: 0px; padding: 0px; border-bottom: 1px solid #909090; border-right: 1px solid #909090; border-left: 1px solid #eff0ef; border-top: 1px solid #eff0ef; } BUTTON.comboBoxButton:active { border-bottom: 1px solid #eff0ef; border-right: 1px solid #eff0ef; border-top: 1px solid #909090; border-left: 1px solid #909090; background-color: #d6d7d6; } INPUT[name="search"] { margin-right: 1em; width: 20em; padding-left: 24px; background-image: url('Search-bar.png'); background-repeat: no-repeat; background-position: 2px 2px; background-color: #CCDDEC; color: #909090; } /* Buttons * Avoid using DIVS as buttons, they're only helpful when they have multiple * listeners for "onclick" */ A.button { padding: 0px 0.5em; background: transparent url('btn_a_bg.png') no-repeat scroll top right; display: block; float: right; height: 23px; padding-right: 3px; /* sliding doors padding */ text-decoration: none; text-align: center; color: inherit; cursor: pointer; } A.button SPAN { background: transparent url('btn_span_bg.png') no-repeat; display: block; line-height: 13px; padding: 5px 2px 5px 5px; cursor: pointer; min-width: 70px; } A.button.actionButton SPAN { font-weight: bold; } A.button:active SPAN { background-position: bottom left; padding: 6px 2px 4px 5px; } A.disabled.button, A.disabled.button:active, A.disabled.button SPAN { color: #999; } A.disabled.button:active SPAN { background-position: top left; padding: 5px 2px 5px 5px; } dt, dd { line-height: 20px; } dd { margin-left: 9px; } .dl-horizontal dt { float: left; width: 225px; overflow: hidden; clear: left; text-align: right; text-overflow: ellipsis; white-space: nowrap; } fieldset .dl-horizontal dt { width: 150px; } .dl-horizontal dd { margin-left: 235px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } fieldset .dl-horizontal dd { margin-left: 160px; } .dl-horizontal ul { list-style-type: none; margin: 0px; padding-left: 0px; } .dl-horizontal li { margin-left: 0; } /* Frames */ TABLE.frame, TABLE.framenocaption { border-top: 1px solid #909090; border-left: 1px solid #909090; border-bottom: 1px solid #FFFFFF; border-right: 1px solid #FFFFFF; margin-top: -.5em; margin-left: auto; margin-right: auto; margin-bottom: 1em; padding: 1em; display: table; text-align: right; width: 100%; } TABLE.nopadding { padding: 4px; } TABLE.framenocaption { margin-top: 14px; } TABLE.frame TD { padding: 0px; } SPAN.caption { display: inline-block; position: relative; text-align: center; cursor: default; background-color: #E6E7E6; color: #262B33; width: auto; padding: .25em; margin-left: 7px; border: 0px; } /* Tabs */ DIV.tabsContainer { overflow: hidden; padding: 0px 5px; } DIV.tabsContainer > DIV.scrollToolbar { position: absolute; background-color: #c6c7c6; border: 1px solid #9B9B9B; padding: 1px; top: 8px; right: 0px; height: 12px; vertical-align: bottom; text-align: center; width: 30px; } DIV.tabsContainer > DIV.scrollToolbar > A > SPAN { border: 0px; text-align: center; width: 12px; padding: 0px !important; margin: 0px !important; margin-top: 5px; } DIV.tabsContainer > DIV.scrollToolbar > A, DIV.tabsContainer > DIV.scrollToolbar > A > SPAN { height: 12px; } DIV.tabsContainer > UL { cursor: default; width: 1000px; list-style-type: none; list-style-image: none; margin: 0px; padding: 0px; } DIV.tabsContainer > UL LI { overflow: hidden; padding: 0px; margin-right: -1px; background: transparent url('tab_a_inactive_bg.png') no-repeat scroll top right; display: block; float: left; height: 24px; padding-right: 2px; /* sliding doors padding */ text-decoration: none; color: inherit; } DIV.tabsContainer > UL LI SPAN { background: transparent url('tab_span_inactive_bg.png') no-repeat; display: block; line-height: 14px; padding: 5px 6px 5px 5px; } DIV.tabsContainer > UL LI.active { background: transparent url('tab_a_active_bg.png') no-repeat scroll top right !important; } DIV.tabsContainer > UL LI.active SPAN { background: transparent url('tab_span_active_bg.png') no-repeat !important; } DIV.tabsContainer > UL LI SPAN:hover { cursor: pointer; } DIV.tabsContainer > UL LI.first { margin-left: -1px; padding-left: -1px; } /* Firefox will complain */ DIV.tabsContainer > DIV.tabs { position: absolute; color: #262B33; background-color: #E6E7E6; border: 1px solid #9B9B9B; top: 23px; bottom: 0px; left: 0px; right: 0px; overflow: hidden; } DIV.tabsContainer > DIV.tabs > DIV.tab { position: absolute; top: 5px; bottom: 5px; left: 5px; right: 5px; overflow: hidden; } IFRAME.hidden, DIV.tab { display: none; } DIV#popupFrame { position: absolute; top: 40px; bottom: 40px; left: 15%; right: 15%; padding: 4px; z-index: 2000; background-color: #E6E7E6; -webkit-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.5); box-shadow: 0 5px 10px rgba(0,0,0,.5); } DIV#popupFrame.small { left: 30%; right: 30%; } DIV#popupFrame > IFRAME { margin: 0; padding: 0; color: #000; background-color: #E6E7E6; border: 0; -webkit-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; } DIV.tabsContainer DIV.active { display: block; } DIV.tabsContainer > DIV.active.tab { display: block !important; } /* Toolbar */ DIV#toolbar { left: 0px; border-top: 1px solid #fff; border-bottom: 1px solid #848284; margin: 0px; padding: 0px; white-space: nowrap; overflow: hidden; } BODY.popup DIV#toolbar { border-top: 0px; } SPAN.toolbarSeparator { display: block; float: left; height: 3.8em; vertical-align: middle; border-right : 1px solid #fff; border-left : 1px solid #9c9a94; margin: 0px .25em; margin-top: 0.125em; width: 0px; padding: 0px; } DIV.toolbar IMG.buttonImage { width: 24px; height: 24px; } A.toolbarButton, A.toolbarButton:hover, A.smallToolbarButton, A.smallToolbarButton:hover { display: inline; float: left; height: 49px; padding-right: 3px; /* sliding doors padding */ text-decoration: none; color: inherit; cursor: pointer; } A.smallToolbarButton, A.smallToolbarButton:hover { height: 37px; } A.toolbarButton:hover { background: transparent url('toolbarbtn_a_bg.png') no-repeat scroll top right; } A.smallToolbarButton:hover { background: transparent url('smalltoolbarbtn_a_bg.png') no-repeat scroll top right; } A.toolbarButton SPAN, A.toolbarButton:hover SPAN { text-align: center; display: block; line-height: 13px; padding: 5px 2px 5px 5px; cursor: pointer; } A.smallToolbarButton SPAN, A.smallToolbarButton:hover SPAN { text-align: center; display: block; line-height: 8px; padding: 5px 2px 5px 5px !important; cursor: pointer; } A.toolbarButton:hover SPAN { background: transparent url('toolbarbtn_span_bg.png') no-repeat; } A.smallToolbarButton:hover SPAN { background: transparent url('smalltoolbarbtn_span_bg.png') no-repeat; } A.toolbarButton:active SPAN { background-position: bottom left; } A.smallToolbarButton:active SPAN { background-position: bottom left; } A._disabled.toolbarButton, A._disabled.toolbarButton:active { color: #999; } P#mailerSelectionContainer { line-height: 25px; margin-top: 2px; } DIV.bottomToolbar { vertical-align: middle; background-image: url("thead_bg.png"); border: 1px solid #9B9B9B; background-color: #E6E7E6; height: 20px; margin-top: -4px; text-align: left; margin-left: 2px; margin-right: 2px; } DIV.bottomToolbar A.bottomButton SPAN, DIV.bottomToolbar A.bottomButton { margin: 0px; padding: 0px; width: 23px; text-align: center; text-decoration: none; color: inherit; cursor: pointer; border-bottom: 1px solid #9B9B9B; border-right: 1px solid #9B9B9B; float: left; height: 20px; } DIV.bottomToolbar A.bottomButton SPAN { background: transparent url('thead_bg.png') repeat-x top right; } DIV.bottomToolbar A.bottomButton SPAN:active { background-position: bottom left; } /* row editing */ .editing > INPUT[type="text"] { width: 98%; } .safetyBlock { position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; } /* color box */ DIV.colorBox, #colorPickerDialog SPAN { cursor: pointer; margin: 0 3px 0 0; height: 12px; line-height: 12px; width: 12px; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; border: 0px; } #colorPickerDialog SPAN { float: left; margin: 3px; } #colorPickerDialog SPAN:hover { border: 2px solid transparent; margin: 1px; } .blc-FFFFFF { background-color: #FFFFFF; } .blc-CCCCCC { background-color: #CCCCCC; } .blc-C0C0C0 { background-color: #C0C0C0; } .blc-999999 { background-color: #999999; } .blc-666666 { background-color: #666666; } .blc-333333 { background-color: #333333; } .blc-000000 { background-color: #000000; } .blc-FFCCCC { background-color: #FFCCCC; } .blc-FF6666 { background-color: #FF6666; } .blc-FF0000 { background-color: #FF0000; } .blc-CC0000 { background-color: #CC0000; } .blc-990000 { background-color: #990000; } .blc-660000 { background-color: #660000; } .blc-330000 { background-color: #330000; } .blc-FFCC99 { background-color: #FFCC99; } .blc-FF9966 { background-color: #FF9966; } .blc-FF9900 { background-color: #FF9900; } .blc-FF6600 { background-color: #FF6600; } .blc-CC6600 { background-color: #CC6600; } .blc-993300 { background-color: #993300; } .blc-663300 { background-color: #663300; } .blc-FFFF99 { background-color: #FFFF99; } .blc-FFFF66 { background-color: #FFFF66; } .blc-FFCC66 { background-color: #FFCC66; } .blc-FFCC33 { background-color: #FFCC33; } .blc-CC9933 { background-color: #CC9933; } .blc-996633 { background-color: #996633; } .blc-663333 { background-color: #663333; } .blc-FFFFCC { background-color: #FFFFCC; } .blc-FFFF33 { background-color: #FFFF33; } .blc-FFFF00 { background-color: #FFFF00; } .blc-FFCC00 { background-color: #FFCC00; } .blc-999900 { background-color: #999900; } .blc-666600 { background-color: #666600; } .blc-333300 { background-color: #333300; } .blc-99FF99 { background-color: #99FF99; } .blc-66FF99 { background-color: #66FF99; } .blc-33FF33 { background-color: #33FF33; } .blc-33CC00 { background-color: #33CC00; } .blc-009900 { background-color: #009900; } .blc-006600 { background-color: #006600; } .blc-003300 { background-color: #003300; } .blc-99FFFF { background-color: #99FFFF; } .blc-33FFFF { background-color: #33FFFF; } .blc-66CCCC { background-color: #66CCCC; } .blc-00CCCC { background-color: #00CCCC; } .blc-339999 { background-color: #339999; } .blc-336666 { background-color: #336666; } .blc-003333 { background-color: #003333; } .blc-CCFFFF { background-color: #CCFFFF; } .blc-66FFFF { background-color: #66FFFF; } .blc-33CCFF { background-color: #33CCFF; } .blc-3366FF { background-color: #3366FF; } .blc-3333FF { background-color: #3333FF; } .blc-000099 { background-color: #000099; } .blc-000066 { background-color: #000066; } .blc-CCCCFF { background-color: #CCCCFF; } .blc-9999FF { background-color: #9999FF; } .blc-6666CC { background-color: #6666CC; } .blc-6633FF { background-color: #6633FF; } .blc-6600CC { background-color: #6600CC; } .blc-333399 { background-color: #333399; } .blc-330099 { background-color: #330099; } .blc-FFCCFF { background-color: #FFCCFF; } .blc-FF99FF { background-color: #FF99FF; } .blc-CC66CC { background-color: #CC66CC; } .blc-CC33CC { background-color: #CC33CC; } .blc-993399 { background-color: #993399; } .blc-663366 { background-color: #663366; } .blc-330033 { background-color: #330033; } /* ckeditor */ span.cke_skin_kama { padding: 0px !important; } @media print { BODY { position: static; font-size: 10pt; height: auto; overflow: visible; } DIV#logConsole, DIV#linkBanner, DIV#toolbar, DIV.menu, DIV.filterPanel, DIV.tabsContainer { display: none; } } SOGo-2.1.1b/UI/WebServerResources/tbtv_plus_17x22.png0000644000000000000000000000044712247657030020704 0ustar rootroot‰PNG  IHDR&hwBîIDAT8å“1NÃ@Eßn‚@H¡ ¢âp"¸€›œ#¾€od‰ÑF(4((ÊDñî§0vâ7¡É¯VšÙ?ovf¡‡òV÷º£ä¼§E)×µ'“Çû¿÷ä(:±_ÜKÿBòvwöË81IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/attendee-partstats.png0000644000000000000000000000405312247657030021630 0ustar rootroot‰PNG  IHDRHŒìZ6sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ7'º‘¹O«IDATHÇí—_h[×Ç?÷^IWòU"ÉÎbµvPÛ³ f#îœ5ªÛ:ž:HÙØVÂÖ6læ/Í}ô¥{.{©ËÅÞ +Zšu…ì¥Y³:›ãÙ«‹Ôv)–£(e)ÑŸ{uÿœ=HQìX<ìiì‡{à|Ï÷üî÷üÎïwüØsg<™LŠååeVVVH&“´¶¶ÒÞÞÎÑ£Gwàïܹ#Òé47oÞdss€P(ÄÞ½{ioo—¶ ´˜˜ïÎŽ0³þg¼~\.7–eRÔó|£å{ïæ`䛥‘ÄØ^@©’Ù€Hƒƒø†‡ ªà 7æ„AdOãRÈJ…ß±M,#‡üÊþa´p•?›¥R !^¯E©¬`Û6º®#I>Ÿ`0(=ý¶‹ßöü[LOO“H$Ð4 ·»Âoš&…BH$ÂáÇéîî–Òé´¸zõ*¨ªºß0 šššxì±Çhnn–\éLJüþo¯ñÙÍqö„Âx<*²\™P.x<*ÿºþéLJhÜyí5”±1ü€«9€ÈQÚ²[v|©ðÞÀ>·¤ê á`{wc>ÀŽß×J%EÁï÷ãv»‘å Þq¼^/ù|žR©D>Ÿ›››LLLJ¥‡Ã¨ªŠ$U@Á®]»H¥RLOOpûöm±¸¸H.—#àr¹¶á½^/¹\Ž«W¯V"è½OGÅç~ÁžPŸW«9cÙ¯œáÕÈÞÞে~Íá/@"¨[Äa‹HìÑQzÁµþ3|}¸T?’¼}†p,#O)·†ÕòŠÁgQ…`0ˆªª5jüŽƒad³YlÛfvv–ÙÙYÂá0 µh8~ü8§OŸ¦X,rãÆ zzzhkk#‘HðxZEûüsp†t>Áï¦_©‰s=·Š,˸\n.§¦Ð§ TM^F¡P7ó»4 Ч¦ðþäF÷½cU·TÈÈŠ+3…¾W' íØÙ­&Ë2Š¢ ë:kkk„ÃaúûûëbUU套^âÔ©S¬­­ÑÚÚJ ¨ Q×IBQ2™ ²Y¼7°Km¤½éPM€7>þqÌ,VŽÎÃZ¸xüí­‰óÊûOâö*á`Y&Á>ô(Øñ8°4­.±r·¢E£èpì¡zlëšpplÝs]×±mÇqEŽãÔ*š¦i˜¦É;#dzýtâÄ R©ãã㘦‰¦i¨ªŠmÛ!ìŽض]ɇÄø2™ÃqlOE”­âÈ’L¹lðe2Çá1´XŒ¥j2ö»ïkþêØ Åb¨Í1’×6±Má8u´q°MäµMÔæ𦱴´„iš8uðŽã`š&KKKhšFgg'óóó†mÛÛ°©TЉ‰ Ã`~~žÎÎNÂá0Éd˲ÈoYÉd’p8Œü±!éñÐó¤â·0Í2(6?ï d·@‡’^ ¿Åã¡çyáØÔ;4$eY¨V+«*ˆSíÀ¤whHê|fHÊÉ/rm5eäq¬2ŽmUšUÆ2ò\[M““_¤ó™!©··WÊd2,,,`FíGî:n d2:::8yò¤ä÷û™™™¡X,R.—1MÓ4§X,233ƒßïGûì—R__Ÿ¤ª*ñxœr¹ŒeYضmÛX–E¹\&£ª*}}}•ä2¿4'ÞþËÿH¾Kè‘]øƒ^òYÍÔžh=ÎO¾;Ì×¾Z¹È­Í͉‹##06FÐ\U? \¤wx˜}Õ‹búÊœX>7‚”ý´il¼› RÉ,"x‚ŽþašÛªükkââÅ‹´µµÑÜ\Y!NsåÊz{{Ù·oŸðÉ'Ÿˆ·Þz‹D"ÁÁƒiii`}}ÅÅE"‘/¿ü2™÷ž–¾ÿ&¬®®Šóçϳ±±Á£>J0¬å´ëׯÓÔÔÄSO=Åî¥ò·Râì??âÓÙI>[®<¾ÞåÉžß day2) { var tmp = day2; day2 = day1; day1 = tmp; } return Math.floor((day2 - day1) / 86400000); } Date.prototype.daysUpTo = function(otherDate) { var days = new Array(); var day1 = this.getTime(); var day2 = otherDate.getTime(); if (day1 > day2) { var tmp = day1; day1 = day2; day2 = tmp; } // var day1Date = new Date(); // day1Date.setTime(this.getTime()); // day1Date.setHours(0, 0, 0, 0); // var day2Date = new Date(); // day2Date.setTime(otherDate.getTime()); // day2Date.setHours(23, 59, 59, 999); // var day1 = day1Date.getTime(); // var day2 = day2Date.getTime(); var nbrDays = Math.floor((day2 - day1) / 86400000) + 1; for (var i = 0; i < nbrDays; i++) { var newDate = new Date(); newDate.setTime(day1 + (i * 86400000)); days.push(newDate); } return days; }; Date.prototype.getDayString = function() { var newString = this.getYear(); if (newString < 1000) newString += 1900; var month = '' + (this.getMonth() + 1); if (month.length == 1) month = '0' + month; newString += month; var day = '' + this.getDate(); if (day.length == 1) day = '0' + day; newString += day; return newString; }; Date.prototype.getHourString = function() { var newString = this.getHours() + '00'; if (newString.length == 3) newString = '0' + newString; return newString; }; Date.prototype.getDisplayHoursString = function() { var hoursString = "" + this.getHours(); if (hoursString.length == 1) hoursString = '0' + hoursString; var minutesString = "" + this.getMinutes(); if (minutesString.length == 1) minutesString = '0' + minutesString; return hoursString + ":" + minutesString; }; Date.prototype.stringWithSeparator = function(separator) { var month = '' + (this.getMonth() + 1); var day = '' + this.getDate(); var year = this.getYear(); if (year < 1000) year = '' + (year + 1900); if (month.length == 1) month = '0' + month; if (day.length == 1) day = '0' + day; if (separator == '-') str = year + '-' + month + '-' + day; else str = day + '/' + month + '/' + year; return str; }; Date.prototype.addDays = function(nbrDays) { var milliSeconds = this.getTime(); milliSeconds += 86400000 * nbrDays; this.setTime(milliSeconds); }; Date.prototype.earlierDate = function(otherDate) { var workDate = new Date(); workDate.setTime(otherDate.getTime()); workDate.setHours(0); return ((this.getTime() < workDate.getTime()) ? this : otherDate); }; Date.prototype.laterDate = function(otherDate) { var workDate = new Date(); workDate.setTime(otherDate.getTime()); workDate.setHours(23); workDate.setMinutes(59); workDate.setSeconds(59); workDate.setMilliseconds(999); return ((this.getTime() < workDate.getTime()) ? otherDate : this); }; Date.prototype.beginOfDay = function() { var beginOfDay = new Date(this.getTime()); beginOfDay.setHours(0); beginOfDay.setMinutes(0); beginOfDay.setSeconds(0); beginOfDay.setMilliseconds(0); return beginOfDay; } Date.prototype.beginOfWeek = function() { var offset = firstDayOfWeek - this.getDay(); if (offset > 0) offset -= 7; var beginOfWeek = this.beginOfDay(); beginOfWeek.setHours(12); beginOfWeek.addDays(offset); return beginOfWeek; }; Date.prototype.endOfWeek = function() { var endOfWeek = this.beginOfWeek(); endOfWeek.addDays(6); endOfWeek.setHours(23); endOfWeek.setMinutes(59); endOfWeek.setSeconds(59); endOfWeek.setMilliseconds(999); return endOfWeek; }; String.prototype._base64_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; String.prototype.base64encode = function () { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; var input = this.utf8encode(); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + this._base64_keyStr.charAt(enc1) + this._base64_keyStr.charAt(enc2) + this._base64_keyStr.charAt(enc3) + this._base64_keyStr.charAt(enc4); } return output; }; String.prototype.base64decode = function() { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; var input = "" + this; // .replace(/[^A-Za-z0-9\+\/\=]/g, "") while (i < input.length) { enc1 = this._base64_keyStr.indexOf(input.charAt(i++)); enc2 = this._base64_keyStr.indexOf(input.charAt(i++)); enc3 = this._base64_keyStr.indexOf(input.charAt(i++)); enc4 = this._base64_keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } return output; }; String.prototype.utf8encode = function() { var string = this.replace(/\r\n/g,"\n"); var utftext = ""; for (var n = 0; n < this.length; n++) { var c = this.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }; String.prototype.utf8decode = function() { var string = ""; var i = 0; var c = c1 = c2 = 0; while (i < string.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { c2 = this.charCodeAt(i+1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = this.charCodeAt(i+1); c3 = this.charCodeAt(i+2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; }; String.prototype.cssSafeString = function() { var newString = this.replace("#", "_", "g"); newString = newString.replace(".", "_", "g"); newString = newString.replace("@", "_", "g"); return newString; }; window.width = function() { if (window.innerWidth) return window.innerWidth; else if (document.body && document.body.offsetWidth) return document.body.offsetWidth; else return 0; }; window.height = function() { if (window.innerHeight) return window.innerHeight; else if (document.body && document.body.offsetHeight) return document.body.offsetHeight; else return 0; }; SOGo-2.1.1b/UI/WebServerResources/submenu-disabled.gif0000644000000000000000000000006612247657030021220 0ustar rootrootGIF89a€™™™ÿÿÿ!ù , Œay¨ßL22u›*;SOGo-2.1.1b/UI/WebServerResources/signature-ok.png0000644000000000000000000000233312247657030020423 0ustar rootroot‰PNG  IHDR szzôtIMEÖ  8'îÍw pHYs''”iQgAMA± üajIDATxÚíVKL\Uþî;w†æ …*¨(Ö–Æ -ÕÑ$5²P»!Ѹqa»hwZ7®êÂE]™ÔE6ÑM4MšP*FC-XÄb!2tfxÌûÎ=Çÿœsï0——.jŒ ÿÌ?çÎþs¾ÿñ{/°+»²+ÿ±hâçêù5]s0.,\\ÊQ}Õ¸½z~k; r¡k'µíäÑ·>l5䤦Åö=õ¢Ÿ—óðùÐ S©ÏÍ Õ•ÒòöѨ¹±»»Ó£±,•3 ̶è²$G&F©E0«ˆ’ÅðËÈ×1±TÀj"q¬%ÿ„F{ùý"ˆæ3pøV"R󫸂÷é:´².—µ)ˆlÞB°>*1…è*. µ±8 ¹òk6”Jp“t'p§›š.Õ„¿¨ZeƒöÍaùNÁºˆÄbª×*& ܦ õMÍÈ“srþ¶ÊZf®{K¾#«4Ù*MSÀšîÃrbiÒÚXá0ª©í©óh$¾6õêÖO×¶-;³m“I”)Øí‚zûÆ$ÖRK¨ol"`•¤R€á €3‡éá&âDê~þæ"ºž=’™ÅÍs瞘€&*G¶¶ÁA<4@„«ÛPv»‚#®×[`;7JpO¹ ʪë‰'1òñYôÁ ˜e³(Qÿ ù< …JÅ"233¸ôþ ôþ`pSÙ«÷µ½-PQIÇ àbQ¹TÂäw#xúíw0÷ÞGHS@4c¹\Fÿ«ÇqãêtööÊÀ«Ë^Ý^îC/ á8»Nô)Ñæ3?LàñÁ7 G0oÂÔÔ ÑÊÚ²¬ ¡ŽÆÞž~4>ò(Æ¿ü{¾f°f38ø7"¾~<\äWW±pówô½<ŒP´™¼¸wà%ä(ÛUš¸à¡¶6x÷„ô Ô5 èM,/e[Yös‡[lã1dŒyÊžM§P,pt??D‡J“•ÒòìQ„÷u"1:ŠUª„]("r° íÇŽÁ º~º®á±ç^Áoã—‘I%Š„½ÜÚÌ»Ržl: ³&‚¶ƒûéžsh©i‰â¾¡MÏng7Ý“:º 1;Ô¯t$ëvà€ÓûüÊ ê¢tÜšQίü³ÛïßHCËøMsSĉ€CtO TIJ¹ ÂÑ09ùaeÓwÜ•`À‡Öö,-Ü¢þhï„Äb¡ =:YV®pWÁ«¥1Ç*ñËûl¥Ç/^/;¿± o8pxç¥d«µ[øˆgm§þµ,weWþWòr‚$X‡Ÿ\(IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-empty.png0000644000000000000000000000526112247657030020101 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW ð¾ úñ”H|¨*T!RU$â$¨„¬Ò ‘Ti»éÞÅæÎ/ìÛì=wù0vwvfo÷¼Ž#¥ét;³3³3¿ßü3³+Y–eYÞ•]y·;ð Ë»ì²ÄÃV0 Ã0dËú{qþ•×Oµ—VÒµ8`mY]«æ.KLßÀù™½(ë¥jÉë©)`Ï {ÔÜ&P²ŠŸ+€µñ釀T:•N¥%é^€Í)¬xíµ¿&Î6-ëá'wޤ<Æ¿[_’vo ¬´Zív«eYN§ÓjkkëëkkÀÂÆÂÛ7S@m®þ»úià¡ñÃyXŽ|ù‘gÞÿ@–eY–ïÝ8BðÛ‘ß'~³Ï²žùïÉöëd`++€iZ–il{všüÛ?{¾Ò´9ö¾»œ7ŸäÊr,&Ë€¢d2ÃÃ@&“Éd2Àêêêj½¼9ÿ柯®ædÀ±Ÿxöø@ÆÌ˜sç‰íz¿ìþºó2Û%I’úOÓì•xpô¿„û®$ysì;@¯×ëõzÀúúÆÆÊ pûöÒR¥ŒŽŽŽîÛ<ú‰ÇN”¯*ùÌð‡Ü)ý•O«wVï¬lì||š{Æõš_Þ]Ó]Ão¾±÷œÀ³„¸ÿ !±X<†Ñl išvë0<¬(ÃÃÀ¡™™Ù÷îÔÕõÀ™Ñsz ¨§ëéÿ¼µsD @€b‘ a)‘á¬×‚~À;óyô:‘H$âq@× £Ñ š±¾d³Š22LÜ×&€©óÓKS?Î|æÜGç~Ô­•›µZôD„Ž‚X œð:^^^ZZ^z=Óìvݵœ6š—v>ÅÙ¦Sch¾$y}\–eH$âñXÌÖª¦Ùë™&°¼\«--““…Ðn§Ëår¹0ý­C?˜þÀ» I@±X, ^€¼°‹®ý5Àn§ßúƒ]Q [­f³ÕšÍf³ÙšÍV‹ü“´$5›²lkÌ•+W®\½ ÌÎÎÎÎ΋—.>,]Zºtû–5qtâèäãÁ5!²(ˆÎHz¥i•Jµjkkûù$úçSÓâ&‘=yïð…:_ê”c±X,Òét:“††ˆ ’åXL’€­­­­­- ^¯Õj5`â¹ÉïM~¸qûæ÷oÄ€ LìGs $Ê!N•¤¨ð£±¼ŸS]³ˆ4!*aÛÌçóyWtwË| Àüççççü<\û™ Þ@‰=µÁ­T4ÍéØñ´@tÍ3[ýnÛY–$²ŽH¥’I`lllllŒhŠ,ÛÏß³'—6»ý›?¾[ùø mH-Ë©ür^Ħîò%êm3ñ³Üã ¦Ê|¬÷¡Þ#០rß±,bM«U·Õ âÂìE%6Ìd<¥R©T*Ùiúìd2‘H&íõxØçDb‚x-ˆøÍt:Àí€ËÛ ;&¿Ñ…t0ø#0A¢T*Õjµ ˜&»vCd_Ge°VúÁF¦ˆªª*«ápáK&ˆtˆµT*‹E>À¼-'®­„sÐ`Û&ˆ‚ÏÂV©Ø> çŠ‹ý.íÜÐ^¨ªªªªXvͱ¢×Ôi‰ãD´ß/¾9Ûžø0Å%¨lÛ‰fDµJwCÉž‹$1ÜþG’ÞÜ(µÁ>o°}ÑþsvÕÑ+gÇœàŒüÅ{SÁçþÎàÎñ+4@HÚØ>€®„YàX¿ûü;µ êœuÂHä&ˆ‚Q*‹DúŸåò}AзŒø>hPe‡Å%¨D±T«šV­@Ö|Àýf¯è¸Wnû«ÞÞªMo¹\.;5Àïh6ŒDb‚x ‹ªJ×nÀE3Û»žpì¿b|=ÝßÒ¶6&˜ >ÀšFwCÉÁG¿×F¼m‰\tÐ]Øqñóm PÕrÙÎám§ß3À{;³éÒ‡…uÞî<',À|"¢&À{2—~2€ b} «4 b6ñ3@íu@¹\.ÛOs mG"ÜŽö®ˆàäYLP0"‚®7Ü ó€çßgϤݭÞ&ÈÖ4ï:€?óý§½€‡ syóòi]§У×]ñEUÝ{AìLw¦£^æò}ïmþûENˆÅGªƒJ„&È-š¦išFÞ@#Q¿ KÀТ ããùüø8¯ý£%ö¨“={æŸE‹qÙUÄ »ê§î2áL’³g4ßùêWÐmb¿W"£ÄeÛííŽ5Ø òÒ< ýžmŸÂz=ù3×[Ž×v?Ÿ4, *¿èt:NG̳è¥]ï³¹vûýò½¯«‡Éw¶ï<ß “—‘ƒÓÓ—òŠže5F£Áóþþ+B1b"øžý‰ˆáÝ¿_h>Å©ÕjµZ­þDMe’4lnnnnnòä§¥¯ÑuwÚZ;í^ÈØ€¹—òÞ6l"Êç÷8ŒËôïó–`ÇiYò×ågåoº®ëúýÚ’¾ÔkY¢¯/…Ðw&é^Ž®ëº®ÿÞûž°øÓ·¥…½ÀÁ½F§öS wê„öþ üMiQº)¹羓û çõoë_EQÅÆ‘ŠZ!‹Åb1»ÁC'§¯^Î;[=} Ð×_Ö_̼Y0süý sò^× +Ò†´"ÝF¾1¢Ž$€#ÚûžŸ=(S'ŠŸøÿ·Ó¯ÃÔ†aÆÝ/å [#è ÔT=(’N§Óé4L&“É$Íf³Ù¬O¿GN¥R©TÊg³<茡Qœ~zä" ¡—Îðxœ|H !é‡Ip÷›üE݆—%ËIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/day-view-multicolumn.png0000644000000000000000000000145412247657030022111 0ustar rootroot‰PNG  IHDR++î]bKGDeq€Â pHYsaa¨?§itIME× 9 ™!ús¹IDATHÇí–¿oWÇ?kL$ ŠL܈ !©‚‡%¨à ¡ŠDMº(‚"DAÂ.(Huþ‚T.Bü`"[$‹)J¤È¢‚p‡ï|··ûÞ̤˜·{gÇ ‘OZéûöÍ{ß™ïÌ›]ø0Þ2² Ü?¶ÃvNúÔ 2ÌÙØ&³ K¤5K áô“¼>w²»&3f¿ú¢úD ØØ;qc1ÇÑ J²õ=Vó L¼1>Ë6ù˜ùc6|z7š½î¼š{3mšX–ÈÆ‰6 ³Fk‰Î,1{ö0yðh£º¦5\•R`XB‘ì$)vçöSŽlE !ÔòŠŽ>‘Á…‹óüxù¾>± L@‰êèœÿhY°²²Â P¢1*“mgçÔ»¦vðù¯¹|õ'†½6½ANgmÚ=^´×èös¢¨Ÿ¦·&hµZtrXyü+‡ZÇXýëŸ~v€íÛÜnfæ¦>†^ÿO¾ø²ÅžïÞ`öÄ)Ä`uá~C¡äuî¡F1Ä\zQE“dàùQƒ(êXAÔPó5 åÖeª¡D« fhº Ã"Îï9øæ»yʃ¼ ¤bP±šXˆl(LswÕ`0,ós—xþ÷ìÛ"Bw}À´8Ae¿Õ‹ Ô•`bŽ»ë†ò^¶»ôô¼ê¬“—$iÔ«OAcÑœ1 ªº\!Ãèøe{½¥w‰N·_Zå@ ¤I")K7JDG›%µ£^¿ ˆé®T‰ÀÜÑf‰ê c5®ÈÜñjIÄ~‹mT ±lˆ ”").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
    a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
    "+""+"
    ",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
    t
    ",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
    ",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f .clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);SOGo-2.1.1b/UI/WebServerResources/message-copy.gif0000644000000000000000000000735312247657030020377 0ustar rootrootGIF89aæ0Ž0”1‰1‘9C$Ež*F¤ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÿÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òÿçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Ilÿ²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,nÿ,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KÿSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ÿttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ÿý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüb儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ,å€^‚ƒ„…†‡ˆ‰Šˆ-#‹ˆYWT’‡T7P ™ƒ2M3F ™FGFF/CB@=­B664*.+&8„ÆÇ;;:9'7654Ä][ØZZSV0%%$4!3" ÄSÙÛSSOï*(‡]A[ìïüØã²åI~Iþˆá@Á‚ö°mqâ.a’)D˜(ñ€lA¦ ƒG’I–$à[-UÚEq÷åÊ–/ÙÑ|’–öxhÃÒN ž@ XÊ´©Ó¤ ¢JJµªÕA;SOGo-2.1.1b/UI/WebServerResources/COPYING-thunderbird.txt0000644000000000000000000000031312247657030021462 0ustar rootrootThe default theme icons are derived from the icons provided as part of the Mozilla Thunderbird application. The licensing terms of Mozilla Thunderbird are available in the LICENSE-thunderbird.txt file. SOGo-2.1.1b/UI/WebServerResources/abcard-anonymous.png0000644000000000000000000000104212247657030021251 0ustar rootroot‰PNG  IHDRóÿasRGB®ÎébKGDj’Ø\^âë pHYs  šœtIMEÚ :KKÃS¢IDAT8ËÅO(eqÅÏ÷û½6”Õ”4éù?^Íb6vRJ–o!FYP·Ð\º™,”?ãɯ„+·†²èQ³°°šš²²`yŸðì°¤¤î}÷wg1Ïsã5ìœÍ÷tŸÎ÷ï-z4?¶.Ò"¦3ü¡õáXäðÍ€hó¢T4j¦Af”‰F­Ã±ÈŸ7Š'ÓŸ5¡fÚièÿ˜v*-Lå¬áF˜×Dhjº»ê&“é¤0>޵W4¼ÚÀ´S¥ÂèeãÂHè5ËÙ×’"¸Ÿè¨Ôó Ëé Ü»¶½3íT1ÓÑ\OMŒnœ_3ÓשÎÊÜ&‚iDhèöÛ¢³“ɨÌ|_íÏSõßžö€ëÍž«~½:¢a9Ì >A#"—™ —ú?= ­ž‹ð@B¯>|Þ 'Û¬›`ѶmF=¥÷}5žm±àzªëÅ †åÌ––3‚´–SL„€tð}µï¹ª)ßCÙ;ÊVÄl³î @É?pôJ)TçÌð$BÙ €¢¬¿Ì GOþýõúTŽ]]Uö‰IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/quota-level-warn.png0000644000000000000000000000771012247657030021222 0ustar rootroot‰PNG  IHDR š ÷IiCCPICC Profilex­XuT”MÛŸmº»\BÊ]XéZî•\YJ@PP ¤AÊÂAPQÐG }DEQ:$ä}Þ/Î{¾¾9gïùÍo®˜{®¹çšY8E¼#"B‘€°ð¨H{2ÞÕÍh€Ì@ˆzûÒ" lm-¡È(‹AïzI¤ÛraîÑ©(&ÎË(|ì2øJh¶Hè<[XŸŽ}¶°#ÇFEDA™@:ö ôöƒ8bB¤£½!Ä— f ØÂMtì³…ŸÐqŒo]w,W¸_P8¸Iˆuý(4_ØM÷ëçGó ƒø4Hݰ0*´ÏÑ yY߈H¨Ë± ±}^` ‹ô­Ò mÔÿ›£µPo€Øü¿9™3pp-éßÜœýæ\!øzhþÊJ›æ,d0ÃsÒpl9¬gol¬Vll¬W€àA¨otd̦,|DÿW{ëk `p`€GPBè Ø¸;ŒÆL/Xö°N²S9–¹Òx¸yÏòK Ô©7ŠîkÛˆwHšJ=–6–i•Ó”¯%ÈÏ*²’âw~R¶Q©WTÕè×RÔ>²ë­.A/Nÿ!™ÉÐÖèôînfSC³ó¬8­õlBlóìîÛrdv"9;¸D»æ»Ývð˜Û˹OÑÓÂ+Ð;ͧÔ÷Ž_e2(¤lB M˯¦Þ‰x¾8rжÍ#+§t@;Þ0Á<Ñæ ]’C²Ã!»«T“4ýÃêGˆéø ®£¨£³ÇF2Ÿ¿}¢ìdÆ©ð,‡ÓêÙBÙk9ù÷ÏœËKÈw+P-ä,œ,ê<[^_âpN¾Yú¦ìÆù#åî •ÈʪËÕ‰¬/â/Î^j»|æŠoòUÔÕ¾kåש7tj™kë.ܤÕëßb¹5ØPu;¢Q» ×Ôwç\s@‹RËÚÝÎ{Ù÷Ý[%[¿?¸ý0é‘I{ÛëÇeí  wŸ¤>5ý‹í¯—Ï ŸïíïúÔ}¹'´W±wöEC_ìK—+ý-¯v ¬¿¾;˜øFûÍêÛæ¿ã†Ô‡ßݦ(̼¯ÝÿAéÃÜXÃǸO:ãÈñ§Ÿs¾ì™™XøÚþ­`2ô»á‘KSÓ3ų©s!ó. »U—d—E~r¯°¬b×ÀÚêúʯ• ä:óÄ0ÆäÂüŠÕ‚í ‡.g#7‘ç2Ÿ0® ƒP²ðœ(EìÞL¼ARJ*kû²Œ—l‡üŽ™„ cÅs¤9%cå•15õ(FÍm¥]¡:åº/õÑ$²»a²Qåîvã1“ 3!s% K«PëD›¶Evìëî9v8u;¿vqwûá>ï±²±ëÉâÅå-à#ê+á'C!ø+¨j醇š…Y„[Sm"l÷ÛFÚЬ£,£McŒbõâ4쌗MØ–ÈsáàjÒ÷äáCÝ)÷RkÒ § KwÎÐ;*}ŒåØlæëãÍ'JO:åE>-ž ²‡sîæ‰Î³Ë'` ÞÞ)Ê9\L.,™>×Yz®ŒvÞ¬\¬|¾âieiUdµÉ‘ ÓÛ/]¿B®á«ùvõÁµ3×ázયk¹yºžrK«£áÓíæÆÓMþwtš¹›¿¶<¸[pzߤu[ëòƒ¾‡W¥·y?Öil_ìèï¼ù$çiä_ÏTŸ <_ëíîì¹Þ›ÿ"¹/è¥c¿þ+…‘×̯W'ߌ¼íû»c¨ù]íð…‘’÷¹£™RÆâ>R?ùïùl÷ÅxBë+á›Ø$ÛäÚ÷/?ú¦š§ËfÒfýæÈóÛæ.ô,V-Å,ÿäùù~åòjÄšúÚúúÃ_i†›ñG! (=´& ›‰+g¸ÃØÃô™ÉÊÏFd×çpå ãJáÎå¹ÄÛÂ×Å?,0%¸!Ì*",*+¦´Mo n&a!i-e»ÝZÚ\f·¬ŽœŠ¼Ì#až8¢Ð©x”½“¦ä LRaRSmQ;­î§¡¡‰ÓЪÒÞ¿KW§Ó«[¤ç­/§?eÐ@N040Âýµ;ËØÁ„ßdÈô¼™Ÿ¹œù‹›–±V:Öë¸fìì†í«B•Wœ:s±stu»â顽½§koþ>/OyÏy¯ûÞÇ||Å|¿úݦ¤ú[|¼”l"ò5´),=Ü‘*A‰hÝ*Òƒ&G[ŠjÎñŠ%ÆþŒk?¿7A&a&±åà‘$«dÞäw‡ªR‚SI© i͇“ŽÓ1é™G-ޱëÎÌ:ns‚ýD÷ÉS§¬³X³ºNŸÈ¶ÌaÎy–›yÆ<)ïYþ‰«B¶ÂޢܳÎÅ‚ÅïJÊÏ”KçËZΧ•[VðUŒV^­:Wß…ñ‹—2/ﻢRÃ\óñjëµ’ë‰7§1«¹ µº «Ã£+­§­ïdIÎ1l41f2Ñ4 5«0²´r³>góÉNÑþ C“”s¢Ë ›º{‘ÇÆÞÀ}¯¼Œ¼›|ü.úKTÉßÕk§:ELD&G D7Ä:Æ-ÅŸK4>8“|>Å>áðƒôÄ£ÚÇÖ?:y<Ë%[&gåÌ‹ü«…™gCJìJµÎËTðW±\@_WÀUôuæZþ›Ò·4n[76¾[yÿñƒÏmÌí¤Nç§ ÏʺöŒ¾Xïç ê¾5²v|oÿÁü£î8ñ ÿįoï¿·NÏDÏY.àg—Ÿ¬¯…üÒ¤¯x†ÀÀ!Ò@ èà"ÁpÔ‚Nð¬ xJD8" Q‹x‰XBŠ ÉÈ`d.òrÅ‹2DÑP•¨Wh´š†¾‚ÈbÜ0ù˜WX^¬ ¶û'ƒ£âš° Ž U ‹ŒæŒåŒ?™˜j™Ù™#˜_²h²”³²°`ýÂæÎÖÃnÌÞÊ¡ÍÑÌ©ÍÙʵ›«‹Û•ûO4/–÷,ßN¾§ü~@ LPOðƒP†0Qx@ä(Aô-Œù®mÓøjñ=|/$OIYmgßÞ'](ã)+'» ÷X>oG A—ÈOœUèU¬#åíLT¢(Û«UUÕv¨Kià5ñZ’Úr»”uôumõüô òÈõ†ýFËÆx Óx³«æ£–BVÎÖy6ƒvbö·œÐÎ..×ܰî>÷JîËðœòvóéðS¥\ Ì fÉC‡ŽÀí?NãŠ*ޑޭ?@Ž™èp-97eGjÇaŸtqþ˜~æ‡é§ä³z²£sEδå‡òÝ+ö?Ç^ÚtÞ»‚©²¾zÏEÌ¥kWœk~]«¾aU;³ø¹a¢1ëŽZ󻻇ïZûl“yÜבüDáéð³ì.“îÞ–¾„~½ÜëWo.ýúÎgÄ|TsŒôIñ³ú„ù7Ê÷Ì©;33óÊ‹IË]«Û×nÆ7À @ÇÀÐÆL ‘c>‚äDîFÆ#ë‘ßQò¨ ÔÔ´ üÎ;1¼ ¦ËŠ¥`[q¢¸$Ü3†zFqÆ&,S2Ó*sóK+7üª5ÙúØ#8¸8š8ý¸¸¹:¹“yvñ¬ó>â;Îï* '°.8 T'œ-Bu#o#âEÄÙ$+’óRÓÛ§¥gee×åq;x’DSEORÜÎ3J7•_ª,¨ «j„iiuj/ëìÐõÒ+Ðï%³šeîî2á2u3«4Ÿ²Ô³Ê¶·Õµ+²_vtwju‘uÍsÇxÄï™ÝG…±‹òY÷Ëô¨ ²þšN¢¾ÙŸAÓˆšŒ©ŠÛ/’0t°,™’BH]<ü0ýÔÑ=™„ãë'{²*`ÔLóDóg ÛÏž- /58ÏS>^ÙXqÑé²ø•oWë¯ÇÖª×Í×_kðndojjöhYºw²UøAÅ#ñ¶Âv†ŽˆÎOåÿŠö¨ Ý­ßÕ{þEgßD?òÿ€ÌkÒ êÕ·¤¿e‡„Þ1½›i}_>šôÁmŒôûñõ§KãÑŸÉ_¿ôMäuÿ&òmh²ä»ëÞ=SG§ ¦—gnÀ“ƒÀÜóù¤… ïO/,Í-Wÿt\A¯Ô¯z­±­5¯ûýbûÕ°áNÿÖ}ióNÁdH ¥Fâ- á…çÿµ„…FÃ;Ùfá‚O–pkXÓñ—ˆ([GXóÁß -Æa7¬áÝ Áádlöãý¼, <)>ÐÐbˆ-ý#í!†v®ÁÞæ¶³AL wrøÍÇE„nÞqé2™Qdº¼Ä%Úî?2·âažÜÔ툌¶w‚X Êô‡P-èòt_Ë~£ßcC¢ÃC­-!ÇŒä Š2£Ÿby` ¼áÞ(€,!0úýÄCÛTØK4(÷qSî”óf;èhÿ¦½˜M0uÂ<ƒR#¡­-ëO/ä¼Aø†TCš ­ýimz ÝôúGöþ;³eikt[=AÀJýá}ÿhÐ=‡Ýô)¤ÐrDK£•Ъh2ÜõuÑšs¿ Â}Am€ÖCkÃ>ÍîÉÆÉƲ57>ÿ¼£DoÎHø?ìÿò Ï"`ëîg`áÚ(ñ¤£¢”Côú¿–(J\½mH8…7€ÿ\Px³p_^‰DÒÿà™V7z%ˆæ:IDATc¼v߃Xøùùal666‡™™Èùÿÿ?dPI–¿ÿ"”ýùóÁù÷ïvÿ™@=â IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/AdministrationUI.js0000644000000000000000000001634412247657030021075 0ustar rootroot/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ var d; var usersRightsWindowHeight = 220; var usersRightsWindowWidth = 450; /* ACLs module */ function onSearchFormSubmit(panel) { var searchValue = panel.down('[name="search"]'); var encodedValue = encodeURI(searchValue.value); if (encodedValue.blank()) { checkAjaxRequestsState(); } else { var url = (UserFolderURL + "usersSearch?search=" + encodedValue); if (document.userFoldersRequest) { document.userFoldersRequest.aborted = true; document.userFoldersRequest.abort(); } document.userFoldersRequest = triggerAjaxRequest(url, usersSearchCallback); } return false; } function usersSearchCallback(http) { document.userFoldersRequest = null; var div = $("administrationContent"); if (http.status == 200) { var response = http.responseText.evalJSON(); buildUsersTree(div, response) } else if (http.status == 404) div.update(); } function buildUsersTree(treeDiv, response) { d = new dTree("d"); d.config.hideRoot = true; d.icon.root = ResourcesURL + '/tbtv_account_17x17.gif'; d.icon.folder = ResourcesURL + '/tbtv_leaf_corner_17x17.png'; d.icon.folderOpen = ResourcesURL + '/tbtv_leaf_corner_17x17.png'; d.icon.node = ResourcesURL + '/tbtv_leaf_corner_17x17.png'; d.icon.line = ResourcesURL + '/tbtv_line_17x22.png'; d.icon.join = ResourcesURL + '/tbtv_junction_17x22.png'; d.icon.joinBottom = ResourcesURL + '/tbtv_corner_17x22.png'; d.icon.plus = ResourcesURL + '/tbtv_plus_17x22.png'; d.icon.plusBottom = ResourcesURL + '/tbtv_corner_plus_17x22.png'; d.icon.minus = ResourcesURL + '/tbtv_minus_17x22.png'; d.icon.minusBottom = ResourcesURL + '/tbtv_corner_minus_17x22.png'; d.icon.nlPlus = ResourcesURL + '/tbtv_corner_plus_17x22.png'; d.icon.nlMinus = ResourcesURL + '/tbtv_corner_minus_17x22.png'; d.icon.empty = ResourcesURL + '/empty.gif'; d.preload (); d.add(0, -1, ''); var isUserDialog = false; var multiplier = ((isUserDialog) ? 1 : 2); for (var i = 0; i < response.length; i++) addUserLineToTree(d, 1 + i * multiplier, response[i]); treeDiv.innerHTML = ""; treeDiv.appendChild(d.domObject()); treeDiv.clean = false; for (var i = 0; i < response.length; i++) { if (!isUserDialog) { var toggle = $("tgd" + (1 + i * 2)); toggle.observe ("click", onUserNodeToggle); } var sd = $("sd" + (1 + i * multiplier)); sd.observe("click", onTreeItemClick); } } function addUserLineToTree(tree, parent, line) { var icon = ResourcesURL + '/busy.gif'; var email = line[1] + " <" + line[2] + ">"; if (line[3] && !line[3].empty()) email += ", " + line[3]; // extra contact info tree.add(parent, 0, email, 0, '#', line[0], 'person', '', '', ResourcesURL + '/abcard.png', ResourcesURL + '/abcard.png'); tree.add(parent + 1, parent, _("Please wait..."), 0, '#', null, null, '', '', icon, icon); } function onTreeItemClick(event) { preventDefault(event); var topNode = $("d"); if (topNode.selectedEntry) topNode.selectedEntry.deselect(); this.selectElement(); topNode.selectedEntry = this; } function onUserNodeToggle(event) { this.stopObserving("click", onUserNodeToggle); var person = this.parentNode.getAttribute("dataname"); var url = (UserFolderURLForUser(person) + "foldersSearch"); var nodeId = this.getAttribute("id").substr(3); triggerAjaxRequest(url, foldersSearchCallback, { nodeId: nodeId, user: person }); } function foldersSearchCallback(http) { if (http.status == 200) { var response = http.responseText; var nodeId = parseInt(http.callbackData["nodeId"]); var dd = $("dd" + (nodeId + 2)); var indentValue = (dd ? 1 : 0); d.aIndent.push(indentValue); var dd = $("dd" + nodeId); if (response.length) { var folders = response.split(";"); var user = http.callbackData["user"]; dd.innerHTML = ''; for (var i = 1; i < folders.length - 1; i++) dd.appendChild(addFolderBranchToTree (d, user, folders[i], nodeId, i, false)); dd.appendChild (addFolderBranchToTree (d, user, folders[folders.length-1], nodeId, (folders.length - 1), true)); for (var i = 1; i < folders.length; i++) { var sd = $("sd" + (nodeId + i)); sd.observe("click", onTreeItemClick); sd.observe("dblclick", onFolderOpen); } } else { dd.innerHTML = ''; dd.appendChild (addFolderNotFoundNode (d, nodeId, null)); var sd = $("sd" + (nodeId + 1)); sd.observe("click", onTreeItemClick); } d.aIndent.pop(); } } function addFolderBranchToTree(tree, user, folder, nodeId, subId, isLast) { var folderInfos = folder.split(":"); var icon = ResourcesURL + '/'; if (folderInfos[2] == 'Contact') icon += 'tb-mail-addressbook-flat-16x16.png'; else icon += 'calendar-folder-16x16.png'; var folderId = user + ":" + folderInfos[1]; var name = folderInfos[0]; // name has the format "Folername (Firstname Lastname )" var pos = name.lastIndexOf(' ('); if (pos > -1) name = name.substring(0, pos); // strip the part with fullname and email var node = new dTreeNode(subId, nodeId, name, 0, '#', folderId, folderInfos[2] + '-folder', '', '', icon, icon); node._ls = isLast; var content = tree.node(node, (nodeId + subId), null); return content; } function addFolderNotFoundNode (tree, nodeId) { var icon = ResourcesURL + '/icon_unread.gif'; var node = new dTreeNode(1, nodeId, _("No possible subscription"), 0, '#', null, null, '', '', icon, icon); node._ls = true; return tree.node(node, (nodeId + 1), null); } function onFolderOpen(event) { var obj = Event.element(event); var node = obj.up("div.dTreeNode"); var folderID = node.readAttribute("dataname"); var urlstr = URLForFolderID(folderID) + "/acls"; openAclWindow(urlstr); } /* Common functions */ function configureDragHandles() { var handle = $("verticalDragHandle"); if (handle) { handle.addInterface(SOGoDragHandlesInterface); handle.leftBlock = $("administrationModules"); handle.rightBlock = $("rightPanel"); handle.leftMargin = 100; } } function help() { var div = $("helpDialog"); var title = div.select('H3').first(); var description = div.select('DIV DIV')[0]; var module = $$("#administrationModules LI._selected").first(); var cellPosition = module.cumulativeOffset(); var cellDimensions = module.getDimensions(); var left = cellDimensions.width - 20; var top = cellPosition.top + 3; div.setStyle({ top: top + 'px', left: left + 'px' }); title.update($("moduleTitle").innerHTML); description.update($("moduleDescription").innerHTML); div.show(); } function initAdministration() { $("helpDialogClose").observe("click", function(event) { $("helpDialog").hide(); }); var searchValue = $$('[data-search="admin"] [name="search"]').first(); searchValue.focus(); } document.observe("dom:loaded", initAdministration); SOGo-2.1.1b/UI/WebServerResources/mime-application-x-7z-compressed.png0000644000000000000000000000512612247657030024213 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/offline-settings.png0000644000000000000000000000275312247657030021301 0ustar rootroot‰PNG  IHDR szzôtIMEÔ 0g詪 pHYsN N }™ÞgAMA± üazIDATxÚµVILœe~ÿÙÙÙ¡*BL€˜ÒH«ô€h‚$=ôHŒÆÄ^Lˆ7.ÆKÑ\<cjZõ€A@1l]ØÂR6Ë6 kÙ†a€™ñy¿Î_qìÀåKžüóÿ7ïû|ï.moogíííý°³³“ÐÖÖ–cvvÖµ²²²099y³ºººˆtNK¡R©j$IJTxW)•Jm`` nss3Ñét~‹½7øÜ¹€â×=7u:[‚`™X|[!çE@år¹Ôž›P*À Ryyùu£Ñhp8–¥¥¥u³Ù¼ŒÿÌá}²³³sÇ]g"àí” ÔÔÔ\ÄëÅýý}bØl6²X,"TRR²177×=22Ò²»»ûcGGÇØi,àôÜÄmllˆaÞc FÈ`0^¯§ÔÔÔºŒs—ûúúªÃÂÂZ———¿èêêêðÕ2ªµµ5§¿¿ÿ6!„Ö××±±1Òh4Z­V`R2˜ïçääHiiio555BÄmøOë±Z[[………â–¼¬V+544ål…ªªªçßx±²ððpŠŒŒ¤ØØXJNN&¾“AFQQQ‘¤>†eôÝÝÝŸà/O" AÁ#Ô‚®¬ŠÝØÁ§' T«Õ@~È”@Þb!L‚/"â„/Q__ï¾…ùGv¼Z`aa᳃ƒƒ» &ž[¹®F*öàû”‹‘`z(|5""„L™™ EÆPPP$[GZ\\¼í8ûÈ[L¨êêêøÀ5Üæ}˜1œ­Â~u¯5à.ðÀM€}ÁE‰³G’A€qbbâBFFÆ <¯dff w ˜‘ŸŸ_Îåö8 z×ãèñƒh88´ÇDö°Ì! Wäla—* –ç¶šW²Ð%7N¼*++?ÌÎÎþ:88˜àN® —pÍ`ß«éˆR®ò]Íÿ Ñ…‚‚‚ÛÂ"~çdóß¿Ÿìv;¡¡YÜ´{“q*PªCÔWÁïŸ"è´r•äÛ·µµÑøø8—ò§èªOp¼ßí®—C ¬¬,­¸¸øn.+æ[£OPss3ßšÓpspp¯›þ ೨¨¨È---ý¥˜K°6¤ µ··S?á9ÂŒÞ0Œßœzß+GÉô™ÌŽ*÷sttôs壣£ÔØØ( |nÅó–àlâ!æ'àØné3¤¤¤[éééFÙälnÔ{Bú:ПLMMƒÔŽþ<¶|‘ë3¨¨¨ërŽ£àåH³í¡¡¡TÑIù ø0Ó F8Ÿ ÀÌ12¹9 ô—êïA`×WyòòyÖ›žž^…µ…ùããã)%%…bbb¸ÂÝzO£œ—Ò׃Ë.¡ g¢ù°ß‰(» Ï—bÀŒÂrC‡Äà »)¡ë]BÓùeØŽ¢4Šºw.ÐVÍȪ\Nbb¢˜ØÜõL&“>..î´çàž,X*ĬèkÇÉ•|Q~håååÝÒ·óóó i)ʯ\e +ÄX‡Ùb®y Ì AYpv°áÝÖÒÒòä9OJ€—!++ëK˜¼-X‰ß„6,‚Ó“ˆ7p£ª­­½Yí>»àвb,oÃ̈ƒ”ùùùW0zI vpAg00ÎîŒW IDATxÚí\yp×™ÿõLÏ¥™Ñ­Ñ=BÇ Bg%@ÆàØkC‚+Žñ;xãM¥âdÖÞªu*ö:޳ÙÄ×’ØNœeco †€ §1‡@Bht¢k$1£¹ïyûÇã¥çÔHB •Ô~URëu¿iuÿ¾ë÷}ïI!„‚ÿ—›$übÝÈôû ä™]¯>õÑ¿û\Çìzp<ëúwËÍ~ÍåÏÊ~ Üg\Û²¬xöŸ¿ñÄzˆx^ Ž[è}¹Åò€çþû3Ÿ8 ùðÌ©¯ô> ·ænd2‰„_45ß<ñx|>¿¸zÏ0™¨6Uß2¬—OÖ=òÖ­ù7A$H‚$HÈÐùáà Ü=ýÇÿÇT¿U¯? &“Ë8ß³á»qQ(d2žrsÓÓ“’€nY÷Á¾Ç€ö·wþöÄÂ0oÛ´Zm6«•ö¸ähõø&ú¹Àý ϸÿS@²š/âk·Ûç €Ã‡_zéÞ{ädµ:%eáz³Ååòx¼^B¾þõŸüäðaÀvÜ‘áþößW4׉–~kÏÌ!ïvÿ¨­ÈýQŽ3ß,Y¢Õ óÄb‘ˆã€•+ËËsr¥2)I©¼Ùð-\¼^ŸÏã!Äl6›ÆÅ¿BðŸÏKé»<¸«× ”Ý_ü]})õ‹èù•áΞ3€X,Ò‹DÀgŸ;×Õx½^¯ÏìÛ÷ÑGgΰ»ýõó-©T*•H¨¡‰Å€ßï÷ƒ„ð<ÏSÓ›Ÿ$TÀÕ÷G=xÐÝ]òOåk‡Ãá°Ù€éóÓ_Î]ê?.骫+^*úðÀ÷ܳr% V+•2ÙÍ*‘ªYî‹—…ë¡g«Õáðx€>Ø¿ÿÌàgïœ>1|¯öï›ÖÌÿ9&á‹;:Ο'¤¼\§«¨z{ûû/_rÙŸËOÖ}ÿÙÍÙÀŽGþñ·÷™€þþÉI§˜™q8|¾›§€x€ÆS€6û[))IIR)PR¢Ñ(ÀÏßysû2àâÇï?±H˜‡ÃnœN‡Ãá,‹ÅbRª“-©€¥ÏVí| P*år©°ZN¯¡ÇÑQ  ƒÁ›|¬clEătl³¹\^/ PÐ÷µôÙª]?î¼ó‡?”J Ù´é—¿”ÉÙRñÖÃÉý„ì{¾óðË¿Žoâ‰s@¦Çç«Ün·Ûí8Ž~±·t|TH¥‰èI€@Àë|¾ññ®.`Íš‚žŽëê²Z‹[[Íf ®®¾¾ªêÏx,Ðñì–.|>Þ|jF‘¿gûö»ï~æ ¨H¯ÏÉÜnß{×>ü_Ù¿lîE%¾ãyz€b\aMÚ ÷÷ÅÅEE¥¥€¢GîV|<÷ܶmK–ÀÄÄ™3ÀC­__V|õ«›7¯_¬][ZêõW¯ÿù,–Úl´åÓóÁàü3imµÛwíNž´Xvîd2žW(¯Áßì-ÿÜ = ²lÙÚê­ÀÇ…Ÿ¨ÿXøZ|Ç|ZmaaQPY¹lYUàóù|>píšÉtípüøñãGf³ßäææåeeýyÎE=?|œ(æGz!4Î'ÊÁ 0—˜P“§¦›Ç;€;-·Yï²ÝÝ—.ÇKŽÕÎ×<¿ô¿ˆDb±X X,ÏÃä$ÇF£ËUX¬XQ_¯ÕÞ8àóU@"@ÿÇA‘–™ÑÄb€ÒS@*ü~BE6½}•- È—æJ %€J¥V+•À=§ÿNºñ2Ððå‡w¿ñ{àÅŸ~ú¡‡ƒ¡·×dT*­–@¥Z8è±ÑéòòT* ºº¨(5()ÉÎV©€”¥R"¤Rž‰‹…²0“Én÷x€ÎΡ!‹8¾¯ïÚ5zÞë¯A±Ñžªˆ?ÉsœLH$"‘\NçÍ…t$T@<T^§³Tê›ÃŒÚc?MÚ……Zmn. ‰D¢Y2O¤¥k4J%pß} ùùÀ’%R™˜îef&'ËdÂQ¯ÏËKN6mjl,( ¤¥åÒ%£øÃ>ûlxðx¼Þ`pnžÀqBŽa"sœT*(‚zÉ"(`¾,ÈX ŠL–«W/]š™ lÞ¼jUa!UÇq\ @m¯«ëêU‹èî¾zÕjÆÇÍf§ðzýþ`P«årž 23“’€+JK32h3M¡à¸;ÉɪªŠŠRS ùéOwïîì<#QˆTÃ𼊂A Xü‰]î_-° CO_߯‚¦B¦¦ÎXPiiI‰NOs3ðÊ+ÎÌ ˆ÷‚«VQà·lY³F«,½§gtÔj%d×®'††€ÉI‹ÅíµÐØ9¢­mpÐlöí;{vdX¹R§ËÌ$dË–¦¦¢"@£II‘Ë9î‰'6n¬¨ äÅÿûŽZÏø|ñïÌnßÁà"å€ÅfAñ "­6++)I°x&§NõôLOòÞ{'N ÒO£gK¢§O_¾<5 NNÚíÀŽ_übe%!Ì3|píÚâbB^ýÀË—c+€‚rse²ª* °P.ÏÊl6gföòÇd݀Ǥ€¹³ Úœš™ñzyèë£,hbÂå*(–/¯«ÓjãóíM›V®,(`ÝTŽ3ÆÇm6Bš›ˆžŸž®VËd@SSEEV••œ,— •øÑ£F# —K$b1MÞÉÉ€Ëåõúý@KË¥KÀË/ïÛ×Ý <õÔ—¾TSCHCƒ^Ÿ™Éqû÷Ÿ;72BÈà Ñh· Êr@d’õxöìùùϵº¼Ôjzþ;'¤ùÒ“$¿:Gˆf]™o{½àÙ‹Æ‚ž{î©§¾òÚ+2™¥²° ¤dö‡%ÙÒÒœ•Jˆñ¿ýí'Ÿ „² ú]¯ÏÏW«Çÿüç—.¥+n±º«V•—k4„´·ÓÔРÓedpœÉd³y<„9ÒÖ6> cc6pþ¼Á0= Ô×ët™™@SSe¥F LLØl‚'‰DÂ{„EŠÊ[o}æ`õê[n©¨Îûý^¯ýMàÂÝìøöÀÆW†í!Ÿ»á^T @£ãààÀëÑó€ÐSaЍ©Y²$-M¸Ogçð°ÅLO[­n·ð¢r¹T*_ûÚºueeðLa'NtuMNräH{ûÄ„ ²úz.##ö»…†Â³g¯\™ž®éõyy))±*âð [¸—Û}ä :ï¾+Åb©T¥|-Þ-yô3$T@ rÇaA"< 0»»¦&­Öé‚A›m|ho¿x±»;:ètyyÌ]àÂ…þþk×¢çÕ×—•ed*•B!‘ßÜ|ôèÀðöÛ‡÷õÑq?ð‹_ìÝÛÓƒëËåÂ|+¤ØýGF¦§á9²²RRŸoq…Xd%L×¾9N.=Î^,Z/H&3›/\¶nݰ¡¬ ضõ‚Êʼ^`ttdÄhŒî.¦¦ÒŠÉääÌL¨å³ùK–h4¡E³ü“'»»Æð^ !”žÎÌFãÌŒËÝ4MΌՄÅób1‹õ¡=¤x…@+`€ãŠP̾6ñ`A&“Ïdggggf†¾Èu__ìfbµº\¡ô}©T”×3±Ûé<ŸòþH8Øçi̲³SS)0ìzøs¤§«T¡ H¡44Ra±ÀqÔ˜„Bì†0WÄqŒ¹Ýb1ÐÛKYÐø¸Ã‘ŸTW×ÖDÓE§Óíöûää¤$‰P(¤R±8:ù:^oha£TÊ塞¯³”pÛîÕ×ëõ™™Â¬+WFG-–X´™ÜèÄqá!ˆö¼³) ab,ˆ­…F² ^ؽÛlx^«½ýv`lL"©®d²œœŠ  ¨¨´´¨ˆ6ëD¢pW&„®œÑž ZE{ÀÐÑh³…X/sÇ­XAsC$PZmV–Jäæfd$%E¿S—^ŸŸŸœ ÜrKeeNŽp½¥¥½}|<ñÍ\d¶m9‹Ú b,(íÿsǹ¹¹¹ÙÙÔSB0ÆÆ¬V ˜R)°¢Ó§{z¦¦„ûž>}ùòô4íåhµ„Èd‰XÌq>º~½NäçÓý:ß6,_žŸ„e2ʦydÃŽÖÙÙ€DBÕOêê2 ik '¡žÛ¡@B+t‚ 5°y{À\YÇ> ™L½½Àm·•”Ðq8&&€ÎÎŽŽžžh¸pÖ LêêhÏ&=]¥b¡ƒz íj¾õÖGõö²%(bãÆÆF­–ã¶lij*.æ8µš†´¶¶“I€J¥’Ë%Ž»ãŽÚÚ¼<Ž£À‡_¼8:JÈë¯øa$[ 5°È1Ž“HJJè±¢‚++ŸÏížš$·IßWºàsï9ííÀÃßu—N'ô‚q»››×^;tÈj***+—.BKOmª v;!ÅÅÙÙ*ÇmÝzûí%%„üìg{ötu ó™gf³Ë¬[·|y^!99ii `6ÓfÚÁƒçÏŒyyÔ3ÒÒ”J©”òúúÆÇ­VàÔ©ÎN£¸zuzšV¼±“.œã»¾L|¾7ß|ùe ­­¹9޲ÃÒÕÒæü¼Ou†´Ñ[Wm¯ç¸„»"l#v»m„Æ‚Ò[R¥‡° ºã-š ƒÁœ<ÙÖ64?>8¨V••µµË– –‹wìØ¼¹ª   Ž;t¨µut”ææ––¾¾èBn¡ . mQ8´5ϲ#-Ÿf2 ºº¸8#xãßýîÐ!àĉ'Ÿ”˼<&55G¿ßí¶Ûö=õPsïÎÍvÇ- bÑÝlf,ˆî#s8rr€òòÊʼ¼ð }1æ »v?>0|ùËk×–”6ÔÕåçsœF“šªPòöÛ‡÷öSS¬^ˆ:V³Ž†*`Ó¦U«ŠŠ€5khÒݱcçÎO?XV"ÄST0h0¼÷ šLᬋŠX\^¾mÈwí¹^oYÄ^Ðw¿ûøã_ø044–¥Ç÷T kdëày <ÝŽ:“šÜ=`î,(ìéi›XXs»ßy‡² › Ðé–.---‰†Ž¢=„ÙÚÚÛ;=Ÿ­D7»eÏ}>åAÑu°H$•RúI ?JË ÄVO¼9‰çÅúm±ÿ‰… ±8\SSSSSS€R©T*•„Ðcâ| °¼©fÊïöúñÞiÀçóÝâëœÿ¾ œœœœÌÌèŸ ‰%:Æ/ì~ñg³@í›çy^,®šL&“ÉDÿfŒõ–!D¥R©TªøŠH¨žã9žÖ¬nܾÖ|Vx6ãÓ4àèı‰£K÷{ÞÝþWi@‰»Ýç“H„1¶/¨®®¡A«¥ `¾XÐü%…õ”èçIo*ÎKê§Óét:‰D"‘H™L&“É…B¡P(¡ï­ˆ„ `MÌ‹y> ¨ìY6\“X†,Ëyàͺ;ÿ Éý‚rXu¡á•e?jk‹ŠÄb ¶vnÎ-°Ì]ë~‘³ÜnÇçNÜæ‡Ýÿ¬û×å{s^D߉D3=e¸Åɾ‰ÚÑL\.—Ëå"ÄjµZ­VÀf³Ùl6Àâ´úm"àG÷½Þõ2pôÅöw'>8u­ðµÎ²¿a¿ötõÙJà±»îKªRÉÉÉÉ* V«Õj5''3ˆ¯‚yÿ«ë q8(-¥Š¡ìõ K’ìø·&,„²£T*•J¥ h–„Y(Jœ„oøŸu°dÃ’žÿÖ„çyžnC§ `ã¸ô3ü#ÄÐÌ+íIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tb-compose-save-flat-24x24.png0000644000000000000000000000336412247657030022531 0ustar rootroot‰PNG  IHDR°çá»gAMA± üabKGDÿÿÿÿÿÿ X÷Ü oFFsx=[9b pHYs''”iQ vpAgðH8àaZIDATXÃÍW[hSY]çÞ&MÒvŒ™ÄŠÚF+U˜q¤#¨”V(Vý­ˆˆhqmñc˜ôk,ý?||Šúá«"VPDÓVë“6±iÔhsóhn“Ü{ΙÛ>Ô¤ó`öÏæœ}{µö¾ûü/eËÚÛ—-[¿žÎ ùñGB!Äç8æÎúûK††>ìèPJ)¥ÔédŒ1Î9gŒRÆJc `L×ÅZì3F)¥ùqãú‰qc-®Óu3ΰxñÊ•›6%“7^½ÚÒâó’œ9C@ÈŠ"Q€sÎ9÷ûÀíÛUUQTµ««D¼Àåš3§®nËBT5™ …UM$††]Ïå @’dY–Y–$áeY’¦ÞÏBˆ$M>c›­¢¢¦ÓiÀåJJ€{÷l¶ÒR›ÍåÊår¹\ÎÞÕVTD£MM¡Ð¶m¡P&c<§Ä8)«µ´tÆ Àjõx–.œNá³Ù±±X H&GF ™ŒÅ “QÕhôËbðz½^¯7_„È2À¹ÕZUüòË¥K[·ååeeåå.— Íf³Ùl.G©$QºeËÄÄÿ`P º>9ÒR»ý«¯gÞ¼ï¿7}&£ª±H(ÊÀHŒŒ Ùl:‹™÷sN©¦™kY¶ÛÝnàá÷o{z€ÁÁx|pðx<H¥R©TJ(ó›7{zöìéé …>u@%†@U /3›Íá°Ù›­ºzÉ ²²ºú»ï€`°¯ïÆ Àëýæ› L '+X^¾<}°Ûív»ÝŒµ"¬¯ïKy”EpžN`*“$3P(‘‡ææóç››LF×' p:N§3Ÿ1Î9 9xpùòööåËO§us]_±B2%Di<þ÷üè(‹E"OŸªúñ#ÐÖV_ßÖ”•••••>ŸÏçóuuuuuu€Ûív»Ý&‹Åb±XÆ3–oœÂùîݽ½{÷öö>.Eü÷0–N‹ö¨iÀë×OŸ^¾ ¬[WSãó UU @ ųË9cœŸ:å÷·´øý§OÿźÁ甊♮g,›(Õõ\дl6’ÉpøæM µuõê}û‡CÓ Çð/%Î9çÏžqn³q¾{÷$ÙElt‹é{΀ dlLQM~ð8r¤©éÈ D¢Q@×u=¿û50^ë›7ûý;wúý“ÛŒd~)u]Ó¦ï9gLñĸ¨ª##Ïž³g‹n·ÿªUû÷‘H$‰˜ e2™L&ˆœL­Š!ÉèŒQªëÓ÷¢¼ÄÉkšé †Ç‡†:;¦¦ùóW®,hlEQhl\¸°±1›¨õO3À¹ rúžsY‰ŠÀôù@)Õ´±1`dd`àÒ% µuÕªŸ~êë½Þúz µÕçûùg‹¥Ðâ.ɾ¦újb.2µojzü—ذ\ntôý{@UÃáÎNàðáµkÿ¸~ýܹŽÑ `± ¼P#Äj9SŒUU@<¾{gjß0ÆûÜsGG‡‡{{‹%— …€W¯º»»º ÏcÚ ”––—û-ðèÑ­['NЉ¼z8‡ÃTVΚ5kVáϼ9~ÍcãÛY!È20<çO,óçWW/Z”ŸØÔš €Q+E T ç¼8!Äbc°Ãaî»\NçŒÅ„0£KÍ¥ºÎØÇ}}¿yãr-XPSãr )|¾wïÞ½;<̹ {ý:|þÜXOý§6þOÏŒ ‰| P^þþý“'••oߦRµµ»v½y34¤(¿ý6wî¼yNç×_×ÖÖֺ݀Õj±Èr~ú’dµn·Ç3{¶®·´;vñ¢Õ ÷ïÏÀtMZ³æÐ¡;wtý‡ÚÚNžloUÕTjÑ¢`0ˆFïì¼qãÅ MëïïïÿðAôqM`µŠ+¼éý &nìØqèÐ… ±Xs󯿞=»w¯ª¦Óº¾tiOOww8|õêµkׯ¿xƒß¾]¼fÿi#ÅÞðÇûömܸnÐìÑ£ŒQÊy,và@GÇ•+ ÿ5€?,¨¬>±çB½IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxAttendeesEditor.js0000644000000000000000000016451212247657030021364 0ustar rootroot/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* TODO: - set work days from preferences */ var OwnerLogin = ""; var resultsDiv; var address; var availability; var isAllDay = parent$("isAllDay").checked + 0; var displayStartHour = 0; var displayEndHour = 23; var attendeesEditor = { delay: 500, selectedIndex: -1 }; function handleAllDay() { window.timeWidgets['start']['time'].value = dayStartHour + ":00"; window.timeWidgets['end']['time'].value = dayEndHour + ":00"; $("startTime_time").disabled = true; $("endTime_time").disabled = true; $("freeBusyTimeRange").addClassName("hidden"); } /* address completion */ function resolveListAttendees(input, append) { var urlstr = (UserFolderURL + "Contacts/" + escape(input.container) + "/" + escape(input.cname) + "/properties"); triggerAjaxRequest(urlstr, resolveListAttendeesCallback, { "input": input, "append": append }); } function resolveListAttendeesCallback(http) { var input = http.callbackData["input"]; if (http.readyState == 4 && http.status == 200) { var append = http.callbackData["append"]; var contacts = http.responseText.evalJSON(true); for (var i = 0; i < contacts.length; i++) { var contact = contacts[i]; var fullName = contact[1]; if (fullName && fullName.length > 0) { fullName += " <" + contact[2] + ">"; } else { fullName = contact[2]; } input.uid = null; input.cname = null; input.container = null; input.isList = false; input.value = contact[2]; input.confirmedValue = null; input.hasfreebusy = false; input.modified = true; input.checkAfterLookup = true; performSearch(input); if (i < (contacts.length - 1)) { var nextRow = newAttendee(input.parentNode.parentNode); input = nextRow.down("input"); } else if (append) { var row = input.parentNode.parentNode; var tBody = row.parentNode; if (row.rowIndex == (tBody.rows.length - 3)) { //input.setCaretTo(0); newAttendee(); } else { var nextRow = tBody.rows[row.rowIndex + 1]; input = nextRow.down("input"); //input.selectText(0, input.value.length); //input.focussed = true; } } else { //input.setCaretTo(0); //input.blur(); } } } else { // List not found (probably an LDAP group) performSearch(input); } } function onContactKeydown(event) { if (event.ctrlKey || event.metaKey) { this.focussed = true; return; } if (event.keyCode == Event.KEY_TAB || event.keyCode == Event.KEY_RETURN) { preventDefault(event); this.scrollLeft = 0; $(this).up('DIV').scrollLeft = 0; attendeesEditor.selectedIndex = -1; if (this.confirmedValue) this.value = this.confirmedValue; this.hasfreebusy = false; if (this.isList) { resolveListAttendees(this, true); event.stop(); } else { this.focussed = false; var row = $(this).up("tr").next(); var input = row.down("input"); if (input) { input.focussed = true; input.activate(); } else if (!this.value.blank()) newAttendee(); } } else if (event.keyCode == 0 || event.keyCode == Event.KEY_BACKSPACE || event.keyCode == 32 // Space || event.keyCode > 47) { this.modified = true; this.confirmedValue = null; this.cname = null; this.uid = null; this.container = null; this.hasfreebusy = false; if (this.searchTimeout) { window.clearTimeout(this.searchTimeout); } if (this.value.length > 0) { var thisInput = this; this.searchTimeout = setTimeout(function() {performSearch(thisInput); thisInput = null;}, attendeesEditor.delay); } else if (this.value.length == 0) { if (document.currentPopupMenu) hideMenu(document.currentPopupMenu); } } else if ($('attendeesMenu').getStyle('visibility') == 'visible') { if (event.keyCode == Event.KEY_UP) { // Up arrow if (attendeesEditor.selectedIndex > 0) { var attendees = $('attendeesMenu').select("li"); attendees[attendeesEditor.selectedIndex--].removeClassName("selected"); var attendee = attendees[attendeesEditor.selectedIndex]; attendee.addClassName("selected"); this.value = this.confirmedValue = attendee.address; this.uid = attendee.uid; this.isList = attendee.isList; this.cname = attendee.cname; this.container = attendee.container; } } else if (event.keyCode == Event.KEY_DOWN) { // Down arrow var attendees = $('attendeesMenu').select("li"); if (attendees.size() - 1 > attendeesEditor.selectedIndex) { if (attendeesEditor.selectedIndex >= 0) attendees[attendeesEditor.selectedIndex].removeClassName("selected"); attendeesEditor.selectedIndex++; var attendee = attendees[attendeesEditor.selectedIndex]; attendee.addClassName("selected"); this.value = this.confirmedValue = attendee.address; this.isList = attendee.isList; this.uid = attendee.uid; this.cname = attendee.cname; this.container = attendee.container; } } } } function performSearch(input) { // Perform address completion if (input.value.trim().length > minimumSearchLength) { var urlstr = (UserFolderURL + "Contacts/allContactSearch?excludeGroups=1&search=" + encodeURIComponent(input.value)); triggerAjaxRequest(urlstr, performSearchCallback, input); } input.searchTimeout = null; } function performSearchCallback(http) { if (http.readyState == 4) { var menu = $('attendeesMenu'); var list = menu.down("ul"); var input = http.callbackData; if (http.status == 200) { var start = input.value.length; var data = http.responseText.evalJSON(true); if (data.contacts.length > 1 && input.focussed) { list.input = input; $(list.childNodesWithTag("li")).each(function(item) { item.remove(); }); // Populate popup menu for (var i = 0; i < data.contacts.length; i++) { var contact = data.contacts[i]; var isList = (contact["c_component"] && contact["c_component"] == "vlist"); var completeEmail = contact["c_cn"].trim(); if (contact["c_mail"]) { if (completeEmail) completeEmail += " <" + contact["c_mail"] + ">"; else completeEmail = contact["c_mail"]; } var node = createElement('li'); list.appendChild(node); node.address = completeEmail; // log("node.address: " + node.address); if (contact["c_uid"]) node.uid = (contact["isMSExchange"]? UserLogin + ":" : "") + contact["c_uid"]; else node.uid = null; node.isList = isList; if (isList) { node.cname = contact["c_name"]; node.container = contact["container"]; } var matchPosition = completeEmail.toLowerCase().indexOf(data.searchText.toLowerCase()); if (matchPosition > -1) { var matchBefore = completeEmail.substring(0, matchPosition); var matchText = completeEmail.substring(matchPosition, matchPosition + data.searchText.length); var matchAfter = completeEmail.substring(matchPosition + data.searchText.length); node.appendChild(document.createTextNode(matchBefore)); node.appendChild(new Element('strong').update(matchText)); node.appendChild(document.createTextNode(matchAfter)); } else { node.appendChild(document.createTextNode(completeEmail)); } if (contact["contactInfo"]) node.appendChild(document.createTextNode(" (" + contact["contactInfo"] + ")")); node.observe("mousedown", onAttendeeResultClick.bindAsEventListener(node)); } // Show popup menu var offsetScroll = Element.cumulativeScrollOffset(input); var offset = Element.cumulativeOffset(input); var top = offset[1] - offsetScroll[1] + node.offsetHeight + 3; var height = 'auto'; var heightDiff = window.height() - offset[1]; var nodeHeight = node.getHeight(); if ((data.contacts.length * nodeHeight) > heightDiff) // Limit the size of the popup to the window height, minus 12 pixels height = parseInt(heightDiff/nodeHeight) * nodeHeight - 12 + 'px'; menu.setStyle({ top: top + "px", left: offset[0] + "px", height: height, visibility: "visible" }); menu.scrollTop = 0; document.currentPopupMenu = menu; $(document.body).observe("click", onBodyClickMenuHandler); } else { if (document.currentPopupMenu) hideMenu(document.currentPopupMenu); if (data.contacts.length == 1) { // Single result var contact = data.contacts[0]; if (contact["c_uid"]) input.uid = (contact["isMSExchange"]? UserLogin + ":" : "") + contact["c_uid"]; else input.uid = null; var isList = (contact["c_component"] && contact["c_component"] == "vlist"); if (isList) { input.cname = contact["c_name"]; input.container = contact["container"]; } var completeEmail = contact["c_cn"].trim(); if (contact["c_mail"]) { if (completeEmail) completeEmail += " <" + contact["c_mail"] + ">"; else completeEmail = contact["c_mail"]; } if ((input.value == contact["c_mail"]) || (contact["c_cn"].substring(0, input.value.length).toUpperCase() == input.value.toUpperCase()) || !input.focussed) { input.value = completeEmail; } else // The result matches email address, not user name input.value += ' >> ' + completeEmail; input.isList = isList; input.confirmedValue = completeEmail; var end = input.value.length; if (input.focussed) $(input).selectText(start, end); else if (isList) resolveListAttendees(input, true); else // We lost the focus -- force freebusy lookup input.checkAfterLookup = true; attendeesEditor.selectedIndex = -1; if (input.checkAfterLookup) { input.checkAfterLookup = false; input.modified = true; input.hasfreebusy = false; checkAttendee(input); } } initializeAttendeeRole(input); } } else if (document.currentPopupMenu) hideMenu(document.currentPopupMenu); } } function initializeAttendeeRole(input) { var row = $(input.parentNode.parentNode); if (input.uid && input.uid == OwnerLogin) { row.removeAttribute("role"); row.removeClassName("attendee-row"); row.setAttribute("partstat", "accepted"); row.addClassName("organizer-row"); row.isOrganizer = true; } else { row.removeAttribute("partstat"); row.removeClassName("organizer-row"); if (input.value.length > 0) { row.setAttribute("role", "req-participant"); row.addClassName("attendee-row"); } row.isOrganizer = false; } } function onAttendeeResultClick(event) { var input = this.parentNode.input; input.uid = this.uid; input.cname = this.cname; input.container = this.container; input.isList = this.isList; input.confirmedValue = input.value = this.address; initializeAttendeeRole(input); checkAttendee(input); this.scrollLeft = 0; $(this).up('DIV').scrollLeft = 0; this.parentNode.input = null; } function redisplayEventSpans() { // log("redisplayEventSpans"); var table = $("freeBusyHeader"); var row = table.rows[2]; var stDay = window.getStartDate(); var etDay = window.getEndDate(); var days = stDay.daysUpTo(etDay); var addDays = days.length - 1; var stHour = stDay.getHours(); var stMinute = Math.round(stDay.getMinutes() / 15); if (stMinute == 4) { stMinute = 0; stHour++; } var etHour = etDay.getHours(); var etMinute = Math.round(etDay.getMinutes() / 15); if (etMinute == 4) { etMinute = 0; etHour++; } if (stHour < displayStartHour) { stHour = displayStartHour; stMinute = 0; } if (stHour > displayEndHour + 1) { stHour = displayEndHour + 1; stMinute = 0; } if (etHour < displayStartHour) { etHour = displayStartHour; etMinute = 0; } if (etHour > displayEndHour + 1) { etHour = displayEndHour; etMinute = 0; } var deltaCells = (etHour - stHour) + ((displayEndHour - displayStartHour + 1) * addDays); var deltaSpans = (deltaCells * 4 ) + (etMinute - stMinute); var currentCellNbr = stHour - displayStartHour; var currentCell = row.cells[currentCellNbr]; var currentSpanNbr = stMinute; var spans = $(currentCell).childNodesWithTag("span"); /* we first reset the cache of busy spans */ if (row.busySpans) { for (var i = 0; i < row.busySpans.length; i++) { row.busySpans[i].removeClassName("busy"); } } row.busySpans = []; /* now we mark the spans corresponding to our event */ while (deltaSpans > 0) { var currentSpan = spans[currentSpanNbr]; row.busySpans.push(currentSpan); currentSpan.addClassName("busy"); currentSpanNbr++; if (currentSpanNbr > 3) { currentSpanNbr = 0; currentCellNbr++; currentCell = row.cells[currentCellNbr]; spans = $(currentCell).childNodesWithTag("span"); } deltaSpans--; } scrollToEvent(); } function onAttendeeStatusClick(event) { rotateAttendeeStatus(this); } function rotateAttendeeStatus(row) { var values; var attributeName; if (row.isOrganizer) { values = [ "accepted", "declined", "tentative", "needs-action" ]; attributeName = "partstat"; } else { values = [ "req-participant", "opt-participant", "chair", "non-participant" ]; attributeName = "role"; } var value = row.getAttribute(attributeName); var idx = (value ? values.indexOf(value) : -1); if (idx == -1 || idx > (values.length - 2)) { idx = 0; } else { idx++; } row.setAttribute(attributeName, values[idx]); if (!Prototype.Browser.Gecko) { /* This hack enables a refresh of the row element right after the click. Otherwise, this occurs only when leaving the element with them mouse cursor. */ row.className = row.className; } } function onNewAttendeeClick(event) { newAttendee(); event.stop(); } function newAttendee(previousAttendee) { var table = $("freeBusyAttendees"); var tbody = table.tBodies[0]; var model = tbody.rows[tbody.rows.length - 1]; var nextRowIndex = tbody.rows.length - 2; if (previousAttendee) { nextRowIndex = previousAttendee.rowIndex + 1; } var nextRow = tbody.rows[nextRowIndex]; var newRow = $(model.cloneNode(true)); tbody.insertBefore(newRow, nextRow); var result = newRow; var statusTD = newRow.down(".attendeeStatus"); if (statusTD) { var boundOnStatusClick = onAttendeeStatusClick.bindAsEventListener(newRow); statusTD.observe("click", boundOnStatusClick, false); } $(newRow).removeClassName("attendeeModel"); var input = newRow.down("input"); input.observe("keydown", onContactKeydown.bindAsEventListener(input)); input.observe("blur", onInputBlur); input.focussed = true; input.activate(); table = $("freeBusyData"); tbody = table.tBodies[0]; model = tbody.rows[tbody.rows.length - 1]; nextRow = tbody.rows[nextRowIndex]; newRow = $(model.cloneNode(true)); tbody.insertBefore(newRow, nextRow); newRow.removeClassName("dataModel"); var attendeesDiv = $$('TABLE#freeBusy TD.freeBusyAttendees DIV').first(); var dataDiv = $$('TABLE#freeBusy TD.freeBusyData DIV').first(); dataDiv.scrollTop = attendeesDiv.scrollTop = table.clientHeight; return result; } function checkAttendee(input) { var row = $(input.parentNode.parentNode); var tbody = row.parentNode; if (tbody && input.value.blank()) { var dataTable = $("freeBusyData").tBodies[0]; var dataRow = dataTable.rows[row.sectionRowIndex]; input.stopObserving(); tbody.removeChild(row); dataTable.removeChild(dataRow); } else if (input.modified) { if (!row.hasClassName("needs-action")) { row.addClassName("needs-action"); row.removeClassName("declined"); row.removeClassName("accepted"); } if (!input.hasfreebusy) { if (input.uid && input.confirmedValue) { input.value = input.confirmedValue; } displayFreeBusyForNode(input); input.hasfreebusy = true; } input.modified = false; } } function onInputBlur(event) { if (document.currentPopupMenu && !this.confirmedValue) { // Hack for IE7; blur event is triggered on input field when // selecting a menu item var visible = $(document.currentPopupMenu).getStyle('visibility') != 'hidden'; if (visible) { // log("XXX we return"); return; } } if (document.currentPopupMenu) hideMenu(document.currentPopupMenu); if (this.isList) { resolveListAttendees(this, false); } else { initializeAttendeeRole(this); checkAttendee(this); } } /* FIXME: any other way to repeat an object? */ var _fullFreeDay = []; for (var i = 0; i < 96; i++) { _fullFreeDay.push('0'); } function availabilitySession(uids, direction, start, end, listener) { this.mDirection = direction; if (direction > 0) { this._findDate = this._forwardFindDate; this._adjustCurrentStart = this._forwardAdjustCurrentStart; } else { this._findDate = this._backwardFindDate; this._adjustCurrentStart = this._backwardAdjustCurrentStart; } this.mStart = start; this.mStartLimit = 0; this.mEndLimit = 24 * 4; this.mWorkDaysOnly = false; /* The duration of the range covering the start and end of the event, in quarters. 15 minutes * 60 secs * 1000 ms = 900000 ms */ this.mDuration = Math.ceil((end.getTime() - start.getTime()) / 900000); this.mUids = uids; this.mListener = listener; } availabilitySession.prototype = { mStart: null, mDirection: null, mStartLimit: 0, mEndLimit: 0, mWorkDaysOnly: 0, mListener: null, mUids: null, mCurrentStart: null, mFirstStep: false, mCurrentEntries: null, mActiveRequests: 0, setLimits: function aS_setLimits(start, end) { this.mStartLimit = start; this.mEndLimit = end; }, setWorkDaysOnly: function aS_setWorkDaysOnly(workDaysOnly) { this.mWorkDaysOnly = workDaysOnly; }, _step: function aS__step() { this.mCurrentEntries = null; var max = this.mUids.length; if (max > 0) { this.mActiveRequests = max; for (var i = 0; i < max; i++) { // log("request start"); var fbRequest = new freeBusyRequest(this.mCurrentStart, this.mCurrentStart, this.mUids[i], this); fbRequest.start(); } } else { this.mActiveRequests = 1; this.onRequestComplete(null, true, _fullFreeDay); } }, start: function aS_start() { this.mCurrentStart = this.mStart.clone(); this.mCurrentStart.setHours(0); this.mCurrentStart.setMinutes(0); if (this.mWorkDaysOnly) { this._adjustCurrentStart(); } this.mFirstStep = true; this._step(); }, onRequestComplete: function aS_onRequestComplete(request, success, entries) { this.mActiveRequests--; this._mergeEntries(entries); if (this.mActiveRequests == 0) { var foundDate = this._findDate(); if (foundDate) { var foundEndDate = foundDate.clone(); foundEndDate.setTime(foundDate.getTime() + this.mDuration * 900000); this.mListener.onRequestComplete(this, foundDate, foundEndDate); } else { if (this.mDirection > 0) { this.mCurrentStart.addDays(1); } else { this.mCurrentStart.addDays(-1); } if (this.mWorkDaysOnly) { this._adjustCurrentStart(); } this._step(); } } }, _forwardAdjustCurrentStart: function aS__forwardAdjustCurrentStart() { var day = this.mCurrentStart.getDay(); if (day == 0) { this.mCurrentStart.addDays(1); } else if (day == 6) { this.mCurrentStart.addDays(2); } }, _backwardAdjustCurrentStart: function aS__backwardAdjustCurrentStart() { var day = this.mCurrentStart.getDay(); if (day == 0) { this.mCurrentStart.addDays(-2); } else if (day == 6) { this.mCurrentStart.addDays(-1); } }, _mergeEntries: function aS__mergeEntries(entries) { if (this.mCurrentEntries) { var currentIndex = 0; while (currentIndex > -1) { this.mCurrentEntries[currentIndex] = entries[currentIndex]; currentIndex = entries.indexOf('1', currentIndex + 1); } } else { this.mCurrentEntries = entries; } }, _forwardFindDate: function aS__forwardFindDate() { var foundDate = null; var maxOffset = this.mEndLimit - this.mDuration; var offset = 0; if (this.mFirstStep) { offset = Math.floor(this.mStart.getHours() * 4 + this.mStart.getMinutes() / 15) + 1; this.mFirstStep = false; } else { offset = this.mCurrentEntries.indexOf('0'); } if (offset > -1 && offset < this.mStartLimit) { offset = this.mStartLimit; } while (!foundDate && offset > -1 && offset <= maxOffset) { var testDuration = 0; while (this.mCurrentEntries[offset] == '0' && testDuration < this.mDuration) { testDuration++; offset++; } if (testDuration == this.mDuration) { foundDate = new Date(); var foundTime = (this.mCurrentStart.getTime() + (offset - testDuration) * 900000); foundDate.setTime(foundTime); } else { offset = this.mCurrentEntries.indexOf('0', offset + 1); } } return foundDate; }, _backwardFindDate: function aS__backwardFindDate() { var foundDate = null; var maxOffset = this.mEndLimit - this.mDuration; var offset; if (this.mFirstStep) { offset = Math.floor(this.mStart.getHours() * 4 + this.mStart.getMinutes() / 15) - 1; this.mFirstStep = false; } else { offset = this.mCurrentEntries.lastIndexOf('0'); } if (offset > maxOffset) { offset = maxOffset; } while (!foundDate && offset >= this.mStartLimit) { var testDuration = 0; var testOffset = offset; while (this.mCurrentEntries[testOffset] == '0' && testDuration < this.mDuration) { testDuration++; testOffset++; } if (testDuration == this.mDuration) { foundDate = new Date(); var foundTime = (this.mCurrentStart.getTime() + offset * 900000); foundDate.setTime(foundTime); } else { offset = this.mCurrentEntries.lastIndexOf('0', offset - 1); } } return foundDate; } }; function availabilityController(previousSlotButton, nextSlotButton) { this.mActive = false; this.previousSlotButton = previousSlotButton; this.nextSlotButton = nextSlotButton; var boundCallback = this.onPreviousSlotClick.bindAsEventListener(this); previousSlotButton.observe("click", boundCallback, false); boundCallback = this.onNextSlotClick.bindAsEventListener(this); $("nextSlot").observe("click", boundCallback, false); } availabilityController.prototype = { mActive: false, previousSlotButton: null, nextSlotButton: null, onPreviousSlotClick: function ac_onPreviousSlotClick(event) { if (!this.mActive) { this.mActive = true; this._findSlot(-1); } this.previousSlotButton.blur(); }, onNextSlotClick: function aC_onNextSlotClick(event) { if (!this.mActive) { this.mActive = true; this._findSlot(1); } this.nextSlotButton.blur(); }, _findSlot: function aC__findSlot(direction) { var uids = []; var inputs = $("freeBusy").getElementsByTagName("input"); for (var i = 0; i < inputs.length - 1; i++) { if (inputs[i].uid) { uids.push(inputs[i].uid); } } var start; var end; if (isAllDay) { start = window.timeWidgets['start']['date'].inputAsDate(); end = window.timeWidgets['end']['date'].inputAsDate(); start.setHours(dayStartHour); start.setMinutes(0); start.setSeconds(0); end.setHours(dayEndHour); end.setMinutes(0); end.setSeconds(0); } else { start = window.getStartDate(); end = window.getEndDate(); } var session = new availabilitySession(uids, direction, start, end, this); if (isAllDay) { session.setLimits(dayStartHour * 4, dayEndHour * 4); } else { var start = (parseInt($("timeSlotStartLimitHour").value) + parseInt($("timeSlotStartLimitMinute").value)); var end = (parseInt($("timeSlotEndLimitHour").value) + parseInt($("timeSlotEndLimitMinute").value)); session.setLimits(start, end); } session.setWorkDaysOnly($("workDaysOnly").checked); session.start(); }, onRequestComplete: function aC_onRequestComplete(session, start, end) { window.setStartDate(start); window.setEndDate(end); if (start.getDay() != session.mStart.getDay()) { onTimeDateWidgetChange(); } else { redisplayEventSpans(); } this.mActive = false; } }; /* freebusy cache, used internally by freeBusyRequest below */ var _fbCache = {}; function _freeBusyCacheEntry() { } _freeBusyCacheEntry.prototype = { startDate: null, entries: null, getEntries: function fBCE_getEntries(sd, ed) { var entries = null; var adjustedSd = sd.beginOfDay(); if (this.startDate && this.startDate.getTime() <= adjustedSd.getTime()) { var offset = this.startDate.deltaDays(adjustedSd) * 96; if (this.entries.length > offset) { var adjustedEd = ed.beginOfDay(); var nbrDays = adjustedSd.deltaDays(adjustedEd) + 1; var nbrQu = nbrDays * 96; var offsetEnd = offset + nbrQu; if (this.entries.length >= offsetEnd) { entries = this.entries.slice(offset, offsetEnd); } } } return entries; }, getFetchRanges: function fBCE_getFetchRanges(sd, ed) { var fetchDates; var adjustedSd = sd.beginOfDay(); var adjustedEd = ed.beginOfDay(); var nbrDays = adjustedSd.deltaDays(adjustedEd) + 1; if (this.startDate) { fetchDates = []; if (adjustedSd.getTime() < this.startDate.getTime()) { var start = adjustedSd.clone(); start.addDays(-7); var end = this.startDate.beginOfDay(); end.addDays(-1); fetchDates.push({ start: start, end: end }); } var currentNbrDays = this.entries.length / 96; var nextDate = this.startDate.clone(); nextDate.addDays(currentNbrDays); if (adjustedEd.getTime() >= nextDate.getTime()) { var end = nextDate.clone(); end.addDays(7); fetchDates.push({ start: nextDate, end: end }); } } else { var start = adjustedSd.clone(); start.addDays(-7); var end = adjustedEd.clone(); end.addDays(7); fetchDates = [ { start: start, end: end } ]; } return fetchDates; }, integrateEntries: function fBCE_integrateEntries(entries, start, end) { if (this.startDate) { if (start.getTime() < this.startDate) { var days = start.deltaDays(this.startDate); if (entries.length == (days * 96)) { this.startDate = start; this.entries = entries.concat(this.entries); } } else { this.entries = this.entries.concat(entries); } } else { this.startDate = start; this.entries = entries; } } }; function freeBusyRequest(start, end, uid, listener) { this.mStart = start.beginOfDay(); this.mEnd = end.beginOfDay(); this.mUid = uid; this.mListener = listener; this.mPendingRequests = 0; } freeBusyRequest.prototype = { mStart: null, mEnd: null, mUid: null, mListener: null, mCacheEntry: null, mPendingRequests: 0, start: function fBR_start() { this.mCacheEntry = _fbCache[this.mUid]; if (!this.mCacheEntry) { this.mCacheEntry = new _freeBusyCacheEntry(); _fbCache[this.mUid] = this.mCacheEntry; } var entries = this.mCacheEntry.getEntries(this.mStart, this.mEnd); if (entries) { this.mListener.onRequestComplete(this, true, entries); } else { if (this.mPendingRequests == 0) { var fetchRanges = this.mCacheEntry.getFetchRanges(this.mStart, this.mEnd); this.mPendingRequests = fetchRanges.length; for (var i = 0; i < fetchRanges.length; i++) { var fetchRange = fetchRanges[i]; this._performAjaxRequest(fetchRange.start, fetchRange.end); } } else { /* a nearly impossible condition that we want to handle */ log("freebusy request is already active"); } } }, _performAjaxRequest: function fBR__performAjaxRequest(rqStart, rqEnd) { var urlstr = UserFolderURL + "../"; var uids = this.mUid.split(":"); if (uids.length > 1) urlstr += (uids[0] + "/freebusy.ifb/ajaxRead?" + "uid=" + uids[1] + "&"); else urlstr += (this.mUid + "/freebusy.ifb/ajaxRead?"); urlstr += ("sday=" + rqStart.getDayString() + "&eday=" + rqEnd.getDayString()); var thisRequest = this; var callback = function fBR__performAjaxRequest_cb(http) { if (http.readyState == 4) { thisRequest.onRequestComplete(http, rqStart, rqEnd); thisRequest = null; } }; triggerAjaxRequest(urlstr, callback); }, onRequestComplete: function fBR_onRequestComplete(http, rqStart, rqEnd) { this.mPendingRequests--; if (http.status == 200 && http.responseText) { var newEntries = http.responseText.split(","); var cacheEntry = this.mCacheEntry; cacheEntry.integrateEntries(newEntries, rqStart, rqEnd); if (this.mPendingRequests == 0) { var entries = this.mCacheEntry.getEntries(this.mStart, this.mEnd); this.mListener.onRequestComplete(this, true, entries); } } } }; function editorConflictHandler(uids, startDate, endDate, listener) { this.mUids = uids; this.mRemaining = uids.length; this.mCurrentUid = 0; this.mStartDate = startDate; this.mEndDate = endDate; this.mListener = listener; } editorConflictHandler.prototype = { mUids: null, mCurrentUid: 0, mStartDate: null, mEndDate: null, mQuOffset: 0, mQuOffsetMax: 0, mCurrentEntries: null, mListener: null, start: function eCH_start() { this.mQuOffset = (this.mStartDate.getHours() * 4 + Math.floor(this.mStartDate.getMinutes() / 15)); this.mQuOffsetMax = (this.mEndDate.deltaDays(this.mStartDate) * 96 + this.mEndDate.getHours() * 4 + Math.ceil(this.mEndDate.getMinutes() / 15)); this._step(); }, _step: function eCH__step() { if (this.mCurrentUid < this.mUids.length) { var fbRequest = new freeBusyRequest(this.mStartDate, this.mEndDate, this.mUids[this.mCurrentUid], this); fbRequest.start(); } else { this.mListener.onRequestComplete(this, true); } }, onRequestComplete: function eCH_onRequestComplete(fbRequest, success, entries) { var periodEntries = entries.slice(this.mQuOffset, this.mQuOffsetMax); if (periodEntries.indexOf("1") > -1) { this.mListener.onRequestComplete(this, false); } else { this.mCurrentUid++; this._step(); } } }; function displayFreeBusyForNode(input) { var rowIndex = input.parentNode.parentNode.sectionRowIndex; var row = $("freeBusyData").tBodies[0].rows[rowIndex]; var nodes = row.cells; //log ("displayFreeBusyForNode index " + rowIndex + " (" + nodes.length + " cells)"); if (input.uid) { if (!input.hasfreebusy) { // log("forcing draw of nodes"); for (var i = 0; i < nodes.length; i++) { var node = $(nodes[i]); node.removeClassName("noFreeBusy"); while (node.firstChild) { node.removeChild(node.firstChild); } for (var j = 0; j < 4; j++) { createElement("span", null, "freeBusyZoneElement", null, null, node); } } } var sd = $('startTime_date').inputAsDate(); var ed = $('endTime_date').inputAsDate(); var listener = { onRequestComplete: function(request, success, entries) { if (success) { drawFbData(input, entries); } } }; var rq = new freeBusyRequest(sd, ed, input.uid, listener); rq.start(); } else { for (var i = 0; i < nodes.length; i++) { var node = $(nodes[i]); node.addClassName("noFreeBusy"); while (node.firstChild) { node.removeChild(node.firstChild); } } } } function setSpanStatus(span, status) { var currentClass = span.freeBusyClass; if (!currentClass) currentClass = ""; var newClass; if (status == '1') { newClass = "busy"; } else if (status == '2') { newClass = "maybe-busy"; } else { newClass = ""; } if (newClass != currentClass) { if (currentClass.length > 0) { span.removeClassName(currentClass); } if (newClass.length > 0) { span.addClassName(newClass); } span.freeBusyClass = newClass; } } function drawFbData(input, slots) { var rowIndex = input.parentNode.parentNode.sectionRowIndex; var slotNbr = 0; var tds = $("freeBusyData").tBodies[0].rows[rowIndex].cells; if (tds.length * 4 == slots.length) { for (var i = 0; i < tds.length; i++) { var spans = tds[i].childNodesWithTag("span"); for (var j = 0; j < spans.length; j++) { setSpanStatus(spans[j], slots[slotNbr]); slotNbr++; } } } else { log("inconsistency between freebusy results and" + " the number of cells"); log(" expecting: " + tds.length + " received: " + slots.length); } } function resetAllFreeBusys() { var inputs = $("freeBusy").getElementsByTagName("input"); for (var i = 0; i < inputs.length - 1; i++) { var currentInput = inputs[i]; currentInput.hasfreebusy = false; displayFreeBusyForNode(currentInput); } } function initializeTimeSlotWidgets() { availability = new availabilityController($("previousSlot"), $("nextSlot")); var hourWidgets = [ "timeSlotStartLimitHour", "timeSlotEndLimitHour" ]; for (var i = 0; i < hourWidgets.length; i++) { var hourWidget = $(hourWidgets[i]); for (var h = 0; h < 24; h++) { var option = createElement("option", null, null, { value: h * 4 }); var text = (h < 10) ? ("0" + h) : ("" + h); option.appendChild(document.createTextNode(text)); hourWidget.appendChild(option); } } var limitWidget = $("timeSlotStartLimitHour"); limitWidget.value = dayStartHour * 4; limitWidget = $("timeSlotEndLimitHour"); limitWidget.value = dayEndHour * 4; var minuteWidgets = [ "timeSlotStartLimitMinute", "timeSlotEndLimitMinute" ]; for (var i = 0; i < minuteWidgets.length; i++) { var minuteWidget = $(minuteWidgets[i]); for (var h = 0; h < 4; h++) { var option = createElement("option", null, null, { value: h }); var quValue = h * 15; var text = (h == 0) ? "00" : ("" + quValue); option.appendChild(document.createTextNode(text)); minuteWidget.appendChild(option); } } // var limitWidget = $("timeSlotStartLimitMinute"); // limitWidget.value = Math.floor(parseInt($("startTime_time_minute").value) // / 15); // limitWidget = $("timeSlotEndLimitMinute"); // limitWidget.value = Math.floor(parseInt($("endTime_time_minute").value) // / 15); } function initializeWindowButtons() { var okButton = $("okButton"); var cancelButton = $("cancelButton"); okButton.observe("click", onEditorOkClick, false); cancelButton.observe("click", onEditorCancelClick, false); } function cleanInt(data) { var rc = data; if (rc.substr (0, 1) == "0") rc = rc.substr (1, rc.length - 1); return parseInt (rc); } function scrollToEvent () { var headerDiv = $$('TABLE#freeBusy TD.freeBusyHeader DIV').first(); var dataDiv = $$('TABLE#freeBusy TD.freeBusyData DIV').first(); var scroll = 0; var spans = $$('TR#currentEventPosition TH SPAN'); for (var i = 0; i < spans.length; i++) { scroll += spans[i].getWidth (spans[i]); if (spans[i].hasClassName("busy")) { scroll -= 20 * spans[i].getWidth (spans[i]); break; } } headerDiv.scrollLeft = scroll; dataDiv.scrollLeft = headerDiv.scrollLeft; } //function updateSlotDisplayCallback(http) { // var data = http.responseText.evalJSON(true); // var start = new Date(); // var end = new Date(); // var cb = redisplayEventSpans; // // start.setFullYear(parseInt (data[0]['startDate'].substr(0, 4)), // parseInt (data[0]['startDate'].substr(4, 2)) - 1, // parseInt (data[0]['startDate'].substr(6, 2))); // end.setFullYear(parseInt (data[0]['endDate'].substr(0, 4)), // parseInt (data[0]['endDate'].substr(4, 2)) - 1, // parseInt (data[0]['endDate'].substr(6, 2))); // // window.timeWidgets['end']['date'].setInputAsDate(end); // window.timeWidgets['end']['hour'].value = cleanInt(data[0]['endHour']); // window.timeWidgets['end']['minute'].value = cleanInt(data[0]['endMinute']); // // if (window.timeWidgets['start']['date'].valueAsShortDateString() != // data[0]['startDate']) { // cb = onTimeDateWidgetChange; // } // // window.timeWidgets['start']['date'].setInputAsDate(start); // window.timeWidgets['start']['hour'].value = cleanInt(data[0]['startHour']); // window.timeWidgets['start']['minute'].value = cleanInt(data[0]['startMinute']); // // cb(); //} function onEditorOkClick(event) { preventDefault(event); var uids = []; var inputs = $("freeBusy").getElementsByTagName("input"); for (var i = 0; i < inputs.length - 1; i++) { var input = inputs[i]; if (!input.disabled && input.uid) { uids.push(input.uid); } } var startDate = getStartDate(); var endDate = getEndDate(); var listener = { onRequestComplete: function eCH_l_onRequestComplete(handlers, code) { var label = ("A time conflict exists with one or more attendees.\n" + "Would you like to keep the current settings anyway?"); if (code || window.confirm(_(label))) { _confirmEditorOkClick(); } } }; var conflictHandler = new editorConflictHandler(uids, startDate, endDate, listener); conflictHandler.start(); } function _confirmEditorOkClick() { var attendees = window.opener.attendees; var newAttendees = new Hash(); var inputs = $("freeBusy").getElementsByTagName("input"); for (var i = 0; i < inputs.length - 1; i++) { if (inputs[i].disabled) continue; var row = $(inputs[i]).up("tr"); var name = extractEmailName(inputs[i].value); var email = extractEmailAddress(inputs[i].value); var uid = ""; if (inputs[i].uid) uid = inputs[i].uid; if (!(name && name.length > 0)) if (uid.length > 0) name = uid; else name = email; var attendee = attendees["email"]; if (!attendee) { attendee = {"email": email, "name": name, "role": "req-participant", "partstat": "needs-action", "uid": uid}; } var partstat = row.getAttribute("partstat"); if (partstat) attendee["partstat"] = partstat; var role = row.getAttribute("role"); if (role) attendee["role"] = role; newAttendees.set(email, attendee); } window.opener.refreshAttendees(Object.toJSON(newAttendees)); updateParentDateFields("startTime", "startTime"); updateParentDateFields("endTime", "endTime"); window.close(); } function onEditorCancelClick(event) { preventDefault(event); window.close(); } function synchronizeWithParent(srcWidgetName, dstWidgetName) { var srcDate = parent$(srcWidgetName + "_date"); var dstDate = $(dstWidgetName + "_date"); dstDate.value = srcDate.value; dstDate.updateShadowValue(srcDate); var srcTime = parent$(srcWidgetName + "_time"); var dstTime = $(dstWidgetName + "_time"); dstTime.value = srcTime.value; dstTime.updateShadowValue(srcTime); } function updateParentDateFields(srcWidgetName, dstWidgetName) { var srcDate = $(srcWidgetName + "_date"); var dstDate = parent$(dstWidgetName + "_date"); dstDate.value = srcDate.value; var srcTime = $(srcWidgetName + "_time"); var dstTime = parent$(dstWidgetName + "_time"); dstTime.value = srcTime.value; } function onTimeWidgetChange() { redisplayEventSpans(); } function onTimeDateWidgetChange() { var rows = $("freeBusyHeader").select("tr"); for (var i = 0; i < rows.length; i++) { for (var j = rows[i].cells.length - 1; j > -1; j--) { rows[i].deleteCell(j); } } rows = $("freeBusyData").select("tr"); for (var i = 0; i < rows.length; i++) { for (var j = rows[i].cells.length - 1; j > -1; j--) { rows[i].deleteCell(j); } } prepareTableHeaders(); prepareTableRows(); redisplayEventSpans(); resetAllFreeBusys(); } function prepareTableHeaders() { var startTimeDate = $("startTime_date"); var startDate = startTimeDate.inputAsDate(); var endTimeDate = $("endTime_date"); var endDate = endTimeDate.inputAsDate(); endDate.setTime(endDate.getTime()); var rows = $("freeBusyHeader").rows; var days = startDate.daysUpTo(endDate); for (var i = 0; i < days.length; i++) { var header1 = document.createElement("th"); header1.colSpan = ((displayEndHour - displayStartHour) + 1)/2; header1.appendChild(document.createTextNode(days[i].toLocaleDateString())); rows[0].appendChild(header1); var header1b = document.createElement("th"); header1b.colSpan = ((displayEndHour - displayStartHour) + 1)/2; header1b.appendChild(document.createTextNode(days[i].toLocaleDateString())); rows[0].appendChild(header1b); for (var hour = displayStartHour; hour < (displayEndHour + 1); hour++) { var header2 = document.createElement("th"); var text = hour + ":00"; if (hour < 10) text = "0" + text; if (hour >= dayStartHour && hour < dayEndHour) $(header2).addClassName ("officeHour"); header2.appendChild(document.createTextNode(text)); rows[1].appendChild(header2); var header3 = document.createElement("th"); for (var span = 0; span < 4; span++) { var spanElement = document.createElement("span"); $(spanElement).addClassName("freeBusyZoneElement"); header3.appendChild(spanElement); } rows[2].appendChild(header3); } } } function prepareTableRows() { var startTimeDate = $("startTime_date"); var startDate = startTimeDate.inputAsDate(); var endTimeDate = $("endTime_date"); var endDate = endTimeDate.inputAsDate(); endDate.setTime(endDate.getTime()); var rows = $("freeBusyData").tBodies[0].rows; var days = startDate.daysUpTo(endDate); var width = $('freeBusyHeader').getWidth(); $("freeBusyData").setStyle({ width: width + 'px' }); for (var i = 0; i < days.length; i++) for (var rowNbr = 0; rowNbr < rows.length; rowNbr++) for (var hour = displayStartHour; hour < (displayEndHour + 1); hour++) rows[rowNbr].appendChild(createElement("td")); } function prepareAttendees() { var tableAttendees = $("freeBusyAttendees"); var tableData = $("freeBusyData"); var organizer = window.opener.getCalendarOwner(); var attendees = window.opener.attendees; var attendeesKeys = (attendees ? attendees.keys() : null); var tbodyAttendees = tableAttendees.tBodies[0]; var modelAttendee = tbodyAttendees.rows[tbodyAttendees.rows.length - 1]; var newAttendeeRow = tbodyAttendees.rows[tbodyAttendees.rows.length - 2]; var tbodyData = tableData.tBodies[0]; var modelData = tbodyData.rows[tbodyData.rows.length - 1]; var newDataRow = tbodyData.rows[tbodyData.rows.length - 2]; // Unconditionaly add the organizer var row = $(modelAttendee.cloneNode(true)); tbodyAttendees.insertBefore(row, newAttendeeRow); row.removeClassName("attendeeModel"); row.setAttribute("partstat", organizer["partstat"]); row.setAttribute("role", organizer["role"]); var uid = organizer["uid"]; row.addClassName("organizer-row"); row.removeClassName("attendee-row"); row.isOrganizer = true; var input = row.down("input"); var value = organizer["name"]; if (value) value += " "; else value = ""; value += "<" + organizer["email"] + ">"; input.value = value; input.uid = uid; //input.cname = organizer["cname"]; input.setAttribute("name", ""); input.modified = false; input.disable(); row = $(modelData.cloneNode(true)); tbodyData.insertBefore(row, newDataRow); row.removeClassName("dataModel"); displayFreeBusyForNode(input); if (attendeesKeys && attendeesKeys.length > 0) { attendeesKeys.each(function(atKey) { var attendee = attendees.get(atKey); var row = $(modelAttendee.cloneNode(true)); tbodyAttendees.insertBefore(row, newAttendeeRow); row.removeClassName("attendeeModel"); row.setAttribute("partstat", attendee["partstat"]); row.setAttribute("role", attendee["role"]); var uid = attendee["uid"]; if (uid && uid == OwnerLogin) { row.addClassName("organizer-row"); row.removeClassName("attendee-row"); row.isOrganizer = true; } else { row.addClassName("attendee-row"); row.removeClassName("organizer-row"); row.isOrganizer = false; } var statusTD = row.down(".attendeeStatus"); if (statusTD) { var boundOnStatusClick = onAttendeeStatusClick.bindAsEventListener(row); statusTD.observe("click", boundOnStatusClick, false); } var input = row.down("input"); var value = attendee["name"]; if (value) value += " "; else value = ""; value += "<" + attendee["email"] + ">"; input.value = value; input.uid = uid; input.cname = attendee["cname"]; input.setAttribute("name", ""); input.modified = false; input.observe("blur", onInputBlur); input.observe("keydown", onContactKeydown.bindAsEventListener(input)); row = $(modelData.cloneNode(true)); tbodyData.insertBefore(row, newDataRow); row.removeClassName("dataModel"); displayFreeBusyForNode(input); }); } else { newAttendee(); } // Activate "Add attendee" button var links = tableAttendees.select("TR.futureAttendee TD A"); links.first().observe("click", onNewAttendeeClick); } function onWindowResize(event) { var view = $('freeBusyView'); var attendeesCell = $$('TABLE#freeBusy TD.freeBusyAttendees').first(); var headerDiv = $$('TABLE#freeBusy TD.freeBusyHeader DIV').first(); var attendeesDiv = $$('TABLE#freeBusy TD.freeBusyAttendees DIV').first(); var dataDiv = $$('TABLE#freeBusy TD.freeBusyData DIV').first(); var width = view.getWidth() - attendeesCell.getWidth(); var height = view.getHeight() - headerDiv.getHeight(); attendeesDiv.setStyle({ height: (height - 20) + 'px' }); headerDiv.setStyle({ width: (width - 20) + 'px' }); dataDiv.setStyle({ width: (width - 4) + 'px', height: (height - 2) + 'px' }); } function onScroll(event) { var headerDiv = $$('TABLE#freeBusy TD.freeBusyHeader DIV').first(); var attendeesDiv = $$('TABLE#freeBusy TD.freeBusyAttendees DIV').first(); var dataDiv = $$('TABLE#freeBusy TD.freeBusyData DIV').first(); headerDiv.scrollLeft = dataDiv.scrollLeft; attendeesDiv.scrollTop = dataDiv.scrollTop; } function onFreeBusyLoadHandler() { OwnerLogin = window.opener.getOwnerLogin(); var widgets = {'start': {'date': $("startTime_date"), 'time': $("startTime_time")}, 'end': {'date': $("endTime_date"), 'time': $("endTime_time")}}; synchronizeWithParent("startTime", "startTime"); synchronizeWithParent("endTime", "endTime"); initTimeWidgets(widgets); initializeTimeSlotWidgets(); initializeWindowButtons(); prepareAttendees(); onWindowResize(null); Event.observe(window, "resize", onWindowResize); $$('TABLE#freeBusy TD.freeBusyData DIV').first().observe("scroll", onScroll); scrollToEvent(); } document.observe("dom:loaded", onFreeBusyLoadHandler); /* Functions related to UIxTimeDateControl widget */ function initTimeWidgets(widgets) { this.timeWidgets = widgets; jQuery(widgets['start']['date']).closest('.date').datepicker( { autoclose: true, position: 'above', weekStart: parentvar('firstDayOfWeek') }); jQuery(widgets['start']['date']).change(onAdjustTime); widgets['start']['time'].on("time:change", onAdjustTime); widgets['start']['time'].addInterface(SOGoTimePickerInterface); widgets['start']['time'].setPosition('above'); jQuery(widgets['end']['date']).closest('.date').datepicker( { autoclose: true, position: 'above', weekStart: parentvar('firstDayOfWeek') }); jQuery(widgets['end']['date']).change(onAdjustTime); widgets['end']['time'].on("time:change", onAdjustTime); widgets['end']['time'].addInterface(SOGoTimePickerInterface); widgets['end']['time'].setPosition('above'); var allDayLabel = $("allDay"); if (allDayLabel) { var input = $(allDayLabel).childNodesWithTag("input")[0]; input.observe("change", onAllDayChanged.bindAsEventListener(input)); if (input.checked) { for (var type in widgets) widgets[type]['time'].disabled = true; } } if (isAllDay) handleAllDay(); } function onAdjustTime(event) { var endDate = window.getEndDate(); var startDate = window.getStartDate(); if (this.id.startsWith("start")) { // Start date was changed var delta = window.getShadowStartDate().valueOf() - startDate.valueOf(); var newEndDate = new Date(endDate.valueOf() - delta); window.setEndDate(newEndDate); window.timeWidgets['end']['date'].updateShadowValue(); window.timeWidgets['end']['time'].updateShadowValue(); window.timeWidgets['start']['date'].updateShadowValue(); window.timeWidgets['start']['time'].updateShadowValue(); } else { // End date was changed var delta = endDate.valueOf() - startDate.valueOf(); if (delta < 0) { alert(labels.validate_endbeforestart); var oldEndDate = window.getShadowEndDate(); window.setEndDate(oldEndDate); window.timeWidgets['end']['date'].updateShadowValue(); window.timeWidgets['end']['time'].updateShadowValue(); window.timeWidgets['end']['time'].onChange(); // method from SOGoTimePicker } } // Specific function for the attendees editor onTimeDateWidgetChange(); } function _getDate(which) { var date = window.timeWidgets[which]['date'].inputAsDate(); var time = window.timeWidgets[which]['time'].value.split(":"); date.setHours(time[0]); date.setMinutes(time[1]); return date; } function getStartDate() { return this._getDate('start'); } function getEndDate() { return this._getDate('end'); } function _getShadowDate(which) { var date = window.timeWidgets[which]['date'].getAttribute("shadow-value").asDate(); var time = window.timeWidgets[which]['time'].getAttribute("shadow-value").split(":"); date.setHours(time[0]); date.setMinutes(time[1]); return date; } function getShadowStartDate() { return this._getShadowDate('start'); } function getShadowEndDate() { return this._getShadowDate('end'); } function _setDate(which, newDate) { window.timeWidgets[which]['date'].setInputAsDate(newDate); if (!isAllDay) { window.timeWidgets[which]['time'].value = newDate.getDisplayHoursString(); if (window.timeWidgets[which]['time'].onChange) window.timeWidgets[which]['time'].onChange(); // method from SOGoTimePicker } } function setStartDate(newStartDate) { this._setDate('start', newStartDate); } function setEndDate(newEndDate) { this._setDate('end', newEndDate); } SOGo-2.1.1b/UI/WebServerResources/SOGoTabsController.js0000644000000000000000000001443112247657030021332 0ustar rootroot/* -*- Mode: java; tab-width: 2; c-label-minimum-indentation: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ function SOGoTabsController() { } SOGoTabsController.prototype = { container: null, firstTab: null, activeTab: null, list: null, offset: 0, createScrollButtons: function STC_createScrollButtons() { var scrollToolbar = createElement("div", null, "scrollToolbar"); scrollToolbar.hide(); var lnk = createElement("a", null, [ "leftScrollButton", "scrollButton", "smallToolbarButton"], { href: "#" }, null, scrollToolbar); var span = createElement("span"); lnk.appendChild(span); span.appendChild(document.createTextNode("<")); this.onScrollLeftBound = this.onScrollLeft.bindAsEventListener(this); lnk.observe("click", this.onScrollLeftBound, false); var lnk = createElement("a", null, [ "rightScrollButton", "scrollButton", "smallToolbarButton"], { href: "#" }, null, scrollToolbar); var span = createElement("span"); lnk.appendChild(span); span.appendChild(document.createTextNode(">")); this.onScrollRightBound = this.onScrollRight.bindAsEventListener(this); lnk.observe("click", this.onScrollRightBound, false); this.container.appendChild(scrollToolbar); this.scrollToolbar = scrollToolbar; }, onScrollLeft: function(event) { if (this.offset < 0) { var offset = this.offset + 20; if (offset > 0) { offset = 0; } this.list.setStyle("margin-left: " + offset + "px;"); // log("offset: " + offset); this.offset = offset; } event.stop(); }, onScrollRight: function(event) { if (this.offset > this.minOffset) { var offset = this.offset - 20; if (offset < this.minOffset) { offset = this.minOffset; } this.list.setStyle("margin-left: " + offset + "px;"); // log("offset: " + offset); this.offset = offset; } event.stop(); }, attachToTabsContainer: function STC_attachToTabsContainer(container) { this.container = container; container.controller = this; this.onTabMouseDownBound = this.onTabMouseDown.bindAsEventListener(this); this.onTabClickBound = this.onTabClick.bindAsEventListener(this); var list = container.childNodesWithTag("ul"); if (list.length > 0) { this.list = $(list[0]); var nodes = this.list.childNodesWithTag("li"); if (nodes.length > 0) { this.firstTab = $(nodes[0]); for (var i = 0; i < nodes.length; i++) { var currentNode = $(nodes[i]); currentNode.observe("mousedown", this.onTabMouseDownBound, false); currentNode.observe("click", this.onTabClickBound, false); if (currentNode.hasClassName("active")) this.activeTab = currentNode; //$(currentNode.getAttribute("target")).hide(); } this.firstTab.addClassName("first"); if (this.activeTab == null) { this.activeTab = this.firstTab; this.activeTab.addClassName("active"); } var last = nodes.length - 1; this.lastTab = $(nodes[last]); var target = $(this.activeTab.getAttribute("target")); target.addClassName("active"); } this.onWindowResizeBound = this.onWindowResize.bindAsEventListener(this); Event.observe(window, "resize", this.onWindowResizeBound, false); } this.createScrollButtons(); this.recomputeMinOffset(); }, onWindowResize: function STC_onWindowResize(event) { this.recomputeMinOffset(); }, recomputeMinOffset: function() { var tabsWidth = (this.lastTab.offsetLeft + this.lastTab.clientWidth - this.firstTab.offsetLeft + 4); this.minOffset = (this.container.clientWidth - tabsWidth - 40); if (this.minOffset < -40) { this.scrollToolbar.show(); } else { this.scrollToolbar.hide(); if (this.offset < 0) { this.list.setStyle("margin-left: 0px;"); this.offset = 0; } } }, onTabMouseDown: function STC_onTabMouseDown(event) { event.stop(); }, onTabClick: function STC_onTabClick(event) { var clickedTab = getTarget(event); if (clickedTab.nodeType == 1) { while (clickedTab.tagName.toLowerCase() != "li") { clickedTab = $(clickedTab.parentNode); } var content = $(clickedTab.getAttribute("target")); var oldContent = $(this.activeTab.getAttribute("target")); oldContent.removeClassName("active"); this.activeTab.removeClassName("active"); // previous LI this.activeTab = $(clickedTab); this.activeTab.addClassName("active"); // current LI content.addClassName("active"); this.activeTab.fire("tabs:click", content.id); content.select('.tabsContainer').each(function(c) { // When the tab contains an inner tabs container, // show or hide the tabs navigation arrows of this // inner container c.controller.recomputeMinOffset(); }); // Prototype alternative //oldContent.removeClassName("active"); //container.activeTab.removeClassName("active"); // previous LI //container.activeTab = node; //container.activeTab.addClassName("active"); // current LI //container.activeTab.hide(); //oldContent.hide(); //content.show(); //container.activeTab = node; //container.activeTab.show(); } } } SOGo-2.1.1b/UI/WebServerResources/mime-text-html.png0000644000000000000000000001027512247657030020672 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWHIDATxÚí[il×}ÿÍìÌœ½IîòoJ%ê0-S§% .’TJ ªcY®QÁv*Eâ/­ƒh£ø‹›6p†øCѵÐ$®aD2jY²-‰´)Z’IY$%").=¹$wöšÝ™~x™Îîì,—KQRÐø»3ï½9ÞûýÞûïý‡’$I’$|“Q¢uþØÓ7<âÄ{C,‹ÅhIúbM÷ûgß¿Œ>¥”ä˾–ˆ6m·”Ø[Íû >ý°¡°Ÿ´×:€iÍŸ×Tõ¾z¦i=`0Œ#E= °µU¬øì³+ì…¸$µ>Õ"´7\pÿþ~ŠztQ§D"™L$$I!‘B¡¹¹P¸¾;>j|çý¿ö¬¯hÙÕJmÇ6ü`Ó_4MÓ4ýðúQ4ÿeý-{¦L’~0$yÔO:¢(I¢¨Ÿ§äÉQù)ãUÎ/}º>ûºÜrRJÓ:Mg2Y,€Éd2™L@0 úýÀ`÷à's€x4bÀþÛ{üé½€I4‰&ñÁQ´HŸNý‡ð&íEQ…—óê³ü“k´¯È®¥¨Ü¥H§Óét˜› ‡`zzfÆãœN§³¬ غï±í•÷—œÛTüÎq–ÿO`4 „¼}X4ʈ+´öõÙwfß±ÔxS×e¯&$ûHÑé†a€X,Å€ÉÉÉɉ Àbá8‹XÛܼe]9P¬7Õž>v^ ÿÏŸ~£ßèzpD¬€€\ˆó‰5%ùÈȼ¯…€Ï,Ï,“ÏY–eàùX,!3cn0›9Îj*'*&«î—›fÿøøÏ.î> ðKQŸoõ‰Xš_´h¡¯&"g–cIRqÀËg Ã0, èt4Í0€×ë÷ÏÌÌf€ãÈÑáp8 éoÖþSÓ3À…¾‹wÎ[9qN …Vˆ‰ 5je˜]®5´óÅ$-àµsÙg:QÊ:ÃÐ4 ‚J¢(Š¢””˜L””””˜ÍDW8@íÖºµFàüè…ß}´ HF’‘däþ‰X‘Ò–óÙVMvöýU )¤F3÷Êlñ”}¦¨fY'èt Cf„N'›Ÿ€Á`0€Éd0˜L€NGQ4 ¸GÜcî;€}Ìž¶}týòóðåË÷ ÿ ±\” ¨š|DhA¸2 ”™Ï$$³¥NÓ¥ÓW¯öô|þ9L&“É$ Ó±,ËWRÂq€ÅbµšÍ@cCÓÖF3ðUÛ@ïà^÷¤kbH’jwÔèëj‹7[WaäÚóZШQ~Á´¼¤6?—Êk½‡a”À0Š•DQ4­ÓÑ(ÏG£ÄZºw¸}ûöí;w³¶qºIj¸|ê=qýïWÒƒÜ|¢i©;ï—‚åçeÑ“)‚tºL"²ERæ‘eD"‘H$€þþþþÀn·Û 9lH¾ Ìܘ¹1}­øž¬‚’;˜}–O|H’öÈ”­u ‡  ³³¯Ïãúú†‡Àï‡c1E¶»\v»Élݺn]y9°cǦM••€ÍÆqz½FÇyÄ›L F£ÑX­Ä±„T*•R)rŒÅb±hX\\\\\ü~ŸÏç*_®ú‡ª'‘éÑÑ•¨l¯J?@òùzun)ÂÔj•ä|¾PˆçS§Þ{¯¯èëòx€Ý»·m‹FššêêÒR ££½}qˆÅ — ˜œôz+*€Ï>ëëóz·ßþÍoúú€½{ÛÛ««—^úÞ÷ÚÚ§Ój5s‰P'½^¯×ë•öZ­V«Õ ¸Ýn·Ûqá„xwîîîî>à­âð¼oOXNd9biªÔ$dæ®]œ^yå¿8wp¹Üî™àĉ瞋D€uë].Àív:Ïœjj**>üp:Žáa ¬¬¬¬¬ ص«££­ xõÕ_ܺE.^zéõ×ÏŸúûÇÆ‚Á\‘TÌ‘¦ãp8¥¥ÀB*R¾ðßÅ¢¹JV9[Ê@Ô¾z{‡†¼^àÍ7ÏœùôSàĉ£GGGx\vîfg M$êë5kl¶òr```ròøq O$ˆÒL&S)2r»º“I¯ïîöïï耛š6n~ö³Ó§;;7ÞøÑöíZZjkÎüƒ$W0f×F£Éˆ¥;ÒŠGs–"²k´m ÜüÜÜâb<üüçï¼ÓÕ?~èPWJ¥Ó¤R¢8< lÚÔÐpæ `4  &'OÉd:ÝÚJ”§Ó ˜ÍzýÃд$óóÑh]ɇB@y¹Ý~ñ"𠇌?ýé[o]¹BDX:½œ‘¯ø™3A¯gY½ž¢Vº±»*"hi{={RN§O¿÷ÞÍ›Àû÷F#ËNL¥¥Ë•+@]]yùåËÀäd °{7 é´(’eoNñ\A’ìvâ¹JÐÒ²fÍûïõõn÷'Ÿ{?³}N'yþîÝííóóÀ¯~uî\.Йbf)b–ÂåPxÑléÚPh~>nܸ}{|¨«s»»º”zQ”$šnݺwïÈ`dÄãùÖ·ˆƒdµë$&¢‡,!¤Ó‹‹@}}EEg'p󿨨3Ï>_8¼aá6[n [[.]Ξíê¢ÑX,•*^',—U" ÷5…¦löêìì뛚¶mÛ¼9$Oäy幃ƒ““ßù0>>;ûøã@2™J‰"H9Y'“‚ð|–u…(J’r¤(@€Phq‘8h%%ƒƒDY?ù$03D"J{eâ´ºoG,·!ryæ¹õcc³³Ï?Oöl¯^ª«Îk×à••ä>Žˆ5“N§ÓJ‘ådƒec1° ’Df†L€úÈqƒ× ƒóó @ÿ½{ßý.ˆ"M+m–­m¯ °\ ¹"H èÜsò_^îp”” 55;ëõ'N>ÜÞ^Œ–oÃgeiDZáæ‘Ùycƒ¢D1‘~ò“çŸß¼èêúòË ¼ÜjÕ뉽Ÿ¹HvýúÈÈ®]Ä*²Û‰ÇLÌLí5('Z¿^Yº‡#‘Ž §çúõ;w€×_ùå;ˆõD¬(uûµÏì—‡f†j½H-ÕyYÈ{®2ÍÍ••f3ðÊ+66o¿ýÁ7on÷·¿ír‘E¹¦&Àl.)Ù³¨ª*+K$”¥ù=&“Á Óee6›É¸\ÇþýÀÅ‹_~ÙÖ Íͯ½vìØ¦M@]ËÅq™{ÀdçËh”—ý”“ÿ|a0™¥IË^n´¢lý±,±F’I`ëÖµkËÊ€“'_xewßýôSކ†<žjjªª|> ´´´Ôj*+íö’2²–“HSSÏÌ ðÅ==ðØcÍÍ6ðÆ?üa{;ñ|­ÖÌ÷“ 9`Ki¿ ¨¶µ#Iùöð0ùyÎçe/M˜Íf3Ç)fY€Á`0 ÊÖàk¯;æp@8’¥Ÿ¬ùýÀÝ»ÓÓ‚ ì¬•–ÚlF#ðä“­­v;ÐÑqäHc#PVf·[,dŸÀ`PF¸Éd2€ÑH‚uå=bµ½Ÿ¹ÑšéœýŠ Â„dæåø£‘.‹¨TŠ,=$“‚Ln·Ë•J--MM55ŠÇ«ÞàÑéH4ƒ²ÙNÖëY–k0èõÙ[ÚAÊž6Z^ÑZ8<2”/³@QdcEŽB`e„fÚåÙ÷ªcEµcGÕ3PîLà•x¢lೕýjˆ`UwÄŠ¥äA'mà3ËŠ l)ŒËCó„WFÁÒ1mùÃsÍÌB/å‹QÕ:nÃòzû'‚Ô6„Vøbf>÷é…–ÄÙ¬¾Býíç-/‚O«|¥kÿZiÙ3@Aòóœ/h7·ƒùÃÔ—êh¾ïrËÕGå=Ë)Ï|þÒÀk+aȵ|z Çãñ¸$E"‘H$²œ©[Ø:Xšm€–¼ú·´R]ø:í —Ë8G³0yE̤ì±.,,,,,ô³ôaêEù…j‹AQnrƒdÇFL±jòYr—ò•k·¸PýrSî˽BÝOI¢ÿŠ>N¿ ð<Ïóa%úšeY–e%)ß×—y ×Ïåh`žçyž,ïXJm>`ì_Æ©»¥@Ci½³±\úa[:.ÉÀRcÔ(8n9þÎñK€wóË?G¾´‘EQ!Dò ß ;6ò×in ï¿0õÑY€ßÆÿ'ß ˆn±Zth)¶•Yû¾b¦T°þµµÖÊm“OlY p'åûmàÿï9…,ë€X,‹Å~ÿ¥|L™êŵ?–${ðr¯Ùl6›ÍJ¹ü=2YbÉ/–ý¡¶lÉ€ËaÛùìêÿïI‰ž #\öàeBH¾°H.úKùoÒê¦ÿ4¬ÀÚ_wc‘IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-font_type1.png0000644000000000000000000001161712247657030021035 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWIDATxÚí[y\”Õúÿξ13ˆl"W!Dd©4Q0l¹-H^ïïWWË2Ë6K­®Ù¢¶˜¹d.™¶—fW£Rð*FŠ""²Ï Û,̰ ³¼÷·Óà˜¼¢Ôí>ÿœÏûÎ÷9Ï÷ÙÏ9 Š¢(ŠÂÿh„ˆ9Ò üÑé m æ.Šš4顇>ý”¢ÈóH3úßJ â‚úúúûívŠšóåËõ߯úý9(¸m¬LÄ_dý=tÖóŸÏå²Ù ÆH3~9¢~¦Ò²²gÇ>-0H“E_Åíaš ­è_dÝnÝ~x<ðEàFV\PìG@Vâ=áw«š4ÁµNU—º³ÙDQçKªÎ7Ê\Õ6õ& éGå]ªé@c{“°Q 4å)+U 0èØÃGW.§_xa뎵ÇOQT¥õý®·€ Ýã׬ΉªŸk^ Œ^èñ ðêÃóŸKžüÛ€üà‰Ü¦¼MÀÎ[wùí½Óû²{s€ÈȈˆðpÀÏO¡P(&“Íf2вÛ ««§§»hnniioÊ•ºªàÉÉg-ŽdRY²ÏÃÀ ë^ÊZ™ DD„‡‡…žž^^ ðù|> |>ÐÙÙÕÕÙ èfê›;§»Óv|²íîËË‹q ö¸¥®ž¢6žú¦ |x!ζ`±X,&p8§8QâU÷:°xò]©Ñ¯³Ã’?+HðŸ”ï¸Þ½RÁ¯ÝýÖëoïN,9µ˜»#ëƒ{¶õõ õõ€Z­R)•Q™ÆÏ”ëÛÞ–Ÿ_vìùf sü¬»3’þ `2™L&ƒ±â±çv.½Ÿ¢n-LžµðwØüíY@DDppP ÕjµZí¥ÏçÓ1Àh4;;I?ÆÞ8 à=Écó†¬üfxkÎ;×§…}'K =€;d( (õ?#wi"‹Åfs8@ͨ†fU#°¶iuõëÇÔ ”»“³‡n±±@,3AÕAŸŒy…¢(?êªèêêíí,‹å×€¦&µº¥˜½(sõí¦¡¯ó7ÀÇ›>ÛÿùfŠÊï:¶3ŸÜyçìÙ·ÍΔŒ>£LF“ÑhD"‘8·£jkÝNàÅ‚åõËßRƒR‚¯Dðîä=ZZè ب~tWº\š{Ç€Á`0 €Ïçñx<@¯×ëF unJJò¡ï7S —”–/Ë£¨kvfí|¸í¶ŒŒ™3ŠŠŠŠòrz:þyzJ¥JÕÚ Ü[zÏË÷l2’gÏX|õ1ÊqƹÍѰÙl6íÛ æ¯H‰Ç£ßÝÝÝÝÛ 1‚: ?¡¯¯¯ïÐùq ­†V£‰¢žÿrEÒ‹v }Ñô•ÓÖ--ÍÍÍÍ@{»FÓÞxyyyyy==½½}}€Ø(Qz~,ºaኇ>~ºº·vë]ha§c  …B! × ò|êwWþ½à­9ëϽ{ë }<è;zP[[WWSp¹\.— ˆDb±Hœ_\=¿þa`Õ®—öüýÀar˜æðeg-{Z?iÛˆD"‘HD» ‡Ã%x„@@û~Î`0›–'G%K~G8}¸øEþT4ãä€ óܹªªsç\óär¹\&ÚÚÚÚ´Z -wúÛÓË?ý)2rüøá¼¥ÇÒcé¡(sš¹Ê̡ǣ Q‡Ã%x‡Ãápú €q/3ˆ}CÊ•÷ºa’w¿>åÔ7Õ@ÊŠÉ/%¼¨TtÕ×××××…"‘PxxˆD@ÃëÊ9åÉÀ:Çë2‡Ÿ¯2ÝÙ’òý@`àèÑ `³Ùlv»ë÷K]OG‡Á¤Ü”tß)À, ÓÙ+ýîu·€C…yÊÛû¶¬þ/h …@KKKKK‹KÓär™L&TªææÖV`Öû3y3þø…ù…ùІ¿ >>ÛûeÞWÛUª*R™$'O™2y2PYYYYU5@ ? ž¸’•µ·Ó5© ’ÙW“v^wš Ü­ú  éÒÝáp:íöËç×V+½³$qHz$Ò«ÿ~ÅÑÊÊsŠÚÒþþá­%Àý÷geÝuÐØØØØØH[$É÷ žðG¶fMšžíš$ŽMHIHÿ`zÓÄ1EÑm[‡vÀ¥¦ÎçÓ®€àé!'iøÏ¿KöŒŸxç)ù3?÷³²CÿE+€Ó —•]Úõ$|‘¤@¯7Ìf n|ì‚= d Ù®ËõWŸ©)©£¨wžÙðýÆbŠêh14š‡~Œçšàp:œ'EõuY¬³éö€Æ‡»ÆN'EÑõ@&“ÉtåßmÕ·Ú µðÁÇ>^<˜uSÆgSëéôÖÇøúë}ûrr\f2™LÀ@…àñx<>èè ›m‰û²Ê\ß©)ªmª;IQ‹º—t<©´]¡æÀŸ#²~˜ó¹‹€Åd1YLƒ9‹ËŒðþg“v׸ÎNzÇ),,$$8(ZR¼¡ø„+_§›be·Ûív;EÙl6›ÍFQV«ÕjµRÔ)mÑÓ‡)jî»ÿø@pK|jïäx 44,,$øöÛœœC‡\õ…BA§Ãë ÁçÓà›à?'~±«i÷´réèçôÀCeVÿµÈȘ1#- `Äã+äšNJ[9¸œ®¹ 5Y¾IþW:ý´Ùh“çp.Õ8µZ¥jnbb&N¼áàûå¹å¦{÷~£úFEgG&“kTÕ«5j °nɆ'6n–Æ-»ùL`nМMw}„„„†¹¹¹¹GŽgÏVVž?ˆÅb±‡ÝThIÚI|>‹0™´¢X÷Ùîµ'r_™B6X¼å©Ÿ> Äœy=ê4àççëëë ¬[·aÃÆÀ¬ééòô 6dâĘ›FpO˜hl´ì†£>ŒF£IÀÃ^¸Óét:ô\°Xh P©”J• x¤ço>ódÀ»v½³k=ðå¡=ܽ{\ÿ¿}¾æNÍ~àïÔQ‰àé÷žúò‘=®46///ïèQ þ†Æ½ªÀœ´{2ïÞ œú¨ØRTF¶Y.¶D€n7³ÙôÆÕ pnfNcÅ‹^[²ëÉ °Õ¶_:pszJJòt`ÿþrr±Sü¸—xüÉEq.ºœ† €‹]Ýεـ©Æ›97ýxGù®rÃZ 11!!6–¶VëÅ…œ?_UU] „‡<ñÄ¢E &“ÙlÞCôð4H¥`Œì`™Ø@MMMM}=PZZZZQè6jŒÏh–ì}¢(ÜpêÃ"1 Ñíd§ób×Cvx€¿¿B1j¼:è ^:ˆ½5vZL pøð?ÿyäPõ ‘µv`û‰-ÒÍ«p€¬¢Øl:öÑ–u©E\5ûdòìã&MŒ˜pª¹\^>Ðn0˜‚éºÀÓèììì$çl²W__WWW455665Ñó%€Á FNì±ÙL&› œ9sölEÀì`ø±Oî_ðÀü{ «Ÿ ôè{í­Ø"Öt‰ €@l0 z=’’’’˜è Ú?üpèPn.pv~…¥J ¼‘ýZö«+‰@¬+€þþþþþ~W¥OFz#‡âZ)“ĺÜ,BîóHptÿÉNÑð%«Û¸¨(Ù^¶¬òIWLðñññ‘É\ $Ašd'Ä'@Ùl‹ÃŒF“ÉbrW}¹àU`L] !è6`îÒ¬´{·v‰ÍÇæãrmÒÇ=·JzèBÏhtm)’˜D¾Ëáp8\®ë½FCïI8ðÝw ûUGµÍ¯ÞñÊ@€ÌßÛßÛµ^2^N.DnD®¿œ Ýt”>:YýëgCOÒgC›JŸ Í " v¹wÍwOžKJJÊ Àú#6×£„ò§¤_AAcÆÐAR,vG %­–>ÛYW×РTR»×x¯J ==1}?0æÆÀŒk¡¿hØÏÕFµQmÀúŠM·méüMþ/(Šéîì˜1G÷ù-–®®înúŒg[P3©6¢~ªH±¥ìæ…eÏÊ> xxyx‰ú][”ÄÕÑý½û3ie\õéh‚è幑¬:t$¯æp;ðSiáÇ…I€r¡zfó&€µ‚¹„ñàwZ‘¨è—…?ijbÓ':À)²™ (wÁ»Â"·È-rà‡õ¹i‡gå««"Ï KåÏ]üN*|•@|Bœ,¶¸Õ8•qËBÀ/Ü×ß×ÿRA&x÷‘œÄûÅÜïd¿Aß°&Ò÷x'éûŸ/Úýˆ ‰IºàþÞÝ„/gÊ쪕{ï‰<»ÒNúýÀÄ@HÆ‹ƒêå}ñïÿæxº;ãäFÌ}3ÿ¾&g?ðÕ¡—ŸÏ¼öö ñô¸òîéB&hw_€+¼;îáŒ;ƒâÄ•vIC]Àµ"ÐP?Ø8ƒƒ1\mèß tºf­ˆo«Ž¿WßÅÒí¦¬¼ñ˰!´aÿhT¸òLV]Ðo\Ðõ‰ëÊ×ÿ,àÑu³BÄǽöèÇeEe@Ñ” *ÍÛ€a›)·'sä.ù]o"Áû!¯Â ¡0bŒâi`Å{ó&&L¼´¶ Lþñ+;ÿ–Ï`<–|‡6úÍ‘ÇÈY?‘Çå:ÿ«F˜Fü†Ìþ‘`p<°‹°"IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/browser_firefox.gif0000644000000000000000000000222112247657030021175 0ustar rootrootGIF89a æ÷² ç[n¯gZP¥šl ,ÎÎÓ'Lfýÿþ­„:³º¿/Vô©çäå'°ÓûÔ%n™§§­Ñx¸+Ptêɹ{¬Þ\üåO¦Ï‰±ådÊ‹Qÿò2ûš ˆupêu)þøTüÖ ÇG†ËîúÒE‘§ň#†eX¥t0²S.ÔV$É=á¥k5±–ŠôßÍkªÕÚJOJBV+(Õl89‘²…PMâ°€—%0{ªõøüè—/úþþ0kŽðôù° šð_,ÍŽåëïJµäÛæåž´ÝZM–Æ ^è/÷½Oýº$,›Ä²_BH7Ç[0¹á4#ÍxOóóõžâý¹åîj¨K"š••¹ÜR%^ƒ¹ÄÑùõõÿÿüÞUíõøøûþûv¬vpôíëòñé’§¾°7¾G‰AŒlÜŸdâ“^z»ç÷úúüúúœÁ(¢Ç}‡{ÞÖSÀÀËÒOÛÚÝÓ_ùø÷xÃäþýýýýýþþþÿÿÿ!ù, ÿ€~‚ƒ„…†‡ˆ‰ŠŠŽ``qUUz|>’ƒœUx hG¥h^D<ŸŽž~_^G?;;??Gª®­~}gD];IoVV$24 U¯>>®‚19  E2G2$V{/[Cmx¯ƒõp9X8 ]Npø¤È-9N( @ñ I 6åóc†Ê T8PÙ…‚æH‘âä@6 €A¤“>¯<áÄ!²h¸rÅOŸx!’ø(å¦ $ ™ÚJŠs|Ι#Gƒ….[ô`äÏÒWl˜zá’;Bÿ„<¹!GÎŽ¼BxA–KÁ|qÓÖm[.ÚÐé"‚Çä tQÓDÄf•~³Y¸í2* XÐà²%–t("È%¥>b€( uD–)D[° dAS¯–CÌÙ,¸Nc¢Æ%¢Cè ø€!)‰9[aDá&L¤9pZI—ÔÓèáA„Ê<¸§ù~bÂŒ( xÂŽïß0ÑM$ @g5°Â m…ÑB 3pFæÂo¿ P”@€/)eLÐÌ0C:LF þVƒ tXxdS èÀ`aa„¡CŒÖ… 0ÂîA”¥T}üÑ„qâ\°Œ2®dô Ø1ÆPöI0˜0Á\°…„Á‚mQP8Ãt0Ä-¡ %&‘B}#°Ð‚œrbá()òÙ /x± }àó‡PœpB¼9Â,°b`@)|ޤùŠ7@a‚§´†:A ÞàPDPV«P¾Úˆ^¤­ž†Úyd1@zpâê'FD€ÃáÍj‚SX¥…—>2m0há…¤pÕZ(`D¸ÒËÉK¯ú øòî&ñfºÈ¿ž “æÀlðÁ;SOGo-2.1.1b/UI/WebServerResources/tb-mail-reply-flat-24x24.png0000644000000000000000000000346712247657030022207 0ustar rootroot‰PNG  IHDR°çá»gAMA± üabKGDÿÿÿ ½§“ oFFsH9!>Ï pHYs''”iQ vpAg°H‘Ï`ÅmIDATXÃíV[LUþÎÌììì²3ËÝXdi]–‹£i ¤iMMµ5>Yª’èKS1^|“ Ñ¨I5>CÛ˜4MÑ¥ %EØ^@¹”°›¶\VØ]ØeoÌm}8Ž»]@ªÔøâŸlΞ3çüÿÿ}ÿåàù_ö$dxøÜ¹? !„»=•J¥ •¢ÿ²G]§ßé þ¥÷ít~»õL=uN×5MÓÖÖ^}õ£¾ü²¸ØÀÑ v{mí+¯¼õÇ¥Rš¶¹ ð¼Õ*ŠËò¼Å0ŒÉd±„°¬ !<ÿ äÑØ2–e •Ò´DÐuEI&M“åD‚Žñ8 ËñøÆ ˲¬ªÀÈÈ¥Kß}—››­“SUMÓ4Àlż< [[ h4ŽD€üü’’¼<€Ž£1<ªãÙ0XH¥†Lð©”®áðêêo¿Š"Ë››€ ˆ¢$ªªªªºU£ªªªëô¸¦‹$ÙíÃpœÉx½wîx<€®ë:ÃìÅñ?³–PÇ 1™èœaŸoròÖ-Ê8uÜf³ÙÒ~i%z ãÍ1:ª* VkNðÄGY0118xñ" -/?x°TÂáÕÕ•Àã¸t ¤Â‚@rr¬Ö­þhš¦éúV=\Ej„2]d”ïýûëêž{˜Ÿ¿}ûúu`iin.?¨ªjjzùeÊè_EÆÐ73óóÏn7°±±²âóååÕÕ55i»†ã™E®ë4…¶@f ©jˆ®Ó¹BCqy¹ËUS˜Í<¯i€Ûýõ×ÝÝ@<‰¬­m5LF£‘08øÍ7==€¦%“ÕãreêxÌög§â²S(yf;Ëœ³,DZ, (‰D8 üôÓ¹sŸ|ˆbaai)ÍlB€õu¿ÿÞ=@,A çŽLG ½FƒÞÞ^v Õ×÷õÕ×;»¦P6 û÷§§ý•¶DŽ^z©µµ­~€ÙÙ±±‘ªOצ¦'Þ|“b`zzddx°ÛŸ|Òé†eY|>g«ã†]Ú )+ûøã²2A MOsªª(™](›cýÞ½©©©) ´Ôå:x(.v8*+·†Ôélj:vlçZ8p ©éèQ ¯ïƳgööÆÆöv@ÓTUQÒ5— Zk SXøàÁÌ̱c”0Ax¨ Ñœ£ód2ÛØÅE¿¨­=|øµ×€ââÒR‡ƒ w©,,D"KKÀ»ï^¸ÐÚ ô÷ONö÷§¿G£‘H2Ik&Mg„$=ý4P^ÞÜ|è!‹Ùl±ôöR ÷ïÿ À`Ú(:†a–*+kkkk©;ë뀢Äbô¢Ù~TÕD"¢ü0 àvÏÏ_»œ:Õßê Šee¢HõÓ{ňL}ý‹/ùùO=åtûö=óLs30;«iá0ðÞ{?üðþû„TTTTTT””P CCœQªšLÆb€Õj6³,Àq<ϲ@" -.îÞ×M&›­¨`I**zz†‡{{«W½Þ«Wººúúº:@’$I’~[é:(Ц7oF£óóÀåËããgÏ^o,æõN§Ëåt^¯×ëõÒÄJ¥¾úŠ|ñÅ™3o¼±ºJÉÍ5JÇ(Ëc„°,ÇÒØøúë--,››[]]Utv tv¡ýQÆ–¥ÅjÈèèèèè(Àq,ËqÏ›Í<ˆ¢(Š"PPPPPPì÷ûý~?àóù|>ßÅ‹cc§O?þÈÀ€Û=7çv9ÒÕ54ÔÕEˆÍ–—g³v»Ýn·ïv~ç ÐèbÁ`0 ‚ ª‚LÞ½»ºz÷nIÉÔTGÇÔT(´§W 44|úiCÃÛo³,ðìgŸQÇ­V“Éd¢oG!"}Qɲ,Ë2Çãñ¸±~å zò$e>4Îï@H__CƒËEK÷ûï)€gŸÝ‰aEQE1i»´DÓux˜&ðùóÏ™3Ï?îd÷±0¤¦¦»»¦&'‡çç?ÿœ¾þË/²¼¹)ËÏ?O#óí·{Õû;é0Ü=ióׯ$zTXtCommentxÚóMÌÌQ(ÉÏÏIJ,RÈLÎÏ+ÖF4EöIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.rn-realmedia-secure.png0000644000000000000000000001626012247657030025657 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW;IDATxÚí[ixTåÙ¾gß“™Éd²¯dƒ•@ÙwA–JAmÕÚª­´VDÛÒ*µV+E+|î¨ÐŠ¢(Ù"°&ÙÉFB23™ì™%“Ù·óýx}=‹ U¿~×åóç½ÞÉ™3ç<÷óÜÏö†Ã0 Ã0ø/^§×éu2ŒP*” ¥Îÿõó|]áÿ_?«ÕjµZÆh6š»j€¡“hp°Œ±F[f‘¹Ö|püÜù€ÃøÏjý{ï=ž§½ÓGßa„;Džø“y¹ü•€l»ô5™PyÔ¹êY€ºCÕ­> „ÉÕ^ ˆUǪãò¥R©T*¿?9ß·ª Õús Ó¸«I©Ð¥ê÷uÞßÖ 2kÇêÆeÊݪWÃò;d¿”¯S„“„¹¯˜[Â-8&މkF?0È0Á Ì fs€`{ðR°`Am0p†:ýN5`‹ ŒË?-ÌÇŽ-¯·ÿ æ9Á @Â`üý‰€Ì[3#Æâ§ÅMM˜ñíó@0L SÛY]TY«+/¾ Äl)޽˜ðpþw¡ù!KCóN%§’S ¸Ýn·Ë˜L&“ɘLf³É  °{—Ëét:Çëõx®z!‡Ãáyyyy&jµJp8Ã~ à÷Ók‰D,–H‘H$‰ÿ‡Ýþ"`8i8Ô\®n;Új†‡÷Xfù¯å t@'7)À<Ü80ß:íeíem- srÊiÛñý@®"{jþv saæ=™g7g7wà÷ûý>àóùý~?PRRRR\ ètz½N„ì Yj&¿<É:y&“kbE®"7d õI}RU‡£ÓémÕ sèÐáw–3gΘ1kÌ fs“ÿ8µõø@^!Û)Ÿ ¸¶¹_t¯|ïúª½ii©©@||\\\ —+ €õxó( SuFw,:ßԯ갳¬3çd)acÆ¥ÞüÍøÖ(û[ùæ3Ï0LOgï!c<°Ä{sòÒr/á%üpËÜ2·ÐWë«uˆˆˆˆˆ@( E" ƒA «Ëh4€††úúº: óXçóº(`P;0oè§@Ã3 Ï\êÚÛÛ‘ܑܑ\À%t ]B`çÎ;wìòòòóóòXŠ:tèСÇA‹`6?X¿ó‘I®¸\.—Ëåp†‚&ÿPaš_kÞÙ´ hx½á§uf@ðð_Â`üøÌ̬,@­V«Õj€/çÉøÑ@…¯ÂW$E&k“†›ÄS¥Ó„_ˆÿ€“u§ºÀ0Áð`?ók`rjáô)vÀepw¹ €^o0èõÀÙ góÎL¤^Iµt7`yÀú‚¥ HÿQÚšŒ@ZZZZz: •J$R)¡ hhhhhhŽ----ÚÚ::t:€Ëåpx<–²òòrr²³»îZ»vÍÀçóù|>Àb1›­VàñÇ7nܸ éãô»Ïžíî]À3—ÿ:ü×aàÇSW¥ýx*`kµÉm­€©Íd >]z$õp xAð¢p ™9vì¸q€T*“Éå@ÜŸbÿ· ¨;]·»&PîS5ª3–OŸ;ëþ¯â†èëëïïëc˜òmå¿9í½½ðä’›k•µÊZE8|høôÓ’’ÇÛ­^qûl !;>%q2‡csÙ\Æ9W®þÜûÀÃC¿xX Lûdú¡éwÞ¹víw±±1111ÄC ††€––Ë—ÛÚ€`xNNNVVf&Àãñx<ûœûöíßœ— (ryH ‘H$b1{¿@€èƒaàô}<¯×ëü~âY<Ÿ/N§Ã12hµZmDáÖº"•ÀeOÛ‚V+°té-X>ëúÜp`4v »rñ.ÑÑ.`°i i àó€ÍR.{/¿ÒªŠ?åÏf˜–Üæg›/¾·ý%¾Í@™¡ÌPþ6°øe-_(•*•R h4*•JÄÆÆÅÅÆ²¿ë÷“ M-ÿßA¿3Œ×K¤ÑJ4¶¶¶¶ŽÀbl6›md8y²´ôèQ ?„Ü\3qæq{㞊kbF/þ€YÌ}$–EEÝÝÝÝÝÝ@êú”GÒÖ]Ïo3tþñez¼a¸wâ1ÎF·œ-€×ëóy½„{½^ ++33;2Ešz€BÁ$Uá_€9•³ sd€H$š,¿/ùÝÑ%äžÄòˆR·Z‰‚‡†IZ©TËôùX põþê•Þw÷î>øè# ³S¯×ëYÊR« àuuµµuu@FÆøñÙÙ@¤2âHø€Ñ1 òÊY€ŒŸd$f8€ˆ­ ¿¼ßÏ÷_«l¹¾o˜‚nþdˆa 3&mš<°ÕÛêmg³Ùb1›ñyf,‰Å"qU·°Zm¶áaÀb±Z­VàĉcÇŽ”JF£êë/]jjzzº»{zX˦ϹjÕÊ•·Þ ,Z4þœ9¯—p³@´µ]¹ÒÙɘœœ˜˜p¹<— |>ôôôõ GŽ””;tvêtz=püø‘#ÅÅ@nîĉ“'“4T.4š°0µˆZ93|°(j~ü¼(b V+˜Ÿ˜D‰>Ý´pZ9-K€¥X²yYâw@A“´]¨NÜ{úÅãÏ‹#FÜ Øív»ÝN‚”Ý0 )Œž~ëÖ­[Y …Da••gÏ–•K–,_¾|9 ú| ‹Åb1˽$]¦M›2eòdr§‹IUTtàÀ¡CÀ©SeegÏb1 Ž.yŽÙ³§OŸ6 ˜1ƒ¬jµJ Ü~ûêÕ+W²@FF†…)•€ø¢ôôp1X›ÚËx+e+TËB—Ëív»iëÈÌÌÌ?(^Zœh'° quÑ]_­Çÿ8 }¾áOüýV†Iצ=ñ07dŽj®”-¨Ù´±¡áÒ¥úzÀ8¦»¥;xfáÓ[ŸYÈÀår8Á ˆÏ'øýÀܹsæÌ›äççåeg³ ðù|¾@ظñÉ'ŸzŠJ"‘J¥Râ|> ž^/À0$6L˜Ìš5cÆôé$(K¥·›Y¡ ÞQQ¤n T˜œœ””œL*îü|àSÕ§ŠÃ@ç˺ùÀ/×>°oÝaä%¶ÞøÖ<@_¯¯××3ŒYeÖXô@wdOLO8°gçÞw>x¸õÖåËW®¢££¢bb€öö+WÚÚˆóò€œ@nn.ôÜmîþ)`µŽŒØí@X±@ŸX>À0v;PX8iRA`6“V„JE8{÷î÷ßß½P(Äb>Ÿ6õ€ÁÁÞ^£ñ3+ã@är $„ÄòòŠŠsç€òò³gÏn¾yá €yófÏž1ƒkŽ|7d)ì–[/¾åö¾ï½÷î»ï¼´Ä·Å´kL` ƒí€Î®³ëì@\ . @0 ¡Jˆoì„[æÀÖƒÞÿOÀ¶Ø~qd*`?îXá< ôõõõõö²ŸßOšl"q}ï‹ÀPCCCBBCI:ÉRÁÐÕe05555UU$v]¹’ 1݉@ÃKo¶¼Å& "i©$>ŸLx67?Ǭ~yÕm«_þ"R)¡È¯ µ| @UUõ•ª* þÙ†žúg¤‡’‘¼hjjnnld]”Š×Ë4áz‡¬I86%%%%=ˆŒŒŒŒŒ”ÊÐP¥’(<$„ Î×*ò‹Üêõz½^/ÃP¡- ›Íf³ÙHf±°žh0 Iw€@ÀïHVg±JÅÆ™L*•Éà4]¶Ù€®Â®¼ž óEÃÆ®ÇÅ,ܶ0øÅ”ŸåÝû2©°e²€¾µèψgÄlÉzáàßW7«­_ܘž°¼fzèïèï'®éñ©d©en=PÿÓlŠzB @€¡½¢ÐÐÐÐÀãq»½^Àét»N‹ü~ <\« š›››[Z€¬¬ñãÇ:::;;;ÜÜÜÜœ`hˆ´J¨¥Ÿ{´jnÝB ëÏ™‡ÆËü±Ä€´uY k[Y[Y[ðÞïÞ_óîsÀjË*ëm€}§ó´}'`4vwwu±”tüøÉ“g΂ãü*þ»@ÖòqÛ2hRÔUŠÍ›+6¥ºR]©à¹ø#<¸6éž„;H c=D,&TC[^/ápÚ«¡@ÛÒr¹L¦PH$¬G&&&&&&²Ôd6›ÍfóÕIbÍûµÚðp­–dc. xWWW—Ñ„‡“º†ê¶ù½–¿Öm~¨ò—ÀŒ[§M6õ‚°Ûív»Ý,Ô#j u{j @ÑŽOJ÷–>uËSËÿh##òÃ@_QÿÞ},Çwt§¡áÒ¥æf çO½ ¦QÕÚ$m x]¾A¶¨åÖ ÕݨDÊdEpùrKKk+±\‹…UXx¸VN™hµ¤F¥–Mä÷“a·;v;¤ív’…©T„j¨ê¢£££££¹\.—ÉXÀ"#I0§ß§I‚B!—+$† ³€%%%%¥¤ç«+‹k€Ûß,zcõ7Â× Æví(ïtu”û2?~{ï_Ù2é«Ò(`Nï쮹Í@¨S%Õ–c–ã–£€ÅB*g“‰(´§‡äÝýýýýƒƒ€PH,<%%991‘µèŽŽÎN½(---=yî𯬂yÙù§‚×Äë¤ËŸ? H$¤`S( ™Œ(J&#AX¡BBBBär–¢èûQ*¡õŒFC—‹Œ" å8‡ËŒŒØí6áv†ø|8+œN—Ëᆇ  ™Lxâ‘T¡UÊs!gå­!««ØŠ™R ¾år£Ñhìîfƒ5fk³gÏš5o°nÝ#lØð-0Zˆe²€PÞ ƒÞ \Wí»X´?Ö¾µ½ðÚ}c½—Ô¦>–2D–F4F~„”+ß }o½¡¸ «Eéb5À½—÷3î½ó4ó"óôU]Ð ²ÀÀ»Ús›w5àcüV¿p=ä^âºùÈVd+쿱ß?²0¯·¬µ¬:ÏvÈ;.Þ'ýQþeÇ{GxàÞâÞî]ôÖ÷=Ø»àiøj~ ]¡¢Y¨ã•w+W‘µÒü´&BBØôY,&uLh¨R©V¯¾º}ûŽß£…m É¢®¿Z,V½Å´[Û‚m\ O×Ó÷`zÓüª)°$[þiÎ-Ž c?àëðûªïßÞ<¶G›pÂÁ{€ÿ¨à>þÓ€,MÙÀ2M9¨š¨yª4õL@ËhWEÌ’lI!I6@© *•ìý(ÇÓX3Ø:4bj®Ttìéð-Vq«¨ÕÔ¯¯ºç÷úzc€Ä;ãî‰yˆsô@EÅ… UUijŽï€¯òê”Ó©âè~töòùpýª~ ÀÞ—ME¹œ®ThÚJóùÑ3Ý€îéýÉçìÉs1̉öSO]¶þë¥ÖW^úö¿Þ׌“˜46¶¶¶·³|ï³èƒÓ-ôE®]©áŒ^GËh FWÄŒŸñ3~ÀËõr}N€çáyx¡€ËⲸ‚€Élæ[€öÁózÀä73f0Xº¢Œ© SýaõÚê+@KCÛm@.ž".¤[%ýâÛ¤ö¸¸˜wïßµâ¾$ íníéêéb˜Òǯœ¨NÅŸÙæ@·K÷3ýÀ¶ÙYìh¼¿ràÙÿ}Ãøí w÷5îK€¸Q\$ú2“™)€È$:/*Dkø÷ñï¤Se“d€,D2M2МÐÔ©ÛñÑJÑ vÚßßßßÛ ’ÂÎã!½§èh ±ñò厎CAfN§c˜§KŸ}ó¹^ íÉ+¿nD <]“hfªïP¯$é)dHzHÓDïÚÊ”Ç#ƒvO]ýÚ=—ËãO =já,5‘–@ @Tù|$§•,=hEó{–®½ž~Î õz`‹\Çájòù¼^Ÿìö襤8Úd®¬¼p¡²’¼— X­Ëð0Û$¤Çpš›ÛÛu:Þ¦M›6mÚÌš<þÂ…›6%¿”ôAìS@ÒÝqœ˜ Še R+WÚÛÛÚÈÌ—ÇNœ8qâÔ)òb1päHqqI ªP‡!§¨>|èPq1 “‘>~IÉ‘#G²/|âDié‰l—³¬ìÌ™²2²€òrvp#.œ?_YIö"P]]UU]MŽŸH¥€^¯Ó lšI+nzj‚Ã!Py½8¹\.—ËÈȨ¨ˆ£<Àl&iðƒþâ?ÿùŸÿü¹ääLœXXÈ0wܱzõòå¤wsø0« —Ëét¹Ø “†¶«›c|>´®^¯r£Wú=b“_ ÂW[09I7ÚÒ¿Ùç_IIŸg6f §ŶDȵÀ•+¤'$•@iŒêwp°¿ßdzCM­æZàÜÎÓM§:¿$SÅÓJ*^"!£¾‘RzS‹¦Í1>ÿZ †‡Éu*ݦ$ú=›mdÄfcÛÃ,±ÇL ¯¯··¿Ÿ}>JM~¿ßO‡ðÛÝŒgϽž´DH ãzBgÔ*9G[”‚¸\â”zrbÕá ¤ÝNF£Ò·¤Sdš«¿ÞRÑàAgŸR)„ =¨DÓ44­¸\ú Ô²XÎ'*áJ:iºúº«?gWÊÆD(WSéuôóo[FwWéé‹ÑžBÏ!Ñc.8¯—ŒNs_ÉžžÃÞ÷¿æÿþÛe´âé>$+½½====ÄSûúØàÍwˆŽI>nY³¸bq{ßøLFxô`M/©ÂiïˆÆD¡P ‰ØŠÞf#ƒÚ ¾(z^ü" -Žx+r90'eÖ/gže+‚ÿ:’#£k€í€_+ô:½žË ¸\ àré7¶gDÒïÑ•ŠÍfµ>_ à󑬄VÒ>{]o/™QÓJ›a®=ÀE¥³³££³“].—Ëåv“™´PÈûé&†$ tŸ”Dæ4™ÈÈ;6=ý½œœÜÜìlÖ_ÓÒ22ÒÒØ¡~L Éžl6»Ýéäw+g©ozÔ¯5ËÆS-ÛÚ·—ršÿÔú$0qÆÄ•…vþqû¹7N¯>ñ?—·îáp´±áòpù×8=º8þüù Øü—ŽÚÆŽ;vìX6-¤'€æÄWyá\MI$7¡ÿˆAÎ̱¤åv“†*žV¢¾UÞe¾å€ÿOøŸ˜bæ¼x—ùæú ä †I‚ö´Þÿ«þ×&$0Î?ð?xŽù-à‘û"}IsWàaÿïo¸oŠ6 É“8Ä€ìqY²<(’²@57T¢ú wwÜ¢ØI@ª;eiŠHR'º4@ÚŒÔ%©K€¯RðWÉucí.ÒÿŠ‹KHˆú·˜~fÚ¸âžïMê64–µÕ‚ülÞ8@Ð!úX´f‹¹# N[E>@¸Np(Ë啲&@rBò7ñÇ€8^²L2ˆJW _H‡¥?’I­$Jú.¢P\RôÂWD?íÄÄáb Ø(?)»ÍB…ÈH"%¡âD@þÙlr…Ñ@-}Jò ÓH¹R. lùEd!ÒJéù/Q\€oT­__¾ÄHoúÌæ’‚m‚,!Xû¯Û]k4@aÈÄEwɱIã’Æ®€+àþÿùÿÜÿ¡dgLšÄ0?Çý¸ 3%}ÆÀLÃìiÜ{`ß_†X®×þa½±õ ÔÚvåQíÀNó›Ž7{´q©·¤üáËþ®ä ¼i}õþW^R'¥$ŽÑü øï\¨+ìÚ³ûÈû¯ÿ@1ß÷úy¦£ÀëcÿA¾ùÞ‡ò?ȵò4no"ÿ A(Ú„åê«IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/LICENSE-thunderbird.txt0000644000000000000000000007422512247657030021451 0ustar rootroot MOZILLA PUBLIC LICENSE Version 1.1 --------------- 1. Definitions. 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. "Executable" means Covered Code in any form other than Source Code. 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8. "License" means this document. 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. B. Any new file that contains any part of the Original Code or previous Modifications. 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4. Intellectual Property Matters (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs. If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. 6. Versions of the License. 6.1. New Versions. Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. 6.3. Derivative Works. If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. TERMINATION. 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. 9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS. The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. 13. MULTIPLE-LICENSED CODE. Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the NPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. EXHIBIT A -Mozilla Public License. ``The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________. Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License." [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] ---------------------------------------------------------------------- AMENDMENTS The Netscape Public License Version 1.1 ("NPL") consists of the Mozilla Public License Version 1.1 with the following Amendments, including Exhibit A-Netscape Public License. Files identified with "Exhibit A-Netscape Public License" are governed by the Netscape Public License Version 1.1. Additional Terms applicable to the Netscape Public License. I. Effect. These additional terms described in this Netscape Public License -- Amendments shall apply to the Mozilla Communicator client code and to all Covered Code under this License. II. "Netscape's Branded Code" means Covered Code that Netscape distributes and/or permits others to distribute under one or more trademark(s) which are controlled by Netscape but which are not licensed for use under this License. III. Netscape and logo. This License does not grant any rights to use the trademarks "Netscape", the "Netscape N and horizon" logo or the "Netscape lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript", "Smart Browsing" even if such marks are included in the Original Code or Modifications. IV. Inability to Comply Due to Contractual Obligation. Prior to licensing the Original Code under this License, Netscape has licensed third party code for use in Netscape's Branded Code. To the extent that Netscape is limited contractually from making such third party code available under this License, Netscape may choose to reintegrate such code into Covered Code without being required to distribute such code in Source Code form, even if such code would otherwise be considered "Modifications" under this License. V. Use of Modifications and Covered Code by Initial Developer. V.1. In General. The obligations of Section 3 apply to Netscape, except to the extent specified in this Amendment, Section V.2 and V.3. V.2. Other Products. Netscape may include Covered Code in products other than the Netscape's Branded Code which are released by Netscape during the two (2) years following the release date of the Original Code, without such additional products becoming subject to the terms of this License, and may license such additional products on different terms from those contained in this License. V.3. Alternative Licensing. Netscape may license the Source Code of Netscape's Branded Code, including Modifications incorporated therein, without such Netscape Branded Code becoming subject to the terms of this License, and may license such Netscape Branded Code on different terms from those contained in this License. VI. Litigation. Notwithstanding the limitations of Section 11 above, the provisions regarding litigation in Section 11(a), (b) and (c) of the License shall apply to all disputes relating to this License. EXHIBIT A-Netscape Public License. "The contents of this file are subject to the Netscape Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/NPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is Mozilla Communicator client code, released March 31, 1998. The Initial Developer of the Original Code is Netscape Communications Corporation. Portions created by Netscape are Copyright (C) 1998-1999 Netscape Communications Corporation. All Rights Reserved. Contributor(s): ______________________________________. Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the NPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the NPL or the [___] License." SOGo-2.1.1b/UI/WebServerResources/mime-application-x-font-afm.png0000644000000000000000000001161712247657030023222 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWIDATxÚí[y\”Õúÿξ13ˆl"W!Dd©4Q0l¹-H^ïïWWË2Ë6K­®Ù¢¶˜¹d.™¶—fW£Rð*FŠ""²Ï Û,̰ ³¼÷·Óà˜¼¢Ôí>ÿœÏûÎ÷9Ï÷ÙÏ9 Š¢(ŠÂÿh„ˆ9Ò üÑé m æ.Šš4顇>ý”¢ÈóH3úßJ â‚úúúûívŠšóåËõ߯úý9(¸m¬LÄ_dý=tÖóŸÏå²Ù ÆH3~9¢~¦Ò²²gÇ>-0H“E_Åíaš ­è_dÝnÝ~x<ðEàFV\PìG@Vâ=áw«š4ÁµNU—º³ÙDQçKªÎ7Ê\Õ6õ& éGå]ªé@c{“°Q 4å)+U 0èØÃGW.§_xa뎵ÇOQT¥õý®·€ Ýã׬ΉªŸk^ Œ^èñ ðêÃóŸKžüÛ€üà‰Ü¦¼MÀÎ[wùí½Óû²{s€ÈȈˆðpÀÏO¡P(&“Íf2вÛ ««§§»hnniioÊ•ºªàÉÉg-ŽdRY²ÏÃÀ ë^ÊZ™ DD„‡‡…žž^^ ðù|> |>ÐÙÙÕÕÙ èfê›;§»Óv|²íîËË‹q ö¸¥®ž¢6žú¦ |x!ζ`±X,&p8§8QâU÷:°xò]©Ñ¯³Ã’?+HðŸ”ï¸Þ½RÁ¯ÝýÖëoïN,9µ˜»#ëƒ{¶õõ õõ€Z­R)•Q™ÆÏ”ëÛÞ–Ÿ_vìùf sü¬»3’þ `2™L&ƒ±â±çv.½Ÿ¢n-LžµðwØüíY@DDppP ÕjµZí¥ÏçÓ1Àh4;;I?ÆÞ8 à=Écó†¬üfxkÎ;×§…}'K =€;d( (õ?#wi"‹Åfs8@ͨ†fU#°¶iuõëÇÔ ”»“³‡n±±@,3AÕAŸŒy…¢(?êªèêêíí,‹å×€¦&µº¥˜½(sõí¦¡¯ó7ÀÇ›>ÛÿùfŠÊï:¶3ŸÜyçìÙ·ÍΔŒ>£LF“ÑhD"‘8·£jkÝNàÅ‚åõËßRƒR‚¯Dðîä=ZZè ب~tWº\š{Ç€Á`0 €Ïçñx<@¯×ëF unJJò¡ï7S —”–/Ë£¨kvfí|¸í¶ŒŒ™3ŠŠŠŠòrz:þyzJ¥JÕÚ Ü[zÏË÷l2’gÏX|õ1ÊqƹÍѰÙl6íÛ æ¯H‰Ç£ßÝÝÝÝÛ 1‚: ?¡¯¯¯ïÐùq ­†V£‰¢žÿrEÒ‹v }Ñô•ÓÖ--ÍÍÍÍ@{»FÓÞxyyyyy==½½}}€Ø(Qz~,ºaኇ>~ºº·vë]ha§c  …B! × ò|êwWþ½à­9ëϽ{ë }<è;zP[[WWSp¹\.— ˆDb±Hœ_\=¿þa`Õ®—öüýÀar˜æðeg-{Z?iÛˆD"‘HD» ‡Ã%x„@@û~Î`0›–'G%K~G8}¸øEþT4ãä€ óܹªªsç\óär¹\&ÚÚÚÚ´Z -wúÛÓË?ý)2rüøá¼¥ÇÒcé¡(sš¹Ê̡ǣ Q‡Ã%x‡Ãápú €q/3ˆ}CÊ•÷ºa’w¿>åÔ7Õ@ÊŠÉ/%¼¨TtÕ×××××…"‘PxxˆD@ÃëÊ9åÉÀ:Çë2‡Ÿ¯2ÝÙ’òý@`àèÑ `³Ùlv»ë÷K]OG‡Á¤Ü”tß)À, ÓÙ+ýîu·€C…yÊÛû¶¬þ/h …@KKKKK‹KÓär™L&TªææÖV`Öû3y3þø…ù…ùІ¿ >>ÛûeÞWÛUª*R™$'O™2y2PYYYYU5@ ? ž¸’•µ·Ó5© ’ÙW“v^wš Ü­ú  éÒÝáp:íöËç×V+½³$qHz$Ò«ÿ~ÅÑÊÊsŠÚÒþþá­%Àý÷geÝuÐØØØØØH[$É÷ žðG¶fMšžíš$ŽMHIHÿ`zÓÄ1EÑm[‡vÀ¥¦ÎçÓ®€àé!'iøÏ¿KöŒŸxç)ù3?÷³²CÿE+€Ó —•]Úõ$|‘¤@¯7Ìf n|ì‚= d Ù®ËõWŸ©)©£¨wžÙðýÆbŠêh14š‡~Œçšàp:œ'EõuY¬³éö€Æ‡»ÆN'EÑõ@&“ÉtåßmÕ·Ú µðÁÇ>^<˜uSÆgSëéôÖÇøúë}ûrr\f2™LÀ@…àñx<>èè ›m‰û²Ê\ß©)ªmª;IQ‹º—t<©´]¡æÀŸ#²~˜ó¹‹€Åd1YLƒ9‹ËŒðþg“v׸ÎNzÇ),,$$8(ZR¼¡ø„+_§›be·Ûív;EÙl6›ÍFQV«ÕjµRÔ)mÑÓ‡)jî»ÿø@pK|jïäx 44,,$øöÛœœC‡\õ…BA§Ãë ÁçÓà›à?'~±«i÷´réèçôÀCeVÿµÈȘ1#- `Äã+äšNJ[9¸œ®¹ 5Y¾IþW:ý´Ùh“çp.Õ8µZ¥jnbb&N¼áàûå¹å¦{÷~£úFEgG&“kTÕ«5j °nɆ'6n–Æ-»ùL`nМMw}„„„†¹¹¹¹GŽgÏVVž?ˆÅb±‡ÝThIÚI|>‹0™´¢X÷Ùîµ'r_™B6X¼å©Ÿ> Äœy=ê4àççëëë ¬[·aÃÆÀ¬ééòô 6dâĘ›FpO˜hl´ì†£>ŒF£IÀÃ^¸Óét:ô\°Xh P©”J• x¤ço>ódÀ»v½³k=ðå¡=ܽ{\ÿ¿}¾æNÍ~àïÔQ‰àé÷žúò‘=®46///ïèQ þ†Æ½ªÀœ´{2ïÞ œú¨ØRTF¶Y.¶D€n7³ÙôÆÕ pnfNcÅ‹^[²ëÉ °Õ¶_:pszJJòt`ÿþrr±Sü¸—xüÉEq.ºœ† €‹]Ýεـ©Æ›97ýxGù®rÃZ 11!!6–¶VëÅ…œ?_UU] „‡<ñÄ¢E &“ÙlÞCôð4H¥`Œì`™Ø@MMMM}=PZZZZQè6jŒÏh–ì}¢(ÜpêÃ"1 Ñíd§ób×Cvx€¿¿B1j¼:è ^:ˆ½5vZL pøð?ÿyäPõ ‘µv`û‰-ÒÍ«p€¬¢Øl:öÑ–u©E\5ûdòìã&MŒ˜pª¹\^>Ðn0˜‚éºÀÓèììì$çl²W__WWW455665Ñó%€Á FNì±ÙL&› œ9sölEÀì`ø±Oî_ðÀü{ «Ÿ ôè{í­Ø"Öt‰ €@l0 z=’’’’˜è Ú?üpèPn.pv~…¥J ¼‘ýZö«+‰@¬+€þþþþþ~W¥OFz#‡âZ)“ĺÜ,BîóHptÿÉNÑð%«Û¸¨(Ù^¶¬òIWLðñññ‘É\ $Ašd'Ä'@Ùl‹ÃŒF“ÉbrW}¹àU`L] !è6`îÒ¬´{·v‰ÍÇæãrmÒÇ=·JzèBÏhtm)’˜D¾Ëáp8\®ë½FCïI8ðÝw ûUGµÍ¯ÞñÊ@€ÌßÛßÛµ^2^N.DnD®¿œ Ýt”>:YýëgCOÒgC›JŸ Í " v¹wÍwOžKJJÊ Àú#6×£„ò§¤_AAcÆÐAR,vG %­–>ÛYW×РTR»×x¯J ==1}?0æÆÀŒk¡¿hØÏÕFµQmÀúŠM·méüMþ/(Šéîì˜1G÷ù-–®®înúŒg[P3©6¢~ªH±¥ìæ…eÏÊ> xxyx‰ú][”ÄÕÑý½û3ie\õéh‚è幑¬:t$¯æp;ðSiáÇ…I€r¡zfó&€µ‚¹„ñàwZ‘¨è—…?ijbÓ':À)²™ (wÁ»Â"·È-rà‡õ¹i‡gå««"Ï KåÏ]üN*|•@|Bœ,¶¸Õ8•qËBÀ/Ü×ß×ÿRA&x÷‘œÄûÅÜïd¿Aß°&Ò÷x'éûŸ/Úýˆ ‰IºàþÞÝ„/gÊ쪕{ï‰<»ÒNúýÀÄ@HÆ‹ƒêå}ñïÿæxº;ãäFÌ}3ÿ¾&g?ðÕ¡—ŸÏ¼öö ñô¸òîéB&hw_€+¼;îáŒ;ƒâÄ•vIC]Àµ"ÐP?Ø8ƒƒ1\mèß tºf­ˆo«Ž¿WßÅÒí¦¬¼ñ˰!´aÿhT¸òLV]Ðo\Ðõ‰ëÊ×ÿ,àÑu³BÄǽöèÇeEe@Ñ” *ÍÛ€a›)·'sä.ù]o"Áû!¯Â ¡0bŒâi`Å{ó&&L¼´¶ Lþñ+;ÿ–Ï`<–|‡6úÍ‘ÇÈY?‘Çå:ÿ«F˜Fü†Ìþ‘`p<°‹°"IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/edit.png0000644000000000000000000000377112247657030016747 0ustar rootroot‰PNG  IHDR°çá»gAMA±Ž|ûQ“bKGDÿÿÿÿÿÿ X÷Ü oFFs·´®a pHYs``zxE vpAgp`ì’ÊF_IDATXÃÅ–kL[åÇ¿==T™ue:!EÙ`ÃE¶eº 0ƒE FÍt1fÄKL6‘˜É€(8ã¦ÓÅEöFå…‹·¶8%„ë « E.ÒËzNÛÓ ½œÓszzÎÿEÿ3VÇ4Ãï›óâyÎ7Ÿïïù=…,˲,cÙUWWWWW§TîÙóàƒZmo¯V›“SP—7>><ÜÓÓÑÐ4E½ývcãgŸ F"I–û{òdCÃέ­€Çóý÷²,‚Àó²l4öõÉò×_Ÿÿ¼¢¢¶öñdz²b±p˜çgbb`ˆÅD1†¢,àÒ¥³g;:$Él¾rå—_ †k}%I’$I£¹åNœ8xð‘G^}×®½{ŸxbçN¸ë.Àé4™zzQäùh‡C!Ž\.—Ëïìv§“ãÚÛ>ù¤¿ÿüùk}ã-D’·,À»ï zýTVÖÖVUµ¶j4™™›7^¯Ù<0ð|0èó‚ Ñhœa«Õá…úûYvhˆç›š’ùAË*›bz𦡩éĉ³gÎ#Gþ)8AÄbá0°cGjjg'°{÷3ÏÔÕGÓ8££çÏ/Tž¢Š&'¯^`l,+ëÈ@UªôôÅþÏ?_V¶rå±cEEyyÍ›oÎxå•S§&'e¹¸¸ @£JJ V®¼ùüñóÏ|ÔÔ<ùdi) Ë‚–8CC_}Çqàñ0ŒÇÌÎZ,.°f^ð ½aÃöí ~.—ÏÇ0ñ`4NN†ÃÀ‡ ùùó§$ñ<ÏÕÕ[·¦¥=öè£ÕÕÀÅ‹}}==7¿r¥¯¯« ())+ËÍ/qN@Ó¿ýöÝw@4*<ïu–·Œ× hµ7ÖÔåå;vTV.ö½ûîŒ ­¸ç­V’€ááÑQ¯7±‰Õjb!@$Âq@F†F£R-½â4mµNL¡PLM:]q1àóMN77çv‚Àó¢Ð4M»\Ï“dv6ðÐC»w¿øbr•*%%%Ðé23o¿}3qÌåx…–*Aày–ÌæË—¿üØ´I¯ßµ à8—‹¢€¹9›Ídb±XL’§“¢œN€aü~I**ž~úða@©$É””¿úF£ÑèÂ…?„Ư國E"óâX¤ÁÁîîÓ§íÛkj**âÿ“$À0ãã?þ?×% ðzÝn¯ i—+¶l©©yé%`ÕªÌLn1xJ I’äbðdœYžD†ñxXvñ‰ŠüþûÐйsÀúõEEkÖ))·Ý–—¸Ý££?üˆ¢ D"ˆÃ, 8‡Ë¤§çç——7nÛVU•¼U’'¸œ× Àó@WWw÷ØÐÜÜÔÔÚº0Ñë¥i«ˆDB¡ÑQ +kÝ:½ðû§§F€ãü~ŠŠoVQl6«Õá$µZ ¼|Ïž—_N^˜db'^àJp&4ŒŽSTKËѣǎýôÓáÃó ÊË M&àÙg_}õÀ ñzÃa€¦GF¾ýÅhT«Õb±X€™™ÙYŸøõW§ºà8IZ½zé-šLà /”–~ôÑý÷oÛ¶víûï+nTãÇ_{­²ò­·hiiiinV©TªÜ\€¢ŒÆÎN€çÃá``·Ûíffffl6Y¶ÛÎ`Ð`8tèãûú::– (Š¢(Šk×&·˜$ÅoâPˆøû‰ ENŽN·~ýsÏIϧ§Ç7é¹sñ )^èu»Ýnw8šf–=sæfÁ"I’$I»=ÙW©T*•J‡#Nçó%}N··××ëõeeùù……ÅÅëÖùý‡ÝØíf³Å¨Õ+V`±X,V+àry<,;5%×»øõxsŠF—8Ù@ZZZšV»o_NΆ EEqð‘`vvbâÏ?«ujÊlT*&5unŽeExê©ÆÆÎN“)øw–®E-ÔÖV[[ZªVçåÝ{ïæÍµµáp à÷5==6ø|.—Ý(©©*ÕÅ‹Ñ(ÏsÜ–-§NõöËžtHR«U©jkW¯Öéî»ïÎ;m¶±±áaàêU«ub" …dY’ÚÚ¢Q“)knnl¼tI—›-¾m÷îmhøôÓ¾¾ þ+à…B¡P¨  ;› æ›od™çYvÿþ7Þèèñzÿkàkõ?.Ï›JµpIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tbtv_inbox_17x17.png0000644000000000000000000000142312247657030021037 0ustar rootroot‰PNG  IHDROc#"gAMA± üabKGDÿÿÿÿÿÿ X÷Ü oFFs ݆³ø pHYsN N }™Þ vpAgÀ ‘¾‡yIDATHÇíS;KcAþ&wæú£‚`%ZÄDðÅk±²ÒÊF°,»T¢ Al,´ÄÊ.? ÅV±ˆÌCÅ$ ¦ðy“Ü;w¶²Qd—-¶X?sfæ|ç|ç ðoüc_x<^¯ÏgµÖÔ˜¦iú|!Àààߣx~þ’@…XQÊeÃðûºº::4ml¬¿ßá£Ôb(U‹¥úÎ087M@× CZ¹7 ¹Ïdòù÷wàæ&¿¿./c±‡‡··Ÿ!––66ö÷ )ŠE¿ßé´ÙÚÚ4Íåêííì!:È%=ýÒ~¾'„ôƒ×׉04ät:ç25êñlo{½V+ç”rxØÓc³µ·kš¦õõÙí@2ùò’ÍÑh"ñôô‘êwÒVñúšJ¥R€ÓÙÝm·‘H,–LV;;£¥!Œ45ÕÖÖÔhZ]c”¡P,d2¥’²2)ùgÎ9çH§ÓétB!ª¶¹¹¥¥µ`Œ1UŽŽpX×9×uÓt»©¦)„Ë53399>0&{+„¦ œœœžƒ@>_,Æ×z­ÖúzÆ€¹¹©©‘@UU•R@ÆŽC¡t®®¢Q —+ …ÍM·{v6¡œ瀪Rª(Õ!cLQ¦§'&†‡E±X©&Xi…ÅR…Í1M©U6›Ëe³ÀííÝ]<þøH)ç…ÂÚZå5 ™¥ŠBÈW[!¤T&V¾?ûláp8 å²aèúÊÊÖÖòòÂB&S9'‹‹ëë{{©” ØÐð÷þye$…ÎÏwwWWççGGe ŸçèÿÆb¶9îŒ8IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-www.png0000644000000000000000000001027512247657030017570 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWHIDATxÚí[il×}ÿÍìÌœ½IîòoJ%ê0-S§% .’TJ ªcY®QÁv*Eâ/­ƒh£ø‹›6p†øCѵÐ$®aD2jY²-‰´)Z’IY$%").=¹$wöšÝ™~x™Îîì,—KQRÐø»3ï½9ÞûýÞûïý‡’$I’$|“Q¢uþØÓ7<âÄ{C,‹ÅhIúbM÷ûgß¿Œ>¥”ä˾–ˆ6m·”Ø[Íû >ý°¡°Ÿ´×:€iÍŸ×Tõ¾z¦i=`0Œ#E= °µU¬øì³+ì…¸$µ>Õ"´7\pÿþ~ŠztQ§D"™L$$I!‘B¡¹¹P¸¾;>j|çý¿ö¬¯hÙÕJmÇ6ü`Ó_4MÓ4ýðúQ4ÿeý-{¦L’~0$yÔO:¢(I¢¨Ÿ§äÉQù)ãUÎ/}º>ûºÜrRJÓ:Mg2Y,€Éd2™L@0 úýÀ`÷à's€x4bÀþÛ{üé½€I4‰&ñÁQ´HŸNý‡ð&íEQ…—óê³ü“k´¯È®¥¨Ü¥H§Óét˜› ‡`zzfÆãœN§³¬ غï±í•÷—œÛTüÎq–ÿO`4 „¼}X4ʈ+´öõÙwfß±ÔxS×e¯&$ûHÑé†a€X,Å€ÉÉÉɉ Àbá8‹XÛܼe]9P¬7Õž>v^ ÿÏŸ~£ßèzpD¬€€\ˆó‰5%ùÈȼ¯…€Ï,Ï,“ÏY–eàùX,!3cn0›9Îj*'*&«î—›fÿøøÏ.î> ðKQŸoõ‰Xš_´h¡¯&"g–cIRqÀËg Ã0, èt4Í0€×ë÷ÏÌÌf€ãÈÑáp8 éoÖþSÓ3À…¾‹wÎ[9qN …Vˆ‰ 5je˜]®5´óÅ$-àµsÙg:QÊ:ÃÐ4 ‚J¢(Š¢””˜L””””˜ÍDW8@íÖºµFàüè…ß}´ HF’‘däþ‰X‘Ò–óÙVMvöýU )¤F3÷Êlñ”}¦¨fY'èt Cf„N'›Ÿ€Á`0€Éd0˜L€NGQ4 ¸GÜcî;€}Ìž¶}týòóðåË÷ ÿ ±\” ¨š|DhA¸2 ”™Ï$$³¥NÓ¥ÓW¯öô|þ9L&“É$ Ó±,ËWRÂq€ÅbµšÍ@cCÓÖF3ðUÛ@ïà^÷¤kbH’jwÔèëj‹7[WaäÚóZШQ~Á´¼¤6?—Êk½‡a”À0Š•DQ4­ÓÑ(ÏG£ÄZºw¸}ûöí;w³¶qºIj¸|ê=qýïWÒƒÜ|¢i©;ï—‚åçeÑ“)‚tºL"²ERæ‘eD"‘H$€þþþþÀn·Û 9lH¾ Ìܘ¹1}­øž¬‚’;˜}–O|H’öÈ”­u ‡  ³³¯Ïãúú†‡Àï‡c1E¶»\v»Élݺn]y9°cǦM••€ÍÆqz½FÇyÄ›L F£ÑX­Ä±„T*•R)rŒÅb±hX\\\\\ü~ŸÏç*_®ú‡ª'‘éÑÑ•¨l¯J?@òùzun)ÂÔj•ä|¾PˆçS§Þ{¯¯èëòx€Ý»·m‹FššêêÒR ££½}qˆÅ — ˜œôz+*€Ï>ëëóz·ßþÍoúú€½{ÛÛ««—^úÞ÷ÚÚ§Ój5s‰P'½^¯×ë•öZ­V«Õ ¸Ýn·Ûqá„xwîîîî>à­âð¼oOXNd9biªÔ$dæ®]œ^yå¿8wp¹Üî™àĉ瞋D€uë].Àív:Ïœjj**>üp:Žáa ¬¬¬¬¬ ص«££­ xõÕ_ܺE.^zéõ×ÏŸúûÇÆ‚Á\‘TÌ‘¦ãp8¥¥ÀB*R¾ðßÅ¢¹JV9[Ê@Ô¾z{‡†¼^àÍ7ÏœùôSàĉ£GGGx\vîfg M$êë5kl¶òr```ròøq O$ˆÒL&S)2r»º“I¯ïîöïï耛š6n~ö³Ó§;;7ÞøÑöíZZjkÎüƒ$W0f×F£Éˆ¥;ÒŠGs–"²k´m ÜüÜÜâb<üüçï¼ÓÕ?~èPWJ¥Ó¤R¢8< lÚÔÐpæ `4  &'OÉd:ÝÚJ”§Ó ˜ÍzýÃд$óóÑh]ɇB@y¹Ý~ñ"𠇌?ýé[o]¹BDX:½œ‘¯ø™3A¯gY½ž¢Vº±»*"hi{={RN§O¿÷ÞÍ›Àû÷F#ËNL¥¥Ë•+@]]yùåËÀäd °{7 é´(’eoNñ\A’ìvâ¹JÐÒ²fÍûïõõn÷'Ÿ{?³}N'yþîÝííóóÀ¯~uî\.Йbf)b–ÂåPxÑléÚPh~>nܸ}{|¨«s»»º”zQ”$šnݺwïÈ`dÄãùÖ·ˆƒdµë$&¢‡,!¤Ó‹‹@}}EEg'p󿨨3Ï>_8¼aá6[n [[.]Ξíê¢ÑX,•*^',—U" ÷5…¦löêìì뛚¶mÛ¼9$Oäy幃ƒ““ßù0>>;ûøã@2™J‰"H9Y'“‚ð|–u…(J’r¤(@€Phq‘8h%%ƒƒDY?ù$03D"J{eâ´ºoG,·!ryæ¹õcc³³Ï?Oöl¯^ª«Îk×à••ä>Žˆ5“N§ÓJ‘ådƒec1° ’Df†L€úÈqƒ× ƒóó @ÿ½{ßý.ˆ"M+m–­m¯ °\ ¹"H èÜsò_^îp”” 55;ëõ'N>ÜÞ^Œ–oÃgeiDZáæ‘Ùycƒ¢D1‘~ò“çŸß¼èêúòË ¼ÜjÕ뉽Ÿ¹HvýúÈÈ®]Ä*²Û‰ÇLÌLí5('Z¿^Yº‡#‘Ž §çúõ;w€×_ùå;ˆõD¬(uûµÏì—‡f†j½H-ÕyYÈ{®2ÍÍ••f3ðÊ+66o¿ýÁ7on÷·¿ír‘E¹¦&Àl.)Ù³¨ª*+K$”¥ù=&“Á Óee6›É¸\ÇþýÀÅ‹_~ÙÖ Íͯ½vìØ¦M@]ËÅq™{ÀdçËh”—ý”“ÿ|a0™¥IË^n´¢lý±,±F’I`ëÖµkËÊ€“'_xewßýôSކ†<žjjªª|> ´´´Ôj*+íö’2²–“HSSÏÌ ðÅ==ðØcÍÍ6ðÆ?üa{;ñ|­ÖÌ÷“ 9`Ki¿ ¨¶µ#Iùöð0ùyÎçe/M˜Íf3Ç)fY€Á`0 ÊÖàk¯;æp@8’¥Ÿ¬ùýÀÝ»ÓÓ‚ ì¬•–ÚlF#ðä“­­v;ÐÑqäHc#PVf·[,dŸÀ`PF¸Éd2€ÑH‚uå=bµ½Ÿ¹ÑšéœýŠ Â„dæåø£‘.‹¨TŠ,=$“‚Ln·Ë•J--MM55ŠÇ«ÞàÑéH4ƒ²ÙNÖëY–k0èõÙ[ÚAÊž6Z^ÑZ8<2”/³@QdcEŽB`e„fÚåÙ÷ªcEµcGÕ3PîLà•x¢lೕýjˆ`UwÄŠ¥äA'mà3ËŠ l)ŒËCó„WFÁÒ1mùÃsÍÌB/å‹QÕ:nÃòzû'‚Ô6„Vøbf>÷é…–ÄÙ¬¾Býíç-/‚O«|¥kÿZiÙ3@Aòóœ/h7·ƒùÃÔ—êh¾ïrËÕGå=Ë)Ï|þÒÀk+aȵ|z Çãñ¸$E"‘H$²œ©[Ø:Xšm€–¼ú·´R]ø:í —Ë8G³0yE̤ì±.,,,,,ô³ôaêEù…j‹AQnrƒdÇFL±jòYr—ò•k·¸PýrSî˽BÝOI¢ÿŠ>N¿ ð<Ïóa%úšeY–e%)ß×—y ×Ïåh`žçyž,ïXJm>`ì_Æ©»¥@Ci½³±\úa[:.ÉÀRcÔ(8n9þÎñK€wóË?G¾´‘EQ!Dò ß ;6ò×in ï¿0õÑY€ßÆÿ'ß ˆn±Zth)¶•Yû¾b¦T°þµµÖÊm“OlY p'åûmàÿï9…,ë€X,‹Å~ÿ¥|L™êŵ?–${ðr¯Ùl6›ÍJ¹ü=2YbÉ/–ý¡¶lÉ€ËaÛùìêÿïI‰ž #\öàeBH¾°H.úKùoÒê¦ÿ4¬ÀÚ_wc‘IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-package_editors.png0000644000000000000000000000526112247657030022067 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW ð¾ úñ”H|¨*T!RU$â$¨„¬Ò ‘Ti»éÞÅæÎ/ìÛì=wù0vwvfo÷¼Ž#¥ét;³3³3¿ßü3³+Y–eYÞ•]y·;ð Ë»ì²ÄÃV0 Ã0dËú{qþ•×Oµ—VÒµ8`mY]«æ.KLßÀù™½(ë¥jÉë©)`Ï {ÔÜ&P²ŠŸ+€µñ釀T:•N¥%é^€Í)¬xíµ¿&Î6-ëá'wޤ<Æ¿[_’vo ¬´Zív«eYN§ÓjkkëëkkÀÂÆÂÛ7S@m®þ»úià¡ñÃyXŽ|ù‘gÞÿ@–eY–ïÝ8BðÛ‘ß'~³Ï²žùïÉöëd`++€iZ–il{všüÛ?{¾Ò´9ö¾»œ7ŸäÊr,&Ë€¢d2ÃÃ@&“Éd2Àêêêj½¼9ÿ柯®ædÀ±Ÿxöø@ÆÌ˜sç‰íz¿ìþºó2Û%I’úOÓì•xpô¿„û®$ysì;@¯×ëõzÀúúÆÆÊ pûöÒR¥ŒŽŽŽîÛ<ú‰ÇN”¯*ùÌð‡Ü)ý•O«wVï¬lì||š{Æõš_Þ]Ó]Ão¾±÷œÀ³„¸ÿ !±X<†Ñl išvë0<¬(ÃÃÀ¡™™Ù÷îÔÕõÀ™Ñsz ¨§ëéÿ¼µsD @€b‘ a)‘á¬×‚~À;óyô:‘H$âq@× £Ñ š±¾d³Š22LÜ×&€©óÓKS?Î|æÜGç~Ô­•›µZôD„Ž‚X œð:^^^ZZ^z=Óìvݵœ6š—v>ÅÙ¦Sch¾$y}\–eH$âñXÌÖª¦Ùë™&°¼\«--““…Ðn§Ëår¹0ý­C?˜þÀ» I@±X, ^€¼°‹®ý5Àn§ßúƒ]Q [­f³ÕšÍf³ÙšÍV‹ü“´$5›²lkÌ•+W®\½ ÌÎÎÎÎ΋—.>,]Zºtû–5qtâèäãÁ5!²(ˆÎHz¥i•Jµjkkûù$úçSÓâ&‘=yïð…:_ê”c±X,Òét:“††ˆ ’åXL’€­­­­­- ^¯Õj5`â¹ÉïM~¸qûæ÷oÄ€ LìGs $Ê!N•¤¨ð£±¼ŸS]³ˆ4!*aÛÌçóyWtwË| Àüççççü<\û™ Þ@‰=µÁ­T4ÍéØñ´@tÍ3[ýnÛY–$²ŽH¥’I`lllllŒhŠ,ÛÏß³'—6»ý›?¾[ùø mH-Ë©ür^Ħîò%êm3ñ³Üã ¦Ê|¬÷¡Þ#០rß±,bM«U·Õ âÂìE%6Ìd<¥R©T*Ùiúìd2‘H&íõxØçDb‚x-ˆøÍt:Àí€ËÛ ;&¿Ñ…t0ø#0A¢T*Õjµ ˜&»vCd_Ge°VúÁF¦ˆªª*«ápáK&ˆtˆµT*‹E>À¼-'®­„sÐ`Û&ˆ‚ÏÂV©Ø> çŠ‹ý.íÜÐ^¨ªªªªXvͱ¢×Ôi‰ãD´ß/¾9Ûžø0Å%¨lÛ‰fDµJwCÉž‹$1ÜþG’ÞÜ(µÁ>o°}ÑþsvÕÑ+gÇœàŒüÅ{SÁçþÎàÎñ+4@HÚØ>€®„YàX¿ûü;µ êœuÂHä&ˆ‚Q*‹DúŸåò}AзŒø>hPe‡Å%¨D±T«šV­@Ö|Àýf¯è¸Wnû«ÞÞªMo¹\.;5Àïh6ŒDb‚x ‹ªJ×nÀE3Û»žpì¿b|=ÝßÒ¶6&˜ >ÀšFwCÉÁG¿×F¼m‰\tÐ]Øqñóm PÕrÙÎám§ß3À{;³éÒ‡…uÞî<',À|"¢&À{2—~2€ b} «4 b6ñ3@íu@¹\.ÛOs mG"ÜŽö®ˆàäYLP0"‚®7Ü ó€çßgϤݭÞ&ÈÖ4ï:€?óý§½€‡ syóòi]§У×]ñEUÝ{AìLw¦£^æò}ïmþûENˆÅGªƒJ„&È-š¦išFÞ@#Q¿ KÀТ ããùüø8¯ý£%ö¨“={æŸE‹qÙUÄ »ê§î2áL’³g4ßùêWÐmb¿W"£ÄeÛííŽ5Ø òÒ< ýžmŸÂz=ù3×[Ž×v?Ÿ4, *¿èt:NG̳è¥]ï³¹vûýò½¯«‡Éw¶ï<ß “—‘ƒÓÓ—òŠže5F£Áóþþ+B1b"øžý‰ˆáÝ¿_h>Å©ÕjµZ­þDMe’4lnnnnnòä§¥¯ÑuwÚZ;í^ÈØ€¹—òÞ6l"Êç÷8ŒËôïó–`ÇiYò×ågåoº®ëúýÚ’¾ÔkY¢¯/…Ðw&é^Ž®ëº®ÿÞûž°øÓ·¥…½ÀÁ½F§öS wê„öþ üMiQº)¹羓û çõoë_EQÅÆ‘ŠZ!‹Åb1»ÁC'§¯^Î;[=} Ð×_Ö_̼Y0süý sò^× +Ò†´"ÝF¾1¢Ž$€#ÚûžŸ=(S'ŠŸøÿ·Ó¯ÃÔ†aÆÝ/å [#è ÔT=(’N§Óé4L&“É$Íf³Ù¬O¿GN¥R©TÊg³<茡Qœ~zä" ¡—Îðxœ|H !é‡Ip÷›üE݆—%ËIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.oasis.opendocument.graphics.png0000644000000000000000000001001112247657030027433 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW”IDATxÚí[[p×™þú6Ó=÷‘4ÒŒ¤I#. Ø ,.²+¶±±I±fw]”q\IxتìCv_H–¤R§¶6le󰉊ˆ+µ[kˆ³2Øì5—8‚°18tE¡I# 3ÓsééÞ‡³g[s¿HWŧjª§Ï­Ïù¾ÿüÿNÿÍhš¦i>O(±zîéspâ+m ˲,³šv¡ùⱎŸOˆÐîiŠȬKT[~WLíÍg;cÀpÓØ8¾ãXä ^­ù/½M@K …÷uFÑ(E†Y°ó%¦Rpöì ïÇ5mÙêah@=þ¯=Ã<¸‰d§D"™L$4-•J¥ `j*šš¦†ú@àTð?‚'·¿s <üâò]_Ø °,˲ìÂÍ£bþÝöŸÂ/ë4m×ÌÎä_ÉÄ&&UÕ4U²ûÓïÉUÿéòJï‹×Ë.Ϭ—›OrY–ãX0›%Éj$I’$ ˜œœœ ?]üÓ™OC€z ,d`ë››^~| ©’*©÷ŸˆŠm@úGÊ‘Ô!"í Ã0¥§÷Ùÿ Oޖ䝑YÊ0¹9z N§Óé4 MOOLwîŒÝ¾ ÔÔÔÔÔÕ«6¯ÞöÀ¼ÇÜ ™€ÿr{˜ŒMÆ&¦ï¿X1ºÄ•:ýÌ–™-ŠÉ[vÙlೠɼB8Žçyåx\–‘‘‘‘áaÀj5›­V`I{ûÊ¥.`Ñd‹´èð^ÍééwŸ‚bP¿qÿˆ¨‚€\ˆ5 à8–å8@’ŒFI8Žãx>àBdh ˲,pùòðptv.[VWø|v»Ù Ä㲜HããÁàØÐØèñ45É$1ÚN§Óét¾¿_òO¾€÷ÿçtï)ðÔŠ/¶n›Ò4'ëdkjæn#*& [¨d?ßÛ;2ìÙ³eKK ðæ›gÎ gÏ~òI0XºŸì´~ýÚµ~?pñbOOo/ðÚkGöõ•?Nbz/¹»»µ8|øƒ††€+º»ëë™™pxzš¸ÕÉ$ ªD@L&I2›©E(f@Y²x"§n¾ÿÎIð%ÏóïìÕ4ƒÅ`1Xª'¢ 2W@"‘LÆãÀ† ~]pä™hW×C¹\Àºummf3 iªªi@*ÕßîÀ²‰D8 ˆbCCSÀq55­­À3Ïôô:ð4íß¿}{] (À€,OMɤ,Çb€Áà÷wwg2Ùí@OÏÐP,¦§³³£Ãåâqb¨Šäyžç8}åF£(êª4‘ õúzÈà½täàÜ[ç§?üØú-–'¶U nèáÿøÅOªi/½´{÷+¯0ÌØØøøíÛšÆó'€Á`0 @"‘H$€¢¤ÓŠBÉ&'¿÷½Çüþ½{fròòe0kj†©­]¾ 2I$eM›™éïY&+Êáèè¢ÑÑѾ>`tôÌ™_ÿÅ={~ö3@íöúz@EQ’ˆñÅ€T*•J¥tcËrÚÕŒ9óÃ÷ì³û÷©”¢þ3ÇÍóú ày@QÈ•a%b±h4¦¦&'''‰­ã8 ½½½ÝçÚîø´Ö€?L]Ù{éEð¾¹øç•¢Y¥šÜ|þQ®ÿo2uwýëÀÝ»¿ûÝéÓàr­YC¨„ÊF’Nšv÷î… €Õê÷wvš68xî Ë‘Èô´^›º£º[JÕ‰ÈTI³¯‚ ¯èk×®]ûôSÀáp8œN y'Ùšü 0vyìòžÊ½¤*ãJm°J¹›K–tu‘ @$Òßõ*À0ϦM*¶¢Q¥Ó²L$7&+¢½P”ññ7 @%_%I»Ýáp8€úúúúúzÀãilll¼ÞE‹¼^Àëõz›› ðv; àùJãþÆ. ÏݪïÑÊÑœ·}@ùåäj6ïØqà0:zîÜÉ“@2 ëêÖ®¥ U22E‰ÅA°Ùl6ˆFÉ 1þÙdA÷Ô†™Í&“ÉØl¤¿†††·›¨ öv ±±©©±ð7Ýjî¼sñö©! ¿t“ãˆâTÍîƒeM&§°XvíúÁ€¡¡'ŽR)U5™†q¹V¯®ddªšN,KÜb†I& ¡úE>ª¹²¬¾!t:ÎÚZ ¬D\ᣠ@@i‰/¤~òÓ!nw{; IÏ?à08xìØO~( @½¢+ÊÇ D!É2ˆ¢Å¢—V 4¥.·œþÈ=õ²ÔÕéGÒË€€bruä3͹¹FãâÅ«WFãöíßý.00pìØë¯ŠÂq D5­\I€¡f^ ‹H¥ˆñeYQ´Ù–¥;WÉÏž®²e˜j_ì΋ *dpg”û® ÿ€%©­mÝ:@’ž}öÛß~õ«ÿ˜ár"V­Ê˜KÜGƒÁjâñññ¡!€ekk[Zªz¶š)¾R ãr_(¶Š«ÓQZ²ÈÒöùÖ¯DñÉ'¿ùM²"ÞxH§Y¶®`Yb#Æ`p:UŦ¦ˆsJŒ®ÉT[KNA9®É.t)Jã2Oä>fnÓÛç¯g2ùý]]€$=õÔ¾}ÀÀÀÛo¿þ:N3Lm-À²^ïOÉäääè(À0n÷Ò¥³ý}rJ›LÕØ€B+ :TÕaÜìGÍžŒž“ý/3·¼sÿÌz&“ßOö $õ÷¿ýö«¯>ßîÝûö±X0 ãõ>òˆ¾Ñ¢ººÒ9ΗrÓœ£³%¡Ðå”ç;ï§ÉlîèØ¼Ynÿ[o½ú*¤Rä ç¹ç^{M÷çsUEy‰¶)ÔêÖ@UgA™­ èRç'3·%H$¢QàÞ½£G÷íA’l6}ƒU ú;†|c(þ~¯Ò4g/(ûÕ_9F6³~fyiÝ›YŸçÉñ1Ï[,N'L;öo@<>33Ÿ°ü6c6È *ÈL‡´Ü –$•êí={ðzŸ~ú¥—¯wëÖçžffþêW€œÒV|¦+ZÜSá\€PHeF)Ì<ŸÄçæWGD<~óæùó€Ñèry½€ÙÜÒ²r%`³57{<ÀÔÔñãV³.o…p¹ö‚*¼´d+O§C¡Û·Ž#q>d;¨ê­[ï¾ ¸\;v,;>~ù2pïÞõë}4ûlÛö@UÐ\ŸÝO>[QˆˆdrxøÒ%Àfkmíè€Xìî]ˆÇ'&† …®]ššº»wîb±Ó§EQ¥˜M!ïD‘Úr_ˆ¨¹¦yPAÙžKqŸ[¯\ ÌÌO&?þ0™Üîæfe² O™ž¾~0¬V§$‹Åd¢Ñ¾¾?ÎíFw\ºD¢)úÍo††€K—nÝJ$È†Ž¬±\¡¸,˜ È÷ Âg“•]OÏ×[3êä§(Á`?`4: H„BÙc€XìÎÀdòx¼^@QFG?ùDŸ ‡U•„±ƒÀË/“èŽ z{'&ž'ـÚˆeÛ€üÀg’“_¥äÖ¡ÿ²óthRÕHdj `Yâ÷3 ÐÔOWð¼( c³µµƒ¢ávoØôô 'À•+CCàtšLÐÞîñX­³£)ü~—‹„8RÕEŸ4çX&ô¥s˾8 c±8€ªÊòÌ Àó^ïãÛ¶}ÿû¬0ùáaà…ž|²³…ÆÇ“I`Õª–†vïîêjjìvIâ8=>ˆã8®¾^êPUcZH€lVA¥ É_èBÀ“;§sÓ¦½{P(Âáúú¥KIY صqcGGM àñØí CB! àd>4ˆ—Ì‘DS°:ßÌç— F¾oЖJåŸ 4 ÿ.B€á8853#˪ \½j6oÙ\¹ NONç͛ѨÞgv`×âÅuuƒ.á³C© ÐGšGî)ð™/œæCýTE@õŸô2Ë’cãžž¡!YΟ¿~}bðùÜn‹…Ó’0óXŒª‡ƒ¨æfÀn7™8xñÅÇs»u"Y–¨Ÿ$ j¡ûR¸"²çOvÚšFŽÃK[Š’Äãñx<®i²LÂ= éPÝpeQˆ˜ÂDÀ U¥A½™ÞG)àçzFYXÂg‡¯•¦‘H$‰ÐoÑ4Íh4ÆÂD$€2Ic"Ãáp8Ø¿b¿Ä¼B˜í1”&b¶;WÈëСΟŸÄ•˜ÌÒ£/wžšÆ~}™ý; F£Óz¸» ‚ hZ¡¯/ @]úÑh4Ö7¬µö0ø/CÌ@-ÐZÛRÓæ¢@Ï—söÙOø~fégçUç>ç?цè?Dÿ0›Íf³YÇ‘’ @З۴Ã%;}7ýSÀ{[ß=yˆ®¾ýPÔ&Õ™_sV÷’{aÛUš˜if‚‰¶¿µ-² ÀÃ#í]¹0·œ(~…€ÿÿ~J 8ÛÐ+]ôƒªªþ\’(Š¢(ê/ÿ-‹ÅbÑóé÷È¥l@Ù_ÈP/ˆNÏÕiû…’¼ÏJÒ±‰„Ó JH¹^PÅŸ(}žæ7ý/òê¡´‚ÄIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-plan.png0000644000000000000000000001067112247657030017676 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒWDIDATxÚí[ytTUšÿÕ^•Ú·T%@HX¶aqÃDGh7œFEœqz»µqèE§›ãÒ¢v÷ í2í@ÓèhÛ Œ€2*¢@DÀ@({4$©J%µo¯ÞRwþ¸Þ~•TŠÈ3G¾sàò^Ýûïûî½(!„\åHàоCû¾GÈ&ݦM4„´}ÒöÉÉ®ÿ;“8%œÚ%B6¶nzü݃„´´P·(GÎGLßh?þõBê÷îlÜö5à©÷x<õÀ¦ ïUmPál8Î0ÉX2–Œ²þ†wkÿëNÀ“,¾Ñ^Ûó*pÔÔ$rþ¡) Úµr÷ƒŸï#Ä{­çg ÕjµZ-pðà¡C­­€Íf#ŽJà²Ëf]ù$…â\ûkjkþ q%!ª˜ªLY”––””•]]>_Wppz+¿ßÜ%Ü5ýKν¿¡Êˆ­€¦ ÍÕ€Ñh2@SSssc#àp8N'ÐÑÑñ—Sï_;oè¨Aصk÷î;òòÑ£G|ûº9¿xþq1èѽ®›˜Í&“Ù ¤Óé4ÇÑ• Ñáq‘Šðæáë/òzäëð÷³Ùl6›l6›ÍfF£ÑjkƒõˆíwNëÄùâ$ æ¸tP(hÉd2™Jú'ôWéÞ=ÿ8ŒœÒúƒúâñD"—a+‰¤””Ò0Œ’ïæU|=F£‘@uÂét:JÉq¾eä°FÈð{ ™L$’I@©¤ 8~üĉãÇåzh FNÞ·¯±qß>ªp…ˆD(1ƒ8ß2l‰£Š… -ºãŽÁë———— ÔÕÕÕÕÕÝÝÝÝÐÜÜÔÔÔ====Ã?a‡Ãáp8€šššššyÛ¶mÛ¶mpòäÉ“mm…Û¿óÎÛo¯]Ë æÜ cØÐÕÕÕÕÕEÈëûWn{}?ðhÝ/n}¤(ôýÝ»÷ìÙ½…Âá`:ÅH¨ªªª?˜9sÆŒË. y’¹ÓU(r‘ÏÛ÷}KËþý--´lnœNª¢¢¢"£˜3çºëæÎÍïï·ÏÿÛ²gW÷ÜÿOOÜ{PbñJ,简³¦ ŸúHÃ΄¼óâ²gk%äõŠ_ÓÇÍ ëÖ­¼µ%¯ØžµXL&ÀçkoÏfâbÇë¥Ô“kAýÅãñx< ®®¶¶¶V~ït:.W_(¸…fm )&·}EŘ1€ÑH)‡‰×ëñ””ä'w¼%%@ ‹Ìž]Qa·eËÒÒè—c‹ö¼¼¶¨áæýêÑg‡Žç¯€Î­‡ÇîàË¿š–ZêQÌdb1 äù¢"ÀjµX,–Â+ ŽDÂašñ””x½¥¥€Ëår¹Ý€V«Ñètù@ò<Ï B> Œ¢úד$I’¤üïèõz}Q0fLyyE-ÇŽ•Ãà È{H½½g0Ù,Ï'“€å7–§l§€®G­?‹ÍÃ3V@O][ ùŸ³Ùju8€L†&6™L6«×Sn×ëóW›ØŽõõÛ·Ó„+™”ßoذqㆠ€Ïçóù|25„ÑH$¼ùæ[o­Y#s<“ի׬Yµ èí {{åß#ªèU«V¯^¹R¶ì@ èîÖ­[¿~íZÙ)Ÿ:uêT{;pà@këþý@CÃÞ½ òøØ¦]"‘ɨT€ PŸdµÚín7Xúõ¡æWÎ\CŽ‚8’Hƒ„¬YþÓ=WÌ¿²£ößcǾúª¹hks:ï¹X¼øÁ—.¥–™ÉÈÎŒm9ƒ¡P0TUUVVUÑ æZs’’$IÙ,U(Û¤ù™Êœ2S|…3ç­ÓétCaJcãeoÙ&J¥R©Tòjxþù+ž~šÉ“3™õ늊ñã§Nv¼ù©åýw/þê£S½Âdt:’†¼ºOœÜÖäìÝËJ×Ù¬(f2@0H—äĉ“&Mž,S› Z­V«Õ€Ýn·;Àøñ4ÌdQGŠÐh4†R…^/×Ë8·¾J¥R©ÕùïY™ ü霶Á`0 ´_ƒ!x&Ó¦M›vé¥@OO:­ÕÒŒZûX÷ÏG½,ã4T²îöŸ ìý `že¬+"€äùDÁffΤΠr;Ñ,o¨ÎôÉ'—/æ ¥åÀÖVY1LØ&Þ¬Y3f̘üä'<°x1àv»\Ì©Ÿîû}WNaËõxJKËÊ€ƒ9Îh$IÒiÀrµå«šâ´o 0¦j*æ¬Fø¶~k‡¸¾o½Õù5 i2èíŲ2:Q·»oâ5T€F¡|pñâûî“U*•J•Jn †Bá0pÿý=´d ðøã¿þõòåÀk¯½òÊË/ÖÏàTAFBüþ@ «K6¼l–çãqÀ¶Os[ß–#å;pðË!à:d \Õ~ùþZÀl¶Ù\. ›å¸x…8N§£Q‚ÅB [R¾åŸMI-Æé”òë1_Àd܏РÝœð4a#$™L& B¾ù¦½½­ýû[[›šäz½½©”V He«Õn/.z.þfûþ3ˆ†]i)ëé!D¹A1NÝh—PŽîíM¥80L&»]æn–¡wüÞÿ;?øÁ‚wÞ)‰D£±0oÞM7Ýx#pÿý?þñ½÷þã?ýôƒòÃæ³t:ù¤Ìd’ÃeŸÏïïêÑhL&€çéö¹ÙLƒE½r”ú8^@q3¨,·»ð TÝBšÂ€óϺQ÷â1~Qâ9î¿ä’iÓ¦L)lùg ð` Ü´‰†‘Ì郡P(lß^_ÿÙgÀÍ7ÏŸûíÀÒ¥K–<ôpûíóçÏŸŸÄœ9×^{à ùïc±x<#„m_wuùýT1Z-pÅ—_>s& ut´¶õîG¼(Ÿ t m‹šÂÀXÕ4|ß]ßA)¨[â…/þ X^°ü‡m I½½™ŒÑH7Ï.ºˆÖeÎw8/DIì™Q£¨… ,¸í6`öì+¯¼â àüÓŸÞxCî—|+…˜ŸNH$‰„Bòfa"AOÎŒF“Éd&Nœ8ñâ‹åhˆ%¤Ö7ìkÝ«)n  Ý!(À÷ŸGfîÜ X®s|âõ¢˜N‡Ã²*-5ª¼|àp:à†ZîÚµgÏ_ÈyD¡ÁœccssK °woccS0ujuõ”)ò|X†ÌǶÑÃáH$b%M™zzä0U¥R«U*Àfs:Nš@6K`û[g£€ÿž£ÉÏ~5¸¥ `Qç-_V™'¯Ÿê"¿?z{y¾¤„îÝ8ò .Ëgï·nýä“O?^zé•W^}UVD!gìõÒ=¦»ï¾ë®E‹€E‹î¼3÷|‚eÊÌg±Œ9Å"¹ ©å«Õ4Ü5›Íf“Iõzš—ƒ–²›|@"A·±E‘ã¨Â4«´¿+JÉë"Oùý„-6›×›?΂Ûv4m\Å¥‡*<”z" ‘E(--+5ªo<~¶aæÙ—g~ Â.°-Ÿ:×H$ ‡¢"£±¨p¹è =¶Rð¬dïµÚ¢"«àyIR*©ŒÅ·±ìóJ…Œc!)¨ÿö'b€ÕëxÂ!• `0“1€êêêêêêÂÜ®–zg~æÀwttv¶·rôèñã‡Ë÷‘ØÙ°Ûív»Ýò®' GÕ T ÀŒÓ§Ó­‰TJ§£TŽ2×ó¥ÇBR‚|_Nì¨&þ}u÷¬)@&Ó™>Y„B™LQ ÑÐ<àË/nm•-H¡ ›kJ%ŒrfágVŸ‘ûœ»WÔ·=!J%ÛÄ£íägV¿{ú\YYQQUÕ÷÷¡>K’ H I*•$QêÉfiBªÑP¦ˆFë}®ÔÔZàËuÍ~fp+~zF+ ¶¹çöo6ƒÑh±¢˜J…B€$¢TÊ'KßÝÿàAçm2Ñ»­¢˜Í2 ‡£Ñl¶Ûh}Ïò¶þJž’±°¿«‹ÃßXN9÷€ Äã!”3>ö¾ L!D’¥R’R)À0ÛÄ9še\û×Ï£ ÷ÉÝû¶î«Jß®œˆbja0(/ezr+ ;ÛµZ­V›ñu.·ËB[°¥=ô³]ùÀ¾Déƒý’{® ÷’Û¿ü½gsºñ±9÷Í?èA$–ˆ*•€(Ò„Õ3yôï&Å÷É%û•–šù·üð4 ðÕíéì ªÒu€ðF2ÙÖ¤R™ Äãét6 ìÞýÞ{›7›6Ñò».3g–”HLr\6  ét(8–»£šßöcž/,@%jpKN»¿žˆ…Ãáp8LÈëŸóÝ0 ˜YwM×mO‰Ä±c7‚Löö'„‰UuA;ε“¢žÜ:ý-®»¾µû¶ëi ¥¿ü~òÿ•¿sÿÎ}Ï‚µZ­V(‹Å`ÐhƒA§S©µÚht¹­¶¬¬¶ؽbKûÛíÀõOÿì¦Í¿¤ù…Ý®P¨Óét:&$ ô]êCiO§g?8_%¥û1ÖÃÇÁæVÜD.—BW6…dW q #R)xFºO!ÑløtíS,oøXÚˆ#‘Š£²áé=}¿ÒpÓ;üâ×ç~àûø>åÃ{v¡·;ƒÞ| =ù\ñD ®¯Á&…›¤wƒ¢é‡gÇ!@Ÿ2N÷~|ÿJÕ‡3 …@:™é&¬\ÇøR<åK Ÿÿò!Œî€EÄIC ?`P$,¸Axíѵ `)(÷ô^2¸ é‡ç¦À$“H¦3$’ xB£gw?å/d/\§`’ïƒ\‘ð#.<&†`"‚‰„¤8%ù˜ A $’d JÂ!ƒ-¤–§îVL™ÈàŠÏډ¥õK¤³ëð ´´˜C]þH0 ¥@²#áù«Ðɵ•:šÔÑtr N³×"A„M¦£ ÷H,Z/àÐ'SxôÀ#p¥ƒ‹“ïáüÍÓÄÇIÑX,2¡¹3¾·¦Q#jTh°‘üí (È{*´Ê®=ÿõÄ$ŽWàŸØ?€7®¾Ž‡¼ýªèàRŒí$àÈ5ƒ›D I}œ`ðíüÍÎw/ ­TxDBf\μwdx-èÜŠ‹ òr,·—`ØŠ¹ÐÀv½®Ð[ ´}öù@u9ÁJ0ì/èßeÒÚáãôD° žÉŠÔ£ëõªsåòßnÓ0µ\2¡Ám– °zhÂöƒÈftô…€iËFu¥ˆÙæðÖµyg—áó·€»> îuþÜo.W«koÓ0(œ)¨ÛkA<Ãk¨"e,Zb01ØoÀ *(ÎÌcúÝ9L¼<…•¡+½t ¹ŸVÄQ_™´œÉôìàOöóåè1òÎw‰+=ùJi¦þ½©³SS<7sv¶¸4<2dûÕrâÄ—¤ó½¨­¯`æý[xÿß³8ÿÞª¥H9öÆã7pä±a2Üá-9ßÎ÷Ç¿¹69סRäsÃñâóo—¾æÖÝÐhOPÜRZŸ8ñÓßkºñ–Þ ]ŽçŠ-2ei32<Ò²¾ çðN~õ‹›n¿¸¶ÀÛ¯oÿå.®þ|òg4ô³ª.oÜøÏÓ££&“Ùãš«›¹\¢åyïèÇ0>>¬ö <Û?¾ô"î±> ¸MU!¥Z†)ºTg*—ïØ33giýäÉ“‡ù´u`|CC}´óJ(ÇÇ-7¯ÍbNÞ‚­ÕÏÓ0ðþ/ð¦ãau²‚õ77*ï”Þ%èWÛ;SñéÿêS™®tÆu=jŸ•£¦:! b ]5©þéC˜¬\÷i‘’ªÔØílÂÇ·åüâ¦Â÷¼[¢o„+E½ØX_xu‘Ág¹,·´F)ü#.±4¨¹34=ƒëyèÊ%È:DUCvùaX–6¦ù|7 =œ“§vÌœÁ¯=sãŸ4ô EkoíE=7©¥-–—–ÖGXr5oê@"&” ók´³±ÐÛÓƒîî<º ˜ûšm»´ÿ£š§ ÈvÙyæøs ­yrÖ)êª Û \ºtéù£G¿ð»¾]}ªóñJ3M" £Ñ´QÈ÷¡;ÛKªHjÃT‚”*›sˆK¼=çü,šñB$ùŽcËòxçΛoUj² Á|4›Í©•4hF ‡ãFàŽ:OÉËèO“!ý{†»^+W×&ÙlѬL€%YZüàõbqaãÃé™ñJ¥ž# Õà‚ûƒ"à„Q.—Q\\ÄôôJ~QÊ„£›…˜*5vûÚõÕò­ÊM÷_ÕN4t>xíþL:Sx"Ÿ"ŽHöÒýÀùø/\¨çž±¡"„IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/goto-today.png0000644000000000000000000000301212247657030020074 0ustar rootroot‰PNG  IHDR°çá»gAMA±Ž|ûQ“bKGDÿÿÿÿÿÿ X÷Ü oFFs€bí©¢ pHYs``zxE vpAgp`ì’ÊFpIDATXÃÅWmH“_ÿ=óeù’¢c¦E1Q)RQÓ‚^Ì ”ÊHË@K­ 4¿Ô‡¾öÅ·d`‚iù!B+Ô­  ÌDi9“¨$®Í-7מÝÿ‡Ëí™Ï³§íEçËÙ=÷œóü~çœ{¹ã!„ø•K—ª«ëêôúïßÍæåå´´˜˜ØX•jb¢½½µµ¾þàAÿþR^FÀŸÎÏ/,,*r»WWε5BØ:Ðø¿•7˜ÑéZZª«å{Q\œš!¬##CCŠ  W_¯VŽ^ùº:“);Û^¹ø¼¼ššÖVŽûE€1Ú±ãðáÂBi@|¼Ýîpëà`¥R©¶oÏÏ/(::ÊËïÝ“^UÕÕUY)ÄEE™LV«|^±¼?8ØßïåÏ~x<”ÀçÏ33ƒ4pnîÛ7› ÐhÒÓ¦§§§ ÁŸŸ?©zuõÍ›ÎN Ê‹`ïÞÜÜœﶯ¯$!##„9r蘘’’”D+ &Ï/-±ª¯ÏCPQqùòÅ‹t〹9£ñãG@§,…bÓ&!®°p÷nFX?þúµ÷%¡ ‰=ÖX œž;wÊÊ:;½þéÓáa`lljêí[`qÑí^Z¢zyXXày“IЋ‹”˜ÉDý&& †‰ @§ëï´ÚÊÊînàèѬ¬mۤęf8}ŒÏ{oˆG‹‰F£R%'UU99ÍÍ@G‡NW[ X,N§Õ $$ìÚµe‹÷h­³Ùh\\ŒÆ¡!ƒAÈ“µu+-Ôú‰ñ¬Ç)9bÀèõ³³¾ÁÄÆ¥¥éé--@w÷«W55ÀÊŠÃa³*UV–÷(Øí³³ °°0<üå pútzzS P<~<2òéàp¬­Ñ‹v}ä *é#)Ø’’ýû…õÇ/_ÎÍ¥¥ûöed……ÙÙOžçÏkµÇŽN§ÓépÁÁjuh(`³½xa6wï^¸ÐÛ ÄÅmÜ/ä‘ËÏΦ\bf,@È~‹É±udä† ÑÑÀ™3iiZ-°º:9i·6›^o6EE©© €ZMò€ôî@Àg€iÁÁét¹<àþýÁA_£$¶kµ==€J­V @ÛÛ§§KJ€à`@§“æéêòŸçÅ#ä§l›iFàìÙ¼ vpAg00ÎîŒW RIDATxÚí[{lTUÿÝ;Ï;3vKiJ[Yp¥P }ª±¬Ê+k+`²Æ³‚<%qcb"f…#D¢n6 X#Ùè&+""-…N[ÛeyIŸØb§ié¼wÿ8ž½wî£óhKIôKÚ;çœïœ{¾Çý}ß9÷\†çyžçñ+M±S=_:ýj€)&m¢¼^¯×ËòüÅY—NÕ~ôý½ßاø;|ˆï‹æ%Ц pcÁÞDö3ôéor´×Ó²m#Àl~ÖfÏæôÍÑæÍ FƒÑ`d˜»¡l%bçÎÕèÎøxþÁGç LGÆÏýfê‘’ßøý< ƒ~?088448´¹Ú:n€¾ÓÎOœ_ógÌ+~­]PùÐs˲,ËÞ=96ÀI맺ïãùÊáÕgD°þ~ áùHŽ'”ÉUøü•–Çæ“¶GóÉëI-Ëj4, ˜Íg±Çq&0000àtW.]9ûß! r,¼Àc–?ÿx9ÀE¸™|C$‡Cÿþx;Ã0LlÅÓ²ô—ºp´E™#º•aä5B ‡Ãá004är ==½½·nÓ¦M›–ž,~$Õ’LÀüGsg>·}á>õ0àðô»&??LØ‚ÇÅR´2tÏècù›´M¬x©A¢¯Ä V«Õ^¯Ïçõ]]]]@JŠÙœ’Ì}à‡“dÌá²ÿ|eÿÚõï Àitº>y†H8Ë‹ÔìÞýÑG/*Bé—¼¿šˆrãÊ9Åõê@þÓ'¢ `Á»°Z­ÖÔTášÙ9£;« `ϳ}ìà«·¿.9ý°’¯¸ùÄ«<ŸÎÜ—7}úÄASš@ªÞÅ‹—.]¸P®„ææ¦¦Ë—ü|ÚÝ“–¤|jPOj€ææ¦¦ÖV`ñâ‚‚… –ežÒÓF¿øé'§³·ÈÊÊÌœ9HжÙl6› ÈÛ1÷¯yÏgþóõµÓVàÉßþ.gÕ ÏÛXk·ßIAÔÑÁP7ÖXã£ø”‰D" ñ<Ën·Ï ‘úH0™8ÎlL&“Ébìv»Ýn²ß¿*Ûœ¾yæó/£ÑÀèø%H ‚ÆR4õ85jnnl¤í £#¨‡‹Ÿ“±ø¤³ó2 ÐÒ=^( …B@nnz:ÏÏððð0°råÊ•O<pœÁÀq€ßObFÆí×€Ñö;áюչΟ{ýQKŪ»h9‘òœ9Fcg'PVVVVR"UPSSSS[ TVVUUV*ŒS_____ÊÛi¹¡Ááp8€eË–-+(ˆž•8 mlllll–.-(XºT¸# Æ>Ÿ×ëó­­­­­­@mmmí¹s€F£Óét€Ùl2™Í@JŠÕj±¹9y‹s-@ó¢ïú[J®KÝÓ;¯ó|öŠÙúû³‡¤$ Hꉱ'ÚË¥:þǘfDâ Hž%EßG«Õh´Z@«%ÙÍ–†e5Àãq»= »»»»« ¸zõêÕkׄ žÛ“Çç| 4¶lhz-ù¹'AjÊ%†©©©©¹pAIñ„êëëë/]Š­v‡ƒxx,jhhhhhˆž‘_SSSSSS4Ï eY†aY ££££½‡ D…Báp$BøB!àÖ­îîîn ¢båÊŠ  ½¥-§}=Ðû]ïw=<Ÿ¹$sIVAüOÂfA„ÊÊÊÊŠ‹åõÔ0……Ë—¯X!çɤ5 …aÕ×*,Œnó76,[¶l™\jj üüüüü| ¤ W¯×ëõx€ÖÖï¿omz{{{oß2×gý%ëà‡ž›oý 2‘¹$+¿6“‚ D "ï/ýM½%9(’î? ë`ñ/1ÄD_)‘= @¯×ëõz‚ý&YX­@FFFÆŒ@jjjªÕ dgggÏž ÌîœÙ5« èy³çÒ­Ó‰Ï?)RR­C9‚b‘‚Ææ‹Er¨JžOcÒÒl6» ¦ìý™áñøõ9!Y¸UÈ‚¢I A˗˳v:ŽÃA …BXjxªxʧ†ºR>5’ò©Þᨯw8„'Èh49ˆä‡ à ׿lE$>ù/Ý»;p YMt?–o\€¤dù(` ÀF K§Óëfì uš—cCñp5r¹FF§ÓéìïêOž¬®þì3 ªê™gž~ÈÉÉÉÉÍz÷Ý#G„z5~§³¯Ïé”×Sjhhllirsɸ”Nœˆæ·ÙäH •œú“xpôè>Ìóë׿ðÂÆ sëVOOg'ÏWWWWúilª¬¬¬/Ä!ȯƒ:|xíµ]»víJ\ cø}bj{ã7ßܽش饗6n²²f̘5‹aÞ{ïÈ‘ƒyþÅ7lØ´)þ4t² ±mµíay–Bþªª*+W¯z<øî»ï¼£ÐÑátzÞ¸  ¤þXà#MiI)ÏC¸zz8‰ð<`³Y,c)Ôï'Ћ/qœ^¯ÑrŠ!Hª—»ƺ‘°¤ŒÙ.\¸P[«Ô“pçääääåÉ ›’ÂqZ•ÙNæBŽ3Ä÷•®èãÕ‹%AÒ=‘²²òòÒRyºB.----/W ±äoïÞýûCPZšÉ¤×+ÍFé|Üød×Z­F#ŒM!hûö­[_~9¹{‰i·£•=^m= nc¬t—’RZ މ+\'å8£Q¼p\·n͵,èƒ eákjjkÏŸÚ¤íj{A6›Å¢×'v~4YËg0ètÄcoòMI‰fArÅÔ•QŠÞu¡ü{öìÛ§A~øþûdWtjhÛ¶-[vì hçÎ{‚bQ|þ)… ­[‰à±=_}9˜È%ùÄ5t/HI/÷© M!H-}µÛÉ'úâC˜îF+BŸ{Žì×S¢õRÅIë©LÇŽ?NëÅ/Ž(ÿSO=ùdEy3cÆø ð±ýûس‡ç·lÙ¼ydžéïèëãyµ¼^\_Y()•żjõcØ!¨LÊ¡t‚O©^\NMµZÓÒæí·÷î}ë-žß¹sûöW^™„7bÁ`0 ª›+Ö¡]Aå3œ±Uú„I¹^ù¦xëåŸH)ÏGíŒ,9È¿KÇ4€Ïçóù| vpAg00ÎîŒW sIDATxÚí[}PGÿÍÌ~±°»¬ÊÊJ`!‚¢Á/$ŠDO+±R•¤rI1ÆJ¦L™‹©Â‹w¹œw ‰1ueŒæ’ÔUÎxV>êê=/jü¡4*ˆ"FPX@#,Ëî»Ó÷Ç\g‡aÇ]–O=ßþÑ5=Ý=¯ßïõë×ïõ2„BîÑ;Ô ü¿Ó=†˜î0Ĥ ÖÀ^[×R[NÈ¿ÏìþøÛ4 £ªƒsnj¶ƒ“ ‚ „Vâ&„PûêOKãlã(ã àùû–>¶¬ ŸsÿÔÔ‡FÎ'lÞ2î#ûæÅ„<ýÃS†_þ ˆŠŠŠ2§Óéloï» è÷iéóQA‚Ï­÷ùäõAˆø^lOû ‚Ïwû~â¸ÿ÷” ÜnÚ´ŒŒÌL€ç»ºx(\ÿÎS…7m8øþºž]@FûÔÙÙÙét§N•–ž<9˜:}g\¡¼Ñ^£×¬Ü>è ¨«®«¶—òõ·ÿÜõåÀëõz½Þ›@o–~_MH Ó¡T÷výõúˆˆˆà7¯¿òÛ5k€‰I“ÒÓÃX É É¶É kµÆ–’››—´µµµ9¡ –a†aü%˲,û?€eÅú@íh)¾ó· FRµ’jd Ò~wKÛ…J&“Éd6ÇŽ>¬,ø d±X,11@BBBBBÃ8GddpÖ¨ †aXÖÿ̲,KJß+=Ë;  žÖË/t(+*™ÍfóÈ‘ c±TWÇÄ—OÈô†¤®TJ‘ ^ú,×||nÔ*`–í.`Ê— ø¿'‚ åC DDú ¹i‘–úJëC33ÁùQ†K´ý>& ”šH §©r‚ þöõá üüù‹ËÊzŠ@«Õht: %%))5•aV­zùå—^"¤©éƦ¦ÞÇb‰‰±X€Â·ß.,ô×û|¢{;dÒl¹€•€èM§”žžšš‘¡<ÞlÚôá‡Á¿'j6!¼ñá×|:éž1h(™œ@&¦7‚üñuëvF1B¯-ÊÊ;X¸0++1à8–e†Ñé´Z.8¿EEÅŇâr¹Ý.Wèó¤ãÏœ9cFvvOÁÝ÷–A Ðfئ‡®ñ^¯ÏG0yò¤I6ÀóOWðÕWGÖÔ;v|ÿ}e%°yóêÕùù„$''&¦¦7'';;/¯÷+Ž®jj¤‚gQðTáv0Nî­DêNºÝÇõë„TVnÛ¶f !ÅÅk×ff²gÏ’%KOÖ##µZŽ4­V­ÒÓÇ3ˆ‹‹‹³X€Õ«7m:xàyžï긌†|¥Ëç)}ŽAíS4TÉ[–õõû÷ò pâĺu™™€ÁÐÑQTLš›;v, VGDhµ€Ýn·Û턨TÇ0€^¯ÕªTbLE€›7ÛÛy°Ù¬Öèh@¯7¢¢€;©¨ð»€ß› vP4nwRe ®nïÞ-[€¦¦6n²³}4+ °Z““m6@£Ñ룣{ÚN•ŠãXV\*•4˜&ŽÎNžÒÓ““cc={ΜilÚÛÛÛû#8î|C;ô¤>íž=‡ãÚ5 ¶v×® €œœÅ‹gÍFœNèìlm½>6Ö?9EFêt*™™’2b„òoÞ¼uËãñ`4FcpþûË-ݰáÝwß{/ôI¿ DuuûömÝ ¤¤dd$&úO–€ÇÓÚ* °¬V+Š_ʺÓévwu;vìÞ}útðï9.Ï÷>Hª[J‰š8êŽÒMyÈÏrjn>{vï^ 1qþü)SB\®†ðz»ºÄ6 £Ñ§R‰Ï"íÚõÖ[=4444ˆý†ŠŠJJŽ!Äår¹:;{ß_§Óé""€éÓ§LÉÌ Ÿ°oxô™ç;:Z[µZ§3BÚÚD¿[ÔPBñz†W€×ër9@MÍÆóçõõ*•Z­ü%GÔø¹s·l¹tÉ_ß[œ“óàƒsæô~È5_šÈtäBÄÍÕh|>Ñ{a@¨×+n’ô$ÙÚj·ùù+W®] §Ñ˪T¢HÅ~,«V>ŸÇÓÙ ïØ±u+P_____Øl6›ÍÖ{û{ìØñã‡âv{ÊcÐ3BP«££­V .nÑ¢W_ÊË¿ûî›oÀf[°`˜ÄÄ @¯·Z€ãôz «à¸I“ž`˜ÔÔ'žÎžýòËM›€èèÙ³W¬T*½Þd3O&Søx<·7=ò \ „<±3¨Á8¹fÝ&ññóæ-_TW{<<þùæÍ@ZZNÎܹ€Ùœ–öì³ÇEFŽ%Úx§hm½|ùÌàܹ/¾xí5 ::'gÙ2Àlž9óÉ'ƒÁ`0µZ­V«û/šª$øPrÃ}É ôÙ ¥ H3HÒ÷ãÆ-\¸b`2¥§çç55‡}öpáÂöí›7‹#ˆþ;èT@DÄøñ¹¹@|üÊ•_ h4&ÓèÑâu˜¨(@ n+çzKòÌ™RøY^ßÛTå€ BN4c³¥¦&Ó3Ϭ_/Þ+*(ƒiØ–aü›+µñôd«Ñh4_ãM&£Ñl•;%~ý«PnW¤¯Ôoø/Vù/*Ñzé{µZ­V©ÄäµÙzN˜êhæ„%ãC½ÖBÇ6tŸ¼_cä§%˲,Jš —&Ç•oEˆ@( ^ÊÇ`ߊ4h|<Øæ#}/ 8Fàû@„ô_¸WI”QºlÝ x4”±0zæ~z5‘ƒÁ`0™ÂÿðÝF(*îiîª_h†vå~!ìHâï¯J.ž,-òB³à.õ´‡±#Y-;HjëI¶oônèp§ÂÂÂÂÂBB¦M›93#8}úĉ²2      `ø¯Í;þâ%XƒA<'Ðç;…ÄñÀ€¸¡ƒAUçªÎ]òR_õªÝlß¾m[U=°Õ5Õ5U'INLNL™9ŒMQ(îÙp*Ýmî6!äͱ룟EHK‹ÃÑÜLHmm]]u5!=ºo!üäOï¼ñBhû¡æ[©ö&ˆˆ?Rz¥ì›3Û ù¸þÓýíÈRáapãÆO?55ííô/S¢K!\¯×çŽ5=[@3"6j0ý鵙ˀøU÷Å$¼\ÿWãMGøÈ¸§l/øßÓö´?ý÷äÒ¥K–,_Î0-_µli9Ôw¾C••óÏ@)% ºwð—44PÁ©S9½å¤¸|ùÊþê÷Ãâ(«q 09cÒ›³ 4ø“哆·y–gy8÷÷Šg?\î?» @ÂäûÞHx˜¾zÚÊL>|¾år‘ß §|ô¸M>ܸS)\TÝ/ŸÒx{ÏÛÍJÏ÷H$%9Û †|¾[)ÔMø¿M•T:6<ÐIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-x-kword.png0000644000000000000000000000661212247657030022640 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW IDATxÚí[[lÕþffgwfgw½ë¬½¾$vlïúVS‡šbJ!Um$„"ZZ*PQ•‡>TŠÊ‘¨*PHÕR*U•ZÑ„*„Z!n¥RcBESJ$•Hlol'!ÄëkÖ»™½ÍL§sÙ3{±× ü’å9÷s¾ÿü—󟳜a†aà ºNÄ_ï |Þé \gòÔÛ@UUUå ã?['^~ûu õÜ¢”òÆšQ2RöºDµ±\%µ×Èv¾”÷¬¯ÿ<ÜIÛŒ­ßÞÖ lOm÷ô >É'ù$Ž»`³ˆ«×¼õÖ¿Ä£9úc 8"1´"öi{Ž»~ qR>_(äó†Q,‹ù<°¼¼²²¼ ̭Οõ©ñ…¿,ÛƆx`äûÃ÷ÝðÀó<Ïó×nu3àϡކqß•{ ß[ [\tÝ0tpög¦ÉóÏܯ4]¹ž³Ü^¯<Ÿäò¼ ð< (² ²,˲ ,----,““ÿ8³èãà¡{žýúCw~uY—õÍgDÝ6@ûCéOŧÉnç8Ž«Úßt-m—»þ¼Ñüæêßï¤é“äæ1b (‡ØM…8YâÆ k»j,¨¼5ßšG¿EQ= ›UÕL†HÆÊ (J(´_h»Ø1ôë»Üû[à»ß¼uü÷À‚±8›J5žu{AN ¬ðZ~å•—^zí5 P(òy7Ð+³‘…E£--[¶cc·Þº{7`„Ç#Š€ ð¼Ç|òÉÂÂåË@GG{{g'P(£‰D"‘Ð÷ÓÄ/û¾ýï›Óã!à›_þFÏÞeÈð¾¹yã6¢n°ö?Í£;™ã€{îÙ·ïî»ÝÛ²l†µžÓH;ó­ã±Œ¶3ŸÎKˆQ‡ç‰[](º®ëºøý²¬(Ô‹¨$•Ý»J0~öè«Gú€}í÷Üyï´axÞ€7°~F¬K±õ|9`ì´ÙžãØ6£ëÍ¥–×´«'û—iš©M‡H„ P÷ðù|>IdÙç“e@8ŽçØLì\lŸ kM¯ÿ~êÕcÇÖ »I PAv@ qc ÂZ˜QAÖ´•!Ö9rœ 8Ïsœ Ç¿ûî;ï•Y(‚ Š¢(Šß¯(@0 @oOߎÞpräƒÅS_>š¸Øz!i]_Ýæíîª_Ö¡‚XÐ’åZ½šéé©©éi² b±Ö¾ÙÆ›UnÅŠòrë·¦iš®¥R©T*‘t©DÒšfª¤@ ôûÉyB€x<ïëzçûŒž'—O=üþc@¶=Ûý\½h6Ä”/•ã€ÁÁþþr@;Òý»Ü›²3ÀÌ­f[XL¢çƒ|>—Ëç\.—Ëå€\.Ÿ'ÿiš”S÷õôéÓ§ÏœFGGGGGs§æzÎí.pùƒù†Ñ¾³}gÇMµKBü º#é×ÔÔÔT2 ‹¦°`Xç¤Ý%ÀÎÄÚ•’•D‘¨˜ÞÞ¾¾žÀç“$IB!r°,‰dP QUU½zX[[[[[R©T hßßñ³ŽÛ€™ùÙ_Ì@;Úwvhµ£¹.ä–CŒ*IQ `1ŒêáJ^Û·a˜¬²3£±÷^¯×ëõšã‡B¡P(Äb±X,f©xAÿsÀį&&&Æü®¾qÖ¥‚X %áÜ™™drf(‹E« (—‚jû¸ò\ܨ©©©©© hoïèhk«¿ïJDæNG"ÍÍ@º”iIÿúÓ wÖÞWC¼ ë´(0ñx"Ñ×ç^¯\ḛ_*-•otØÌ=be/‘$I’e@¿QûŠ6\ÿ8 PAöà ~¶»¿n=Ùc6•ú7ûd"®•³„ã¯W½^Žsº µRCTP%Ý›´ŸTYÒƒRy ›X1 úÁ-Ÿy¹·V¹ßõÁßä¶€ƒ|ôQÓcõBlÆæ\ãx<$úyøðáÃO>iÕ³g“ÉÙYb› ;Äî«1Û;Ukí¸¸Ì³ÞåÃ8UùEÃPU@}>V?Ô_^^YI§I¬X:;ÛÛ[[Ëëë:™çkgX¡†®[ƒþþþþx¼–un—ÚhÃ*ˆ.̃‰Fý~­‚?¬ëE¯H§×Ö4 H§ççíÛ·nmi1CËË««™ ÐÜåýe2Ùl.GÂÊ’dJeÇ‘˜N2™Lž=k?ŸT[#`J@"ÁfàuSANB¿[ZE×ké/ôzI ¯× ;öþû³³ä*QžžÖV ©‰ô›Í’(æùóóó++$¼Ìq€$ñ¼,mmÑh0HhçÀÀÀ9ŸTZ!û»\6ÎaÜtø–-•%ÀIW®d2ù<à÷{½‚D"ŠÂqÀm·íØÑÖF¼ A u5 àyM+lvm-î¸c×®®.Åôx¬õL à8 ™œžN&«Ç¨œ;šJ@"Ñ(ø¤‚LV˜ùÑh­@H× …R ˜½tiy¼^¢¢D±X$;ßÙ¿× œ8ñᇥK’¦Á ßÏ[‚ìôƒ)ƒƒõ¯³º±¾FÀ–r?½¥EQX  “}ªiÄÄbMM^/0<ÜÙ‡=ÿü™3@&³¶¦(@<ÞÚ›ý?>5µ´Üÿí·wt--á0Þ:.UM”ÓÓ$FU(P/ÈÖõR ¨¤Â>*ˆ2"õû­ ŠŠBn¢$ <Iòùˆ—¢ë€¦åóÅ" i¹œaO<ñàƒñ8pàÀ3Ïœ> Œõ÷ŒGž<¹°ìÚ‡Ã@gg4*Šd –Ä9UÐààÐP% p»Ë®—MdÛ ²çAt°,“'¢B|¾þþ±1Àãin6ë—J©Ô©S@>?3sâ‰v‡=ð@O°wïcML/¼ðÈ###À 7twSà+ÙàϬ¦¦Ì{ »TŽªŠ"‘€ÁA¢Â*]Ín*X2ÀbD0(I¤q9®³³·ถ–›o&pøý–‰xZ[o¹UM¥Ã˜ŸŸ›vïN$ü~ “QUMvíêí•eÀçÅZœÉàiˆdhhhhpÐøê·p}Ñä<„‘…ê:]8ÙŸ‚ÀóäH–Ï_¹B–q劵QEºÎq$ ¬ëVàTµPÐ4àÒ¥¥¥Bèînm%ÊŒMÖˆ5´199995U.²ì÷Ë2H$,/‡êåâgSÀÈi ž~z|Ü0€ÙÙTJUIÞ{ïÙÿ×CwÝ5664:tä@ÜÒJndgg$"À{ösOæ7<<<<4äomÀ׃K5Z‡ rÚ§&éýûüÅižÝIu¦Í<û'lÖÏ=ßNõÇ›( åççÅÐF¨áhö¬èZ¯—ö~ja ëŽÙ™c½hµ^‰:×ñPAöôô49q‹¦®­¼ÃË{¬\îxµ¹9¡®\f? Vëå5Ú° r#ê®YApfu;Ü=íÞ=mm]ÎÖkÖË»j¯26J TAv¢þ¶)ì[9m|ç×*nëaã¼^òŠ‚J«Ÿëª‚œTØëTÖý¬t-;¾úºÊt±%dc¸l˜ö)¹ÓÔÔä$‘3æ²àó9u/-uOÄzüÅzà΄JÀ¯÷ö—M53€Ÿ¯.'®@9I:Òét:øïòû¸ÒÍÈv¹\"LÀLÝm=Иiëgç³g\­¼Vb?½tn û: ƒÿÿÿ ›Íf³«æU*yin¿¾te}L/ϳÙl6›‚ niJç~sž›ÛôlÙÞÜÛB¾v¯t®7Qàg¹sÜ,D>ŒŒ<dcÙG²÷Š¢(ŠbâHâ$WЂ@žeÓ÷öXÞØsôÒ‘×ìMÙç³ozLïÔ#l͹¾g‡×¶]½Ä­r‹ÜU ôãPWHF.~éáÑ ôœÌß°ÿ?Õ&Lm€ªªªª~úKyÕ”U¤ªêóB’D^SÓr f>ý=²Ïçóù||½Zw õ‚(àôÙ¶ÓX}^ˆ*\ºÃéC0ÊZ½ º)ÿ5–þ°zD{màIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-application-vnd.sun.xml.draw.png0000644000000000000000000001001112247657030024357 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW”IDATxÚí[[p×™þú6Ó=÷‘4ÒŒ¤I#. Ø ,.²+¶±±I±fw]”q\IxتìCv_H–¤R§¶6le󰉊ˆ+µ[kˆ³2Øì5—8‚°18tE¡I# 3ÓsééÞ‡³g[s¿HWŧjª§Ï­Ïù¾ÿüÿNÿÍhš¦i>O(±zîéspâ+m ˲,³šv¡ùⱎŸOˆÐîiŠȬKT[~WLíÍg;cÀpÓØ8¾ãXä ^­ù/½M@K …÷uFÑ(E†Y°ó%¦Rpöì ïÇ5mÙêah@=þ¯=Ã<¸‰d§D"™L$4-•J¥ `j*šš¦†ú@àTð?‚'·¿s <üâò]_Ø °,˲ìÂÍ£bþÝöŸÂ/ë4m×ÌÎä_ÉÄ&&UÕ4U²ûÓïÉUÿéòJï‹×Ë.Ϭ—›OrY–ãX0›%Éj$I’$ ˜œœœ ?]üÓ™OC€z ,d`ë››^~| ©’*©÷ŸˆŠm@úGÊ‘Ô!"í Ã0¥§÷Ùÿ Oޖ䝑YÊ0¹9z N§Óé4 MOOLwîŒÝ¾ ÔÔÔÔÔÕ«6¯ÞöÀ¼ÇÜ ™€ÿr{˜ŒMÆ&¦ï¿X1ºÄ•:ýÌ–™-ŠÉ[vÙlೠɼB8Žçyåx\–‘‘‘‘áaÀj5›­V`I{ûÊ¥.`Ñd‹´èð^ÍééwŸ‚bP¿qÿˆ¨‚€\ˆ5 à8–å8@’ŒFI8Žãx>àBdh ˲,pùòðptv.[VWø|v»Ù Ä㲜HããÁàØÐØèñ45É$1ÚN§Óét¾¿_òO¾€÷ÿçtï)ðÔŠ/¶n›Ò4'ëdkjæn#*& [¨d?ßÛ;2ìÙ³eKK ðæ›gÎ gÏ~òI0XºŸì´~ýÚµ~?pñbOOo/ðÚkGöõ•?Nbz/¹»»µ8|øƒ††€+º»ëë™™pxzš¸ÕÉ$ ªD@L&I2›©E(f@Y²x"§n¾ÿÎIð%ÏóïìÕ4ƒÅ`1Xª'¢ 2W@"‘LÆãÀ† ~]pä™hW×C¹\Àºummf3 iªªi@*ÕßîÀ²‰D8 ˆbCCSÀq55­­À3Ïôô:ð4íß¿}{] (À€,OMɤ,Çb€Áà÷wwg2Ùí@OÏÐP,¦§³³£Ãåâqb¨Šäyžç8}åF£(êª4‘ õúzÈà½täàÜ[ç§?üØú-–'¶U nèáÿøÅOªi/½´{÷+¯0ÌØØøøíÛšÆó'€Á`0 @"‘H$€¢¤ÓŠBÉ&'¿÷½Çüþ½{fròòe0kj†©­]¾ 2I$eM›™éïY&+Êáèè¢ÑÑѾ>`tôÌ™_ÿÅ={~ö3@íöúz@EQ’ˆñÅ€T*•J¥tcËrÚÕŒ9óÃ÷ì³û÷©”¢þ3ÇÍóú ày@QÈ•a%b±h4¦¦&'''‰­ã8 ½½½ÝçÚîø´Ö€?L]Ù{éEð¾¹øç•¢Y¥šÜ|þQ®ÿo2uwýëÀÝ»¿ûÝéÓàr­YC¨„ÊF’Nšv÷î… €Õê÷wvš68xî Ë‘Èô´^›º£º[JÕ‰ÈTI³¯‚ ¯èk×®]ûôSÀáp8œN y'Ùšü 0vyìòžÊ½¤*ãJm°J¹›K–tu‘ @$Òßõ*À0ϦM*¶¢Q¥Ó²L$7&+¢½P”ññ7 @%_%I»Ýáp8€úúúúúzÀãilll¼ÞE‹¼^Àëõz›› ðv; àùJãþÆ. ÏݪïÑÊÑœ·}@ùåäj6ïØqà0:zîÜÉ“@2 ëêÖ®¥ U22E‰ÅA°Ùl6ˆFÉ 1þÙdA÷Ô†™Í&“ÉØl¤¿†††·›¨ öv ±±©©±ð7Ýjî¼sñö©! ¿t“ãˆâTÍîƒeM&§°XvíúÁ€¡¡'ŽR)U5™†q¹V¯®ddªšN,KÜb†I& ¡úE>ª¹²¬¾!t:ÎÚZ ¬D\ᣠ@@i‰/¤~òÓ!nw{; IÏ?à08xìØO~( @½¢+ÊÇ D!É2ˆ¢Å¢—V 4¥.·œþÈ=õ²ÔÕéGÒË€€bruä3͹¹FãâÅ«WFãöíßý.00pìØë¯ŠÂq D5­\I€¡f^ ‹H¥ˆñeYQ´Ù–¥;WÉÏž®²e˜j_ì΋ *dpg”û® ÿ€%©­mÝ:@’ž}öÛß~õ«ÿ˜ár"V­Ê˜KÜGƒÁjâñññ¡!€ekk[Zªz¶š)¾R ãr_(¶Š«ÓQZ²ÈÒöùÖ¯DñÉ'¿ùM²"ÞxH§Y¶®`Yb#Æ`p:UŦ¦ˆsJŒ®ÉT[KNA9®É.t)Jã2Oä>fnÓÛç¯g2ùý]]€$=õÔ¾}ÀÀÀÛo¿þ:N3Lm-À²^ïOÉäääè(À0n÷Ò¥³ý}rJ›LÕØ€B+ :TÕaÜìGÍžŒž“ý/3·¼sÿÌz&“ßOö $õ÷¿ýö«¯>ßîÝûö±X0 ãõ>òˆ¾Ñ¢ººÒ9ΗrÓœ£³%¡Ðå”ç;ï§ÉlîèØ¼Ynÿ[o½ú*¤Rä ç¹ç^{M÷çsUEy‰¶)ÔêÖ@UgA™­ èRç'3·%H$¢QàÞ½£G÷íA’l6}ƒU ú;†|c(þ~¯Ò4g/(ûÕ_9F6³~fyiÝ›YŸçÉñ1Ï[,N'L;öo@<>33Ÿ°ü6c6È *ÈL‡´Ü –$•êí={ðzŸ~ú¥—¯wëÖçžffþêW€œÒV|¦+ZÜSá\€PHeF)Ì<ŸÄçæWGD<~óæùó€Ñèry½€ÙÜÒ²r%`³57{<ÀÔÔñãV³.o…p¹ö‚*¼´d+O§C¡Û·Ž#q>d;¨ê­[ï¾ ¸\;v,;>~ù2pïÞõë}4ûlÛö@UÐ\ŸÝO>[QˆˆdrxøÒ%Àfkmíè€Xìî]ˆÇ'&† …®]ššº»wîb±Ó§EQ¥˜M!ïD‘Úr_ˆ¨¹¦yPAÙžKqŸ[¯\ ÌÌO&?þ0™Üîæfe² O™ž¾~0¬V§$‹Åd¢Ñ¾¾?ÎíFw\ºD¢)úÍo††€K—nÝJ$È†Ž¬±\¡¸,˜ È÷ Âg“•]OÏ×[3êä§(Á`?`4: H„BÙc€XìÎÀdòx¼^@QFG?ùDŸ ‡U•„±ƒÀË/“èŽ z{'&ž'ـÚˆeÛ€üÀg’“_¥äÖ¡ÿ²óthRÕHdj `Yâ÷3 ÐÔOWð¼( c³µµƒ¢ávoØôô 'À•+CCàtšLÐÞîñX­³£)ü~—‹„8RÕEŸ4çX&ô¥s˾8 c±8€ªÊòÌ Àó^ïãÛ¶}ÿû¬0ùáaà…ž|²³…ÆÇ“I`Õª–†vïîêjjìvIâ8=>ˆã8®¾^êPUcZH€lVA¥ É_èBÀ“;§sÓ¦½{P(Âáúú¥KIY صqcGGM àñØí CB! àd>4ˆ—Ì‘DS°:ßÌç— F¾oЖJåŸ 4 ÿ.B€á8853#˪ \½j6oÙ\¹ NONç͛ѨÞgv`×âÅuuƒ.á³C© ÐGšGî)ð™/œæCýTE@õŸô2Ë’cãžž¡!YΟ¿~}bðùÜn‹…Ó’0óXŒª‡ƒ¨æfÀn7™8xñÅÇs»u"Y–¨Ÿ$ j¡ûR¸"²çOvÚšFŽÃK[Š’Äãñx<®i²LÂ= éPÝpeQˆ˜ÂDÀ U¥A½™ÞG)àçzFYXÂg‡¯•¦‘H$‰ÐoÑ4Íh4ÆÂD$€2Ic"Ãáp8Ø¿b¿Ä¼B˜í1”&b¶;WÈëСΟŸÄ•˜ÌÒ£/wžšÆ~}™ý; F£Óz¸» ‚ hZ¡¯/ @]úÑh4Ö7¬µö0ø/CÌ@-ÐZÛRÓæ¢@Ï—söÙOø~fégçUç>ç?цè?Dÿ0›Íf³YÇ‘’ @З۴Ã%;}7ýSÀ{[ß=yˆ®¾ýPÔ&Õ™_sV÷’{aÛUš˜if‚‰¶¿µ-² ÀÃ#í]¹0·œ(~…€ÿÿ~J 8ÛÐ+]ôƒªªþ\’(Š¢(ê/ÿ-‹ÅbÑóé÷È¥l@Ù_ÈP/ˆNÏÕiû…’¼ÏJÒ±‰„Ó JH¹^PÅŸ(}žæ7ý/òê¡´‚ÄIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/manage-imap.png0000644000000000000000000000323512247657030020171 0ustar rootroot‰PNG  IHDR szzôtIMEÔ 12ÒOa« pHYsN N }™ÞgAMA± üa,IDATxÚíW[hUþgw³ÍuÓ¤Iš›ZMb/>H¨´•BÁ˃XôA¬R,¢>¨¯ÄÁ>Ÿ|PÑ7AÁ TÑZP¨Ô‚TJM/¤¹n›lv³Ù™ÝÝÙ¹9ÇïÌÌ6»¹Qñ¥“ü9ç?sÎù¾ÿv΄èÖsëùŸ¥Ú¹òî±-цè!EQ†…BC Eñr"‘vîyÕ¢õúý¯~ú#¦òõ6›øà¹nîða%¢ ¢ÊØ‚ñõ‘Ÿ;ˆÉ?—ß{ö…XSóÛ-Ûw¶Ä7wSCb Åh;I‰ÅÉ\LîW~8õÍ'Ç9^4Ø©ƒ{zbŠ2rÃX²hd(ÒØÞ±i«\ÛAÌ(Ñ ué,Þ? Y\×—ÞyæxgÏèÀcÏGbM­ø!¿¥šÖ)ª”ùé ±r‘Ú:(ÞÞéKC{еm&—k®Ÿþˆ^~󳓣®¿5¿¦˜¯õx8mŒc³6ü6´µÒ¶ÃGW«ë‘଎4Åãd¹l½u p¡Ü×|Ûí!øò–Uà•ž¨Síl±ÖPbŒ\—Ë07®›\à¥Â°‡¨' 6^M®v,ÏuÈf¼vájžÇëÅ €@b }}ÐZÝs]Ú¹½'ñÒãïÝÕ6„åÉdJ;ùĉ³8xêñŸ€ºâûKwÙºAv±DV±Œ¶L–^Æ„6zã•÷5uôîoìè£ÆÍ=TJMP^?½‚ê¸x¤€@usePyÂæ…²ˆW1j@S'¤k'uÉ~/E7µø¡Däz×ß§µï.Jÿ~/”§ ïû! n’RçÊ ¤w´™4S92*ø2Ps×nêú±Æ–,ª@Ø$ò°ö’híëCŸïP)…k te:U„r'$c’€ïªs½U2iêìe0ÞC}#RK÷6’ç„âÏ@NÆu"áfh%J­[Y¤ uLx4ÿû9ñáwÌ` )Å<Æo„@ I0Ät|ôí8tŒºïÞ‹!I² ëè[u@u­¨Õ=â’”RV‚q†ÐiblÂ8;–œÃÀ9ŸÎyß~B¼¢•)=ž¥Ä¶‘–:³…>È2@V®Ñe_J +<=èCrW§è·ñ¹&$!W¤¹A€€Ìær¦H®iS!£Ó®Çgƒ3ÅåÖ­hkHI7‡õ8„È3ËBpBr—òÉ:?™’Æ)<cMáÙˆ93d¢ 2—èGŽpÌaK‡€UáÕÎá`?;Ž©®OB›Ï‹óÓiYÿ“aVRè—îO´ÊŒš»û)µ± •Qçf± L¶¬NÐ…ƒ¯ë³K…âD&¯.– -ÌîL˜hR`Ƀ§1k]¿L€³¯&ÆÙ£[:â”NÇhæ]ø"K¹IƒÔ%.s¶ K`™®'U½0¹¨©jPËjPË„cåÐJ¯æ£bÝGyr7ÅïݾûÌ–ÍÝé6Yé"Àò¥,›ÏM{=0-snlMaÛ…¼? ÿÜ}é0YR5`FÆÿ-ØFä#ÿ)H„î“`nhÙúü L{Êi_¶äIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxAppointmentEditor.css0000644000000000000000000000614212247657030022114 0ustar rootrootDIV.appointmentLabel { display: block; position: relative; line-height: 1.8em; text-align: right; width: 3em; } DIV#eventView { overflow: hidden; padding: .5em; } DIV.appointmentRightLabel { display: inline; vertical-align: middle; } UL.contactList { display: block; cursor: default; list-style-type: none; list-style-image: none; margin: 0px; padding: 0px; background: #fff; border: 1px solid #000; width: 15em; height: 5em; overflow: auto; } UL.contactList LI IMG { vertical-align: middle; } UL.contactList LI { width: 100%; white-space: nowrap; vertical-align: middle; } UL.contactList LI._selected { background: #4b6983; color: #fff; } DIV.contactSelector { margin: 0px; } LABEL, SPAN.checkBoxList { display: block; position: relative; line-height: 1.5em; height: 1.5em; margin-left: 0px; margin-bottom: .5em; width: 100%; } SELECT { margin-left: 1px; } n0LABEL#commentArea { height: 17em; } LABEL#commentArea textarea { height: 15.5em; } SPAN.checkBoxList#participantsCB { height: 7em; } SPAN.checkBoxList#categoriesCB { height: 3em; } DIV#participants UL.contactList { height: 4.5em; } SPAN.checkBoxList SPAN.content LABEL { display: inline; } SPAN.content A { line-height: 2em; } A#detailsButton { position: absolute; right: 1em; z-index: 1; } SPAN.contactSelectorButtons { vertical-align: top; line-height: 2em; } SPAN#cycleSelectionFirstLevel, SPAN#cycleSelectionSecondLevel { visibility: hidden; margin-left: 1em; } SPAN#cycleSelectionSecondLevel SPAN.timeDateControl { position: static; margin: 0px; } SPAN#categoriesCB INPUT { border: 2px solid #000; vertical-align: middle; -moz-border-top-colors: #000 #fff; -moz-border-left-colors: #000 #fff; -moz-border-bottom-colors: #000 #fff; -moz-border-right-colors: #000 #fff; } SPAN#categoriesCB LABEL { margin-left: 0px; margin-right: 1em; } SPAN.content > INPUT.textField { n0width: 380px; width: 97%; } LABEL#urlArea INPUT { position: static; } DIV#attendeesMenu LI { padding-left: 10px; width: auto; } DIV#attendeesMenu .attendeeUser { font-weight: bold; } DIV#attendeesMenu .opt-participant { font-style: italic; } DIV#attendeesMenu .non-participant A { color: #888; } #attendeesLabel DIV#attendeesMenu > DIV { margin-left: 4px; } #attendeesLabel DIV#attendeesMenu > DIV, DIV#attendeesMenu .attendee { height: 18px; } #attendeesLabel DIV#attendeesMenu .statusIcon { margin-top: 4px; } DIV#attendeesMenu .statusIcon { background-repeat: no-repeat; float: left; width: 12px; height: 14px; margin-right: 4px; background-image: url("attendee-partstats.png"); } DIV#attendeesMenu .accepted .statusIcon { background-position: 0px 0px; } DIV#attendeesMenu .declined .statusIcon { background-position: -12px 0px; } DIV#attendeesMenu .needs-action .statusIcon { background-position: -24px 0px; } DIV#attendeesMenu .tentative .statusIcon { background-position: -36px 0px; } DIV#attendeesMenu .delegated .statusIcon { background-position: -48px 0px; } DIV#attendeesMenu .no-partstat .statusIcon { background-position: -60px 0px; } DIV#attendeesMenu .delegate { padding-left: 16px !important; } SOGo-2.1.1b/UI/WebServerResources/dtree.css0000644000000000000000000000133612247657030017124 0ustar rootroot/*--------------------------------------------------| | dTree 2.05 | www.destroydrop.com/javascript/tree/ | |---------------------------------------------------| | Copyright (c) 2002-2003 Geir Landrö | |--------------------------------------------------*/ .dtree { color: #000; white-space: nowrap; } .dtree img { vertical-align: middle; border: 0px; padding: 0px; margin: 0px; } .dtree a { cursor: default; color: #000; text-decoration: none; } .dtree a.node { white-space: nowrap; padding: 1px 2px; line-height: 2em; } .dtree a.node:hover { text-decoration: none; } .dtree .clip { overflow: hidden; } .dTreeNode { height: 22px; } .dTreeNode._selected { background-color: #9ABCD8; } SOGo-2.1.1b/UI/WebServerResources/down-icon.png0000644000000000000000000000051712247657030017712 0ustar rootroot‰PNG  IHDR‰ sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ0:†…ÏIDAT8Ëí”9 BA †?z=Ó«Åx D\Š€`¡$xA¬D,,A÷Æâ1¼Å +Ódòùò™|)WðóÅ,Px”·@vÏ' i*×`:dÈêÌ%˜é»0ÏLåÔ`g váE4 €e ph*‹§¦rê° P‰šäŸèë}d*ó—¦rŽ|s—ä  lõØTfoMe´îÊI‹í=±ü` LLeú1ÐTv@(}í}úùbæÿKý.îÓH¿IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/jquery-ui.js0000755000000000000000000020637512247657030017614 0ustar rootroot/*! jQuery UI - v1.10.3 - 2013-07-18 * http://jqueryui.com * Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js * Copyright 2013 jQuery Foundation and other contributors Licensed MIT */ (function( $, undefined ) { var uuid = 0, runiqueId = /^ui-id-\d+$/; // $.ui might exist from components with no dependencies, e.g., $.ui.position $.ui = $.ui || {}; $.extend( $.ui, { version: "1.10.3", keyCode: { BACKSPACE: 8, COMMA: 188, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, LEFT: 37, NUMPAD_ADD: 107, NUMPAD_DECIMAL: 110, NUMPAD_DIVIDE: 111, NUMPAD_ENTER: 108, NUMPAD_MULTIPLY: 106, NUMPAD_SUBTRACT: 109, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SPACE: 32, TAB: 9, UP: 38 } }); // plugins $.fn.extend({ focus: (function( orig ) { return function( delay, fn ) { return typeof delay === "number" ? this.each(function() { var elem = this; setTimeout(function() { $( elem ).focus(); if ( fn ) { fn.call( elem ); } }, delay ); }) : orig.apply( this, arguments ); }; })( $.fn.focus ), scrollParent: function() { var scrollParent; if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) { scrollParent = this.parents().filter(function() { return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x")); }).eq(0); } else { scrollParent = this.parents().filter(function() { return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x")); }).eq(0); } return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent; }, zIndex: function( zIndex ) { if ( zIndex !== undefined ) { return this.css( "zIndex", zIndex ); } if ( this.length ) { var elem = $( this[ 0 ] ), position, value; while ( elem.length && elem[ 0 ] !== document ) { // Ignore z-index if position is set to a value where z-index is ignored by the browser // This makes behavior of this function consistent across browsers // WebKit always returns auto if the element is positioned position = elem.css( "position" ); if ( position === "absolute" || position === "relative" || position === "fixed" ) { // IE returns 0 when zIndex is not specified // other browsers return a string // we ignore the case of nested elements with an explicit value of 0 //
    value = parseInt( elem.css( "zIndex" ), 10 ); if ( !isNaN( value ) && value !== 0 ) { return value; } } elem = elem.parent(); } } return 0; }, uniqueId: function() { return this.each(function() { if ( !this.id ) { this.id = "ui-id-" + (++uuid); } }); }, removeUniqueId: function() { return this.each(function() { if ( runiqueId.test( this.id ) ) { $( this ).removeAttr( "id" ); } }); } }); // selectors function focusable( element, isTabIndexNotNaN ) { var map, mapName, img, nodeName = element.nodeName.toLowerCase(); if ( "area" === nodeName ) { map = element.parentNode; mapName = map.name; if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { return false; } img = $( "img[usemap=#" + mapName + "]" )[0]; return !!img && visible( img ); } return ( /input|select|textarea|button|object/.test( nodeName ) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && // the element and all of its ancestors must be visible visible( element ); } function visible( element ) { return $.expr.filters.visible( element ) && !$( element ).parents().addBack().filter(function() { return $.css( this, "visibility" ) === "hidden"; }).length; } $.extend( $.expr[ ":" ], { data: $.expr.createPseudo ? $.expr.createPseudo(function( dataName ) { return function( elem ) { return !!$.data( elem, dataName ); }; }) : // support: jQuery <1.8 function( elem, i, match ) { return !!$.data( elem, match[ 3 ] ); }, focusable: function( element ) { return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); }, tabbable: function( element ) { var tabIndex = $.attr( element, "tabindex" ), isTabIndexNaN = isNaN( tabIndex ); return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); } }); // support: jQuery <1.8 if ( !$( "" ).outerWidth( 1 ).jquery ) { $.each( [ "Width", "Height" ], function( i, name ) { var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], type = name.toLowerCase(), orig = { innerWidth: $.fn.innerWidth, innerHeight: $.fn.innerHeight, outerWidth: $.fn.outerWidth, outerHeight: $.fn.outerHeight }; function reduce( elem, size, border, margin ) { $.each( side, function() { size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; if ( border ) { size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; } if ( margin ) { size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; } }); return size; } $.fn[ "inner" + name ] = function( size ) { if ( size === undefined ) { return orig[ "inner" + name ].call( this ); } return this.each(function() { $( this ).css( type, reduce( this, size ) + "px" ); }); }; $.fn[ "outer" + name] = function( size, margin ) { if ( typeof size !== "number" ) { return orig[ "outer" + name ].call( this, size ); } return this.each(function() { $( this).css( type, reduce( this, size, true, margin ) + "px" ); }); }; }); } // support: jQuery <1.8 if ( !$.fn.addBack ) { $.fn.addBack = function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); }; } // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) if ( $( "" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { $.fn.removeData = (function( removeData ) { return function( key ) { if ( arguments.length ) { return removeData.call( this, $.camelCase( key ) ); } else { return removeData.call( this ); } }; })( $.fn.removeData ); } // deprecated $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); $.support.selectstart = "onselectstart" in document.createElement( "div" ); $.fn.extend({ disableSelection: function() { return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) + ".ui-disableSelection", function( event ) { event.preventDefault(); }); }, enableSelection: function() { return this.unbind( ".ui-disableSelection" ); } }); $.extend( $.ui, { // $.ui.plugin is deprecated. Use $.widget() extensions instead. plugin: { add: function( module, option, set ) { var i, proto = $.ui[ module ].prototype; for ( i in set ) { proto.plugins[ i ] = proto.plugins[ i ] || []; proto.plugins[ i ].push( [ option, set[ i ] ] ); } }, call: function( instance, name, args ) { var i, set = instance.plugins[ name ]; if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) { return; } for ( i = 0; i < set.length; i++ ) { if ( instance.options[ set[ i ][ 0 ] ] ) { set[ i ][ 1 ].apply( instance.element, args ); } } } }, // only used by resizable hasScroll: function( el, a ) { //If overflow is hidden, the element might have extra content, but the user wants to hide it if ( $( el ).css( "overflow" ) === "hidden") { return false; } var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", has = false; if ( el[ scroll ] > 0 ) { return true; } // TODO: determine which cases actually cause this to happen // if the element doesn't have the scroll set, see if it's possible to // set the scroll el[ scroll ] = 1; has = ( el[ scroll ] > 0 ); el[ scroll ] = 0; return has; } }); })( jQuery ); (function( $, undefined ) { var uuid = 0, slice = Array.prototype.slice, _cleanData = $.cleanData; $.cleanData = function( elems ) { for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { try { $( elem ).triggerHandler( "remove" ); // http://bugs.jquery.com/ticket/8235 } catch( e ) {} } _cleanData( elems ); }; $.widget = function( name, base, prototype ) { var fullName, existingConstructor, constructor, basePrototype, // proxiedPrototype allows the provided prototype to remain unmodified // so that it can be used as a mixin for multiple widgets (#8876) proxiedPrototype = {}, namespace = name.split( "." )[ 0 ]; name = name.split( "." )[ 1 ]; fullName = namespace + "-" + name; if ( !prototype ) { prototype = base; base = $.Widget; } // create selector for plugin $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { return !!$.data( elem, fullName ); }; $[ namespace ] = $[ namespace ] || {}; existingConstructor = $[ namespace ][ name ]; constructor = $[ namespace ][ name ] = function( options, element ) { // allow instantiation without "new" keyword if ( !this._createWidget ) { return new constructor( options, element ); } // allow instantiation without initializing for simple inheritance // must use "new" keyword (the code above always passes args) if ( arguments.length ) { this._createWidget( options, element ); } }; // extend with the existing constructor to carry over any static properties $.extend( constructor, existingConstructor, { version: prototype.version, // copy the object used to create the prototype in case we need to // redefine the widget later _proto: $.extend( {}, prototype ), // track widgets that inherit from this widget in case this widget is // redefined after a widget inherits from it _childConstructors: [] }); basePrototype = new base(); // we need to make the options hash a property directly on the new instance // otherwise we'll modify the options hash on the prototype that we're // inheriting from basePrototype.options = $.widget.extend( {}, basePrototype.options ); $.each( prototype, function( prop, value ) { if ( !$.isFunction( value ) ) { proxiedPrototype[ prop ] = value; return; } proxiedPrototype[ prop ] = (function() { var _super = function() { return base.prototype[ prop ].apply( this, arguments ); }, _superApply = function( args ) { return base.prototype[ prop ].apply( this, args ); }; return function() { var __super = this._super, __superApply = this._superApply, returnValue; this._super = _super; this._superApply = _superApply; returnValue = value.apply( this, arguments ); this._super = __super; this._superApply = __superApply; return returnValue; }; })(); }); constructor.prototype = $.widget.extend( basePrototype, { // TODO: remove support for widgetEventPrefix // always use the name + a colon as the prefix, e.g., draggable:start // don't prefix for widgets that aren't DOM-based widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name }, proxiedPrototype, { constructor: constructor, namespace: namespace, widgetName: name, widgetFullName: fullName }); // If this widget is being redefined then we need to find all widgets that // are inheriting from it and redefine all of them so that they inherit from // the new version of this widget. We're essentially trying to replace one // level in the prototype chain. if ( existingConstructor ) { $.each( existingConstructor._childConstructors, function( i, child ) { var childPrototype = child.prototype; // redefine the child widget using the same prototype that was // originally used, but inherit from the new version of the base $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); }); // remove the list of existing child constructors from the old constructor // so the old child constructors can be garbage collected delete existingConstructor._childConstructors; } else { base._childConstructors.push( constructor ); } $.widget.bridge( name, constructor ); }; $.widget.extend = function( target ) { var input = slice.call( arguments, 1 ), inputIndex = 0, inputLength = input.length, key, value; for ( ; inputIndex < inputLength; inputIndex++ ) { for ( key in input[ inputIndex ] ) { value = input[ inputIndex ][ key ]; if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { // Clone objects if ( $.isPlainObject( value ) ) { target[ key ] = $.isPlainObject( target[ key ] ) ? $.widget.extend( {}, target[ key ], value ) : // Don't extend strings, arrays, etc. with objects $.widget.extend( {}, value ); // Copy everything else by reference } else { target[ key ] = value; } } } } return target; }; $.widget.bridge = function( name, object ) { var fullName = object.prototype.widgetFullName || name; $.fn[ name ] = function( options ) { var isMethodCall = typeof options === "string", args = slice.call( arguments, 1 ), returnValue = this; // allow multiple hashes to be passed on init options = !isMethodCall && args.length ? $.widget.extend.apply( null, [ options ].concat(args) ) : options; if ( isMethodCall ) { this.each(function() { var methodValue, instance = $.data( this, fullName ); if ( !instance ) { return $.error( "cannot call methods on " + name + " prior to initialization; " + "attempted to call method '" + options + "'" ); } if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { return $.error( "no such method '" + options + "' for " + name + " widget instance" ); } methodValue = instance[ options ].apply( instance, args ); if ( methodValue !== instance && methodValue !== undefined ) { returnValue = methodValue && methodValue.jquery ? returnValue.pushStack( methodValue.get() ) : methodValue; return false; } }); } else { this.each(function() { var instance = $.data( this, fullName ); if ( instance ) { instance.option( options || {} )._init(); } else { $.data( this, fullName, new object( options, this ) ); } }); } return returnValue; }; }; $.Widget = function( /* options, element */ ) {}; $.Widget._childConstructors = []; $.Widget.prototype = { widgetName: "widget", widgetEventPrefix: "", defaultElement: "
    ", options: { disabled: false, // callbacks create: null }, _createWidget: function( options, element ) { element = $( element || this.defaultElement || this )[ 0 ]; this.element = $( element ); this.uuid = uuid++; this.eventNamespace = "." + this.widgetName + this.uuid; this.options = $.widget.extend( {}, this.options, this._getCreateOptions(), options ); this.bindings = $(); this.hoverable = $(); this.focusable = $(); if ( element !== this ) { $.data( element, this.widgetFullName, this ); this._on( true, this.element, { remove: function( event ) { if ( event.target === element ) { this.destroy(); } } }); this.document = $( element.style ? // element within the document element.ownerDocument : // element is window or document element.document || element ); this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); } this._create(); this._trigger( "create", null, this._getCreateEventData() ); this._init(); }, _getCreateOptions: $.noop, _getCreateEventData: $.noop, _create: $.noop, _init: $.noop, destroy: function() { this._destroy(); // we can probably remove the unbind calls in 2.0 // all event bindings should go through this._on() this.element .unbind( this.eventNamespace ) // 1.9 BC for #7810 // TODO remove dual storage .removeData( this.widgetName ) .removeData( this.widgetFullName ) // support: jquery <1.6.3 // http://bugs.jquery.com/ticket/9413 .removeData( $.camelCase( this.widgetFullName ) ); this.widget() .unbind( this.eventNamespace ) .removeAttr( "aria-disabled" ) .removeClass( this.widgetFullName + "-disabled " + "ui-state-disabled" ); // clean up events and states this.bindings.unbind( this.eventNamespace ); this.hoverable.removeClass( "ui-state-hover" ); this.focusable.removeClass( "ui-state-focus" ); }, _destroy: $.noop, widget: function() { return this.element; }, option: function( key, value ) { var options = key, parts, curOption, i; if ( arguments.length === 0 ) { // don't return a reference to the internal hash return $.widget.extend( {}, this.options ); } if ( typeof key === "string" ) { // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } options = {}; parts = key.split( "." ); key = parts.shift(); if ( parts.length ) { curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); for ( i = 0; i < parts.length - 1; i++ ) { curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; curOption = curOption[ parts[ i ] ]; } key = parts.pop(); if ( value === undefined ) { return curOption[ key ] === undefined ? null : curOption[ key ]; } curOption[ key ] = value; } else { if ( value === undefined ) { return this.options[ key ] === undefined ? null : this.options[ key ]; } options[ key ] = value; } } this._setOptions( options ); return this; }, _setOptions: function( options ) { var key; for ( key in options ) { this._setOption( key, options[ key ] ); } return this; }, _setOption: function( key, value ) { this.options[ key ] = value; if ( key === "disabled" ) { this.widget() .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value ) .attr( "aria-disabled", value ); this.hoverable.removeClass( "ui-state-hover" ); this.focusable.removeClass( "ui-state-focus" ); } return this; }, enable: function() { return this._setOption( "disabled", false ); }, disable: function() { return this._setOption( "disabled", true ); }, _on: function( suppressDisabledCheck, element, handlers ) { var delegateElement, instance = this; // no suppressDisabledCheck flag, shuffle arguments if ( typeof suppressDisabledCheck !== "boolean" ) { handlers = element; element = suppressDisabledCheck; suppressDisabledCheck = false; } // no element argument, shuffle and use this.element if ( !handlers ) { handlers = element; element = this.element; delegateElement = this.widget(); } else { // accept selectors, DOM elements element = delegateElement = $( element ); this.bindings = this.bindings.add( element ); } $.each( handlers, function( event, handler ) { function handlerProxy() { // allow widgets to customize the disabled handling // - disabled as an array instead of boolean // - disabled class as method for disabling individual parts if ( !suppressDisabledCheck && ( instance.options.disabled === true || $( this ).hasClass( "ui-state-disabled" ) ) ) { return; } return ( typeof handler === "string" ? instance[ handler ] : handler ) .apply( instance, arguments ); } // copy the guid so direct unbinding works if ( typeof handler !== "string" ) { handlerProxy.guid = handler.guid = handler.guid || handlerProxy.guid || $.guid++; } var match = event.match( /^(\w+)\s*(.*)$/ ), eventName = match[1] + instance.eventNamespace, selector = match[2]; if ( selector ) { delegateElement.delegate( selector, eventName, handlerProxy ); } else { element.bind( eventName, handlerProxy ); } }); }, _off: function( element, eventName ) { eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace; element.unbind( eventName ).undelegate( eventName ); }, _delay: function( handler, delay ) { function handlerProxy() { return ( typeof handler === "string" ? instance[ handler ] : handler ) .apply( instance, arguments ); } var instance = this; return setTimeout( handlerProxy, delay || 0 ); }, _hoverable: function( element ) { this.hoverable = this.hoverable.add( element ); this._on( element, { mouseenter: function( event ) { $( event.currentTarget ).addClass( "ui-state-hover" ); }, mouseleave: function( event ) { $( event.currentTarget ).removeClass( "ui-state-hover" ); } }); }, _focusable: function( element ) { this.focusable = this.focusable.add( element ); this._on( element, { focusin: function( event ) { $( event.currentTarget ).addClass( "ui-state-focus" ); }, focusout: function( event ) { $( event.currentTarget ).removeClass( "ui-state-focus" ); } }); }, _trigger: function( type, event, data ) { var prop, orig, callback = this.options[ type ]; data = data || {}; event = $.Event( event ); event.type = ( type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type ).toLowerCase(); // the original event may come from any element // so we need to reset the target on the new event event.target = this.element[ 0 ]; // copy original event properties over to the new event orig = event.originalEvent; if ( orig ) { for ( prop in orig ) { if ( !( prop in event ) ) { event[ prop ] = orig[ prop ]; } } } this.element.trigger( event, data ); return !( $.isFunction( callback ) && callback.apply( this.element[0], [ event ].concat( data ) ) === false || event.isDefaultPrevented() ); } }; $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { if ( typeof options === "string" ) { options = { effect: options }; } var hasOptions, effectName = !options ? method : options === true || typeof options === "number" ? defaultEffect : options.effect || defaultEffect; options = options || {}; if ( typeof options === "number" ) { options = { duration: options }; } hasOptions = !$.isEmptyObject( options ); options.complete = callback; if ( options.delay ) { element.delay( options.delay ); } if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { element[ method ]( options ); } else if ( effectName !== method && element[ effectName ] ) { element[ effectName ]( options.duration, options.easing, callback ); } else { element.queue(function( next ) { $( this )[ method ](); if ( callback ) { callback.call( element[ 0 ] ); } next(); }); } }; }); })( jQuery ); (function( $, undefined ) { var mouseHandled = false; $( document ).mouseup( function() { mouseHandled = false; }); $.widget("ui.mouse", { version: "1.10.3", options: { cancel: "input,textarea,button,select,option", distance: 1, delay: 0 }, _mouseInit: function() { var that = this; this.element .bind("mousedown."+this.widgetName, function(event) { return that._mouseDown(event); }) .bind("click."+this.widgetName, function(event) { if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { $.removeData(event.target, that.widgetName + ".preventClickEvent"); event.stopImmediatePropagation(); return false; } }); this.started = false; }, // TODO: make sure destroying one instance of mouse doesn't mess with // other instances of mouse _mouseDestroy: function() { this.element.unbind("."+this.widgetName); if ( this._mouseMoveDelegate ) { $(document) .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate) .unbind("mouseup."+this.widgetName, this._mouseUpDelegate); } }, _mouseDown: function(event) { // don't let more than one widget handle mouseStart if( mouseHandled ) { return; } // we may have missed mouseup (out of window) (this._mouseStarted && this._mouseUp(event)); this._mouseDownEvent = event; var that = this, btnIsLeft = (event.which === 1), // event.target.nodeName works around a bug in IE 8 with // disabled inputs (#7620) elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { return true; } this.mouseDelayMet = !this.options.delay; if (!this.mouseDelayMet) { this._mouseDelayTimer = setTimeout(function() { that.mouseDelayMet = true; }, this.options.delay); } if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = (this._mouseStart(event) !== false); if (!this._mouseStarted) { event.preventDefault(); return true; } } // Click event may never have fired (Gecko & Opera) if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { $.removeData(event.target, this.widgetName + ".preventClickEvent"); } // these delegates are required to keep context this._mouseMoveDelegate = function(event) { return that._mouseMove(event); }; this._mouseUpDelegate = function(event) { return that._mouseUp(event); }; $(document) .bind("mousemove."+this.widgetName, this._mouseMoveDelegate) .bind("mouseup."+this.widgetName, this._mouseUpDelegate); event.preventDefault(); mouseHandled = true; return true; }, _mouseMove: function(event) { // IE mouseup check - mouseup happened when mouse was out of window if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { return this._mouseUp(event); } if (this._mouseStarted) { this._mouseDrag(event); return event.preventDefault(); } if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = (this._mouseStart(this._mouseDownEvent, event) !== false); (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); } return !this._mouseStarted; }, _mouseUp: function(event) { $(document) .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate) .unbind("mouseup."+this.widgetName, this._mouseUpDelegate); if (this._mouseStarted) { this._mouseStarted = false; if (event.target === this._mouseDownEvent.target) { $.data(event.target, this.widgetName + ".preventClickEvent", true); } this._mouseStop(event); } return false; }, _mouseDistanceMet: function(event) { return (Math.max( Math.abs(this._mouseDownEvent.pageX - event.pageX), Math.abs(this._mouseDownEvent.pageY - event.pageY) ) >= this.options.distance ); }, _mouseDelayMet: function(/* event */) { return this.mouseDelayMet; }, // These are placeholder methods, to be overriden by extending plugin _mouseStart: function(/* event */) {}, _mouseDrag: function(/* event */) {}, _mouseStop: function(/* event */) {}, _mouseCapture: function(/* event */) { return true; } }); })(jQuery); (function( $, undefined ) { $.widget("ui.draggable", $.ui.mouse, { version: "1.10.3", widgetEventPrefix: "drag", options: { addClasses: true, appendTo: "parent", axis: false, connectToSortable: false, containment: false, cursor: "auto", cursorAt: false, grid: false, handle: false, helper: "original", iframeFix: false, opacity: false, refreshPositions: false, revert: false, revertDuration: 500, scope: "default", scroll: true, scrollSensitivity: 20, scrollSpeed: 20, snap: false, snapMode: "both", snapTolerance: 20, stack: false, zIndex: false, // callbacks drag: null, start: null, stop: null }, _create: function() { if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) { this.element[0].style.position = "relative"; } if (this.options.addClasses){ this.element.addClass("ui-draggable"); } if (this.options.disabled){ this.element.addClass("ui-draggable-disabled"); } this._mouseInit(); }, _destroy: function() { this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); this._mouseDestroy(); }, _mouseCapture: function(event) { var o = this.options; $( document.activeElement ).blur(); // among others, prevent a drag on a resizable-handle if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) { return false; } //Quit if we're not on a valid handle this.handle = this._getHandle(event); if (!this.handle) { return false; } $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() { $("
    ") .css({ width: this.offsetWidth+"px", height: this.offsetHeight+"px", position: "absolute", opacity: "0.001", zIndex: 1000 }) .css($(this).offset()) .appendTo("body"); }); return true; }, _mouseStart: function(event) { var o = this.options; //Create and append the visible helper this.helper = this._createHelper(event); this.helper.addClass("ui-draggable-dragging"); //Cache the helper size this._cacheHelperProportions(); //If ddmanager is used for droppables, set the global draggable if($.ui.ddmanager) { $.ui.ddmanager.current = this; } /* * - Position generation - * This block generates everything position related - it's the core of draggables. */ //Cache the margins of the original element this._cacheMargins(); //Store the helper's css position this.cssPosition = this.helper.css( "position" ); this.scrollParent = this.helper.scrollParent(); this.offsetParent = this.helper.offsetParent(); this.offsetParentCssPosition = this.offsetParent.css( "position" ); //The element's absolute position on the page minus margins this.offset = this.positionAbs = this.element.offset(); this.offset = { top: this.offset.top - this.margins.top, left: this.offset.left - this.margins.left }; //Reset scroll cache this.offset.scroll = false; $.extend(this.offset, { click: { //Where the click happened, relative to the element left: event.pageX - this.offset.left, top: event.pageY - this.offset.top }, parent: this._getParentOffset(), relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper }); //Generate the original position this.originalPosition = this.position = this._generatePosition(event); this.originalPageX = event.pageX; this.originalPageY = event.pageY; //Adjust the mouse offset relative to the helper if "cursorAt" is supplied (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); //Set a containment if given in the options this._setContainment(); //Trigger event + callbacks if(this._trigger("start", event) === false) { this._clear(); return false; } //Recache the helper size this._cacheHelperProportions(); //Prepare the droppable offsets if ($.ui.ddmanager && !o.dropBehaviour) { $.ui.ddmanager.prepareOffsets(this, event); } this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003) if ( $.ui.ddmanager ) { $.ui.ddmanager.dragStart(this, event); } return true; }, _mouseDrag: function(event, noPropagation) { // reset any necessary cached properties (see #5009) if ( this.offsetParentCssPosition === "fixed" ) { this.offset.parent = this._getParentOffset(); } //Compute the helpers position this.position = this._generatePosition(event); this.positionAbs = this._convertPositionTo("absolute"); //Call plugins and callbacks and use the resulting position if something is returned if (!noPropagation) { var ui = this._uiHash(); if(this._trigger("drag", event, ui) === false) { this._mouseUp({}); return false; } this.position = ui.position; } if(!this.options.axis || this.options.axis !== "y") { this.helper[0].style.left = this.position.left+"px"; } if(!this.options.axis || this.options.axis !== "x") { this.helper[0].style.top = this.position.top+"px"; } if($.ui.ddmanager) { $.ui.ddmanager.drag(this, event); } return false; }, _mouseStop: function(event) { //If we are using droppables, inform the manager about the drop var that = this, dropped = false; if ($.ui.ddmanager && !this.options.dropBehaviour) { dropped = $.ui.ddmanager.drop(this, event); } //if a drop comes from outside (a sortable) if(this.dropped) { dropped = this.dropped; this.dropped = false; } //if the original element is no longer in the DOM don't bother to continue (see #8269) if ( this.options.helper === "original" && !$.contains( this.element[ 0 ].ownerDocument, this.element[ 0 ] ) ) { return false; } if((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) { $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() { if(that._trigger("stop", event) !== false) { that._clear(); } }); } else { if(this._trigger("stop", event) !== false) { this._clear(); } } return false; }, _mouseUp: function(event) { //Remove frame helpers $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003) if( $.ui.ddmanager ) { $.ui.ddmanager.dragStop(this, event); } return $.ui.mouse.prototype._mouseUp.call(this, event); }, cancel: function() { if(this.helper.is(".ui-draggable-dragging")) { this._mouseUp({}); } else { this._clear(); } return this; }, _getHandle: function(event) { return this.options.handle ? !!$( event.target ).closest( this.element.find( this.options.handle ) ).length : true; }, _createHelper: function(event) { var o = this.options, helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element); if(!helper.parents("body").length) { helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo)); } if(helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) { helper.css("position", "absolute"); } return helper; }, _adjustOffsetFromHelper: function(obj) { if (typeof obj === "string") { obj = obj.split(" "); } if ($.isArray(obj)) { obj = {left: +obj[0], top: +obj[1] || 0}; } if ("left" in obj) { this.offset.click.left = obj.left + this.margins.left; } if ("right" in obj) { this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; } if ("top" in obj) { this.offset.click.top = obj.top + this.margins.top; } if ("bottom" in obj) { this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; } }, _getParentOffset: function() { //Get the offsetParent and cache its position var po = this.offsetParent.offset(); // This is a special case where we need to modify a offset calculated on start, since the following happened: // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) { po.left += this.scrollParent.scrollLeft(); po.top += this.scrollParent.scrollTop(); } //This needs to be actually done for all browsers, since pageX/pageY includes this information //Ugly IE fix if((this.offsetParent[0] === document.body) || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) { po = { top: 0, left: 0 }; } return { top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) }; }, _getRelativeOffset: function() { if(this.cssPosition === "relative") { var p = this.element.position(); return { top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() }; } else { return { top: 0, left: 0 }; } }, _cacheMargins: function() { this.margins = { left: (parseInt(this.element.css("marginLeft"),10) || 0), top: (parseInt(this.element.css("marginTop"),10) || 0), right: (parseInt(this.element.css("marginRight"),10) || 0), bottom: (parseInt(this.element.css("marginBottom"),10) || 0) }; }, _cacheHelperProportions: function() { this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() }; }, _setContainment: function() { var over, c, ce, o = this.options; if ( !o.containment ) { this.containment = null; return; } if ( o.containment === "window" ) { this.containment = [ $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left, $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top, $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left, $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top ]; return; } if ( o.containment === "document") { this.containment = [ 0, 0, $( document ).width() - this.helperProportions.width - this.margins.left, ( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top ]; return; } if ( o.containment.constructor === Array ) { this.containment = o.containment; return; } if ( o.containment === "parent" ) { o.containment = this.helper[ 0 ].parentNode; } c = $( o.containment ); ce = c[ 0 ]; if( !ce ) { return; } over = c.css( "overflow" ) !== "hidden"; this.containment = [ ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ), ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ) , ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - this.helperProportions.width - this.margins.left - this.margins.right, ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - this.helperProportions.height - this.margins.top - this.margins.bottom ]; this.relative_container = c; }, _convertPositionTo: function(d, pos) { if(!pos) { pos = this.position; } var mod = d === "absolute" ? 1 : -1, scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent; //Cache the scroll if (!this.offset.scroll) { this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()}; } return { top: ( pos.top + // The absolute mouse position this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border) ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) * mod ) ), left: ( pos.left + // The absolute mouse position this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border) ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) * mod ) ) }; }, _generatePosition: function(event) { var containment, co, top, left, o = this.options, scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent, pageX = event.pageX, pageY = event.pageY; //Cache the scroll if (!this.offset.scroll) { this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()}; } /* * - Position constraining - * Constrain the position to a mix of grid, containment. */ // If we are not dragging yet, we won't check for options if ( this.originalPosition ) { if ( this.containment ) { if ( this.relative_container ){ co = this.relative_container.offset(); containment = [ this.containment[ 0 ] + co.left, this.containment[ 1 ] + co.top, this.containment[ 2 ] + co.left, this.containment[ 3 ] + co.top ]; } else { containment = this.containment; } if(event.pageX - this.offset.click.left < containment[0]) { pageX = containment[0] + this.offset.click.left; } if(event.pageY - this.offset.click.top < containment[1]) { pageY = containment[1] + this.offset.click.top; } if(event.pageX - this.offset.click.left > containment[2]) { pageX = containment[2] + this.offset.click.left; } if(event.pageY - this.offset.click.top > containment[3]) { pageY = containment[3] + this.offset.click.top; } } if(o.grid) { //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950) top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY; pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX; pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; } } return { top: ( pageY - // The absolute mouse position this.offset.click.top - // Click offset (relative to the element) this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent this.offset.parent.top + // The offsetParent's offset without borders (offset + border) ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) ), left: ( pageX - // The absolute mouse position this.offset.click.left - // Click offset (relative to the element) this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent this.offset.parent.left + // The offsetParent's offset without borders (offset + border) ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) ) }; }, _clear: function() { this.helper.removeClass("ui-draggable-dragging"); if(this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) { this.helper.remove(); } this.helper = null; this.cancelHelperRemoval = false; }, // From now on bulk stuff - mainly helpers _trigger: function(type, event, ui) { ui = ui || this._uiHash(); $.ui.plugin.call(this, type, [event, ui]); //The absolute position has to be recalculated after plugins if(type === "drag") { this.positionAbs = this._convertPositionTo("absolute"); } return $.Widget.prototype._trigger.call(this, type, event, ui); }, plugins: {}, _uiHash: function() { return { helper: this.helper, position: this.position, originalPosition: this.originalPosition, offset: this.positionAbs }; } }); $.ui.plugin.add("draggable", "connectToSortable", { start: function(event, ui) { var inst = $(this).data("ui-draggable"), o = inst.options, uiSortable = $.extend({}, ui, { item: inst.element }); inst.sortables = []; $(o.connectToSortable).each(function() { var sortable = $.data(this, "ui-sortable"); if (sortable && !sortable.options.disabled) { inst.sortables.push({ instance: sortable, shouldRevert: sortable.options.revert }); sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page). sortable._trigger("activate", event, uiSortable); } }); }, stop: function(event, ui) { //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper var inst = $(this).data("ui-draggable"), uiSortable = $.extend({}, ui, { item: inst.element }); $.each(inst.sortables, function() { if(this.instance.isOver) { this.instance.isOver = 0; inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work) //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: "valid/invalid" if(this.shouldRevert) { this.instance.options.revert = this.shouldRevert; } //Trigger the stop of the sortable this.instance._mouseStop(event); this.instance.options.helper = this.instance.options._helper; //If the helper has been the original item, restore properties in the sortable if(inst.options.helper === "original") { this.instance.currentItem.css({ top: "auto", left: "auto" }); } } else { this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance this.instance._trigger("deactivate", event, uiSortable); } }); }, drag: function(event, ui) { var inst = $(this).data("ui-draggable"), that = this; $.each(inst.sortables, function() { var innermostIntersecting = false, thisSortable = this; //Copy over some variables to allow calling the sortable's native _intersectsWith this.instance.positionAbs = inst.positionAbs; this.instance.helperProportions = inst.helperProportions; this.instance.offset.click = inst.offset.click; if(this.instance._intersectsWith(this.instance.containerCache)) { innermostIntersecting = true; $.each(inst.sortables, function () { this.instance.positionAbs = inst.positionAbs; this.instance.helperProportions = inst.helperProportions; this.instance.offset.click = inst.offset.click; if (this !== thisSortable && this.instance._intersectsWith(this.instance.containerCache) && $.contains(thisSortable.instance.element[0], this.instance.element[0]) ) { innermostIntersecting = false; } return innermostIntersecting; }); } if(innermostIntersecting) { //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once if(!this.instance.isOver) { this.instance.isOver = 1; //Now we fake the start of dragging for the sortable instance, //by cloning the list group item, appending it to the sortable and using it as inst.currentItem //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one) this.instance.currentItem = $(that).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item", true); this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it this.instance.options.helper = function() { return ui.helper[0]; }; event.target = this.instance.currentItem[0]; this.instance._mouseCapture(event, true); this.instance._mouseStart(event, true, true); //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes this.instance.offset.click.top = inst.offset.click.top; this.instance.offset.click.left = inst.offset.click.left; this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left; this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top; inst._trigger("toSortable", event); inst.dropped = this.instance.element; //draggable revert needs that //hack so receive/update callbacks work (mostly) inst.currentItem = inst.element; this.instance.fromOutside = inst; } //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable if(this.instance.currentItem) { this.instance._mouseDrag(event); } } else { //If it doesn't intersect with the sortable, and it intersected before, //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval if(this.instance.isOver) { this.instance.isOver = 0; this.instance.cancelHelperRemoval = true; //Prevent reverting on this forced stop this.instance.options.revert = false; // The out event needs to be triggered independently this.instance._trigger("out", event, this.instance._uiHash(this.instance)); this.instance._mouseStop(event, true); this.instance.options.helper = this.instance.options._helper; //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size this.instance.currentItem.remove(); if(this.instance.placeholder) { this.instance.placeholder.remove(); } inst._trigger("fromSortable", event); inst.dropped = false; //draggable revert needs that } } }); } }); $.ui.plugin.add("draggable", "cursor", { start: function() { var t = $("body"), o = $(this).data("ui-draggable").options; if (t.css("cursor")) { o._cursor = t.css("cursor"); } t.css("cursor", o.cursor); }, stop: function() { var o = $(this).data("ui-draggable").options; if (o._cursor) { $("body").css("cursor", o._cursor); } } }); $.ui.plugin.add("draggable", "opacity", { start: function(event, ui) { var t = $(ui.helper), o = $(this).data("ui-draggable").options; if(t.css("opacity")) { o._opacity = t.css("opacity"); } t.css("opacity", o.opacity); }, stop: function(event, ui) { var o = $(this).data("ui-draggable").options; if(o._opacity) { $(ui.helper).css("opacity", o._opacity); } } }); $.ui.plugin.add("draggable", "scroll", { start: function() { var i = $(this).data("ui-draggable"); if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") { i.overflowOffset = i.scrollParent.offset(); } }, drag: function( event ) { var i = $(this).data("ui-draggable"), o = i.options, scrolled = false; if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") { if(!o.axis || o.axis !== "x") { if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) { i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed; } else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) { i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed; } } if(!o.axis || o.axis !== "y") { if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) { i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed; } else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) { i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed; } } } else { if(!o.axis || o.axis !== "x") { if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) { scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) { scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); } } if(!o.axis || o.axis !== "y") { if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) { scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) { scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); } } } if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { $.ui.ddmanager.prepareOffsets(i, event); } } }); $.ui.plugin.add("draggable", "snap", { start: function() { var i = $(this).data("ui-draggable"), o = i.options; i.snapElements = []; $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() { var $t = $(this), $o = $t.offset(); if(this !== i.element[0]) { i.snapElements.push({ item: this, width: $t.outerWidth(), height: $t.outerHeight(), top: $o.top, left: $o.left }); } }); }, drag: function(event, ui) { var ts, bs, ls, rs, l, r, t, b, i, first, inst = $(this).data("ui-draggable"), o = inst.options, d = o.snapTolerance, x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; for (i = inst.snapElements.length - 1; i >= 0; i--){ l = inst.snapElements[i].left; r = l + inst.snapElements[i].width; t = inst.snapElements[i].top; b = t + inst.snapElements[i].height; if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) { if(inst.snapElements[i].snapping) { (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); } inst.snapElements[i].snapping = false; continue; } if(o.snapMode !== "inner") { ts = Math.abs(t - y2) <= d; bs = Math.abs(b - y1) <= d; ls = Math.abs(l - x2) <= d; rs = Math.abs(r - x1) <= d; if(ts) { ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top; } if(bs) { ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top; } if(ls) { ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left; } if(rs) { ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left; } } first = (ts || bs || ls || rs); if(o.snapMode !== "outer") { ts = Math.abs(t - y1) <= d; bs = Math.abs(b - y2) <= d; ls = Math.abs(l - x1) <= d; rs = Math.abs(r - x2) <= d; if(ts) { ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top; } if(bs) { ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top; } if(ls) { ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left; } if(rs) { ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left; } } if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) { (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); } inst.snapElements[i].snapping = (ts || bs || ls || rs || first); } } }); $.ui.plugin.add("draggable", "stack", { start: function() { var min, o = this.data("ui-draggable").options, group = $.makeArray($(o.stack)).sort(function(a,b) { return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0); }); if (!group.length) { return; } min = parseInt($(group[0]).css("zIndex"), 10) || 0; $(group).each(function(i) { $(this).css("zIndex", min + i); }); this.css("zIndex", (min + group.length)); } }); $.ui.plugin.add("draggable", "zIndex", { start: function(event, ui) { var t = $(ui.helper), o = $(this).data("ui-draggable").options; if(t.css("zIndex")) { o._zIndex = t.css("zIndex"); } t.css("zIndex", o.zIndex); }, stop: function(event, ui) { var o = $(this).data("ui-draggable").options; if(o._zIndex) { $(ui.helper).css("zIndex", o._zIndex); } } }); })(jQuery); (function( $, undefined ) { function isOverAxis( x, reference, size ) { return ( x > reference ) && ( x < ( reference + size ) ); } $.widget("ui.droppable", { version: "1.10.3", widgetEventPrefix: "drop", options: { accept: "*", activeClass: false, addClasses: true, greedy: false, hoverClass: false, scope: "default", tolerance: "intersect", // callbacks activate: null, deactivate: null, drop: null, out: null, over: null }, _create: function() { var o = this.options, accept = o.accept; this.isover = false; this.isout = true; this.accept = $.isFunction(accept) ? accept : function(d) { return d.is(accept); }; //Store the droppable's proportions this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight }; // Add the reference and positions to the manager $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || []; $.ui.ddmanager.droppables[o.scope].push(this); (o.addClasses && this.element.addClass("ui-droppable")); }, _destroy: function() { var i = 0, drop = $.ui.ddmanager.droppables[this.options.scope]; for ( ; i < drop.length; i++ ) { if ( drop[i] === this ) { drop.splice(i, 1); } } this.element.removeClass("ui-droppable ui-droppable-disabled"); }, _setOption: function(key, value) { if(key === "accept") { this.accept = $.isFunction(value) ? value : function(d) { return d.is(value); }; } $.Widget.prototype._setOption.apply(this, arguments); }, _activate: function(event) { var draggable = $.ui.ddmanager.current; if(this.options.activeClass) { this.element.addClass(this.options.activeClass); } if(draggable){ this._trigger("activate", event, this.ui(draggable)); } }, _deactivate: function(event) { var draggable = $.ui.ddmanager.current; if(this.options.activeClass) { this.element.removeClass(this.options.activeClass); } if(draggable){ this._trigger("deactivate", event, this.ui(draggable)); } }, _over: function(event) { var draggable = $.ui.ddmanager.current; // Bail if draggable and droppable are same element if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { return; } if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { if(this.options.hoverClass) { this.element.addClass(this.options.hoverClass); } this._trigger("over", event, this.ui(draggable)); } }, _out: function(event) { var draggable = $.ui.ddmanager.current; // Bail if draggable and droppable are same element if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { return; } if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { if(this.options.hoverClass) { this.element.removeClass(this.options.hoverClass); } this._trigger("out", event, this.ui(draggable)); } }, _drop: function(event,custom) { var draggable = custom || $.ui.ddmanager.current, childrenIntersection = false; // Bail if draggable and droppable are same element if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { return false; } this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function() { var inst = $.data(this, "ui-droppable"); if( inst.options.greedy && !inst.options.disabled && inst.options.scope === draggable.options.scope && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance) ) { childrenIntersection = true; return false; } }); if(childrenIntersection) { return false; } if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { if(this.options.activeClass) { this.element.removeClass(this.options.activeClass); } if(this.options.hoverClass) { this.element.removeClass(this.options.hoverClass); } this._trigger("drop", event, this.ui(draggable)); return this.element; } return false; }, ui: function(c) { return { draggable: (c.currentItem || c.element), helper: c.helper, position: c.position, offset: c.positionAbs }; } }); $.ui.intersect = function(draggable, droppable, toleranceMode) { if (!droppable.offset) { return false; } var draggableLeft, draggableTop, x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width, y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height, l = droppable.offset.left, r = l + droppable.proportions.width, t = droppable.offset.top, b = t + droppable.proportions.height; switch (toleranceMode) { case "fit": return (l <= x1 && x2 <= r && t <= y1 && y2 <= b); case "intersect": return (l < x1 + (draggable.helperProportions.width / 2) && // Right Half x2 - (draggable.helperProportions.width / 2) < r && // Left Half t < y1 + (draggable.helperProportions.height / 2) && // Bottom Half y2 - (draggable.helperProportions.height / 2) < b ); // Top Half case "pointer": draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left); draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top); return isOverAxis( draggableTop, t, droppable.proportions.height ) && isOverAxis( draggableLeft, l, droppable.proportions.width ); case "touch": return ( (y1 >= t && y1 <= b) || // Top edge touching (y2 >= t && y2 <= b) || // Bottom edge touching (y1 < t && y2 > b) // Surrounded vertically ) && ( (x1 >= l && x1 <= r) || // Left edge touching (x2 >= l && x2 <= r) || // Right edge touching (x1 < l && x2 > r) // Surrounded horizontally ); default: return false; } }; /* This manager tracks offsets of draggables and droppables */ $.ui.ddmanager = { current: null, droppables: { "default": [] }, prepareOffsets: function(t, event) { var i, j, m = $.ui.ddmanager.droppables[t.options.scope] || [], type = event ? event.type : null, // workaround for #2317 list = (t.currentItem || t.element).find(":data(ui-droppable)").addBack(); droppablesLoop: for (i = 0; i < m.length; i++) { //No disabled and non-accepted if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) { continue; } // Filter out elements in the current dragged item for (j=0; j < list.length; j++) { if(list[j] === m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } } m[i].visible = m[i].element.css("display") !== "none"; if(!m[i].visible) { continue; } //Activate the droppable if used directly from draggables if(type === "mousedown") { m[i]._activate.call(m[i], event); } m[i].offset = m[i].element.offset(); m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight }; } }, drop: function(draggable, event) { var dropped = false; // Create a copy of the droppables in case the list changes during the drop (#9116) $.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function() { if(!this.options) { return; } if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) { dropped = this._drop.call(this, event) || dropped; } if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { this.isout = true; this.isover = false; this._deactivate.call(this, event); } }); return dropped; }, dragStart: function( draggable, event ) { //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003) draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() { if( !draggable.options.refreshPositions ) { $.ui.ddmanager.prepareOffsets( draggable, event ); } }); }, drag: function(draggable, event) { //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse. if(draggable.options.refreshPositions) { $.ui.ddmanager.prepareOffsets(draggable, event); } //Run through all droppables and check their positions based on specific tolerance options $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { if(this.options.disabled || this.greedyChild || !this.visible) { return; } var parentInstance, scope, parent, intersects = $.ui.intersect(draggable, this, this.options.tolerance), c = !intersects && this.isover ? "isout" : (intersects && !this.isover ? "isover" : null); if(!c) { return; } if (this.options.greedy) { // find droppable parents with same scope scope = this.options.scope; parent = this.element.parents(":data(ui-droppable)").filter(function () { return $.data(this, "ui-droppable").options.scope === scope; }); if (parent.length) { parentInstance = $.data(parent[0], "ui-droppable"); parentInstance.greedyChild = (c === "isover"); } } // we just moved into a greedy child if (parentInstance && c === "isover") { parentInstance.isover = false; parentInstance.isout = true; parentInstance._out.call(parentInstance, event); } this[c] = true; this[c === "isout" ? "isover" : "isout"] = false; this[c === "isover" ? "_over" : "_out"].call(this, event); // we just moved out of a greedy child if (parentInstance && c === "isout") { parentInstance.isout = false; parentInstance.isover = true; parentInstance._over.call(parentInstance, event); } }); }, dragStop: function( draggable, event ) { draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" ); //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003) if( !draggable.options.refreshPositions ) { $.ui.ddmanager.prepareOffsets( draggable, event ); } } }; })(jQuery); SOGo-2.1.1b/UI/WebServerResources/mime-application-x-shellscript.png0000644000000000000000000000744512247657030024053 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW°IDATxÚí[{lGþvo÷v÷^ñù|¾ØNÎöÙŽ]Ç&U¨Mj7 ÔTý£P}„´QТ (›Ò(‰@¢éCB B©M›6qÇmš„RZêG'1>¿Îw·÷¾[þ†ÝÛÛõÝ¹Ž #æfvgwæû~óÍoË(Š¢( > KØ¥®Àÿ{øˆ€%\¹âñx<Î*Êéý8ù|aR r€Q2J0ÿ^"mÆ7—ì-d9!hý@=~wX©¬¸{eÐlàšÚADAd˜ÅÛ(0åŽÇŽà_K(Ê ›ZÓ"àC5|ÿ.Ï0K×}H&S©dRQÒét:™¦§gf¦§¡ÐÐ¥A™øíÄ+@ÛòÖ 7°@ǽíŸï¼`Y–eÙÅkGÙüÆõ;þ×UŠòùÙϦ¾8A69 ärŠ’Ëúç©i«?Õ^izîûô×óï+Ì'¹,k±°,`·K’Ó H’$I055551ü½ÿﯿ?䎀EØü\÷Ÿè¤œ”“rןˆ²Ç€ì/2/¦Ÿ&ÖÎ0 SxšÖÿ3o½b|GþU†)ÌQ¯Ùl6›Í33¡Ðä$píÚØØ•+@eeeeU°öÖu[××öívŸdþä~IþÃíÀTl*6ºþþaÙ¨W hãûóKæ—˜ËÞô×´Àë É ! Çq'ñ80::::28v»Ó ´47¯YåüS ’ÿÏÀ«•GC/ßLˆâø?®ó  b3 ÑSbF†¶\1 НÍ׿Ñÿ<ÏóÈr<’ž138v»ËÔŒ,­½McŸ¯Þyt㑟Êä`0¸ðDÌà 5—#"TàõD˜7¦/HQÊžþã8ŽãyÀbaYŽÆÇ'&ÆÆ`·“Øív»Ýn éá–5}xí£¸€™ÜLnzzመ—ééІùùF}Á8]N0Þ8•ÿÏb!ƒ²ÅÂq, ¤Óét&är¹\.Øl’d·6›Íæp±¢²ð¯­ßê#ƒ¯ýé•N MESÑOļ$ÈXçó½šükÆå¦RÈÎÂ;óå)ÿŸ:4Ó1Ábá8Ò#,ê~‚ ¢H’ H`±0 ˾߰ï"P1\‘]öGàÔûB½½þyLÄ %(P=!fDAX ÅÒ¦µ„hëÈ0*à,Ë0 ðæ›o½ÕפR©T*X,<Ïó€Ýn³Ùí€Óér9@ ±imÀœï87ù—[€Ëý£Õ#ÿPÿM+­õþòÝÖè…þ¼4z!2¦Ò‚Þýœ+môŽS{Ç©^ð¬ÅÄb²‹oéòeàÂ… .^TÝÚÀµ&¥ñ8p~ú/_9û½ù´`Þ˜k&Ms•œ?ét&“É@r9 »ž"mŠHV‚,-ù’¤yH&“Édxï½÷Þ{ÿ} ¢¢¢ÂíR×R©Àع±s×Þ.¿% A´ùÿÌäCQŒ-“z5æ\‡ggc1àߨ»÷'?‡ÃnžzêС‡DQA}2¼ áµxIb@DQ—‹L,)Á™ ‰ãñx<"‘H$&&‚Á`¨ÙYûXm0pmð 5ëk³¥£¹`ó€Ò¯ëÿëUÚØA ‡ÃaYöïâ‰Ã‡;îøÌgî¸hmýØÇ:;Ç?xðùçD"‘H& -Þ,¦DÐùÕjµZ­Dûm6Àår¹\.Àçóù–/š›››››ÚÚººÚZ`åHÝåCÀµƒ×ú¯)͘ Ó@–#æ¦Êˆ„b‡Ã±þÙg›nêêÚ°hkkk[µ ðû›š ºº®®¾8pàС^ D¤R¥QN̲êãv»ÝÎD½áß/Å-ÞL~Ì€6–žÙYÕâŸy¸ùæîîööÕ«[[ññ©©ÙYÀé$–ZYY[»b IË–y½ù=b>DPǵðºêÖ2 ‘û,ñj¥]Œ€â¸,…¯)ÖeG"² <öÑøîî-[º»ŽŽŽŽÖV`z:’eµ<žZ¼“ü±±`0<§Ón\.›Mh4K& n¾yýz`õêÎÎÎN §çûßÏ'¢Ô1À¬,‘­µtµ!äGß¿ÿÀgž6mÚ²åÖ[ÎNøXLë&RKW×Z¾ÅB—H}<·Ûá¶nÝ´©£ðû—/w»cÇúû/^l¶Š ¯¨®®©Y±‚ôˆÃ‡Í‰(€%’ 3 õM§3™løêWwïþá-[n»móf`íÚ5kÚÛ™2ÁbYx­…ë§ñÛoÿõ¯##ꢙ×KÈår9EÞzëwFF€ñqÒC._¾refFí 55uu+W>¸k×O¨ Òz\o *{&¬MaEÔž¡Þp™èx½UUn70; …BªõPí¦ÀéËÓ·d³™L.\½úφB€ÕJzDKK àóOE…Ýœ=KˆÉfÓél²¸&I‚ÀóÏ“rÑh$7ÜÐÖÖØHˆµXÌfí´¶Åq)5,ˆi‰0 ¨Å>ýôSOíÙ\º444< ô÷÷õ9d2(z_<žL¦ÓêóGFFG§§ÉÉééhh4M$Y&q4*ËÉ$‰´(â—-³ÛEhiil¬®Þ|³¯¯¯  û÷?úèÎ幡ú1`‰¼ ã bä'‚`µ>úï<ð088008¼ñÆÑ£Ç«§óçß}÷òeàƒ††ÆÇ‰tLMCCÁ jÑë×wvÖ×€ßïõ³³DÊD‘\w8ðÍÍ ÕÕÀ™3§OàEQQ€}ûöî½ÿ~u)Bïç—ê†Rã\„`&Aù{¶êrpþ ¬%‚ç >d2Éd4 œ}êÔÉ“€ÕJ,~ß¾½{·m+¾ØXö_ï™n–/Š´G<òÈŽ@*•LF"À»ïž?îÐÒB,×é”$AÐaµràóUU¹\êâpØl‚44¬\éñ§N8qâ^Q€oû›ß4¾Üù€~j¹¤TàfD¥é‘GöíÛ¾ˆÇc±ÙYàüù³gÏœ†¯p8$IµC§Ïolôû«ª€ÞÞÞÞÞ^²Ñ’Í?¼gÏ}÷Í|©î§Ù†ÏüÂHP~EŒˆ0œ¦éS2I–‘…¤¿þõݻロ¬ÿOOgÎô÷÷÷€=rÒM€x\–É"9PxüxoïÉ“ä‰ðÐC_þò]w‘A>VߓͷØ|Ì2^ï•iqY´1ÀèEfçç©ùt£#“!§R©T*™ ²óDR`×®;3 Ó§‰÷44TU ÄâßxãØ±'€ÑÑ«WGG;¶mÛº•œz À“çÒ=_ú~jå¿^ÐÇ‘±ÄlLÐzEF¤ÅeÑfÂÆTœ£4Ï[­dfJE]ºÈf3™tÈfIÏp»IÏ8tèÀ¯}M}*ÁÒUR‹…xEðùN !?À‚JP¹”\ï` ¼6¯#)—%õ‚J)9×ó㌅[Å>^2;£j¯Ci­ý¯“ ½at|Q›.|º±ýiƒJ„þý;ŒŸWÚ >£üù®ý…’{ñ§Íy6;´[Ø@ócês5ÔìûóO—òOm—š¯}þÜÀÂd~Q:=E H$‰DBQ¢Ñh4-¥ë÷æ& Ò×ÿæ– =ÐÅï3î4ŸâDæ'ʼn0• Ê$è„Ãáp8 °_`ïbvÐê=up£R'\ù¢¤–)ô:h“Ìòk\ìz©¡ÐÀ ïзSQØ]ìì@–eY©§¯‰û«(f__š@?X SuY–eYœ¿tz–áŸ^b†<@£§¡2à¥@/¶§³t?È 3ƒ àþ›û»î²Oþ–|ùÒÆnWq¤„èƒ)´¸Ð¶|¶éƒÖiàÕͯ]}å%@¾Qþ•|Èùru9·ÑÀ6?ï`±Ë•˜3ÉÄ×n—ßÅ£«¿²¦°Nê÷ÆÀÿç9Å*LÇ€x<Çÿý¥|\ítq‹JÕÿKEršš.i8‡Ã¡æÓï‘AÁ\JþP›zAúÕD3¿ú=PÁ¥®®mÑ5&Žã¸â’\ö—ò…… ÿ×Ò>(’IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/mime-tar.png0000644000000000000000000000512612247657030017531 0ustar rootroot‰PNG  IHDR00’%ÄbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk> vpAg00ÎîŒW áIDATxÚí[{Œ\UÿÝ÷<÷1m·]Z©UØJ ©mZ5H!‹ hÄPQcA%" JÀÂCHkĈ /µJ¥¡ÚÖVR 5¶i»P ]  »³mwwf¹3wîûÞãÇ›»»ÝíÎܹÝýþ˜“sÎ=ç|ß÷»ßãœ{†!„Bp–¦ˆØ©fàÿÎ0Åt€)¦i@Ç¡Wö­¿U—•¾Áéͦ=ÞÚôÌÝ¿¶ôÞÿÒÒ_o=·µÿ¡Ç qK×´údÚÀkânéÏÀ2\ÕzK Ðÿ|Gß?_6§î•/d€ãâ¡÷ÿ~¸~˜ö°÷°7Š»Ó,•²Y ù¿KÏ­ÛZ7~äJààš¿¾xÇ `{ÇÃÛV~¼ÛÓsä?õÈô`9ÿ¤ø2ຎcš!ŽcYËZV±œó£Yñ¦kþvsÿýÀŽËýî/{|!ûƒ„®¢ §fºoÄ6í¿ë¢¶½„´E.üÙç~”Ë}}‡ÿ¼ëº.œl•ÿQX”©«ô$pÉÑkVÿ²h›wé§¿}À°,xžaÎ4ÿ“q]Ø6!¦©,ö¦¬:r0yM+t&¯ŠòÀäµ×å2`2Ú¬b°Žª±B0gjù<`NCÛ‚K{_xý–‡ŶèÅ i¹Ü‘#•óc¦išÀÉç mJ`Àrýú†õKÖE|fåWΡ`ššV,Òžý[îîۀܶ÷¥×纪Ì,´öj“/ß° y–_DØè5 ×|:².ö@X$ܸàÛÅâ€_/~)šØ.nßð·ñÍâÝ@™W¾X¸èëK§÷ïÄók…7€¶—t¬º 0Í|¾³3¸ŠR.+ 0ðì@ËÀ@ãoæ>òÉ“ÀUÉŸÝ5`YžÅð €í;Y}ùy„Ä"Q&Âç´¶ÝúÙo Ãq¢0 ÄÁ6!®kÛ€m†ª‡ïÙóÜs@<žH̘¤RMM€ëF>ï²wâDoo_аtîŠÅ®\pÇu;sáPsâ3½íÿ&Ä|¤Ô”»˜7wÑí«ÖÑ7E’ÂS¼G²<8xü8˽óÎæÍ@*•LÆb€a(J_pôè»ï8d³ýý€a†aT¿Ã0 ËsæÌžÝÒôïùðÕ}`Øåb>Ä _Ídm|i0¯ÐÆ®°ÂSôxDˆm[à8º^*€e©*ÐЉˆ"ÐÚ:sf*8ŽmpüxooOpìØ‰==€ªªªªV¾ž ð¼ ÒZ驈t4ü«ý‰ï…'OÍt5|aÓÕ@ò³®ÿè@ø M„  ¨*ÇCC´”eÃàyÀ0‘$€ã$©© ˆDâñ–À²Izz²Ù\èêêî>v (•EQȩ̀{¯“[÷Äç¾¶ï¡?=ž<e³GOÂÞJÖ“+Ž„HäÌàº4Ìš•Lr-hnŽÅ ×¢QŽs€ãÆqÃ`˜ÆF ˜ P@tº«+“ Y–e?x”HÄ㉠¾'<·°l])jwEèÞõfçËws,|hyˆoÄDäùfï}õb ð,Ëž®¤ã¼çm›QúûU5zzŠEI2™ÞÞ|H§;;3`hhh(Ÿ8Žã8ÖŠOI ÐÁ¿ò؆'k—'0™û¿ÿ—C@£:»í¼líŒ⺖¸®iªªïãG× šÕ €$E£‰„§ú‘ ¦uªhÚCÝÕpZ÷ú½R×G€L&ŸFŽŽ\N’€Îξ¾bèìÌdº»ýc>hܳáéŸÖ.7_íÛ0lU!Dž»9}¤X¬ñi@×e9—£ÁÏ4Ç!Äq˲,Û¦íŽ8ŽãÐ’š¸ª–Ëª 躦•Ë€¦išaÐörPUMÓ4 \¦Ï•Ë´~Ùe‹E£¾ëã8QŒÇž—¤DH$D1‘Xv´k¤¶ãY㌬ûåH¹½L.›ÍdÞ~¯z ;@z[3.ãZ¶ ˆ»#$~ 0 " vtlÙ2’å±ÒOB\—*8ˆ"mgYÚÒvϧ۶$Ñ'šš¨Â\7xžç9ηÛ¦–â•£‰ZGÑQ Ãq‚,\¸lÙÕWWì¼ów»7aõ$0ƒÃ]ÁÄ‚sœÿë“(òüp'VI5êŸïj¤¤òÛØG5pªï Wð ü„;çHùÂ<; `Ù±- VÁ+m=ÝÕ«•e½B&Àîz,ª Ƥ¬1ñÿ•ÃXKðÓ÷›-è|t\¸§Ç!X€—êtAµ <Ñša¬,ø.( +1T ¯7€O¡/_Y€Ÿgµ ^ù,áÄŒñFÖaäE€S³„ ‚óÍáÆŽñVnáujagAc«6Ü€\ùŒ7 Sg ߌ%L—0UY•÷ìpTWøÊñ·Â|¬žÉȪNm­S~T½ÝL†eøivÝaŸíʲ ê¯%w +«=«´ÀÀÐ(˜T#øH„#tœ/'PgàÇ€‰4;ØJFUbu„Ç; z¬Ž0]ÂøÙµpúñ&¼õªÿ"[°•SÔéìÄÏVj#Ï‚ÈFrIö-¶mÛ„ð<ϹKZ5%½T(Ù€û"¹Ì†)9Š˜¬lxkøß˜‡S±X,‹@*•J¥RÕsY1º®ëºNˆ–×NhCÜ{&À0L‰3&ÎjQj}|ðår]€Þ?n„hÐuUU@øy|îŒà<átæùú©–*Àûâű<ÏóÀÌ5ŸÚú5 xçÍÝüÆùÀŸXa}Ù¢ÑÖÖ%KÆx¤eøŸ\×qü:!´îmx¼:!ô–ÅDý~û©ÏÓ’*jx?åÃãgä8¯,—UµTÒé÷^kß ´,½øáoÞàß úE°b<ÓòLí|{¥öÃ%@ºýÕ7Üì;g{òéîNsr¨²9¹z†§Š¸›¥_$/š6_ÐüÕoó×,ûüõç{®Ç×OµóV}=ݶiÔ/•J¥R‰Þ×)—½öà¦Xïä½á4Ûâñx<’Éd2™ôÚ'€Ñdš¦iš„X–eY“p;zªIAQÅ0þ¨1íÿ#6ÝiÚÿKrºÓY¦˜þ Yoü YQÉIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/tb-mail-addressbook-flat-24x24.png0000644000000000000000000000335612247657030023351 0ustar rootroot‰PNG  IHDR°çá»gAMA± üabKGDÿÿÿ ½§“ oFFs0ÞP±c pHYs''”iQ vpAg°H‘Ï`Å$IDATXõW]hTGþfæî&Ùl$?&¦Ic¤(h”RDˆH¡•>Š”BÓ7„Zÿ|)TðÑ'ƒ” } ”PµЖ¶úÒ6¦m„þhD‹ËÖd“Í&»{÷î™;Ó‡Óán"é&!=/‡ËÎ{¾ó}ß™Y†:ñé§çÎ8Q*)†•Js³ÖRV« €µÖf2Ö2d2ÀX&صÆd2ÆÐ³ŒYûø1çÖ2–Éd³Q4?ŸÍž:uùò—_†a½ï× VoÁgŸ?æŒïÖ©TggOO[@ÎiRRJ (†RR.}VJÊ0¤ C)Í¿‘Ë1™Œµ€µ®ýE»Þ¸ñÖ[ÃÃ##ß¿n·n½÷ÞÉ“¾OO©ÔÁƒ¾ðÏ—ËÕ*0;;;[,ÍÍ[¶ô÷ýý;v--›6J•ËÅ" ¥ï/.Jù~±ÁÂB>T*…ÂÜ e†ÕjùüôôÌŒ1RJ†ï¼34tñâÈȵkËëóꈢ(2&~.J% ««··³èéÙµkëV`v6—[\2™‰‰ï¾8ohhiº»wïÞ·èì|þù_„H$’Éx?k­5Ð:|(çæff€löÎ78ÿã_~™œ_*SS·oó †•Šï›6 ìßh­µÖK¿í¾ù_ÁWÀÖ1ÖcL ¬6G`ŒRRÆÌÏÏÍÆd2SS@:HH ìÜùÊ+/½är÷îMN’©Ã SÇyµ±fÄ…RŽ"êœÖJqN’  {°V©jH¥ž{®¯°6ÞGk€1!¼ºÕ¬SBTE$™("/p.Äò‹%&„+~‚¦P̤1´7ckéüš rbk-¥RT[2Œ7Cž'D ‘ðýJ¥¶14…kéLq_Ú0Ôq·iIIÕNÏ#í“yØÌŒR*U{`¹Ì¹ÛÑM¥ –#VÒ¬ó‚;¨< –ΩÊŒqЮeÀ]w¯MBu­Â9çŒ}ð™Mëtº±±© hkknN§Ižü@™ 'mCY)rÔrjïXka .€³gGG¿øâäIkµ–òÀ|?&& :::ÒéthjJ& ˆ@™1!ˆ!€("FVbÀóòùÇj•þÐ º&® €‹wßýüóo¿ç<›­TŸ<)—Ëå3g~ÿ}zzf¦T2† io'f<ÏóèÞÏ1D9ŠSîÀ#óÿý÷øøíÛaøçŸ_}uó¦µ÷ïß½ûÛo… €Ó§Wª«î?²zqýú±cCC}}ɤç qéRGGKKkë¡CÛ¶õööõ1fŒ‰¤ìööææT ûé§ …íÛ÷íûùç\.ŸŸŸãžž'O&&r¹¶¶B¡©) ß|sttt´vo0€åñá‡Ç :äyB$—/oÛÖÛÛßß××ÕõÌ3Ï> Ð<ÆÆÆÆîÜ*•t:nm=zôÂ…«WW–ÊJ±j ­6¾rå£>ù$‘ˆ¢0˜šzôèþýááÉÉ»w'&´~ðàáé)w ·¶\~ø°Pr½ßÛpVŠë×ß~ûõ×÷î¥[çûﻡ|äȵk<8¸Þ}ÿƒû£²Ëà¨$zTXtCommentxÚóMÌÌQ(ÉÏÏIJ,RÈLÎÏ+ÖF4EöIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/UIxPreferences.css0000644000000000000000000001007412247657030020707 0ustar rootrootDIV#preferencesTabs { position: absolute; top: 54px; left: 5px; right: 5px; bottom: 5px; } DIV.bottomToolbar { position: absolute; height: 20px; margin: 0px; padding: 0px; left: 2em; right: 2em; bottom: 8px; } #mailAccountsToolbar { left: 5px; bottom: 9px; width: 130px; } TABLE.categoriesList { width: 100%; } #colorTableHeader { width: 50px; } TR.categoryListRow { background: #ccddec; cursor: pointer; } TD.categoryListCell { -moz-user-select: none; } DIV.colorBox { -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; border: 2px solid #ccddec; } DIV.colorBox:hover { border-color: #eee; } DIV.listWrapper { overflow: auto; position: absolute; padding: 0px; margin-top: 2px; border-left: 1px solid #9b9b9b; background: #ccddec;} .listWrapper TABLE TD { height: 22px; } #calendarCategoriesListWrapper { top: 210px; bottom: 30px; right: 2em; left: 2em; } #contactsCategoriesListWrapper { overflow: auto; position: absolute; bottom: 30px; right: 2em; top: 20px; left: 2em; padding: 0px; margin-top: 2px; border-left: 1px solid #9b9b9b; background: #ccddec; } /* time date control */ SPAN.timeDateControl INPUT.textField { width: 7em; vertical-align: text-bottom; } /* vacation, forward */ #vacation, #forward { padding-left: 2.5em; } #vacation LABEL { margin-left: 0; } #vacation TEXTAREA, #forward TEXTAREA { width: 100%; } #vacation TEXTAREA#autoReplyText { height: 100px; } #vacation TEXTAREA#autoReplyEmailAddresses, #forward TEXTAREA { height: 50px; } #vacation SPAN { float: right; } #vacation SPAN.timeDateControl, #vacation SPAN.timeDateControl SPAN { float: none; vertical-align: middle; } #vacation BR, #passwordView BR { clear: both; } /* mail options */ DIV#mailOptionsTabs { position: absolute; top: 200px; left: 0px; right: 0px; bottom: 0px; } DIV#filtersListWrapper, DIV#mailLabelsListWrapper { bottom: 30px; bottom: 22px; right: 2em; right: 0px; top: 208px; top: 0px; left: 2em; left: 0px; } #mailOptionsTabs .bottomToolbar { bottom: 0px; left: 0px; right: 0px; } DIV#filtersListWrapper TD, DIV#mailLabelsListWrapper TD, DIV.bottomToolbar { -khtml-user-select: none; -moz-user-select: none; } #filtersList, #labelsList { width: 100%; cursor: default; } TH#activeTableHeader { width: 50px; text-align: center; } TD.activeColumn { text-align: center; } P#passwordFields, P#passwordError { width: 410px; text-align: right; } P.errorMessage#passwordError { color: #f00; } P.infoMessage#passwordError { color: #00f; } /* mail accounts */ #mailAccountsListWrapper, #mailAccountEditor { bottom: 30px; top: 5px; left: 0px; margin: 0px; } #mailAccountEditor { position: absolute; overflow: auto; bottom: 30px; left: 140px; padding: 0px; right: 5px; } #mailAccountEditor dl { margin: 5px; } #mailAccountsListWrapper { overflow-x: hidden; left: 5px; width: 130px; border-top: 1px solid #9b9b9b; } #mailAccountsList { position: absolute; top: 0px; bottom: 0px; left: 0px; right: 0px; margin: 0px; padding: 0px; } #mailAccountsList LI { cursor: pointer; white-space: nowrap; padding-left: 5px; height: 22px; line-height: 22px; } #mailAccountsList LI.readonly { cursor: default; font-style: italic; } #serverName { width: 100px; } #port { width: 30px; } #userName, #password { width: 180px; } #fullName, #email, #replyTo { width: 180px; } #actSignature { color: #55f; cursor: pointer; text-decoration: underline; } #actSignature.disabled { color: #999; cursor: default; text-decoration: none; } #signatureDialog { position: absolute; left: 10px; width: auto !important; right: 10px; top: 50px; } #cke_signature, #cke_signature div { padding: 0px; } #signature { width: 100%; height: 90px; margin: 0px auto; margin-bottom: 10px; } #receiptOptions { text-align: right; } #colorPickerDialog { width: 146px; height: 191px; } #colorPickerDialog.dialog.right > DIV { padding-left: 10px; } .dialog.bottom > DIV:before { top: auto; bottom: 12px; } .dialog.bottom > DIV:after { top: auto; bottom: 13px; } SOGo-2.1.1b/UI/WebServerResources/UIxAclEditor.js0000644000000000000000000001675712247657030020156 0ustar rootroot/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ var contactSelectorAction = 'acls-contacts'; var defaultUserID = ''; var AclEditor = { userRightsHeight: null, userRightsWidth: null }; var usersToSubscribe = []; function addUser(userName, userID, type) { var result = false; if (!$(userID)) { var ul = $("userList"); var lis = ul.childNodesWithTag("li"); var newNode = nodeForUser(userName, userID, canSubscribeUsers); newNode.addClassName("normal-" + type); var count = lis.length - 1; var inserted = false; while (count > -1 && !inserted) { if ($(lis[count]).hasClassName("normal-user")) { if ((count+1) < lis.length) ul.insertBefore(newNode, lis[count+1]); else ul.appendChild(newNode); inserted = true; } else { count--; } } if (!inserted) { if (lis.length > 0) ul.insertBefore(newNode, lis[0]); else ul.appendChild(newNode); } var url = window.location.href; var elements = url.split("/"); elements[elements.length-1] = ("addUserInAcls?uid=" + encodeURIComponent(userID.unescapeHTML())); triggerAjaxRequest(elements.join("/"), addUserCallback, newNode); result = true; } return result; } function addUserCallback(http) { if (http.readyState == 4) { if (!isHttpStatus204(http.status)) { var node = http.callbackData; node.parentNode.removeChild(node); } } } function setEventsOnUserNode(node) { var n = $(node); n.observe("mousedown", listRowMouseDownHandler); n.observe("selectstart", listRowMouseDownHandler); n.observe("dblclick", onOpenUserRights); n.observe("click", onRowClick); var cbParents = n.childNodesWithTag("label"); if (cbParents && cbParents.length) { var cbParent = $(cbParents[0]); var checkbox = cbParent.childNodesWithTag("input")[0]; $(checkbox).observe("change", onSubscriptionChange); } } function onSubscriptionChange(event) { var li = this.parentNode.parentNode; var username = li.getAttribute("id"); var idx = usersToSubscribe.indexOf(username); if (this.checked) { if (idx < 0) usersToSubscribe.push(username); } else { if (idx > -1) usersToSubscribe.splice(idx, 1); } } function nodeForUser(userName, userId, canSubscribe) { var node = createElement("li"); node.id = userId; var span = createElement("span"); span.addClassName("userFullName"); span.appendChild(document.createTextNode(" " + userName.unescapeHTML())); node.appendChild(span); if (canSubscribe) { var label = createElement("label"); label.addClassName("subscriptionArea"); var cb = createElement("input"); cb.type = "checkbox"; label.appendChild(cb); label.appendChild(document.createTextNode(_("Subscribe User"))); node.appendChild(label); } setEventsOnUserNode(node); return node; } function onUserAdd(event) { openUserFolderSelector(null, "user"); preventDefault(event); } function removeUserCallback(http) { var node = http.callbackData; if (http.readyState == 4 && isHttpStatus204(http.status)) node.parentNode.removeChild(node); else log("error deleting user: " + node.getAttribute("id")); } function onUserRemove(event) { var userList = $("userList"); var nodes = userList.getSelectedRows(); var url = window.location.href; var elements = url.split("/"); elements[elements.length-1] = "removeUserFromAcls?uid="; var baseURL = elements.join("/"); for (var i = 0; i < nodes.length; i++) { var userId = nodes[i].id.unescapeHTML(); if (userId != defaultUserID && userId != "anonymous") { triggerAjaxRequest(baseURL + encodeURIComponent(userId), removeUserCallback, nodes[i]); } } preventDefault(event); } function subscribeToFolder(refreshCallback, refreshCallbackData) { var result = true; if (UserLogin != refreshCallbackData["folder"]) { result = addUser(refreshCallbackData["folderName"], refreshCallbackData["folder"], refreshCallbackData["type"]); } else refreshCallbackData["window"].alert(_("You cannot subscribe to a folder that you own!")); return result; } function openRightsForUserID(userID) { var url = window.location.href; var elements = url.split("/"); elements[elements.length-1] = "userRights?uid=" + encodeURIComponent(userID); var height = AclEditor.userRightsHeight; if (userID == "anonymous") { height -= 42; if (CurrentModule() == "Contacts") { height -= 21; } } window.open(elements.join("/"), "", "width=" + AclEditor.userRightsWidth + ",height=" + height + ",resizable=0,scrollbars=0,toolbar=0," + "location=0,directories=0,status=0,menubar=0,copyhistory=0"); } function openRightsForUser(button) { var nodes = $("userList").getSelectedRows(); if (nodes.length > 0) openRightsForUserID(nodes[0].id.unescapeHTML()); return false; } function onOpenUserRights(event) { openRightsForUser(); preventDefault(event); } function onAclLoadHandler() { var ul = $("userList"); var lis = ul.childNodesWithTag("li"); for (var i = 0; i < lis.length; i++) setEventsOnUserNode(lis[i]); var input = $("defaultUserID"); if (input) { defaultUserID = $("defaultUserID").value; var userNode = nodeForUser(_("Any Authenticated User"), defaultUserID.escapeHTML()); userNode.addClassName("any-user"); userNode.setAttribute("title", _("Any user not listed above")); ul.appendChild(userNode); } if (isPublicAccessEnabled && CurrentModule() != "Mail") { userNode = nodeForUser(_("Public Access"), "anonymous"); userNode.addClassName("anonymous-user"); userNode.setAttribute("title", _("Anybody accessing this resource from the public area")); ul.appendChild(userNode); } var buttonArea = $("userSelectorButtons"); if (buttonArea) { var buttons = buttonArea.childNodesWithTag("a"); $("aclAddUser").stopObserving ("click"); $("aclDeleteUser").stopObserving ("click"); $("aclAddUser").observe("mousedown", onUserAdd); $("aclDeleteUser").observe("mousedown", onUserRemove); } AclEditor['userRightsHeight'] = window.opener.getUsersRightsWindowHeight(); AclEditor['userRightsWidth'] = window.opener.getUsersRightsWindowWidth(); Event.observe(window, "unload", onAclCloseHandler); } function onAclCloseHandler(event) { if (usersToSubscribe.length) { var url = (URLForFolderID($("folderID").value) + "/subscribeUsers?uids=" + usersToSubscribe.join(",")); new Ajax.Request(url, { asynchronous: false, method: 'get', onFailure: function(transport) { log("Can't subscribe users: " + transport.status); } }); } return true; } document.observe("dom:loaded", onAclLoadHandler); SOGo-2.1.1b/UI/WebServerResources/ckeditor/0000755000000000000000000000000012247657030017110 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/styles.js0000644000000000000000000000701212247657030020771 0ustar rootroot/** * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md or http://ckeditor.com/license */ // This file contains style definitions that can be used by CKEditor plugins. // // The most common use for it is the "stylescombo" plugin, which shows a combo // in the editor toolbar, containing all styles. Other plugins instead, like // the div plugin, use a subset of the styles on their feature. // // If you don't have plugins that depend on this file, you can simply ignore it. // Otherwise it is strongly recommended to customize this file to match your // website requirements and design properly. CKEDITOR.stylesSet.add( 'default', [ /* Block Styles */ // These styles are already available in the "Format" combo ("format" plugin), // so they are not needed here by default. You may enable them to avoid // placing the "Format" combo in the toolbar, maintaining the same features. /* { name: 'Paragraph', element: 'p' }, { name: 'Heading 1', element: 'h1' }, { name: 'Heading 2', element: 'h2' }, { name: 'Heading 3', element: 'h3' }, { name: 'Heading 4', element: 'h4' }, { name: 'Heading 5', element: 'h5' }, { name: 'Heading 6', element: 'h6' }, { name: 'Preformatted Text',element: 'pre' }, { name: 'Address', element: 'address' }, */ { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } }, { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } }, { name: 'Special Container', element: 'div', styles: { padding: '5px 10px', background: '#eee', border: '1px solid #ccc' } }, /* Inline Styles */ // These are core styles available as toolbar buttons. You may opt enabling // some of them in the Styles combo, removing them from the toolbar. // (This requires the "stylescombo" plugin) /* { name: 'Strong', element: 'strong', overrides: 'b' }, { name: 'Emphasis', element: 'em' , overrides: 'i' }, { name: 'Underline', element: 'u' }, { name: 'Strikethrough', element: 'strike' }, { name: 'Subscript', element: 'sub' }, { name: 'Superscript', element: 'sup' }, */ { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } }, { name: 'Big', element: 'big' }, { name: 'Small', element: 'small' }, { name: 'Typewriter', element: 'tt' }, { name: 'Computer Code', element: 'code' }, { name: 'Keyboard Phrase', element: 'kbd' }, { name: 'Sample Text', element: 'samp' }, { name: 'Variable', element: 'var' }, { name: 'Deleted Text', element: 'del' }, { name: 'Inserted Text', element: 'ins' }, { name: 'Cited Work', element: 'cite' }, { name: 'Inline Quotation', element: 'q' }, { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } }, { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } }, /* Object Styles */ { name: 'Styled image (left)', element: 'img', attributes: { 'class': 'left' } }, { name: 'Styled image (right)', element: 'img', attributes: { 'class': 'right' } }, { name: 'Compact table', element: 'table', attributes: { cellpadding: '5', cellspacing: '0', border: '1', bordercolor: '#ccc' }, styles: { 'border-collapse': 'collapse' } }, { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } }, { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } } ]); SOGo-2.1.1b/UI/WebServerResources/ckeditor/LICENSE.md0000644000000000000000000020514112247657030020517 0ustar rootrootSoftware License Agreement ========================== CKEditor - The text editor for Internet - http://ckeditor.com Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. Licensed under the terms of any of the following licenses at your choice: - GNU General Public License Version 2 or later (the "GPL") http://www.gnu.org/licenses/gpl.html (See Appendix A) - GNU Lesser General Public License Version 2.1 or later (the "LGPL") http://www.gnu.org/licenses/lgpl.html (See Appendix B) - Mozilla Public License Version 1.1 or later (the "MPL") http://www.mozilla.org/MPL/MPL-1.1.html (See Appendix C) You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice. In any case, your choice will not restrict any recipient of your version of this software to use, reproduce, modify and distribute this software under any of the above licenses. Sources of Intellectual Property Included in CKEditor ----------------------------------------------------- Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. Trademarks ---------- CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. --- Appendix A: The GPL License --------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software-to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix B: The LGPL License ---------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software-to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages-typically libraries-of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix C: The MPL License --------------------------- MOZILLA PUBLIC LICENSE Version 1.1 1. Definitions. 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. "Executable" means Covered Code in any form other than Source Code. 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8. "License" means this document. 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. B. Any new file that contains any part of the Original Code or previous Modifications. 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4. Intellectual Property Matters (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs. If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. 6. Versions of the License. 6.1. New Versions. Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. 6.3. Derivative Works. If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. TERMINATION. 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. 9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS. The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. 13. MULTIPLE-LICENSED CODE. Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the NPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. EXHIBIT A -Mozilla Public License. ``The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________. Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License." [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/0000755000000000000000000000000012247657030020031 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/pl.js0000644000000000000000000003366512247657030021017 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['pl']={"editor":"Edytor tekstu sformatowanego","editorPanel":"Panel edytora tekstu sformatowanego","common":{"editorHelp":"W celu uzyskania pomocy naciÅ›nij ALT 0","browseServer":"PrzeglÄ…daj","url":"Adres URL","protocol":"Protokół","upload":"WyÅ›lij","uploadSubmit":"WyÅ›lij","image":"Obrazek","flash":"Flash","form":"Formularz","checkbox":"Pole wyboru (checkbox)","radio":"Przycisk opcji (radio)","textField":"Pole tekstowe","textarea":"Obszar tekstowy","hiddenField":"Pole ukryte","button":"Przycisk","select":"Lista wyboru","imageButton":"Przycisk graficzny","notSet":"","id":"Id","name":"Nazwa","langDir":"Kierunek tekstu","langDirLtr":"Od lewej do prawej (LTR)","langDirRtl":"Od prawej do lewej (RTL)","langCode":"Kod jÄ™zyka","longDescr":"Adres URL dÅ‚ugiego opisu","cssClass":"Nazwa klasy CSS","advisoryTitle":"Opis obiektu docelowego","cssStyle":"Styl","ok":"OK","cancel":"Anuluj","close":"Zamknij","preview":"PodglÄ…d","resize":"PrzeciÄ…gnij, aby zmienić rozmiar","generalTab":"Ogólne","advancedTab":"Zaawansowane","validateNumberFailed":"Ta wartość nie jest liczbÄ….","confirmNewPage":"Wszystkie niezapisane zmiany zostanÄ… utracone. Czy na pewno wczytać nowÄ… stronÄ™?","confirmCancel":"Pewne opcje zostaÅ‚y zmienione. Czy na pewno zamknąć okno dialogowe?","options":"Opcje","target":"Obiekt docelowy","targetNew":"Nowe okno (_blank)","targetTop":"Okno najwyżej w hierarchii (_top)","targetSelf":"To samo okno (_self)","targetParent":"Okno nadrzÄ™dne (_parent)","langDirLTR":"Od lewej do prawej (LTR)","langDirRTL":"Od prawej do lewej (RTL)","styles":"Style","cssClasses":"Klasy arkusza stylów","width":"Szerokość","height":"Wysokość","align":"Wyrównaj","alignLeft":"Do lewej","alignRight":"Do prawej","alignCenter":"Do Å›rodka","alignTop":"Do góry","alignMiddle":"Do Å›rodka","alignBottom":"Do doÅ‚u","invalidValue":"NieprawidÅ‚owa wartość.","invalidHeight":"Wysokość musi być liczbÄ….","invalidWidth":"Szerokość musi być liczbÄ….","invalidCssLength":"Wartość podana dla pola \"%1\" musi być liczbÄ… dodatniÄ… bez jednostki lub z poprawnÄ… jednostkÄ… dÅ‚ugoÅ›ci zgodnÄ… z CSS (px, %, in, cm, mm, em, ex, pt lub pc).","invalidHtmlLength":"Wartość podana dla pola \"%1\" musi być liczbÄ… dodatniÄ… bez jednostki lub z poprawnÄ… jednostkÄ… dÅ‚ugoÅ›ci zgodnÄ… z HTML (px lub %).","invalidInlineStyle":"Wartość podana dla stylu musi skÅ‚adać siÄ™ z jednej lub wiÄ™kszej liczby krotek w formacie \"nazwa : wartość\", rozdzielonych Å›rednikami.","cssLengthTooltip":"Wpisz liczbÄ™ dla wartoÅ›ci w pikselach lub liczbÄ™ wraz z jednostkÄ… dÅ‚ugoÅ›ci zgodnÄ… z CSS (px, %, in, cm, mm, em, ex, pt lub pc).","unavailable":"%1, niedostÄ™pne"},"about":{"copy":"Copyright © $1. Wszelkie prawa zastrzeżone.","dlgTitle":"Informacje o programie CKEditor","help":"Pomoc znajdziesz w $1.","moreInfo":"Informacje na temat licencji można znaleźć na naszej stronie:","title":"Informacje o programie CKEditor","userGuide":"podrÄ™czniku użytkownika programu CKEditor"},"basicstyles":{"bold":"Pogrubienie","italic":"Kursywa","strike":"PrzekreÅ›lenie","subscript":"Indeks dolny","superscript":"Indeks górny","underline":"PodkreÅ›lenie"},"clipboard":{"copy":"Kopiuj","copyError":"Ustawienia bezpieczeÅ„stwa Twojej przeglÄ…darki nie pozwalajÄ… na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.","cut":"Wytnij","cutError":"Ustawienia bezpieczeÅ„stwa Twojej przeglÄ…darki nie pozwalajÄ… na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.","paste":"Wklej","pasteArea":"Obszar wklejania","pasteMsg":"Wklej tekst w poniższym polu, używajÄ…c skrótu klawiaturowego (Ctrl/Cmd+V), i kliknij OK.","securityMsg":"Zabezpieczenia przeglÄ…darki uniemożliwiajÄ… wklejenie danych bezpoÅ›rednio do edytora. ProszÄ™ ponownie wkleić dane w tym oknie.","title":"Wklej"},"toolbar":{"toolbarCollapse":"ZwiÅ„ pasek narzÄ™dzi","toolbarExpand":"RozwiÅ„ pasek narzÄ™dzi","toolbarGroups":{"document":"Dokument","clipboard":"Schowek/Wstecz","editing":"Edycja","forms":"Formularze","basicstyles":"Style podstawowe","paragraph":"Akapit","links":"Hiperłącza","insert":"Wstawianie","styles":"Style","colors":"Kolory","tools":"NarzÄ™dzia"},"toolbars":"Paski narzÄ™dzi edytora"},"fakeobjects":{"anchor":"Kotwica","flash":"Animacja Flash","hiddenfield":"Pole ukryte","iframe":"IFrame","unknown":"Nieznany obiekt"},"link":{"acccessKey":"Klawisz dostÄ™pu","advanced":"Zaawansowane","advisoryContentType":"Typ MIME obiektu docelowego","advisoryTitle":"Opis obiektu docelowego","anchor":{"toolbar":"Wstaw/edytuj kotwicÄ™","menu":"WÅ‚aÅ›ciwoÅ›ci kotwicy","title":"WÅ‚aÅ›ciwoÅ›ci kotwicy","name":"Nazwa kotwicy","errorName":"Wpisz nazwÄ™ kotwicy","remove":"UsuÅ„ kotwicÄ™"},"anchorId":"Wg identyfikatora","anchorName":"Wg nazwy","charset":"Kodowanie znaków obiektu docelowego","cssClasses":"Nazwa klasy CSS","emailAddress":"Adres e-mail","emailBody":"Treść","emailSubject":"Temat","id":"Id","info":"Informacje ","langCode":"Kod jÄ™zyka","langDir":"Kierunek tekstu","langDirLTR":"Od lewej do prawej (LTR)","langDirRTL":"Od prawej do lewej (RTL)","menu":"Edytuj odnoÅ›nik","name":"Nazwa","noAnchors":"(W dokumencie nie zdefiniowano żadnych kotwic)","noEmail":"Podaj adres e-mail","noUrl":"Podaj adres URL","other":"","popupDependent":"Okno zależne (Netscape)","popupFeatures":"WÅ‚aÅ›ciwoÅ›ci wyskakujÄ…cego okna","popupFullScreen":"PeÅ‚ny ekran (IE)","popupLeft":"Pozycja w poziomie","popupLocationBar":"Pasek adresu","popupMenuBar":"Pasek menu","popupResizable":"Skalowalny","popupScrollBars":"Paski przewijania","popupStatusBar":"Pasek statusu","popupToolbar":"Pasek narzÄ™dzi","popupTop":"Pozycja w pionie","rel":"Relacja","selectAnchor":"Wybierz kotwicÄ™","styles":"Styl","tabIndex":"Indeks kolejnoÅ›ci","target":"Obiekt docelowy","targetFrame":"","targetFrameName":"Nazwa ramki docelowej","targetPopup":"","targetPopupName":"Nazwa wyskakujÄ…cego okna","title":"OdnoÅ›nik","toAnchor":"OdnoÅ›nik wewnÄ…trz strony (kotwica)","toEmail":"Adres e-mail","toUrl":"Adres URL","toolbar":"Wstaw/edytuj odnoÅ›nik","type":"Typ odnoÅ›nika","unlink":"UsuÅ„ odnoÅ›nik","upload":"WyÅ›lij"},"indent":{"indent":"ZwiÄ™ksz wciÄ™cie","outdent":"Zmniejsz wciÄ™cie"},"list":{"bulletedlist":"Lista wypunktowana","numberedlist":"Lista numerowana"},"pastetext":{"button":"Wklej jako czysty tekst","title":"Wklej jako czysty tekst"},"undo":{"redo":"Ponów","undo":"Cofnij"},"colorbutton":{"auto":"Automatycznie","bgColorTitle":"Kolor tÅ‚a","colors":{"000":"Czarny","800000":"Kasztanowy","8B4513":"Czekoladowy","2F4F4F":"Ciemnografitowy","008080":"Morski","000080":"Granatowy","4B0082":"Indygo","696969":"Ciemnoszary","B22222":"CzerwieÅ„ żelazowa","A52A2A":"BrÄ…zowy","DAA520":"CiemnozÅ‚oty","006400":"Ciemnozielony","40E0D0":"Turkusowy","0000CD":"Ciemnoniebieski","800080":"Purpurowy","808080":"Szary","F00":"Czerwony","FF8C00":"CiemnopomaraÅ„czowy","FFD700":"ZÅ‚oty","008000":"Zielony","0FF":"Cyjan","00F":"Niebieski","EE82EE":"Fioletowy","A9A9A9":"Przygaszony szary","FFA07A":"Åososiowy","FFA500":"PomaraÅ„czowy","FFFF00":"Żółty","00FF00":"Limonkowy","AFEEEE":"Bladoturkusowy","ADD8E6":"Jasnoniebieski","DDA0DD":"Åšliwkowy","D3D3D3":"Jasnoszary","FFF0F5":"Jasnolawendowy","FAEBD7":"KremowobiaÅ‚y","FFFFE0":"Jasnożółty","F0FFF0":"Bladozielony","F0FFFF":"Jasnolazurowy","F0F8FF":"Jasnobłękitny","E6E6FA":"Lawendowy","FFF":"BiaÅ‚y"},"more":"WiÄ™cej kolorów...","panelTitle":"Kolory","textColorTitle":"Kolor tekstu"},"font":{"fontSize":{"label":"Rozmiar","voiceLabel":"Rozmiar czcionki","panelTitle":"Rozmiar"},"label":"Czcionka","panelTitle":"Czcionka","voiceLabel":"Czcionka"},"image":{"alertUrl":"Podaj adres obrazka.","alt":"Tekst zastÄ™pczy","border":"Obramowanie","btnUpload":"WyÅ›lij","button2Img":"Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykÅ‚ego obrazka?","hSpace":"OdstÄ™p poziomy","img2Button":"Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?","infoTab":"Informacje o obrazku","linkTab":"Hiperłącze","lockRatio":"Zablokuj proporcje","menu":"WÅ‚aÅ›ciwoÅ›ci obrazka","resetSize":"Przywróć rozmiar","title":"WÅ‚aÅ›ciwoÅ›ci obrazka","titleButton":"WÅ‚aÅ›ciwoÅ›ci przycisku graficznego","upload":"WyÅ›lij","urlMissing":"Podaj adres URL obrazka.","vSpace":"OdstÄ™p pionowy","validateBorder":"Wartość obramowania musi być liczbÄ… caÅ‚kowitÄ….","validateHSpace":"Wartość odstÄ™pu poziomego musi być liczbÄ… caÅ‚kowitÄ….","validateVSpace":"Wartość odstÄ™pu pionowego musi być liczbÄ… caÅ‚kowitÄ…."},"scayt":{"about":"Informacje o SCAYT","aboutTab":"Informacje o SCAYT","addWord":"Dodaj sÅ‚owo","allCaps":"Ignoruj wyrazy pisane dużymi literami","dic_create":"Utwórz","dic_delete":"UsuÅ„","dic_field_name":"Nazwa sÅ‚ownika","dic_info":"PoczÄ…tkowo sÅ‚ownik użytkownika przechowywany jest w cookie. Pliki cookie majÄ… jednak ograniczonÄ… pojemność. JeÅ›li sÅ‚ownik użytkownika przekroczy wielkość dopuszczalnÄ… dla pliku cookie, możliwe jest przechowanie go na naszym serwerze. W celu zapisania sÅ‚ownika na serwerze niezbÄ™dne jest nadanie mu nazwy. JeÅ›li sÅ‚ownik zostaÅ‚ już zapisany na serwerze, wystarczy podać jego nazwÄ™ i nacisnąć przycisk Przywróć.","dic_rename":"ZmieÅ„ nazwÄ™","dic_restore":"Przywróć","dictionariesTab":"SÅ‚owniki","disable":"Wyłącz SCAYT","emptyDic":"Nazwa sÅ‚ownika nie może być pusta.","enable":"Włącz SCAYT","ignore":"Ignoruj","ignoreAll":"Ignoruj wszystkie","ignoreDomainNames":"Ignoruj nazwy domen","langs":"JÄ™zyki","languagesTab":"JÄ™zyki","mixedCase":"Ignoruj wyrazy pisane dużymi i maÅ‚ymi literami","mixedWithDigits":"Ignoruj wyrazy zawierajÄ…ce cyfry","moreSuggestions":"WiÄ™cej sugestii","opera_title":"Funkcja nie jest obsÅ‚ugiwana przez przeglÄ…darkÄ™ Opera","options":"Opcje","optionsTab":"Opcje","title":"Sprawdź pisowniÄ™ podczas pisania (SCAYT)","toggle":"Przełącz SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adres","tag_div":"Normalny (DIV)","tag_h1":"Nagłówek 1","tag_h2":"Nagłówek 2","tag_h3":"Nagłówek 3","tag_h4":"Nagłówek 4","tag_h5":"Nagłówek 5","tag_h6":"Nagłówek 6","tag_p":"Normalny","tag_pre":"Tekst sformatowany"},"justify":{"block":"Wyjustuj","center":"WyÅ›rodkuj","left":"Wyrównaj do lewej","right":"Wyrównaj do prawej"},"wsc":{"btnIgnore":"Ignoruj","btnIgnoreAll":"Ignoruj wszystkie","btnReplace":"ZmieÅ„","btnReplaceAll":"ZmieÅ„ wszystkie","btnUndo":"Cofnij","changeTo":"ZmieÅ„ na","errorLoading":"Błąd wczytywania hosta aplikacji usÅ‚ugi: %s.","ieSpellDownload":"SÅ‚ownik nie jest zainstalowany. Czy chcesz go pobrać?","manyChanges":"Sprawdzanie zakoÅ„czone: zmieniono %l słów","noChanges":"Sprawdzanie zakoÅ„czone: nie zmieniono żadnego sÅ‚owa","noMispell":"Sprawdzanie zakoÅ„czone: nie znaleziono błędów","noSuggestions":"- Brak sugestii -","notAvailable":"Przepraszamy, ale usÅ‚uga jest obecnie niedostÄ™pna.","notInDic":"SÅ‚owa nie ma w sÅ‚owniku","oneChange":"Sprawdzanie zakoÅ„czone: zmieniono jedno sÅ‚owo","progress":"Trwa sprawdzanie...","title":"Sprawdź pisowniÄ™","toolbar":"Sprawdź pisowniÄ™"},"colordialog":{"clear":"Wyczyść","highlight":"Zaznacz","options":"Opcje koloru","selected":"Wybrany","title":"Wybierz kolor"},"contextmenu":{"options":"Opcje menu kontekstowego"},"blockquote":{"toolbar":"Cytat"},"table":{"border":"Grubość obramowania","caption":"TytuÅ‚","cell":{"menu":"Komórka","insertBefore":"Wstaw komórkÄ™ z lewej","insertAfter":"Wstaw komórkÄ™ z prawej","deleteCell":"UsuÅ„ komórki","merge":"Połącz komórki","mergeRight":"Połącz z komórkÄ… z prawej","mergeDown":"Połącz z komórkÄ… poniżej","splitHorizontal":"Podziel komórkÄ™ poziomo","splitVertical":"Podziel komórkÄ™ pionowo","title":"WÅ‚aÅ›ciwoÅ›ci komórki","cellType":"Typ komórki","rowSpan":"Scalenie wierszy","colSpan":"Scalenie komórek","wordWrap":"Zawijanie słów","hAlign":"Wyrównanie poziome","vAlign":"Wyrównanie pionowe","alignBaseline":"Linia bazowa","bgColor":"Kolor tÅ‚a","borderColor":"Kolor obramowania","data":"Dane","header":"Nagłówek","yes":"Tak","no":"Nie","invalidWidth":"Szerokość komórki musi być liczbÄ….","invalidHeight":"Wysokość komórki musi być liczbÄ….","invalidRowSpan":"Scalenie wierszy musi być liczbÄ… caÅ‚kowitÄ….","invalidColSpan":"Scalenie komórek musi być liczbÄ… caÅ‚kowitÄ….","chooseColor":"Wybierz"},"cellPad":"DopeÅ‚nienie komórek","cellSpace":"OdstÄ™p pomiÄ™dzy komórkami","column":{"menu":"Kolumna","insertBefore":"Wstaw kolumnÄ™ z lewej","insertAfter":"Wstaw kolumnÄ™ z prawej","deleteColumn":"UsuÅ„ kolumny"},"columns":"Liczba kolumn","deleteTable":"UsuÅ„ tabelÄ™","headers":"Nagłówki","headersBoth":"Oba","headersColumn":"Pierwsza kolumna","headersNone":"Brak","headersRow":"Pierwszy wiersz","invalidBorder":"Wartość obramowania musi być liczbÄ….","invalidCellPadding":"DopeÅ‚nienie komórek musi być liczbÄ… dodatniÄ….","invalidCellSpacing":"OdstÄ™p pomiÄ™dzy komórkami musi być liczbÄ… dodatniÄ….","invalidCols":"Liczba kolumn musi być wiÄ™ksza niż 0.","invalidHeight":"Wysokość tabeli musi być liczbÄ….","invalidRows":"Liczba wierszy musi być wiÄ™ksza niż 0.","invalidWidth":"Szerokość tabeli musi być liczbÄ….","menu":"WÅ‚aÅ›ciwoÅ›ci tabeli","row":{"menu":"Wiersz","insertBefore":"Wstaw wiersz powyżej","insertAfter":"Wstaw wiersz poniżej","deleteRow":"UsuÅ„ wiersze"},"rows":"Liczba wierszy","summary":"Podsumowanie","title":"WÅ‚aÅ›ciwoÅ›ci tabeli","toolbar":"Tabela","widthPc":"%","widthPx":"piksele","widthUnit":"jednostka szerokoÅ›ci"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Opis obiektu docelowego","cssClassInputLabel":"Klasy arkusza stylów","edit":"Edytuj pojemnik Div","inlineStyleInputLabel":"Style liniowe","langDirLTRLabel":"Od lewej do prawej (LTR)","langDirLabel":"Kierunek tekstu","langDirRTLLabel":"Od prawej do lewej (RTL)","languageCodeInputLabel":"Kod jÄ™zyka","remove":"UsuÅ„ pojemnik Div","styleSelectLabel":"Styl","title":"Utwórz pojemnik Div","toolbar":"Utwórz pojemnik Div"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/fi.js0000644000000000000000000003263312247657030020774 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['fi']={"editor":"Rikastekstieditori","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Paina ALT 0 nähdäksesi ohjeen","browseServer":"Selaa palvelinta","url":"Osoite","protocol":"Protokolla","upload":"Lisää tiedosto","uploadSubmit":"Lähetä palvelimelle","image":"Kuva","flash":"Flash-animaatio","form":"Lomake","checkbox":"Valintaruutu","radio":"Radiopainike","textField":"Tekstikenttä","textarea":"Tekstilaatikko","hiddenField":"Piilokenttä","button":"Painike","select":"Valintakenttä","imageButton":"Kuvapainike","notSet":"","id":"Tunniste","name":"Nimi","langDir":"Kielen suunta","langDirLtr":"Vasemmalta oikealle (LTR)","langDirRtl":"Oikealta vasemmalle (RTL)","langCode":"Kielikoodi","longDescr":"Pitkän kuvauksen URL","cssClass":"Tyyliluokat","advisoryTitle":"Avustava otsikko","cssStyle":"Tyyli","ok":"OK","cancel":"Peruuta","close":"Sulje","preview":"Esikatselu","resize":"Raahaa muuttaaksesi kokoa","generalTab":"Yleinen","advancedTab":"Lisäominaisuudet","validateNumberFailed":"Arvon pitää olla numero.","confirmNewPage":"Kaikki tallentamattomat muutokset tähän sisältöön menetetään. Oletko varma, että haluat ladata uuden sivun?","confirmCancel":"Jotkut asetuksista on muuttuneet. Oletko varma, että haluat sulkea valintaikkunan?","options":"Asetukset","target":"Kohde","targetNew":"Uusi ikkuna (_blank)","targetTop":"Päällimmäinen ikkuna (_top)","targetSelf":"Sama ikkuna (_self)","targetParent":"Ylemmän tason ikkuna (_parent)","langDirLTR":"Vasemmalta oikealle (LTR)","langDirRTL":"Oikealta vasemmalle (RTL)","styles":"Tyyli","cssClasses":"Tyylitiedoston luokat","width":"Leveys","height":"Korkeus","align":"Kohdistus","alignLeft":"Vasemmalle","alignRight":"Oikealle","alignCenter":"Keskelle","alignTop":"Ylös","alignMiddle":"Keskelle","alignBottom":"Alas","invalidValue":"Virheellinen arvo.","invalidHeight":"Korkeuden täytyy olla numero.","invalidWidth":"Leveyden täytyy olla numero.","invalidCssLength":"Kentän \"%1\" arvon täytyy olla positiivinen luku CSS mittayksikön (px, %, in, cm, mm, em, ex, pt tai pc) kanssa tai ilman.","invalidHtmlLength":"Kentän \"%1\" arvon täytyy olla positiivinen luku HTML mittayksikön (px tai %) kanssa tai ilman.","invalidInlineStyle":"Tyylille annetun arvon täytyy koostua yhdestä tai useammasta \"nimi : arvo\" parista, jotka ovat eroteltuna toisistaan puolipisteillä.","cssLengthTooltip":"Anna numeroarvo pikseleinä tai numeroarvo CSS mittayksikön kanssa (px, %, in, cm, mm, em, ex, pt, tai pc).","unavailable":"%1, ei saatavissa"},"about":{"copy":"Copyright © $1. Kaikki oikeuden pidätetään.","dlgTitle":"Tietoa CKEditorista","help":"Katso ohjeet: $1.","moreInfo":"Lisenssitiedot löytyvät kotisivuiltamme:","title":"Tietoa CKEditorista","userGuide":"CKEditorin käyttäjäopas"},"basicstyles":{"bold":"Lihavoitu","italic":"Kursivoitu","strike":"Yliviivattu","subscript":"Alaindeksi","superscript":"Yläindeksi","underline":"Alleviivattu"},"clipboard":{"copy":"Kopioi","copyError":"Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).","cut":"Leikkaa","cutError":"Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).","paste":"Liitä","pasteArea":"Leikealue","pasteMsg":"Liitä painamalla (Ctrl+V) ja painamalla OK.","securityMsg":"Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.","title":"Liitä"},"toolbar":{"toolbarCollapse":"Kutista työkalupalkki","toolbarExpand":"Laajenna työkalupalkki","toolbarGroups":{"document":"Dokumentti","clipboard":"Leikepöytä/Kumoa","editing":"Muokkaus","forms":"Lomakkeet","basicstyles":"Perustyylit","paragraph":"Kappale","links":"Linkit","insert":"Lisää","styles":"Tyylit","colors":"Värit","tools":"Työkalut"},"toolbars":"Editorin työkalupalkit"},"fakeobjects":{"anchor":"Ankkuri","flash":"Flash animaatio","hiddenfield":"Piilokenttä","iframe":"IFrame-kehys","unknown":"Tuntematon objekti"},"link":{"acccessKey":"Pikanäppäin","advanced":"Lisäominaisuudet","advisoryContentType":"Avustava sisällön tyyppi","advisoryTitle":"Avustava otsikko","anchor":{"toolbar":"Lisää ankkuri/muokkaa ankkuria","menu":"Ankkurin ominaisuudet","title":"Ankkurin ominaisuudet","name":"Nimi","errorName":"Ankkurille on kirjoitettava nimi","remove":"Poista ankkuri"},"anchorId":"Ankkurin ID:n mukaan","anchorName":"Ankkurin nimen mukaan","charset":"Linkitetty kirjaimisto","cssClasses":"Tyyliluokat","emailAddress":"Sähköpostiosoite","emailBody":"Viesti","emailSubject":"Aihe","id":"Tunniste","info":"Linkin tiedot","langCode":"Kielen suunta","langDir":"Kielen suunta","langDirLTR":"Vasemmalta oikealle (LTR)","langDirRTL":"Oikealta vasemmalle (RTL)","menu":"Muokkaa linkkiä","name":"Nimi","noAnchors":"(Ei ankkureita tässä dokumentissa)","noEmail":"Kirjoita sähköpostiosoite","noUrl":"Linkille on kirjoitettava URL","other":"","popupDependent":"Riippuva (Netscape)","popupFeatures":"Popup ikkunan ominaisuudet","popupFullScreen":"Täysi ikkuna (IE)","popupLeft":"Vasemmalta (px)","popupLocationBar":"Osoiterivi","popupMenuBar":"Valikkorivi","popupResizable":"Venytettävä","popupScrollBars":"Vierityspalkit","popupStatusBar":"Tilarivi","popupToolbar":"Vakiopainikkeet","popupTop":"Ylhäältä (px)","rel":"Suhde","selectAnchor":"Valitse ankkuri","styles":"Tyyli","tabIndex":"Tabulaattori indeksi","target":"Kohde","targetFrame":"","targetFrameName":"Kohdekehyksen nimi","targetPopup":"","targetPopupName":"Popup ikkunan nimi","title":"Linkki","toAnchor":"Ankkuri tässä sivussa","toEmail":"Sähköposti","toUrl":"Osoite","toolbar":"Lisää linkki/muokkaa linkkiä","type":"Linkkityyppi","unlink":"Poista linkki","upload":"Lisää tiedosto"},"indent":{"indent":"Suurenna sisennystä","outdent":"Pienennä sisennystä"},"list":{"bulletedlist":"Luettelomerkit","numberedlist":"Numerointi"},"pastetext":{"button":"Liitä tekstinä","title":"Liitä tekstinä"},"undo":{"redo":"Toista","undo":"Kumoa"},"colorbutton":{"auto":"Automaattinen","bgColorTitle":"Taustaväri","colors":{"000":"Musta","800000":"Kastanjanruskea","8B4513":"Satulanruskea","2F4F4F":"Tumma liuskekivenharmaa","008080":"Sinivihreä","000080":"Laivastonsininen","4B0082":"Indigonsininen","696969":"Tummanharmaa","B22222":"Tiili","A52A2A":"Ruskea","DAA520":"Kultapiisku","006400":"Tummanvihreä","40E0D0":"Turkoosi","0000CD":"Keskisininen","800080":"Purppura","808080":"Harmaa","F00":"Punainen","FF8C00":"Tumma oranssi","FFD700":"Kulta","008000":"Vihreä","0FF":"Syaani","00F":"Sininen","EE82EE":"Violetti","A9A9A9":"Tummanharmaa","FFA07A":"Vaaleanlohenpunainen","FFA500":"Oranssi","FFFF00":"Keltainen","00FF00":"Limetin vihreä","AFEEEE":"Haalea turkoosi","ADD8E6":"Vaaleansininen","DDA0DD":"Luumu","D3D3D3":"Vaaleanharmaa","FFF0F5":"Laventelinpunainen","FAEBD7":"Antiikinvalkoinen","FFFFE0":"Vaaleankeltainen","F0FFF0":"Hunajameloni","F0FFFF":"Asurinsininen","F0F8FF":"Alice Blue -sininen","E6E6FA":"Lavanteli","FFF":"Valkoinen"},"more":"Lisää värejä...","panelTitle":"Värit","textColorTitle":"Tekstiväri"},"font":{"fontSize":{"label":"Koko","voiceLabel":"Kirjaisimen koko","panelTitle":"Koko"},"label":"Kirjaisinlaji","panelTitle":"Kirjaisinlaji","voiceLabel":"Kirjaisinlaji"},"image":{"alertUrl":"Kirjoita kuvan osoite (URL)","alt":"Vaihtoehtoinen teksti","border":"Kehys","btnUpload":"Lähetä palvelimelle","button2Img":"Haluatko muuntaa valitun kuvanäppäimen kuvaksi?","hSpace":"Vaakatila","img2Button":"Haluatko muuntaa valitun kuvan kuvanäppäimeksi?","infoTab":"Kuvan tiedot","linkTab":"Linkki","lockRatio":"Lukitse suhteet","menu":"Kuvan ominaisuudet","resetSize":"Alkuperäinen koko","title":"Kuvan ominaisuudet","titleButton":"Kuvapainikkeen ominaisuudet","upload":"Lisää kuva","urlMissing":"Kuvan lähdeosoite puuttuu.","vSpace":"Pystytila","validateBorder":"Kehyksen täytyy olla kokonaisluku.","validateHSpace":"HSpace-määrityksen täytyy olla kokonaisluku.","validateVSpace":"VSpace-määrityksen täytyy olla kokonaisluku."},"scayt":{"about":"Tietoja oikoluvusta kirjoitetaessa","aboutTab":"Tietoa","addWord":"Lisää sana","allCaps":"Ohita sanat, jotka on kirjoitettu kokonaan isoilla kirjaimilla","dic_create":"Luo","dic_delete":"Poista","dic_field_name":"Sanakirjan nimi","dic_info":"Oletuksena sanakirjat tallennetaan evästeeseen, mutta evästeiden koko on kuitenkin rajallinen. Sanakirjan kasvaessa niin suureksi, ettei se enää mahdu evästeeseen, sanakirja täytyy tallentaa palvelimellemme. Tallentaaksesi sanakirjasi palvelimellemme tulee sinun antaa sille nimi. Jos olet jo tallentanut sanakirjan, anna sen nimi ja klikkaa Palauta-painiketta","dic_rename":"Nimeä uudelleen","dic_restore":"Palauta","dictionariesTab":"Sanakirjat","disable":"Poista käytöstä oikoluku kirjoitetaessa","emptyDic":"Sanakirjan nimi on annettava.","enable":"Ota käyttöön oikoluku kirjoitettaessa","ignore":"Ohita","ignoreAll":"Ohita kaikki","ignoreDomainNames":"Ohita verkkotunnukset","langs":"Kielet","languagesTab":"Kielet","mixedCase":"Ohita sanat, joissa on sekoitettu isoja ja pieniä kirjaimia","mixedWithDigits":"Ohita sanat, joissa on numeroita","moreSuggestions":"Lisää ehdotuksia","opera_title":"Opera ei tue tätä ominaisuutta","options":"Asetukset","optionsTab":"Asetukset","title":"Oikolue kirjoitettaessa","toggle":"Vaihda oikoluku kirjoittaessa tilaa","noSuggestions":"No suggestion"},"format":{"label":"Muotoilu","panelTitle":"Muotoilu","tag_address":"Osoite","tag_div":"Normaali (DIV)","tag_h1":"Otsikko 1","tag_h2":"Otsikko 2","tag_h3":"Otsikko 3","tag_h4":"Otsikko 4","tag_h5":"Otsikko 5","tag_h6":"Otsikko 6","tag_p":"Normaali","tag_pre":"Muotoiltu"},"justify":{"block":"Tasaa molemmat reunat","center":"Keskitä","left":"Tasaa vasemmat reunat","right":"Tasaa oikeat reunat"},"wsc":{"btnIgnore":"Jätä huomioimatta","btnIgnoreAll":"Jätä kaikki huomioimatta","btnReplace":"Korvaa","btnReplaceAll":"Korvaa kaikki","btnUndo":"Kumoa","changeTo":"Vaihda","errorLoading":"Virhe ladattaessa oikolukupalvelua isännältä: %s.","ieSpellDownload":"Oikeinkirjoituksen tarkistusta ei ole asennettu. Haluatko ladata sen nyt?","manyChanges":"Tarkistus valmis: %1 sanaa muutettiin","noChanges":"Tarkistus valmis: Yhtään sanaa ei muutettu","noMispell":"Tarkistus valmis: Ei virheitä","noSuggestions":"Ei ehdotuksia","notAvailable":"Valitettavasti oikoluku ei ole käytössä tällä hetkellä.","notInDic":"Ei sanakirjassa","oneChange":"Tarkistus valmis: Yksi sana muutettiin","progress":"Tarkistus käynnissä...","title":"Oikoluku","toolbar":"Tarkista oikeinkirjoitus"},"colordialog":{"clear":"Poista","highlight":"Korostus","options":"Värin ominaisuudet","selected":"Valittu","title":"Valitse väri"},"contextmenu":{"options":"Pikavalikon ominaisuudet"},"blockquote":{"toolbar":"Lainaus"},"table":{"border":"Rajan paksuus","caption":"Otsikko","cell":{"menu":"Solu","insertBefore":"Lisää solu eteen","insertAfter":"Lisää solu perään","deleteCell":"Poista solut","merge":"Yhdistä solut","mergeRight":"Yhdistä oikealla olevan kanssa","mergeDown":"Yhdistä alla olevan kanssa","splitHorizontal":"Jaa solu vaakasuunnassa","splitVertical":"Jaa solu pystysuunnassa","title":"Solun ominaisuudet","cellType":"Solun tyyppi","rowSpan":"Rivin jatkuvuus","colSpan":"Solun jatkuvuus","wordWrap":"Rivitys","hAlign":"Horisontaali kohdistus","vAlign":"Vertikaali kohdistus","alignBaseline":"Alas (teksti)","bgColor":"Taustan väri","borderColor":"Reunan väri","data":"Data","header":"Ylätunniste","yes":"Kyllä","no":"Ei","invalidWidth":"Solun leveyden täytyy olla numero.","invalidHeight":"Solun korkeuden täytyy olla numero.","invalidRowSpan":"Rivin jatkuvuuden täytyy olla kokonaisluku.","invalidColSpan":"Solun jatkuvuuden täytyy olla kokonaisluku.","chooseColor":"Valitse"},"cellPad":"Solujen sisennys","cellSpace":"Solujen väli","column":{"menu":"Sarake","insertBefore":"Lisää sarake vasemmalle","insertAfter":"Lisää sarake oikealle","deleteColumn":"Poista sarakkeet"},"columns":"Sarakkeet","deleteTable":"Poista taulu","headers":"Ylätunnisteet","headersBoth":"Molemmat","headersColumn":"Ensimmäinen sarake","headersNone":"Ei","headersRow":"Ensimmäinen rivi","invalidBorder":"Reunan koon täytyy olla numero.","invalidCellPadding":"Solujen sisennyksen täytyy olla numero.","invalidCellSpacing":"Solujen välin täytyy olla numero.","invalidCols":"Sarakkeiden määrän täytyy olla suurempi kuin 0.","invalidHeight":"Taulun korkeuden täytyy olla numero.","invalidRows":"Rivien määrän täytyy olla suurempi kuin 0.","invalidWidth":"Taulun leveyden täytyy olla numero.","menu":"Taulun ominaisuudet","row":{"menu":"Rivi","insertBefore":"Lisää rivi yläpuolelle","insertAfter":"Lisää rivi alapuolelle","deleteRow":"Poista rivit"},"rows":"Rivit","summary":"Yhteenveto","title":"Taulun ominaisuudet","toolbar":"Taulu","widthPc":"prosenttia","widthPx":"pikseliä","widthUnit":"leveysyksikkö"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Ohjeistava otsikko","cssClassInputLabel":"Tyylitiedoston luokat","edit":"Muokkaa Diviä","inlineStyleInputLabel":"Sisätyyli","langDirLTRLabel":"Vasemmalta oikealle (LTR)","langDirLabel":"Kielen suunta","langDirRTLLabel":"Oikealta vasemmalle (RTL)","languageCodeInputLabel":" Kielen koodi","remove":"Poista Div","styleSelectLabel":"Tyyli","title":"Luo div-kehikko","toolbar":"Luo div-kehikko"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/en.js0000644000000000000000000003073412247657030021000 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['en']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Alignment","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1, unavailable"},"about":{"copy":"Copyright © $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"","targetFrameName":"Target Frame Name","targetPopup":"","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"undo":{"redo":"Redo","undo":"Undo"},"colorbutton":{"auto":"Automatic","bgColorTitle":"Background Color","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"More Colors...","panelTitle":"Colors","textColorTitle":"Text Color"},"font":{"fontSize":{"label":"Size","voiceLabel":"Font Size","panelTitle":"Font Size"},"label":"Font","panelTitle":"Font Name","voiceLabel":"Font"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"justify":{"block":"Justify","center":"Center","left":"Align Left","right":"Align Right"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"contextmenu":{"options":"Context Menu Options"},"blockquote":{"toolbar":"Block Quote"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/cy.js0000644000000000000000000003203512247657030021005 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['cy']={"editor":"Golygydd Testun Cyfoethog","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Gwasgwch ALT 0 am gymorth","browseServer":"Pori'r Gweinydd","url":"URL","protocol":"Protocol","upload":"Lanlwytho","uploadSubmit":"Anfon i'r Gweinydd","image":"Delwedd","flash":"Flash","form":"Ffurflen","checkbox":"Blwch ticio","radio":"Botwm Radio","textField":"Maes Testun","textarea":"Ardal Testun","hiddenField":"Maes Cudd","button":"Botwm","select":"Maes Dewis","imageButton":"Botwm Delwedd","notSet":"","id":"Id","name":"Name","langDir":"Cyfeiriad Iaith","langDirLtr":"Chwith i'r Dde (LTR)","langDirRtl":"Dde i'r Chwith (RTL)","langCode":"Cod Iaith","longDescr":"URL Disgrifiad Hir","cssClass":"Dosbarthiadau Dalen Arddull","advisoryTitle":"Teitl Cynghorol","cssStyle":"Arddull","ok":"Iawn","cancel":"Diddymu","close":"Cau","preview":"Rhagolwg","resize":"Ailfeintio","generalTab":"Cyffredinol","advancedTab":"Uwch","validateNumberFailed":"'Dyw'r gwerth hwn ddim yn rhif.","confirmNewPage":"Byddwch chi'n colli unrhyw newidiadau i'r cynnwys sydd heb eu cadw. Ydych am barhau i lwytho tudalen newydd?","confirmCancel":"Cafodd rhai o'r opsiynau eu newid. Ydych chi wir am gau'r deialog?","options":"Opsiynau","target":"Targed","targetNew":"Ffenest Newydd (_blank)","targetTop":"Ffenest ar y Brig (_top)","targetSelf":"Yr un Ffenest (_self)","targetParent":"Ffenest y Rhiant (_parent)","langDirLTR":"Chwith i'r Dde (LTR)","langDirRTL":"Dde i'r Chwith (RTL)","styles":"Arddull","cssClasses":"Dosbarthiadau Dalen Arddull","width":"Lled","height":"Uchder","align":"Alinio","alignLeft":"Chwith","alignRight":"Dde","alignCenter":"Canol","alignTop":"Brig","alignMiddle":"Canol","alignBottom":"Gwaelod","invalidValue":"Gwerth annilys.","invalidHeight":"Mae'n rhaid i'r uchder fod yn rhif.","invalidWidth":"Mae'n rhaid i'r lled fod yn rhif.","invalidCssLength":"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad CSS dilys (px, %, in, cm, mm, em, ex, pt, neu pc).","invalidHtmlLength":"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad HTML dilys (px neu %).","invalidInlineStyle":"Mae'n rhaid i'r gwerth ar gyfer arddull mewn-llinell gynnwys un set neu fwy ar y fformat \"enw : gwerth\", wedi'u gwahanu gyda hanner colon.","cssLengthTooltip":"Rhowch rif am werth mewn picsel neu rhif gydag uned CSS dilys (px, %, in, cm, mm, em, pt neu pc).","unavailable":"%1, ddim ar gael"},"about":{"copy":"Hawlfraint © $1. Cedwir pob hawl.","dlgTitle":"Ynghylch CKEditor","help":"Gwirio $1 am gymorth.","moreInfo":"Am wybodaeth ynghylch trwyddedau, ewch i'n gwefan:","title":"Ynghylch CKEditor","userGuide":"Canllawiau Defnyddiwr CKEditor"},"basicstyles":{"bold":"Bras","italic":"Italig","strike":"Llinell Trwyddo","subscript":"Is-sgript","superscript":"Uwchsgript","underline":"Tanlinellu"},"clipboard":{"copy":"Copïo","copyError":"'Dyw gosodiadau diogelwch eich porwr ddim yn caniatàu'r golygydd i gynnal 'gweithredoedd copïo' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).","cut":"Torri","cutError":"Nid yw gosodiadau diogelwch eich porwr yn caniatàu'r golygydd i gynnal 'gweithredoedd torri' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).","paste":"Gludo","pasteArea":"Ardal Gludo","pasteMsg":"Gludwch i mewn i'r blwch canlynol gan ddefnyddio'r bysellfwrdd (Ctrl/Cmd+V) a phwyso Iawn.","securityMsg":"Oherwydd gosodiadau diogelwch eich porwr, 'dyw'r porwr ddim yn gallu ennill mynediad i'r data ar y clipfwrdd yn uniongyrchol. Mae angen i chi ei ludo eto i'r ffenestr hon.","title":"Gludo"},"toolbar":{"toolbarCollapse":"Cyfangu'r Bar Offer","toolbarExpand":"Ehangu'r Bar Offer","toolbarGroups":{"document":"Dogfen","clipboard":"Clipfwrdd/Dadwneud","editing":"Golygu","forms":"Ffurflenni","basicstyles":"Arddulliau Sylfaenol","paragraph":"Paragraff","links":"Dolenni","insert":"Mewnosod","styles":"Arddulliau","colors":"Lliwiau","tools":"Offer"},"toolbars":"Bariau offer golygydd"},"fakeobjects":{"anchor":"Angor","flash":"Animeiddiant Flash","hiddenfield":"Maes Cudd","iframe":"IFrame","unknown":"Gwrthrych Anhysbys"},"link":{"acccessKey":"Allwedd Mynediad","advanced":"Uwch","advisoryContentType":"Math y Cynnwys Cynghorol","advisoryTitle":"Teitl Cynghorol","anchor":{"toolbar":"Angor","menu":"Golygwch yr Angor","title":"Priodweddau'r Angor","name":"Enw'r Angor","errorName":"Teipiwch enw'r angor","remove":"Tynnwch yr Angor"},"anchorId":"Gan Id yr Elfen","anchorName":"Gan Enw'r Angor","charset":"Set nodau'r Adnodd Cysylltiedig","cssClasses":"Dosbarthiadau Dalen Arddull","emailAddress":"Cyfeiriad E-Bost","emailBody":"Pwnc y Neges","emailSubject":"Testun y Message Subject","id":"Id","info":"Gwyb ar y Ddolen","langCode":"Cod Iaith","langDir":"Cyfeiriad Iaith","langDirLTR":"Chwith i'r Dde (LTR)","langDirRTL":"Dde i'r Chwith (RTL)","menu":"Golygu Dolen","name":"Enw","noAnchors":"(Dim angorau ar gael yn y ddogfen)","noEmail":"Teipiwch gyfeiriad yr e-bost","noUrl":"Teipiwch URL y ddolen","other":"","popupDependent":"Dibynnol (Netscape)","popupFeatures":"Nodweddion Ffenestr Bop","popupFullScreen":"Sgrin Llawn (IE)","popupLeft":"Safle Chwith","popupLocationBar":"Bar Safle","popupMenuBar":"Dewislen","popupResizable":"Ailfeintiol","popupScrollBars":"Barrau Sgrolio","popupStatusBar":"Bar Statws","popupToolbar":"Bar Offer","popupTop":"Safle Top","rel":"Perthynas","selectAnchor":"Dewiswch Angor","styles":"Arddull","tabIndex":"Indecs Tab","target":"Targed","targetFrame":"","targetFrameName":"Enw Ffrâm y Targed","targetPopup":"","targetPopupName":"Enw Ffenestr Bop","title":"Dolen","toAnchor":"Dolen at angor yn y testun","toEmail":"E-bost","toUrl":"URL","toolbar":"Dolen","type":"Math y Ddolen","unlink":"Datgysylltu","upload":"Lanlwytho"},"indent":{"indent":"Cynyddu'r Mewnoliad","outdent":"Lleihau'r Mewnoliad"},"list":{"bulletedlist":"Mewnosod/Tynnu Rhestr Bwled","numberedlist":"Mewnosod/Tynnu Rhestr Rhifol"},"pastetext":{"button":"Gludo fel testun plaen","title":"Gludo fel Testun Plaen"},"undo":{"redo":"Ailwneud","undo":"Dadwneud"},"colorbutton":{"auto":"Awtomatig","bgColorTitle":"Lliw Cefndir","colors":{"000":"Du","800000":"Marwn","8B4513":"Brown Cyfrwy","2F4F4F":"Llechen Tywyll","008080":"Corhwyad","000080":"Nefi","4B0082":"Indigo","696969":"Llwyd Tywyll","B22222":"Bric Tân","A52A2A":"Brown","DAA520":"Rhoden Aur","006400":"Gwyrdd Tywyll","40E0D0":"Gwyrddlas","0000CD":"Glas Canolig","800080":"Porffor","808080":"Llwyd","F00":"Coch","FF8C00":"Oren Tywyll","FFD700":"Aur","008000":"Gwyrdd","0FF":"Cyan","00F":"Glas","EE82EE":"Fioled","A9A9A9":"Llwyd Pwl","FFA07A":"Samwn Golau","FFA500":"Oren","FFFF00":"Melyn","00FF00":"Leim","AFEEEE":"Gwyrddlas Golau","ADD8E6":"Glas Golau","DDA0DD":"Eirinen","D3D3D3":"Llwyd Golau","FFF0F5":"Gwrid Lafant","FAEBD7":"Gwyn Hynafol","FFFFE0":"Melyn Golau","F0FFF0":"Melwn Gwyrdd Golau","F0FFFF":"Aswr","F0F8FF":"Glas Alys","E6E6FA":"Lafant","FFF":"Gwyn"},"more":"Mwy o Liwiau...","panelTitle":"Lliwiau","textColorTitle":"Lliw Testun"},"font":{"fontSize":{"label":"Maint","voiceLabel":"Maint y Ffont","panelTitle":"Maint y Ffont"},"label":"Ffont","panelTitle":"Enw'r Ffont","voiceLabel":"Ffont"},"image":{"alertUrl":"Rhowch URL y ddelwedd","alt":"Testun Amgen","border":"Ymyl","btnUpload":"Anfon i'r Gweinydd","button2Img":"Ydych am drawsffurfio'r botwm ddelwedd hwn ar ddelwedd syml?","hSpace":"BwlchLl","img2Button":"Ydych am drawsffurfio'r ddelwedd hon ar fotwm delwedd?","infoTab":"Gwyb Delwedd","linkTab":"Dolen","lockRatio":"Cloi Cymhareb","menu":"Priodweddau Delwedd","resetSize":"Ailosod Maint","title":"Priodweddau Delwedd","titleButton":"Priodweddau Botwm Delwedd","upload":"lanlwytho","urlMissing":"URL gwreiddiol y ddelwedd ar goll.","vSpace":"BwlchF","validateBorder":"Rhaid i'r ymyl fod yn gyfanrif.","validateHSpace":"Rhaid i'r HSpace fod yn gyfanrif.","validateVSpace":"Rhaid i'r VSpace fod yn gyfanrif."},"scayt":{"about":"Ynghylch SCAYT","aboutTab":"Ynghylch","addWord":"Ychwanegu Gair","allCaps":"Anwybyddu Geiriau Nodau Uwch i Gyd","dic_create":"Creu","dic_delete":"Dileu","dic_field_name":"Enw'r geiriadur","dic_info":"Ar y cychwyn, caiff y Geiriadur ei storio mewn Cwci. Er, mae terfyn ar faint cwcis. Pan fydd Gweiriadur Defnyddiwr yn tyfu tu hwnt i gyfyngiadau maint Cwci, caiff y geiriadur ei storio ar ein gweinydd ni. er mwyn storio eich geiriadur poersonol chi ar ein gweinydd, bydd angen i chi osod enw ar gyfer y geiriadur. Os oes geiriadur 'da chi ar ein gweinydd yn barod, teipiwch ei enw a chliciwch y botwm Adfer.","dic_rename":"Ailenwi","dic_restore":"Adfer","dictionariesTab":"Geiriaduron","disable":"Analluogi SCAYT","emptyDic":"Ni ddylai enw'r geiriadur fod yn wag.","enable":"Galluogi SCAYT","ignore":"Anwybyddu","ignoreAll":"Anwybyddu pob","ignoreDomainNames":"Anwybyddu Enwau Parth","langs":"Ieithoedd","languagesTab":"Ieithoedd","mixedCase":"Anwybyddu Geiriau â Chymysgedd Nodau Uwch ac Is","mixedWithDigits":"Anwybyddu Geiriau â Rhifau","moreSuggestions":"Awgrymiadau pellach","opera_title":"Heb ei gynnal gan Opera","options":"Opsiynau","optionsTab":"Opsiynau","title":"Gwirio'r Sillafu Wrth Deipio","toggle":"Togl SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Fformat","panelTitle":"Fformat Paragraff","tag_address":"Cyfeiriad","tag_div":"Normal (DIV)","tag_h1":"Pennawd 1","tag_h2":"Pennawd 2","tag_h3":"Pennawd 3","tag_h4":"Pennawd 4","tag_h5":"Pennawd 5","tag_h6":"Pennawd 6","tag_p":"Normal","tag_pre":"Wedi'i Fformatio"},"justify":{"block":"Aliniad Bloc","center":"Alinio i'r Canol","left":"Alinio i'r Chwith","right":"Alinio i'r Dde"},"wsc":{"btnIgnore":"Anwybyddu Un","btnIgnoreAll":"Anwybyddu Pob","btnReplace":"Amnewid Un","btnReplaceAll":"Amnewid Pob","btnUndo":"Dadwneud","changeTo":"Newid i","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Gwirydd sillafu heb ei arsefydlu. A ydych am ei lawrlwytho nawr?","manyChanges":"Gwirio sillafu wedi gorffen: Newidiwyd %1 gair","noChanges":"Gwirio sillafu wedi gorffen: Dim newidiadau","noMispell":"Gwirio sillafu wedi gorffen: Dim camsillaf.","noSuggestions":"- Dim awgrymiadau -","notAvailable":"Nid yw'r gwasanaeth hwn ar gael yn bresennol.","notInDic":"Nid i'w gael yn y geiriadur","oneChange":"Gwirio sillafu wedi gorffen: Newidiwyd 1 gair","progress":"Gwirio sillafu yn ar y gweill...","title":"Gwirio Sillafu","toolbar":"Gwirio Sillafu"},"colordialog":{"clear":"Clirio","highlight":"Uwcholeuo","options":"Opsiynau Lliw","selected":"Lliw a Ddewiswyd","title":"Dewis lliw"},"contextmenu":{"options":"Opsiynau Dewislen Cyd-destun"},"blockquote":{"toolbar":"Dyfyniad bloc"},"table":{"border":"Maint yr Ymyl","caption":"Pennawd","cell":{"menu":"Cell","insertBefore":"Mewnosod Cell Cyn","insertAfter":"Mewnosod Cell Ar Ôl","deleteCell":"Dileu Celloedd","merge":"Cyfuno Celloedd","mergeRight":"Cyfuno i'r Dde","mergeDown":"Cyfuno i Lawr","splitHorizontal":"Hollti'r Gell yn Lorweddol","splitVertical":"Hollti'r Gell yn Fertigol","title":"Priodweddau'r Gell","cellType":"Math y Gell","rowSpan":"Rhychwant Rhesi","colSpan":"Rhychwant Colofnau","wordWrap":"Lapio Geiriau","hAlign":"Aliniad Llorweddol","vAlign":"Aliniad Fertigol","alignBaseline":"Baslinell","bgColor":"Lliw Cefndir","borderColor":"Lliw Ymyl","data":"Data","header":"Pennyn","yes":"Ie","no":"Na","invalidWidth":"Mae'n rhaid i led y gell fod yn rhif.","invalidHeight":"Mae'n rhaid i uchder y gell fod yn rhif.","invalidRowSpan":"Mae'n rhaid i rychwant y rhesi fod yn gyfanrif.","invalidColSpan":"Mae'n rhaid i rychwant y colofnau fod yn gyfanrif.","chooseColor":"Choose"},"cellPad":"Padio'r gell","cellSpace":"Bylchu'r gell","column":{"menu":"Colofn","insertBefore":"Mewnosod Colofn Cyn","insertAfter":"Mewnosod Colofn Ar Ôl","deleteColumn":"Dileu Colofnau"},"columns":"Colofnau","deleteTable":"Dileu Tabl","headers":"Penynnau","headersBoth":"Y Ddau","headersColumn":"Colofn gyntaf","headersNone":"Dim","headersRow":"Rhes gyntaf","invalidBorder":"Mae'n rhaid i faint yr ymyl fod yn rhif.","invalidCellPadding":"Mae'n rhaid i badiad y gell fod yn rhif positif.","invalidCellSpacing":"Mae'n rhaid i fylchiad y gell fod yn rhif positif.","invalidCols":"Mae'n rhaid cael o leiaf un golofn.","invalidHeight":"Mae'n rhaid i uchder y tabl fod yn rhif.","invalidRows":"Mae'n rhaid cael o leiaf un rhes.","invalidWidth":"Mae'n rhaid i led y tabl fod yn rhif.","menu":"Nodweddion Tabl","row":{"menu":"Rhes","insertBefore":"Mewnosod Rhes Cyn","insertAfter":"Mewnosod Rhes Ar Ôl","deleteRow":"Dileu Rhesi"},"rows":"Rhesi","summary":"Crynodeb","title":"Nodweddion Tabl","toolbar":"Tabl","widthPc":"y cant","widthPx":"picsel","widthUnit":"uned lled"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Teitl Cynghorol","cssClassInputLabel":"Dosbarthiadau Ffeil Ddiwyg","edit":"Golygu Div","inlineStyleInputLabel":"Arddull Mewn Llinell","langDirLTRLabel":"Chwith i'r Dde (LTR)","langDirLabel":"Cyfeiriad yr Iaith","langDirRTLLabel":"Dde i'r Chwith (RTL)","languageCodeInputLabel":" Cod Iaith","remove":"Tynnu Div","styleSelectLabel":"Arddull","title":"Creu Cynhwysydd Div","toolbar":"Creu Cynhwysydd Div"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/sk.js0000644000000000000000000003402212247657030021005 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['sk']={"editor":"Editor formátovaného textu","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"StlaÄte ALT 0 pre nápovedu","browseServer":"PrechádzaÅ¥ server","url":"URL","protocol":"Protokol","upload":"OdoslaÅ¥","uploadSubmit":"OdoslaÅ¥ na server","image":"Obrázok","flash":"Flash","form":"Formulár","checkbox":"ZaÅ¡krtávacie políÄko","radio":"PrepínaÄ","textField":"Textové pole","textarea":"Textová oblasÅ¥","hiddenField":"Skryté pole","button":"TlaÄidlo","select":"Rozbaľovací zoznam","imageButton":"Obrázkové tlaÄidlo","notSet":"","id":"Id","name":"Meno","langDir":"Orientácia jazyka","langDirLtr":"Zľava doprava (LTR)","langDirRtl":"Sprava doľava (RTL)","langCode":"Kód jazyka","longDescr":"Dlhý popis URL","cssClass":"Trieda Å¡týlu","advisoryTitle":"Pomocný titulok","cssStyle":"Å týl","ok":"OK","cancel":"ZruÅ¡iÅ¥","close":"Zatvorit","preview":"Náhľad","resize":"ZmeniÅ¥ veľkosÅ¥","generalTab":"Hlavné","advancedTab":"Rozšírené","validateNumberFailed":"Hodnota nieje Äíslo.","confirmNewPage":"Prajete si naÄítat novú stránku? VÅ¡etky neuložené zmeny budú stratené. ","confirmCancel":"Niektore možnosti boli zmenené. Naozaj chcete zavrieÅ¥ okno?","options":"Možnosti","target":"Cieľ","targetNew":"Nové okno (_blank)","targetTop":"NajvrchnejÅ¡ie okno (_top)","targetSelf":"To isté okno (_self)","targetParent":"RodiÄovské okno (_parent)","langDirLTR":"Zľava doprava (LTR)","langDirRTL":"Sprava doľava (RTL)","styles":"Å týl","cssClasses":"Triedy Å¡týlu","width":"Šírka","height":"Výška","align":"Zarovnanie","alignLeft":"Vľavo","alignRight":"Vpravo","alignCenter":"Na stred","alignTop":"Nahor","alignMiddle":"Na stred","alignBottom":"Dole","invalidValue":"Neplatná hodnota.","invalidHeight":"Výška musí byÅ¥ Äíslo.","invalidWidth":"Šírka musí byÅ¥ Äíslo.","invalidCssLength":"Å pecifikovaná hodnota pre pole \"%1\" musí byÅ¥ kladné Äíslo s alebo bez platnej CSS mernej jednotky (px, %, in, cm, mm, em, ex, pt alebo pc).","invalidHtmlLength":"Å pecifikovaná hodnota pre pole \"%1\" musí byÅ¥ kladné Äíslo s alebo bez platnej HTML mernej jednotky (px alebo %).","invalidInlineStyle":"Zadaná hodnota pre inline Å¡týl musí pozostávaÅ¥ s jedného, alebo viac dvojíc formátu \"názov: hodnota\", oddelených bodkoÄiarkou.","cssLengthTooltip":"Vložte Äíslo pre hodnotu v pixeloch alebo Äíslo so správnou CSS jednotou (px, %, in, cm, mm, em, ex, pt alebo pc).","unavailable":"%1, nedostupný"},"about":{"copy":"Copyright © $1. VÅ¡etky práva vyhradené.","dlgTitle":"O CKEditor-e","help":"ZaÅ¡krtnite $1 pre pomoc.","moreInfo":"Pre informácie o licenciách, prosíme, navÅ¡tívte naÅ¡u web stránku:","title":"O CKEditor-e","userGuide":"Používateľská príruÄka KCEditor-a"},"basicstyles":{"bold":"TuÄné","italic":"Kurzíva","strike":"PreÄiarknuté","subscript":"Dolný index","superscript":"Horný index","underline":"PodÄiarknuté"},"clipboard":{"copy":"KopírovaÅ¥","copyError":"BezpeÄnostné nastavenia Vášho prehliadaÄa nedovoľujú editoru automaticky spustiÅ¥ operáciu kopírovania. Prosím, použite na to klávesnicu (Ctrl/Cmd+C).","cut":"Vystrihnúť","cutError":"BezpeÄnostné nastavenia Vášho prehliadaÄa nedovoľujú editoru automaticky spustiÅ¥ operáciu vystrihnutia. Prosím, použite na to klávesnicu (Ctrl/Cmd+X).","paste":"VložiÅ¥","pasteArea":"Miesto pre vloženie","pasteMsg":"Prosím, vložte nasledovný rámÄek použitím klávesnice (Ctrl/Cmd+V) a stlaÄte OK.","securityMsg":"Kvôli vaÅ¡im bezpeÄnostným nastaveniam prehliadaÄa editor nie je schopný pristupovaÅ¥ k vaÅ¡ej schránke na kopírovanie priamo. Vložte to preto do tohto okna.","title":"VložiÅ¥"},"toolbar":{"toolbarCollapse":"ZbaliÅ¥ liÅ¡tu nástrojov","toolbarExpand":"RozbaliÅ¥ liÅ¡tu nástrojov","toolbarGroups":{"document":"Dokument","clipboard":"Schránka pre kopírovanie/Späť","editing":"Upravovanie","forms":"Formuláre","basicstyles":"Základné Å¡týly","paragraph":"Odstavec","links":"Odkazy","insert":"VložiÅ¥","styles":"Å týly","colors":"Farby","tools":"Nástroje"},"toolbars":"LiÅ¡ty nástrojov editora"},"fakeobjects":{"anchor":"Kotva","flash":"Flash animácia","hiddenfield":"Skryté pole","iframe":"IFrame","unknown":"Neznámy objekt"},"link":{"acccessKey":"Prístupový kľúÄ","advanced":"Rozšírené","advisoryContentType":"Pomocný typ obsahu","advisoryTitle":"Pomocný titulok","anchor":{"toolbar":"Kotva","menu":"UpraviÅ¥ kotvu","title":"Vlastnosti kotvy","name":"Názov kotvy","errorName":"Zadajte prosím názov kotvy","remove":"OdstrániÅ¥ kotvu"},"anchorId":"Podľa Id objektu","anchorName":"Podľa mena kotvy","charset":"Priradená znaková sada","cssClasses":"Triedy Å¡týlu","emailAddress":"E-Mailová adresa","emailBody":"Telo správy","emailSubject":"Predmet správy","id":"Id","info":"Informácie o odkaze","langCode":"Orientácia jazyka","langDir":"Orientácia jazyka","langDirLTR":"Zľava doprava (LTR)","langDirRTL":"Sprava doľava (RTL)","menu":"UpraviÅ¥ odkaz","name":"Názov","noAnchors":"(V dokumente nie sú dostupné žiadne kotvy)","noEmail":"Zadajte prosím e-mailovú adresu","noUrl":"Zadajte prosím URL odkazu","other":"","popupDependent":"ZávislosÅ¥ (Netscape)","popupFeatures":"Vlastnosti vyskakovacieho okna","popupFullScreen":"Celá obrazovka (IE)","popupLeft":"Ľavý okraj","popupLocationBar":"Panel umiestnenia (location bar)","popupMenuBar":"Panel ponuky (menu bar)","popupResizable":"Meniteľná veľkosÅ¥ (resizable)","popupScrollBars":"Posuvníky (scroll bars)","popupStatusBar":"Stavový riadok (status bar)","popupToolbar":"Panel nástrojov (toolbar)","popupTop":"Horný okraj","rel":"VzÅ¥ah (rel)","selectAnchor":"VybraÅ¥ kotvu","styles":"Å týl","tabIndex":"Poradie prvku (tab index)","target":"Cieľ","targetFrame":"","targetFrameName":"Názov rámu cieľa","targetPopup":"","targetPopupName":"Názov vyskakovacieho okna","title":"Odkaz","toAnchor":"Odkaz na kotvu v texte","toEmail":"E-mail","toUrl":"URL","toolbar":"Odkaz","type":"Typ odkazu","unlink":"OdstrániÅ¥ odkaz","upload":"NahraÅ¥"},"indent":{"indent":"ZväÄÅ¡iÅ¥ odsadenie","outdent":"ZmenÅ¡iÅ¥ odsadenie"},"list":{"bulletedlist":"VložiÅ¥/OdstrániÅ¥ zoznam s odrážkami","numberedlist":"VložiÅ¥/OdstrániÅ¥ Äíslovaný zoznam"},"pastetext":{"button":"VložiÅ¥ ako Äistý text","title":"VložiÅ¥ ako Äistý text"},"undo":{"redo":"Znovu","undo":"Späť"},"colorbutton":{"auto":"Automaticky","bgColorTitle":"Farba pozadia","colors":{"000":"ÄŒierna","800000":"Maroon","8B4513":"Sedlová hnedá","2F4F4F":"Tmavo bridlicovo sivá","008080":"Modrozelená","000080":"Tmavomodrá","4B0082":"Indigo","696969":"Tmavá sivá","B22222":"Ohňová tehlová","A52A2A":"Hnedá","DAA520":"Zlatobyľ","006400":"Tmavá zelená","40E0D0":"Tyrkysová","0000CD":"Stredná modrá","800080":"Purpurová","808080":"Sivá","F00":"ÄŒervená","FF8C00":"Tmavá oranžová","FFD700":"Zlatá","008000":"Zelená","0FF":"Azúrová","00F":"Modrá","EE82EE":"Fialová","A9A9A9":"Tmavá sivá","FFA07A":"Svetlo lososová","FFA500":"Oranžová","FFFF00":"Žltá","00FF00":"Vápenná","AFEEEE":"Svetlo tyrkysová","ADD8E6":"Svetlo modrá","DDA0DD":"Slivková","D3D3D3":"Svetlo sivá","FFF0F5":"Levanduľovo Äervená","FAEBD7":"Antická biela","FFFFE0":"Svetlo žltá","F0FFF0":"Medová","F0FFFF":"Azúrová","F0F8FF":"Alicovo modrá","E6E6FA":"Levanduľová","FFF":"Biela"},"more":"Viac farieb...","panelTitle":"Farby","textColorTitle":"Farba textu"},"font":{"fontSize":{"label":"VeľkosÅ¥","voiceLabel":"VeľkosÅ¥ písma","panelTitle":"VeľkosÅ¥ písma"},"label":"Font","panelTitle":"Názov fontu","voiceLabel":"Font"},"image":{"alertUrl":"Zadajte prosím URL obrázka","alt":"Alternatívny text","border":"Rám (border)","btnUpload":"OdoslaÅ¥ to na server","button2Img":"Chcete zmeniÅ¥ vybrané obrázkové tlaÄidlo na jednoduchý obrázok?","hSpace":"H-medzera","img2Button":"Chcete zmeniÅ¥ vybraný obrázok na obrázkové tlaÄidlo?","infoTab":"Informácie o obrázku","linkTab":"Odkaz","lockRatio":"Pomer zámky","menu":"Vlastnosti obrázka","resetSize":"Pôvodná veľkosÅ¥","title":"Vlastnosti obrázka","titleButton":"Vlastnosti obrázkového tlaÄidla","upload":"NahraÅ¥","urlMissing":"Chýba URL zdroja obrázka.","vSpace":"V-medzera","validateBorder":"Rám (border) musí byÅ¥ celé Äíslo.","validateHSpace":"H-medzera musí byÅ¥ celé Äíslo.","validateVSpace":"V-medzera musí byÅ¥ celé Äíslo."},"scayt":{"about":"O KPPP (Kontrola pravopisu poÄas písania)","aboutTab":"O","addWord":"PridaÅ¥ slovo","allCaps":"IgnorovaÅ¥ slová písané veľkými písmenami","dic_create":"VytvoriÅ¥","dic_delete":"VymazaÅ¥","dic_field_name":"Názov slovníka","dic_info":"SpoÄiatku je užívateľský slovník uložený v cookie. Cookie vÅ¡ak majú obmedzenú veľkosÅ¥. KeÄ užívateľský slovník narastie do bodu, kedy nemôže byÅ¥ uložený v cookie, potom musí byÅ¥ slovník uložený na naÅ¡om serveri. Pre uloženie vášho osobného slovníka na náš server by ste mali zadaÅ¥ názov pre váš slovník. Ak už máte uložený slovník, prosíme, napíšte jeho názov a kliknite tlaÄidlo ObnoviÅ¥.","dic_rename":"PremenovaÅ¥","dic_restore":"ObnoviÅ¥","dictionariesTab":"Slovníky","disable":"ZakázaÅ¥ KPPP (Kontrola pravopisu poÄas písania)","emptyDic":"Názov slovníka by nemal byÅ¥ prázdny.","enable":"PovoliÅ¥ KPPP (Kontrola pravopisu poÄas písania)","ignore":"IgnorovaÅ¥","ignoreAll":"IgnorovaÅ¥ vÅ¡etko","ignoreDomainNames":"IznorovaÅ¥ názvy domén","langs":"Jazyky","languagesTab":"Jazyky","mixedCase":"IgnorovaÅ¥ slová so smieÅ¡anými veľkými a malými písmenami","mixedWithDigits":"IgnorovaÅ¥ slová s Äíslami","moreSuggestions":"Viac návrhov","opera_title":"Nepodporované Operou","options":"Možnosti","optionsTab":"Možnosti","title":"Kontrola pravopisu poÄas písania","toggle":"Prepnúť KPPP (Kontrola pravopisu poÄas písania)","noSuggestions":"No suggestion"},"format":{"label":"Formát","panelTitle":"Formát","tag_address":"Adresa","tag_div":"Normálny (DIV)","tag_h1":"Nadpis 1","tag_h2":"Nadpis 2","tag_h3":"Nadpis 3","tag_h4":"Nadpis 4","tag_h5":"Nadpis 5","tag_h6":"Nadpis 6","tag_p":"Normálny","tag_pre":"Formátovaný"},"justify":{"block":"ZarovnaÅ¥ do bloku","center":"ZarovnaÅ¥ na stred","left":"ZarovnaÅ¥ vľavo","right":"ZarovnaÅ¥ vpravo"},"wsc":{"btnIgnore":"IgnorovaÅ¥","btnIgnoreAll":"IgnorovaÅ¥ vÅ¡etko","btnReplace":"Prepísat","btnReplaceAll":"Prepísat vÅ¡etko","btnUndo":"Späť","changeTo":"ZmeniÅ¥ na","errorLoading":"Chyba pri naÄítaní slovníka z adresy: %s.","ieSpellDownload":"Kontrola pravopisu nie je naiÅ¡talovaná. Chcete ju teraz stiahnuÅ¥?","manyChanges":"Kontrola pravopisu dokonÄená: Bolo zmenených %1 slov","noChanges":"Kontrola pravopisu dokonÄená: Neboli zmenené žiadne slová","noMispell":"Kontrola pravopisu dokonÄená: Neboli nájdené žiadne chyby pravopisu","noSuggestions":"- Žiadny návrh -","notAvailable":"PrepáÄte, ale služba je momentálne nedostupná.","notInDic":"Nie je v slovníku","oneChange":"Kontrola pravopisu dokonÄená: Bolo zmenené jedno slovo","progress":"Prebieha kontrola pravopisu...","title":"SkontrolovaÅ¥ pravopis","toolbar":"Kontrola pravopisu"},"colordialog":{"clear":"VyÄistiÅ¥","highlight":"ZvýrazniÅ¥","options":"Možnosti farby","selected":"Vybraná farba","title":"Vyberte farbu"},"contextmenu":{"options":"Možnosti kontextového menu"},"blockquote":{"toolbar":"Citácia"},"table":{"border":"Šírka rámu (border)","caption":"Popis","cell":{"menu":"Bunka","insertBefore":"VložiÅ¥ bunku pred","insertAfter":"VložiÅ¥ bunku za","deleteCell":"VymazaÅ¥ bunky","merge":"ZlúÄiÅ¥ bunky","mergeRight":"ZlúÄiÅ¥ doprava","mergeDown":"ZlúÄiÅ¥ dole","splitHorizontal":"RozdeliÅ¥ bunky horizontálne","splitVertical":"RozdeliÅ¥ bunky vertikálne","title":"Vlastnosti bunky","cellType":"Typ bunky","rowSpan":"Rozsah riadkov","colSpan":"Rozsah stĺpcov","wordWrap":"Zalomovanie riadkov","hAlign":"Horizontálne zarovnanie","vAlign":"Vertikálne zarovnanie","alignBaseline":"Základná Äiara (baseline)","bgColor":"Farba pozadia","borderColor":"Farba rámu","data":"Dáta","header":"HlaviÄka","yes":"Ãno","no":"Nie","invalidWidth":"Šírka bunky musí byÅ¥ Äíslo.","invalidHeight":"Výška bunky musí byÅ¥ Äíslo.","invalidRowSpan":"Rozsah riadkov musí byÅ¥ celé Äíslo.","invalidColSpan":"Rozsah stĺpcov musí byÅ¥ celé Äíslo.","chooseColor":"VybraÅ¥"},"cellPad":"Odsadenie obsahu (cell padding)","cellSpace":"VzdialenosÅ¥ buniek (cell spacing)","column":{"menu":"Stĺpec","insertBefore":"VložiÅ¥ stĺpec pred","insertAfter":"VložiÅ¥ stĺpec po","deleteColumn":"ZmazaÅ¥ stĺpce"},"columns":"Stĺpce","deleteTable":"VymazaÅ¥ tabuľku","headers":"HlaviÄka","headersBoth":"Obe","headersColumn":"Prvý stĺpec","headersNone":"Žiadne","headersRow":"Prvý riadok","invalidBorder":"Å irka rámu musí byÅ¥ Äíslo.","invalidCellPadding":"Odsadenie v bunkách (cell padding) musí byÅ¥ kladné Äíslo.","invalidCellSpacing":"Medzera mädzi bunkami (cell spacing) musí byÅ¥ kladné Äíslo.","invalidCols":"PoÄet stĺpcov musí byÅ¥ Äíslo väÄÅ¡ie ako 0.","invalidHeight":"Výška tabuľky musí byÅ¥ Äíslo.","invalidRows":"PoÄet riadkov musí byÅ¥ Äíslo väÄÅ¡ie ako 0.","invalidWidth":"Å irka tabuľky musí byÅ¥ Äíslo.","menu":"Vlastnosti tabuľky","row":{"menu":"Riadok","insertBefore":"VložiÅ¥ riadok pred","insertAfter":"VložiÅ¥ riadok po","deleteRow":"VymazaÅ¥ riadky"},"rows":"Riadky","summary":"Prehľad","title":"Vlastnosti tabuľky","toolbar":"Tabuľka","widthPc":"percent","widthPx":"pixelov","widthUnit":"jednotka šírky"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Pomocný titulok","cssClassInputLabel":"Triedy Å¡týlu","edit":"UpraviÅ¥ Div","inlineStyleInputLabel":"Inline Å¡týl","langDirLTRLabel":"Zľava doprava (LTR)","langDirLabel":"Smer jazyka","langDirRTLLabel":"Zprava doľava (RTL)","languageCodeInputLabel":"Kód jazyka","remove":"OdstrániÅ¥ Div","styleSelectLabel":"Å týl","title":"VytvoriÅ¥ Div kontajner","toolbar":"VytvoriÅ¥ Div kontajner"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/pt-br.js0000644000000000000000000003403512247657030021420 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['pt-br']={"editor":"Editor de Texto","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Pressione ALT+0 para ajuda","browseServer":"Localizar no Servidor","url":"URL","protocol":"Protocolo","upload":"Enviar ao Servidor","uploadSubmit":"Enviar para o Servidor","image":"Imagem","flash":"Flash","form":"Formulário","checkbox":"Caixa de Seleção","radio":"Botão de Opção","textField":"Caixa de Texto","textarea":"Ãrea de Texto","hiddenField":"Campo Oculto","button":"Botão","select":"Caixa de Listagem","imageButton":"Botão de Imagem","notSet":"","id":"Id","name":"Nome","langDir":"Direção do idioma","langDirLtr":"Esquerda para Direita (LTR)","langDirRtl":"Direita para Esquerda (RTL)","langCode":"Idioma","longDescr":"Descrição da URL","cssClass":"Classe de CSS","advisoryTitle":"Título","cssStyle":"Estilos","ok":"OK","cancel":"Cancelar","close":"Fechar","preview":"Visualizar","resize":"Arraste para redimensionar","generalTab":"Geral","advancedTab":"Avançado","validateNumberFailed":"Este valor não é um número.","confirmNewPage":"Todas as mudanças não salvas serão perdidas. Tem certeza de que quer abrir uma nova página?","confirmCancel":"Algumas opções foram alteradas. Tem certeza de que quer fechar a caixa de diálogo?","options":"Opções","target":"Destino","targetNew":"Nova Janela (_blank)","targetTop":"Janela de Cima (_top)","targetSelf":"Mesma Janela (_self)","targetParent":"Janela Pai (_parent)","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","styles":"Estilo","cssClasses":"Classes","width":"Largura","height":"Altura","align":"Alinhamento","alignLeft":"Esquerda","alignRight":"Direita","alignCenter":"Centralizado","alignTop":"Superior","alignMiddle":"Centralizado","alignBottom":"Inferior","invalidValue":"Valor inválido.","invalidHeight":"A altura tem que ser um número","invalidWidth":"A largura tem que ser um número.","invalidCssLength":"O valor do campo \"%1\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).","invalidHtmlLength":"O valor do campo \"%1\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de HTML (px ou %).","invalidInlineStyle":"O valor válido para estilo deve conter uma ou mais tuplas no formato \"nome : valor\", separados por ponto e vírgula.","cssLengthTooltip":"Insira um número para valor em pixels ou um número seguido de uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).","unavailable":"%1, indisponível"},"about":{"copy":"Copyright © $1. Todos os direitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Verifique o $1 para obter ajuda.","moreInfo":"Para informações sobre a licença por favor visite o nosso site:","title":"Sobre o CKEditor","userGuide":"Guia do Usuário do CKEditor"},"basicstyles":{"bold":"Negrito","italic":"Itálico","strike":"Tachado","subscript":"Subscrito","superscript":"Sobrescrito","underline":"Sublinhado"},"clipboard":{"copy":"Copiar","copyError":"As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).","cut":"Recortar","cutError":"As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).","paste":"Colar","pasteArea":"Ãrea para Colar","pasteMsg":"Transfira o link usado na caixa usando o teclado com (Ctrl/Cmd+V) e OK.","securityMsg":"As configurações de segurança do seu navegador não permitem que o editor acesse os dados da área de transferência diretamente. Por favor cole o conteúdo manualmente nesta janela.","title":"Colar"},"toolbar":{"toolbarCollapse":"Diminuir Barra de Ferramentas","toolbarExpand":"Aumentar Barra de Ferramentas","toolbarGroups":{"document":"Documento","clipboard":"Clipboard/Desfazer","editing":"Edição","forms":"Formulários","basicstyles":"Estilos Básicos","paragraph":"Paragrafo","links":"Links","insert":"Inserir","styles":"Estilos","colors":"Cores","tools":"Ferramentas"},"toolbars":"Barra de Ferramentas do Editor"},"fakeobjects":{"anchor":"Âncora","flash":"Animação em Flash","hiddenfield":"Campo Oculto","iframe":"IFrame","unknown":"Objeto desconhecido"},"link":{"acccessKey":"Chave de Acesso","advanced":"Avançado","advisoryContentType":"Tipo de Conteúdo","advisoryTitle":"Título","anchor":{"toolbar":"Inserir/Editar Âncora","menu":"Formatar Âncora","title":"Formatar Âncora","name":"Nome da Âncora","errorName":"Por favor, digite o nome da âncora","remove":"Remover Âncora"},"anchorId":"Id da âncora","anchorName":"Nome da âncora","charset":"Charset do Link","cssClasses":"Classe de CSS","emailAddress":"Endereço E-Mail","emailBody":"Corpo da Mensagem","emailSubject":"Assunto da Mensagem","id":"Id","info":"Informações","langCode":"Direção do idioma","langDir":"Direção do idioma","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","menu":"Editar Link","name":"Nome","noAnchors":"(Não há âncoras no documento)","noEmail":"Por favor, digite o endereço de e-mail","noUrl":"Por favor, digite o endereço do Link","other":"","popupDependent":"Dependente (Netscape)","popupFeatures":"Propriedades da Janela Pop-up","popupFullScreen":"Modo Tela Cheia (IE)","popupLeft":"Esquerda","popupLocationBar":"Barra de Endereços","popupMenuBar":"Barra de Menus","popupResizable":"Redimensionável","popupScrollBars":"Barras de Rolagem","popupStatusBar":"Barra de Status","popupToolbar":"Barra de Ferramentas","popupTop":"Topo","rel":"Tipo de Relação","selectAnchor":"Selecione uma âncora","styles":"Estilos","tabIndex":"Ãndice de Tabulação","target":"Destino","targetFrame":"","targetFrameName":"Nome do Frame de Destino","targetPopup":"","targetPopupName":"Nome da Janela Pop-up","title":"Editar Link","toAnchor":"Âncora nesta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserir/Editar Link","type":"Tipo de hiperlink","unlink":"Remover Link","upload":"Enviar ao Servidor"},"indent":{"indent":"Aumentar Recuo","outdent":"Diminuir Recuo"},"list":{"bulletedlist":"Lista sem números","numberedlist":"Lista numerada"},"pastetext":{"button":"Colar como Texto sem Formatação","title":"Colar como Texto sem Formatação"},"undo":{"redo":"Refazer","undo":"Desfazer"},"colorbutton":{"auto":"Automático","bgColorTitle":"Cor do Plano de Fundo","colors":{"000":"Preto","800000":"Foquete","8B4513":"Marrom 1","2F4F4F":"Cinza 1","008080":"Cerceta","000080":"Azul Marinho","4B0082":"Ãndigo","696969":"Cinza 2","B22222":"Tijolo de Fogo","A52A2A":"Marrom 2","DAA520":"Vara Dourada","006400":"Verde Escuro","40E0D0":"Turquesa","0000CD":"Azul Médio","800080":"Roxo","808080":"Cinza 3","F00":"Vermelho","FF8C00":"Laranja Escuro","FFD700":"Dourado","008000":"Verde","0FF":"Ciano","00F":"Azul","EE82EE":"Violeta","A9A9A9":"Cinza Escuro","FFA07A":"Salmão Claro","FFA500":"Laranja","FFFF00":"Amarelo","00FF00":"Lima","AFEEEE":"Turquesa Pálido","ADD8E6":"Azul Claro","DDA0DD":"Ameixa","D3D3D3":"Cinza Claro","FFF0F5":"Lavanda 1","FAEBD7":"Branco Antiguidade","FFFFE0":"Amarelo Claro","F0FFF0":"Orvalho","F0FFFF":"Azure","F0F8FF":"Azul Alice","E6E6FA":"Lavanda 2","FFF":"Branco"},"more":"Mais Cores...","panelTitle":"Cores","textColorTitle":"Cor do Texto"},"font":{"fontSize":{"label":"Tamanho","voiceLabel":"Tamanho da fonte","panelTitle":"Tamanho"},"label":"Fonte","panelTitle":"Fonte","voiceLabel":"Fonte"},"image":{"alertUrl":"Por favor, digite a URL da imagem.","alt":"Texto Alternativo","border":"Borda","btnUpload":"Enviar para o Servidor","button2Img":"Deseja transformar o botão de imagem em uma imagem comum?","hSpace":"HSpace","img2Button":"Deseja transformar a imagem em um botão de imagem?","infoTab":"Informações da Imagem","linkTab":"Link","lockRatio":"Travar Proporções","menu":"Formatar Imagem","resetSize":"Redefinir para o Tamanho Original","title":"Formatar Imagem","titleButton":"Formatar Botão de Imagem","upload":"Enviar","urlMissing":"URL da imagem está faltando.","vSpace":"VSpace","validateBorder":"A borda deve ser um número inteiro.","validateHSpace":"O HSpace deve ser um número inteiro.","validateVSpace":"O VSpace deve ser um número inteiro."},"scayt":{"about":"Sobre a correção ortográfica durante a digitação","aboutTab":"Sobre","addWord":"Adicionar palavra","allCaps":"Ignorar palavras maiúsculas","dic_create":"Criar","dic_delete":"Excluir","dic_field_name":"Nome do Dicionário","dic_info":"Inicialmente, o dicionário do usuário fica armazenado em um Cookie. Porém, Cookies tem tamanho limitado, portanto quand o dicionário do usuário atingir o tamanho limite poderá ser armazenado no nosso servidor. Para armazenar seu dicionário pessoal no nosso servidor deverá especificar um nome para ele. Se já tiver um dicionário armazenado por favor especifique o seu nome e clique em Restaurar.","dic_rename":"Renomear","dic_restore":"Restaurar","dictionariesTab":"Dicionários","disable":"Desabilitar correção ortográfica durante a digitação","emptyDic":"O nome do dicionário não deveria estar vazio.","enable":"Habilitar correção ortográfica durante a digitação","ignore":"Ignorar","ignoreAll":"Ignorar todas","ignoreDomainNames":"Ignorar nomes de domínio","langs":"Idiomas","languagesTab":"Idiomas","mixedCase":"Ignorar palavras com maiúsculas e minúsculas misturadas","mixedWithDigits":"Ignorar palavras com números","moreSuggestions":"Mais sugestões","opera_title":"Não suportado no Opera","options":"Opções","optionsTab":"Opções","title":"Correção ortográfica durante a digitação","toggle":"Ativar/desativar correção ortográfica durante a digitação","noSuggestions":"No suggestion"},"format":{"label":"Formatação","panelTitle":"Formatação","tag_address":"Endereço","tag_div":"Normal (DIV)","tag_h1":"Título 1","tag_h2":"Título 2","tag_h3":"Título 3","tag_h4":"Título 4","tag_h5":"Título 5","tag_h6":"Título 6","tag_p":"Normal","tag_pre":"Formatado"},"justify":{"block":"Justificado","center":"Centralizar","left":"Alinhar Esquerda","right":"Alinhar Direita"},"wsc":{"btnIgnore":"Ignorar uma vez","btnIgnoreAll":"Ignorar Todas","btnReplace":"Alterar","btnReplaceAll":"Alterar Todas","btnUndo":"Desfazer","changeTo":"Alterar para","errorLoading":"Erro carregando servidor de aplicação: %s.","ieSpellDownload":"A verificação ortográfica não foi instalada. Você gostaria de realizar o download agora?","manyChanges":"Verificação ortográfica encerrada: %1 palavras foram alteradas","noChanges":"Verificação ortográfica encerrada: Não houve alterações","noMispell":"Verificação encerrada: Não foram encontrados erros de ortografia","noSuggestions":"-sem sugestões de ortografia-","notAvailable":"Desculpe, o serviço não está disponível no momento.","notInDic":"Não encontrada","oneChange":"Verificação ortográfica encerrada: Uma palavra foi alterada","progress":"Verificação ortográfica em andamento...","title":"Corretor Ortográfico","toolbar":"Verificar Ortografia"},"colordialog":{"clear":"Limpar","highlight":"Grifar","options":"Opções de Cor","selected":"Cor Selecionada","title":"Selecione uma Cor"},"contextmenu":{"options":"Opções Menu de Contexto"},"blockquote":{"toolbar":"Citação"},"table":{"border":"Borda","caption":"Legenda","cell":{"menu":"Célula","insertBefore":"Inserir célula a esquerda","insertAfter":"Inserir célula a direita","deleteCell":"Remover Células","merge":"Mesclar Células","mergeRight":"Mesclar com célula a direita","mergeDown":"Mesclar com célula abaixo","splitHorizontal":"Dividir célula horizontalmente","splitVertical":"Dividir célula verticalmente","title":"Propriedades da célula","cellType":"Tipo de célula","rowSpan":"Linhas cobertas","colSpan":"Colunas cobertas","wordWrap":"Quebra de palavra","hAlign":"Alinhamento horizontal","vAlign":"Alinhamento vertical","alignBaseline":"Patamar de alinhamento","bgColor":"Cor de fundo","borderColor":"Cor das bordas","data":"Dados","header":"Cabeçalho","yes":"Sim","no":"Não","invalidWidth":"A largura da célula tem que ser um número.","invalidHeight":"A altura da célula tem que ser um número.","invalidRowSpan":"Linhas cobertas tem que ser um número inteiro.","invalidColSpan":"Colunas cobertas tem que ser um número inteiro.","chooseColor":"Escolher"},"cellPad":"Margem interna","cellSpace":"Espaçamento","column":{"menu":"Coluna","insertBefore":"Inserir coluna a esquerda","insertAfter":"Inserir coluna a direita","deleteColumn":"Remover Colunas"},"columns":"Colunas","deleteTable":"Apagar Tabela","headers":"Cabeçalho","headersBoth":"Ambos","headersColumn":"Primeira coluna","headersNone":"Nenhum","headersRow":"Primeira linha","invalidBorder":"O tamanho da borda tem que ser um número.","invalidCellPadding":"A margem interna das células tem que ser um número.","invalidCellSpacing":"O espaçamento das células tem que ser um número.","invalidCols":"O número de colunas tem que ser um número maior que 0.","invalidHeight":"A altura da tabela tem que ser um número.","invalidRows":"O número de linhas tem que ser um número maior que 0.","invalidWidth":"A largura da tabela tem que ser um número.","menu":"Formatar Tabela","row":{"menu":"Linha","insertBefore":"Inserir linha acima","insertAfter":"Inserir linha abaixo","deleteRow":"Remover Linhas"},"rows":"Linhas","summary":"Resumo","title":"Formatar Tabela","toolbar":"Tabela","widthPc":"%","widthPx":"pixels","widthUnit":"unidade largura"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Título Consulta","cssClassInputLabel":"Classes de CSS","edit":"Editar Div","inlineStyleInputLabel":"Estilo Inline","langDirLTRLabel":"Esquerda para Direita (LTR)","langDirLabel":"Direção da Escrita","langDirRTLLabel":"Direita para Esquerda (RTL)","languageCodeInputLabel":"Código de Idioma","remove":"Remover Div","styleSelectLabel":"Estilo","title":"Criar Container de DIV","toolbar":"Criar Container de DIV"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/ar.js0000644000000000000000000004066212247657030021001 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['ar']={"editor":"محرر النص الغني","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"إضغط على ALT + 0 للحصول على المساعدة.","browseServer":"ØªØµÙØ­","url":"الرابط","protocol":"البروتوكول","upload":"Ø±ÙØ¹","uploadSubmit":"أرسل","image":"صورة","flash":"Ùلاش","form":"نموذج","checkbox":"خانة إختيار","radio":"زر اختيار","textField":"مربع نص","textarea":"مساحة نصية","hiddenField":"إدراج حقل Ø®ÙÙŠ","button":"زر ضغط","select":"اختار","imageButton":"زر صورة","notSet":"<بدون تحديد>","id":"الرقم","name":"إسم","langDir":"إتجاه النص","langDirLtr":"اليسار لليمين (LTR)","langDirRtl":"اليمين لليسار (RTL)","langCode":"رمز اللغة","longDescr":"Ø§Ù„ÙˆØµÙ Ø§Ù„ØªÙØµÙŠÙ„Ù‰","cssClass":"ÙØ¦Ø§Øª التنسيق","advisoryTitle":"عنوان التقرير","cssStyle":"نمط","ok":"مواÙÙ‚","cancel":"إلغاء الأمر","close":"أغلق","preview":"استعراض","resize":"تغيير الحجم","generalTab":"عام","advancedTab":"متقدم","validateNumberFailed":"لايوجد نتيجة","confirmNewPage":"ستÙقد أي متغييرات اذا لم تقم Ø¨Ø­ÙØ¸Ù‡Ø§ اولا. هل أنت متأكد أنك تريد ØµÙØ­Ø© جديدة؟","confirmCancel":"بعض الخيارات قد تغيرت. هل أنت متأكد من إغلاق مربع النص؟","options":"خيارات","target":"هد٠الرابط","targetNew":"Ù†Ø§ÙØ°Ø© جديدة","targetTop":"Ø§Ù„Ù†Ø§ÙØ°Ø© الأعلى","targetSelf":"داخل Ø§Ù„Ù†Ø§ÙØ°Ø©","targetParent":"Ø§Ù„Ù†Ø§ÙØ°Ø© الأم","langDirLTR":"اليسار لليمين (LTR)","langDirRTL":"اليمين لليسار (RTL)","styles":"نمط","cssClasses":"ÙØ¦Ø§Øª التنسيق","width":"العرض","height":"Ø§Ù„Ø¥Ø±ØªÙØ§Ø¹","align":"محاذاة","alignLeft":"يسار","alignRight":"يمين","alignCenter":"وسط","alignTop":"أعلى","alignMiddle":"وسط","alignBottom":"أسÙÙ„","invalidValue":"قيمة غير Ù…ÙØ¨ÙˆÙ„Ø©.","invalidHeight":"Ø§Ù„Ø§Ø±ØªÙØ§Ø¹ يجب أن يكون عدداً.","invalidWidth":"العرض يجب أن يكون عدداً.","invalidCssLength":"قيمة الخانة المخصصة لـ \"%1\" يجب أن تكون رقما موجبا، باستخدام أو من غير استخدام وحدة CSS قياس مقبولة (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"قيمة الخانة المخصصة لـ \"%1\" يجب أن تكون رقما موجبا، باستخدام أو من غير استخدام وحدة HTML قياس مقبولة (px or %).","invalidInlineStyle":"قيمة الخانة المخصصة لـ Inline Style يجب أن تختوي على مجموع واحد أو أكثر بالشكل التالي: \"name : value\", Ù…ÙØµÙˆÙ„Ø© Ø¨ÙØ§ØµÙ„Ø© منقزطة.","cssLengthTooltip":"أدخل رقما للقيمة بالبكسل أو رقما بوحدة CSS مقبولة (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1, غير متاح"},"about":{"copy":"حقوق النشر © $1. جميع الحقوق محÙوظة.","dlgTitle":"عن CKEditor","help":"راجع $1 من أجل المساعدة","moreInfo":"للحصول على معلومات الترخيص ØŒ يرجى زيارة موقعنا:","title":"عن CKEditor","userGuide":"دليل مستخدم CKEditor."},"basicstyles":{"bold":"عريض","italic":"مائل","strike":"يتوسطه خط","subscript":"Ù…Ù†Ø®ÙØ¶","superscript":"Ù…Ø±ØªÙØ¹","underline":"تسطير"},"clipboard":{"copy":"نسخ","copyError":"الإعدادات الأمنية Ù„Ù„Ù…ØªØµÙØ­ الذي تستخدمه تمنع عمليات النسخ التلقائي. ÙØ¶Ù„اً إستخدم لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ Ù„ÙØ¹Ù„ ذلك (Ctrl/Cmd+C).","cut":"قص","cutError":"الإعدادات الأمنية Ù„Ù„Ù…ØªØµÙØ­ الذي تستخدمه تمنع القص التلقائي. ÙØ¶Ù„اً إستخدم لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ Ù„ÙØ¹Ù„ ذلك (Ctrl/Cmd+X).","paste":"لصق","pasteArea":"منطقة اللصق","pasteMsg":"الصق داخل الصندوق بإستخدام زرائر (Ctrl/Cmd+V) ÙÙŠ لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ØŒ ثم اضغط زر مواÙÙ‚.","securityMsg":"نظراً لإعدادات الأمان الخاصة Ø¨Ù…ØªØµÙØ­ÙƒØŒ لن يتمكن هذا المحرر من الوصول لمحتوى Ø­Ø§ÙØ¸ØªÙƒØŒ لذلك يجب عليك لصق المحتوى مرة أخرى ÙÙŠ هذه Ø§Ù„Ù†Ø§ÙØ°Ø©.","title":"لصق"},"toolbar":{"toolbarCollapse":"تقليص شريط الأدوت","toolbarExpand":"تمديد شريط الأدوات","toolbarGroups":{"document":"مستند","clipboard":"Ø§Ù„Ø­Ø§ÙØ¸Ø©/الرجوع","editing":"تحرير","forms":"نماذج","basicstyles":"نمط بسيط","paragraph":"Ùقرة","links":"روابط","insert":"إدراج","styles":"أنماط","colors":"ألوان","tools":"أدوات"},"toolbars":"أشرطة أدوات المحرر"},"fakeobjects":{"anchor":"إرساء","flash":"رسم متحرك بالÙلاش","hiddenfield":"إدراج حقل Ø®ÙÙŠ","iframe":"iframe","unknown":"عنصر غير معروÙ"},"link":{"acccessKey":"Ù…ÙØ§ØªÙŠØ­ الإختصار","advanced":"متقدم","advisoryContentType":"نوع التقرير","advisoryTitle":"عنوان التقرير","anchor":{"toolbar":"إشارة مرجعية","menu":"تحرير الإشارة المرجعية","title":"خصائص الإشارة المرجعية","name":"اسم الإشارة المرجعية","errorName":"الرجاء كتابة اسم الإشارة المرجعية","remove":"إزالة الإشارة المرجعية"},"anchorId":"حسب رقم العنصر","anchorName":"حسب إسم الإشارة المرجعية","charset":"ترميز المادة المطلوبة","cssClasses":"ÙØ¦Ø§Øª التنسيق","emailAddress":"البريد الإلكتروني","emailBody":"محتوى الرسالة","emailSubject":"موضوع الرسالة","id":"هوية","info":"معلومات الرابط","langCode":"رمز اللغة","langDir":"إتجاه نص اللغة","langDirLTR":"اليسار لليمين (LTR)","langDirRTL":"اليمين لليسار (RTL)","menu":"تحرير الرابط","name":"إسم","noAnchors":"(لا توجد علامات مرجعية ÙÙŠ هذا المستند)","noEmail":"الرجاء كتابة الريد الإلكتروني","noUrl":"الرجاء كتابة رابط الموقع","other":"<أخرى>","popupDependent":"تابع (Netscape)","popupFeatures":"خصائص Ø§Ù„Ù†Ø§ÙØ°Ø© المنبثقة","popupFullScreen":"ملئ الشاشة (IE)","popupLeft":"التمركز لليسار","popupLocationBar":"شريط العنوان","popupMenuBar":"القوائم الرئيسية","popupResizable":"قابلة التشكيل","popupScrollBars":"أشرطة التمرير","popupStatusBar":"شريط الحالة","popupToolbar":"شريط الأدوات","popupTop":"التمركز للأعلى","rel":"العلاقة","selectAnchor":"اختر علامة مرجعية","styles":"نمط","tabIndex":"الترتيب","target":"هد٠الرابط","targetFrame":"<إطار>","targetFrameName":"اسم الإطار المستهدÙ","targetPopup":"<Ù†Ø§ÙØ°Ø© منبثقة>","targetPopupName":"اسم Ø§Ù„Ù†Ø§ÙØ°Ø© المنبثقة","title":"رابط","toAnchor":"مكان ÙÙŠ هذا المستند","toEmail":"بريد إلكتروني","toUrl":"الرابط","toolbar":"رابط","type":"نوع الربط","unlink":"إزالة رابط","upload":"Ø±ÙØ¹"},"indent":{"indent":"زيادة Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة","outdent":"إنقاص Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة"},"list":{"bulletedlist":"ادخال/حذ٠تعداد نقطي","numberedlist":"ادخال/حذ٠تعداد رقمي"},"pastetext":{"button":"لصق كنص بسيط","title":"لصق كنص بسيط"},"undo":{"redo":"إعادة","undo":"تراجع"},"colorbutton":{"auto":"تلقائي","bgColorTitle":"لون الخلÙية","colors":{"000":"أسود","800000":"كستنائي","8B4513":"بني ÙØ§ØªØ­","2F4F4F":"رمادي أردوازي غامق","008080":"أزرق مخضر","000080":"أزرق داكن","4B0082":"كحلي","696969":"رمادي داكن","B22222":"طوبي","A52A2A":"بني","DAA520":"ذهبي داكن","006400":"أخضر داكن","40E0D0":"Ùيروزي","0000CD":"أزرق متوسط","800080":"Ø¨Ù†ÙØ³Ø¬ÙŠ ØºØ§Ù…Ù‚","808080":"رمادي","F00":"أحمر","FF8C00":"برتقالي داكن","FFD700":"ذهبي","008000":"أخضر","0FF":"تركواز","00F":"أزرق","EE82EE":"Ø¨Ù†ÙØ³Ø¬ÙŠ","A9A9A9":"رمادي شاحب","FFA07A":"برتقالي وردي","FFA500":"برتقالي","FFFF00":"Ø£ØµÙØ±","00FF00":"ليموني","AFEEEE":"Ùيروزي شاحب","ADD8E6":"أزرق ÙØ§ØªØ­","DDA0DD":"Ø¨Ù†ÙØ³Ø¬ÙŠ ÙØ§ØªØ­","D3D3D3":"رمادي ÙØ§ØªØ­","FFF0F5":"وردي ÙØ§ØªØ­","FAEBD7":"أبيض عتيق","FFFFE0":"Ø£ØµÙØ± ÙØ§ØªØ­","F0FFF0":"أبيض مائل للأخضر","F0FFFF":"سماوي","F0F8FF":"لبني","E6E6FA":"أرجواني","FFF":"أبيض"},"more":"ألوان إضاÙية...","panelTitle":"Colors","textColorTitle":"لون النص"},"font":{"fontSize":{"label":"حجم الخط","voiceLabel":"حجم الخط","panelTitle":"حجم الخط"},"label":"خط","panelTitle":"حجم الخط","voiceLabel":"حجم الخط"},"image":{"alertUrl":"ÙØ¶Ù„اً أكتب الموقع الذي توجد عليه هذه الصورة.","alt":"عنوان الصورة","border":"سمك الحدود","btnUpload":"أرسلها للخادم","button2Img":"هل تريد تحويل زر الصورة المختار إلى صورة بسيطة؟","hSpace":"تباعد Ø£Ùقي","img2Button":"هل تريد تحويل الصورة المختارة إلى زر صورة؟","infoTab":"معلومات الصورة","linkTab":"الرابط","lockRatio":"تناسق الحجم","menu":"خصائص الصورة","resetSize":"إستعادة الحجم الأصلي","title":"خصائص الصورة","titleButton":"خصائص زر الصورة","upload":"Ø±ÙØ¹","urlMissing":"عنوان مصدر الصورة Ù…Ùقود","vSpace":"تباعد عمودي","validateBorder":"الإطار يجب أن يكون عددا","validateHSpace":"HSpace يجب أن يكون عدداً.","validateVSpace":"VSpace يجب أن يكون عدداً."},"scayt":{"about":"عن SCAYT","aboutTab":"عن","addWord":"Ø¥Ø¶Ø§ÙØ© كلمة","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"قواميس","disable":"تعطيل SCAYT","emptyDic":"اسم القاموس يجب ألا يكون ÙØ§Ø±ØºØ§Ù‹.","enable":"ØªÙØ¹ÙŠÙ„ SCAYT","ignore":"تجاهل","ignoreAll":"تجاهل الكل","ignoreDomainNames":"Ignore Domain Names","langs":"لغات","languagesTab":"لغات","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"المزيد من المقترحات","opera_title":"Not supported by Opera","options":"خيارات","optionsTab":"خيارات","title":"تدقيق إملائي أثناء الكتابة","toggle":"تثبيت SCAYT","noSuggestions":"No suggestion"},"format":{"label":"تنسيق","panelTitle":"تنسيق الÙقرة","tag_address":"عنوان","tag_div":"عادي (DIV)","tag_h1":"العنوان 1","tag_h2":"العنوان 2","tag_h3":"العنوان 3","tag_h4":"العنوان 4","tag_h5":"العنوان 5","tag_h6":"العنوان 6","tag_p":"عادي","tag_pre":"منسّق"},"justify":{"block":"ضبط","center":"توسيط","left":"محاذاة إلى اليسار","right":"محاذاة إلى اليمين"},"wsc":{"btnIgnore":"تجاهل","btnIgnoreAll":"تجاهل الكل","btnReplace":"تغيير","btnReplaceAll":"تغيير الكل","btnUndo":"تراجع","changeTo":"التغيير إلى","errorLoading":"خطأ ÙÙŠ تحميل تطبيق خدمة Ø§Ù„Ø§Ø³ØªØ¶Ø§ÙØ©: %s.","ieSpellDownload":"المدقق الإملائي (الإنجليزي) غير مثبّت. هل تود تحميله الآن؟","manyChanges":"تم إكمال التدقيق الإملائي: تم تغيير %1 من كلمات","noChanges":"تم التدقيق الإملائي: لم يتم تغيير أي كلمة","noMispell":"تم التدقيق الإملائي: لم يتم العثور على أي أخطاء إملائية","noSuggestions":"- لا توجد إقتراحات -","notAvailable":"عÙواً، ولكن هذه الخدمة غير متاحة الان","notInDic":"ليست ÙÙŠ القاموس","oneChange":"تم التدقيق الإملائي: تم تغيير كلمة واحدة Ùقط","progress":"جاري التدقيق الاملائى","title":"التدقيق الإملائي","toolbar":"تدقيق إملائي"},"colordialog":{"clear":"مسح","highlight":"تحديد","options":"اختيارات الألوان","selected":"اللون المختار","title":"اختر اللون"},"contextmenu":{"options":"خصائص قائمة السياق"},"blockquote":{"toolbar":"اقتباس"},"table":{"border":"الحدود","caption":"الوصÙ","cell":{"menu":"خلية","insertBefore":"إدراج خلية قبل","insertAfter":"إدراج خلية بعد","deleteCell":"حذ٠خلية","merge":"دمج خلايا","mergeRight":"دمج لليمين","mergeDown":"دمج للأسÙÙ„","splitHorizontal":"تقسيم الخلية Ø£Ùقياً","splitVertical":"تقسيم الخلية عمودياً","title":"خصائص الخلية","cellType":"نوع الخلية","rowSpan":"امتداد الصÙÙˆÙ","colSpan":"امتداد الأعمدة","wordWrap":"Ø§Ù„ØªÙØ§Ù النص","hAlign":"محاذاة Ø£Ùقية","vAlign":"محاذاة رأسية","alignBaseline":"خط القاعدة","bgColor":"لون الخلÙية","borderColor":"لون الحدود","data":"بيانات","header":"عنوان","yes":"نعم","no":"لا","invalidWidth":"عرض الخلية يجب أن يكون عدداً.","invalidHeight":"Ø§Ø±ØªÙØ§Ø¹ الخلية يجب أن يكون عدداً.","invalidRowSpan":"امتداد الصÙو٠يجب أن يكون عدداً صحيحاً.","invalidColSpan":"امتداد الأعمدة يجب أن يكون عدداً صحيحاً.","chooseColor":"اختر"},"cellPad":"Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة","cellSpace":"تباعد الخلايا","column":{"menu":"عمود","insertBefore":"إدراج عمود قبل","insertAfter":"إدراج عمود بعد","deleteColumn":"حذ٠أعمدة"},"columns":"أعمدة","deleteTable":"حذ٠الجدول","headers":"العناوين","headersBoth":"كلاهما","headersColumn":"العمود الأول","headersNone":"بدون","headersRow":"الص٠الأول","invalidBorder":"حجم الحد يجب أن يكون عدداً.","invalidCellPadding":"Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة يجب أن تكون عدداً","invalidCellSpacing":"Ø§Ù„Ù…Ø³Ø§ÙØ© بين الخلايا يجب أن تكون عدداً.","invalidCols":"عدد الأعمدة يجب أن يكون عدداً أكبر من ØµÙØ±.","invalidHeight":"Ø§Ø±ØªÙØ§Ø¹ الجدول يجب أن يكون عدداً.","invalidRows":"عدد الصÙو٠يجب أن يكون عدداً أكبر من ØµÙØ±.","invalidWidth":"عرض الجدول يجب أن يكون عدداً.","menu":"خصائص الجدول","row":{"menu":"صÙ","insertBefore":"إدراج ص٠قبل","insertAfter":"إدراج ص٠بعد","deleteRow":"حذ٠صÙÙˆÙ"},"rows":"صÙÙˆÙ","summary":"الخلاصة","title":"خصائص الجدول","toolbar":"جدول","widthPc":"بالمئة","widthPx":"بكسل","widthUnit":"وحدة العرض"},"div":{"IdInputLabel":"هوية","advisoryTitleInputLabel":"عنوان التقرير","cssClassInputLabel":"ÙØ¦Ø§Øª التنسيق","edit":"تحرير Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"اليسار لليمين (LTR)","langDirLabel":"إتجاه النص","langDirRTLLabel":"اليمين لليسار (RTL)","languageCodeInputLabel":"رمز اللغة","remove":"إزالة Div","styleSelectLabel":"نمط","title":"إحداث Div Container","toolbar":"إحداث Div Container"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/nl.js0000644000000000000000000003255612247657030021013 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['nl']={"editor":"Tekstverwerker","editorPanel":"Tekstverwerker beheerpaneel","common":{"editorHelp":"Druk ALT 0 voor hulp","browseServer":"Bladeren op server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Naar server verzenden","image":"Afbeelding","flash":"Flash","form":"Formulier","checkbox":"Aanvinkvakje","radio":"Selectievakje","textField":"Tekstveld","textarea":"Tekstvak","hiddenField":"Verborgen veld","button":"Knop","select":"Selectieveld","imageButton":"Afbeeldingsknop","notSet":"","id":"Id","name":"Naam","langDir":"Schrijfrichting","langDirLtr":"Links naar rechts (LTR)","langDirRtl":"Rechts naar links (RTL)","langCode":"Taalcode","longDescr":"Lange URL-omschrijving","cssClass":"Stylesheet-klassen","advisoryTitle":"Adviserende titel","cssStyle":"Stijl","ok":"OK","cancel":"Annuleren","close":"Sluiten","preview":"Voorbeeld","resize":"Sleep om te herschalen","generalTab":"Algemeen","advancedTab":"Geavanceerd","validateNumberFailed":"Deze waarde is geen geldig getal.","confirmNewPage":"Alle aangebrachte wijzigingen gaan verloren. Weet u zeker dat u een nieuwe pagina wilt openen?","confirmCancel":"Enkele opties zijn gewijzigd. Weet u zeker dat u dit dialoogvenster wilt sluiten?","options":"Opties","target":"Doelvenster","targetNew":"Nieuw venster (_blank)","targetTop":"Hele venster (_top)","targetSelf":"Zelfde venster (_self)","targetParent":"Origineel venster (_parent)","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","styles":"Stijl","cssClasses":"Stylesheet klassen","width":"Breedte","height":"Hoogte","align":"Uitlijning","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Centreren","alignTop":"Boven","alignMiddle":"Midden","alignBottom":"Onder","invalidValue":"Ongeldige waarde.","invalidHeight":"De hoogte moet een getal zijn.","invalidWidth":"De breedte moet een getal zijn.","invalidCssLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige CSS meeteenheid (px, %, in, cm, mm, em, ex, pt of pc).","invalidHtmlLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige HTML meeteenheid (px of %).","invalidInlineStyle":"Waarde voor de online stijl moet bestaan uit een of meerdere tupels met het formaat \"naam : waarde\", gescheiden door puntkomma's.","cssLengthTooltip":"Geef een nummer in voor een waarde in pixels of geef een nummer in met een geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).","unavailable":"%1, niet beschikbaar"},"about":{"copy":"Copyright © $1. Alle rechten voorbehouden.","dlgTitle":"Over CKEditor","help":"Bekijk de $1 voor hulp.","moreInfo":"Voor licentie informatie, bezoek onze website:","title":"Over CKEditor","userGuide":"CKEditor gebruiksaanwijzing"},"basicstyles":{"bold":"Vet","italic":"Cursief","strike":"Doorhalen","subscript":"Subscript","superscript":"Superscript","underline":"Onderstreept"},"clipboard":{"copy":"Kopiëren","copyError":"De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.","cut":"Knippen","cutError":"De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.","paste":"Plakken","pasteArea":"Plakgebied","pasteMsg":"Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (Ctrl/Cmd+V) en klik op OK.","securityMsg":"Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.","title":"Plakken"},"toolbar":{"toolbarCollapse":"Werkbalk inklappen","toolbarExpand":"Werkbalk uitklappen","toolbarGroups":{"document":"Document","clipboard":"Klembord/Ongedaan maken","editing":"Bewerken","forms":"Formulieren","basicstyles":"Basisstijlen","paragraph":"Paragraaf","links":"Links","insert":"Invoegen","styles":"Stijlen","colors":"Kleuren","tools":"Toepassingen"},"toolbars":"Werkbalken"},"fakeobjects":{"anchor":"Interne link","flash":"Flash animatie","hiddenfield":"Verborgen veld","iframe":"IFrame","unknown":"Onbekend object"},"link":{"acccessKey":"Toegangstoets","advanced":"Geavanceerd","advisoryContentType":"Aanbevolen content-type","advisoryTitle":"Adviserende titel","anchor":{"toolbar":"Interne link","menu":"Eigenschappen interne link","title":"Eigenschappen interne link","name":"Naam interne link","errorName":"Geef de naam van de interne link op","remove":"Interne link verwijderen"},"anchorId":"Op kenmerk interne link","anchorName":"Op naam interne link","charset":"Karakterset van gelinkte bron","cssClasses":"Stylesheet-klassen","emailAddress":"E-mailadres","emailBody":"Inhoud bericht","emailSubject":"Onderwerp bericht","id":"Id","info":"Linkomschrijving","langCode":"Taalcode","langDir":"Schrijfrichting","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","menu":"Link wijzigen","name":"Naam","noAnchors":"(Geen interne links in document gevonden)","noEmail":"Geef een e-mailadres","noUrl":"Geef de link van de URL","other":"","popupDependent":"Afhankelijk (Netscape)","popupFeatures":"Instellingen popupvenster","popupFullScreen":"Volledig scherm (IE)","popupLeft":"Positie links","popupLocationBar":"Locatiemenu","popupMenuBar":"Menubalk","popupResizable":"Herschaalbaar","popupScrollBars":"Schuifbalken","popupStatusBar":"Statusbalk","popupToolbar":"Werkbalk","popupTop":"Positie boven","rel":"Relatie","selectAnchor":"Kies een interne link","styles":"Stijl","tabIndex":"Tabvolgorde","target":"Doelvenster","targetFrame":"","targetFrameName":"Naam doelframe","targetPopup":"","targetPopupName":"Naam popupvenster","title":"Link","toAnchor":"Interne link in pagina","toEmail":"E-mail","toUrl":"URL","toolbar":"Link invoegen/wijzigen","type":"Linktype","unlink":"Link verwijderen","upload":"Upload"},"indent":{"indent":"Inspringing vergroten","outdent":"Inspringing verkleinen"},"list":{"bulletedlist":"Opsomming","numberedlist":"Genummerde lijst"},"pastetext":{"button":"Plakken als platte tekst","title":"Plakken als platte tekst"},"undo":{"redo":"Opnieuw uitvoeren","undo":"Ongedaan maken"},"colorbutton":{"auto":"Automatisch","bgColorTitle":"Achtergrondkleur","colors":{"000":"Zwart","800000":"Kastanjebruin","8B4513":"Chocoladebruin","2F4F4F":"Donkerleigrijs","008080":"Blauwgroen","000080":"Marine","4B0082":"Indigo","696969":"Donkergrijs","B22222":"Baksteen","A52A2A":"Bruin","DAA520":"Donkergeel","006400":"Donkergroen","40E0D0":"Turquoise","0000CD":"Middenblauw","800080":"Paars","808080":"Grijs","F00":"Rood","FF8C00":"Donkeroranje","FFD700":"Goud","008000":"Groen","0FF":"Cyaan","00F":"Blauw","EE82EE":"Violet","A9A9A9":"Donkergrijs","FFA07A":"Lichtzalm","FFA500":"Oranje","FFFF00":"Geel","00FF00":"Felgroen","AFEEEE":"Lichtturquoise","ADD8E6":"Lichtblauw","DDA0DD":"Pruim","D3D3D3":"Lichtgrijs","FFF0F5":"Linnen","FAEBD7":"Ivoor","FFFFE0":"Lichtgeel","F0FFF0":"Honingdauw","F0FFFF":"Azuur","F0F8FF":"Licht hemelsblauw","E6E6FA":"Lavendel","FFF":"Wit"},"more":"Meer kleuren...","panelTitle":"Kleuren","textColorTitle":"Tekstkleur"},"font":{"fontSize":{"label":"Lettergrootte","voiceLabel":"Lettergrootte","panelTitle":"Lettergrootte"},"label":"Lettertype","panelTitle":"Lettertype","voiceLabel":"Lettertype"},"image":{"alertUrl":"Geef de URL van de afbeelding","alt":"Alternatieve tekst","border":"Rand","btnUpload":"Naar server verzenden","button2Img":"Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?","hSpace":"HSpace","img2Button":"Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?","infoTab":"Informatie afbeelding","linkTab":"Link","lockRatio":"Afmetingen vergrendelen","menu":"Eigenschappen afbeelding","resetSize":"Afmetingen resetten","title":"Eigenschappen afbeelding","titleButton":"Eigenschappen afbeeldingsknop","upload":"Upload","urlMissing":"De URL naar de afbeelding ontbreekt.","vSpace":"VSpace","validateBorder":"Rand moet een heel nummer zijn.","validateHSpace":"HSpace moet een heel nummer zijn.","validateVSpace":"VSpace moet een heel nummer zijn."},"scayt":{"about":"Over SCAYT","aboutTab":"Over","addWord":"Woord toevoegen","allCaps":"Negeer woorden helemaal in hoofdletters","dic_create":"Aanmaken","dic_delete":"Verwijderen","dic_field_name":"Naam woordenboek","dic_info":"Initieel wordt het gebruikerswoordenboek opgeslagen in een cookie. Cookies zijn echter beperkt in grootte. Zodra het gebruikerswoordenboek het punt bereikt waarop het niet meer in een cookie opgeslagen kan worden, dan wordt het woordenboek op de server opgeslagen. Om je persoonlijke woordenboek op je eigen server op te slaan, moet je een mapnaam opgeven. Indien je al een woordenboek hebt opgeslagen, typ dan de naam en klik op de Terugzetten knop.","dic_rename":"Hernoemen","dic_restore":"Terugzetten","dictionariesTab":"Woordenboeken","disable":"SCAYT uitschakelen","emptyDic":"De naam van het woordenboek mag niet leeg zijn.","enable":"SCAYT inschakelen","ignore":"Negeren","ignoreAll":"Alles negeren","ignoreDomainNames":"Negeer domeinnamen","langs":"Talen","languagesTab":"Talen","mixedCase":"Negeer woorden met hoofd- en kleine letters","mixedWithDigits":"Negeer woorden met cijfers","moreSuggestions":"Meer suggesties","opera_title":"Niet ondersteund door Opera","options":"Opties","optionsTab":"Opties","title":"Controleer de spelling tijdens het typen","toggle":"SCAYT in/uitschakelen","noSuggestions":"No suggestion"},"format":{"label":"Opmaak","panelTitle":"Opmaak","tag_address":"Adres","tag_div":"Normaal (DIV)","tag_h1":"Kop 1","tag_h2":"Kop 2","tag_h3":"Kop 3","tag_h4":"Kop 4","tag_h5":"Kop 5","tag_h6":"Kop 6","tag_p":"Normaal","tag_pre":"Met opmaak"},"justify":{"block":"Uitvullen","center":"Centreren","left":"Links uitlijnen","right":"Rechts uitlijnen"},"wsc":{"btnIgnore":"Negeren","btnIgnoreAll":"Alles negeren","btnReplace":"Vervangen","btnReplaceAll":"Alles vervangen","btnUndo":"Ongedaan maken","changeTo":"Wijzig in","errorLoading":"Er is een fout opgetreden bij het laden van de dienst: %s.","ieSpellDownload":"De spellingscontrole is niet geïnstalleerd. Wilt u deze nu downloaden?","manyChanges":"Klaar met spellingscontrole: %1 woorden aangepast","noChanges":"Klaar met spellingscontrole: geen woorden aangepast","noMispell":"Klaar met spellingscontrole: geen fouten gevonden","noSuggestions":"- Geen suggesties -","notAvailable":"Excuses, deze dienst is momenteel niet beschikbaar.","notInDic":"Niet in het woordenboek","oneChange":"Klaar met spellingscontrole: één woord aangepast","progress":"Bezig met spellingscontrole...","title":"Spellingscontrole","toolbar":"Spellingscontrole"},"colordialog":{"clear":"Wissen","highlight":"Actief","options":"Kleuropties","selected":"Geselecteerde kleur","title":"Selecteer kleur"},"contextmenu":{"options":"Contextmenu opties"},"blockquote":{"toolbar":"Citaatblok"},"table":{"border":"Breedte rand","caption":"Naam","cell":{"menu":"Cel","insertBefore":"Voeg cel in voor","insertAfter":"Voeg cel in achter","deleteCell":"Cellen verwijderen","merge":"Cellen samenvoegen","mergeRight":"Voeg samen naar rechts","mergeDown":"Voeg samen naar beneden","splitHorizontal":"Splits cellen horizontaal","splitVertical":"Splits cellen verticaal","title":"Cel eigenschappen","cellType":"Cel type","rowSpan":"Rijen samenvoegen","colSpan":"Kolommen samenvoegen","wordWrap":"Automatische terugloop","hAlign":"Horizontale uitlijning","vAlign":"Verticale uitlijning","alignBaseline":"Basislijn","bgColor":"Achtergrondkleur","borderColor":"Kleur rand","data":"Inhoud","header":"Kop","yes":"Ja","no":"Nee","invalidWidth":"De celbreedte moet een getal zijn.","invalidHeight":"De celhoogte moet een getal zijn.","invalidRowSpan":"Rijen samenvoegen moet een heel getal zijn.","invalidColSpan":"Kolommen samenvoegen moet een heel getal zijn.","chooseColor":"Kies"},"cellPad":"Ruimte in de cel","cellSpace":"Afstand tussen cellen","column":{"menu":"Kolom","insertBefore":"Voeg kolom in voor","insertAfter":"Voeg kolom in achter","deleteColumn":"Kolommen verwijderen"},"columns":"Kolommen","deleteTable":"Tabel verwijderen","headers":"Koppen","headersBoth":"Beide","headersColumn":"Eerste kolom","headersNone":"Geen","headersRow":"Eerste rij","invalidBorder":"De rand breedte moet een getal zijn.","invalidCellPadding":"Ruimte in de cel moet een getal zijn.","invalidCellSpacing":"Afstand tussen cellen moet een getal zijn.","invalidCols":"Het aantal kolommen moet een getal zijn groter dan 0.","invalidHeight":"De tabelhoogte moet een getal zijn.","invalidRows":"Het aantal rijen moet een getal zijn groter dan 0.","invalidWidth":"De tabelbreedte moet een getal zijn.","menu":"Eigenschappen tabel","row":{"menu":"Rij","insertBefore":"Voeg rij in voor","insertAfter":"Voeg rij in achter","deleteRow":"Rijen verwijderen"},"rows":"Rijen","summary":"Samenvatting","title":"Eigenschappen tabel","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"eenheid breedte"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Adviserende titel","cssClassInputLabel":"Stylesheet klassen","edit":"Div wijzigen","inlineStyleInputLabel":"Inline stijl","langDirLTRLabel":"Links naar rechts (LTR)","langDirLabel":"Schrijfrichting","langDirRTLLabel":"Rechts naar links (RTL)","languageCodeInputLabel":" Taalcode","remove":"Div verwijderen","styleSelectLabel":"Stijl","title":"Div aanmaken","toolbar":"Div aanmaken"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/es.js0000644000000000000000000003400212247657030020775 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['es']={"editor":"Editor de texto enriquecido","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Pulse ALT 0 para ayuda","browseServer":"Ver Servidor","url":"URL","protocol":"Protocolo","upload":"Cargar","uploadSubmit":"Enviar al Servidor","image":"Imagen","flash":"Flash","form":"Formulario","checkbox":"Casilla de Verificación","radio":"Botones de Radio","textField":"Campo de Texto","textarea":"Area de Texto","hiddenField":"Campo Oculto","button":"Botón","select":"Campo de Selección","imageButton":"Botón Imagen","notSet":"","id":"Id","name":"Nombre","langDir":"Orientación","langDirLtr":"Izquierda a Derecha (LTR)","langDirRtl":"Derecha a Izquierda (RTL)","langCode":"Cód. de idioma","longDescr":"Descripción larga URL","cssClass":"Clases de hojas de estilo","advisoryTitle":"Título","cssStyle":"Estilo","ok":"Aceptar","cancel":"Cancelar","close":"Cerrar","preview":"Previsualización","resize":"Arrastre para redimensionar","generalTab":"General","advancedTab":"Avanzado","validateNumberFailed":"El valor no es un número.","confirmNewPage":"Cualquier cambio que no se haya guardado se perderá.\r\n¿Está seguro de querer crear una nueva página?","confirmCancel":"Algunas de las opciones se han cambiado.\r\n¿Está seguro de querer cerrar el diálogo?","options":"Opciones","target":"Destino","targetNew":"Nueva ventana (_blank)","targetTop":"Ventana principal (_top)","targetSelf":"Misma ventana (_self)","targetParent":"Ventana padre (_parent)","langDirLTR":"Izquierda a derecha (LTR)","langDirRTL":"Derecha a izquierda (RTL)","styles":"Estilos","cssClasses":"Clase de la hoja de estilos","width":"Anchura","height":"Altura","align":"Alineación","alignLeft":"Izquierda","alignRight":"Derecha","alignCenter":"Centrado","alignTop":"Tope","alignMiddle":"Centro","alignBottom":"Pie","invalidValue":"Valor no válido","invalidHeight":"Altura debe ser un número.","invalidWidth":"Anchura debe ser un número.","invalidCssLength":"El valor especificado para el campo \"%1\" debe ser un número positivo, incluyendo optionalmente una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"El valor especificado para el campo \"%1\" debe ser un número positivo, incluyendo optionalmente una unidad de medida HTML válida (px o %).","invalidInlineStyle":"El valor especificado para el estilo debe consistir en uno o más pares con el formato \"nombre: valor\", separados por punto y coma.","cssLengthTooltip":"Introduca un número para el valor en pixels o un número con una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).","unavailable":"%1, no disponible"},"about":{"copy":"Copyright © $1. Todos los derechos reservados.","dlgTitle":"Acerca de CKEditor","help":"Lea la $1 para resolver sus dudas.","moreInfo":"Para información de licencia, por favor visite nuestro sitio web:","title":"Acerca de CKEditor","userGuide":"Guía de usuario de CKEditor"},"basicstyles":{"bold":"Negrita","italic":"Cursiva","strike":"Tachado","subscript":"Subíndice","superscript":"Superíndice","underline":"Subrayado"},"clipboard":{"copy":"Copiar","copyError":"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).","cut":"Cortar","cutError":"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).","paste":"Pegar","pasteArea":"Zona de pegado","pasteMsg":"Por favor pegue dentro del cuadro utilizando el teclado (Ctrl/Cmd+V);\r\nluego presione Aceptar.","securityMsg":"Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles.\r\nEs necesario que lo pegue de nuevo en esta ventana.","title":"Pegar"},"toolbar":{"toolbarCollapse":"Contraer barra de herramientas","toolbarExpand":"Expandir barra de herramientas","toolbarGroups":{"document":"Documento","clipboard":"Portapapeles/Deshacer","editing":"Edición","forms":"Formularios","basicstyles":"Estilos básicos","paragraph":"Párrafo","links":"Enlaces","insert":"Insertar","styles":"Estilos","colors":"Colores","tools":"Herramientas"},"toolbars":"Barras de herramientas del editor"},"fakeobjects":{"anchor":"Ancla","flash":"Animación flash","hiddenfield":"Campo oculto","iframe":"IFrame","unknown":"Objeto desconocido"},"link":{"acccessKey":"Tecla de Acceso","advanced":"Avanzado","advisoryContentType":"Tipo de Contenido","advisoryTitle":"Título","anchor":{"toolbar":"Referencia","menu":"Propiedades de Referencia","title":"Propiedades de Referencia","name":"Nombre de la Referencia","errorName":"Por favor, complete el nombre de la Referencia","remove":"Quitar Referencia"},"anchorId":"Por ID de elemento","anchorName":"Por Nombre de Referencia","charset":"Fuente de caracteres vinculado","cssClasses":"Clases de hojas de estilo","emailAddress":"Dirección de E-Mail","emailBody":"Cuerpo del Mensaje","emailSubject":"Título del Mensaje","id":"Id","info":"Información de Vínculo","langCode":"Código idioma","langDir":"Orientación","langDirLTR":"Izquierda a Derecha (LTR)","langDirRTL":"Derecha a Izquierda (RTL)","menu":"Editar Vínculo","name":"Nombre","noAnchors":"(No hay referencias disponibles en el documento)","noEmail":"Por favor escriba la dirección de e-mail","noUrl":"Por favor escriba el vínculo URL","other":"","popupDependent":"Dependiente (Netscape)","popupFeatures":"Características de Ventana Emergente","popupFullScreen":"Pantalla Completa (IE)","popupLeft":"Posición Izquierda","popupLocationBar":"Barra de ubicación","popupMenuBar":"Barra de Menú","popupResizable":"Redimensionable","popupScrollBars":"Barras de desplazamiento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de Herramientas","popupTop":"Posición Derecha","rel":"Relación","selectAnchor":"Seleccionar una referencia","styles":"Estilo","tabIndex":"Indice de tabulación","target":"Destino","targetFrame":"","targetFrameName":"Nombre del Marco Destino","targetPopup":"","targetPopupName":"Nombre de Ventana Emergente","title":"Vínculo","toAnchor":"Referencia en esta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Insertar/Editar Vínculo","type":"Tipo de vínculo","unlink":"Eliminar Vínculo","upload":"Cargar"},"indent":{"indent":"Aumentar Sangría","outdent":"Disminuir Sangría"},"list":{"bulletedlist":"Viñetas","numberedlist":"Numeración"},"pastetext":{"button":"Pegar como Texto Plano","title":"Pegar como Texto Plano"},"undo":{"redo":"Rehacer","undo":"Deshacer"},"colorbutton":{"auto":"Automático","bgColorTitle":"Color de Fondo","colors":{"000":"Negro","800000":"Marrón oscuro","8B4513":"Marrón tierra","2F4F4F":"Pizarra Oscuro","008080":"Azul verdoso","000080":"Azul marino","4B0082":"Añil","696969":"Gris oscuro","B22222":"Ladrillo","A52A2A":"Marrón","DAA520":"Oro oscuro","006400":"Verde oscuro","40E0D0":"Turquesa","0000CD":"Azul medio-oscuro","800080":"Púrpura","808080":"Gris","F00":"Rojo","FF8C00":"Naranja oscuro","FFD700":"Oro","008000":"Verde","0FF":"Cian","00F":"Azul","EE82EE":"Violeta","A9A9A9":"Gris medio","FFA07A":"Salmón claro","FFA500":"Naranja","FFFF00":"Amarillo","00FF00":"Lima","AFEEEE":"Turquesa claro","ADD8E6":"Azul claro","DDA0DD":"Violeta claro","D3D3D3":"Gris claro","FFF0F5":"Lavanda rojizo","FAEBD7":"Blanco antiguo","FFFFE0":"Amarillo claro","F0FFF0":"Miel","F0FFFF":"Azul celeste","F0F8FF":"Azul pálido","E6E6FA":"Lavanda","FFF":"Blanco"},"more":"Más Colores...","panelTitle":"Colores","textColorTitle":"Color de Texto"},"font":{"fontSize":{"label":"Tamaño","voiceLabel":"Tamaño de fuente","panelTitle":"Tamaño"},"label":"Fuente","panelTitle":"Fuente","voiceLabel":"Fuente"},"image":{"alertUrl":"Por favor escriba la URL de la imagen","alt":"Texto Alternativo","border":"Borde","btnUpload":"Enviar al Servidor","button2Img":"¿Desea convertir el botón de imagen en una simple imagen?","hSpace":"Esp.Horiz","img2Button":"¿Desea convertir la imagen en un botón de imagen?","infoTab":"Información de Imagen","linkTab":"Vínculo","lockRatio":"Proporcional","menu":"Propiedades de Imagen","resetSize":"Tamaño Original","title":"Propiedades de Imagen","titleButton":"Propiedades de Botón de Imagen","upload":"Cargar","urlMissing":"Debe indicar la URL de la imagen.","vSpace":"Esp.Vert","validateBorder":"El borde debe ser un número.","validateHSpace":"El espaciado horizontal debe ser un número.","validateVSpace":"El espaciado vertical debe ser un número."},"scayt":{"about":"Acerca de Corrector","aboutTab":"Acerca de","addWord":"Añadir palabra","allCaps":"Omitir palabras en MAYÚSCULAS","dic_create":"Crear","dic_delete":"Borrar","dic_field_name":"Nombre del diccionario","dic_info":"Inicialmente el Diccionario de usuario se guarda en una Cookie. Sin embargo, las cookies están limitadas en tamaño. Cuando el diccionario crece a un punto en el que no se puede guardar en una Cookie, el diccionario puede ser almacenado en nuestro servidor. Para almacenar su diccionario personalizado en nuestro servidor debe especificar un nombre para su diccionario. Si ya ha guardado un diccionaro, por favor, escriba su nombre y pulse el botón Recuperar","dic_rename":"Renombrar","dic_restore":"Recuperar","dictionariesTab":"Diccionarios","disable":"Desactivar Corrector","emptyDic":"El nombre del diccionario no puede estar en blanco.","enable":"Activar Corrector","ignore":"Ignorar","ignoreAll":"Ignorar Todas","ignoreDomainNames":"Omitir nombres de dominio","langs":"Idiomas","languagesTab":"Idiomas","mixedCase":"Ignorar palabras con combinación de mayúsculas y minúsculas","mixedWithDigits":"Omitir palabras con números","moreSuggestions":"Más sugerencias","opera_title":"No soportado en Opera","options":"Opciones","optionsTab":"Opciones","title":"Comprobar Ortografía Mientras Escribe","toggle":"Cambiar Corrector","noSuggestions":"No suggestion"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Dirección","tag_div":"Normal (DIV)","tag_h1":"Encabezado 1","tag_h2":"Encabezado 2","tag_h3":"Encabezado 3","tag_h4":"Encabezado 4","tag_h5":"Encabezado 5","tag_h6":"Encabezado 6","tag_p":"Normal","tag_pre":"Con formato"},"justify":{"block":"Justificado","center":"Centrar","left":"Alinear a Izquierda","right":"Alinear a Derecha"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Todo","btnReplace":"Reemplazar","btnReplaceAll":"Reemplazar Todo","btnUndo":"Deshacer","changeTo":"Cambiar a","errorLoading":"Error cargando la aplicación del servidor: %s.","ieSpellDownload":"Módulo de Control de Ortografía no instalado.\r\n¿Desea descargarlo ahora?","manyChanges":"Control finalizado: se ha cambiado %1 palabras","noChanges":"Control finalizado: no se ha cambiado ninguna palabra","noMispell":"Control finalizado: no se encontraron errores","noSuggestions":"- No hay sugerencias -","notAvailable":"Lo sentimos pero el servicio no está disponible.","notInDic":"No se encuentra en el Diccionario","oneChange":"Control finalizado: se ha cambiado una palabra","progress":"Control de Ortografía en progreso...","title":"Comprobar ortografía","toolbar":"Ortografía"},"colordialog":{"clear":"Borrar","highlight":"Muestra","options":"Opciones de colores","selected":"Elegido","title":"Elegir color"},"contextmenu":{"options":"Opciones del menú contextual"},"blockquote":{"toolbar":"Cita"},"table":{"border":"Tamaño de Borde","caption":"Título","cell":{"menu":"Celda","insertBefore":"Insertar celda a la izquierda","insertAfter":"Insertar celda a la derecha","deleteCell":"Eliminar Celdas","merge":"Combinar Celdas","mergeRight":"Combinar a la derecha","mergeDown":"Combinar hacia abajo","splitHorizontal":"Dividir la celda horizontalmente","splitVertical":"Dividir la celda verticalmente","title":"Propiedades de celda","cellType":"Tipo de Celda","rowSpan":"Expandir filas","colSpan":"Expandir columnas","wordWrap":"Ajustar al contenido","hAlign":"Alineación Horizontal","vAlign":"Alineación Vertical","alignBaseline":"Linea de base","bgColor":"Color de fondo","borderColor":"Color de borde","data":"Datos","header":"Encabezado","yes":"Sí","no":"No","invalidWidth":"La anchura de celda debe ser un número.","invalidHeight":"La altura de celda debe ser un número.","invalidRowSpan":"La expansión de filas debe ser un número entero.","invalidColSpan":"La expansión de columnas debe ser un número entero.","chooseColor":"Elegir"},"cellPad":"Esp. interior","cellSpace":"Esp. e/celdas","column":{"menu":"Columna","insertBefore":"Insertar columna a la izquierda","insertAfter":"Insertar columna a la derecha","deleteColumn":"Eliminar Columnas"},"columns":"Columnas","deleteTable":"Eliminar Tabla","headers":"Encabezados","headersBoth":"Ambas","headersColumn":"Primera columna","headersNone":"Ninguno","headersRow":"Primera fila","invalidBorder":"El tamaño del borde debe ser un número.","invalidCellPadding":"El espaciado interior debe ser un número.","invalidCellSpacing":"El espaciado entre celdas debe ser un número.","invalidCols":"El número de columnas debe ser un número mayor que 0.","invalidHeight":"La altura de tabla debe ser un número.","invalidRows":"El número de filas debe ser un número mayor que 0.","invalidWidth":"La anchura de tabla debe ser un número.","menu":"Propiedades de Tabla","row":{"menu":"Fila","insertBefore":"Insertar fila en la parte superior","insertAfter":"Insertar fila en la parte inferior","deleteRow":"Eliminar Filas"},"rows":"Filas","summary":"Síntesis","title":"Propiedades de Tabla","toolbar":"Tabla","widthPc":"porcentaje","widthPx":"pixeles","widthUnit":"unidad de la anchura"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Título","cssClassInputLabel":"Clase de hoja de estilos","edit":"Editar Div","inlineStyleInputLabel":"Estilo","langDirLTRLabel":"Izquierda a Derecha (LTR)","langDirLabel":"Orientación","langDirRTLLabel":"Derecha a Izquierda (RTL)","languageCodeInputLabel":" Codigo de idioma","remove":"Quitar Div","styleSelectLabel":"Estilo","title":"Crear contenedor DIV","toolbar":"Crear contenedor DIV"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/is.js0000644000000000000000000003166612247657030021016 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['is']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Fletta í skjalasafni","url":"Vefslóð","protocol":"Samskiptastaðall","upload":"Senda upp","uploadSubmit":"Hlaða upp","image":"Setja inn mynd","flash":"Flash","form":"Setja inn innsláttarform","checkbox":"Setja inn hökunarreit","radio":"Setja inn valhnapp","textField":"Setja inn textareit","textarea":"Setja inn textasvæði","hiddenField":"Setja inn falið svæði","button":"Setja inn hnapp","select":"Setja inn lista","imageButton":"Setja inn myndahnapp","notSet":"","id":"Auðkenni","name":"Nafn","langDir":"Lesstefna","langDirLtr":"Frá vinstri til hægri (LTR)","langDirRtl":"Frá hægri til vinstri (RTL)","langCode":"Tungumálakóði","longDescr":"Nánari lýsing","cssClass":"Stílsniðsflokkur","advisoryTitle":"Titill","cssStyle":"Stíll","ok":"à lagi","cancel":"Hætta við","close":"Close","preview":"Forskoða","resize":"Resize","generalTab":"Almennt","advancedTab":"Tæknilegt","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Mark","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Frá vinstri til hægri (LTR)","langDirRTL":"Frá hægri til vinstri (RTL)","styles":"Stíll","cssClasses":"Stílsniðsflokkur","width":"Breidd","height":"Hæð","align":"Jöfnun","alignLeft":"Vinstri","alignRight":"Hægri","alignCenter":"Miðjað","alignTop":"Efst","alignMiddle":"Miðjuð","alignBottom":"Neðst","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1, unavailable"},"about":{"copy":"Copyright © $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Feitletrað","italic":"Skáletrað","strike":"Yfirstrikað","subscript":"Niðurskrifað","superscript":"Uppskrifað","underline":"Undirstrikað"},"clipboard":{"copy":"Afrita","copyError":"Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).","cut":"Klippa","cutError":"Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).","paste":"Líma","pasteArea":"Paste Area","pasteMsg":"Límdu í svæðið hér að neðan og (Ctrl/Cmd+V) og smelltu á OK.","securityMsg":"Vegna öryggisstillinga í vafranum þínum fær ritillinn ekki beinan aðgang að klippuborðinu. Þú verður að líma innihaldið aftur inn í þennan glugga.","title":"Líma"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Skammvalshnappur","advanced":"Tæknilegt","advisoryContentType":"Tegund innihalds","advisoryTitle":"Titill","anchor":{"toolbar":"Stofna/breyta kaflamerki","menu":"Eigindi kaflamerkis","title":"Eigindi kaflamerkis","name":"Nafn bókamerkis","errorName":"Sláðu inn nafn bókamerkis!","remove":"Remove Anchor"},"anchorId":"Eftir auðkenni einingar","anchorName":"Eftir akkerisnafni","charset":"Táknróf","cssClasses":"Stílsniðsflokkur","emailAddress":"Netfang","emailBody":"Meginmál","emailSubject":"Efni","id":"Auðkenni","info":"Almennt","langCode":"Lesstefna","langDir":"Lesstefna","langDirLTR":"Frá vinstri til hægri (LTR)","langDirRTL":"Frá hægri til vinstri (RTL)","menu":"Breyta stiklu","name":"Nafn","noAnchors":"","noEmail":"Sláðu inn netfang!","noUrl":"Sláðu inn veffang stiklunnar!","other":"","popupDependent":"Háð venslum (Netscape)","popupFeatures":"Eigindi sprettiglugga","popupFullScreen":"Heilskjár (IE)","popupLeft":"Fjarlægð frá vinstri","popupLocationBar":"Fanglína","popupMenuBar":"Vallína","popupResizable":"Resizable","popupScrollBars":"Skrunstikur","popupStatusBar":"Stöðustika","popupToolbar":"Verkfærastika","popupTop":"Fjarlægð frá efri brún","rel":"Relationship","selectAnchor":"Veldu akkeri","styles":"Stíll","tabIndex":"Raðnúmer innsláttarreits","target":"Mark","targetFrame":"","targetFrameName":"Nafn markglugga","targetPopup":"","targetPopupName":"Nafn sprettiglugga","title":"Stikla","toAnchor":"Bókamerki á þessari síðu","toEmail":"Netfang","toUrl":"Vefslóð","toolbar":"Stofna/breyta stiklu","type":"Stikluflokkur","unlink":"Fjarlægja stiklu","upload":"Senda upp"},"indent":{"indent":"Minnka inndrátt","outdent":"Auka inndrátt"},"list":{"bulletedlist":"Punktalisti","numberedlist":"Númeraður listi"},"pastetext":{"button":"Líma sem ósniðinn texta","title":"Líma sem ósniðinn texta"},"undo":{"redo":"Hætta við afturköllun","undo":"Afturkalla"},"colorbutton":{"auto":"Sjálfval","bgColorTitle":"Bakgrunnslitur","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Fleiri liti...","panelTitle":"Colors","textColorTitle":"Litur texta"},"font":{"fontSize":{"label":"Leturstærð ","voiceLabel":"Font Size","panelTitle":"Leturstærð "},"label":"Leturgerð ","panelTitle":"Leturgerð ","voiceLabel":"Leturgerð "},"image":{"alertUrl":"Sláðu inn slóðina að myndinni","alt":"Baklægur texti","border":"Rammi","btnUpload":"Hlaða upp","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Vinstri bil","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Almennt","linkTab":"Stikla","lockRatio":"Festa stærðarhlutfall","menu":"Eigindi myndar","resetSize":"Reikna stærð","title":"Eigindi myndar","titleButton":"Eigindi myndahnapps","upload":"Hlaða upp","urlMissing":"Image source URL is missing.","vSpace":"Hægri bil","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Stílsnið","panelTitle":"Stílsnið","tag_address":"Vistfang","tag_div":"Venjulegt (DIV)","tag_h1":"Fyrirsögn 1","tag_h2":"Fyrirsögn 2","tag_h3":"Fyrirsögn 3","tag_h4":"Fyrirsögn 4","tag_h5":"Fyrirsögn 5","tag_h6":"Fyrirsögn 6","tag_p":"Venjulegt letur","tag_pre":"Forsniðið"},"justify":{"block":"Jafna báðum megin","center":"Miðja texta","left":"Vinstrijöfnun","right":"Hægrijöfnun"},"wsc":{"btnIgnore":"Hunsa","btnIgnoreAll":"Hunsa allt","btnReplace":"Skipta","btnReplaceAll":"Skipta öllu","btnUndo":"Til baka","changeTo":"Tillaga","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Villuleit ekki sett upp.
    Viltu setja hana upp?","manyChanges":"Villuleit lokið: %1 orðum breytt","noChanges":"Villuleit lokið: Engu orði breytt","noMispell":"Villuleit lokið: Engin villa fannst","noSuggestions":"- engar tillögur -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Ekki í orðabókinni","oneChange":"Villuleit lokið: Einu orði breytt","progress":"Villuleit í gangi...","title":"Spell Check","toolbar":"Villuleit"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"contextmenu":{"options":"Context Menu Options"},"blockquote":{"toolbar":"Inndráttur"},"table":{"border":"Breidd ramma","caption":"Titill","cell":{"menu":"Reitur","insertBefore":"Skjóta inn reiti fyrir aftan","insertAfter":"Skjóta inn reiti fyrir framan","deleteCell":"Fella reit","merge":"Sameina reiti","mergeRight":"Sameina til hægri","mergeDown":"Sameina niður á við","splitHorizontal":"Kljúfa reit lárétt","splitVertical":"Kljúfa reit lóðrétt","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Reitaspássía","cellSpace":"Bil milli reita","column":{"menu":"Dálkur","insertBefore":"Skjóta inn dálki vinstra megin","insertAfter":"Skjóta inn dálki hægra megin","deleteColumn":"Fella dálk"},"columns":"Dálkar","deleteTable":"Fella töflu","headers":"Fyrirsagnir","headersBoth":"Hvort tveggja","headersColumn":"Fyrsti dálkur","headersNone":"Engar","headersRow":"Fyrsta röð","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Eigindi töflu","row":{"menu":"Röð","insertBefore":"Skjóta inn röð fyrir ofan","insertAfter":"Skjóta inn röð fyrir neðan","deleteRow":"Eyða röð"},"rows":"Raðir","summary":"Ãfram","title":"Eigindi töflu","toolbar":"Tafla","widthPc":"prósent","widthPx":"myndeindir","widthUnit":"width unit"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/fr.js0000644000000000000000000003446312247657030021010 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['fr']={"editor":"Éditeur de Texte Enrichi","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Appuyez sur ALT-0 pour l'aide","browseServer":"Explorer le serveur","url":"URL","protocol":"Protocole","upload":"Envoyer","uploadSubmit":"Envoyer sur le serveur","image":"Image","flash":"Flash","form":"Formulaire","checkbox":"Case à cocher","radio":"Bouton Radio","textField":"Champ texte","textarea":"Zone de texte","hiddenField":"Champ caché","button":"Bouton","select":"Liste déroulante","imageButton":"Bouton image","notSet":"","id":"Id","name":"Nom","langDir":"Sens d'écriture","langDirLtr":"Gauche à droite (LTR)","langDirRtl":"Droite à gauche (RTL)","langCode":"Code de langue","longDescr":"URL de description longue (longdesc => malvoyant)","cssClass":"Classe CSS","advisoryTitle":"Description (title)","cssStyle":"Style","ok":"OK","cancel":"Annuler","close":"Fermer","preview":"Aperçu","resize":"Déplacer pour modifier la taille","generalTab":"Général","advancedTab":"Avancé","validateNumberFailed":"Cette valeur n'est pas un nombre.","confirmNewPage":"Les changements non sauvegardés seront perdus. Êtes-vous sûr de vouloir charger une nouvelle page?","confirmCancel":"Certaines options ont été modifiées. Êtes-vous sûr de vouloir fermer?","options":"Options","target":"Cible (Target)","targetNew":"Nouvelle fenêtre (_blank)","targetTop":"Fenêtre supérieure (_top)","targetSelf":"Même fenêtre (_self)","targetParent":"Fenêtre parent (_parent)","langDirLTR":"Gauche à Droite (LTR)","langDirRTL":"Droite à Gauche (RTL)","styles":"Style","cssClasses":"Classes de style","width":"Largeur","height":"Hauteur","align":"Alignement","alignLeft":"Gauche","alignRight":"Droite","alignCenter":"Centré","alignTop":"Haut","alignMiddle":"Milieu","alignBottom":"Bas","invalidValue":"Valeur incorrecte.","invalidHeight":"La hauteur doit être un nombre.","invalidWidth":"La largeur doit être un nombre.","invalidCssLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure HTML valide (px ou %).","invalidInlineStyle":"La valeur spécifiée pour le style inline doit être composée d'un ou plusieurs couples de valeur au format \"nom : valeur\", separés par des points-virgules.","cssLengthTooltip":"Entrer un nombre pour une valeur en pixels ou un nombre avec une unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1, Indisponible"},"about":{"copy":"Copyright © $1. Tous droits réservés.","dlgTitle":"À propos de CKEditor","help":"Consulter $1 pour l'aide.","moreInfo":"Pour les informations de licence, veuillez visiter notre site web:","title":"À propos de CKEditor","userGuide":"Guide de l'utilisateur CKEditor en anglais"},"basicstyles":{"bold":"Gras","italic":"Italique","strike":"Barré","subscript":"Indice","superscript":"Exposant","underline":"Souligné"},"clipboard":{"copy":"Copier","copyError":"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).","cut":"Couper","cutError":"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement l'opération \"couper\". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).","paste":"Coller","pasteArea":"Coller la zone","pasteMsg":"Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (Ctrl/Cmd+V) et cliquez sur OK.","securityMsg":"A cause des paramètres de sécurité de votre navigateur, l'éditeur n'est pas en mesure d'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.","title":"Coller"},"toolbar":{"toolbarCollapse":"Enrouler la barre d'outils","toolbarExpand":"Dérouler la barre d'outils","toolbarGroups":{"document":"Document","clipboard":"Presse-papier/Défaire","editing":"Editer","forms":"Formulaires","basicstyles":"Styles de base","paragraph":"Paragraphe","links":"Liens","insert":"Insérer","styles":"Styles","colors":"Couleurs","tools":"Outils"},"toolbars":"Barre d'outils de l'éditeur"},"fakeobjects":{"anchor":"Ancre","flash":"Animation Flash","hiddenfield":"Champ caché","iframe":"IFrame","unknown":"Objet inconnu"},"link":{"acccessKey":"Touche d'accessibilité","advanced":"Avancé","advisoryContentType":"Type de contenu (ex: text/html)","advisoryTitle":"Description (title)","anchor":{"toolbar":"Ancre","menu":"Editer l'ancre","title":"Propriétés de l'ancre","name":"Nom de l'ancre","errorName":"Veuillez entrer le nom de l'ancre.","remove":"Supprimer l'ancre"},"anchorId":"Par ID d'élément","anchorName":"Par nom d'ancre","charset":"Charset de la cible","cssClasses":"Classe CSS","emailAddress":"Adresse E-Mail","emailBody":"Corps du message","emailSubject":"Sujet du message","id":"Id","info":"Infos sur le lien","langCode":"Code de langue","langDir":"Sens d'écriture","langDirLTR":"Gauche à droite","langDirRTL":"Droite à gauche","menu":"Editer le lien","name":"Nom","noAnchors":"(Aucune ancre disponible dans ce document)","noEmail":"Veuillez entrer l'adresse e-mail","noUrl":"Veuillez entrer l'adresse du lien","other":"","popupDependent":"Dépendante (Netscape)","popupFeatures":"Options de la fenêtre popup","popupFullScreen":"Plein écran (IE)","popupLeft":"Position gauche","popupLocationBar":"Barre d'adresse","popupMenuBar":"Barre de menu","popupResizable":"Redimensionnable","popupScrollBars":"Barres de défilement","popupStatusBar":"Barre de status","popupToolbar":"Barre d'outils","popupTop":"Position haute","rel":"Relation","selectAnchor":"Sélectionner l'ancre","styles":"Style","tabIndex":"Index de tabulation","target":"Cible","targetFrame":"","targetFrameName":"Nom du Cadre destination","targetPopup":"","targetPopupName":"Nom de la fenêtre popup","title":"Lien","toAnchor":"Transformer le lien en ancre dans le texte","toEmail":"E-mail","toUrl":"URL","toolbar":"Lien","type":"Type de lien","unlink":"Supprimer le lien","upload":"Envoyer"},"indent":{"indent":"Augmenter le retrait (tabulation)","outdent":"Diminuer le retrait (tabulation)"},"list":{"bulletedlist":"Insérer/Supprimer la liste à puces","numberedlist":"Insérer/Supprimer la liste numérotée"},"pastetext":{"button":"Coller comme texte sans mise en forme","title":"Coller comme texte sans mise en forme"},"undo":{"redo":"Rétablir","undo":"Annuler"},"colorbutton":{"auto":"Automatique","bgColorTitle":"Couleur d'arrière plan","colors":{"000":"Noir","800000":"Marron","8B4513":"Brun moyen","2F4F4F":"Vert sombre","008080":"Canard","000080":"Bleu marine","4B0082":"Indigo","696969":"Gris foncé","B22222":"Rouge brique","A52A2A":"Brun","DAA520":"Or terni","006400":"Vert foncé","40E0D0":"Turquoise","0000CD":"Bleu royal","800080":"Pourpre","808080":"Gris","F00":"Rouge","FF8C00":"Orange foncé","FFD700":"Or","008000":"Vert","0FF":"Cyan","00F":"Bleu","EE82EE":"Violet","A9A9A9":"Gris moyen","FFA07A":"Saumon","FFA500":"Orange","FFFF00":"Jaune","00FF00":"Lime","AFEEEE":"Turquoise clair","ADD8E6":"Bleu clair","DDA0DD":"Prune","D3D3D3":"Gris clair","FFF0F5":"Fard Lavande","FAEBD7":"Blanc antique","FFFFE0":"Jaune clair","F0FFF0":"Honeydew","F0FFFF":"Azur","F0F8FF":"Bleu Alice","E6E6FA":"Lavande","FFF":"Blanc"},"more":"Plus de couleurs...","panelTitle":"Couleurs","textColorTitle":"Couleur de texte"},"font":{"fontSize":{"label":"Taille","voiceLabel":"Taille de police","panelTitle":"Taille de police"},"label":"Police","panelTitle":"Style de police","voiceLabel":"Police"},"image":{"alertUrl":"Veuillez entrer l'adresse de l'image","alt":"Texte de remplacement","border":"Bordure","btnUpload":"Envoyer sur le serveur","button2Img":"Voulez-vous transformer le bouton image sélectionné en simple image?","hSpace":"Espacement horizontal","img2Button":"Voulez-vous transformer l'image en bouton image?","infoTab":"Informations sur l'image","linkTab":"Lien","lockRatio":"Conserver les proportions","menu":"Propriétés de l'image","resetSize":"Taille d'origine","title":"Propriétés de l'image","titleButton":"Propriétés du bouton image","upload":"Envoyer","urlMissing":"L'adresse source de l'image est manquante.","vSpace":"Espacement vertical","validateBorder":"Bordure doit être un entier.","validateHSpace":"HSpace doit être un entier.","validateVSpace":"VSpace doit être un entier."},"scayt":{"about":"A propos de SCAYT","aboutTab":"À propos de","addWord":"Ajouter le mot","allCaps":"Ignorer les mots entièrement en majuscules","dic_create":"Créer","dic_delete":"Effacer","dic_field_name":"Nom du dictionnaire","dic_info":"Initialement, le dictionnaire de l'utilisateur est stocké dans un cookie. Cependant, les cookies sont limités en taille. Quand le dictionnaire atteint une taille qu'il n'est plus possible de stocker dans un cookie, il peut alors être stocké sur nos serveurs. Afin de stocker votre dictionnaire personnel sur nos serveurs, vous devez spécifier un nom pour ce dictionnaire. Si vous avez déjà un dictionnaire stocké, merci de taper son nom puis cliquer sur Restaurer pour le récupérer.","dic_rename":"Renommer","dic_restore":"Restaurer","dictionariesTab":"Dictionnaires","disable":"Désactiver SCAYT","emptyDic":"Le nom du dictionnaire ne devrait pas être vide.","enable":"Activer SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Tout","ignoreDomainNames":"Ignorer les noms de domaines","langs":"Langues","languagesTab":"Langues","mixedCase":"Ignorer les mots à casse multiple","mixedWithDigits":"Ignorer les mots contenant des chiffres","moreSuggestions":"Plus de suggestions","opera_title":"Non supporté par Opera","options":"Options","optionsTab":"Options","title":"Vérification de l'Orthographe en Cours de Frappe (SCAYT)","toggle":"Activer/Désactiver SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Format","panelTitle":"Format de paragraphe","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Titre 1","tag_h2":"Titre 2","tag_h3":"Titre 3","tag_h4":"Titre 4","tag_h5":"Titre 5","tag_h6":"Titre 6","tag_p":"Normal","tag_pre":"Formaté"},"justify":{"block":"Justifier","center":"Centrer","left":"Aligner à gauche","right":"Aligner à droite"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer tout","btnReplace":"Remplacer","btnReplaceAll":"Remplacer tout","btnUndo":"Annuler","changeTo":"Modifier pour","errorLoading":"Erreur du chargement du service depuis l'hôte : %s.","ieSpellDownload":"La vérification d'orthographe n'est pas installée. Voulez-vous la télécharger maintenant?","manyChanges":"Vérification de l'orthographe terminée : %1 mots corrigés.","noChanges":"Vérification de l'orthographe terminée : Aucun mot corrigé.","noMispell":"Vérification de l'orthographe terminée : aucune erreur trouvée.","noSuggestions":"- Aucune suggestion -","notAvailable":"Désolé, le service est indisponible actuellement.","notInDic":"N'existe pas dans le dictionnaire.","oneChange":"Vérification de l'orthographe terminée : Un seul mot corrigé.","progress":"Vérification de l'orthographe en cours...","title":"Vérifier l'orthographe","toolbar":"Vérifier l'orthographe"},"colordialog":{"clear":"Effacer","highlight":"Détails","options":"Option des couleurs","selected":"Couleur choisie","title":"Choisir une couleur"},"contextmenu":{"options":"Options du menu contextuel"},"blockquote":{"toolbar":"Citation"},"table":{"border":"Taille de la bordure","caption":"Titre du tableau","cell":{"menu":"Cellule","insertBefore":"Insérer une cellule avant","insertAfter":"Insérer une cellule après","deleteCell":"Supprimer les cellules","merge":"Fusionner les cellules","mergeRight":"Fusionner à droite","mergeDown":"Fusionner en bas","splitHorizontal":"Fractionner horizontalement","splitVertical":"Fractionner verticalement","title":"Propriétés de la cellule","cellType":"Type de cellule","rowSpan":"Fusion de lignes","colSpan":"Fusion de colonnes","wordWrap":"Césure","hAlign":"Alignement Horizontal","vAlign":"Alignement Vertical","alignBaseline":"Bas du texte","bgColor":"Couleur d'arrière-plan","borderColor":"Couleur de Bordure","data":"Données","header":"Entête","yes":"Oui","no":"Non","invalidWidth":"La Largeur de Cellule doit être un nombre.","invalidHeight":"La Hauteur de Cellule doit être un nombre.","invalidRowSpan":"La fusion de lignes doit être un nombre entier.","invalidColSpan":"La fusion de colonnes doit être un nombre entier.","chooseColor":"Choisissez"},"cellPad":"Marge interne des cellules","cellSpace":"Espacement des cellules","column":{"menu":"Colonnes","insertBefore":"Insérer une colonne avant","insertAfter":"Insérer une colonne après","deleteColumn":"Supprimer les colonnes"},"columns":"Colonnes","deleteTable":"Supprimer le tableau","headers":"En-Têtes","headersBoth":"Les deux","headersColumn":"Première colonne","headersNone":"Aucunes","headersRow":"Première ligne","invalidBorder":"La taille de la bordure doit être un nombre.","invalidCellPadding":"La marge intérieure des cellules doit être un nombre positif.","invalidCellSpacing":"L'espacement des cellules doit être un nombre positif.","invalidCols":"Le nombre de colonnes doit être supérieur à 0.","invalidHeight":"La hauteur du tableau doit être un nombre.","invalidRows":"Le nombre de lignes doit être supérieur à 0.","invalidWidth":"La largeur du tableau doit être un nombre.","menu":"Propriétés du tableau","row":{"menu":"Ligne","insertBefore":"Insérer une ligne avant","insertAfter":"Insérer une ligne après","deleteRow":"Supprimer les lignes"},"rows":"Lignes","summary":"Résumé (description)","title":"Propriétés du tableau","toolbar":"Tableau","widthPc":"% pourcents","widthPx":"pixels","widthUnit":"unité de largeur"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Classe CSS","edit":"Éditer la DIV","inlineStyleInputLabel":"Style en ligne","langDirLTRLabel":"Gauche à droite (LTR)","langDirLabel":"Sens d'écriture","langDirRTLLabel":"Droite à gauche (RTL)","languageCodeInputLabel":"Code de langue","remove":"Enlever la DIV","styleSelectLabel":"Style","title":"Créer un container DIV","toolbar":"Créer un container DIV"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/de.js0000644000000000000000000003350712247657030020767 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['de']={"editor":"WYSIWYG-Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Drücken Sie ALT 0 für Hilfe","browseServer":"Server durchsuchen","url":"URL","protocol":"Protokoll","upload":"Hochladen","uploadSubmit":"Zum Server senden","image":"Bild","flash":"Flash","form":"Formular","checkbox":"Checkbox","radio":"Radiobutton","textField":"Textfeld einzeilig","textarea":"Textfeld mehrzeilig","hiddenField":"Verstecktes Feld","button":"Klickbutton","select":"Auswahlfeld","imageButton":"Bildbutton","notSet":"","id":"ID","name":"Name","langDir":"Schreibrichtung","langDirLtr":"Links nach Rechts (LTR)","langDirRtl":"Rechts nach Links (RTL)","langCode":"Sprachenkürzel","longDescr":"Langform URL","cssClass":"Stylesheet Klasse","advisoryTitle":"Titel Beschreibung","cssStyle":"Style","ok":"OK","cancel":"Abbrechen","close":"Schließen","preview":"Vorschau","resize":"Zum Vergrößern ziehen","generalTab":"Allgemein","advancedTab":"Erweitert","validateNumberFailed":"Dieser Wert ist keine Nummer.","confirmNewPage":"Alle nicht gespeicherten Änderungen gehen verlohren. Sind Sie sicher die neue Seite zu laden?","confirmCancel":"Einige Optionen wurden geändert. Wollen Sie den Dialog dennoch schließen?","options":"Optionen","target":"Zielseite","targetNew":"Neues Fenster (_blank)","targetTop":"Oberstes Fenster (_top)","targetSelf":"Gleiches Fenster (_self)","targetParent":"Oberes Fenster (_parent)","langDirLTR":"Links nach Rechts (LNR)","langDirRTL":"Rechts nach Links (RNL)","styles":"Style","cssClasses":"Stylesheet Klasse","width":"Breite","height":"Höhe","align":"Ausrichtung","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Zentriert","alignTop":"Oben","alignMiddle":"Mitte","alignBottom":"Unten","invalidValue":"Ungültiger Wert.","invalidHeight":"Höhe muss eine Zahl sein.","invalidWidth":"Breite muss eine Zahl sein.","invalidCssLength":"Wert spezifiziert für \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","invalidHtmlLength":"Wert spezifiziert für \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte HTML Messeinheit (px oder %).","invalidInlineStyle":"Wert spezifiziert für inline Stilart muss enthalten ein oder mehr Tupels mit dem Format \"Name : Wert\" getrennt mit Semikolons.","cssLengthTooltip":"Gebe eine Zahl ein für ein Wert in pixels oder eine Zahl mit einer korrekten CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","unavailable":"%1, nicht verfügbar"},"about":{"copy":"Copyright © $1. Alle Rechte vorbehalten.","dlgTitle":"Über CKEditor","help":"Prüfe $1 für Hilfe.","moreInfo":"Für Informationen über unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:","title":"Über CKEditor","userGuide":"CKEditor Benutzerhandbuch"},"basicstyles":{"bold":"Fett","italic":"Kursiv","strike":"Durchgestrichen","subscript":"Tiefgestellt","superscript":"Hochgestellt","underline":"Unterstrichen"},"clipboard":{"copy":"Kopieren","copyError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).","cut":"Ausschneiden","cutError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).","paste":"Einfügen","pasteArea":"Einfügebereich","pasteMsg":"Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit Strg+V) ein und bestätigen Sie mit OK.","securityMsg":"Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.","title":"Einfügen"},"toolbar":{"toolbarCollapse":"Symbolleiste einklappen","toolbarExpand":"Symbolleiste ausklappen","toolbarGroups":{"document":"Dokument","clipboard":"Zwischenablage/Rückgängig","editing":"Editieren","forms":"Formularen","basicstyles":"Grundstile","paragraph":"Absatz","links":"Links","insert":"Einfügen","styles":"Stile","colors":"Farben","tools":"Werkzeuge"},"toolbars":"Editor Symbolleisten"},"fakeobjects":{"anchor":"Anker","flash":"Flash Animation","hiddenfield":"Verstecktes Feld","iframe":"IFrame","unknown":"Unbekanntes Objekt"},"link":{"acccessKey":"Zugriffstaste","advanced":"Erweitert","advisoryContentType":"Inhaltstyp","advisoryTitle":"Titel Beschreibung","anchor":{"toolbar":"Anker einfügen/editieren","menu":"Anker-Eigenschaften","title":"Anker-Eigenschaften","name":"Anker Name","errorName":"Bitte geben Sie den Namen des Ankers ein","remove":"Anker entfernen"},"anchorId":"nach Element Id","anchorName":"nach Anker Name","charset":"Ziel-Zeichensatz","cssClasses":"Stylesheet Klasse","emailAddress":"E-Mail Adresse","emailBody":"Nachrichtentext","emailSubject":"Betreffzeile","id":"Id","info":"Link-Info","langCode":"Sprachenkürzel","langDir":"Schreibrichtung","langDirLTR":"Links nach Rechts (LTR)","langDirRTL":"Rechts nach Links (RTL)","menu":"Link editieren","name":"Name","noAnchors":"(keine Anker im Dokument vorhanden)","noEmail":"Bitte geben Sie e-Mail Adresse an","noUrl":"Bitte geben Sie die Link-URL an","other":"","popupDependent":"Abhängig (Netscape)","popupFeatures":"Pop-up Fenster-Eigenschaften","popupFullScreen":"Vollbild (IE)","popupLeft":"Linke Position","popupLocationBar":"Adress-Leiste","popupMenuBar":"Menü-Leiste","popupResizable":"Größe änderbar","popupScrollBars":"Rollbalken","popupStatusBar":"Statusleiste","popupToolbar":"Symbolleiste","popupTop":"Obere Position","rel":"Beziehung","selectAnchor":"Anker auswählen","styles":"Style","tabIndex":"Tab-Index","target":"Zielseite","targetFrame":"","targetFrameName":"Ziel-Fenster-Name","targetPopup":"","targetPopupName":"Pop-up Fenster-Name","title":"Link","toAnchor":"Anker in dieser Seite","toEmail":"E-Mail","toUrl":"URL","toolbar":"Link einfügen/editieren","type":"Link-Typ","unlink":"Link entfernen","upload":"Hochladen"},"indent":{"indent":"Einzug erhöhen","outdent":"Einzug verringern"},"list":{"bulletedlist":"Liste","numberedlist":"Nummerierte Liste"},"pastetext":{"button":"Als Text einfügen","title":"Als Text einfügen"},"undo":{"redo":"Wiederherstellen","undo":"Rückgängig"},"colorbutton":{"auto":"Automatisch","bgColorTitle":"Hintergrundfarbe","colors":{"000":"Schwarz","800000":"Kastanienbraun","8B4513":"Braun","2F4F4F":"Dunkles Schiefergrau","008080":"Blaugrün","000080":"Navy","4B0082":"Indigo","696969":"Dunkelgrau","B22222":"Ziegelrot","A52A2A":"Braun","DAA520":"Goldgelb","006400":"Dunkelgrün","40E0D0":"Türkis","0000CD":"Medium Blau","800080":"Lila","808080":"Grau","F00":"Rot","FF8C00":"Dunkelorange","FFD700":"Gold","008000":"Grün","0FF":"Cyan","00F":"Blau","EE82EE":"Hellviolett","A9A9A9":"Dunkelgrau","FFA07A":"Helles Lachsrosa","FFA500":"Orange","FFFF00":"Gelb","00FF00":"Lime","AFEEEE":"Blaß-Türkis","ADD8E6":"Hellblau","DDA0DD":"Pflaumenblau","D3D3D3":"Hellgrau","FFF0F5":"Lavendel","FAEBD7":"Antik Weiß","FFFFE0":"Hellgelb","F0FFF0":"Honigtau","F0FFFF":"Azurblau","F0F8FF":"Alice Blau","E6E6FA":"Lavendel","FFF":"Weiß"},"more":"Weitere Farben...","panelTitle":"Farben","textColorTitle":"Textfarbe"},"font":{"fontSize":{"label":"Größe","voiceLabel":"Schrifgröße","panelTitle":"Größe"},"label":"Schriftart","panelTitle":"Schriftart","voiceLabel":"Schriftart"},"image":{"alertUrl":"Bitte geben Sie die Bild-URL an","alt":"Alternativer Text","border":"Rahmen","btnUpload":"Zum Server senden","button2Img":"Möchten Sie den gewählten Bild-Button in ein einfaches Bild umwandeln?","hSpace":"Horizontal-Abstand","img2Button":"Möchten Sie das gewählten Bild in einen Bild-Button umwandeln?","infoTab":"Bild-Info","linkTab":"Link","lockRatio":"Größenverhältnis beibehalten","menu":"Bild-Eigenschaften","resetSize":"Größe zurücksetzen","title":"Bild-Eigenschaften","titleButton":"Bildbutton-Eigenschaften","upload":"Hochladen","urlMissing":"Imagequelle URL fehlt.","vSpace":"Vertikal-Abstand","validateBorder":"Rahmen muß eine ganze Zahl sein.","validateHSpace":"Horizontal-Abstand muß eine ganze Zahl sein.","validateVSpace":"Vertikal-Abstand muß eine ganze Zahl sein."},"scayt":{"about":"Über SCAYT","aboutTab":"Über","addWord":"Wort hinzufügen","allCaps":"Groß geschriebenen Wörter ignorieren","dic_create":"Erzeugen","dic_delete":"Löschen","dic_field_name":"Wörterbuchname","dic_info":"Anfangs wird das Benutzerwörterbuch in einem Cookie gespeichert. Allerdings sind Cookies in der Größe begrenzt. Wenn das Benutzerwörterbuch bis zu einem Punkt wächst, wo es nicht mehr in einem Cookie gespeichert werden kann, wird das Benutzerwörterbuch auf dem Server gespeichert. Um Ihr persönliches Wörterbuch auf dem Server zu speichern, müssen Sie einen Namen für das Wörterbuch angeben. Falls Sie schon ein gespeicherte Wörterbuch haben, geben Sie bitte dessen Namen ein und klicken Sie auf die Schaltfläche Wiederherstellen.","dic_rename":"Umbenennen","dic_restore":"Wiederherstellen","dictionariesTab":"Wörterbücher","disable":"SCAYT ausschalten","emptyDic":"Wörterbuchname sollte leer sein.","enable":"SCAYT einschalten","ignore":"Ignorieren","ignoreAll":"Alle ignorieren","ignoreDomainNames":"Domain-Namen ignorieren","langs":"Sprachen","languagesTab":"Sprachen","mixedCase":"Wörter mit gemischte Setzkasten ignorieren","mixedWithDigits":"Wörter mit Zahlen ignorieren","moreSuggestions":"Mehr Vorschläge","opera_title":"Nicht von Opera unterstützt","options":"Optionen","optionsTab":"Optionen","title":"Rechtschreibprüfung während der Texteingabe (SCAYT)","toggle":"SCAYT umschalten","noSuggestions":"No suggestion"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Addresse","tag_div":"Normal (DIV)","tag_h1":"Überschrift 1","tag_h2":"Überschrift 2","tag_h3":"Überschrift 3","tag_h4":"Überschrift 4","tag_h5":"Überschrift 5","tag_h6":"Überschrift 6","tag_p":"Normal","tag_pre":"Formatiert"},"justify":{"block":"Blocksatz","center":"Zentriert","left":"Linksbündig","right":"Rechtsbündig"},"wsc":{"btnIgnore":"Ignorieren","btnIgnoreAll":"Alle Ignorieren","btnReplace":"Ersetzen","btnReplaceAll":"Alle Ersetzen","btnUndo":"Rückgängig","changeTo":"Ändern in","errorLoading":"Fehler beim laden des Dienstanbieters: %s.","ieSpellDownload":"Rechtschreibprüfung nicht installiert. Möchten Sie sie jetzt herunterladen?","manyChanges":"Rechtschreibprüfung abgeschlossen - %1 Wörter geändert","noChanges":"Rechtschreibprüfung abgeschlossen - keine Worte geändert","noMispell":"Rechtschreibprüfung abgeschlossen - keine Fehler gefunden","noSuggestions":" - keine Vorschläge - ","notAvailable":"Entschuldigung, aber dieser Dienst steht im Moment nicht zur Verfügung.","notInDic":"Nicht im Wörterbuch","oneChange":"Rechtschreibprüfung abgeschlossen - ein Wort geändert","progress":"Rechtschreibprüfung läuft...","title":"Rechtschreibprüfung","toolbar":"Rechtschreibprüfung"},"colordialog":{"clear":"Entfernen","highlight":"Hervorheben","options":"Farbeoptionen","selected":"Ausgewählte Farbe","title":"Farbe wählen"},"contextmenu":{"options":"Kontextmenü Optionen"},"blockquote":{"toolbar":"Zitatblock"},"table":{"border":"Rahmen","caption":"Überschrift","cell":{"menu":"Zelle","insertBefore":"Zelle davor einfügen","insertAfter":"Zelle danach einfügen","deleteCell":"Zelle löschen","merge":"Zellen verbinden","mergeRight":"Nach rechts verbinden","mergeDown":"Nach unten verbinden","splitHorizontal":"Zelle horizontal teilen","splitVertical":"Zelle vertikal teilen","title":"Zellen-Eigenschaften","cellType":"Zellart","rowSpan":"Anzahl Zeilen verbinden","colSpan":"Anzahl Spalten verbinden","wordWrap":"Zeilenumbruch","hAlign":"Horizontale Ausrichtung","vAlign":"Vertikale Ausrichtung","alignBaseline":"Grundlinie","bgColor":"Hintergrundfarbe","borderColor":"Rahmenfarbe","data":"Daten","header":"Überschrift","yes":"Ja","no":"Nein","invalidWidth":"Zellenbreite muß eine Zahl sein.","invalidHeight":"Zellenhöhe muß eine Zahl sein.","invalidRowSpan":"\"Anzahl Zeilen verbinden\" muss eine Ganzzahl sein.","invalidColSpan":"\"Anzahl Spalten verbinden\" muss eine Ganzzahl sein.","chooseColor":"Wählen"},"cellPad":"Zellenabstand innen","cellSpace":"Zellenabstand außen","column":{"menu":"Spalte","insertBefore":"Spalte links davor einfügen","insertAfter":"Spalte rechts danach einfügen","deleteColumn":"Spalte löschen"},"columns":"Spalte","deleteTable":"Tabelle löschen","headers":"Kopfzeile","headersBoth":"Beide","headersColumn":"Erste Spalte","headersNone":"Keine","headersRow":"Erste Zeile","invalidBorder":"Die Rahmenbreite muß eine Zahl sein.","invalidCellPadding":"Der Zellenabstand innen muß eine positive Zahl sein.","invalidCellSpacing":"Der Zellenabstand außen muß eine positive Zahl sein.","invalidCols":"Die Anzahl der Spalten muß größer als 0 sein..","invalidHeight":"Die Tabellenbreite muß eine Zahl sein.","invalidRows":"Die Anzahl der Zeilen muß größer als 0 sein.","invalidWidth":"Die Tabellenbreite muss eine Zahl sein.","menu":"Tabellen-Eigenschaften","row":{"menu":"Zeile","insertBefore":"Zeile oberhalb einfügen","insertAfter":"Zeile unterhalb einfügen","deleteRow":"Zeile entfernen"},"rows":"Zeile","summary":"Inhaltsübersicht","title":"Tabellen-Eigenschaften","toolbar":"Tabelle","widthPc":"%","widthPx":"Pixel","widthUnit":"Breite Einheit"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Tooltip","cssClassInputLabel":"Stylesheet Klasse","edit":"Div bearbeiten","inlineStyleInputLabel":"Inline Stil","langDirLTRLabel":"Links nach Rechs (LTR)","langDirLabel":"Sprache Richtung","langDirRTLLabel":"Rechs nach Links (RTL)","languageCodeInputLabel":"Sprachenkürzel","remove":"Div entfernen","styleSelectLabel":"Style","title":"Div Container erzeugen","toolbar":"Div Container erzeugen"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/da.js0000644000000000000000000003172512247657030020763 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['da']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Tryk ALT 0 for hjælp","browseServer":"Gennemse...","url":"URL","protocol":"Protokol","upload":"Upload","uploadSubmit":"Upload","image":"Indsæt billede","flash":"Indsæt Flash","form":"Indsæt formular","checkbox":"Indsæt afkrydsningsfelt","radio":"Indsæt alternativknap","textField":"Indsæt tekstfelt","textarea":"Indsæt tekstboks","hiddenField":"Indsæt skjult felt","button":"Indsæt knap","select":"Indsæt liste","imageButton":"Indsæt billedknap","notSet":"","id":"Id","name":"Navn","langDir":"Tekstretning","langDirLtr":"Fra venstre mod højre (LTR)","langDirRtl":"Fra højre mod venstre (RTL)","langCode":"Sprogkode","longDescr":"Udvidet beskrivelse","cssClass":"Typografiark (CSS)","advisoryTitle":"Titel","cssStyle":"Typografi (CSS)","ok":"OK","cancel":"Annullér","close":"Luk","preview":"ForhÃ¥ndsvisning","resize":"Træk for at skalere","generalTab":"Generelt","advancedTab":"Avanceret","validateNumberFailed":"Værdien er ikke et tal.","confirmNewPage":"Alt indhold, der ikke er blevet gemt, vil gÃ¥ tabt. Er du sikker pÃ¥, at du vil indlæse en ny side?","confirmCancel":"Nogle af indstillingerne er blevet ændret. Er du sikker pÃ¥, at du vil lukke vinduet?","options":"Vis muligheder","target":"MÃ¥l","targetNew":"Nyt vindue (_blank)","targetTop":"Øverste vindue (_top)","targetSelf":"Samme vindue (_self)","targetParent":"Samme vindue (_parent)","langDirLTR":"Venstre til højre (LTR)","langDirRTL":"Højre til venstre (RTL)","styles":"Style","cssClasses":"Stylesheetklasser","width":"Bredde","height":"Højde","align":"Justering","alignLeft":"Venstre","alignRight":"Højre","alignCenter":"Centreret","alignTop":"Øverst","alignMiddle":"Centreret","alignBottom":"Nederst","invalidValue":"Invalid value.","invalidHeight":"Højde skal være et tal.","invalidWidth":"Bredde skal være et tal.","invalidCssLength":"Værdien specificeret for \"%1\" feltet skal være et positivt nummer med eller uden en CSS mÃ¥leenhed (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Værdien specificeret for \"%1\" feltet skal være et positivt nummer med eller uden en CSS mÃ¥leenhed (px eller %).","invalidInlineStyle":"Værdien specificeret for inline style skal indeholde en eller flere elementer med et format som \"name:value\", separeret af semikoloner","cssLengthTooltip":"Indsæt en numerisk værdi i pixel eller nummer med en gyldig CSS værdi (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1, ikke tilgængelig"},"about":{"copy":"Copyright © $1. Alle rettigheder forbeholdes.","dlgTitle":"Om CKEditor","help":"Se $1 for at fÃ¥ hjælp.","moreInfo":"For informationer omkring licens, se venligst vores hjemmeside (pÃ¥ engelsk):","title":"Om CKEditor","userGuide":"CKEditor-brugermanual"},"basicstyles":{"bold":"Fed","italic":"Kursiv","strike":"Gennemstreget","subscript":"Sænket skrift","superscript":"Hævet skrift","underline":"Understreget"},"clipboard":{"copy":"Kopiér","copyError":"Din browsers sikkerhedsindstillinger tillader ikke editoren at fÃ¥ automatisk adgang til udklipsholderen.

    Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).","cut":"Klip","cutError":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.

    Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).","paste":"Indsæt","pasteArea":"Indsæt område","pasteMsg":"Indsæt i feltet herunder (Ctrl/Cmd+V) og klik på OK.","securityMsg":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.

    Du skal indsætte udklipsholderens indhold i dette vindue igen.","title":"Indsæt"},"toolbar":{"toolbarCollapse":"Sammenklap værktøjslinje","toolbarExpand":"Udvid værktøjslinje","toolbarGroups":{"document":"Dokument","clipboard":"Udklipsholder/Fortryd","editing":"Redigering","forms":"Formularer","basicstyles":"Basis styles","paragraph":"Paragraf","links":"Links","insert":"Indsæt","styles":"Typografier","colors":"Farver","tools":"Værktøjer"},"toolbars":"Editors værktøjslinjer"},"fakeobjects":{"anchor":"Anker","flash":"Flashanimation","hiddenfield":"Skjult felt","iframe":"Iframe","unknown":"Ukendt objekt"},"link":{"acccessKey":"Genvejstast","advanced":"Avanceret","advisoryContentType":"Indholdstype","advisoryTitle":"Titel","anchor":{"toolbar":"Indsæt/redigér bogmærke","menu":"Egenskaber for bogmærke","title":"Egenskaber for bogmærke","name":"Bogmærkenavn","errorName":"Indtast bogmærkenavn","remove":"Fjern bogmærke"},"anchorId":"Efter element-Id","anchorName":"Efter ankernavn","charset":"Tegnsæt","cssClasses":"Typografiark","emailAddress":"E-mailadresse","emailBody":"Besked","emailSubject":"Emne","id":"Id","info":"Generelt","langCode":"Tekstretning","langDir":"Tekstretning","langDirLTR":"Fra venstre mod højre (LTR)","langDirRTL":"Fra højre mod venstre (RTL)","menu":"Redigér hyperlink","name":"Navn","noAnchors":"(Ingen bogmærker i dokumentet)","noEmail":"Indtast e-mailadresse!","noUrl":"Indtast hyperlink-URL!","other":"","popupDependent":"Koblet/dependent (Netscape)","popupFeatures":"Egenskaber for popup","popupFullScreen":"Fuld skærm (IE)","popupLeft":"Position fra venstre","popupLocationBar":"Adresselinje","popupMenuBar":"Menulinje","popupResizable":"Justérbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Værktøjslinje","popupTop":"Position fra toppen","rel":"Relation","selectAnchor":"Vælg et anker","styles":"Typografi","tabIndex":"Tabulatorindeks","target":"MÃ¥l","targetFrame":"","targetFrameName":"Destinationsvinduets navn","targetPopup":"","targetPopupName":"Popupvinduets navn","title":"Egenskaber for hyperlink","toAnchor":"Bogmærke pÃ¥ denne side","toEmail":"E-mail","toUrl":"URL","toolbar":"Indsæt/redigér hyperlink","type":"Type","unlink":"Fjern hyperlink","upload":"Upload"},"indent":{"indent":"Forøg indrykning","outdent":"Formindsk indrykning"},"list":{"bulletedlist":"Punktopstilling","numberedlist":"Talopstilling"},"pastetext":{"button":"Indsæt som ikke-formateret tekst","title":"Indsæt som ikke-formateret tekst"},"undo":{"redo":"Annullér fortryd","undo":"Fortryd"},"colorbutton":{"auto":"Automatisk","bgColorTitle":"Baggrundsfarve","colors":{"000":"Sort","800000":"Mørkerød","8B4513":"Mørk orange","2F4F4F":"Dark Slate GrÃ¥","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"MørkegrÃ¥","B22222":"Scarlet / Rød","A52A2A":"Brun","DAA520":"Guld","006400":"Mørkegrøn","40E0D0":"Tyrkis","0000CD":"MellemblÃ¥","800080":"Lilla","808080":"GrÃ¥","F00":"Rød","FF8C00":"Mørk orange","FFD700":"Guld","008000":"Grøn","0FF":"Cyan","00F":"BlÃ¥","EE82EE":"Violet","A9A9A9":"MatgrÃ¥","FFA07A":"Laksefarve","FFA500":"Orange","FFFF00":"Gul","00FF00":"Lime","AFEEEE":"Mat tyrkis","ADD8E6":"LyseblÃ¥","DDA0DD":"Plum","D3D3D3":"LysegrÃ¥","FFF0F5":"Lavender Blush","FAEBD7":"Antikhvid","FFFFE0":"Lysegul","F0FFF0":"Gul / Beige","F0FFFF":"HimmeblÃ¥","F0F8FF":"Alice blue","E6E6FA":"Lavendel","FFF":"Hvid"},"more":"Flere farver...","panelTitle":"Farver","textColorTitle":"Tekstfarve"},"font":{"fontSize":{"label":"Skriftstørrelse","voiceLabel":"Skriftstørrelse","panelTitle":"Skriftstørrelse"},"label":"Skrifttype","panelTitle":"Skrifttype","voiceLabel":"Skrifttype"},"image":{"alertUrl":"Indtast stien til billedet","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Upload fil til serveren","button2Img":"Vil du lave billedknappen om til et almindeligt billede?","hSpace":"Vandret margen","img2Button":"Vil du lave billedet om til en billedknap?","infoTab":"Generelt","linkTab":"Hyperlink","lockRatio":"LÃ¥s størrelsesforhold","menu":"Egenskaber for billede","resetSize":"Nulstil størrelse","title":"Egenskaber for billede","titleButton":"Egenskaber for billedknap","upload":"Upload","urlMissing":"Kilde pÃ¥ billed-URL mangler","vSpace":"Lodret margen","validateBorder":"Kant skal være et helt nummer.","validateHSpace":"HSpace skal være et helt nummer.","validateVSpace":"VSpace skal være et helt nummer."},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Tilføj ord","allCaps":"Ignorer alle store bogstaver","dic_create":"Opret","dic_delete":"Slet","dic_field_name":"Navn pÃ¥ ordbog","dic_info":"Til start er brugerordbogen gemt i en Cookie. Dog har Cookies en begrænsning pÃ¥ størrelse. NÃ¥r ordbogen nÃ¥r en bestemt størrelse kan den blive gemt pÃ¥ vores server. For at gemme din personlige ordbog pÃ¥ vores server skal du angive et navn for denne. SÃ¥fremt du allerede har gemt en ordbog, skriv navnet pÃ¥ denne og klik pÃ¥ Gendan knappen.","dic_rename":"Omdøb","dic_restore":"Gendan","dictionariesTab":"Ordbøger","disable":"Deaktivér SCAYT","emptyDic":"Ordbogsnavn mÃ¥ ikke være tom.","enable":"Aktivér SCAYT","ignore":"Ignorér","ignoreAll":"Ignorér alle","ignoreDomainNames":"Ignorér domænenavne","langs":"Sprog","languagesTab":"Sprog","mixedCase":"Ignorer ord med store og smÃ¥ bogstaver","mixedWithDigits":"Ignorér ord med numre","moreSuggestions":"Flere forslag","opera_title":"Ikke supporteret af Opera","options":"Indstillinger","optionsTab":"Indstillinger","title":"Stavekontrol mens du skriver","toggle":"Skift/toggle SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Formatering","panelTitle":"Formatering","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formateret"},"justify":{"block":"Lige margener","center":"Centreret","left":"Venstrestillet","right":"Højrestillet"},"wsc":{"btnIgnore":"Ignorér","btnIgnoreAll":"Ignorér alle","btnReplace":"Erstat","btnReplaceAll":"Erstat alle","btnUndo":"Tilbage","changeTo":"Forslag","errorLoading":"Fejl ved indlæsning af host: %s.","ieSpellDownload":"Stavekontrol ikke installeret. Vil du installere den nu?","manyChanges":"Stavekontrol færdig: %1 ord ændret","noChanges":"Stavekontrol færdig: Ingen ord ændret","noMispell":"Stavekontrol færdig: Ingen fejl fundet","noSuggestions":"(ingen forslag)","notAvailable":"Stavekontrol er desværre ikke tilgængelig.","notInDic":"Ikke i ordbogen","oneChange":"Stavekontrol færdig: Et ord ændret","progress":"Stavekontrollen arbejder...","title":"Stavekontrol","toolbar":"Stavekontrol"},"colordialog":{"clear":"Nulstil","highlight":"Markér","options":"Farvemuligheder","selected":"Valgt farve","title":"Vælg farve"},"contextmenu":{"options":"Muligheder for hjælpemenu"},"blockquote":{"toolbar":"Blokcitat"},"table":{"border":"Rammebredde","caption":"Titel","cell":{"menu":"Celle","insertBefore":"Indsæt celle før","insertAfter":"Indsæt celle efter","deleteCell":"Slet celle","merge":"Flet celler","mergeRight":"Flet til højre","mergeDown":"Flet nedad","splitHorizontal":"Del celle vandret","splitVertical":"Del celle lodret","title":"Celleegenskaber","cellType":"Celletype","rowSpan":"Række span (rows span)","colSpan":"Kolonne span (columns span)","wordWrap":"Tekstombrydning","hAlign":"Vandret justering","vAlign":"Lodret justering","alignBaseline":"Grundlinje","bgColor":"Baggrundsfarve","borderColor":"Rammefarve","data":"Data","header":"Hoved","yes":"Ja","no":"Nej","invalidWidth":"Cellebredde skal være et tal.","invalidHeight":"Cellehøjde skal være et tal.","invalidRowSpan":"Række span skal være et heltal.","invalidColSpan":"Kolonne span skal være et heltal.","chooseColor":"Vælg"},"cellPad":"Cellemargen","cellSpace":"Celleafstand","column":{"menu":"Kolonne","insertBefore":"Indsæt kolonne før","insertAfter":"Indsæt kolonne efter","deleteColumn":"Slet kolonne"},"columns":"Kolonner","deleteTable":"Slet tabel","headers":"Hoved","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første række","invalidBorder":"Rammetykkelse skal være et tal.","invalidCellPadding":"Cellemargen skal være et tal.","invalidCellSpacing":"Celleafstand skal være et tal.","invalidCols":"Antallet af kolonner skal være større end 0.","invalidHeight":"Tabelhøjde skal være et tal.","invalidRows":"Antallet af rækker skal være større end 0.","invalidWidth":"Tabelbredde skal være et tal.","menu":"Egenskaber for tabel","row":{"menu":"Række","insertBefore":"Indsæt række før","insertAfter":"Indsæt række efter","deleteRow":"Slet række"},"rows":"Rækker","summary":"Resumé","title":"Egenskaber for tabel","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"Bredde pÃ¥ enhed"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Vejledende titel","cssClassInputLabel":"Typografiark","edit":"Rediger Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Venstre til højre (LTR)","langDirLabel":"Sprogretning","langDirRTLLabel":"Højre til venstre (RTL)","languageCodeInputLabel":" Sprogkode","remove":"Slet Div","styleSelectLabel":"Style","title":"Opret Div Container","toolbar":"Opret Div Container"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/it.js0000644000000000000000000003357612247657030021021 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['it']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Premi ALT 0 per aiuto","browseServer":"Cerca sul server","url":"URL","protocol":"Protocollo","upload":"Carica","uploadSubmit":"Invia al server","image":"Immagine","flash":"Oggetto Flash","form":"Modulo","checkbox":"Checkbox","radio":"Radio Button","textField":"Campo di testo","textarea":"Area di testo","hiddenField":"Campo nascosto","button":"Bottone","select":"Menu di selezione","imageButton":"Bottone immagine","notSet":"","id":"Id","name":"Nome","langDir":"Direzione scrittura","langDirLtr":"Da Sinistra a Destra (LTR)","langDirRtl":"Da Destra a Sinistra (RTL)","langCode":"Codice Lingua","longDescr":"URL descrizione estesa","cssClass":"Nome classe CSS","advisoryTitle":"Titolo","cssStyle":"Stile","ok":"OK","cancel":"Annulla","close":"Chiudi","preview":"Anteprima","resize":"Trascina per ridimensionare","generalTab":"Generale","advancedTab":"Avanzate","validateNumberFailed":"Il valore inserito non è un numero.","confirmNewPage":"Ogni modifica non salvata sarà persa. Sei sicuro di voler caricare una nuova pagina?","confirmCancel":"Alcune delle opzioni sono state cambiate. Sei sicuro di voler chiudere la finestra di dialogo?","options":"Opzioni","target":"Destinazione","targetNew":"Nuova finestra (_blank)","targetTop":"Finestra in primo piano (_top)","targetSelf":"Stessa finestra (_self)","targetParent":"Finestra Padre (_parent)","langDirLTR":"Da sinistra a destra (LTR)","langDirRTL":"Da destra a sinistra (RTL)","styles":"Stile","cssClasses":"Classi di stile","width":"Larghezza","height":"Altezza","align":"Allineamento","alignLeft":"Sinistra","alignRight":"Destra","alignCenter":"Centrato","alignTop":"In Alto","alignMiddle":"Centrato","alignBottom":"In Basso","invalidValue":"Valore non valido.","invalidHeight":"L'altezza dev'essere un numero","invalidWidth":"La Larghezza dev'essere un numero","invalidCssLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le classi CSS (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le pagine HTML (px o %).","invalidInlineStyle":"Il valore specificato per lo stile inline deve consistere in una o più tuple con il formato di \"name : value\", separati da semicolonne.","cssLengthTooltip":"Inserisci un numero per il valore in pixel oppure un numero con una valida unità CSS (px, %, in, cm, mm, ex, pt, o pc).","unavailable":"%1, non disponibile"},"about":{"copy":"Copyright © $1. Tutti i diritti riservati.","dlgTitle":"Riguardo CKEditor","help":"Vedi $1 per l'aiuto.","moreInfo":"Per le informazioni sulla licenza si prega di visitare il nostro sito:","title":"Riguardo CKEditor","userGuide":"Guida Utente CKEditor"},"basicstyles":{"bold":"Grassetto","italic":"Corsivo","strike":"Barrato","subscript":"Pedice","superscript":"Apice","underline":"Sottolineato"},"clipboard":{"copy":"Copia","copyError":"Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).","cut":"Taglia","cutError":"Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).","paste":"Incolla","pasteArea":"Incolla","pasteMsg":"Incolla il testo all'interno dell'area sottostante usando la scorciatoia di tastiere (Ctrl/Cmd+V) e premi OK.","securityMsg":"A causa delle impostazioni di sicurezza del browser,l'editor non è in grado di accedere direttamente agli appunti. E' pertanto necessario incollarli di nuovo in questa finestra.","title":"Incolla"},"toolbar":{"toolbarCollapse":"Minimizza Toolbar","toolbarExpand":"Espandi Toolbar","toolbarGroups":{"document":"Documento","clipboard":"Copia negli appunti/Annulla","editing":"Modifica","forms":"Form","basicstyles":"Stili di base","paragraph":"Paragrafo","links":"Link","insert":"Inserisci","styles":"Stili","colors":"Colori","tools":"Strumenti"},"toolbars":"Editor toolbar"},"fakeobjects":{"anchor":"Ancora","flash":"Animazione Flash","hiddenfield":"Campo Nascosto","iframe":"IFrame","unknown":"Oggetto sconosciuto"},"link":{"acccessKey":"Scorciatoia da tastiera","advanced":"Avanzate","advisoryContentType":"Tipo della risorsa collegata","advisoryTitle":"Titolo","anchor":{"toolbar":"Inserisci/Modifica Ancora","menu":"Proprietà ancora","title":"Proprietà ancora","name":"Nome ancora","errorName":"Inserici il nome dell'ancora","remove":"Rimuovi l'ancora"},"anchorId":"Per id elemento","anchorName":"Per Nome","charset":"Set di caretteri della risorsa collegata","cssClasses":"Nome classe CSS","emailAddress":"Indirizzo E-Mail","emailBody":"Corpo del messaggio","emailSubject":"Oggetto del messaggio","id":"Id","info":"Informazioni collegamento","langCode":"Direzione scrittura","langDir":"Direzione scrittura","langDirLTR":"Da Sinistra a Destra (LTR)","langDirRTL":"Da Destra a Sinistra (RTL)","menu":"Modifica collegamento","name":"Nome","noAnchors":"(Nessuna ancora disponibile nel documento)","noEmail":"Devi inserire un'indirizzo e-mail","noUrl":"Devi inserire l'URL del collegamento","other":"","popupDependent":"Dipendente (Netscape)","popupFeatures":"Caratteristiche finestra popup","popupFullScreen":"A tutto schermo (IE)","popupLeft":"Posizione da sinistra","popupLocationBar":"Barra degli indirizzi","popupMenuBar":"Barra del menu","popupResizable":"Ridimensionabile","popupScrollBars":"Barre di scorrimento","popupStatusBar":"Barra di stato","popupToolbar":"Barra degli strumenti","popupTop":"Posizione dall'alto","rel":"Relazioni","selectAnchor":"Scegli Ancora","styles":"Stile","tabIndex":"Ordine di tabulazione","target":"Destinazione","targetFrame":"","targetFrameName":"Nome del riquadro di destinazione","targetPopup":"","targetPopupName":"Nome finestra popup","title":"Collegamento","toAnchor":"Ancora nel testo","toEmail":"E-Mail","toUrl":"URL","toolbar":"Collegamento","type":"Tipo di Collegamento","unlink":"Elimina collegamento","upload":"Carica"},"indent":{"indent":"Aumenta rientro","outdent":"Riduci rientro"},"list":{"bulletedlist":"Inserisci/Rimuovi Elenco Puntato","numberedlist":"Inserisci/Rimuovi Elenco Numerato"},"pastetext":{"button":"Incolla come testo semplice","title":"Incolla come testo semplice"},"undo":{"redo":"Ripristina","undo":"Annulla"},"colorbutton":{"auto":"Automatico","bgColorTitle":"Colore sfondo","colors":{"000":"Nero","800000":"Marrone Castagna","8B4513":"Marrone Cuoio","2F4F4F":"Grigio Fumo di Londra","008080":"Acquamarina","000080":"Blu Oceano","4B0082":"Indigo","696969":"Grigio Scuro","B22222":"Giallo Fiamma","A52A2A":"Marrone","DAA520":"Giallo Mimosa","006400":"Verde Scuro","40E0D0":"Turchese","0000CD":"Blue Scuro","800080":"Viola","808080":"Grigio","F00":"Rosso","FF8C00":"Arancio Scuro","FFD700":"Oro","008000":"Verde","0FF":"Ciano","00F":"Blu","EE82EE":"Violetto","A9A9A9":"Grigio Scuro","FFA07A":"Salmone","FFA500":"Arancio","FFFF00":"Giallo","00FF00":"Lime","AFEEEE":"Turchese Chiaro","ADD8E6":"Blu Chiaro","DDA0DD":"Rosso Ciliegia","D3D3D3":"Grigio Chiaro","FFF0F5":"Lavanda Chiara","FAEBD7":"Bianco Antico","FFFFE0":"Giallo Chiaro","F0FFF0":"Verde Mela","F0FFFF":"Azzurro","F0F8FF":"Celeste","E6E6FA":"Lavanda","FFF":"Bianco"},"more":"Altri colori...","panelTitle":"Colori","textColorTitle":"Colore testo"},"font":{"fontSize":{"label":"Dimensione","voiceLabel":"Dimensione Carattere","panelTitle":"Dimensione"},"label":"Carattere","panelTitle":"Carattere","voiceLabel":"Carattere"},"image":{"alertUrl":"Devi inserire l'URL per l'immagine","alt":"Testo alternativo","border":"Bordo","btnUpload":"Invia al server","button2Img":"Vuoi trasformare il bottone immagine selezionato in un'immagine semplice?","hSpace":"HSpace","img2Button":"Vuoi trasferomare l'immagine selezionata in un bottone immagine?","infoTab":"Informazioni immagine","linkTab":"Collegamento","lockRatio":"Blocca rapporto","menu":"Proprietà immagine","resetSize":"Reimposta dimensione","title":"Proprietà immagine","titleButton":"Proprietà bottone immagine","upload":"Carica","urlMissing":"Manca l'URL dell'immagine.","vSpace":"VSpace","validateBorder":"Il campo Bordo deve essere un numero intero.","validateHSpace":"Il campo HSpace deve essere un numero intero.","validateVSpace":"Il campo VSpace deve essere un numero intero."},"scayt":{"about":"About COMS","aboutTab":"Info","addWord":"Aggiungi Parola","allCaps":"Ignora Parole in maiuscolo","dic_create":"Crea","dic_delete":"Cancella","dic_field_name":"Nome del dizionario","dic_info":"Inizialmente il dizionario utente è memorizzato in un Cookie. I Cookie però hanno una dimensioni massima limitata. Quando il dizionario utente creasce a tal punto da non poter più essere memorizzato in un Cookie, allora il dizionario può essere memorizzato sul nostro server. Per memorizzare il proprio dizionario personale sul nostro server, è necessario specificare un nome per il proprio dizionario. Se avete già memorizzato un dizionario, inserite il nome che gli avete dato e premete il pulsante Ripristina.","dic_rename":"Rinomina","dic_restore":"Ripristina","dictionariesTab":"Dizionari","disable":"Disabilita COMS","emptyDic":"Il nome del dizionario non può essere vuoto.","enable":"Abilita COMS","ignore":"Ignora","ignoreAll":"Ignora tutti","ignoreDomainNames":"Ignora nomi di dominio","langs":"Lingue","languagesTab":"Lingue","mixedCase":"Ignora parole con maiuscole e minuscole","mixedWithDigits":"Ignora parole con numeri","moreSuggestions":"Altri suggerimenti","opera_title":"Non supportato da Opera","options":"Opzioni","optionsTab":"Opzioni","title":"Controllo Ortografico Mentre Scrivi","toggle":"Inverti abilitazione SCOMS","noSuggestions":"No suggestion"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Indirizzo","tag_div":"Paragrafo (DIV)","tag_h1":"Titolo 1","tag_h2":"Titolo 2","tag_h3":"Titolo 3","tag_h4":"Titolo 4","tag_h5":"Titolo 5","tag_h6":"Titolo 6","tag_p":"Normale","tag_pre":"Formattato"},"justify":{"block":"Giustifica","center":"Centra","left":"Allinea a sinistra","right":"Allinea a destra"},"wsc":{"btnIgnore":"Ignora","btnIgnoreAll":"Ignora tutto","btnReplace":"Cambia","btnReplaceAll":"Cambia tutto","btnUndo":"Annulla","changeTo":"Cambia in","errorLoading":"Errore nel caricamento dell'host col servizio applicativo: %s.","ieSpellDownload":"Contollo ortografico non installato. Lo vuoi scaricare ora?","manyChanges":"Controllo ortografico completato: %1 parole cambiate","noChanges":"Controllo ortografico completato: nessuna parola cambiata","noMispell":"Controllo ortografico completato: nessun errore trovato","noSuggestions":"- Nessun suggerimento -","notAvailable":"Il servizio non è momentaneamente disponibile.","notInDic":"Non nel dizionario","oneChange":"Controllo ortografico completato: 1 parola cambiata","progress":"Controllo ortografico in corso","title":"Controllo ortografico","toolbar":"Correttore ortografico"},"colordialog":{"clear":"cancella","highlight":"Evidenzia","options":"Opzioni colore","selected":"Seleziona il colore","title":"Selezionare il colore"},"contextmenu":{"options":"Opzioni del menù contestuale"},"blockquote":{"toolbar":"Citazione"},"table":{"border":"Dimensione bordo","caption":"Intestazione","cell":{"menu":"Cella","insertBefore":"Inserisci Cella Prima","insertAfter":"Inserisci Cella Dopo","deleteCell":"Elimina celle","merge":"Unisce celle","mergeRight":"Unisci a Destra","mergeDown":"Unisci in Basso","splitHorizontal":"Dividi Cella Orizzontalmente","splitVertical":"Dividi Cella Verticalmente","title":"Proprietà della cella","cellType":"Tipo di cella","rowSpan":"Su più righe","colSpan":"Su più colonne","wordWrap":"Ritorno a capo","hAlign":"Allineamento orizzontale","vAlign":"Allineamento verticale","alignBaseline":"Linea Base","bgColor":"Colore di Sfondo","borderColor":"Colore del Bordo","data":"Dati","header":"Intestazione","yes":"Si","no":"No","invalidWidth":"La larghezza della cella dev'essere un numero.","invalidHeight":"L'altezza della cella dev'essere un numero.","invalidRowSpan":"Il numero di righe dev'essere un numero intero.","invalidColSpan":"Il numero di colonne dev'essere un numero intero.","chooseColor":"Scegli"},"cellPad":"Padding celle","cellSpace":"Spaziatura celle","column":{"menu":"Colonna","insertBefore":"Inserisci Colonna Prima","insertAfter":"Inserisci Colonna Dopo","deleteColumn":"Elimina colonne"},"columns":"Colonne","deleteTable":"Cancella Tabella","headers":"Intestazione","headersBoth":"Entrambe","headersColumn":"Prima Colonna","headersNone":"Nessuna","headersRow":"Prima Riga","invalidBorder":"La dimensione del bordo dev'essere un numero.","invalidCellPadding":"Il paging delle celle dev'essere un numero","invalidCellSpacing":"La spaziatura tra le celle dev'essere un numero.","invalidCols":"Il numero di colonne dev'essere un numero maggiore di 0.","invalidHeight":"L'altezza della tabella dev'essere un numero.","invalidRows":"Il numero di righe dev'essere un numero maggiore di 0.","invalidWidth":"La larghezza della tabella dev'essere un numero.","menu":"Proprietà tabella","row":{"menu":"Riga","insertBefore":"Inserisci Riga Prima","insertAfter":"Inserisci Riga Dopo","deleteRow":"Elimina righe"},"rows":"Righe","summary":"Indice","title":"Proprietà tabella","toolbar":"Tabella","widthPc":"percento","widthPx":"pixel","widthUnit":"unità larghezza"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Titolo Avviso","cssClassInputLabel":"Classi di stile","edit":"Modifica DIV","inlineStyleInputLabel":"Stile Inline","langDirLTRLabel":"Da sinistra a destra (LTR)","langDirLabel":"Direzione di scrittura","langDirRTLLabel":"Da destra a sinistra (RTL)","languageCodeInputLabel":"Codice lingua","remove":"Rimuovi DIV","styleSelectLabel":"Stile","title":"Crea DIV contenitore","toolbar":"Crea DIV contenitore"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/uk.js0000644000000000000000000005025612247657030021016 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['uk']={"editor":"ТекÑтовий редактор","editorPanel":"Панель текÑтового редактора","common":{"editorHelp":"натиÑніть ALT 0 Ð´Ð»Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸","browseServer":"ОглÑд Сервера","url":"URL","protocol":"Протокол","upload":"ÐадіÑлати","uploadSubmit":"ÐадіÑлати на Ñервер","image":"ЗображеннÑ","flash":"Flash","form":"Форма","checkbox":"Галочка","radio":"Кнопка вибору","textField":"ТекÑтове поле","textarea":"ТекÑтова облаÑть","hiddenField":"Приховане поле","button":"Кнопка","select":"СпиÑок","imageButton":"Кнопка із зображеннÑм","notSet":"<не визначено>","id":"Ідентифікатор","name":"Ім'Ñ","langDir":"ÐапрÑмок мови","langDirLtr":"Зліва направо (LTR)","langDirRtl":"Справа наліво (RTL)","langCode":"Код мови","longDescr":"Довгий Ð¾Ð¿Ð¸Ñ URL","cssClass":"ÐšÐ»Ð°Ñ CSS","advisoryTitle":"Заголовок","cssStyle":"Стиль CSS","ok":"ОК","cancel":"СкаÑувати","close":"Закрити","preview":"Попередній переглÑд","resize":"ПотÑгніть Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ розмірів","generalTab":"ОÑновне","advancedTab":"Додаткове","validateNumberFailed":"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ Ñ” цілим чиÑлом.","confirmNewPage":"Ð’ÑÑ– незбережені зміни будуть втрачені. Ви впевнені, що хочете завантажити нову Ñторінку?","confirmCancel":"ДеÑкі опції змінено. Закрити вікно без Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½?","options":"Опції","target":"Ціль","targetNew":"Ðове вікно (_blank)","targetTop":"Поточне вікно (_top)","targetSelf":"Поточний фрейм/вікно (_self)","targetParent":"БатьківÑький фрейм/вікно (_parent)","langDirLTR":"Зліва направо (LTR)","langDirRTL":"Справа наліво (RTL)","styles":"Стиль CSS","cssClasses":"ÐšÐ»Ð°Ñ CSS","width":"Ширина","height":"ВиÑота","align":"ВирівнюваннÑ","alignLeft":"По лівому краю","alignRight":"По правому краю","alignCenter":"По центру","alignTop":"По верхньому краю","alignMiddle":"По Ñередині","alignBottom":"По нижньому краю","invalidValue":"Ðевірне значеннÑ.","invalidHeight":"ВиÑота повинна бути цілим чиÑлом.","invalidWidth":"Ширина повинна бути цілим чиÑлом.","invalidCssLength":"ЗначеннÑ, вказане Ð´Ð»Ñ \"%1\" в полі повинно бути позитивним чиÑлом або без дійÑного виміру CSS блоку (px, %, in, cm, mm, em, ex, pt або pc).","invalidHtmlLength":"ЗначеннÑ, вказане Ð´Ð»Ñ \"%1\" в полі повинно бути позитивним чиÑлом або без дійÑного виміру HTML блоку (px або %).","invalidInlineStyle":"ЗначеннÑ, вказане Ð´Ð»Ñ Ð²Ð±ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ Ñтилю повинне ÑкладатиÑÑ Ð· одного чи кількох кортежів у форматі \"ім'Ñ : значеннÑ\", розділених крапкою з комою.","cssLengthTooltip":"Введіть номер Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² пікÑелÑÑ… або чиÑло з дійÑною одиниці CSS (px, %, in, cm, mm, em, ex, pt або pc).","unavailable":"%1, не доÑтупне"},"about":{"copy":"Copyright © $1. Ð’ÑÑ– права заÑтережено.","dlgTitle":"Про CKEditor","help":"Перевірте $1 Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¸.","moreInfo":"Щодо інформації з Ð»Ñ–Ñ†ÐµÐ½Ð·ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ñ–Ñ‚Ð°Ð¹Ñ‚Ðµ на наш Ñайт:","title":"Про CKEditor","userGuide":"ІнÑÑ‚Ñ€ÑƒÐºÑ†Ñ–Ñ ÐšÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ CKEditor"},"basicstyles":{"bold":"Жирний","italic":"КурÑив","strike":"ЗакреÑлений","subscript":"Ðижній індекÑ","superscript":"Верхній індекÑ","underline":"ПідкреÑлений"},"clipboard":{"copy":"Копіювати","copyError":"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Вашого браузера не дозволÑють редактору автоматично виконувати операції копіюваннÑ. Будь лаÑка, викориÑтовуйте клавіатуру Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ (Ctrl/Cmd+C).","cut":"Вирізати","cutError":"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Вашого браузера не дозволÑють редактору автоматично виконувати операції вирізуваннÑ. Будь лаÑка, викориÑтовуйте клавіатуру Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ (Ctrl/Cmd+X)","paste":"Ð’Ñтавити","pasteArea":"ОблаÑть вÑтавки","pasteMsg":"Будь лаÑка, вÑтавте інформацію з буфера обміну в цю облаÑть, кориÑтуючиÑÑŒ комбінацією клавіш (Ctrl/Cmd+V), та натиÑніть OK.","securityMsg":"Редактор не може отримати прÑмий доÑтуп до буферу обміну у зв'Ñзку з налаштуваннÑми Вашого браузера. Вам потрібно вÑтавити інформацію в це вікно.","title":"Ð’Ñтавити"},"toolbar":{"toolbarCollapse":"Згорнути панель інÑтрументів","toolbarExpand":"Розгорнути панель інÑтрументів","toolbarGroups":{"document":"Документ","clipboard":"Буфер обміну / СкаÑувати","editing":"РедагуваннÑ","forms":"Форми","basicstyles":"ОÑновний Стиль","paragraph":"Параграф","links":"ПоÑиланнÑ","insert":"Ð’Ñтавити","styles":"Стилі","colors":"Кольори","tools":"ІнÑтрументи"},"toolbars":"Панель інÑтрументів редактора"},"fakeobjects":{"anchor":"Якір","flash":"Flash-анімаціÑ","hiddenfield":"Приховані ПолÑ","iframe":"IFrame","unknown":"Ðевідомий об'єкт"},"link":{"acccessKey":"ГарÑча клавіша","advanced":"Додаткове","advisoryContentType":"Тип вміÑту","advisoryTitle":"Заголовок","anchor":{"toolbar":"Ð’Ñтавити/Редагувати Ñкір","menu":"ВлаÑтивоÑті ÑкорÑ","title":"ВлаÑтивоÑті ÑкорÑ","name":"Ім'Ñ ÑкорÑ","errorName":"Будь лаÑка, вкажіть ім'Ñ ÑкорÑ","remove":"Прибрати Ñкір"},"anchorId":"За ідентифікатором елементу","anchorName":"За ім'Ñм елементу","charset":"КодуваннÑ","cssClasses":"ÐšÐ»Ð°Ñ CSS","emailAddress":"ÐдреÑа ел. пошти","emailBody":"Тіло повідомленнÑ","emailSubject":"Тема лиÑта","id":"Ідентифікатор","info":"Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ÑиланнÑ","langCode":"Код мови","langDir":"ÐапрÑмок мови","langDirLTR":"Зліва направо (LTR)","langDirRTL":"Справа наліво (RTL)","menu":"Ð’Ñтавити поÑиланнÑ","name":"Ім'Ñ","noAnchors":"(Ð’ цьому документі немає Ñкорів)","noEmail":"Будь лаÑка, вкажіть Ð°Ð´Ñ€ÐµÑ ÐµÐ». пошти","noUrl":"Будь лаÑка, вкажіть URL поÑиланнÑ","other":"<інший>","popupDependent":"Залежний (Netscape)","popupFeatures":"ВлаÑтивоÑті випливаючого вікна","popupFullScreen":"Повний екран (IE)","popupLeft":"ÐŸÐ¾Ð·Ð¸Ñ†Ñ–Ñ Ð·Ð»Ñ–Ð²Ð°","popupLocationBar":"Панель локації","popupMenuBar":"Панель меню","popupResizable":"МаÑштабоване","popupScrollBars":"Стрічки прокрутки","popupStatusBar":"РÑдок ÑтатуÑу","popupToolbar":"Панель інÑтрументів","popupTop":"ÐŸÐ¾Ð·Ð¸Ñ†Ñ–Ñ Ð·Ð²ÐµÑ€Ñ…Ñƒ","rel":"Зв'Ñзок","selectAnchor":"Оберіть Ñкір","styles":"Стиль CSS","tabIndex":"ПоÑлідовніÑть переходу","target":"Ціль","targetFrame":"<фрейм>","targetFrameName":"Ім'Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ фрейму","targetPopup":"<випливаюче вікно>","targetPopupName":"Ім'Ñ Ð²Ð¸Ð¿Ð»Ð¸Ð²Ð°ÑŽÑ‡Ð¾Ð³Ð¾ вікна","title":"ПоÑиланнÑ","toAnchor":"Якір на цю Ñторінку","toEmail":"Ел. пошта","toUrl":"URL","toolbar":"Ð’Ñтавити/Редагувати поÑиланнÑ","type":"Тип поÑиланнÑ","unlink":"Видалити поÑиланнÑ","upload":"ÐадіÑлати"},"indent":{"indent":"Збільшити відÑтуп","outdent":"Зменшити відÑтуп"},"list":{"bulletedlist":"Маркірований ÑпиÑок","numberedlist":"Ðумерований ÑпиÑок"},"pastetext":{"button":"Ð’Ñтавити тільки текÑÑ‚","title":"Ð’Ñтавити тільки текÑÑ‚"},"undo":{"redo":"Повторити","undo":"Повернути"},"colorbutton":{"auto":"Ðвто","bgColorTitle":"Колір фону","colors":{"000":"Чорний","800000":"Бордовий","8B4513":"Коричневий","2F4F4F":"Темний Ñіро-зелений","008080":"МорÑької хвилі","000080":"Сливовий","4B0082":"Індиго","696969":"ТемноÑірий","B22222":"Темночервоний","A52A2A":"Каштановий","DAA520":"Бежевий","006400":"Темнозелений","40E0D0":"Бірюзовий","0000CD":"ТемноÑиній","800080":"Пурпурний","808080":"Сірий","F00":"Червоний","FF8C00":"Темнооранжевий","FFD700":"Жовтий","008000":"Зелений","0FF":"Синьо-зелений","00F":"Синій","EE82EE":"Фіолетовий","A9A9A9":"СвітлоÑірий","FFA07A":"Рожевий","FFA500":"Оранжевий","FFFF00":"ЯÑкравожовтий","00FF00":"Салатовий","AFEEEE":"Світлобірюзовий","ADD8E6":"Блакитний","DDA0DD":"Світлофіолетовий","D3D3D3":"СріблÑÑтий","FFF0F5":"Світлорожевий","FAEBD7":"Світлооранжевий","FFFFE0":"Світложовтий","F0FFF0":"Світлозелений","F0FFFF":"Світлий Ñиньо-зелений","F0F8FF":"Світлоблакитний","E6E6FA":"Лавандовий","FFF":"Білий"},"more":"Кольори...","panelTitle":"Кольори","textColorTitle":"Колір текÑту"},"font":{"fontSize":{"label":"Розмір","voiceLabel":"Розмір шрифту","panelTitle":"Розмір"},"label":"Шрифт","panelTitle":"Шрифт","voiceLabel":"Шрифт"},"image":{"alertUrl":"Будь лаÑка, вкажіть URL зображеннÑ","alt":"Ðльтернативний текÑÑ‚","border":"Рамка","btnUpload":"ÐадіÑлати на Ñервер","button2Img":"Бажаєте перетворити обрану кнопку-Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° проÑте зображеннÑ?","hSpace":"Гориз. відÑтуп","img2Button":"Бажаєте перетворити обране Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° кнопку-зображеннÑ?","infoTab":"Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ зображеннÑ","linkTab":"ПоÑиланнÑ","lockRatio":"Зберегти пропорції","menu":"ВлаÑтивоÑті зображеннÑ","resetSize":"ОчиÑтити Ð¿Ð¾Ð»Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñ–Ð²","title":"ВлаÑтивоÑті зображеннÑ","titleButton":"ВлаÑтивоÑті кнопки із зображеннÑм","upload":"ÐадіÑлати","urlMissing":"Вкажіть URL зображеннÑ.","vSpace":"Верт. відÑтуп","validateBorder":"Ширина рамки повинна бути цілим чиÑлом.","validateHSpace":"Гориз. відÑтуп повинен бути цілим чиÑлом.","validateVSpace":"Верт. відÑтуп повинен бути цілим чиÑлом."},"scayt":{"about":"Про SCAYT","aboutTab":"Про SCAYT","addWord":"Додати Ñлово","allCaps":"ПропуÑтити пропиÑні Ñлова","dic_create":"Створити","dic_delete":"Видалити","dic_field_name":"Ðазва Ñловника","dic_info":"Як правило, кориÑтувацькі Ñловники зберігаютьÑÑ Ñƒ cookie-файлах. Однак, cookie-файли мають Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° розмір. Якщо кориÑтувацький Ñловник зроÑтає в обÑÑзі наÑтільки, що вже не може бути збережений у cookie-файлі, тоді його можна зберегти на нашому Ñервері. Щоб зберегти Ваш перÑональний Ñловник на нашому Ñервері необхідно вказати назву Ñловника. Якщо Ви вже зберігали Ñловник на Ñервері, будь лаÑка, вкажіть назву збереженого Ñловника Ñ– натиÑніть кнопку Відновити.","dic_rename":"Перейменувати","dic_restore":"Відновити","dictionariesTab":"Словники","disable":"Вимкнути SCAYT","emptyDic":"Ðазва Ñловника повинна бути вказана.","enable":"Ввімкнути SCAYT","ignore":"ПропуÑтити","ignoreAll":"ПропуÑтити вÑÑ–","ignoreDomainNames":"ПропуÑтити доменні назви","langs":"Мови","languagesTab":"Мови","mixedCase":"ПропуÑтити Ñлова зі змішаним регіÑтром","mixedWithDigits":"ПропуÑтити Ñлова, що міÑÑ‚Ñть цифри","moreSuggestions":"Більше варіантів","opera_title":"Ðе підтримуєтьÑÑ Ð² Opera","options":"Опції","optionsTab":"Опції","title":"Перефірка орфографії по мірі набору","toggle":"Перемкнути SCAYT","noSuggestions":"No suggestion"},"format":{"label":"ФорматуваннÑ","panelTitle":"Ð¤Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð³Ñ€Ð°Ñ„Ð°","tag_address":"ÐдреÑа","tag_div":"Ðормальний (div)","tag_h1":"Заголовок 1","tag_h2":"Заголовок 2","tag_h3":"Заголовок 3","tag_h4":"Заголовок 4","tag_h5":"Заголовок 5","tag_h6":"Заголовок 6","tag_p":"Ðормальний","tag_pre":"Форматований"},"justify":{"block":"По ширині","center":"По центру","left":"По лівому краю","right":"По правому краю"},"wsc":{"btnIgnore":"ПропуÑтити","btnIgnoreAll":"ПропуÑтити вÑе","btnReplace":"Замінити","btnReplaceAll":"Замінити вÑе","btnUndo":"Ðазад","changeTo":"Замінити на","errorLoading":"Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ : %s.","ieSpellDownload":"Модуль перевірки орфографії не вÑтановлено. Бажаєте завантажити його зараз?","manyChanges":"Перевірку орфографії завершено: 1% Ñлів(ова) змінено","noChanges":"Перевірку орфографії завершено: жодне Ñлово не змінено","noMispell":"Перевірку орфографії завершено: помилок не знайдено","noSuggestions":"- немає варіантів -","notAvailable":"Вибачте, але ÑÐµÑ€Ð²Ñ–Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– недоÑтупний.","notInDic":"Ðемає в Ñловнику","oneChange":"Перевірку орфографії завершено: змінено одне Ñлово","progress":"ВиконуєтьÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ° орфографії...","title":"Перевірка орфографії","toolbar":"Перевірити орфографію"},"colordialog":{"clear":"ОчиÑтити","highlight":"Колір, на Ñкий вказує курÑор","options":"Опції кольорів","selected":"Обраний колір","title":"Обрати колір"},"contextmenu":{"options":"Опції контекÑтного меню"},"blockquote":{"toolbar":"Цитата"},"table":{"border":"Розмір рамки","caption":"Заголовок таблиці","cell":{"menu":"Комірки","insertBefore":"Ð’Ñтавити комірку перед","insertAfter":"Ð’Ñтавити комірку піÑлÑ","deleteCell":"Видалити комірки","merge":"Об'єднати комірки","mergeRight":"Об'єднати Ñправа","mergeDown":"Об'єднати донизу","splitHorizontal":"Розділити комірку по горизонталі","splitVertical":"Розділити комірку по вертикалі","title":"ВлаÑтивоÑті комірки","cellType":"Тип комірки","rowSpan":"Об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ€Ñдків","colSpan":"Об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñтовпців","wordWrap":"ÐвтоперенеÑÐµÐ½Ð½Ñ Ñ‚ÐµÐºÑту","hAlign":"Гориз. вирівнюваннÑ","vAlign":"Верт. вирівнюваннÑ","alignBaseline":"По базовій лінії","bgColor":"Колір фону","borderColor":"Колір рамки","data":"Дані","header":"Заголовок","yes":"Так","no":"ÐÑ–","invalidWidth":"Ширина комірки повинна бути цілим чиÑлом.","invalidHeight":"ВиÑота комірки повинна бути цілим чиÑлом.","invalidRowSpan":"КількіÑть об'єднуваних Ñ€Ñдків повинна бути цілим чиÑлом.","invalidColSpan":"КількіÑть об'єднуваних Ñтовбців повинна бути цілим чиÑлом.","chooseColor":"Обрати"},"cellPad":"Внутр. відÑтуп","cellSpace":"Проміжок","column":{"menu":"Стовбці","insertBefore":"Ð’Ñтавити Ñтовбець перед","insertAfter":"Ð’Ñтавити Ñтовбець піÑлÑ","deleteColumn":"Видалити Ñтовбці"},"columns":"Стовбці","deleteTable":"Видалити таблицю","headers":"Заголовки Ñтовбців/Ñ€Ñдків","headersBoth":"Стовбці Ñ– Ñ€Ñдки","headersColumn":"Стовбці","headersNone":"Без заголовків","headersRow":"РÑдки","invalidBorder":"Розмір рамки повинен бути цілим чиÑлом.","invalidCellPadding":"Внутр. відÑтуп комірки повинен бути цілим чиÑлом.","invalidCellSpacing":"Проміжок між комірками повинен бути цілим чиÑлом.","invalidCols":"КількіÑть Ñтовбців повинна бути більшою 0.","invalidHeight":"ВиÑота таблиці повинна бути цілим чиÑлом.","invalidRows":"КількіÑть Ñ€Ñдків повинна бути більшою 0.","invalidWidth":"Ширина таблиці повинна бути цілим чиÑлом.","menu":"ВлаÑтивоÑті таблиці","row":{"menu":"РÑдки","insertBefore":"Ð’Ñтавити Ñ€Ñдок перед","insertAfter":"Ð’Ñтавити Ñ€Ñдок піÑлÑ","deleteRow":"Видалити Ñ€Ñдки"},"rows":"РÑдки","summary":"Детальний Ð¾Ð¿Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑƒ таблиці","title":"ВлаÑтивоÑті таблиці","toolbar":"ТаблицÑ","widthPc":"відÑотків","widthPx":"пікÑелів","widthUnit":"Одиниці вимір."},"div":{"IdInputLabel":"Ідентифікатор","advisoryTitleInputLabel":"ЗміÑÑ‚ випливаючої підказки","cssClassInputLabel":"ÐšÐ»Ð°Ñ CSS","edit":"Редагувати блок","inlineStyleInputLabel":"ВпиÑаний Ñтиль","langDirLTRLabel":"Зліва направо (LTR)","langDirLabel":"ÐапрÑмок мови","langDirRTLLabel":"Справа наліво (RTL)","languageCodeInputLabel":"Код мови","remove":"Видалити блок","styleSelectLabel":"Стиль CSS","title":"Створити блок-контейнер","toolbar":"Створити блок-контейнер"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/sv.js0000644000000000000000000003135212247657030021023 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['sv']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Tryck ALT 0 för hjälp","browseServer":"Bläddra pÃ¥ server","url":"URL","protocol":"Protokoll","upload":"Ladda upp","uploadSubmit":"Skicka till server","image":"Bild","flash":"Flash","form":"Formulär","checkbox":"Kryssruta","radio":"Alternativknapp","textField":"Textfält","textarea":"Textruta","hiddenField":"Dolt fält","button":"Knapp","select":"Flervalslista","imageButton":"Bildknapp","notSet":"","id":"Id","name":"Namn","langDir":"SprÃ¥kriktning","langDirLtr":"Vänster till Höger (VTH)","langDirRtl":"Höger till Vänster (HTV)","langCode":"SprÃ¥kkod","longDescr":"URL-beskrivning","cssClass":"Stilmall","advisoryTitle":"Titel","cssStyle":"Stilmall","ok":"OK","cancel":"Avbryt","close":"Stäng","preview":"Förhandsgranska","resize":"Dra för att ändra storlek","generalTab":"Allmänt","advancedTab":"Avancerad","validateNumberFailed":"Värdet är inte ett nummer.","confirmNewPage":"Alla ändringar i innehÃ¥llet kommer att förloras. Är du säker pÃ¥ att du vill ladda en ny sida?","confirmCancel":"NÃ¥gra av alternativen har ändrats. Är du säker pÃ¥ att du vill stänga dialogrutan?","options":"Alternativ","target":"MÃ¥l","targetNew":"Nytt fönster (_blank)","targetTop":"Översta fönstret (_top)","targetSelf":"Samma fönster (_self)","targetParent":"FöregÃ¥ende fönster (_parent)","langDirLTR":"Vänster till höger (LTR)","langDirRTL":"Höger till vänster (RTL)","styles":"Stil","cssClasses":"Stilmallar","width":"Bredd","height":"Höjd","align":"Justering","alignLeft":"Vänster","alignRight":"Höger","alignCenter":"Centrerad","alignTop":"Överkant","alignMiddle":"Mitten","alignBottom":"Nederkant","invalidValue":"Felaktigt värde.","invalidHeight":"Höjd mÃ¥ste vara ett nummer.","invalidWidth":"Bredd mÃ¥ste vara ett nummer.","invalidCssLength":"Värdet för fältet \"%1\" mÃ¥ste vara ett positivt nummer med eller utan CSS-mätenheter (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Värdet för fältet \"%1\" mÃ¥ste vara ett positivt nummer med eller utan godkända HTML-mätenheter (px eller %).","invalidInlineStyle":"Det angivna värdet för style mÃ¥ste innehÃ¥lla en eller flera tupler separerade med semikolon i följande format: \"name : value\"","cssLengthTooltip":"Ange ett nummer i pixlar eller ett nummer men godkänd CSS-mätenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1, Ej tillgänglig"},"about":{"copy":"Copyright © $1. Alla rättigheter reserverade.","dlgTitle":"Om CKEditor","help":"Se $1 för hjälp.","moreInfo":"För information av licensiering besök vÃ¥r hemsida:","title":"Om CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Genomstruken","subscript":"Nedsänkta tecken","superscript":"Upphöjda tecken","underline":"Understruken"},"clipboard":{"copy":"Kopiera","copyError":"Säkerhetsinställningar i Er webbläsare tillÃ¥ter inte Ã¥tgärden kopiera. Använd (Ctrl/Cmd+C) istället.","cut":"Klipp ut","cutError":"Säkerhetsinställningar i Er webbläsare tillÃ¥ter inte Ã¥tgärden klipp ut. Använd (Ctrl/Cmd+X) istället.","paste":"Klistra in","pasteArea":"Paste Area","pasteMsg":"Var god och klistra in Er text i rutan nedan genom att använda (Ctrl/Cmd+V) klicka sen pÃ¥ OK.","securityMsg":"PÃ¥ grund av din webbläsares säkerhetsinställningar kan verktyget inte fÃ¥ Ã¥tkomst till urklippsdatan. Var god och använd detta fönster istället.","title":"Klistra in"},"toolbar":{"toolbarCollapse":"Dölj verktygsfält","toolbarExpand":"Visa verktygsfält","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Redigera verktygsfält"},"fakeobjects":{"anchor":"Ankare","flash":"Flashanimation","hiddenfield":"Gömt fält","iframe":"iFrame","unknown":"Okänt objekt"},"link":{"acccessKey":"Behörighetsnyckel","advanced":"Avancerad","advisoryContentType":"InnehÃ¥llstyp","advisoryTitle":"Titel","anchor":{"toolbar":"Infoga/Redigera ankarlänk","menu":"Egenskaper för ankarlänk","title":"Egenskaper för ankarlänk","name":"Ankarnamn","errorName":"Var god ange ett ankarnamn","remove":"Radera ankare"},"anchorId":"Efter element-id","anchorName":"Efter ankarnamn","charset":"Teckenuppställning","cssClasses":"Stilmall","emailAddress":"E-postadress","emailBody":"InnehÃ¥ll","emailSubject":"Ämne","id":"Id","info":"Länkinformation","langCode":"SprÃ¥kkod","langDir":"SprÃ¥kriktning","langDirLTR":"Vänster till höger (VTH)","langDirRTL":"Höger till vänster (HTV)","menu":"Redigera länk","name":"Namn","noAnchors":"(Inga ankare kunde hittas)","noEmail":"Var god ange e-postadress","noUrl":"Var god ange länkens URL","other":"","popupDependent":"Beroende (endast Netscape)","popupFeatures":"Popup-fönstrets egenskaper","popupFullScreen":"Helskärm (endast IE)","popupLeft":"Position frÃ¥n vänster","popupLocationBar":"Adressfält","popupMenuBar":"Menyfält","popupResizable":"Resizable","popupScrollBars":"Scrolllista","popupStatusBar":"Statusfält","popupToolbar":"Verktygsfält","popupTop":"Position frÃ¥n sidans topp","rel":"FörhÃ¥llande","selectAnchor":"Välj ett ankare","styles":"Stilmall","tabIndex":"Tabindex","target":"MÃ¥l","targetFrame":"","targetFrameName":"MÃ¥lets ramnamn","targetPopup":"","targetPopupName":"Popup-fönstrets namn","title":"Länk","toAnchor":"Länk till ankare i texten","toEmail":"E-post","toUrl":"URL","toolbar":"Infoga/Redigera länk","type":"Länktyp","unlink":"Radera länk","upload":"Ladda upp"},"indent":{"indent":"Öka indrag","outdent":"Minska indrag"},"list":{"bulletedlist":"Punktlista","numberedlist":"Numrerad lista"},"pastetext":{"button":"Klistra in som vanlig text","title":"Klistra in som vanlig text"},"undo":{"redo":"Gör om","undo":"Ã…ngra"},"colorbutton":{"auto":"Automatisk","bgColorTitle":"Bakgrundsfärg","colors":{"000":"Svart","800000":"Rödbrun","8B4513":"Mörkbrun","2F4F4F":"SkiffergrÃ¥","008080":"Kricka","000080":"MarinblÃ¥","4B0082":"Indigo","696969":"MörkgrÃ¥","B22222":"Tegelsten","A52A2A":"Brun","DAA520":"Mörk guld","006400":"Mörkgrön","40E0D0":"Turkos","0000CD":"Medium blÃ¥","800080":"Lila","808080":"GrÃ¥","F00":"Röd","FF8C00":"Mörkorange","FFD700":"Guld","008000":"Grön","0FF":"Turkos","00F":"BlÃ¥","EE82EE":"Violett","A9A9A9":"Matt grÃ¥","FFA07A":"Laxrosa","FFA500":"Orange","FFFF00":"Gul","00FF00":"Lime","AFEEEE":"Ljusturkos","ADD8E6":"LjusblÃ¥","DDA0DD":"Plommon","D3D3D3":"LjusgrÃ¥","FFF0F5":"Ljus lavendel","FAEBD7":"Antikvit","FFFFE0":"Ljusgul","F0FFF0":"Honungsdagg","F0FFFF":"AzurblÃ¥","F0F8FF":"AliceblÃ¥","E6E6FA":"Lavendel","FFF":"Vit"},"more":"Fler färger...","panelTitle":"Färger","textColorTitle":"Textfärg"},"font":{"fontSize":{"label":"Storlek","voiceLabel":"Teckenstorlek","panelTitle":"Teckenstorlek"},"label":"Typsnitt","panelTitle":"Typsnitt","voiceLabel":"Typsnitt"},"image":{"alertUrl":"Var god och ange bildens URL","alt":"Alternativ text","border":"Kant","btnUpload":"Skicka till server","button2Img":"Vill du omvandla den valda bildknappen pÃ¥ en enkel bild?","hSpace":"Horis. marginal","img2Button":"Vill du omvandla den valda bildknappen pÃ¥ en enkel bild?","infoTab":"Bildinformation","linkTab":"Länk","lockRatio":"LÃ¥s höjd/bredd förhÃ¥llanden","menu":"Bildegenskaper","resetSize":"Ã…terställ storlek","title":"Bildegenskaper","titleButton":"Egenskaper för bildknapp","upload":"Ladda upp","urlMissing":"Bildkällans URL saknas.","vSpace":"Vert. marginal","validateBorder":"Kantlinje mÃ¥ste vara ett heltal.","validateHSpace":"HSpace mÃ¥ste vara ett heltal.","validateVSpace":"VSpace mÃ¥ste vara ett heltal."},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Lägg till ord","allCaps":"Ignorera alla ord med enbart versaler","dic_create":"Skapa","dic_delete":"Ta bort","dic_field_name":"Ordlistans namn","dic_info":"Inledningsvis lagras ordlistan i en cookie. När ordlista växer till en punkt där det inte kan lagras i en cookie, lagras den pÃ¥ vÃ¥r server. För att lagra din personliga ordlista pÃ¥ vÃ¥r server du ska ange ett namn för din ordbok. Om du redan har en lagrad ordbok, skriv namnet och klicka pÃ¥ knappen Ã…terställ.","dic_rename":"Byt namn","dic_restore":"Ã…terställ","dictionariesTab":"Ordlistor","disable":"Inaktivera SCAYT","emptyDic":"Ordlistans namn fÃ¥r ej vara tomt.","enable":"Aktivera SCAYT","ignore":"Ignorera","ignoreAll":"Ignorera alla","ignoreDomainNames":"Ignorera domännamn","langs":"SprÃ¥k","languagesTab":"SprÃ¥k","mixedCase":"Ignorera ord med blandat shiftläge","mixedWithDigits":"Ignorera ord med nummer","moreSuggestions":"Fler förslag","opera_title":"Stöds ej av Opera","options":"Inställningar","optionsTab":"Inställningar","title":"Stavningskontroll medan du skriver","toggle":"Växla SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Teckenformat","panelTitle":"Teckenformat","tag_address":"Adress","tag_div":"Normal (DIV)","tag_h1":"Rubrik 1","tag_h2":"Rubrik 2","tag_h3":"Rubrik 3","tag_h4":"Rubrik 4","tag_h5":"Rubrik 5","tag_h6":"Rubrik 6","tag_p":"Normal","tag_pre":"Formaterad"},"justify":{"block":"Justera till marginaler","center":"Centrera","left":"Vänsterjustera","right":"Högerjustera"},"wsc":{"btnIgnore":"Ignorera","btnIgnoreAll":"Ignorera alla","btnReplace":"Ersätt","btnReplaceAll":"Ersätt alla","btnUndo":"Ã…ngra","changeTo":"Ändra till","errorLoading":"Tjänsten är ej tillgänglig: %s.","ieSpellDownload":"Stavningskontrollen är ej installerad. Vill du göra det nu?","manyChanges":"Stavningskontroll slutförd: %1 ord rättades.","noChanges":"Stavningskontroll slutförd: Inga ord rättades.","noMispell":"Stavningskontroll slutförd: Inga stavfel pÃ¥träffades.","noSuggestions":"- Förslag saknas -","notAvailable":"Tyvärr är tjänsten ej tillgänglig nu","notInDic":"Saknas i ordlistan","oneChange":"Stavningskontroll slutförd: Ett ord rättades.","progress":"Stavningskontroll pÃ¥gÃ¥r...","title":"Kontrollera stavning","toolbar":"Stavningskontroll"},"colordialog":{"clear":"Rensa","highlight":"Markera","options":"Färgalternativ","selected":"Vald färg","title":"Välj färg"},"contextmenu":{"options":"Context Menu Options"},"blockquote":{"toolbar":"Blockcitat"},"table":{"border":"Kantstorlek","caption":"Rubrik","cell":{"menu":"Cell","insertBefore":"Lägg till cell före","insertAfter":"Lägg till cell efter","deleteCell":"Radera celler","merge":"Sammanfoga celler","mergeRight":"Sammanfoga höger","mergeDown":"Sammanfoga ner","splitHorizontal":"Dela cell horisontellt","splitVertical":"Dela cell vertikalt","title":"Egenskaper för cell","cellType":"Celltyp","rowSpan":"Rad spann","colSpan":"Kolumnen spann","wordWrap":"Radbrytning","hAlign":"Horisontell justering","vAlign":"Vertikal justering","alignBaseline":"Baslinje","bgColor":"Bakgrundsfärg","borderColor":"Ramfärg","data":"Data","header":"Rubrik","yes":"Ja","no":"Nej","invalidWidth":"Cellens bredd mÃ¥ste vara ett nummer.","invalidHeight":"Cellens höjd mÃ¥ste vara ett nummer.","invalidRowSpan":"Radutvidgning mÃ¥ste vara ett heltal.","invalidColSpan":"Kolumn mÃ¥ste vara ett heltal.","chooseColor":"Välj"},"cellPad":"Cellutfyllnad","cellSpace":"CellavstÃ¥nd","column":{"menu":"Kolumn","insertBefore":"Lägg till kolumn före","insertAfter":"Lägg till kolumn efter","deleteColumn":"Radera kolumn"},"columns":"Kolumner","deleteTable":"Radera tabell","headers":"Rubriker","headersBoth":"BÃ¥da","headersColumn":"Första kolumnen","headersNone":"Ingen","headersRow":"Första raden","invalidBorder":"Ram mÃ¥ste vara ett nummer.","invalidCellPadding":"Luft i cell mÃ¥ste vara ett nummer.","invalidCellSpacing":"Luft i cell mÃ¥ste vara ett nummer.","invalidCols":"Antal kolumner mÃ¥ste vara ett nummer större än 0.","invalidHeight":"Tabellens höjd mÃ¥ste vara ett nummer.","invalidRows":"Antal rader mÃ¥ste vara större än 0.","invalidWidth":"Tabell mÃ¥ste vara ett nummer.","menu":"Tabellegenskaper","row":{"menu":"Rad","insertBefore":"Lägg till rad före","insertAfter":"Lägg till rad efter","deleteRow":"Radera rad"},"rows":"Rader","summary":"Sammanfattning","title":"Tabellegenskaper","toolbar":"Tabell","widthPc":"procent","widthPx":"pixlar","widthUnit":"enhet bredd"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"RÃ¥dgivande titel","cssClassInputLabel":"Stilmallar","edit":"Redigera Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Vänster till höger (LTR)","langDirLabel":"SprÃ¥kriktning","langDirRTLLabel":"Höger till vänster (RTL)","languageCodeInputLabel":" SprÃ¥kkod","remove":"Ta bort Div","styleSelectLabel":"Stil","title":"Skapa Div container","toolbar":"Skapa Div container"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/ca.js0000644000000000000000000003355712247657030020767 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['ca']={"editor":"Editor de text enriquit","editorPanel":"Panell de l'editor de text enriquit","common":{"editorHelp":"Premeu ALT 0 per ajuda","browseServer":"Veure servidor","url":"URL","protocol":"Protocol","upload":"Puja","uploadSubmit":"Envia-la al servidor","image":"Imatge","flash":"Flash","form":"Formulari","checkbox":"Casella de verificació","radio":"Botó d'opció","textField":"Camp de text","textarea":"Àrea de text","hiddenField":"Camp ocult","button":"Botó","select":"Camp de selecció","imageButton":"Botó d'imatge","notSet":"","id":"Id","name":"Nom","langDir":"Direcció de l'idioma","langDirLtr":"D'esquerra a dreta (LTR)","langDirRtl":"De dreta a esquerra (RTL)","langCode":"Codi d'idioma","longDescr":"Descripció llarga de la URL","cssClass":"Classes del full d'estil","advisoryTitle":"Títol consultiu","cssStyle":"Estil","ok":"D'acord","cancel":"Cancel·la","close":"Tanca","preview":"Previsualitza","resize":"Arrossegueu per redimensionar","generalTab":"General","advancedTab":"Avançat","validateNumberFailed":"Aquest valor no és un número.","confirmNewPage":"Els canvis en aquest contingut que no es desin es perdran. Esteu segur que voleu carregar una pàgina nova?","confirmCancel":"Algunes opcions s'han canviat. Esteu segur que voleu tancar el quadre de diàleg?","options":"Opcions","target":"Destí","targetNew":"Nova finestra (_blank)","targetTop":"Finestra superior (_top)","targetSelf":"Mateixa finestra (_self)","targetParent":"Finestra pare (_parent)","langDirLTR":"D'esquerra a dreta (LTR)","langDirRTL":"De dreta a esquerra (RTL)","styles":"Estil","cssClasses":"Classes del full d'estil","width":"Amplada","height":"Alçada","align":"Alineació","alignLeft":"Ajusta a l'esquerra","alignRight":"Ajusta a la dreta","alignCenter":"Centre","alignTop":"Superior","alignMiddle":"Centre","alignBottom":"Inferior","invalidValue":"Valor no vàlid.","invalidHeight":"L'alçada ha de ser un número.","invalidWidth":"L'amplada ha de ser un número.","invalidCssLength":"El valor especificat per als \"%1\" camps ha de ser un número positiu amb o sense unitat de mesura vàlida de CSS (px, %, in, cm, mm, em, ex, pt o pc).","invalidHtmlLength":"El valor especificat per als \"%1\" camps ha de ser un número positiu amb o sense unitat de mesura vàlida d'HTML (px o %).","invalidInlineStyle":"El valor especificat per l'estil en línia ha de constar d'una o més tuples amb el format \"name: value\", separats per punt i coma.","cssLengthTooltip":"Introduïu un número per un valor en píxels o un número amb una unitat vàlida de CSS (px, %, in, cm, mm, em, ex, pt o pc).","unavailable":"%1, no disponible"},"about":{"copy":"Copyright © $1. Tots els drets reservats.","dlgTitle":"Quant al CKEditor","help":"Premi $1 per obtenir ajuda.","moreInfo":"Per informació sobre llicències visiteu el nostre lloc web:","title":"Quant al CKEditor","userGuide":"Manual d'usuari de CKEditor"},"basicstyles":{"bold":"Negreta","italic":"Cursiva","strike":"Ratllat","subscript":"Subíndex","superscript":"Superíndex","underline":"Subratllat"},"clipboard":{"copy":"Copiar","copyError":"La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+C).","cut":"Retallar","cutError":"La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+X).","paste":"Enganxar","pasteArea":"Àrea d'enganxat","pasteMsg":"Si us plau, enganxi dins del següent camp utilitzant el teclat (Ctrl/Cmd+V) i premi OK.","securityMsg":"A causa de la configuració de seguretat del vostre navegador, l'editor no pot accedir a les dades del porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.","title":"Enganxar"},"toolbar":{"toolbarCollapse":"Redueix la barra d'eines","toolbarExpand":"Amplia la barra d'eines","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor de barra d'eines"},"fakeobjects":{"anchor":"Àncora","flash":"Animació Flash","hiddenfield":"Camp ocult","iframe":"IFrame","unknown":"Objecte desconegut"},"link":{"acccessKey":"Clau d'accés","advanced":"Avançat","advisoryContentType":"Tipus de contingut consultiu","advisoryTitle":"Títol consultiu","anchor":{"toolbar":"Insereix/Edita àncora","menu":"Propietats de l'àncora","title":"Propietats de l'àncora","name":"Nom de l'àncora","errorName":"Si us plau, escriviu el nom de l'ancora","remove":"Remove Anchor"},"anchorId":"Per Id d'element","anchorName":"Per nom d'àncora","charset":"Conjunt de caràcters font enllaçat","cssClasses":"Classes del full d'estil","emailAddress":"Adreça de correu electrònic","emailBody":"Cos del missatge","emailSubject":"Assumpte del missatge","id":"Id","info":"Informació de l'enllaç","langCode":"Direcció de l'idioma","langDir":"Direcció de l'idioma","langDirLTR":"D'esquerra a dreta (LTR)","langDirRTL":"De dreta a esquerra (RTL)","menu":"Edita l'enllaç","name":"Nom","noAnchors":"(No hi ha àncores disponibles en aquest document)","noEmail":"Si us plau, escrigui l'adreça correu electrònic","noUrl":"Si us plau, escrigui l'enllaç URL","other":"","popupDependent":"Depenent (Netscape)","popupFeatures":"Característiques finestra popup","popupFullScreen":"Pantalla completa (IE)","popupLeft":"Posició esquerra","popupLocationBar":"Barra d'adreça","popupMenuBar":"Barra de menú","popupResizable":"Redimensionable","popupScrollBars":"Barres d'scroll","popupStatusBar":"Barra d'estat","popupToolbar":"Barra d'eines","popupTop":"Posició dalt","rel":"Relació","selectAnchor":"Selecciona una àncora","styles":"Estil","tabIndex":"Index de Tab","target":"Destí","targetFrame":"","targetFrameName":"Nom del marc de destí","targetPopup":"","targetPopupName":"Nom finestra popup","title":"Enllaç","toAnchor":"Àncora en aquesta pàgina","toEmail":"Correu electrònic","toUrl":"URL","toolbar":"Insereix/Edita enllaç","type":"Tipus d'enllaç","unlink":"Elimina l'enllaç","upload":"Puja"},"indent":{"indent":"Augmenta el sagnat","outdent":"Redueix el sagnat"},"list":{"bulletedlist":"Llista de pics","numberedlist":"Llista numerada"},"pastetext":{"button":"Enganxa com a text no formatat","title":"Enganxa com a text no formatat"},"undo":{"redo":"Refés","undo":"Desfés"},"colorbutton":{"auto":"Automàtic","bgColorTitle":"Color de Fons","colors":{"000":"Negre","800000":"Grana","8B4513":"Marró sella","2F4F4F":"Gris pissarra fosca","008080":"Blau xarxet","000080":"Blau marí","4B0082":"Indi","696969":"Gris Fosc","B22222":"Foc Maó","A52A2A":"Marró","DAA520":"Solidago","006400":"Verd Fosc","40E0D0":"Turquesa","0000CD":"Blau 1/2","800080":"Lila","808080":"Gris","F00":"Vermell","FF8C00":"Taronja Fosc","FFD700":"Or","008000":"Verd","0FF":"Cian","00F":"Blau","EE82EE":"Violat","A9A9A9":"Gris clar","FFA07A":"Salmó clar","FFA500":"Taronja","FFFF00":"Groc","00FF00":"Verd Llima","AFEEEE":"Turquesa Pàl·lid","ADD8E6":"Blau Clar","DDA0DD":"Pruna","D3D3D3":"Gris Clar","FFF0F5":"Lavanda rosat","FAEBD7":"Blanc Antic","FFFFE0":"Groc Clar","F0FFF0":"Verd Pàl·lid","F0FFFF":"Atzur","F0F8FF":"Cian pàlid","E6E6FA":"Lavanda","FFF":"Blanc"},"more":"Més Colors...","panelTitle":"Colors","textColorTitle":"Color del Text"},"font":{"fontSize":{"label":"Mida","voiceLabel":"Mida de la lletra","panelTitle":"Mida"},"label":"Tipus de lletra","panelTitle":"Tipus de lletra","voiceLabel":"Tipus de lletra"},"image":{"alertUrl":"Si us plau, escriviu la URL de la imatge","alt":"Text alternatiu","border":"Vora","btnUpload":"Envia-la al servidor","button2Img":"Voleu transformar el botó d'imatge seleccionat en una simple imatge?","hSpace":"Espaiat horit.","img2Button":"Voleu transformar la imatge seleccionada en un botó d'imatge?","infoTab":"Informació de la imatge","linkTab":"Enllaç","lockRatio":"Bloqueja les proporcions","menu":"Propietats de la imatge","resetSize":"Restaura la mida","title":"Propietats de la imatge","titleButton":"Propietats del botó d'imatge","upload":"Puja","urlMissing":"Falta la URL de la imatge.","vSpace":"Espaiat vert.","validateBorder":"La vora ha de ser un nombre enter.","validateHSpace":"HSpace ha de ser un nombre enter.","validateVSpace":"VSpace ha de ser un nombre enter."},"scayt":{"about":"Quant a l'SCAYT","aboutTab":"Quant a","addWord":"Afegeix una paraula","allCaps":"Ignora paraules en majúscules","dic_create":"Crea","dic_delete":"Elimina","dic_field_name":"Nom del diccionari","dic_info":"Inicialment el diccionari d'usuari s'emmagatzema en una galeta. De totes maneres, les galetes tenen la mida limitada. Quan el diccionari creix massa, llavors el diccionari es pot emmagatzemar al nostre servidor. Per desar el vostre diccionari personal al nostre servidor heu d.'especificar un nom pel diccionari. Si ja heu desat un diccionari, teclegeu si us plau el seu nom i cliqueu el botó de restauració.","dic_rename":"Canvia el nom","dic_restore":"Restaura","dictionariesTab":"Diccionaris","disable":"Deshabilita SCAYT","emptyDic":"El nom del diccionari no hauria d'estar buit.","enable":"Habilitat l'SCAYT","ignore":"Ignora","ignoreAll":"Ignora'ls tots","ignoreDomainNames":"Ignora els noms de domini","langs":"Idiomes","languagesTab":"Idiomes","mixedCase":"Ignora paraules amb majúscules i minúscules","mixedWithDigits":"Ignora paraules amb números ","moreSuggestions":"Més suggerències","opera_title":"No és compatible amb l'Opera","options":"Opcions","optionsTab":"Opcions","title":"Spell Check As You Type","toggle":"Commuta l'SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adreça","tag_div":"Normal (DIV)","tag_h1":"Encapçalament 1","tag_h2":"Encapçalament 2","tag_h3":"Encapçalament 3","tag_h4":"Encapçalament 4","tag_h5":"Encapçalament 5","tag_h6":"Encapçalament 6","tag_p":"Normal","tag_pre":"Formatejat"},"justify":{"block":"Justificat","center":"Centrat","left":"Alinea a l'esquerra","right":"Alinea a la dreta"},"wsc":{"btnIgnore":"Ignora","btnIgnoreAll":"Ignora-les totes","btnReplace":"Canvia","btnReplaceAll":"Canvia-les totes","btnUndo":"Desfés","changeTo":"Reemplaça amb","errorLoading":"Error carregant el servidor: %s.","ieSpellDownload":"Verificació ortogràfica no instal·lada. Voleu descarregar-ho ara?","manyChanges":"Verificació ortogràfica: s'han canviat %1 paraules","noChanges":"Verificació ortogràfica: no s'ha canviat cap paraula","noMispell":"Verificació ortogràfica acabada: no hi ha cap paraula mal escrita","noSuggestions":"Cap suggeriment","notAvailable":"El servei no es troba disponible ara.","notInDic":"No és al diccionari","oneChange":"Verificació ortogràfica: s'ha canviat una paraula","progress":"Verificació ortogràfica en curs...","title":"Comprova l'ortografia","toolbar":"Revisa l'ortografia"},"colordialog":{"clear":"Neteja","highlight":"Destacat","options":"Opcions del color","selected":"Color Seleccionat","title":"Seleccioni el color"},"contextmenu":{"options":"Opcions del menú contextual"},"blockquote":{"toolbar":"Bloc de cita"},"table":{"border":"Mida vora","caption":"Títol","cell":{"menu":"Cel·la","insertBefore":"Insereix abans","insertAfter":"Insereix després","deleteCell":"Suprimeix","merge":"Fusiona","mergeRight":"Fusiona a la dreta","mergeDown":"Fusiona avall","splitHorizontal":"Divideix horitzontalment","splitVertical":"Divideix verticalment","title":"Propietats de la cel·la","cellType":"Tipus de cel·la","rowSpan":"Expansió de files","colSpan":"Expansió de columnes","wordWrap":"Ajustar al contingut","hAlign":"Alineació Horizontal","vAlign":"Alineació Vertical","alignBaseline":"A la línia base","bgColor":"Color de fons","borderColor":"Color de la vora","data":"Dades","header":"Capçalera","yes":"Sí","no":"No","invalidWidth":"L'amplada de cel·la ha de ser un nombre.","invalidHeight":"L'alçada de cel·la ha de ser un nombre.","invalidRowSpan":"L'expansió de files ha de ser un nombre enter.","invalidColSpan":"L'expansió de columnes ha de ser un nombre enter.","chooseColor":"Trieu"},"cellPad":"Encoixinament de cel·les","cellSpace":"Espaiat de cel·les","column":{"menu":"Columna","insertBefore":"Insereix columna abans de","insertAfter":"Insereix columna darrera","deleteColumn":"Suprimeix una columna"},"columns":"Columnes","deleteTable":"Suprimeix la taula","headers":"Capçaleres","headersBoth":"Ambdues","headersColumn":"Primera columna","headersNone":"Cap","headersRow":"Primera fila","invalidBorder":"El gruix de la vora ha de ser un nombre.","invalidCellPadding":"L'encoixinament de cel·la ha de ser un nombre.","invalidCellSpacing":"L'espaiat de cel·la ha de ser un nombre.","invalidCols":"El nombre de columnes ha de ser un nombre major que 0.","invalidHeight":"L'alçada de la taula ha de ser un nombre.","invalidRows":"El nombre de files ha de ser un nombre major que 0.","invalidWidth":"L'amplada de la taula ha de ser un nombre.","menu":"Propietats de la taula","row":{"menu":"Fila","insertBefore":"Insereix fila abans de","insertAfter":"Insereix fila darrera","deleteRow":"Suprimeix una fila"},"rows":"Files","summary":"Resum","title":"Propietats de la taula","toolbar":"Taula","widthPc":"percentatge","widthPx":"píxels","widthUnit":"unitat d'amplada"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Títol de guia","cssClassInputLabel":"Classes de la fulla d'estils","edit":"Edita la Capa","inlineStyleInputLabel":"Estil en línia","langDirLTRLabel":"D'esquerra a dreta (LTR)","langDirLabel":"Direcció de l'idioma","langDirRTLLabel":"De dreta a esquerra (RTL)","languageCodeInputLabel":" Codi d'idioma","remove":"Elimina la Capa","styleSelectLabel":"Estil","title":"Crea una Capa Contenidora","toolbar":"Crea una Capa Contenidora"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/no.js0000644000000000000000000003146312247657030021012 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['no']={"editor":"Rikteksteditor","editorPanel":"Panel for rikteksteditor","common":{"editorHelp":"Trykk ALT 0 for hjelp","browseServer":"Bla igjennom server","url":"URL","protocol":"Protokoll","upload":"Last opp","uploadSubmit":"Send det til serveren","image":"Bilde","flash":"Flash","form":"Skjema","checkbox":"Avmerkingsboks","radio":"Alternativknapp","textField":"Tekstboks","textarea":"TekstomrÃ¥de","hiddenField":"Skjult felt","button":"Knapp","select":"Rullegardinliste","imageButton":"Bildeknapp","notSet":"","id":"Id","name":"Navn","langDir":"SprÃ¥kretning","langDirLtr":"Venstre til høyre (VTH)","langDirRtl":"Høyre til venstre (HTV)","langCode":"SprÃ¥kkode","longDescr":"Utvidet beskrivelse","cssClass":"Stilarkklasser","advisoryTitle":"Tittel","cssStyle":"Stil","ok":"OK","cancel":"Avbryt","close":"Lukk","preview":"ForhÃ¥ndsvis","resize":"Dra for Ã¥ skalere","generalTab":"Generelt","advancedTab":"Avansert","validateNumberFailed":"Denne verdien er ikke et tall.","confirmNewPage":"Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker pÃ¥ at du vil laste en ny side?","confirmCancel":"Noen av valgene har blitt endret. Er du sikker pÃ¥ at du vil lukke dialogen?","options":"Valg","target":"MÃ¥l","targetNew":"Nytt vindu (_blank)","targetTop":"Hele vindu (_top)","targetSelf":"Samme vindu (_self)","targetParent":"Foreldrevindu (_parent)","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","styles":"Stil","cssClasses":"Stilarkklasser","width":"Bredde","height":"Høyde","align":"Juster","alignLeft":"Venstre","alignRight":"Høyre","alignCenter":"Midtjuster","alignTop":"Topp","alignMiddle":"Midten","alignBottom":"Bunn","invalidValue":"Ugyldig verdi.","invalidHeight":"Høyde mÃ¥ være et tall.","invalidWidth":"Bredde mÃ¥ være et tall.","invalidCssLength":"Den angitte verdien for feltet \"%1\" mÃ¥ være et positivt tall med eller uten en gyldig CSS-mÃ¥lingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Den angitte verdien for feltet \"%1\" mÃ¥ være et positivt tall med eller uten en gyldig HTML-mÃ¥lingsenhet (px eller %).","invalidInlineStyle":"Verdi angitt for inline stil mÃ¥ bestÃ¥ av en eller flere sett med formatet \"navn : verdi\", separert med semikolon","cssLengthTooltip":"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1, utilgjenglig"},"about":{"copy":"Copyright © $1. Alle rettigheter reservert.","dlgTitle":"Om CKEditor","help":"Se $1 for hjelp.","moreInfo":"For lisensieringsinformasjon, vennligst besøk vÃ¥rt nettsted:","title":"Om CKEditor","userGuide":"CKEditors brukerveiledning"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Gjennomstreking","subscript":"Senket skrift","superscript":"Hevet skrift","underline":"Understreking"},"clipboard":{"copy":"Kopier","copyError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).","cut":"Klipp ut","cutError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).","paste":"Lim inn","pasteArea":"InnlimingsomrÃ¥de","pasteMsg":"Vennligst lim inn i følgende boks med tastaturet (Ctrl/Cmd+V) og trykk OK.","securityMsg":"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du mÃ¥ derfor lime det inn pÃ¥ nytt i dette vinduet.","title":"Lim inn"},"toolbar":{"toolbarCollapse":"Skjul verktøylinje","toolbarExpand":"Vis verktøylinje","toolbarGroups":{"document":"Dokument","clipboard":"Utklippstavle/Angre","editing":"Redigering","forms":"Skjema","basicstyles":"Basisstiler","paragraph":"Avsnitt","links":"Lenker","insert":"Innsetting","styles":"Stiler","colors":"Farger","tools":"Verktøy"},"toolbars":"Verktøylinjer for editor"},"fakeobjects":{"anchor":"Anker","flash":"Flash-animasjon","hiddenfield":"Skjult felt","iframe":"IFrame","unknown":"Ukjent objekt"},"link":{"acccessKey":"Aksessknapp","advanced":"Avansert","advisoryContentType":"Type","advisoryTitle":"Tittel","anchor":{"toolbar":"Sett inn/Rediger anker","menu":"Egenskaper for anker","title":"Egenskaper for anker","name":"Ankernavn","errorName":"Vennligst skriv inn ankernavnet","remove":"Fjern anker"},"anchorId":"Element etter ID","anchorName":"Anker etter navn","charset":"Lenket tegnsett","cssClasses":"Stilarkklasser","emailAddress":"E-postadresse","emailBody":"Melding","emailSubject":"Meldingsemne","id":"Id","info":"Lenkeinfo","langCode":"SprÃ¥kkode","langDir":"SprÃ¥kretning","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","menu":"Rediger lenke","name":"Navn","noAnchors":"(Ingen anker i dokumentet)","noEmail":"Vennligst skriv inn e-postadressen","noUrl":"Vennligst skriv inn lenkens URL","other":"","popupDependent":"Avhenging (Netscape)","popupFeatures":"Egenskaper for popup-vindu","popupFullScreen":"Fullskjerm (IE)","popupLeft":"Venstre posisjon","popupLocationBar":"Adresselinje","popupMenuBar":"Menylinje","popupResizable":"Skalerbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Verktøylinje","popupTop":"Topp-posisjon","rel":"Relasjon (rel)","selectAnchor":"Velg et anker","styles":"Stil","tabIndex":"Tabindeks","target":"MÃ¥l","targetFrame":"","targetFrameName":"MÃ¥lramme","targetPopup":"","targetPopupName":"Navn pÃ¥ popup-vindu","title":"Lenke","toAnchor":"Lenke til anker i teksten","toEmail":"E-post","toUrl":"URL","toolbar":"Sett inn/Rediger lenke","type":"Lenketype","unlink":"Fjern lenke","upload":"Last opp"},"indent":{"indent":"Øk innrykk","outdent":"Reduser innrykk"},"list":{"bulletedlist":"Legg til/Fjern punktmerket liste","numberedlist":"Legg til/Fjern nummerert liste"},"pastetext":{"button":"Lim inn som ren tekst","title":"Lim inn som ren tekst"},"undo":{"redo":"Gjør om","undo":"Angre"},"colorbutton":{"auto":"Automatisk","bgColorTitle":"Bakgrunnsfarge","colors":{"000":"Svart","800000":"Rødbrun","8B4513":"Salbrun","2F4F4F":"Grønnsvart","008080":"BlÃ¥grønn","000080":"MarineblÃ¥tt","4B0082":"Indigo","696969":"Mørk grÃ¥","B22222":"Mørkerød","A52A2A":"Brun","DAA520":"Lys brun","006400":"Mørk grønn","40E0D0":"Turkis","0000CD":"Medium blÃ¥","800080":"Purpur","808080":"GrÃ¥","F00":"Rød","FF8C00":"Mørk oransje","FFD700":"Gull","008000":"Grønn","0FF":"Cyan","00F":"BlÃ¥","EE82EE":"Fiolett","A9A9A9":"Svak grÃ¥","FFA07A":"Rosa-oransje","FFA500":"Oransje","FFFF00":"Gul","00FF00":"Lime","AFEEEE":"Svak turkis","ADD8E6":"Lys BlÃ¥","DDA0DD":"Plomme","D3D3D3":"Lys grÃ¥","FFF0F5":"Svak lavendelrosa","FAEBD7":"Antikk-hvit","FFFFE0":"Lys gul","F0FFF0":"Honningmelon","F0FFFF":"Svakt asurblÃ¥tt","F0F8FF":"Svak cyan","E6E6FA":"Lavendel","FFF":"Hvit"},"more":"Flere farger...","panelTitle":"Farger","textColorTitle":"Tekstfarge"},"font":{"fontSize":{"label":"Størrelse","voiceLabel":"Font Størrelse","panelTitle":"Størrelse"},"label":"Skrift","panelTitle":"Skrift","voiceLabel":"Font"},"image":{"alertUrl":"Vennligst skriv bilde-urlen","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Send det til serveren","button2Img":"Vil du endre den valgte bildeknappen til et vanlig bilde?","hSpace":"HMarg","img2Button":"Vil du endre det valgte bildet til en bildeknapp?","infoTab":"Bildeinformasjon","linkTab":"Lenke","lockRatio":"LÃ¥s forhold","menu":"Bildeegenskaper","resetSize":"Tilbakestill størrelse","title":"Bildeegenskaper","titleButton":"Egenskaper for bildeknapp","upload":"Last opp","urlMissing":"Bildets adresse mangler.","vSpace":"VMarg","validateBorder":"Ramme mÃ¥ være et heltall.","validateHSpace":"HMarg mÃ¥ være et heltall.","validateVSpace":"VMarg mÃ¥ være et heltall."},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Legg til ord","allCaps":"Ikke kontroller ord med kun store bokstaver","dic_create":"Opprett","dic_delete":"Slett","dic_field_name":"Ordboknavn","dic_info":"Brukerordboken lagres først i en informasjonskapsel pÃ¥ din maskin, men det er en begrensning pÃ¥ hvor mye som kan lagres her. NÃ¥r ordboken blir for stor til Ã¥ lagres i en informasjonskapsel, vil vi i stedet lagre ordboken pÃ¥ vÃ¥r server. For Ã¥ lagre din personlige ordbok pÃ¥ vÃ¥r server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk pÃ¥ Gjenopprett-knappen.","dic_rename":"Gi nytt navn","dic_restore":"Gjenopprett","dictionariesTab":"Ordbøker","disable":"SlÃ¥ av SCAYT","emptyDic":"Ordboknavn bør ikke være tom.","enable":"SlÃ¥ pÃ¥ SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Alle","ignoreDomainNames":"Ikke kontroller domenenavn","langs":"SprÃ¥k","languagesTab":"SprÃ¥k","mixedCase":"Ikke kontroller ord med blandet smÃ¥ og store bokstaver","mixedWithDigits":"Ikke kontroller ord som inneholder tall","moreSuggestions":"Flere forslag","opera_title":"Ikke støttet av Opera","options":"Valg","optionsTab":"Valg","title":"Stavekontroll mens du skriver","toggle":"Veksle SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Format","panelTitle":"Avsnittsformat","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formatert"},"justify":{"block":"Blokkjuster","center":"Midtstill","left":"Venstrejuster","right":"Høyrejuster"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer alle","btnReplace":"Erstatt","btnReplaceAll":"Erstatt alle","btnUndo":"Angre","changeTo":"Endre til","errorLoading":"Feil under lasting av applikasjonstjenestetjener: %s.","ieSpellDownload":"Stavekontroll er ikke installert. Vil du laste den ned nÃ¥?","manyChanges":"Stavekontroll fullført: %1 ord endret","noChanges":"Stavekontroll fullført: ingen ord endret","noMispell":"Stavekontroll fullført: ingen feilstavinger funnet","noSuggestions":"- Ingen forslag -","notAvailable":"Beklager, tjenesten er utilgjenglig nÃ¥.","notInDic":"Ikke i ordboken","oneChange":"Stavekontroll fullført: Ett ord endret","progress":"Stavekontroll pÃ¥gÃ¥r...","title":"Stavekontroll","toolbar":"Stavekontroll"},"colordialog":{"clear":"Tøm","highlight":"Merk","options":"Alternativer for farge","selected":"Valgt","title":"Velg farge"},"contextmenu":{"options":"Alternativer for høyreklikkmeny"},"blockquote":{"toolbar":"Blokksitat"},"table":{"border":"Rammestørrelse","caption":"Tittel","cell":{"menu":"Celle","insertBefore":"Sett inn celle før","insertAfter":"Sett inn celle etter","deleteCell":"Slett celler","merge":"SlÃ¥ sammen celler","mergeRight":"SlÃ¥ sammen høyre","mergeDown":"SlÃ¥ sammen ned","splitHorizontal":"Del celle horisontalt","splitVertical":"Del celle vertikalt","title":"Celleegenskaper","cellType":"Celletype","rowSpan":"Radspenn","colSpan":"Kolonnespenn","wordWrap":"Tekstbrytning","hAlign":"Horisontal justering","vAlign":"Vertikal justering","alignBaseline":"Grunnlinje","bgColor":"Bakgrunnsfarge","borderColor":"Rammefarge","data":"Data","header":"Overskrift","yes":"Ja","no":"Nei","invalidWidth":"Cellebredde mÃ¥ være et tall.","invalidHeight":"Cellehøyde mÃ¥ være et tall.","invalidRowSpan":"Radspenn mÃ¥ være et heltall.","invalidColSpan":"Kolonnespenn mÃ¥ være et heltall.","chooseColor":"Velg"},"cellPad":"Cellepolstring","cellSpace":"Cellemarg","column":{"menu":"Kolonne","insertBefore":"Sett inn kolonne før","insertAfter":"Sett inn kolonne etter","deleteColumn":"Slett kolonner"},"columns":"Kolonner","deleteTable":"Slett tabell","headers":"Overskrifter","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første rad","invalidBorder":"Rammestørrelse mÃ¥ være et tall.","invalidCellPadding":"Cellepolstring mÃ¥ være et positivt tall.","invalidCellSpacing":"Cellemarg mÃ¥ være et positivt tall.","invalidCols":"Antall kolonner mÃ¥ være et tall større enn 0.","invalidHeight":"Tabellhøyde mÃ¥ være et tall.","invalidRows":"Antall rader mÃ¥ være et tall større enn 0.","invalidWidth":"Tabellbredde mÃ¥ være et tall.","menu":"Egenskaper for tabell","row":{"menu":"Rader","insertBefore":"Sett inn rad før","insertAfter":"Sett inn rad etter","deleteRow":"Slett rader"},"rows":"Rader","summary":"Sammendrag","title":"Egenskaper for tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"piksler","widthUnit":"Bredde-enhet"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Tittel","cssClassInputLabel":"Stilark-klasser","edit":"Rediger Div","inlineStyleInputLabel":"Inlinestiler","langDirLTRLabel":"Venstre til høyre (VTH)","langDirLabel":"SprÃ¥kretning","langDirRTLLabel":"Høyre til venstre (HTV)","languageCodeInputLabel":" SprÃ¥kkode","remove":"Fjern Div","styleSelectLabel":"Stil","title":"Sett inn Div Container","toolbar":"Sett inn Div Container"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/nb.js0000644000000000000000000003151212247657030020770 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['nb']={"editor":"Rikteksteditor","editorPanel":"Panel for rikteksteditor","common":{"editorHelp":"Trykk ALT 0 for hjelp","browseServer":"Bla igjennom server","url":"URL","protocol":"Protokoll","upload":"Last opp","uploadSubmit":"Send det til serveren","image":"Bilde","flash":"Flash","form":"Skjema","checkbox":"Avmerkingsboks","radio":"Alternativknapp","textField":"Tekstboks","textarea":"TekstomrÃ¥de","hiddenField":"Skjult felt","button":"Knapp","select":"Rullegardinliste","imageButton":"Bildeknapp","notSet":"","id":"Id","name":"Navn","langDir":"SprÃ¥kretning","langDirLtr":"Venstre til høyre (VTH)","langDirRtl":"Høyre til venstre (HTV)","langCode":"SprÃ¥kkode","longDescr":"Utvidet beskrivelse","cssClass":"Stilarkklasser","advisoryTitle":"Tittel","cssStyle":"Stil","ok":"OK","cancel":"Avbryt","close":"Lukk","preview":"ForhÃ¥ndsvis","resize":"Dra for Ã¥ skalere","generalTab":"Generelt","advancedTab":"Avansert","validateNumberFailed":"Denne verdien er ikke et tall.","confirmNewPage":"Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker pÃ¥ at du vil laste en ny side?","confirmCancel":"Noen av valgene har blitt endret. Er du sikker pÃ¥ at du vil lukke dialogen?","options":"Valg","target":"MÃ¥l","targetNew":"Nytt vindu (_blank)","targetTop":"Hele vindu (_top)","targetSelf":"Samme vindu (_self)","targetParent":"Foreldrevindu (_parent)","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","styles":"Stil","cssClasses":"Stilarkklasser","width":"Bredde","height":"Høyde","align":"Juster","alignLeft":"Venstre","alignRight":"Høyre","alignCenter":"Midtjuster","alignTop":"Topp","alignMiddle":"Midten","alignBottom":"Bunn","invalidValue":"Ugyldig verdi.","invalidHeight":"Høyde mÃ¥ være et tall.","invalidWidth":"Bredde mÃ¥ være et tall.","invalidCssLength":"Den angitte verdien for feltet \"%1\" mÃ¥ være et positivt tall med eller uten en gyldig CSS-mÃ¥lingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Den angitte verdien for feltet \"%1\" mÃ¥ være et positivt tall med eller uten en gyldig HTML-mÃ¥lingsenhet (px eller %).","invalidInlineStyle":"Verdi angitt for inline stil mÃ¥ bestÃ¥ av en eller flere sett med formatet \"navn : verdi\", separert med semikolon","cssLengthTooltip":"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1, utilgjenglig"},"about":{"copy":"Copyright © $1. Alle rettigheter reservert.","dlgTitle":"Om CKEditor","help":"Se $1 for hjelp.","moreInfo":"For lisensieringsinformasjon, vennligst besøk vÃ¥rt nettsted:","title":"Om CKEditor","userGuide":"CKEditors brukerveiledning"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Gjennomstreking","subscript":"Senket skrift","superscript":"Hevet skrift","underline":"Understreking"},"clipboard":{"copy":"Kopier","copyError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+C).","cut":"Klipp ut","cutError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+X).","paste":"Lim inn","pasteArea":"InnlimingsomrÃ¥de","pasteMsg":"Vennligst lim inn i følgende boks med tastaturet (Ctrl/Cmd+V) og trykk OK.","securityMsg":"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du mÃ¥ derfor lime det inn pÃ¥ nytt i dette vinduet.","title":"Lim inn"},"toolbar":{"toolbarCollapse":"Skjul verktøylinje","toolbarExpand":"Vis verktøylinje","toolbarGroups":{"document":"Dokument","clipboard":"Utklippstavle/Angre","editing":"Redigering","forms":"Skjema","basicstyles":"Basisstiler","paragraph":"Avsnitt","links":"Lenker","insert":"Innsetting","styles":"Stiler","colors":"Farger","tools":"Verktøy"},"toolbars":"Verktøylinjer for editor"},"fakeobjects":{"anchor":"Anker","flash":"Flash-animasjon","hiddenfield":"Skjult felt","iframe":"IFrame","unknown":"Ukjent objekt"},"link":{"acccessKey":"Aksessknapp","advanced":"Avansert","advisoryContentType":"Type","advisoryTitle":"Tittel","anchor":{"toolbar":"Sett inn/Rediger anker","menu":"Egenskaper for anker","title":"Egenskaper for anker","name":"Ankernavn","errorName":"Vennligst skriv inn ankernavnet","remove":"Fjern anker"},"anchorId":"Element etter ID","anchorName":"Anker etter navn","charset":"Lenket tegnsett","cssClasses":"Stilarkklasser","emailAddress":"E-postadresse","emailBody":"Melding","emailSubject":"Meldingsemne","id":"Id","info":"Lenkeinfo","langCode":"SprÃ¥kkode","langDir":"SprÃ¥kretning","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","menu":"Rediger lenke","name":"Navn","noAnchors":"(Ingen anker i dokumentet)","noEmail":"Vennligst skriv inn e-postadressen","noUrl":"Vennligst skriv inn lenkens URL","other":"","popupDependent":"Avhenging (Netscape)","popupFeatures":"Egenskaper for popup-vindu","popupFullScreen":"Fullskjerm (IE)","popupLeft":"Venstre posisjon","popupLocationBar":"Adresselinje","popupMenuBar":"Menylinje","popupResizable":"Skalerbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Verktøylinje","popupTop":"Topp-posisjon","rel":"Relasjon (rel)","selectAnchor":"Velg et anker","styles":"Stil","tabIndex":"Tabindeks","target":"MÃ¥l","targetFrame":"","targetFrameName":"MÃ¥lramme","targetPopup":"","targetPopupName":"Navn pÃ¥ popup-vindu","title":"Lenke","toAnchor":"Lenke til anker i teksten","toEmail":"E-post","toUrl":"URL","toolbar":"Sett inn/Rediger lenke","type":"Lenketype","unlink":"Fjern lenke","upload":"Last opp"},"indent":{"indent":"Øk innrykk","outdent":"Reduser innrykk"},"list":{"bulletedlist":"Legg til/Fjern punktmerket liste","numberedlist":"Legg til/Fjern nummerert liste"},"pastetext":{"button":"Lim inn som ren tekst","title":"Lim inn som ren tekst"},"undo":{"redo":"Gjør om","undo":"Angre"},"colorbutton":{"auto":"Automatisk","bgColorTitle":"Bakgrunnsfarge","colors":{"000":"Svart","800000":"Rødbrun","8B4513":"Salbrun","2F4F4F":"Grønnsvart","008080":"BlÃ¥grønn","000080":"MarineblÃ¥tt","4B0082":"Indigo","696969":"Mørk grÃ¥","B22222":"Mørkerød","A52A2A":"Brun","DAA520":"Lys brun","006400":"Mørk grønn","40E0D0":"Turkis","0000CD":"Medium blÃ¥","800080":"Purpur","808080":"GrÃ¥","F00":"Rød","FF8C00":"Mørk oransje","FFD700":"Gull","008000":"Grønn","0FF":"Cyan","00F":"BlÃ¥","EE82EE":"Fiolett","A9A9A9":"Svak grÃ¥","FFA07A":"Rosa-oransje","FFA500":"Oransje","FFFF00":"Gul","00FF00":"Lime","AFEEEE":"Svak turkis","ADD8E6":"Lys BlÃ¥","DDA0DD":"Plomme","D3D3D3":"Lys grÃ¥","FFF0F5":"Svak lavendelrosa","FAEBD7":"Antikk-hvit","FFFFE0":"Lys gul","F0FFF0":"Honningmelon","F0FFFF":"Svakt asurblÃ¥tt","F0F8FF":"Svak cyan","E6E6FA":"Lavendel","FFF":"Hvit"},"more":"Flere farger...","panelTitle":"Farger","textColorTitle":"Tekstfarge"},"font":{"fontSize":{"label":"Størrelse","voiceLabel":"Skriftstørrelse","panelTitle":"Skriftstørrelse"},"label":"Skrift","panelTitle":"Skrift","voiceLabel":"Font"},"image":{"alertUrl":"Vennligst skriv bilde-urlen","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Send det til serveren","button2Img":"Vil du endre den valgte bildeknappen til et vanlig bilde?","hSpace":"HMarg","img2Button":"Vil du endre det valgte bildet til en bildeknapp?","infoTab":"Bildeinformasjon","linkTab":"Lenke","lockRatio":"LÃ¥s forhold","menu":"Bildeegenskaper","resetSize":"Tilbakestill størrelse","title":"Bildeegenskaper","titleButton":"Egenskaper for bildeknapp","upload":"Last opp","urlMissing":"Bildets adresse mangler.","vSpace":"VMarg","validateBorder":"Ramme mÃ¥ være et heltall.","validateHSpace":"HMarg mÃ¥ være et heltall.","validateVSpace":"VMarg mÃ¥ være et heltall."},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Legg til ord","allCaps":"Ikke kontroller ord med kun store bokstaver","dic_create":"Opprett","dic_delete":"Slett","dic_field_name":"Ordboknavn","dic_info":"Brukerordboken lagres først i en informasjonskapsel pÃ¥ din maskin, men det er en begrensning pÃ¥ hvor mye som kan lagres her. NÃ¥r ordboken blir for stor til Ã¥ lagres i en informasjonskapsel, vil vi i stedet lagre ordboken pÃ¥ vÃ¥r server. For Ã¥ lagre din personlige ordbok pÃ¥ vÃ¥r server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk pÃ¥ Gjenopprett-knappen.","dic_rename":"Gi nytt navn","dic_restore":"Gjenopprett","dictionariesTab":"Ordbøker","disable":"SlÃ¥ av SCAYT","emptyDic":"Ordboknavn bør ikke være tom.","enable":"SlÃ¥ pÃ¥ SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Alle","ignoreDomainNames":"Ikke kontroller domenenavn","langs":"SprÃ¥k","languagesTab":"SprÃ¥k","mixedCase":"Ikke kontroller ord med blandet smÃ¥ og store bokstaver","mixedWithDigits":"Ikke kontroller ord som inneholder tall","moreSuggestions":"Flere forslag","opera_title":"Ikke støttet av Opera","options":"Valg","optionsTab":"Valg","title":"Stavekontroll mens du skriver","toggle":"Veksle SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Format","panelTitle":"Avsnittsformat","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formatert"},"justify":{"block":"Blokkjuster","center":"Midtstill","left":"Venstrejuster","right":"Høyrejuster"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer alle","btnReplace":"Erstatt","btnReplaceAll":"Erstatt alle","btnUndo":"Angre","changeTo":"Endre til","errorLoading":"Feil under lasting av applikasjonstjenestetjener: %s.","ieSpellDownload":"Stavekontroll er ikke installert. Vil du laste den ned nÃ¥?","manyChanges":"Stavekontroll fullført: %1 ord endret","noChanges":"Stavekontroll fullført: ingen ord endret","noMispell":"Stavekontroll fullført: ingen feilstavinger funnet","noSuggestions":"- Ingen forslag -","notAvailable":"Beklager, tjenesten er utilgjenglig nÃ¥.","notInDic":"Ikke i ordboken","oneChange":"Stavekontroll fullført: Ett ord endret","progress":"Stavekontroll pÃ¥gÃ¥r...","title":"Stavekontroll","toolbar":"Stavekontroll"},"colordialog":{"clear":"Tøm","highlight":"Merk","options":"Alternativer for farge","selected":"Valgt","title":"Velg farge"},"contextmenu":{"options":"Alternativer for høyreklikkmeny"},"blockquote":{"toolbar":"Blokksitat"},"table":{"border":"Rammestørrelse","caption":"Tittel","cell":{"menu":"Celle","insertBefore":"Sett inn celle før","insertAfter":"Sett inn celle etter","deleteCell":"Slett celler","merge":"SlÃ¥ sammen celler","mergeRight":"SlÃ¥ sammen høyre","mergeDown":"SlÃ¥ sammen ned","splitHorizontal":"Del celle horisontalt","splitVertical":"Del celle vertikalt","title":"Celleegenskaper","cellType":"Celletype","rowSpan":"Radspenn","colSpan":"Kolonnespenn","wordWrap":"Tekstbrytning","hAlign":"Horisontal justering","vAlign":"Vertikal justering","alignBaseline":"Grunnlinje","bgColor":"Bakgrunnsfarge","borderColor":"Rammefarge","data":"Data","header":"Overskrift","yes":"Ja","no":"Nei","invalidWidth":"Cellebredde mÃ¥ være et tall.","invalidHeight":"Cellehøyde mÃ¥ være et tall.","invalidRowSpan":"Radspenn mÃ¥ være et heltall.","invalidColSpan":"Kolonnespenn mÃ¥ være et heltall.","chooseColor":"Velg"},"cellPad":"Cellepolstring","cellSpace":"Cellemarg","column":{"menu":"Kolonne","insertBefore":"Sett inn kolonne før","insertAfter":"Sett inn kolonne etter","deleteColumn":"Slett kolonner"},"columns":"Kolonner","deleteTable":"Slett tabell","headers":"Overskrifter","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første rad","invalidBorder":"Rammestørrelse mÃ¥ være et tall.","invalidCellPadding":"Cellepolstring mÃ¥ være et positivt tall.","invalidCellSpacing":"Cellemarg mÃ¥ være et positivt tall.","invalidCols":"Antall kolonner mÃ¥ være et tall større enn 0.","invalidHeight":"Tabellhøyde mÃ¥ være et tall.","invalidRows":"Antall rader mÃ¥ være et tall større enn 0.","invalidWidth":"Tabellbredde mÃ¥ være et tall.","menu":"Egenskaper for tabell","row":{"menu":"Rader","insertBefore":"Sett inn rad før","insertAfter":"Sett inn rad etter","deleteRow":"Slett rader"},"rows":"Rader","summary":"Sammendrag","title":"Egenskaper for tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"piksler","widthUnit":"Bredde-enhet"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Tittel","cssClassInputLabel":"Stilark-klasser","edit":"Rediger Div","inlineStyleInputLabel":"Inlinestiler","langDirLTRLabel":"Venstre til høyre (VTH)","langDirLabel":"SprÃ¥kretning","langDirRTLLabel":"Høyre til venstre (HTV)","languageCodeInputLabel":" SprÃ¥kkode","remove":"Fjern Div","styleSelectLabel":"Stil","title":"Sett inn Div Container","toolbar":"Sett inn Div Container"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/hu.js0000644000000000000000000003414412247657030021011 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['hu']={"editor":"HTML szerkesztÅ‘","editorPanel":"Rich Text szerkesztÅ‘ panel","common":{"editorHelp":"Segítségért nyomjon ALT 0","browseServer":"Böngészés a szerveren","url":"Hivatkozás","protocol":"Protokoll","upload":"Feltöltés","uploadSubmit":"Küldés a szerverre","image":"Kép","flash":"Flash","form":"Űrlap","checkbox":"JelölÅ‘négyzet","radio":"Választógomb","textField":"SzövegmezÅ‘","textarea":"Szövegterület","hiddenField":"RejtettmezÅ‘","button":"Gomb","select":"LegördülÅ‘ lista","imageButton":"Képgomb","notSet":"","id":"Azonosító","name":"Név","langDir":"Ãrás iránya","langDirLtr":"Balról jobbra","langDirRtl":"Jobbról balra","langCode":"Nyelv kódja","longDescr":"Részletes leírás webcíme","cssClass":"Stíluskészlet","advisoryTitle":"Súgócimke","cssStyle":"Stílus","ok":"Rendben","cancel":"Mégsem","close":"Bezárás","preview":"ElÅ‘nézet","resize":"Húzza az átméretezéshez","generalTab":"Ãltalános","advancedTab":"További opciók","validateNumberFailed":"A mezÅ‘be csak számokat írhat.","confirmNewPage":"Minden nem mentett változás el fog veszni! Biztosan be szeretné tölteni az oldalt?","confirmCancel":"Az űrlap tartalma megváltozott, ám a változásokat nem rögzítette. Biztosan be szeretné zárni az űrlapot?","options":"Beállítások","target":"Cél","targetNew":"Új ablak (_blank)","targetTop":"LegfelsÅ‘ ablak (_top)","targetSelf":"Aktuális ablakban (_self)","targetParent":"SzülÅ‘ ablak (_parent)","langDirLTR":"Balról jobbra (LTR)","langDirRTL":"Jobbról balra (RTL)","styles":"Stílus","cssClasses":"Stíluslap osztály","width":"Szélesség","height":"Magasság","align":"Igazítás","alignLeft":"Bal","alignRight":"Jobbra","alignCenter":"Középre","alignTop":"Tetejére","alignMiddle":"Középre","alignBottom":"Aljára","invalidValue":"Érvénytelen érték.","invalidHeight":"A magasság mezÅ‘be csak számokat írhat.","invalidWidth":"A szélesség mezÅ‘be csak számokat írhat.","invalidCssLength":"\"%1\"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes CSS egységgel megjelölve(px, %, in, cm, mm, em, ex, pt vagy pc).","invalidHtmlLength":"\"%1\"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes HTML egységgel megjelölve(px vagy %).","invalidInlineStyle":"Az inline stílusnak megadott értéknek tartalmaznia kell egy vagy több rekordot a \"name : value\" formátumban, pontosvesszÅ‘vel elválasztva.","cssLengthTooltip":"Adjon meg egy számot értéknek pixelekben vagy egy számot érvényes CSS mértékegységben (px, %, in, cm, mm, em, ex, pt, vagy pc).","unavailable":"%1, nem elérhetÅ‘"},"about":{"copy":"Copyright © $1. Minden jog fenntartva.","dlgTitle":"CKEditor névjegy","help":"Itt találsz segítséget: $1","moreInfo":"Licenszelési információkért kérjük látogassa meg weboldalunkat:","title":"CKEditor névjegy","userGuide":"CKEditor Felhasználói útmutató"},"basicstyles":{"bold":"Félkövér","italic":"DÅ‘lt","strike":"Ãthúzott","subscript":"Alsó index","superscript":"FelsÅ‘ index","underline":"Aláhúzott"},"clipboard":{"copy":"Másolás","copyError":"A böngészÅ‘ biztonsági beállításai nem engedélyezik a szerkesztÅ‘nek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).","cut":"Kivágás","cutError":"A böngészÅ‘ biztonsági beállításai nem engedélyezik a szerkesztÅ‘nek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).","paste":"Beillesztés","pasteArea":"Beszúrás mezÅ‘","pasteMsg":"Másolja be az alábbi mezÅ‘be a Ctrl/Cmd+V billentyűk lenyomásával, majd nyomjon Rendben-t.","securityMsg":"A böngészÅ‘ biztonsági beállításai miatt a szerkesztÅ‘ nem képes hozzáférni a vágólap adataihoz. Illeszd be újra ebben az ablakban.","title":"Beillesztés"},"toolbar":{"toolbarCollapse":"Eszköztár összecsukása","toolbarExpand":"Eszköztár szétnyitása","toolbarGroups":{"document":"Dokumentum","clipboard":"Vágólap/Visszavonás","editing":"Szerkesztés","forms":"Űrlapok","basicstyles":"Alapstílusok","paragraph":"Bekezdés","links":"Hivatkozások","insert":"Beszúrás","styles":"Stílusok","colors":"Színek","tools":"Eszközök"},"toolbars":"SzerkesztÅ‘ Eszköztár"},"fakeobjects":{"anchor":"Horgony","flash":"Flash animáció","hiddenfield":"Rejtett mezõ","iframe":"IFrame","unknown":"Ismeretlen objektum"},"link":{"acccessKey":"Billentyűkombináció","advanced":"További opciók","advisoryContentType":"Súgó tartalomtípusa","advisoryTitle":"Súgócimke","anchor":{"toolbar":"Horgony beillesztése/szerkesztése","menu":"Horgony tulajdonságai","title":"Horgony tulajdonságai","name":"Horgony neve","errorName":"Kérem adja meg a horgony nevét","remove":"Horgony eltávolítása"},"anchorId":"Azonosító szerint","anchorName":"Horgony név szerint","charset":"Hivatkozott tartalom kódlapja","cssClasses":"Stíluskészlet","emailAddress":"E-Mail cím","emailBody":"Üzenet","emailSubject":"Üzenet tárgya","id":"Id","info":"Alaptulajdonságok","langCode":"Ãrás iránya","langDir":"Ãrás iránya","langDirLTR":"Balról jobbra","langDirRTL":"Jobbról balra","menu":"Hivatkozás módosítása","name":"Név","noAnchors":"(Nincs horgony a dokumentumban)","noEmail":"Adja meg az E-Mail címet","noUrl":"Adja meg a hivatkozás webcímét","other":"","popupDependent":"SzülÅ‘höz kapcsolt (csak Netscape)","popupFeatures":"Felugró ablak jellemzÅ‘i","popupFullScreen":"Teljes képernyÅ‘ (csak IE)","popupLeft":"Bal pozíció","popupLocationBar":"Címsor","popupMenuBar":"Menü sor","popupResizable":"Ãtméretezés","popupScrollBars":"GördítÅ‘sáv","popupStatusBar":"Ãllapotsor","popupToolbar":"Eszköztár","popupTop":"FelsÅ‘ pozíció","rel":"Kapcsolat típusa","selectAnchor":"Horgony választása","styles":"Stílus","tabIndex":"Tabulátor index","target":"Tartalom megjelenítése","targetFrame":"","targetFrameName":"Keret neve","targetPopup":"","targetPopupName":"Felugró ablak neve","title":"Hivatkozás tulajdonságai","toAnchor":"Horgony az oldalon","toEmail":"E-Mail","toUrl":"URL","toolbar":"Hivatkozás beillesztése/módosítása","type":"Hivatkozás típusa","unlink":"Hivatkozás törlése","upload":"Feltöltés"},"indent":{"indent":"Behúzás növelése","outdent":"Behúzás csökkentése"},"list":{"bulletedlist":"Felsorolás","numberedlist":"Számozás"},"pastetext":{"button":"Beillesztés formázatlan szövegként","title":"Beillesztés formázatlan szövegként"},"undo":{"redo":"Ismétlés","undo":"Visszavonás"},"colorbutton":{"auto":"Automatikus","bgColorTitle":"Háttérszín","colors":{"000":"Fekete","800000":"Bordó","8B4513":"Barna","2F4F4F":"Sötét türkiz","008080":"Türkiz","000080":"Király kék","4B0082":"Indigó kék","696969":"Szürke","B22222":"Tégla vörös","A52A2A":"Vörös","DAA520":"Arany sárga","006400":"Sötét zöld","40E0D0":"Türkiz","0000CD":"Kék","800080":"Lila","808080":"Szürke","F00":"Piros","FF8C00":"Sötét narancs","FFD700":"Arany","008000":"Zöld","0FF":"Türkiz","00F":"Kék","EE82EE":"Rózsaszín","A9A9A9":"Sötét szürke","FFA07A":"Lazac","FFA500":"Narancs","FFFF00":"Citromsárga","00FF00":"Neon zöld","AFEEEE":"Világos türkiz","ADD8E6":"Világos kék","DDA0DD":"Világos lila","D3D3D3":"Világos szürke","FFF0F5":"Lavender Blush","FAEBD7":"Törtfehér","FFFFE0":"Világos sárga","F0FFF0":"Menta","F0FFFF":"Azúr kék","F0F8FF":"Halvány kék","E6E6FA":"Lavender","FFF":"Fehér"},"more":"További színek...","panelTitle":"Színek","textColorTitle":"Betűszín"},"font":{"fontSize":{"label":"Méret","voiceLabel":"Betűméret","panelTitle":"Méret"},"label":"Betűtípus","panelTitle":"Betűtípus","voiceLabel":"Betűtípus"},"image":{"alertUrl":"Töltse ki a kép webcímét","alt":"Buborék szöveg","border":"Keret","btnUpload":"Küldés a szerverre","button2Img":"A kiválasztott képgombból sima képet szeretne csinálni?","hSpace":"Vízsz. táv","img2Button":"A kiválasztott képbÅ‘l képgombot szeretne csinálni?","infoTab":"Alaptulajdonságok","linkTab":"Hivatkozás","lockRatio":"Arány megtartása","menu":"Kép tulajdonságai","resetSize":"Eredeti méret","title":"Kép tulajdonságai","titleButton":"Képgomb tulajdonságai","upload":"Feltöltés","urlMissing":"Hiányzik a kép URL-je","vSpace":"Függ. táv","validateBorder":"A keret méretének egész számot kell beírni!","validateHSpace":"Vízszintes távolságnak egész számot kell beírni!","validateVSpace":"FüggÅ‘leges távolságnak egész számot kell beírni!"},"scayt":{"about":"SCAYT névjegy","aboutTab":"Névjegy","addWord":"Szó hozzáadása","allCaps":"Nagybetűs szavak kihagyása","dic_create":"Létrehozás","dic_delete":"Törlés","dic_field_name":"Szótár neve","dic_info":"Kezdetben a felhasználói szótár böngészÅ‘ sütiben tárolódik. Azonban a sütik maximális mérete korlátozott. Amikora a szótár akkora lesz, hogy már sütiben nem lehet tárolni, akkor a szótárat tárolhatja a szerveren is. Ehhez egy nevet kell megadni a szótárhoz. Amennyiben már van szerveren tárolt szótára, adja meg a nevét és kattintson a visszaállítás gombra.","dic_rename":"Ãtnevezés","dic_restore":"Visszaállítás","dictionariesTab":"Szótár","disable":"SCAYT letiltása","emptyDic":"A szótár nevét meg kell adni.","enable":"SCAYT engedélyezése","ignore":"Kihagy","ignoreAll":"Összes kihagyása","ignoreDomainNames":"Domain nevek kihagyása","langs":"Nyelvek","languagesTab":"Nyelvek","mixedCase":"Kis és nagybetűt is tartalmazó szavak kihagyása","mixedWithDigits":"Számokat tartalmazó szavak kihagyása","moreSuggestions":"További javaslatok","opera_title":"Az Opera nem támogatja","options":"Beállítások","optionsTab":"Beállítások","title":"Helyesírás ellenÅ‘rzés gépelés közben","toggle":"SCAYT kapcsolása","noSuggestions":"No suggestion"},"format":{"label":"Formátum","panelTitle":"Formátum","tag_address":"Címsor","tag_div":"Bekezdés (DIV)","tag_h1":"Fejléc 1","tag_h2":"Fejléc 2","tag_h3":"Fejléc 3","tag_h4":"Fejléc 4","tag_h5":"Fejléc 5","tag_h6":"Fejléc 6","tag_p":"Normál","tag_pre":"Formázott"},"justify":{"block":"Sorkizárt","center":"Középre","left":"Balra","right":"Jobbra"},"wsc":{"btnIgnore":"Kihagyja","btnIgnoreAll":"Mindet kihagyja","btnReplace":"Csere","btnReplaceAll":"Összes cseréje","btnUndo":"Visszavonás","changeTo":"Módosítás","errorLoading":"Hiba a szolgáltatás host betöltése közben: %s.","ieSpellDownload":"A helyesírás-ellenÅ‘rzÅ‘ nincs telepítve. Szeretné letölteni most?","manyChanges":"Helyesírás-ellenÅ‘rzés kész: %1 szó cserélve","noChanges":"Helyesírás-ellenÅ‘rzés kész: Nincs változtatott szó","noMispell":"Helyesírás-ellenÅ‘rzés kész: Nem találtam hibát","noSuggestions":"Nincs javaslat","notAvailable":"Sajnálom, de a szolgáltatás jelenleg nem elérhetÅ‘.","notInDic":"Nincs a szótárban","oneChange":"Helyesírás-ellenÅ‘rzés kész: Egy szó cserélve","progress":"Helyesírás-ellenÅ‘rzés folyamatban...","title":"Helyesírás ellenörzÅ‘","toolbar":"Helyesírás-ellenÅ‘rzés"},"colordialog":{"clear":"Ürítés","highlight":"Nagyítás","options":"Szín opciók","selected":"Kiválasztott","title":"Válasszon színt"},"contextmenu":{"options":"Helyi menü opciók"},"blockquote":{"toolbar":"Idézet blokk"},"table":{"border":"Szegélyméret","caption":"Felirat","cell":{"menu":"Cella","insertBefore":"Beszúrás balra","insertAfter":"Beszúrás jobbra","deleteCell":"Cellák törlése","merge":"Cellák egyesítése","mergeRight":"Cellák egyesítése jobbra","mergeDown":"Cellák egyesítése lefelé","splitHorizontal":"Cellák szétválasztása vízszintesen","splitVertical":"Cellák szétválasztása függÅ‘legesen","title":"Cella tulajdonságai","cellType":"Cella típusa","rowSpan":"FüggÅ‘leges egyesítés","colSpan":"Vízszintes egyesítés","wordWrap":"Hosszú sorok törése","hAlign":"Vízszintes igazítás","vAlign":"FüggÅ‘leges igazítás","alignBaseline":"Alapvonalra","bgColor":"Háttér színe","borderColor":"Keret színe","data":"Adat","header":"Fejléc","yes":"Igen","no":"Nem","invalidWidth":"A szélesség mezÅ‘be csak számokat írhat.","invalidHeight":"A magasság mezÅ‘be csak számokat írhat.","invalidRowSpan":"A függÅ‘leges egyesítés mezÅ‘be csak számokat írhat.","invalidColSpan":"A vízszintes egyesítés mezÅ‘be csak számokat írhat.","chooseColor":"Válasszon"},"cellPad":"Cella belsÅ‘ margó","cellSpace":"Cella térköz","column":{"menu":"Oszlop","insertBefore":"Beszúrás balra","insertAfter":"Beszúrás jobbra","deleteColumn":"Oszlopok törlése"},"columns":"Oszlopok","deleteTable":"Táblázat törlése","headers":"Fejlécek","headersBoth":"MindkettÅ‘","headersColumn":"ElsÅ‘ oszlop","headersNone":"Nincsenek","headersRow":"ElsÅ‘ sor","invalidBorder":"A szegélyméret mezÅ‘be csak számokat írhat.","invalidCellPadding":"A cella belsÅ‘ margó mezÅ‘be csak számokat írhat.","invalidCellSpacing":"A cella térköz mezÅ‘be csak számokat írhat.","invalidCols":"Az oszlopok számának nagyobbnak kell lenni mint 0.","invalidHeight":"A magasság mezÅ‘be csak számokat írhat.","invalidRows":"A sorok számának nagyobbnak kell lenni mint 0.","invalidWidth":"A szélesség mezÅ‘be csak számokat írhat.","menu":"Táblázat tulajdonságai","row":{"menu":"Sor","insertBefore":"Beszúrás fölé","insertAfter":"Beszúrás alá","deleteRow":"Sorok törlése"},"rows":"Sorok","summary":"Leírás","title":"Táblázat tulajdonságai","toolbar":"Táblázat","widthPc":"százalék","widthPx":"képpont","widthUnit":"Szélesség egység"},"div":{"IdInputLabel":"Azonosító","advisoryTitleInputLabel":"Tipp szöveg","cssClassInputLabel":"Stíluslap osztály","edit":"DIV szerkesztése","inlineStyleInputLabel":"Inline stílus","langDirLTRLabel":"Balról jobbra (LTR)","langDirLabel":"Nyelvi irány","langDirRTLLabel":"Jobbról balra (RTL)","languageCodeInputLabel":" Nyelv kódja","remove":"DIV eltávolítása","styleSelectLabel":"Stílus","title":"DIV tároló létrehozása","toolbar":"DIV tároló létrehozása"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/ru.js0000644000000000000000000005060512247657030021023 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['ru']={"editor":"Визуальный текÑтовый редактор","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Ðажмите ALT-0 Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñправки","browseServer":"Выбор на Ñервере","url":"СÑылка","protocol":"Протокол","upload":"Загрузка файла","uploadSubmit":"Загрузить на Ñервер","image":"Изображение","flash":"Flash","form":"Форма","checkbox":"ЧекбокÑ","radio":"Радиокнопка","textField":"ТекÑтовое поле","textarea":"МногоÑтрочное текÑтовое поле","hiddenField":"Скрытое поле","button":"Кнопка","select":"Выпадающий ÑпиÑок","imageButton":"Кнопка-изображение","notSet":"<не указано>","id":"Идентификатор","name":"ИмÑ","langDir":"Ðаправление текÑта","langDirLtr":"Слева направо (LTR)","langDirRtl":"Справа налево (RTL)","langCode":"Код Ñзыка","longDescr":"Длинное опиÑание ÑÑылки","cssClass":"КлаÑÑ CSS","advisoryTitle":"Заголовок","cssStyle":"Стиль","ok":"ОК","cancel":"Отмена","close":"Закрыть","preview":"ПредпроÑмотр","resize":"Перетащите Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð°","generalTab":"ОÑновное","advancedTab":"Дополнительно","validateNumberFailed":"Это значение не ÑвлÑетÑÑ Ñ‡Ð¸Ñлом.","confirmNewPage":"ÐеÑохранённые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ потерÑны! Ð’Ñ‹ дейÑтвительно желаете перейти на другую Ñтраницу?","confirmCancel":"Ðекоторые параметры были изменены. Ð’Ñ‹ уверены, что желаете закрыть без ÑохранениÑ?","options":"Параметры","target":"Цель","targetNew":"Ðовое окно (_blank)","targetTop":"Главное окно (_top)","targetSelf":"Текущее окно (_self)","targetParent":"РодительÑкое окно (_parent)","langDirLTR":"Слева направо (LTR)","langDirRTL":"Справа налево (RTL)","styles":"Стиль","cssClasses":"CSS клаÑÑÑ‹","width":"Ширина","height":"Ð’Ñ‹Ñота","align":"Выравнивание","alignLeft":"По левому краю","alignRight":"По правому краю","alignCenter":"По центру","alignTop":"Поверху","alignMiddle":"ПоÑередине","alignBottom":"Понизу","invalidValue":"ÐедопуÑтимое значение.","invalidHeight":"Ð’Ñ‹Ñота задаетÑÑ Ñ‡Ð¸Ñлом.","invalidWidth":"Ширина задаетÑÑ Ñ‡Ð¸Ñлом.","invalidCssLength":"Значение, указанное в поле \"%1\", должно быть положительным целым чиÑлом. ДопуÑкаетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ðµ единиц меры CSS (px, %, in, cm, mm, em, ex, pt или pc).","invalidHtmlLength":"Значение, указанное в поле \"%1\", должно быть положительным целым чиÑлом. ДопуÑкаетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ðµ единиц меры HTML (px или %).","invalidInlineStyle":"Значение, указанное Ð´Ð»Ñ ÑÑ‚Ð¸Ð»Ñ Ñлемента, должно ÑоÑтоÑть из одной или неÑкольких пар данных в формате \"параметр : значение\", разделённых точкой Ñ Ð·Ð°Ð¿Ñтой.","cssLengthTooltip":"Введите значение в пикÑелÑÑ…, либо чиÑло Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ единицей меры CSS (px, %, in, cm, mm, em, ex, pt или pc).","unavailable":"%1, недоÑтупно"},"about":{"copy":"Copyright © $1. Ð’Ñе права защищены.","dlgTitle":"О CKEditor","help":"$1 Ñодержит подробную Ñправку по иÑпользованию.","moreInfo":"Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ о лицензии, пожалуйÑта, перейдите на наш Ñайт:","title":"О CKEditor","userGuide":"РуководÑтво Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ CKEditor"},"basicstyles":{"bold":"Полужирный","italic":"КурÑив","strike":"Зачеркнутый","subscript":"ПодÑтрочный индекÑ","superscript":"ÐадÑтрочный индекÑ","underline":"Подчеркнутый"},"clipboard":{"copy":"Копировать","copyError":"ÐаÑтройки безопаÑноÑти вашего браузера не разрешают редактору выполнÑть операции по копированию текÑта. ПожалуйÑта, иÑпользуйте Ð´Ð»Ñ Ñтого клавиатуру (Ctrl/Cmd+C).","cut":"Вырезать","cutError":"ÐаÑтройки безопаÑноÑти вашего браузера не разрешают редактору выполнÑть операции по вырезке текÑта. ПожалуйÑта, иÑпользуйте Ð´Ð»Ñ Ñтого клавиатуру (Ctrl/Cmd+X).","paste":"Ð’Ñтавить","pasteArea":"Зона Ð´Ð»Ñ Ð²Ñтавки","pasteMsg":"ПожалуйÑта, вÑтавьте текÑÑ‚ в зону ниже, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ñƒ (Ctrl/Cmd+V) и нажмите кнопку \"OK\".","securityMsg":"ÐаÑтройки безопаÑноÑти вашего браузера не разрешают редактору напрÑмую обращатьÑÑ Ðº буферу обмена. Ð’Ñ‹ должны вÑтавить текÑÑ‚ Ñнова в Ñто окно.","title":"Ð’Ñтавить"},"toolbar":{"toolbarCollapse":"Свернуть панель инÑтрументов","toolbarExpand":"Развернуть панель инÑтрументов","toolbarGroups":{"document":"Документ","clipboard":"Буфер обмена / Отмена дейÑтвий","editing":"Корректировка","forms":"Формы","basicstyles":"ПроÑтые Ñтили","paragraph":"Ðбзац","links":"СÑылки","insert":"Ð’Ñтавка","styles":"Стили","colors":"Цвета","tools":"ИнÑтрументы"},"toolbars":"Панели инÑтрументов редактора"},"fakeobjects":{"anchor":"Якорь","flash":"Flash анимациÑ","hiddenfield":"Скрытое поле","iframe":"iFrame","unknown":"ÐеизвеÑтный объект"},"link":{"acccessKey":"Клавиша доÑтупа","advanced":"Дополнительно","advisoryContentType":"Тип Ñодержимого","advisoryTitle":"Заголовок","anchor":{"toolbar":"Ð’Ñтавить / редактировать Ñкорь","menu":"Изменить Ñкорь","title":"СвойÑтва ÑкорÑ","name":"Ð˜Ð¼Ñ ÑкорÑ","errorName":"ПожалуйÑта, введите Ð¸Ð¼Ñ ÑкорÑ","remove":"Удалить Ñкорь"},"anchorId":"По идентификатору","anchorName":"По имени","charset":"Кодировка реÑурÑа","cssClasses":"КлаÑÑÑ‹ CSS","emailAddress":"Email адреÑ","emailBody":"ТекÑÑ‚ ÑообщениÑ","emailSubject":"Тема ÑообщениÑ","id":"Идентификатор","info":"Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑÑылке","langCode":"Код Ñзыка","langDir":"Ðаправление текÑта","langDirLTR":"Слева направо (LTR)","langDirRTL":"Справа налево (RTL)","menu":"Редактировать ÑÑылку","name":"ИмÑ","noAnchors":"(Ð’ документе нет ни одного ÑкорÑ)","noEmail":"ПожалуйÑта, введите email адреÑ","noUrl":"ПожалуйÑта, введите ÑÑылку","other":"<другой>","popupDependent":"ЗавиÑимое (Netscape)","popupFeatures":"Параметры вÑплывающего окна","popupFullScreen":"ПолноÑкранное (IE)","popupLeft":"ОтÑтуп Ñлева","popupLocationBar":"Панель адреÑа","popupMenuBar":"Панель меню","popupResizable":"ИзменÑемый размер","popupScrollBars":"ПолоÑÑ‹ прокрутки","popupStatusBar":"Строка ÑоÑтоÑниÑ","popupToolbar":"Панель инÑтрументов","popupTop":"ОтÑтуп Ñверху","rel":"Отношение","selectAnchor":"Выберите Ñкорь","styles":"Стиль","tabIndex":"ПоÑледовательноÑть перехода","target":"Цель","targetFrame":"<фрейм>","targetFrameName":"Ð˜Ð¼Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ фрейма","targetPopup":"<вÑплывающее окно>","targetPopupName":"Ð˜Ð¼Ñ Ð²Ñплывающего окна","title":"СÑылка","toAnchor":"СÑылка на Ñкорь в текÑте","toEmail":"Email","toUrl":"СÑылка","toolbar":"Ð’Ñтавить/Редактировать ÑÑылку","type":"Тип ÑÑылки","unlink":"Убрать ÑÑылку","upload":"Загрузка"},"indent":{"indent":"Увеличить отÑтуп","outdent":"Уменьшить отÑтуп"},"list":{"bulletedlist":"Ð’Ñтавить / удалить маркированный ÑпиÑок","numberedlist":"Ð’Ñтавить / удалить нумерованный ÑпиÑок"},"pastetext":{"button":"Ð’Ñтавить только текÑÑ‚","title":"Ð’Ñтавить только текÑÑ‚"},"undo":{"redo":"Повторить","undo":"Отменить"},"colorbutton":{"auto":"ÐвтоматичеÑки","bgColorTitle":"Цвет фона","colors":{"000":"Чёрный","800000":"Бордовый","8B4513":"Кожано-коричневый","2F4F4F":"Темный Ñиневато-Ñерый","008080":"Сине-зелёный","000080":"Тёмно-Ñиний","4B0082":"Индиго","696969":"Тёмно-Ñерый","B22222":"Кирпичный","A52A2A":"Коричневый","DAA520":"ЗолотиÑто-берёзовый","006400":"Темно-зелёный","40E0D0":"Бирюзовый","0000CD":"Умеренно Ñиний","800080":"Пурпурный","808080":"Серый","F00":"КраÑный","FF8C00":"Темно-оранжевый","FFD700":"ЗолотиÑтый","008000":"Зелёный","0FF":"ВаÑильковый","00F":"Синий","EE82EE":"Фиолетовый","A9A9A9":"ТуÑкло-Ñерый","FFA07A":"Светло-лоÑоÑевый","FFA500":"Оранжевый","FFFF00":"Жёлтый","00FF00":"Лайма","AFEEEE":"Бледно-Ñиний","ADD8E6":"Свелто-голубой","DDA0DD":"Сливовый","D3D3D3":"Светло-Ñерый","FFF0F5":"Розово-лавандовый","FAEBD7":"Ðнтичный белый","FFFFE0":"Светло-жёлтый","F0FFF0":"МедвÑной роÑÑ‹","F0FFFF":"Лазурный","F0F8FF":"Бледно-голубой","E6E6FA":"Лавандовый","FFF":"Белый"},"more":"Ещё цвета...","panelTitle":"Цвета","textColorTitle":"Цвет текÑта"},"font":{"fontSize":{"label":"Размер","voiceLabel":"Размер шрифта","panelTitle":"Размер шрифта"},"label":"Шрифт","panelTitle":"Шрифт","voiceLabel":"Шрифт"},"image":{"alertUrl":"ПожалуйÑта, введите ÑÑылку на изображение","alt":"Ðльтернативный текÑÑ‚","border":"Граница","btnUpload":"Загрузить на Ñервер","button2Img":"Ð’Ñ‹ желаете преобразовать Ñто изображение-кнопку в обычное изображение?","hSpace":"Гориз. отÑтуп","img2Button":"Ð’Ñ‹ желаете преобразовать Ñто обычное изображение в изображение-кнопку?","infoTab":"Данные об изображении","linkTab":"СÑылка","lockRatio":"СохранÑть пропорции","menu":"СвойÑтва изображениÑ","resetSize":"Вернуть обычные размеры","title":"СвойÑтва изображениÑ","titleButton":"СвойÑтва изображениÑ-кнопки","upload":"Загрузить","urlMissing":"Ðе указана ÑÑылка на изображение.","vSpace":"Вертик. отÑтуп","validateBorder":"Размер границ должен быть задан чиÑлом.","validateHSpace":"Горизонтальный отÑтуп должен быть задан чиÑлом.","validateVSpace":"Вертикальный отÑтуп должен быть задан чиÑлом."},"scayt":{"about":"О SCAYT","aboutTab":"О SCAYT","addWord":"Добавить Ñлово","allCaps":"Игнорировать Ñлова из заглавных букв","dic_create":"Создать","dic_delete":"Удалить","dic_field_name":"Ðазвание ÑловарÑ","dic_info":"Изначально, пользовательÑкий Ñловарь хранитÑÑ Ð² cookie, которые ограничены в размере. Когда Ñловарь Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð²Ñ‹Ñ€Ð°Ñтает до размеров, что его невозможно хранить в cookie, он переноÑитÑÑ Ð½Ð° хранение на наш Ñервер. Чтобы Ñохранить ваш Ñловарь на нашем Ñервере, вам Ñледует указать название вашего ÑловарÑ. ЕÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ был Ñловарь, который вы ÑохранÑли на нашем Ñервере, то укажите здеÑÑŒ его название и нажмите кнопку ВоÑÑтановить.","dic_rename":"Переименовать","dic_restore":"ВоÑÑтановить","dictionariesTab":"Словари","disable":"Отключить SCAYT","emptyDic":"Ð’Ñ‹ должны указать название ÑловарÑ.","enable":"Включить SCAYT","ignore":"ПропуÑтить","ignoreAll":"ПропуÑтить вÑÑ‘","ignoreDomainNames":"Игнорировать доменные имена","langs":"Языки","languagesTab":"Языки","mixedCase":"Игнорировать Ñлова из букв в разном региÑтре","mixedWithDigits":"Игнорировать Ñлова, Ñодержащие цифры","moreSuggestions":"Ещё варианты","opera_title":"Ðе поддерживаетÑÑ Opera","options":"ÐаÑтройки","optionsTab":"Параметры","title":"Проверка орфографии по мере ввода (SCAYT)","toggle":"Переключить SCAYT","noSuggestions":"Ðет вариантов"},"format":{"label":"Форматирование","panelTitle":"Форматирование","tag_address":"ÐдреÑ","tag_div":"Обычное (div)","tag_h1":"Заголовок 1","tag_h2":"Заголовок 2","tag_h3":"Заголовок 3","tag_h4":"Заголовок 4","tag_h5":"Заголовок 5","tag_h6":"Заголовок 6","tag_p":"Обычное","tag_pre":"Моноширинное"},"justify":{"block":"По ширине","center":"По центру","left":"По левому краю","right":"По правому краю"},"wsc":{"btnIgnore":"ПропуÑтить","btnIgnoreAll":"ПропуÑтить вÑÑ‘","btnReplace":"Заменить","btnReplaceAll":"Заменить вÑÑ‘","btnUndo":"Отменить","changeTo":"Изменить на","errorLoading":"Произошла ошибка при подключении к Ñерверу проверки орфографии: %s.","ieSpellDownload":"Модуль проверки орфографии не уÑтановлен. Хотите Ñкачать его?","manyChanges":"Проверка орфографии завершена. Изменено Ñлов: %1","noChanges":"Проверка орфографии завершена. Ðе изменено ни одного Ñлова","noMispell":"Проверка орфографии завершена. Ошибок не найдено","noSuggestions":"- Варианты отÑутÑтвуют -","notAvailable":"Извините, но в данный момент ÑÐµÑ€Ð²Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупен.","notInDic":"ОтÑутÑтвует в Ñловаре","oneChange":"Проверка орфографии завершена. Изменено одно Ñлово","progress":"ÐžÑ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÑетÑÑ...","title":"Проверка орфографии","toolbar":"Проверить орфографию"},"colordialog":{"clear":"ОчиÑтить","highlight":"Под курÑором","options":"ÐаÑтройки цвета","selected":"Выбранный цвет","title":"Выберите цвет"},"contextmenu":{"options":"Параметры контекÑтного меню"},"blockquote":{"toolbar":"Цитата"},"table":{"border":"Размер границ","caption":"Заголовок","cell":{"menu":"Ячейка","insertBefore":"Ð’Ñтавить Ñчейку Ñлева","insertAfter":"Ð’Ñтавить Ñчейку Ñправа","deleteCell":"Удалить Ñчейки","merge":"Объединить Ñчейки","mergeRight":"Объединить Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹","mergeDown":"Объединить Ñ Ð½Ð¸Ð¶Ð½ÐµÐ¹","splitHorizontal":"Разделить Ñчейку по горизонтали","splitVertical":"Разделить Ñчейку по вертикали","title":"СвойÑтва Ñчейки","cellType":"Тип Ñчейки","rowSpan":"ОбъединÑет Ñтрок","colSpan":"ОбъединÑет колонок","wordWrap":"ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð¿Ð¾ Ñловам","hAlign":"Горизонтальное выравнивание","vAlign":"Вертикальное выравнивание","alignBaseline":"По базовой линии","bgColor":"Цвет фона","borderColor":"Цвет границ","data":"Данные","header":"Заголовок","yes":"Да","no":"Ðет","invalidWidth":"Ширина Ñчейки должна быть чиÑлом.","invalidHeight":"Ð’Ñ‹Ñота Ñчейки должна быть чиÑлом.","invalidRowSpan":"КоличеÑтво объединÑемых Ñтрок должно быть задано чиÑлом.","invalidColSpan":"КоличеÑтво объединÑемых колонок должно быть задано чиÑлом.","chooseColor":"Выберите"},"cellPad":"Внутренний отÑтуп Ñчеек","cellSpace":"Внешний отÑтуп Ñчеек","column":{"menu":"Колонка","insertBefore":"Ð’Ñтавить колонку Ñлева","insertAfter":"Ð’Ñтавить колонку Ñправа","deleteColumn":"Удалить колонки"},"columns":"Колонки","deleteTable":"Удалить таблицу","headers":"Заголовки","headersBoth":"Сверху и Ñлева","headersColumn":"Ð›ÐµÐ²Ð°Ñ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ°","headersNone":"Без заголовков","headersRow":"ВерхнÑÑ Ñтрока","invalidBorder":"Размер границ должен быть чиÑлом.","invalidCellPadding":"Внутренний отÑтуп Ñчеек (cellpadding) должен быть чиÑлом.","invalidCellSpacing":"Внешний отÑтуп Ñчеек (cellspacing) должен быть чиÑлом.","invalidCols":"КоличеÑтво Ñтолбцов должно быть больше 0.","invalidHeight":"Ð’Ñ‹Ñота таблицы должна быть чиÑлом.","invalidRows":"КоличеÑтво Ñтрок должно быть больше 0.","invalidWidth":"Ширина таблицы должна быть чиÑлом.","menu":"СвойÑтва таблицы","row":{"menu":"Строка","insertBefore":"Ð’Ñтавить Ñтроку Ñверху","insertAfter":"Ð’Ñтавить Ñтроку Ñнизу","deleteRow":"Удалить Ñтроки"},"rows":"Строки","summary":"Итоги","title":"СвойÑтва таблицы","toolbar":"Таблица","widthPc":"процентов","widthPx":"пикÑелей","widthUnit":"единица измерениÑ"},"div":{"IdInputLabel":"Идентификатор","advisoryTitleInputLabel":"Заголовок","cssClassInputLabel":"КлаÑÑÑ‹ CSS","edit":"Редактировать контейнер","inlineStyleInputLabel":"Стиль Ñлемента","langDirLTRLabel":"Слева направо (LTR)","langDirLabel":"Ðаправление текÑта","langDirRTLLabel":"Справа налево (RTL)","languageCodeInputLabel":"Код Ñзыка","remove":"Удалить контейнер","styleSelectLabel":"Стиль","title":"Создать Div-контейнер","toolbar":"Создать Div-контейнер"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/lang/cs.js0000644000000000000000000003365412247657030021007 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.lang['cs']={"editor":"Textový editor","editorPanel":"Panel textového editoru","common":{"editorHelp":"StisknÄ›te ALT 0 pro nápovÄ›du","browseServer":"Vybrat na serveru","url":"URL","protocol":"Protokol","upload":"Odeslat","uploadSubmit":"Odeslat na server","image":"Obrázek","flash":"Flash","form":"Formulář","checkbox":"ZaÅ¡krtávací políÄko","radio":"PÅ™epínaÄ","textField":"Textové pole","textarea":"Textová oblast","hiddenField":"Skryté pole","button":"TlaÄítko","select":"Seznam","imageButton":"Obrázkové tlaÄítko","notSet":"","id":"Id","name":"Jméno","langDir":"SmÄ›r jazyka","langDirLtr":"Zleva doprava (LTR)","langDirRtl":"Zprava doleva (RTL)","langCode":"Kód jazyka","longDescr":"Dlouhý popis URL","cssClass":"Třída stylu","advisoryTitle":"Pomocný titulek","cssStyle":"Styl","ok":"OK","cancel":"ZruÅ¡it","close":"Zavřít","preview":"Náhled","resize":"Uchopit pro zmÄ›nu velikosti","generalTab":"Obecné","advancedTab":"Rozšířené","validateNumberFailed":"Zadaná hodnota není Äíselná.","confirmNewPage":"Jakékoliv neuložené zmÄ›ny obsahu budou ztraceny. SkuteÄnÄ› chcete otevřít novou stránku?","confirmCancel":"NÄ›která z nastavení byla zmÄ›nÄ›na. SkuteÄnÄ› chcete zavřít dialogové okno?","options":"Nastavení","target":"Cíl","targetNew":"Nové okno (_blank)","targetTop":"Okno nejvyšší úrovnÄ› (_top)","targetSelf":"Stejné okno (_self)","targetParent":"RodiÄovské okno (_parent)","langDirLTR":"Zleva doprava (LTR)","langDirRTL":"Zprava doleva (RTL)","styles":"Styly","cssClasses":"Třídy stylů","width":"Šířka","height":"Výška","align":"Zarovnání","alignLeft":"Vlevo","alignRight":"Vpravo","alignCenter":"Na stÅ™ed","alignTop":"Nahoru","alignMiddle":"Na stÅ™ed","alignBottom":"Dolů","invalidValue":"Neplatná hodnota.","invalidHeight":"Zadaná výška musí být Äíslo.","invalidWidth":"Šířka musí být Äíslo.","invalidCssLength":"Hodnota urÄená pro pole \"%1\" musí být kladné Äíslo bez nebo s platnou jednotkou míry CSS (px, %, in, cm, mm, em, ex, pt, nebo pc).","invalidHtmlLength":"Hodnota urÄená pro pole \"%1\" musí být kladné Äíslo bez nebo s platnou jednotkou míry HTML (px nebo %).","invalidInlineStyle":"Hodnota urÄená pro řádkový styl se musí skládat z jedné nebo více n-tic ve formátu \"název : hodnota\", oddÄ›lené stÅ™edníky","cssLengthTooltip":"Zadejte Äíslo jako hodnotu v pixelech nebo Äíslo s platnou jednotkou CSS (px, %, v cm, mm, em, ex, pt, nebo pc).","unavailable":"%1, nedostupné"},"about":{"copy":"Copyright © $1. All rights reserved.","dlgTitle":"O aplikaci CKEditor","help":"ProhlédnÄ›te si $1 pro nápovÄ›du.","moreInfo":"Pro informace o lincenci navÅ¡tivte naÅ¡i webovou stránku:","title":"O aplikaci CKEditor","userGuide":"Uživatelská příruÄka CKEditor"},"basicstyles":{"bold":"TuÄné","italic":"Kurzíva","strike":"PÅ™eÅ¡krtnuté","subscript":"Dolní index","superscript":"Horní index","underline":"Podtržené"},"clipboard":{"copy":"Kopírovat","copyError":"BezpeÄnostní nastavení vaÅ¡eho prohlížeÄe nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+C).","cut":"Vyjmout","cutError":"BezpeÄnostní nastavení vaÅ¡eho prohlížeÄe nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjmÄ›te zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+X).","paste":"Vložit","pasteArea":"Oblast vkládání","pasteMsg":"Do následujícího pole vložte požadovaný obsah pomocí klávesnice (Ctrl/Cmd+V) a stisknÄ›te OK.","securityMsg":"Z důvodů nastavení bezpeÄnosti vaÅ¡eho prohlížeÄe nemůže editor pÅ™istupovat přímo do schránky. Obsah schránky prosím vložte znovu do tohoto okna.","title":"Vložit"},"toolbar":{"toolbarCollapse":"Skrýt panel nástrojů","toolbarExpand":"Zobrazit panel nástrojů","toolbarGroups":{"document":"Dokument","clipboard":"Schránka/ZpÄ›t","editing":"Úpravy","forms":"Formuláře","basicstyles":"Základní styly","paragraph":"Odstavec","links":"Odkazy","insert":"Vložit","styles":"Styly","colors":"Barvy","tools":"Nástroje"},"toolbars":"Panely nástrojů editoru"},"fakeobjects":{"anchor":"Záložka","flash":"Flash animace","hiddenfield":"Skryté pole","iframe":"IFrame","unknown":"Neznámý objekt"},"link":{"acccessKey":"Přístupový klíÄ","advanced":"Rozšířené","advisoryContentType":"Pomocný typ obsahu","advisoryTitle":"Pomocný titulek","anchor":{"toolbar":"Záložka","menu":"Vlastnosti záložky","title":"Vlastnosti záložky","name":"Název záložky","errorName":"Zadejte prosím název záložky","remove":"Odstranit záložku"},"anchorId":"Podle Id objektu","anchorName":"Podle jména kotvy","charset":"PÅ™iÅ™azená znaková sada","cssClasses":"Třída stylu","emailAddress":"E-mailová adresa","emailBody":"TÄ›lo zprávy","emailSubject":"PÅ™edmÄ›t zprávy","id":"Id","info":"Informace o odkazu","langCode":"Kód jazyka","langDir":"SmÄ›r jazyka","langDirLTR":"Zleva doprava (LTR)","langDirRTL":"Zprava doleva (RTL)","menu":"ZmÄ›nit odkaz","name":"Jméno","noAnchors":"(Ve stránce není definována žádná kotva!)","noEmail":"Zadejte prosím e-mailovou adresu","noUrl":"Zadejte prosím URL odkazu","other":"","popupDependent":"Závislost (Netscape)","popupFeatures":"Vlastnosti vyskakovacího okna","popupFullScreen":"Celá obrazovka (IE)","popupLeft":"Levý okraj","popupLocationBar":"Panel umístÄ›ní","popupMenuBar":"Panel nabídky","popupResizable":"Umožňující mÄ›nit velikost","popupScrollBars":"Posuvníky","popupStatusBar":"Stavový řádek","popupToolbar":"Panel nástrojů","popupTop":"Horní okraj","rel":"Vztah","selectAnchor":"Vybrat kotvu","styles":"Styl","tabIndex":"PoÅ™adí prvku","target":"Cíl","targetFrame":"","targetFrameName":"Název cílového rámu","targetPopup":"","targetPopupName":"Název vyskakovacího okna","title":"Odkaz","toAnchor":"Kotva v této stránce","toEmail":"E-mail","toUrl":"URL","toolbar":"Odkaz","type":"Typ odkazu","unlink":"Odstranit odkaz","upload":"Odeslat"},"indent":{"indent":"ZvÄ›tÅ¡it odsazení","outdent":"ZmenÅ¡it odsazení"},"list":{"bulletedlist":"Odrážky","numberedlist":"Číslování"},"pastetext":{"button":"Vložit jako Äistý text","title":"Vložit jako Äistý text"},"undo":{"redo":"Znovu","undo":"ZpÄ›t"},"colorbutton":{"auto":"Automaticky","bgColorTitle":"Barva pozadí","colors":{"000":"ÄŒerná","800000":"KaÅ¡tanová","8B4513":"Sedlová hnÄ›Ä","2F4F4F":"TmavÄ› bledÄ› Å¡edá","008080":"Čírka","000080":"NámoÅ™nická modÅ™","4B0082":"Inkoustová","696969":"TmavÄ› Å¡edá","B22222":"Pálená cihla","A52A2A":"HnÄ›dá","DAA520":"Zlatý prut","006400":"TmavÄ› zelená","40E0D0":"Tyrkisová","0000CD":"StÅ™ednÄ› modrá","800080":"Purpurová","808080":"Å edá","F00":"ÄŒervená","FF8C00":"TmavÄ› oranžová","FFD700":"Zlatá","008000":"Zelená","0FF":"Azurová","00F":"Modrá","EE82EE":"Fialová","A9A9A9":"KalnÄ› Å¡edá","FFA07A":"SvÄ›tle lososová","FFA500":"Oranžová","FFFF00":"Žlutá","00FF00":"Limetková","AFEEEE":"BledÄ› tyrkisová","ADD8E6":"SvÄ›tle modrá","DDA0DD":"Å vestková","D3D3D3":"SvÄ›tle Å¡edá","FFF0F5":"LevandulovÄ› rumÄ›nná","FAEBD7":"Antická bílá","FFFFE0":"SvÄ›tle žlutá","F0FFF0":"Medová rosa","F0FFFF":"Azurová","F0F8FF":"AlenÄina modrá","E6E6FA":"Levandulová","FFF":"Bílá"},"more":"Více barev...","panelTitle":"Barvy","textColorTitle":"Barva textu"},"font":{"fontSize":{"label":"Velikost","voiceLabel":"Velikost písma","panelTitle":"Velikost"},"label":"Písmo","panelTitle":"Písmo","voiceLabel":"Písmo"},"image":{"alertUrl":"Zadejte prosím URL obrázku","alt":"Alternativní text","border":"Okraje","btnUpload":"Odeslat na server","button2Img":"SkuteÄnÄ› chcete pÅ™evést zvolené obrázkové tlaÄítko na obyÄejný obrázek?","hSpace":"Horizontální mezera","img2Button":"SkuteÄnÄ› chcete pÅ™evést zvolený obrázek na obrázkové tlaÄítko?","infoTab":"Informace o obrázku","linkTab":"Odkaz","lockRatio":"Zámek","menu":"Vlastnosti obrázku","resetSize":"Původní velikost","title":"Vlastnosti obrázku","titleButton":"Vlastností obrázkového tlaÄítka","upload":"Odeslat","urlMissing":"Zadané URL zdroje obrázku nebylo nalezeno.","vSpace":"Vertikální mezera","validateBorder":"Okraj musí být nastaven v celých Äíslech.","validateHSpace":"Horizontální mezera musí být nastavena v celých Äíslech.","validateVSpace":"Vertikální mezera musí být nastavena v celých Äíslech."},"scayt":{"about":"O aplikaci SCAYT","aboutTab":"O aplikaci","addWord":"PÅ™idat slovo","allCaps":"Ignorovat slova tvoÅ™ená velkými písmeny","dic_create":"VytvoÅ™it","dic_delete":"Smazat","dic_field_name":"Název slovníku","dic_info":"ZpoÄátku se uživatelský slovník ukládá do cookies ve vaÅ¡em prohlížeÄi. OvÅ¡em cookies mají omezenou velikost, takže když slovník dosáhne velikosti, kdy se již do cookies nevejde, může být uložen na naÅ¡em serveru. Chcete-li uložit váš osobní slovník na naÅ¡em serveru, je tÅ™eba slovník nejdříve pojmenovat. Máte-li již slovník pojmenován a uložen, zadejte jeho název a klepnÄ›te na tlaÄítko Obnovit.","dic_rename":"PÅ™ejmenovat","dic_restore":"Obnovit","dictionariesTab":"Slovníky","disable":"Vypnout SCAYT","emptyDic":"Název slovníku nesmí být prázdný.","enable":"Zapnout SCAYT","ignore":"PÅ™eskoÄit","ignoreAll":"PÅ™eskoÄit vÅ¡e","ignoreDomainNames":"Ignorovat doménová jména","langs":"Jazyky","languagesTab":"Jazyky","mixedCase":"Ignorovat slova obsahující různou velikost písma","mixedWithDigits":"Ignorovat slova obsahující Äísla","moreSuggestions":"Více návrhů","opera_title":"Toto Opera nepodporuje","options":"Nastavení","optionsTab":"Nastavení","title":"Kontrola pravopisu bÄ›hem psaní (SCAYT)","toggle":"VypínaÄ SCAYT","noSuggestions":"No suggestion"},"format":{"label":"Formát","panelTitle":"Formát","tag_address":"Adresa","tag_div":"Normální (DIV)","tag_h1":"Nadpis 1","tag_h2":"Nadpis 2","tag_h3":"Nadpis 3","tag_h4":"Nadpis 4","tag_h5":"Nadpis 5","tag_h6":"Nadpis 6","tag_p":"Normální","tag_pre":"Naformátováno"},"justify":{"block":"Zarovnat do bloku","center":"Zarovnat na stÅ™ed","left":"Zarovnat vlevo","right":"Zarovnat vpravo"},"wsc":{"btnIgnore":"PÅ™eskoÄit","btnIgnoreAll":"PÅ™eskakovat vÅ¡e","btnReplace":"ZamÄ›nit","btnReplaceAll":"Zaměňovat vÅ¡e","btnUndo":"ZpÄ›t","changeTo":"ZmÄ›nit na","errorLoading":"Chyba nahrávání služby aplikace z: %s.","ieSpellDownload":"Kontrola pravopisu není nainstalována. Chcete ji nyní stáhnout?","manyChanges":"Kontrola pravopisu dokonÄena: %1 slov zmÄ›nÄ›no","noChanges":"Kontrola pravopisu dokonÄena: Beze zmÄ›n","noMispell":"Kontrola pravopisu dokonÄena: Žádné pravopisné chyby nenalezeny","noSuggestions":"- žádné návrhy -","notAvailable":"Omlouváme se, ale služba nyní není dostupná.","notInDic":"Není ve slovníku","oneChange":"Kontrola pravopisu dokonÄena: Jedno slovo zmÄ›nÄ›no","progress":"Probíhá kontrola pravopisu...","title":"Kontrola pravopisu","toolbar":"Zkontrolovat pravopis"},"colordialog":{"clear":"VyÄistit","highlight":"Zvýraznit","options":"Nastavení barvy","selected":"Vybráno","title":"VýbÄ›r barvy"},"contextmenu":{"options":"Nastavení kontextové nabídky"},"blockquote":{"toolbar":"Citace"},"table":{"border":"OhraniÄení","caption":"Popis","cell":{"menu":"Buňka","insertBefore":"Vložit buňku pÅ™ed","insertAfter":"Vložit buňku za","deleteCell":"Smazat buňky","merge":"SlouÄit buňky","mergeRight":"SlouÄit doprava","mergeDown":"SlouÄit dolů","splitHorizontal":"RozdÄ›lit buňky vodorovnÄ›","splitVertical":"RozdÄ›lit buňky svisle","title":"Vlastnosti buňky","cellType":"Typ buňky","rowSpan":"Spojit řádky","colSpan":"Spojit sloupce","wordWrap":"Zalamování","hAlign":"Vodorovné zarovnání","vAlign":"Svislé zarovnání","alignBaseline":"Na úÄaří","bgColor":"Barva pozadí","borderColor":"Barva okraje","data":"Data","header":"HlaviÄka","yes":"Ano","no":"Ne","invalidWidth":"Šířka buňky musí být Äíslo.","invalidHeight":"Zadaná výška buňky musí být Äíslená.","invalidRowSpan":"Zadaný poÄet slouÄených řádků musí být celé Äíslo.","invalidColSpan":"Zadaný poÄet slouÄených sloupců musí být celé Äíslo.","chooseColor":"VýbÄ›r"},"cellPad":"Odsazení obsahu v buňce","cellSpace":"Vzdálenost bunÄ›k","column":{"menu":"Sloupec","insertBefore":"Vložit sloupec pÅ™ed","insertAfter":"Vložit sloupec za","deleteColumn":"Smazat sloupec"},"columns":"Sloupce","deleteTable":"Smazat tabulku","headers":"Záhlaví","headersBoth":"Obojí","headersColumn":"První sloupec","headersNone":"Žádné","headersRow":"První řádek","invalidBorder":"Zdaná velikost okraje musí být Äíselná.","invalidCellPadding":"Zadané odsazení obsahu v buňce musí být Äíselné.","invalidCellSpacing":"Zadaná vzdálenost bunÄ›k musí být Äíselná.","invalidCols":"PoÄet sloupců musí být Äíslo vÄ›tší než 0.","invalidHeight":"Zadaná výška tabulky musí být Äíselná.","invalidRows":"PoÄet řádků musí být Äíslo vÄ›tší než 0.","invalidWidth":"Šířka tabulky musí být Äíslo.","menu":"Vlastnosti tabulky","row":{"menu":"Řádek","insertBefore":"Vložit řádek pÅ™ed","insertAfter":"Vložit řádek za","deleteRow":"Smazat řádky"},"rows":"Řádky","summary":"Souhrn","title":"Vlastnosti tabulky","toolbar":"Tabulka","widthPc":"procent","widthPx":"bodů","widthUnit":"jednotka šířky"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"NápovÄ›dní titulek","cssClassInputLabel":"Třídy stylů","edit":"ZmÄ›nit Div","inlineStyleInputLabel":"VnitÅ™ní styly","langDirLTRLabel":"Zleva doprava (LTR)","langDirLabel":"SmÄ›r jazyka","langDirRTLLabel":"Zprava doleva (RTL)","languageCodeInputLabel":" Kód jazyka","remove":"Odstranit Div","styleSelectLabel":"Styly","title":"VytvoÅ™it Div kontejner","toolbar":"VytvoÅ™it Div kontejner"}};SOGo-2.1.1b/UI/WebServerResources/ckeditor/contents.css0000644000000000000000000000305512247657030021462 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ body { /* Font */ font-family: sans-serif, Arial, Verdana, "Trebuchet MS"; font-size: 12px; /* Text color */ color: #333; /* Remove the background color to make it transparent */ background-color: #fff; margin: 20px; } .cke_editable { font-size: 13px; line-height: 1.6em; } blockquote { font-style: italic; font-family: Georgia, Times, "Times New Roman", serif; padding: 2px 0; border-style: solid; border-color: #ccc; border-width: 0; } .cke_contents_ltr blockquote { padding-left: 20px; padding-right: 8px; border-left-width: 5px; } .cke_contents_rtl blockquote { padding-left: 8px; padding-right: 20px; border-right-width: 5px; } a { color: #0782C1; } ol,ul,dl { /* IE7: reset rtl list margin. (#7334) */ *margin-right: 0px; /* preserved spaces for list items with text direction other than the list. (#6249,#8049)*/ padding: 0 40px; } h1,h2,h3,h4,h5,h6 { font-weight: normal; line-height: 1.2em; } hr { border: 0px; border-top: 1px solid #ccc; } img.right { border: 1px solid #ccc; float: right; margin-left: 15px; padding: 5px; } img.left { border: 1px solid #ccc; float: left; margin-right: 15px; padding: 5px; } pre { white-space: pre-wrap; /* CSS 2.1 */ word-wrap: break-word; /* IE7 */ } .marker { background-color: Yellow; } span[lang] { font-style: italic; } SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/0000755000000000000000000000000012247657030020571 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/about/0000755000000000000000000000000012247657030021703 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/about/dialogs/0000755000000000000000000000000012247657030023325 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/about/dialogs/about.js0000644000000000000000000000274712247657030025007 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ CKEDITOR.dialog.add("about",function(a){var a=a.lang.about,b=CKEDITOR.plugins.get("about").path+"dialogs/"+(CKEDITOR.env.hidpi?"hidpi/":"")+"logo_ckeditor.png";return{title:CKEDITOR.env.ie?a.dlgTitle:a.title,minWidth:390,minHeight:230,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[{type:"html",html:'
    "}]}],buttons:[CKEDITOR.dialog.cancelButton]}});SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/about/dialogs/hidpi/0000755000000000000000000000000012247657030024422 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png0000644000000000000000000003203312247657030027755 0ustar rootroot‰PNG  IHDRFtù›âsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDATxœíyœeµ¿ŸêmöÉ6“°„„h á²È ¢¢¸¡Þ 4èÅ]qAd»TPÁø£hq÷*„MP†°%d%¬³$™}¦§»ÞßUÕ]]]UÝ=Ó3=Cêù|:]õÖ^“ùÎ9ï9ïy%!£ÃÇ…Ýó¶Õ ᫤ÎBš§ ±P¨)ÄT!-ï­íl}cÑ¢rߪ‡‡‡ ÉÆÒ²ô•!1/%I視V…ƒU!P¨B ¨˜ÖUJŠäe-Ñ9Érß»‡‡‡†'Œ#dÉk»¨ôù§ ‘:5%¤˜깪“¨ ¢°¬«B¬WUŽ[uò¬®r?‡‡Ê} øðšöjIˆÅ)•Wù¤ËU¡Ö¦hˆ( @ ­û¨¦u‡ IüZ‚¥ÞŸ)òãYŒð™5í¾!¤9q® תB,4,B³ :­§ÛÉ^7Ä1ãfKs_?eÖ¦2?®‡Ç>g1ÚpéæÍ¨CuSUUŠª¨ÿ%$é"Ì–‹P [‰–õŒHê$䬢( «RRï>R®çöððÐð,F+6ì®HÂáBHˆ«TÁÔ\ËÎ4ë/«ÿPdÓ¼n×ïh^Oµ'ÍL•ùuxxìÓì³ãµÛº¥äzPÅYBpµŠt,dÜ]a¶îD®µgŽ2gõëØ¯Qis¿c¦D"q°¾L¯ÅÃÃ}H¯|*¦wOIq¼*ñi!ħ„A6Ðø8¹ÌYbHNÅ$¬Öu;ÚFh%é|àGåyKðw¥¿¸µ+ˆð-B|P®Qû»CÒ.²»;œY™ mŸÛÈúÏΙ/n(ë«óðاyO ã»wKƒƒ•û¥Tõt!¸Rœf+L¸G +ÒM0­‰ÚvBk'¼ö¢™Ûˆ vãé‡ô–ñUzxìÓLhWúF€ý5IDX|BˆŠËT!*Ó®ªMßž&L76#LÙmfÚE³Ë\¨ íèF›ÖÍÇè÷y4ðüX¿O 'Œ·ìî÷§†¤¹BK…Ê5*bnZ\Ì‚aÂ,B6ý‡aÊ$j›¶g ­qKß$¡Å>'Khm…Wú8ž0zx”qïJ߸*ƒÂÇ)ªJLb©[ßžkÒµkß^a.´{¢v±©;ŽûôõW$kÛN^0¾8ïQÆ¥ÅøÃ½CUBH‹UU\TW¨‚zUu^gg:D”í¬»b]h;—ÙÅôq×ÜÍ…¶KïQÕ¡„°s¬ß½‡‡Ç8Æ»öUIø.¨×¡r„ж.§½0å¡ÜüA':«ÿаÉv× Qõ#ñþ†jfUùÙ?à€ ?ýªàå®Aš;XÙ9À€êìB›­OËóœ üvÌåw¥¶w¨*‰ônts9]߸Ðvã– u™¿8k24T;>ßë݃\½¦•Î!Õþ^Mî»åyžÜyÖ¡çŒÅÏÀÃÃ#_9/~wçPMRò½­ÂVk/Ûõµ±ô q¡…³ m-vr™ƒ’ġՖL­â”IÔ|é{©õI®Ïxd]÷>ƒÉ¿å:æg´}ž³÷ü­qcÑ{xìK”Íb\ÖMH©×U!æ•h±ºF’¨mguë3‚~Âu!Ž««àˆÚ !)#€)·mÞÓýL úXÚPÍÞ!•mIv$’T \WÁ'ö¯Kÿåùçž~®|c—ÍýÛäH÷‚txÛÙ‡®ÛŸŒ‡‡GÙ,U¤¾ª 1ßl¥Yûö4p˜ØCÈVs`ÃjUVZXX"\"\â€ßñÞý\?g »‡R4wòÀ¶®,aÝЛàéŽ>Öô&¸qÞ4|À©SªXXäÍž„cúa½¦ŸYKO=<Ƙ²XŒ?éÁ'¥RݪÕy-;‡¾>×þCG‹0»mjÐÇQ5AŽ© qDM ·X[“¤Ìù©Ò÷[Õ=È5oµ¹öCÞ8oΨàñ¶^>·ºµ ôý§ònGçüY⣣ýñðð0S‹Ñ—RSɈ¢µ0˲sˆÚæ&a[ûír×}æWY\àèš3+œ­ÂUðJw‚æ®AVt ЖH¡ Áquüï¡Ó€£ë*XPbuO"7"®[€nëJ ã95L¯ð³c é˜zd<·ÎAS'½U »KÿSðððp¢,˜B­ÆÕ…ζs\LìDÈ^XëýGT…X\àðê`ÚÚ³£5‘â¥îAš»YÕ=Ä P3nº~»y¼½óôHô'ö«å[:rî߸—u½ þÔÚǦגP‰”Èu÷-Ïh -úŽž-õÏÀÃÃÙ²£„èU‘²-;k/Ó§hIÔ&!%[X%àJ?GT8¢:È,«PÖö ±²;ÁK]ƒl6,9‘}Nkßä[{ÓÂxæÔj~ÜËŽÁd–˜vßo®m祽¬ïKÐ>”ÊíS4]ËÀ´t1ž0zxŒ)eéc¼«35S¨ê»ù¢²neóz¥$±¨:ÀáU« Pãbö¤¯ö&XÙ ¥gî¤( o27"þÓ…UWÀãí}|k};ÉBŸÇ¦ßÔX70-&ÔP¨rÏé³Çþåá±Rž¨ô»ð«9bÇÑ!.ô$ŸÄiõDk'Û)Zz´t'XÛ7D“%h‰f;õUf¬Wíó«=ia<·¡ ܸ±ƒ.“Ð Sƒ~­ @¢¥³Ÿ=IaФ»¹Ðé•opè`[‰Þ¾‡‡GÊ–ÇøƒÝ‰ß«‚§ƒ„àÂ)•œPÄo£‡Ikú‡XÕ;Ä+= Z©´Ø´Æ¢±]‚e‹¦s´.Ž ÿ­žC)fV˜Y hÊTܵy7wnÚMŠlËÔø)äü44ýÌîsçÿ²”ïßÃÃÙ² ã»ï‚¿ÇåüÔ´JÂÕÁ¬óu¥¯öñjßoö ÑŸ9é<…¤÷Ø'‘[ESÛ§Â'qûüNš\YԳ߾i7wnêÈJï1°X‹ÆzÓî%óOÆköððeÆÛwN*íc6 ä&‡8­.”>ÏöDŠ';¼Ø3ÈZd_e–µZ`£EhýH|aödΞVMƒMRxJúR‚OJ»û=)•žßLÛ –dà ŠøSjEÛù %üxxx8P¶‘/ý]¡ÚÁ½*L¶öãYG»¢X-Á©&QÜ8äG;úÒi5v•xìú&U»6K§ãüÑæh5*·mÚÍ-;˜[âȺC*Û’l¢-‘"% kBü.| uµ~ݯž{6ïN?K¾?O)? ×J÷ðððp¢lE$n˜ ª`™Sµl;aš[éÇè±ëI îÙÕGÂØn É­%˜c²ø„åÚ'O®äš™õ|°¡† É”#)Ì÷bÉ£Ô××õ&xtG7·õ²ª;“.¼Ù3Ȳwö¦ŸÿœÆ÷~EKƒÀ÷¡¾~ÊZ]G’Ô?âg'TVËn^EÆÀ];¤/%Ò.³Õ’³ÎÉb›DN¶Ø;­šïΙ‡§×pݬIüá¨ýùÔþuFÄQhkDf¯?ÕÖ“¾ÿÈäJ&l^¿(êßWK/¿\šïáááJY…q(åÃÍÚ³ZvU¦»Ý2Ê&Gw8׺K·¥×EN]Å¿ÄU3ë¹sAS‚>g¡5îÕtmëuZmÆ]ƒI’Ä 5´E½mÆäÖšÉ#yß…QVa¼aFh@ VÔ·'íCjúØI)w‰µo2½žß…Àä ö::“*Ë;úÒ׊Lªä—GÎàȺ½Ðš®ëVcQðT{fVÔ³j²_ˆMG£¹Iø|ÇóU{xxAY…@âg4[„Z“aœôåöMRDŲ® A¥5®òI|oÓ®ZÓFk"À´ Ÿe‡Mç¤I•y…6wš‚ŒEûD[FÏl¨!—îèBgÿY‚Wîáᑇ² £|OÙUÔ¶‹2·™,ÆÙÈçB» -×]À;š›òIÔû%VurÅêVvèîo…Oâ®Ã9kZµ«Ðî}–K­?Ós»ûHèÃ\B~Ž©×r ]\hsëÅõÿ·®ì?3÷:eÿ%KŠä;š¾9ŒÉ"|g0ERW‹:¿ÄìÊ€ÉjËv¡ó ­È¸·Æµ6ö ¥ï+\_‚mI._ÝÊV]4ƒ’Ä ùÐŒZw¡Å¨Ú÷$U^ØÓŸ¾ÎÙ 5y]h>)À̼n(»0Þº_­*¿1G”sSw4¡Pkû3⵸:h&{—9'‚l4Ñ×7™Î}Æ”ª´¨îHr黨¬o÷IpÓ¡ ?©"§¯R¹÷o\ÛàIS?£9mGCØŠ¢©íìa¼f"(»0êüÂìêæÖ]ÌÎk}ÉôA‹k¹}yX„)k=cÉ™­=ã:¯ug–D'W”¤´¸µ&’\òú.6èV¥Ü0¯_úŸ;x û…ü¶A « mæ S²÷95àB§×%8¢à—ëááQ4ãBoXB¨ËìÆ1Ûõ®êÍô]rì›ÌU&@’kÙe»îÏ™„ñ´)Uø$k”YðÀ¶.Öë–kµ_â†C r¡Í+ËMîôÓª³Ê“åcQG ñáÂß®‡‡G±Œ aÔ̱äLî¯Y˜VõdÜé#k‚ø$sÁˆl—Ù-·qeç ½)--hRÀÇGfÔ™¬Ní:Cªà†õíé{8·±†Ó¦V§-SãþÓOfó´M{úÓש ø8qJUöÛ°9ØX”à*éÙÍE½]Â7Â(©ÒšÜJ6¹Ö°®?IŸnŽUù$V]h×$ì¬~G]ô„ྭ]éûúü¬ÉL úsú&Wìà»2“÷ݼ ‘ ¹è„ÓƒêÏ’PÏšFלÓXëú~DöòÔI‰þi…¾[â7ÂøýÙu !ñ¢­ méL Á«=&wº6dIïÉ·lMæÎi3ó‹í]¬ëÓ¬Òº€/Íž’±:ÉÔs¼yCÝúhœÙUA®5ösq¡Íë¹ýŒ–cÕTÕwR!ïÕcßBQâAE‰ÏqÙ^í´Í#CÙê1Ú‘J‰eÀ N.´aª^éMpR½V›ñØÚØöMëÂQhíj,ªBpËÆÝüüÈý€Ψå‘ݬÜÛŸÕ‡Ø6˜âöÜ´ €ÏÏžÊ#ÛºÒùŽv3Ošú­ 1§:È&#ÉÜI\3ëÿü_qoxì G¢‹€ÿ¦êŸz  èvíÀKÀʖ榔˹nö75õµ47]=Œ{:¸°vìþ½¥¹é·Š‹Š=· B–c¯–àv@=GÖUPá“øŸÃ¦ó‰–m¹ÆžMÃŽÁ$¯u ²¸^˾9§±–Ÿ™"Þ¶‡e¸¨öï«}=ç/Rw)áHt špŸìWÄ¡áHô9`YKsÓã6Û/˜÷ŠÆp$zð0˲é)àϦõ€WŠ9·ŠŸ+˱M¥8W&áî.NNR”x·,Ç~6÷Tv}ôÑО={1·%“É­>_u ô]uÕU­FûO~òp}EEïãÆ•J[… 锨mN¹éJ©¬7T9¶6”åg»Çù…Ö®¦âoï¡Kw•Ô„ø¯ës D$UÁ×ÞjM ØY 5œ?ÝÒ_(¬—Y{²=ãN§ó]ÔмÉ/]¦±&‰JáHô¢p$ú2ð8ðIŠEÐ~±?À(î G¢À“äŠâ¿€¶47 ŽÆuSGé¼£(ñ€¹Øñyö÷)J|þèÞÕØÐÙÙ9E’ü×I’™$ù-Iþëüþʹ@êW@ðQó¾ƒwH’ŸÆûfÖ ñP¶%—›Ûh¬¯4T9¶®Â1-§¡M‹éZCI~¸9cÁ]7{ Ó+Y"+€•{xhkgz¿[4Reš¾ÐN6sÚÎ)S«©öù,{ZÌ Jâœ|ït,G¢Ó€Ç€Gp NÙ“—âG¢“€åd[œÍÀҖ榾ܣÒôŒàSvd9¶ ¸è~|Çi_E‰Ÿ¼H‘ÖøxåòË/ß%˱«@zX.˱«®¼ò²W…@‚½÷Þ{ïB€‡z¨F’˜ìW®4‚‡…—f,¹lkÏlý½Üàâéš•udmO¢?¥fÄÐÖevÚœ”¿ÞÖÅE3j9¢®‚¿oÏÆgßÜ™m™ ÁMëÛY:£–iA?Uùò!Ó¸i}»­õgnz¹³ŸŽDŠi!?>‰Ó¦UóXk›Ñh:‘¸V‚eí;J„#рߒk…toéŸ5ú÷: Íj9˜ œ®Ó›s–‘Ýc5Zì1–M«€s[š›ºsÊ¢M–cŸ(å=•YŽ=¯(ñ%ÀJYŽÙþ·Q”øQÀ h½TÏåý•I’Äýà¿øúÀ@âã’$Bº~Ü £ð‰•"EÆ’³/}}SÿC*Ó‚>B’Äâš +:s"È‹Ðn¶µ-ûÁ·×·óûcÄ'Á3jyx{5Ïuôf íž¡7­kç®ÃgpõÁSøÍ¶.Öõš'öËMã1Š×~ü€z–4Öð÷Ö\ƒ)ÇzÔBß‹ª[]Åy‹ús‘èñÀ?€*›Íoßiinrê}É´ü=(r!ðF ï1ü8Ųi5pNKsӞܣ޻Èrì_yv©Â&pó^eÛ¶mÛÿ™7<úè£ß”$.öù|¦RâúqåJÌÜ2¥Sì0‹[:hbYW•Ý™n¡ãŒ±ÍV+“Ðb?ÿ‹Yx¾I#P³ªk€ßìÈä6Þ² €OJ ­Á/·uòÒÞ@«éø¿‡M7=™½]'€'ÚÍi;¹ùŒn¡é(—Í£F8‰¬°Š¢ |8¼¥¹é×.¢˜CKsÓú–æ¦Û[š›þ^¢{ôK,›6gµ47µ•â:—n¸!)I<½gOçuª*½sÙe—uÃ8Êc4¸át@ð“Ü)Tí§>mîÊc¤®ÂÖe¶u¡„6Ë]'“ëø?;Ø3¤e’Ì­ñÙYS « ÈÜÓ—×ìB¯1ÁiÓªùðþuYûØñt[_ú˜*Qç^#"ûºÒE®;áH4ü•ìÔÐÜæ¥-ÍM·#ˆ£A8•€{ëûÙœÙÒÜ´cìïÊc<"Iâ~ŸOú†$¥î3ÚÆ0¨ðWÃeÎW ╞ ](¦‡üœU¼ÖêR›D{¡µuPh®ò­:Ò÷ø…9S™Y̹÷7º¹ïŒwvó‚Fj’­(m{‡R4ïÍxÃf«ÑÁ…6s¥ôĘO7}p´¥MŸqH³)?@»O3ÛÑDñ2ÜG™ò=øî5Ö…ð] pùå—¯I¥¤ dYn$ñ‰q×Ç ú“kE23+ŸcE` %x­;Áqz.`¤¾’}CYÖ^Æú³‡}¹õZª€_mëâÔsì¤Jªü·.hä3«¶g‹—€[7tð¡ýê˜Q`¿Šß˜×ÀõoµbÙ-kay['é㥗4ÖðÃM`ÔV«ÁF`LÜÂp$Z|ËfÓÍ-ÍM¶is‘èw€/XšÛÐÜçe¸¥¢Q”x-‚¾˜¼«Þ’娰ƒSŠŸÌÞ‘åX¾ SÉP”øàý³x X'Ë1Ç„þ<ç«D{Ž^YŽí°l«> ,æÍ²ûñÕW_²Ó¼ßW\Úb,_yåe/Ë—_~ùŠq)ŒÍmúÔ[íÿH§fH° ˜^ìL ㉓*øÕÎî¬@5‚lŸº“Ý7éTcñkkZY~Â,üœ7½–³k² Ït'U¾µ¶ e±æiʳ&óËm¬î¶¤É™”oyk/߯ 9~r“ƒþ´ëžÞÝb-k’ààÃy×Ãà2È™^apÛ]ß•p$úyàFKóàì–æ¦5e¸¥‚Q”øYh‰ñ‹Ñ~©C6»õ(Jüà>YŽ­(òü p¹¾z°Boß-%~Ó!ŸU”ø%6§å˜kŽª¢ÄkÐÒ}ÎŽ$÷ÿ À€¢ÄW¯÷ú<Š?ZWhïÒÛƒÀ—ô6sÿ½ɸt¥Røî-¤Æ¢*àÅÎôq‡×„¨öI™ã1¹£]rsíú&_íàw÷¦¯wÛÂéTSý‰ŒXý~G7ÿÜ­¥Æ$‰6#êËqÕ=ƒlÐÖý’–(žµO® mÚ(]î¼±ä\hÓvGKsSY"ãf‘è%è¿$&º€%-ÍMc2,o8(JüpE‰ÿ-ùüÓhÂh'е@ xAQâ)J¼¾ˆKåöýhœLFK°7GÿBz›õã:¿¹¢Ä/6·ëçvš§¨-ïõR´çù«¢Ägð9.ÄEûmÅ7e9öÏΙŸFIˆØÏÿ"r,¹í‰[ôɪü?ÉÎ×W™Ç…¶Î2xÛ†vÚõb¹³«‚|aÎÔ,QÔ|eõ.†tA;qJŸè~ƒ6úêäbÎe0.]i€T…o‡H%TAÈζæ6¾Ð9ÀÁ•Ú»ë+y²£Ï¶@„óè—Œ mí›45†ÕÖ™Tùκ6~z„æM|~ÎTÙÞ•)¡³®7Á=›÷pÝœ©Ü8¿‘¿µö°7‘q‘Í·¼µ—ËÒþŸÕPƒ_‚”éºvÇHª.ZâôhrÚ_y3}ÀæQ¾®+áHôlà×d»hÃüþ]ž»Ê¢Ä?üœŒ2€VÜâG²³FõŸ1÷úq‡ õ¡=¦V²»M¨P”ø‰hB ð;YŽ]WÈ9t7öoh"nð&p‰,ÇVÚò{ý¸ð àÛhmZ¡‹ d9¶¼ÀGøÑ——ÿ-˱!—ýó2n-Æß2EI<`¶ÜÜ D¼`r§OœT©Ypi‹ÐÍ…¶Z»b¶† à‘í]éiP+|·[r}oߨ‘v‘B~¾}hƒi¯lžÛÝÇ€ž9%èç¸IUî.´é<’–æÝqänÓöVKsS!q¢Q!‰FÑúWÍ®çpQKsÓÓ幫üèVÑ}d~_Ž–åØ6¢˜…ž¤½ø)Úš(ãV—šŸ’Åð?À±¢˜F–cIYŽÝœ€&¤  ä#Š/¤ºÑñÀõåeÀ5#EÇ „ôkç‰í³-»×»ôè±§},¬ ¥÷q*]f[yÇeÝÊW×´’Ô7¼¯¡† fÔb•»þ”Ê××d"җΜÌ1“¬F—F_Jå_¦âµKsÝi»þIýûÉr(=ÓmÚVúU©Bó‹JŸlinú[yn)?НEFiˆù“Àɲ[[è9d9Ö+˱kÈDßGsSÇE‰”LPàbYŽ}C–cååØ+À±d\ùIhâ˜O£.FóDÅ’ü‘·®4€H©-B²XweÉâ•‚;9sª–ò\Éë݃ö£]°ZkßeÆ…6Ý“éþV÷ ¢¼³—Ï<€[NçéöÞô”ÿ×ÚÃm½œÓXƒO‚,šÁ™+¶Øžwy[g낸dz-7®kËÙÇþe1·êØu50¿¤ãŒ-4Ú´½iÓ6V„È R<ÑÒÜôû_ç`E‰çî YŽ=kÓþ2}p{ˆ›¶ü­"Ñû†yüˆÐ]á›MMËrì·Ã9—,Çõî…— ´ÔžOå9T7–Jaœ[Œ·¦w«‚-®5ÉX€M¦$é“'WæjÒn´pZ« -²]è,ܶ¡ƒƒZàçÀÊ_™k?ãÀW×ìJ»ÉáI•\2Ó>°÷¸)sd]V:ÿí²ÞäO•¢²v7Þ’¥ÏÓóÇ%ºôESÓçd9¶u¸çÓÅà2´QGåà€Qžl+píHN&˱7ÉΓýJ‡ýK–coäºVƵ0þö£ $õn»‹™rƺkÚ;€a«-¬ 15àw“ß…6§êØ¢_·GÏY4¸zöԆ̻°¹oˆ;7eFÎÜ0¿†?k€wú‡x«'ã£`œ\hóŠPí 0v¥¹ÊY²­/ËÊáHôª^gûèl¾Ï^›sJ&Ýå9YŽýr¤7'˱-À­#=Ï09Þ´üUYŽÙ=s±ü­ÀáLÇð‹\3‹qíJáû›⎜hqÚÚËXv{’‚7{YBBs§ÿ¤—ðrî«´¦îd»Ñéû°ÞˆÂ ŒIDAT—iù;ºøÏ™“8uª6 ê÷›Á/½›ÙG_¸kÓn>~@=‡T‡˜ôsã‚F®~}'V–·õ²°VKX?wz-÷¿ëòM˜¾$é2é± ×ŠóæV0¤Õ¦­åÿ‡MKsÓ7‘èþh‰Ñfî G¢m%r«wÊrìôœ²‡Ræ«tS ¥gßUðåÕmùÔ“r§M‚ÇMeÇNŸVMÈH w¸¼i½²š¡b«fƒÝ°Ã² £ÎåhUÃÍø€‡Ã‘hY.˜…¤$S'è¼JžnèQÂxž6YŽm+áyÍïÆ:.ßÌ6YŽu¹lã^;z¿¤âI7wØ\ â_&agFE€oÎkÀޝ­i¥O\;©’ã'g[I!øÜ;yio?ß]×–å6_:G%®°½hiø‡M[åíg ¥¹©XŠVkÑL=ðX8;öweËlý[ ,)%Ãâ óϽÔ×6ŸÏm~»î3!„Qê? ­±¨B–;}ê”*[—ÙIX‹u¡ÍM})•o˜ªèȳ¦pd}EÎaÛ’ür[fŽ˜+fMÎIäþÓÎnÎxa ßߘ ظ‹´Ñ&QùØNcbGDKsÓ»h•¹­|t4®W,záÙ%äZ3€'‘èhv3J»þ-Qún»üÑÄ\ý¼Ô×6ŸÏ­øÇ¾k1&*ƒ­úì\h»© žÝ žž6µÚvÄŒ°Ç…¶ò—]Ý<Õ®¥ÜøõœE»:ñ?Û²7}ü…ûÕ¥#Ô.—wX±köæìnvõ¿ŽDsK—–æ¦MÀù䦯<®OŠUNÌѶ’¹øz…œyw,-fkm±¢ÄK9^ßünV¹ì·ï ã?5 UñL€Ä,†¹Qæ{Ôýá¹ÕA¨ ŒÌ…¶E;ŒÖ¯®nM_?2¹*=Ÿ‹yŸ ½ ¶êÓ¿†|sªsS|Ü.âl= \àvŠò´!wfÈ-õU6Zš›Z€{ŸGÖkJ–‹Ór)óNKu.ó$E®s¿Èrl™qòUh¥ÒJ…ùyÜ*#í.á5ÓLaˆGSnDvˆþ”ÊK¦±Ó§M©¶$sg»ÐæPXhÏQ˜lêKð£·3?¯ôÈópÎëz-‡=%¸VzöÙ®V<ºEv¿Í¦/†#ÑÊE‡AKsÓ“h嬬¯ë4à×ú|0åÀ<ŸÍùzQÕRð‘ÇlÖ9î•᯦å’L³¡(ñidª nC% ùµ*š #Œ)U]•vwE¶¸bg.ñ“;}ú´ª¬¾I·9èB[ùÁÆ|·“W»¸wKnâÔ ŸiyÜgýò+®ÍVõLÍ‚7c?÷ózù¯qAKsÓÃÀWm6]ˆVp`Ì‘åØ«dª ‚}‚zQèS¢^:Òóè˜S²¦°¿yÞìoêӝޔŸ¢y!Ï`¸ä°™0Âø|ä ^ÖgÑ=QÛÜÏxâä*BƘkÜ DŒÄ…6oPŸs'§6maMÏ`Α×ΙBµ_{ý‰”í>v¢èêB›–„$g{³% ¥¹i+ð ´‚ fªß‡#Ñ;ôÚe§¥¹éûÀ6›äp$z³MûXp½iùsŠ?}¸'Ò Õ*#¾#½ðƒÌ+Œ²{žL¿sø…¢ÄŠìæEQâÌžÇw‡{®‘0a„Q¨ÜcWcÑZ BEðn’ }ZwI¥OâD=ÙÛÚ§è(Š6ë®ûqž¥Ók¹æà©éõnê ;éRiÊAí® ôTmðý¨¡W¯ù¢Ãæ/o‡#ѯ„#Qûœ%‘è¢p$úõp$zbIn2×Ðê5Zùf8ý\‰¯•YŽýžÌ( x ÀÊÕY(J¼MÒ›’%¹ÁŒ;}Œ^6_'Ó7¹¸s8E‰Ücjú£,ÇÊROsÂ#€@},QÎî/´+ñŒ©„×S«‹.amn¡Á¡5!®=…_s U~­_{ëÀ÷nÉó}Øýœz£ÿ)=¶aT'Noinú1Z¥»úw3ÐJÛ·…#Ñ]áHôÙp$úÓp$ú¹p$zv8=/‰^ŽD¿ŽDŽD7 Uê¹ (iΡ^/òÀ®>ã‘èh1·ãch“[–Ûøº¢Ä ÎAU”øqhúúöÃáYý»­ª¶+z÷€ljºX¡ ]^%îS”ø—Ѫê…JÖRºî¢÷c¥Í¨ø6 Ô´Ëœ¯@Ä3}\¡WÄ>³¡šë×Z\h§ À…6S铸iÕ,i¬åÜÆ²L·új×·l£_u¹Z.´…@ÅP"€½h•Œ–榻‘è‹hõæö˜®N+ð´%wÃ[š›áHôB4KÍ<’B~ŽD;ô€zeë‘°^–cé¤TYŽíÒ§5x­?­øŠÿZ¿èv}kŠŸ \‰f¥¿¿Mhu í¬âá :EQâðgYŽ%ô{êÏþ¿%˱_(J|p“Þtð²¢Äo~nÉÏtž£Ðº:N1mÚ|@–cÖcÆŠ %Œ+N80uÜŠwÿ*„¸À,nNÑê•t%Uê>fV9´&Ä[=ƒEºÐÂ}Ëy¬ °¤±–%Ók8mj5U~{£ü·Û»¸öô¥\lÃa¸ÐfÔ £.Œ-ÍM/„#ÑÅÀuÀ5Ø—'+†|ÕT†EKsSw8=MHÌ£6‚À‘èûæ‡ÙL¹ÿá:Ì ²[¥(ñã¿ J8Gÿô+Jüu´¡q]hb~ ™ „Áo€«d9Ö¯(ñÞbú¾^R”ø*ýš“Ñþè%%¾YßeÚ¹–ãnV”øÛh•É+цdÞ Üª(ñ]hîkhÿ?ŽA«·hMzø°,Çr««Œ!Ê•’¸ß,†¶nµ¾žTÏ™Üé÷M«† í"L|œ0¹ŠïÌo éäÙ¬>}.w>ƒsksDQÍ{ûùô+Ûˆ½º~Q,¼ŸÓ]µ>YߨºÒfZš›ö´47ÝŒ6éÑ?ÑÊuCm¼ó¨Í]ÓÒÜ´8—̃ZàïáHtÁ(\¶‡$eYŽmF›Êô»hhP…&¦W¢Õ$<›lQl>)˱OŽ’eµ­tšA˜§ƒ+²{ÍZü‹eÓ ´¿†VôãX²E±­oúôr‹"L0‹@ñ¼*$SŽÆâS½ú”Ú“»7ï.Ê…¶ÛwRÐÏ™ Õ,i¨å¬Æ¦û™{’*Ïtôò¸^Å{×`¦¼(´Í-æEß§ihéB»ú‰£Š>fùÇÀÑh%p"Ú|ÀTýSƒ&{ôO°XÑÒÜd—dð7²fXÕÊ[š›Ö…#Ñ¥Ø. G¢×V›Ôþ›íÃa£Û<$²v­%~7Z*ÑQ¦9íjxÍ"û£ÍÔÝhý´NŃShýš›°X¯6÷´]Qâg¢‰Ø hCôEù·ÝŽ×‹Í~PQâÇ¢Íc<Ë2š³-q{•þùƒ,Ç -¶›¶èÏb_¤B&[O÷ò†BPoô3IÚFªŽy½Æï£ùäÙÔë•n>úòVþ¡[‘9Âd£LFÓÂÚ –4ÖpNc-'L®Âïb‹mèM°¼­—åm=4íé'¡Šœ±Ð®oº`kQˆ3ß¿èYç»ô˜(J|šëù.ÐZÊòýcE? è娻ùö/'N?¿åûª_2ŠCXRXÖ¯Ÿ;kgk)Y-|à¥wsVk±Â§ÕU\ÒXË95̪r®ËPÏïécyk/ËÛzÙØ—ÈÚ^”(ÚÜKö>ˆ"¬¦R'÷|à×Ùæ<<<ì™ÂxDÓ;'U]a®±˜GSc½1`å)³Ó_ÿ½»‹_Ùž)ç¥ Ñ•Îi¬áœF÷À ÀÎÁ$O´õòD[Ï´÷¥Ï•k…ÙXDÚ*Œ`~ß‘ç.ÈVg‚™ Â¸¹JMÑ—ãB ß"S ÂØç»ó¸úàL"oJå…=ý¬ëI0§:È‚Ú ©v¶ U-]<ÑÚÃò¶^^ëÊÌ/c`kå‘ ­/> |âšÄy‹2u×<<<ŠfB £,ø×æ7…‹T“ ³ÕH¶`|oAczªÓBèLª<Ó®Y…O¶÷Ò>˜I++(z<6.t¸¤[–.´FZ=<<†Á„‹Jƒ¦ ó…¸øiÞⵦÈò·×¶±s0Éus¦2Å!’¼¶'Áò¶žhïåÅ=ý$Endº ÈppF…~X&$ñLÂÏV±dÑÄûëæá1Ž™#À‚¾=7%Ä;:Ó!#2> Žª«ä }¢©Í}ClêK°©/Ak"{°Õ͵,Ú®C~k±È~Åv`™€?‘Z3¸ôˆbó=<<Š` ãœg7û|¨)«ËœÝÇèžÈm•.Ga*±(ÚÛ² Ò£*üBò¥V ˆÐnqÞ<›³xxxŒVynÓ£ª*.J×X´¤îK¬ÐDîƒ"¦õáG¡ßq¾åþÔÐ/̣ͮ|LÈ>FUˆ\”¯Æb6¢è°›ÛfÛMEŠb—P¥{}>õwñZßù‹ú'îŸ(÷ZEÊ÷‚ÔqQcÑöþr[þ&A\àÿw_ª»M¼ÿØÎâáá1ÖLhaôù¥Ž!Uì0µä5]DÑvw{u#’¸[Àß…/µ±ïœ#ƼD»‡‡GñLè>F€ŸÞp‹*ÄõæÑ.î9‚Öì@Ë1ÃëWq?ð›”ÏßÒ¿b~¯¸¡°çððð?Lxa<àé ǪB¬tJÍI¯ÛDÅ{B–¯‹ ‰û² ·Ûe’Ê“øWwŸ7Ïrçá±óžF€©O¬;Q‚<¢¨¿—$TUé…Náó†Üyxx¤yO #hn5ªïƒBâK¤§É àU!q?Bz"˜Jnn=‘7äÎÃÃÖ÷œ0H@ý“k‚ª¥z^˜«zù„…òžFá2!òÿýï×Ë} ãŽSN92ÿNÃBZÑü’ó¤È¥Çø-ŸM»ÏfÙg³¿Ïòñ£yÑ>ӷϦM2}ŒuLmØ|Ûa–-,˪©Í¼nþ¶¶¥LíÆ'e³œ²,›Ûœö1–Ç õ„ãó\ ÇhZŒ†PÈ9óz±«(*˜V¡4‹£0šìÅQX–Ý>NB˜Oü¬¢ç$‚…|’6ÇšÛ<<;±³B§6§ã’xx샌Dó ]Àò±¶ùóSÈþÅ ©±žÏ·ë4c×XˆÚ ^>1Ë÷í$rv‚ç´¹Íoúö›Ú=<ö†+Œn– Ý'ŸPºï&˜Nǹ‰ª›%ëÔ§iî‡{!Ì'tùÄÍM¬Œå€þí7}Ëæ{MZ–í¬à|ýªf$<ëÑcb8ÂèöKåö±Z_ÖmN–š[ÅéãÖ'Y¨€[EÓ8·“âe¦|Ö¦ÐÏovÅ­Ï"LÏ­ZÞ±n}ÇvÛÜ~…|<<ö†#ŒFð@"c1™—ÍV”ù+åðívcÙ®¯ÏÎ’3ÄÍ0·þJ;KÑzù®çÖ78—8ß>n}vî¼[ŠSߨ‡Ç>Ãp]iÂ9EE;ј¾­©#Ó·[@'_DÛMøÜúrÒuìÒ­¿Ñºœ/ÀRl`ÅißBú!ÝÄØ‹R{ìSŒ$ø"ÐÄq{!+´OÏê®*|nÖ^¡"X¨ ºå1æËYÌ—¯è¨)ÖúŽeš¯OÔÃcŸ¤é:ý‹TŒ7Òô›|èi.T ‹Fó²›itEmNîm¡ùŒv9Œ…g’ì(¹}öðÐ)•0š±Zù¬ºöâçf˹B(Y¶; a¾à6ßfœ†æùbµ&íÒκÌç–çû8íëááaa4„ÑŠÓ/ SÀÃNóY‚…¸Ç…Fa±ù¶.;~1¾Ýì­H·ÄðB,Ë|§‡‡Güé^[twv÷IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/about/dialogs/logo_ckeditor.png0000644000000000000000000001514512247657030026665 0ustar rootroot‰PNG  IHDR£:Üé sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<âIDATxœíy”UÕ•ÿ?ûÜ÷î{5QLÊ ˆ2dphŒ&Úiˆ‰C3U9Æ^1ILÄZ¶ió3ѬÄv¨I£éhÐ_'ÑNâÔjP EDA¡&j~ýg÷¯ªx¯êQThº¾kÝu‡wιgßõ}{Ÿ½Ï>÷ŠªòeÀ¼—8¹ŸUìùžÏ7|ËpûXÄõîXwÒ¨=‡»}è>ä‹JFä;ëwiT{šä{VÏò­âYÅ×ÄÞSÅ· 8ΈU3†Wî>÷¡{øB‘ñò;3ëkC“ÔúÅ`™o5ÓßK:tC}ÃkvÔ øÌŠ«]ìûü“UÅ*ø*XMζ¬í¸Ý>yk½VÉ ¼w¨åéCÏ¡×ÉxífB9YM}k¿åY®*=› `+™RÈf;'ß¶oIÙ‚õÍùô‘ñKÞ0Óòó‘‘QáLE¯Œ«Nï8ÞëÄô¦Œ÷m–[™Öã¸êŽmóŽÑÓÂôáСGÈx7d8µÞì˜o/õ¬^ì«Ò÷HK¨ÎH×ß1ŒË 2À1¼Óå½úh‡²­m4EÉ­úÚqu=ð\úpÐ-3- ÷Ôy7‹ÕÛâ6ÕlúÚrœ²ïÜô¶^7(ñ–ãŸȱÁ¶{>WÕÄ +fº]û®+S»ûPúpxÐ-2ÞSëÝè)·%Ȱ'ÃOÞìÞk™¾’br¶Ë”l—~ƒ×}XÅÍ›ªÉ \Sú‡ùö9,Þ{·í騾o¿K¿´8h3]µ^Ô·jº4TÅO2ÓÆ¯d™”dLF#°Ç³¬®‹ò~cŒ¯ ʤÀðõŸS·xª ðè¤#ÈsNycMžMi_UcUóÇ…%ûðeÃAkÆ<Ǭš½Ú©£YN1¡c3NÈ pbfþ-ÚoK³ÇŠŠFVÕEÙØk#ð††ŸÇÒaýøå'5Ør_·q7WŽì×Òvkû ®Š;è…‡qÆØ=øŒúpˆpÐd¬€HN é:ÆefV€©YAŽ p"Vy·)Λõ1ÖÔG©ŠùmÚÍo‰9Z ï6Äx»>ÊwŽÌaåžåµ¬Ï¦Æ8×nØÝaœÙ†˜Î~×Ϧ‡Ýò¦ï¬Š¾à+óÒ™åAኼLr¡Ò³¼Õg]cœ 1"6Ýô^ÇY—ã2‚Üs|¹ÓáÞßí¨Ã³Š²×.«òjõÙcO=h¡úpØÐ-2þ¼2v‘§öÑÖ±`+‰¬U~|d&¹Žá¯{"jŒ%€š:/¤ &ĺÿxúp(Ñ-oÚ¨û’ÕH‡Y”áAÀ€á¿k"ÜÒj½ŸÎIvpZdžVá”Ü &ç„øêÀLJ& alf°Óyé Q>mŽ3?/k¯VLÚ+|£;rõáð [dTP‹–ùªXö:3•q €%‰xɱH›ª!=UŒ@á–jâ E‡pú€Œ}ÌY'Úz¾²‘éýɘd’V@¸ª;rõáð [d°jM̺ìÕ\ŸÇ|}elØé ÕÒiº7ë"ä —­ßŦÆ8wÏã‚!Ù{guÚúÙÊF"Ì”ÕÒMÖŽG|~KnweëáE·É5áuí æ©²¾)Î ™A M–M»˜äÇÍUqŸ©9!*bKÞýœ•5ÍÜ|ì@ò\§^®j"b•³òdL1× Ö÷§wW¶>Zt›Œw¥Q•Ú»ßjŒ“a„1á`[ºX:ÍØjªËë¢LË a­Òä[~úa%‚ðãc¦”o ãD¬òJU_œ…¤™pQõ/é®l}8´è6|µ÷´7½o7ưÀ¤¬`Ûx¯3§ä…ª&Μ…UØñøõÖÎ’Íœ™mcÅäá᳕ä¹'å†[/%²ÂÅÒòõáРGRÈ®ÙQ?ÖÆìíãˆ?ÙÇpͦª}§%ÅïŸ8„c3‚Ì_³Ú¸ÀߦÀ8uåVbVSbŠGexë´Ñܱ¹’;>ªjcjk™¸ Õ4ÿØO»-`ÆŒ97”Ù¿vŒã­46ö^yyyer™É³fÂÊIFÕsõëO¥kgöìÙÍq™Qq|[Y^þÆ«eee9‘ˆÉJW~/š®ºêª†ésQQÑxgq~þÒ› Ͱa#/ÌÏ_òÿ¤ÞFhÆÝÃs>J6Ñ­)doÖÇrÈ :))dû2Õ·m®¢Ðð¯£ú㫳–mÜͱ™.׌Ð!¸½µ9Î 1ÎÊËnëKòØ1€FOÈ7oÞ¼À䳯Ÿ2sö¦œ{Ñõˆ>¼d[1eÆìϧΘUÔZ^,çˆòGEO×Þ´iÓ‚_ŸÑ?‰ò oœß×Û‚Agg›ë†8Ðþ‹8'7¶ž6òjÐ'ŠŠœ™\îî»Ï8жEEEÁââÒ%EE¥—•YZZ: ¸¸ôª!ã ð}å¯6É£¶ª¬©OL‚LÉvÓ/1H óXU67Å)Û^Ç%ÃrŸåâ+¼ZÝÌ;ë¸nô ŽÊ¦Úià™Š¦ä†É :bŽ¢öÊîÊ6mÚɧÔ5F× Ü‰rPú† < | Ud|WÚcMèTΨ7VÏY·úµ·’Š4©rá¾6ÐâîÊ šG€,^Õz­¤¤äŸ³³ëþÔݶ÷‡‚‚‚8صªl=Î÷™SVV6L„ó{l ŒEK|Õs“‰¶5gwÌgz¿ÿUј’ecÓ$àZU~ýI5ç Éâöqyœ·æS|Unù°’ùyÙüûø!|wí’Ã8ÏT6rí193/‹Gw¤&y[ËLùÛæ~í¸èÁÈ4mÚ¬™Ö˜—؃òƒµkV–u,wêQàÙ•6§L?ù~E¿ 4)rÞ›å+Wµ+/(XÚ«¤X´hÑàß“¯©ÊWC±Ÿ{ž^<ß#š@5ðjº²ÕõQNÌ Ú‚×%Þ6x–[?¬djn˜…Ãú°+êñ³Í•œ“—Å9I³.«jš©ó,g·˜ê½¦hˆu4Ñmy{Û Üµ¥ŠGæðË C9óOðný°‚ó†fó‹ CùæšÄ³ßóY[a~^·|Ú'<'8x¦«rÔ×G&`ÄPõ;}€û‹h‰àû-kW­|¸ uÂEE%·¦ÿIÞjunî½÷¡#\WïUåOùùK/l_²   ¸´¸¸ôWÀõ+@IIÉÉ"r“ªæç/ëЯeË–}\XX8wذÏ[Ë÷Ýwß«W^yeòÿûªfj~þâý>Ç5Ó+FÐì«nH&˜¯Êk{š˜Ó?#5…,‰N^Bñ•m¬`R¿‹Gö *îsë‡Ì”É…Gä´•}¦¢‰9!F„ƒB<ÖrÙÈ¡Ž k;§;¯Ûóv´ôeÑŒ3ŽèBWD¥ÛŒ‘SZ ƒþµª˜@ÀtÖX0èüØ|°¨Ê-Àú;wüÛ¾Ê,_¾Üªú‹€\ÇqóÛý¼º `ñڮܫGÉ`UîiŸ·¸3곩)Μþ©¦:Ýût 5pý·Ý þ‡I=Øgø¾5gU£=œ§§M›¶¿ðI]~þÒQé¶eË–´i8&¯,^¼¸¢³Æ-Z‘¿¬-÷yrùòå^gå ¶‰PÞR¾ ªúǮޫÇÉH<úl:/ùåšf¾’"Û‘ãÃöI !ZL83a#Ü6nÈ“¼nÃ.ޏêè¨*oÕFXY“È䡵½óÔ&<}áÈ®Š0öè£?"‰ªt)˜½/¼½æÕ9h™dûä¼yóÂÝiÀZ&ªê»])«J—ʵGiié@UŽèjýD9˜|MDº¼R³ÇÉ8sêÈÓ9%¯nÆÌÑ–JÖ~k7¹Bkp{ksœ»¶TqѰ~̘±z».ÂúúKFö' ‰¼ùolã?wÔ¦_4­æ«]•aÅŠ>°1q&—œp¼ìN+ìkW½öº$Ý>pZmSô±… :ÝiS„ÆÈð®”Uµ]*×ýúõ«šºz`8ÈÎÔKvwWï×ãd\Öª<ÑÞT¿S¡&îsÚ€Œ´t2Zu[²¹þÕ–j¶4Åøñ˜Ám×Þ¨ifX8@žët$ ¦š{ÿêDåö–£QÁÌèT7 Þ\ýúSŠ\ÙÒ¡onÞº½h?U:ïžÊ[Ör2]ÈL‘Ù]h2š™|aÁ‚>ð.è~ë€é´‹éŠHmî ô†™|±¿mï-ÇUy¹º™SfŒÛeÞ´"j•…oîàg›*I"LÌ á©µ{K§˜gö[ÉòÐK]6k×¼öècWM™>ç×ãO9%gõ:úկ«ê­-]Z2eƬîü1Æ–””µ § ¨¨ôà¬.´W 2®…Tm‘GUù碢²yU>òÈá?†Z›>9¤+è2Fueǵ.ðBUý†I9á­™Î<§µ”ÙÔceM3a#ÜqüN˜ÉCŸÖRÕ’nÖÞ‹N>S…àà¡DŽ Øk@ßÑïeÆì†©3çÜ:uƬoO™yê¤)3fŸ>eæ¬ë¦Ì˜ýŸSgÎþ]isÝš× Z´¢Ü4eæ¬ë¤O­((Xò¢÷«ÚŸ•””¥Ÿ-B±*ëöמˆ~¸GytÊô鎟þxMDW\üàééê•^."7w_~ù’ò—&^yYèÊY#ª§½ñiµU&'A¼\Ý„§Ê¼A™¬¬iJ5ÏJZóÜz2"äì!YÌÏËâô™d8†G¶×rÓû»Ro®[÷"z,Ð¥0ÀªU«ª.\8õ£·O…B`„ª.õ[OXIUº<«2fÔˆ«6²ãÐo ò‹)3gW&Å 3KJJê¬~4üÁÕW_V ¹7D"ñþªúÛââ²áiUÿ}U3JDNóOªzc‹±Ï™cÌŸ}_Eü—ŠŠJÙÈ}Ë—/¯/**ºXÄù=Ø‹ŠJW£¯ˆÈ6ßçxcøº§> ~ÚÕg¶Ý©Ü|kïoï-×Ä}Êk#œ“—Å^ê‘vaö€ Çå±ò”Q¼7w4wMʤ~aþðYßXý)W­ßÙf¢÷ež“wbL—Ç/­X±b…ÿæš•¿260^‘Ð_O€—AJT¹QÄÜÙVÉšÊúö¾Ú ô"„?ƒ¾ƒò½IÓçœÐBš ªœ´¯ {õÕ—U\zé¥ùùK¾ òMPQÕ‚yJ„©ªo ,û%Hø¸õþƨ»\×¶½è`É’%õÆpðŽˆ\"ÂuÍÍa›Ï>Û~š*׊p´ªüÜZžá rn~þ²Y´hQ¤µ=± ;€sãûB¯½`þ+¯n›j±åíß>ö­#r¸{ÂnßTÉ]'à·v!Ï5œ18‹ùyÙœ18‹Ü€Á*¬­ðLEOW4ðv]4uDLœjJÛ u±&ÍûGÓDiiéÀ¥K—V÷æ= ÍàÁÇ ¸úêËzôs'½FÆ1›7‡;‘öKŒÀªÙ£È 9Ü·µ†&Oq0wP&“sÃPïY^¨läéŠFž«h "æwH ë0>L£“Ìü'ÀôƳovèà ½úéq¯l)÷,SÛ¯u9&Óå÷“‡q\–ÛVvScŒg+y¦¢×«›‰«v4áI}Ý—VL"bp¿UYÿúøµíg¾€èU2Žyù㥞µ%-³{gZÆf¹d:†mÍ1*cIqrµïÇ< úO(q‰¼VÿµÉN“õ዇^ýô†uô9ßk}Ïw»÷(*|Ð#÷œîˆ*ò±ûßÊ_¢ã?Òø½%Kz½JÆ-Ï?²}øœ‹­Oâ ·°oï¹ãIGó¬S´Ì*Fu­.˜p@K6ûðÅF¯®mØÿl~ijzI²yNN‚è|ìÀ«Öóï×óbÓYãvöýþqÑë_ÈòÔ<`Õ»$Ý,K:"ªê.ÁÜýSM½¿ñ=Ó‡½èuÍ( ŸÛ´Õ“ 9î×´(©èÃ&^U3·ïÛÑÿWqH¾ª*ã ì÷áÍ7¨’ð–µö> ó잿ߦ˱½Þ‰>|áñ…úÞtþo£»cƶ\ºÂÂBY¾|9?þ¸,X°€—^z)%ß.''§CþÝ–-[ºô¶°Ñ£GwøçÔ××·]›;w®>þx"ƒiÁ‚ÚÒ/–/_ž:S؇/$dÅŠ]Ê8Ξ<90°ª*܈1n0c\ß7!ÏõE\cMŠßµ"A"D5UcЀŠ:ŠqkDDTÅ€M"¦QUUcPU±"ê[+¾ˆõñ<¬x q Ž!®Wˆ©j,qU'fMœ«Æ<ljºª1Ïó¢ñxf,##ݲeK—_Ò’pÚ‡^@§šqôèÑ&‰„Ãáp(VQò]7Œç…Œã„€°!#„¬1!ÇJH ‰JH aÁ¸¢ëªJHÔUWT]… ˆ+h•`PuD¤-“HQCë¸|ÀCl\!.*1EcŠÆŒ!¦*QµÑ(˜˜#D}Õ¨1¾ª1Q jT£ÖÚ¨ "®4GÁ‰uÔQÑP(mnnŽnß¾½Ï{?LØ''NœèÔÔÔ„ÂápÈó¼0¡Pص6ì 6,"a?l¬ «ØbÂb4ŒJȪ†El$Œ!Œ £ !$¬B«Bi«&M¬»Š¡ D°DŒHD…(ª„¨(T£ªDD$¢ªA«Ø ÆU5è‹ÄÃñ Ž$ÒçL Œ¨šx<.¾Ÿ-#FŒ ‡û$ã{ï½ç1ÂknvÁ W‡ÄKŒ&öŽ‚uŒ+ªˆˆŠª ‚ ‚ª*jP«¨/¨‡bЉ*¶I” 3(jPDDQõ<uãªÄPâ"UÕ˜¢¨‰b4ŠÚ¨ªDElTÕDÅhT¬D-‘¨UI"·/ÄU5®G5nŒñDê<× wº$³½‡NÍt‹†ˆµŽ›]7äú±PÇõ|'ä8~Èw4d|㪱!À5®Åº‚ºŠ¸¢¸V%•ÄÕ€1PÅAŃ£ŠQÔˆˆ$Ü¢– jĪªQ«">Š'¢¾¢%Žà‰jL!nB IŒQ•¸56j¬u«1ϘhИ¨ÅbYYYÑêêêhEEEŸssÑ%oºaÝ:¯< cÉÌÌ€[WtÑ 8Í®± ¢c\ :ªO5ˆh0kƒ£Uu ÆQÔQpÄ`°bT¬ˆvXífÕ`,‚ªª#¾*VD|±âùb}O¬ñ%@\=ñð[´Ÿ·.qW5&î«ó}777Ç***â=ü,ûÐMü/ãþ¤™IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/tabletools/0000755000000000000000000000000012247657030022741 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/tabletools/dialogs/0000755000000000000000000000000012247657030024363 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/tabletools/dialogs/tableCell.js0000644000000000000000000001410012247657030026604 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ CKEDITOR.dialog.add("cellProperties",function(f){var g=f.lang.table,c=g.cell,d=f.lang.common,h=CKEDITOR.dialog.validate,j=/^(\d+(?:\.\d+)?)(px|%)$/,e={type:"html",html:" "},k="rtl"==f.lang.dir,i=f.plugins.colordialog;return{title:c.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?450:410,minHeight:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?230:220,contents:[{id:"info",label:c.title,accessKey:"I",elements:[{type:"hbox",widths:["40%","5%","40%"],children:[{type:"vbox",padding:0, children:[{type:"hbox",widths:["70%","30%"],children:[{type:"text",id:"width",width:"100px",label:d.width,validate:h.number(c.invalidWidth),onLoad:function(){var a=this.getDialog().getContentElement("info","widthType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:function(a){var b=parseInt(a.getAttribute("width"),10),a=parseInt(a.getStyle("width"),10);!isNaN(b)&&this.setValue(b);!isNaN(a)&&this.setValue(a)}, commit:function(a){var b=parseInt(this.getValue(),10),c=this.getDialog().getValueOf("info","widthType");isNaN(b)?a.removeStyle("width"):a.setStyle("width",b+c);a.removeAttribute("width")},"default":""},{type:"select",id:"widthType",label:f.lang.table.widthUnit,labelStyle:"visibility:hidden","default":"px",items:[[g.widthPx,"px"],[g.widthPc,"%"]],setup:function(a){(a=j.exec(a.getStyle("width")||a.getAttribute("width")))&&this.setValue(a[2])}}]},{type:"hbox",widths:["70%","30%"],children:[{type:"text", id:"height",label:d.height,width:"100px","default":"",validate:h.number(c.invalidHeight),onLoad:function(){var a=this.getDialog().getContentElement("info","htmlHeightType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:function(a){var b=parseInt(a.getAttribute("height"),10),a=parseInt(a.getStyle("height"),10);!isNaN(b)&&this.setValue(b);!isNaN(a)&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(), 10);isNaN(b)?a.removeStyle("height"):a.setStyle("height",CKEDITOR.tools.cssLength(b));a.removeAttribute("height")}},{id:"htmlHeightType",type:"html",html:"
    "+g.widthPx}]},e,{type:"select",id:"wordWrap",label:c.wordWrap,"default":"yes",items:[[c.yes,"yes"],[c.no,"no"]],setup:function(a){var b=a.getAttribute("noWrap");("nowrap"==a.getStyle("white-space")||b)&&this.setValue("no")},commit:function(a){"no"==this.getValue()?a.setStyle("white-space","nowrap"):a.removeStyle("white-space");a.removeAttribute("noWrap")}}, e,{type:"select",id:"hAlign",label:c.hAlign,"default":"",items:[[d.notSet,""],[d.alignLeft,"left"],[d.alignCenter,"center"],[d.alignRight,"right"]],setup:function(a){var b=a.getAttribute("align");this.setValue(a.getStyle("text-align")||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("text-align",b):a.removeStyle("text-align");a.removeAttribute("align")}},{type:"select",id:"vAlign",label:c.vAlign,"default":"",items:[[d.notSet,""],[d.alignTop,"top"],[d.alignMiddle,"middle"],[d.alignBottom, "bottom"],[c.alignBaseline,"baseline"]],setup:function(a){var b=a.getAttribute("vAlign"),a=a.getStyle("vertical-align");switch(a){case "top":case "middle":case "bottom":case "baseline":break;default:a=""}this.setValue(a||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("vertical-align",b):a.removeStyle("vertical-align");a.removeAttribute("vAlign")}}]},e,{type:"vbox",padding:0,children:[{type:"select",id:"cellType",label:c.cellType,"default":"td",items:[[c.data,"td"],[c.header,"th"]], setup:function(a){this.setValue(a.getName())},commit:function(a){a.renameNode(this.getValue())}},e,{type:"text",id:"rowSpan",label:c.rowSpan,"default":"",validate:h.integer(c.invalidRowSpan),setup:function(a){(a=parseInt(a.getAttribute("rowSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("rowSpan",this.getValue()):a.removeAttribute("rowSpan")}},{type:"text",id:"colSpan",label:c.colSpan,"default":"",validate:h.integer(c.invalidColSpan), setup:function(a){(a=parseInt(a.getAttribute("colSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("colSpan",this.getValue()):a.removeAttribute("colSpan")}},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"bgColor",label:c.bgColor,"default":"",setup:function(a){var b=a.getAttribute("bgColor");this.setValue(a.getStyle("background-color")||b)},commit:function(a){this.getValue()?a.setStyle("background-color",this.getValue()): a.removeStyle("background-color");a.removeAttribute("bgColor")}},i?{type:"button",id:"bgColorChoose","class":"colorChooser",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","bgColor").setValue(a);this.focus()},this)}}:e]},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"borderColor",label:c.borderColor,"default":"",setup:function(a){var b= a.getAttribute("borderColor");this.setValue(a.getStyle("border-color")||b)},commit:function(a){this.getValue()?a.setStyle("border-color",this.getValue()):a.removeStyle("border-color");a.removeAttribute("borderColor")}},i?{type:"button",id:"borderColorChoose","class":"colorChooser",label:c.chooseColor,style:(k?"margin-right":"margin-left")+": 10px",onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info", "borderColor").setValue(a);this.focus()},this)}}:e]}]}]}]}],onShow:function(){this.cells=CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells[0])},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d'};a.setIframe=function(b,c){var d=a.framesetHtml(c);return b.getElement().setHtml(d)};a.setCurrentIframe=function(b){a.setIframe(a.dialog._.contents[b].Content,b)};a.setHeightBannerFrame=function(){var b=a.dialog.getContentElement("SpellTab","banner").getElement(), c=a.dialog.getContentElement("GrammTab","banner").getElement(),d=a.dialog.getContentElement("Thesaurus","banner").getElement();b.setStyle("height","90px");c.setStyle("height","90px");d.setStyle("height","90px")};a.setHeightFrame=function(){document.getElementById(a.iframeNumber+"_"+a.dialog._.currentTabId).style.height="240px"};a.sendData=function(b){var c=b._.currentTabId,d=b._.contents[c].Content,f,g;a.setIframe(d,c);b.parts.tabs.removeAllListeners();b.parts.tabs.on("click",function(h){h=h||window.event; h.data.getTarget().is("a")&&c!=b._.currentTabId&&(c=b._.currentTabId,d=b._.contents[c].Content,f=a.iframeNumber+"_"+c,a.div_overlay.setEnable(),d.getElement().getChildCount()?s(a.targetFromFrame[f],a.cmd[c]):(a.setIframe(d,c),g=document.getElementById(f),a.targetFromFrame[f]=g.contentWindow))})};a.buildSelectLang=function(a){var c=new CKEDITOR.dom.element("div"),d=new CKEDITOR.dom.element("select"),a="wscLang"+a;c.addClass("cke_dialog_ui_input_select");c.setAttribute("role","presentation");c.setStyles({height:"auto", position:"absolute",right:"0",top:"-1px",width:"160px","white-space":"normal"});d.setAttribute("id",a);d.addClass("cke_dialog_ui_input_select");d.setStyles({width:"160px"});c.append(d);return c};a.buildOptionLang=function(b,c){var d=document.getElementById("wscLang"+c),f=document.createDocumentFragment(),g,h,e=[];if(0===d.options.length){for(g in b)e.push([g,b[g]]);e.sort();for(var k=0;k
    "},{type:"html",id:"Content",label:"spellContent", html:"",setup:function(b){var b=a.iframeNumber+"_"+b._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"hbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",widths:["50%","50%"],children:[{type:"hbox",id:"leftCol",align:"left",width:"50%",children:[{type:"vbox",id:"rightCol1",widths:["50%","50%"],children:[{type:"text",id:"text",label:a.LocalizationLabel.ChangeTo.text+":",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",width:"140px", "default":"",onShow:function(){a.textNode.SpellTab=this;a.LocalizationLabel.ChangeTo.instance=this},onHide:function(){this.reset()}},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"text",id:"labelSuggestions",label:a.LocalizationLabel.Suggestions.text+":",onShow:function(){a.LocalizationLabel.Suggestions.instance=this;this.getInputElement().hide()}},{type:"html",id:"logo",html:'WebSpellChecker.net', setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"left"})}}]},{type:"select",id:"list_of_suggestions",labelStyle:"font: 12px/25px arial, sans-serif;",size:"6",inputStyle:"width: 140px; height: auto;",items:[["loading..."]],onShow:function(){n=this},onHide:function(){this.clear()},onChange:function(){a.textNode.SpellTab.setValue(this.getValue())}}]}]}]},{type:"hbox",id:"rightCol",align:"right",width:"50%",children:[{type:"vbox",id:"rightCol_col__left", widths:["50%","50%","50%","50%"],children:[{type:"button",id:"ChangeTo",label:a.LocalizationButton.ChangeTo.text,title:"Change to",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeTo.instance=this},onClick:c},{type:"button",id:"ChangeAll",label:a.LocalizationButton.ChangeAll.text,title:"Change All",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeAll.instance=this}, onClick:c},{type:"button",id:"AddWord",label:a.LocalizationButton.AddWord.text,title:"Add word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.AddWord.instance=this},onClick:c},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.FinishChecking.instance=this}, onClick:c}]},{type:"vbox",id:"rightCol_col__right",widths:["50%","50%","50%"],children:[{type:"button",id:"IgnoreWord",label:a.LocalizationButton.IgnoreWord.text,title:"Ignore word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreWord.instance=this},onClick:c},{type:"button",id:"IgnoreAllWords",label:a.LocalizationButton.IgnoreAllWords.text,title:"Ignore all words",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd", this.id);a.LocalizationButton.IgnoreAllWords.instance=this},onClick:c},{type:"button",id:"option",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){a.LocalizationButton.Options.instance=this;"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;", widths:["70%","30%"],onShow:function(){this.getElement().hide()},onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",setup:function(){this.getChild()[0].getElement().$.src=a.logotype;this.getChild()[0].getElement().getParent().setStyles({"text-align":"center"})},children:[{type:"html",id:"logo",html:'WebSpellChecker.net'}]}]},{type:"hbox", id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"Option_button",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}},{type:"button", id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"GrammTab",label:"Grammar",accessKey:"G",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"
    "},{type:"html",id:"Content",label:"GrammarContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}}, {type:"vbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",children:[{type:"hbox",id:"leftCol",widths:["66%","34%"],children:[{type:"vbox",children:[{type:"text",id:"text",label:"Change to:",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",inputStyle:"float: right; width: 200px;","default":"",onShow:function(){a.textNode.GrammTab=this},onHide:function(){this.reset()}},{type:"html",id:"html_text",html:"
    ", onShow:function(){a.textNodeInfo.GrammTab=this}},{type:"html",id:"radio",html:"",onShow:function(){a.grammerSuggest=this}}]},{type:"vbox",children:[{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"IgnoreWord",label:"Ignore word",title:"Ignore word",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)}, onClick:c},{type:"button",id:"IgnoreAllWords",label:"Ignore Problem",title:"Ignore Problem",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 133px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;", widths:["70%","30%"],onShow:function(){this.getElement().hide()},onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'WebSpellChecker.net',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right", width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"Thesaurus",label:"Thesaurus",accessKey:"T",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"
    "},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId, c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: -10px auto; overflow: hidden;",children:[{type:"hbox",widths:["75%","25%"],children:[{type:"vbox",children:[{type:"hbox",widths:["65%","35%"],children:[{type:"text",id:"ChangeTo",label:"Change to:",labelLayout:"horizontal",inputStyle:"width: 160px;",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onShow:function(){a.textNode.Thesaurus=this},onHide:function(){this.reset()}}, {type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 121px; margin-top: 1px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]},{type:"hbox",children:[{type:"select",id:"categories",label:"Categories:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.categories=this},onHide:function(){this.clear()},onChange:function(){a.buildOptionSynonyms(this.getValue())}}, {type:"select",id:"synonyms",label:"Synonyms:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.synonyms=this;a.textNode.Thesaurus.setValue(this.getValue())},onHide:function(){this.clear()},onChange:function(){a.textNode.Thesaurus.setValue(this.getValue())}}]}]},{type:"vbox",width:"120px",style:"margin-top:46px;",children:[{type:"html",id:"logotype",label:"WebSpellChecker.net",html:'WebSpellChecker.net', setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 121px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()},children:[{type:"hbox", id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'WebSpellChecker.net',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking", label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]}]}});CKEDITOR.dialog.add("options",function(){var b=null,c={},d={},f=null,g=null;e.cookie.get("udn");e.cookie.get("osp");var h=function(){g=this.getElement().getAttribute("title-cmd");var a=[];a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp", a);e.cookie.set("udnCmd",g?g:"ignore");"delete"!=g&&(a="",""!==j.getValue()&&(a=j.getValue()),e.cookie.set("udn",a));e.postMessage.send({id:"options_dic_send"})},i=function(){f.getElement().setHtml(a.LocalizationComing.error);f.getElement().show()};return{title:a.LocalizationComing.Options,minWidth:430,minHeight:130,resizable:CKEDITOR.DIALOG_RESIZE_NONE,contents:[{id:"OptionsTab",label:"Options",accessKey:"O",elements:[{type:"hbox",id:"options_error",children:[{type:"html",style:"display: block;text-align: center;white-space: normal!important; font-size: 12px;color:red", html:"
    ",onShow:function(){f=this}}]},{type:"vbox",id:"Options_content",children:[{type:"hbox",id:"Options_manager",widths:["52%","48%"],children:[{type:"fieldset",label:"Spell Checking Options",style:"border: none;margin-top: 13px;padding: 10px 0 10px 10px",onShow:function(){this.getInputElement().$.children[0].innerHTML=a.LocalizationComing.SpellCheckingOptions},children:[{type:"vbox",id:"Options_checkbox",children:[{type:"checkbox",id:"IgnoreAllCapsWords",label:"Ignore All-Caps Words", labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreWordsNumbers",label:"Ignore Words with Numbers",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox", id:"IgnoreMixedCaseWords",label:"Ignore Mixed-Case Words",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreDomainNames",label:"Ignore Domain Names",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]= !this.getValue()?0:1}}]}]},{type:"vbox",id:"Options_DictionaryName",children:[{type:"text",id:"DictionaryName",style:"margin-bottom: 10px",label:"Dictionary Name:",labelLayout:"vertical",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onLoad:function(){j=this;this.setValue(a.userDictionaryName?a.userDictionaryName:(e.cookie.get("udn"),this.getValue()))},onShow:function(){j=this;this.setValue(!e.cookie.get("udn")?this.getValue():e.cookie.get("udn"));this.setLabel(a.LocalizationComing.DictionaryName)}, onHide:function(){this.reset()}},{type:"hbox",id:"Options_buttons",children:[{type:"vbox",id:"Options_leftCol_col",widths:["50%","50%"],children:[{type:"button",id:"create",label:"Create",title:"Create",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Create)},onClick:h},{type:"button",id:"restore",label:"Restore",title:"Restore",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd", this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Restore)},onClick:h}]},{type:"vbox",id:"Options_rightCol_col",widths:["50%","50%"],children:[{type:"button",id:"rename",label:"Rename",title:"Rename",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Rename)},onClick:h},{type:"button",id:"delete",label:"Remove",title:"Remove",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd", this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Remove)},onClick:h}]}]}]}]},{type:"hbox",id:"Options_text",children:[{type:"html",style:"text-align: justify;margin-top: 15px;white-space: normal!important; font-size: 12px;color:#777;",html:"
    "+a.LocalizationComing.OptionsTextIntro+"
    ",onShow:function(){this.getElement().setText(a.LocalizationComing.OptionsTextIntro)}}]}]}]}],buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton],onOk:function(){var a=[]; a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp",a);e.cookie.set("udn",j.getValue());e.postMessage.send({id:"options_checkbox_send"});f.getElement().hide();f.getElement().setHtml(" ")},onLoad:function(){b=this;e.postMessage.init(i);c.IgnoreAllCapsWords=b.getContentElement("OptionsTab","IgnoreAllCapsWords");c.IgnoreWordsNumbers=b.getContentElement("OptionsTab","IgnoreWordsNumbers");c.IgnoreMixedCaseWords= b.getContentElement("OptionsTab","IgnoreMixedCaseWords");c.IgnoreDomainNames=b.getContentElement("OptionsTab","IgnoreDomainNames")},onShow:function(){var b=e.cookie.get("osp").split("");d.IgnoreAllCapsWords=b[0];d.IgnoreWordsNumbers=b[1];d.IgnoreMixedCaseWords=b[2];d.IgnoreDomainNames=b[3];!parseInt(d.IgnoreAllCapsWords,10)?c.IgnoreAllCapsWords.setValue("",!1):c.IgnoreAllCapsWords.setValue("checked",!1);!parseInt(d.IgnoreWordsNumbers,10)?c.IgnoreWordsNumbers.setValue("",!1):c.IgnoreWordsNumbers.setValue("checked", !1);!parseInt(d.IgnoreMixedCaseWords,10)?c.IgnoreMixedCaseWords.setValue("",!1):c.IgnoreMixedCaseWords.setValue("checked",!1);!parseInt(d.IgnoreDomainNames,10)?c.IgnoreDomainNames.setValue("",!1):c.IgnoreDomainNames.setValue("checked",!1);d.IgnoreAllCapsWords=!c.IgnoreAllCapsWords.getValue()?0:1;d.IgnoreWordsNumbers=!c.IgnoreWordsNumbers.getValue()?0:1;d.IgnoreMixedCaseWords=!c.IgnoreMixedCaseWords.getValue()?0:1;d.IgnoreDomainNames=!c.IgnoreDomainNames.getValue()?0:1;c.IgnoreAllCapsWords.getElement().$.lastChild.innerHTML= a.LocalizationComing.IgnoreAllCapsWords;c.IgnoreWordsNumbers.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreWordsWithNumbers;c.IgnoreMixedCaseWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreMixedCaseWords;c.IgnoreDomainNames.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreDomainNames}}});CKEDITOR.dialog.on("resize",function(b){var b=b.data,c=b.dialog,d=CKEDITOR.document.getById(a.iframeNumber+"_"+c._.currentTabId);"checkspell"==c._.name&&(a.bnr?d&& d.setSize("height",b.height-310):d&&d.setSize("height",b.height-220))});CKEDITOR.on("dialogDefinition",function(b){var c=b.data.definition;a.onLoadOverlay=new o({opacity:"1",background:"#fff",target:c.dialog.parts.tabs.getParent().$});a.onLoadOverlay.setEnable();c.dialog.on("show",function(){});c.dialog.on("cancel",function(){c.dialog.getParentEditor().config.wsc_onClose.call(this.document.getWindow().getFrame());a.div_overlay.setDisable();return!1},this,null,-1)})})();SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/wsc/dialogs/tmpFrameset.html0000644000000000000000000000361712247657030026173 0ustar rootroot SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/wsc/dialogs/tmp.html0000644000000000000000000000665312247657030024507 0ustar rootroot iframe
    SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/wsc/dialogs/ciframe.html0000644000000000000000000000323212247657030025303 0ustar rootroot

    SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc_ie.js0000644000000000000000000000637412247657030024630 0ustar rootroot/* Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.dialog.add("checkspell",function(a){function c(a,c){var d=0;return function(){"function"==typeof window.doSpell?("undefined"!=typeof e&&window.clearInterval(e),j(a)):180==d++&&window._cancelOnError(c)}}function j(c){var f=new window._SP_FCK_LangCompare,b=CKEDITOR.getUrl(a.plugins.wsc.path+"dialogs/"),e=b+"tmpFrameset.html";window.gFCKPluginName="wsc";f.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:g,lang:a.config.wsc_lang||f.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang|| f.getSPLangCode(a.langCode),winType:d,onCancel:function(){c.hide()},onFinish:function(b){a.focus();c.getParentEditor().setData(b.value);c.hide()},staticFrame:e,framesetPath:e,iframePath:b+"ciframe.html",schemaURI:b+"wsc.css",userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(","),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(h).setStyle("display","none");CKEDITOR.document.getById(d).setStyle("display", "block")}var b=CKEDITOR.tools.getNextNumber(),d="cke_frame_"+b,g="cke_data_"+b,h="cke_error_"+b,e,b=document.location.protocol||"http:",i=a.lang.wsc.notAvailable,k='', l=a.config.wsc_customLoaderScript||b+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.config.wsc_customerId+"&cmd=script&doc=wsc&schema=22";a.config.wsc_customLoaderScript&&(i+='

    '+a.lang.wsc.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+"

    ");window._cancelOnError=function(c){if("undefined"==typeof window.WSC_Error){CKEDITOR.document.getById(d).setStyle("display", "none");var b=CKEDITOR.document.getById(h);b.setStyle("display","block");b.setHtml(c||a.lang.wsc.notAvailable)}};return{title:a.config.wsc_dialogTitle||a.lang.wsc.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var b=this.getContentElement("general","content").getElement();b.setHtml(k);b.getChild(2).setStyle("height",this._.contentSize.height+"px");"function"!=typeof window.doSpell&&CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script", {attributes:{type:"text/javascript",src:l}}));b=a.getData();CKEDITOR.document.getById(g).setValue(b);e=window.setInterval(c(this,i),250)},onHide:function(){window.ooo=void 0;window.int_framsetLoaded=void 0;window.framesetLoaded=void 0;window.is_window_opened=!1},contents:[{id:"general",label:a.config.wsc_dialogTitle||a.lang.wsc.title,padding:0,elements:[{type:"html",id:"content",html:""}]}]}}); CKEDITOR.dialog.on("resize",function(a){var a=a.data,c=a.dialog;"checkspell"==c._.name&&((c=(c=c.getContentElement("general","content").getElement())&&c.getChild(2))&&c.setSize("height",a.height),c&&c.setSize("width",a.width))});SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/colordialog/0000755000000000000000000000000012247657030023067 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/colordialog/dialogs/0000755000000000000000000000000012247657030024511 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/colordialog/dialogs/colordialog.js0000644000000000000000000001075712247657030027357 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ CKEDITOR.dialog.add("colordialog",function(t){function n(){f.getById(o).removeStyle("background-color");p.getContentElement("picker","selectedColor").setValue("");j&&j.removeAttribute("aria-selected");j=null}function u(a){var a=a.data.getTarget(),b;if("td"==a.getName()&&(b=a.getChild(0).getHtml()))j=a,j.setAttribute("aria-selected",!0),p.getContentElement("picker","selectedColor").setValue(b)}function y(a){for(var a=a.replace(/^#/,""),b=0,c=[];2>=b;b++)c[b]=parseInt(a.substr(2*b,2),16);return"#"+ (165<=0.2126*c[0]+0.7152*c[1]+0.0722*c[2]?"000":"fff")}function v(a){!a.name&&(a=new CKEDITOR.event(a));var b=!/mouse/.test(a.name),c=a.data.getTarget(),e;if("td"==c.getName()&&(e=c.getChild(0).getHtml()))q(a),b?g=c:w=c,b&&(c.setStyle("border-color",y(e)),c.setStyle("border-style","dotted")),f.getById(k).setStyle("background-color",e),f.getById(l).setHtml(e)}function q(a){if(a=!/mouse/.test(a.name)&&g){var b=a.getChild(0).getHtml();a.setStyle("border-color",b);a.setStyle("border-style","solid")}!g&& !w&&(f.getById(k).removeStyle("background-color"),f.getById(l).setHtml(" "))}function z(a){var b=a.data,c=b.getTarget(),e=b.getKeystroke(),d="rtl"==t.lang.dir;switch(e){case 38:if(a=c.getParent().getPrevious())a=a.getChild([c.getIndex()]),a.focus();b.preventDefault();break;case 40:if(a=c.getParent().getNext())(a=a.getChild([c.getIndex()]))&&1==a.type&&a.focus();b.preventDefault();break;case 32:case 13:u(a);b.preventDefault();break;case d?37:39:if(a=c.getNext())1==a.type&&(a.focus(),b.preventDefault(!0)); else if(a=c.getParent().getNext())if((a=a.getChild([0]))&&1==a.type)a.focus(),b.preventDefault(!0);break;case d?39:37:if(a=c.getPrevious())a.focus(),b.preventDefault(!0);else if(a=c.getParent().getPrevious())a=a.getLast(),a.focus(),b.preventDefault(!0)}}var r=CKEDITOR.dom.element,f=CKEDITOR.document,h=t.lang.colordialog,p,x={type:"html",html:" "},j,g,w,m=function(a){return CKEDITOR.tools.getNextId()+"_"+a},k=m("hicolor"),l=m("hicolortext"),o=m("selhicolor"),i;(function(){function a(a,d){for(var s= a;sg;g++)b(e.$,"#"+c[f]+c[g]+c[s])}}function b(a,c){var b=new r(a.insertCell(-1));b.setAttribute("class","ColorCell");b.setAttribute("tabIndex",-1);b.setAttribute("role","gridcell");b.on("keydown",z);b.on("click",u);b.on("focus",v);b.on("blur",q);b.setStyle("background-color",c);b.setStyle("border","1px solid "+c);b.setStyle("width","14px");b.setStyle("height","14px");var d=m("color_table_cell"); b.setAttribute("aria-labelledby",d);b.append(CKEDITOR.dom.element.createFromHtml(''+c+"",CKEDITOR.document))}i=CKEDITOR.dom.element.createFromHtml('
    '+h.options+'
    ');i.on("mouseover",v);i.on("mouseout",q);var c="00 33 66 99 cc ff".split(" ");a(0,0);a(3,0);a(0, 3);a(3,3);var e=new r(i.$.insertRow(-1));e.setAttribute("role","row");for(var d=0;6>d;d++)b(e.$,"#"+c[d]+c[d]+c[d]);for(d=0;12>d;d++)b(e.$,"#000000")})();return{title:h.title,minWidth:360,minHeight:220,onLoad:function(){p=this},onHide:function(){n();var a=g.getChild(0).getHtml();g.setStyle("border-color",a);g.setStyle("border-style","solid");f.getById(k).removeStyle("background-color");f.getById(l).setHtml(" ");g=null},contents:[{id:"picker",label:h.title,accessKey:"I",elements:[{type:"hbox", padding:0,widths:["70%","10%","30%"],children:[{type:"html",html:"
    ",onLoad:function(){CKEDITOR.document.getById(this.domId).append(i)},focus:function(){(g||this.getElement().getElementsByTag("td").getItem(0)).focus()}},x,{type:"vbox",padding:0,widths:["70%","5%","25%"],children:[{type:"html",html:""+h.highlight+'\t\t\t\t\t\t\t\t\t\t\t\t
    \t\t\t\t\t\t\t\t\t\t\t\t
     
    '+h.selected+ '\t\t\t\t\t\t\t\t\t\t\t\t
    '},{type:"text",label:h.selected,labelStyle:"display:none",id:"selectedColor",style:"width: 74px",onChange:function(){try{f.getById(o).setStyle("background-color",this.getValue())}catch(a){n()}}},x,{type:"button",id:"clear",style:"margin-top: 5px",label:h.clear,onClick:n}]}]}]}]}});SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/fakeobjects/0000755000000000000000000000000012247657030023051 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/fakeobjects/images/0000755000000000000000000000000012247657030024316 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/fakeobjects/images/spacer.gif0000644000000000000000000000005312247657030026260 0ustar rootrootGIF89a€!ù,D;SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/icons.png0000644000000000000000000002263212247657030022417 0ustar rootroot‰PNG  IHDR9[„ IDATxœí}{TÕ¹ïoõôcOwσžžG÷<ÆqÞ yEœD@Q#$Fï‰÷ãµê“TÊò8h%Tʲ,¢–W¼Æ“òxƒe rŒ& ˆ ( ‼f¦g¦ßÝ»û»ôÞ{vwïÝ݃‰A³U«º÷z|ëµ÷÷­õ­µ¾üÀx Àn»< ‘)øåØÛÑÑQçt:a±Xàv»qúôi:tèOn•GÎR ð›;ï¼óf»ÝÎ{<ž=Ë—/?¹oß¾±ÚÚÚ’²²²Ú!ûÅȺ„ĺÚÚÚUÁ`D´ó­·ÞºtÏ=÷¼òÎ;ï\<{öìÇ6› VÆ%?Ìš5«¤ªªjÿÄÄÄ{?ùÉO¶1ÆV0Æþcìû½^/*++”Ú@DEDô;ÁU'¿¶téRª©©9.÷ÔËcÃîMHØà_[[[—NLL §§çü‰'T ‘ˆ_êõzjll¤ùóçSYYÙ^"ú¥gLé»Ó áZÆ&$s—|àY‰|2Y°nºóÎ;—†B!LLLÀëõ"Âãñ`÷îÝ>žçgøLŒŸ$XŒFãÊêêêë/]ºzýõ׃«V­ò[,–}.\¨˜3gŽáÀa[ÄøIŸ3ÏóàyÑhŠ”/_¾üe·Ûõx픣õŠŠŠÁ`%%%Ÿ2ÆÆ”â¤"ÐPSScw»ÝX¸páT©á[n¹…üDÔ«)U này‘HädÓ¼Œ 8Ž^žçqÝu×eŒ%‹åx@pÖ¬YÔÓÓCV«5 àZäD®làš6mš1++ ÑhÂ$ô¿}>ß2%q¯2E(±ñ‹jÃ}%¹À)Ä 1Æ¢Š4h¸¦±ÀCüÎ ÏO (}!ÿRPPð\SSt:"‘‚Á Âá0†‡‡át:-ýýý>Õ¬‡ë®»î¢åË—ÓljF£á¡¡¡ðŸþô§È­·ÞJ¿üå/ãt ‰%ົ»ý………hiiá}ôÑï!6°ÎÐàÛn`ŒIÃÀ¸úfÍš"ÂÖ­[õŒ±o1ÆÚc#Œ±§c]òÄŠm°sçÎcO<ñDÕjÅÐÐ188ùÀSV«õ‡Wªþ.ÄÏÖâœÑh$½^/÷ÛÈXšÀÎ’(OLL`ýúõºþþ~]vv6t:^|ñE@”1¦Ø5ND9óü+V¬€óçÏ£¿¿_J§$ŽØ àÆX'c,Äõûýðz½˜>}zoL*Acc#éõzŒŒŒ  ¢¨¨ÆÓO?}bþüùשøðÃÃ[¶lÑ:tHçr¹0>>Ž‚‚”––Fyä‘èôéÓ—1ÆÞR(y DÔGDëˆh#"7'¢×ˆhžjB 4ÄA‰?¤Ó~Kx1 Ô)󛇘JøÕ´©­Vëɾ¾>ÊÏÏwè0Ïf³¹ûúúˆã¸ci‹¼{÷îÇ.\hu8›ÇŸ,X`½xñâÈáÇ÷¨8µѺE‹ÕÙl¶|ݶmÛ ßgŒ}”²Œ±þþð‡Ï£Ïçƒàô«W¯^§–8®ˆ5ØŸ»ºº¬gŒˆ`±Xò÷îÝ;à&ýjDDœinn&‡Ãq% îõx<»‹ŠŠ\MMM„«€í˜”LgâRÆ7u:ÝÀåË—÷Ñ\"j?sæÌn§ÌfóF¡Ä©_P 2 "z^ླe~íD4@DO‰¥”•à\º*)ÄÑ)` ¯©€óŒ1£àÎi–H²ç1©¤ ik¾ºHâSú˜ˆ($ºë¯¿¾B‰@JÁ«¿FŸÏw>1bZÁRSS“Ä$¤,V«õäççŸÃdl+^*ÁrðàÁ=àr¹xy;S, Jkž1ÆOI°0ÆxÆX@p|\ ð% u¤,F£qcZ  ¾®PÚ ÄÐët:Q§ ÂÀ üO©ÝyÞºÿã‚ÿ+rÏ$6¾téR<øàƒÈÊŠ/ܬY³ðÐC¡   Î?‰€ÇãÛíF$‰ó÷ù|p»Ý…â”8ÉB¡PR$ ¶ …ÀóñjÅ5WaÑZÑŸ(~„«ºòN§ì¯@€êf4õ‘HÑh4ŽŠR#^ây999vy¼¢¢¢¢p8 Žã&Rðù|Ÿy½^TTTô¸@™^¯ÿ‰Õjµº\.ÔÖÖžIL‡-[¶%úQ]0™Lé‰X,–$r"HÔ$Âd2©Fˆ¤& (ÝãÒ©8åª0Æâ˜ÍfÅFÕëõªí¡T¥ª\ÐétŠDÒQÌ@æT ˆDäáLðœôˆñ*‚ò’<Ô<-u·É§ªÅIÂ&J ”®êÒ½¹ É JÐä‚&2" '¢˜Ì©‰ÈÃ5¹ É _k<`QŠðnÏ©†æåå äää¸Û’ˆ ³Ù77·l÷îÝ'tMU‚E6µ··Ï5›Í;<8väÈ‘‰œœœ÷;;;kÛjtb Ê$"ú„ˆN:Žb[Íb ¢ÜÜÜÜCz½þ³Fã>‡Ãñ¼ÞÙÙù‹Å2`ÇqŒƒÁ&ȱsçÎWìந¨x›ˆÖÈ2¸«§§g3bg{¯_¿þÏDd#@DÝ;52ND/Q‘,LGDOÑP Õó~4üU ÉM.ˆÐä‚&4|­0`±XHPÐ ¨EJÜFò€ù>¹ýöÛkJJJ—.]ÂÿøÇû `g"cÇŽÓ×ÕÕ5öôôx!,^×`ù]»vY>ýôÓOêëëyõqE±X,DDK€b;?1 „-á8.yr]RR’Ñlˆ×|I,-q¡:\.—ô_"‡ãm†ŠBJ˜úoŽ‹““Wí”ÂU« ;¨T )\Ò`$VÁï÷‹e‡.?AV"¥ª01\U #[gW,Xb© ººº`‰B\Å6HRÔ|üñÇÇ0¹MYYYk³ PœGD{E½Zuuµ|Z’›>}zê²Dô‚¢Vr/¤)¡ 4¹š\Ðä4¹ áë ¥m¦‰àìv{gNNN§×ëuW‹¸ 1ÙÄôÝ^â8.X__OsæÌ!«Õð ‡Ù§ÚÚÚJŸþ9&&&Fc6§Ó‰¦¦&\wÝu6½" aÆ g tôèQ&ñƒ‚‚Ìš5 lÙÙÙ "D"øý~iÓg8FWWþò—¿H;I%Á`~¿&“ ^¯7VFÁÈŽø?K E†ÇC¡ê*çy‰‰¿a¨âU‘@$‘xeO …B‡ÃÐét`ŒˆF‰D¤ªˆ»e«011ǃH$ÆÂá0ÄÂ^¯÷´Éd ‡Ã5<ÏçË HذaÇ………Wª««©ªªÊït:w¬Y³fÅöhž¡˜fãBYYÙvÈÎÎNâ‰ß!¢ËÁ`ð ÅÎ÷n%¢Q,N.½¨ˆ>"ÒQe°.ê¦%ð÷_¸¾j$œcÑ P— ÅÅÅ7gggOóù|ÃP0k ñëzÐjµçÌ™CõõõÄq\ÀKˆÉ ÑZË<$*òù¼¼<ºûî»a4ÁC4ÅÀÀŽ9‚‹/‚ˆFsssmÕÕÕ8xð ‹ã‰@l¸çõz¥gN‡ÊÊJTWWƒ1¿ßo€³gÏñD‘lj̘ܨÁ‹c÷Á`Á`0ž€œßó<Ÿ”Hy&qrAüD"ÈÊÊR% ²{Õ*øý~„Ãa©YYYqòB.â’¸\.¸Ýî1ƒÁp" Ú-K•ÅbAvv6 ˆ~¿q§&ù|YYÙv"º È3DteÍš5ÛœN玪ª*uu5^Ù°aÇqD>OD¯ÈÙºÀæ È · 7.ÑwÛ&-ŸKÅŽè%‡§# „kH.h|^ƒ†¿ôî°ÉÛJžà·OˆÇT¬Ê‹–••íç8n¶ÌÊBœã8nvYYÙ~ÆXÔl6Oš¼çž{ž°CP‰ÈODþÚÚZª­­Mlƒ½vib ¢^»vívĬÓIõ]µjÕÖU«V½Ð ‡Ö®]»ˆþYN@OD÷Sìô˜<·µ‚“ûâê4FçDk…J~4høÚâ+$L&Ó^¯×{õr¡´´”ˆ¨3++ë$0¹ßê(c,ZZZš(ôŒ±ï56662Æná8®vÉ’%ï2ÆÎò õB*¬_¿>À¥³gÏ~àÞC‡]²Ùl;ûúúìéÒŠU*!¢]b…6ÙHDwM¥4üýñæJm4U—D€É¯QÉŽè.(*’ö÷­Iø R¶:bŒIÚ"ŠZœH’zH`i€Ý‰%°Ûíé« Z"¢%Ø?’-XXÓê)Bµ ¬V«X‚7¦M›–®Û@É1ÍÅvGê,Ëû²ð|I›“ª ¬l‘böDE®­„^ÌRðD€ŠM8ÆØ(€SnL®­]Ý{ "£÷ Á‰#¤-µI%Û@)´3l¾úøbWª¨"å «¦¦¦i®ØJ$ðSÄ>°Ÿr§/..ý_F2¿8@Ÿh•FÇãÅ_Ù¶ÉüâtZ;‡T%”àÔ† ¬¤¢€ç8 µµõ€*"Ú&?oSjÉ"Ýn¿_x¶Š†¦cesˆ^yˆr!*ò{»Ýþ.àï"""§‚Ü8 ‘‹%ðDi}¡¬¬ìªÚ@BuuuÆm Bz²³³õ²u&Õ6Hù Km€«yL&Ó›l©äFʆFÆØ¨P•Œ– 5h¸vñ?_°Ùl_l¾ d+±yCÜa(Õ6°X,ã‰q„yÃR RÍÄ%r¹NNÎûD4yF†óEÙ1•ù‚|<ý­ÄFÑæ 4\ëúB©FcÚ­%‰ãÄíò_™LG2¿O"@D{ä¿2™ð‘ÏT½Ð@‚¸4ŒØEÙbÎn9¿KPàd"Q&Ñ~YÎûåV®E Ùíö¤úÉŒOÉKÜD´sdddX–ËY N&ìOÙ$ì?Uà‡iÛ ÄMNªó…DlOøÍ¬ dUÙ*üîIðWmƒtüú €J¸šSÏãS6}$ìMS•4|Í f”x»,Î<Ä ìÅäI‹HvQK‚{[mï²eËhÙ²e$09ZWܼÓÌ4ë  Š‹‹ã¿âLJðÖ[o½T^^~¨¼¼üÐ[o½õR"¥fã$¢^":$¸ÞÌ›÷Ë—ÓÔÑÑ×â`ÛeË’Ÿ^¯×‹ 6YYYú¸³€™”`óæÍ/ †CƒáÐæÍ›¿ŽÝ¨Aõ5†‘ ³ Â÷Ó}êÒ8Qïg"3¨óý Ù:ÃÈ„Ù\;øâݨÄ÷Ó5¢ÔYYYß×ëõzq•‰Ì Î÷ÿÁºQƒ†k™2Ží]þwHÍÉSQ ¢¢¢B|ŽãÿÈ„q·‘4ʔծRIT‘Gív…­‰Sd”ª±’þVÊêLºQŒ#Y™R7ŠÏ999ù¢ß”º‘1V À(7>8Õn¬âE3]cHìFÑ6Fò½<™t#MÞã©ÝË£áëŽ8ž ˜L¢Z8TZZZ!NÇd9î-$#A)&侌1^~¥\¦²"ÏÏ„É$ 9ÏÿÒÒI<SéF%ž?¥nTâùSíÆ$ž?ÕnLâùSêF%ž¯­+høkà«f7ã8¢ íæ)Þã£t;ä6ö$Ž$·…—r¥´H`³ð +ñ?B‚¼${™ÚÈ!·±§€ÜÜI£ NžT±?WTTPªpƒÁ_âDs‰ Õªœè‘òYNàj¬P,lì¥ÌQ-œlìM¢ªª*¥<Á†„Wz/%­±h6ò4üÍðU“ š=Õ¿=Õ©ÊŠ$^?UY‘Tä©Ê µ›óÒ>gbO53$ÚSUÈ1ñá4E{ª‚,IA^“4ˆÈEì ÔU¡À©ÚÚÚ´²"Q £ð »ÝþÓ›nºI ñÙgŸeL Š1örGGGwcc#Âá°hÍõYĤó[ ˆÂu€g¿ñoäÚív„ÃaD£Qèt:|þùçp»Ý8yòä?ðºH /^¼*;;»Ãjµyž—¬»†ÃaX­VØl6”••¡²²²h||ün¯×{À1©3UôpyyyÔáp´äååA¯×Ãï÷ƒçù=—.]Êà,((ÈÏËËÞ={øàƒ½õõõ{››› Jwš J—µûÌfó9³ÙL²0#}“ˆÞ~òÉ'·!þÊ$B½Dô‰ÑhT<9@D÷¯^½z£*!’ˆ^Kþ@J4høëãe¤9óœ‚l8…˜¬HBZDSSV®\Ye·Ûw fl).šUÛÅ–øîÌ™3çF4440ƒÁ°ðâÅ‹7xÀ¼ñ}9€Çf̘є““ŽãP]]-ɃÁ€‘‘¼ù曾àÿÉ%ÓíEEE¯Í;V«<Ï#Âï÷K†X½^/xžGSS“Îét6oÙ²Emµ999¿›9s&FFFpüøñ1KJJ&ôz}gvv6xžÇøø8?>wîœÀcL"ðíªª*ëùóçû_xátuuÕˆðÔ××#''.—+ÚÖÖön¿À=Œ±òºozòÉ'· Bä›D$©ÿÍf3™Íæsûˆèפ´¿zõêDt¿RwƻܬW¥ÇRóxŠ™ïHy|_ƒ _4¹ ÉM.hРø{ê‘~j·ÛqÕz¤¶¶¶îææfM¤é‘4hø £À‹ˆ¦qã^PL²´—{{{WÕÕÕ„kÅB¡tóÉd’îéaŒáèÑ£xÿý÷ à{:¨ªªº£¦¦‘H<Ï# ÂårñßúÖ·Þûîw¿ûþÐÐ'@dwµµµ(--½†îF¯×‹@ €`0·Û —ËÕ¿lÙ²——,Yò"clÛí–Â}>ÊÊÊ8‰€xÏŽxšÇãÁ<°Ÿ1öcÿùÿñýR<Á¾($â=;Ñh¡PÃÃçW®\ù&bæ-rÛÚÚ6Ž …BRÓÛÛÛ:222×d2Åv_ÆÄýÁ`0d·ÛûwíÚµßáp< ¢j"z•bVÎm­ËœŸb†Gª’?j ®UˆVÌžºšÄM·Ür =ôÐC4{öìqf¥H©Ô@ß///G0Dsss.E#õjÌ---ßñù|ÈËËÛÏóÓÛÛÛ‰DÐÞÞn5›Í›¤c[PYYIgΜ±äææî[°`Aƒ^¯Ïó8vì PRRžçADÐétÇÐИhžmnnnðù|ˆF£`Œ¡²²@ìþkùíÛ<ÏKwǽÊÅÅÅÒ­Új á¶máE’JpUWpÊiò®†€ ×äãJð£4ñQ. vÎG<¿JÐÝÝD?y<ñÔ€ $òäµ¶ÆÆÂÔ?@^ss3€Ø2âåCìkFg˜={ödùó Ù†cƒI@ŠÛ¤º‰z¯×+ñ ј’œ+‰ÐÀèè¨TßÑÑQ@ Šët:!–T DÂ)ZñBaa¡´Kžˆ‚pæÌ™Ä;í¤ÔÁÄÿ Z ÀbÆX°§§‡ž{î¹mò4 ÙÍhâ’í°Ød2ùçÍ›G‹/ÞJDÿ"O“ˆX${¾Ñd2ù»ººhÉ’%ÛˆèYÕ†°Øl6“Õjõ DY­VGG-\¸p+=—˜ ñþ,^¼ø½±±±ÞS§N½•••Çqï½ûî»'cI³6–@@àùÞÞÞê+W®ô@AAÁ{ï½÷Þ ÆØÿT*²ÒU¤:ÏßxãÕðÎ;ï¨&Ö ák5‘qZésž5kìv;ôz½ê\⌌àÀñ%ˆãq™dϘ)޾hªªªPXX˜Q._¾ŒÓ§OORÿÎU˜6mŠŠŠ jôÕ‡1<<,¼†ª999õ‚Ûí–ü ,ež½‰¼ÚœAÃWJ_êø±=‹qßL"*NwJI9+(]é2êKUIDATBLò°¤ÍŠ·Ýv›”Hžçqþüy|ôQü­ ‰ãĤ"&@ÕØ\RœiUqñ%˜;w.ôz=t:"G""D£Q ãâÅ‹“„¢O$¥J¸L(vOg~wwwÒì= ØýñVëcQÄöÞæ×××+!cppŒ±1yI”zaêH²J$>Õ`òžt[Å©[±¼úüüü"ñ L¥G’é Š~>MÎqˆÓ¥ ûo˦HàôTâkÐp#Óažê\Êù‚°7~øazÊ©Fªâ¨4]Ѧ2R•Òe<_•ó—/_–dB¥© ¶åUJ4FšD”è—Ñ|!ãòåËIŠ8`ŠUPê/w¾¨È@›/hÐðE‘nÃEZY‘Òrýœ9s`³Ù$.•R¤˜}²"‘À”eC\œN' ÁqœâZBJ=Rº"'e¯TQå/®­dRÅF´ÙlTXX¨*#=’:©Èˆ¿®\ÈÍÍ…^¯þniz$ Ô¡­;këÎrÚºó$mÝYƒ†/ ‹Å¢p;6øËP `)¦ s\¸þúëÅûì7#Y¿ü²Ñh¤ë®»Ž»yz0ù5n¼÷Þ{—çåå1†Ó§OcÓ¦MËü·ÞÝÝݽkΜ9Ðétp»Ýøío»À|5ð<±±1ŒÃf³À ²Ü[ËÊÊàr¹àr¹FÑÓÓÓ À¨€ááá'.\¸€ÑÑQx<ŒÀ"Ê€‡~ø¿ÎŸ?ï¹xñ"&&&àv»áv»ÑäQ„}ûö­yá…Ü}}}tà 7Ðüã¸ÍÿDôЮ]»®,^¼øòÍ7ßL¥¥¥¯$5±Ãá¸Á‚T\\|œˆ’}‘­¾¾~pîܹôÈ#¬K"`c]]]dݺu?&¢Â{ëêꨡ¡aõ%öY,–Èm·Ýö)|±8\UUuE‰½×¸ð›ßüæm"z3®qbÐxcÑ¢E§ˆè %©Ô‡×Ñ¿+Õ @õÖ­[Ÿ"팳†¯/®þè@ß}÷¥\œK™;cЋç˜Å´¸æ*®±¦òÓëõÐÁårÁçóˆÀqL&‚Á 8àNòcŒÁl6cÚ´i@{{;QDîœNgF~ííí¤÷z½`ŒÅãM&eâרØHŠË£Jšm5m·NIS“dC[ÅÏ`0H&ÑãúQ8ŽÖO§ÓA/Ìâ&CÙÙÙºLüêêêtzǓԈ’Lɯ´´T¹§ÒLLI—¤ä—••%Ù¿*Çqˆº‰hwâ[–ÛMDŠæ¿4høÂHV.È48 ~ñ#òÙ³g'©~:::¤0‚6'™€x< @ÞÌ™3L*^ä ùÿ8‘HŒ±c, HOÉoGÿO¼ðMú/&¬‰BFî—D@κ}>ÀãñNœ8!¶ 9sFùÆ8!À¹sçBŒ1ŒI{wòªªªüBý•uÐ ªŸ$QJŽhb“0·øb'ëîèêêJ¹c¦1ƒ)¿—ù®ªªŠ¼ÿþûßEÌŠá'ˆÙIB7www÷^"úà· ±±‘ÚÚÚvQíª¯¯?‡˜y§ ¾¯·ÞsÏ='0y8üß²²²ð«_ýj?cì€{KJJNWVVÖˆ›Sˆ¿é¦›¶ˆ vH¾ÌétFJKKÓä5:ÏÿáØNDK“ê@DÏtwwo5›ÍÏXk±XèÑG«ÃØñâ‹/n'¢Uª­HDÏÑãDôs"go‚bn[ÊÄþañÿ~Ó#Õ®<éIEND®B`‚SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/link/0000755000000000000000000000000012247657030021526 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/link/dialogs/0000755000000000000000000000000012247657030023150 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/link/dialogs/link.js0000644000000000000000000004031312247657030024444 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ CKEDITOR.dialog.add("link",function(n){var p,q;function r(a){return a.replace(/'/g,"\\$&")}function t(a){var g,c=p,d,e;g=[q,"("];for(var b=0;b0?this.getElement().show():this.getElement().hide()},children:[{type:"hbox",id:"selectAnchor",children:[{type:"select",id:"anchorName","default":"",label:b.anchorName,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");for(var b=0;b0?this.getElement().show():this.getElement().hide()}}]},{type:"html",id:"noAnchors",style:"text-align: center;",html:'
    '+CKEDITOR.tools.htmlEncode(b.noAnchors)+"
    ",focus:!0,setup:function(a){a.anchors.length<1?this.getElement().show():this.getElement().hide()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}},{type:"vbox",id:"emailOptions",padding:1,children:[{type:"text", id:"emailAddress",label:b.emailAddress,required:!0,validate:function(){var a=this.getDialog();return!a.getContentElement("info","linkType")||a.getValueOf("info","linkType")!="email"?true:CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)},setup:function(a){a.email&&this.setValue(a.email.address);(a=this.getDialog().getContentElement("info","linkType"))&&a.getValue()=="email"&&this.select()},commit:function(a){if(!a.email)a.email={};a.email.address=this.getValue()}},{type:"text",id:"emailSubject", label:b.emailSubject,setup:function(a){a.email&&this.setValue(a.email.subject)},commit:function(a){if(!a.email)a.email={};a.email.subject=this.getValue()}},{type:"textarea",id:"emailBody",label:b.emailBody,rows:3,"default":"",setup:function(a){a.email&&this.setValue(a.email.body)},commit:function(a){if(!a.email)a.email={};a.email.body=this.getValue()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}}]},{id:"target",requiredContent:"a[target]",label:b.target, title:b.target,elements:[{type:"hbox",widths:["50%","50%"],children:[{type:"select",id:"linkTargetType",label:i.target,"default":"notSet",style:"width : 100%;",items:[[i.notSet,"notSet"],[b.targetFrame,"frame"],[b.targetPopup,"popup"],[i.targetNew,"_blank"],[i.targetTop,"_top"],[i.targetSelf,"_self"],[i.targetParent,"_parent"]],onChange:s,setup:function(a){a.target&&this.setValue(a.target.type||"notSet");s.call(this)},commit:function(a){if(!a.target)a.target={};a.target.type=this.getValue()}},{type:"text", id:"linkTargetName",label:b.targetFrameName,"default":"",setup:function(a){a.target&&this.setValue(a.target.name)},commit:function(a){if(!a.target)a.target={};a.target.name=this.getValue().replace(/\W/gi,"")}}]},{type:"vbox",width:"100%",align:"center",padding:2,id:"popupFeatures",children:[{type:"fieldset",label:b.popupFeatures,children:[{type:"hbox",children:[{type:"checkbox",id:"resizable",label:b.popupResizable,setup:j,commit:l},{type:"checkbox",id:"status",label:b.popupStatusBar,setup:j,commit:l}]}, {type:"hbox",children:[{type:"checkbox",id:"location",label:b.popupLocationBar,setup:j,commit:l},{type:"checkbox",id:"toolbar",label:b.popupToolbar,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",id:"menubar",label:b.popupMenuBar,setup:j,commit:l},{type:"checkbox",id:"fullscreen",label:b.popupFullScreen,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",id:"scrollbars",label:b.popupScrollBars,setup:j,commit:l},{type:"checkbox",id:"dependent",label:b.popupDependent,setup:j,commit:l}]}, {type:"hbox",children:[{type:"text",widths:["50%","50%"],labelLayout:"horizontal",label:i.width,id:"width",setup:j,commit:l},{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:b.popupLeft,id:"left",setup:j,commit:l}]},{type:"hbox",children:[{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:i.height,id:"height",setup:j,commit:l},{type:"text",labelLayout:"horizontal",label:b.popupTop,widths:["50%","50%"],id:"top",setup:j,commit:l}]}]}]}]},{id:"upload",label:b.upload,title:b.upload, hidden:!0,filebrowser:"uploadButton",elements:[{type:"file",id:"upload",label:i.upload,style:"height:40px",size:29},{type:"fileButton",id:"uploadButton",label:i.uploadSubmit,filebrowser:"info:url","for":["upload","upload"]}]},{id:"advanced",label:b.advanced,title:b.advanced,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",id:"advId",requiredContent:"a[id]",label:b.id,setup:k,commit:m},{type:"select",id:"advLangDir",requiredContent:"a[dir]", label:b.langDir,"default":"",style:"width:110px",items:[[i.notSet,""],[b.langDirLTR,"ltr"],[b.langDirRTL,"rtl"]],setup:k,commit:m},{type:"text",id:"advAccessKey",requiredContent:"a[accesskey]",width:"80px",label:b.acccessKey,maxLength:1,setup:k,commit:m}]},{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",label:b.name,id:"advName",requiredContent:"a[name]",setup:k,commit:m},{type:"text",label:b.langCode,id:"advLangCode",requiredContent:"a[lang]",width:"110px","default":"",setup:k,commit:m}, {type:"text",label:b.tabIndex,id:"advTabIndex",requiredContent:"a[tabindex]",width:"80px",maxLength:5,setup:k,commit:m}]}]},{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.advisoryTitle,requiredContent:"a[title]","default":"",id:"advTitle",setup:k,commit:m},{type:"text",label:b.advisoryContentType,requiredContent:"a[type]","default":"",id:"advContentType",setup:k,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.cssClasses, requiredContent:"a(cke-xyz)","default":"",id:"advCSSClasses",setup:k,commit:m},{type:"text",label:b.charset,requiredContent:"a[charset]","default":"",id:"advCharset",setup:k,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.rel,requiredContent:"a[rel]","default":"",id:"advRel",setup:k,commit:m},{type:"text",label:b.styles,requiredContent:"a{cke-xyz}","default":"",id:"advStyles",validate:CKEDITOR.dialog.validate.inlineStyle(n.lang.common.invalidInlineStyle),setup:k,commit:m}]}]}]}], onShow:function(){var a=this.getParentEditor(),b=a.getSelection(),c=null;(c=w.getSelectedLink(a))&&c.hasAttribute("href")?b.getSelectedElement()||b.selectElement(c):c=null;this.setupContent(I.apply(this,[a,c]))},onOk:function(){var a={},b=[],c={},d=this.getParentEditor();this.commitContent(c);switch(c.type||"url"){case "url":var e=c.url&&c.url.protocol!=void 0?c.url.protocol:"http://",i=c.url&&CKEDITOR.tools.trim(c.url.url)||"";a["data-cke-saved-href"]=i.indexOf("/")===0?i:e+i;break;case "anchor":e= c.anchor&&c.anchor.id;a["data-cke-saved-href"]="#"+(c.anchor&&c.anchor.name||e||"");break;case "email":var f=c.email,e=f.address;switch(o){case "":case "encode":var i=encodeURIComponent(f.subject||""),h=encodeURIComponent(f.body||""),f=[];i&&f.push("subject="+i);h&&f.push("body="+h);f=f.length?"?"+f.join("&"):"";if(o=="encode"){e=["javascript:void(location.href='mailto:'+",u(e)];f&&e.push("+'",r(f),"'");e.push(")")}else e=["mailto:",e,f];break;default:e=e.split("@",2);f.name=e[0];f.domain=e[1];e= ["javascript:",t(f)]}a["data-cke-saved-href"]=e.join("")}if(c.target)if(c.target.type=="popup"){for(var e=["window.open(this.href, '",c.target.name||"","', '"],j=["resizable","status","location","toolbar","menubar","fullscreen","scrollbars","dependent"],i=j.length,f=function(a){c.target[a]&&j.push(a+"="+c.target[a])},h=0;hCKEDITOR.env.version&&(a["class"]="cke_anchor"),a=new CKEDITOR.style({element:"a", attributes:a}),a.type=CKEDITOR.STYLE_INLINE,c.applyStyle(a))}},onHide:function(){delete this._.selectedElement},onShow:function(){var a=c.getSelection(),b=a.getSelectedElement();if(b)CKEDITOR.plugins.link.fakeAnchor?((a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b))&&d.call(this,a),this._.selectedElement=b):b.is("a")&&b.hasAttribute("name")&&d.call(this,b);else if(b=CKEDITOR.plugins.link.getSelectedLink(c))d.call(this,b),a.selectElement(b);this.getContentElement("info","txtName").focus()},contents:[{id:"info", label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return!this.getValue()?(alert(c.lang.link.anchor.errorName),!1):!0}}]}]}});SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/link/images/0000755000000000000000000000000012247657030022773 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/link/images/anchor.png0000644000000000000000000000137312247657030024757 0ustar rootroot‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs × ×B(›xIDAT8Ëu’ÏjSAÆgnÚŠMc)‚­à¢)‚(îZÔ‹>@ Oà+ø.]tSÁ­X*R»°k)4H¸—›¡Tì"1D¥If>wÒ6þùàÀ0sæÇ7s>˲Œ €¾sÜ_X¸ÜvkÍæQâ=`†“HÌ MS$½V¡MIoZ»»ú¸²¢Îþ¾$Hz*éFíøI·ãÞF=Ë Ë2$ $½››Ó:hô´ú°¼ùjwwv“Ø[ÏsJfÀôì,S''ܪT8ìt¨å$áûÖkf àÚu G!KJqMß{gf¨Çw2>ÎX¹ÌB¹Ìâä$ÓSS|=:bóô4ì Wp%¸P0c`FÏ9lb‚Áå† 'r~ ÐX‚ÿúýèÊHÌH€pf8³b„ÿÐ9€paüG·Ë7àW¯Ç„÷Œcf$ΑÀìüˆÞ¶Z¼f€CàJ»Í£v›‡Õ*„@·Û½¸-QÂFÍeÀ3©ì¶—–*ŸööØj4°Fƒ3àNÑú^ÞCžç#A’´-éf­ÙDRIÒcI/%õVW%éLÒsIÓõ4Åò<§Z­ÊÌDšç¼Ç™sç¸;?¨_>çy' ÄŒ’¤‘'8À9Ç0¡4POÓŸ‚šcÎáœ+‚B(„€rîÒ¸†!,Î] ÐFt²á½çOWföW õ2C@XÊ¿„%tEXtdate:create2013-07-04T17:03:03+02:00M¤»x%tEXtdate:modify2013-07-04T17:03:03+02:00<ùÄtEXtSoftwarewww.inkscape.org›î<IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/link/images/hidpi/0000755000000000000000000000000012247657030024070 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/link/images/hidpi/anchor.png0000644000000000000000000000307512247657030026055 0ustar rootroot‰PNG  IHDR szzôbKGDÿÿÿ ½§“ pHYs × ×B(›xVIDATXõ—[ˆUUÇkí}öÙÇIÏØŒÓM)l¬¼`8ABAJ¯B/Addoô0šõ”11/ƒŽŠÑ>H%…¨ƒÆ taÂt@sNsÌtæœ}YûëaïíœËŒsÌúÃæ°ÏþÖý×wYë[êÜ¡CˆE B%D„(0ž‡ úï(…eÛXÙ,–ã ´F)JUóD"25^©[¶¶ˆù>A©D±aÅ@ãytìÜ©gµÀÀ΃À±îî1§© ;—Cg2SBRßÇxQ 32¹ÚqPÃ_|ãO½ùæ3@БÌÿ#°¸ –1=‚äû'Ýݧílí8ØŽ@X.LN²¦³óUàCà ðîÐþýß9sçÂp?ƒ½½ˆÈˆ˜šçœˆDÄÜ1ß··›C`9¾b…?v¬Ö~@D6ŠHÓ‰®.Ntu!"yù¨Ænp°·—áþ~Ôp?¥b‘§·m3qxÔ­ø§8·y3C}}¸‰ï%K÷E<Às—/Wz¥ üü,²o(Å„w°·×ÊÝ{/6 aŠU«VU%Ñ׎ÃXÐ äm›H)&ƒ …+Wø\)òÀš#GX°n <’r\Þ³‡Þ­[1ÓÄϨÌmcL•€ A@;оd Å›7/‘ Àu]²ŽCƲ˜œ˜àOßg8º~=&Y²JDΚ€ÜL*†a•€ÕÀ“Ë—S(•!AÒ­iimå¡L†ë7npµXä/À$l ¥BЬªêX=>×<Иª¼Hm£("4†Ð²himeÑÂ…ØJQö}¢(Bâûœ¼paÚÒµDéÊ*BbÒdˆ&ŠÃÏ÷1"äçÍ#ŸÏ#J„aìµ™ÕÓ3áæóØÙ,ʲfOÂã»w/w››É57ßêýtr(" ÎôõýîOL¼×ÑÙùðÐN\4£À©îîйçž)˺MVÀij™;+é÷S¨´´´F[–ã`».Cûö™( ‡Ed8µÓ¶ÍœÖÖ©ËKϬP–…®Tmo<)qš#3ÙÔ¢> kN9•4‚ôœ¸Ô ð<ï)îumy˜ÜßRüýÑmQ”H6¢©þø{ O¸«fÂ`{ÃíØ¿Ä?(‡±/?X@.%tEXtdate:create2013-06-20T10:33:39+02:00T%ß”%tEXtdate:modify2013-06-20T10:33:39+02:00%xg(tEXtSoftwarewww.inkscape.org›î<IEND®B`‚SOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/table/0000755000000000000000000000000012247657030021660 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/table/dialogs/0000755000000000000000000000000012247657030023302 5ustar rootrootSOGo-2.1.1b/UI/WebServerResources/ckeditor/plugins/table/dialogs/table.js0000644000000000000000000002112412247657030024727 0ustar rootroot/* Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ (function(){function r(a){for(var e=0,l=0,k=0,m,g=a.$.rows.length;kl&&(l=e)}return l}function o(a){return function(){var e=this.getValue(),e=!!(CKEDITOR.dialog.validate.integer()(e)&&0n.getSize("width")?"100%":500:0,getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&& a.updateStyle("width",this.getValue())},setup:function(a){this.setValue(a.getStyle("width"))},commit:k}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles"); a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:k}]},{type:"html",html:" "},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing", this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right", html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0CKEDITOR.env.version)b.getWindow().on("blur",function(){b.$.selection.empty()});b.on("keydown",function(a){var a=a.data,b;switch(a.getKeystroke()){case 27:this.hide();b=1;break;case 9:case CKEDITOR.SHIFT+9:this.changeFocus(1),b=1}b&&a.preventDefault()},this);c.fire("ariaWidget",new CKEDITOR.dom.element(a.frameElement)); b.getWindow().getFrame().removeCustomData("pendingFocus")&&f.focus()}var e=c.lang.clipboard;c.on("pasteDialogCommit",function(a){a.data&&c.fire("paste",{type:"auto",dataValue:a.data})},null,null,1E3);return{title:e.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();this.parts.title.setHtml(this.customTitle||e.title);this.customTitle=null},onLoad:function(){(CKEDITOR.env.ie7Compat|| CKEDITOR.env.ie6Compat)&&"rtl"==c.lang.dir&&this.parts.contents.setStyle("overflow","hidden")},onOk:function(){this.commitContent()},contents:[{id:"general",label:c.lang.common.generalTab,elements:[{type:"html",id:"securityMsg",html:'
    '+e.securityMsg+"
    "},{type:"html",id:"pasteMsg",html:'
    '+e.pasteMsg+"
    "},{type:"html",id:"editing_area",style:"width:100%;height:100%",html:"",focus:function(){var a=this.getInputElement(), b=a.getFrameDocument().getBody();!b||b.isReadOnly()?a.setCustomData("pendingFocus",1):b.focus()},setup:function(){var a=this.getDialog(),b='
    SOGo-2.1.1b/UI/Templates/SOGoACLFrenchModificationAdvisory.wox0000644000000000000000000000214612247657030022531 0ustar rootroot a modifié les droits a modifié vos droits d'accès pour son dossier . SOGo-2.1.1b/UI/Templates/SOGoACLGermanRemovalAdvisory.wox0000644000000000000000000000213212247657030021530 0ustar rootroot Zugangsberechtigung von gelöscht erlaubt Ihnen nicht mehr den Zugang zu seinem Order . SOGo-2.1.1b/UI/Templates/SOGoFolderHungarianAdditionAdvisory.wox0000644000000000000000000000153712247657030023205 0ustar rootroot létrehozásra került A mappa létrehozásra került. SOGo-2.1.1b/UI/Templates/SOGoACLSpanishArgentinaRemovalAdvisory.wox0000644000000000000000000000215212247657030023557 0ustar rootroot El usuario le ha quitado el acceso El usuario le ha quitado de la lista de acceso a su carpeta . SOGo-2.1.1b/UI/Templates/SOGoFolderCzechAdditionAdvisory.wox0000644000000000000000000000152212247657030022317 0ustar rootroot byla vytvoÅ™ena Složka byla vytvoÅ™ena. SOGo-2.1.1b/UI/Templates/SOGoACLDanishRemovalAdvisory.wox0000644000000000000000000000207512247657030021533 0ustar rootroot has removed you has removed you from the access list for his folder. SOGo-2.1.1b/UI/Templates/SOGoFolderArabicRemovalAdvisory.wox0000644000000000000000000000151012247657030022313 0ustar rootroot حذ٠بنجاح The حذ٠المجلد بنجاح. SOGo-2.1.1b/UI/Templates/SOGoFolderArabicAdditionAdvisory.wox0000644000000000000000000000156012247657030022446 0ustar rootroot اÙÙÙ†Ø´ÙØ¦ بنجاح The اÙÙÙ†Ø´ÙØ¦ المجلد بنجاح. SOGo-2.1.1b/UI/Templates/SOGoACLNorwegianBokmalModificationAdvisory.wox0000644000000000000000000000202712247657030024401 0ustar rootroot har endret adgangsrettigheter har endret dine adagangsrettigheter for hans/hennes mappe. SOGo-2.1.1b/UI/Templates/Appointments/0000755000000000000000000000000012247657030016124 5ustar rootrootSOGo-2.1.1b/UI/Templates/Appointments/SOGoAptMailInvitation.wox0000644000000000000000000000424212247657030023011 0ustar rootroot

    -
    -
    SOGo-2.1.1b/UI/Templates/Appointments/SOGoAptMailICalReply.wox0000644000000000000000000000173012247657030022510 0ustar rootroot

    SOGo-2.1.1b/UI/Templates/Appointments/SOGoAptMailUpdate.wox0000644000000000000000000000305112247657030022104 0ustar rootroot

    SOGo-2.1.1b/UI/Templates/Appointments/SOGoAptMailReceipt.wox0000644000000000000000000000537012247657030022263 0ustar rootroot

    SOGo-2.1.1b/UI/Templates/Appointments/SOGoAptMailDeletion.wox0000644000000000000000000000425712247657030022436 0ustar rootroot

    -
    -
    SOGo-2.1.1b/UI/Templates/SOGoACLSpanishArgentinaModificationAdvisory.wox0000644000000000000000000000214312247657030024557 0ustar rootroot El usuario ha modificado los permisos de acceso El usuario ha modifcado los permisos de acceso a su carpeta . SOGo-2.1.1b/UI/Templates/SOGoACLFinnishRemovalAdvisory.wox0000644000000000000000000000206412247657030021721 0ustar rootroot on poistanut sinut on poistanut käyttöoikeutesi kansioon. SOGo-2.1.1b/UI/Templates/SOGoFolderGermanAdditionAdvisory.wox0000644000000000000000000000151412247657030022475 0ustar rootroot wurde erstellt Der Ordner wurde erstellt. SOGo-2.1.1b/UI/Templates/ContactsUI/0000755000000000000000000000000012247657030015457 5ustar rootrootSOGo-2.1.1b/UI/Templates/ContactsUI/UIxContactsUserFolders.wox0000644000000000000000000000143412247657030022602 0ustar rootroot
    SOGo-2.1.1b/UI/Templates/ContactsUI/UIxContactsMailerSelection.wox0000644000000000000000000000136012247657030023422 0ustar rootroot



    SOGo-2.1.1b/UI/Templates/ContactsUI/UIxListEditor.wox0000644000000000000000000000655312247657030020737 0ustar rootroot
      SOGo-2.1.1b/UI/Templates/ContactsUI/UIxContactFoldersView.wox0000644000000000000000000001540612247657030022417 0ustar rootroot
      SOGo-2.1.1b/UI/Templates/ContactsUI/UIxContactView.wox0000644000000000000000000000667112247657030021104 0ustar rootroot

      SOGo-2.1.1b/UI/Templates/ContactsUI/UIxContactsFilterPanel.wox0000644000000000000000000000174012247657030022552 0ustar rootroot
      SOGo-2.1.1b/UI/Templates/ContactsUI/UIxContactEditor.wox0000644000000000000000000003507312247657030021416 0ustar rootroot
      - -
      SOGo-2.1.1b/UI/Templates/ContactsUI/UIxListView.wox0000644000000000000000000000226512247657030020417 0ustar rootroot

      SOGo-2.1.1b/UI/Templates/ContactsUI/UIxContactsUserRightsEditor.wox0000644000000000000000000000444212247657030023615 0ustar rootroot



      SOGo-2.1.1b/UI/Templates/SOGoFolderFinnishAdditionAdvisory.wox0000644000000000000000000000151012247657030022656 0ustar rootroot on luotu The kansio on luotu. SOGo-2.1.1b/UI/Templates/GNUmakefile0000644000000000000000000000240412247657030015515 0ustar rootroot# GNUstep makefile include ../common.make XMLLINT = xmllint XMLLINT-BIN = $(shell which $(XMLLINT)) ifeq ($(XMLLINT-BIN),) all install :: @echo Utility \"$(XMLLINT)\" not found. Skipping validation. else all install :: validate-wox endif WOXS = $(shell find . -name '*.wox' -type f) TEMPLATE_DIRS = $(shell find . -type d | grep -v .svn) validate-wox: @for wox in $(WOXS); \ do $(XMLLINT-BIN) --noout $$wox || exit 1; \ done; @echo "Template files validated" install :: @if [ -L "$(SOGO_TEMPLATESDIR)" ]; then \ echo "$(SOGO_TEMPLATESDIR) is a symbolic link (for development?). Installation skipped."; \ else \ if [ ! -d $(SOGO_TEMPLATESDIR) ]; then mkdir -p $(SOGO_TEMPLATESDIR); fi; \ for dir in $(TEMPLATE_DIRS); do \ if [ ! -d $(SOGO_TEMPLATESDIR)/$$dir ]; then \ echo Creating template directory \"$(SOGO_TEMPLATESDIR)/$$dir\"...; \ mkdir $(SOGO_TEMPLATESDIR)/$$dir; \ fi; \ done; \ echo Installing template files...; \ tar cf - $(WOXS) | ( cd $(SOGO_TEMPLATESDIR); tar xf -) ;\ fi check :: clean :: distclean :: clean uninstall :: @if [ -L "$(SOGO_TEMPLATESDIR)" ]; then \ echo "$(SOGO_TEMPLATESDIR) is a symbolic link (for development?). Uninstallation skipped."; \ else \ rm -rf $(SOGO_TEMPLATESDIR); \ fi SOGo-2.1.1b/UI/Templates/SOGoFolderSlovakAdditionAdvisory.wox0000644000000000000000000000152212247657030022522 0ustar rootroot bola vytvorená Zložka bola vytvorená. SOGo-2.1.1b/UI/Templates/SOGoFolderFinnishRemovalAdvisory.wox0000644000000000000000000000146712247657030022543 0ustar rootroot on poistettu The kansio on poistettu. SOGo-2.1.1b/UI/Templates/SOGoACLNorwegianNynorskModificationAdvisory.wox0000644000000000000000000000202712247657030024637 0ustar rootroot har endret adgangsrettigheter har endret dine adagangsrettigheter for hans/hennes mappe. SOGo-2.1.1b/UI/Templates/SOGoFolderSpanishArgentinaRemovalAdvisory.wox0000644000000000000000000000146712247657030024403 0ustar rootroot Eliminación de La carpeta ha sido eliminada. SOGo-2.1.1b/UI/Templates/SOGoFolderItalianRemovalAdvisory.wox0000644000000000000000000000150412247657030022516 0ustar rootroot è stata cancellata La cartella è stata cancellata. SOGo-2.1.1b/UI/Templates/SOGoACLBrazilianPortugueseAdditionAdvisory.wox0000644000000000000000000000202012247657030024437 0ustar rootroot adicionou você adicionou você na lista de acesso da pasta SOGo-2.1.1b/UI/Templates/SOGoACLNorwegianBokmalRemovalAdvisory.wox0000644000000000000000000000205512247657030023402 0ustar rootroot har tatt deg bort har tatt deg bort fra adgangslisten for hans/hennes mappe. SOGo-2.1.1b/UI/Templates/UIxModuleAccessDenied.wox0000644000000000000000000000114012247657030020304 0ustar rootroot
      SOGo-2.1.1b/UI/Templates/SOGoACLHungarianModificationAdvisory.wox0000644000000000000000000000213412247657030023235 0ustar rootroot megváltoztatta a hozzáférési jogosultságokat. megváltoztatta a hozzáférési jogosultságát a mappára. SOGo-2.1.1b/UI/Templates/SOGoFolderGermanRemovalAdvisory.wox0000644000000000000000000000146312247657030022352 0ustar rootroot wurde entfernt Der Ordner wurde entfernt. SOGo-2.1.1b/UI/Templates/SOGoFolderPolishRemovalAdvisory.wox0000644000000000000000000000146612247657030022402 0ustar rootroot został usunięty Folder został usunięty. SOGo-2.1.1b/UI/Templates/SOGoFolderBrazilianPortugueseRemovalAdvisory.wox0000644000000000000000000000144612247657030025140 0ustar rootroot apagada A pasta foi apagada. SOGo-2.1.1b/UI/Templates/MailerUI/0000755000000000000000000000000012247657030015112 5ustar rootrootSOGo-2.1.1b/UI/Templates/MailerUI/UIxMailUserRightsEditor.wox0000644000000000000000000000632012247657030022351 0ustar rootroot










      SOGo-2.1.1b/UI/Templates/MailerUI/UIxMailEditor.wox0000644000000000000000000001172212247657030020333 0ustar rootroot
      :
      :

      SOGo-2.1.1b/UI/Templates/MailerUI/UIxMailToSelection.wox0000644000000000000000000000416712247657030021342 0ustar rootroot
      SOGo-2.1.1b/UI/Templates/MailerUI/UIxMailFolderMenu.wox0000644000000000000000000000267612247657030021155 0ustar rootroot SOGo-2.1.1b/UI/Templates/MailerUI/UIxMailView.wox0000644000000000000000000001043712247657030020021 0ustar rootroot
      :
      :
      :
      :
      :
      :
      :
      SOGo-2.1.1b/UI/Templates/MailerUI/UIxMailMainFrame.wox0000644000000000000000000003255412247657030020752 0ustar rootroot
      SOGo-2.1.1b/UI/Templates/MailerUI/UIxMailPopupView.wox0000644000000000000000000000265212247657030021045 0ustar rootroot SOGo-2.1.1b/UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox0000644000000000000000000000235712247657030023172 0ustar rootroot
      SOGo-2.1.1b/UI/Templates/MailerUI/UIxMailFilterPanel.wox0000644000000000000000000000230512247657030021307 0ustar rootroot
      SOGo-2.1.1b/UI/Templates/MailerUI/UIxMailWindowCloser.wox0000644000000000000000000000122412247657030021520 0ustar rootroot <var:string label:value="Closing Window ..."/> SOGo-2.1.1b/UI/Templates/MailerUI/UIxMailMoveToPopUp.wox0000644000000000000000000000146412247657030021304 0ustar rootroot SOGo-2.1.1b/UI/Templates/SOGoFolderCatalanRemovalAdvisory.wox0000644000000000000000000000146112247657030022502 0ustar rootroot Eliminació de La carpeta ha estat eliminada. SOGo-2.1.1b/UI/Templates/SOGoACLPolishRemovalAdvisory.wox0000644000000000000000000000207412247657030021562 0ustar rootroot usunÄ…Å‚(ęła) ciÄ™ usunÄ…Å‚(ęła) ciÄ™ z listy dostÄ™pu do jego(jej) foldera . SOGo-2.1.1b/UI/Templates/SOGoFolderCatalanAdditionAdvisory.wox0000644000000000000000000000150612247657030022630 0ustar rootroot Creació de La carpeta ha estat creada. SOGo-2.1.1b/UI/Templates/SOGoACLFrenchRemovalAdvisory.wox0000644000000000000000000000207712247657030021534 0ustar rootroot vous a enlevé vous a enlevé de sa liste de permission pour son dossier . SOGo-2.1.1b/UI/Templates/SOGoACLIcelandicModificationAdvisory.wox0000644000000000000000000000205012247657030023171 0ustar rootroot hefur breytt aðgangsstillingum hefur breytt sínum aðgangsstillingum fyrir möppuna . SOGo-2.1.1b/UI/Templates/SOGoACLUkrainianAdditionAdvisory.wox0000644000000000000000000000247512247657030022400 0ustar rootroot додав Ð’Ð°Ñ Ð´Ð¾Ð´Ð°Ð² Ð’Ð°Ñ Ð´Ð¾ ÑпиÑку доÑтупів до його поштової теки. SOGo-2.1.1b/UI/Templates/UIxWinClose.wox0000644000000000000000000000101512247657030016350 0ustar rootroot SOGo-2.1.1b/UI/Templates/SchedulerUI/0000755000000000000000000000000012247657031015620 5ustar rootrootSOGo-2.1.1b/UI/Templates/SchedulerUI/UIxAppointmentProposal.wox0000644000000000000000000002131712247657030023026 0ustar rootroot
      :
      :
      :
      :
      :

      00 30
      new new
      SOGo-2.1.1b/UI/Templates/SchedulerUI/UIxAttendeesEditor.wox0000644000000000000000000001301512247657030022067 0ustar rootroot
      SOGo-2.1.1b/UI/Templates/SchedulerUI/UIxCalUserRightsEditor.wox0000644000000000000000000000426212247657030022676 0ustar rootroot

      SOGo-2.1.1b/UI/Templates/SchedulerUI/UIxCalDateSelector.wox0000644000000000000000000000303012247657030021776 0ustar rootroot SOGo-2.1.1b/UI/Templates/SchedulerUI/UIxComponentEditor.wox0000644000000000000000000003464312247657031022130 0ustar rootroot