Index: admin/system_presets/simple/email_events_emailevents.php =================================================================== --- admin/system_presets/simple/email_events_emailevents.php (revision 13557) +++ admin/system_presets/simple/email_events_emailevents.php (working copy) @@ -14,45 +14,51 @@ // toolbar buttons $remove_buttons = Array ( -// list of all email templates (direct list) -// 'email_messages_direct_list' => Array ('edit', 'view', 'dbl-click'), +// list of all email templates +// 'email_message_list' => Array ('new_item', 'edit', 'delete', 'approve', 'decline', 'frontend_mail', 'view', 'dbl-click'), -// edit email body direct -// 'email_messages_edit_direct' => Array ('select', 'cancel', 'reset_edit'), +// edit email edit - general tab +// 'email_message_edit' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), + +// edit email edit - settings tab +// 'email_message_edit_settings' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), ); // fields to hide $hidden_fields = Array ( - /*'EventId', 'Event',*/ 'Headers', /*'ReplacementTags', 'Subject', 'Body',*/ - 'MessageType', 'Enabled', 'FrontEndOnly', 'FromUserId', /*'Module', - 'Description', 'Type',*/ + /*'EventId', 'Event', 'ReplacementTags', 'AllowChangingSender', 'CustomSender', + 'SenderName', 'SenderAddressType', 'SenderAddress', 'AllowChangingRecipient', + 'CustomRecipient', 'Recipients', 'Subject', 'Body', 'Headers', 'MessageType', + 'Enabled', 'FrontEndOnly', 'Module', 'Description', 'Type'*/ ); // virtual fields to hide $virtual_hidden_fields = Array ( - + /*'RecipientType', 'RecipientName', 'RecipientAddressType', + 'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/ ); // fields to make required $required_fields = Array ( - 'EventId', 'Event', /*'Headers', 'ReplacementTags',*/ 'Subject', 'Body', - 'MessageType', /*'Enabled', 'FrontEndOnly', 'FromUserId',*/ 'Module', - /*'Description',*/ 'Type', + /*'EventId',*/ 'Event', /*'ReplacementTags', 'AllowChangingSender', 'CustomSender', + 'SenderName', 'SenderAddressType', 'SenderAddress', 'AllowChangingRecipient', + 'CustomRecipient', 'Recipients',*/ 'Subject', 'Body', /*'Headers',*/ 'MessageType', + /*'Enabled', 'FrontEndOnly',*/ 'Module', /*'Description',*/ 'Type' ); // virtual fields to make required $virtual_required_fields = Array ( - + /*'RecipientType', 'RecipientName', 'RecipientAddressType', + 'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/ ); // tabs during editing $hide_edit_tabs = Array ( - + 'Default' => Array (/*'general',*/ 'settings'), ); // hide columns in grids $hide_columns = Array ( -// currently not in user -// 'Default' => Array ('Subject', 'Description', 'Type', ), -// 'Emails' => Array ('EventId', 'Subject', 'Description', 'Type', ), +// 'Default' => Array ('EventId', 'Description', 'Event', 'Module', 'Type', 'Enabled'), +// 'Emails' => Array ('EventId', 'Event', 'Subject', 'Description', 'Type', 'Enabled', 'Module', 'FrontEndOnly'), ); \ No newline at end of file Index: admin/system_presets/simple/email_messages_emailmessages.php =================================================================== --- admin/system_presets/simple/email_messages_emailmessages.php (revision 13557) +++ admin/system_presets/simple/email_messages_emailmessages.php (working copy) @@ -1,56 +1,3 @@ Array ('edit', 'view', 'dbl-click'), - -// edit email body direct -// 'email_messages_edit_direct' => Array ('select', 'cancel', 'reset_edit'), - ); - - // fields to hide - $hidden_fields = Array ( - /*'EmailMessageId', 'Template',*/ 'MessageType', /*'LanguageId', 'EventId', 'Subject' */ - ); - - // virtual fields to hide - $virtual_hidden_fields = Array ( - 'Headers',/* 'Body', 'ReplacementTags', 'Description', 'Module', 'Type', 'MassSubject', 'MassAttachment', - 'MassHtmlMessage', 'MassTextMessage', */ - ); - - // fields to make required - $required_fields = Array ( - /*'EmailMessageId', 'Template', 'MessageType', 'LanguageId', 'EventId', 'Subject' */ - ); - - // virtual fields to make required - $virtual_required_fields = Array ( - /* 'Headers', 'Body', 'ReplacementTags', 'Description', 'Module', 'Type', 'MassSubject', 'MassAttachment', - 'MassHtmlMessage', 'MassTextMessage', */ - ); - - // tabs during editing - $hide_edit_tabs = Array ( - - ); - - // hide columns in grids - $hide_columns = Array ( -// currently not in user -// 'Default' => Array ('Subject', 'Description', 'Type', ), -// 'Emails' => Array ('EventId', 'Subject', 'Description', 'Type', 'LanguageId', ), - ); \ No newline at end of file + // TO REMOVE \ No newline at end of file Index: core/admin_templates/incs/style_template.css =================================================================== --- core/admin_templates/incs/style_template.css (revision 13557) +++ core/admin_templates/incs/style_template.css (working copy) @@ -663,4 +663,21 @@ .tree tr td a.debug-only-item { color: grey; +} + +/* Ajax Dropdown */ +.suggest-box { + border: 1px solid #999; + background-color: #fff; +} + +.suggest-item, .suggest-item-over { + padding: 1px 2px 0px 2px; + font-family: arial,verdana; + font-size: 12px; +} + +.suggest-item-over { + background-color: #3366CC; + color: #fff; } \ No newline at end of file Index: core/admin_templates/languages/email_message_edit.tpl =================================================================== --- core/admin_templates/languages/email_message_edit.tpl (revision 13557) +++ core/admin_templates/languages/email_message_edit.tpl (working copy) @@ -1,7 +1,7 @@ - + @@ -26,8 +26,22 @@ } ) ); + + a_toolbar.AddButton( new ToolBarSeparator('sep1') ); + + + a_toolbar.AddButton( new ToolBarButton('prev', '', function() { + go_to_id('emailevents', ''); + } + ) ); + a_toolbar.AddButton( new ToolBarButton('next', '', function() { + go_to_id('emailevents', ''); + } + ) ); + a_toolbar.Render(); + @@ -38,26 +52,28 @@ -
- + - + + + + + + + + - - - - - - - - - - + + + + + +
Index: core/admin_templates/languages/email_message_list.tpl =================================================================== --- core/admin_templates/languages/email_message_list.tpl (revision 13557) +++ core/admin_templates/languages/email_message_list.tpl (working copy) @@ -1,6 +1,6 @@ - + @@ -14,30 +14,41 @@ a_toolbar = new ToolBar(); - a_toolbar.AddButton( - new ToolBarButton( - 'new_item', - '', - function() { - std_precreate_item('emailevents', 'languages/email_message_edit'); - } - ) - ); + + a_toolbar.AddButton( + new ToolBarButton( + 'new_item', + '', + function() { + std_precreate_item('emailevents', 'languages/email_message_edit'); + } + ) + ); + - a_toolbar.AddButton( new ToolBarButton('edit', '::', edit) ); a_toolbar.AddButton( new ToolBarButton( - 'delete', - '', - function() { - std_delete_items('emailevents'); - } + 'edit', + '::', + edit ) ); - a_toolbar.AddButton( new ToolBarSeparator('sep1') ); + a_toolbar.AddButton( + new ToolBarButton( + 'delete', + '', + function() { + std_delete_items('emailevents'); + } + ) + ); + + a_toolbar.AddButton( new ToolBarSeparator('sep1') ); + + a_toolbar.AddButton( new ToolBarButton( 'approve', @@ -59,12 +70,27 @@ ); + a_toolbar.AddButton( + new ToolBarButton( + 'frontend_mail', + '', + function() { + submit_event('emailevents', 'OnFrontOnly'); + } + ) + ); + a_toolbar.AddButton( new ToolBarSeparator('sep2') ); - a_toolbar.AddButton( new ToolBarButton('view', '', function() { + a_toolbar.AddButton( + new ToolBarButton( + 'view', + '', + function() { show_viewmenu(a_toolbar,'view'); } - ) ); + ) + ); a_toolbar.Render(); @@ -93,6 +119,6 @@ \ No newline at end of file Index: core/admin_templates/languages/email_message_settings.tpl =================================================================== --- core/admin_templates/languages/email_message_settings.tpl (revision 0) +++ core/admin_templates/languages/email_message_settings.tpl (revision 0) @@ -0,0 +1,301 @@ + + + + + + +
+ + + + + + + +
+ +
+ + + + + + + + + + + : "" + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + Index: core/install/english.lang =================================================================== --- core/install/english.lang (revision 13559) +++ core/install/english.lang (working copy) @@ -16,6 +16,7 @@ QXZhaWxhYmxlIEl0ZW1z QmFja2dyb3VuZA== Qm9yZGVycw== + QWRk QnJvd3NlIE1vZGU= Q2FuY2Vs Q2hhbmdl @@ -86,7 +87,6 @@ UGF0aA== Rmlyc3QgTmFtZQ== RnJvbSBFLW1haWw= - RnJvbSAvIFRvIFVzZXI= RnJvbnQtRW5kIE9ubHk= QWxsb3cgUmVnaXN0cmF0aW9u R3JvdXAgTmFtZQ== @@ -307,6 +307,7 @@ RXJyb3IgY29weWluZyBzdWJzZWN0aW9ucw== Q3VzdG9tIGZpZWxkIHdpdGggaWRlbnRpY2FsIG5hbWUgYWxyZWFkeSBleGlzdHM= RmlsZSBpcyB0b28gbGFyZ2U= + Z3JvdXAgbm90IGZvdW5k SW52YWxpZCBGaWxlIEZvcm1hdA== aW52YWxpZCBvcHRpb24= TG9naW4gRmFpbGVk @@ -353,6 +354,8 @@ QWRtaW4gUHJpbWFyeQ== QWR2YW5jZWQgQ1NT QWR2YW5jZWQgU2VhcmNo + QWxsb3cgQ2hhbmdpbmcgIlRvIiBSZWNpcGllbnQ= + QWxsb3cgQ2hhbmdpbmcgU2VuZGVy QWx0IFZhbHVl QXR0YWNobWVudA== QXV0byBDcmVhdGUgRmlsZSBOYW1l @@ -394,6 +397,8 @@ Q1NTIFRlbXBsYXRl Q3Vyc29y Q3VzdG9tIERldGFpbHMgVGVtcGxhdGU= + U2VuZCBFbWFpbCBUbw== + U2VuZCBFbWFpbCBGcm9t DQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KRGV0YWlscyBUZW1wbGF0ZQ== RGF0ZSBGb3JtYXQ= RGVjaW1hbCBQb2ludA== @@ -453,7 +458,6 @@ T25saW5lIEZvcm0gU3VibWl0dGVkIFRlbXBsYXRl U2hvcnQgVVJM RnJvbSBFbWFpbA== - RnJvbSAvIFRvIFVzZXI= RnJvbnQtRW5kIE9ubHk= QWxsb3cgUmVnaXN0cmF0aW9uIG9uIEZyb250LWVuZA== SUQ= @@ -557,12 +561,18 @@ T3JkZXI= UXVhbnRpdHk= UmF0aW5n + UmVjaXBpZW50J3MgQWRkcmVzcw== + UmVjaXBpZW50J3MgQWRkcmVzcyBUeXBl + UmVjaXBpZW50J3MgTmFtZQ== + UmVjaXBpZW50cw== + UmVjaXBpZW50IFR5cGU= Rm9yY2UgUmVkaXJlY3QgKHdoZW4gdXNlcidzIElQIG1hdGNoZXMp UmVmZXJyZXIgVVJM S2V5d29yZA== VHlwZQ== UmVtb3RlIFVSTA== UmVwbGFjZSBEdXBsaWNhdGVz + UmVwbGFjZW1lbnQ= UmVwbGFjZW1lbnQgVGFncw== UmVwbGllZCBPbg== UmVwbHkgQmNj @@ -583,6 +593,8 @@ U3R5bGU= U2VsZWN0b3IgSUQ= U2VsZWN0b3IgTmFtZQ== + U2VuZGVyJ3MgQWRkcmVzcw== + U2VuZGVyJ3MgTmFtZQ== U2VudCBPbg== U2VudA== U2VydmVy @@ -603,6 +615,7 @@ U3VnZ2VzdGVkIENvcnJlY3Rpb24= UG9pbnRzIHRvIFNlY3Rpb24= VGFibGUgTmFtZSBpbiBEYXRhYmFzZSA= + VGFn SXRlbQ== VGVtcGxhdGUgRmlsZQ== VGVtcGxhdGU= @@ -730,7 +743,10 @@ Q291bnRyeQ== Q3JlYXRlZCBPbg== Q3VycmVudCBEb21haW4= + Q3VzdG9tICJUbyIgUmVjaXBpZW50KC1zKQ== + Q3VzdG9tIFNlbmRlcg== ZGF5KHMp + RGVmYXVsdCBXZWJzaXRlIGFkZHJlc3M= RGVueQ== RGVzY3JpcHRpb24= RGlzYWJsZWQ= @@ -744,6 +760,7 @@ RXh0ZXJuYWwgVXJs RmFpbGVk Rmlyc3QgTmFtZQ== + R3JvdXA= R3Vlc3RzIE9ubHk= aG91cihzKQ== SW5oZXJpdCBmcm9tIFBhcmVudA== @@ -960,7 +977,11 @@ U2VjdGlvbiBQcm9wZXJ0aWVz UHJvcGVydGllcw== UXVpY2sgTGlua3M= + UmVjaXBpZW50cyBJbmZvcm1hdGlvbg== UmVsYXRpb24= + UmVwbGFjZW1lbnQgVGFncw== + U2VuZGVyIEluZm9ybWF0aW9u + U2V0dGluZ3M= QWRtaW4gQ29uc29sZSBTZXR0aW5ncw== Q1NWIEV4cG9ydCBTZXR0aW5ncw== TWFpbGluZyBTZXR0aW5ncw== @@ -1054,6 +1075,7 @@ U3lzdGVtIFRvb2xz U2Vzc2lvbiBMb2c= U2Vzc2lvbiBMb2c= + U2V0dGluZ3M= U2hvdyBBbGw= U2hvdyBTdHJ1Y3R1cmU= V2Vic2l0ZSAmIENvbnRlbnQ= @@ -1237,6 +1259,7 @@ TWVzc2FnZXM= TW9kdWxlcw== TmV3IEFnZW50 + TmV3IEVtYWlsIEV2ZW50 TmV3IEZpbGU= TmV3IFJlcGx5 TmV3IFRoZW1l Index: core/install/install_data.sql =================================================================== --- core/install/install_data.sql (revision 13557) +++ core/install/install_data.sql (working copy) @@ -133,41 +133,41 @@ INSERT INTO ItemTypes VALUES (1, 'In-Portal', 'c', 'Category', 'Name', 'CreatedById', NULL, NULL, 'la_ItemTab_Categories', 1, 'admin/category/addcategory.php', 'clsCategory', 'Category'); INSERT INTO ItemTypes VALUES (6, 'In-Portal', 'u', 'PortalUser', 'Login', 'PortalUserId', NULL, NULL, '', 0, '', 'clsPortalUser', 'User'); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.ADD', NULL, 1, 0, NULL, 'Core:Users', 'Add User', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.ADD', NULL, 1, 1, NULL, 'Core:Users', 'Add User', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.APPROVE', NULL, 1, 0, NULL, 'Core:Users', 'Approve User', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.APPROVE', NULL, 1, 1, NULL, 'Core:Users', 'Approve User', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.VALIDATE', NULL, 1, 0, NULL, 'Core:Users', 'Validate User', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.VALIDATE', NULL, 1, 1, NULL, 'Core:Users', 'Validate User', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.DENY', NULL, 1, 0, NULL, 'Core:Users', 'Deny User', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.DENY', NULL, 1, 1, NULL, 'Core:Users', 'Deny User', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.PSWD', NULL, 1, 1, NULL, 'Core:Users', 'Forgot Password', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.PSWD', NULL, 1, 0, NULL, 'Core:Users', 'Forgot Password', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.ADD.PENDING', NULL, 1, 0, NULL, 'Core:Users', 'Add Pending User', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.ADD.PENDING', NULL, 1, 1, NULL, 'Core:Users', 'Add Pending User', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'CATEGORY.ADD', NULL, 1, 0, NULL, 'Core:Category', 'Add Category', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'CATEGORY.ADD.PENDING', NULL, 1, 0, NULL, 'Core:Category', 'Add Pending Category', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'CATEGORY.ADD.PENDING', NULL, 1, 1, NULL, 'Core:Category', 'Add Pending Category', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'CATEGORY.ADD', NULL, 1, 1, NULL, 'Core:Category', 'Add Category', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'CATEGORY.APPROVE', NULL, 1, 0, NULL, 'Core:Category', 'Approve Category', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'CATEGORY.DENY', NULL, 1, 0, NULL, 'Core:Category', 'Deny Category', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.SUBSCRIBE', NULL, 1, 0, NULL, 'Core:Users', 'User subscribed', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.SUBSCRIBE', NULL, 1, 1, NULL, 'Core:Users', 'User subscribed', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.UNSUBSCRIBE', NULL, 1, 0, NULL, 'Core:Users', 'User unsubscribed', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.UNSUBSCRIBE', NULL, 1, 1, NULL, 'Core:Users', 'User unsubscribed', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.SUGGEST', NULL, 1, 0, NULL, 'Core:Users', 'Suggest to a friend', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.SUGGEST', NULL, 1, 1, NULL, 'Core:Users', 'Suggest to a friend', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.PSWDC', NULL, 1, 0, NULL, 'Core:Users', 'Password Confirmation', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.MEMBERSHIP.EXPIRED', NULL, 1, 0, NULL, 'Core:Users', 'Membership expired', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.MEMBERSHIP.EXPIRED', NULL, 1, 0, NULL, 'Core:Users', 'Membership expired', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.MEMBERSHIP.EXPIRATION.NOTICE', NULL, 1, 0, NULL, 'Core:Users', 'Membership expiration notice', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'USER.MEMBERSHIP.EXPIRATION.NOTICE', NULL, 1, 0, NULL, 'Core:Users', 'Membership expiration notice', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'COMMON.FOOTER', NULL, 1, 0, NULL, 'Core', 'Common Footer Template', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'FORM.SUBMITTED', NULL, 1, 0, NULL, 'Core:Category', 'This e-mail is sent to a user after filling in the Contact Us form', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'FORM.SUBMITTED', NULL, 1, 0, NULL, 'Core:Category', 'This e-mail is sent to a user after filling in the Contact Us form', 0); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'FORM.SUBMISSION.REPLY.TO.USER', NULL, 1, 0, NULL, 'Core:Category', 'Admin Reply to User Form Submission', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'FORM.SUBMISSION.REPLY.FROM.USER', NULL, 1, 0, NULL, 'Core:Category', 'User Replied to It\'s Form Submission', 1); -INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, FromUserId, Module, Description, Type) VALUES(DEFAULT, 'FORM.SUBMISSION.REPLY.FROM.USER.BOUNCED', NULL, 1, 0, NULL, 'Core:Category', 'Form Submission Admin Reply Delivery Failure', 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.ADD', NULL, 1, 0, 'Core', 'Add User', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.ADD', NULL, 1, 1, 'Core', 'Add User', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.APPROVE', NULL, 1, 0, 'Core', 'Approve User', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.APPROVE', NULL, 1, 1, 'Core', 'Approve User', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.VALIDATE', NULL, 1, 0, 'Core', 'Validate User', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.VALIDATE', NULL, 1, 1, 'Core', 'Validate User', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.DENY', NULL, 1, 0, 'Core', 'Deny User', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.DENY', NULL, 1, 1, 'Core', 'Deny User', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.PSWD', NULL, 1, 1, 'Core', 'Forgot Password', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.PSWD', NULL, 1, 0, 'Core', 'Forgot Password', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.ADD.PENDING', NULL, 1, 0, 'Core', 'Add Pending User', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.ADD.PENDING', NULL, 1, 1, 'Core', 'Add Pending User', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'CATEGORY.ADD', NULL, 1, 0, 'Core', 'Add Category', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'CATEGORY.ADD.PENDING', NULL, 1, 0, 'Core', 'Add Pending Category', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'CATEGORY.ADD.PENDING', NULL, 1, 1, 'Core', 'Add Pending Category', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'CATEGORY.ADD', NULL, 1, 1, 'Core', 'Add Category', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'CATEGORY.APPROVE', NULL, 1, 0, 'Core', 'Approve Category', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'CATEGORY.DENY', NULL, 1, 0, 'Core', 'Deny Category', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.SUBSCRIBE', NULL, 1, 0, 'Core', 'User subscribed', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.SUBSCRIBE', NULL, 1, 1, 'Core', 'User subscribed', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.UNSUBSCRIBE', NULL, 1, 0, 'Core', 'User unsubscribed', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.UNSUBSCRIBE', NULL, 1, 1, 'Core', 'User unsubscribed', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.SUGGEST', NULL, 1, 0, 'Core', 'Suggest to a friend', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.SUGGEST', NULL, 1, 1, 'Core', 'Suggest to a friend', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.PSWDC', NULL, 1, 0, 'Core', 'Password Confirmation', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.MEMBERSHIP.EXPIRED', NULL, 1, 0, 'Core', 'Membership expired', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.MEMBERSHIP.EXPIRED', NULL, 1, 0, 'Core', 'Membership expired', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.MEMBERSHIP.EXPIRATION.NOTICE', NULL, 1, 0, 'Core', 'Membership expiration notice', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.MEMBERSHIP.EXPIRATION.NOTICE', NULL, 1, 0, 'Core', 'Membership expiration notice', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'COMMON.FOOTER', NULL, 1, 0, 'Core', 'Common Footer Template', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'FORM.SUBMITTED', NULL, 1, 0, 'Core', 'This e-mail is sent to a user after filling in the Contact Us form', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'FORM.SUBMITTED', NULL, 1, 0, 'Core', 'This e-mail is sent to a user after filling in the Contact Us form', 0, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'FORM.SUBMISSION.REPLY.TO.USER', NULL, 1, 0, 'Core', 'Admin Reply to User Form Submission', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'FORM.SUBMISSION.REPLY.FROM.USER', NULL, 1, 0, 'Core', 'User Replied to It\'s Form Submission', 1, 1, 1); +INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'FORM.SUBMISSION.REPLY.FROM.USER.BOUNCED', NULL, 1, 0, 'Core', 'Form Submission Admin Reply Delivery Failure', 1, 1, 1); INSERT INTO IdGenerator VALUES ('100'); @@ -570,8 +570,6 @@ INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_categories.edit', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_search.view', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_search.edit', 11, 1, 1, 0); -INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_email.view', 11, 1, 1, 0); -INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_email.edit', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_custom.view', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_custom.add', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_custom.edit', 11, 1, 1, 0); @@ -588,8 +586,6 @@ INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_groups.advanced:manage_permissions', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_users.view', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_users.edit', 11, 1, 1, 0); -INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_email.view', 11, 1, 1, 0); -INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_email.edit', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_custom.view', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_custom.add', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_custom.edit', 11, 1, 1, 0); @@ -678,7 +674,7 @@ INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:skins.edit', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:skins.delete', 11, 1, 1, 0); -INSERT INTO Skins VALUES(DEFAULT, 'Default', '/* General elements */\r\n\r\nhtml {\r\n height: 100%;\r\n}\r\n\r\nbody {\r\n font-family: verdana,arial,helvetica,sans-serif;\r\n color: #000000;\r\n overflow-x: auto; overflow-y: auto;\r\n margin: 0px 0px 0px 0px;\r\n text-decoration: none;\r\n}\r\n\r\nbody, td {\r\n /* fix for Firefox, when font-size was not inherited in table cells */\r\n font-size: 9pt;\r\n}\r\n\r\na {\r\n color: #006699;\r\n text-decoration: none;\r\n}\r\n\r\na:hover {\r\n color: #009ff0;\r\n text-decoration: none;\r\n}\r\n\r\nform {\r\n display: inline;\r\n}\r\n\r\nimg { border: 0px; }\r\n\r\nbody.height-100 {\r\n height: 100%;\r\n}\r\n\r\nbody.regular-body {\r\n margin: 0px 10px 5px 10px;\r\n color: #000000;\r\n background-color: @@SectionBgColor@@;\r\n}\r\n\r\nbody.edit-popup {\r\n margin: 0px 0px 0px 0px;\r\n}\r\n\r\ntable.collapsed {\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered, table.bordered, .bordered-no-bottom {\r\n border: 1px solid #000000;\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered-no-bottom {\r\n border-bottom: none;\r\n}\r\n\r\n.login-table td {\r\n padding: 1px;\r\n}\r\n\r\n.disabled {\r\n background-color: #ebebeb;\r\n}\r\n\r\n/* Head frame */\r\ntable.head-table {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/right_background.png'') top right @@HeadBgColor@@ no-repeat;\r\n}\r\n\r\n.head-table tr td, .head-table tr td a {\r\n color: @@HeadColor@@\r\n}\r\n\r\ndiv#extra_toolbar td.button-active {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_button_background.gif'') bottom left repeat-x;\r\n height: 22px;\r\n}\r\n\r\ndiv#extra_toolbar td.button-active a {\r\n color: black;\r\n text-decoration: none;\r\n}\r\n\r\ntd.kx-block-header, .head-table tr td.kx-block-header{\r\n color: @@HeadBarColor@@;\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_background.gif'') repeat-x top left;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n padding-left: 7px;\r\n padding-right: 7px;\r\n}\r\n\r\na.kx-header-link {\r\n text-decoration: underline;\r\n font-weight: bold;\r\n color: #0080C8;\r\n}\r\n\r\na.kx-header-link:hover {\r\n color: #FFCB05;\r\n text-decoration: none;\r\n}\r\n\r\n.kx-secondary-foreground {\r\n color: #FFFFFF;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n}\r\n\r\n.kx-login-button {\r\n background-color: #2D79D6;\r\n color: #FFFFFF;\r\n}\r\n\r\n/* General form button (yellow) */\r\n.button {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #000000;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Disabled (grayed-out) form button */\r\n.button-disabled {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #676767;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back_disabled.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Tabs bar */\r\n\r\n.tab, .tab-active {\r\n background-color: #F0F1EB;\r\n padding: 3px 7px 2px 7px;\r\n border-top: 1px solid black;\r\n border-left: 1px solid black;\r\n border-right: 1px solid black;\r\n margin-left: 3px !important;\r\n white-space: nowrap;\r\n}\r\n\r\n.tab-active {\r\n background-color: #4487D9;\r\n}\r\n\r\n.tab a {\r\n color: #4487D9;\r\n font-weight: bold;\r\n}\r\n\r\n.tab-active a {\r\n color: #FFFFFF;\r\n font-weight: bold;\r\n}\r\n\r\na.scroll-left, a.scroll-right {\r\n cursor: pointer;\r\n display: block;\r\n float: left;\r\n height: 18px;\r\n margin: 0px 1px;\r\n width: 18px;\r\n}\r\n\r\na.scroll-left {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/left.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.scroll-right {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/right.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.disabled {\r\n visibility: hidden !important;\r\n}\r\n\r\na.scroll-left:hover, a.scroll-right:hover {\r\n background-position: 0 -18px;\r\n}\r\n\r\ntd.scroll-right-container {\r\n width: 20px;\r\n}\r\n\r\ntd.scroll-right-container.disabled, td.scroll-right-container.disabled * {\r\n width: 0px;\r\n margin: 0px;\r\n}\r\n\r\ntd.scroll-right-container.disabled br {\r\n display: none;\r\n}\r\n\r\n/* Toolbar */\r\n\r\n.toolbar {\r\n font-size: 8pt;\r\n border: 1px solid #000000;\r\n border-width: 0px 1px 1px 1px;\r\n background-color: @@ToolbarBgColor@@;\r\n border-collapse: collapse;\r\n}\r\n\r\n.toolbar td {\r\n height: 100%;\r\n}\r\n\r\n.toolbar-button, .toolbar-button-disabled, .toolbar-button-over {\r\n float: left;\r\n text-align: center;\r\n font-size: 8pt;\r\n padding: 5px 5px 5px 5px;\r\n vertical-align: middle;\r\n color: #006F99;\r\n}\r\n\r\n.toolbar-button-over {\r\n color: #000;\r\n}\r\n\r\n.toolbar-button-disabled {\r\n color: #444;\r\n}\r\n\r\n/* Scrollable Grids */\r\n\r\n\r\n.layout-only-table td {\r\n border: none !important;\r\n}\r\n\r\n/* Main Grid class */\r\n.grid-scrollable {\r\n padding: 0px;\r\n border: 1px solid black !important;\r\n border-top: none !important;\r\n}\r\n\r\n/* Div generated by js, which contains all the scrollable grid elements, affects the style of scrollable area without data (if there are too few rows) */\r\n.grid-container {\r\n background-color: #fff;\r\n}\r\n\r\n.grid-container table {\r\n border-collapse: collapse;\r\n}\r\n\r\n/* Inner div generated in each data-cell */\r\n.grid-cell-div {\r\n overflow: hidden;\r\n height: auto;\r\n}\r\n\r\n/* Main row definition */\r\n.grid-data-row td, .grid-data-row-selected td, .grid-data-row-even-selected td, .grid-data-row-mouseover td, .table-color1, .table-color2 {\r\n font-weight: normal;\r\n color: @@OddColor@@;\r\n background-color: @@OddBgColor@@;\r\n padding: 3px 5px 3px 5px;\r\n overflow: hidden;\r\n border-right: 1px solid #c9c9c9;\r\n}\r\n.grid-data-row-even td, .table-color2 {\r\n background-color: @@EvenBgColor@@;\r\n color: @@EvenColor@@;\r\n}\r\n.grid-data-row td a, .grid-data-row-selected td a, .grid-data-row-mouseover td a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* mouse-over rows */\r\n.grid-data-row-mouseover td, table tr.grid-data-row[_row_highlighted] td {\r\n background: #FFFDF4;\r\n}\r\n\r\n/* Selected row, applies to both checkbox and data areas */\r\n.grid-data-row-selected td, table tr.grid-data-row[_row_selected] td {\r\n background: #FEF2D6;\r\n}\r\n\r\n.grid-data-row-even-selected td, .grid-data-row-even[_row_selected] td {\r\n background: #FFF7E0;\r\n}\r\n\r\n/* General header cell definition */\r\n.grid-header-row td {\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n text-decoration: none;\r\n padding: 3px 5px 3px 5px;\r\n color: @@ColumnTitlesColor@@;\r\n border-right: none;\r\n text-align: left;\r\n vertical-align: middle !important;\r\n white-space: nowrap;\r\n border-right: 1px solid #777;\r\n}\r\n\r\n/* Filters row */\r\ntr.grid-header-row-1 td {\r\n background-color: @@FiltersBgColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n/* Grid Filters */\r\ntable.range-filter {\r\n width: 100%;\r\n}\r\n\r\n.range-filter td {\r\n padding: 0px 0px 2px 2px !important;\r\n border: none !important;\r\n font-size: 8pt !important;\r\n font-weight: normal !important;\r\n text-align: left;\r\n color: #000000 !important;\r\n}\r\n\r\ninput.filter, select.filter, input.filter-active, select.filter-active {\r\n margin-bottom: 0px;\r\n border: 1px solid #aaa;\r\n}\r\n\r\ninput.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\nselect.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\n/* Column titles row */\r\ntr.grid-header-row-0 td {\r\n height: 25px;\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n color: @@ColumnTitlesColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\ntr.grid-header-row-0 td a {\r\n color: @@ColumnTitlesColor@@;\r\n}\r\n\r\ntr.grid-header-row-0 td a:hover {\r\n color: #FFCC00;\r\n}\r\n\r\n\r\n.grid-footer-row td {\r\n background-color: #D7D7D7;\r\n font-weight: bold;\r\n border-right: 1px solid #C9C9C9;\r\n padding: 3px 5px 3px 5px;\r\n}\r\n\r\ntd.grid-header-last-cell, td.grid-data-last-cell, td.grid-footer-last-cell {\r\n border-right: none !important;\r\n}\r\n\r\ntd.grid-data-col-0, td.grid-data-col-0 div {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 div {\r\n display: table-cell;\r\n vertical-align: middle;\r\n}\r\n\r\n.grid-status-bar {\r\n border: 1px solid black;\r\n border-top: none;\r\n padding: 0px;\r\n width: 100%;\r\n border-collapse: collapse;\r\n height: 30px;\r\n}\r\n\r\n.grid-status-bar td {\r\n background-color: @@TitleBarBgColor@@;\r\n color: @@TitleBarColor@@;\r\n font-size: 11pt;\r\n font-weight: normal;\r\n padding: 2px 8px 2px 8px;\r\n}\r\n\r\n/* /Scrollable Grids */\r\n\r\n\r\n/* Forms */\r\ntable.edit-form {\r\n border: none;\r\n border-top-width: 0px;\r\n border-collapse: collapse;\r\n width: 100%;\r\n}\r\n\r\n.edit-form-odd, .edit-form-even {\r\n padding: 0px;\r\n}\r\n\r\n.subsectiontitle {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #4A92CE;\r\n color: #fff;\r\n height: 25px;\r\n border-top: 1px solid black;\r\n vertical-align: middle;\r\n}\r\n\r\n.subsectiontitle td {\r\n vertical-align: middle;\r\n /*padding: 3px 5px 3px 5px;*/\r\n padding: 1px 5px;\r\n}\r\n\r\n.label-cell {\r\n background: #DEE7F6 url(''@@base_url@@/core/admin_templates/img/bgr_input_name_line.gif'') no-repeat right bottom;\r\n font: 12px arial, sans-serif;\r\n padding: 4px 20px;\r\n width: 160px;\r\n}\r\n\r\n.control-mid {\r\n width: 13px;\r\n border-left: 1px solid #7A95C2;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_mid.gif'') repeat-x left bottom;\r\n}\r\n\r\n.control-cell {\r\n font: 11px arial, sans-serif;\r\n padding: 4px 10px 5px 5px;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_input_line.gif'') no-repeat left bottom;\r\n width: auto;\r\n vertical-align: middle;\r\n}\r\n\r\n.label-cell-filler {\r\n background: #DEE7F6 none;\r\n}\r\n.control-mid-filler {\r\n background: #fff none;\r\n border-left: 1px solid #7A95C2;\r\n}\r\n.control-cell-filler {\r\n background: #fff none;\r\n}\r\n\r\n.error {\r\n color: red;\r\n}\r\n.error-cell {\r\n color: red;\r\n}\r\n\r\n.field-required {\r\n color: red;\r\n}\r\n\r\n.warning-table {\r\n background-color: #F0F1EB;\r\n border: 1px solid #000000;\r\n border-collapse: collapse;\r\n border-top-width: 0px;\r\n}\r\n\r\n.form-warning {\r\n color: red;\r\n font-size: 11px;\r\n}\r\n\r\n.priority {\r\n color: red;\r\n padding-left: 1px;\r\n padding-right: 1px;\r\n font-size: 11px;\r\n}\r\n\r\n.small-statistics {\r\n font-size: 11px;\r\n color: #707070;\r\n}\r\n\r\n.req-note {\r\n font-style: italic;\r\n color: #333;\r\n}\r\n\r\n#scroll_container table.tableborder {\r\n border-collapse: separate\r\n}\r\n\r\n\r\n/* Uploader */\r\n\r\n.uploader-main {\r\n position: absolute;\r\n display: none;\r\n z-index: 10;\r\n border: 1px solid #777;\r\n padding: 10px;\r\n width: 350px;\r\n height: 120px;\r\n overflow: hidden;\r\n background-color: #fff;\r\n}\r\n\r\n.uploader-percent {\r\n width: 100%;\r\n padding-top: 3px;\r\n text-align: center;\r\n position: relative;\r\n z-index: 20;\r\n float: left;\r\n font-weight: bold;\r\n}\r\n\r\n.uploader-left {\r\n width: 100%;\r\n border: 1px solid black;\r\n height: 20px;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/progress_left.gif'');\r\n}\r\n\r\n.uploader-done {\r\n width: 0%;\r\n background-color: green;\r\n height: 20px;\r\n background: #4A92CE url(''@@base_url@@/core/admin_templates/img/progress_done.gif'');\r\n}\r\n\r\n\r\n/* To be sorted */\r\nspan#category_path, span#category_path a {\r\n color: #FFFFFF;\r\n}\r\n\r\nspan#category_path a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* Section title, right to the big icon */\r\n.admintitle {\r\n font-size: 16pt;\r\n font-weight: bold;\r\n color: @@SectionColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Left side of bluebar */\r\n.header_left_bg {\r\n background-color: @@TitleBarBgColor@@;\r\n background-image: none;\r\n padding-left: 5px;\r\n}\r\n\r\n/* Right side of bluebar */\r\n.tablenav, tablenav a {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n\r\n text-decoration: none;\r\n background-color: @@TitleBarBgColor@@;\r\n background-image: none;\r\n}\r\n\r\n/* Section title in the bluebar * -- why ''link''? :S */\r\n.tablenav_link {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Active page in top and bottom bluebars pagination */\r\n.current_page {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #fff;\r\n color: #2D79D6;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Other pages and arrows in pagination on blue */\r\n.nav_url {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n color: #fff;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Tree */\r\n.tree-body {\r\n background-color: @@TreeBgColor@@;\r\n height: 100%\r\n}\r\n\r\n.tree_head.td, .tree_head, .tree_head:hover {\r\n font-weight: bold;\r\n font-size: 10px;\r\n color: #FFFFFF;\r\n font-family: Verdana, Arial;\r\n text-decoration: none;\r\n}\r\n\r\n.tree {\r\n padding: 0px;\r\n border: none;\r\n border-collapse: collapse;\r\n}\r\n\r\n.tree tr td {\r\n padding: 0px;\r\n margin: 0px;\r\n font-family: helvetica, arial, verdana,;\r\n font-size: 11px;\r\n white-space: nowrap;\r\n}\r\n\r\n.tree tr td a {\r\n font-size: 11px;\r\n color: @@TreeColor@@;\r\n font-family: Helvetica, Arial, Verdana;\r\n text-decoration: none;\r\n padding: 2px;\r\n}\r\n\r\n.tree tr td a:hover, .tree tr td a.debug-only-item:hover {\r\n color: @@TreeHoverColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a, .tree tr.highlighted td a.debug-only-item {\r\n color: @@TreeHighColor@@;\r\n background-color: @@TreeHighBgColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a:hover {\r\n color: @@TreeHighHoverColor@@;\r\n}\r\n\r\n.tree tr td a.debug-only-item {\r\n color: grey;\r\n}', 'in-portal_logo_img.jpg', 'in-portal_logo_img2.jpg', 'in-portal_logo_login.gif', 'a:22:{s:11:"HeadBgColor";a:2:{s:11:"Description";s:27:"Head frame background color";s:5:"Value";s:7:"#007BF4";}s:9:"HeadColor";a:2:{s:11:"Description";s:21:"Head frame text color";s:5:"Value";s:7:"#FFFFFF";}s:14:"SectionBgColor";a:2:{s:11:"Description";s:28:"Section bar background color";s:5:"Value";s:7:"#FFFFFF";}s:12:"SectionColor";a:2:{s:11:"Description";s:22:"Section bar text color";s:5:"Value";s:7:"#2D79D6";}s:12:"HeadBarColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"HeadBarBgColor";a:1:{s:5:"Value";s:7:"#1961B8";}s:13:"TitleBarColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TitleBarBgColor";a:1:{s:5:"Value";s:7:"#2D79D6";}s:14:"ToolbarBgColor";a:1:{s:5:"Value";s:7:"#F0F1EB";}s:14:"FiltersBgColor";a:1:{s:5:"Value";s:7:"#D7D7D7";}s:17:"ColumnTitlesColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:19:"ColumnTitlesBgColor";a:1:{s:5:"Value";s:7:"#999999";}s:8:"OddColor";a:1:{s:5:"Value";s:7:"#000000";}s:10:"OddBgColor";a:1:{s:5:"Value";s:7:"#F6F6F6";}s:9:"EvenColor";a:1:{s:5:"Value";s:7:"#000000";}s:11:"EvenBgColor";a:1:{s:5:"Value";s:7:"#EBEBEB";}s:9:"TreeColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"TreeHoverColor";a:1:{s:5:"Value";s:7:"#009FF0";}s:13:"TreeHighColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:18:"TreeHighHoverColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TreeHighBgColor";a:1:{s:5:"Value";s:7:"#4A92CE";}s:11:"TreeBgColor";a:1:{s:5:"Value";s:7:"#DCECF6";}}', 1272217243, 1); +INSERT INTO Skins VALUES(DEFAULT, 'Default', '/* General elements */\r\n\r\nhtml {\r\n height: 100%;\r\n}\r\n\r\nbody {\r\n font-family: verdana,arial,helvetica,sans-serif;\r\n color: #000000;\r\n overflow-x: auto; overflow-y: auto;\r\n margin: 0px 0px 0px 0px;\r\n text-decoration: none;\r\n}\r\n\r\nbody, td {\r\n /* fix for Firefox, when font-size was not inherited in table cells */\r\n font-size: 9pt;\r\n}\r\n\r\na {\r\n color: #006699;\r\n text-decoration: none;\r\n}\r\n\r\na:hover {\r\n color: #009ff0;\r\n text-decoration: none;\r\n}\r\n\r\nform {\r\n display: inline;\r\n}\r\n\r\nimg { border: 0px; }\r\n\r\nbody.height-100 {\r\n height: 100%;\r\n}\r\n\r\nbody.regular-body {\r\n margin: 0px 10px 5px 10px;\r\n color: #000000;\r\n background-color: @@SectionBgColor@@;\r\n}\r\n\r\nbody.edit-popup {\r\n margin: 0px 0px 0px 0px;\r\n}\r\n\r\ntable.collapsed {\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered, table.bordered, .bordered-no-bottom {\r\n border: 1px solid #000000;\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered-no-bottom {\r\n border-bottom: none;\r\n}\r\n\r\n.login-table td {\r\n padding: 1px;\r\n}\r\n\r\n.disabled {\r\n background-color: #ebebeb;\r\n}\r\n\r\n/* Head frame */\r\ntable.head-table {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/right_background.png'') top right @@HeadBgColor@@ no-repeat;\r\n}\r\n\r\n.head-table tr td, .head-table tr td a {\r\n color: @@HeadColor@@\r\n}\r\n\r\ndiv#extra_toolbar td.button-active {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_button_background.gif'') bottom left repeat-x;\r\n height: 22px;\r\n}\r\n\r\ndiv#extra_toolbar td.button-active a {\r\n color: black;\r\n text-decoration: none;\r\n}\r\n\r\ntd.kx-block-header, .head-table tr td.kx-block-header{\r\n color: @@HeadBarColor@@;\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_background.gif'') repeat-x top left;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n padding-left: 7px;\r\n padding-right: 7px;\r\n}\r\n\r\na.kx-header-link {\r\n text-decoration: underline;\r\n font-weight: bold;\r\n color: #0080C8;\r\n}\r\n\r\na.kx-header-link:hover {\r\n color: #FFCB05;\r\n text-decoration: none;\r\n}\r\n\r\n.kx-secondary-foreground {\r\n color: #FFFFFF;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n}\r\n\r\n.kx-login-button {\r\n background-color: #2D79D6;\r\n color: #FFFFFF;\r\n}\r\n\r\n/* General form button (yellow) */\r\n.button {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #000000;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Disabled (grayed-out) form button */\r\n.button-disabled {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #676767;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back_disabled.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Tabs bar */\r\n\r\n.tab, .tab-active {\r\n background-color: #F0F1EB;\r\n padding: 3px 7px 2px 7px;\r\n border-top: 1px solid black;\r\n border-left: 1px solid black;\r\n border-right: 1px solid black;\r\n margin-left: 3px !important;\r\n white-space: nowrap;\r\n}\r\n\r\n.tab-active {\r\n background-color: #4487D9;\r\n}\r\n\r\n.tab a {\r\n color: #4487D9;\r\n font-weight: bold;\r\n}\r\n\r\n.tab-active a {\r\n color: #FFFFFF;\r\n font-weight: bold;\r\n}\r\n\r\na.scroll-left, a.scroll-right {\r\n cursor: pointer;\r\n display: block;\r\n float: left;\r\n height: 18px;\r\n margin: 0px 1px;\r\n width: 18px;\r\n}\r\n\r\na.scroll-left {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/left.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.scroll-right {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/right.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.disabled {\r\n visibility: hidden !important;\r\n}\r\n\r\na.scroll-left:hover, a.scroll-right:hover {\r\n background-position: 0 -18px;\r\n}\r\n\r\ntd.scroll-right-container {\r\n width: 20px;\r\n}\r\n\r\ntd.scroll-right-container.disabled, td.scroll-right-container.disabled * {\r\n width: 0px;\r\n margin: 0px;\r\n}\r\n\r\ntd.scroll-right-container.disabled br {\r\n display: none;\r\n}\r\n\r\n/* Toolbar */\r\n\r\n.toolbar {\r\n font-size: 8pt;\r\n border: 1px solid #000000;\r\n border-width: 0px 1px 1px 1px;\r\n background-color: @@ToolbarBgColor@@;\r\n border-collapse: collapse;\r\n}\r\n\r\n.toolbar td {\r\n height: 100%;\r\n}\r\n\r\n.toolbar-button, .toolbar-button-disabled, .toolbar-button-over {\r\n float: left;\r\n text-align: center;\r\n font-size: 8pt;\r\n padding: 5px 5px 5px 5px;\r\n vertical-align: middle;\r\n color: #006F99;\r\n}\r\n\r\n.toolbar-button-over {\r\n color: #000;\r\n}\r\n\r\n.toolbar-button-disabled {\r\n color: #444;\r\n}\r\n\r\n/* Scrollable Grids */\r\n\r\n\r\n.layout-only-table td {\r\n border: none !important;\r\n}\r\n\r\n/* Main Grid class */\r\n.grid-scrollable {\r\n padding: 0px;\r\n border: 1px solid black !important;\r\n border-top: none !important;\r\n}\r\n\r\n/* Div generated by js, which contains all the scrollable grid elements, affects the style of scrollable area without data (if there are too few rows) */\r\n.grid-container {\r\n background-color: #fff;\r\n}\r\n\r\n.grid-container table {\r\n border-collapse: collapse;\r\n}\r\n\r\n/* Inner div generated in each data-cell */\r\n.grid-cell-div {\r\n overflow: hidden;\r\n height: auto;\r\n}\r\n\r\n/* Main row definition */\r\n.grid-data-row td, .grid-data-row-selected td, .grid-data-row-even-selected td, .grid-data-row-mouseover td, .table-color1, .table-color2 {\r\n font-weight: normal;\r\n color: @@OddColor@@;\r\n background-color: @@OddBgColor@@;\r\n padding: 3px 5px 3px 5px;\r\n overflow: hidden;\r\n border-right: 1px solid #c9c9c9;\r\n}\r\n.grid-data-row-even td, .table-color2 {\r\n background-color: @@EvenBgColor@@;\r\n color: @@EvenColor@@;\r\n}\r\n.grid-data-row td a, .grid-data-row-selected td a, .grid-data-row-mouseover td a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* mouse-over rows */\r\n.grid-data-row-mouseover td, table tr.grid-data-row[_row_highlighted] td {\r\n background: #FFFDF4;\r\n}\r\n\r\n/* Selected row, applies to both checkbox and data areas */\r\n.grid-data-row-selected td, table tr.grid-data-row[_row_selected] td {\r\n background: #FEF2D6;\r\n}\r\n\r\n.grid-data-row-even-selected td, .grid-data-row-even[_row_selected] td {\r\n background: #FFF7E0;\r\n}\r\n\r\n/* General header cell definition */\r\n.grid-header-row td {\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n text-decoration: none;\r\n padding: 3px 5px 3px 5px;\r\n color: @@ColumnTitlesColor@@;\r\n border-right: none;\r\n text-align: left;\r\n vertical-align: middle !important;\r\n white-space: nowrap;\r\n border-right: 1px solid #777;\r\n}\r\n\r\n/* Filters row */\r\ntr.grid-header-row-1 td {\r\n background-color: @@FiltersBgColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n/* Grid Filters */\r\ntable.range-filter {\r\n width: 100%;\r\n}\r\n\r\n.range-filter td {\r\n padding: 0px 0px 2px 2px !important;\r\n border: none !important;\r\n font-size: 8pt !important;\r\n font-weight: normal !important;\r\n text-align: left;\r\n color: #000000 !important;\r\n}\r\n\r\ninput.filter, select.filter, input.filter-active, select.filter-active {\r\n margin-bottom: 0px;\r\n border: 1px solid #aaa;\r\n}\r\n\r\ninput.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\nselect.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\n/* Column titles row */\r\ntr.grid-header-row-0 td {\r\n height: 25px;\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n color: @@ColumnTitlesColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\ntr.grid-header-row-0 td a {\r\n color: @@ColumnTitlesColor@@;\r\n}\r\n\r\ntr.grid-header-row-0 td a:hover {\r\n color: #FFCC00;\r\n}\r\n\r\n\r\n.grid-footer-row td {\r\n background-color: #D7D7D7;\r\n font-weight: bold;\r\n border-right: 1px solid #C9C9C9;\r\n padding: 3px 5px 3px 5px;\r\n}\r\n\r\ntd.grid-header-last-cell, td.grid-data-last-cell, td.grid-footer-last-cell {\r\n border-right: none !important;\r\n}\r\n\r\ntd.grid-data-col-0, td.grid-data-col-0 div {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 div {\r\n display: table-cell;\r\n vertical-align: middle;\r\n}\r\n\r\n.grid-status-bar {\r\n border: 1px solid black;\r\n border-top: none;\r\n padding: 0px;\r\n width: 100%;\r\n border-collapse: collapse;\r\n height: 30px;\r\n}\r\n\r\n.grid-status-bar td {\r\n background-color: @@TitleBarBgColor@@;\r\n color: @@TitleBarColor@@;\r\n font-size: 11pt;\r\n font-weight: normal;\r\n padding: 2px 8px 2px 8px;\r\n}\r\n\r\n/* /Scrollable Grids */\r\n\r\n\r\n/* Forms */\r\ntable.edit-form {\r\n border: none;\r\n border-top-width: 0px;\r\n border-collapse: collapse;\r\n width: 100%;\r\n}\r\n\r\n.edit-form-odd, .edit-form-even {\r\n padding: 0px;\r\n}\r\n\r\n.subsectiontitle {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #4A92CE;\r\n color: #fff;\r\n height: 25px;\r\n border-top: 1px solid black;\r\n vertical-align: middle;\r\n}\r\n\r\n.subsectiontitle td {\r\n vertical-align: middle;\r\n /*padding: 3px 5px 3px 5px;*/\r\n padding: 1px 5px;\r\n}\r\n\r\n.label-cell {\r\n background: #DEE7F6 url(''@@base_url@@/core/admin_templates/img/bgr_input_name_line.gif'') no-repeat right bottom;\r\n font: 12px arial, sans-serif;\r\n padding: 4px 20px;\r\n width: 160px;\r\n}\r\n\r\n.control-mid {\r\n width: 13px;\r\n border-left: 1px solid #7A95C2;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_mid.gif'') repeat-x left bottom;\r\n}\r\n\r\n.control-cell {\r\n font: 11px arial, sans-serif;\r\n padding: 4px 10px 5px 5px;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_input_line.gif'') no-repeat left bottom;\r\n width: auto;\r\n vertical-align: middle;\r\n}\r\n\r\n.label-cell-filler {\r\n background: #DEE7F6 none;\r\n}\r\n.control-mid-filler {\r\n background: #fff none;\r\n border-left: 1px solid #7A95C2;\r\n}\r\n.control-cell-filler {\r\n background: #fff none;\r\n}\r\n\r\n.error {\r\n color: red;\r\n}\r\n.error-cell {\r\n color: red;\r\n}\r\n\r\n.field-required {\r\n color: red;\r\n}\r\n\r\n.warning-table {\r\n background-color: #F0F1EB;\r\n border: 1px solid #000000;\r\n border-collapse: collapse;\r\n border-top-width: 0px;\r\n}\r\n\r\n.form-warning {\r\n color: red;\r\n font-size: 11px;\r\n}\r\n\r\n.priority {\r\n color: red;\r\n padding-left: 1px;\r\n padding-right: 1px;\r\n font-size: 11px;\r\n}\r\n\r\n.small-statistics {\r\n font-size: 11px;\r\n color: #707070;\r\n}\r\n\r\n.req-note {\r\n font-style: italic;\r\n color: #333;\r\n}\r\n\r\n#scroll_container table.tableborder {\r\n border-collapse: separate\r\n}\r\n\r\n\r\n/* Uploader */\r\n\r\n.uploader-main {\r\n position: absolute;\r\n display: none;\r\n z-index: 10;\r\n border: 1px solid #777;\r\n padding: 10px;\r\n width: 350px;\r\n height: 120px;\r\n overflow: hidden;\r\n background-color: #fff;\r\n}\r\n\r\n.uploader-percent {\r\n width: 100%;\r\n padding-top: 3px;\r\n text-align: center;\r\n position: relative;\r\n z-index: 20;\r\n float: left;\r\n font-weight: bold;\r\n}\r\n\r\n.uploader-left {\r\n width: 100%;\r\n border: 1px solid black;\r\n height: 20px;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/progress_left.gif'');\r\n}\r\n\r\n.uploader-done {\r\n width: 0%;\r\n background-color: green;\r\n height: 20px;\r\n background: #4A92CE url(''@@base_url@@/core/admin_templates/img/progress_done.gif'');\r\n}\r\n\r\n\r\n/* To be sorted */\r\nspan#category_path, span#category_path a {\r\n color: #FFFFFF;\r\n}\r\n\r\nspan#category_path a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* Section title, right to the big icon */\r\n.admintitle {\r\n font-size: 16pt;\r\n font-weight: bold;\r\n color: @@SectionColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Left side of bluebar */\r\n.header_left_bg {\r\n background-color: @@TitleBarBgColor@@;\r\n background-image: none;\r\n padding-left: 5px;\r\n}\r\n\r\n/* Right side of bluebar */\r\n.tablenav, tablenav a {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n\r\n text-decoration: none;\r\n background-color: @@TitleBarBgColor@@;\r\n background-image: none;\r\n}\r\n\r\n/* Section title in the bluebar * -- why ''link''? :S */\r\n.tablenav_link {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Active page in top and bottom bluebars pagination */\r\n.current_page {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #fff;\r\n color: #2D79D6;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Other pages and arrows in pagination on blue */\r\n.nav_url {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n color: #fff;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Tree */\r\n.tree-body {\r\n background-color: @@TreeBgColor@@;\r\n height: 100%\r\n}\r\n\r\n.tree_head.td, .tree_head, .tree_head:hover {\r\n font-weight: bold;\r\n font-size: 10px;\r\n color: #FFFFFF;\r\n font-family: Verdana, Arial;\r\n text-decoration: none;\r\n}\r\n\r\n.tree {\r\n padding: 0px;\r\n border: none;\r\n border-collapse: collapse;\r\n}\r\n\r\n.tree tr td {\r\n padding: 0px;\r\n margin: 0px;\r\n font-family: helvetica, arial, verdana,;\r\n font-size: 11px;\r\n white-space: nowrap;\r\n}\r\n\r\n.tree tr td a {\r\n font-size: 11px;\r\n color: @@TreeColor@@;\r\n font-family: Helvetica, Arial, Verdana;\r\n text-decoration: none;\r\n padding: 2px;\r\n}\r\n\r\n.tree tr td a:hover, .tree tr td a.debug-only-item:hover {\r\n color: @@TreeHoverColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a, .tree tr.highlighted td a.debug-only-item {\r\n color: @@TreeHighColor@@;\r\n background-color: @@TreeHighBgColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a:hover {\r\n color: @@TreeHighHoverColor@@;\r\n}\r\n\r\n.tree tr td a.debug-only-item {\r\n color: grey;\r\n}\r\n\r\n/* Ajax Dropdown */\r\n.suggest-box {\r\n border: 1px solid #999;\r\n background-color: #fff;\r\n}\r\n\r\n.suggest-item, .suggest-item-over {\r\n padding: 1px 2px 0px 2px;\r\n font-family: arial,verdana;\r\n font-size: 12px;\r\n}\r\n\r\n.suggest-item-over {\r\n background-color: #3366CC;\r\n color: #fff;\r\n}', 'in-portal_logo_img.jpg', 'in-portal_logo_img2.jpg', 'in-portal_logo_login.gif', 'a:22:{s:11:"HeadBgColor";a:2:{s:11:"Description";s:27:"Head frame background color";s:5:"Value";s:7:"#007BF4";}s:9:"HeadColor";a:2:{s:11:"Description";s:21:"Head frame text color";s:5:"Value";s:7:"#FFFFFF";}s:14:"SectionBgColor";a:2:{s:11:"Description";s:28:"Section bar background color";s:5:"Value";s:7:"#FFFFFF";}s:12:"SectionColor";a:2:{s:11:"Description";s:22:"Section bar text color";s:5:"Value";s:7:"#2D79D6";}s:12:"HeadBarColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"HeadBarBgColor";a:1:{s:5:"Value";s:7:"#1961B8";}s:13:"TitleBarColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TitleBarBgColor";a:1:{s:5:"Value";s:7:"#2D79D6";}s:14:"ToolbarBgColor";a:1:{s:5:"Value";s:7:"#F0F1EB";}s:14:"FiltersBgColor";a:1:{s:5:"Value";s:7:"#D7D7D7";}s:17:"ColumnTitlesColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:19:"ColumnTitlesBgColor";a:1:{s:5:"Value";s:7:"#999999";}s:8:"OddColor";a:1:{s:5:"Value";s:7:"#000000";}s:10:"OddBgColor";a:1:{s:5:"Value";s:7:"#F6F6F6";}s:9:"EvenColor";a:1:{s:5:"Value";s:7:"#000000";}s:11:"EvenBgColor";a:1:{s:5:"Value";s:7:"#EBEBEB";}s:9:"TreeColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"TreeHoverColor";a:1:{s:5:"Value";s:7:"#009FF0";}s:13:"TreeHighColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:18:"TreeHighHoverColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TreeHighBgColor";a:1:{s:5:"Value";s:7:"#4A92CE";}s:11:"TreeBgColor";a:1:{s:5:"Value";s:7:"#DCECF6";}}', 1273946818, 1); INSERT INTO LocalesList VALUES (1, '0x0436', 'Afrikaans (South Africa)', 'af-ZA', 'Latn', '1252'), Index: core/install/install_schema.sql =================================================================== --- core/install/install_schema.sql (revision 13559) +++ core/install/install_schema.sql (working copy) @@ -93,6 +93,14 @@ EventId int(11) NOT NULL AUTO_INCREMENT, `Event` varchar(40) NOT NULL DEFAULT '', ReplacementTags text, + AllowChangingSender tinyint(4) NOT NULL DEFAULT '0', + CustomSender tinyint(4) NOT NULL DEFAULT '0', + SenderName varchar(255) NOT NULL DEFAULT '', + SenderAddressType tinyint(4) NOT NULL DEFAULT '0', + SenderAddress varchar(255) NOT NULL DEFAULT '', + AllowChangingRecipient tinyint(4) NOT NULL DEFAULT '0', + CustomRecipient tinyint(4) NOT NULL DEFAULT '0', + Recipients text, l1_Subject text, l2_Subject text, l3_Subject text, @@ -107,7 +115,6 @@ MessageType varchar(4) NOT NULL DEFAULT 'text', Enabled int(11) NOT NULL DEFAULT '1', FrontEndOnly tinyint(3) unsigned NOT NULL DEFAULT '0', - FromUserId int(11) DEFAULT NULL, Module varchar(40) NOT NULL DEFAULT '', Description text, `Type` int(11) NOT NULL DEFAULT '0', @@ -115,7 +122,12 @@ KEY `Type` (`Type`), KEY Enabled (Enabled), KEY `Event` (`Event`), - KEY FrontEndOnly (FrontEndOnly) + KEY FrontEndOnly (FrontEndOnly), + KEY AllowChangingSender (AllowChangingSender), + KEY CustomSender (CustomSender), + KEY SenderAddressType (SenderAddressType), + KEY AllowChangingRecipient (AllowChangingRecipient), + KEY CustomRecipient (CustomRecipient) ); CREATE TABLE IdGenerator ( Index: core/install/upgrades.php =================================================================== --- core/install/upgrades.php (revision 13557) +++ core/install/upgrades.php (working copy) @@ -1208,7 +1208,7 @@ if ($mode == 'before') { // fix "Content" category $fields_hash = Array ( - 'CreatedById' => -1, // root + 'CreatedById' => USER_ROOT, 'CreatedOn' => time(), 'ResourceId' => $this->Application->NextResourceId(), ); @@ -1517,78 +1517,156 @@ $this->Conn->Query('DROP TABLE IF EXISTS ' . TABLE_PREFIX . 'Phrase'); $this->Conn->Query('RENAME TABLE ' . $temp_table . ' TO ' . TABLE_PREFIX . 'Phrase'); - // refactor StdDestinations table - $sql = 'RENAME TABLE ' . TABLE_PREFIX . 'StdDestinations TO ' . TABLE_PREFIX . 'CountryStates'; - $this->Conn->Query($sql); + $this->_updateCountryStatesTable(); + $this->_replaceConfigurationValueSeparator(); - $sql = 'ALTER TABLE ' . TABLE_PREFIX . 'CountryStates - CHANGE DestId CountryStateId INT(11) NOT NULL AUTO_INCREMENT, - CHANGE DestType Type INT(11) NOT NULL DEFAULT \'1\', - CHANGE DestParentId StateCountryId INT(11) NULL DEFAULT NULL, - CHANGE DestAbbr IsoCode CHAR(3) NOT NULL DEFAULT \'\', - CHANGE DestAbbr2 ShortIsoCode CHAR(2) NULL DEFAULT NULL, - DROP INDEX DestType, - DROP INDEX DestParentId, - ADD INDEX (`Type`), - ADD INDEX (StateCountryId)'; - $this->Conn->Query($sql); + // save "config.php" in php format, not ini format as before + $this->_toolkit->SaveConfig(); + } - // move country/state translations from Phrase to CountryStates table - $ml_helper->createFields('country-state'); + if ($mode == 'after') { + $this->_transformEmailRecipients(); + } + } - for ($language_id = 1; $language_id <= $ml_helper->languageCount; $language_id++) { - if (!$ml_helper->LanguageFound($language_id)) { - continue; - } + /** + * Move country/state translations from Phrase to CountryStates table + * + */ + function _updateCountryStatesTable() + { + // refactor StdDestinations table + $sql = 'RENAME TABLE ' . TABLE_PREFIX . 'StdDestinations TO ' . TABLE_PREFIX . 'CountryStates'; + $this->Conn->Query($sql); - $sub_select = ' SELECT l' . $language_id . '_Translation - FROM ' . TABLE_PREFIX . 'Phrase - WHERE Phrase = DestName'; + $sql = 'ALTER TABLE ' . TABLE_PREFIX . 'CountryStates + CHANGE DestId CountryStateId INT(11) NOT NULL AUTO_INCREMENT, + CHANGE DestType Type INT(11) NOT NULL DEFAULT \'1\', + CHANGE DestParentId StateCountryId INT(11) NULL DEFAULT NULL, + CHANGE DestAbbr IsoCode CHAR(3) NOT NULL DEFAULT \'\', + CHANGE DestAbbr2 ShortIsoCode CHAR(2) NULL DEFAULT NULL, + DROP INDEX DestType, + DROP INDEX DestParentId, + ADD INDEX (`Type`), + ADD INDEX (StateCountryId)'; + $this->Conn->Query($sql); - $sql = 'UPDATE ' . TABLE_PREFIX . 'CountryStates - SET l' . $language_id . '_Name = (' . $sub_select . ')'; - $this->Conn->Query($sql); + $ml_helper =& $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + $ml_helper->createFields('country-state'); + + for ($language_id = 1; $language_id <= $ml_helper->languageCount; $language_id++) { + if (!$ml_helper->LanguageFound($language_id)) { + continue; } - $sql = 'ALTER TABLE ' . TABLE_PREFIX . 'CountryStates - DROP DestName'; - $this->Conn->Query($sql); + $sub_select = ' SELECT l' . $language_id . '_Translation + FROM ' . TABLE_PREFIX . 'Phrase + WHERE Phrase = DestName'; - $sql = 'DELETE FROM ' . TABLE_PREFIX . 'Phrase - WHERE Phrase LIKE ' . $this->Conn->qstr('la_country_%') . ' OR Phrase LIKE ' . $this->Conn->qstr('la_state_%'); + $sql = 'UPDATE ' . TABLE_PREFIX . 'CountryStates + SET l' . $language_id . '_Name = (' . $sub_select . ')'; $this->Conn->Query($sql); + } - // makes configuration values dropdowns use "||" as separator - $custom_field_helper =& $this->Application->recallObject('InpCustomFieldsHelper'); - /* @var $custom_field_helper InpCustomFieldsHelper */ + $sql = 'ALTER TABLE ' . TABLE_PREFIX . 'CountryStates + DROP DestName'; + $this->Conn->Query($sql); - $sql = 'SELECT ValueList, VariableName - FROM ' . TABLE_PREFIX . 'ConfigurationAdmin - WHERE ValueList LIKE "%,%"'; - $variables = $this->Conn->GetCol($sql, 'VariableName'); + $sql = 'DELETE FROM ' . TABLE_PREFIX . 'Phrase + WHERE Phrase LIKE ' . $this->Conn->qstr('la_country_%') . ' OR Phrase LIKE ' . $this->Conn->qstr('la_state_%'); + $this->Conn->Query($sql); + } - foreach ($variables as $variable_name => $value_list) { - $ret = Array (); - $options = $custom_field_helper->GetValuesHash($value_list, ',', false); + /** + * Makes configuration values dropdowns use "||" as separator + * + */ + function _replaceConfigurationValueSeparator() + { + $custom_field_helper =& $this->Application->recallObject('InpCustomFieldsHelper'); + /* @var $custom_field_helper InpCustomFieldsHelper */ - foreach ($options as $option_key => $option_title) { - if (substr($option_key, 0, 3) == 'SQL') { - $ret[] = $option_title; - } - else { - $ret[] = $option_key . '=' . $option_title; - } + $sql = 'SELECT ValueList, VariableName + FROM ' . TABLE_PREFIX . 'ConfigurationAdmin + WHERE ValueList LIKE "%,%"'; + $variables = $this->Conn->GetCol($sql, 'VariableName'); + + foreach ($variables as $variable_name => $value_list) { + $ret = Array (); + $options = $custom_field_helper->GetValuesHash($value_list, ',', false); + + foreach ($options as $option_key => $option_title) { + if (substr($option_key, 0, 3) == 'SQL') { + $ret[] = $option_title; } + else { + $ret[] = $option_key . '=' . $option_title; + } + } + $fields_hash = Array ( + 'ValueList' => implode(VALUE_LIST_SEPARATOR, $ret), + ); + + $this->Conn->doUpdate($fields_hash, TABLE_PREFIX . 'ConfigurationAdmin', 'VariableName = ' . $this->Conn->qstr($variable_name)); + } + } + + /** + * Transforms "FromUserId" into Sender* and Recipients columns + * + */ + function _transformEmailRecipients() + { + $sql = 'SELECT FromUserId, Type, EventId + FROM ' . TABLE_PREFIX . 'Events + WHERE FromUserId IS NOT NULL AND (FromUserId <> ' . USER_ROOT . ')'; + $events = $this->Conn->Query($sql, 'EventId'); + + $minput_helper =& $this->Application->recallObject('MInputHelper'); + /* @var $minput_helper MInputHelper */ + + foreach ($events as $event_id => $event_data) { + $sql = 'SELECT Login + FROM ' . TABLE_PREFIX . 'PortalUser + WHERE PortalUserId = ' . $event_data['FromUserId']; + $username = $this->Conn->GetOne($sql); + + if (!$username) { + continue; + } + + if ($event_data['Type'] == EVENT_TYPE_FRONTEND) { + // from user $fields_hash = Array ( - 'ValueList' => implode(VALUE_LIST_SEPARATOR, $ret), + 'CustomSender' => 1, + 'SenderAddressType' => ADDRESS_TYPE_USER, + 'SenderAddress' => $username ); + } - $this->Conn->doUpdate($fields_hash, TABLE_PREFIX . 'ConfigurationAdmin', 'VariableName = ' . $this->Conn->qstr($variable_name)); + if ($event_data['Type'] == EVENT_TYPE_ADMIN) { + // to user + $records = Array ( + Array ( + 'RecipientType' => RECIPIENT_TYPE_TO, + 'RecipientName' => '', + 'RecipientAddressType' => ADDRESS_TYPE_USER, + 'RecipientAddress' => $username + ) + ); + + $fields_hash = Array ( + 'CustomRecipient' => 1, + 'Recipients' => $minput_helper->prepareMInputXML($records, array_keys( reset($records) )) + ); } - // save "config.php" in php format, not ini format as before - $this->_toolkit->SaveConfig(); + $this->Conn->doUpdate($fields_hash, TABLE_PREFIX . 'Events', 'EventId = ' . $event_id); } + + $this->Conn->Query('ALTER TABLE ' . TABLE_PREFIX . 'Events DROP FromUserId'); } } \ No newline at end of file Index: core/install/upgrades.sql =================================================================== --- core/install/upgrades.sql (revision 13559) +++ core/install/upgrades.sql (working copy) @@ -1864,3 +1864,25 @@ KEY RedirectOnIPMatch (RedirectOnIPMatch), KEY Priority (Priority) ); + +ALTER TABLE Events + ADD AllowChangingSender TINYINT NOT NULL DEFAULT '0' AFTER ReplacementTags , + ADD CustomSender TINYINT NOT NULL DEFAULT '0' AFTER AllowChangingSender , + ADD SenderName VARCHAR(255) NOT NULL DEFAULT '' AFTER CustomSender , + ADD SenderAddressType TINYINT NOT NULL DEFAULT '0' AFTER SenderName , + ADD SenderAddress VARCHAR(255) NOT NULL DEFAULT '' AFTER SenderAddressType , + ADD AllowChangingRecipient TINYINT NOT NULL DEFAULT '0' AFTER SenderAddress , + ADD CustomRecipient TINYINT NOT NULL DEFAULT '0' AFTER AllowChangingRecipient , + ADD Recipients TEXT AFTER CustomRecipient, + ADD INDEX (AllowChangingSender), + ADD INDEX (CustomSender), + ADD INDEX (SenderAddressType), + ADD INDEX (AllowChangingRecipient), + ADD INDEX (CustomRecipient); + +UPDATE Events SET AllowChangingSender = 1, AllowChangingRecipient = 1; +UPDATE Events SET Module = 'Core' WHERE Module LIKE 'Core:%'; + +DELETE FROM Permissions WHERE Permission LIKE 'in-portal:configuration_email%'; +DELETE FROM Permissions WHERE Permission LIKE 'in-portal:user_email%'; +DELETE FROM Phrase WHERE Phrase IN ('la_fld_FromToUser', 'la_col_FromToUser'); Index: core/kernel/application.php =================================================================== --- core/kernel/application.php (revision 13581) +++ core/kernel/application.php (working copy) @@ -2830,11 +2830,12 @@ * @param string $email_event_name * @param int $to_user_id * @param array $send_params associative array of direct send params, possible keys: to_email, to_name, from_email, from_name, message, message_text - * @return unknown + * @return kEvent */ - function &EmailEventAdmin($email_event_name, $to_user_id = null, $send_params = false) + function &EmailEventAdmin($email_event_name, $to_user_id = null, $send_params = Array ()) { - $event =& $this->EmailEvent($email_event_name, 1, $to_user_id, $send_params); + $event =& $this->EmailEvent($email_event_name, EVENT_TYPE_ADMIN, $to_user_id, $send_params); + return $event; } @@ -2844,11 +2845,12 @@ * @param string $email_event_name * @param int $to_user_id * @param array $send_params associative array of direct send params, possible keys: to_email, to_name, from_email, from_name, message, message_text - * @return unknown + * @return kEvent */ - function &EmailEventUser($email_event_name, $to_user_id = null, $send_params = false) + function &EmailEventUser($email_event_name, $to_user_id = null, $send_params = Array ()) { - $event =& $this->EmailEvent($email_event_name, 0, $to_user_id, $send_params); + $event =& $this->EmailEvent($email_event_name, EVENT_TYPE_FRONTEND, $to_user_id, $send_params); + return $event; } @@ -2856,23 +2858,28 @@ * Triggers general email event * * @param string $email_event_name - * @param int $email_event_type ( 0 for User, 1 for Admin) + * @param int $email_event_type (0 for User, 1 for Admin) * @param int $to_user_id * @param array $send_params associative array of direct send params, * possible keys: to_email, to_name, from_email, from_name, message, message_text - * @return unknown + * @return kEvent */ - function &EmailEvent($email_event_name, $email_event_type, $to_user_id = -1, $send_params = false) + function &EmailEvent($email_event_name, $email_event_type, $to_user_id = null, $send_params = Array ()) { - $params = array( + $params = Array ( 'EmailEventName' => $email_event_name, 'EmailEventToUserId' => $to_user_id, 'EmailEventType' => $email_event_type, + 'DirectSendParams' => $send_params, ); - if ($send_params) { - $params['DirectSendParams'] = $send_params; + + if (array_key_exists('use_special', $send_params)) { + $event_str = 'emailevents.' . $send_params['use_special'] . ':OnEmailEvent'; } - $event_str = isset($send_params['use_special']) ? 'emailevents.'.$send_params['use_special'].':OnEmailEvent' : 'emailevents:OnEmailEvent'; + else { + $event_str = 'emailevents:OnEmailEvent'; + } + $this->HandleEvent($event, $event_str, $params); return $event; Index: core/kernel/constants.php =================================================================== --- core/kernel/constants.php (revision 13581) +++ core/kernel/constants.php (working copy) @@ -84,10 +84,7 @@ define('clUPDATE', 2); define('clDELETE', 3); - /** - * Separator for ValueList fields - * - */ + // Separator for ValueList fields define('VALUE_LIST_SEPARATOR', '||'); // template editing modes @@ -117,10 +114,7 @@ define('SMS_MODE_AUTO', 1); define('SMS_MODE_FORCE', 2); - /** - * Means, that actual category Template field value should inherited from parent category - * - */ + // Means, that actual category Template field value should inherited from parent category define('CATEGORY_TEMPLATE_INHERIT', '#inherit#'); define('REWRITE_MODE_BUILD', 1); @@ -168,5 +162,14 @@ define('SITE_DOMAIN_REDIRECT_CURRENT', 1); define('SITE_DOMAIN_REDIRECT_EXTERNAL', 2); + // email event address types + define('ADDRESS_TYPE_EMAIL', 1); + define('ADDRESS_TYPE_USER', 2); + define('ADDRESS_TYPE_GROUP', 3); + + define('RECIPIENT_TYPE_TO', 1); + define('RECIPIENT_TYPE_CC', 2); + define('RECIPIENT_TYPE_BCC', 3); + define ('KG_TO_POUND', 2.20462262); define ('POUND_TO_KG', 0.45359237); \ No newline at end of file Index: core/units/categories/categories_config.php =================================================================== --- core/units/categories/categories_config.php (revision 13581) +++ core/units/categories/categories_config.php (working copy) @@ -216,7 +216,7 @@ 'PermItemPrefix' => 'CATEGORY', - 'PermSection' => Array ('main' => 'CATEGORY:in-portal:categories', /*'search' => 'in-portal:configuration_search',*/ 'email' => 'in-portal:configuration_email', 'custom' => 'in-portal:configuration_custom'), + 'PermSection' => Array ('main' => 'CATEGORY:in-portal:categories', /*'search' => 'in-portal:configuration_search',*/ 'custom' => 'in-portal:configuration_custom'), 'Sections' => Array ( 'in-portal:configure_categories' => Array ( @@ -239,23 +239,13 @@ 'type' => stTREE, ), - 'in-portal:configuration_email' => Array ( - 'parent' => 'in-portal:website_setting_folder', - 'icon' => 'conf_email', - 'label' => 'la_tab_ConfigE-mail', - 'url' => Array ('t' => 'config/config_email', 'module' => 'Core:Category', 'pass_section' => true, 'pass' => 'm'), - 'permissions' => Array ('view', 'edit'), - 'priority' => 11.3, - 'type' => stTREE, - ), - 'in-portal:configuration_custom' => Array ( 'parent' => 'in-portal:website_setting_folder', 'icon' => 'conf_customfields', 'label' => 'la_tab_ConfigCustom', 'url' => Array ('t' => 'custom_fields/custom_fields_list', 'cf_type' => 1, 'pass_section' => true, 'pass' => 'm,cf'), 'permissions' => Array ('view', 'add', 'edit', 'delete'), - 'priority' => 11.4, + 'priority' => 11.3, 'type' => stTREE, ), ), Index: core/units/email_events/email_event_tp.php =================================================================== --- core/units/email_events/email_event_tp.php (revision 13557) +++ core/units/email_events/email_event_tp.php (working copy) @@ -21,4 +21,54 @@ $this->Application->setUnitOption($this->Prefix, 'Grids', $grids); } } + + /** + * Checks, that field can be edited + * + * @param Array $params + * @return string + */ + function IsEditable($params) + { + if ($this->Application->isDebugMode()) { + return true; + } + + $object =& $this->getObject($params); + /* @var $object kDBItem */ + + return $object->GetDBField($params['check_field']); + } + + /** + * Removes "To" options from possible options in "RecipientType" field + * + * @param Array $params + */ + function RemoveToRecipientType($params) + { + $object =& $this->getObject($params); + /* @var $object kDBItem */ + + $field_options = $object->GetFieldOptions('RecipientType'); + unset($field_options['options'][RECIPIENT_TYPE_TO]); + $object->SetFieldOptions('RecipientType', $field_options); + } + + /** + * Restores "To" option in possible option list in "RecipientType" field + * + * @param Array $params + */ + function RestoreRecipientType($params) + { + $object =& $this->getObject($params); + /* @var $object kDBItem */ + + $field_options = $object->GetFieldOptions('RecipientType'); + $virtual_fields = $this->Application->getUnitOption($this->Prefix, 'VirtualFields'); + $field_options['options'] = $virtual_fields['RecipientType']['options']; + $object->SetFieldOptions('RecipientType', $field_options); + } + } \ No newline at end of file Index: core/units/email_events/email_events_config.php =================================================================== --- core/units/email_events/email_events_config.php (revision 13557) +++ core/units/email_events/email_events_config.php (working copy) @@ -38,30 +38,28 @@ 'TitlePresets' => Array ( 'default' => Array ( 'new_status_labels' => Array ('emailevents' => '!la_title_Adding_E-mail!'), - 'edit_status_labels' => Array ('emailevents' => '!la_title_Editing_E-mail!'), - 'edit_status_labels' => Array ('emailevents' => '!la_title_EditingEmailEvent!'), + 'edit_status_labels' => Array ('emailevents' => '!la_title_EditingEmailEvent!' /*'!la_title_Editing_E-mail!'*/), + 'new_titlefield' => Array ('emailevents' => '!la_title_NewEmailEvent!'), ), - // for editing in Regional section - 'email_settings_list' => Array ('prefixes' => Array ('emailevents.module_List'), 'format' => '!la_title_EmailSettings!'), - - 'email_settings_edit' => Array ( - 'prefixes' => Array ('emailevents'), 'format' => "#emailevents_status# '#emailevents_titlefield#'", - 'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), - ), - // for separate grid with email editing - 'email_messages_direct_list' => Array ( + 'email_message_list' => Array ( 'prefixes' => Array ('emailevents_List'), 'format' => "!la_title_EmailMessages!", - 'toolbar_buttons' => Array ('new_item', 'edit', 'delete', 'approve', 'decline', 'view', 'dbl-click'), + 'toolbar_buttons' => Array ('new_item', 'edit', 'delete', 'approve', 'decline', 'frontend_mail', 'view', 'dbl-click'), ), - 'email_messages_edit_direct' => Array ( + 'email_message_edit' => Array ( 'prefixes' => Array ('emailevents'), - 'format' => '#emailevents_status# - #emailevents_titlefield#', - 'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit'), + 'format' => '#emailevents_status# - #emailevents_titlefield# - !la_section_General!', + 'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), ), + 'email_message_edit_settings' => Array ( + 'prefixes' => Array ('emailevents'), + 'format' => '#emailevents_status# - #emailevents_titlefield# - !la_section_Settings!', + 'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), + ), + // for mass mailing 'email_send_form' => Array ('prefixes' => Array (), 'format' => '!la_title_SendEmail!'), 'email_prepare' => Array ('prefixes' => Array (), 'format' => '!la_title_PreparingEmailsForSending!. !la_title_PleaseWait!'), @@ -69,6 +67,13 @@ 'email_send_complete' => Array ('prefixes' => Array (), 'format' => '!la_title_SendMailComplete!'), ), + 'EditTabPresets' => Array ( + 'Default' => Array ( + 'general' => Array ('title' => 'la_tab_General', 't' => 'languages/email_message_edit', 'priority' => 1), + 'settings' => Array ('title' => 'la_tab_Settings', 't' => 'languages/email_message_settings', 'priority' => 2), + ), + ), + 'PermSection' => Array ('main' => 'in-portal:configemail'), 'Sections' => Array ( @@ -97,22 +102,14 @@ 'TableName' => TABLE_PREFIX . 'Events', - 'CalculatedFields' => Array ( - '' => Array ( - 'FromUser' => 'u.Login', - ) - ), - 'ListSQLs' => Array ( - '' => ' SELECT %1$s.* %2$s - FROM %1$s - LEFT JOIN ' . TABLE_PREFIX . 'PortalUser u ON %1$s.FromUserId = u.PortalUserId', + '' => ' SELECT %1$s.* %2$s FROM %1$s', ), 'ListSortings' => Array ( '' => Array ( 'ForcedSorting' => Array ('Enabled' => 'desc'), - 'Sorting' => Array ('Module' => 'asc', 'Description' => 'asc'), + 'Sorting' => Array ('Event' => 'asc'), ), 'module' => Array ( 'ForcedSorting' => Array ('Enabled' => 'desc'), @@ -126,6 +123,43 @@ 'Headers' => Array ('type' => 'string', 'default' => NULL), 'ReplacementTags' => Array ('type' => 'string', 'default' => NULL), + 'AllowChangingSender' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', + 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1, + 'not_null' => 1, 'default' => 0 + ), + 'CustomSender' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_opt_DefaultAddress', 1 => 'la_opt_CustomSender'), 'use_phrases' => 1, + 'not_null' => 1, 'default' => 0 + ), + 'SenderName' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''), + 'SenderAddressType' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_Email', 2 => 'la_opt_User'), 'use_phrases' => 1, + 'not_null' => 1, 'error_field' => 'SenderAddress', 'default' => 0 + ), + 'SenderAddress' => Array ( + 'type' => 'string', 'max_len' => 255, + 'error_msgs' => Array ( + 'invalid_email' => '!la_err_invalid_format!', + 'invalid_user' => '!la_error_UserNotFound!', + ), + 'not_null' => 1, 'default' => '' + ), + 'AllowChangingRecipient' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1, + 'not_null' => 1, 'default' => 0 + ), + 'CustomRecipient' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_opt_DefaultAddress', 1 => 'la_opt_CustomRecipients'), 'use_phrases' => 1, + 'not_null' => 1, 'default' => 0 + ), + 'Recipients' => Array ('type' => 'string', 'default' => NULL), + 'Subject' => Array ( 'type' => 'string', 'formatter' => 'kMultiLanguage', 'db_type' => 'text', @@ -156,18 +190,14 @@ 'not_null' => 1, 'default' => 0 ), - 'FromUserId' => Array ( - 'type' => 'int', - 'formatter' => 'kLEFTFormatter', 'error_msgs' => Array ('invalid_option' => '!la_error_UserNotFound!'), 'options' => Array (-1 => 'root'), 'left_sql' => 'SELECT %s FROM '.TABLE_PREFIX.'PortalUser WHERE `%s` = \'%s\'', 'left_key_field' => 'PortalUserId', 'left_title_field' => 'Login', - 'default' => NULL - ), - 'Module' => Array ( 'type' => 'string', 'formatter' => 'kOptionsFormatter', 'options' => Array (), - 'not_null' => 1, 'required' => 1, 'default' => '' + 'not_null' => 1, 'required' => 1, 'default' => 'Core' ), + 'Description' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''), + 'Type' => Array ( 'type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Text_Admin', 0 => 'la_Text_User'), 'use_phrases' => 1, @@ -176,7 +206,30 @@ ), 'VirtualFields' => Array ( - 'FromUser' => Array ('type' => 'string', 'default' => ''), + 'RecipientType' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'To', 2 => 'Cc', 3 => 'Bcc'), + 'not_null' => 1, 'default' => 1 + ), + 'RecipientName' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''), + 'RecipientAddressType' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_Email', 2 => 'la_opt_User', 3 => 'la_opt_Group'), 'use_phrases' => 1, + 'not_null' => 1, 'error_field' => 'RecipientAddress', 'default' => 0 + ), + 'RecipientAddress' => Array ( + 'type' => 'string', 'max_len' => 255, + 'error_msgs' => Array ( + 'invalid_email' => '!la_err_invalid_format!', + 'invalid_user' => '!la_error_UserNotFound!', + 'invalid_group' => '!la_error_GroupNotFound!', + ), + 'not_null' => 1, 'default' => '' + ), + + 'Tag' => Array ('type' => 'string', 'default' => ''), + 'Replacement' => Array ('type' => 'string', 'default' => ''), + 'ReplacementTagsXML' => Array ('type' => 'string', 'default' => ''), ), 'Grids' => Array ( @@ -212,24 +265,8 @@ 'Type' => Array ( 'title' => 'la_col_Type', 'filter_block' => 'grid_options_filter', 'width' => 60, ), 'Enabled' => Array ( 'title' => 'la_col_Enabled', 'filter_block' => 'grid_options_filter', 'width' => 70, ), 'Module' => Array ( 'title' => 'la_col_Module', 'filter_block' => 'grid_options_filter', 'width' => 100, ), + 'FrontEndOnly' => Array ('title' => 'la_col_FrontEndOnly', 'filter_block' => 'grid_options_filter', 'width' => 120, 'hidden' => 1), ), ), - - // used on "E-Mail" section in each module - 'EmailSettings' => Array ( - 'Icons' => Array ( - 'default' => 'icon16_item.png', - 0 => 'icon16_disabled.png', - 1 => 'icon16_item.png', - ), - 'Fields' => Array ( - 'EventId' => Array ('title' => 'la_col_Id', 'filter_block' => 'grid_range_filter', 'width' => 70, ), - 'Description' => Array ('title' => 'la_col_EventDescription', 'width' => 250, ), - 'FromUser' => Array ('title' => 'la_col_FromToUser', 'data_block' => 'from_user_td', 'filter_block' => 'grid_like_filter', 'width' => 150, ), - 'Type' => Array ('title' => 'la_col_RecipientType', 'filter_block' => 'grid_options_filter', 'width' => 120, ), - 'FrontEndOnly' => Array ('title' => 'la_col_FrontEndOnly', 'filter_block' => 'grid_options_filter', 'width' => 120, ), - 'Enabled' => Array ('title' => 'la_col_Enabled', 'filter_block' => 'grid_options_filter', 'width' => 80, ), - ), - ), ), ); \ No newline at end of file Index: core/units/email_events/email_events_event_handler.php =================================================================== --- core/units/email_events/email_events_event_handler.php (revision 13557) +++ core/units/email_events/email_events_event_handler.php (working copy) @@ -23,12 +23,23 @@ function mapPermissions() { parent::mapPermissions(); - $permissions = Array( - 'OnFrontOnly' => Array('self' => 'edit'), - 'OnSaveSelected' => Array('self' => 'view'), - 'OnProcessEmailQueue' => Array('self' => 'add|edit'), + $permissions = Array ( + 'OnFrontOnly' => Array ('self' => 'edit'), + 'OnSaveSelected' => Array ('self' => 'view'), + 'OnProcessEmailQueue' => Array ('self' => 'add|edit'), + + 'OnSuggestAddress' => Array ('self' => 'add|edit'), + + // events only for developers + 'OnPreCreate' => Array ('self' => 'debug'), + 'OnDelete' => Array ('self' => 'debug'), + 'OnDeleteAll' => Array ('self' => 'debug'), + 'OnMassDelete' => Array ('self' => 'debug'), + 'OnMassApprove' => Array ('self' => 'debug'), + 'OnMassDecline' => Array ('self' => 'debug'), ); + $this->permMapping = array_merge($this->permMapping, $permissions); } @@ -201,76 +212,250 @@ } /** - * Returns sender & recipients ids plus event_id (as parameter by reference) + * Processes email sender * * @param kEvent $event - * - * @return mixed + * @param Array $direct_params */ - function GetMessageRecipients(&$event) + function _processSender(&$event, $direct_params = Array ()) { + $this->Application->removeObject('u.email-from'); + $object =& $this->_getEmailEvent($event); /* @var $object kDBItem */ - // initial values - $to_user_id = $event->getEventParam('EmailEventToUserId'); - if ( !is_numeric($to_user_id) ) { - $to_user_id = -1; // when not specified, then send to "root" - } - $from_user_id = $object->GetDBField('FromUserId'); + $email = $name = ''; - if ($object->GetDBField('Type') == EVENT_TYPE_ADMIN) { - // For type "Admin" recipient is a user from field FromUserId which means From/To user in Email events list - if ($to_user_id == -1) { - $to_user_id = $from_user_id; + // set defaults from event + if ($object->GetDBField('CustomSender')) { + $address = $object->GetDBField('SenderAddress'); + $address_type = $object->GetDBField('SenderAddressType'); + + switch ($address_type) { + case ADDRESS_TYPE_EMAIL: + $email = $address; + break; + + case ADDRESS_TYPE_USER: + $sql = 'SELECT FirstName, LastName, Email, PortalUserId + FROM ' . TABLE_PREFIX . 'PortalUser + WHERE Login = ' . $this->Conn->qstr($address); + $user_info = $this->Conn->GetRow($sql); + + if ($user_info) { + // user still exists + $email = $user_info['Email']; + $name = trim($user_info['FirstName'] . ' ' . $user_info['LastName']); + + $user =& $this->Application->recallObject('u.email-from', null, Array('skip_autoload' => true)); + /* @var $user UsersItem */ + + $user->Load($user_info['PortalUserId']); + } + break; } - $from_user_id = -1; + + if ($object->GetDBField('SenderName')) { + $name = $object->GetDBField('SenderName'); + } } - return Array ($from_user_id, $to_user_id); + // update with custom data given during event execution + if (array_key_exists('from_email', $direct_params)) { + $email = $direct_params['from_email']; + } + + if (array_key_exists('from_name', $direct_params)) { + $name = $direct_params['from_name']; + } + + // still nothing, set defaults + if (!$email) { + $email = $this->Application->ConfigValue('Smtp_AdminMailFrom'); + } + + if (!$name) { + $name = strip_tags( $this->Application->ConfigValue('Site_Name') ); + } + + $esender =& $this->Application->recallObject('EmailSender'); + /* @var $esender kEmailSendingHelper */ + + $esender->SetFrom($email, $name); + + return Array ($email, $name); } /** - * Returns user name, email by id, or ones, that specified in $direct_params + * Processes email recipients * - * @param int $user_id - * @param string $user_type type of user = {to,from} + * @param kEvent $event * @param Array $direct_params - * @return Array */ - function GetRecipientInfo($user_id, $user_type, $direct_params = null) + function _processRecipients(&$event, $direct_params = Array ()) { - // load user, because it can be addressed from email template tags - $user =& $this->Application->recallObject('u.email-'.$user_type, null, Array('skip_autoload' => true)); - /* @var $user UsersItem */ + $this->Application->removeObject('u.email-to'); - $email = $name = ''; - $result = $user_id > 0 ? $user->Load( (int)$user_id ) : $user->Clear(); - if ($user->IsLoaded()) { - $email = $user->GetDBField('Email'); - $name = trim($user->GetDBField('FirstName').' '.$user->GetDBField('LastName')); - } + $object =& $this->_getEmailEvent($event); + /* @var $object kDBItem */ - if (is_array($direct_params)) { - if (isset($direct_params[$user_type.'_email'])) { - $email = $direct_params[$user_type.'_email']; + $to_email = $to_name = ''; + $all_recipients = Array (); + $recipients_xml = $object->GetDBField('Recipients'); + + if ($recipients_xml) { + $minput_helper =& $this->Application->recallObject('MInputHelper'); + /* @var $minput_helper MInputHelper */ + + // group recipients by type + $records = $minput_helper->parseMInputXML($recipients_xml); + + foreach ($records as $record) { + $recipient_type = $record['RecipientType']; + + if (!array_key_exists($recipient_type, $all_recipients)) { + $all_recipients[$recipient_type] = Array (); + } + + $all_recipients[$recipient_type][] = $record; } + } - if (isset($direct_params[$user_type.'_name'])) { - $name = $direct_params[$user_type.'_name']; + if (!array_key_exists(RECIPIENT_TYPE_TO, $all_recipients)) { + $all_recipients[RECIPIENT_TYPE_TO] = Array (); + } + + // remove all "To" recipients, when not allowed + $overwrite_to_email = array_key_exists('overwrite_to_email', $direct_params) ? $direct_params['overwrite_to_email'] : false; + + if (!$object->GetDBField('CustomRecipient') || $overwrite_to_email) { + $all_recipients[RECIPIENT_TYPE_TO] = Array (); + } + + // update with custom data given during event execution (user_id) + $to_user_id = $event->getEventParam('EmailEventToUserId'); + + if ($to_user_id > 0) { + $sql = 'SELECT FirstName, LastName, Email + FROM ' . TABLE_PREFIX . 'PortalUser + WHERE PortalUserId = ' . $to_user_id; + $user_info = $this->Conn->GetRow($sql); + + if ($user_info) { + $add_recipient = Array ( + 'RecipientAddressType' => ADDRESS_TYPE_EMAIL, + 'RecipientAddress' => $user_info['Email'], + 'RecipientName' => trim($user_info['FirstName'] . ' ' . $user_info['LastName']), + ); + + array_unshift($all_recipients[RECIPIENT_TYPE_TO], $add_recipient); + + $user =& $this->Application->recallObject('u.email-to', null, Array('skip_autoload' => true)); + /* @var $user UsersItem */ + + $user->Load($to_user_id); } } - if (!$email) { - // if email is empty, then use admins email - $email = $this->Application->ConfigValue('Smtp_AdminMailFrom'); + // update with custom data given during event execution (email + name) + $add_recipient = Array (); + + if (array_key_exists('to_email', $direct_params)) { + $add_recipient['RecipientName'] = ''; + $add_recipient['RecipientAddressType'] = ADDRESS_TYPE_EMAIL; + $add_recipient['RecipientAddress'] = $direct_params['to_email']; } - if (!$name) { - $name = $user_type == 'from' ? strip_tags($this->Application->ConfigValue('Site_Name')) : $email; + if (array_key_exists('to_name', $direct_params)) { + $add_recipient['RecipientName'] = $direct_params['to_name']; } - return Array ($email, $name); + if ($add_recipient) { + array_unshift($all_recipients[RECIPIENT_TYPE_TO], $add_recipient); + } + + $esender =& $this->Application->recallObject('EmailSender'); + /* @var $esender kEmailSendingHelper */ + + $header_mapping = Array ( + RECIPIENT_TYPE_TO => 'To', + RECIPIENT_TYPE_CC => 'Cc', + RECIPIENT_TYPE_BCC => 'Bcc', + ); + + $default_email = $this->Application->ConfigValue('Smtp_AdminMailFrom'); + + foreach ($all_recipients as $recipient_type => $recipients) { + // add recipients to email + $pairs = Array (); + + foreach ($recipients as $recipient) { + $address = $recipient['RecipientAddress']; + $address_type = $recipient['RecipientAddressType']; + $repipient_name = $recipient['RecipientName']; + + switch ($address_type) { + case ADDRESS_TYPE_EMAIL: + $pairs[] = Array ('email' => $address, 'name' => $repipient_name); + break; + + case ADDRESS_TYPE_USER: + $sql = 'SELECT FirstName, LastName, Email + FROM ' . TABLE_PREFIX . 'PortalUser + WHERE Login = ' . $this->Conn->qstr($address); + $user_info = $this->Conn->GetRow($sql); + + if ($user_info) { + // user still exists + $name = trim($user_info['FirstName'] . ' ' . $user_info['LastName']); + + $pairs[] = Array ( + 'email' => $user_info['Email'], + 'name' => $name ? $name : $repipient_name, + ); + } + break; + + case ADDRESS_TYPE_GROUP: + $sql = 'SELECT u.FirstName, u.LastName, u.Email + FROM ' . TABLE_PREFIX . 'PortalGroup g + JOIN ' . TABLE_PREFIX . 'UserGroup ug ON ug.GroupId = g.GroupId + JOIN ' . TABLE_PREFIX . 'PortalUser u ON u.PortalUserId = ug.PortalUserId + WHERE g.Name = ' . $this->Conn->qstr($address); + $users = $this->Conn->Query($sql); + + foreach ($users as $user) { + $name = trim($user_info['FirstName'] . ' ' . $user_info['LastName']); + + $pairs[] = Array ( + 'email' => $user_info['Email'], + 'name' => $name ? $name : $repipient_name, + ); + } + break; + } + } + + if (!$pairs) { + continue; + } + + if ($recipient_type == RECIPIENT_TYPE_TO) { + $to_email = $pairs[0]['email'] ? $pairs[0]['email'] : $default_email; + $to_name = $pairs[0]['name'] ? $pairs[0]['name'] : $to_email; + } + + $header_name = $header_mapping[$recipient_type]; + + foreach ($pairs as $pair) { + $email = $pair['email'] ? $pair['email'] : $default_email; + $name = $pair['name'] ? $pair['name'] : $email; + + $esender->AddRecipient($header_name, $email, $name); + } + } + + return Array ($to_email, $to_name); } /** @@ -279,7 +464,7 @@ * @param kEvent $event * @param int $language_id */ - function GetMessageBody(&$event, $language_id = null) + function _getMessageBody(&$event, $language_id = null) { if (!isset($language_id)) { $language_id = $this->Application->GetVar('m_lang'); @@ -399,7 +584,7 @@ * @param Array $direct_params * @return Array */ - function ParseMessageBody($message, $direct_params = null) + function ParseMessageBody($message, $direct_params = Array ()) { $message_language = $this->_getSendLanguage($direct_params); $this->_changeLanguage($message_language); @@ -463,15 +648,12 @@ $send_params = $event->getEventParam('DirectSendParams'); // 1. get information about message sender and recipient - $recipients = $this->GetMessageRecipients($event); + list ($from_email, $from_name) = $this->_processSender($event, $send_params); + list ($to_email, $to_name) = $this->_processRecipients($event, $send_params); - list ($from_id, $to_id) = $recipients; - list ($from_email, $from_name) = $this->GetRecipientInfo($from_id, 'from', $send_params); - list ($to_email, $to_name) = $this->GetRecipientInfo($to_id, 'to', $send_params); - // 2. prepare message to be sent $message_language = $this->_getSendLanguage($send_params); - $message_template = $this->GetMessageBody($event, $message_language); + $message_template = $this->_getMessageBody($event, $message_language); if (!trim($message_template)) { trigger_error('Message template is empty', E_USER_WARNING); return false; @@ -487,15 +669,12 @@ $esender =& $this->Application->recallObject('EmailSender'); /* @var $esender kEmailSendingHelper */ - $esender->SetFrom($from_email, $from_name); - $esender->AddTo($to_email, $to_name); - $message_subject = isset($message_headers['Subject']) ? $message_headers['Subject'] : 'Mail message'; $esender->SetSubject($message_subject); if ($this->Application->isDebugMode()) { // set special header with event name, so it will be easier to determite what's actually was received - $message_headers['X-Event-Name'] = $email_event_name . ' - ' . ($event->getEventParam('EmailEventType') == EVENT_TYPE_ADMIN ? 'ADMIN' : 'USER'); + $message_headers['X-Event-Name'] = $email_event_name . ' - ' . ($object->GetDBField('Type') == EVENT_TYPE_ADMIN ? 'ADMIN' : 'USER'); } foreach ($message_headers as $header_name => $header_value) { @@ -524,14 +703,11 @@ $this->Conn->doInsert($fields_hash, TABLE_PREFIX.'EmailLog'); } - - $this->Application->removeObject('u.email-from'); - $this->Application->removeObject('u.email-to'); } function _getSendLanguage($send_params) { - if ($send_params && array_key_exists('language_id', $send_params)) { + if (array_key_exists('language_id', $send_params)) { return $send_params['language_id']; } @@ -634,10 +810,10 @@ { parent::OnAfterConfigRead($event); - $options = Array ('Core:Users' => 'Core - Users', 'Core:Category' => 'Core - Categories'); + $options = Array (); foreach ($this->Application->ModuleInfo as $module_name => $module_info) { - if (($module_name == 'In-Portal') || ($module_name == 'Core')) { + if ($module_name == 'In-Portal') { continue; } @@ -666,4 +842,221 @@ // use language from grid, instead of primary language used by default $event->SetRedirectParam('m_lang', $this->Application->GetVar('m_lang')); } + + /** + * Fixes default recipient type + * + * @param kEvent $event + */ + function OnAfterItemLoad(&$event) + { + parent::OnAfterItemLoad($event); + + $object =& $event->getObject(); + /* @var $object kDBItem */ + + if (!$this->Application->isDebugMode(false)) { + if ($object->GetDBField('AllowChangingRecipient')) { + $object->SetDBField('RecipientType', RECIPIENT_TYPE_TO); + } + else { + $object->SetDBField('RecipientType', RECIPIENT_TYPE_CC); + } + } + + // process replacement tags + $records = Array (); + $replacement_tags = $object->GetDBField('ReplacementTags'); + $replacement_tags = $replacement_tags ? unserialize($replacement_tags) : Array (); + + foreach ($replacement_tags as $tag => $replacement) { + $records[] = Array ('Tag' => $tag, 'Replacement' => $replacement); + } + + $minput_helper =& $this->Application->recallObject('MInputHelper'); + /* @var $minput_helper MInputHelper */ + + $xml = $minput_helper->prepareMInputXML($records, Array ('Tag', 'Replacement')); + $object->SetDBField('ReplacementTagsXML', $xml); + } + + /** + * Performs custom validation + keep read-only fields + * + * @param kEvent $event + */ + function _itemChanged(&$event) + { + $object =& $event->getObject(); + /* @var $object kDBItem */ + + if ($object->GetDBField('CustomSender')) { + $this->_validateAddress($event, 'Sender'); + } + + $this->_validateAddress($event, 'Recipient'); + + if (!$this->Application->isDebugMode(false)) { + // only allow to enable/disable event while in debug mode + $to_restore = Array ('Enabled', 'AllowChangingSender', 'AllowChangingRecipient'); + + if (!$object->GetOriginalField('AllowChangingSender')) { + $to_restore = array_merge($to_restore, Array ('CustomSender', 'SenderName', 'SenderAddressType', 'SenderAddress')); + } + + if (!$object->GetOriginalField('AllowChangingRecipient')) { + $to_restore = array_merge($to_restore, Array ('CustomRecipient'/*, 'Recipients'*/)); + } + + // prevent specific fields from editing + foreach ($to_restore as $restore_field) { + $original_value = $object->GetOriginalField($restore_field); + + if ($object->GetDBField($restore_field) != $original_value) { + $object->SetDBField($restore_field, $original_value); + } + } + } + + // process replacement tags + $minput_helper =& $this->Application->recallObject('MInputHelper'); + /* @var $minput_helper MInputHelper */ + + $replacement_tags = Array (); + $records = $minput_helper->parseMInputXML( $object->GetDBField('ReplacementTagsXML') ); + + foreach ($records as $record) { + $replacement_tags[ trim($record['Tag']) ] = trim($record['Replacement']); + } + + $object->SetDBField('ReplacementTags', $replacement_tags ? serialize($replacement_tags) : NULL); + } + + /** + * Validates address using given field prefix + * + * @param kEvent $event + * @param string $field_prefix + */ + function _validateAddress(&$event, $field_prefix) + { + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $address_type = $object->GetDBField($field_prefix . 'AddressType'); + $object->setRequired($field_prefix . 'Address', $address_type > 0); + $address = $object->GetDBField($field_prefix . 'Address'); + + if (!$address) { + // don't validate against empty address + return ; + } + + switch ($address_type) { + case ADDRESS_TYPE_EMAIL: + if (!preg_match('/^(' . REGEX_EMAIL_USER . '@' . REGEX_EMAIL_DOMAIN . ')$/i', $address)) { + $object->SetError($field_prefix . 'Address', 'invalid_email'); + } + break; + + case ADDRESS_TYPE_USER: + $sql = 'SELECT PortalUserId + FROM ' . TABLE_PREFIX . 'PortalUser + WHERE Login = ' . $this->Conn->qstr($address); + if (!$this->Conn->GetOne($sql)) { + $object->SetError($field_prefix . 'Address', 'invalid_user'); + } + break; + + case ADDRESS_TYPE_GROUP: + $sql = 'SELECT GroupId + FROM ' . TABLE_PREFIX . 'PortalGroup + WHERE Name = ' . $this->Conn->qstr($address); + if (!$this->Conn->GetOne($sql)) { + $object->SetError($field_prefix . 'Address', 'invalid_group'); + } + break; + } + } + + /** + * Don't allow to enable/disable events in non-debug mode + * + * @param kEvent $event + */ + function OnBeforeItemCreate(&$event) + { + parent::OnBeforeItemCreate($event); + + $this->_itemChanged($event); + } + + /** + * Don't allow to enable/disable events in non-debug mode + * + * @param kEvent $event + */ + function OnBeforeItemUpdate(&$event) + { + parent::OnBeforeItemUpdate($event); + + $this->_itemChanged($event); + } + + /** + * Suggest address based on typed address and selected address type + * + * @param kEvent $event + */ + function OnSuggestAddress(&$event) + { + $event->status = erSTOP; + + $address_type = $this->Application->GetVar('type'); + $address = $this->Application->GetVar('value'); + $limit = $this->Application->GetVar('limit'); + + if (!$limit) { + $limit = 20; + } + + switch ($address_type) { + case ADDRESS_TYPE_EMAIL: + $field = 'Email'; + $table_name = TABLE_PREFIX . 'PortalUser'; + break; + + case ADDRESS_TYPE_USER: + $field = 'Login'; + $table_name = TABLE_PREFIX . 'PortalUser'; + break; + + case ADDRESS_TYPE_GROUP: + $field = 'Name'; + $table_name = TABLE_PREFIX . 'PortalGroup'; + break; + } + + if (isset($field)) { + $sql = 'SELECT DISTINCT ' . $field . ' + FROM ' . $table_name . ' + WHERE ' . $field . ' LIKE ' . $this->Conn->qstr($address . '%') . ' + ORDER BY ' . $field . ' ASC + LIMIT 0,' . $limit; + $data = $this->Conn->GetCol($sql); + } + else { + $data = Array (); + } + + $this->Application->XMLHeader(); + + echo ''; + + foreach ($data as $item) { + echo '' . htmlspecialchars($item) . ''; + } + + echo ''; + } } \ No newline at end of file Index: core/units/users/users_config.php =================================================================== --- core/units/users/users_config.php (revision 13557) +++ core/units/users/users_config.php (working copy) @@ -225,7 +225,7 @@ ), ), - 'PermSection' => Array('main' => 'in-portal:user_list', 'email' => 'in-portal:user_email', 'custom' => 'in-portal:user_custom'), + 'PermSection' => Array('main' => 'in-portal:user_list', 'custom' => 'in-portal:user_custom'), 'Sections' => Array ( 'in-portal:user_list' => Array ( @@ -272,23 +272,13 @@ 'type' => stTREE, ), - 'in-portal:user_email' => Array ( - 'parent' => 'in-portal:user_setting_folder', - 'icon' => 'conf_email', - 'label' => 'la_tab_ConfigE-mail', - 'url' => Array ('t' => 'config/config_email', 'module' => 'Core:Users', 'pass_section' => true, 'pass' => 'm'), - 'permissions' => Array ('view', 'edit'), - 'priority' => 2, - 'type' => stTREE, - ), - 'in-portal:user_custom' => Array ( 'parent' => 'in-portal:user_setting_folder', 'icon' => 'conf_customfields', 'label' => 'la_tab_ConfigCustom', 'url' => Array ('t' => 'custom_fields/custom_fields_list', 'cf_type' => 6, 'pass_section' => true, 'pass' => 'm,cf'), 'permissions' => Array ('view', 'add', 'edit', 'delete'), - 'priority' => 3, + 'priority' => 2, 'type' => stTREE, ), ),