[Rt-commit] r4501 - in rt/branches/3.7-EXPERIMENTAL: . bin etc html html/Admin html/Admin/CustomFields html/Admin/Elements html/Admin/Groups html/Admin/Queues html/Admin/Users html/Elements html/Elements/CollectionAsTable html/Elements/RT__Ticket html/NoAuth html/NoAuth/js html/Prefs html/REST/1.0/Forms/ticket html/Search html/Search/Elements html/SelfService html/SelfService/Elements html/Ticket html/Ticket/Elements html/Tools html/User html/User/Groups html/Widgets lib/RT lib/RT/Action lib/RT/I18N lib/RT/Interface lib/RT/Interface/Web lib/RT/Interface/Web/Menu lib/t/regression sbin

ruz at bestpractical.com ruz at bestpractical.com
Mon Feb 6 19:52:44 EST 2006


Author: ruz
Date: Mon Feb  6 15:04:21 2006
New Revision: 4501

Added:
   rt/branches/3.7-EXPERIMENTAL/lib/t/regression/14linking.t
   rt/branches/3.7-EXPERIMENTAL/lib/t/regression/23-batch-upload-csv.t
   rt/branches/3.7-EXPERIMENTAL/lib/t/regression/25scrip_order.t
Modified:
   rt/branches/3.7-EXPERIMENTAL/   (props changed)
   rt/branches/3.7-EXPERIMENTAL/README
   rt/branches/3.7-EXPERIMENTAL/UPGRADING
   rt/branches/3.7-EXPERIMENTAL/bin/rt.in
   rt/branches/3.7-EXPERIMENTAL/etc/RT_Config.pm.in
   rt/branches/3.7-EXPERIMENTAL/etc/schema.mysql
   rt/branches/3.7-EXPERIMENTAL/html/Admin/CustomFields/Modify.html
   rt/branches/3.7-EXPERIMENTAL/html/Admin/CustomFields/index.html
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/CreateUserCalled
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditCustomFields
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditQueueWatchers
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditScrips
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditUserComments
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/ListGlobalScrips
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/ModifyTemplate
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/PickCustomFields
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/SelectNewGroupMembers
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/SelectStage
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Groups/Members.html
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Groups/Modify.html
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Groups/index.html
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Queues/Modify.html
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Queues/index.html
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Users/Modify.html
   rt/branches/3.7-EXPERIMENTAL/html/Admin/Users/index.html
   rt/branches/3.7-EXPERIMENTAL/html/Admin/index.html
   rt/branches/3.7-EXPERIMENTAL/html/Elements/Callback
   rt/branches/3.7-EXPERIMENTAL/html/Elements/CollectionAsTable/Header
   rt/branches/3.7-EXPERIMENTAL/html/Elements/CollectionAsTable/ParseFormat
   rt/branches/3.7-EXPERIMENTAL/html/Elements/CollectionAsTable/Row
   rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomField
   rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomFieldBinary
   rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomFieldSelect
   rt/branches/3.7-EXPERIMENTAL/html/Elements/Error
   rt/branches/3.7-EXPERIMENTAL/html/Elements/GotoTicket
   rt/branches/3.7-EXPERIMENTAL/html/Elements/Header
   rt/branches/3.7-EXPERIMENTAL/html/Elements/ListActions
   rt/branches/3.7-EXPERIMENTAL/html/Elements/Login
   rt/branches/3.7-EXPERIMENTAL/html/Elements/Logo
   rt/branches/3.7-EXPERIMENTAL/html/Elements/Menu
   rt/branches/3.7-EXPERIMENTAL/html/Elements/MessageBox
   rt/branches/3.7-EXPERIMENTAL/html/Elements/MyRT
   rt/branches/3.7-EXPERIMENTAL/html/Elements/PageLayout
   rt/branches/3.7-EXPERIMENTAL/html/Elements/QueryString
   rt/branches/3.7-EXPERIMENTAL/html/Elements/QueueSummary
   rt/branches/3.7-EXPERIMENTAL/html/Elements/QuickCreate
   rt/branches/3.7-EXPERIMENTAL/html/Elements/RT__Ticket/ColumnMap
   rt/branches/3.7-EXPERIMENTAL/html/Elements/RefreshHomepage
   rt/branches/3.7-EXPERIMENTAL/html/Elements/ScrubHTML
   rt/branches/3.7-EXPERIMENTAL/html/Elements/SelectCustomFieldOperator
   rt/branches/3.7-EXPERIMENTAL/html/Elements/SelectDate
   rt/branches/3.7-EXPERIMENTAL/html/Elements/SelectWatcherType
   rt/branches/3.7-EXPERIMENTAL/html/Elements/ShowCustomFieldImage
   rt/branches/3.7-EXPERIMENTAL/html/Elements/ShowCustomFields
   rt/branches/3.7-EXPERIMENTAL/html/Elements/TicketList
   rt/branches/3.7-EXPERIMENTAL/html/NoAuth/Logout.html
   rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/header.css
   rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/nav.css
   rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/titlebox.css
   rt/branches/3.7-EXPERIMENTAL/html/NoAuth/js/util.js
   rt/branches/3.7-EXPERIMENTAL/html/Prefs/MyRT.html
   rt/branches/3.7-EXPERIMENTAL/html/Prefs/SearchOptions.html
   rt/branches/3.7-EXPERIMENTAL/html/REST/1.0/Forms/ticket/default
   rt/branches/3.7-EXPERIMENTAL/html/Search/Build.html
   rt/branches/3.7-EXPERIMENTAL/html/Search/Bulk.html
   rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/BuildFormatString
   rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/Chart
   rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/DisplayOptions
   rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/EditQuery
   rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/EditSearches
   rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/PickBasics
   rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/PickCriteria
   rt/branches/3.7-EXPERIMENTAL/html/Search/Results.html
   rt/branches/3.7-EXPERIMENTAL/html/SelfService/Display.html
   rt/branches/3.7-EXPERIMENTAL/html/SelfService/Elements/GotoTicket
   rt/branches/3.7-EXPERIMENTAL/html/SelfService/Elements/MyRequests
   rt/branches/3.7-EXPERIMENTAL/html/SelfService/Prefs.html
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Create.html
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Display.html
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/EditBasics
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/EditCustomFields
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/EditWatchers
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/PreviewScrips
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/Reminders
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowAttachments
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowDates
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowDependencies
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowMembers
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowRequestor
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowTransactionAttachments
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/Tabs
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/ModifyAll.html
   rt/branches/3.7-EXPERIMENTAL/html/Ticket/Update.html
   rt/branches/3.7-EXPERIMENTAL/html/Tools/MyDay.html
   rt/branches/3.7-EXPERIMENTAL/html/Tools/Offline.html
   rt/branches/3.7-EXPERIMENTAL/html/User/Groups/Members.html
   rt/branches/3.7-EXPERIMENTAL/html/User/Groups/Modify.html
   rt/branches/3.7-EXPERIMENTAL/html/User/Prefs.html
   rt/branches/3.7-EXPERIMENTAL/html/Widgets/SelectionBox
   rt/branches/3.7-EXPERIMENTAL/html/index.html
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Action/CreateTickets.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Action/SendEmail.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Attachment_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Attachments_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/CustomFieldValues.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/EmailParser.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Groups_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/de.po
   rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/fr.po
   rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/ja.po
   rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/ru.po
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Email.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Web/Menu.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Web/Menu/Item.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Principal_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Record.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Scrips_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Template_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Ticket_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Tickets_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL/lib/RT/Users_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL/lib/t/regression/06mailgateway.t
   rt/branches/3.7-EXPERIMENTAL/lib/t/regression/07acl.t
   rt/branches/3.7-EXPERIMENTAL/lib/t/regression/07rights.t
   rt/branches/3.7-EXPERIMENTAL/lib/t/regression/09record_cf_api.t
   rt/branches/3.7-EXPERIMENTAL/lib/t/regression/12-search.t
   rt/branches/3.7-EXPERIMENTAL/lib/t/regression/20-sort-by-requestor.t
   rt/branches/3.7-EXPERIMENTAL/lib/t/regression/22search_tix_by_txn.t
   rt/branches/3.7-EXPERIMENTAL/releng.cnf
   rt/branches/3.7-EXPERIMENTAL/sbin/rt-setup-database.in
   rt/branches/3.7-EXPERIMENTAL/sbin/rt-test-dependencies.in

Log:
merge from 3.5 branch

 r1387 at cubic-pc (orig r4141):  trs | 2005-11-23 23:32:54 +0300
  r6511 at wintermute:  tom | 2005-11-23 13:49:29 -0500
  Minor nit: unneeded <br>
 
 r1388 at cubic-pc (orig r4142):  trs | 2005-11-23 23:33:25 +0300
  r6512 at wintermute:  tom | 2005-11-23 15:23:50 -0500
  Added a few callbacks to make extending Prefs cleaner
 
 r1389 at cubic-pc (orig r4143):  trs | 2005-11-23 23:39:13 +0300
  r6546 at wintermute:  tom | 2005-11-23 15:38:39 -0500
  My mistake, sorry
 
 r1390 at cubic-pc (orig r4144):  trs | 2005-11-23 23:57:32 +0300
  r6548 at wintermute:  tom | 2005-11-23 15:56:59 -0500
  Minor nit: fixed jumbo link
 
 r1511 at cubic-pc (orig r4217):  jesse | 2005-12-03 01:41:00 +0300
  r19661 at truegrounds:  jesse | 2005-12-01 22:53:35 -0500
   r19594 at truegrounds:  jesse | 2005-11-30 16:04:46 -0500
    r18978 at truegrounds:  jesse | 2005-11-18 17:16:11 -0500
    * Minor refactoring of CreateTickets.pm (It needs a more complete rototill)
    
    * more flexible support for custom fields whose names contain dashes and spaces in createtickets templates
    
   
   r19595 at truegrounds:  jesse | 2005-11-30 16:04:52 -0500
    r19551 at truegrounds:  jesse | 2005-11-30 15:24:09 -0500
     r19350 at truegrounds (orig r4145):  alexmv | 2005-11-23 16:32:25 -0500
      r7341 at zoq-fot-pik:  chmrr | 2005-11-23 16:31:44 -0500
       * Limiting based on CFs should make sure that the CFs in question are
      on the right queue, otherwise negative searches might be wrong.
       * Removed debugging lines from 20-sort-by-requestor.t
     
     r19521 at truegrounds (orig r4149):  alexmv | 2005-11-28 15:00:53 -0500
      r7368 at zoq-fot-pik:  chmrr | 2005-11-28 15:00:18 -0500
       * Search/Build.html passes Rows not RowsPerPage -- don't hard-force
         to 50 all the time!
     
    
   
   r19596 at truegrounds:  jesse | 2005-11-30 16:05:00 -0500
    r19553 at truegrounds:  jesse | 2005-11-30 15:26:01 -0500
     r19552 at truegrounds (orig r4155):  alexmv | 2005-11-30 15:26:08 -0500
      r7395 at zoq-fot-pik:  chmrr | 2005-11-30 15:25:32 -0500
       * Sort by requestor tests fail on some database backends because they
      sort nulls differently than Perl does; only compare non-nulls
     
    
   
   r19597 at truegrounds:  jesse | 2005-11-30 16:05:07 -0500
    r19554 at truegrounds:  jesse | 2005-11-30 15:27:53 -0500
     r18121 at truegrounds:  jesse | 2005-11-02 22:40:02 -0500
      r17958 at truegrounds (orig r3989):  alexmv | 2005-10-24 17:26:18 -0400
       r6881 at zoq-fot-pik:  chmrr | 2005-10-24 17:25:14 -0400
        * Ensure custom fields keep correct fallback values; for instance, if
       "add another attachment" is clicked
      
      r18110 at truegrounds (orig r4010):  pdh | 2005-10-31 19:21:57 -0500
      Make $RT::MaxInlineBody work properly.
      
      
      r18111 at truegrounds (orig r4011):  pdh | 2005-11-01 00:43:02 -0500
      Add a missing space, before the Style Police come after me.
      
      
     
    
   
   r19598 at truegrounds:  jesse | 2005-11-30 16:06:36 -0500
    r19555 at truegrounds:  jesse | 2005-11-30 15:28:02 -0500
     r18409 at truegrounds:  jesse | 2005-11-06 17:11:57 -0500
     * Fix to attachment ordering when you ask for a txn's attachments.
       (Postgres doesn't default to ordering by id, so we were getting the wrong txn content)
    
   
   r19599 at truegrounds:  jesse | 2005-11-30 16:06:44 -0500
    r19556 at truegrounds:  jesse | 2005-11-30 15:28:09 -0500
     r18411 at truegrounds:  jesse | 2005-11-06 17:13:33 -0500
      * Patch to significantly improve performance on "WhoHaveRight" from Ruslan.
    
   
   r19600 at truegrounds:  jesse | 2005-11-30 16:06:53 -0500
    r19557 at truegrounds:  jesse | 2005-11-30 15:28:15 -0500
     r18412 at truegrounds:  jesse | 2005-11-06 17:13:58 -0500
     * Bumped to 3.4.5pre1
    
   
   r19601 at truegrounds:  jesse | 2005-11-30 16:07:00 -0500
    r19558 at truegrounds:  jesse | 2005-11-30 15:28:23 -0500
     r18716 at truegrounds:  jesse | 2005-11-11 00:10:08 -0500
     * fix from ruslan for fallout from his WhoHaveRight refactoring
    
   
   r19602 at truegrounds:  jesse | 2005-11-30 16:07:07 -0500
    r19559 at truegrounds:  jesse | 2005-11-30 15:28:45 -0500
     r18722 at truegrounds:  jesse | 2005-11-11 15:26:34 -0500
     * SB 1.35 dependency
    
   
   r19603 at truegrounds:  jesse | 2005-11-30 16:07:14 -0500
    r19560 at truegrounds:  jesse | 2005-11-30 15:29:29 -0500
     r18876 at truegrounds:  jesse | 2005-11-14 12:32:25 -0500
      r18739 at truegrounds (orig r4061):  robert | 2005-11-13 00:14:57 -0500
       r4124 at bear:  rspier | 2005-11-12 21:08:45 -0800
       Undefined Warning Elimination:
         - index.html passes in $session{'home_refresh_interval'} which can be null.  
       
       r4125 at bear:  rspier | 2005-11-12 21:14:28 -0800
       Undefined Warning Elimination:
         GetHeader will return undefined when the header doesn't exist.  (This is _good_, as that is different than empty.)
         But.. =~ warns.
      
     
    
   
   r19604 at truegrounds:  jesse | 2005-11-30 16:07:22 -0500
    r19561 at truegrounds:  jesse | 2005-11-30 15:29:35 -0500
     r18877 at truegrounds:  jesse | 2005-11-14 12:37:37 -0500
     RT-Ticket: 7087
     RT-Status: resolved
     RT-Update: correspond
     
     Displayed linked tickets in search results were inverted
     
    
   
   r19605 at truegrounds:  jesse | 2005-11-30 16:07:28 -0500
    r19562 at truegrounds:  jesse | 2005-11-30 15:29:41 -0500
     r18880 at truegrounds:  jesse | 2005-11-14 12:42:48 -0500
     RT-Ticket: 7081
     RT-Status: resolved
     RT-Update: correspond
     
     * Added a note to the readme warning users to clean out the
       mason cache on upgrades - Ruslan
     
    
   
   r19606 at truegrounds:  jesse | 2005-11-30 16:07:35 -0500
    r19563 at truegrounds:  jesse | 2005-11-30 15:29:47 -0500
     r18888 at truegrounds:  jesse | 2005-11-14 12:54:25 -0500
     RT-Ticket: 7048
     RT-Status: resolved
     RT-Update: correspond
     
     * Akos Torok pointed out that our HTML scrubber removed "PRE" tags from HTML
    
   
   r19607 at truegrounds:  jesse | 2005-11-30 16:07:42 -0500
    r19564 at truegrounds:  jesse | 2005-11-30 15:29:54 -0500
     r18892 at truegrounds:  jesse | 2005-11-14 13:07:15 -0500
      r18881 at truegrounds (orig r4064):  alexmv | 2005-11-14 12:43:06 -0500
       r7122 at zoq-fot-pik:  chmrr | 2005-11-14 12:42:37 -0500
        * Updated russian translation from Andrew Kornilov <andy at eva.dp.ua>
      
     
    
   
   r19608 at truegrounds:  jesse | 2005-11-30 16:09:07 -0500
    r19565 at truegrounds:  jesse | 2005-11-30 15:30:00 -0500
     r18893 at truegrounds:  jesse | 2005-11-14 13:19:52 -0500
     RT-Ticket: 7128
     RT-Status: resolved
     RT-Update: correspond
     
     A big patch from Todd Chapman (with lots of juicy tests) to optionally
     create two transactions when you create a link. (Also, this means that we'll
     run scrips twice). This is off by default in RT 3.4
     
    
   
   r19609 at truegrounds:  jesse | 2005-11-30 16:09:14 -0500
    r19566 at truegrounds:  jesse | 2005-11-30 15:30:08 -0500
     r18895 at truegrounds:  jesse | 2005-11-14 13:35:29 -0500
     RT-Ticket: 7136
     RT-Status: resolved
     RT-Update: correspond
     
     Stuart Knight reports:
     
     As part of the "initdb" processing, the scripts went through and created a new database user, in my case called RT3.
     
     When it came time to create the tables, the script was still logged on as the dba user "system", so all of tables/sequences were created under "system"'s schema.
     
     I followed through the rt-setup-database script, and spotted that there was a database disconnect, followed by an immediate reconnect, as the same user. (in the case of Oracle this still being the "dba" account)
     
     Putting an extra validation check in here for Oracle, and then connecting as the intended database user fixed up the issue.
     
    
   
   r19610 at truegrounds:  jesse | 2005-11-30 16:09:20 -0500
    r19567 at truegrounds:  jesse | 2005-11-30 15:30:15 -0500
     r18897 at truegrounds:  jesse | 2005-11-14 13:35:44 -0500
      r18896 at truegrounds (orig r4072):  alexmv | 2005-11-14 13:33:43 -0500
       r7135 at zoq-fot-pik:  chmrr | 2005-11-14 13:32:23 -0500
       RT-Ticket: 7101
       RT-Status: resolved
       RT-Update: correspond
       
        * Don't modify EquivObjects arrayref, thanks to Todd Chapman
       
      
     
    
   
   r19611 at truegrounds:  jesse | 2005-11-30 16:09:27 -0500
    r19568 at truegrounds:  jesse | 2005-11-30 15:30:22 -0500
     r18899 at truegrounds:  jesse | 2005-11-14 13:40:24 -0500
     RT-Ticket: 7121 
     RT-Status: resolved
     RT-Update: correspond
     
     * Patch from Todd Chapman to make the web based acl tests honor RT::WebPath
     
    
   
   r19612 at truegrounds:  jesse | 2005-11-30 16:09:34 -0500
    r19569 at truegrounds:  jesse | 2005-11-30 15:37:06 -0500
     r18900 at truegrounds:  jesse | 2005-11-14 13:57:34 -0500
     RT-Ticket: 7122
     RT-Status: resolved
     RT-Update: correspond
     
     * Patch from Todd Chapman to honor changed a $rtname variable when running
       the test suite
    
   
   r19613 at truegrounds:  jesse | 2005-11-30 16:09:40 -0500
    r19570 at truegrounds:  jesse | 2005-11-30 15:37:12 -0500
     r18904 at truegrounds:  jesse | 2005-11-14 14:49:25 -0500
     RT-Ticket: 7105
     RT-Status: resolved
     RT-Update: correspond
     
     Updated French translation from Jerome Fenal
    
   
   r19614 at truegrounds:  jesse | 2005-11-30 16:09:47 -0500
    r19571 at truegrounds:  jesse | 2005-11-30 15:37:19 -0500
     r19545 at truegrounds:  jesse | 2005-11-29 18:51:07 -0500
     * A pair of new callbacks to make it easier to hide away a custom field on ticket display/edit
    
   
   r19615 at truegrounds:  jesse | 2005-11-30 16:09:54 -0500
    r19572 at truegrounds:  jesse | 2005-11-30 15:37:26 -0500
     r19547 at truegrounds:  jesse | 2005-11-29 18:54:41 -0500
      r18901 at truegrounds (orig r4074):  alexmv | 2005-11-14 13:52:00 -0500
       r7140 at zoq-fot-pik:  chmrr | 2005-11-14 13:51:14 -0500
        * Better bounce handling, from Abhijit Menon-Sen <ams at oryx.com>
      
      r18905 at truegrounds (orig r4077):  alexmv | 2005-11-14 14:20:49 -0500
       r7146 at zoq-fot-pik:  chmrr | 2005-11-14 14:20:03 -0500
       RT-Ticket: 7090
       RT-Status: resolved
       RT-Update: correspond
        * New Japanese .po, from Daisuke Maki <daisuke at wafu.ne.jp>
      
      r18940 at truegrounds (orig r4079):  alexmv | 2005-11-14 14:52:57 -0500
       r7148 at zoq-fot-pik:  chmrr | 2005-11-14 14:51:58 -0500
       RT-Ticket: 6559
       RT-Status: resolved
       RT-Update: correspond
        * Tests from Todd Chapman for loading CF from a wrong queue
      
      r18941 at truegrounds (orig r4080):  alexmv | 2005-11-14 14:55:17 -0500
       r7152 at zoq-fot-pik:  chmrr | 2005-11-14 14:54:43 -0500
        * Restore rightful .po headers on new french translation
      
      r18942 at truegrounds (orig r4081):  alexmv | 2005-11-14 14:59:42 -0500
       r7155 at zoq-fot-pik:  chmrr | 2005-11-14 14:59:06 -0500
       RT-Ticket: 7020
       RT-Status: resolved
       RT-Update: correspond
        * Actually make use of 'style' if it is provided; thanks to Kelly
         F. Hickel <kfh at mqsoftware.com>
      
      r18944 at truegrounds (orig r4083):  alexmv | 2005-11-14 15:43:24 -0500
       r7159 at zoq-fot-pik:  chmrr | 2005-11-14 15:42:48 -0500
       RT-Ticket: 6457
       RT-Status: resolved
       RT-Update: correspond
        * Typo in Ticket_Overlay.pm, found by Todd Chapman <todd at chaka.net>
      
      r18945 at truegrounds (orig r4084):  alexmv | 2005-11-14 15:51:27 -0500
       r7161 at zoq-fot-pik:  chmrr | 2005-11-14 15:50:56 -0500
       RT-Ticket: 6458
       RT-Status: resolved
       RT-Update: correspond
        * Removed extra return argument from _AddLink, thanks to Todd Chapman
          <todd at chaka.net>
      
      r18946 at truegrounds (orig r4085):  alexmv | 2005-11-14 16:30:12 -0500
       r7163 at zoq-fot-pik:  chmrr | 2005-11-14 16:29:36 -0500
       RT-Ticket: 6507
       RT-Status: resolved
       RT-Update: correspond
        * Standardize fonts to "Verdana, Arial, Helvetica, sans-serif";
          variant of patch from Maxime Henrion <mux at FreeBSD.org>
      
      r18947 at truegrounds (orig r4086):  alexmv | 2005-11-14 16:49:33 -0500
       r7165 at zoq-fot-pik:  chmrr | 2005-11-14 16:49:07 -0500
       RT-Ticket: 7131
       RT-Status: resolved
       RT-Update: correspond
        * The $RT::rtname regex should be case insensitive for matching
          subjects; thanks to Phil Smith III <psmith at levanta.com> for the
          catch
      
      r18948 at truegrounds (orig r4087):  ruz | 2005-11-14 16:50:12 -0500
      * fix: really hide hidden paths from callbacks
      * fix: fetch data from the %cache by one key when store data with other
      r18950 at truegrounds (orig r4089):  ruz | 2005-11-14 16:57:36 -0500
      * revert back mysql.schema, commited by accident
      r18951 at truegrounds (orig r4090):  ruz | 2005-11-14 17:02:36 -0500
      * /Elements/QueryString now supports ARRAY refs, this allow us to handle
        multiple arguments with the same name, this behaviour is consistent with
        how HTML::Mason handle arguments
      r18953 at truegrounds (orig r4092):  alexmv | 2005-11-14 17:35:40 -0500
       r7175 at zoq-fot-pik:  chmrr | 2005-11-14 17:35:03 -0500
       RT-Ticket: 7010
       RT-Status: resolved
       RT-Update: correspond
        * Treat our email addresses as case-insensitive
      
      r18957 at truegrounds (orig r4096):  alexmv | 2005-11-14 18:34:44 -0500
       r7182 at zoq-fot-pik:  chmrr | 2005-11-14 18:34:13 -0500
       RT-Ticket: 6994
       RT-Status: resolved
       RT-Update: correspond
        * Sort custom vield values by SortOrder, then *Name*, then id; patch
          from Troy Davis <troy at nack.net>
      
      r18992 at truegrounds (orig r4120):  robert | 2005-11-19 22:52:28 -0500
       r4186 at bear:  rspier | 2005-11-19 19:51:38 -0800
       typo fix: s/load/Load/ 
      
     
    
   
   r19616 at truegrounds:  jesse | 2005-11-30 16:11:33 -0500
   * Reminders typo
  
 
 r1512 at cubic-pc (orig r4218):  jesse | 2005-12-03 01:41:33 +0300
  r19690 at truegrounds:  jesse | 2005-12-02 17:39:24 -0500
  * Merge fixups
 
 r1513 at cubic-pc (orig r4227):  jesse | 2005-12-03 02:43:35 +0300
  r19702 at truegrounds:  jesse | 2005-12-02 18:16:21 -0500
   r19698 at truegrounds:  jesse | 2005-12-02 18:00:25 -0500
    r19693 at truegrounds:  jesse | 2005-12-02 17:48:24 -0500
     r19588 at truegrounds:  jesse | 2005-11-30 16:00:10 -0500
     * Bump to 3.4.5rc1
     r19674 at truegrounds:  jesse | 2005-12-01 23:13:50 -0500
      * Added a print stylesheet from Koos van den Hout
     r19688 at truegrounds:  jesse | 2005-12-02 17:01:28 -0500
     RT-Ticket: 6962
     RT-Status: resolved
     RT-Update: correspond
     
     * Patch from Rolf Grossmann to fix some bogosity in the query builder
     
    
   
  
 
 r1514 at cubic-pc (orig r4228):  jesse | 2005-12-03 02:43:54 +0300
  r19706 at truegrounds:  jesse | 2005-12-02 18:36:02 -0500
  * merge fixups, 3.5.6
 
 r1515 at cubic-pc (orig r4251):  trs | 2005-12-06 00:54:40 +0300
  r6558 at wintermute:  tom | 2005-11-24 09:00:09 -0500
  Aren't used for hackish CSS calcs anymore
 
 r1516 at cubic-pc (orig r4252):  trs | 2005-12-06 02:29:26 +0300
  r6730 at wintermute:  tom | 2005-12-05 18:28:43 -0500
  Fix
 
 r1611 at cubic-pc (orig r4313):  jesse | 2005-12-15 23:09:00 +0300
  r20493 at truegrounds:  jesse | 2005-12-15 15:07:44 -0500
  On Thu, Dec 15, 2005 at 01:49:55PM -0600, Roedel, Mark wrote:
  >
  > The attached patch (to html/Ticket/Elements/Reminders from RT-3.5.6)
  > corrects the following behaviors:
  >
  > (1) When maintaining reminders from /Ticket/Display.html, all reminder
  > subjects for that ticket were being reset to blank when "Save" was
  > pressed, and
  >
  > (2) When maintaining reminders from /Ticket/Reminders.html, only one
  > field per reminder would actually be updated when "Save" was pressed
  >
  >
  > --
  > Mark Roedel
  > Web Programmer / Analyst
  > LeTourneau University
  
 
 r1616 at cubic-pc (orig r4371):  trs | 2006-01-08 20:27:50 +0300
  r8179 at wintermute:  tom | 2006-01-08 12:20:56 -0500
  * Fixed rendering issues in Opera and (I think) Safari/Shiira/any Webkit browser
  * Fixed background of login box issue in IE
 
 r1617 at cubic-pc (orig r4374):  ruz | 2006-01-12 06:04:46 +0300
 * apply tidy_html script
 r1622 at cubic-pc (orig r4388):  kevinr | 2006-01-13 10:40:52 +0300
  r10349 at SAD-GIRL-IN-SNOW:  kevinr | 2006-01-13 02:15:36 -0500
  RT-Ticket: 7150, 7151, 7152, 7153, 7155, 7156, 7157, 7158, 7159, 7160, 7161, 7162, 7164, 7165, 7166
  RT-Status: resolved
  RT-Action: correspond
  
  Fixed Mason warnings in:
    Elements/CollectionAsTable/Header
    Elements/Menu
    Elements/MessageBox
    Elements/SelectDate
    Elements/SelectWatcherType
    Elements/TicketList
    Search/Bulk.html
    Search/Elements/BuildFormatString
    Search/Elements/EditSearches
    Ticket/Elements/AddWatchers
    Ticket/Elements/ShowTransactionAttachments
    Ticket/ModifyAll.html
    Ticket/Reminders.html
    Tools/Offline.html
    Widgets/TitleBox
  (thanks to Jim Meyer)
 
 r1623 at cubic-pc (orig r4389):  kevinr | 2006-01-13 10:42:26 +0300
 
 r1624 at cubic-pc (orig r4390):  ruz | 2006-01-13 14:41:20 +0300
 * addClass and delClass functions
 * setVisibility util
 * get rid of style.display=[none,block]
 * setCheckbox(form, name, state) function that set all checkbox
   inputs under the form element with defined name to the state.
 * update Submit element according to new changes
 
 r1674 at cubic-pc (orig r4393):  kevinr | 2006-01-17 08:48:10 +0300
  r10381 at SAD-GIRL-IN-SNOW:  kevinr | 2006-01-17 00:23:29 -0500
  * Applied Jim Meyer's patch to fix the indentation of 
  Elements/EditCustomFieldSelect
 
 r1675 at cubic-pc (orig r4394):  kevinr | 2006-01-17 08:48:17 +0300
  r10382 at SAD-GIRL-IN-SNOW:  kevinr | 2006-01-17 00:28:53 -0500
  * Applied the bits of Jim Meyer's 'fixes' patch to 
  Elements/EditCustomFieldSelect which seemed still relevant
 
 r1676 at cubic-pc (orig r4407):  jesse | 2006-01-19 18:11:21 +0300
  r22720 at truegrounds:  jesse | 2006-01-19 09:15:00 -0500
  * merge up from chaldea, quebec, 3.4
 
 r1677 at cubic-pc (orig r4408):  jesse | 2006-01-19 18:11:39 +0300
  r22721 at truegrounds:  jesse | 2006-01-19 10:08:18 -0500
   * mergeup fixes
 
 r1678 at cubic-pc (orig r4411):  jesse | 2006-01-19 18:17:30 +0300
  r22726 at truegrounds:  jesse | 2006-01-19 10:15:16 -0500
   * 3.5.7
 
 r1679 at cubic-pc (orig r4413):  kevinr | 2006-01-20 06:50:58 +0300
  r10386 at sad-girl-in-snow:  kevinr | 2006-01-18 15:59:51 -0500
  RT-Ticket: 7154
  RT-Status: resolved
  RT-Update: correspond
  
  * Silenced warnings in Search/Results.html (thanks to Jim Meyer)
 
 r1680 at cubic-pc (orig r4414):  kevinr | 2006-01-20 06:51:23 +0300
  r10390 at sad-girl-in-snow:  kevinr | 2006-01-18 16:31:03 -0500
  RT-Ticket: 7149
  RT-Status: resolved
  RT-Update: correspond
  
  * Cleaned up attachment creation in lib/RT/Attachment_Overlay.pm (thanks to 
  Ruslan Zakirov)
 
 r1681 at cubic-pc (orig r4415):  kevinr | 2006-01-20 06:51:48 +0300
  r10391 at sad-girl-in-snow:  kevinr | 2006-01-18 16:32:59 -0500
  RT-Ticket: 7143
  RT-Status: open
  RT-Update: correspond
  
  Made minor cleanups to RT::Record (thanks to Ruslan Zakirov)
 
 r1682 at cubic-pc (orig r4416):  kevinr | 2006-01-20 06:52:04 +0300
  r10392 at sad-girl-in-snow:  kevinr | 2006-01-19 22:47:37 -0500
  * Cleaned up html/Elements/ListActions (based on a patch from Ruslan Zakirov)
 
 r1683 at cubic-pc (orig r4427):  kevinr | 2006-01-21 01:31:36 +0300
  r10418 at STRATTON-FIVE-HUNDRED:  kevinr | 2006-01-20 17:28:00 -0500
  RT-Ticket: 7148
  RT-Status: update
  RT-Update: correspond
  
  Applied Todd Chapman's patch, which:
  1. Orders user members of a group by Name
  2. If a user/group is already a member, doesn't list them in the select
  3. Doesn't list the group itself because a group can't have itself
  as a member
 
 r1684 at cubic-pc (orig r4433):  jesse | 2006-01-23 16:59:01 +0300
  r22882 at truegrounds:  jesse | 2006-01-23 11:00:23 +0100
   * removed notice that the CLI is beta only
 
 r1685 at cubic-pc (orig r4434):  jesse | 2006-01-23 16:59:20 +0300
  r22883 at truegrounds:  jesse | 2006-01-23 11:01:51 +0100
  * CLI support for custom fields from lwang at Cluster FS
 
 r1686 at cubic-pc (orig r4446):  jesse | 2006-01-25 16:35:46 +0300
  r22963 at truegrounds:  jesse | 2006-01-25 14:32:59 +0100
  * Re-add the warning message
 
 r1687 at cubic-pc (orig r4452):  kevinr | 2006-02-01 02:14:51 +0300
  r10546 at SAD-GIRL-IN-SNOW:  kevinr | 2006-01-31 18:13:50 -0500
  * Fixed a typo.
 
 r1688 at cubic-pc (orig r4458):  kevinr | 2006-02-01 05:12:46 +0300
  r10725 at SAD-GIRL-IN-SNOW:  kevinr | 2006-01-31 21:08:57 -0500
  * Reverted cascaded.js to the previous version -- r4390 seems to have 
  refactored the code in a way which doesn't work, or doesn't work in all 
  browsers.
 
 r1689 at cubic-pc (orig r4462):  kevinr | 2006-02-02 06:27:10 +0300
  r10739 at RANDOM-ONE-NINETY-THREE:  kevinr | 2006-02-01 22:26:27 -0500
  RT-Ticket: 7295
  RT-Status: resolved
  RT-Update: correspond
  
  We now order scrips by their description, so you can force them to run in a
  particular order by prepending numbers to their descriptions.  Updated the
  perldoc and EditScrips UI element to reflect this and wrote tests for it.
 
 r1690 at cubic-pc (orig r4463):  kevinr | 2006-02-02 08:04:27 +0300
  r10741 at RANDOM-THREE-NINETY-TWO:  kevinr | 2006-02-02 00:03:25 -0500
  * Updated the UPGRADING document to reflect the new scrip ordering
 
 r1691 at cubic-pc (orig r4499):  ruz | 2006-02-06 22:35:37 +0300
 * opened FILE, but reading from <file>, use $fh instead
 ** result off tidy script
 * turn on binmode on handle
 * flush buffers, otherwise we load all file into memmory
 
 r1695 at cubic-pc (orig r4500):  ruz | 2006-02-06 22:47:28 +0300
 * backport from 3.7
 * add support for optional OPERATOR argument in LimitLinked(From|To)
 * and add this to methods Limit(HasMemeber|DependsOn|...)
 * in _LinkLimit:
 ** support for IS NOT NULL queries ala "has at least one link of defined type"
 ** operator '!=' didn't work at all, now it works with meanning "has no link with defined ticket"
 


Modified: rt/branches/3.7-EXPERIMENTAL/README
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/README	(original)
+++ rt/branches/3.7-EXPERIMENTAL/README	Mon Feb  6 15:04:21 2006
@@ -147,6 +147,13 @@
        /opt/rt3/sbin/rt-setup-database --action insert \
             --datadir etc/upgrade/<version>
 
+     Clear mason cache dir:
+
+       rm -fr /opt/rt3/var/mason_data/obj
+
+     Stop and start web-server.
+
+
 8  If you're upgrading from RT 2.0:
 
     Please upgrade from RT 2.0 to RT 3.2 and then follow the instructions

Modified: rt/branches/3.7-EXPERIMENTAL/UPGRADING
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/UPGRADING	(original)
+++ rt/branches/3.7-EXPERIMENTAL/UPGRADING	Mon Feb  6 15:04:21 2006
@@ -16,6 +16,15 @@
 
 *******
 
+UPGRADING FROM 3.5.7 and earlier - Changes:
+
+Scrips are now prepared and committed in order alphanumerically by description.
+This means that you can prepend a number (00, 07, 15, 24) to the beginning of
+each scrip's description, and they will run in that order.  Depending on your
+database, the old ordering may have been by scrip id number -- if that is the
+case, simply prepend the scrip id number to the beginning of its description.
+
+
 UPGRADING FROM 3.5.1 and earlier - Changes:
 
 The default for $RedistributeAutoGeneratedMessages has changed to

Modified: rt/branches/3.7-EXPERIMENTAL/bin/rt.in
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/bin/rt.in	(original)
+++ rt/branches/3.7-EXPERIMENTAL/bin/rt.in	Mon Feb  6 15:04:21 2006
@@ -1334,10 +1334,10 @@
 Title: introduction
 Text:
 
-    ** THIS IS AN UNSUPPORTED PREVIEW RELEASE **
-    ** PLEASE REPORT BUGS TO rt-bugs at fsck.com **
+     ** THIS IS AN UNSUPPORTED PREVIEW RELEASE **
+     ** PLEASE REPORT BUGS TO rt-bugs at bestpractical.com **
 
-    This is a command-line interface to RT 3.
+    This is a command-line interface to RT 3.0 or newer
 
     It allows you to interact with an RT server over HTTP, and offers an
     interface to RT's functionality that is better-suited to automation

Modified: rt/branches/3.7-EXPERIMENTAL/etc/RT_Config.pm.in
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/etc/RT_Config.pm.in	(original)
+++ rt/branches/3.7-EXPERIMENTAL/etc/RT_Config.pm.in	Mon Feb  6 15:04:21 2006
@@ -35,16 +35,16 @@
 # token matching and that you should use only "non-capturing" parenthesis
 # grouping. For example:
 #
-# 	Set($EmailSubjectTagRegex, qr/(?:example.com|example.org)/ );
+# 	Set($EmailSubjectTagRegex, qr/(?:example.com|example.org)/i );
 #
 # and NOT
 # 
-# 	Set($EmailSubjectTagRegex, qr/(example.com|example.org)/ );
+# 	Set($EmailSubjectTagRegex, qr/(example.com|example.org)/i );
 #
 # This setting would make RT behave exactly as it does without the 
 # setting enabled.
 #
-# Set($EmailSubjectTagRegex, qr/\Q$rtname\E/ );
+# Set($EmailSubjectTagRegex, qr/\Q$rtname\E/i );
 
 
 
@@ -210,6 +210,11 @@
 # These options are good for most sendmail wrappers and workalikes
 Set($SendmailArguments , "-oi -t");
 
+# $SendmailBounceArguments defines what flags to pass to $Sendmail
+# assuming RT needs to send an error (ie. bounce).
+
+Set($SendmailBounceArguments , '-f "<>"');
+
 # These arguments are good for sendmail brand sendmail 8 and newer
 #Set($SendmailArguments,"-oi -t -ODeliveryMode=b -OErrorMode=m");
 
@@ -524,6 +529,11 @@
 Set(@ActiveStatus, qw(new open stalled));
 Set(@InactiveStatus, qw(resolved rejected deleted));
 
+# Backward compatability setting. Add/Delete Link used to record one
+# transaction and run one scrip. Set this value to 0 if you want
+# both link transactions to have a scrip run.
+Set($LinkTransactionsRun1Scrip , 1);
+
 # }}}
 
 

Modified: rt/branches/3.7-EXPERIMENTAL/etc/schema.mysql
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/etc/schema.mysql	(original)
+++ rt/branches/3.7-EXPERIMENTAL/etc/schema.mysql	Mon Feb  6 15:04:21 2006
@@ -58,7 +58,6 @@
   PRIMARY KEY (id)
 ) TYPE=InnoDB;
 
-CREATE UNIQUE INDEX Links1 ON Links (Base, Target, Type) ;
 CREATE INDEX Links2 ON Links (Base,  Type) ;
 CREATE INDEX Links3 ON Links (Target,  Type) ;
 CREATE INDEX Links4 ON Links (Type,LocalBase);

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/CustomFields/Modify.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/CustomFields/index.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/CreateUserCalled
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditCustomFields
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditCustomFields	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditCustomFields	Mon Feb  6 15:04:21 2006
@@ -88,6 +88,20 @@
 $ObjectCFs->LimitToObjectId($id);
 $ObjectCFs->LimitToLookupType($lookup);
 
+# Check sanity of SortOrders
+my %SortOrders;
+$SortOrders{ $_->SortOrder }++
+  while ($_ = $ObjectCFs->Next);
+
+# If there are duplicates, run though and squash them
+if (grep $_ > 1, values %SortOrders) {
+    my $i = 1;
+    while ( my $ObjectCF = $ObjectCFs->Next ) {
+        $ObjectCF->SetSortOrder( $i++ );
+    }
+    $ObjectCFs->GotoFirstItem;
+}
+
 # {{{ deal with moving sortorder of custom fields
 if ($CustomField and $Move) {
     my $SourceObj = RT::ObjectCustomField->new($session{'CurrentUser'});

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditQueueWatchers
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditScrips
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditScrips	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditScrips	Mon Feb  6 15:04:21 2006
@@ -74,6 +74,7 @@
 	Caption => loc("Delete selected scrips"), 
 	Label => loc("Delete") &>
 </form>
+
 <%init>
 my (@actions);
 
@@ -92,6 +93,7 @@
         $Scrips->LimitToGlobal();
 }                                           
 
+$Scrips->OrderBy( FIELD => 'description' );
 
 
 

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditUserComments
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditUserComments	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/EditUserComments	Mon Feb  6 15:04:21 2006
@@ -46,7 +46,7 @@
 <& /Elements/Header, Title => "Comments about $name" &>
 <&|/l&>These comments aren't generally visible to the user</&>:<br />
 <input type="hidden" class="hidden" name="id" value="<%$id%>" />
-<textarea cols="60" rows="15" wrap="SOFT" name="Comments"><% $UserObj->Comments %></textarea>
+<textarea cols="60" rows="15" wrap="soft" name="Comments"><% $UserObj->Comments %></textarea>
 </form>
 
 <%ARGS>

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/ListGlobalScrips
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/ModifyTemplate
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/ModifyTemplate	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/ModifyTemplate	Mon Feb  6 15:04:21 2006
@@ -65,7 +65,7 @@
 <&|/l&>Content</&>:<br />
 </td>
 <td>
-<textarea name="Content" rows="25" cols="80" wrap="SOFT">
+<textarea name="Content" rows="25" cols="80" wrap="soft">
 <%$Content%></textarea>
 </td>
 </tr>

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/PickCustomFields
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/PickCustomFields	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/PickCustomFields	Mon Feb  6 15:04:21 2006
@@ -57,7 +57,7 @@
   </td>
 %   }
   <td valign="top">
-    <a href="<%RT->Config->Get('WebPath')%>/Admin/CustomFields/Modify.html?id=<%$CustomFieldObj->id()%>">
+    <a href="<% RT->Config->Get('WebPath') %>/Admin/CustomFields/Modify.html?id=<%$CustomFieldObj->id()%>">
 % if ($CustomFieldObj->Name) {
 <b><%$CustomFieldObj->Name%></b>
 % } else {

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/SelectNewGroupMembers
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/SelectNewGroupMembers	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/SelectNewGroupMembers	Mon Feb  6 15:04:21 2006
@@ -45,19 +45,21 @@
 %# END BPS TAGGED BLOCK }}}
 % if ($Show ne 'Groups') {
 <b><&|/l&>Users</&></b>
-<select multiple name="<%$Name%>Users"  size="10">
-%while (my $user = $users->Next) {
+<select multiple name="<% $Name %>Users"  size="10">
+% while ( my $user = $users->Next ) {
+% next if $SkipUsers->{$user->id};
 <option value="User-<%$user->id%>"><%$user->Name%></option>
-%}
+% }
 </select>
 <br />
 % }
 % if ($Show ne 'Users') {
 <b><&|/l&>Groups</&></b>
-<select multiple name="<%$Name%>Groups"  size="10">
-%while (my $group = $groups->Next) {
+<select multiple name="<% $Name %>Groups"  size="10">
+% while ( my $group = $groups->Next ) {
+% next if $SkipGroups->{$group->id};
 <option value="Group-<%$group->id%>"><%$group->Name%></option>
-%}
+% }
 </select>
 % }
 
@@ -90,4 +92,6 @@
 $Name => 'Users'
 $Show => 'All'
 $Group
+$SkipUsers => {}
+$SkipGroups => {}
 </%ARGS>

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Elements/SelectStage
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Groups/Members.html
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Admin/Groups/Members.html	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Admin/Groups/Members.html	Mon Feb  6 15:04:21 2006
@@ -74,27 +74,30 @@
 <br />
 <br />
 <&|/l&>Users</&>
-% my $UserMembers = $Group->MembersObj;
-% $UserMembers->LimitToUsers();
+% my $Users = $Group->UserMembersObj;
+% $Users->OrderBy( FIELD => $UserOrderBy, ORDER => $UserOrder );
 <ul>
-% while (my $member = $UserMembers->Next()) {
-<li><input type="checkbox" class="checkbox" name="DeleteMember-<%$member->MemberId%>" value="1" />
-<%$member->MemberObj->Object->Name%> (<%$member->MemberObj->Object->RealName%>)
+% while ( my $user = $Users->Next ) {
+% $UsersSeen{ $user->id } = 1 if $SkipSeenUsers;
+<li><input type="checkbox" class="checkbox" name="DeleteMember-<% $user->PrincipalObj->Id %>" value="1" />
+<% $user->Name %> (<% $user->RealName %>)
 % }
 </ul>
 <&|/l&>Groups</&>
 <ul>
 % my $GroupMembers = $Group->MembersObj;
 % $GroupMembers->LimitToGroups();
-% while (my $member = $GroupMembers->Next()) {
-<li><input type="checkbox" class="checkbox" name="DeleteMember-<%$member->MemberId%>" value="1" />
-<%$member->MemberObj->Object->Name%>
+% while ( my $member = $GroupMembers->Next ) {
+% $GroupsSeen{ $member->MemberId } = 1 if $SkipSeenGroups;
+<li><input type="checkbox" class="checkbox" name="DeleteMember-<% $member->MemberId %>" value="1" />
+<% $member->MemberObj->Object->Name %>
 % }
 % }
 </ul>
 </td>
 <td valign="top">
-<& /Admin/Elements/SelectNewGroupMembers, Name => "AddMembers", Group => $Group &>
+<& /Admin/Elements/SelectNewGroupMembers, Name => "AddMembers", Group => $Group,
+    SkipUsers => \%UsersSeen, SkipGroups => \%GroupsSeen &>
 </td>
 </tr>
 </table>
@@ -108,26 +111,20 @@
 my $Group = new RT::Group($session{'CurrentUser'});
 $Group->Load($id) || Abort(loc('Could not load group'));
 
+my (%UsersSeen, %GroupsSeen);
+$GroupsSeen{ $Group->id } = 1; # can't be a member of ourself
+
 my (@results);
 
-my $key;
-foreach $key (keys %ARGS) {
+# XXX: safe member id in value instead of name
+foreach my $key (keys %ARGS) {
+    next unless $key =~ /^DeleteMember-(\d+)$/;
 
-if ($key =~ /^DeleteMember-(\d+)$/) {
-    my $id = $1; 
-    my ($val,$msg) = $Group->DeleteMember($id);
+    my ($val,$msg) = $Group->DeleteMember($1);
     push (@results, $msg);
 }
-}
 
-# Make sure AddMembers is always an array
-my @AddMembers = (
-    ((ref $AddMembersUsers eq 'ARRAY') ? @{$AddMembersUsers} : ($AddMembersUsers)),
-    ((ref $AddMembersGroups eq 'ARRAY') ? @{$AddMembersGroups} : ($AddMembersGroups)),
-);
-
-foreach my $member (@AddMembers) {
-    next unless ($member);
+foreach my $member (grep $_, @AddMembersUsers, @AddMembersGroups) {
 
     my $principal;
 
@@ -146,11 +143,14 @@
     push (@results, $msg);
 }
 
-
 </%INIT>
 
 <%ARGS>
-$AddMembersUsers  => undef
-$AddMembersGroups => undef
+ at AddMembersUsers  => ()
+ at AddMembersGroups => ()
 $id => undef
+$UserOrderBy => 'Name'
+$UserOrder => 'ASC'
+$SkipSeenUsers => 1
+$SkipSeenGroups => 1
 </%ARGS>

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Groups/Modify.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Groups/index.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Queues/Modify.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Queues/index.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Users/Modify.html
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Admin/Users/Modify.html	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Admin/Users/Modify.html	Mon Feb  6 15:04:21 2006
@@ -219,12 +219,12 @@
 <tr>
 <td colspan="2">
 <&| /Widgets/TitleBox, title => loc('Comments about this user') &>
-<textarea class="comments" name="Comments" cols="80" rows="5" wrap="VIRTUAL"><%$UserObj->Comments%></textarea>
+<textarea class="comments" name="Comments" cols="80" rows="5" wrap="virtual"><%$UserObj->Comments%></textarea>
 </&>
 %if ($UserObj->Privileged) {
 <br />
 <&| /Widgets/TitleBox, title => loc('Signature') &>
-<textarea class="signature" cols="80" rows="5" name="Signature" wrap="HARD"><%$UserObj->Signature%></textarea>
+<textarea class="signature" cols="80" rows="5" name="Signature" wrap="hard"><%$UserObj->Signature%></textarea>
 </&>
 % }
 

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/Users/index.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Admin/index.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/Callback
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/Callback	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/Callback	Mon Feb  6 15:04:21 2006
@@ -68,14 +68,14 @@
         push @$callbacks,
             # Skip backup files, files without a leading package name,
             # and files we've already seen
-            grep {     !/^\.|~$/
-                   and $_ ne "/Callbacks/$Page/$_CallbackName"
-                   and not $seen{$_}++ }
+            grep      !/\/\.|~$/
+                   && $_ ne "/Callbacks/$Page/$_CallbackName"
+                   && !$seen{$_}++,
                  $m->interp->resolver->glob_path($path, $root);
     }
     
     $m->notes($CacheKey => $callbacks);
-    $cache{$Page,$_CallbackName} = $callbacks if !RT->Config->Get('DevelMode');
+    $cache{ $CacheKey } = $callbacks unless RT->Config->Get('DevelMode');
 }
 
 my @rv;

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/CollectionAsTable/Header
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/CollectionAsTable/ParseFormat
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/CollectionAsTable/ParseFormat	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/CollectionAsTable/ParseFormat	Mon Feb  6 15:04:21 2006
@@ -48,7 +48,7 @@
 </%ARGS>
 
 <%init>
-use Regexp::Common;
+use Regexp::Common qw/delimited/;
 my @Columns;
 
 while ($Format =~ /($RE{delimited}{-delim=>qq{\'"}}|[{}\w.]+)/go) {

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/CollectionAsTable/Row
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/CollectionAsTable/Row	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/CollectionAsTable/Row	Mon Feb  6 15:04:21 2006
@@ -73,6 +73,7 @@
 
     $m->out('<td class="collection-as-table" ');
     $m->out( 'align="' . $column->{align} . '"' ) if $column->{align};
+    $m->out( 'style="' . $column->{style} . '"' ) if ( $column->{style} );
     $m->out('>');
 
     foreach my $subcol ( @{ $column->{output} } ) {

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomField
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomField	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomField	Mon Feb  6 15:04:21 2006
@@ -57,6 +57,10 @@
     $Values = $Object->CustomFieldValues($CustomField->id);
     $Values->Columns( qw( id CustomField ObjectType ObjectId Disabled Content ContentType ContentEncoding ) );
     $NamePrefix ||= join('-', 'Object', ref($Object), $Object->Id, 'CustomField', '');
+} elsif (not $Default) {
+    my %TOP = $m->request_args;
+    $Default = $TOP{ $NamePrefix .$CustomField->Id . '-Values' }
+            || $TOP{ $NamePrefix .$CustomField->Id . '-Value' };
 }
 
 my $MaxValues = $CustomField->MaxValues;

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomFieldBinary
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomFieldBinary	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomFieldBinary	Mon Feb  6 15:04:21 2006
@@ -43,12 +43,12 @@
 %# those contributions and any derivatives thereof.
 %# 
 %# END BPS TAGGED BLOCK }}}
-% while ($Values and my $value = $Values->Next ) {
+% while ( $Values and my $value = $Values->Next ) {
 %# XXX - let user download the file(s) here?
 <input type="checkbox" class="checkbox" name="<%$NamePrefix%><%$CustomField->Id%>-DeleteValueIds" value="<% $value->Id %>" /><a href="<%RT->Config->Get('WebPath')%>/Download/CustomFieldValue/<% $value->Id %>/<% $value->Content %>"><% $value->Content %></a><br />
 % }
-% if (!$MaxValues or !$Values or $Values->Count < $MaxValues) {
-<input type="file" name="<%$NamePrefix%><%$CustomField->Id%>-Upload" />
+% if (!$MaxValues || !$Values || $Values->Count < $MaxValues) {
+<input type="file" name="<% $NamePrefix %><% $CustomField->Id %>-Upload" />
 % }
 <%ARGS>
 $Object => undef

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomFieldSelect
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomFieldSelect	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/EditCustomFieldSelect	Mon Feb  6 15:04:21 2006
@@ -83,7 +83,6 @@
 <%METHOD options>
 % my $selected;
 % my $CFVs = $CustomField->Values;
-% use Data::Dumper; # $CFVs->First; $RT::Logger->crit( Dumper( $CFVs ) );
 % my @levels;
 % while ( my $value = $CFVs->Next ) {
 %       my $name = $value->Name;
@@ -106,7 +105,7 @@
 %           push @levels, $level;
 %       }
         <option value="<% $name %>"
-%       if ( ( $Default eq $name ) || ( $Values && $Values->HasEntry( $name ) ) ) {
+%       if ( grep( $_ eq $name, @Default ) || ( $Values && $Values->HasEntry( $name ) ) ) {
 %           $$SelectedRef = 1;
             selected
 %       }
@@ -117,7 +116,7 @@
 % }
 <%ARGS>
 $CustomField => undef
-$Default => ''
+ at Default => ()
 $Values => undef
 $SelectedRef => undef
 $CategoryRef => undef

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/Error
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/GotoTicket
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/GotoTicket	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/GotoTicket	Mon Feb  6 15:04:21 2006
@@ -43,4 +43,6 @@
 %# those contributions and any derivatives thereof.
 %# 
 %# END BPS TAGGED BLOCK }}}
-<form action="<%RT->Config->Get('WebPath')%>/Ticket/Display.html"><input type="submit" class="button" value="<&|/l&>Goto ticket</&>" />&nbsp;<input size="5" name="id" accesskey="0" /></form>
+<form action="<% RT->Config->Get('WebPath') %>/Ticket/Display.html">
+<input type="submit" class="button" value="<&|/l&>Goto ticket</&>" />&nbsp;<input size="5" name="id" accesskey="0" />
+</form>

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/Header
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/Header	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/Header	Mon Feb  6 15:04:21 2006
@@ -82,12 +82,12 @@
     <span class="hide"><a href="#skipnav"><&|/l&>Skip Menu</&></a> | </span>
 % if ($session{'CurrentUser'}->Name) {
     <&|/l, "<span>".$session{'CurrentUser'}->Name."</span>" &>Logged in as [_1]</&>
+%     if ( $session{'CurrentUser'}->HasRight( Right => 'ModifySelf', Object => $RT::System ) ) {
+    | <a href="<%RT->Config->Get('WebPath')%><%$Prefs%>"><&|/l&>Preferences</&></a>
+%     }
 % } else {
     <&|/l&>Not logged in.</&>
 % }
-%if ($session{'CurrentUser'}->HasRight( Right => 'ModifySelf', Object => $RT::System )) {
-    | <a href="<%RT->Config->Get('WebPath')%><%$Prefs%>"><&|/l&>Preferences</&></a>
-% }
   <& /Elements/Callback, %ARGS &>
 % unless (!$session{'CurrentUser'}->Name
 %         or (RT->Config->Get('WebExternalAuth') and !RT->Config->Get('WebFallbackToInternalAuth'))) {

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/ListActions
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/ListActions	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/ListActions	Mon Feb  6 15:04:21 2006
@@ -43,7 +43,6 @@
 %# those contributions and any derivatives thereof.
 %# 
 %# END BPS TAGGED BLOCK }}}
-% if (@actions) {
 <&| /Widgets/TitleBox, title => loc('Results') &>
   <ul class="action-results">
 % foreach my $action (@actions) {
@@ -55,9 +54,9 @@
 % }
   </ul>
 </&>
-% }
 <%init>
- at actions = grep (/./, at actions);
+ at actions = grep $_, @actions;
+return unless @actions;
 </%init>
 <%ARGS>
 @actions => undef

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/Login
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/Logo
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/Logo	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/Logo	Mon Feb  6 15:04:21 2006
@@ -43,12 +43,15 @@
 %# those contributions and any derivatives thereof.
 %# 
 %# END BPS TAGGED BLOCK }}}
-  <div id="logo">
-    <a href="http://bestpractical.com"><img src="<%RT->Config->Get('WebImagesURL')%>/bplogo.gif" alt="<%loc("Best Practical Solutions, LLC corporate logo")%>" width="177" height="33" /></a>
-% if ($show_name) {
-    <div class="rtname"><% loc("RT for [_1]", RT->Config->Get('rtname')) %></div>
+<div id="logo">
+<a href="http://bestpractical.com"><img
+    src="<%RT->Config->Get('WebImagesURL')%>/bplogo.gif"
+    alt="<% loc("Best Practical Solutions, LLC corporate logo") %>"
+    width="177" height="33" /></a>
+% if ( $show_name ) {
+    <span class="rtname"><% loc("RT for [_1]", RT->Config->Get('rtname')) %></span>
 % }
-  </div>
-<%args>
-  $show_name => 1
-</%args>
+</div>
+<%ARGS>
+$show_name => 1
+</%ARGS>

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/Menu
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/Menu	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/Menu	Mon Feb  6 15:04:21 2006
@@ -84,7 +84,13 @@
 %
 %     $class->{li} = join ' ', @li;
 %     
-  <li<% $class->{li} ? qq[ class="$class->{li}"] : ''|n %>><% $count > 1 && !$postsep && qq[<span class="bullet">&#183; </span>]|n%><a href="<%RT->Config->Get('WebPath')%>/<%$toptabs->{$tab}->{'path'}%>"<% $class->{a} && qq[ class="$class->{a}"] |n%><% !$level && " accesskey='".$accesskey++."'" |n%>><% $toptabs->{$tab}->{'title'}%></a>
+    <li<% $class->{'li'} ? qq[ class="$class->{li}"] : ''|n %> >
+    <% $count > 1 && !$postsep && qq[<span class="bullet">&#183; </span>]|n%>
+    <a href="<% RT->Config->Get('WebPath') %>/<% $toptabs->{$tab}->{'path'} %>"
+      <% $class->{a} && qq[ class="$class->{a}"] |n %>
+      <% !$level && " accesskey='".$accesskey++."'" |n %>>
+    <% $toptabs->{$tab}->{'title'}%></a>
+
 %# Second-level items
 %     if ($toptabs->{$tab}->{'subtabs'}
 %         and keys %{$toptabs->{$tab}->{'subtabs'}})

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/MessageBox
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/MessageBox	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/MessageBox	Mon Feb  6 15:04:21 2006
@@ -46,7 +46,7 @@
 <textarea class="messagebox" cols="<%$Width%>" rows="<%$Height%>" wrap="<%$Wrap%>" name="<%$Name%>"><& /Elements/Callback, %ARGS &><% $Default %><%$message%><%$IncludeSignature ? $signature : ''%></textarea>
 <%INIT>
 
-my ($message);
+my $message = '';
 
 if ($QuoteTransaction) {
     my $transaction=RT::Transaction->new($session{'CurrentUser'});

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/MyRT
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/PageLayout
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/PageLayout	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/PageLayout	Mon Feb  6 15:04:21 2006
@@ -196,7 +196,7 @@
 %# This function recurses through the menu and returns the second to
 %# last menu, that is, the menu holding the last reference to
 %# and submenu.  It also returns the number of menu levels minus
-%# the last submenu (used for CSS calcs later (HACK)).
+%# the last submenu.
 <%def .menu_recurse>
   <%args>
       $data   => { }

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/QueryString
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/QueryString	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/QueryString	Mon Feb  6 15:04:21 2006
@@ -45,13 +45,17 @@
 %# END BPS TAGGED BLOCK }}}
 <%init>
 my @params;
-while ( (my $key, my $value) = each %ARGS ){
+while ( my ($key, $value) = each %ARGS ){
+    if( UNIVERSAL::isa( $value, 'ARRAY' ) ) {
+	push @params, map $key."=".$m->interp->apply_escapes($_,'u'), @$value;
+    } else {
   if (ref $value eq "ARRAY") {
     push @params, $key."=".$m->interp->apply_escapes($_, 'u')
       for @{$value};
   } else {
     push @params, $key."=".$m->interp->apply_escapes($value,'u');
   }
+    }
 }
 return(join('&', at params));
 </%init>

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/QueueSummary
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/QuickCreate
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/RT__Ticket/ColumnMap
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/RT__Ticket/ColumnMap	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/RT__Ticket/ColumnMap	Mon Feb  6 15:04:21 2006
@@ -102,17 +102,17 @@
     my $mode            = $RT::Ticket::LINKTYPEMAP{$method}{Mode};
     my $type            = $RT::Ticket::LINKTYPEMAP{$method}{Type};
     my $other_mode      = ($mode eq "Target" ? "Base" : "Target");
-    my $mode_uri        = $other_mode.'URI';
-    my $local_type      = 'Local'.$other_mode;
+    my $mode_uri        = $mode.'URI';
+    my $local_type      = 'Local'.$mode;
 
     return sub {
         map {
             \'<a href="',
             $_->$mode_uri->Resolver->HREF,
             \'">',
-            ( $_->$mode_uri->IsLocal ? $_->$local_type : $_->$other_mode ),
+            ( $_->$mode_uri->IsLocal ? $_->$local_type : $_->$mode ),
             \'</a><br />',
-        } @{ $_[0]->Links($mode,$type)->ItemsArrayRef }
+        } @{ $_[0]->Links($other_mode,$type)->ItemsArrayRef }
     }
 }
 

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/RefreshHomepage
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/ScrubHTML
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/ScrubHTML	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/ScrubHTML	Mon Feb  6 15:04:21 2006
@@ -63,7 +63,7 @@
 
 $scrubber->deny(qw[*]);
 $scrubber->allow(
-    qw[A B U P BR I HR BR SMALL EM FONT SPAN DIV UL OL LI DL DT DD]);
+    qw[A B U P BR I HR BR SMALL EM FONT SPAN DIV UL OL LI DL DT DD PRE]);
 $scrubber->comment(0);
 return ( $scrubber->scrub($Content) );
 </%init>

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/SelectCustomFieldOperator
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/SelectDate
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/SelectDate	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/SelectDate	Mon Feb  6 15:04:21 2006
@@ -67,7 +67,7 @@
 $ShowTime => undef
 $menu_prefix=>''
 $current=>time
-$Default => undef
+$Default => ''
 $Name => undef
 $Size => 16
 </%args>

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/SelectWatcherType
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/SelectWatcherType	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/SelectWatcherType	Mon Feb  6 15:04:21 2006
@@ -48,7 +48,7 @@
 <option value="">-</option>
 % }
 %for my $option (@types) {
-<option value="<%$option%>" <%$option eq $Default && "SELECTED"%>><%loc($option)%></option>
+<option value="<%$option%>" <%defined($Default) && $option eq $Default && "SELECTED"%>><%loc($option)%></option>
 %}
 </select>
 

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/ShowCustomFieldImage
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/ShowCustomFields
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/ShowCustomFields	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/ShowCustomFields	Mon Feb  6 15:04:21 2006
@@ -71,6 +71,9 @@
 </table>
 <%INIT>
 my $CustomFields = $Object->CustomFields;
+ $m->comp('/Elements/Callback', _CallbackName => 'MassageCustomFields',
+                                CustomFields => $CustomFields);
+
 </%INIT>
 <%ARGS>
 $Object => undef

Modified: rt/branches/3.7-EXPERIMENTAL/html/Elements/TicketList
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Elements/TicketList	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Elements/TicketList	Mon Feb  6 15:04:21 2006
@@ -141,7 +141,7 @@
 my ($maxitems, $item) = (0, 0);
 foreach my $col (@Format) {
     $item++;
-    if ( $col->{title} eq 'NEWLINE' ) {
+    if ( $col->{title} && ($col->{title} eq 'NEWLINE') ) {
         $item = 0;
     }
     else {

Modified: rt/branches/3.7-EXPERIMENTAL/html/NoAuth/Logout.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/header.css
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/header.css	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/header.css	Mon Feb  6 15:04:21 2006
@@ -8,7 +8,6 @@
     margin: 0;
     padding: 0;
     color: #930;
-    display: inline;
     position: relative;
     font-size: 2em;
     font-weight: bold;

Modified: rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/nav.css
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/nav.css	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/nav.css	Mon Feb  6 15:04:21 2006
@@ -3,7 +3,9 @@
     font-size: 1.1em;
 }
 
-#nav #system-menu {
+#nav #system-menu,
+#nav ul
+{
     min-width: 85%;
 }
 

Modified: rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/titlebox.css
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/titlebox.css	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/NoAuth/css/3.5-default/titlebox.css	Mon Feb  6 15:04:21 2006
@@ -34,7 +34,7 @@
 
 #login-box .titlebox .titlebox-content
 {
-    background: inherit;
+    background: none;
     border: none;
 }
 

Modified: rt/branches/3.7-EXPERIMENTAL/html/NoAuth/js/util.js
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Prefs/MyRT.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Prefs/SearchOptions.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/REST/1.0/Forms/ticket/default
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/REST/1.0/Forms/ticket/default	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/REST/1.0/Forms/ticket/default	Mon Feb  6 15:04:21 2006
@@ -127,6 +127,18 @@
             if (exists $create{lc $k}) {
                 $v{$create{lc $k}} = delete $data{$k};
             }
+            # Set custom field
+            elsif ($k =~ /^CF-/i) {
+                my $cf = RT::CustomField->new( $RT::SystemUser );
+                my $cfk = $k;
+                $cfk =~ s/^CF-//i;
+                unless($cf->LoadByName( Name => $cfk )) {
+                    push @comments, "# Invalid custom field name ($cfk)";
+                    delete $data{$k};
+                    next;
+                }
+                $v{"CustomField-".$cf->Id()} = delete $data{$k};
+            }
             elsif (lc $k eq 'text') {
                 $text = delete $data{$k};
             }
@@ -190,6 +202,17 @@
         push @data, [ $key => $val ];
     }
 
+    # Display custom fields
+    my $CustomFields = $ticket->QueueObj->CustomFields();
+    while (my $cf = $CustomFields->Next()) {
+        my $vals = $ticket->CustomFieldValues($cf->Id());
+        my @out = ();
+        while (my $v = $vals->Next()) {
+            push @out, $v->Content;
+        }
+        push @data, [ 'CF-' . $cf->Name => join ',', @out ];
+    }
+
     my %k = map {@$_} @data;
     $o = [ map {$_->[0]} @data ];
     $k = \%k;
@@ -271,6 +294,20 @@
                 $s =~ s/^# //;
             }
         }
+        # Set custom field
+        elsif ($key =~ /^CF-/i) {
+            my $cf = RT::CustomField->new( $RT::SystemUser );
+            $key =~ s/^CF-//i;
+            if (not $cf->LoadByName( Name => $key )) {
+                $n = 0;
+                $s = "Unknown custom field.";
+            }
+            else {
+                ($n, $s) = $ticket->AddCustomFieldValue(
+                             Field => $cf, Value => $val );
+                $s =~ s/^# // if defined $s;
+            }
+        }
         elsif ($key ne 'id' && $key ne 'type' && $key ne 'creator') {
             $n = 0;
             $s = "Unknown field.";

Modified: rt/branches/3.7-EXPERIMENTAL/html/Search/Build.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Search/Bulk.html
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Search/Bulk.html	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Search/Bulk.html	Mon Feb  6 15:04:21 2006
@@ -54,7 +54,7 @@
     Order => $Order &>
 
 <& /Elements/ListActions, actions => \@results &>
-<form method="post" action="<%RT->Config->Get('WebPath')%>/Search/Bulk.html" enctype="multipart/form-data">
+<form method="post" action="<% RT->Config->Get('WebPath') %>/Search/Bulk.html" enctype="multipart/form-data">
 % foreach my $var qw(Query Format OrderBy Order Rows Page) {
 <input type="hidden" class="hidden" name="<%$var%>" value="<%$ARGS{$var}%>" />
 %}

Modified: rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/BuildFormatString
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/BuildFormatString	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/BuildFormatString	Mon Feb  6 15:04:21 2006
@@ -219,11 +219,11 @@
 foreach my $field (@seen) {
     next unless $field;
     my $row = "'";
-    $row .= $field->{Prefix} if defined $field->{Prefix};
-    $row .= "__" . ($field->{Column} =~ m/\(/ ? $field->{Column} # func, don't escape
-		    : $m->interp->apply_escapes( $field->{Column}, 'h' )) . "__"
-      unless ( $field->{Column} eq "<blank>" );
-    $row .= $field->{Suffix} if defined $field->{Suffix};
+    $row .= $field->{'Prefix'} if defined $field->{'Prefix'};
+    $row .= "__" . ($field->{'Column'} =~ m/\(/ ? $field->{'Column'} # func, don't escape
+		    : $m->interp->apply_escapes( $field->{'Column'}, 'h' )) . "__"
+      unless ( $field->{'Column'} eq "<blank>" );
+    $row .= $field->{'Suffix'} if defined $field->{'Suffix'};
     $row .= "'";
     push( @format_string, $row );
 }

Modified: rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/Chart
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/DisplayOptions
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/EditQuery
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/EditSearches
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/PickBasics
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Search/Elements/PickCriteria
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Search/Results.html
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Search/Results.html	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Search/Results.html	Mon Feb  6 15:04:21 2006
@@ -64,12 +64,12 @@
     BaseURL => RT->Config->Get('WebPath')."/Search/Results.html?"
 
    &>
-% my @vars = (Query => $Query, Format => $Format,  Rows => $Rows, OrderBy => $OrderBy,  Order => $Order, HideResults => $HideResults, Page => $Page );
+% my %hiddens = (Query => $Query, Format => $Format, Rows => $Rows, OrderBy => $OrderBy, Order => $Order, HideResults => $HideResults, Page => $Page );
 <div align="right">
 <form method="get" action="<%RT->Config->Get('WebPath')%>/Search/Results.html">
-%while (my $var = shift (@vars)) {
-<input type="hidden" class="hidden" name="<%$var%>" value="<%shift(@vars)%>" />
-%}
+% foreach my $key (keys(%hiddens)) {
+<input type="hidden" class="hidden" name="<%$key%>" value="<% defined($hiddens{$key})?$hiddens{$key}:'' %>" />
+% }
 <& /Elements/Refresh, Name => 'TicketsRefreshInterval', Default => $session {'tickets_refresh_interval'} &>
 <input type="submit" class="button" value="<&|/l&>Go!</&>" />
 </form>
@@ -81,10 +81,10 @@
 <a href="<%$RSSFeedURL%>"><&|/l&>RSS</&></a> |
 <a href="<%RT->Config->Get('WebPath')%>/Tools/Offline.html<%$ShortQueryString%>"><&|/l&>Work offline</&></a><br />
 <form method="get" action="<%RT->Config->Get('WebPath')%>/Search/Chart.html"><&|/l&>chart</&>
-% @vars = (Query => $Query, Format => $Format,  Rows => $Rows, OrderBy => $OrderBy,  Order => $Order);
-%while (my $var = shift (@vars)) {
-<input type="hidden" class="hidden" name="<%$var%>" value="<%shift(@vars)%>" />
-%}
+% %hiddens = (Query => $Query, Format => $Format, Rows => $Rows, OrderBy => $OrderBy, Order => $Order);
+% foreach my $key (keys(%hiddens)) {
+<input type="hidden" class="hidden" name="<%$key%>" value="<%defined($hiddens{$key})?$hiddens{$key}:''%>" />
+% }
 <&|/l, $m->scomp('Elements/SelectGroupBy', Name => 'PrimaryGroupBy') &>grouped by [_1]</&>
 <&|/l, $m->scomp('Elements/SelectChartType', Name => 'ChartStyle') &>style: [_1]</&>
 <input type="submit" class="button" value="<%loc('Go')%>" />
@@ -110,7 +110,7 @@
     $Rows = $prefs->{'RowsPerPage'};
 }
 else {
-    $Rows = 50;
+    $Rows ||= 50;
 }
 
 

Modified: rt/branches/3.7-EXPERIMENTAL/html/SelfService/Display.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/SelfService/Elements/GotoTicket
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/SelfService/Elements/GotoTicket	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/SelfService/Elements/GotoTicket	Mon Feb  6 15:04:21 2006
@@ -43,4 +43,6 @@
 %# those contributions and any derivatives thereof.
 %# 
 %# END BPS TAGGED BLOCK }}}
-<form action="<%RT->Config->Get('WebPath')%>/SelfService/Display.html"><input type="submit" class="button" value="<&|/l&>Goto ticket</&>" />&nbsp;<input size="4" name="id" /></form>
+<form action="<% RT->Config->Get('WebPath') %>/SelfService/Display.html" method="get">
+<input type="submit" class="button" value="<&|/l&>Goto ticket</&>" />&nbsp;<input size="4" name="id" />
+</form>

Modified: rt/branches/3.7-EXPERIMENTAL/html/SelfService/Elements/MyRequests
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/SelfService/Prefs.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Create.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Display.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/EditBasics
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/EditCustomFields
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/EditCustomFields	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/EditCustomFields	Mon Feb  6 15:04:21 2006
@@ -97,7 +97,8 @@
   $NamePrefix = "Object-RT::Ticket--CustomField-";
 }
 
-
+  $m->comp('/Elements/Callback', _CallbackName => 'MassageCustomFields',  
+                                CustomFields => $CustomFields);
 
 </%INIT>
 <%ARGS>

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/EditWatchers
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/PreviewScrips
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/Reminders
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/Reminders	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/Reminders	Mon Feb  6 15:04:21 2006
@@ -15,19 +15,21 @@
 if ( $request_args->{'update-reminders'} ) {
     while ( my $reminder = $reminder_collection->Next ) {
         if (   $reminder->Status ne 'resolved' && $request_args->{ 'Complete-Reminder-' . $reminder->id } ) {
-      
             $Ticket->Reminders->Resolve($reminder);
         }
         elsif ( $reminder->Status eq 'resolved' && !$request_args->{ 'Complete-Reminder-' . $reminder->id } ) {
             $Ticket->Reminders->Open($reminder);
         }
-        elsif ( $reminder->Subject ne $request_args->{ 'Reminder-Subject-' . $reminder->id } ) {
+
+        if ( exists( $request_args->{ 'Reminder-Subject-' . $reminder->id } ) && ( $reminder->Subject ne $request_args->{ 'Reminder-Subject-' . $reminder->id } )) {
             $reminder->SetSubject( $request_args->{ 'Reminder-Subject-' . $reminder->id } ) ;
         }
-        elsif ( $reminder->Owner != $request_args->{ 'Reminder-Owner-' . $reminder->id } ) {
+
+        if ( exists( $request_args->{ 'Reminder-Owner-' . $reminder->id } ) && ( $reminder->Owner != $request_args->{ 'Reminder-Owner-' . $reminder->id } )) {
             $reminder->SetOwner( $request_args->{ 'Reminder-Owner-' . $reminder->id } , "Force" ) ;
         }
-        elsif ( $reminder->DueObj->Date ne $request_args->{ 'Reminder-Due-' . $reminder->id } ) {
+
+        if ( exists( $request_args->{ 'Reminder-Due-' . $reminder->id } ) && ( $reminder->DueObj->Date ne $request_args->{ 'Reminder-Due-' . $reminder->id } )) {
             $reminder->SetDue( $request_args->{ 'Reminder-Due-' . $reminder->id } ) ;
         }
     }
@@ -80,7 +82,7 @@
 </div>
 <div class="input-row">
 <label class="horizontal" for="NewReminder-Owner" ><&|/l&>Owner</&>:</label> 
-<& /Elements/SelectOwner, Name => 'NewReminder-Owner', Queue => $Ticket->QueueObj, DefaultValue => 0 &>
+<& /Elements/SelectOwner, Name => 'NewReminder-Owner', QueueObj => $Ticket->QueueObj, DefaultValue => 0 &>
 </div>
 <div class="input-row">
 <label class="horizontal" for="NewReminder-Due" ><&|/l&>Due</&> <&|/l&>(yyyy/mm/dd)</&>:</label> 

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowAttachments
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowDates
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowDependencies
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowMembers
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowRequestor
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowTransactionAttachments
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowTransactionAttachments	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/ShowTransactionAttachments	Mon Feb  6 15:04:21 2006
@@ -68,7 +68,7 @@
 <div class="messagebody">
 <%PERL>
 # {{{ if it has a content-disposition: attachment, don't show inline
-unless ( $message->GetHeader('Content-Disposition') =~ /attachment/i ) {
+unless ( ($message->GetHeader('Content-Disposition')||"") =~ /attachment/i ) {
 
     my $content;
 
@@ -134,6 +134,11 @@
               . $message->Id
               . '/" />' );
     }
+    elsif ( $message->ContentLength > 0 ) {
+        $m->out(
+            loc( 'Message body not shown because it is too large or is not plain text.' )
+        );
+    }
 }
 
 # }}}

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/Tabs
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/Tabs	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Ticket/Elements/Tabs	Mon Feb  6 15:04:21 2006
@@ -120,10 +120,10 @@
     _E => { title => loc('Links'),
             path  => "Ticket/ModifyLinks.html?id=" . $id, },
     _F => { title => loc('Reminders'),
-            path  => "Ticket/Reminders.html?id=" . $id, },
+            path  => "Ticket/Reminders.html?id=" . $id,
+            separator => 1, },
     _X => { title => loc('Jumbo'),
-            path  => "Ticket/ModifyAll.html?id=" . $id,
-            separator => 1
+            path  => "Ticket/ModifyAll.html?id=" . $id, 
  },
 
 };

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/ModifyAll.html
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Ticket/ModifyAll.html	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Ticket/ModifyAll.html	Mon Feb  6 15:04:21 2006
@@ -148,6 +148,16 @@
 my (@wresults, @results,  @dresults, @lresults, @cf_results);
 
 unless ($OnlySearchForPeople) {
+    # There might be two owners. 
+    if ( ref ($ARGS{'Owner'} )) {
+        my @owners =@{$ARGS{'Owner'}};
+        delete $ARGS{'Owner'};
+        foreach my $owner(@owners){
+            $ARGS{'Owner'} = $owner unless ($Ticket->OwnerObj->id == $owner);
+        }
+
+    }
+
     @wresults   = ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS);
     @cf_results = ProcessObjectCustomFieldUpdates( Object => $Ticket, ARGSRef => \%ARGS);
     @dresults   = ProcessTicketDates( TicketObj => $Ticket, ARGSRef => \%ARGS);

Modified: rt/branches/3.7-EXPERIMENTAL/html/Ticket/Update.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Tools/MyDay.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/Tools/Offline.html
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/Tools/Offline.html	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/Tools/Offline.html	Mon Feb  6 15:04:21 2006
@@ -96,7 +96,7 @@
 
 </form>
 <%args>
-$requestoraddress => undef
+$requestoraddress => ''
 $qname => undef
 $string => undef
 </%args>

Modified: rt/branches/3.7-EXPERIMENTAL/html/User/Groups/Members.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/User/Groups/Modify.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/User/Prefs.html
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/html/User/Prefs.html	(original)
+++ rt/branches/3.7-EXPERIMENTAL/html/User/Prefs.html	Mon Feb  6 15:04:21 2006
@@ -78,7 +78,6 @@
   </tr>
 </table>
 </&>
-<br />
 <&| /Widgets/TitleBox, title => loc('Phone numbers') &>
 <table cellspacing="0" cellpadding="0">
   <tr>
@@ -99,6 +98,7 @@
   </tr>
 </table>
 </&>
+<& /Elements/Callback, _CallbackName => 'FormLeftColumn', UserObj => $UserObj, %ARGS &>
 </td>
 <td valign="top" class="boxcontainer">
 % unless (RT->Config->Get('WebExternalAuth') and !RT->Config->Get('WebFallbackToInternalAuth')) {
@@ -155,6 +155,7 @@
   </tr>
 </table>
 </&>
+<& /Elements/Callback, _CallbackName => 'FormRightColumn', UserObj => $UserObj, %ARGS &>
 </td>
 </tr>
 <tr>
@@ -165,7 +166,7 @@
 %if ($UserObj->Privileged) {
 <br />
 <&| /Widgets/TitleBox, title => loc('Signature') &>
-<textarea cols="80" rows="5" name="Signature" class="signature" wrap="HARD">
+<textarea cols="80" rows="5" name="Signature" class="signature" wrap="hard">
 <%$UserObj->Signature%></textarea>
 </&>
 % }
@@ -205,6 +206,12 @@
 		    AuthSystem HomePhone WorkPhone MobilePhone PagerPhone Address1
 		Address2 City State Zip Country Lang
 		   );
+
+    $m->comp('/Elements/Callback', _CallbackName => 'UpdateLogic',
+                                    fields        => \@fields,
+                                    results       => \@results,
+                                    UserObj       => $UserObj,
+                                    ARGSRef       => \%ARGS);
     
     my @fieldresults = UpdateRecordObject ( AttributesRef => \@fields,
 					    Object => $UserObj,

Modified: rt/branches/3.7-EXPERIMENTAL/html/Widgets/SelectionBox
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/html/index.html
==============================================================================

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Action/CreateTickets.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Action/CreateTickets.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Action/CreateTickets.pm	Mon Feb  6 15:04:21 2006
@@ -1,38 +1,38 @@
 # BEGIN BPS TAGGED BLOCK {{{
-# 
+#
 # COPYRIGHT:
-#  
-# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC 
+#
+# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC
 #                                          <jesse at bestpractical.com>
-# 
+#
 # (Except where explicitly superseded by other copyright notices)
-# 
-# 
+#
+#
 # LICENSE:
-# 
+#
 # This work is made available to you under the terms of Version 2 of
 # the GNU General Public License. A copy of that license should have
 # been provided with this software, but in any event can be snarfed
 # from www.gnu.org.
-# 
+#
 # This work is distributed in the hope that it will be useful, but
 # WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 # General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-# 
-# 
+#
+#
 # CONTRIBUTION SUBMISSION POLICY:
-# 
+#
 # (The following paragraph is not intended to limit the rights granted
 # to you to modify and distribute this software under the terms of
 # the GNU General Public License and is only of importance to you if
 # you choose to contribute your changes and enhancements to the
 # community by submitting them to Best Practical Solutions, LLC.)
-# 
+#
 # By intentionally submitting any modifications, corrections or
 # derivatives to this work, or any other work intended for use with
 # Request Tracker, to Best Practical Solutions, LLC, you confirm that
@@ -41,7 +41,7 @@
 # royalty-free, perpetual, license to use, copy, create derivative
 # works based on those contributions, and sublicense and distribute
 # those contributions and any derivatives thereof.
-# 
+#
 # END BPS TAGGED BLOCK }}}
 package RT::Action::CreateTickets;
 require RT::Action::Generic;
@@ -189,6 +189,8 @@
        Resolved        => 
        Owner           => Username or id of an RT user who can and should own 
                           this ticket
+       ForceOwner      => Same as Owner, but sets the owner even if the owner
+                          is already set
    +   Requestor       => Email address
    +   Cc              => Email address 
    +   AdminCc         => Email address 
@@ -209,7 +211,12 @@
                           as content until we hit a line containing only 
                           ENDOFCONTENT
        ContentType     => the content-type of the Content field
+       UpdateType      => 'correspond' or 'comment'; used in conjunction with
+                          'content' if this is an update.
+
        CustomField-<id#> => custom field value
+       CF-name           => custom field value
+       CustomField-name  => custom field value
 
 Fields marked with an * are required.
 
@@ -545,7 +552,10 @@
 
     }
 
-    $self->Parse( Content => $self->TemplateObj->Content, _ActiveContent => 1);
+    $self->Parse(
+        Content        => $self->TemplateObj->Content,
+        _ActiveContent => 1
+    );
     return 1;
 
 }
@@ -566,43 +576,41 @@
     use bytes;
 
     local %T::Tickets = %T::Tickets;
-    local $T::TOP = $T::TOP;
-    local $T::ID = $T::ID;
+    local $T::TOP     = $T::TOP;
+    local $T::ID      = $T::ID;
     $T::Tickets{'TOP'} = $T::TOP = $top if $top;
 
     my $ticketargs;
     my ( @links, @postponed );
     foreach my $template_id ( @{ $self->{'create_tickets'} } ) {
         $RT::Logger->debug("Workflow: processing $template_id of $T::TOP")
-          if $T::TOP;
+            if $T::TOP;
 
         $T::ID    = $template_id;
         @T::AllID = @{ $self->{'create_tickets'} };
 
-        ( $T::Tickets{$template_id}, $ticketargs ) =
-          $self->ParseLines( $template_id, \@links, \@postponed );
+        ( $T::Tickets{$template_id}, $ticketargs )
+            = $self->ParseLines( $template_id, \@links, \@postponed );
 
         # Now we have a %args to work with.
         # Make sure we have at least the minimum set of
         # reasonable data and do our thang
 
-        my ( $id, $transid, $msg ) =
-          $T::Tickets{$template_id}->Create(%$ticketargs);
+        my ( $id, $transid, $msg )
+            = $T::Tickets{$template_id}->Create(%$ticketargs);
 
         foreach my $res ( split( '\n', $msg ) ) {
             push @results,
-              $T::Tickets{$template_id}
-              ->loc( "Ticket [_1]", $T::Tickets{$template_id}->Id ) . ': '
-              . $res;
+                $T::Tickets{$template_id}
+                ->loc( "Ticket [_1]", $T::Tickets{$template_id}->Id ) . ': '
+                . $res;
         }
         if ( !$id ) {
             if ( $self->TicketObj ) {
-                $msg =
-                    "Couldn't create related ticket $template_id for "
-                  . $self->TicketObj->Id . " "
-                  . $msg;
-            }
-            else {
+                $msg = "Couldn't create related ticket $template_id for "
+                    . $self->TicketObj->Id . " "
+                    . $msg;
+            } else {
                 $msg = "Couldn't create ticket $template_id " . $msg;
             }
 
@@ -612,8 +620,8 @@
 
         $RT::Logger->debug("Assigned $template_id with $id");
         $T::Tickets{$template_id}->SetOriginObj( $self->TicketObj )
-          if $self->TicketObj
-          && $T::Tickets{$template_id}->can('SetOriginObj');
+            if $self->TicketObj
+            && $T::Tickets{$template_id}->can('SetOriginObj');
 
     }
 
@@ -631,7 +639,7 @@
 
     my @results;
     local %T::Tickets = %T::Tickets;
-    local $T::ID = $T::ID;
+    local $T::ID      = $T::ID;
 
     my $ticketargs;
     my ( @links, @postponed );
@@ -641,26 +649,26 @@
         $T::ID    = $template_id;
         @T::AllID = @{ $self->{'update_tickets'} };
 
-        ( $T::Tickets{$template_id}, $ticketargs ) =
-          $self->ParseLines( $template_id, \@links, \@postponed );
+        ( $T::Tickets{$template_id}, $ticketargs )
+            = $self->ParseLines( $template_id, \@links, \@postponed );
 
         # Now we have a %args to work with.
         # Make sure we have at least the minimum set of
         # reasonable data and do our thang
 
         my @attribs = qw(
-          Subject
-          FinalPriority
-          Priority
-          TimeEstimated
-          TimeWorked
-          TimeLeft
-          Status
-          Queue
-          Due
-          Starts
-          Started
-          Resolved
+            Subject
+            FinalPriority
+            Priority
+            TimeEstimated
+            TimeWorked
+            TimeLeft
+            Status
+            Queue
+            Due
+            Starts
+            Started
+            Resolved
         );
 
         my $id = $template_id;
@@ -681,60 +689,67 @@
         my $base_id = "base-$1";
         my $base    = $self->{'templates'}->{$base_id};
         if ($base) {
-        $base    =~ s/\r//g;
-        $base    =~ s/\n+$//;
-        $current =~ s/\n+$//;
-
-        # If we have no base template, set what we can.
-        if ($base ne $current)  {
-            push @results,
-              "Could not update ticket "
-              . $T::Tickets{$template_id}->Id
-              . ": Ticket has changed";
-            next;
-        }
+            $base    =~ s/\r//g;
+            $base    =~ s/\n+$//;
+            $current =~ s/\n+$//;
+
+            # If we have no base template, set what we can.
+            if ( $base ne $current ) {
+                push @results,
+                    "Could not update ticket "
+                    . $T::Tickets{$template_id}->Id
+                    . ": Ticket has changed";
+                next;
+            }
         }
         push @results, $T::Tickets{$template_id}->Update(
             AttributesRef => \@attribs,
             ARGSRef       => $ticketargs
         );
 
+        if ( $ticketargs->{'ForceOwner'} ) {
+            ($id, $msg) = $T::Tickets{$template_id}->SetOwner($ticketargs->{'ForceOwner'}, "Force");
+            push @results, $msg;
+        }
+
         push @results,
-          $self->UpdateWatchers( $T::Tickets{$template_id}, $ticketargs );
+            $self->UpdateWatchers( $T::Tickets{$template_id}, $ticketargs );
 
-        next unless exists $ticketargs->{'UpdateType'};
-        if ( $ticketargs->{'UpdateType'} =~ /^(private|public)$/ ) {
-            my ( $Transaction, $Description, $Object ) =
-              $T::Tickets{$template_id}->Comment(
+        next unless $ticketargs->{'MIMEObj'};
+        if ( $ticketargs->{'UpdateType'} =~ /^(private|comment)$/i ) {
+            my ( $Transaction, $Description, $Object )
+                = $T::Tickets{$template_id}->Comment(
                 CcMessageTo  => $ticketargs->{'Cc'},
                 BccMessageTo => $ticketargs->{'Bcc'},
                 MIMEObj      => $ticketargs->{'MIMEObj'},
                 TimeTaken    => $ticketargs->{'TimeWorked'}
-              );
+                );
             push( @results,
                 $T::Tickets{$template_id}
-                  ->loc( "Ticket [_1]", $T::Tickets{$template_id}->id ) . ': '
-                  . $Description );
-        }
-        elsif ( $ticketargs->{'UpdateType'} eq 'response' ) {
-            my ( $Transaction, $Description, $Object ) =
-              $T::Tickets{$template_id}->Correspond(
+                    ->loc( "Ticket [_1]", $T::Tickets{$template_id}->id )
+                    . ': '
+                    . $Description );
+        } elsif ( $ticketargs->{'UpdateType'} =~ /^(public|response|correspond)$/i ) {
+            my ( $Transaction, $Description, $Object )
+                = $T::Tickets{$template_id}->Correspond(
                 CcMessageTo  => $ticketargs->{'Cc'},
                 BccMessageTo => $ticketargs->{'Bcc'},
                 MIMEObj      => $ticketargs->{'MIMEObj'},
                 TimeTaken    => $ticketargs->{'TimeWorked'}
-              );
-            push( @results,
-                $T::Tickets{$template_id}
-                  ->loc( "Ticket [_1]", $T::Tickets{$template_id}->id ) . ': '
-                  . $Description );
-        }
-        else {
+                );
             push( @results,
                 $T::Tickets{$template_id}
-                  ->loc("Update type was neither correspondence nor comment.")
-                  . " "
-                  . $T::Tickets{$template_id}->loc("Update not recorded.") );
+                    ->loc( "Ticket [_1]", $T::Tickets{$template_id}->id )
+                    . ': '
+                    . $Description );
+        } else {
+            push(
+                @results,
+                $T::Tickets{$template_id}->loc(
+                    "Update type was neither correspondence nor comment.")
+                    . " "
+                    . $T::Tickets{$template_id}->loc("Update not recorded.")
+            );
         }
     }
 
@@ -753,35 +768,58 @@
 =cut
 
 sub Parse {
-    my $self          = shift;
-    my %args = ( Content => undef,
-                 Queue => undef,
-                 Requestor => undef,
-                 _ActiveContent => undef,
-                @_);
+    my $self = shift;
+    my %args = (
+        Content        => undef,
+        Queue          => undef,
+        Requestor      => undef,
+        _ActiveContent => undef,
+        @_
+    );
 
-    if ($args{'_ActiveContent'}) {
-        $self->{'UsePerlTextTemplate'} =1;
+    if ( $args{'_ActiveContent'} ) {
+        $self->{'UsePerlTextTemplate'} = 1;
     } else {
 
         $self->{'UsePerlTextTemplate'} = 0;
     }
 
-    my @template_order;
+    if ( substr( $args{'Content'}, 0, 3 ) eq '===' ) {
+        $self->_ParseMultilineTemplate(%args);
+    } elsif ( $args{'Content'} =~ /(?:\t|,)/i ) {
+        $self->_ParseXSVTemplate(%args);
+
+    }
+}
+
+=head2 _ParseMultilineTemplate
+
+Parses mulitline templates. Things like:
+
+ ===Create-Ticket ... 
+
+Takes the same arguments as Parse
+
+=cut
+
+sub _ParseMultilineTemplate {
+    my $self = shift;
+    my %args = (@_);
+
     my $template_id;
     my ( $queue, $requestor );
-    if ( substr( $args{'Content'}, 0, 3 ) eq '===' ) {
         $RT::Logger->debug("Line: ===");
         foreach my $line ( split( /\n/, $args{'Content'} ) ) {
             $line =~ s/\r$//;
             $RT::Logger->debug("Line: $line");
             if ( $line =~ /^===/ ) {
                 if ( $template_id && !$queue && $args{'Queue'} ) {
-                    $self->{'templates'}->{$template_id} .= "Queue: $args{'Queue'}\n";
+                    $self->{'templates'}->{$template_id}
+                        .= "Queue: $args{'Queue'}\n";
                 }
                 if ( $template_id && !$requestor && $args{'Requestor'} ) {
-                    $self->{'templates'}->{$template_id} .=
-                      "Requestor: $args{'Requestor'}\n";
+                    $self->{'templates'}->{$template_id}
+                        .= "Requestor: $args{'Requestor'}\n";
                 }
                 $queue     = 0;
                 $requestor = 0;
@@ -790,27 +828,23 @@
                 $template_id = "create-$1";
                 $RT::Logger->debug("****  Create ticket: $template_id");
                 push @{ $self->{'create_tickets'} }, $template_id;
-            }
-            elsif ( $line =~ /^===Update-Ticket: (.*)$/ ) {
+            } elsif ( $line =~ /^===Update-Ticket: (.*)$/ ) {
                 $template_id = "update-$1";
                 $RT::Logger->debug("****  Update ticket: $template_id");
                 push @{ $self->{'update_tickets'} }, $template_id;
-            }
-            elsif ( $line =~ /^===Base-Ticket: (.*)$/ ) {
+            } elsif ( $line =~ /^===Base-Ticket: (.*)$/ ) {
                 $template_id = "base-$1";
                 $RT::Logger->debug("****  Base ticket: $template_id");
                 push @{ $self->{'base_tickets'} }, $template_id;
-            }
-            elsif ( $line =~ /^===#.*$/ ) {    # a comment
+            } elsif ( $line =~ /^===#.*$/ ) {    # a comment
                 next;
-            }
-            else {
+            } else {
                 if ( $line =~ /^Queue:(.*)/i ) {
                     $queue = 1;
                     my $value = $1;
                     $value =~ s/^\s//;
                     $value =~ s/\s$//;
-                    if ( !$value && $args{'Queue'}) {
+                    if ( !$value && $args{'Queue'} ) {
                         $value = $args{'Queue'};
                         $line  = "Queue: $value";
                     }
@@ -820,7 +854,7 @@
                     my $value = $1;
                     $value =~ s/^\s//;
                     $value =~ s/\s$//;
-                    if ( !$value && $args{'Requestor'}) {
+                    if ( !$value && $args{'Requestor'} ) {
                         $value = $args{'Requestor'};
                         $line  = "Requestor: $value";
                     }
@@ -828,118 +862,10 @@
                 $self->{'templates'}->{$template_id} .= $line . "\n";
             }
         }
-	if ( $template_id && !$queue && $args{'Queue'} ) {
-	    $self->{'templates'}->{$template_id} .= "Queue: $args{'Queue'}\n";
-	}
-    }
-    elsif ( substr( $args{'Content'}, 0, 2 ) =~ /^id$/i ) {
-        $RT::Logger->debug("Line: id");
-        use Regexp::Common qw(delimited);
-        my $first = substr( $args{'Content'}, 0, index( $args{'Content'}, "\n" ) );
-        $first =~ s/\r$//;
-
-        my $delimiter;
-        if ( $first =~ /\t/ ) {
-            $delimiter = "\t";
-        }
-        else {
-            $delimiter = ',';
-        }
-        my @fields    = split( /$delimiter/, $first );
-        
-
-        my $delimiter_re = qr[$delimiter];
-
-        my $delimited = qr[[^$delimiter]+];
-        my $empty     = qr[^[$delimiter](?=[$delimiter])];
-        my $justquoted = qr[$RE{quoted}];
-
-        $args{'Content'} = substr( $args{'Content'}, index( $args{'Content'}, "\n" ) + 1 );
-        $RT::Logger->debug("First: $first");
-
-        my $queue;
-        foreach my $line ( split( /\n/, $args{'Content'} ) ) {
-            next unless $line;
-            $RT::Logger->debug("Line: $line");
-
-            # first item is $template_id
-            my $i = 0;
-            my $template_id;
-            while ($line && $line =~ s/^($justquoted|.*?)(?:$delimiter_re|$)//ix) {
-                if ( $i == 0 ) {
-                    $queue     = 0;
-                    $requestor = 0;
-                    my $tid = $1;
-                    $tid =~ s/^\s//;
-                    $tid =~ s/\s$//;
-                    next unless $tid;
-                   
-                     
-                    if ($tid =~ /^\d+$/) {
-                        $template_id = 'update-' . $tid;
-                        push @{ $self->{'update_tickets'} }, $template_id;
-
-                    } elsif ($tid =~ /^#base-(\d+)$/) {
-
-                        $template_id = 'base-' . $1;
-                        push @{ $self->{'base_tickets'} }, $template_id;
-
-                    } else {
-                        $template_id = 'create-' . $tid;
-                        push @{ $self->{'create_tickets'} }, $template_id;
-                    }
-                    $RT::Logger->debug("template_id: $tid");
-                }
-                else {
-                    my $value = $1;
-                    $value = '' if ( $value =~ /^$delimiter$/ );
-                    if ($value =~ /^$RE{delimited}{-delim=>qq{\'\"}}$/) {
-                        substr($value,0,1) = "";
-                    substr($value,-1,1) = "";
-                    }
-                    my $field = $fields[$i];
-                    next unless $field;
-                    $field =~ s/^\s//;
-                    $field =~ s/\s$//;
-                    if (   $field =~ /Body/i
-                        || $field =~ /Data/i
-                        || $field =~ /Message/i )
-                    {
-                        $field = 'Content';
-                    }
-                    if ( $field =~ /Summary/i ) {
-                        $field = 'Subject';
-                    }
-                    if ( $field =~ /Queue/i ) {
-                        $queue = 1;
-                        if ( !$value && $args{'Queue'} ) {
-                            $value = $args{'Queue'};
-                        }
-                    }
-                    if ( $field =~ /Requestor/i ) {
-                        $requestor = 1;
-                        if ( !$value && $args{'Requestor'} ) {
-                            $value = $args{'Requestor'};
-                        }
-                    }
-                    $self->{'templates'}->{$template_id} .= $field . ": ";
-                    $self->{'templates'}->{$template_id} .= $value || "";
-                    $self->{'templates'}->{$template_id} .= "\n";
-                    $self->{'templates'}->{$template_id} .= "ENDOFCONTENT\n"
-                      if $field =~ /content/i;
-                }
-                $i++;
-            }
-            if ( !$queue && $args{'Queue'} ) {
-                $self->{'templates'}->{$template_id} .= "Queue: $args{'Queue'}\n";
-            }
-            if ( !$requestor && $args{'Requestor'} ) {
-                $self->{'templates'}->{$template_id} .=
-                  "Requestor: $args{'Requestor'}\n";
-            }
+        if ( $template_id && !$queue && $args{'Queue'} ) {
+            $self->{'templates'}->{$template_id} .= "Queue: $args{'Queue'}\n";
         }
     }
-}
 
 sub ParseLines {
     my $self        = shift;
@@ -947,7 +873,6 @@
     my $links       = shift;
     my $postponed   = shift;
 
-
     my $content = $self->{'templates'}->{$template_id};
 
     if ( $self->{'UsePerlTextTemplate'} ) {
@@ -980,62 +905,65 @@
             next;
         }
     }
-    
-    my $TicketObj ||= RT::Ticket->new($self->CurrentUser);
+
+    my $TicketObj ||= RT::Ticket->new( $self->CurrentUser );
 
     my %args;
+    my %original_tags;
     my @lines = ( split( /\n/, $content ) );
     while ( defined( my $line = shift @lines ) ) {
         if ( $line =~ /^(.*?):(?:\s+)(.*?)(?:\s*)$/ ) {
             my $value = $2;
-            my $tag   = lc($1);
+            my $original_tag = $1;
+            my $tag   = lc($original_tag);
             $tag =~ s/-//g;
 
+            $original_tags{$tag} = $original_tag;
+
             if ( ref( $args{$tag} ) )
             {    #If it's an array, we want to push the value
                 push @{ $args{$tag} }, $value;
-            }
-            elsif ( defined( $args{$tag} ) )
+            } elsif ( defined( $args{$tag} ) )
             {    #if we're about to get a second value, make it an array
                 $args{$tag} = [ $args{$tag}, $value ];
-            }
-            else {    #if there's nothing there, just set the value
+            } else {    #if there's nothing there, just set the value
                 $args{$tag} = $value;
             }
 
-            if ( $tag eq 'content' ) {    #just build up the content
+            if ( $tag =~ /^content$/i ) {    #just build up the content
                                           # convert it to an array
                 $args{$tag} = defined($value) ? [ $value . "\n" ] : [];
                 while ( defined( my $l = shift @lines ) ) {
                     last if ( $l =~ /^ENDOFCONTENT\s*$/ );
                     push @{ $args{'content'} }, $l . "\n";
                 }
-            }
-            else {
+            } else {
 
                 # if it's not content, strip leading and trailing spaces
                 if ( $args{$tag} ) {
                     $args{$tag} =~ s/^\s+//g;
                     $args{$tag} =~ s/\s+$//g;
                 }
+                if (($tag =~ /^(requestor|cc|admincc)$/i or grep {lc $_ eq $tag} keys %LINKTYPEMAP) and $args{$tag} =~ /,/) {
+                    $args{$tag} = [ split /,\s*/, $args{$tag} ];
+                }
             }
         }
     }
 
     foreach my $date qw(due starts started resolved) {
-        my $dateobj = RT::Date->new($self->CurrentUser);
+        my $dateobj = RT::Date->new( $self->CurrentUser );
         next unless $args{$date};
         if ( $args{$date} =~ /^\d+$/ ) {
             $dateobj->Set( Format => 'unix', Value => $args{$date} );
-        }
-        else {
+        } else {
             $dateobj->Set( Format => 'unknown', Value => $args{$date} );
         }
         $args{$date} = $dateobj->ISO;
     }
 
     $args{'requestor'} ||= $self->TicketObj->Requestors->MemberEmailAddresses
-      if $self->TicketObj;
+        if $self->TicketObj;
 
     $args{'type'} ||= 'ticket';
 
@@ -1047,7 +975,8 @@
         Starts          => $args{'starts'},
         Started         => $args{'started'},
         Resolved        => $args{'resolved'},
-        Owner           => $args{'owner'},
+        Owner           => $args{'forceowner'} || $args{'owner'},
+        ForceOwner      => $args{'forceowner'},
         Requestor       => $args{'requestor'},
         Cc              => $args{'cc'},
         AdminCc         => $args{'admincc'},
@@ -1059,7 +988,7 @@
         Type            => $args{'type'},
     );
 
-    if ($args{content}) {
+    if ( $args{content} ) {
         my $mimeobj = MIME::Entity->new();
         $mimeobj->build(
             Type => $args{'contenttype'},
@@ -1069,13 +998,21 @@
         $ticketargs{UpdateType} = $args{'updatetype'} if $args{'updatetype'};
     }
 
-    foreach my $key ( keys(%args) ) {
-       if ( $key =~ /^customfield(\d+)$/ ) {
-            $ticketargs{ "CustomField-" . $1 } = $args{$key};
-        } elsif ($key =~ /^(?:customfield|cf)(.*)$/) {
-            my $cf = RT::CustomField->new($self->CurrentUser);
-            $cf->LoadByName(Name => $1, Queue => $ticketargs{Queue});
-            $ticketargs{ "CustomField-".$cf->id } = $args{$key};
+    foreach my $tag ( keys(%args) ) {
+        # if the tag was added later, skip it
+        my $orig_tag = $original_tags{$tag} or next;
+        if ( $orig_tag =~ /^customfield-?(\d+)$/i ) {
+            $ticketargs{ "CustomField-" . $1 } = $args{$tag};
+        } elsif ( $orig_tag =~ /^(?:customfield|cf)-?(.*)$/i ) {
+            my $cf = RT::CustomField->new( $self->CurrentUser );
+            $cf->LoadByName( Name => $1, Queue => $ticketargs{Queue} );
+            $ticketargs{ "CustomField-" . $cf->id } = $args{$tag};
+        } elsif ($orig_tag) {
+            my $cf = RT::CustomField->new( $self->CurrentUser );
+            $cf->LoadByName( Name => $orig_tag, Queue => $ticketargs{Queue} );
+            next unless ($cf->id) ;
+            $ticketargs{ "CustomField-" . $cf->id } = $args{$tag};
+
         }
     }
 
@@ -1084,6 +1021,115 @@
     return $TicketObj, \%ticketargs;
 }
 
+
+=head2 _ParseXSVTemplate 
+
+Parses a tab or comma delimited template. Should only ever be called by Parse
+
+=cut
+
+sub _ParseXSVTemplate {
+    my $self = shift;
+    my %args = (@_);
+
+    use Regexp::Common qw(delimited);
+    my $first
+      = substr( $args{'Content'}, 0, index( $args{'Content'}, "\n" ) );
+    $first =~ s/\r$//;
+
+    my $delimiter;
+    if ( $first =~ /\t/ ) {
+        $delimiter = "\t";
+    } else {
+        $delimiter = ',';
+    }
+    my @fields = split( /$delimiter/, $first );
+
+    my $delimiter_re = qr[$delimiter];
+    my $justquoted = qr[$RE{quoted}];
+
+    $args{'Content'}
+      = substr( $args{'Content'}, index( $args{'Content'}, "\n" ) + 1 );
+
+  LINE:
+    while ($args{'Content'}) {
+        $args{'Content'} =~ s/^(\s*\r?\n)+//;
+
+        my $queue;
+        my $requestor;
+        # first item is $template_id
+        my $i = 0;
+        my $template_id;
+        my $EOL = 0;
+
+      COLUMN:
+        while (not $EOL and length $args{'Content'} and $args{'Content'} =~ s/^($justquoted|.*?)($delimiter_re|$)//smix) {
+            $EOL = not $2;
+            # If it's the first field, it must be a ticket id. 
+            if ( $i == 0 ) {
+                $queue     = 0;
+                $requestor = 0;
+                my $tid = $1;
+                $tid =~ s/^\s*(.*?)\s*$/$1/;
+                next COLUMN unless $tid;
+
+                if ( $tid =~ /^\d+$/ ) {
+                    $template_id = 'update-' . $tid;
+                    push @{ $self->{'update_tickets'} }, $template_id;
+                } elsif ( $tid =~ /^#base-(\d+)$/ ) {
+                    $template_id = 'base-' . $1;
+                    push @{ $self->{'base_tickets'} }, $template_id;
+                } else {
+                    $template_id = 'create-' . $tid;
+                    push @{ $self->{'create_tickets'} }, $template_id;
+                }
+            } else {
+                my $value = $1;
+                if ( $value =~ /^$RE{delimited}{-delim=>qq{\'\"}}$/ ) {
+                    substr( $value, 0,  1 ) = "";
+                    substr( $value, -1, 1 ) = "";
+                }
+                my $field = $fields[$i];
+                
+                next COLUMN unless $field;
+                $field =~ s/^\s//;
+                $field =~ s/\s$//;
+                if (   $field =~ /^Body$/i
+                    || $field =~ /^Data$/i
+                    || $field =~ /^Message$/i )
+                  {
+                      $field = 'Content';
+                  }
+                if ( $field =~ /^Summary$/i ) {
+                    $field = 'Subject';
+                }
+                if ( $field =~ /^Queue$/i ) {
+                    $queue = 1;
+                    $value ||= $args{'Queue'};
+                }
+                if ( $field =~ /^Requestor$/i ) {
+                    $requestor = 1;
+                    $value ||= $args{'Requestor'};
+                }
+                $self->{'templates'}->{$template_id} .= $field . ": ";
+                $self->{'templates'}->{$template_id} .= $value || "";
+                $self->{'templates'}->{$template_id} .= "\n";
+                $self->{'templates'}->{$template_id} .= "ENDOFCONTENT\n"
+                  if $field =~ /^Content$/i;
+            }
+            $i++;
+        }
+        if ( !$queue && $args{'Queue'} ) {
+            $self->{'templates'}->{$template_id}
+              .= "Queue: $args{'Queue'}\n";
+        }
+        if ( !$requestor && $args{'Requestor'} ) {
+            $self->{'templates'}->{$template_id}
+              .= "Requestor: $args{'Requestor'}\n";
+        }
+    }
+}
+
 sub GetDeferred {
     my $self      = shift;
     my $args      = shift;
@@ -1093,17 +1139,16 @@
 
     # Deferred processing
     push @$links,
-      (
+        (
         $id,
-        {
-            DependsOn    => $args->{'dependson'},
+        {   DependsOn    => $args->{'dependson'},
             DependedOnBy => $args->{'dependedonby'},
             RefersTo     => $args->{'refersto'},
             ReferredToBy => $args->{'referredtoby'},
             Children     => $args->{'children'},
             Parents      => $args->{'parents'},
         }
-      );
+        );
 
     push @$postponed, (
 
@@ -1120,7 +1165,7 @@
     $string .= "Queue: " . $t->QueueObj->Name . "\n";
     $string .= "Subject: " . $t->Subject . "\n";
     $string .= "Status: " . $t->Status . "\n";
-    $string .= "UpdateType: response\n";
+    $string .= "UpdateType: correspond\n";
     $string .= "Content: \n";
     $string .= "ENDOFCONTENT\n";
     $string .= "Due: " . $t->DueObj->AsString . "\n";
@@ -1239,14 +1284,13 @@
     foreach my $type qw(Requestor Cc AdminCc) {
         my $method  = $type . 'Addresses';
         my $oldaddr = $ticket->$method;
-    
-    
+
         # Skip unless we have a defined field
         next unless defined $args->{$type};
         my $newaddr = $args->{$type};
 
-        my @old = split( ', ', $oldaddr );
-        my @new = split( ', ', $newaddr );
+        my @old = split( /,\s*/, $oldaddr );
+        my @new = split( /,\s*/, $newaddr );
         my %oldhash = map { $_ => 1 } @old;
         my %newhash = map { $_ => 1 } @new;
 
@@ -1260,7 +1304,7 @@
             );
 
             push @results,
-              $ticket->loc( "Ticket [_1]", $ticket->Id ) . ': ' . $msg;
+                $ticket->loc( "Ticket [_1]", $ticket->Id ) . ': ' . $msg;
         }
 
         foreach (@delete) {
@@ -1269,7 +1313,7 @@
                 Email => $_
             );
             push @results,
-              $ticket->loc( "Ticket [_1]", $ticket->Id ) . ': ' . $msg;
+                $ticket->loc( "Ticket [_1]", $ticket->Id ) . ': ' . $msg;
         }
     }
     return @results;
@@ -1294,21 +1338,22 @@
             {
                 next unless $link;
 
-                if ($link =~ /^TOP$/i) {
-                    $RT::Logger->debug( "Building $type link for $link: " . $T::Tickets{TOP}->Id );
+                if ( $link =~ /^TOP$/i ) {
+                    $RT::Logger->debug( "Building $type link for $link: "
+                            . $T::Tickets{TOP}->Id );
                     $link = $T::Tickets{TOP}->Id;
 
-                } 
-                elsif ( $link !~ m/^\d+$/ ) {
+                } elsif ( $link !~ m/^\d+$/ ) {
                     my $key = "create-$link";
                     if ( !exists $T::Tickets{$key} ) {
-                        $RT::Logger->debug( "Skipping $type link for $key (non-existent)");
+                        $RT::Logger->debug(
+                            "Skipping $type link for $key (non-existent)");
                         next;
                     }
-                    $RT::Logger->debug( "Building $type link for $link: " . $T::Tickets{$key}->Id );
+                    $RT::Logger->debug( "Building $type link for $link: "
+                            . $T::Tickets{$key}->Id );
                     $link = $T::Tickets{$key}->Id;
-                }
-                else {
+                } else {
                     $RT::Logger->debug("Building $type link for $link");
                 }
 
@@ -1319,7 +1364,7 @@
                 );
 
                 $RT::Logger->warning("AddLink thru $link failed: $wmsg")
-                  unless $wval;
+                    unless $wval;
 
                 # push @non_fatal_errors, $wmsg unless ($wval);
             }
@@ -1330,7 +1375,7 @@
     # postponed actions -- Status only, currently
     while ( my $template_id = shift(@$postponed) ) {
         my $ticket = $T::Tickets{$template_id};
-        $RT::Logger->debug("Handling postponed actions for ".$ticket->id);
+        $RT::Logger->debug( "Handling postponed actions for " . $ticket->id );
         my %args = %{ shift(@$postponed) };
         $ticket->SetStatus( $args{Status} ) if defined $args{Status};
     }

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Action/SendEmail.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Action/SendEmail.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Action/SendEmail.pm	Mon Feb  6 15:04:21 2006
@@ -254,12 +254,28 @@
         my $path = RT->Config->Get('SendmailPath');
         my $args = RT->Config->Get('SendmailArguments');
         eval {
-            open( my $mail, "|$path $args" ) || die $!;
+            # don't ignore CHLD signal to get proper exit code
+            local $SIG{'CHLD'} = 'DEFAULT';
+
+            my $mail;
+            unless( open $mail, "|$path $args" ) {
+                die "Couldn't run $path: $!";
+            }
+
+            # if something wrong with $mail->print we will get PIPE signal, handle it
+            local $SIG{'PIPE'} = sub { die "$path closed pipe" };
             $MIMEObj->print($mail);
-            close($mail);
+
+            unless ( close $mail ) {
+                die "Close failed: $!" if $!; # system error
+                # sendmail exit statuses mostly errors with data not software
+                # TODO: status parsing: core dump, exit on signal or EX_*
+                $RT::Logger->warning( "$path exitted with status $?" );
+            }
         };
         if ($@) {
-            $RT::Logger->crit( $msgid . "Could not send mail. -" . $@ );
+            $RT::Logger->crit( $msgid ."Could not send mail: " . $@ );
+            return 0;
         }
     }
     else {

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Attachment_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Attachment_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Attachment_Overlay.pm	Mon Feb  6 15:04:21 2006
@@ -130,8 +130,8 @@
 Create a new attachment. Takes a paramhash:
     
     'Attachment' Should be a single MIME body with optional subparts
-    'Parent' is an optional Parent RT::Attachment object
-    'TransactionId' is the mandatory id of the Transaction this attachment is associated with.;
+    'Parent' is an optional id of the parent attachment
+    'TransactionId' is the mandatory id of the transaction this attachment is associated with.;
 
 =cut
 
@@ -172,14 +172,14 @@
     # If a message has no bodyhandle, that means that it has subparts (or appears to)
     # and we should act accordingly.  
     unless ( defined $Attachment->bodyhandle ) {
-        my $id = $self->SUPER::Create(
+        my ($id) = $self->SUPER::Create(
             TransactionId => $args{'TransactionId'},
             # XXX: possible bug, we force parent here, that's bad
             Parent        => 0,
             ContentType   => $Attachment->mime_type,
             Headers       => $Attachment->head->as_string,
             MessageId     => $MessageId,
-            Subject       => $Subject
+            Subject       => $Subject,
         );
 
         unless ($id) {
@@ -188,11 +188,14 @@
 
         foreach my $part ( $Attachment->parts ) {
             my $SubAttachment = new RT::Attachment( $self->CurrentUser );
-            $SubAttachment->Create(
+            my ($id) = $SubAttachment->Create(
                 TransactionId => $args{'TransactionId'},
                 Parent        => $id,
                 Attachment    => $part,
             );
+            unless ($id) {
+                $RT::Logger->crit("Attachment insert failed: ". $RT::Handle->dbh->errstr);
+            }
         }
         return ($id);
     }
@@ -200,7 +203,11 @@
     #If it's not multipart
     else {
 
-        my ($ContentEncoding, $Body) = $self->_EncodeLOB($Attachment->bodyhandle->as_string, $Attachment->mime_type);
+        my ($ContentEncoding, $Body) = $self->_EncodeLOB(
+            $Attachment->bodyhandle->as_string,
+            $Attachment->mime_type
+        );
+
         my $id = $self->SUPER::Create(
             TransactionId   => $args{'TransactionId'},
             ContentType     => $Attachment->mime_type,
@@ -214,9 +221,9 @@
         );
 
         unless ($id) {
-            $RT::Logger->crit("Attachment insert failed - ".$RT::Handle->dbh->errstr);
+            $RT::Logger->crit("Attachment insert failed: ". $RT::Handle->dbh->errstr);
         }
-        return ($id)
+        return $id;
     }
 }
 

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Attachments_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Attachments_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Attachments_Overlay.pm	Mon Feb  6 15:04:21 2006
@@ -81,6 +81,8 @@
  
   $self->{'table'} = "Attachments";
   $self->{'primary_key'} = "id";
+  $self->OrderBy ( FIELD => 'id',
+                   ORDER => 'ASC');
   return ( $self->SUPER::_Init(@_));
 }
 # }}}

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/CustomFieldValues.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/CustomFieldValues.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/CustomFieldValues.pm	Mon Feb  6 15:04:21 2006
@@ -81,17 +81,18 @@
     $self->{'table'} = 'CustomFieldValues';
     $self->{'primary_key'} = 'id';
 
-
-
-  # By default, order by SortOrder
-  $self->OrderByCols(
-	 { ALIAS => 'main',
-	   FIELD => 'SortOrder',
-	   ORDER => 'ASC' },
-	 { ALIAS => 'main',
-	   FIELD => 'id',
-	   ORDER => 'ASC' },
-     );
+    # By default, order by SortOrder
+    $self->OrderByCols(
+         { ALIAS => 'main',
+           FIELD => 'SortOrder',
+           ORDER => 'ASC' },
+         { ALIAS => 'main',
+           FIELD => 'Name',
+           ORDER => 'ASC' },
+         { ALIAS => 'main',
+           FIELD => 'id',
+           ORDER => 'ASC' },
+    );
 
     return ( $self->SUPER::_Init(@_) );
 }

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/EmailParser.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/EmailParser.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/EmailParser.pm	Mon Feb  6 15:04:21 2006
@@ -416,7 +416,7 @@
 =head2 IsRTaddress ADDRESS
 
 Takes a single parameter, an email address. 
-Returns true if that address matches the RT->Config->Get('RTAddressRegexp').  
+Returns true if that address matches the C<RTAddressRegexp> config option.
 Returns false, otherwise.
 
 =begin testing
@@ -435,11 +435,10 @@
     # Example: the following rule would tell RT not to Cc 
     #   "tickets at noc.example.com"
     my $address_re = RT->Config->Get('RTAddressRegexp');
-    if ( defined $address_re && $address =~ /$address_re/ ) {
-        return(1);
-    } else {
-        return (undef);
+    if ( defined $address_re && $address =~ /$address_re/i ) {
+        return 1;
     }
+    return undef;
 }
 
 # }}}

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Groups_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Groups_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Groups_Overlay.pm	Mon Feb  6 15:04:21 2006
@@ -77,23 +77,79 @@
 use strict;
 no warnings qw(redefine);
 
+use RT::Users;
+
+# XXX: below some code is marked as subject to generalize in Groups, Users classes.
+# RUZ suggest name Principals::Generic or Principals::Base as abstract class, but
+# Jesse wants something that doesn't imply it's a Principals.pm subclass.
+# See comments below for candidats.
+
 
 # {{{ sub _Init
 
+=begin testing
+
+# next had bugs
+# Groups->Limit( FIELD => 'id', OPERATOR => '!=', VALUE => xx );
+my $g = RT::Group->new($RT::SystemUser);
+my ($id, $msg) = $g->CreateUserDefinedGroup(Name => 'GroupsNotEqualTest');
+ok ($id, "created group #". $g->id) or diag("error: $msg");
+
+my $groups = RT::Groups->new($RT::SystemUser);
+$groups->Limit( FIELD => 'id', OPERATOR => '!=', VALUE => $g->id );
+$groups->LimitToUserDefinedGroups();
+my $bug = grep $_->id == $g->id, @{$groups->ItemsArrayRef};
+ok (!$bug, "didn't find group");
+
+=end testing
+
+=cut
+
 sub _Init { 
   my $self = shift;
   $self->{'table'} = "Groups";
   $self->{'primary_key'} = "id";
 
+  my @result = $self->SUPER::_Init(@_);
+
   $self->OrderBy( ALIAS => 'main',
 		  FIELD => 'Name',
 		  ORDER => 'ASC');
 
+  # XXX: this code should be generalized
+  $self->{'princalias'} = $self->Join(
+    ALIAS1 => 'main',
+    FIELD1 => 'id',
+    TABLE2 => 'Principals',
+    FIELD2 => 'id'
+  );
+
+  # even if this condition is useless and ids in the Groups table
+  # only match principals with type 'Group' this could speed up
+  # searches in some DBs.
+  $self->Limit( ALIAS => $self->{'princalias'},
+                FIELD => 'PrincipalType',
+                VALUE => 'Group',
+              );
 
-  return ( $self->SUPER::_Init(@_));
+  return (@result);
 }
 # }}}
 
+=head2 PrincipalsAlias
+
+Returns the string that represents this Users object's primary "Principals" alias.
+
+=cut
+
+# XXX: should be generalized, code duplication
+sub PrincipalsAlias {
+    my $self = shift;
+    return($self->{'princalias'});
+
+}
+
+
 # {{{ LimiToSystemInternalGroups
 
 =head2 LimitToSystemInternalGroups
@@ -215,7 +271,7 @@
 $u->Create(Name => 'Membertests');
 my $g = RT::Group->new($RT::SystemUser);
 my ($id, $msg) = $g->CreateUserDefinedGroup(Name => 'Membertests');
-ok ($id,$msg);
+ok ($id, $msg);
 
 my ($aid, $amsg) =$g->AddMember($u->id);
 ok ($aid, $amsg);
@@ -227,9 +283,6 @@
 ok ($groups->Count == 1,"found the 1 group - " . $groups->Count);
 ok ($groups->First->Id == $g->Id, "it's the right one");
 
-
-
-
 =end testing
 
 
@@ -285,7 +338,7 @@
 $groups = RT::Groups->new($RT::SystemUser);
 $groups->WithRight(Right => 'OwnTicket', Object => $q);
 ok ($id,$msg);
-is($groups->Count, 2);
+is($groups->Count, 3);
 
 my $RTxGroup = RT::Group->new($RT::SystemUser);
 ($id, $msg) = $RTxGroup->CreateUserDefinedGroup( Name => 'RTxGroup', Description => "RTx extension group");
@@ -343,83 +396,65 @@
 
 =cut
 
-
+#XXX: should be generilized
 sub WithRight {
     my $self = shift;
     my %args = ( Right                  => undef,
                  Object =>              => undef,
                  IncludeSystemRights    => 1,
                  IncludeSuperusers      => undef,
+                 IncludeSubgroupMembers => 0,
                  EquivObjects           => [ ],
                  @_ );
 
-    my $acl        = $self->NewAlias('ACL');
+    my $from_role = $self->Clone;
+    $from_role->WithRoleRight( %args );
 
-    # {{{ Find only rows where the right granted is the one we're looking up or _possibly_ superuser 
-    $self->Limit( ALIAS           => $acl,
-                  FIELD           => 'RightName',
-                  OPERATOR        => ($args{Right} ? '=' : 'IS NOT'),
-                  VALUE           => $args{Right} || 'NULL',
-                  ENTRYAGGREGATOR => 'OR' );
-
-    if ( $args{'IncludeSuperusers'} and $args{'Right'} ) {
-        $self->Limit( ALIAS           => $acl,
-                      FIELD           => 'RightName',
-                      OPERATOR        => '=',
-                      VALUE           => 'SuperUser',
-                      ENTRYAGGREGATOR => 'OR' );
-    }
-    # }}}
+    my $from_group = $self->Clone;
+    $from_group->WithGroupRight( %args );
 
-    my ($or_check_ticket_roles, $or_check_roles);
-    my $which_object = "$acl.ObjectType = 'RT::System'";
+    #XXX: DIRTY HACK
+    use DBIx::SearchBuilder::Union;
+    my $union = new DBIx::SearchBuilder::Union;
+    $union->add($from_role);
+    $union->add($from_group);
+    %$self = %$union;
+    bless $self, ref($union);
 
-    if ( defined $args{'Object'} ) {
-        if ( ref($args{'Object'}) eq 'RT::Ticket' ) {
-            $or_check_ticket_roles =
-                " OR ( main.Domain = 'RT::Ticket-Role' AND main.Instance = " . $args{'Object'}->Id . ") ";
-
-            # If we're looking at ticket rights, we also want to look at the associated queue rights.
-            # this is a little bit hacky, but basically, now that we've done the ticket roles magic,
-            # we load the queue object and ask all the rest of our questions about the queue.
-            $args{'Object'}   = $args{'Object'}->QueueObj;
-        }
-        # TODO XXX This really wants some refactoring
-        if ( ref($args{'Object'}) eq 'RT::Queue' ) {
-            $or_check_roles =
-                " OR ( ( (main.Domain = 'RT::Queue-Role' AND main.Instance = " .
-                $args{'Object'}->Id . ") $or_check_ticket_roles ) " .
-                " AND main.Type = $acl.PrincipalType) ";
-        }
-
-	if ( $args{'IncludeSystemRights'} ) {
-	    $which_object .= ' OR ';
-	}
-	else {
-	    $which_object = '';
-	}
-        foreach my $obj ( @{ $args{'EquivObjects'} } ) {
-             next unless ( UNIVERSAL::can( $obj, 'id' ) );
-             $which_object .= "($acl.ObjectType = '" . ref( $obj ) . "' AND $acl.ObjectId = " . $obj->id . ") OR ";
-         }
-        $which_object .=
-            " ($acl.ObjectType = '" . ref($args{'Object'}) . "'" .
-            " AND $acl.ObjectId = " . $args{'Object'}->Id . ") ";
-    }
-
-    $self->_AddSubClause( "WhichObject", "($which_object)" );
+    return;
+}
 
-    $self->_AddSubClause( "WhichGroup",
-        qq{
-          ( (    $acl.PrincipalId = main.id
-             AND $acl.PrincipalType = 'Group'
-             AND (   main.Domain = 'SystemInternal'
-                  OR main.Domain = 'UserDefined'
-                  OR main.Domain = 'ACLEquivalence'))
-           $or_check_roles)
-        }
-    );
+#XXX: methods are active aliases to Users class to prevent code duplication
+# should be generalized
+sub _JoinGroups {
+    my $self = shift;
+    my %args = (@_);
+    return 'main' unless $args{'IncludeSubgroupMembers'};
+    return $self->RT::Users::_JoinGroups( %args );
 }
+sub _JoinGroupMembers {
+    my $self = shift;
+    my %args = (@_);
+    return 'main' unless $args{'IncludeSubgroupMembers'};
+    return $self->RT::Users::_JoinGroupMembers( %args );
+}
+sub _JoinGroupMembersForGroupRights {
+    my $self = shift;
+    my %args = (@_);
+    my $group_members = $self->_JoinGroupMembers( %args );
+    unless( $group_members eq 'main' ) {
+        return $self->RT::Users::_JoinGroupMembersForGroupRights( %args );
+    }
+    $self->Limit( ALIAS => $args{'ACLAlias'},
+                  FIELD => 'PrincipalId',
+                  VALUE => "main.id",
+                  QUOTEVALUE => 0,
+                );
+}
+sub _JoinACL          { return (shift)->RT::Users::_JoinACL( @_ ) }
+sub _GetEquivObjects  { return (shift)->RT::Users::_GetEquivObjects( @_ ) }
+sub WithGroupRight    { return (shift)->RT::Users::WhoHaveGroupRight( @_ ) }
+sub WithRoleRight     { return (shift)->RT::Users::WhoHaveRoleRight( @_ ) }
 
 # {{{ sub LimitToEnabled
 
@@ -432,18 +467,11 @@
 sub LimitToEnabled {
     my $self = shift;
     
-    my $alias = $self->Join(
-	TYPE   => 'left',
-	ALIAS1 => 'main',
-	FIELD1 => 'id',
-	TABLE2 => 'Principals',
-	FIELD2 => 'id'
-    );
-
-    $self->Limit( ALIAS => $alias,
-		  FIELD => 'Disabled',
-		  VALUE => '0',
-		  OPERATOR => '=' );
+    $self->Limit( ALIAS => $self->PrincipalsAlias,
+		          FIELD => 'Disabled',
+		          VALUE => '0',
+		          OPERATOR => '=',
+                );
 }
 # }}}
 
@@ -458,20 +486,12 @@
 sub LimitToDeleted {
     my $self = shift;
     
-    my $alias = $self->Join(
-	TYPE   => 'left',
-	ALIAS1 => 'main',
-	FIELD1 => 'id',
-	TABLE2 => 'Principals',
-	FIELD2 => 'id'
-    );
-
     $self->{'find_disabled_rows'} = 1;
-    $self->Limit( ALIAS => $alias,
-		  FIELD => 'Disabled',
-		  OPERATOR => '=',
-		  VALUE => '1'
-		);
+    $self->Limit( ALIAS => $self->PrincipalsAlias,
+                  FIELD => 'Disabled',
+                  OPERATOR => '=',
+                  VALUE => 1,
+                );
 }
 # }}}
 

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N.pm	Mon Feb  6 15:04:21 2006
@@ -223,7 +223,7 @@
 
 	# {{{ Convert the body
 	eval {
-	    $RT::Logger->debug("Converting '$charset' to '$enc' for ". $head->mime_type . " - ". $head->get('subject'));
+	    $RT::Logger->debug("Converting '$charset' to '$enc' for ". $head->mime_type . " - ". ($head->get('subject') || 'Subjectless message'));
 
 	    # NOTE:: see the comments at the end of the sub.
 	    Encode::_utf8_off( $lines[$_] ) foreach ( 0 .. $#lines );

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/de.po
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/de.po	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/de.po	Mon Feb  6 15:04:21 2006
@@ -4017,15 +4017,15 @@
 
 #: html/Ticket/Elements/Tabs:172
 msgid "Steal"
-msgstr "Übernehmen"
+msgstr "Stehlen"
 
 #: lib/RT/Queue_Overlay.pm:118
 msgid "Steal tickets"
-msgstr "Anfragen übernehmen"
+msgstr "Anfragen stehlen"
 
 #: lib/RT/Queue_Overlay.pm:118
 msgid "StealTicket"
-msgstr "AnfrageÜbernehmen"
+msgstr "AnfrageStehlen"
 
 #: lib/RT/Transaction_Overlay.pm:667
 #. ($Old->Name)

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/fr.po
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/fr.po	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/fr.po	Mon Feb  6 15:04:21 2006
@@ -2880,7 +2880,7 @@
 
 #: lib/RT/Record.pm:944
 msgid "No value sent to _Set!\\n"
-msgstr "Pas de valeur à positionner !\\n"
+msgstr "Pas de valeur à positionner  \\n"
 
 #: html/Elements/QuickCreate:59
 msgid "Nobody"
@@ -4612,11 +4612,11 @@
 
 #: etc/initialdata:132 etc/initialdata:206
 msgid "User Defined"
-msgstr "Utilisateur défini"
+msgstr "Défini par l'utilisateur"
 
 #: html/Admin/Elements/EditScrip:98
 msgid "User Defined conditions and actions"
-msgstr "Conditions et actions définies par l'usager"
+msgstr "Conditions et actions définies par l'utilisateur"
 
 #: html/Admin/Elements/CustomFieldTabs:72 html/Admin/Elements/GroupTabs:68 html/Admin/Elements/QueueTabs:85 html/Admin/Elements/SystemTabs:68 html/Admin/Global/index.html:80
 msgid "User Rights"

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/ja.po
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/ja.po	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/ja.po	Mon Feb  6 15:04:21 2006
@@ -1,10 +1,9 @@
-#
 msgid ""
 msgstr ""
 "Project-Id-Version: RT 3.5.x\n"
 "POT-Creation-Date: 2002-05-02 11:36+0800\n"
-"PO-Revision-Date: 2005-10-03 13:49-0400\n"
-"Last-Translator: Jesse Vincent <jesse at bestpractical.com>\n"
+"PO-Revision-Date: 2005-10-20 02:00+0800\n"
+"Last-Translator: Daisuke Maki <daisuke at wafu.ne.jp>\n"
 "Language-Team: rt-devel <rt-devel at lists.fsck.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
@@ -181,7 +180,7 @@
 #. ($self->BriefDescription , $self->CreatorObj->Name)
 #. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
 msgid "%1 by %2"
-msgstr "%2による%1"
+msgstr "%1 (%2)"
 
 #: lib/RT/Transaction_Overlay.pm:777 lib/RT/Transaction_Overlay.pm:786 lib/RT/Transaction_Overlay.pm:789
 #. ($self->Field , $q1->Name , $q2->Name)
@@ -201,12 +200,12 @@
 
 #: NOT FOUND IN SOURCE
 msgid "%1 couldn't init a transaction (%2)\\n"
-msgstr "%1はトランザクションをはじめることができませんでした(%2)\\n"
+msgstr "%1はトランザクションを開始することができませんでした(%2)\\n"
 
 #: lib/RT/Ticket_Overlay.pm:2726
 #. ($self)
 msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
-msgstr "%1は分解するステータスを設定できませんでした。RTのデータベースに一貫性がない可能性があります。"
+msgstr "%1を解決状態に設定できませんでした。RTのデータベースに一貫性がない可能性があります。"
 
 #: lib/RT/Transaction_Overlay.pm:560
 #. ($obj_type)
@@ -225,7 +224,7 @@
 
 #: etc/initialdata:593
 msgid "%1 highest priority tickets I own"
-msgstr ""
+msgstr "優先度の高いチケット%1件"
 
 #: bin/rt-crontool:186
 #. ($0)
@@ -258,7 +257,7 @@
 
 #: etc/initialdata:601
 msgid "%1 newest unowned tickets"
-msgstr ""
+msgstr "担当されていないチケット%1件"
 
 #: NOT FOUND IN SOURCE
 msgid "%1 not shown"
@@ -288,7 +287,7 @@
 #: lib/RT/Action/ResolveMembers.pm:63
 #. (ref $self)
 msgid "%1 will resolve all members of a resolved group ticket."
-msgstr "%1は分解されたグループチケットのすべてのメンバーを分解します。"
+msgstr "%1はグループチケットのすべてのメンバーを解決状態にします。"
 
 #: NOT FOUND IN SOURCE
 msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request."
@@ -311,7 +310,7 @@
 #: lib/RT/Transaction_Overlay.pm:470
 #. ($self)
 msgid "%1: no attachment specified"
-msgstr "%1:アタッチメントが特定できません"
+msgstr "%1:アタッチメントが指定されていません"
 
 #: html/Ticket/Elements/ShowTransactionAttachments:78
 #. ($size)
@@ -440,7 +439,7 @@
 
 #: html/Admin/Users/Modify.html:71
 msgid "(required)"
-msgstr "(必要です)"
+msgstr "(必須項目です)"
 
 #: html/Ticket/Elements/ShowTransactionAttachments:82
 msgid "(untitled)"
@@ -486,7 +485,7 @@
 #: docs/design_docs/string-extraction-guide.txt:54 lib/RT/StyleGuide.pod:787
 #. ($m->scomp('/Elements/SelectNewTicketQueue'))
 msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
-msgstr "<input type=\"submit\" value=\"新しいチケット\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"新規作成\">&nbsp;%1"
 
 #: etc/initialdata:218
 msgid "A blank template"
@@ -563,7 +562,7 @@
 
 #: html/Search/Bulk.html:84
 msgid "Add Requestor"
-msgstr "リクエストする人をを追加する"
+msgstr "作成者をを追加する"
 
 #: html/Admin/Elements/AddCustomFieldValue:46
 msgid "Add Value"
@@ -701,7 +700,7 @@
 
 #: html/Elements/SelectDateRelation:57
 msgid "After"
-msgstr "後"
+msgstr "が以下より後である"
 
 #: html/Search/Elements/PickCriteria:52
 msgid "Aggregator"
@@ -770,7 +769,7 @@
 
 #: lib/RT/Date.pm:440
 msgid "Apr."
-msgstr "四月"
+msgstr "4月"
 
 #: html/Elements/SelectSortOrder:56 html/Search/Elements/DisplayOptions:73
 msgid "Ascending"
@@ -819,7 +818,7 @@
 
 #: lib/RT/Date.pm:444
 msgid "Aug."
-msgstr "八月"
+msgstr "8月"
 
 #: NOT FOUND IN SOURCE
 msgid "AuthSystem"
@@ -867,7 +866,7 @@
 
 #: html/Elements/SelectDateRelation:55 lib/RT/CurrentUser.pm:360
 msgid "Before"
-msgstr "前"
+msgstr "が以下より前である"
 
 #: html/Elements/Logo:47
 msgid "Best Practical Solutions, LLC corporate logo"
@@ -936,7 +935,7 @@
 
 #: lib/RT/Record.pm:1270 lib/RT/Record.pm:1348
 msgid "Can't specifiy both base and target"
-msgstr "ベースとターゲットを特定できません"
+msgstr "ベースとターゲット両方を指定する事はできません"
 
 #: html/autohandler:166
 #. ($msg)
@@ -968,8 +967,9 @@
 msgstr "権利を無効にするチェックボックス"
 
 #: html/Elements/EditLinks:148 html/Elements/EditLinks:85 html/Elements/ShowLinks:78 html/Ticket/Create.html:221 html/Ticket/Elements/BulkLinks:64
+# XXX - I can't come up with a good translation yet. leave as is in English
 msgid "Children"
-msgstr "子供"
+msgstr ""
 
 #: html/NoAuth/js/util.js:70 html/NoAuth/js/util.js:88
 msgid "Choose a date"
@@ -989,7 +989,7 @@
 
 #: html/Ticket/Elements/ShowDates:68
 msgid "Closed"
-msgstr ""
+msgstr "解決日時"
 
 #: NOT FOUND IN SOURCE
 msgid "Closed requests"
@@ -1138,7 +1138,7 @@
 
 #: lib/RT/Ticket_Overlay.pm:2987 lib/RT/Ticket_Overlay.pm:2995 lib/RT/Ticket_Overlay.pm:3012
 msgid "Could not change owner. "
-msgstr "オーナー変更ができませんでした"
+msgstr "担当者変更ができませんでした"
 
 #: html/Admin/CustomFields/Modify.html:135
 #. ($msg)
@@ -1450,7 +1450,7 @@
 
 #: html/Elements/SelectDateType:47 html/Ticket/Elements/ShowDates:48 lib/RT/Ticket_Overlay.pm:1146
 msgid "Created"
-msgstr "作成しました"
+msgstr "作成日時"
 
 #: html/Admin/CustomFields/Modify.html:137 html/Admin/Elements/EditCustomField:117
 #. ($CustomFieldObj->Name())
@@ -1576,7 +1576,7 @@
 
 #: lib/RT/Date.pm:448
 msgid "Dec."
-msgstr "十二月"
+msgstr "12月"
 
 #: etc/initialdata:222
 msgid "Default Autoresponse template"
@@ -1673,7 +1673,7 @@
 
 #: html/Elements/EditLinks:140 html/Elements/EditLinks:66 html/Elements/ShowLinks:58 html/Ticket/Create.html:219 html/Ticket/Elements/BulkLinks:56 html/Ticket/Elements/ShowDependencies:53
 msgid "Depended on by"
-msgstr "次のもの次第である"
+msgstr "依存されているチケット"
 
 #: NOT FOUND IN SOURCE
 msgid "Dependencies: \\n"
@@ -1701,15 +1701,15 @@
 
 #: html/Elements/EditLinks:136 html/Elements/EditLinks:57 html/Elements/SelectLinkType:48 html/Elements/ShowLinks:48 html/Ticket/Create.html:218 html/Ticket/Elements/BulkLinks:52 html/Ticket/Elements/ShowDependencies:46
 msgid "Depends on"
-msgstr "による"
+msgstr "依存しているチケット"
 
 #: html/Elements/SelectSortOrder:56 html/Search/Elements/DisplayOptions:78
 msgid "Descending"
-msgstr "降順する"
+msgstr "降順"
 
 #: html/SelfService/Create.html:100 html/Ticket/Create.html:150
 msgid "Describe the issue below"
-msgstr "下の問題点を表す"
+msgstr "チケットの本文を以下に書き込んでください"
 
 #: html/Admin/CustomFields/Modify.html:61 html/Admin/Elements/AddCustomFieldValue:57 html/Admin/Elements/EditCustomField:60 html/Admin/Elements/EditCustomFieldValues:56 html/Admin/Elements/EditScrip:56 html/Admin/Elements/ModifyTemplate:57 html/Admin/Groups/Modify.html:71 html/Admin/Queues/Modify.html:69 html/Search/Elements/EditSearches:56 html/User/Groups/Modify.html:70
 msgid "Description"
@@ -1761,7 +1761,7 @@
 
 #: html/Elements/Refresh:51
 msgid "Don't refresh this page."
-msgstr "このページを更新しないでください"
+msgstr "ページを定期的に更新しない"
 
 #: html/Ticket/Elements/ShowTransactionAttachments:82
 msgid "Download"
@@ -1773,7 +1773,7 @@
 
 #: html/Elements/SelectDateType:53 html/Ticket/Create.html:207 html/Ticket/Elements/EditDates:66 html/Ticket/Elements/Reminders:86 html/Ticket/Elements/ShowDates:64 lib/RT/Ticket_Overlay.pm:1150
 msgid "Due"
-msgstr "期限切れ"
+msgstr "終了予定日時"
 
 #: NOT FOUND IN SOURCE
 msgid "Due date '%1' could not be parsed"
@@ -1875,7 +1875,7 @@
 
 #: lib/RT/Record.pm:1285 lib/RT/Record.pm:1362
 msgid "Either base or target must be specified"
-msgstr "ベースもしくはターゲットを特定しなければなりません"
+msgstr "ベースもしくはターゲットを指定しなければなりません"
 
 #: html/Admin/Users/Modify.html:74 html/Ticket/Elements/AddWatchers:77 html/User/Prefs.html:65
 msgid "Email"
@@ -2023,7 +2023,7 @@
 
 #: lib/RT/Date.pm:438
 msgid "Feb."
-msgstr "二月"
+msgstr "2月"
 
 #: html/Elements/SelectAttachmentField:50
 msgid "Filename"
@@ -2219,7 +2219,7 @@
 
 #: NOT FOUND IN SOURCE
 msgid "Group not specified.\\n"
-msgstr "グループが特定できません。\\n"
+msgstr "グループが指定されていません。\\n"
 
 #: html/Admin/Elements/GlobalCustomFieldTabs:59 html/Admin/Elements/SelectNewGroupMembers:56 html/Admin/Elements/Tabs:56 html/Admin/Global/CustomFields/index.html:69 html/Admin/Groups/Members.html:85 html/Admin/Queues/People.html:104 html/Admin/Users/Memberships.html:53 html/Admin/index.html:67 html/User/Groups/Members.html:88 lib/RT/CustomField_Overlay.pm:1191
 msgid "Groups"
@@ -2244,11 +2244,11 @@
 #: docs/design_docs/string-extraction-guide.txt:40 lib/RT/StyleGuide.pod:773
 #. ($name)
 msgid "Hello, %1"
-msgstr "こんにちは、%1"
+msgstr "こんにちは、%1さん"
 
 #: html/Admin/Elements/GroupTabs:70 html/Admin/Elements/UserTabs:64 html/Ticket/Elements/ShowHistory:51 html/Ticket/Elements/Tabs:111
 msgid "History"
-msgstr "ヒストリー"
+msgstr "更新履歴"
 
 #: html/Admin/Groups/History.html:62
 #. ($GroupObj->Name)
@@ -2262,11 +2262,11 @@
 
 #: NOT FOUND IN SOURCE
 msgid "HomePhone"
-msgstr "自宅の電話"
+msgstr "電話(自宅)"
 
 #: html/Elements/Tabs:65
 msgid "Homepage"
-msgstr "ホームページ"
+msgstr "ホーム"
 
 #: html/Elements/SelectTimeUnits:48
 msgid "Hours"
@@ -2291,7 +2291,7 @@
 
 #: html/Admin/Users/Modify.html:65 html/User/Prefs.html:60
 msgid "Identity"
-msgstr "身分証明書"
+msgstr "基本情報"
 
 #: etc/initialdata:429
 msgid "If an approval is rejected, reject the original and delete pending approvals"
@@ -2311,7 +2311,7 @@
 
 #: html/Admin/Queues/People.html:126 html/Ticket/Modify.html:60 html/Ticket/ModifyAll.html:128 html/Ticket/ModifyPeople.html:59
 msgid "If you've updated anything above, be sure to"
-msgstr "上の何かをアップデートしたなら、次のことを確認してください"
+msgstr "変更を反映するにはボタンを推してください"
 
 #: lib/RT/Record.pm:937
 msgid "Illegal value for %1"
@@ -2382,7 +2382,7 @@
 
 #: NOT FOUND IN SOURCE
 msgid "Invalid owner. Defaulting to 'nobody'."
-msgstr "無効なオーナーです。 '誰でもない'に初期設定します."
+msgstr "無効な担当者です。 '誰でもない'に初期設定します."
 
 #: lib/RT/CustomField_Overlay.pm:202 lib/RT/CustomField_Overlay.pm:666
 #. ($msg)
@@ -2428,7 +2428,7 @@
 
 #: lib/RT/Date.pm:437
 msgid "Jan."
-msgstr "一月"
+msgstr "1月"
 
 #: lib/RT/Group_Overlay.pm:174
 msgid "Join or leave this group"
@@ -2436,15 +2436,15 @@
 
 #: lib/RT/Date.pm:443
 msgid "Jul."
-msgstr "七月"
+msgstr "7月"
 
 #: html/Ticket/Elements/Tabs:124
 msgid "Jumbo"
-msgstr "大きい"
+msgstr "総合"
 
 #: lib/RT/Date.pm:442
 msgid "Jun."
-msgstr "六月"
+msgstr "6月"
 
 #: NOT FOUND IN SOURCE
 msgid "Keyword"
@@ -2468,7 +2468,7 @@
 
 #: html/Ticket/Elements/EditDates:59 html/Ticket/Elements/ShowDates:60
 msgid "Last Contact"
-msgstr "最後のコンタクト"
+msgstr "最終更新日時"
 
 #: html/Elements/SelectDateType:50
 msgid "Last Contacted"
@@ -2476,7 +2476,7 @@
 
 #: html/Elements/SelectDateType:51
 msgid "Last Updated"
-msgstr "最後にアップデートした"
+msgstr "最終更新日時"
 
 #: html/Search/Elements/PickBasics:103
 msgid "LastUpdatedBy"
@@ -2484,7 +2484,7 @@
 
 #: html/Ticket/Elements/ShowBasics:68
 msgid "Left"
-msgstr "残った"
+msgstr "残り時間"
 
 #: html/Admin/Users/Modify.html:109
 msgid "Let this user access RT"
@@ -2496,7 +2496,7 @@
 
 #: NOT FOUND IN SOURCE
 msgid "Limiting owner to %1 %2"
-msgstr "オーナーを%1 %2に制限します"
+msgstr "担当者を%1 %2に制限します"
 
 #: NOT FOUND IN SOURCE
 msgid "Limiting queue to %1 %2"
@@ -2560,7 +2560,7 @@
 
 #: html/Admin/Users/Modify.html:138 html/User/Prefs.html:126
 msgid "Location"
-msgstr "場所"
+msgstr "住所"
 
 #: lib/RT.pm:212
 #. ($RT::LogDir)
@@ -2570,7 +2570,7 @@
 #: html/Elements/Header:82
 #. ("<span>".$session{'CurrentUser'}->Name."</span>")
 msgid "Logged in as %1"
-msgstr "%1としてサインする"
+msgstr "\"%1\"でログインしています"
 
 #: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:57 html/Elements/Login:73 html/Elements/Login:89 lib/RT/StyleGuide.pod:797
 msgid "Login"
@@ -2586,7 +2586,7 @@
 
 #: html/Search/Bulk.html:82
 msgid "Make Owner"
-msgstr "オーナーを決める"
+msgstr "担当者を決める"
 
 #: html/Search/Bulk.html:106
 msgid "Make Status"
@@ -2650,11 +2650,11 @@
 
 #: lib/RT/Date.pm:439
 msgid "Mar."
-msgstr "三月"
+msgstr "3月"
 
 #: lib/RT/Date.pm:441
 msgid "May."
-msgstr "五月"
+msgstr "5月"
 
 #: lib/RT/Transaction_Overlay.pm:720
 #. ($value)
@@ -3016,7 +3016,7 @@
 
 #: lib/RT/User_Overlay.pm:227
 msgid "Must specify 'Name' attribute"
-msgstr "'名前'の属性を特定してください"
+msgstr "'名前'の属性を指定してください"
 
 #: html/SelfService/Elements/MyRequests:69
 #. ($friendly_status)
@@ -3181,11 +3181,11 @@
 
 #: NOT FOUND IN SOURCE
 msgid "No Ticket specified. Aborting ticket "
-msgstr "チケットが特定できません。チケットを終了します"
+msgstr "チケットが指定されていません。"
 
 #: NOT FOUND IN SOURCE
 msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
-msgstr "チケットが特定できません。チケットの修正を終了します\\n\\n"
+msgstr "チケットが指定されていません。チケットの修正を終了します\\n\\n"
 
 #: html/Approvals/Elements/Approve:73
 msgid "No action"
@@ -3214,7 +3214,7 @@
 
 #: lib/RT/Users_Overlay.pm:185
 msgid "No group specified"
-msgstr "グループが特定できません"
+msgstr "グループが指定されていません"
 
 #: html/Admin/Groups/index.html:52
 msgid "No groups matching search criteria found."
@@ -3251,7 +3251,7 @@
 
 #: lib/RT/Queue_Overlay.pm:792 lib/RT/Ticket_Overlay.pm:1451
 msgid "No principal specified"
-msgstr "責任者が特定できません"
+msgstr "責任者が指定されていません"
 
 #: html/Admin/Queues/People.html:175 html/Admin/Queues/People.html:185
 msgid "No principals selected."
@@ -3283,11 +3283,11 @@
 
 #: NOT FOUND IN SOURCE
 msgid "No ticket id specified"
-msgstr "チケットIDが特定できません"
+msgstr "チケットIDが指定されていません"
 
 #: lib/RT/Transaction_Overlay.pm:517 lib/RT/Transaction_Overlay.pm:554
 msgid "No transaction type specified"
-msgstr "トランザクションタイプが特定できません"
+msgstr "トランザクションタイプが指定されていません"
 
 #: html/Admin/Users/index.html:55
 msgid "No users matching search criteria found."
@@ -3311,19 +3311,19 @@
 
 #: html/Elements/Header:84
 msgid "Not logged in."
-msgstr "ログインできません"
+msgstr "ログインしていません"
 
 #: lib/RT/Date.pm:393
 msgid "Not set"
-msgstr "セットできません"
+msgstr "未指定"
 
 #: html/NoAuth/Reminder.html:48
 msgid "Not yet implemented."
-msgstr "まだ実行できません"
+msgstr "未実装"
 
 #: NOT FOUND IN SOURCE
 msgid "Not yet implemented...."
-msgstr "まだ実行できません。。。"
+msgstr "未実装..."
 
 #: html/Approvals/Elements/Approve:77
 msgid "Notes"
@@ -3437,7 +3437,7 @@
 
 #: lib/RT/Date.pm:446
 msgid "Oct."
-msgstr "十月"
+msgstr "10月"
 
 #: html/Tools/Elements/Tabs:55
 msgid "Offline"
@@ -3453,7 +3453,7 @@
 
 #: html/Elements/SelectDateRelation:56
 msgid "On"
-msgstr "に"
+msgstr "が以下である"
 
 #: etc/initialdata:163
 msgid "On Comment"
@@ -3507,7 +3507,7 @@
 
 #: NOT FOUND IN SOURCE
 msgid "Open"
-msgstr "開く"
+msgstr "着手済み" 
 
 #: html/Ticket/Elements/Tabs:161
 msgid "Open it"
@@ -3576,7 +3576,7 @@
 
 #: etc/initialdata:38 html/Elements/QuickCreate:56 html/Search/Elements/PickBasics:101 html/SelfService/Elements/MyRequests:51 html/Ticket/Create.html:70 html/Ticket/Elements/EditBasics:61 html/Ticket/Elements/EditPeople:64 html/Ticket/Elements/EditPeople:65 html/Ticket/Elements/Reminders:82 html/Ticket/Elements/ShowPeople:48 html/Ticket/Update.html:62 lib/RT/ACE_Overlay.pm:111 lib/RT/Tickets_Overlay.pm:1781
 msgid "Owner"
-msgstr "オーナー"
+msgstr "担当者"
 
 #: lib/RT/Ticket_Overlay.pm:496
 msgid "Owner could not be set."
@@ -3585,11 +3585,11 @@
 #: lib/RT/Transaction_Overlay.pm:661
 #. ($Old->Name , $New->Name)
 msgid "Owner forcibly changed from %1 to %2"
-msgstr "オーナーは強制的に%1から%2を変更しました"
+msgstr "担当者は強制的に%1から%2を変更しました"
 
 #: NOT FOUND IN SOURCE
 msgid "Owner is"
-msgstr "オーナーは"
+msgstr "担当者は"
 
 #: html/Elements/TicketList:78
 #. ($Page, int($TotalFound/$Rows)+$oddRows)
@@ -3605,8 +3605,9 @@
 msgstr "ポケットベル電話"
 
 #: html/Elements/EditLinks:144 html/Elements/EditLinks:76 html/Elements/ShowLinks:68 html/Ticket/Create.html:220 html/Ticket/Elements/BulkLinks:60
+# XXX - I can't come up with a good translation yet. leave as is in English
 msgid "Parents"
-msgstr "両親"
+msgstr ""
 
 #: html/Elements/Login:84 html/User/Prefs.html:105
 msgid "Password"
@@ -3651,8 +3652,10 @@
 msgstr ""
 
 #: html/Ticket/Elements/ShowSummary:62 html/Ticket/Elements/Tabs:119 html/Ticket/ModifyAll.html:72
+# XXX - this is not really a good translation... but much better than
+# "人々" (daisuke)
 msgid "People"
-msgstr "人々"
+msgstr "担当者等"
 
 #: etc/initialdata:133
 msgid "Perform a user-defined action"
@@ -3712,7 +3715,7 @@
 
 #: NOT FOUND IN SOURCE
 msgid "Pri"
-msgstr "優先権"
+msgstr "優先度"
 
 #: lib/RT/ACE_Overlay.pm:158 lib/RT/ACE_Overlay.pm:240 lib/RT/ACE_Overlay.pm:570
 #. ($args{'PrincipalId'})
@@ -3721,7 +3724,7 @@
 
 #: html/Search/Elements/PickBasics:147 html/Ticket/Create.html:179 html/Ticket/Elements/EditBasics:87 html/Ticket/Elements/ShowBasics:72 lib/RT/Tickets_Overlay.pm:1565
 msgid "Priority"
-msgstr "優先権"
+msgstr "優先度"
 
 #: html/Admin/Queues/Modify.html:86
 msgid "Priority starts at"
@@ -3808,11 +3811,11 @@
 
 #: html/Elements/Quicksearch:47 html/Prefs/Elements/Tabs:58 html/Prefs/Quicksearch.html:70
 msgid "Quick search"
-msgstr ""
+msgstr "簡易検索"
 
 #: html/Elements/QuickCreate:47
 msgid "Quick ticket creation"
-msgstr ""
+msgstr "チケット新規作成"
 
 #: html/Search/Results.html:84
 msgid "RSS"
@@ -3877,7 +3880,7 @@
 
 #: NOT FOUND IN SOURCE
 msgid "RT couldn't find requestor via its external database lookup"
-msgstr "RTは外部のデータベースルックアップを使ってリクエストする人を見つけることができませんでした"
+msgstr "RTは外部のデータベースルックアップを使って作成者を見つけることができませんでした"
 
 #: NOT FOUND IN SOURCE
 msgid "RT couldn't find the queue: %1"
@@ -3950,11 +3953,11 @@
 
 #: html/Elements/EditLinks:103 html/Elements/EditLinks:156 html/Elements/ShowLinks:92 html/Ticket/Create.html:223 html/Ticket/Elements/BulkLinks:72
 msgid "Referred to by"
-msgstr "次のものによって参照した"
+msgstr "参照されているチケット"
 
 #: html/Elements/EditLinks:152 html/Elements/EditLinks:94 html/Elements/SelectLinkType:49 html/Elements/ShowLinks:82 html/Ticket/Create.html:222 html/Ticket/Elements/BulkLinks:68
 msgid "Refers to"
-msgstr "参照する"
+msgstr "参照しているチケット"
 
 #: NOT FOUND IN SOURCE
 msgid "Refine"
@@ -3967,7 +3970,7 @@
 #: html/Elements/Refresh:57
 #. ($value/60)
 msgid "Refresh this page every %1 minutes."
-msgstr "このページを%1分おきに更新してください"
+msgstr "ページを%1分おきに更新する"
 
 #: lib/RT/Transaction_Overlay.pm:799
 #. ($ticket->Subject)
@@ -4008,7 +4011,7 @@
 
 #: html/Search/Bulk.html:86
 msgid "Remove Requestor"
-msgstr "リクエストする人を削除する"
+msgstr "作成者を削除する"
 
 #: html/Ticket/Elements/ShowTransaction:178 html/Ticket/Elements/Tabs:147
 msgid "Reply"
@@ -4016,7 +4019,7 @@
 
 #: html/Admin/Queues/Modify.html:72
 msgid "Reply Address"
-msgstr ""
+msgstr "返信アドレス"
 
 #: html/Search/Bulk.html:129 html/Ticket/ModifyAll.html:94 html/Ticket/Update.html:79
 msgid "Reply to requestors"
@@ -4036,15 +4039,15 @@
 
 #: etc/initialdata:44 lib/RT/ACE_Overlay.pm:112
 msgid "Requestor"
-msgstr "リクエストする人"
+msgstr "作成者"
 
 #: NOT FOUND IN SOURCE
 msgid "Requestor email address"
-msgstr "リクエストする人のEメールアドレス"
+msgstr "作成者のEメールアドレス"
 
 #: html/SelfService/Create.html:63 html/Ticket/Create.html:78 html/Ticket/Elements/EditPeople:69 html/Ticket/Elements/ShowPeople:52
 msgid "Requestors"
-msgstr "リクエストする人"
+msgstr "作成者"
 
 #: html/Admin/Queues/Modify.html:96
 msgid "Requests should be due in"
@@ -4065,7 +4068,7 @@
 
 #: html/Ticket/Elements/Tabs:157
 msgid "Resolve"
-msgstr "分解する"
+msgstr "解決済みにする"
 
 #: html/Ticket/Update.html:157
 #. ($TicketObj->id, $TicketObj->Subject)
@@ -4074,7 +4077,7 @@
 
 #: etc/initialdata:323 html/Elements/SelectDateType:49 lib/RT/Ticket_Overlay.pm:1149
 msgid "Resolved"
-msgstr "分解した"
+msgstr "解決済み"
 
 #: html/Tools/Reports/Elements/Tabs:55
 msgid "Resolved by owner"
@@ -4094,7 +4097,7 @@
 
 #: NOT FOUND IN SOURCE
 msgid "Response to requestors"
-msgstr "リクエストする人に返答する"
+msgstr "作成者に返答する"
 
 #: html/Elements/ListActions:47 html/Search/Elements/NewListActions:47
 msgid "Results"
@@ -4184,7 +4187,7 @@
 
 #: html/User/Prefs.html:179
 msgid "Save Preferences"
-msgstr ""
+msgstr "変更を保存する"
 
 #: html/Ticket/Elements/PreviewScrips:126
 msgid "Save changes"
@@ -4448,7 +4451,7 @@
 
 #: lib/RT/Date.pm:445
 msgid "Sep."
-msgstr "九月"
+msgstr "9月"
 
 #: html/Ticket/Elements/ShowTransaction:157
 msgid "Show"
@@ -4592,7 +4595,7 @@
 
 #: html/Elements/SelectDateType:52 html/Ticket/Create.html:206 html/Ticket/Elements/EditDates:48 html/Ticket/Elements/ShowDates:52
 msgid "Starts"
-msgstr "開始する"
+msgstr "開始予定日時"
 
 #: NOT FOUND IN SOURCE
 msgid "Starts By"
@@ -4604,11 +4607,11 @@
 
 #: html/Admin/Users/Modify.html:162 html/User/Prefs.html:145
 msgid "State"
-msgstr "状態"
+msgstr "都道府県"
 
 #: html/Search/Elements/PickBasics:87 html/SelfService/Elements/MyRequests:50 html/SelfService/Update.html:57 html/Ticket/Create.html:64 html/Ticket/Elements/EditBasics:53 html/Ticket/Elements/ShowBasics:52 html/Ticket/Update.html:59 lib/RT/Ticket_Overlay.pm:1143 lib/RT/Tickets_Overlay.pm:1425
 msgid "Status"
-msgstr "ステータス"
+msgstr "状態"
 
 #: etc/initialdata:309
 msgid "Status Change"
@@ -4620,7 +4623,7 @@
 
 #: html/Ticket/Elements/Tabs:172
 msgid "Steal"
-msgstr "盗用する"
+msgstr "担当者変更"
 
 #: lib/RT/Queue_Overlay.pm:118
 msgid "Steal tickets"
@@ -4633,7 +4636,7 @@
 #: lib/RT/Transaction_Overlay.pm:667
 #. ($Old->Name)
 msgid "Stolen from %1"
-msgstr "%1から盗用した"
+msgstr "%1から担当者を変更しました"
 
 #: NOT FOUND IN SOURCE
 msgid "Stolen from %1 "
@@ -4645,7 +4648,7 @@
 
 #: html/Elements/QuickCreate:52 html/Elements/SelectAttachmentField:47 html/Search/Bulk.html:132 html/SelfService/Create.html:79 html/SelfService/Elements/MyRequests:49 html/SelfService/Update.html:65 html/Ticket/Create.html:106 html/Ticket/Elements/EditBasics:48 html/Ticket/Elements/Reminders:78 html/Ticket/ModifyAll.html:100 html/Ticket/Update.html:83 lib/RT/Ticket_Overlay.pm:1139 lib/RT/Tickets_Overlay.pm:1507
 msgid "Subject"
-msgstr "サブジェクト"
+msgstr "件名"
 
 #: docs/design_docs/string-extraction-guide.txt:89 lib/RT/StyleGuide.pod:815 lib/RT/Transaction_Overlay.pm:689
 #. ($self->Data)
@@ -4710,8 +4713,9 @@
 msgstr "テスト_ストリング"
 
 #: etc/initialdata:603 html/Search/Elements/EditFormat:72 html/Ticket/Elements/Tabs:168
+# XXX - what the...
 msgid "Take"
-msgstr "とる"
+msgstr "担当する"
 
 #: lib/RT/Queue_Overlay.pm:116
 msgid "Take tickets"
@@ -4799,7 +4803,7 @@
 
 #: lib/RT/Ticket_Overlay.pm:3172
 msgid "That ticket has unresolved dependencies"
-msgstr "そのチケットは従属物をすでに分解しました"
+msgstr "未解決の依存関係が存在します"
 
 #: NOT FOUND IN SOURCE
 msgid "That user already has that right"
@@ -4921,7 +4925,7 @@
 #: html/Ticket/ModifyAll.html:46 html/Ticket/ModifyAll.html:50
 #. ($Ticket->Id, $Ticket->Subject)
 msgid "Ticket #%1 Jumbo update: %2"
-msgstr "チケット #%1 大きいアップデート: %2"
+msgstr "チケット #%1 更新(総合ビュー): %2"
 
 #: html/Approvals/Elements/ShowDependency:67
 #. ($link->BaseObj->Id, $link->BaseObj->Subject)
@@ -5000,7 +5004,7 @@
 
 #: html/Ticket/Display.html:55
 msgid "Ticket metadata"
-msgstr ""
+msgstr "チケット情報"
 
 #: etc/initialdata:310
 msgid "Ticket status changed"
@@ -5049,15 +5053,15 @@
 
 #: html/Search/Elements/PickBasics:135 html/Ticket/Create.html:194 html/Ticket/Elements/EditBasics:80
 msgid "Time Left"
-msgstr "時間が残っています"
+msgstr "残り時間"
 
 #: html/Search/Elements/PickBasics:133 html/Ticket/Create.html:187 html/Ticket/Elements/EditBasics:73
 msgid "Time Worked"
-msgstr "使った時間"
+msgstr "作業時間"
 
 #: lib/RT/Tickets_Overlay.pm:1666
 msgid "Time left"
-msgstr "残っている時間"
+msgstr "残り時間"
 
 #: html/Elements/Footer:52
 msgid "Time to display"
@@ -5251,7 +5255,7 @@
 
 #: html/Elements/SelectDateType:54 html/Ticket/Elements/ShowDates:72 lib/RT/Ticket_Overlay.pm:1148
 msgid "Updated"
-msgstr "アップデートしました"
+msgstr "最終更新日時"
 
 #: html/Tools/Offline.html:95
 msgid "Upload"
@@ -5474,19 +5478,19 @@
 
 #: NOT FOUND IN SOURCE
 msgid "WorkPhone"
-msgstr "仕事先の電話"
+msgstr "電話(仕事)"
 
 #: html/Ticket/Elements/ShowBasics:63 html/Ticket/Update.html:64
 msgid "Worked"
-msgstr "Worked"
+msgstr "累積作業時間"
 
 #: lib/RT/Ticket_Overlay.pm:3079
 msgid "You already own this ticket"
-msgstr "あなたはすでにこのチケットを所有しています"
+msgstr "すでにこのチケットを担当しています"
 
 #: html/autohandler:176 html/autohandler:184
 msgid "You are not an authorized user"
-msgstr "あなたは認証されたユーザーではありません"
+msgstr "認証されていません。"
 
 #: html/Prefs/Search.html:56
 msgid "You can also edit the predefined search itself"
@@ -5494,7 +5498,7 @@
 
 #: lib/RT/Ticket_Overlay.pm:2961
 msgid "You can only reassign tickets that you own or that are unowned"
-msgstr "あなたは所有、または所有されていないチケットのみを止めることができます"
+msgstr "自分が担当しているチケットか、担当者のいないチケットしか変更する事ができません。"
 
 #: NOT FOUND IN SOURCE
 msgid "You don't have permission to view that ticket.\\n"
@@ -5503,23 +5507,23 @@
 #: docs/design_docs/string-extraction-guide.txt:47 lib/RT/StyleGuide.pod:780
 #. ($num, $queue)
 msgid "You found %1 tickets in queue %2"
-msgstr "あなたは%2でチケット%1を見つけました"
+msgstr "キュー%2で%1件のチケットがヒットしました"
 
 #: html/NoAuth/Logout.html:52
 msgid "You have been logged out of RT."
-msgstr "あなたはRTからログアウトしたままです"
+msgstr "RTからログアウトしました"
 
 #: html/SelfService/Display.html:109
 msgid "You have no permission to create tickets in that queue."
-msgstr "あなたはこのキューでチケット作成の許可がありません"
+msgstr "指定ののキューでチケット作成の許可がありません"
 
 #: lib/RT/Ticket_Overlay.pm:1965
 msgid "You may not create requests in that queue."
-msgstr "あなたはこのキューでリクエストの作成ができるでしょう"
+msgstr "指定のキューでリクエストの作成ができません"
 
 #: html/NoAuth/Logout.html:56
 msgid "You're welcome to login again"
-msgstr "ぜひまたログインしてください"
+msgstr "トップページ"
 
 #: NOT FOUND IN SOURCE
 msgid "Your %1 requests"
@@ -5572,7 +5576,7 @@
 
 #: html/Elements/SelectCustomFieldOperator:59 html/Elements/SelectMatch:55
 msgid "contains"
-msgstr "含む"
+msgstr "が以下を含む"
 
 #: NOT FOUND IN SOURCE
 msgid "correspondence (probably) not sent"
@@ -5592,7 +5596,7 @@
 
 #: lib/RT/Queue_Overlay.pm:88
 msgid "deleted"
-msgstr "削除された"
+msgstr "削除"
 
 #: html/Search/Elements/PickBasics:61
 msgid "does not match"
@@ -5600,7 +5604,7 @@
 
 #: html/Elements/SelectCustomFieldOperator:59 html/Elements/SelectMatch:56
 msgid "doesn't contain"
-msgstr "含みません"
+msgstr "が以下を含まない"
 
 #: html/Elements/SelectEqualityOperator:59
 msgid "equal to"
@@ -5654,15 +5658,15 @@
 
 #: html/Elements/SelectBoolean:53 html/Elements/SelectCustomFieldOperator:59 html/Elements/SelectMatch:57 html/Search/Elements/PickBasics:162 html/Search/Elements/PickBasics:74 html/Search/Elements/PickBasics:90 html/Search/Elements/PickCFs:53
 msgid "is"
-msgstr "です"
+msgstr "が以下である"
 
 #: html/Elements/SelectBoolean:57 html/Elements/SelectCustomFieldOperator:59 html/Elements/SelectMatch:58 html/Search/Elements/PickBasics:163 html/Search/Elements/PickBasics:75 html/Search/Elements/PickBasics:91 html/Search/Elements/PickCFs:54
 msgid "isn't"
-msgstr "でない"
+msgstr "が以下ではない"
 
 #: html/Elements/SelectCustomFieldOperator:59 html/Elements/SelectEqualityOperator:59
 msgid "less than"
-msgstr "より少ない"
+msgstr "より小さい"
 
 #: html/Search/Elements/PickBasics:60
 msgid "matches"
@@ -5670,7 +5674,7 @@
 
 #: lib/RT/Date.pm:334
 msgid "min"
-msgstr "最低"
+msgstr "分"
 
 #: NOT FOUND IN SOURCE
 msgid "minutes"
@@ -5686,7 +5690,7 @@
 
 #: lib/RT/Queue_Overlay.pm:83
 msgid "new"
-msgstr "新しい"
+msgstr "新規"
 
 #: html/Admin/Elements/PickCustomFields:64 html/Admin/Elements/PickObjects:65
 msgid "no name"
@@ -5706,7 +5710,7 @@
 
 #: html/SelfService/Elements/MyRequests:82 lib/RT/Queue_Overlay.pm:84
 msgid "open"
-msgstr "開く"
+msgstr "着手"
 
 #: lib/RT/Group_Overlay.pm:227
 #. ($self->Name, $user->Name)
@@ -5720,11 +5724,11 @@
 
 #: lib/RT/Queue_Overlay.pm:87
 msgid "rejected"
-msgstr "拒否されました"
+msgstr "拒否"
 
 #: lib/RT/Queue_Overlay.pm:86
 msgid "resolved"
-msgstr "分解されました"
+msgstr "解決済み"
 
 #: lib/RT/Date.pm:330
 msgid "sec"
@@ -5740,7 +5744,7 @@
 
 #: lib/RT/Queue_Overlay.pm:85
 msgid "stalled"
-msgstr "止まりました"
+msgstr "保留"
 
 #: html/Search/Results.html:93
 #. ($m->scomp('Elements/SelectChartType', Name => 'ChartStyle'))
@@ -5796,3 +5800,7 @@
 msgid "years"
 msgstr "年"
 
+#: share/html/Elements/Quicksearch, et al
+msgid "New"
+msgstr "新規"
+

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/ru.po
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/ru.po	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/I18N/ru.po	Mon Feb  6 15:04:21 2006
@@ -1,14 +1,14 @@
-# translation of ru-nortfm.po to Russian
-# translation of ru.po to Russian
-# Andrew Kornilov <andy at eva.dp.ua>, 2004, 2005.
+# translation of Request Tracker en.po to Russian
+# Andrew Kornilov <hiddenman at tpway.com>, 2004, 2005.
+# 
+# 
 msgid ""
 msgstr ""
-"Last-Translator: Andrew Kornilov <andy at eva.dp.ua>\n"
-"PO-Revision-Date: 2005-10-03 13:52-0400\n"
+"Last-Translator: Andrew Kornilov <hiddenman at tpway.com>\n"
+"PO-Revision-Date: 2005-09-25 22:16+0300\n"
 "Language-Team: rt-devel <rt-devel at lists.fsck.com>\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.9.1\n"
 "Project-Id-Version: RT 3.5.x\n"
 "MIME-Version: 1.0\n"
 
@@ -38,12 +38,12 @@
 msgid "%1 #%2"
 msgstr ""
 
-#: lib/RT/Date.pm:361
+#: lib/RT/Date.pm:360
 #. ($s, $time_unit)
 msgid "%1 %2"
 msgstr ""
 
-#: lib/RT/Date.pm:397
+#: lib/RT/Date.pm:396
 #. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
 msgid "%1 %2 %3 %4:%5:%6 %7"
 msgstr "%1 %2 %3 %4:%5:%6 %7"
@@ -55,7 +55,7 @@
 msgid "%1 %2 added"
 msgstr "%1 %2 добавлен"
 
-#: lib/RT/Date.pm:358
+#: lib/RT/Date.pm:357
 #. ($s, $time_unit)
 msgid "%1 %2 ago"
 msgstr "%1 %2 назад"
@@ -79,6 +79,7 @@
 
 #: html/Admin/Elements/EditScrips:65 html/Admin/Elements/ListGlobalScrips:64 html/Ticket/Elements/PreviewScrips:99
 #. (loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name))
+#. ($scrip->ConditionObj->Name, $scrip->ActionObj->Name, $scrip->TemplateObj->Name)
 msgid "%1 %2 with template %3"
 msgstr "%1 %2 с шаблоном %3"
 
@@ -130,21 +131,11 @@
 msgid "%1 - Specify the search module you want to use"
 msgstr ""
 
-     $RT::VERSION, 
-     '2005', 
-    '<a href="http://www.bestpractical.com?rt='.$RT::VERSION.'">Best Practical Solutions, LLC</a>',)
-     $RT::VERSION, 
-     '2005', 
-    '<a href="http://www.bestpractical.com?rt='.$RT::VERSION.'">Best Practical Solutions, LLC</a>',)
 #: html/Elements/Footer:61
-#. ('&#187;&#124;&#171;', 
-     $RT::VERSION, 
-     '2005', 
-    '<a href="http://www.bestpractical.com?rt='.$RT::VERSION.'">Best Practical Solutions, LLC</a>',)
 msgid "%1 RT %2 Copyright 1996-%3 %4."
 msgstr ""
 
-#: lib/RT/ScripAction_Overlay.pm:151
+#: lib/RT/ScripAction_Overlay.pm:139
 #. ($self->Id)
 msgid "%1 ScripAction loaded"
 msgstr "%1 СкриплетНаДействие загружен"
@@ -166,19 +157,19 @@
 msgid "%1 aliases require a TicketId to work on (from %2) %3"
 msgstr "%1 псевдонимы требуют идентификатор заявки для продолжения работы над (от %2) %3"
 
-#: lib/RT/Link_Overlay.pm:145 lib/RT/Link_Overlay.pm:152
+#: lib/RT/Link_Overlay.pm:144 lib/RT/Link_Overlay.pm:151
 #. ($args{'Base'})
 #. ($args{'Target'})
 msgid "%1 appears to be a local object, but can't be found in the database"
 msgstr "%1 является локальным объектом, но не найден в базе данных"
 
-#: html/Ticket/Elements/ShowDates:73 lib/RT/Transaction_Overlay.pm:520
+#: html/Ticket/Elements/ShowDates:73 lib/RT/Transaction_Overlay.pm.orig:518 lib/RT/Transaction_Overlay.pm:518
 #. ($self->BriefDescription , $self->CreatorObj->Name)
 #. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
 msgid "%1 by %2"
 msgstr "%1 пользователем %2"
 
-#: lib/RT/Transaction_Overlay.pm:777 lib/RT/Transaction_Overlay.pm:786 lib/RT/Transaction_Overlay.pm:789
+#: lib/RT/Transaction_Overlay.pm.orig:775 lib/RT/Transaction_Overlay.pm.orig:784 lib/RT/Transaction_Overlay.pm.orig:787 lib/RT/Transaction_Overlay.pm:775 lib/RT/Transaction_Overlay.pm:784 lib/RT/Transaction_Overlay.pm:787
 #. ($self->Field , $q1->Name , $q2->Name)
 #. ($self->Field, $t2->AsString, $t1->AsString)
 #. ($self->Field, ($self->OldValue? "'".$self->OldValue ."'" : $self->loc("(no value)")) , "'". $self->NewValue."'")
@@ -203,12 +194,12 @@
 msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
 msgstr "%1 не может изменить статус на Решено. Возможно, база данных RT испорчена."
 
-#: lib/RT/Transaction_Overlay.pm:560
+#: lib/RT/Transaction_Overlay.pm.orig:558 lib/RT/Transaction_Overlay.pm:558
 #. ($obj_type)
 msgid "%1 created"
 msgstr "%1 создана"
 
-#: lib/RT/Transaction_Overlay.pm:565
+#: lib/RT/Transaction_Overlay.pm.orig:563 lib/RT/Transaction_Overlay.pm:563
 #. ($obj_type)
 msgid "%1 deleted"
 msgstr "%1 удалена"
@@ -235,7 +226,7 @@
 msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
 msgstr ""
 
-#: lib/RT/Queue_Overlay.pm:860
+#: lib/RT/Queue_Overlay.pm:847
 #. ($principal->Object->Name, $args{'Type'})
 msgid "%1 is no longer a %2 for this queue."
 msgstr "%1 больше не является %2 для этой очереди."
@@ -319,7 +310,7 @@
 msgid "%1's saved searches"
 msgstr "%1 сохраненных запросов"
 
-#: lib/RT/Transaction_Overlay.pm:470
+#: lib/RT/Transaction_Overlay.pm.orig:468 lib/RT/Transaction_Overlay.pm:468
 #. ($self)
 msgid "%1: no attachment specified"
 msgstr "%1: без вложений"
@@ -378,8 +369,8 @@
 #: html/Admin/Queues/Modify.html:75 html/Admin/Queues/Modify.html:81
 #. ($RT::CorrespondAddress)
 #. ($RT::CommentAddress)
-msgid "(If left blank, will default to %1)"
-msgstr "(Если пустое, то по-умолчанию равно %1)"
+msgid "(If left blank, will default to %1"
+msgstr "(Если пустое, то по-умолчанию равно %1"
 
 #: NOT FOUND IN SOURCE
 msgid "(No Value)"
@@ -447,7 +438,7 @@
 
 #: html/Admin/Elements/EditScrip:102
 msgid "(Use these fields when you choose 'User Defined' for a condition or action)"
-msgstr "(Используйте эти поля при выборе 'Задано пользователем' для уловий или действий)"
+msgstr "(Используйте эти поля при выборе 'Задано пользователем' для условий или действий)"
 
 #: html/Admin/Groups/index.html:57 html/User/Groups/index.html:54
 msgid "(empty)"
@@ -497,7 +488,7 @@
 msgid "(requestor's group)"
 msgstr "(группа автора заявки)"
 
-#: html/Admin/Users/Modify.html:71
+#: html/Admin/Users/Modify.html.orig:71 html/Admin/Users/Modify.html:71
 msgid "(required)"
 msgstr "(требуется)"
 
@@ -533,10 +524,6 @@
 msgid "<%$_%>"
 msgstr ""
 
-#: html/Search/Elements/DisplayOptions:65
-msgid "<%$field%>"
-msgstr ""
-
 #: html/Elements/CreateTicket:47
 #. ($m->scomp('/Elements/SelectNewTicketQueue'))
 msgid "<input type=\"submit\" class=\"button\" value=\"New ticket in\" />&nbsp;%1"
@@ -551,10 +538,6 @@
 msgid "A blank template"
 msgstr "Пустой шаблон"
 
-#: html/Admin/Users/Modify.html:363
-msgid "A password was not set, so user won't be able to login."
-msgstr ""
-
 #: NOT FOUND IN SOURCE
 msgid "ACE could not be deleted"
 msgstr "Невозможно удалить ACE"
@@ -563,17 +546,17 @@
 msgid "ACE could not be found"
 msgstr "Невозможно найти ACE"
 
-#: lib/RT/ACE_Overlay.pm:175 lib/RT/Principal_Overlay.pm:219
+#: lib/RT/ACE_Overlay.pm:181 lib/RT/Principal_Overlay.pm:224
 msgid "ACE not found"
 msgstr "ACE не найден"
 
-#: lib/RT/ACE_Overlay.pm:854
+#: lib/RT/ACE_Overlay.pm:866
 msgid "ACEs can only be created and deleted."
 msgstr "ACEы можно только создавать и удалять"
 
 #: html/Search/Elements/SelectAndOr:46
 msgid "AND"
-msgstr ""
+msgstr "И"
 
 #: NOT FOUND IN SOURCE
 msgid "Aborting to avoid unintended ticket modifications.\\n"
@@ -583,7 +566,7 @@
 msgid "About me"
 msgstr "Обо мне"
 
-#: html/Admin/Users/Modify.html:106
+#: html/Admin/Users/Modify.html.orig:106 html/Admin/Users/Modify.html:106
 msgid "Access control"
 msgstr "Права доступа"
 
@@ -591,7 +574,7 @@
 msgid "Action"
 msgstr "Действие"
 
-#: lib/RT/Scrip_Overlay.pm:173
+#: lib/RT/Scrip_Overlay.pm:172
 #. ($args{'ScripAction'})
 msgid "Action %1 not found"
 msgstr "Действие %1 не найдено"
@@ -608,7 +591,7 @@
 msgid "Action prepared..."
 msgstr "Действие подготовлено..."
 
-#: html/Search/Build.html:85
+#: html/Search/Build.html:65
 msgid "Add"
 msgstr "Добавить"
 
@@ -622,7 +605,7 @@
 
 #: html/Search/Elements/EditFormat:49
 msgid "Add Columns"
-msgstr ""
+msgstr "Добавить колонки"
 
 #: html/Search/Elements/PickCriteria:46
 msgid "Add Criteria"
@@ -701,7 +684,7 @@
 msgid "AddNextState"
 msgstr "ДобавлятьСледующееСостояние"
 
-#: lib/RT/Queue_Overlay.pm:760
+#: lib/RT/Queue_Overlay.pm:747
 #. ($args{'Type'})
 msgid "Added principal as a %1 for this queue"
 msgstr "Пользователь добавлен как %1 для этой очереди"
@@ -711,11 +694,11 @@
 msgid "Added principal as a %1 for this ticket"
 msgstr "Пользователь добавлен как %1 для этой заявки"
 
-#: html/Admin/Users/Modify.html:146 html/User/Prefs.html:133
+#: html/Admin/Users/Modify.html.orig:146 html/Admin/Users/Modify.html:146 html/User/Prefs.html:133
 msgid "Address1"
 msgstr "Адрес1"
 
-#: html/Admin/Users/Modify.html:151 html/User/Prefs.html:137
+#: html/Admin/Users/Modify.html.orig:151 html/Admin/Users/Modify.html:151 html/User/Prefs.html:137
 msgid "Address2"
 msgstr "Адрес2"
 
@@ -755,7 +738,7 @@
 msgid "AdminAllPersonalGroups"
 msgstr "АдминистрироватьВсеПерсональныеГруппы"
 
-#: etc/initialdata:56 html/Ticket/Elements/ShowPeople:60 lib/RT/ACE_Overlay.pm:114
+#: etc/initialdata:56 html/Ticket/Elements/ShowPeople:60 lib/RT/ACE_Overlay.pm:113
 msgid "AdminCc"
 msgstr "АдминистративнаяКопия"
 
@@ -783,15 +766,15 @@
 msgid "AdminGroupMembership"
 msgstr "АдминистрироватьЧленствоВГруппах"
 
-#: lib/RT/System.pm:81
+#: lib/RT/System.pm:80
 msgid "AdminOwnPersonalGroups"
 msgstr "АдминистрироватьСобственныеГруппы"
 
-#: lib/RT/Queue_Overlay.pm:93
+#: lib/RT/Queue_Overlay.pm:92
 msgid "AdminQueue"
 msgstr "АдминистрироватьОчередь"
 
-#: lib/RT/System.pm:82
+#: lib/RT/System.pm:81
 msgid "AdminUsers"
 msgstr "АдминистрироватьПользователей"
 
@@ -853,7 +836,7 @@
 
 #: html/Search/Elements/EditQuery:56
 msgid "And/Or"
-msgstr ""
+msgstr "И/Или"
 
 #: html/Admin/CustomFields/Modify.html:73 html/Admin/Elements/CustomFieldTabs:83
 msgid "Applies to"
@@ -912,7 +895,7 @@
 msgid "Approver's notes: %1"
 msgstr "Примечания подтвердившего: %1"
 
-#: lib/RT/Date.pm:440
+#: lib/RT/Date.pm:437
 msgid "Apr."
 msgstr "Апр."
 
@@ -924,11 +907,11 @@
 msgid "Ascending"
 msgstr "В порядке возрастания"
 
-#: lib/RT/Queue_Overlay.pm:97
+#: lib/RT/Queue_Overlay.pm:96
 msgid "Assign and remove custom fields"
 msgstr "Назначение и удаление дополнительных полей"
 
-#: lib/RT/Queue_Overlay.pm:97
+#: lib/RT/Queue_Overlay.pm:96
 msgid "AssignCustomFields"
 msgstr "НазначатьДополнительныеПоля"
 
@@ -949,7 +932,7 @@
 msgid "Attachment '%1' could not be loaded"
 msgstr "Вложение '%1' не может быть загружено"
 
-#: lib/RT/Transaction_Overlay.pm:478
+#: lib/RT/Transaction_Overlay.pm.orig:476 lib/RT/Transaction_Overlay.pm:476
 msgid "Attachment created"
 msgstr "Вложение создано"
 
@@ -961,11 +944,11 @@
 msgid "Attachments"
 msgstr "Вложения"
 
-#: lib/RT/Attributes_Overlay.pm:172
+#: lib/RT/Attributes_Overlay.pm:170
 msgid "Attribute Deleted"
 msgstr "Атрибут удален"
 
-#: lib/RT/Date.pm:444
+#: lib/RT/Date.pm:441
 msgid "Aug."
 msgstr "Авг."
 
@@ -1025,7 +1008,7 @@
 msgid "Be sure to save your changes"
 msgstr "Не забудьте сохранить настройки"
 
-#: html/Elements/SelectDateRelation:55 lib/RT/CurrentUser.pm:360
+#: html/Elements/SelectDateRelation:55 lib/RT/CurrentUser.pm:358
 msgid "Before"
 msgstr "До"
 
@@ -1047,7 +1030,7 @@
 
 #: html/Search/Elements/EditFormat:84
 msgid "Bold"
-msgstr ""
+msgstr "Жирный"
 
 #: NOT FOUND IN SOURCE
 msgid "Bookmarkable URL for this search"
@@ -1073,7 +1056,7 @@
 msgid "Can not modify system users"
 msgstr "Невомзожно изменить системных пользователей"
 
-#: lib/RT/Queue_Overlay.pm:92
+#: lib/RT/Queue_Overlay.pm:91
 msgid "Can this principal see this queue"
 msgstr "Может ли данный пользователь просматривать эту очередь"
 
@@ -1084,13 +1067,13 @@
 #: html/Admin/CustomFields/Objects.html:86
 #. ($Class)
 msgid "Can't find a collection class for '%1'"
-msgstr "Невозможно найти сохраненный запрос для работы с ним"
+msgstr "Невозможно найти класс коллекции для '%1'"
 
 #: html/Search/Build.html:742
 msgid "Can't find a saved search to work with"
 msgstr "Невозможно найти сохраненный запрос для работы с ним"
 
-#: lib/RT/Link_Overlay.pm:160
+#: lib/RT/Link_Overlay.pm:159
 msgid "Can't link a ticket to itself"
 msgstr "Невозможно связать заявку саму с собой"
 
@@ -1203,11 +1186,11 @@
 msgid "Comment not recorded"
 msgstr "Комментарий не записан"
 
-#: lib/RT/Queue_Overlay.pm:112
+#: lib/RT/Queue_Overlay.pm:111
 msgid "Comment on tickets"
 msgstr "Комментарии заявки"
 
-#: lib/RT/Queue_Overlay.pm:112
+#: lib/RT/Queue_Overlay.pm:111
 msgid "CommentOnTicket"
 msgstr "КомментироватьЗаявку"
 
@@ -1231,11 +1214,11 @@
 msgid "Comments about this user"
 msgstr "Комментарии об этом пользователе"
 
-#: lib/RT/Transaction_Overlay.pm:623
+#: lib/RT/Transaction_Overlay.pm.orig:621 lib/RT/Transaction_Overlay.pm:621
 msgid "Comments added"
 msgstr "Комментарии добавлены"
 
-#: lib/RT/Action/Generic.pm:176
+#: lib/RT/Action/Generic.pm:168
 msgid "Commit Stubbed"
 msgstr ""
 
@@ -1251,7 +1234,7 @@
 msgid "Condition matches..."
 msgstr "Подходящее условие..."
 
-#: lib/RT/Scrip_Overlay.pm:189
+#: lib/RT/Scrip_Overlay.pm:188
 msgid "Condition not found"
 msgstr "Условие не найдено"
 
@@ -1295,7 +1278,7 @@
 msgid "Correspondence Address"
 msgstr "Адрес для корреспонденции"
 
-#: lib/RT/Transaction_Overlay.pm:619
+#: lib/RT/Transaction_Overlay.pm.orig:617 lib/RT/Transaction_Overlay.pm:617
 msgid "Correspondence added"
 msgstr "Корреспонденция добавлена"
 
@@ -1313,7 +1296,7 @@
 
 #: lib/RT/Record.pm:1697
 msgid "Could not add new custom field value. "
-msgstr ""
+msgstr "Ошибка добавления нового значения дополнительного поля"
 
 #: lib/RT/Record.pm:1650
 #. (, $value_msg)
@@ -1332,9 +1315,9 @@
 #: html/Admin/Elements/EditCustomField:113
 #. ($msg)
 msgid "Could not create CustomField: %1"
-msgstr ""
+msgstr "Ошибка создания дополнительного поля: %1"
 
-#: html/User/Groups/Modify.html:98 lib/RT/Group_Overlay.pm:502 lib/RT/Group_Overlay.pm:509
+#: html/User/Groups/Modify.html:98 lib/RT/Group_Overlay.pm:501 lib/RT/Group_Overlay.pm:508
 msgid "Could not create group"
 msgstr "Невозможно создать группу"
 
@@ -1347,7 +1330,7 @@
 msgid "Could not create ticket. Queue not set"
 msgstr "Невозможно создать заявку. Не задана очередь."
 
-#: lib/RT/User_Overlay.pm:256 lib/RT/User_Overlay.pm:270 lib/RT/User_Overlay.pm:279 lib/RT/User_Overlay.pm:288 lib/RT/User_Overlay.pm:297 lib/RT/User_Overlay.pm:311 lib/RT/User_Overlay.pm:321 lib/RT/User_Overlay.pm:497
+#: lib/RT/User_Overlay.pm:255 lib/RT/User_Overlay.pm:269 lib/RT/User_Overlay.pm:278 lib/RT/User_Overlay.pm:287 lib/RT/User_Overlay.pm:296 lib/RT/User_Overlay.pm:310 lib/RT/User_Overlay.pm:320 lib/RT/User_Overlay.pm:496
 msgid "Could not create user"
 msgstr "Невозможно создать пользователя"
 
@@ -1383,16 +1366,16 @@
 msgid "Could not load group"
 msgstr "Невозможно загрузить группу"
 
-#: lib/RT/SavedSearch.pm:120
+#: lib/RT/SavedSearch.pm:119
 #. ($privacy)
 msgid "Could not load object for %1"
-msgstr ""
+msgstr "Ошибка загрузки объекта для %1"
 
-#: lib/RT/SavedSearch.pm:188
+#: lib/RT/SavedSearch.pm:187
 msgid "Could not load search attribute"
-msgstr ""
+msgstr "Ошибка загрузки атрибута запроса"
 
-#: lib/RT/Queue_Overlay.pm:758
+#: lib/RT/Queue_Overlay.pm:745
 #. ($args{'Type'})
 msgid "Could not make that principal a %1 for this queue"
 msgstr "Невозможно назначить этого пользователя %1 для этой очереди"
@@ -1402,7 +1385,7 @@
 msgid "Could not make that principal a %1 for this ticket"
 msgstr "Невозможно назначить этого пользователя %1 для этой заявки"
 
-#: lib/RT/Queue_Overlay.pm:857
+#: lib/RT/Queue_Overlay.pm:844
 #. ($args{'Type'})
 msgid "Could not remove that principal as a %1 for this queue"
 msgstr "Невозможно отозвать функции у пользователя как %1 для этой очереди"
@@ -1411,11 +1394,11 @@
 msgid "Could not remove that principal as a %1 for this ticket"
 msgstr "Невозможно отозвать функции у пользователя как %1 для этой заявки"
 
-#: lib/RT/User_Overlay.pm:192
+#: lib/RT/User_Overlay.pm:191
 msgid "Could not set user info"
 msgstr "Невозможно установить информацию о пользователе"
 
-#: lib/RT/Group_Overlay.pm:1011
+#: lib/RT/Group_Overlay.pm:1009
 msgid "Couldn't add member to group"
 msgstr "Невозможно добавить пользователя в группу"
 
@@ -1436,7 +1419,7 @@
 msgid "Couldn't find row"
 msgstr "Невозможно найти строку"
 
-#: lib/RT/Group_Overlay.pm:985
+#: lib/RT/Group_Overlay.pm:983
 msgid "Couldn't find that principal"
 msgstr "Невозможно найти этого пользователя"
 
@@ -1452,7 +1435,7 @@
 msgid "Couldn't find user\\n"
 msgstr "Невозможно найти пользователя\\n"
 
-#: lib/RT/CurrentUser.pm:146
+#: lib/RT/CurrentUser.pm:145
 #. ($self->Id)
 msgid "Couldn't load %1 from the users database.\\n"
 msgstr "Невозможно загрузить %1 из базы пользователей.\\n"
@@ -1460,7 +1443,7 @@
 #: html/Admin/CustomFields/UserRights.html:149
 #. ($id)
 msgid "Couldn't load Class %1"
-msgstr ""
+msgstr "Ошибка загрузки класса %1"
 
 #: html/Admin/CustomFields/GroupRights.html:107
 #. ($id)
@@ -1480,7 +1463,7 @@
 msgid "Couldn't load group %1"
 msgstr "Невозможно загрузить группу %1"
 
-#: lib/RT/Link_Overlay.pm:203 lib/RT/Link_Overlay.pm:212 lib/RT/Link_Overlay.pm:239
+#: lib/RT/Link_Overlay.pm:202 lib/RT/Link_Overlay.pm:211 lib/RT/Link_Overlay.pm:238
 msgid "Couldn't load link"
 msgstr "Невозможно загрузить ссылку"
 
@@ -1511,7 +1494,7 @@
 msgid "Couldn't load that user (%1)"
 msgstr "Невозможно загрузить этого пользователя (%1)"
 
-#: html/SelfService/Display.html:156
+#: html/SelfService/Display.html:149
 #. ($id)
 msgid "Couldn't load ticket '%1'"
 msgstr "Невозможно загрузить заявку '%1'"
@@ -1563,7 +1546,7 @@
 msgid "Create a new global scrip"
 msgstr "Создать новый глобальный скриплет"
 
-#: html/Admin/Groups/Modify.html:125 html/Admin/Groups/Modify.html:99
+#: html/Admin/Groups/Modify.html:124 html/Admin/Groups/Modify.html:98
 msgid "Create a new group"
 msgstr "Создать новую группу"
 
@@ -1587,7 +1570,7 @@
 msgid "Create a new ticket"
 msgstr "Создать новую заявку"
 
-#: html/Admin/Users/Modify.html:251 html/Admin/Users/Modify.html:306
+#: html/Admin/Users/Modify.html.orig:251 html/Admin/Users/Modify.html.orig:308 html/Admin/Users/Modify.html:251 html/Admin/Users/Modify.html:306
 msgid "Create a new user"
 msgstr "Создать нового пользователя"
 
@@ -1632,7 +1615,7 @@
 msgid "Create ticket"
 msgstr "Создать заявку"
 
-#: lib/RT/Queue_Overlay.pm:110
+#: lib/RT/Queue_Overlay.pm:109
 msgid "Create tickets in this queue"
 msgstr "Создать заявки в этой очереди"
 
@@ -1640,7 +1623,7 @@
 msgid "Create, delete and modify custom fields"
 msgstr "Создать, удалить или изменить дополнительные поля"
 
-#: lib/RT/Queue_Overlay.pm:93
+#: lib/RT/Queue_Overlay.pm:92
 msgid "Create, delete and modify queues"
 msgstr "Создать, удалить или изменить очереди"
 
@@ -1648,19 +1631,19 @@
 msgid "Create, delete and modify the members of any user's personal groups"
 msgstr "Создать, удалить или изменить членов любой пользовательской персональной группы"
 
-#: lib/RT/System.pm:81
+#: lib/RT/System.pm:80
 msgid "Create, delete and modify the members of personal groups"
 msgstr "Создать, удалить или изменить членов персональных групп"
 
-#: lib/RT/System.pm:82
+#: lib/RT/System.pm:81
 msgid "Create, delete and modify users"
 msgstr "Создать, удалить или изменить пользователей"
 
-#: lib/RT/System.pm:88
+#: lib/RT/System.pm:87
 msgid "CreateSavedSearch"
-msgstr ""
+msgstr "СоздаватьСохраненныйЗапрос"
 
-#: lib/RT/Queue_Overlay.pm:110
+#: lib/RT/Queue_Overlay.pm:109
 msgid "CreateTicket"
 msgstr "Создать Заявку"
 
@@ -1781,7 +1764,7 @@
 msgid "Custom field deleted"
 msgstr "Дополнительное поле удалено"
 
-#: NOT FOUND IN SOURCE
+#: lib/RT/CustomField_Overlay.pm:289 lib/RT/Record.pm:1749
 msgid "Custom field not found"
 msgstr "Невозможно найти дополнительное поле"
 
@@ -1806,7 +1789,7 @@
 msgid "Custom field value deleted"
 msgstr "Значение дополнительного поля удалено"
 
-#: html/Elements/SelectGroups:51 html/Elements/SelectUsers:51 lib/RT/Transaction_Overlay.pm:627
+#: html/Elements/SelectGroups:51 html/Elements/SelectUsers:51 lib/RT/Transaction_Overlay.pm.orig:625 lib/RT/Transaction_Overlay.pm:625
 msgid "CustomField"
 msgstr "ДополнительноеПоле"
 
@@ -1822,7 +1805,7 @@
 msgid "Dates"
 msgstr "Даты"
 
-#: lib/RT/Date.pm:448
+#: lib/RT/Date.pm:445
 msgid "Dec."
 msgstr "Дек."
 
@@ -1870,11 +1853,11 @@
 msgid "Delegate rights"
 msgstr "Делегирование прав"
 
-#: lib/RT/System.pm:85
+#: lib/RT/System.pm:84
 msgid "Delegate specific rights which have been granted to you."
 msgstr "Делегирование отдельных прав, которые выданы вам."
 
-#: lib/RT/System.pm:85
+#: lib/RT/System.pm:84
 msgid "DelegateRights"
 msgstr "ДелегироватьПрава"
 
@@ -1890,16 +1873,16 @@
 msgid "Delete Template"
 msgstr "Удалить шаблон"
 
-#: lib/RT/SavedSearch.pm:211
+#: lib/RT/SavedSearch.pm:210
 #. ($msg)
 msgid "Delete failed: %1"
-msgstr ""
+msgstr "Ошибка удаления: %1"
 
 #: html/Admin/Elements/EditScrips:74
 msgid "Delete selected scrips"
 msgstr "Удалить выбранные скриплеты"
 
-#: lib/RT/Queue_Overlay.pm:115
+#: lib/RT/Queue_Overlay.pm:114
 msgid "Delete tickets"
 msgstr "Удалить заявки"
 
@@ -1911,19 +1894,19 @@
 msgid "DeleteTicket"
 msgstr "УдалятьЗаявку"
 
-#: lib/RT/SavedSearch.pm:209
+#: lib/RT/SavedSearch.pm:208
 msgid "Deleted search"
-msgstr ""
+msgstr "Удаленный запрос"
 
 #: NOT FOUND IN SOURCE
 msgid "Deleting this object could break referential integrity"
 msgstr "Удаление этого объекта может нарушить ссылочную целостность"
 
-#: lib/RT/Queue_Overlay.pm:391
+#: lib/RT/Queue_Overlay.pm:378
 msgid "Deleting this object would break referential integrity"
 msgstr "Удаление этого объекта нарушит ссылочную целостность"
 
-#: lib/RT/User_Overlay.pm:513
+#: lib/RT/User_Overlay.pm:512
 msgid "Deleting this object would violate referential integrity"
 msgstr "Удаление этого объекта нарушит ссылочную целостность"
 
@@ -1947,22 +1930,22 @@
 msgid "Dependencies: \\n"
 msgstr "Зависимости: \\n"
 
-#: lib/RT/Transaction_Overlay.pm:707
+#: lib/RT/Transaction_Overlay.pm.orig:705 lib/RT/Transaction_Overlay.pm:705
 #. ($value)
 msgid "Dependency by %1 added"
 msgstr "Добавлено требование заявкой %1"
 
-#: lib/RT/Transaction_Overlay.pm:747
+#: lib/RT/Transaction_Overlay.pm.orig:745 lib/RT/Transaction_Overlay.pm:745
 #. ($value)
 msgid "Dependency by %1 deleted"
 msgstr "Удалено требование заявкой %1"
 
-#: lib/RT/Transaction_Overlay.pm:704
+#: lib/RT/Transaction_Overlay.pm.orig:702 lib/RT/Transaction_Overlay.pm:702
 #. ($value)
 msgid "Dependency on %1 added"
 msgstr "Добавлена зависимость от %1"
 
-#: lib/RT/Transaction_Overlay.pm:744
+#: lib/RT/Transaction_Overlay.pm.orig:742 lib/RT/Transaction_Overlay.pm:742
 #. ($value)
 msgid "Dependency on %1 deleted"
 msgstr "Удалена зависимость от %1"
@@ -1995,7 +1978,7 @@
 msgid "Display"
 msgstr "Показать"
 
-#: lib/RT/Queue_Overlay.pm:94
+#: lib/RT/Queue_Overlay.pm:93
 msgid "Display Access Control List"
 msgstr "Показать список прав доступа"
 
@@ -2003,11 +1986,11 @@
 msgid "Display Columns"
 msgstr "Показать колонки"
 
-#: lib/RT/Queue_Overlay.pm:100
+#: lib/RT/Queue_Overlay.pm:99
 msgid "Display Scrip templates for this queue"
 msgstr "Показать шаблоны скриплетов для этой очереди"
 
-#: lib/RT/Queue_Overlay.pm:103
+#: lib/RT/Queue_Overlay.pm:102
 msgid "Display Scrips for this queue"
 msgstr "Показать скриплеты для этой очереди"
 
@@ -2027,7 +2010,7 @@
 msgid "Distributed under version 2 <a href=\"http://www.gnu.org/copyleft/gpl.html\"> of the GNU GPL.</a>"
 msgstr "Распространяется по версии 2 <a href=\"http://www.gnu.org/copyleft/gpl.html\"> GNU GPL.</a>"
 
-#: lib/RT/System.pm:76
+#: lib/RT/System.pm:75
 msgid "Do anything and everything"
 msgstr "Делать все и везде"
 
@@ -2082,15 +2065,15 @@
 
 #: html/Admin/Global/CustomFields/Groups.html:9
 msgid "Edit Custom Fields for all groups"
-msgstr ""
+msgstr "Редактирование дополнительных полей всех групп"
 
 #: html/Admin/Global/CustomFields/Users.html:9
 msgid "Edit Custom Fields for all users"
-msgstr ""
+msgstr "Редактирование дополнительных полей всех пользователей"
 
 #: html/Admin/Global/CustomFields/Queue-Tickets.html:9 html/Admin/Global/CustomFields/Queue-Transactions.html:9
 msgid "Edit Custom Fields for tickets in all queues"
-msgstr ""
+msgstr "Редактирование дополнительных полей заявок во всех очередях"
 
 #: html/Search/Bulk.html:189 html/Ticket/ModifyLinks.html:57
 msgid "Edit Links"
@@ -2169,11 +2152,11 @@
 msgid "Either base or target must be specified"
 msgstr "Нужно указать либо источник, либо адрес назначения"
 
-#: html/Admin/Users/Modify.html:74 html/Ticket/Elements/AddWatchers:77 html/User/Prefs.html:65
+#: html/Admin/Users/Modify.html.orig:74 html/Admin/Users/Modify.html:74 html/Ticket/Elements/AddWatchers:77 html/User/Prefs.html:65
 msgid "Email"
 msgstr "Email"
 
-#: lib/RT/User_Overlay.pm:236
+#: lib/RT/User_Overlay.pm:235
 msgid "Email address in use"
 msgstr "Email адрес уже занят"
 
@@ -2205,7 +2188,7 @@
 msgid "Enabled Queues"
 msgstr "Используемые очереди"
 
-#: html/Admin/Elements/EditCustomField:136 html/Admin/Groups/Modify.html:150 html/Admin/Users/Modify.html:342 html/User/Groups/Modify.html:138
+#: html/Admin/Elements/EditCustomField:136 html/Admin/Groups/Modify.html:149 html/Admin/Users/Modify.html.orig:349 html/Admin/Users/Modify.html:347 html/User/Groups/Modify.html:138
 #. (loc_fuzzy($msg))
 msgid "Enabled status %1"
 msgstr "Активирован статус %1"
@@ -2251,7 +2234,7 @@
 msgid "Error adding watcher"
 msgstr "Ошибка добавления наблюдателя"
 
-#: lib/RT/Queue_Overlay.pm:669
+#: lib/RT/Queue_Overlay.pm:656
 msgid "Error in parameters to Queue->AddWatcher"
 msgstr "Ошибка в параметрах Queue->AddWatcher"
 
@@ -2259,7 +2242,7 @@
 msgid "Error in parameters to Queue->DelWatcher"
 msgstr "Ошибка в параметрах Queue->DelWatcher"
 
-#: lib/RT/Queue_Overlay.pm:830
+#: lib/RT/Queue_Overlay.pm:817
 msgid "Error in parameters to Queue->DeleteWatcher"
 msgstr "Ошибка в параметрах Queue->DeleteWatcher"
 
@@ -2303,19 +2286,19 @@
 msgid "ExternalContactInfoId"
 msgstr "ExternalContactInfoId"
 
-#: html/Admin/Users/Modify.html:99
+#: html/Admin/Users/Modify.html.orig:99 html/Admin/Users/Modify.html:99
 msgid "Extra info"
 msgstr "Дополнительная информация"
 
-#: lib/RT/SavedSearch.pm:165
+#: lib/RT/SavedSearch.pm:164
 msgid "Failed to create search attribute"
-msgstr ""
+msgstr "Ошибка создания атрибута запроса"
 
-#: lib/RT/User_Overlay.pm:377
+#: lib/RT/User_Overlay.pm:376
 msgid "Failed to find 'Privileged' users pseudogroup."
 msgstr "Невозможно найти псевдо-группу 'Привилегированные'"
 
-#: lib/RT/User_Overlay.pm:384
+#: lib/RT/User_Overlay.pm:383
 msgid "Failed to find 'Unprivileged' users pseudogroup"
 msgstr "Невозможно найти псевдо-группу 'Непривилегированные'"
 
@@ -2324,12 +2307,12 @@
 msgid "Failed to load module %1. (%2)"
 msgstr "Ошибка загрузки модуля %1. (%2)"
 
-#: lib/RT/SavedSearch.pm:168
+#: lib/RT/SavedSearch.pm:167
 #. ($privacy)
 msgid "Failed to load object for %1"
-msgstr ""
+msgstr "Ошибка загрузки объекта для %1"
 
-#: lib/RT/Date.pm:438
+#: lib/RT/Date.pm:435
 msgid "Feb."
 msgstr "Фев."
 
@@ -2347,7 +2330,7 @@
 
 #: lib/RT/CustomField_Overlay.pm:74
 msgid "Fill in multiple wikitext areas"
-msgstr ""
+msgstr "Заполнить несколько полей wikitext"
 
 #: lib/RT/CustomField_Overlay.pm:70
 msgid "Fill in one text area"
@@ -2355,7 +2338,7 @@
 
 #: lib/RT/CustomField_Overlay.pm:75
 msgid "Fill in one wikitext area"
-msgstr ""
+msgstr "Заполнить одно поле wikitext"
 
 #: lib/RT/CustomField_Overlay.pm:71
 msgid "Fill in up to %1 text areas"
@@ -2363,7 +2346,7 @@
 
 #: lib/RT/CustomField_Overlay.pm:76
 msgid "Fill in up to %1 wikitext areas"
-msgstr ""
+msgstr "Заполнить до %1 полей wikitext"
 
 #: NOT FOUND IN SOURCE
 msgid "Fin"
@@ -2423,7 +2406,7 @@
 
 #: html/Search/Elements/EditFormat:52
 msgid "Format"
-msgstr ""
+msgstr "Форматировать"
 
 #: html/Search/Results.html:142
 #. ($ticketcount)
@@ -2438,7 +2421,7 @@
 msgid "FreeformContactInfo"
 msgstr "FreeformContactInfo"
 
-#: lib/RT/Date.pm:417
+#: lib/RT/Date.pm:415
 msgid "Fri."
 msgstr "Птн."
 
@@ -2454,7 +2437,7 @@
 msgid "Getting the current user from a pgp sig\\n"
 msgstr "Берем текущего пользователя из pgp подписи\\n"
 
-#: lib/RT/Transaction_Overlay.pm:673
+#: lib/RT/Transaction_Overlay.pm.orig:671 lib/RT/Transaction_Overlay.pm:671
 #. ($New->Name)
 msgid "Given to %1"
 msgstr "Назначено %1"
@@ -2473,7 +2456,7 @@
 
 #: html/Admin/Global/CustomFields/index.html:59
 msgid "Global custom field configuration"
-msgstr "Общие скриплеты"
+msgstr "Конфигурирование общих дополнительных полей"
 
 #: html/Admin/Elements/SelectTemplate:59
 #. (loc($Template->Name))
@@ -2512,7 +2495,7 @@
 msgid "Group Rights"
 msgstr "Права группы"
 
-#: lib/RT/Group_Overlay.pm:991
+#: lib/RT/Group_Overlay.pm:989
 msgid "Group already has member"
 msgstr "Пользователь уже входит в группу"
 
@@ -2520,16 +2503,16 @@
 msgid "Group could not be created."
 msgstr "Невозможно создать группу."
 
-#: html/Admin/Groups/Modify.html:109
+#: html/Admin/Groups/Modify.html:108
 #. ($create_msg)
 msgid "Group could not be created: %1"
 msgstr "Невозможно создать группу: %1"
 
-#: lib/RT/Group_Overlay.pm:529
+#: lib/RT/Group_Overlay.pm:528
 msgid "Group created"
 msgstr "Группа создана"
 
-#: lib/RT/Group_Overlay.pm:1163
+#: lib/RT/Group_Overlay.pm:1161
 msgid "Group has no such member"
 msgstr "В группе нет такого пользователя"
 
@@ -2549,7 +2532,7 @@
 msgid "Groups"
 msgstr "Группы"
 
-#: lib/RT/Group_Overlay.pm:997
+#: lib/RT/Group_Overlay.pm:995
 msgid "Groups can't be members of their members"
 msgstr "Группы не могут быть членами входящих в них пользователей"
 
@@ -2613,7 +2596,7 @@
 msgid "Id"
 msgstr "Заявка"
 
-#: html/Admin/Users/Modify.html:65 html/User/Prefs.html:60
+#: html/Admin/Users/Modify.html.orig:65 html/Admin/Users/Modify.html:65 html/User/Prefs.html:60
 msgid "Identity"
 msgstr "Личность"
 
@@ -2667,11 +2650,11 @@
 
 #: html/Search/Build.html:641
 msgid "Incomplete Query"
-msgstr ""
+msgstr "Незавершенный запрос"
 
 #: html/Search/Build.html:638
 msgid "Incomplete query"
-msgstr ""
+msgstr "Незавершенный запрос"
 
 #: html/Search/Elements/PickBasics:148 lib/RT/Tickets_Overlay.pm:1591
 msgid "Initial Priority"
@@ -2681,7 +2664,7 @@
 msgid "InitialPriority"
 msgstr "Начальный приоритет"
 
-#: lib/RT/ScripAction_Overlay.pm:134
+#: lib/RT/ScripAction_Overlay.pm:122
 msgid "Input error"
 msgstr "Ошибка ввода"
 
@@ -2700,11 +2683,11 @@
 msgid "Internal Error: %1"
 msgstr "Внутренняя ошибка: %1"
 
-#: lib/RT/Group_Overlay.pm:676
+#: lib/RT/Group_Overlay.pm:675
 msgid "Invalid Group Type"
 msgstr "Недопустимый тип группы"
 
-#: lib/RT/Principal_Overlay.pm:161
+#: lib/RT/Principal_Overlay.pm:166
 msgid "Invalid Right"
 msgstr "Недопустимое право"
 
@@ -2729,7 +2712,7 @@
 msgid "Invalid queue"
 msgstr "Недопустимая очередь"
 
-#: lib/RT/ACE_Overlay.pm:265 lib/RT/ACE_Overlay.pm:274 lib/RT/ACE_Overlay.pm:280 lib/RT/ACE_Overlay.pm:291
+#: lib/RT/ACE_Overlay.pm:274 lib/RT/ACE_Overlay.pm:283 lib/RT/ACE_Overlay.pm:289 lib/RT/ACE_Overlay.pm:300 lib/RT/ACE_Overlay.pm:305
 msgid "Invalid right"
 msgstr "Недопустимое право"
 
@@ -2760,13 +2743,13 @@
 
 #: html/Search/Elements/EditFormat:85
 msgid "Italic"
-msgstr ""
+msgstr "Наклонный"
 
 #: NOT FOUND IN SOURCE
 msgid "Items pending my approval"
 msgstr "Заявки, ожидающие вашего подтверждения"
 
-#: lib/RT/Date.pm:437
+#: lib/RT/Date.pm:434
 msgid "Jan."
 msgstr "Янв."
 
@@ -2778,7 +2761,7 @@
 msgid "Join or leave this group"
 msgstr "Присоединиться или покинуть эту группу"
 
-#: lib/RT/Date.pm:443
+#: lib/RT/Date.pm:440
 msgid "Jul."
 msgstr "Июл."
 
@@ -2790,7 +2773,7 @@
 msgid "Jumbo"
 msgstr "Все данные"
 
-#: lib/RT/Date.pm:442
+#: lib/RT/Date.pm:439
 msgid "Jun."
 msgstr "Июн."
 
@@ -2806,13 +2789,13 @@
 msgid "Lang"
 msgstr "Язык"
 
-#: html/Admin/Users/Modify.html:94 html/User/Prefs.html:76
+#: html/Admin/Users/Modify.html.orig:94 html/Admin/Users/Modify.html:94 html/User/Prefs.html:76
 msgid "Language"
 msgstr "Язык"
 
 #: html/Search/Elements/EditFormat:79
 msgid "Large"
-msgstr ""
+msgstr "Большой"
 
 #: html/Ticket/Elements/Tabs:96
 msgid "Last"
@@ -2850,11 +2833,11 @@
 msgid "Left"
 msgstr "Осталось"
 
-#: html/Admin/Users/Modify.html:109
+#: html/Admin/Users/Modify.html.orig:109 html/Admin/Users/Modify.html:109
 msgid "Let this user access RT"
 msgstr "Разрешить доступ к RT"
 
-#: html/Admin/Users/Modify.html:113
+#: html/Admin/Users/Modify.html.orig:113 html/Admin/Users/Modify.html:113
 msgid "Let this user be granted rights"
 msgstr "Предоставить пользователю права"
 
@@ -2868,7 +2851,7 @@
 
 #: html/Search/Elements/EditFormat:68
 msgid "Link"
-msgstr ""
+msgstr "Ссылка"
 
 #: lib/RT/Record.pm:1296
 msgid "Link already exists"
@@ -2913,24 +2896,24 @@
 msgid "Load saved search:"
 msgstr "Загрузить сохраненный запрос:"
 
-#: lib/RT/System.pm:87
+#: lib/RT/System.pm:86
 msgid "LoadSavedSearch"
-msgstr ""
+msgstr "ЗагружатьСохраненныеЗапросы"
 
 #: html/Admin/Tools/Configuration.html:64
 msgid "Loaded perl modules"
 msgstr "Загруженные модули perl"
 
-#: lib/RT/SavedSearch.pm:112
+#: lib/RT/SavedSearch.pm:111
 #. ($self->Name)
 msgid "Loaded search %1"
-msgstr ""
+msgstr "Загружен запрос %1"
 
-#: html/Admin/Users/Modify.html:138 html/User/Prefs.html:126
+#: html/Admin/Users/Modify.html.orig:138 html/Admin/Users/Modify.html:138 html/User/Prefs.html:126
 msgid "Location"
 msgstr "Местонахождение"
 
-#: lib/RT.pm:212
+#: lib/RT.pm:204
 #. ($RT::LogDir)
 msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
 msgstr "Не найден каталог для протоколирования %1 или не доступен на запись.\\n RT не может продолжить работу."
@@ -2994,7 +2977,7 @@
 
 #: lib/RT/Group_Overlay.pm:177
 msgid "Make this group visible to user"
-msgstr ""
+msgstr "Сделать эту группу видимой для пользователя"
 
 #: html/Admin/index.html:78
 msgid "Manage custom fields and custom field values"
@@ -3016,7 +2999,7 @@
 msgid "Manage users and passwords"
 msgstr "Управление пользователями и паролями"
 
-#: lib/RT/Date.pm:439
+#: lib/RT/Date.pm:436
 msgid "Mar."
 msgstr "Мар."
 
@@ -3028,29 +3011,29 @@
 msgid "May"
 msgstr "Май"
 
-#: lib/RT/Date.pm:441
+#: lib/RT/Date.pm:438
 msgid "May."
 msgstr "Май"
 
-#: lib/RT/Transaction_Overlay.pm:720
+#: lib/RT/Transaction_Overlay.pm.orig:718 lib/RT/Transaction_Overlay.pm:718
 #. ($value)
 msgid "Member %1 added"
 msgstr "Участник %1 добавлен"
 
-#: lib/RT/Transaction_Overlay.pm:760
+#: lib/RT/Transaction_Overlay.pm.orig:758 lib/RT/Transaction_Overlay.pm:758
 #. ($value)
 msgid "Member %1 deleted"
 msgstr "Участник %1 удален"
 
-#: lib/RT/Group_Overlay.pm:1008
+#: lib/RT/Group_Overlay.pm:1006
 msgid "Member added"
 msgstr "Пользователь добавлен в группу"
 
-#: lib/RT/Group_Overlay.pm:1170
+#: lib/RT/Group_Overlay.pm:1168
 msgid "Member deleted"
 msgstr "Пользователь удален из группы"
 
-#: lib/RT/Group_Overlay.pm:1174
+#: lib/RT/Group_Overlay.pm:1172
 msgid "Member not deleted"
 msgstr "Пользователь не удален из группы"
 
@@ -3066,12 +3049,12 @@
 msgid "Members"
 msgstr "Участники"
 
-#: lib/RT/Transaction_Overlay.pm:717
+#: lib/RT/Transaction_Overlay.pm.orig:715 lib/RT/Transaction_Overlay.pm:715
 #. ($value)
 msgid "Membership in %1 added"
 msgstr "Участие в %1 добавлено"
 
-#: lib/RT/Transaction_Overlay.pm:757
+#: lib/RT/Transaction_Overlay.pm.orig:755 lib/RT/Transaction_Overlay.pm:755
 #. ($value)
 msgid "Membership in %1 deleted"
 msgstr "Участие в %1 удалено"
@@ -3095,13 +3078,13 @@
 
 #: lib/RT/Ticket_Overlay.pm:2727
 msgid "Merge failed. Couldn't set Status"
-msgstr ""
+msgstr "Ошибка объединения. Невозможно установить статус"
 
 #: html/Elements/EditLinks:131 html/Ticket/Elements/BulkLinks:48
 msgid "Merge into"
 msgstr "Объединить с заявкой"
 
-#: lib/RT/Transaction_Overlay.pm:723
+#: lib/RT/Transaction_Overlay.pm.orig:721 lib/RT/Transaction_Overlay.pm:721
 #. ($value)
 msgid "Merged into %1"
 msgstr "Объединено в %1"
@@ -3136,13 +3119,13 @@
 
 #: html/Search/Build.html:645
 msgid "Mismatched parentheses"
-msgstr ""
+msgstr "Несовпадающие скобки"
 
 #: lib/RT/Record.pm:944
 msgid "Missing a primary key?: %1"
 msgstr "Пропущен первичный ключ?: %1"
 
-#: html/Admin/Users/Modify.html:193 html/User/Prefs.html:93
+#: html/Admin/Users/Modify.html.orig:193 html/Admin/Users/Modify.html:193 html/User/Prefs.html:93
 msgid "Mobile"
 msgstr "Мобильный"
 
@@ -3158,7 +3141,7 @@
 msgid "Modify"
 msgstr "Изменить"
 
-#: lib/RT/Queue_Overlay.pm:95
+#: lib/RT/Queue_Overlay.pm:94
 msgid "Modify Access Control List"
 msgstr "Изменить список контроля доступа"
 
@@ -3169,7 +3152,7 @@
 #: html/Admin/Elements/ObjectCustomFields:96
 #. (loc(lc($FriendlySubTypes)), loc(lc($Types)))
 msgid "Modify Custom Fields which apply to %1 for all %2"
-msgstr "Изменить дополнительные поля, применяемые ко всем %1"
+msgstr "Изменение дополнительных полей, которые применяются к %1 для всех %2"
 
 #: html/Admin/Elements/ObjectCustomFields:98
 #. (loc(lc($Types)))
@@ -3192,11 +3175,11 @@
 msgid "Modify Rights"
 msgstr "Изменить права"
 
-#: lib/RT/Queue_Overlay.pm:98
+#: lib/RT/Queue_Overlay.pm:97
 msgid "Modify Scrip templates for this queue"
 msgstr "Изменить шаблоны скриплетов для данной очереди"
 
-#: lib/RT/Queue_Overlay.pm:101
+#: lib/RT/Queue_Overlay.pm:100
 msgid "Modify Scrips for this queue"
 msgstr "Изменить скриплеты для данной очереди"
 
@@ -3251,7 +3234,7 @@
 
 #: html/Admin/Elements/GlobalCustomFieldTabs:65 html/Admin/Global/index.html:72
 msgid "Modify global custom fields"
-msgstr ""
+msgstr "Изменить общие дополнительные поля"
 
 #: html/Admin/Elements/GlobalCustomFieldTabs:70 html/Admin/Global/GroupRights.html:46 html/Admin/Global/GroupRights.html:49 html/Admin/Global/index.html:77
 msgid "Modify global group rights"
@@ -3304,7 +3287,7 @@
 msgid "Modify membership roster for this group"
 msgstr "Изменить список участников этой группы"
 
-#: lib/RT/System.pm:83
+#: lib/RT/System.pm:82
 msgid "Modify one's own RT account"
 msgstr "Изменить собственную учетную запись RT"
 
@@ -3338,16 +3321,16 @@
 msgid "Modify templates which apply to all queues"
 msgstr "Изменить шаблоны, которые применяются ко всем очередям"
 
-#: html/Admin/Groups/Modify.html:119 html/User/Groups/Modify.html:107
+#: html/Admin/Groups/Modify.html:118 html/User/Groups/Modify.html:107
 #. ($Group->Name)
 msgid "Modify the group %1"
 msgstr "Изменить группу %1"
 
-#: lib/RT/Queue_Overlay.pm:96
+#: lib/RT/Queue_Overlay.pm:95
 msgid "Modify the queue watchers"
 msgstr "Изменить очередь наблюдателей"
 
-#: html/Admin/Users/Modify.html:301
+#: html/Admin/Users/Modify.html.orig:303 html/Admin/Users/Modify.html:301
 #. ($UserObj->Name)
 msgid "Modify the user %1"
 msgstr "Изменить пользователя %1"
@@ -3362,7 +3345,7 @@
 msgid "Modify ticket #%1"
 msgstr "Изменить заявку # %1"
 
-#: lib/RT/Queue_Overlay.pm:114
+#: lib/RT/Queue_Overlay.pm:113
 msgid "Modify tickets"
 msgstr "Изменить заявки"
 
@@ -3385,7 +3368,7 @@
 msgid "Modify watchers for queue '%1'"
 msgstr "Изменить наблюдателей очереди '%1'"
 
-#: lib/RT/Queue_Overlay.pm:95
+#: lib/RT/Queue_Overlay.pm:94
 msgid "ModifyACL"
 msgstr "ИзменятьПраваДоступа"
 
@@ -3397,27 +3380,27 @@
 msgid "ModifyOwnMembership"
 msgstr "ИзменятьСобственноеУчастиеВГруппах"
 
-#: lib/RT/Queue_Overlay.pm:96
+#: lib/RT/Queue_Overlay.pm:95
 msgid "ModifyQueueWatchers"
 msgstr "ИзменятьНаблюдателейОчереди"
 
-#: lib/RT/Queue_Overlay.pm:101
+#: lib/RT/Queue_Overlay.pm:100
 msgid "ModifyScrips"
 msgstr "ИзменятьСкриплеты"
 
-#: lib/RT/System.pm:83
+#: lib/RT/System.pm:82
 msgid "ModifySelf"
 msgstr "ИзменятьСебя"
 
-#: lib/RT/Queue_Overlay.pm:98
+#: lib/RT/Queue_Overlay.pm:97
 msgid "ModifyTemplate"
 msgstr "ИзменятьШаблон"
 
-#: lib/RT/Queue_Overlay.pm:114
+#: lib/RT/Queue_Overlay.pm:113
 msgid "ModifyTicket"
 msgstr "ИзменятьЗаявку"
 
-#: lib/RT/Date.pm:413
+#: lib/RT/Date.pm:411
 msgid "Mon."
 msgstr "Пнд."
 
@@ -3442,7 +3425,7 @@
 msgid "Multiple"
 msgstr "Несколько значений"
 
-#: lib/RT/User_Overlay.pm:227
+#: lib/RT/User_Overlay.pm:226
 msgid "Must specify 'Name' attribute"
 msgstr "Вы должны указать Имя"
 
@@ -3467,7 +3450,7 @@
 msgid "Name"
 msgstr "Имя"
 
-#: lib/RT/User_Overlay.pm:234
+#: lib/RT/User_Overlay.pm:233
 msgid "Name in use"
 msgstr "Имя уже используется"
 
@@ -3491,7 +3474,7 @@
 msgid "New Links"
 msgstr "Новые связи"
 
-#: html/Admin/Users/Modify.html:119 html/User/Prefs.html:109
+#: html/Admin/Users/Modify.html.orig:119 html/Admin/Users/Modify.html:119 html/User/Prefs.html:109
 msgid "New Password"
 msgstr "Новый пароль"
 
@@ -3523,7 +3506,7 @@
 msgid "New password"
 msgstr "Новый пароль"
 
-#: lib/RT/User_Overlay.pm:817
+#: lib/RT/User_Overlay.pm:814
 msgid "New password notification sent"
 msgstr "Отправлено сообщение с новым паролем"
 
@@ -3595,7 +3578,7 @@
 msgid "NickName"
 msgstr "Псевдоним"
 
-#: html/Admin/Users/Modify.html:84 html/User/Prefs.html:72
+#: html/Admin/Users/Modify.html.orig:84 html/Admin/Users/Modify.html:84 html/User/Prefs.html:72
 msgid "Nickname"
 msgstr "Псевдоним"
 
@@ -3605,7 +3588,7 @@
 
 #: html/Admin/CustomFields/UserRights.html:145
 msgid "No Class defined"
-msgstr ""
+msgstr "Класс не указан"
 
 #: html/Admin/CustomFields/Modify.html:140 html/Admin/Elements/EditCustomField:119
 msgid "No CustomField"
@@ -3668,7 +3651,7 @@
 msgid "No description for %1"
 msgstr "Нет описания для %1"
 
-#: lib/RT/Users_Overlay.pm:185
+#: lib/RT/Users_Overlay.pm:184
 msgid "No group specified"
 msgstr "Не указана группа"
 
@@ -3680,11 +3663,11 @@
 msgid "No message attached"
 msgstr "Нет присоединенных сообщений"
 
-#: lib/RT/User_Overlay.pm:1035
+#: lib/RT/User_Overlay.pm:1032
 msgid "No password set"
 msgstr "Пароль не установлен"
 
-#: lib/RT/Queue_Overlay.pm:358
+#: lib/RT/Queue_Overlay.pm:345
 msgid "No permission to create queues"
 msgstr "Нет прав для создания очередей"
 
@@ -3693,11 +3676,11 @@
 msgid "No permission to create tickets in the queue '%1'"
 msgstr "Нет прав для создания заявок в очереди '%1'"
 
-#: lib/RT/User_Overlay.pm:187
+#: lib/RT/User_Overlay.pm:186
 msgid "No permission to create users"
 msgstr "Нет прав для создания пользователей"
 
-#: html/SelfService/Display.html:165
+#: html/SelfService/Display.html:158
 msgid "No permission to display that ticket"
 msgstr "Нет прав для просмотра этой заявки"
 
@@ -3725,9 +3708,9 @@
 msgid "No rights granted."
 msgstr "Права не выданы."
 
-#: lib/RT/SavedSearch.pm:187
+#: lib/RT/SavedSearch.pm:186
 msgid "No search loaded"
-msgstr ""
+msgstr "Ни один запрос не загружен"
 
 #: html/Search/Bulk.html:220
 msgid "No search to operate on."
@@ -3741,7 +3724,7 @@
 msgid "No ticket id specified"
 msgstr "Идентификатор заявки не указан"
 
-#: lib/RT/Transaction_Overlay.pm:517 lib/RT/Transaction_Overlay.pm:554
+#: lib/RT/Transaction_Overlay.pm.orig:515 lib/RT/Transaction_Overlay.pm.orig:552 lib/RT/Transaction_Overlay.pm:515 lib/RT/Transaction_Overlay.pm:552
 msgid "No transaction type specified"
 msgstr "Тип транзакции не указан"
 
@@ -3777,7 +3760,7 @@
 msgid "Not logged in."
 msgstr "Не зарегистрирован."
 
-#: lib/RT/Date.pm:393
+#: lib/RT/Date.pm:392
 msgid "Not set"
 msgstr "Не установлено"
 
@@ -3793,7 +3776,7 @@
 msgid "Notes"
 msgstr "Примечания"
 
-#: lib/RT/User_Overlay.pm:820
+#: lib/RT/User_Overlay.pm:817
 msgid "Notification could not be sent"
 msgstr "Невозможно отправить уведомление"
 
@@ -3865,7 +3848,7 @@
 msgid "Notify Requestors, Ccs and AdminCcs as Comment"
 msgstr "Уведомлять Авторов заявки, Копии и АдминистративныеКопии как Комментарии"
 
-#: lib/RT/Date.pm:447
+#: lib/RT/Date.pm:444
 msgid "Nov."
 msgstr "Ноя."
 
@@ -3875,23 +3858,23 @@
 
 #: html/Search/Elements/SelectAndOr:47
 msgid "OR"
-msgstr ""
+msgstr "ИЛИ"
 
 #: lib/RT/Record.pm:323
 msgid "Object could not be created"
 msgstr "Невозможно создать объект"
 
-#: lib/RT/Record.pm:124
+#: lib/RT/Record.pm:123
 msgid "Object could not be deleted"
-msgstr ""
+msgstr "Объект не может быть удален"
 
 #: lib/RT/Record.pm:342
 msgid "Object created"
 msgstr "Объект создан"
 
-#: lib/RT/Record.pm:121
+#: lib/RT/Record.pm:120
 msgid "Object deleted"
-msgstr "Тип объекта %1 не может содержать дополнительные поля"
+msgstr "Объект удален"
 
 #: html/Admin/CustomFields/Objects.html:72 html/Admin/Elements/ObjectCustomFields:63
 #. ($ObjectType)
@@ -3903,7 +3886,7 @@
 msgid "Object type mismatch"
 msgstr "Несовпадение типа объекта"
 
-#: lib/RT/Date.pm:446
+#: lib/RT/Date.pm:443
 msgid "Oct."
 msgstr "Окт."
 
@@ -4017,7 +4000,7 @@
 msgid "Ordering and sorting"
 msgstr "Порядок и сортировка"
 
-#: html/Admin/Users/Modify.html:141 html/User/Prefs.html:129
+#: html/Admin/Users/Modify.html.orig:141 html/Admin/Users/Modify.html:141 html/User/Prefs.html:129
 msgid "Organization"
 msgstr "Организация"
 
@@ -4026,11 +4009,11 @@
 msgid "Originating ticket: #%1"
 msgstr "Заявка-первоисточник: #%1"
 
-#: lib/RT/Transaction_Overlay.pm:611
+#: lib/RT/Transaction_Overlay.pm.orig:609 lib/RT/Transaction_Overlay.pm:609
 msgid "Outgoing email about a comment recorded"
 msgstr "Исходящая почта о комментарии записана"
 
-#: lib/RT/Transaction_Overlay.pm:615
+#: lib/RT/Transaction_Overlay.pm.orig:613 lib/RT/Transaction_Overlay.pm:613
 msgid "Outgoing email recorded"
 msgstr "Исходящая почта записана"
 
@@ -4042,11 +4025,11 @@
 msgid "Overview"
 msgstr "Обзор"
 
-#: lib/RT/Queue_Overlay.pm:113
+#: lib/RT/Queue_Overlay.pm:112
 msgid "Own tickets"
 msgstr "Назначить себя"
 
-#: lib/RT/Queue_Overlay.pm:113
+#: lib/RT/Queue_Overlay.pm:112
 msgid "OwnTicket"
 msgstr "БытьОтветственнымЗаЗаявку"
 
@@ -4062,7 +4045,7 @@
 msgid "Owner could not be set."
 msgstr "Ответственный не может быть назначен"
 
-#: lib/RT/Transaction_Overlay.pm:661
+#: lib/RT/Transaction_Overlay.pm.orig:659 lib/RT/Transaction_Overlay.pm:659
 #. ($Old->Name , $New->Name)
 msgid "Owner forcibly changed from %1 to %2"
 msgstr "Ответственный принудительно изменен с %1 на %2"
@@ -4076,7 +4059,7 @@
 msgid "Page %1 of %2"
 msgstr "Страница %1 из %2"
 
-#: html/Admin/Users/Modify.html:198 html/User/Prefs.html:97
+#: html/Admin/Users/Modify.html.orig:198 html/Admin/Users/Modify.html:198 html/User/Prefs.html:97
 msgid "Pager"
 msgstr "Пейджер"
 
@@ -4102,31 +4085,23 @@
 
 #: lib/RT/Transaction_Overlay.pm:769 lib/RT/User_Overlay.pm:1044
 msgid "Password changed"
-msgstr ""
+msgstr "Пароль изменен"
 
-#: lib/RT/User_Overlay.pm:1038 lib/RT/User_Overlay.pm:215
+#: lib/RT/User_Overlay.pm:1035 lib/RT/User_Overlay.pm:214
 #. ($RT::MinimumPasswordLength)
 msgid "Password needs to be at least %1 characters long"
-msgstr ""
-
-#: lib/RT/User_Overlay.pm:1045
-msgid "Password set"
-msgstr ""
+msgstr "Пароль должен состоят не менее чем из %1 символов"
 
 #: NOT FOUND IN SOURCE
 msgid "Password too short"
 msgstr "Пароль слишком короткий"
 
-#: html/User/Prefs.html:232
+#: html/Admin/Users/Modify.html.orig:357 html/Admin/Users/Modify.html:355 html/User/Prefs.html:232
 #. (loc_fuzzy($msg))
 msgid "Password: %1"
 msgstr "Пароль: %1"
 
-#: lib/RT/User_Overlay.pm:1031
-msgid "Password: Permission Denied"
-msgstr ""
-
-#: html/Admin/Users/Modify.html:356
+#: html/Admin/Users/Modify.html.orig:359 html/Admin/Users/Modify.html:357
 msgid "Passwords do not match."
 msgstr "Пароли не совпадают"
 
@@ -4162,7 +4137,7 @@
 msgid "Personal groups:"
 msgstr "Личные группы:"
 
-#: html/Admin/Users/Modify.html:180 html/User/Prefs.html:82
+#: html/Admin/Users/Modify.html.orig:180 html/Admin/Users/Modify.html:180 html/User/Prefs.html:82
 msgid "Phone numbers"
 msgstr "Номера телефонов"
 
@@ -4178,7 +4153,7 @@
 msgid "Prefs"
 msgstr "Настройки"
 
-#: lib/RT/Action/Generic.pm:196
+#: lib/RT/Action/Generic.pm:188
 msgid "Prepare Stubbed"
 msgstr "Подготовка не реализована"
 
@@ -4198,7 +4173,7 @@
 msgid "Pri"
 msgstr "Приоритет"
 
-#: lib/RT/ACE_Overlay.pm:158 lib/RT/ACE_Overlay.pm:240 lib/RT/ACE_Overlay.pm:570
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/ACE_Overlay.pm:238 lib/RT/ACE_Overlay.pm:582
 #. ($args{'PrincipalId'})
 msgid "Principal %1 not found."
 msgstr "Пользователь %1 не найден."
@@ -4219,7 +4194,7 @@
 msgid "Privileged"
 msgstr "Привилегированные"
 
-#: html/Admin/Users/Modify.html:334 html/User/Prefs.html:223
+#: html/Admin/Users/Modify.html.orig:337 html/Admin/Users/Modify.html:335 html/User/Prefs.html:223
 #. (loc_fuzzy($msg))
 msgid "Privileged status: %1"
 msgstr "Состояние привилегий: %1"
@@ -4266,11 +4241,11 @@
 msgid "Queue Scrips"
 msgstr "Скриплеты очереди"
 
-#: lib/RT/Queue_Overlay.pm:362
+#: lib/RT/Queue_Overlay.pm:349
 msgid "Queue already exists"
 msgstr "Очередь уже существует"
 
-#: lib/RT/Queue_Overlay.pm:371 lib/RT/Queue_Overlay.pm:377
+#: lib/RT/Queue_Overlay.pm:358 lib/RT/Queue_Overlay.pm:364
 msgid "Queue could not be created"
 msgstr "Невозможно создать очередь"
 
@@ -4278,7 +4253,7 @@
 msgid "Queue could not be loaded."
 msgstr "Невозможно загрузить очередь"
 
-#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:381 lib/RT/StyleGuide.pod:809
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:368 lib/RT/StyleGuide.pod:809
 msgid "Queue created"
 msgstr "Очередь создана"
 
@@ -4393,7 +4368,7 @@
 
 #: html/Elements/SetupSessionCookie:90
 msgid "RT couldn't store your session."
-msgstr ""
+msgstr "Ошибка сохранения вашей сессии"
 
 #: NOT FOUND IN SOURCE
 msgid "RT couldn't validate this PGP signature. \\n"
@@ -4440,7 +4415,7 @@
 msgid "RT's email command mode requires PGP authentication.  Either you didn't sign your message, or your signature could not be verified."
 msgstr "Командный режим RT email требует использования подписи .PGP. Вы либо не подписали сообщение, либо ваша подпись не может быть проверена."
 
-#: html/Admin/Users/Modify.html:79 html/User/Prefs.html:69
+#: html/Admin/Users/Modify.html.orig:79 html/Admin/Users/Modify.html:79 html/User/Prefs.html:69
 msgid "Real Name"
 msgstr "Полное имя"
 
@@ -4448,22 +4423,22 @@
 msgid "RealName"
 msgstr "Полное имя"
 
-#: lib/RT/Transaction_Overlay.pm:714
+#: lib/RT/Transaction_Overlay.pm.orig:712 lib/RT/Transaction_Overlay.pm:712
 #. ($value)
 msgid "Reference by %1 added"
 msgstr "Ссылка на заявку заявки %1 добавлена"
 
-#: lib/RT/Transaction_Overlay.pm:754
+#: lib/RT/Transaction_Overlay.pm.orig:752 lib/RT/Transaction_Overlay.pm:752
 #. ($value)
 msgid "Reference by %1 deleted"
 msgstr "Ссылка на заявку заявки %1 удалена"
 
-#: lib/RT/Transaction_Overlay.pm:711
+#: lib/RT/Transaction_Overlay.pm.orig:709 lib/RT/Transaction_Overlay.pm:709
 #. ($value)
 msgid "Reference to %1 added"
 msgstr "Ссылка на %1 добавлена"
 
-#: lib/RT/Transaction_Overlay.pm:751
+#: lib/RT/Transaction_Overlay.pm.orig:749 lib/RT/Transaction_Overlay.pm:749
 #. ($value)
 msgid "Reference to %1 deleted"
 msgstr "Ссылка на %1 удалена"
@@ -4550,11 +4525,11 @@
 msgid "Reply to requestors"
 msgstr "Отвечать авторам заявки"
 
-#: lib/RT/Queue_Overlay.pm:111
+#: lib/RT/Queue_Overlay.pm:110
 msgid "Reply to tickets"
 msgstr "Отвечать на заявки"
 
-#: lib/RT/Queue_Overlay.pm:111
+#: lib/RT/Queue_Overlay.pm:110
 msgid "ReplyToTicket"
 msgstr "ОтвечатьНаЗаявку"
 
@@ -4595,7 +4570,7 @@
 msgid "Reset"
 msgstr "Очистить"
 
-#: html/Admin/Users/Modify.html:183 html/User/Prefs.html:85
+#: html/Admin/Users/Modify.html.orig:183 html/Admin/Users/Modify.html:183 html/User/Prefs.html:85
 msgid "Residence"
 msgstr "Домашний"
 
@@ -4640,7 +4615,7 @@
 msgid "Results per page"
 msgstr "Результатов на странице"
 
-#: html/Admin/Users/Modify.html:126 html/User/Prefs.html:116
+#: html/Admin/Users/Modify.html.orig:126 html/Admin/Users/Modify.html:126 html/User/Prefs.html:116
 msgid "Retype Password"
 msgstr "Повторите пароль"
 
@@ -4652,19 +4627,19 @@
 msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
 msgstr "Право %1 не найдено для %2  %3 в рамках %4 (%5)\\n"
 
-#: lib/RT/ACE_Overlay.pm:631
+#: lib/RT/ACE_Overlay.pm:643
 msgid "Right Delegated"
 msgstr "Право делегировано"
 
-#: lib/RT/ACE_Overlay.pm:321
+#: lib/RT/ACE_Overlay.pm:333
 msgid "Right Granted"
 msgstr "Право выдано"
 
-#: lib/RT/ACE_Overlay.pm:179
+#: lib/RT/ACE_Overlay.pm:185
 msgid "Right Loaded"
 msgstr "Право загружено"
 
-#: lib/RT/ACE_Overlay.pm:696 lib/RT/ACE_Overlay.pm:717
+#: lib/RT/ACE_Overlay.pm:708 lib/RT/ACE_Overlay.pm:729
 msgid "Right could not be revoked"
 msgstr "Право не может быть отозвано"
 
@@ -4672,11 +4647,11 @@
 msgid "Right not found"
 msgstr "Право не найдено"
 
-#: lib/RT/ACE_Overlay.pm:561 lib/RT/ACE_Overlay.pm:656
+#: lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:668
 msgid "Right not loaded."
 msgstr "Право не загружено"
 
-#: lib/RT/ACE_Overlay.pm:713
+#: lib/RT/ACE_Overlay.pm:725
 msgid "Right revoked"
 msgstr "Право отозвано"
 
@@ -4684,12 +4659,12 @@
 msgid "Rights"
 msgstr "Права"
 
-#: html/Admin/CustomFields/GroupRights.html:129 lib/RT/Interface/Web.pm:901
+#: html/Admin/CustomFields/GroupRights.html:129 lib/RT/Interface/Web.pm:869
 #. ($object_type)
 msgid "Rights could not be granted for %1"
 msgstr "Невозможно выдать права для %1"
 
-#: html/Admin/CustomFields/GroupRights.html:156 lib/RT/Interface/Web.pm:930
+#: html/Admin/CustomFields/GroupRights.html:156 lib/RT/Interface/Web.pm:898
 #. ($object_type)
 msgid "Rights could not be revoked for %1"
 msgstr "Невозможно отозвать права %1"
@@ -4706,7 +4681,7 @@
 msgid "Rows per page"
 msgstr "Строк на странице"
 
-#: lib/RT/Date.pm:418
+#: lib/RT/Date.pm:416
 msgid "Sat."
 msgstr "Суб."
 
@@ -4726,10 +4701,10 @@
 msgid "Save changes"
 msgstr "Сохранить изменения"
 
-#: lib/RT/SavedSearch.pm:162
+#: lib/RT/SavedSearch.pm:161
 #. ($name)
 msgid "Saved search %1"
-msgstr ""
+msgstr "Сохраненный запрос %1"
 
 #: html/Search/Elements/EditSearches:46
 msgid "Saved searches"
@@ -4743,7 +4718,7 @@
 msgid "Scrip #%1"
 msgstr "Скриплет #%1"
 
-#: lib/RT/Scrip_Overlay.pm:205
+#: lib/RT/Scrip_Overlay.pm:204
 msgid "Scrip Created"
 msgstr "Скриплет создан"
 
@@ -4781,7 +4756,7 @@
 
 #: lib/RT/SavedSearch.pm:116
 msgid "Search attribute load failure"
-msgstr ""
+msgstr "Ошибка загрузки атрибута запроса"
 
 #: html/Approvals/Elements/PendingMyApproval:59
 msgid "Search for approvals"
@@ -4809,7 +4784,7 @@
 #: lib/RT/SavedSearch.pm:194
 #. ($msg)
 msgid "Search update: %1"
-msgstr ""
+msgstr "Обновление запроса: %1"
 
 #: NOT FOUND IN SOURCE
 msgid "Searches can't be associated with that kind of object"
@@ -4827,15 +4802,15 @@
 msgid "See custom fields"
 msgstr "Просмотреть дополнительные поля"
 
-#: lib/RT/Queue_Overlay.pm:107
+#: lib/RT/Queue_Overlay.pm:106
 msgid "See exact outgoing email messages and their recipeients"
 msgstr "Просмотреть полностью исходящую почту и ее получателей"
 
-#: lib/RT/Queue_Overlay.pm:105
+#: lib/RT/Queue_Overlay.pm:104
 msgid "See ticket private commentary"
 msgstr "Просмотреть конфиденциальный комментарий заявки"
 
-#: lib/RT/Queue_Overlay.pm:104
+#: lib/RT/Queue_Overlay.pm:103
 msgid "See ticket summaries"
 msgstr "Просмотреть сводную информацию заявки"
 
@@ -4845,9 +4820,9 @@
 
 #: lib/RT/Group_Overlay.pm:177
 msgid "SeeGroup"
-msgstr ""
+msgstr "ПросматриватьГруппу"
 
-#: lib/RT/Queue_Overlay.pm:92
+#: lib/RT/Queue_Overlay.pm:91
 msgid "SeeQueue"
 msgstr "ПросмативатьОчередь"
 
@@ -4885,19 +4860,19 @@
 
 #: html/Admin/Global/CustomFields/index.html:70
 msgid "Select custom fields for all user groups"
-msgstr ""
+msgstr "Выберите дополнительные поля всех пользовательских групп"
 
 #: html/Admin/Global/CustomFields/index.html:65
 msgid "Select custom fields for all users"
-msgstr "Выберите дополнительное поле"
+msgstr "Выберите дополнительные поля всех пользователей"
 
 #: html/Admin/Global/CustomFields/index.html:76
 msgid "Select custom fields for tickets in all queues"
-msgstr ""
+msgstr "Выберите дополнительные поля заявок во всех очередях"
 
 #: html/Admin/Global/CustomFields/index.html:83
 msgid "Select custom fields for transactions on tickets in all queues"
-msgstr ""
+msgstr "Выберите дополнительные поля транзакций заявок во всех очередях"
 
 #: html/Admin/Elements/GroupTabs:75 html/User/Elements/GroupTabs:71
 msgid "Select group"
@@ -4937,11 +4912,11 @@
 
 #: NOT FOUND IN SOURCE
 msgid "SelectMultiple"
-msgstr "Выбрать несколько"
+msgstr "ВыбиратьНесколько"
 
 #: NOT FOUND IN SOURCE
 msgid "SelectSingle"
-msgstr "Выбрать одно"
+msgstr "ВыбиратьОдно"
 
 #: html/Admin/Elements/EditCustomFields:58
 msgid "Selected Custom Fields"
@@ -5003,7 +4978,7 @@
 msgid "Sends mail to the owner"
 msgstr "Отправлять почту Ответственному"
 
-#: lib/RT/Date.pm:445
+#: lib/RT/Date.pm:442
 msgid "Sep."
 msgstr "Сен."
 
@@ -5067,15 +5042,15 @@
 msgid "Show ticket summaries"
 msgstr "Показать сводную информацию заявки"
 
-#: lib/RT/Queue_Overlay.pm:94
+#: lib/RT/Queue_Overlay.pm:93
 msgid "ShowACL"
 msgstr "ПоказыватьПраваДоступа"
 
-#: lib/RT/System.pm:86
+#: lib/RT/System.pm:85
 msgid "ShowConfigTab"
-msgstr ""
+msgstr "ПоказыватьЗакладкуКонфигурации"
 
-#: lib/RT/Queue_Overlay.pm:107
+#: lib/RT/Queue_Overlay.pm:106
 msgid "ShowOutgoingEmail"
 msgstr "ПоказыватьИсходящуюПочту"
 
@@ -5083,31 +5058,31 @@
 msgid "ShowSavedSearches"
 msgstr "ПоказыватьСохраненныеЗапросы"
 
-#: lib/RT/Queue_Overlay.pm:103
+#: lib/RT/Queue_Overlay.pm:102
 msgid "ShowScrips"
 msgstr "ПоказыватьСкриплеты"
 
-#: lib/RT/Queue_Overlay.pm:100
+#: lib/RT/Queue_Overlay.pm:99
 msgid "ShowTemplate"
 msgstr "ПоказыватьШаблон"
 
-#: lib/RT/Queue_Overlay.pm:104
+#: lib/RT/Queue_Overlay.pm:103
 msgid "ShowTicket"
 msgstr "ПоказыватьЗаявку"
 
-#: lib/RT/Queue_Overlay.pm:105
+#: lib/RT/Queue_Overlay.pm:104
 msgid "ShowTicketComments"
 msgstr "ПоказыватьКомментарииЗаявки"
 
-#: lib/RT/Queue_Overlay.pm:108
+#: lib/RT/Queue_Overlay.pm:107
 msgid "Sign up as a ticket Requestor or ticket or queue Cc"
 msgstr "Подписаться как Автор заявки или Копия заявки или очереди"
 
-#: lib/RT/Queue_Overlay.pm:109
+#: lib/RT/Queue_Overlay.pm:108
 msgid "Sign up as a ticket or queue AdminCc"
 msgstr "Подписаться как АдминистративнаяКопия заявки или очереди"
 
-#: html/Admin/Users/Modify.html:229 html/User/Prefs.html:167
+#: html/Admin/Users/Modify.html.orig:229 html/Admin/Users/Modify.html:229 html/User/Prefs.html:167
 msgid "Signature"
 msgstr "Подпись"
 
@@ -5125,7 +5100,7 @@
 
 #: html/Search/Elements/EditFormat:75
 msgid "Size"
-msgstr ""
+msgstr "Размер"
 
 #: html/Elements/Header:80
 msgid "Skip Menu"
@@ -5133,7 +5108,7 @@
 
 #: html/Search/Elements/EditFormat:78
 msgid "Small"
-msgstr ""
+msgstr "Маленький"
 
 #: html/Admin/Elements/AddCustomFieldValue:49 html/Admin/Elements/EditCustomFieldValues:54
 msgid "Sort"
@@ -5191,7 +5166,7 @@
 msgid "Starts date '%1' could not be parsed"
 msgstr "Не могу разобрать дату 'Начато': '%1'"
 
-#: html/Admin/Users/Modify.html:162 html/User/Prefs.html:145
+#: html/Admin/Users/Modify.html.orig:162 html/Admin/Users/Modify.html:162 html/User/Prefs.html:145
 msgid "State"
 msgstr "Состояние"
 
@@ -5215,32 +5190,28 @@
 msgid "Steal"
 msgstr "Переназначать себе"
 
-#: lib/RT/Queue_Overlay.pm:118
+#: lib/RT/Queue_Overlay.pm:117
 msgid "Steal tickets"
 msgstr "Переназначить заявки себе"
 
-#: lib/RT/Queue_Overlay.pm:118
+#: lib/RT/Queue_Overlay.pm:117
 msgid "StealTicket"
 msgstr "ПереназначатьЗаявкуСебе"
 
-#: lib/RT/Transaction_Overlay.pm:667
+#: lib/RT/Transaction_Overlay.pm.orig:665 lib/RT/Transaction_Overlay.pm:665
 #. ($Old->Name)
-msgid "Stolen from %1"
-msgstr "Ответственный переназначен с %1"
-
-#: NOT FOUND IN SOURCE
 msgid "Stolen from %1 "
-msgstr "Ответственный переназначен с %1 "
+msgstr "Ответственный переназначен с %1"
 
 #: html/Search/Elements/EditFormat:81
 msgid "Style"
-msgstr ""
+msgstr "Стиль"
 
 #: html/Elements/QuickCreate:52 html/Elements/SelectAttachmentField:47 html/Search/Bulk.html:132 html/SelfService/Create.html:79 html/SelfService/Elements/MyRequests:49 html/SelfService/Update.html:65 html/Ticket/Create.html:106 html/Ticket/Elements/EditBasics:48 html/Ticket/Elements/Reminders:78 html/Ticket/ModifyAll.html:100 html/Ticket/Update.html:83 lib/RT/Ticket_Overlay.pm:1139 lib/RT/Tickets_Overlay.pm:1507
 msgid "Subject"
 msgstr "Тема"
 
-#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/StyleGuide.pod:815 lib/RT/Transaction_Overlay.pm:689
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/StyleGuide.pod:815 lib/RT/Transaction_Overlay.pm.orig:687 lib/RT/Transaction_Overlay.pm:687
 #. ($self->Data)
 msgid "Subject changed to %1"
 msgstr "Тема изменена на %1"
@@ -5257,7 +5228,7 @@
 msgid "Submit Workflow"
 msgstr "Отправить последовательность действий"
 
-#: lib/RT/Group_Overlay.pm:782
+#: lib/RT/Group_Overlay.pm:780
 msgid "Succeeded"
 msgstr "Успешно"
 
@@ -5269,11 +5240,11 @@
 msgid "Summary matches"
 msgstr "Всего совпадений"
 
-#: lib/RT/Date.pm:419
+#: lib/RT/Date.pm:417
 msgid "Sun."
 msgstr "Вск."
 
-#: lib/RT/System.pm:76
+#: lib/RT/System.pm:75
 msgid "SuperUser"
 msgstr "Администратор"
 
@@ -5285,7 +5256,7 @@
 msgid "System Configuration"
 msgstr "Системная конфигурация"
 
-#: html/Admin/CustomFields/GroupRights.html:128 html/Admin/CustomFields/GroupRights.html:155 html/Admin/CustomFields/UserRights.html:128 html/Admin/CustomFields/UserRights.html:98 html/Admin/Elements/SelectRights:106 lib/RT/ACE_Overlay.pm:585 lib/RT/Interface/Web.pm:900 lib/RT/Interface/Web.pm:929
+#: html/Admin/CustomFields/GroupRights.html:128 html/Admin/CustomFields/GroupRights.html:155 html/Admin/CustomFields/UserRights.html:128 html/Admin/CustomFields/UserRights.html:98 html/Admin/Elements/SelectRights:106 lib/RT/ACE_Overlay.pm:597 lib/RT/Interface/Web.pm:868 lib/RT/Interface/Web.pm:897
 msgid "System Error"
 msgstr "Системная ошибка"
 
@@ -5297,20 +5268,20 @@
 msgid "System Error. right not granted"
 msgstr "Системная ошибка. Право не выдано"
 
-#: lib/RT/Transaction_Overlay.pm:215 lib/RT/Transaction_Overlay.pm:221
+#: lib/RT/Transaction_Overlay.pm.orig:213 lib/RT/Transaction_Overlay.pm.orig:219 lib/RT/Transaction_Overlay.pm:213 lib/RT/Transaction_Overlay.pm:219
 #. ($msg)
 msgid "System Error: %1"
-msgstr ""
+msgstr "Системная ошибка: %1"
 
 #: html/Admin/Tools/index.html:47
 msgid "System Tools"
 msgstr "Системные утилиты"
 
-#: lib/RT/ACE_Overlay.pm:634
+#: lib/RT/ACE_Overlay.pm:646
 msgid "System error. Right not delegated."
 msgstr "Системная ошибка. Право не делегировано."
 
-#: lib/RT/ACE_Overlay.pm:164 lib/RT/ACE_Overlay.pm:229 lib/RT/ACE_Overlay.pm:324 lib/RT/ACE_Overlay.pm:921
+#: lib/RT/ACE_Overlay.pm:170 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:336 lib/RT/ACE_Overlay.pm:933
 msgid "System error. Right not granted."
 msgstr "Cистемная ошибка. Право не выдано."
 
@@ -5326,25 +5297,25 @@
 msgid "SystemRolegroup for internal use"
 msgstr "Системная псевдо-группа для внутреннего использования"
 
-#: lib/RT/CurrentUser.pm:358
+#: lib/RT/CurrentUser.pm:356
 msgid "TEST_STRING"
 msgstr "TEST_STRING"
 
 #: etc/initialdata:603 html/Search/Elements/EditFormat:72 html/Ticket/Elements/Tabs:168
 msgid "Take"
-msgstr "Взять себе"
+msgstr "Назначить себя ответственным"
 
-#: lib/RT/Queue_Overlay.pm:116
+#: lib/RT/Queue_Overlay.pm:115
 msgid "Take tickets"
-msgstr "Взять заявки себя"
+msgstr "Назначить себя ответственным за заявки"
 
-#: lib/RT/Queue_Overlay.pm:116
+#: lib/RT/Queue_Overlay.pm:115
 msgid "TakeTicket"
-msgstr "БратьЗаявкуСебе"
+msgstr "НазначатьСебяОтветственнымЗаЗаявку"
 
-#: lib/RT/Transaction_Overlay.pm:652
+#: lib/RT/Transaction_Overlay.pm.orig:650 lib/RT/Transaction_Overlay.pm:650
 msgid "Taken"
-msgstr "Взята"
+msgstr "Назначен ответственным"
 
 #: NOT FOUND IN SOURCE
 msgid "Task"
@@ -5363,7 +5334,7 @@
 msgid "Template deleted"
 msgstr "Шаблон удален"
 
-#: lib/RT/Scrip_Overlay.pm:181
+#: lib/RT/Scrip_Overlay.pm:180
 msgid "Template not found"
 msgstr "Шаблон не найден"
 
@@ -5371,7 +5342,7 @@
 msgid "Template not found\\n"
 msgstr "Шаблон не найден\\n"
 
-#: lib/RT/Template_Overlay.pm:376
+#: lib/RT/Template_Overlay.pm:373
 msgid "Template parsed"
 msgstr "Шаблон обработан"
 
@@ -5399,11 +5370,11 @@
 msgid "That is the same value"
 msgstr "Значение не изменилось"
 
-#: lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:615
+#: lib/RT/ACE_Overlay.pm:318 lib/RT/ACE_Overlay.pm:627
 msgid "That principal already has that right"
 msgstr "Этот пользователь уже имеет это право."
 
-#: lib/RT/Queue_Overlay.pm:750
+#: lib/RT/Queue_Overlay.pm:737
 #. ($args{'Type'})
 msgid "That principal is already a %1 for this queue"
 msgstr "Этот пользователь уже %1 для этой очереди"
@@ -5413,7 +5384,7 @@
 msgid "That principal is already a %1 for this ticket"
 msgstr "Этот пользователь уже %1 для этой заявки "
 
-#: lib/RT/Queue_Overlay.pm:849
+#: lib/RT/Queue_Overlay.pm:836
 #. ($args{'Type'})
 msgid "That principal is not a %1 for this queue"
 msgstr "Этот пользователь не %1 для этой очереди"
@@ -5442,19 +5413,19 @@
 msgid "That user does not exist"
 msgstr "Пользователь не существует"
 
-#: lib/RT/User_Overlay.pm:390
+#: lib/RT/User_Overlay.pm:389
 msgid "That user is already privileged"
 msgstr "Этот пользователь уже привилегированный"
 
-#: lib/RT/User_Overlay.pm:411
+#: lib/RT/User_Overlay.pm:410
 msgid "That user is already unprivileged"
 msgstr "Этот пользователь уже непривилегированный"
 
-#: lib/RT/User_Overlay.pm:403
+#: lib/RT/User_Overlay.pm:402
 msgid "That user is now privileged"
 msgstr "Этот пользователь теперь привилегированный"
 
-#: lib/RT/User_Overlay.pm:424
+#: lib/RT/User_Overlay.pm:423
 msgid "That user is now unprivileged"
 msgstr "Этот пользователь теперь непривилегированный"
 
@@ -5466,7 +5437,7 @@
 msgid "That user may not own tickets in that queue"
 msgstr "Этот пользователь не может быть ответственным за заявки в этой очереди"
 
-#: lib/RT/Link_Overlay.pm:234
+#: lib/RT/Link_Overlay.pm:233
 msgid "That's not a numerical id"
 msgstr "Это не числовой идентификатор"
 
@@ -5474,11 +5445,11 @@
 msgid "The Basics"
 msgstr "Основное"
 
-#: lib/RT/ACE_Overlay.pm:113
+#: lib/RT/ACE_Overlay.pm:112
 msgid "The CC of a ticket"
 msgstr "Копия заявки"
 
-#: lib/RT/ACE_Overlay.pm:114
+#: lib/RT/ACE_Overlay.pm:113
 msgid "The administrative CC of a ticket"
 msgstr "Административная копия заявки"
 
@@ -5498,11 +5469,11 @@
 msgid "The new value has been set."
 msgstr "Новое значение установлено"
 
-#: lib/RT/ACE_Overlay.pm:111
+#: lib/RT/ACE_Overlay.pm:110
 msgid "The owner of a ticket"
 msgstr "Ответственный за заявку"
 
-#: lib/RT/ACE_Overlay.pm:112
+#: lib/RT/ACE_Overlay.pm:111
 msgid "The requestor of a ticket"
 msgstr "Автор заявки"
 
@@ -5530,7 +5501,7 @@
 msgid "This tool allows the user to run arbitrary perl modules from within RT."
 msgstr "Этот инструмент позволяет пользователю запускать некоторые модули Perl из RT."
 
-#: lib/RT/Transaction_Overlay.pm:288
+#: lib/RT/Transaction_Overlay.pm.orig:286 lib/RT/Transaction_Overlay.pm:286
 msgid "This transaction appears to have no content"
 msgstr "Похоже, что эта транзакция не имеет содержимого"
 
@@ -5543,7 +5514,7 @@
 msgid "This user's 25 highest priority tickets"
 msgstr "25 важнейших заявок пользователя..."
 
-#: lib/RT/Date.pm:416
+#: lib/RT/Date.pm:414
 msgid "Thu."
 msgstr "Чтв."
 
@@ -5569,7 +5540,7 @@
 msgid "Ticket #%1: %2"
 msgstr "Заявка #%1: %2"
 
-#: lib/RT/Action/CreateTickets.pm:1258 lib/RT/Action/CreateTickets.pm:1267 lib/RT/Action/CreateTickets.pm:595 lib/RT/Action/CreateTickets.pm:716 lib/RT/Action/CreateTickets.pm:729
+#: lib/RT/Action/CreateTickets.pm:1255 lib/RT/Action/CreateTickets.pm:1264 lib/RT/Action/CreateTickets.pm:593 lib/RT/Action/CreateTickets.pm:713 lib/RT/Action/CreateTickets.pm:726
 #. ($T::Tickets{$template_id}->Id)
 #. ($T::Tickets{$template_id}->id)
 #. ($ticket->Id)
@@ -5663,7 +5634,7 @@
 msgid "Ticket watchers"
 msgstr "Наблюдатели за заявкой"
 
-#: lib/RT/Search/FromSQL.pm:83
+#: lib/RT/Search/FromSQL.pm:82
 #. (ref $self)
 msgid "TicketSQL search module"
 msgstr ""
@@ -5738,7 +5709,7 @@
 
 #: html/Search/Elements/EditFormat:74
 msgid "Title"
-msgstr ""
+msgstr "Заголовок"
 
 #: NOT FOUND IN SOURCE
 msgid "To generate a diff of this commit:"
@@ -5769,12 +5740,12 @@
 msgid "Transaction"
 msgstr "Транзакция"
 
-#: lib/RT/Transaction_Overlay.pm:794
+#: lib/RT/Transaction_Overlay.pm.orig:792 lib/RT/Transaction_Overlay.pm:792
 #. ($self->Data)
 msgid "Transaction %1 purged"
 msgstr "Транзакция %1 удалена"
 
-#: lib/RT/Transaction_Overlay.pm:174
+#: lib/RT/Transaction_Overlay.pm.orig:172 lib/RT/Transaction_Overlay.pm:172
 msgid "Transaction Created"
 msgstr "Транзакция создана"
 
@@ -5786,7 +5757,7 @@
 msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
 msgstr "Транзакция->Создать невозможно, так как вы не указали идентификатор заявки"
 
-#: lib/RT/Transaction_Overlay.pm:125
+#: lib/RT/Transaction_Overlay.pm.orig:123 lib/RT/Transaction_Overlay.pm:123
 msgid "Transaction->Create couldn't, as you didn't specify an object type and id"
 msgstr "Транзакция->Создать невозможно, так как вы не указали тип объекта и идентификатор"
 
@@ -5798,7 +5769,7 @@
 msgid "Trying to delete a right: %1"
 msgstr "Пытаемся удалить право: %1"
 
-#: lib/RT/Date.pm:414
+#: lib/RT/Date.pm:412
 msgid "Tue."
 msgstr "Втр."
 
@@ -5806,11 +5777,11 @@
 msgid "Type"
 msgstr "Тип"
 
-#: lib/RT/ScripCondition_Overlay.pm:129
+#: lib/RT/ScripCondition_Overlay.pm:128
 msgid "Unimplemented"
 msgstr "Не реализовано"
 
-#: html/Admin/Users/Modify.html:89
+#: html/Admin/Users/Modify.html.orig:89 html/Admin/Users/Modify.html:89
 msgid "Unix login"
 msgstr "Логин UNIX"
 
@@ -5826,7 +5797,7 @@
 
 #: html/Search/Build.html:610
 msgid "Unknown field: $key"
-msgstr ""
+msgstr "Неизвестное поле: $key"
 
 #: html/Elements/SelectResultsPerPage:58
 msgid "Unlimited"
@@ -5848,9 +5819,9 @@
 msgid "Unselected objects"
 msgstr "Невыбранные объекты"
 
-#: lib/RT/Transaction_Overlay.pm:648
+#: lib/RT/Transaction_Overlay.pm.orig:646 lib/RT/Transaction_Overlay.pm:646
 msgid "Untaken"
-msgstr "Не взята"
+msgstr "Нет ответственного"
 
 #: NOT FOUND IN SOURCE
 msgid "Untitled search"
@@ -5892,7 +5863,7 @@
 msgid "Update name"
 msgstr "Обновить имя"
 
-#: lib/RT/Action/CreateTickets.pm:737 lib/RT/Interface/Web.pm:524
+#: lib/RT/Action/CreateTickets.pm:734 lib/RT/Interface/Web.pm:492
 msgid "Update not recorded."
 msgstr "Обновление не записано."
 
@@ -5922,7 +5893,7 @@
 msgid "Update ticket #%1 (%2)"
 msgstr "Обновление заявки #%1 (%2)"
 
-#: lib/RT/Action/CreateTickets.pm:735 lib/RT/Interface/Web.pm:523
+#: lib/RT/Action/CreateTickets.pm:732 lib/RT/Interface/Web.pm:490
 msgid "Update type was neither correspondence nor comment."
 msgstr "Обновление не было ни сообщением, ни комментарием."
 
@@ -5964,7 +5935,7 @@
 
 #: html/Admin/index.html:90
 msgid "Use other RT administrative tools"
-msgstr ""
+msgstr "Другие административные утилиты RT"
 
 #: NOT FOUND IN SOURCE
 msgid "User %1 %2: %3\\n"
@@ -6017,7 +5988,7 @@
 msgid "User could not be created: %1"
 msgstr "Невозможно создать пользователя: %1"
 
-#: lib/RT/User_Overlay.pm:331
+#: lib/RT/User_Overlay.pm:330
 msgid "User created"
 msgstr "Пользователь создан"
 
@@ -6025,7 +5996,7 @@
 msgid "User defined groups"
 msgstr "Группы, определенные пользователем"
 
-#: lib/RT/User_Overlay.pm:593 lib/RT/User_Overlay.pm:613
+#: lib/RT/User_Overlay.pm:592 lib/RT/User_Overlay.pm:612
 msgid "User loaded"
 msgstr "Пользовать загружен"
 
@@ -6069,11 +6040,11 @@
 msgid "Values"
 msgstr "Значения"
 
-#: lib/RT/Queue_Overlay.pm:108
+#: lib/RT/Queue_Overlay.pm:107
 msgid "Watch"
 msgstr "Наблюдать"
 
-#: lib/RT/Queue_Overlay.pm:109
+#: lib/RT/Queue_Overlay.pm:108
 msgid "WatchAsAdminCc"
 msgstr "НаблюдатьАдминистративнойКопией"
 
@@ -6089,7 +6060,7 @@
 msgid "WebEncoding"
 msgstr "WebEncoding"
 
-#: lib/RT/Date.pm:415
+#: lib/RT/Date.pm:413
 msgid "Wed."
 msgstr "Срд."
 
@@ -6153,7 +6124,7 @@
 msgid "Which refer to"
 msgstr "Которая ссылается на"
 
-#: html/Admin/Users/Modify.html:188 html/User/Prefs.html:89
+#: html/Admin/Users/Modify.html.orig:188 html/Admin/Users/Modify.html:188 html/User/Prefs.html:89
 msgid "Work"
 msgstr "Рабочий"
 
@@ -6163,7 +6134,7 @@
 
 #: NOT FOUND IN SOURCE
 msgid "WorkPhone"
-msgstr "Рабочий"
+msgstr "Рабочий телефон"
 
 #: html/Ticket/Elements/ShowBasics:63 html/Ticket/Update.html:64
 msgid "Worked"
@@ -6206,7 +6177,7 @@
 msgid "You have been logged out of RT."
 msgstr "Вы вышли из RT."
 
-#: html/SelfService/Display.html:109
+#: html/SelfService/Display.html:102
 msgid "You have no permission to create tickets in that queue."
 msgstr "У вас нет права создавать заявки в этой очереди."
 
@@ -6246,7 +6217,7 @@
 msgid "Your username or password is incorrect"
 msgstr "Имя пользователя или пароль неверные"
 
-#: html/Admin/Users/Modify.html:168 html/User/Prefs.html:149
+#: html/Admin/Users/Modify.html.orig:168 html/Admin/Users/Modify.html:168 html/User/Prefs.html:149
 msgid "Zip"
 msgstr "Индекс"
 
@@ -6254,13 +6225,13 @@
 msgid "[no subject]"
 msgstr "[нет темы]"
 
-#: lib/RT/System.pm:88
+#: lib/RT/System.pm:87
 msgid "allow creation of saved searches"
-msgstr ""
+msgstr "разрешить создание сохраненных запросов"
 
-#: lib/RT/System.pm:87
+#: lib/RT/System.pm:86
 msgid "allow loading of saved searches"
-msgstr ""
+msgstr "разрешить загрузку сохраненных запросов"
 
 #: NOT FOUND IN SOURCE
 msgid "and is not"
@@ -6277,7 +6248,7 @@
 
 #: html/Search/Results.html:86
 msgid "chart"
-msgstr ""
+msgstr "относится к"
 
 #: html/SelfService/Closed.html:49
 msgid "closed"
@@ -6303,7 +6274,7 @@
 msgid "correspondence sent"
 msgstr "корреспонденция отправлена"
 
-#: html/Admin/Queues/Modify.html:98 lib/RT/Date.pm:342
+#: html/Admin/Queues/Modify.html:98 lib/RT/Date.pm:341
 msgid "days"
 msgstr "дней"
 
@@ -6311,7 +6282,7 @@
 msgid "delete"
 msgstr "удалить"
 
-#: lib/RT/Queue_Overlay.pm:88
+#: lib/RT/Queue_Overlay.pm:87
 msgid "deleted"
 msgstr "удалена"
 
@@ -6333,27 +6304,27 @@
 
 #: html/Search/Build.html:365
 msgid "error: can't move down"
-msgstr ""
+msgstr "ошибка: невозможно переместить вниз"
 
 #: html/Search/Build.html:387
 msgid "error: can't move left"
-msgstr ""
+msgstr "ошибка: невозможно переместить влево"
 
 #: html/Search/Build.html:346
 msgid "error: can't move up"
-msgstr ""
+msgstr "ошибка: невозможно переместить вверх"
 
 #: html/Search/Build.html:429
 msgid "error: nothing to delete"
-msgstr ""
+msgstr "ошибка: нет данных для удаления"
 
 #: html/Search/Build.html:351 html/Search/Build.html:370 html/Search/Build.html:392 html/Search/Build.html:421
 msgid "error: nothing to move"
-msgstr ""
+msgstr "ошибка: нет данных для перемещения"
 
 #: html/Search/Build.html:447
 msgid "error: nothing to toggle"
-msgstr ""
+msgstr "ошибка: нет данных для переключения"
 
 #: NOT FOUND IN SOURCE
 msgid "false"
@@ -6401,7 +6372,7 @@
 msgid "matches"
 msgstr "совпадает"
 
-#: lib/RT/Date.pm:334
+#: lib/RT/Date.pm:333
 msgid "min"
 msgstr "мин"
 
@@ -6413,11 +6384,11 @@
 msgid "modifications\\n\\n"
 msgstr "изменения\\n\\n"
 
-#: lib/RT/Date.pm:350
+#: lib/RT/Date.pm:349
 msgid "months"
 msgstr "месяцев"
 
-#: lib/RT/Queue_Overlay.pm:83
+#: lib/RT/Queue_Overlay.pm:82
 msgid "new"
 msgstr "новая"
 
@@ -6455,27 +6426,27 @@
 msgid "queue %1 %2"
 msgstr "очередь %1 %2"
 
-#: lib/RT/Queue_Overlay.pm:87
+#: lib/RT/Queue_Overlay.pm:86
 msgid "rejected"
 msgstr "отклонена"
 
-#: lib/RT/Queue_Overlay.pm:86
+#: lib/RT/Queue_Overlay.pm:85
 msgid "resolved"
 msgstr "решена"
 
-#: lib/RT/Date.pm:330
+#: lib/RT/Date.pm:329
 msgid "sec"
 msgstr "сек"
 
-#: lib/RT/System.pm:86
+#: lib/RT/System.pm:85
 msgid "show Configuration tab"
-msgstr "электронная таблица (.xls)"
+msgstr "показывать закладку Конфигурация"
 
 #: html/Search/Results.html:83
 msgid "spreadsheet"
-msgstr "электронная таблица (.xls)"
+msgstr "электронная таблица"
 
-#: lib/RT/Queue_Overlay.pm:85
+#: lib/RT/Queue_Overlay.pm:84
 msgid "stalled"
 msgstr "приостановлена"
 
@@ -6533,7 +6504,7 @@
 msgid "user %1"
 msgstr "пользователь %1"
 
-#: lib/RT/Date.pm:346
+#: lib/RT/Date.pm:345
 msgid "weeks"
 msgstr "недель"
 
@@ -6541,7 +6512,7 @@
 msgid "with template %1"
 msgstr "с шаблоном %1"
 
-#: lib/RT/Date.pm:354
+#: lib/RT/Date.pm:353
 msgid "years"
 msgstr "лет"
 

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Email.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Email.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Email.pm	Mon Feb  6 15:04:21 2006
@@ -68,6 +68,7 @@
               &CheckForLoops 
               &CheckForSuspiciousSender
               &CheckForAutoGenerated 
+              &CheckForBounce 
               &MailError 
               &ParseCcAddressesFromHead
               &ParseSenderAddressFromHead 
@@ -171,6 +172,16 @@
 
 # }}}
 
+# {{{ sub CheckForBounce
+sub CheckForBounce {
+    my $head = shift;
+   
+    my $ReturnPath = $head->get("Return-path") || "" ;
+    return ($ReturnPath =~ /<>/);
+}
+
+# }}}
+
 # {{{ IsRTAddress
 
 =head2 IsRTAddress ADDRESS
@@ -187,7 +198,7 @@
     # Example: the following rule would tell RT not to Cc
     #   "tickets at noc.example.com"
     my $re_address = RT->Config->Get('RTAddressRegexp');
-    if ( $re_address && $address =~ /$re_address/ ) {
+    if ( $re_address && $address =~ /$re_address/i ) {
         return 1;
     }
     return undef;
@@ -379,7 +390,8 @@
 =head2 ParseErrorsToAddressFromHead
 
 Takes a MIME::Header object. Return a single value : user at host
-of the From (evaluated in order of Errors-To:,Reply-To:, From:, Sender)
+of the From (evaluated in order of Return-path:,Errors-To:,Reply-To:,
+From:, Sender)
 
 =cut
 
@@ -387,7 +399,7 @@
     my $head = shift;
     #Figure out who's sending this message.
 
-    foreach my $header ('Errors-To' , 'Reply-To', 'From', 'Sender' ) {
+    foreach my $header ('Return-path', 'Errors-To' , 'Reply-To', 'From', 'Sender' ) {
 	# If there's a header of that name
 	my $headerobj = $head->get($header);
 	if ($headerobj) {
@@ -438,7 +450,7 @@
     my $id;
 
     my $rtname = RT->Config->Get('rtname');
-    my $test_name = RT->Config->Get('EmailSubjectTagRegex') || qr/\Q$rtname\E/;
+    my $test_name = RT->Config->Get('EmailSubjectTagRegex') || qr/\Q$rtname\E/i;
 
     if ( $Subject =~ s/\[$test_name\s+\#(\d+)\s*\]//i ) {
         my $id = $1;
@@ -658,6 +670,8 @@
     # }}}
 
     # {{{ Lets check for mail loops of various sorts.
+    my $IsBounce = CheckForBounce($head);
+
     my $IsAutoGenerated = CheckForAutoGenerated($head);
 
     my $IsSuspiciousSender = CheckForSuspiciousSender($head);
@@ -668,7 +682,7 @@
 
     #If the message is autogenerated, we need to know, so we can not
     # send mail to the sender
-    if ( $IsSuspiciousSender || $IsAutoGenerated || $IsALoop ) {
+    if ( $IsBounce || $IsSuspiciousSender || $IsAutoGenerated || $IsALoop ) {
         $SquelchReplies = 1;
         $ErrorsTo       = RT->Config->Get('OwnerEmail');
     }

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Web/Menu.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Web/Menu.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Web/Menu.pm	Mon Feb  6 15:04:21 2006
@@ -17,3 +17,5 @@
     my $self = shift;
     return $self->{'root_node'};
 }
+
+1;

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Web/Menu/Item.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Web/Menu/Item.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Interface/Web/Menu/Item.pm	Mon Feb  6 15:04:21 2006
@@ -36,3 +36,4 @@
     return $self->{'_attributes'}->{$key};
 }
 
+1;

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Principal_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Principal_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Principal_Overlay.pm	Mon Feb  6 15:04:21 2006
@@ -276,8 +276,6 @@
     Object => an RT style object (->id will get its id)
 
 
-
-
 Returns 1 if a matching ACE was found.
 
 Returns undef if no ACE was found.
@@ -291,38 +289,41 @@
         Right        => undef,
         Object       => undef,
         EquivObjects => undef,
-        @_
+        @_,
     );
 
+    unless ( $args{'Right'} ) {
+        $RT::Logger->crit("HasRight called without a right");
+        return (undef);
+    }
+
+    $args{EquivObjects} = [ @{ $args{EquivObjects} } ] if $args{EquivObjects};
+
     if ( $self->Disabled ) {
-        $RT::Logger->err( "Disabled User:  "
+        $RT::Logger->error( "Disabled User:  "
               . $self->id
               . " failed access check for "
               . $args{'Right'} );
         return (undef);
     }
 
-    if ( !defined $args{'Right'} ) {
-        $RT::Logger->crit("HasRight called without a right");
-        return (undef);
-    }
-
     if (   defined( $args{'Object'} )
         && UNIVERSAL::can( $args{'Object'}, 'id' )
-        && $args{'Object'}->id )
-    {
+        && $args{'Object'}->id ) {
+
         push( @{ $args{'EquivObjects'} }, $args{Object} );
     }
     else {
-        $RT::Logger->crit("$self HasRight called with no valid object");
+        $RT::Logger->crit("HasRight called with no valid object");
         return (undef);
     }
 
     # If this object is a ticket, we care about ticket roles and queue roles
-    if ( ( ref( $args{'Object'} ) eq 'RT::Ticket' ) && $args{'Object'}->Id ) {
+    if ( UNIVERSAL::isa( $args{'Object'} => 'RT::Ticket' ) ) {
 
-# this is a little bit hacky, but basically, now that we've done the ticket roles magic, we load the queue object
-# and ask all the rest of our questions about the queue.
+        # this is a little bit hacky, but basically, now that we've done
+        # the ticket roles magic, we load the queue object
+        # and ask all the rest of our questions about the queue.
         push( @{ $args{'EquivObjects'} }, $args{'Object'}->QueueObj );
 
     }
@@ -350,157 +351,119 @@
 
     # }}}
 
-    # {{{ if we've cached a positive result for this query, return 1
-
-    my $cached_answer = $_ACL_CACHE->fetch($hashkey);
-
     # Returns undef on cache miss
+    my $cached_answer = $_ACL_CACHE->fetch($hashkey);
     if ( defined $cached_answer ) {
         if ( $cached_answer == 1 ) {
             return (1);
         }
         elsif ( $cached_answer == -1 ) {
-            return (0);
+            return (undef);
         }
     }
 
-    my ( $or_look_at_object_rights, $or_check_roles );
-    my $right = $args{'Right'};
+    my $hitcount = $self->_HasRight( %args );
+
+    $_ACL_CACHE->set( $hashkey => $hitcount? 1:-1 );
+    return ($hitcount);
+}
 
-    # {{{ Construct Right Match
+=head2 _HasRight
+
+Low level HasRight implementation, use HasRight method instead.
+
+=cut
+
+sub _HasRight
+{
+    my $self = shift;
+    my %args = (
+        Right        => undef,
+        Object       => undef,
+        EquivObjects => [],
+        @_
+    );
+
+    my $right = $args{'Right'};
+    my @objects = @{ $args{'EquivObjects'} };
 
     # If an object is defined, we want to look at rights for that object
 
-    my @look_at_objects;
-    push( @look_at_objects, "ACL.ObjectType = 'RT::System'" )
+    push( @objects, 'RT::System' )
       unless $self->can('_IsOverrideGlobalACL')
-      and $self->_IsOverrideGlobalACL( $args{Object} );
+             && $self->_IsOverrideGlobalACL( $args{Object} );
 
-    foreach my $obj ( @{ $args{'EquivObjects'} } ) {
-        next unless ( UNIVERSAL::can( $obj, 'id' ) );
-        my $type = ref($obj);
-        my $id   = $obj->id;
-
-        unless ($id) {
-            use Carp;
-            Carp::cluck(
-                "Trying to check $type rights for an unspecified $type");
-            $RT::Logger->crit(
-                "Trying to check $type rights for an unspecified $type");
+    my ($check_roles, $check_objects) = ('','');
+    if( @objects ) {
+        my @role_clauses;
+        my @object_clauses;
+        foreach my $obj ( @objects ) {
+            my $type = ref($obj)? ref($obj): $obj;
+            my $id;
+            $id = $obj->id if ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id;
+
+            my $role_clause = "Groups.Domain = '$type-Role'";
+            # XXX: Groups.Instance is VARCHAR in DB, we should quote value
+            # if we want mysql 4.0 use indexes here. we MUST convert that
+            # field to integer and drop this quotes.
+            $role_clause   .= " AND Groups.Instance = '$id'" if $id;
+            push @role_clauses, "($role_clause)";
+
+            my $object_clause = "ACL.ObjectType = '$type'";
+            $object_clause   .= " AND ACL.ObjectId = $id" if $id;
+            push @object_clauses, "($object_clause)";
         }
-        push @look_at_objects,
-          "(ACL.ObjectType = '$type' AND ACL.ObjectId = '$id')";
-    }
 
-    # }}}
-
-    # {{{ Build that honkin-big SQL query
+        $check_roles .= join ' OR ', @role_clauses;
+        $check_objects = join ' OR ', @object_clauses;
+    }
 
     my $query_base =
       "SELECT ACL.id from ACL, Groups, Principals, CachedGroupMembers WHERE  " .
 
       # Only find superuser or rights with the name $right
-      "(ACL.RightName = 'SuperUser' OR  ACL.RightName = '$right') " .
+      "(ACL.RightName = 'SuperUser' OR  ACL.RightName = '$right') "
 
       # Never find disabled groups.
-      "AND Principals.Disabled = 0 "
-      . "AND CachedGroupMembers.Disabled = 0  "
-      . "AND Principals.id = Groups.id "
-      .    # We always grant rights to Groups
-
-# See if the principal is a member of the group recursively or _is the rightholder_
-# never find recursively disabled group members
-# also, check to see if the right is being granted _directly_ to this principal,
-#  as is the case when we want to look up group rights
-"AND  Principals.id = CachedGroupMembers.GroupId AND CachedGroupMembers.MemberId = '"
-      . $self->Id . "' "
-      .
-
-  # Make sure the rights apply to the entire system or to the object in question
-      "AND ( " . join( ' OR ', @look_at_objects ) . ") ";
-
-# The groups query does the query based on group membership and individual user rights
-
-    my $groups_query = $query_base .
-
-# limit the result set to groups of types ACLEquivalence (user)  UserDefined, SystemInternal and Personal
-"AND ( (  ACL.PrincipalId = Principals.id AND ACL.PrincipalType = 'Group' AND "
-      . "(Groups.Domain = 'SystemInternal' OR Groups.Domain = 'UserDefined' OR Groups.Domain = 'ACLEquivalence' OR Groups.Domain = 'Personal'))"
-      .
-
-      " ) ";
-    $self->_Handle->ApplyLimits( \$groups_query, 1 );    #only return one result
-
-    my @roles;
-    foreach my $object ( @{ $args{'EquivObjects'} } ) {
-        push( @roles, $self->_RolesForObject( ref($object), $object->id ) );
-    }
+      . "AND Principals.Disabled = 0 "
+      . "AND CachedGroupMembers.Disabled = 0 "
 
-    # The roles query does the query based on roles
-    my $roles_query;
-    if (@roles) {
-        $roles_query =
-            $query_base . "AND " . " ( ("
-          . join( ' OR ', @roles ) . " ) "
-          . " AND Groups.Type = ACL.PrincipalType AND Groups.Id = Principals.id AND Principals.PrincipalType = 'Group') ";
-        $self->_Handle->ApplyLimits( \$roles_query, 1 ); #only return one result
+      # We always grant rights to Groups
+      . "AND Principals.id = Groups.id "
+      . "AND Principals.PrincipalType = 'Group' "
 
-    }
+      # See if the principal is a member of the group recursively or _is the rightholder_
+      # never find recursively disabled group members
+      # also, check to see if the right is being granted _directly_ to this principal,
+      #  as is the case when we want to look up group rights
+      . "AND Principals.id = CachedGroupMembers.GroupId "
+      . "AND CachedGroupMembers.MemberId = ". $self->Id ." "
+
+      # Make sure the rights apply to the entire system or to the object in question
+      . "AND ($check_objects) ";
+
+    # The groups query does the query based on group membership and individual user rights
+    my $groups_query = $query_base
+      # limit the result set to groups of types ACLEquivalence (user),
+      # UserDefined, SystemInternal and Personal. All this we do
+      # via (ACL.PrincipalType = 'Group') condition
+      . "AND ACL.PrincipalId = Principals.id "
+      . "AND ACL.PrincipalType = 'Group' ";
 
-    # }}}
-
-    # {{{ Actually check the ACL by performing an SQL query
-    #   $RT::Logger->debug("Now Trying $groups_query");
+    $self->_Handle->ApplyLimits( \$groups_query, 1 ); #only return one result
     my $hitcount = $self->_Handle->FetchResult($groups_query);
+    return 1 if $hitcount; # get out of here if success
 
-    # }}}
-
-    # {{{ if there's a match, the right is granted
-    if ($hitcount) {
-        $_ACL_CACHE->set( $hashkey => 1 );
-        return (1);
-    }
+    # The roles query does the query based on roles
+    my $roles_query = $query_base
+      . "AND ACL.PrincipalType = Groups.Type "
+      . "AND ($check_roles) ";
+    $self->_Handle->ApplyLimits( \$roles_query, 1 ); #only return one result
 
-    # Now check the roles query
     $hitcount = $self->_Handle->FetchResult($roles_query);
+    return 1 if $hitcount; # get out of here if success
 
-    if ($hitcount) {
-        $_ACL_CACHE->set( $hashkey => 1 );
-        return (1);
-    }
-
-    # We failed to find an acl hit
-    $_ACL_CACHE->set( $hashkey => -1 );
-    return (undef);
-}
-
-# }}}
-
-# {{{ _RolesForObject
-
-
-
-=head2 _RolesForObject( $object_type, $object_id)
-
-Returns an SQL clause finding role groups for Objects
-
-=cut
-
-
-sub _RolesForObject {
-    my $self = shift;
-    my $type = shift;
-    my $id = shift || 0;
-
-   # This should never be true.
-   unless ($id =~ /^\d+$/) {
-	$RT::Logger->crit("RT::Prinicipal::_RolesForObject called with type $type and a non-integer id: '$id'");
-	$id = "'$id'";
-   }
-
-    my $clause = "(Groups.Domain = '".$type."-Role' AND Groups.Instance = $id) ";
-
-    return($clause);
+    return 0;
 }
 
 # }}}
@@ -571,6 +534,8 @@
     # just return the value for non-objects
     return $scalar unless UNIVERSAL::can($scalar, 'id');
 
+    return ref($scalar) unless $scalar->id;
+
     # an object -- return the class and id
     return(ref($scalar)."-". $scalar->id);
 }

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Record.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Record.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Record.pm	Mon Feb  6 15:04:21 2006
@@ -819,7 +819,10 @@
             elsif (RT->Config->Get('DropLongAttachments')) {
 
                 # drop the attachment on the floor
-                $RT::Logger->info( "$self: Dropped an attachment of size " . length($Body) . "\n" . "It started: " . substr( $Body, 0, 60 ) . "\n" );
+                $RT::Logger->info( "$self: Dropped an attachment of size "
+                                   . length($Body) . "\n"
+                                   . "It started: " . substr( $Body, 0, 60 ) . "\n"
+                                 );
                 return ("none", "Large attachment dropped" );
             }
         }
@@ -1299,7 +1302,7 @@
                              Target => $args{'Target'} );
     if ( $old_link->Id ) {
         $RT::Logger->debug("$self Somebody tried to duplicate a link");
-        return ( $old_link->id, $self->loc("Link already exists"), 0 );
+        return ( $old_link->id, $self->loc("Link already exists") );
     }
 
     # }}}

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Scrips_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Scrips_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Scrips_Overlay.pm	Mon Feb  6 15:04:21 2006
@@ -157,7 +157,9 @@
 
 =head2 Apply
 
-Run through the relevant scrips. 
+Run through the relevant scrips.  Scrips will run in order based on 
+description.  (Most common use case is to prepend a number to the description,
+forcing the scrips to run in ascending alphanumerical order.)
 
 =cut
 
@@ -304,7 +306,10 @@
 
 =head2 _FindScrips
 
-Find only the apropriate scrips for whatever we're doing now
+Find only the apropriate scrips for whatever we're doing now.  Order them 
+by their description.  (Most common use case is to prepend a number to the
+description, forcing the scrips to display and run in ascending alphanumerical 
+order.)
 
 =cut
 
@@ -353,6 +358,9 @@
         ENTRYAGGREGATOR => 'OR',
     );
 
+    # Promise some kind of ordering
+    $self->OrderBy( FIELD => 'description' );
+
     $RT::Logger->debug("Found ".$self->Count. " scrips");
 }
 

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Template_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Template_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Template_Overlay.pm	Mon Feb  6 15:04:21 2006
@@ -103,23 +103,11 @@
 
 sub _Set {
     my $self = shift;
-
-    # use super::value or we get acl blocked
-    if ( ( defined $self->SUPER::_Value('Queue') )
-        && ( $self->SUPER::_Value('Queue') == 0 ) )
-    {
-        unless ( $self->CurrentUser->HasRight( Object => $RT::System, Right => 'ModifyTemplate') ) {
-            return ( 0, $self->loc('Permission Denied') );
-        }
-    }
-    else {
-
-        unless ( $self->CurrentUserHasQueueRight('ModifyTemplate') ) {
-            return ( 0, $self->loc('Permission Denied') );
-        }
+    
+    unless ( $self->CurrentUserHasQueueRight('ModifyTemplate') ) {
+        return ( 0, $self->loc('Permission Denied') );
     }
-    return ( $self->SUPER::_Set(@_) );
-
+    return $self->SUPER::_Set( @_ );
 }
 
 # }}}
@@ -147,26 +135,12 @@
 =cut
 
 sub _Value {
-
     my $self  = shift;
-    my $field = shift;
 
-   
-    #If the current user doesn't have ACLs, don't let em at it.  
-    #use super::value or we get acl blocked
-    if ( ( !defined $self->__Value('Queue') )
-        || ( $self->__Value('Queue') == 0 ) )
-    {
-        unless ( $self->CurrentUser->HasRight( Object => $RT::System, Right => 'ShowTemplate') ) {
-            return (undef);
-        }
+    unless ( $self->CurrentUserHasQueueRight('ShowTemplate') ) {
+        return undef;
     }
-    else {
-        unless ( $self->CurrentUserHasQueueRight('ShowTemplate') ) {
-            return (undef);
-        }
-    }
-    return ( $self->__Value($field) );
+    return $self->__Value( @_ );
 
 }
 
@@ -183,18 +157,12 @@
 sub Load {
     my $self       = shift;
     my $identifier = shift;
+    return undef unless $identifier;
 
-    if ( !$identifier ) {
-        return (undef);
-    }
-
-    if ( $identifier !~ /\D/ ) {
-        $self->SUPER::LoadById($identifier);
-    }
-    else {
-        $self->LoadByCol( 'Name', $identifier );
-
+    if ( $identifier =~ /\D/ ) {
+        return $self->LoadByCol( 'Name', $identifier );
     }
+    return $self->LoadById( $identifier );
 }
 
 # }}}
@@ -260,32 +228,32 @@
         Content     => undef,
         Queue       => 0,
         Description => '[no description]',
-        Type => 'Action',    #By default, template are 'Action' templates
-        Name => undef,
+        Type        => 'Action', #By default, template are 'Action' templates
+        Name        => undef,
         @_
     );
 
-    if ( !$args{'Queue'}  ) {
+    unless ( $args{'Queue'} ) {
         unless ( $self->CurrentUser->HasRight(Right =>'ModifyTemplate', Object => $RT::System) ) {
-            return (undef);
+            return ( undef, $self->loc('Permission denied') );
         }
         $args{'Queue'} = 0;
     }
     else {
         my $QueueObj = new RT::Queue( $self->CurrentUser );
-        $QueueObj->Load( $args{'Queue'} ) || return ( 0, $self->loc('Invalid queue') );
+        $QueueObj->Load( $args{'Queue'} ) || return ( undef, $self->loc('Invalid queue') );
     
         unless ( $QueueObj->CurrentUserHasRight('ModifyTemplate') ) {
-            return (undef);
+            return ( undef, $self->loc('Permission denied') );
         }
         $args{'Queue'} = $QueueObj->Id;
     }
 
     my $result = $self->SUPER::Create(
-        Content => $args{'Content'},
-        Queue   =>  $args{'Queue'},
+        Content     => $args{'Content'},
+        Queue       => $args{'Queue'},
         Description => $args{'Description'},
-        Name        => $args{'Name'}
+        Name        => $args{'Name'},
     );
 
     return ($result);
@@ -340,15 +308,16 @@
     my $self = shift;
 
     #We're passing in whatever we were passed. it's destined for _ParseContent
-    my $content = $self->_ParseContent(@_);
+    my ($content, $msg) = $self->_ParseContent(@_);
+    return ( 0, $msg ) unless defined $content;
 
     #Lets build our mime Entity
 
     my $parser = MIME::Parser->new();
 
-        # On some situations TMPDIR is non-writable. sad but true.
-        $parser->output_to_core(1);
-        $parser->tmp_to_core(1);
+    # On some situations TMPDIR is non-writable. sad but true.
+    $parser->output_to_core(1);
+    $parser->tmp_to_core(1);
 
     #If someone includes a message, don't extract it
     $parser->extract_nested_messages(1);
@@ -363,15 +332,13 @@
     ### Should we forgive normally-fatal errors?
     $parser->ignore_errors(1);
     $self->{'MIMEObj'} = eval { $parser->parse_data($content) };
-    my $error = ( $@ || $parser->last_error );
-
-    if ($error) {
-        $RT::Logger->error("$error");
+    if ( my $error = $@ || $parser->last_error ) {
+        $RT::Logger->error( "$error" );
         return ( 0, $error );
     }
 
     # Unfold all headers
-    $self->{'MIMEObj'}->head->unfold();
+    $self->{'MIMEObj'}->head->unfold;
 
     return ( 1, $self->loc("Template parsed") );
 
@@ -400,9 +367,13 @@
     $T::rtname      = RT->Config->Get('rtname');
     *T::loc         = sub { $T::Ticket->loc(@_) };
 
+    my $content = $self->Content;
+    unless ( defined $content ) {
+        return ( undef, $self->loc("Permissions denied") );
+    }
+
     # We need to untaint the content of the template, since we'll be working
     # with it
-    my $content = $self->Content();
     $content =~ s/^(.*)$/$1/;
     my $template = Text::Template->new(
         TYPE   => 'STRING',
@@ -413,11 +384,11 @@
     my $retval = $template->fill_in( PACKAGE => 'T', BROKEN => sub {
         my (%args) = @_;
         $RT::Logger->error("Template parsing error: $args{error}")
-	    unless $args{error} =~ /^Died at /; # ignore intentional die()
+            unless $args{error} =~ /^Died at /; # ignore intentional die()
         $is_broken++;
-	return undef;
+        return undef;
     } );
-    return undef if $is_broken;
+    return ( undef, $self->loc('Template parsing error') ) if $is_broken;
 
     # MIME::Parser has problems dealing with high-bit utf8 data.
     Encode::_utf8_off($retval);

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Ticket_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Ticket_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Ticket_Overlay.pm	Mon Feb  6 15:04:21 2006
@@ -754,7 +754,7 @@
         $RT::Handle->Commit();
         $ErrStr = $self->loc( "Ticket [_1] created in queue '[_2]'", $self->Id, $QueueObj->Name );
         $ErrStr = join( "\n", $ErrStr, @non_fatal_errors );
-        return ( $self->Id, $0, $ErrStr );
+        return ( $self->Id, 0, $ErrStr );
 
     }
 }
@@ -1321,7 +1321,8 @@
 
     # {{{ Check ACLS
     #If the watcher we're trying to add is for the current user
-    if ( $self->CurrentUser->PrincipalId  eq $args{'PrincipalId'}) {
+    if ( $self->CurrentUser->PrincipalId  eq $args{'PrincipalId'}
+       or $self->CurrentUser->UserObj->EmailAddress eq $args{'Email'}) {
         #  If it's an AdminCc and they don't have 
         #   'WatchAsAdminCc' or 'ModifyTicket', bail
         if ( $args{'Type'} eq 'AdminCc' ) {
@@ -2507,8 +2508,11 @@
         $direction='Base';
     }
 
-    if ( $val ) {
-	my $remote_uri = RT::URI->new( $RT::SystemUser );
+    if ( $args{'Silent'} ) {
+        return ( $val, $Msg );
+    }
+    else {
+	my $remote_uri = RT::URI->new( $self->CurrentUser );
     	$remote_uri->FromURI( $remote_link );
 
         my ( $Trans, $Msg, $TransObj ) = $self->_NewTransaction(
@@ -2518,6 +2522,17 @@
             TimeTaken => 0
         );
 
+        if ( $remote_uri->IsLocal ) {
+
+            my $OtherObj = $remote_uri->Object;
+            my ( $val, $Msg ) = $OtherObj->_NewTransaction(Type  => 'DeleteLink',
+                                                           Field => $direction eq 'Target' ? $LINKDIRMAP{$args{'Type'}}->{Base}
+                                                                                           : $LINKDIRMAP{$args{'Type'}}->{Target},
+                                                           OldValue => $self->URI,
+                                                           ActivateScrips => ! $RT::LinkTransactionsRun1Scrip,
+                                                           TimeTaken => 0 );
+        }
+
         return ( $Trans, $Msg );
     }
 }
@@ -2530,52 +2545,6 @@
 
 Takes a paramhash of Type and one of Base or Target. Adds that link to this ticket.
 
-=begin testing 
-
-my $q1 = RT::Queue->new($RT::SystemUser);
-my ($id,$msg) = $q1->Create(Name => 'LinkTest1');
-ok ($id,$msg);
-my $q2 = RT::Queue->new($RT::SystemUser);
-($id,$msg) = $q2->Create(Name => 'LinkTest2');
-ok ($id,$msg);
-
-my $u1 = RT::User->new($RT::SystemUser);
-($id,$msg) =$u1->Create(Name => 'LinkTestUser');
-
-ok ($id,$msg);
-
-($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q1, Right => 'CreateTicket');
-ok ($id,$msg);
-($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q1, Right => 'ModifyTicket');
-ok ($id,$msg);
-
-my $tid;
-
-my $creator = RT::CurrentUser->new($u1->id);
-
-my $ticket = RT::Ticket->new( $creator);
-ok($ticket->isa('RT::Ticket'));
-($id,$tid, $msg) = $ticket->Create(Subject => 'Link test 1', Queue => $q1->id);
-ok ($id,$msg);
-
-
-my $ticket2 = RT::Ticket->new($RT::SystemUser);
-($id, $tid, $msg) = $ticket2->Create(Subject => 'Link test 2', Queue => $q2->id);
-ok ($id, $msg);
-
-($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
-ok(!$id,$msg);
-($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q2, Right => 'CreateTicket');
-ok ($id,$msg);
-($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q2, Right => 'ModifyTicket');
-ok ($id,$msg);
-($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
-ok($id,$msg);
-($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => -1);
-ok(!$id,$msg);
-
-=end testing 
-
 =cut
 
 sub AddLink {
@@ -2663,7 +2632,7 @@
         return ( $val, $Msg );
     }
     else {
-	my $remote_uri = RT::URI->new( $RT::SystemUser );
+	my $remote_uri = RT::URI->new( $self->CurrentUser );
     	$remote_uri->FromURI( $remote_link );
 
         #Write the transaction
@@ -2672,6 +2641,17 @@
 				   Field => $LINKDIRMAP{$args{'Type'}}->{$direction},
 				   NewValue =>  $remote_uri->URI || $remote_link,
 				   TimeTaken => 0 );
+
+        if ( $remote_uri->IsLocal ) {
+
+            my $OtherObj = $remote_uri->Object;
+            my ( $val, $Msg ) = $OtherObj->_NewTransaction(Type  => 'AddLink',
+                                                           Field => $direction eq 'Target' ? $LINKDIRMAP{$args{'Type'}}->{Base} 
+                                                                                           : $LINKDIRMAP{$args{'Type'}}->{Target},
+                                                           NewValue => $self->URI,
+                                                           ActivateScrips => ! $RT::LinkTransactionsRun1Scrip,
+                                                           TimeTaken => 0 );
+        }
         return ( $val, $Msg );
     }
 

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Tickets_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Tickets_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Tickets_Overlay.pm	Mon Feb  6 15:04:21 2006
@@ -135,7 +135,7 @@
     Requestors       => [ 'WATCHERFIELD'    => 'Requestor', ],
     Cc               => [ 'WATCHERFIELD'    => 'Cc', ],
     AdminCc          => [ 'WATCHERFIELD'    => 'AdminCc', ],
-    Watcher          => ['WATCHERFIELD'],
+    Watcher          => [ 'WATCHERFIELD', ],
     LinkedTo         => [ 'LINKFIELD', ],
     CustomFieldValue => [ 'CUSTOMFIELD', ],
     CF               => [ 'CUSTOMFIELD', ],
@@ -273,7 +273,7 @@
         or $op     eq "!=";
 
     my $meta = $FIELD_METADATA{$field};
-    if ( defined $meta->[1] ) {
+    if ( defined $meta->[1] && defined $value && $value !~ /^\d+$/ ) {
         my $class = "RT::" . $meta->[1];
         my $o     = $class->new( $sb->CurrentUser );
         $o->Load($value);
@@ -538,8 +538,6 @@
 
     $sb->{_sql_transalias} = $sb->NewAlias('Transactions')
         unless defined $sb->{_sql_transalias};
-    $sb->{_sql_trattachalias} = $sb->NewAlias('Attachments')
-        unless defined $sb->{_sql_trattachalias};
 
     my $date = RT::Date->new( $sb->CurrentUser );
     $date->Set( Format => 'unknown', Value => $value );
@@ -591,15 +589,6 @@
         );
     }
 
-    # Join Transactions To Attachments
-
-    $sb->_SQLJoin(
-        ALIAS1 => $sb->{_sql_trattachalias},
-        FIELD1 => 'TransactionId',
-        ALIAS2 => $sb->{_sql_transalias},
-        FIELD2 => 'id',
-    );
-
     # Join Transactions to Tickets
     $sb->_SQLJoin(
         ALIAS1 => 'main',
@@ -1201,7 +1190,7 @@
   my ($self, $cfkey, $cfid, $field) = @_;
  
   my $TicketCFs;
-
+  my $CFs;
     # Perform one Join per CustomField
 
     if ( $self->{_sql_object_cf_alias}{$cfkey} ) {
@@ -1224,16 +1213,23 @@
             );
         }
         else {
-            my $cfalias = $self->Join(
+            my $ocfalias = $self->Join(
                 TYPE       => 'left',
-                EXPRESSION => "'$field'",
+                FIELD1     => 'Queue',
+                TABLE2     => 'ObjectCustomFields',
+                FIELD2     => 'ObjectId',
+            );
+            $CFs = $self->Join(
+                TYPE       => 'left',
+                ALIAS1     => $ocfalias,
+                FIELD1     => 'CustomField',
                 TABLE2     => 'CustomFields',
-                FIELD2     => 'Name',
+                FIELD2     => 'id',
             );
 
             $TicketCFs = $self->{_sql_object_cf_alias}{$cfkey} = $self->Join(
                 TYPE   => 'left',
-                ALIAS1 => $cfalias,
+                ALIAS1 => $CFs,
                 FIELD1 => 'id',
                 TABLE2 => 'ObjectCustomFieldValues',
                 FIELD2 => 'CustomField',
@@ -1261,7 +1257,7 @@
         );
     }
 
-  return $TicketCFs;
+  return ($TicketCFs, $CFs);
 }
 
 =head2 _CustomFieldLimit
@@ -1294,9 +1290,18 @@
     }
 
     my $cfkey = $cfid ? $cfid : "$queue.$field";
-    my $TicketCFs = $self->_CustomFieldJoin( $cfkey, $cfid, $field );
+    my ($TicketCFs, $CFs) = $self->_CustomFieldJoin( $cfkey, $cfid, $field );
+
+     $self->_OpenParen;
+
+     $self->SUPER::Limit(
+         ALIAS           => $CFs,
+         FIELD           => 'name',
+         VALUE           => $field,
+         ENTRYAGGREGATOR => 'AND',
+     );
 
-     $self->_OpenParen if ($null_columns_ok);
+     $self->_OpenParen if $null_columns_ok;
 
     $self->_SQLLimit(
         ALIAS      => $TicketCFs,
@@ -1317,7 +1322,9 @@
             ENTRYAGGREGATOR => 'OR',
         );
     }
-    $self->_CloseParen if ($null_columns_ok);
+    $self->_CloseParen if $null_columns_ok;
+
+    $self->_CloseParen;
 
 }
 
@@ -1356,7 +1363,7 @@
        } elsif ( $meta->[0] eq 'CUSTOMFIELD' ) {
            my ($queue, $field, $cfid ) = $self->_CustomFieldDecipher( $subkey );
            my $cfkey = $cfid ? $cfid : "$queue.$field";
-           my $TicketCFs = $self->_CustomFieldJoin( $cfkey, $cfid, $field );
+           my ($TicketCFs, $CFs) = $self->_CustomFieldJoin( $cfkey, $cfid, $field );
            unless ($cfid) {
              # For those cases where we are doing a join against the
              # CF name, and don't have a CFid, use Unique to make sure
@@ -1543,12 +1550,11 @@
         @_
     );
 
-    #TODO  VALUE should also take queue names and queue objects
-    #TODO FIXME why are we canonicalizing to name, not id, robrt?
-    if ( $args{VALUE} =~ /^\d+$/ ) {
+    #TODO  VALUE should also take queue objects
+    if ( defined $args{'VALUE'} && $args{'VALUE'} !~ /^\d+$/ ) {
         my $queue = new RT::Queue( $self->CurrentUser );
         $queue->Load( $args{'VALUE'} );
-        $args{VALUE} = $queue->Name;
+        $args{'VALUE'} = $queue->Id;
     }
 
     # What if they pass in an Id?  Check for isNum() and convert to
@@ -1558,10 +1564,10 @@
 
     $self->Limit(
         FIELD       => 'Queue',
-        VALUE       => $args{VALUE},
+        VALUE       => $args{'VALUE'},
         OPERATOR    => $args{'OPERATOR'},
         DESCRIPTION => join(
-            ' ', $self->loc('Queue'), $args{'OPERATOR'}, $args{VALUE},
+            ' ', $self->loc('Queue'), $args{'OPERATOR'}, $args{'VALUE'},
         ),
     );
 
@@ -2380,7 +2386,7 @@
     my $q = "";
     if ( $CF->Queue ) {
         my $qo = new RT::Queue( $self->CurrentUser );
-        $qo->load( $CF->Queue );
+        $qo->Load( $CF->Queue );
         $q = $qo->Name;
     }
 

Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/Users_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/Users_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/Users_Overlay.pm	Mon Feb  6 15:04:21 2006
@@ -88,10 +88,15 @@
 
     $self->{'princalias'} = $self->NewAlias('Principals');
 
+    # XXX: should be generalized
     $self->Join( ALIAS1 => 'main',
                  FIELD1 => 'id',
                  ALIAS2 => $self->{'princalias'},
                  FIELD2 => 'id' );
+    $self->Limit( ALIAS => $self->{'princalias'},
+                  FIELD => 'PrincipalType',
+                  VALUE => 'User',
+                );
 
     return (@result);
 }
@@ -102,9 +107,9 @@
 
 Returns the string that represents this Users object's primary "Principals" alias.
 
-
 =cut
 
+# XXX: should be generalized
 sub PrincipalsAlias {
     my $self = shift;
     return($self->{'princalias'});
@@ -141,10 +146,11 @@
 
 =cut
 
+# XXX: should be generalized
 sub LimitToEnabled {
     my $self = shift;
 
-    $self->Limit( ALIAS    => $self->{'princalias'},
+    $self->Limit( ALIAS    => $self->PrincipalsAlias,
                   FIELD    => 'Disabled',
                   VALUE    => '0',
                   OPERATOR => '=' );
@@ -187,7 +193,7 @@
     my $groupalias = $self->NewAlias('CachedGroupMembers');
 
     # Join the principal to the groups table
-    $self->Join( ALIAS1 => $self->{'princalias'},
+    $self->Join( ALIAS1 => $self->PrincipalsAlias,
                  FIELD1 => 'id',
                  ALIAS2 => $groupalias,
                  FIELD2 => 'MemberId' );
@@ -288,69 +294,75 @@
 
 =end testing
 
-
 find all users who the right Right for this group, either individually
 or as members of groups
 
-
 If passed a queue object, with no id, it will find users who have that right for _any_ queue
 
-
-
 =cut
 
-sub WhoHaveRight {
+# XXX: should be generalized
+sub _JoinGroupMembers
+{
     my $self = shift;
     my %args = (
-        Right                  => undef,
-        Object                 => undef,
-        IncludeSystemRights    => undef,
-        IncludeSuperusers      => undef,
         IncludeSubgroupMembers => 1,
-        EquivObjects           => [ ],
         @_
     );
 
-    if ( defined $args{'ObjectType'} || defined $args{'ObjectId'} ) {
-        $RT::Logger->crit( "$self WhoHaveRight called with the Obsolete ObjectId/ObjectType API");
-        return (undef);
-    }
-    
-
-    # Find only members of groups that have the right.
-
-    my $acl       = $self->NewAlias('ACL');
-    my $groups    = $self->NewAlias('Groups');
-    my $userprinc = $self->{'princalias'};
-
-# The cachedgroupmembers table is used for unrolling group memberships to allow fast lookups
-# if we bind to CachedGroupMembers, we'll find all members of groups recursively.
-# if we don't we'll find only 'direct' members of the group in question
-    my $cgm;
+    my $principals = $self->PrincipalsAlias;
 
+    # The cachedgroupmembers table is used for unrolling group memberships
+    # to allow fast lookups. if we bind to CachedGroupMembers, we'll find
+    # all members of groups recursively. if we don't we'll find only 'direct'
+    # members of the group in question
+    my $group_members;
     if ( $args{'IncludeSubgroupMembers'} ) {
-        $cgm = $self->NewAlias('CachedGroupMembers');
+        $group_members = $self->NewAlias('CachedGroupMembers');
     }
     else {
-        $cgm = $self->NewAlias('GroupMembers');
+        $group_members = $self->NewAlias('GroupMembers');
     }
 
-#Tie the users we're returning ($userprinc) to the groups that have rights granted to them ($groupprinc)
     $self->Join(
-        ALIAS1 => $cgm,
+        ALIAS1 => $group_members,
         FIELD1 => 'MemberId',
-        ALIAS2 => $userprinc,
+        ALIAS2 => $principals,
         FIELD2 => 'id'
     );
 
+    return $group_members;
+}
+
+# XXX: should be generalized
+sub _JoinGroups
+{
+    my $self = shift;
+    my %args = (@_);
+
+    my $group_members = $self->_JoinGroupMembers( %args );
+    my $groups = $self->NewAlias('Groups');
     $self->Join(
         ALIAS1 => $groups,
         FIELD1 => 'id',
-        ALIAS2 => $cgm,
+        ALIAS2 => $group_members,
         FIELD2 => 'GroupId'
     );
 
-# {{{ Find only rows where the right granted is the one we're looking up or _possibly_ superuser
+    return $groups;
+}
+
+# XXX: should be generalized
+sub _JoinACL
+{
+    my $self = shift;
+    my %args = (
+        Right                  => undef,
+        IncludeSuperusers      => undef,
+        @_,
+    );
+
+    my $acl = $self->NewAlias('ACL');
     $self->Limit(
         ALIAS    => $acl,
         FIELD    => 'RightName',
@@ -358,7 +370,6 @@
         VALUE => $args{Right} || 'NULL',
         ENTRYAGGREGATOR => 'OR'
     );
-
     if ( $args{'IncludeSuperusers'} and $args{'Right'} ) {
         $self->Limit(
             ALIAS           => $acl,
@@ -368,97 +379,240 @@
             ENTRYAGGREGATOR => 'OR'
         );
     }
+    return $acl;
+}
 
-    # }}}
-
-    my ( $or_check_ticket_roles, $or_check_roles );
-    my $which_object = "$acl.ObjectType = 'RT::System'";
+# XXX: should be generalized
+sub _GetEquivObjects
+{
+    my $self = shift;
+    my %args = (
+        Object                 => undef,
+        IncludeSystemRights    => undef,
+        EquivObjects           => [ ],
+        @_
+    );
+    return () unless $args{'Object'};
 
-    if ( defined $args{'Object'} ) {
-        if ( ref( $args{'Object'} ) eq 'RT::Ticket' ) {
-            $or_check_ticket_roles = " OR ( $groups.Domain = 'RT::Ticket-Role' AND $groups.Instance = " . $args{'Object'}->Id . ") ";
-
-# If we're looking at ticket rights, we also want to look at the associated queue rights.
-# this is a little bit hacky, but basically, now that we've done the ticket roles magic,
-# we load the queue object and ask all the rest of our questions about the queue.
-            $args{'Object'} = $args{'Object'}->QueueObj;
+    my @objects = ($args{'Object'});
+    if ( UNIVERSAL::isa( $args{'Object'}, 'RT::Ticket' ) ) {
+        # If we're looking at ticket rights, we also want to look at the associated queue rights.
+        # this is a little bit hacky, but basically, now that we've done the ticket roles magic,
+        # we load the queue object and ask all the rest of our questions about the queue.
+
+        # XXX: This should be abstracted into object itself
+        if( $args{'Object'}->id ) {
+            push @objects, $args{'Object'}->QueueObj;
+        } else {
+            push @objects, 'RT::Queue';
         }
+    }
 
-        # TODO XXX This really wants some refactoring
-        if ( ref( $args{'Object'} ) eq 'RT::Queue' ) {
-            $or_check_roles = " OR ( ( ($groups.Domain = 'RT::Queue-Role' ";
-            $or_check_roles .= "AND $groups.Instance = " . $args{'Object'}->id if ( $args{'Object'}->id );
-            $or_check_roles .= ") $or_check_ticket_roles ) " . " AND $groups.Type = $acl.PrincipalType) ";
-        }
-        if ( $args{'IncludeSystemRights'} ) {
-            $which_object .= ' OR ';
-        }
-        else {
-            $which_object = '';
-        }
-        foreach my $obj ( @{ $args{'EquivObjects'} } ) {
-            $which_object .= "($acl.ObjectType = '" . ref( $obj ) . "' AND $acl.ObjectId = " . $obj->id . ") OR ";
-        }
-        $which_object .= " ($acl.ObjectType = '" . ref( $args{'Object'} ) . "'";
-        if ( $args{'Object'}->id ) {
-            $which_object .= " AND $acl.ObjectId = " . $args{'Object'}->id;
-        }
+    if( $args{'IncludeSystemRights'} ) {
+        push @objects, 'RT::System';
+    }
+    push @objects, @{ $args{'EquivObjects'} };
+    return grep $_, @objects;
+}
+
+# XXX: should be generalized
+sub WhoHaveRight {
+    my $self = shift;
+    my %args = (
+        Right                  => undef,
+        Object                 => undef,
+        IncludeSystemRights    => undef,
+        IncludeSuperusers      => undef,
+        IncludeSubgroupMembers => 1,
+        EquivObjects           => [ ],
+        @_
+    );
 
-        $which_object .=  ") ";
+    if ( defined $args{'ObjectType'} || defined $args{'ObjectId'} ) {
+        $RT::Logger->crit( "WhoHaveRight called with the Obsolete ObjectId/ObjectType API");
+        return (undef);
     }
-    $self->_AddSubClause( "WhichObject", "($which_object)" );
-    $self->_AddSubClause(
-        "WhichGroup",
-            qq{ ( (    $acl.PrincipalId = $groups.id AND $acl.PrincipalType = 'Group' 
-                AND (   $groups.Domain = 'SystemInternal' OR $groups.Domain = 'UserDefined' OR $groups.Domain = 'ACLEquivalence')) 
-                $or_check_roles) }
+
+    my $from_role = $self->Clone;
+    $from_role->WhoHaveRoleRight( %args );
+
+    my $from_group = $self->Clone;
+    $from_group->WhoHaveGroupRight( %args );
+
+    #XXX: DIRTY HACK
+    use DBIx::SearchBuilder::Union;
+    my $union = new DBIx::SearchBuilder::Union;
+    $union->add($from_role);
+    $union->add($from_group);
+    %$self = %$union;
+    bless $self, ref($union);
+
+    return;
+}
+# }}}
+
+# XXX: should be generalized
+sub WhoHaveRoleRight
+{
+    my $self = shift;
+    my %args = (
+        Right                  => undef,
+        Object                 => undef,
+        IncludeSystemRights    => undef,
+        IncludeSuperusers      => undef,
+        IncludeSubgroupMembers => 1,
+        EquivObjects           => [ ],
+        @_
     );
-    # only include regular RT users
-    $self->LimitToEnabled;
+
+    my $groups = $self->_JoinGroups( %args );
+    my $acl = $self->_JoinACL( %args );
+
+    my ($check_roles, $check_objects) = ('','');
+    
+    my @objects = $self->_GetEquivObjects( %args );
+    if ( @objects ) {
+        my @role_clauses;
+        my @object_clauses;
+        foreach my $obj ( @objects ) {
+            my $type = ref($obj)? ref($obj): $obj;
+            my $id;
+            $id = $obj->id if ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id;
+
+            my $role_clause = "$groups.Domain = '$type-Role'";
+            # XXX: Groups.Instance is VARCHAR in DB, we should quote value
+            # if we want mysql 4.0 use indexes here. we MUST convert that
+            # field to integer and drop this quotes.
+            $role_clause   .= " AND $groups.Instance = '$id'" if $id;
+            push @role_clauses, "($role_clause)";
+
+            my $object_clause = "$acl.ObjectType = '$type'";
+            $object_clause   .= " AND $acl.ObjectId = $id" if $id;
+            push @object_clauses, "($object_clause)";
+        }
+
+        $check_roles .= join ' OR ', @role_clauses;
+        $check_objects = join ' OR ', @object_clauses;
+    } else {
+        if( !$args{'IncludeSystemRights'} ) {
+            $check_objects = "($acl.ObjectType != 'RT::System')";
+        }
+    }
+
+    $self->_AddSubClause( "WhichObject", "($check_objects)" );
+    $self->_AddSubClause( "WhichRole", "($check_roles)" );
+
+    $self->Limit( ALIAS => $acl,
+                  FIELD => 'PrincipalType',
+                  VALUE => "$groups.Type",
+                  QUOTEVALUE => 0,
+                );
 
     # no system user
-    $self->Limit( ALIAS => $userprinc, FIELD => 'id', OPERATOR => '!=', VALUE => $RT::SystemUser->id);
+    $self->Limit( ALIAS => $self->PrincipalsAlias,
+                  FIELD => 'id',
+                  OPERATOR => '!=',
+                  VALUE => $RT::SystemUser->id
+                );
+    return;
+}
 
+# XXX: should be generalized
+sub _JoinGroupMembersForGroupRights
+{
+    my $self = shift;
+    my %args = (@_);
+    my $group_members = $self->_JoinGroupMembers( %args );
+    $self->Limit( ALIAS => $args{'ACLAlias'},
+                  FIELD => 'PrincipalId',
+                  VALUE => "$group_members.GroupId",
+                  QUOTEVALUE => 0,
+                );
 }
-# }}}
 
-# {{{ WhoBelongToGroups 
+# XXX: should be generalized
+sub WhoHaveGroupRight
+{
+    my $self = shift;
+    my %args = (
+        Right                  => undef,
+        Object                 => undef,
+        IncludeSystemRights    => undef,
+        IncludeSuperusers      => undef,
+        IncludeSubgroupMembers => 1,
+        EquivObjects           => [ ],
+        @_
+    );
+
+    # Find only rows where the right granted is
+    # the one we're looking up or _possibly_ superuser
+    my $acl = $self->_JoinACL( %args );
+
+    my ($check_objects) = ('');
+    my @objects = $self->_GetEquivObjects( %args );
+
+    if ( @objects ) {
+        my @object_clauses;
+        foreach my $obj ( @objects ) {
+            my $type = ref($obj)? ref($obj): $obj;
+            my $id;
+            $id = $obj->id if ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id;
+
+            my $object_clause = "$acl.ObjectType = '$type'";
+            $object_clause   .= " AND $acl.ObjectId   = $id" if $id;
+            push @object_clauses, "($object_clause)";
+        }
+
+        $check_objects = join ' OR ', @object_clauses;
+    } else {
+        if( !$args{'IncludeSystemRights'} ) {
+            $check_objects = "($acl.ObjectType != 'RT::System')";
+        }
+    }
+    $self->_AddSubClause( "WhichObject", "($check_objects)" );
+    
+    $self->_JoinGroupMembersForGroupRights( %args, ACLAlias => $acl );
+    # Find only members of groups that have the right.
+    $self->Limit( ALIAS => $acl,
+                  FIELD => 'PrincipalType',
+                  VALUE => 'Group',
+                );
+    
+    # no system user
+    $self->Limit( ALIAS => $self->PrincipalsAlias,
+                  FIELD => 'id',
+                  OPERATOR => '!=',
+                  VALUE => $RT::SystemUser->id
+                );
+    return;
+}
+
+# {{{ WhoBelongToGroups
 
 =head2 WhoBelongToGroups { Groups => ARRAYREF, IncludeSubgroupMembers => 1 }
 
 =cut
 
+# XXX: should be generalized
 sub WhoBelongToGroups {
     my $self = shift;
     my %args = ( Groups                 => undef,
                  IncludeSubgroupMembers => 1,
                  @_ );
 
-    # Unprivileged users can't be granted real system rights. 
+    # Unprivileged users can't be granted real system rights.
     # is this really the right thing to be saying?
     $self->LimitToPrivileged();
 
-    my $userprinc  = $self->{'princalias'};
-    my $cgm;
-
-    # The cachedgroupmembers table is used for unrolling group memberships to allow fast lookups 
-    # if we bind to CachedGroupMembers, we'll find all members of groups recursively.
-    # if we don't we'll find only 'direct' members of the group in question
-
-    if ( $args{'IncludeSubgroupMembers'} ) {
-        $cgm = $self->NewAlias('CachedGroupMembers');
-    }
-    else {
-        $cgm = $self->NewAlias('GroupMembers');
-    }
-
-    #Tie the users we're returning ($userprinc) to the groups that have rights granted to them ($groupprinc)
-    $self->Join( ALIAS1 => $cgm, FIELD1 => 'MemberId',
-                 ALIAS2 => $userprinc, FIELD2 => 'id' );
+    my $group_members = $self->_JoinGroupMembers( %args );
 
     foreach my $groupid (@{$args{'Groups'}}) {
-        $self->Limit(ALIAS => $cgm, FIELD => 'GroupId', VALUE => $groupid, QUOTEVALUE => 0, ENTRYAGGREGATOR=> 'OR')
-
+        $self->Limit( ALIAS           => $group_members,
+                      FIELD           => 'GroupId',
+                      VALUE           => $groupid,
+                      QUOTEVALUE      => 0,
+                      ENTRYAGGREGATOR => 'OR',
+                    );
     }
 }
 # }}}

Modified: rt/branches/3.7-EXPERIMENTAL/lib/t/regression/06mailgateway.t
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/t/regression/06mailgateway.t	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/t/regression/06mailgateway.t	Mon Feb  6 15:04:21 2006
@@ -65,7 +65,7 @@
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate --url http://this.test.for.non-connection.is.expected.to.generate.an.error"), "Opened the mailgate - The error below is expected - $@");
 print MAIL <<EOF;
 From: root\@localhost
-To: rt\@example.com
+To: rt\@$RT::rtname
 Subject: This is a test of new ticket creation
 
 Foob!
@@ -81,7 +81,7 @@
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate  --debug --url $url --queue general --action correspond"), "Opened the mailgate - $@");
 print MAIL <<EOF;
 From: root\@localhost
-To: rt\@example.com
+To: rt\@$RT::rtname
 Subject: This is a test of new ticket creation
 
 Blah!
@@ -108,8 +108,8 @@
 
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate --url $url --queue general --action correspond"), "Opened the mailgate - $@");
 print MAIL <<EOF;
-From: doesnotexist\@example.com
-To: rt\@example.com
+From: doesnotexist\@$RT::rtname
+To: rt\@$RT::rtname
 Subject: This is a test of new ticket creation as an unknown user
 
 Blah!
@@ -126,7 +126,7 @@
 ok ($tick->Id, "found ticket ".$tick->Id);
 ok ($tick->Subject ne 'This is a test of new ticket creation as an unknown user', "failed to create the new ticket from an unprivileged account");
 my $u = RT::User->new($RT::SystemUser);
-$u->Load('doesnotexist at example.com');
+$u->Load("doesnotexist\@$RT::rtname");
 ok( $u->Id == 0, " user does not exist and was not created by failed ticket submission");
 
 
@@ -144,8 +144,8 @@
 
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate --url $url --queue general --action correspond"), "Opened the mailgate - $@");
 print MAIL <<EOF;
-From: doesnotexist\@example.com
-To: rt\@example.com
+From: doesnotexist\@$RT::rtname
+To: rt\@$RT::rtname
 Subject: This is a test of new ticket creation as an unknown user
 
 Blah!
@@ -163,7 +163,7 @@
 ok ($tick->Id, "found ticket ".$tick->Id);
 ok ($tick->Subject eq 'This is a test of new ticket creation as an unknown user', "failed to create the new ticket from an unprivileged account");
  $u = RT::User->new($RT::SystemUser);
-$u->Load('doesnotexist at example.com');
+$u->Load("doesnotexist\@$RT::rtname");
 ok( $u->Id != 0, " user does not exist and was created by ticket submission");
 
 # }}}
@@ -177,9 +177,9 @@
 
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate --url $url --queue general --action correspond"), "Opened the mailgate - $@");
 print MAIL <<EOF;
-From: doesnotexist-2\@example.com
-To: rt\@example.com
-Subject: [example.com #@{[$tick->Id]}] This is a test of a reply as an unknown user
+From: doesnotexist-2\@$RT::rtname
+To: rt\@$RT::rtname
+Subject: [$RT::rtname #@{[$tick->Id]}] This is a test of a reply as an unknown user
 
 Blah!  (Should not work.)
 Foob!
@@ -189,7 +189,7 @@
 is ($? >> 8, 0, "The mail gateway exited normally. yay");
 
 $u = RT::User->new($RT::SystemUser);
-$u->Load('doesnotexist-2 at example.com');
+$u->Load('doesnotexist-2@$RT::rtname');
 ok( $u->Id == 0, " user does not exist and was not created by ticket correspondence submission");
 # }}}
 
@@ -202,9 +202,9 @@
 
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate --url $url --queue general --action correspond"), "Opened the mailgate - $@");
 print MAIL <<EOF;
-From: doesnotexist-2\@example.com
-To: rt\@example.com
-Subject: [example.com #@{[$tick->Id]}] This is a test of a reply as an unknown user
+From: doesnotexist-2\@$RT::rtname
+To: rt\@$RT::rtname
+Subject: [$RT::rtname #@{[$tick->Id]}] This is a test of a reply as an unknown user
 
 Blah!
 Foob!
@@ -215,7 +215,7 @@
 
 
 $u = RT::User->new($RT::SystemUser);
-$u->Load('doesnotexist-2 at example.com');
+$u->Load("doesnotexist-2\@$RT::rtname");
 ok( $u->Id != 0, " user exists and was created by ticket correspondence submission");
 
 # }}}
@@ -228,9 +228,9 @@
 
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate --url $url --queue general --action comment"), "Opened the mailgate - $@");
 print MAIL <<EOF;
-From: doesnotexist-3\@example.com
-To: rt\@example.com
-Subject: [example.com #@{[$tick->Id]}] This is a test of a comment as an unknown user
+From: doesnotexist-3\@$RT::rtname
+To: rt\@$RT::rtname
+Subject: [$RT::rtname #@{[$tick->Id]}] This is a test of a comment as an unknown user
 
 Blah!  (Should not work.)
 Foob!
@@ -241,7 +241,7 @@
 is ($? >> 8, 0, "The mail gateway exited normally. yay");
 
 $u = RT::User->new($RT::SystemUser);
-$u->Load('doesnotexist-3 at example.com');
+$u->Load("doesnotexist-3\@$RT::rtname");
 ok( $u->Id == 0, " user does not exist and was not created by ticket comment submission");
 
 # }}}
@@ -253,9 +253,9 @@
 
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate --url $url --queue general --action comment"), "Opened the mailgate - $@");
 print MAIL <<EOF;
-From: doesnotexist-3\@example.com
-To: rt\@example.com
-Subject: [example.com #@{[$tick->Id]}] This is a test of a comment as an unknown user
+From: doesnotexist-3\@$RT::rtname
+To: rt\@$RT::rtname
+Subject: [$RT::rtname #@{[$tick->Id]}] This is a test of a comment as an unknown user
 
 Blah!
 Foob!
@@ -266,7 +266,7 @@
 is ($? >> 8, 0, "The mail gateway exited normally. yay");
 
 $u = RT::User->new($RT::SystemUser);
-$u->Load('doesnotexist-3 at example.com');
+$u->Load("doesnotexist-3\@$RT::rtname");
 ok( $u->Id != 0, " user exists and was created by ticket comment submission");
 
 # }}}
@@ -354,7 +354,7 @@
                                                                          
 print MAIL <<EOF;
 From: root\@localhost
-To: rtemail\@example.com
+To: rtemail\@$RT::rtname
 Subject: This is a test of I18N ticket creation
 Content-Type: text/plain; charset="utf-8"
 
@@ -388,7 +388,7 @@
                                                                          
 print MAIL <<EOF;
 From: root\@localhost
-To: rtemail\@example.com
+To: rtemail\@$RT::rtname
 Subject: This is a test of I18N ticket creation
 Content-Type: text/plain; charset="utf-8"
 
@@ -439,7 +439,7 @@
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate --url $url --queue general --action take"), "Opened the mailgate - $@");
 print MAIL <<EOF;
 From: root\@localhost
-Subject: [example.com \#$id] test
+Subject: [$RT::rtname \#$id] test
 
 EOF
 close (MAIL);
@@ -462,7 +462,7 @@
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate --url $url --queue general --action take-correspond"), "Opened the mailgate - $@");
 print MAIL <<EOF;
 From: root\@localhost
-Subject: [example.com \#$id] correspondence
+Subject: [$RT::rtname \#$id] correspondence
 
 test
 EOF
@@ -475,14 +475,14 @@
 is( $tick->OwnerObj->EmailAddress, 'root at localhost', 'successfuly take ticket via email');
 my $txns = $tick->Transactions;
 $txns->Limit( FIELD => 'Type', VALUE => 'Correspond');
-is( $txns->Last->Subject, "[example.com \#$id] correspondence", 'successfuly add correspond within take via email' );
+is( $txns->Last->Subject, "[$RT::rtname \#$id] correspondence", 'successfuly add correspond within take via email' );
 # +1 because of auto open
 is( $tick->Transactions->Count, 6, 'no superfluous transactions');
 
 ok(open(MAIL, "|$RT::BinPath/rt-mailgate --url $url --queue general --action resolve --debug"), "Opened the mailgate - $@");
 print MAIL <<EOF;
 From: root\@localhost
-Subject: [example.com \#$id] test
+Subject: [$RT::rtname \#$id] test
 
 EOF
 close (MAIL);

Modified: rt/branches/3.7-EXPERIMENTAL/lib/t/regression/07acl.t
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/t/regression/07acl.t	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/t/regression/07acl.t	Mon Feb  6 15:04:21 2006
@@ -33,9 +33,9 @@
 login($agent, $user_obj);
 
 # Test for absence of Configure and Preferences tabs.
-ok(!$agent->find_link( url => '/Admin/',
+ok(!$agent->find_link( url => "$RT::WebPath/Admin/",
 		       text => 'Configuration'), "No config tab" );
-ok(!$agent->find_link( url => '/User/Prefs.html',
+ok(!$agent->find_link( url => "$RT::WebPath/User/Prefs.html",
 		       text => 'Preferences'), "No prefs pane" );
 
 # Now test for their presence, one at a time.  Sleep for a bit after
@@ -47,10 +47,7 @@
 $agent->reload;
 
 ok($agent->{'content'} =~ /Logout/i, "Reloaded page successfully");
-
-
-
-ok($agent->find_link( url => '/Admin/',
+ok($agent->find_link( url => "$RT::WebPath/Admin/",
 		       text => 'Configuration'), "Found config tab" );
 my ($revokeid,$revokemsg) =$user_obj->PrincipalObj->RevokeRight(Right => 'ShowConfigTab');
 ok ($revokeid,$revokemsg);
@@ -58,12 +55,12 @@
 ok ($grantid,$grantmsg);
 $agent->reload();
 ok($agent->{'content'} =~ /Logout/i, "Reloaded page successfully");
-ok($agent->find_link( url => '/User/Prefs.html',
+ok($agent->find_link( url => "$RT::WebPath/User/Prefs.html",
 		       text => 'Preferences'), "Found prefs pane" );
 ($revokeid,$revokemsg) = $user_obj->PrincipalObj->RevokeRight(Right => 'ModifySelf');
 ok ($revokeid,$revokemsg);
 # Good.  Now load the search page and test Load/Save Search.
-$agent->follow_link( url => '/Search/Build.html',
+$agent->follow_link( url => "$RT::WebPath/Search/Build.html",
 		     text => 'Tickets');
 is($agent->{'status'}, 200, "Fetched search builder page");
 ok($agent->{'content'} !~ /Load saved search/i, "No search loading box");

Modified: rt/branches/3.7-EXPERIMENTAL/lib/t/regression/07rights.t
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/t/regression/07rights.t	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/t/regression/07rights.t	Mon Feb  6 15:04:21 2006
@@ -45,7 +45,7 @@
 # 
 # END BPS TAGGED BLOCK }}}
 
-use Test::More tests => 14;
+use Test::More tests => 26;
 use RT;
 RT::LoadConfig();
 RT::Init();
@@ -108,3 +108,33 @@
 
 ok( $user->HasRight( Right => 'ReplyToTicket', Object => $ticket ), "user is owner and can reply to ticket" );
 
+# Testing of EquivObjects
+$group = RT::Group->new( $RT::SystemUser );
+ok( $group->LoadQueueRoleGroup( Queue => $queue_id, Type=> 'AdminCc' ), "load queue AdminCc role group" );
+$ace = RT::ACE->new( $RT::SystemUser );
+my ($ace_id, $msg) = $group->PrincipalObj->GrantRight( Right => 'ModifyTicket', Object => $queue );
+ok( $ace_id, "Granted queue AdminCc role group with ModifyTicket right: $msg" );
+ok( $group->PrincipalObj->HasRight( Right => 'ModifyTicket', Object => $queue ), "role group can modify ticket" );
+ok( !$user->HasRight( Right => 'ModifyTicket', Object => $ticket ), "user is not AdminCc and can't modify ticket" );
+($status, $msg) = $ticket->AddWatcher(Type => 'AdminCc', PrincipalId => $user->PrincipalId);
+ok( $status, "successfuly added user as AdminCc");
+ok( $user->HasRight( Right => 'ModifyTicket', Object => $ticket ), "user is AdminCc and can modify ticket" );
+
+my $ticket2 = RT::Ticket->new($RT::SystemUser);
+my ($ticket2_id) = $ticket2->Create( Queue => $queue_id, Subject => 'test2');
+ok( $ticket2_id, 'new ticket created' );
+ok( !$user->HasRight( Right => 'ModifyTicket', Object => $ticket2 ), "user is not AdminCc and can't modify ticket2" );
+
+# now we can finally test EquivObjects
+my $equiv = [ $ticket ];
+ok( $user->HasRight( Right => 'ModifyTicket', Object => $ticket2, EquivObjects => $equiv ), 
+    "user is not AdminCc but can modify ticket2 because of EquivObjects" );
+
+# the first a third test below are the same, so they should both pass
+my $equiv2 = [];
+ok( !$user->HasRight( Right => 'ModifyTicket', Object => $ticket2, EquivObjects => $equiv2 ), 
+    "user is not AdminCc and can't modify ticket2" );
+ok( $user->HasRight( Right => 'ModifyTicket', Object => $ticket, EquivObjects => $equiv2 ), 
+    "user is AdminCc and can modify ticket" );
+ok( !$user->HasRight( Right => 'ModifyTicket', Object => $ticket2, EquivObjects => $equiv2 ), 
+    "user is not AdminCc and can't modify ticket2 (same question different answer)" );

Modified: rt/branches/3.7-EXPERIMENTAL/lib/t/regression/09record_cf_api.t
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/t/regression/09record_cf_api.t	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/t/regression/09record_cf_api.t	Mon Feb  6 15:04:21 2006
@@ -2,7 +2,7 @@
 
 use strict;
 use warnings FATAL => 'all';
-use Test::More tests => 131;
+use Test::More tests => 133;
 
 use RT;
 RT::LoadConfig();
@@ -21,6 +21,9 @@
 $queue->Create( Name => 'RecordCustomFields-'.$$ );
 ok ($queue->id, "Created the queue");
 
+my $queue2 = RT::Queue->new( $RT::SystemUser );
+$queue2->Create( Name => 'RecordCustomFields2' );
+
 my $ticket = RT::Ticket->new( $RT::SystemUser );
 $ticket->Create(
 	Queue => $queue->Id,
@@ -51,6 +54,11 @@
 $global_cf3->AddValue( Name => 'RecordCustomFieldValues31' );
 $global_cf3->AddValue( Name => 'RecordCustomFieldValues32' );
 
+my $local_cf4 = RT::CustomField->new( $RT::SystemUser );
+$local_cf4->Create( Name => 'RecordCustomFields4', Type => 'SelectSingle', Queue => $queue2->id );
+$local_cf4->AddValue( Name => 'RecordCustomFieldValues41' );
+$local_cf4->AddValue( Name => 'RecordCustomFieldValues42' );
+
 
 my @custom_fields = ($local_cf1, $local_cf2, $global_cf3);
 
@@ -178,6 +186,14 @@
 # lets test cycle via CF object reference
 $test_add_delete_cycle->( sub { return $_[0] } );
 
+$ticket->AddCustomFieldValue( Field => $local_cf2->id , Value => 'Baz' );
+$ticket->AddCustomFieldValue( Field => $global_cf3->id , Value => 'Baz' );
+# now if we ask for cf values on RecordCustomFields4 we should not get any
+$cfvs = $ticket->CustomFieldValues( 'RecordCustomFields4' );
+is( $cfvs->Count, 0, "No custom field values for non-Queue cf" );
+is( $ticket->FirstCustomFieldValue( 'RecordCustomFields4' ), undef, "No first custom field value for non-Queue cf" );
+
+
 #SKIP: {
 #	skip "TODO: should we add CF values to objects via CF Name?", 48;
 # names are not unique

Modified: rt/branches/3.7-EXPERIMENTAL/lib/t/regression/12-search.t
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/t/regression/12-search.t	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/t/regression/12-search.t	Mon Feb  6 15:04:21 2006
@@ -6,7 +6,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 35;
+use Test::More tests => 39;
 use_ok('RT');
 RT::LoadConfig();
 RT::Init();
@@ -38,6 +38,24 @@
 my $cflabel3 = "CustomField-".$cf3->id;
 
 
+# There was a bug involving a missing join to ObjectCustomFields that
+# caused spurious results on negative searches if another custom field
+# with the same name existed on a different queue.  Hence, we make
+# duplicate CFs on a different queue here
+my $dup = RT::Queue->new($RT::SystemUser);
+$dup->Create(Name => $queue . "-Copy");
+ok ($dup->id, "Created the duplicate queue");
+my $dupcf = RT::CustomField->new($RT::SystemUser);
+$dupcf->Create(Name => 'SearchTest', Type => 'Freeform', MaxValues => 0, Queue => $dup->id);
+ok($dupcf->id, "Created the duplicate SearchTest CF");
+$dupcf = RT::CustomField->new($RT::SystemUser);
+$dupcf->Create(Name => 'SearchTest2', Type => 'Freeform', MaxValues => 0, Queue => $dup->id);
+ok($dupcf->id, "Created the SearchTest2 CF");
+$dupcf = RT::CustomField->new($RT::SystemUser);
+$dupcf->Create(Name => 'SearchTest3', Type => 'Freeform', MaxValues => 0, Queue => $dup->id);
+ok($dupcf->id, "Created the SearchTest3 CF");
+
+
 # setup some tickets
 # we'll need a small pile of them, to test various combinations and nulls.
 # there's probably a way to think harder and do this with fewer
@@ -148,8 +166,7 @@
 
 $tix = RT::Tickets->new($RT::SystemUser);
 $tix->FromSQL("Queue = '$queue' AND CF.SearchTest IS NULL");
-    
-    is($tix->Count, 2, "IS null CF");
+is($tix->Count, 2, "IS null CF");
 
 $tix = RT::Tickets->new($RT::SystemUser);
 $tix->FromSQL("Queue = '$queue' AND Requestors LIKE 'search1'");
@@ -218,13 +235,11 @@
 
 $tix = RT::Tickets->new($RT::SystemUser);
 $tix->FromSQL("CF.SearchTest IS NULL AND CF.SearchTest2 = 'bar2'");
-    
-    is($tix->Count, 1, "null cf and is cf");
+is($tix->Count, 1, "null cf and is cf");
 
 
 $tix = RT::Tickets->new($RT::SystemUser);
 $tix->FromSQL("Queue = '$queue' AND CF.SearchTest IS NULL AND CF.SearchTest2 IS NULL");
-
-        is($tix->Count, 1, "null cf and null cf"); 
+is($tix->Count, 1, "null cf and null cf"); 
 
 

Added: rt/branches/3.7-EXPERIMENTAL/lib/t/regression/14linking.t
==============================================================================
--- (empty file)
+++ rt/branches/3.7-EXPERIMENTAL/lib/t/regression/14linking.t	Mon Feb  6 15:04:21 2006
@@ -0,0 +1,143 @@
+use Test::More  tests => '39';
+use_ok('RT');
+use_ok('RT::Ticket');
+use_ok('RT::ScripConditions');
+use_ok('RT::ScripActions');
+use_ok('RT::Template');
+use_ok('RT::Scrips');
+use_ok('RT::Scrip');
+RT::LoadConfig();
+RT::Init();
+
+use File::Temp qw/tempfile/;
+my ($fh, $filename) = tempfile( UNLINK => 1, SUFFIX => '.rt');
+my $link_scrips_orig = $RT::LinkTransactionsRun1Scrip;
+$RT::LinkTransactionsRun1Scrip = 1;
+
+my $condition = RT::ScripCondition->new( $RT::SystemUser );
+$condition->Load('User Defined');
+ok($condition->id);
+my $action = RT::ScripAction->new( $RT::SystemUser );
+$action->Load('User Defined');
+ok($action->id);
+my $template = RT::Template->new( $RT::SystemUser );
+$template->Load('Blank');
+ok($template->id);
+
+my $q1 = RT::Queue->new($RT::SystemUser);
+my ($id,$msg) = $q1->Create(Name => "LinkTest1.$$");
+ok ($id,$msg);
+my $q2 = RT::Queue->new($RT::SystemUser);
+($id,$msg) = $q2->Create(Name => "LinkTest2.$$");
+ok ($id,$msg);
+
+my $commit_code = <<END;
+open(FILE, "<$filename");
+my \$data = <FILE>;
+chomp \$data;
+close FILE;
+open(FILE, ">$filename");
+if (\$self->TransactionObj->Type eq 'AddLink') {
+    print FILE \$data+1, "\n";
+}
+else {
+    print FILE \$data-1, "\n";
+}
+close FILE;
+1;
+END
+
+my $Scrips = RT::Scrips->new( $RT::SystemUser );
+$Scrips->UnLimit;
+while ( my $Scrip = $Scrips->Next ) {
+    $Scrip->Delete if $Scrip->Description =~ /Add or Delete Link \d+/;
+}
+
+
+my $scrip = RT::Scrip->new($RT::SystemUser);
+($id,$msg) = $scrip->Create( Description => "Add or Delete Link $$",
+                          ScripCondition => $condition->id,
+                          ScripAction    => $action->id,
+                          Template       => $template->id,
+                          Stage          => 'TransactionCreate',
+                          Queue          => 0,
+                  CustomIsApplicableCode => '$self->TransactionObj->Type =~ /(Add|Delete)Link/;',
+                       CustomPrepareCode => '1;',
+                       CustomCommitCode  => $commit_code,
+                           );
+ok($id, "Scrip created");
+
+my $u1 = RT::User->new($RT::SystemUser);
+($id,$msg) =$u1->Create(Name => "LinkTestUser.$$");
+
+ok ($id,$msg);
+
+($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q1, Right => 'CreateTicket');
+ok ($id,$msg);
+($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q1, Right => 'ModifyTicket');
+ok ($id,$msg);
+
+my $tid;
+
+my $creator = RT::CurrentUser->new($u1->id);
+
+my $ticket = RT::Ticket->new( $creator);
+ok($ticket->isa('RT::Ticket'));
+($id,$tid, $msg) = $ticket->Create(Subject => 'Link test 1', Queue => $q1->id);
+ok ($id,$msg);
+
+
+my $ticket2 = RT::Ticket->new($RT::SystemUser);
+($id, $tid, $msg) = $ticket2->Create(Subject => 'Link test 2', Queue => $q2->id);
+ok ($id, $msg);
+
+($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
+ok(!$id,$msg);
+ok(link_count($filename) == 0, "scrips ok");
+($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q2, Right => 'CreateTicket');
+ok ($id,$msg);
+($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q2, Right => 'ModifyTicket');
+ok ($id,$msg);
+($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
+ok($id,$msg);
+ok(link_count($filename) == 1, "scrips ok");
+($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => -1);
+ok(!$id,$msg);
+ok(link_count($filename) == 1, "scrips ok");
+
+my $transactions = $ticket2->Transactions;
+$transactions->Limit( FIELD => 'Type', VALUE => 'AddLink' );
+ok( $transactions->Count == 1, "Transaction found in other ticket" );
+ok( $transactions->First->Field eq 'ReferredToBy');
+ok( $transactions->First->NewValue eq $ticket->URI );
+
+($id,$msg) =$ticket->DeleteLink(Type => 'RefersTo', Target => $ticket2->id);
+ok($id,$msg);
+ok(link_count($filename) == 0, "scrips ok");
+$transactions = $ticket2->Transactions;
+$transactions->Limit( FIELD => 'Type', VALUE => 'DeleteLink' );
+ok( $transactions->Count == 1, "Transaction found in other ticket" );
+ok( $transactions->First->Field eq 'ReferredToBy');
+ok( $transactions->First->OldValue eq $ticket->URI );
+
+$RT::LinkTransactionsRun1Scrip = 0;
+($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
+ok($id,$msg);
+ok(link_count($filename) == 2, "scrips ok");
+($id,$msg) =$ticket->DeleteLink(Type => 'RefersTo', Target => $ticket2->id);
+ok($id,$msg);
+ok(link_count($filename) == 0, "scrips ok");
+
+# restore
+$RT::LinkTransactionsRun1Scrip = $link_scrips_orig;
+
+sub link_count {
+
+    my $file = shift;
+    open(FILE, "<$file");
+    my $data = <FILE>;
+    chomp $data;
+    return $data + 0;
+    close FILE;
+
+}

Modified: rt/branches/3.7-EXPERIMENTAL/lib/t/regression/20-sort-by-requestor.t
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/t/regression/20-sort-by-requestor.t	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/t/regression/20-sort-by-requestor.t	Mon Feb  6 15:04:21 2006
@@ -11,9 +11,10 @@
 my $queue = 'SearchTests-'.rand(200);
 $q->Create(Name => $queue);
 
-my @requestors = ( ('bravo at example.com') x 5, ('alpha at example.com') x 5,
-                   ('delta at example.com') x 5, ('charlie at example.com') x 5);
-my @subjects = ("first test", "second test", "third test", "fourth test") x 5;
+my @requestors = ( ('bravo at example.com') x 6, ('alpha at example.com') x 6,
+                   ('delta at example.com') x 6, ('charlie at example.com') x 6,
+                   (undef) x 6);
+my @subjects = ("first test", "second test", "third test", "fourth test", "fifth test") x 6;
 while (@requestors) {
     my $t = RT::Ticket->new($RT::SystemUser);
     my ( $id, undef $msg ) = $t->Create(
@@ -27,7 +28,7 @@
 {
     my $tix = RT::Tickets->new($RT::SystemUser);
     $tix->FromSQL("Queue = '$queue'");
-    is($tix->Count, 20, "found twenty tickets");
+    is($tix->Count, 30, "found thirty tickets");
 }
 
 {
@@ -36,7 +37,7 @@
     $tix->OrderByCols({ FIELD => "Subject" });
     my @subjects;
     while (my $t = $tix->Next) { push @subjects, $t->Subject; }
-    is(@subjects, 5, "found five tickets");
+    is(@subjects, 6, "found six tickets");
     is_deeply( \@subjects, [ sort @subjects ], "Subjects are sorted");
 }
 
@@ -45,7 +46,7 @@
     my ($tix,$count,$order) = (@_);
     my @mails;
     while (my $t = $tix->Next) { push @mails, $t->RequestorAddresses; }
-    is(@mails, $count, "found $count tickets");
+    is(@mails, $count, "found $count tickets for ". $tix->Query);
     my @required_order;
     if( $order =~ /asc/i ) {
         @required_order = sort { $a? ($b? ($a cmp $b) : -1) : 1} @mails;
@@ -72,24 +73,13 @@
     my $tix = RT::Tickets->new($RT::SystemUser);
     $tix->FromSQL("Queue = '$queue' AND Subject = 'first test'");
     $tix->OrderByCols({ FIELD => "Requestor.EmailAddress" });
-    check_emails_order($tix, 5, 'ASC');
+    check_emails_order($tix, 6, 'ASC');
     $tix->OrderByCols({ FIELD => "Requestor.EmailAddress", ORDER => 'DESC' });
-    check_emails_order($tix, 5, 'DESC');
+    check_emails_order($tix, 6, 'DESC');
 }
 
 
 {
-    # create ticket with empty requestor list
-    my $t = RT::Ticket->new($RT::SystemUser);
-    my ( $id, $msg ) = $t->Create(
-        Queue      => $q->id,
-        Subject    => "first test",
-    );
-    ok( $id, "ticket created" ) or diag( "error: $msg" );
-    is( $t->RequestorAddresses, '', "requestor address is empty" );
-}
-
-{
     my $tix = RT::Tickets->new($RT::SystemUser);
     $tix->FromSQL("Queue = '$queue' AND Subject = 'first test'");
     $tix->OrderByCols({ FIELD => "Requestor.EmailAddress" });
@@ -128,4 +118,15 @@
     $tix->OrderByCols({ FIELD => "Requestor.EmailAddress", ORDER => 'DESC' });
     check_emails_order($tix, 7, 'DESC');
 
+{
+    my $tix = RT::Tickets->new($RT::SystemUser);
+    $tix->FromSQL("Queue = '$queue'");
+    $tix->OrderByCols({ FIELD => "Requestor.EmailAddress" });
+    $tix->RowsPerPage(30);
+    my @mails;
+    while (my $t = $tix->Next) { push @mails, $t->RequestorAddresses; }
+    is(@mails, 30, "found thirty tickets");
+    is_deeply( [grep {$_} @mails], [ sort grep {$_} @mails ], "Paging works (exclude nulls, which are db-dependant)");
+}
+
 # vim:ft=perl:

Modified: rt/branches/3.7-EXPERIMENTAL/lib/t/regression/22search_tix_by_txn.t
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/t/regression/22search_tix_by_txn.t	(original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/t/regression/22search_tix_by_txn.t	Mon Feb  6 15:04:21 2006
@@ -1,6 +1,6 @@
 #use Test::More tests => 26;
 use Test::More qw/no_plan/;
-
+$ENV{'TZ'} = 'GMT';
 use RT;
 RT::LoadConfig();
 RT::Init();

Added: rt/branches/3.7-EXPERIMENTAL/lib/t/regression/23-batch-upload-csv.t
==============================================================================
--- (empty file)
+++ rt/branches/3.7-EXPERIMENTAL/lib/t/regression/23-batch-upload-csv.t	Mon Feb  6 15:04:21 2006
@@ -0,0 +1,46 @@
+#!/usr/bin/perl -w
+use strict; use warnings;
+
+use Test::More qw/no_plan/;
+use_ok('RT');
+RT::LoadConfig();
+RT::Init();
+use_ok('RT::Action::CreateTickets');
+
+my $QUEUE = 'uploadtest-'.$$;
+
+my $queue_obj = RT::Queue->new($RT::SystemUser);
+$queue_obj->Create(Name => $QUEUE);
+
+my $cf = RT::CustomField->new($RT::SystemUser);
+my ($val,$msg)  = $cf->Create(Name => 'Work Package-'.$$, Type => 'Freeform', LookupType => RT::Ticket->CustomFieldLookupType, MaxValues => 1);
+ok($cf->id);
+ok($val,$msg);
+($val, $msg) = $cf->AddToObject($queue_obj);
+ok($val,$msg);
+ok($queue_obj->TicketCustomFields()->Count, "We have a custom field, at least");
+
+
+my $data = <<EOF;
+id,Queue,Subject,Status,Requestor,@{[$cf->Name]}
+create-1,$QUEUE,hi,new,root,2.0
+create-2,$QUEUE,hello,new,root,3.0
+EOF
+
+my $action = RT::Action::CreateTickets->new(CurrentUser => RT::CurrentUser->new('root'));
+ok ($action->CurrentUser->id , "WE have a current user");
+ 
+$action->Parse(Content => $data);
+my @results = $action->CreateByTemplate();
+
+my $tix = RT::Tickets->new($RT::SystemUser);
+$tix->FromSQL ("Queue = '". $QUEUE."'");
+ok($tix->Count);
+my $first = $tix->First();
+is($first->Subject(), 'hi'); 
+is($first->FirstCustomFieldValue($cf->id), '2.0');
+
+my $second = $tix->Next;
+is($second->Subject(), 'hello'); 
+is($second->FirstCustomFieldValue($cf->id), '3.0');
+1;

Added: rt/branches/3.7-EXPERIMENTAL/lib/t/regression/25scrip_order.t
==============================================================================
--- (empty file)
+++ rt/branches/3.7-EXPERIMENTAL/lib/t/regression/25scrip_order.t	Mon Feb  6 15:04:21 2006
@@ -0,0 +1,57 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More qw/no_plan/;
+
+use RT;
+RT::LoadConfig();
+RT::Init;
+
+# {{{ test scrip ordering based on description
+
+my $scrip_queue = RT::Queue->new($RT::SystemUser);
+my ($queue_id, $msg) = $scrip_queue->Create( Name => "ScripOrdering-$$", 
+    Description => 'Test scrip ordering by description' );
+ok($queue_id, "Created scrip-ordering test queue? ".$msg);
+
+my $priority_ten_scrip = RT::Scrip->new($RT::SystemUser);
+(my $id, $msg) = $priority_ten_scrip->Create( 
+    Description => "10 set priority $$",
+    Queue => $queue_id, 
+    ScripCondition => 'On Create',
+    ScripAction => 'User Defined', 
+    CustomPrepareCode => '$RT::Logger->debug("Setting priority to 10..."); return 1;',
+    CustomCommitCode => '$self->TicketObj->SetPriority(10);',
+    Template => 'Blank',
+    Stage => 'TransactionCreate',
+);
+ok($id, "Created priority-10 scrip? ".$msg);
+
+my $priority_five_scrip = RT::Scrip->new($RT::SystemUser);
+($id, $msg) = $priority_ten_scrip->Create( 
+    Description => "05 set priority $$",
+    Queue => $queue_id, 
+    ScripCondition => 'On Create',
+    ScripAction => 'User Defined', 
+    CustomPrepareCode => '$RT::Logger->debug("Setting priority to 5..."); return 1;',
+    CustomCommitCode => '$self->TicketObj->SetPriority(5);', 
+    Template => 'Blank',
+    Stage => 'TransactionCreate',
+);
+ok($id, "Created priority-5 scrip? ".$msg);
+
+my $ticket = RT::Ticket->new($RT::SystemUser);
+($id, $msg) = $ticket->Create( 
+    Queue => $queue_id, 
+    Requestor => 'order at example.com',
+    Subject => "Scrip order test $$",
+);
+ok($ticket->id, "Created ticket? id=$id");
+
+ok($ticket->Priority != 0, "Ticket shouldn't be priority 0");
+ok($ticket->Priority != 5, "Ticket shouldn't be priority 5");
+ok($ticket->Priority == 10, "Ticket should be priority 10");
+
+# }}}
+
+1;

Modified: rt/branches/3.7-EXPERIMENTAL/releng.cnf
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/releng.cnf	(original)
+++ rt/branches/3.7-EXPERIMENTAL/releng.cnf	Mon Feb  6 15:04:21 2006
@@ -1,5 +1,5 @@
 PRODUCT			        = rt
-TAG			            = 3.5.5
+TAG			            = 3.5.7
 CANONICAL_REPO		    = svn+ssh://svn.bestpractical.com/svn/bps-public/rt/
 TAGS		            = tags/
 TRUNK	                = branches/3.5-TESTING

Modified: rt/branches/3.7-EXPERIMENTAL/sbin/rt-setup-database.in
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/sbin/rt-setup-database.in	(original)
+++ rt/branches/3.7-EXPERIMENTAL/sbin/rt-setup-database.in	Mon Feb  6 15:04:21 2006
@@ -126,7 +126,14 @@
     unless ($db_type eq 'SQLite') {
 
         $dbh->disconnect;
+
+	if ($RT::DatabaseType eq "Oracle") {
+        $RT::DatabasePassword = $RT::DatabasePassword; #Warning avidance
+        $dbh = DBI->connect( $Handle->DSN, ${RT::DatabaseUser}, ${RT::DatabasePassword} ) || die $DBI::errstr;
+	} else {
+	
         $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} ) || die $DBI::errstr;
+	}
     }
     print "Now populating database schema.\n";
     insert_schema();

Modified: rt/branches/3.7-EXPERIMENTAL/sbin/rt-test-dependencies.in
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/sbin/rt-test-dependencies.in	(original)
+++ rt/branches/3.7-EXPERIMENTAL/sbin/rt-test-dependencies.in	Mon Feb  6 15:04:21 2006
@@ -160,7 +160,7 @@
 DBI 1.37
 Test::Inline
 Class::ReturnValue 0.40
-DBIx::SearchBuilder 1.27
+DBIx::SearchBuilder 1.35
 Text::Template
 File::Spec 0.8
 HTML::Entities 


More information about the Rt-commit mailing list