Commit Graph

5226 Commits (b6e24c6946606cd504d522451c36b6dc574fe75d)

Author SHA1 Message Date
Aleksander Machniak ccb1323dc8 Move setting _next_uid to selection_post_data() 11 years ago
cmcnulty a8876fba93 Revert "simplify home/end key behavior"
This reverts commit 3bef61232b.
11 years ago
cmcnulty 9806c72764 replace space bar with arrow key thread handling
and switch spacebar to select messages
11 years ago
cmcnulty 3bef61232b simplify home/end key behavior
Makes the home/end keys behave like every other mechanism for selecting
records.
11 years ago
cmcnulty 741f387c14 fix scrolling up
Make sure that the fixed header is never over a message
11 years ago
Aleksander Machniak a222f5c045 Fix an issue where pressing minus key on contacts list was hiding list records (#1489393) 11 years ago
Thomas Bruederli a9d476f012 Merge branch 'master' of github.com:roundcube/roundcubemail 11 years ago
Thomas Bruederli 59cdb433a6 Avoid duplicate elements with the same id in HTML. Fixes broken icons in classic skin. 11 years ago
Aleksander Machniak b1f3c3bee8 Fixed saving contact birthday/anniversary dates before 01-01-1970 11 years ago
Aleksander Machniak 8946c2fca9 Merge pull request #146 from cmcnulty/1489397
1489397 - fix shift-down arrow key over thread when going up
11 years ago
Thomas Bruederli fdb30f3279 Fix CSS selector modifications when nested in @media blocks 11 years ago
Charles McNulty d194179863 Fix shift-select when navigating UP the messsage list 11 years ago
Aleksander Machniak 89e50739b4 Refactored status/flag toggle code, added touch event support on flag and status icons.
Fixed regression in commit 4e4c2511bc where click on flag/status/expando
icons was selecting the message row.
11 years ago
Thomas Bruederli 3ce7c56826 Applied the (modified) patch to extend configuration possibilities of LDAP address books as suggested in #1488753:
- Add option to specify arbitrary replacements of config options with attributes from the bound user
- Allow mapping of group object class => member attribute used in these objects
- Describe the 'member_filter' property for groups config
11 years ago
Thomas Bruederli 98b7b548a2 Merge branch 'dev-canned-responses'
Conflicts (resolved):
	skins/classic/includes/settingstabs.html
	skins/larry/includes/settingstabs.html
11 years ago
cmcnulty 52616821c8 #1489392 - arrow key with control down should *not* select messages
In alignment with desktop applications (windows & mac) using the arrow keys with the control key pressed should not select the messages.  Changes code so that with_mouse will be passed as true when click event occurs, and row will only be toggled if it was a click event.
11 years ago
Thomas Bruederli 6abdfff07d Allow to override popup options; return reference to popup dialog 11 years ago
Thomas Bruederli 1ece73dc4e Fix mime.types parsing (#1489391) 11 years ago
Thomas B. e1ae18311a Merge pull request #142 from Takika/patch-2
Add contact_listname hook to handle special name order
11 years ago
Thomas Bruederli b461a2d72e Send last fetch time with 'refresh' requests and allow plugins to alter query parameters of http requests 11 years ago
Takika 03713dbf5d Add contact_listname hook to handle special name order
I can modify the addressbook_name_listing variable via main config or preferences_list_hook but I have to change the rcube_addressbook class to use the modified value. Some contry use special [name orders](http://en.wikipedia.org/wiki/Personal_name#Name_order) and we can handle them with this hook.
I changed the hook name to contact_listname as proposed by thomascube in the original PR#127.
11 years ago
Aleksander Machniak a649e0488a Fix failing vCard import when email address field contains spaces (#1489386) 11 years ago
Aleksander Machniak 99d59620e1 Join many preg_replace() calls into one 11 years ago
Aleksander Machniak 27a620c012 Fix typo in method name 11 years ago
Thomas Bruederli d29f781080 Let plugins state a validation error message 11 years ago
Thomas Bruederli ada51d1d0e Merge branch 'master' of github.com:roundcube/roundcubemail 11 years ago
Thomas Bruederli a693639613 Require name or email for sql address book only 11 years ago
Thomas Bruederli 49b8e5d0bb Add plugin hook 'contact_validate' to let plugins validate contact records 11 years ago
Niklas Femerstrand af61b9705e Adds change_identity JavaScript event trigger 11 years ago
Thomas Bruederli c344b64f13 Get supported spell-check languages from the configured backend; replace suspended google spell service with our new service at spell.roundcube.net 11 years ago
Aleksander Machniak 70c7df8faa Fix vulnerability in handling _session argument of utils/save-prefs (#1489382) 11 years ago
Aleksander Machniak 26830dcc87 Support 'value' and 'label' attributes on <option> tag 11 years ago
Aleksander Machniak e2f90dbd4e Do not add css files to the page when body is empty, e.g. upload iframes 11 years ago
Aleksander Machniak ff993eb483 Fix iframe onload for upload errors handling (#1489379) 11 years ago
corbosman 754779be6d Allow selected as attribute 11 years ago
Aleksander Machniak c20fa4a1ad Fix address matching in Return-Path header on identity selection (#1489374) 11 years ago
Thomas Bruederli b608577342 Add support for additional attributes on <option> entries 11 years ago
Aleksander Machniak 64c924ea06 Fix regression where wrong set of message identifiers was used
in sql query that was supposed to fetch list of messages from cache
11 years ago
Aleksander Machniak 902b9df7fb Remove dont_select internal flag, we don't need it anymore 11 years ago
Aleksander Machniak eb6253ccc1 Fix regression where click on subject text wasn't selecting the message row 11 years ago
Aleksander Machniak c1bc8f6c82 Change so abort=true does not break the loop in exec_hook(), provide a new 'break' flag for this purpose 11 years ago
Aleksander Machniak 075574c81f Use onclick even for status, flag and expando actions to fix issue
where mouse right click would invoke action where it shouldn't
11 years ago
Aleksander Machniak 899e594474 Key duplicate error on postgres uses SQLSTATE=23505 11 years ago
Aleksander Machniak 5a2d2a6f75 Fix HTML part detection when encapsulated inside multipart/signed (#1489372) 11 years ago
Aleksander Machniak ff6de99ae4 Some micro-optimizations 11 years ago
Aleksander Machniak 0f15219a93 Fix text wrapping issue with long unwrappable lines (#1489371) 11 years ago
Aleksander Machniak d1abd8e339 Fix infinite loop in rcube_utils::mod_css_styles() after recent changes in rcube_string_replacer 11 years ago
Thomas Bruederli b5216621ba Add spellchecker backend for the After the Deadline service. See http://www.afterthedeadline.com for server installations 11 years ago
Thomas Bruederli bc0a470157 Refactor spellchecker class into backend subclasses for better extensibility 11 years ago
Thomas Bruederli c856b73c86 Minor improvements to linkref parser 11 years ago
Thomas Bruederli a01f3b959a Merge branch 'master' of github.com:roundcube/roundcubemail 11 years ago
Thomas Bruederli e480ca00ba Replace markdown-style [1] link indexes in plain text email bodies. [1]: http://daringfireball.net/projects/markdown/ 11 years ago
Aleksander Machniak 4136174517 Clean up translations once again, this time remove untranslated strings for all langs 11 years ago
Aleksander Machniak 63573c9312 Added Urdu (ur_PK) language support 11 years ago
Aleksander Machniak 9377edc497 More lceanup 11 years ago
Aleksander Machniak b1a1ca159e Localization files cleanup - removed untranslated texts, empty lines and comments 11 years ago
Aleksander Machniak 5251ec3e38 Workaround cyrus-murder bug in SETANNOTATION arguments handling 11 years ago
Thomas Bruederli f93e0b3a14 Synchronized localization files from Transifex 11 years ago
Thomas Bruederli 6a6992f650 Assign the chosen mode to the table map 11 years ago
Thomas Bruederli a69f9918cd Improve selection of replicated database connection:
- Analyze query and prefer dsnr unless a write operation for a table involved has been carried out before
- New config option and setter method to enforce connection mode on table level
11 years ago
Thomas Bruederli 120db629b0 Execute connection config queries on db handle direclty 11 years ago
Aleksander Machniak aceb0149b8 Add possibility to programmatically set cache mode, so it is possible
to cache only indexes/threads but not messages
11 years ago
Aleksander Machniak 4daaa09438 Move PEAR libs from plugins into main Roundcube lib directory,
list them as dependencies in INSTALL file (#1489182)
11 years ago
Thomas Bruederli 92d18cf32e New option to disable the use of already established dsnw connections for subsequent reads 11 years ago
Aleksander Machniak b3e25974b1 Fix typo: occured -> occurred (#1489366) 11 years ago
Aleksander Machniak e426ae262c Search for user DN only if one of bind_dn, base_dn, groups_base_dn settings
contains %dn variable
11 years ago
Aleksander Machniak af79a7b837 Fixed issues where HTML comments inside style tag would hang Internet Explorer 11 years ago
Aleksander Machniak eafd5b1aa4 Improved mailto: link arguments handling (#1489363) 11 years ago
Aleksander Machniak bfd24fcc04 Use DOMDocument LIBXML_PARSEHUGE and LIBXML_COMPACT options if possible (#1489302) 11 years ago
Thomas Bruederli 444e977d4f Also truncate the list of addresses in print view + add link to show them all 11 years ago
Aleksander Machniak 34a5ae7562 Fix issue where search result was reset after sending a message (#1489350) 11 years ago
Thomas Bruederli c49c35ca0f Generate settings tabs with a template object 'settingstabs' and let plugins register themselves there using the 'settings_actions' hook 11 years ago
Aleksander Machniak 85fece2c4d rcube_list_widget.rows is not an array - fixed checking if it's empty (#1489359) 11 years ago
Aleksander Machniak 170702fd13 We've encountered (malformed) messages with more than
one text/plain or text/html part here. There's no way to choose
which one is better, so we'll display first of them and add
others as attachments (#1489358)
11 years ago
Aleksander Machniak a4bc6ea24d Handle nicely situation when normalize_entry is executed on already normalized entry 11 years ago
Aleksander Machniak 955a613cac Support HTTP_HOST, SERVER_NAME and SERVER_ADDR values in include_host_config feature 11 years ago
Aleksander Machniak 2c6a233a99 Make sure language code extracted from HTTP_ACCEPT_LANGUAGE is in xx_YY format 11 years ago
Aleksander Machniak f7b2bfba09 Bring back possibility to unset default font family and font size
Fix style attribute quoting when font-family contains double quotes
SOme code improvements
11 years ago
Thomas Bruederli 9c41ba3c9e Allow sysadmins to define static responses which are immutable for the user 11 years ago
Thomas Bruederli c1ff572e17 Touch new default font size settings: simplified + codestyle + updated changelog 11 years ago
Thomas B. 0201298cd8 Merge pull request #118 from Dennis1993/patch-12
Added support for default font size and fix legacy code for default font
11 years ago
Aleksander Machniak b5c364273d Merge pull request #107 from JohnDoh/multi-logo
allow different logos for different functions (eg. normal and print)
11 years ago
Aleksander Machniak 8deae975f0 Fixed issues in handling reply-to/bcc fields on identity change 11 years ago
JohnDoh 7027f386cb Add a render_response hook, similar to render_page hook. 11 years ago
Aleksander Machniak 2efe332b49 Display full attachment name using title attribute when name is too long to display (#1489320) 11 years ago
Aleksander Machniak 2e30b24dbf Fix XSS issue in addressbook group name field [CVE-2013-5646] (#1489333) 11 years ago
Thomas Bruederli 7be8a9134c Move some config options to new and collapsible 'advanced' blocks 11 years ago
Thomas Bruederli a315bf2dda Support both new and old config variables 11 years ago
Thomas Bruederli 0ee22c2145 Retry queries on deadlock errors from InnoDB row-level locking (MySQL) 11 years ago
Aleksander Machniak 7c494b677f Fix expanded thread root message styling after refreshing messages list (#1489327)
Conflicts:

	CHANGELOG
11 years ago
Aleksander Machniak 7bd9dcdcda Merge branch 'master' of github.com:roundcube/roundcubemail 11 years ago
Aleksander Machniak 66a549e133 After message is sent refresh messages list of replied message folder (#1489249) 11 years ago
Thomas Bruederli 52830ea605 Improve handling of date strings and DateTime values in contacts 11 years ago
Aleksander Machniak 6128ad7e96 Support full address specification in contact email fields.
Now input address is extracted automatically, so user can
just paste full address copied from another place. Other clients
have such feature e.g. Kontact.
11 years ago
Aleksander Machniak 6b87f8e023 Fix for case when email array is not flat 11 years ago
Aleksander Machniak bdb4276688 Enable groups import options selector if there's at least one writable source (with groups support) 11 years ago
Aleksander Machniak 96f59c6150 Add option force specified domain in user login - username_domain_forced (#1489264) 11 years ago
Aleksander Machniak ad003c889b Fix some methods for rcube_addressbook implementations where contact email field is not a flat array 11 years ago
Aleksander Machniak 4a40636cca Fix issue where From address was removed from Cc and Bcc fields when editing a draft (#1489319) 11 years ago
Thomas Bruederli 0272081d05 Add option to import vcards with group assignments (pull-request 105) 11 years ago
Thomas Bruederli 028e2a17af Merge branch 'master' of github.com:roundcube/roundcubemail 11 years ago
Thomas Bruederli 79367a5631 Save groups membership in VCard export (#1488509) 11 years ago
Aleksander Machniak 8eb0850ba4 Workaround broken PHP function timezone_name_from_abbr (#1489261) 11 years ago
Thomas Bruederli 9e9d62d786 Respect (multiple) config dirs from RCUBE_CONFIG_PATH when reading configured mimetypes mapping 11 years ago
Thomas Bruederli fb5f5232b9 Read RCUBE_CONFIG_PATH env variable for a list of directories that are searched for config files (#1487311) 11 years ago
Aleksander Machniak 3d5eea7073 Fix error_reporting directive check (#1489323) 11 years ago
Aleksander Machniak 21601b4deb Make cached message size limit configurable - messages_cache_threshold (#1489317) 11 years ago
Aleksander Machniak 53b4c7ef4e Make identities matching case insensitive (#1485480) 11 years ago
Aleksander Machniak 7ebe063a16 Aviod code duplication in timezone configuration handling 11 years ago
Thomas Bruederli 4f432f880a Make result of rcmail::get_compose_responses() always an (indexed) array; add plugin hook for updating user prefs: 'preferences_update' 11 years ago
Thomas Bruederli 460a3eaaac Fix indentation 11 years ago
Thomas Bruederli 4f35bec6b2 Don't normalize line breaks (doesn't work properly on IE) 11 years ago
Thomas Bruederli 0933d66b59 Keep current selection on IE browsers by adding unselectable=on to link elements 11 years ago
Thomas Bruederli 0ce2126ac9 New settings section to manage canned responses 11 years ago
Thomas Bruederli 2d6242ffb2 Make canned response insertion and extraction work with both plaintext and HTML editors 11 years ago
Thomas Bruederli 0b1de8a487 Add new feature to save and recall text snippets (aka canned responses) when composing messages 11 years ago
Aleksander Machniak b6be23ac4b Fix issue where too big message data was stored in cache causing sql errors (#1489316) 11 years ago
Dennis1993 153e455f65 Update func.inc 11 years ago
Dennis1993 d8d5692cff Update func.inc 11 years ago
Dennis1993 edc49ebfc2 Update editor.js 11 years ago
Dennis1993 888f911835 Update func.inc 11 years ago
Dennis1993 c3fe3fc316 Update save_prefs.inc 11 years ago
Dennis1993 901a0809fa Update sendmail.inc 11 years ago
Dennis1993 965dea3e8e Update compose.inc 11 years ago
Aleksander Machniak 0f5574913f Fix "PHP Warning: Missing argument 1 for rcmail::log_login()" 11 years ago
Aleksander Machniak 060467df9d Log also failed logins to userlogins log 11 years ago
Aleksander Machniak 5a8ee396a1 Fix "PHP Warning: Missing argument 1 for rcmail_compose_attachment_field()" 11 years ago
Aleksander Machniak 7ccb59499b Merge pull request #106 from JohnDoh/edit-folders
folder admin: omit fieldset if there is only one section
11 years ago
Aleksander Machniak 471628e9ab Merge pull request #101 from Dennis1993/patch-9
Removed not allowed syntax
11 years ago
Aleksander Machniak 993cb6627b Fix issue where legacy config was overriden by default config (#1489288) 11 years ago
PhilW fb4474aca9 only call config->get() once 11 years ago
David Carter de8687f9f1 Add temp_dir_ttl configuration option to control expiry time in
program/lib/Roundcube/rcube.php : gc_temp().

Default is 48 hours. Define hard wired minimum of 6 hours.
11 years ago
Aleksander Machniak 0c2ffb57a1 Allow setting INBOX as Sent folder (#1489219) 11 years ago
Aleksander Machniak 05da1577aa Fix setting of Junk and NonJunk flags by markasjunk plugin (#1489285)
Added possibility to register flag mappings by a plugin.
11 years ago
Aleksander Machniak b5c413a4cf Fix lack of Reply-To address in header of forwarded message body (#1489298) 11 years ago
PhilW d81d69377a use template file name rather than special attribute 11 years ago
PhilW 7ba5c27466 folder admin: omit fieldset if there is only one section 11 years ago
PhilW a77504aeac allow different logos for different functions (eg. normal and print) 11 years ago
Aleksander Machniak 62350ba021 Fix bugs when invoking contact creation form when read-only addressbook is selected (#1489296) 11 years ago
Thomas Bruederli c58cb8aa95 Strip spell checker error message for logging; remove unused sprintf() 11 years ago
Aleksander Machniak 2e5f64c9e4 Fix identity selection on reply (#1489291) 11 years ago
Aleksander Machniak 6efadfc8d3 Fix so additional headers are added to all messages sent (#1489284) 11 years ago
Aleksander Machniak 98184938bf Fix display issue after moving folder in Folder Manager (#1489293) 11 years ago
Aleksander Machniak b32fab16ef Fix handling of non-default date formats (#1489294)
- remove ambiguous m/d/Y format from default config
11 years ago
Aleksander Machniak 9f754494e7 Fix unquoted path in PREG expression on Windows (#1489290) 11 years ago
Thomas Bruederli eef9eb1146 Synchronized localization files from Transifex 11 years ago
Aleksander Machniak 85ef036bbd - Fix setting refresh_interval to "Never" in Preferences (#1489286) 11 years ago
Thomas Bruederli 88b4231d98 Fix touch check when IE (7|8) doesn't specify the event object 11 years ago
Thomas Bruederli d25ad5cc87 Let the framework adjust the include_path if necessary 11 years ago
Thomas Bruederli 8d2963a4bf Make session auth cookie name configurable 11 years ago
Thomas Bruederli 4910b0666e Distinguish mobile/tablet/touch devices 11 years ago
Thomas Bruederli dc84008266 Optimize list events for touch devices 11 years ago
Thomas Bruederli 5793e7f817 Make thread toggles work on touch devices 11 years ago
Aleksander Machniak 4287c9a2f9 Fix replacement variables in user-specific base_dn in some LDAP requests (#1489279) 11 years ago
Aleksander Machniak f477279035 Fix purge action in folder manager (#1489280) 11 years ago
Aleksander Machniak 328876db5c Fix image scaling issues when image has only one dimension smaller than the limit (#1489274)
Other small code improvements.
11 years ago
Aleksander Machniak 1391f17a52 Fix issue where uploaded photo was lost when contact form did not validate (#1489274) 11 years ago
Aleksander Machniak 8799df8ccd Fix redundant SQL query on contact photo request after photo upload.
The query was also invalid in case of uploading photo in contact create form.
Move contact photo handling from show.inc into a separate file.
11 years ago
Aleksander Machniak a79017e662 Fix base URL resolving on attribute values with no quotes (#1489275) 11 years ago
Aleksander Machniak 0bac7b32de Fix wrong handling of links with '|' character (#1489276) 11 years ago
Dennis1993 0822c46ad6 Update func.inc
deleted size attribute in file input
11 years ago
Dennis1993 7745ae9dfd Update compose.inc
Deleted size Attribute for file input
11 years ago
Aleksander Machniak 9263f55a63 Ignore Reply-To when replying to own message (#1489230) 11 years ago
Aleksander Machniak 17239fa522 Merge pull request #100 from Dennis1993/patch-8
Remove sensless version_compare()
11 years ago
Aleksander Machniak ce5a6496fd Fix XSS vulnerability when saving HTML signatures (#1489251) 11 years ago
Aleksander Machniak b825f86108 Move identity selection based on non-standard headers into (new) identity_select plugin (#1488553) 11 years ago
Aleksander Machniak 7015dd99f9 Added -stip option to convert command line (#1489270) 11 years ago
Aleksander Machniak c908fb451d Fix colorspace issue on image conversion using ImageMagick (#1489270) - s/RGB/sRGB/ 11 years ago
Aleksander Machniak 311d876f0b Hide PHP warning when calling filemtime() on not-existent file 11 years ago
Aleksander Machniak f2a9a9007a Fix broken (in 93b0a30c1c) text/plain body of a message when using "edit as new" 11 years ago
Aleksander Machniak f7ffdc90aa Fix fatal error when opening non-existing message in compose window 11 years ago
Aleksander Machniak 93b0a30c1c Fix XSS vulnerability when editing a message "as new" or draft (#1489251) - added HTML content "washing" 11 years ago
Aleksander Machniak f09b169e51 Support special Return-Path form used on some (PEAR) mailing list (#1489241) 11 years ago
Aleksander Machniak 92e7ce6663 Merge branch 'master' of github.com:roundcube/roundcubemail 11 years ago
Aleksander Machniak ae853367ed Fix downloading binary files with (wrong) text/* content-type (#1489267) 11 years ago
Aleksander Machniak 80112d0749 Fixed typo in comment 11 years ago
Thomas B. 86dd036774 Merge pull request #96 from Dennis1993/patch-6
Added required attribute and delete deprecated border attributes
11 years ago
Aleksander Machniak d59a8d29d6 Validate all text attachments not only text/plain. This fixes invalid
warning message for a case when pdf attachment is defined as text/html.
See #1489267.
11 years ago
Aleksander Machniak 59f0313d98 - Fix detecting Turkish language in ISO-8859-9 encoding (#1489252) 11 years ago
Dennis1993 d52a77a10d Update Socket.php 11 years ago
Dennis1993 e950546903 Update SMTP.php 11 years ago
Dennis1993 ac1fa98715 Update rcube_imap_generic.php
remove sensless version_compare(). Min PHP Version is 5.2.1 so is a check of PHP 5.1.0 sensless. So never occurs.
11 years ago
Dennis1993 60a79649f2 Update Socket.php
remove sensless version_compare(). Min PHP Version is 5.2.1 so is a check of PHP 5.1.0 sensless. So never occurs.
11 years ago
Dennis1993 e34e0fd2fa Update SMTP.php
remove sensless version_compare(). Min PHP Version is 5.2.1 so is a check of PHP 5.1.0 sensless. So never occurs.
11 years ago
Thomas Bruederli c54157bb92 Fix identity-selection using Return-Path headers (#1489241) 11 years ago
Thomas Bruederli cff07b5f76 Fix parsing of links with ... in URL (#1489192) 11 years ago
Thomas Bruederli 469ede77cb Better check for priority header 11 years ago
Thomas Bruederli 64b55c4084 Fix priority selector when open in new window (#1489257) 11 years ago
rodrigo b6a640bdc9 replaces smart quotes with regular quotes. Fixes improper doctype declarations in html emails 11 years ago
Dennis1993 7d7d1437dd Update func.inc
added missing ID for label
11 years ago
Thomas Bruederli 1a8cf64dd1 Avoid session timeouts with memcache backend as proposed by D. Carter via users mailing list 11 years ago
Dennis1993 8df6bb9b1f Update rcmail_output_html.php
added required Attribute to Login fields
11 years ago
Dennis1993 ec031a35f1 Update html.php
added required attribute to allowed list for input fields
11 years ago
Thomas B. a7fa90f3d3 Merge pull request #64 from Steffen185/patch-2
Add hook "message_check_safe"
11 years ago
Thomas Bruederli 71b577ea7d Added Luxembourgish localizations 11 years ago
Thomas Bruederli 4d480b36ea Respect HTTP_X_FORWARDED_FOR and HTTP_X_REAL_IP variables for session IP check 11 years ago
Thomas Bruederli deb2b8d080 Allow to load config files for different environments (#1487311); keep (non-default) filename in URLs throughout the webmail app 11 years ago
Thomas Bruederli f6777712dc Enable fixed list header in IE7, too. Seems to work after some testing 11 years ago
Thomas Bruederli 0703bfecd0 Merged configuration refactoring from 'dev_config' branch back into master (#1487311) 12 years ago
Aleksander Machniak bd28469302 Simplified logic of finding non-existent but subscribed folders. Should be more reliable and (might be) faster now. 12 years ago