* Metadata is now written to its own table instead of a column only
* Values are saved as JSON-like structure only for certain types (like Array or Function)
* Adding custom metadata is more generic using the new HopObject methods setMetadata(), getMetadata() and deleteMetadata()
* Searching keys and values via common SQL query is much more straightforward (no JSON-like structure involved when basic types like String and Number)
* Removed numbered, footnote-like links in most of the noficitaion messages
* Added prefix to subjects of notification mails (like “[Antville] ...”) for convenience
* Added markgettext() calls for most of the prototype names and their plural forms – this time in each corresponding prototype file, though
* Added options argument to global sendMail() method, currently only to switch inclusion of generic footer in mail body
* Fix bug in Membership.contact_action() method when an unknown (i.e. unregistered or unsubscribed) user tries to send a message via contact form
* Unified naming of notify skins (e.g. #notify_delete instead of #notify_deletion)
* Updated and rebuilt i18n and message files
* Slightly modified the message informing about successful deletion of an object
* Fixed type when calling Membership.remove() in Site.unsubscribe_action() method
* Fixed bug causing exception when calling Membership.remove() method with no arguments
* FIxed still incorrect permissions for editing and deleting a membership
* Slightly increased sizes of some input elements for convenience
* Added SQL patch updating constraints of the membership role column (MySQL)
* Removed obsolete title and description properties from Layout
* Minor layout enhancements and wording edits
* Added markgettext_macro()
* Readjusted Admin.dropdown_macro() and the global defineConstants() methods to work with the modified markgettext() calls
* Updated Members.properties and added SQL patch for lowercasing all membership status due to the modified margettext() calls
* Added Membership.role_macro() as convenience method
* Removed syntactic sugar from HopObject.link_macro() and moved it to the compatibility layer to prevent current layouts from breaking
* Removed obsolete permission for non-existing Image.replace_action()
* Replaced custom SQL query in Comment.remove() with code using new Membership.comments collection
* Removed obsolete Sql.COMMENTS statement
* Added getConfirmText() method to Comment, File, Image, Layout, Membership, Poll, Skin and Story prototypes – which is used in HopObject.delete_action() for more convenient feedback about what is going to be deleted (fixes issue 37 for now)
* Fully enabled translation in global breadcrumb_macro()
* Removed obsolete Layout.getTitle() method
* Disabled translation in HopObject.toString() methods
* Fixed and added some i18n messages to ease translation
* Refactored and unified remove() methods and calls for greater flexibility as well as reliability
* Added option to remove all comments by a user to Comment.remove() method and $Comment#delete skin
* Added global #listItemFlag skin as well as listItemFlag_macro() for rendering vertically written text of items in a list view (e.g. closed)
* Fixed bug in gettext_macro() and ngettext_macro() causing incorrect whitespace
* Refactored timezone and locale handling
* Modified automatic translation of untitled links in HopObject.link_macro()
* Added honeypot to login and registration forms
* Fixed client-side JavaScript to be evaluated when login or registration form is submitted, not only when the submit button is clicked
* Removed redundant filter expression from DB mapping of Membership.images collection
* Added Membership.content collection
* Changed terminology from open to running polls, thus renaming Polls.open_action() method and Polls.open collection
* Moved a lot of CSS used in root or administration sections from Site#stylesheet to $Root#stylesheet skin
* Added Root.updateDomains() method (most likely already obsolete)
* Removed Root.processHref() method (only necessary for very advanced setup) and obsolete comments
* Fixed Root.xgettext() method to correctly read UTF-8 encoded data
* Fixed Site.deleted_macro() to return the date object for late formatting
* Refactored Site.processHref() for more convenient custom domain name mapping
* Renamed Skins.advanced_action() method to Skins.all_action()
* Removed redundant filter from Stories.comments collection
* Removed unnecessary filter from Story.comments collection
* Added second argument to HopObject.remove() method; if set to true, any object will be removed without any checks for permissions or the like
* Enhanced notfound and error screens
* Removed obsolete Image.site property
* Added missing LogEntry.remove() method
* Added Site.deleted property
* Fixed missing calls for remove() methods of some collections in Site.remove()
* Added Root#stylesheet skin for future CSS classes necessary for GUI elements
* Added missing Site.entries collection
* Removed troublesome if condition in Skin.remove()
* Generally deny access to Skin.main_action
* Added missing Skin.getFormValue() method
* Added check in Skin.update() if the Site#page skin contains the <% response.body %> macro
* Added Skins.onRequest() method checking if we are in-between two Skins objects
* Fixed bug in Story.summary_macro() preventing additional arguments from being used to render metadata content
* Added root.sites to _parent mapping in Site.properties
* Added setup routine to Root.main_action() which is executed when there is an unconfigured root site or no privileged user (admin)
* Modified $Image#edit skin: check for Image.fileName property insteaed of "created" when deciding whether to show the name and dimension input fields
* Added missing res.data.title to $Members#register skin
* Removed app.log() calls when catching login or registration exceptions
* Added empty User.onLogout() method to get rid of some "errors" in the log file
* Removed obsolete code
* Modified Skins.getSkin() method to make use of Skin.getByName()
* Re-enabled controls in Tag#main skin
* Cleaned up and reorganized code
* Added some remarks to explain the most illicit code
* Removed a lot of obsolete code
* Added File.getName() method removing any characters troubling the file system or the web server
* Slightly modified global quote() method to wrap a string in double quotes (") if it contains any non-word or non-digit character
* Set Story.name to empty string by default (until we do something with it :)
* Added grant for viewing an image in Images prototype (for now...)
* Added temporary work-around for preventing comments of missing stories (due to shrunken database) from throwing an exception
* Added two more links with short explanation to basic skin page
* Wrapped zipping of layout images in try/catch block to prevent exceptions when there is no thumbnail image
* Introduced a more elegant way to include necessary script files (jQuery et al.) in Site.main_js_action()
* Slightly modified jQuery "onload" calls
* Removed obsolete skin files (ie. content moved to the protected skin file)
* Moved contents of Messages.skins to their protected siblings
* Prefixed notification skins (used in e-mails) with "notify_"
* Fixed and simplified a whole bunch of issues in compatibility layer
* Disabled ip address property in LogEntry (will be removed in the long run)
* Removed custom property from Skin (still needs some care)
* Removed commented code
* Disabled tagging of layout images
* Disabled "days" page mode (ie. switched to counting stories only)
* Moved Site.href skin to Site#href (subskin)
* Fixed minor issues
* Edited text and messages
* Improved image data conversion in updater to only create thumbnail information if there actually is a thumbnail available
* Fixed some minor issues introduced with the latest changes
* Added $Global.skin as first attempt to move certain skins in a namespace protected from customization
* Very much improved image editor interface
* Thoroughly fixed and tested image upload, fetching, thumbnail generation and replacement
* Added work-around for Helma bug #607 by calling persist() on creating a story or an image before setting the tags
* Fixed sequence of clipping/embodying and tag stripping in Story.getTitle()
* Added work-arounds for tagging problem in Story, Stories, Image and Images until Helma bug #607 is fixed
* Deprecated getData and setData methods in Metadata
* Disabled file tags for now
* Renamed global renderPageNavigation() method to renderPager()
* Added support for rendering the list of updated sites in global list_macro()
* Fixed return point when cancelling a file edit action
* Fixed nasty bug in deletion routine
* Implemented sorting of values in Layout.values_macro()
* Disabled layout title, description, origin and sharing for now
* Renamed list_action() to sites_action() in Root prototype
* Enabled filter of root site in default collection
* Moved Root's list.skin as subskin in Root.skin
* Added experimental Root.search_xml_action()
* Renamed "unpublish" link to "close" in Story list
* Reduced display of backlinks to last 24 hours
* Removed obsolete skin files
* Added HopObject.getTags() method which returns the list of an object's tags as array
* Fixed TagHub.skin to always display the skin corresponding to the tagged object
* Added custom Layout.href() method to prevent the URL from being corrupted with the layout ID (which strangely happens from time to time)
* Uncommented $tags collection in Root.properties to prevent conflict with collection in Site having the same name
* Fixed output of tags list in Story.getFormValue() method
* Removed some lines of obsolete code
* Reduced layout functionality to 1 (one!) layout per site as a first step to eliminate future obstacles of backwards compatibility
* Fixed Images.main_action for layout images
* Aggregated functionality of layout export in one method (Layout.export_action)
* Extended functionality of layout import to every layout (ie. any comptabile layout can be imported to any site)
* Fixed some minor bugs
* SLightly modified Image.constructor() method to allow creation of Image objects on code compilation
* Added links to Antville and Helma logo images in Site/page.skin
* Set application's charset to UTF8
* Added Layout.getFile() method returning the layout's directory as helma.File
* Simplified Layout.getSkinPath() method (still work in progress)
* Replaced occurrences of Site.language with Site.locale
* Modified some wording
* Added slight b/w compatibility fix in Story.macro_filter() method
* Added timex factor in Story.getDelta() method to prevent counting edits as site updates in-beteen 10 minutes
* Moved site-related aspect hooks to Site prototype of compatibility module
* Removed obsolete conversion code in compatibility module (has moved to updater app)
* Re-included spacer_macro() method in compat. module
* Temporarily overwrote HopObject.renderSkin() method to debug skin rendering process
* Replaced individual legacy macros of Layout prototype by appropriate code in onUnhandledMacro() method (compat.)
* Reflect legacy macros of Layout prototype in value() method of compat. module
* Added and improved compatibility methods
* Implemented support for renamed prototypes in updater app (still needs to be applied for database, too)
* Fixed _children.filter in Archive
* Added missing permission checks
* Modified global defineConstants() method to return the getter function instead of automatically defining it with given argument
* Added HopObject.macro_macro() method to display userland macro code
* Removed colorpicker (will be replaced by third-party library)
* Removed obsolete global constants and functions
* Overhauled and tested global userland macros like story_macro(), image_macro() etc.
* Implemented global list_macro() to replace any special listFoobar_macro() methods
* Moved global autoLogin() method into User prototype
* Overhauled global randomize_macro()
* Renamed global evalURL() method to validateUrl() as well as evalEmail() to validateEmail()
* Re-added accidentally removed subskins to Members.skin
* Fixed some skin names which were changed recently
* Remove delete_action() from Membership
* Fixed foreign key of images collection in Membership
* Removed global username_macro() and replaced it with appropriate membership macros
* Moved contents of systemscripts.skin into javascript.skin in Root prototype
* Removed main_css_action(), main_js_action() and sitecounter_macro() methods from Root
* Added accessname to sites collection in Root
* Upgraded jQuery to version 1.2.1
* Replaced call for global history_macro() with corresponding list_macro() call
* Renamed "public" collection of Stories prototype to "featured"
* Moved a lot of styles from Root's style.skin to the one in Site
* Added comments collection to Site
* Moved embed.skin as subskin #embed into Site.skin
* Fixed some minor issues in Story.js (removed check for creator before setting the story's mode)
* Defined cookie names as constants of User which can be overriden via app.properties userCookie and hashCookie
* Moved a lot of code into compatibility module