[Jifty-commit] r4082 - in jifty/branches/virtual-models: . bin debian examples/HelloKitty/lib/HelloKitty lib lib/Jifty lib/Jifty/Manual lib/Jifty/Plugin lib/Jifty/Plugin/ActorMetadata/Mixin/Model lib/Jifty/Plugin/Feedback/Action lib/Jifty/Plugin/Image lib/Jifty/Plugin/SkeletonApp lib/Jifty/Plugin/TabView lib/Jifty/Plugin/UUID lib/Jifty/Plugin/Userpic lib/Jifty/Script lib/Jifty/Test/WWW lib/Jifty/View lib/Jifty/View/Declare lib/Jifty/View/Mason lib/Jifty/Web lib/Jifty/Web/Form/Field share/plugins/Jifty/Plugin/JQuery share/plugins/Jifty/Plugin/JQuery/web share/plugins/Jifty/Plugin/JQuery/web/static share/plugins/Jifty/Plugin/JQuery/web/static/js share/po share/web/static/css share/web/static/js share/web/templates t t/TestApp-Plugin-AppPluginHasModels/var/mason t/TestApp-Plugin-Chart/t t/TestApp-Plugin-Chart/var/mason t/TestApp-Plugin-JQuery t/TestApp-Plugin-JQuery/bin t/TestApp-Plugin-JQuery/doc t/TestApp-Plugin-JQuery/etc t/TestApp-Plugin-JQuery/lib t/TestApp-Plugin-JQuery/lib/TestApp t/TestApp-Plugin-JQuery/lib/TestApp/Plugin t/TestApp-Plugin-JQuery/lib/TestApp/Plugin/JQuery t/TestApp-Plugin-JQuery/lib/TestApp/Plugin/JQuery/Action t/TestApp-Plugin-JQuery/lib/TestApp/Plugin/JQuery/Model t/TestApp-Plugin-JQuery/log t/TestApp-Plugin-JQuery/share t/TestApp-Plugin-JQuery/share/po t/TestApp-Plugin-JQuery/share/web t/TestApp-Plugin-JQuery/share/web/static t/TestApp-Plugin-JQuery/share/web/templates t/TestApp-Plugin-JQuery/t t/TestApp-Plugin-JQuery/var t/TestApp-Plugin-SinglePage t/TestApp-Plugin-SinglePage/bin t/TestApp-Plugin-SinglePage/doc t/TestApp-Plugin-SinglePage/etc t/TestApp-Plugin-SinglePage/lib t/TestApp-Plugin-SinglePage/lib/TestApp t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/Model t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/SinglePage t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/SinglePage/Model t/TestApp-Plugin-SinglePage/log t/TestApp-Plugin-SinglePage/share t/TestApp-Plugin-SinglePage/share/po t/TestApp-Plugin-SinglePage/share/web t/TestApp-Plugin-SinglePage/share/web/static t/TestApp-Plugin-SinglePage/t t/TestApp-Plugin-SinglePage/var t/TestApp/lib/TestApp t/TestApp/share/web/templates/_elements t/TestApp/t t/clientside t/lib/Jifty

jifty-commit at lists.jifty.org jifty-commit at lists.jifty.org
Tue Sep 11 14:03:35 EDT 2007


Author: sterling
Date: Tue Sep 11 14:03:32 2007
New Revision: 4082

Added:
   jifty/branches/virtual-models/bin/generate-changelog
   jifty/branches/virtual-models/lib/Jifty/Plugin/JQuery.pm
   jifty/branches/virtual-models/lib/Jifty/Test/WWW/Selenium.pm
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/JQuery/
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/JQuery/web/
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/JQuery/web/static/
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/JQuery/web/static/js/
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/JQuery/web/static/js/jquery.js
   jifty/branches/virtual-models/share/plugins/Jifty/Plugin/JQuery/web/static/js/noConflict.js
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/Makefile.PL
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/bin/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/bin/jifty   (contents, props changed)
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/doc/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/etc/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/etc/config.yml
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/lib/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/lib/TestApp/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/lib/TestApp/Plugin/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/lib/TestApp/Plugin/JQuery/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/lib/TestApp/Plugin/JQuery/Action/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/lib/TestApp/Plugin/JQuery/Model/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/log/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/share/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/share/po/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/share/web/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/share/web/static/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/share/web/templates/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/t/
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/t/jquery.t
   jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/var/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/Makefile.PL
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/bin/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/bin/jifty   (contents, props changed)
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/doc/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/etc/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/etc/config.yml
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/Model/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/SinglePage/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/SinglePage/Model/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/SinglePage/Model/User.pm
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/SinglePage/View.pm
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/log/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/share/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/share/po/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/share/web/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/share/web/static/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/share/web/templates/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/t/
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/t/statevar.t
   jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/var/
   jifty/branches/virtual-models/t/TestApp/share/web/templates/_elements/
   jifty/branches/virtual-models/t/TestApp/share/web/templates/_elements/wrapper
   jifty/branches/virtual-models/t/TestApp/t/crud.t
   jifty/branches/virtual-models/t/TestApp/t/use_mason_wrapper.t
Removed:
   jifty/branches/virtual-models/lib/Jifty/Plugin/Image/
   jifty/branches/virtual-models/lib/Jifty/Plugin/Image.pm
   jifty/branches/virtual-models/t/TestApp-Plugin-AppPluginHasModels/var/mason/
   jifty/branches/virtual-models/t/TestApp-Plugin-Chart/var/mason/
Modified:
   jifty/branches/virtual-models/   (props changed)
   jifty/branches/virtual-models/Changelog
   jifty/branches/virtual-models/MANIFEST
   jifty/branches/virtual-models/META.yml
   jifty/branches/virtual-models/Makefile.PL
   jifty/branches/virtual-models/SIGNATURE
   jifty/branches/virtual-models/debian/changelog
   jifty/branches/virtual-models/debian/control
   jifty/branches/virtual-models/examples/HelloKitty/lib/HelloKitty/View.pm
   jifty/branches/virtual-models/lib/Jifty.pm
   jifty/branches/virtual-models/lib/Jifty/Collection.pm
   jifty/branches/virtual-models/lib/Jifty/Continuation.pm
   jifty/branches/virtual-models/lib/Jifty/CurrentUser.pm
   jifty/branches/virtual-models/lib/Jifty/DateTime.pm
   jifty/branches/virtual-models/lib/Jifty/Handler.pm
   jifty/branches/virtual-models/lib/Jifty/Manual/Glossary.pod
   jifty/branches/virtual-models/lib/Jifty/Notification.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/ActorMetadata/Mixin/Model/ActorMetadata.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/Feedback/Action/SendFeedback.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/SinglePage.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/TabView/View.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/UUID.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/UUID/Widget.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/Dispatcher.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/View.pm
   jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/Widget.pm
   jifty/branches/virtual-models/lib/Jifty/Record.pm
   jifty/branches/virtual-models/lib/Jifty/Schema.pm
   jifty/branches/virtual-models/lib/Jifty/Script/FastCGI.pm
   jifty/branches/virtual-models/lib/Jifty/Test.pm
   jifty/branches/virtual-models/lib/Jifty/View/Declare.pm
   jifty/branches/virtual-models/lib/Jifty/View/Declare/BaseClass.pm
   jifty/branches/virtual-models/lib/Jifty/View/Declare/CRUD.pm
   jifty/branches/virtual-models/lib/Jifty/View/Declare/Helpers.pm
   jifty/branches/virtual-models/lib/Jifty/View/Declare/Page.pm
   jifty/branches/virtual-models/lib/Jifty/View/Mason/Handler.pm
   jifty/branches/virtual-models/lib/Jifty/Web.pm
   jifty/branches/virtual-models/lib/Jifty/Web/Form/Field/Upload.pm
   jifty/branches/virtual-models/lib/Jifty/Web/Menu.pm
   jifty/branches/virtual-models/share/po/zh_cn.po
   jifty/branches/virtual-models/share/web/static/css/autocomplete.css
   jifty/branches/virtual-models/share/web/static/js/calendar.js
   jifty/branches/virtual-models/share/web/static/js/jifty.js
   jifty/branches/virtual-models/share/web/templates/autohandler
   jifty/branches/virtual-models/t/01-dependencies.t
   jifty/branches/virtual-models/t/DateTime.t
   jifty/branches/virtual-models/t/TestApp-Plugin-Chart/t/chart.t
   jifty/branches/virtual-models/t/TestApp-Plugin-Chart/t/gd_graph.t
   jifty/branches/virtual-models/t/TestApp/lib/TestApp/View.pm
   jifty/branches/virtual-models/t/TestApp/t/00-model-User.t
   jifty/branches/virtual-models/t/TestApp/t/11-current_user.t
   jifty/branches/virtual-models/t/clientside/td.t
   jifty/branches/virtual-models/t/lib/Jifty/SubTest.pm

Log:
 r11949 at dynpc145:  andrew | 2007-09-11 13:01:12 -0500
 Mergedown from trunk.
  r8678 at dynpc145:  andrew | 2007-08-14 19:26:11 -0500
  Adding tangent and return to the glossary.
  r8686 at dynpc145:  andrew | 2007-08-16 08:58:03 -0500
   r8679 at dynpc145 (orig r3903):  efunneko | 2007-08-14 19:16:51 -0500
   Removed some duplicated code
   r8685 at dynpc145 (orig r3906):  trs | 2007-08-15 22:02:54 -0500
    r26160 at zot:  tom | 2007-08-15 23:02:16 -0400
    Give the browser (particularly Safari) some more "settle time"
   
  
  r8695 at dynpc145:  andrew | 2007-08-16 22:07:42 -0500
  Fixes to use_mason_wrapper():
   * Added a test to make sure use_mason_wrapper() works.
   * Added $jifty_internal_request to note whether a Mason request is internal or not.
   * Altered the autohandler to use $jifty_internal_request when blocking access to /_elements/
   * Fixed error handling in the autohandler to redirect to /__jifty/error/requested_private_component rather than /errors/requested_private_component
  r8812 at dynpc145:  andrew | 2007-08-19 08:38:43 -0500
  Added a new helper, new_record_action(), that wraps new_action() with additional help creating Create, Update, Delete, and Search actions for models.
  r8814 at dynpc145:  andrew | 2007-08-20 12:08:34 -0500
  Adding a plugin for using the jQuery Javascript library with Jifty.
  r8818 at dynpc145:  andrew | 2007-08-20 15:29:01 -0500
  Adding documentation for Action and Static attributes to resolve POD coverage test failures.
  r8819 at dynpc145:  andrew | 2007-08-20 15:38:38 -0500
  Cleaning up documentation to fix pod coverage test failures.
  r8820 at dynpc145:  andrew | 2007-08-20 15:54:10 -0500
  Fixing pod coverage problems with the jQuery plugin.
  r8824 at dynpc145:  andrew | 2007-08-20 15:57:13 -0500
  Undoing previous accidental patch to Jifty::Continuation because I have not finished proofing it.
  r8911 at dynpc145:  andrew | 2007-08-23 11:47:40 -0500
   r8890 at dynpc145 (orig r3924):  jesse | 2007-08-20 18:17:48 -0500
    r65916 at 000-176-581:  jesse | 2007-08-13 16:49:12 -0400
    * POD fixes 
   
   r8891 at dynpc145 (orig r3925):  jesse | 2007-08-20 18:18:11 -0500
    r65917 at 000-176-581:  jesse | 2007-08-13 17:08:59 -0400
    * The image column isn't at all baked. it was a bad fork of userpic
   
   r8892 at dynpc145 (orig r3926):  yves | 2007-08-21 09:49:01 -0500
   debian packaging
   
   r8895 at dynpc145 (orig r3929):  clkao | 2007-08-21 21:03:01 -0500
   require Class::Trigger 0.12 for abortable triggers used by css/js compression plugin.
   r8896 at dynpc145 (orig r3930):  clkao | 2007-08-21 21:12:04 -0500
   GD is not mandatory requirement.  Skip chart test if not found.
   r8897 at dynpc145 (orig r3931):  clkao | 2007-08-21 21:13:42 -0500
   var/mason shouldn't be here
   r8898 at dynpc145 (orig r3932):  clkao | 2007-08-21 21:17:35 -0500
   ditto for chart.t
   r8899 at dynpc145 (orig r3933):  efunneko | 2007-08-22 09:42:15 -0500
   Fixed a problem where some disabled elements weren't re-enabled after a submission when the disabled elements were outside of the fragment being refreshed.
   r8900 at dynpc145 (orig r3934):  audreyt | 2007-08-22 10:03:57 -0500
   * Jifty::View::Declare::CRUD - I18N.
   r8901 at dynpc145 (orig r3935):  audreyt | 2007-08-22 10:06:44 -0500
   * Jifty::View::Declare - Work around Perl 5.9.5 bug by avoid punning
     the constant name BaseClass with the subclass name ::BaseClass.
   r8902 at dynpc145 (orig r3936):  clkao | 2007-08-22 10:22:40 -0500
   properly skip client side td test if new B is not found.
   r8903 at dynpc145 (orig r3937):  audreyt | 2007-08-22 10:38:30 -0500
   * Jifty::Plugin::SkeletonApp::Dispatcher - 
     Do not override the 'Home' menu item if the app had set it already.
   r8904 at dynpc145 (orig r3938):  sartak | 2007-08-22 10:56:46 -0500
    r30488 at caladan:  sartak | 2007-08-22 11:55:55 -0400
    Add friendly_date method to Jifty::DateTime which special-cases yesterday/today/tomorrow
   
   r8906 at dynpc145 (orig r3940):  clkao | 2007-08-23 03:40:04 -0500
   Jifty.Subs needs outs_raw.
   r8907 at dynpc145 (orig r3941):  clkao | 2007-08-23 09:31:08 -0500
   respect initial PATH in env under fastcgi.
   r8908 at dynpc145 (orig r3942):  clkao | 2007-08-23 09:32:51 -0500
   bad mason dir.
   r8909 at dynpc145 (orig r3943):  clkao | 2007-08-23 09:40:57 -0500
   don't use pager to determine items as list_items might be called
   directly and no pager has been set on the collection.
   
   r8910 at dynpc145 (orig r3944):  clkao | 2007-08-23 09:42:20 -0500
   update tabview plugin to use new relative path syntax for td show().
  
  r8976 at dynpc145:  andrew | 2007-08-26 16:26:19 -0500
   r8913 at riddle (orig r3945):  jesse | 2007-08-23 11:47:40 -0500
    r66536 at pinglin:  jesse | 2007-08-23 12:19:20 -0400
    * Minor pod additions. removing unneeded wrappers
   
   r8914 at riddle (orig r3946):  jesse | 2007-08-23 13:02:19 -0500
    r66539 at pinglin:  jesse | 2007-08-23 12:58:28 -0400
    * WWW::Mechanize versions before 1.30 had broken gzip behaviour which broke tests
   
   r8915 at riddle (orig r3947):  jesse | 2007-08-23 13:02:33 -0500
    r66540 at pinglin:  jesse | 2007-08-23 13:56:06 -0400
    * Remove cargo-culting changing of $0 from Jifty::SubTest. It doesn't affect test output but does break things
   
   r8916 at riddle (orig r3948):  sunnavy | 2007-08-23 21:37:49 -0500
   more translations in zh_cn.po
   r8917 at riddle (orig r3949):  sunnavy | 2007-08-23 22:44:24 -0500
   changed View.pm in HelloKitty in accordance with current Jifty libs
   r8918 at riddle (orig r3950):  jesse | 2007-08-23 22:49:09 -0500
    r66543 at pinglin:  jesse | 2007-08-23 23:48:47 -0400
    * New changelog generation tool
   
   r8922 at riddle (orig r3954):  jesse | 2007-08-23 23:19:23 -0500
    r66553 at pinglin:  jesse | 2007-08-24 00:17:00 -0400
     *releng
   
   r8923 at riddle (orig r3955):  jesse | 2007-08-23 23:19:47 -0500
    r66555 at pinglin:  jesse | 2007-08-24 00:17:26 -0400
     *signature
   
   r8926 at riddle (orig r3958):  ishigaki | 2007-08-24 00:28:00 -0500
   t/TestApp-Plugin-JQuery/etc/config.yml: colons in the database name is not allowed on win32
   r8956 at riddle (orig r3974):  clkao | 2007-08-24 16:47:08 -0500
   In td's page { foo => 'bar', title => 'blah' } content {} style,
   pass the metadata to the content code as the second argument.
   
   r8957 at riddle (orig r3975):  clkao | 2007-08-24 16:48:21 -0500
   Make spa support "normal" form_submit of a form with submit_to
   that has no action.
   
   r8970 at riddle (orig r3978):  clkao | 2007-08-25 04:12:30 -0500
   Don't deal with empty submit_to.
   r8971 at riddle (orig r3979):  clkao | 2007-08-25 05:07:47 -0500
   actually we want to use sp_submit whenever we have submit_to and
   no onclick.
   r8972 at riddle (orig r3980):  clkao | 2007-08-25 05:10:10 -0500
   pesky mason files.
   r8973 at riddle (orig r3981):  clkao | 2007-08-25 16:27:57 -0500
   minor cleanups to the tabview plugin.
   r8974 at riddle (orig r3982):  clkao | 2007-08-26 05:21:03 -0500
   Allow a more flexible way to use tabview, such using custom labels.
   
   r8975 at riddle (orig r3983):  clkao | 2007-08-26 05:35:36 -0500
   tabview: make name and path optional.
  
  r8977 at dynpc145:  andrew | 2007-08-26 16:28:08 -0500
  Removing Test::Log4perl. It isn't used anywhere anymore.
  r8987 at dynpc145:  andrew | 2007-08-26 16:36:46 -0500
  
  r8988 at dynpc145:  andrew | 2007-08-26 16:39:26 -0500
  Reverting the addition of these files which were added by a push error.
  r11089 at dynpc145:  andrew | 2007-08-30 21:26:36 -0500
  Making Jifty::Web::Menu more extensible.
  r11130 at dynpc145:  andrew | 2007-09-02 21:12:07 -0500
   r11114 at dynpc145 (orig r4018):  sartak | 2007-08-31 13:51:04 -0500
    r40422 at onn:  sartak | 2007-08-31 14:50:15 -0400
    Add (grr, passing) tests for setting columns in the test app
   
   r11115 at dynpc145 (orig r4019):  audreyt | 2007-08-31 16:21:56 -0500
   * Jifty::Notification - Minor doc fix - The html_body method was
     misspelled as html-body.
   r11116 at dynpc145 (orig r4020):  sartak | 2007-08-31 16:30:44 -0500
    r40432 at onn:  sartak | 2007-08-31 17:30:24 -0400
    In Jifty::DateTime->new, set the timezone to floating if it looks like just a date
   
   r11117 at dynpc145 (orig r4021):  audreyt | 2007-08-31 16:36:37 -0500
   * SendFeedback.pm: Take away the phrase "hiveminder" from the documentation.
   r11123 at dynpc145 (orig r4027):  clkao | 2007-09-01 14:12:49 -0500
   spa: don't translate javascript: links.
   
   r11124 at dynpc145 (orig r4028):  clkao | 2007-09-01 14:15:52 -0500
   tabview: fix the logic for defered tabs.
   
   r11125 at dynpc145 (orig r4029):  clkao | 2007-09-02 15:11:58 -0500
   Name the first Jifty->new during test 'pre_init', and tell plugins
   not to register triggers just yet to avoid duplicated triggers.
   
   r11126 at dynpc145 (orig r4030):  clkao | 2007-09-02 15:35:45 -0500
   Change how plugin is initialized so _pre_init is actually
   noted.
   
   r11127 at dynpc145 (orig r4031):  clkao | 2007-09-02 17:32:52 -0500
   First cut of Selenium testing support in Jifty.
   
   r11128 at dynpc145 (orig r4032):  ruz | 2007-09-02 18:47:58 -0500
   * don't gen a collection class if there is no model
  
  r11133 at dynpc145:  andrew | 2007-09-02 22:17:41 -0500
  Additional selector to make sure that autocomplete hides .hidden_value on .inline forms.
  r11186 at dynpc145:  andrew | 2007-09-04 17:35:47 -0500
  Added requirement for URI 1.31, which adds uri_escape_utf8().
  r11194 at dynpc145:  andrew | 2007-09-04 17:36:24 -0500
   r11187 at riddle (orig r4038):  clkao | 2007-09-03 15:30:09 -0500
   my computer is slow. be more patient about selenium rc startup.
   r11188 at riddle (orig r4039):  ruz | 2007-09-03 15:55:55 -0500
   * collection generator may be called when we're loading models
     and not all models have been loaded to the moment, so we have
     to try to require the model before testing if it esists.
   r11189 at riddle (orig r4040):  ishigaki | 2007-09-04 06:33:00 -0500
   Jifty::DBI now  uses Class::Trigger instead of Jifty::DBi::Class::Trigger (since rev3968)
   r11190 at riddle (orig r4041):  ishigaki | 2007-09-04 06:48:01 -0500
   added Test::Log4perl dep again; it is surely used at t/TestApp/t/02-dispatch-show-rule-in-wrong-ruleset.t
   r11192 at riddle (orig r4043):  falcone | 2007-09-04 14:13:10 -0500
    r24400 at ketch:  falcone | 2007-09-04 15:10:44 -0400
    * revert changes to ClassLoader.  Collection classes are failing to be generated
      in some TD views
   
  
  r11815 at dynpc145:  andrew | 2007-09-10 10:46:00 -0500
  Improving POD and minor tidying.
  r11833 at dynpc145:  andrew | 2007-09-10 10:47:04 -0500
   r11818 at riddle (orig r4048):  jesse | 2007-09-06 13:51:56 -0500
    r66786 at pinglin:  jesse | 2007-08-30 20:05:58 -0400
     * we want to compute UUIDs every time. really. it's not useful to always have the same uuid
   
   r11822 at riddle (orig r4052):  clkao | 2007-09-07 05:03:33 -0500
   default not to preserve state when spa is replacing __page
   r11823 at riddle (orig r4053):  clkao | 2007-09-07 05:21:33 -0500
   Do not do clever & broken input_name for buttons when preserve_state is false.
   r11828 at riddle (orig r4058):  sartak | 2007-09-07 10:40:03 -0500
    r42421 at onn:  sartak | 2007-09-07 11:39:31 -0400
    Revert clkao's fixes for now because they break apps :/
   
   r11829 at riddle (orig r4059):  jesse | 2007-09-07 15:08:37 -0500
    r67030 at pinglin:  jesse | 2007-09-07 16:07:47 -0400
    * Clean up Jifty::Web initialization a bit.
   
   r11830 at riddle (orig r4060):  clkao | 2007-09-07 17:19:30 -0500
   actormetadata: provide a current_user_is_owner method.
   
   r11831 at riddle (orig r4061):  clkao | 2007-09-07 17:23:57 -0500
   webservices_rediret: don't redirect if there's any failed action.
   
   r11832 at riddle (orig r4062):  clkao | 2007-09-08 08:42:57 -0500
   first cut of tests for singlepage app plugin.
  
  r11934 at dynpc145:  andrew | 2007-09-11 11:48:37 -0500
   r11912 at dynpc145 (orig r4069):  sartak | 2007-09-10 13:59:26 -0500
    r42468 at onn:  sartak | 2007-09-10 14:58:49 -0400
    friendly_date should be relative to the user, not floating
   
   r11929 at dynpc145 (orig r4070):  jesse | 2007-09-10 21:04:29 -0500
    r67092 at pinglin:  jesse | 2007-09-10 18:26:34 -0400
    * Some databases have schema creation single-threadedness. If they block, wait and retry for up to a minute
   
   r11930 at dynpc145 (orig r4071):  jesse | 2007-09-10 21:04:38 -0500
    r67093 at pinglin:  jesse | 2007-09-10 18:26:51 -0400
    * pod fixes
   
   r11931 at dynpc145 (orig r4072):  jesse | 2007-09-10 21:04:44 -0500
    r67094 at pinglin:  jesse | 2007-09-10 18:27:22 -0400
    * When testing, don't just use a single global test database. Instead, use one per testfile. This allows some measure of parallelization
   
   r11932 at dynpc145 (orig r4073):  jesse | 2007-09-10 21:04:54 -0500
    r67095 at pinglin:  jesse | 2007-09-10 22:01:20 -0400
     * tabview shouldn't force absolute paths to relative ones
   
  
  r11935 at dynpc145:  andrew | 2007-09-11 11:50:08 -0500
   * Ripping out new_record_action() from Jifty::Web.
   * Re-implementing it as as_create_action(), as_update_action(), as_delete_action, and as_search_action() in Jifty::Record and Jifty::Collection.
  r11937 at dynpc145:  andrew | 2007-09-11 12:04:53 -0500
  Making the as_*_action() methods accept a paramhash for additional new_action() parameters.
  r11939 at dynpc145:  andrew | 2007-09-11 12:13:59 -0500
  Clearing out old new_record_action() tests.
  r11940 at dynpc145:  andrew | 2007-09-11 12:14:37 -0500
  Clearing out old new_record_action() tests.
  r11941 at dynpc145:  andrew | 2007-09-11 12:38:20 -0500
   * Simplifying the CRUD code for generating the record_class and making it more flexible.
   * Adding a stub for CRUD testing.
  r11946 at dynpc145:  andrew | 2007-09-11 12:39:11 -0500
  
  r11947 at dynpc145:  andrew | 2007-09-11 12:55:30 -0500
  POD clean-up, some code commenting, and minor tidying.
 


Modified: jifty/branches/virtual-models/Changelog
==============================================================================
--- jifty/branches/virtual-models/Changelog	(original)
+++ jifty/branches/virtual-models/Changelog	Tue Sep 11 14:03:32 2007
@@ -1,3 +1,932 @@
+Jifty 0.70824
+
+INSTALL
+=======
+
+ * WWW::Mechanize versions before 1.30 had broken gzip behaviour which broke
+   tests - jesse
+
+ * properly skip client side td test if new B is not found. - clkao
+
+ * GD is not mandatory requirement. Skip chart test if not found. - clkao
+
+ * require Class::Trigger 0.12 for abortable triggers used by css/js
+   compression plugin. - clkao
+
+ * debian packaging - yves
+
+ * Makefile.PL - Jifty now depends on TD 0.26 - agentz
+
+ * r1254 at agentz-office: agentz | 2007-08-10 17:08:14 +0800 Makefile.PL - do
+   NOT skip any tests under t/ unintentionally ;) - agentz
+
+ * Updated the module recommendations for the Chart plugin. - sterling
+
+ * Adding Image::Info dependency used during testing of Jifty::Plugin::Chart
+   - sterling
+
+ * add missing Test::Log4perl dep and update the Jifty::DBI requirement -
+   falcone
+
+ * Changing the Jifty console requirement back to default => 0. - sterling
+
+ * debian dependancies
+* T::D 0.21 needed to pass tests - yves
+
+ * add IPC::Run3 to dependency. - clkao
+
+ * Update dep to include version of Module::Pluggable that is patched so that
+   compile errors are caught - trs
+
+ * Add dependency on Class::Trigger - alexmv
+
+ * here sunnavy comes, ;-) - sunnavy
+
+ * typo in recommends - falcone
+
+ * Add myself to AUTHORS - andk
+
+ * Better diagnostic messages in the dependency checking script. Thanks to
+   Andreas Koenig - jesse
+
+ * don't index plugins' test directories - jesse
+
+
+TESTING
+=======
+
+ * Add failing tests for load_by_kv with chr(0) - sartak
+
+ * clean up load_by_kv - jesse
+
+ * The warnings come from the server code after the fork. Test::Log4Perl isn't
+   going to catch them. - jesse
+
+ - Fix our test mech to not choke on non-default cookie names
+ - Clean up page headers
+ - Remove unecessary var - trs
+
+ * Fix the template subclassing tests. - clkao
+
+ * Helper method for mounting crud view. - clkao
+
+ * Add a little pod coverage - sartak
+
+ * Make sure there's always a stash during testing since we don't always go
+   through the web - sartak
+
+ * Pass defaults to render_region in test. - clkao
+
+ * the actual templates for the 16- test.t/TestApp - clkao
+
+ * failing tests for region and show inconsistency. - clkao
+
+ * make a chdir conform to the rest of the test suite and use Jifty::SubTest
+   chdir noticed by Andreas Koenig during his cleanups - falcone
+
+ * add tests for UTF-8 related things - ruz
+
+ * a failing test about utf8 when using T::D - yves
+
+*                 we need bytes in escape_uri then 'use bytes'
+* resulting string is always valid ascii string,
+  so we shouldn't forcibly set utf flag - ruz
+
+ * fast test support: truncate tables rather than recreating database when
+   JIFTY_FAST_TEST is specified. - clkao
+
+VIEW
+====
+
+ * update tabview plugin to use new relative path syntax for td show(). -
+   clkao
+
+ * don't use pager to determine items as list_items might be called directly
+   and no pager has been set on the collection. - clkao
+
+ * Jifty::Plugin::SkeletonApp::Dispatcher - Do not override the 'Home' menu
+   item if the app had set it already. - audreyt
+
+ * Jifty::View::Declare::CRUD - I18N. - audreyt
+
+ * Fixed a problem where some disabled elements weren't re-enabled after a
+   submission when the disabled elements were outside of the fragment being
+   refreshed. - efunneko
+
+ * Added a new helper, new_record_action(), that wraps new_action() with
+   additional help creating Create, Update, Delete, and Search actions for
+   models. - sterling
+
+ * Fixes to use_mason_wrapper():
+  * Added a test to make sure use_mason_wrapper() works.
+  * Added $jifty_internal_request to note whether a Mason request is internal or not.
+  * Altered the autohandler to use $jifty_internal_request when blocking access to /_elements/
+  * Fixed error handling in the autohandler to redirect to /__jifty/error/requested_private_component rather than /errors/requested_private_component - sterling
+
+ * Give the browser (particularly Safari) some more "settle time" - trs
+
+ * Added support for more javascript triggers for most form elements: onclick
+   onchange ondblclick onmousedown onmouseup onmouseover onmousemove
+   onmouseout onfocus onblur onkeypress onkeydown onkeyup onselect - efunneko
+
+ * Fix to a JavaScript bug performing the rerendering of IMG graphs. -
+   sterling
+
+ * Without the conditional we'll hide errors as soon as we display them - trs
+
+ * Add explicit hide/show for the error, warning, and canonicalization note
+   divs. This solves some long time ugliness on IE. However, it is not perfect
+   as I am still getting some rendering issues on IE. Does not seem to break
+   anything on FF. - sterling
+
+ * Fix a fragment update regression caused by the trimclient merge. - clkao
+
+*              Make enter key submit in the address search popup.
+* Fix the close link in ambigious address popup. - clkao
+
+ * Add some classes - trs
+
+ - CRUD view: Minor refactoring for easy wording change
+ - Provide the D in CRUD - trs
+
+ * CRUD: Don't bother showing edit link if current user can't - clkao
+
+ - Plugin CSS and JS (which should be put in
+   share/plugin/Jifty/Plugin/Foo/web/static/{css,js}) is now compressed by
+   CCJS
+ - CCJS can compress more than just main.css by calling Jifty->web->add_css("file.css") - trs
+
+ * in REST record_to_data, skip container columns. - clkao
+
+ * r60264 at 102: jesse | 2007-07-08 21:52:09 -0700
+  * Template::Declare behaviour change for "show 'foo'" to now show foo at the current template depth. - jesse
+
+ * r24794 at zot: tom | 2007-06-21 02:46:02 -0400 Restore and update the OOM
+   patch to the YUI calendar - trs
+
+ * Convert to using the form of declaring titles that works when using the
+   mason wrapper with TD - trs
+
+ * CRUD plugin cleanup and refactoring - jesse
+
+ * CRUD View: Also export display_columns so it's not required to
+   override it - trs
+
+*       New Template::Declare page syntax for additional code block run
+         before wrapper, and have the returned value passed to wrapper:
+
+template foo => 
+  page { title => 'this is title', other => 'foo' }
+  content {
+    h1 { 'blah }
+  }; - clkao
+
+ * Fix jifty->web->out from without td used with mason wrapper. - clkao
+
+ * try not to interfere when a user clicks on a link with a modifier key
+   pressed - jesse
+
+ * YourApp::View->use_mason_wrapper now lets your write page {} in TD but uses
+   your mason wrapper. - clkao
+
+ * Do not call update() when ctrl-clicked - clkao
+
+ * Fix javascript emission when CompressedCSSandJS plugin is not loaded
+   noticed by dpavlin++. - clkao
+
+ * Refactor the CRUD view to make it easier to customize the output - jesse
+
+ * when rendering the keybindings div, reset Jifty.KeyBindings. Ideally we
+   might want to keep the state with the div so it resets itself when
+   replaced. - clkao
+
+ * For post fragment update script evaluation, use YUI OnAvailable rather than
+   hardcoded setTimeout. - clkao
+
+ * switch url from an attribute to a child node for ajax redirects. (The old
+   behaviour didn't work in safari) - jesse
+
+ * add_javascript method to simplify adding JS libs and updated doc - trs
+
+ * Fix update() called from non-form. - clkao
+
+ * Implement "submit => undef" in onclick hook where it should submit all
+   actions. - clkao
+
+ * Let the code calling the wrapper specify a page class to use to support
+   multiple page types - trs
+
+ * Make redirect inside region work. - clkao
+
+ * Make Jifty->web->out work during the dispatch rule stage. - clkao
+
+ * Optionally use app's View::Page class for wrapper. - clkao
+
+ * refactor the TD wrapper into a class. - clkao
+
+ * Abstract render_footer.
+* Header is always considered done when sending out nontoplevel wrapper in spa. - clkao
+
+ * r57907 at pinglin: jesse | 2007-06-03 16:59:42 -0400
+  * The SPA templates no longer include css and js twice - jesse
+
+ * Template::DEeclare now gets a hashref of all the arguments set() in the
+   dispatcher. - jesse
+
+ * Fix search collection for CRUD. - clkao
+
+ * Better factored CRUD library, ready for local overriding - jesse
+
+ * Calendar: Our default canonicalizer is yyyy-mm-dd, while the calendar
+   generates single-character months and dates sometimes. Standardize on the
+   two-digit form. - alexmv
+
+ * CRUD view and a working example (sitenews) - jesse
+
+ * Always use an application's 'wrapper' in preference to the Jifty default
+  - jesse
+
+ * clean url for submenu - yves
+
+ * add a render_as_classical_menu to have the same menu with T::D view than
+   older mason _elements/nav. - yves
+
+ * Stop a certain class of validator error that causes an infinite loop in
+   IE - jesse
+
+ * CRUD builder search works
+  - jesse
+
+ * Jifty::View::Declare::CRUD lifted from BabelBee
+  - jesse
+
+ * add the ability to have some code before a javascript click : onclick => [
+   { beforeclick => "<somecode>;" }, { args => ... - yves
+
+ * More refactoring in support of adding new view handlers. - jesse
+
+U-PUBSUB
+========
+
+ * Jifty.Subs needs outs_raw. - clkao
+
+DOC
+===
+
+ * Minor pod additions. removing unneeded wrappers - jesse
+
+ * Adding documentation for Action and Static attributes to resolve POD
+   coverage test failures. - sterling
+
+ * Adding tangent and return to the glossary. - sterling
+
+ * Updating Pod and source comments for Jifty::Config. Performed some Perl
+   tidying and added a new section describing why Jifty uses three levels of
+   configuration files (may need additional editting). - sterling
+
+ * Cleaning up the Pod and adding a few code comments to Jifty::Collection.
+   - sterling
+
+ * Added myself to AUTHORS - efunneko
+
+ * Updating Pod and adding code comments to Jifty::Client. - sterling
+
+ * Major Pod improvement to the class loader, many more helpful code comments,
+   and some tidying for the class loader. Phew. - sterling
+
+ * Cleaning up the Pod for Jifty::Bootstrap - sterling
+
+ * Improved code comments and minor perl tidy. - sterling
+
+ * Added more POD to fix coverage issues and added a description to the
+   client_cacheable and client_cache_content methods of PageRegion. - sterling
+
+ * Additional fix to POD coverage for the CRUDView attribute. - sterling
+
+ * Fixing POD issues in CRUD, adding some code comments, and minor perl
+   tidying. - sterling
+
+ * Fixing error that occurred during previous push. - sterling
+
+ * Improving some of the Pod, code comments, and minor perl tidying. -
+   sterling
+
+ * Improved code comments and minor perl tidy. - sterling
+
+ * Added more POD to fix coverage issues and added a description to the
+   client_cacheable and client_cache_content methods of PageRegion. - sterling
+
+ * Additional fix to POD coverage for the CRUDView attribute. - sterling
+
+ * Fixing POD issues in CRUD, adding some code comments, and minor perl
+   tidying. - sterling
+
+ * Improving some of the Pod, code comments, and minor perl tidying. -
+   sterling
+
+ * add myself to AUTHORS :) - sartak
+
+ * added some pod to help make pod tests pass - jesse
+
+ * Added a recipe for using "result_of" to fetch information about actions for
+   use in appends. - sterling
+
+ * Added NAME sections and short descriptions for the CPAN module summary.
+   - sterling
+
+ * Adding documentation to Jifty::Plugin::Debug to fix POD coverage failures.
+   - sterling
+
+ * Added an additional see also to Jifty::Manual::AccessControl to the User
+   and Authentication::Password plugins. - sterling
+
+ * The true return value of the module needs to not be part of the POD
+  * Fix a POD nitpick - alexmv
+
+ * word-wrapping some POD - nelhage
+
+ * Fleshing out and cleaning up the documentation for
+   Jifty::Plugin::Authentication::Password. - sterling
+
+ * Fleshing out and cleaning up the documentation for Jifty::Plugin::User.
+   - sterling
+
+ * Added a many-to-many relationship recipe to the cookbook. - sterling
+
+ * added see also section to Jifty::Upgrade - bartb
+
+ * Now with more POD! (and passing POD tests) - trs
+
+ * Extracting talks from the jifty dist - jesse
+
+*              r58374 at pinglin: jesse | 2007-06-14 20:17:33 -0400
+  * Full doc for the existing CRUD templates - jesse
+
+ * Cleaning up and improving some of the view documentation. - sterling
+
+ * Yada Sample application: Example::Todo is too hard to type. Yada! - clkao
+
+ * The cookbook was wrong about the auth recipe - jesse
+
+ * More comment about the JAFF handling special case from update(). - clkao
+
+ * Clarifying comments about the plugins lists - trs
+
+ * document why the validate hack exists. - clkao
+
+ * exceedingly minor POD fixes. - diakopter
+
+ * fix some pod bugs in Jifty/API.pm - sunnavy
+
+ * update zh_cn.po - sunnavy
+
+ * documentation fix that seems to have been forgotten when length was renamed
+   max_length - andk
+
+ * add 'Login on demand' section to Cookbook - ruz
+
+ * Added section on dynamically created binary content in the cookbook - alech
+
+ * add docs to pass the pod-coverage tests - falcone
+
+ * small update to ru.po - ruz
+
+ * add docs to escape_uri
+* fix it in the way need it to work, it's escape_uri_utf8. there is no
+  way to escape binary and text scalars in one sub, we need the latter. - ruz
+
+ * ru.po - ruz
+
+ * linked POD++ - ruz
+
+PLUGINS
+=======
+ * Plugins may now have regular models. These are deployed after
+  the schema is setup after adding the plugin to installation. 
+  Plugins can bootstrap and upgrade their schema with their own 
+  version numbers just like applications (though with slightly 
+  different details). - sterling
+
+
+ * Adding a plugin for using the jQuery Javascript library with Jifty.
+   - sterling
+
+ * Fixing the chart plugin tests to match up with changes that have happened
+   to the API since they were written. - sterling
+
+ * Chart plugin configuration updates:
+  * Deprecating the renderer option.
+  * Adding the DefaultRenderer option to replace renderer.
+  * Adding the PreloadRenderers option to allow additional renderers to be preloaded.
+  * Updated the documentation.
+  * Made sure that the configuration is always passed to the renderer constructor, even if they are loaded late. - sterling
+
+ * Chart Plugin: Removing extra comma from JavaScript list. - sterling
+
+ * Chart Plugin: Whoops. Forgot to check in the actual XML SWF library. This
+   is version 4.6. - trs
+
+ - Chart Plugin: Treat the width and height appropriately
+ - Chart Plugin:  Add the XML::Simple dep - trs
+
+ * Bunch of updates to the chart plugin
+ 
+     - Refactored dispatcher
+     - Added XML SWF renderer
+     - Renderers are now passed the configuration hash when init'd
+  - trs
+
+ * Chart Plugin: Use PlotKit.Base.map explicitly - trs
+
+ * Chart Plugin: Render onAvailable instead of on window load so that we work
+   in regions - trs
+
+ * Chart Plugin: Make sure we do not attempt to render 0 pixel values no
+   matter what.
+  - sterling
+
+ * Chart Plugin: Adding the SimpleBars renderer as a decent, dead-simple HTML-
+   based renderer for HorizontalBars and a prototype for using tables for client-
+   side chart configuration. - sterling
+
+ * Chart Plugin: Removed some redundant code from the PlotKit renderer and
+   added support for options to the GD::Graph and Chart renderers.
+  - sterling
+
+ * Chart Plugin: Improved the way the DIV tag is generated for PlotKit.
+  - sterling
+
+ * Chart Plugin: Added better error handling on renderer require.
+  - sterling
+
+ * Chart Plugin: Standardizing the chart types across the three current
+   renderers. - sterling
+
+ * Chart Plugin: Updated the behaviour script used by IMG chart renderers to
+   make it more URI aware. - sterling
+
+ * Chart Plugin: Fix failing dependency test because Chart uses GD to fix
+   testing. - sterling
+
+ * Chart Plugin: Added a renderer parameter to the chart() method and add per-
+   renderer initialization. - sterling
+
+ * Chart Plugin: Making the IMG-based chart renderers capable of handling CSS
+   styling with some added behaviour. - sterling
+
+ * Chart Plugin: Don't mess with the data structure if it's already what
+   plotkit expects - trs
+
+ * Chart Plugin: *Very* custom packed PlotKit (from svn) that no longer
+   depends on MochiKit exporting functions into the global namespace. Still
+   need to solve the issue of why MochiKit blows up when included in our
+   honkin' JS file... - trs
+
+ * Chart Plugin: Uncomment neccessary require. Make sure to handle undefined
+   stuff - trs
+
+ * Basic PlotKit renderer for Chart plugin - trs
+
+ * Made the chart plugin test smarter and added one for the GD::Graph
+   renderer. - sterling
+
+ * Fixed an eensy POD bug. - sterling
+
+ * Fixed POD coverage issue. - sterling
+
+ * Updated POD and removed an unnecessary extra subroutine call. - sterling
+
+ * Added a renderer for GD::Graph - sterling
+
+ * Moved the chart/* dispatch to chart/chart/* to make room for alternate
+   charting mechanisms. - sterling
+
+ * Fixed the way arguments are passed to the render() method in
+   Jifty::Plugin::Chart::Web. - sterling
+
+ * Added a hack to chart.t (forcing an early load of GD) to avoid the
+   segfault that was causing it to fail. Removed the TODO block from the
+   test. - sterling
+
+ * Regarding Jifty::Plugin::Chart: Added better comments. Fixed some
+   error handling. Switched to using scalar_png(). Switched to using -
+   >require rather than an eval to load Chart classes. Eliminated the
+   need for IO::String. Moved some processing out of View and into
+   Dispatcher. - sterling
+
+ * Adding a test suite for Jifty::Plugin::Chart, but it is having weird
+   troubles loading Chart::* because that seems to disconnect the server
+   output or something. - sterling
+
+ * Added the Chart::Base recommendation for the Chart plugin. - sterling
+
+ * Added documentation to the experimental Chart plugin. - sterling
+
+ * Adding a plugin for rendering charts of data. - sterling
+
+ * Updated tabview plugin to work when it's not already inside a region
+  - jesse
+
+ * Fix IE issues with search div. - clkao
+
+ * i18n for feedback plugin. - clkao
+
+ * Incredibly naive "image column" userpic plugin.  - jesse
+
+ * ActorMetadata plugin: Asset renamed to ActorMetadata
+  - jesse
+
+ * First cut of GoogleMap plugin. - clkao
+
+ * Facebook plugin: Provide a way to link existing users with a Facebook
+   account - trs
+
+ * Facebook plugin: More pod, forceable login - trs
+
+ * Basic Facebook auth plugin - trs
+
+ * OpenID Plugin: Add a "next" parameter so one can specify the next page to
+   go after openid login. - gugod
+
+ * debug plugin for logging dispatched rules and current user. - clkao
+
+ * Password Auth: Plugin view class should respect app page. - clkao
+
+ * Got the tabview plugin working with non-CRUD code.
+ * got the tabview plugin preloading the first tab, even if it's marked as a region rather than a static tab - jesse
+
+ * Single Page App: Unbreak nojs form submitting when SPA is enabled. - clkao
+
+ * CompressedCSSandJS: support optional javascript minifier. - clkao
+
+ * Move the javascript concatenating logic from Jifty::Web to the
+   plugin. - clkao
+
+ * CodePress plugin: bump version to 0.02, remove requirement to modify
+   submit form button (and in process break next_page after it, because it
+   turns normal form submit into Ajax form submit which doesn't handle
+   redirects very well -- because it usually redirects to page which isn't
+   valid XML) - dpavlin
+
+ * Added a 'feedback' plugin
+  - jesse
+
+ * In SinglePage mode, allow Action::Redirect to happen within webservice and
+   have the client js accepts it. - clkao
+
+ * CodePress plugin; add language accessor to select syntax highlight language
+   (instead of default generic), example of usage, replace onload with
+   DOM.Events - dpavlin
+
+ * CodePress plugin for web-based source code editor with syntax
+   highlighting - dpavlin
+
+ * Make SinglePage plugin configurable. - clkao
+
+ * First draft of SinglePage plugin. - clkao
+
+ * Make CompressCSSandJS optional.
+* always refresh css & js if in devel mode. - clkao
+
+ * OpenId Plugin: Fix has_alternative_auth. - clkao
+
+ * Authentication::Password plugin: The (unused) resend_confirmation template
+   was missing. - clkao
+
+ * User model mixin for OpenID plugin.
+* Make Authenticate::Password aware that there can be alternative
+  authentication systems.
+* Make OpenID plugin work even when Authenticate::Password is
+  enabled. - clkao
+
+ * OpenID Plugin: The minimum required OpenID View for your app to
+   mixin. - gugod
+
+ * TabView plugin. - clkao
+
+ * Site news plugin - jesse
+
+ * A Jifty console to provide quick diagnostic shell for debugging or
+   maintaining purpose.
+
+Yes, it's learnt from RoR, and it's good to have it when developing
+applications, or when you just start learning Jifty. - gugod
+
+ * This is the OpenID plugin code. Setting up your app to use OpenID isn't as
+   easy as we thought it to be. Will need a receipe to teach people how to
+   cook it. - gugod
+
+ * Login plugin: return id of the user from action - ruz
+
+ * REST dispatcher: always use warnings and strict. - jesse
+
+ * REST plugin: render referencing fields in a saner fashion. - clkao
+
+ * plugin to add a wiki toolbar to textarea - yves
+
+ * plugin to use Wyzz online wyziwig editor to render textaera for test and
+   comments - yves
+
+CORE
+====
+
+ * Remove cargo-culting changing of $0 from Jifty::SubTest. It doesn't affect
+   test output but does break things - jesse
+
+ * respect initial PATH in env under fastcgi. - clkao
+
+ * Add friendly_date method to Jifty::DateTime which special-cases
+   yesterday/today/tomorrow - sartak
+
+ * Jifty::View::Declare - Work around Perl 5.9.5 bug by avoid punning the
+   constant name BaseClass with the subclass name ::BaseClass. - audreyt
+
+ * todo-ify failing tests in t/13-sessions.t - sartak
+
+ * In action argument creation from model, do not assume refers_to always want
+   a select based on id which we might not be referring to. Allow user to
+   override render_as for refers_to columns. - clkao
+
+ * Correct a crud component path. - clkao
+
+ * Fix view CRUD template's method of getting the record - trs
+
+ * First cut of a UUID column plugin, with a basic test in the user
+   model - jesse
+
+ * Add a load_by_kv to Jifty::Web::Session - sartak
+
+ * Resolve import conflicts now that T::D and J::V::D::Helpers have a thingy
+   with the same name - jesse
+
+ * Moniker bulletproofing. Suggested by Mikko Lapasti - jesse
+
+ * Push milestone 1 of trimclient to trunk. - clkao
+
+ * Now make sure it's actually UTF-8 - trs
+
+ * Make sure we get UTF-8 - trs
+
+ * Fixing API qualification to make it possible to access actions associated
+   with plugins via ->new_class. - sterling
+
+ * Don't mess with the HTML by default. This should likely become configurable
+   in the future. - trs
+
+ * Cleaned up the class loader a bit to make all the auto-generated methods
+   use the same name, remove an unnecessary elsif, and add a few more
+   comments. - sterling
+
+ * Need parens - trs
+
+ * Fixed CRUD view to no longer require you to specify a base_path for the
+   plugin's view. It was redundant and we could intuit it. - jesse
+
+ * Refactor CRUD view to be more subclassable - Extract out per_page - trs
+
+ * type can be empty for container columns. - clkao
+
+ * support external javascripts. - clkao
+
+ * Added support for application-specific plugins (i.e., App::Plugin::XXX) and
+   plugins named using the fully-qualified Jifty::Plugin::XXX name. - sterling
+
+ * check if current_user->can('user_object') when tring to figure out
+   timezone - dpavlin
+
+ * Altered the ClassLoader to create Collections for models deeper under the
+   model namespace,like "App::Model::Foo::Bar". These is consistent with the
+   handling for actions and other components already in place. - sterling
+
+ * Move pulling action defaults from action in request into the action's new,
+   instead of a "private" argument.
+  * Remove an extra place where we default the moniker to
+    _generate_moniker
+  * A bunch of POD (re)wrapping. - alexmv
+
+ * Recent YAML::Syck's get confused by trying to be too smart with
+   $test_config, which is a filehandle which *also* stringifies to the path.
+   Force stringification to get consistent (working) results. - alexmv
+
+*       No matter what _resurect_current_user is intended for, it ought
+          to be spelled _resurrect_current_user instead. :-) - audreyt
+
+ * Mapper edge case failure (when no 'name' was given) - alexmv
+
+ * add {_resurect_current_user} field into user module - ruz
+
+ * protect ourself from circular references between User and CurrentUser
+
+we do it in user_object, so solution is generic should work in any case, but
+only if people use the method to set user_object and user model uses _current_user
+key to store reference to the CurrentUser - ruz
+
+ * Use Jifty::Util->share_root for finding plugin share roots so that if Jifty
+   isn't installed it still DTRT
+ * Only calculate static roots once and report on plugins adding roots (like the mason handler does) - trs
+
+ * Allow app changeable cookie names - trs
+
+ * Web::Form::Link - When escape_label was set, the tooltip property was (very
+   sillily!) first escaped, then discarded away, displaying the unescaped text
+   instead. It now escapes properly.
+* Also make tooltips with value '0' display properly. - audreyt
+
+ * Allow scheme to be specified for Jifty->web->url. This functionality was
+   taken out during the move from "heuristics" to URI.pm, but for a non-
+   apparent reason. - trs
+
+ * HTTPS and HTTP adjectives for dispatcher rules - trs
+
+ * Jifty->web->form->next_page got dropped when you submit only a specific
+   action with Jifty->web->form->submit. This commit autoadds next_page if you
+   submit only a subset of actions. - jesse
+
+ * _redirect expects a local path, not a fully formed URL. (This only actually
+   broke internal redirects) - jesse
+
+ * Always give the dispatcher unescaped path like fastcgi does, from
+   standalone, webservice, and region entrance. - clkao
+
+ * work around annoying Module::Pluggable bug - sky
+
+ * Make multiple use base lines into one for readability. - clkao
+
+ * Admin UI: Don't trip over classes we can't require - jesse
+
+ * Quiet a dispatcher warning - jesse
+
+ * misc webservices_redirect cleanup. - clkao
+
+ * Refactor handle_request to extract out methods
+  * Only warn about denied actions on validate if they're also actions we want to run
+  - jesse
+
+ * Back out a Croak back to a die. (We're using it for exception handling, not
+   to-user reporting) - jesse
+
+ * Merge from fragcont branch to include minimum support of continuation in
+   webservices requests to make SinglePageApp plugin work. - clkao
+
+ * Only squelch "can't locate" errors relating to the class we're trying to
+   require. If it's something else, it's likely a module use'd by the module
+   we're requiring. - trs
+
+ * correct en.po charset. - clkao
+
+ * Only call LML->import once ever. - clkao
+
+ * Kill 5% of startup time by not validating during DateTime::Locale. - clkao
+
+ * Disable in-region redirect unless SPA is enabled. - clkao
+
+ * Move methods unrelated to mason to Jifty::View. - clkao
+
+ * Added support for "redirects" on fragment calls (which really just do an
+   internal replace) - jesse
+
+ * Really fix the region rewriting logic. - clkao
+
+ * new Jifty->find_plugin method. - clkao
+
+ * add a config file version, so we can change old defaults.
+  - jesse
+
+ * Correct app_class usage. - clkao
+
+ * CurrentUser->username now uses brief_description on user_object. - clkao
+
+ * In ClassLoader, be quiet when we are just trying to see if a module
+   exists. - clkao
+
+ * When we convert a model into an action, don't deref and then reref the
+   array of possible valid values. We lose any attempt at possible magic that
+   we might have. - jesse
+
+ * A move to hand on the rendering of JDBI::Collection columns to app
+   developers.
+    
+    We used to just ignore the rendering of any columns that refers to
+    a JDBI::Collection, because there's no trivial way to do so. 
+    
+    However, if the column comes with a "render_as", we can assume that
+    the app developer know what he/she is doing.  So we just render it
+    as whatever specified.
+    
+    One scenario is that a collection of tags is rendered as a normal
+    text input field, and develoeprs create tags records in their Tag
+    model in before_create() method. With ajax canonicalize_tags this
+    could be a simple and smart interface, and not difficult to implement
+    at all.
+    
+    I'm sure that it'll open the chance to let developers write their
+    own collection rendering modules like I did before. If we keep
+    being ignoring, this won't even happend. - gugod
+    
+ * add data to the result indicating which requested actions were denied and
+   mark them failed. Options for a better denied message coming soon - falcone
+
+ * Extract the model list from Script::Schema to Schema - jesse
+
+ * Incremental extraction of schema management from
+   Jifty::Script::Schema - jesse
+
+ * Cause more compiliation failures to actually stop the app from running
+  - jesse
+
+ * Cause more compiliation failures to actually stop the app from running
+  - jesse
+
+ * Cope better with malformed fragment requests - alexmv
+
+ * Push app_root/lib onto @INC when we create a new Jifty object - alexmv
+
+ * Moved the commands for add/drop column to Jifty::Record (they should move
+   to JDBI eventually)
+ * Added a drop_table to Jifty::Record
+  - jesse
+
+ * Added the before_access trigger and a simple test for it. Also updated
+   TestApp and the current_user test to make them compatible with the new
+   before_access test. - sterling
+
+ * '*' matches only a single level in the dispatcher. '**' matches all level.s
+   We want to run the "Home" rule at all dispatcher levels.
+ 
+  - jesse
+
+ * Make compile errors in autorequired modules fatal - jesse
+
+ * FCGI.pm ties our streams and its implementation doesn't have support for
+   setting IO layers with binmode, but we can do the same using
+   Encode::encode. We just turn on raw mode on STDOUT and convert to octets
+   ourself using Encode.pm and charset definition from the content type
+   field. - ruz
+
+ * Extensive UTF8 improvement: to sanity through insanity
+
+* control mode of output handles, if content type has charset defined
+    then we set :encoding(<charset>) output layer (or :utf8), otherwise
+    binary
+  * regions are special as we print out them into STDOUT, but sometimes
+    need them as a string. We localize STDOUT and get data, however because
+    of the above canonicalization we get octets or binary, so we check
+    again the current content type. If the type contains charset definition
+    then we decode octets back into perl string(in terms of perl unicode support),
+    otherwise we leave things as is.
+  
+  jifty is sane when apps' developers are sane
+  * never use 'bytes' pragma
+  * avoid using 'encoding' pragma
+  * use perl strings in jifty
+  ** when you get a text data from external sources then Encode::decode it
+  * set output encoding with $r->content_type('type/subtype; charset=XXX')
+  ** by default it's UTF-8
+  ** you can use cp1251 (or other) and things should work, user will get
+     data in cp1251 and browser should display it right
+  ** don't Encode::encode things before output
+  
+  everybody have own critirea of sanity
+  * if you think that something is wrong then add tests to jifty 
+  
+     - ruz
+
+ * we shouldn't silence utf8 warnings - ruz
+
+ * utf8::downgrade converts to octets only if string had been upgraded, what
+   is not always true for 'perl strings' - ruz
+
+ * escape_utf8
+  * don't use bytes just escape things doesn't matter if it's
+    flagged string or not, perl must do the right thing.
+  * don't localize ref, use it directly, afaik smaller
+    memory footprint - ruz
+  
+ * utf8::downgrade doesn't like strings as FAIL_OK, only integers, 1 is not
+   that cool as 'FAILURE IS OK', but works - ruz
+
+ * initial environment that makes fastcgi work got deleted - jesse
+
+*      This module is for rendering a collection of input fields at once
+        as a single widget. The major goal is to let developer say like:
+   
+     column bars =>
+       refers_to "My::Model::BarCollection",
+       render as "Collection"
+       availables are defer {
+           retrieve_some_bars()
+       };
+   
+   in their model class, and it'll just display a nice form to input
+   the value for a list of available bars. - gugod
+   
+
+ * fixed Jifty::View::Declare::Helpers since we now install tag subs directly
+   to the target package instead of using @EXPORT. We now makes use of
+   T::D::Tags's @TagSubs struct - agentz
+
+
+
 Jifty 0.70422
 
 [Password Authentication plugin]

Modified: jifty/branches/virtual-models/MANIFEST
==============================================================================
--- jifty/branches/virtual-models/MANIFEST	(original)
+++ jifty/branches/virtual-models/MANIFEST	Tue Sep 11 14:03:32 2007
@@ -1,5 +1,6 @@
 AUTHORS
 bin/build_par
+bin/generate-changelog
 bin/jifty
 bin/runcover
 bin/service
@@ -67,17 +68,6 @@
 examples/Doxory/share/po/zh_cn.po
 examples/Doxory/share/po/zh_tw.po
 examples/Doxory/t/00-model-User.t
-examples/Example-Todo/bin/jifty
-examples/Example-Todo/etc/config.yml
-examples/Example-Todo/example_todo
-examples/Example-Todo/inc/Module/Install.pm
-examples/Example-Todo/inc/Module/Install/Base.pm
-examples/Example-Todo/inc/Module/Install/Metadata.pm
-examples/Example-Todo/inc/Module/Install/WriteAll.pm
-examples/Example-Todo/lib/Example/Todo/Model/Todo.pm
-examples/Example-Todo/Makefile.PL
-examples/Example-Todo/META.yml
-examples/Example-Todo/t/00-model-Todo.t
 examples/HelloKitty/bin/jifty
 examples/HelloKitty/etc/config.yml
 examples/HelloKitty/hellokitty
@@ -103,6 +93,26 @@
 examples/Ping/share/web/templates/index.html
 examples/Ping/t/00compile.t
 examples/Ping/t/01startup.t
+examples/Yada/bin/jifty
+examples/Yada/etc/config.yml
+examples/Yada/inc/Module/Install.pm
+examples/Yada/inc/Module/Install/Base.pm
+examples/Yada/inc/Module/Install/Can.pm
+examples/Yada/inc/Module/Install/Fetch.pm
+examples/Yada/inc/Module/Install/Makefile.pm
+examples/Yada/inc/Module/Install/Metadata.pm
+examples/Yada/inc/Module/Install/Win32.pm
+examples/Yada/inc/Module/Install/WriteAll.pm
+examples/Yada/lib/Example/Todo/Model/Todo.pm
+examples/Yada/lib/Yada.pm
+examples/Yada/lib/Yada/Model/Todo.pm
+examples/Yada/lib/Yada/Model/User.pm
+examples/Yada/lib/Yada/View.pm
+examples/Yada/lib/Yada/View/Todo.pm
+examples/Yada/Makefile.PL
+examples/Yada/META.yml
+examples/Yada/share/web/static/js/Asynapse/REST.js
+examples/Yada/t/00-model-Todo.t
 inc/Module/AutoInstall.pm
 inc/Module/Install.pm
 inc/Module/Install/AutoInstall.pm
@@ -174,7 +184,15 @@
 lib/Jifty/Param.pm
 lib/Jifty/Param/Schema.pm
 lib/Jifty/Plugin.pm
+lib/Jifty/Plugin/ActorMetadata.pm
+lib/Jifty/Plugin/ActorMetadata/Mixin/Model/ActorMetadata.pm
 lib/Jifty/Plugin/AdminUI.pm
+lib/Jifty/Plugin/Authentication/Facebook.pm
+lib/Jifty/Plugin/Authentication/Facebook/Action/LinkFacebookUser.pm
+lib/Jifty/Plugin/Authentication/Facebook/Action/LoginFacebookUser.pm
+lib/Jifty/Plugin/Authentication/Facebook/Dispatcher.pm
+lib/Jifty/Plugin/Authentication/Facebook/Mixin/Model/User.pm
+lib/Jifty/Plugin/Authentication/Facebook/View.pm
 lib/Jifty/Plugin/Authentication/Password.pm
 lib/Jifty/Plugin/Authentication/Password/Action/ConfirmEmail.pm
 lib/Jifty/Plugin/Authentication/Password/Action/GeneratePasswordToken.pm
@@ -190,23 +208,61 @@
 lib/Jifty/Plugin/Authentication/Password/Notification/ConfirmEmail.pm
 lib/Jifty/Plugin/Authentication/Password/Notification/ConfirmLostPassword.pm
 lib/Jifty/Plugin/Authentication/Password/View.pm
+lib/Jifty/Plugin/Chart.pm
+lib/Jifty/Plugin/Chart/Dispatcher.pm
+lib/Jifty/Plugin/Chart/Renderer.pm
+lib/Jifty/Plugin/Chart/Renderer/Chart.pm
+lib/Jifty/Plugin/Chart/Renderer/GD/Graph.pm
+lib/Jifty/Plugin/Chart/Renderer/PlotKit.pm
+lib/Jifty/Plugin/Chart/Renderer/SimpleBars.pm
+lib/Jifty/Plugin/Chart/Renderer/XMLSWF.pm
+lib/Jifty/Plugin/Chart/View.pm
+lib/Jifty/Plugin/Chart/Web.pm
 lib/Jifty/Plugin/ClassLoader.pm
 lib/Jifty/Plugin/CompressedCSSandJS.pm
 lib/Jifty/Plugin/CompressedCSSandJS/Dispatcher.pm
+lib/Jifty/Plugin/Debug.pm
+lib/Jifty/Plugin/Debug/Dispatcher.pm
 lib/Jifty/Plugin/ErrorTemplates.pm
 lib/Jifty/Plugin/ErrorTemplates/View.pm
+lib/Jifty/Plugin/Feedback.pm
+lib/Jifty/Plugin/Feedback/Action/SendFeedback.pm
+lib/Jifty/Plugin/Feedback/View.pm
+lib/Jifty/Plugin/GoogleMap.pm
+lib/Jifty/Plugin/GoogleMap/Widget.pm
 lib/Jifty/Plugin/Halo.pm
+lib/Jifty/Plugin/JQuery.pm
 lib/Jifty/Plugin/LetMe.pm
 lib/Jifty/Plugin/LetMe/Dispatcher.pm
 lib/Jifty/Plugin/OnlineDocs.pm
 lib/Jifty/Plugin/OnlineDocs/Dispatcher.pm
+lib/Jifty/Plugin/OpenID.pm
+lib/Jifty/Plugin/OpenID/Action/AuthenticateOpenID.pm
+lib/Jifty/Plugin/OpenID/Action/CreateOpenIDUser.pm
+lib/Jifty/Plugin/OpenID/Action/VerifyOpenID.pm
+lib/Jifty/Plugin/OpenID/Dispatcher.pm
+lib/Jifty/Plugin/OpenID/Mixin/Model/User.pm
+lib/Jifty/Plugin/OpenID/View.pm
 lib/Jifty/Plugin/REST.pm
 lib/Jifty/Plugin/REST/Dispatcher.pm
+lib/Jifty/Plugin/SinglePage.pm
+lib/Jifty/Plugin/SinglePage/Dispatcher.pm
+lib/Jifty/Plugin/SiteNews.pm
+lib/Jifty/Plugin/SiteNews/Dispatcher.pm
+lib/Jifty/Plugin/SiteNews/Mixin/Model/News.pm
+lib/Jifty/Plugin/SiteNews/View/News.pm
 lib/Jifty/Plugin/SkeletonApp.pm
 lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm
 lib/Jifty/Plugin/SkeletonApp/View.pm
+lib/Jifty/Plugin/TabView/View.pm
 lib/Jifty/Plugin/User.pm
 lib/Jifty/Plugin/User/Mixin/Model/User.pm
+lib/Jifty/Plugin/Userpic.pm
+lib/Jifty/Plugin/Userpic/Dispatcher.pm
+lib/Jifty/Plugin/Userpic/View.pm
+lib/Jifty/Plugin/Userpic/Widget.pm
+lib/Jifty/Plugin/UUID.pm
+lib/Jifty/Plugin/UUID/Widget.pm
 lib/Jifty/Plugin/Yullio/View.pm
 lib/Jifty/Record.pm
 lib/Jifty/Request.pm
@@ -214,10 +270,12 @@
 lib/Jifty/Response.pm
 lib/Jifty/Result.pm
 lib/Jifty/RightsFrom.pm
+lib/Jifty/Schema.pm
 lib/Jifty/Script.pm
 lib/Jifty/Script/Action.pm
 lib/Jifty/Script/Adopt.pm
 lib/Jifty/Script/App.pm
+lib/Jifty/Script/Console.pm
 lib/Jifty/Script/Deps.pm
 lib/Jifty/Script/Env.pm
 lib/Jifty/Script/FastCGI.pm
@@ -240,11 +298,15 @@
 lib/Jifty/Upgrade.pm
 lib/Jifty/Upgrade/Internal.pm
 lib/Jifty/Util.pm
+lib/Jifty/View.pm
 lib/Jifty/View/Declare.pm
 lib/Jifty/View/Declare/BaseClass.pm
+lib/Jifty/View/Declare/Compile.pm
 lib/Jifty/View/Declare/CoreTemplates.pm
+lib/Jifty/View/Declare/CRUD.pm
 lib/Jifty/View/Declare/Handler.pm
 lib/Jifty/View/Declare/Helpers.pm
+lib/Jifty/View/Declare/Page.pm
 lib/Jifty/View/Mason/Handler.pm
 lib/Jifty/View/Static/Handler.pm
 lib/Jifty/Web.pm
@@ -254,6 +316,7 @@
 lib/Jifty/Web/Form/Field.pm
 lib/Jifty/Web/Form/Field/Button.pm
 lib/Jifty/Web/Form/Field/Checkbox.pm
+lib/Jifty/Web/Form/Field/Collection.pm
 lib/Jifty/Web/Form/Field/Combobox.pm
 lib/Jifty/Web/Form/Field/Date.pm
 lib/Jifty/Web/Form/Field/Hidden.pm
@@ -352,6 +415,47 @@
 plugins/AuthzLDAP/share/po/fr.po
 plugins/AuthzLDAP/share/web/templates/error/AccessDenied
 plugins/AuthzLDAP/t/00-load.t
+plugins/CodePress/doc/index.html
+plugins/CodePress/lib/Jifty/Plugin/CodePress.pm
+plugins/CodePress/lib/Jifty/Plugin/CodePress/Textarea.pm
+plugins/CodePress/Makefile.PL
+plugins/CodePress/share/web/static/codepress/codepress.css
+plugins/CodePress/share/web/static/codepress/codepress.html
+plugins/CodePress/share/web/static/codepress/engines/gecko.js
+plugins/CodePress/share/web/static/codepress/engines/khtml.js
+plugins/CodePress/share/web/static/codepress/engines/msie.js
+plugins/CodePress/share/web/static/codepress/engines/older.js
+plugins/CodePress/share/web/static/codepress/engines/opera.js
+plugins/CodePress/share/web/static/codepress/images/line-numbers.png
+plugins/CodePress/share/web/static/codepress/languages/asp.css
+plugins/CodePress/share/web/static/codepress/languages/asp.js
+plugins/CodePress/share/web/static/codepress/languages/csharp.css
+plugins/CodePress/share/web/static/codepress/languages/csharp.js
+plugins/CodePress/share/web/static/codepress/languages/css.css
+plugins/CodePress/share/web/static/codepress/languages/css.js
+plugins/CodePress/share/web/static/codepress/languages/generic.css
+plugins/CodePress/share/web/static/codepress/languages/generic.js
+plugins/CodePress/share/web/static/codepress/languages/html.css
+plugins/CodePress/share/web/static/codepress/languages/html.js
+plugins/CodePress/share/web/static/codepress/languages/java.css
+plugins/CodePress/share/web/static/codepress/languages/java.js
+plugins/CodePress/share/web/static/codepress/languages/javascript.css
+plugins/CodePress/share/web/static/codepress/languages/javascript.js
+plugins/CodePress/share/web/static/codepress/languages/perl.css
+plugins/CodePress/share/web/static/codepress/languages/perl.js
+plugins/CodePress/share/web/static/codepress/languages/php.css
+plugins/CodePress/share/web/static/codepress/languages/php.js
+plugins/CodePress/share/web/static/codepress/languages/ruby.css
+plugins/CodePress/share/web/static/codepress/languages/ruby.js
+plugins/CodePress/share/web/static/codepress/languages/sql.css
+plugins/CodePress/share/web/static/codepress/languages/sql.js
+plugins/CodePress/share/web/static/codepress/languages/text.css
+plugins/CodePress/share/web/static/codepress/languages/text.js
+plugins/CodePress/share/web/static/codepress/languages/vbscript.css
+plugins/CodePress/share/web/static/codepress/languages/vbscript.js
+plugins/CodePress/share/web/static/codepress/languages/xsl.css
+plugins/CodePress/share/web/static/codepress/languages/xsl.js
+plugins/CodePress/share/web/static/js/codepress.js
 plugins/DumpDispatcher/lib/Jifty/Plugin/DumpDispatcher.pm
 plugins/DumpDispatcher/Makefile.PL
 plugins/EditInPlace/debian/changelog
@@ -760,6 +864,71 @@
 plugins/ProfileBehaviour/Makefile.PL
 plugins/ProfileBehaviour/share/web/static/css/behaviour-profile.css
 plugins/ProfileBehaviour/share/web/static/js/behaviour.js
+plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar.pm
+plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Dispatcher.pm
+plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Textarea.pm
+plugins/WikiToolbar/Makefile.PL
+plugins/WikiToolbar/share/web/static/img/wt/bold.png
+plugins/WikiToolbar/share/web/static/img/wt/box.png
+plugins/WikiToolbar/share/web/static/img/wt/center.png
+plugins/WikiToolbar/share/web/static/img/wt/code.png
+plugins/WikiToolbar/share/web/static/img/wt/code1.png
+plugins/WikiToolbar/share/web/static/img/wt/empty.png
+plugins/WikiToolbar/share/web/static/img/wt/h1.png
+plugins/WikiToolbar/share/web/static/img/wt/h2.png
+plugins/WikiToolbar/share/web/static/img/wt/h3.png
+plugins/WikiToolbar/share/web/static/img/wt/italic.png
+plugins/WikiToolbar/share/web/static/img/wt/link.png
+plugins/WikiToolbar/share/web/static/img/wt/linkextern.png
+plugins/WikiToolbar/share/web/static/img/wt/new.png
+plugins/WikiToolbar/share/web/static/img/wt/ol.png
+plugins/WikiToolbar/share/web/static/img/wt/red.png
+plugins/WikiToolbar/share/web/static/img/wt/strike.png
+plugins/WikiToolbar/share/web/static/img/wt/tab.png
+plugins/WikiToolbar/share/web/static/img/wt/ul.png
+plugins/WikiToolbar/share/web/static/img/wt/underline.png
+plugins/WikiToolbar/share/web/static/js/wikitoolbar.js
+plugins/WyzzEditor/lib/Jifty/Plugin/WyzzEditor.pm
+plugins/WyzzEditor/lib/Jifty/Plugin/WyzzEditor/Dispatcher.pm
+plugins/WyzzEditor/lib/Jifty/Plugin/WyzzEditor/Textarea.pm
+plugins/WyzzEditor/Makefile.PL
+plugins/WyzzEditor/share/web/static/img/wyzzicons/backcolor.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/bold.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/close.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/copy.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/cut.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/downsize.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/font.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/forecolor.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/headers.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/help.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/htmlmode.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/indent.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/inserthorizontalrule.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/insertimage.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/insertorderedlist.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/insertunorderedlist.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/italic.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/justifycenter.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/justifyfull.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/justifyleft.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/justifyright.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/link.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/outdent.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/paste.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/redo.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/removeformat.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/specialchar.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/strikethrough.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/subscript.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/superscript.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/underline.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/undo.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/upsize.gif
+plugins/WyzzEditor/share/web/static/img/wyzzicons/wyzzicon.gif
+plugins/WyzzEditor/share/web/static/js/wyzz.js
+plugins/WyzzEditor/share/web/static/wyzzstyles/editarea.css
+plugins/WyzzEditor/share/web/static/wyzzstyles/style.css
 README
 share/dtd/xhtml-lat1.ent
 share/dtd/xhtml-special.ent
@@ -776,6 +945,37 @@
 share/plugins/Jifty/Plugin/AdminUI/web/templates/__jifty/admin/fragments/list/view
 share/plugins/Jifty/Plugin/AdminUI/web/templates/__jifty/admin/index.html
 share/plugins/Jifty/Plugin/AdminUI/web/templates/__jifty/admin/model/dhandler
+share/plugins/Jifty/Plugin/Chart/web/static/css/simple_bars.css
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/arno.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/arst.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/brfl.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/brno.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/brst.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/cl3d.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/clfl.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/clno.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/clp3.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/cls3.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/clst.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/cnno.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/lnno.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/mxno.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/pi3d.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/pino.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/pono.swf
+share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/scno.swf
+share/plugins/Jifty/Plugin/Chart/web/static/js/chart_img_behaviour.js
+share/plugins/Jifty/Plugin/Chart/web/static/js/mochikit.noexport.js
+share/plugins/Jifty/Plugin/Chart/web/static/js/MochiKit/__package__.js
+share/plugins/Jifty/Plugin/Chart/web/static/js/MochiKit/MochiKit.js
+share/plugins/Jifty/Plugin/Chart/web/static/js/PlotKit/excanvas.js
+share/plugins/Jifty/Plugin/Chart/web/static/js/PlotKit/PlotKit_Packed-20060807-custom.js
+share/plugins/Jifty/Plugin/Chart/web/static/js/simple_bars.js
+share/plugins/Jifty/Plugin/GoogleMap/web/static/css/google_map.css
+share/plugins/Jifty/Plugin/GoogleMap/web/static/js/google_map.js
+share/plugins/Jifty/Plugin/JQuery/web/static/js/jquery.js
+share/plugins/Jifty/Plugin/JQuery/web/static/js/noConflict.js
 share/plugins/Jifty/Plugin/OnlineDocs/web/templates/__jifty/online_docs/autohandler
 share/plugins/Jifty/Plugin/OnlineDocs/web/templates/__jifty/online_docs/content.html
 share/plugins/Jifty/Plugin/OnlineDocs/web/templates/__jifty/online_docs/index.html
@@ -783,6 +983,7 @@
 share/po/en.po
 share/po/fr.po
 share/po/ja.po
+share/po/ru.po
 share/po/zh_cn.po
 share/po/zh_tw.po
 share/web/static/css/app-base.css
@@ -874,12 +1075,14 @@
 share/web/static/js/scriptaculous/slider.js
 share/web/static/js/scriptaculous/unittest.js
 share/web/static/js/setup_jsan.js
+share/web/static/js/template_declare.js
 share/web/static/js/yui/calendar.js
 share/web/static/js/yui/container.js
 share/web/static/js/yui/dom.js
 share/web/static/js/yui/element-beta.js
 share/web/static/js/yui/event.js
 share/web/static/js/yui/menu.js
+share/web/static/js/yui/oom_select.patch
 share/web/static/js/yui/tabview.js
 share/web/static/js/yui/yahoo.js
 share/web/templates/=/subs
@@ -926,10 +1129,13 @@
 t/08-client.t
 t/09-url.t
 t/10-i18n.t
+t/10-utf8.t
 t/11-config-files.t
 t/12-param-schema.t
+t/13-sessions.t
 t/99-pod-coverage.t
 t/99-pod.t
+t/clientside/td.t
 t/Continuations/bin/jifty
 t/Continuations/lib/Continuations/Action/CrossBridge.pm
 t/Continuations/lib/Continuations/Action/GetGrail.pm
@@ -958,6 +1164,27 @@
 t/Mapper/t/00-prototype.t
 t/Mapper/t/01-raw-api.t
 t/Mapper/t/02-api.t
+t/TestApp-Plugin-AppPluginHasModels/bin/jifty
+t/TestApp-Plugin-AppPluginHasModels/etc/config.yml
+t/TestApp-Plugin-AppPluginHasModels/lib/TestApp/Plugin/AppPluginHasModels/Plugin/MyAppPlugin.pm
+t/TestApp-Plugin-AppPluginHasModels/lib/TestApp/Plugin/AppPluginHasModels/Plugin/MyAppPlugin/Model/Color.pm
+t/TestApp-Plugin-AppPluginHasModels/Makefile.PL
+t/TestApp-Plugin-AppPluginHasModels/t/plugin-model.t
+t/TestApp-Plugin-Chart/bin/jifty
+t/TestApp-Plugin-Chart/etc/config.yml
+t/TestApp-Plugin-Chart/lib/TestApp/Plugin/Chart/View.pm
+t/TestApp-Plugin-Chart/Makefile.PL
+t/TestApp-Plugin-Chart/t/chart.t
+t/TestApp-Plugin-Chart/t/gd_graph.t
+t/TestApp-Plugin-JQuery/bin/jifty
+t/TestApp-Plugin-JQuery/etc/config.yml
+t/TestApp-Plugin-JQuery/Makefile.PL
+t/TestApp-Plugin-JQuery/t/jquery.t
+t/TestApp-Plugin-News/bin/jifty
+t/TestApp-Plugin-News/etc/config.yml
+t/TestApp-Plugin-News/lib/TestApp/Plugin/News/Model/News.pm
+t/TestApp-Plugin-News/lib/TestApp/Plugin/News/View.pm
+t/TestApp-Plugin-News/Makefile.PL
 t/TestApp-Plugin-PasswordAuth/bin/jifty
 t/TestApp-Plugin-PasswordAuth/etc/config.yml
 t/TestApp-Plugin-PasswordAuth/lib/TestApp/Plugin/FasterSwallow.pm
@@ -970,6 +1197,7 @@
 t/TestApp-Plugin-PasswordAuth/t/00-model-User.t
 t/TestApp-Plugin-PasswordAuth/t/01-tokengen.t
 t/TestApp-Plugin-PasswordAuth/t/11-current_user.t
+t/TestApp-Plugin-PasswordAuth/t/12-i18n.t
 t/TestApp-Plugin-PasswordAuth/t/12-signup.t
 t/TestApp-Plugin-REST/bin/jifty
 t/TestApp-Plugin-REST/etc/config.yml
@@ -992,10 +1220,12 @@
 t/TestApp/lib/TestApp/View/base.pm
 t/TestApp/lib/TestApp/View/instance.pm
 t/TestApp/share/web/static/images/pony.jpg
+t/TestApp/share/web/templates/_elements/wrapper
 t/TestApp/share/web/templates/concrete.html
 t/TestApp/share/web/templates/currentuser
 t/TestApp/share/web/templates/dispatch/basic
 t/TestApp/share/web/templates/dispatch/basic-show
+t/TestApp/share/web/templates/dispatch/protocol
 t/TestApp/share/web/templates/dosomethingelse
 t/TestApp/share/web/templates/editform
 t/TestApp/share/web/templates/index.html
@@ -1003,7 +1233,6 @@
 t/TestApp/share/web/templates/path_test/foo/index.html
 t/TestApp/share/web/templates/path_test/in_both
 t/TestApp/share/web/templates/path_test/mason_only
-t/TestApp/share/web/templates/redirected
 t/TestApp/share/web/templates/regions/list
 t/TestApp/share/web/templates/regions/long
 t/TestApp/share/web/templates/regions/short
@@ -1011,6 +1240,8 @@
 t/TestApp/t/00-model-User.t
 t/TestApp/t/00-prototype.t
 t/TestApp/t/01-config.t
+t/TestApp/t/02-dispatch-http.t
+t/TestApp/t/02-dispatch-https.t
 t/TestApp/t/02-dispatch-show-rule-in-wrong-ruleset.t
 t/TestApp/t/02-dispatch.t
 t/TestApp/t/03-static.t
@@ -1028,10 +1259,13 @@
 t/TestApp/t/13-page-regions.t
 t/TestApp/t/14-template-paths.t
 t/TestApp/t/15-template-subclass.t
+t/TestApp/t/16-template-region.t
+t/TestApp/t/17-template-region-internal-redirect.t
+t/TestApp/t/before_access.t
 t/TestApp/t/config-Cachable
 t/TestApp/t/config-Record
 t/TestApp/t/i18n-standalone.t
 t/TestApp/t/instance_id.t
 t/TestApp/t/regex_meta_in_path_info.t
 t/TestApp/t/upgrade.t
-t/TestApp/testapp
+t/TestApp/t/use_mason_wrapper.t

Modified: jifty/branches/virtual-models/META.yml
==============================================================================
--- jifty/branches/virtual-models/META.yml	(original)
+++ jifty/branches/virtual-models/META.yml	Tue Sep 11 14:03:32 2007
@@ -22,10 +22,14 @@
 recommends: 
   Apache2::Const: 0
   Cache::FileCache: 0
+  Chart::Base: 0
   Class::Accessor::Named: 0
   DBD::SQLite: 0
   Devel::Cover: 0
   Devel::EvalContext: 0
+  GD: 0
+  GD::Graph: 0
+  Image::Info: 0
   LWPx::ParanoidAgent: 0
   Module::CoreList: 0
   Module::Install::Admin: 0.50
@@ -40,6 +44,7 @@
   Test::MockModule: 0.05
   Test::MockObject: 1.07
   WWW::Facebook::API: 0.3.6
+  XML::Simple: 0
 requires: 
   App::CLI: 0.03
   CGI: 3.19
@@ -50,7 +55,7 @@
   Class::Accessor: 0
   Class::Container: 0
   Class::Data::Inheritable: 0
-  Class::Trigger: 0
+  Class::Trigger: 0.12
   Compress::Zlib: 0
   Crypt::CBC: 0
   Crypt::Rijndael: 0
@@ -105,16 +110,17 @@
   Scalar::Defer: 0.10
   Shell::Command: 0
   String::Koremutake: 0
-  Template::Declare: 0.21
+  Template::Declare: 0.26
   Test::Base: 0
   Test::Log4perl: 0
   Test::LongString: 0
   Test::More: 0.62
   Test::Pod::Coverage: 0
   Test::WWW::Mechanize: 1.04
+  Test::WWW::Selenium: 0
   UNIVERSAL::require: 0
-  URI: 0
-  WWW::Mechanize: 1.12
+  URI: 1.31
+  WWW::Mechanize: 1.3
   XML::Simple: 0
   XML::Writer: 0.601
   XML::XPath: 0
@@ -122,5 +128,5 @@
   YAML::Syck: 0.71
   perl: 5.8.3
   version: 0
-tests: t/*.t t/*/t/*.t
-version: 0.70422
+tests: t/*.t t/*/*.t t/*/*/*.t t/*/*/*/*.t
+version: 0.70824

Modified: jifty/branches/virtual-models/Makefile.PL
==============================================================================
--- jifty/branches/virtual-models/Makefile.PL	(original)
+++ jifty/branches/virtual-models/Makefile.PL	Tue Sep 11 14:03:32 2007
@@ -8,7 +8,7 @@
 requires('Class::Accessor'); # Class::Accessor::Fast
 requires('Class::Container');
 requires('Class::Data::Inheritable');
-requires('Class::Trigger');
+requires('Class::Trigger' => '0.12');
 requires('CGI' => '3.19');
 requires('CGI::Cookie::Splitter');
 requires('Crypt::CBC');
@@ -70,14 +70,15 @@
 requires('Template::Declare' => '0.07');                # Template::Declare::Tags
 requires('Template::Declare' => '0.26');                # Template::Declare::Tags
 requires('Test::Base');
-requires('Test::LongString');
 requires('Test::Log4perl');
+requires('Test::LongString');
 requires('Test::More' => 0.62 ),
 requires('Test::Pod::Coverage'),
 requires('Test::WWW::Mechanize' => 1.04 ),
-requires('WWW::Mechanize' => 1.12 ),
+requires('Test::WWW::Selenium'),
+requires('WWW::Mechanize' => 1.30 ),
 requires('UNIVERSAL::require');
-requires('URI');
+requires('URI' => 1.31);
 requires('XML::Writer' => '0.601');
 requires('XML::Simple');
 requires('XML::XPath');

Modified: jifty/branches/virtual-models/SIGNATURE
==============================================================================
--- jifty/branches/virtual-models/SIGNATURE	(original)
+++ jifty/branches/virtual-models/SIGNATURE	Tue Sep 11 14:03:32 2007
@@ -14,22 +14,23 @@
 -----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
-SHA1 7ce15e058bb6a72aa237ac58e0fbce934b2fef5c AUTHORS
-SHA1 876166ca6f2cf7bfa6a6137070beb1b55b4bc4ce Changelog
-SHA1 ed26a91a1edcc0aed0509bc7384b2d24cfd13d89 MANIFEST
+SHA1 17176d35b4f890942d4925d177aa5ee738bc8087 AUTHORS
+SHA1 cb3f86d393183a717f1a46f824c6aaf0d9aade49 Changelog
+SHA1 badc3476b33310cfcb8260c1fc108196acf5f54f MANIFEST
 SHA1 d4adbf5948041cd460da5cb7ad21394a790e2022 MANIFEST.SKIP
-SHA1 f1583a94e31ca844b8d9e2fcd4a239570495c6d3 META.yml
-SHA1 371fc084afa58a74bed4dee9bd09d5b1c544139c Makefile.PL
+SHA1 64dceae5347277836a681070a3da49806f374db8 META.yml
+SHA1 7e06c5f49d98ac8808694f6b41246fdb0de5e564 Makefile.PL
 SHA1 e395a2eabaf8faf8266dedc664c1eb52c6c589cf README
 SHA1 aaf8f7a1025fc97077072672f325e2a5f3c03a41 bin/build_par
-SHA1 f7f44f9a7337def0c97f981073e3ed970851d9ae bin/jifty
+SHA1 36c2486a0102933488558d0734b9e222d53a059b bin/generate-changelog
+SHA1 c1ff9ff7f2a88bc4306b3866b6b80fb9aa8e8423 bin/jifty
 SHA1 bc5d0dc181bffe0694e5282c2d2336eaec5a06ff bin/runcover
 SHA1 9a91a81e3db1a12368153fed9e504aad492cd971 bin/service
 SHA1 543a2677f66d3c8ca671b790509b6c1721ac6270 bin/xgettext
 SHA1 1c042485ba8a21f0f124dd8ed412d43d3805430e debian/README
-SHA1 dee0467ffdb9142223c49789a447ba5dd299c28d debian/changelog
+SHA1 abd0bc47e8f6e42610dc1349564f9ab2a71d3857 debian/changelog
 SHA1 5d9474c0309b7ca09a182d888f73b37a8fe1362c debian/compat
-SHA1 c9a13c7f88cc191d5167bbdeebf5e7abbd776b0b debian/control
+SHA1 d12729a01ca782356f865b814b6ed0395220dfa0 debian/control
 SHA1 8fc130ffa6d53c47d94eab1616887c511d54d61f debian/rules
 SHA1 b8bb315ef8fbdd2f069b6339ad0461b5d933d7da doc/ajax-upgraded-links
 SHA1 a0d03921821ca39ea461f1f9fa812fdbb5f501a0 doc/building_a_par
@@ -88,22 +89,11 @@
 SHA1 149b55cfb72c0def0ab7b495445baf8c631ce621 examples/Doxory/share/po/zh_cn.po
 SHA1 bec6af6333016377d442c59bdaaf32ab65a31e4a examples/Doxory/share/po/zh_tw.po
 SHA1 561110ddd8574426cb578a3c81d356bdc4fa47f3 examples/Doxory/t/00-model-User.t
-SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709 examples/Example-Todo/META.yml
-SHA1 aef127e349b9e06adaad2bec98622582c175e795 examples/Example-Todo/Makefile.PL
-SHA1 f7f44f9a7337def0c97f981073e3ed970851d9ae examples/Example-Todo/bin/jifty
-SHA1 3edcfa5651b780a6e31e4c0e6ad28f3bf22c45ea examples/Example-Todo/etc/config.yml
-SHA1 751fdf0397a92d3bc7f034b3fd08b3438b0eb27f examples/Example-Todo/example_todo
-SHA1 9b2f9d83bcf77860f53a0c07c90a4a59ad9f5df1 examples/Example-Todo/inc/Module/Install.pm
-SHA1 abe32855d75ab13747cf65765af9947b7a8c3057 examples/Example-Todo/inc/Module/Install/Base.pm
-SHA1 381bb98ea3877bba49ae85e7a7ea130645fd3dbf examples/Example-Todo/inc/Module/Install/Metadata.pm
-SHA1 e827d6d43771032fa3df35c0ad5e5698d0e54cda examples/Example-Todo/inc/Module/Install/WriteAll.pm
-SHA1 46730854dc7241dc334b546eef267fde8df24aea examples/Example-Todo/lib/Example/Todo/Model/Todo.pm
-SHA1 61d12c9d3bb174aad4856349686c9e71e75fa7e0 examples/Example-Todo/t/00-model-Todo.t
 SHA1 3b22513afb560789fb0f38f50c55249d70f1b06d examples/HelloKitty/Makefile.PL
 SHA1 a7dc1f376cac630ea28d2965e561469deb951cc7 examples/HelloKitty/bin/jifty
 SHA1 dd97d225e86ab1cb13eabaab12a9b1bfb2410cff examples/HelloKitty/etc/config.yml
 SHA1 24d7e3ade49a5a3a7dd4f2dd74e836bafcbbbedf examples/HelloKitty/hellokitty
-SHA1 2ac96cfdb02f3a3fe5550ceb0442d9a30f7120c9 examples/HelloKitty/lib/HelloKitty/View.pm
+SHA1 c60d5ee79df486d88384b63731a883e3f922e94e examples/HelloKitty/lib/HelloKitty/View.pm
 SHA1 4db882e66864fa40a6532ce5b83699839804b062 examples/MyWeblog/Makefile.PL
 SHA1 a7dc1f376cac630ea28d2965e561469deb951cc7 examples/MyWeblog/bin/jifty
 SHA1 d1394cef410a14394a05e2a6e6a9b32c059cb5d6 examples/MyWeblog/etc/config.yml
@@ -124,57 +114,77 @@
 SHA1 05ac283a14e76750d63678d0864a0403aa18fd28 examples/Ping/share/web/templates/index.html
 SHA1 53c8822ddf426e82fe239e4470574913411b1355 examples/Ping/t/00compile.t
 SHA1 6d6c378447f9d74d53c06a2a027736b48b5d0670 examples/Ping/t/01startup.t
+SHA1 0d7b61a9ed50444ec98fd289965a8ce9b6d672bd examples/Yada/META.yml
+SHA1 f3ef104950d63f97e7af2ed9bf7dc3f1cf2b80e2 examples/Yada/Makefile.PL
+SHA1 f7f44f9a7337def0c97f981073e3ed970851d9ae examples/Yada/bin/jifty
+SHA1 a9eb5dfc39cebc63c97f5424bb48f343ca025872 examples/Yada/etc/config.yml
+SHA1 527aa5e20eec84dc92664ac55a10884c08b740d1 examples/Yada/inc/Module/Install.pm
+SHA1 8ea4e37df83fd0c1c050be5c8da75545c3828d9b examples/Yada/inc/Module/Install/Base.pm
+SHA1 1da6031583c32f0d1ec073b8376102fc51427dcc examples/Yada/inc/Module/Install/Can.pm
+SHA1 b779375b90c16af2f31f38a1dd2b5df223c7f2fb examples/Yada/inc/Module/Install/Fetch.pm
+SHA1 2054450e1e9c1dd8056362bf4a64ae70d5d71476 examples/Yada/inc/Module/Install/Makefile.pm
+SHA1 5d6189b2cad15cf9932a28faafd55130c8247e83 examples/Yada/inc/Module/Install/Metadata.pm
+SHA1 02af973fae2ac3531fa6b704574b2b8cb2a08148 examples/Yada/inc/Module/Install/Win32.pm
+SHA1 3a2eab96e91cca8d99938cda7791759ae9d97b3a examples/Yada/inc/Module/Install/WriteAll.pm
+SHA1 46730854dc7241dc334b546eef267fde8df24aea examples/Yada/lib/Example/Todo/Model/Todo.pm
+SHA1 734d769faa9a5ae707d8e3bd742dad292742bacc examples/Yada/lib/Yada.pm
+SHA1 b5e82d9dee0d684c4fe0d1a7b858ce87c0c34fb0 examples/Yada/lib/Yada/Model/Todo.pm
+SHA1 652573c9942ef061f3f5c1586e17fb7459a1121f examples/Yada/lib/Yada/Model/User.pm
+SHA1 3a00cd6582f64cf415c67a42ff82dd443e70cf87 examples/Yada/lib/Yada/View.pm
+SHA1 d2cca2c7dc363386dbad6719ee7480308c6bcd6b examples/Yada/lib/Yada/View/Todo.pm
+SHA1 8c476f9ee97286679a557fe41e8142966c0bf1c6 examples/Yada/share/web/static/js/Asynapse/REST.js
+SHA1 d3d09b975c3cf85e257e9316fc2442f336fefd65 examples/Yada/t/00-model-Todo.t
 SHA1 603bb9de29fb8cba7f13409c546750972eff645d inc/Module/AutoInstall.pm
-SHA1 9b2f9d83bcf77860f53a0c07c90a4a59ad9f5df1 inc/Module/Install.pm
-SHA1 ad955f51ad2c40d4ba35395c27f5ed899a80bf7a inc/Module/Install/AutoInstall.pm
-SHA1 abe32855d75ab13747cf65765af9947b7a8c3057 inc/Module/Install/Base.pm
-SHA1 95b81d1e91bd634467bf633571eff4420e9c04eb inc/Module/Install/Can.pm
-SHA1 1fe98c63cf9d7271c8cb4183ba230f152df69e26 inc/Module/Install/Fetch.pm
-SHA1 0606a8b02a420600bc3e2b65ab82f70266784926 inc/Module/Install/Include.pm
-SHA1 2249171a2b72cd73ff2c0a06597d29f86e5df456 inc/Module/Install/Makefile.pm
-SHA1 381bb98ea3877bba49ae85e7a7ea130645fd3dbf inc/Module/Install/Metadata.pm
-SHA1 b384bd42bc6263dc56d04a884ef4e5fe340049f8 inc/Module/Install/Scripts.pm
-SHA1 fcae3a3bda09e6ba955c8746c2bdf582a23b8d56 inc/Module/Install/Share.pm
-SHA1 0c2118868ef82ac517eb6d9c3bd93e6eb9bbf83e inc/Module/Install/Win32.pm
-SHA1 e827d6d43771032fa3df35c0ad5e5698d0e54cda inc/Module/Install/WriteAll.pm
+SHA1 78edb89a439463e44c33a72bbee84c54d0dc8aaf inc/Module/Install.pm
+SHA1 ae32c02b539901de91f06366ce9bdbb7a7bd040b inc/Module/Install/AutoInstall.pm
+SHA1 8ea4e37df83fd0c1c050be5c8da75545c3828d9b inc/Module/Install/Base.pm
+SHA1 1da6031583c32f0d1ec073b8376102fc51427dcc inc/Module/Install/Can.pm
+SHA1 b779375b90c16af2f31f38a1dd2b5df223c7f2fb inc/Module/Install/Fetch.pm
+SHA1 6bf0d0d100b94d1a2ce64d010c8813dec26ac480 inc/Module/Install/Include.pm
+SHA1 2054450e1e9c1dd8056362bf4a64ae70d5d71476 inc/Module/Install/Makefile.pm
+SHA1 5d6189b2cad15cf9932a28faafd55130c8247e83 inc/Module/Install/Metadata.pm
+SHA1 8015c2aceacb9b793e8a472036f93d0bac67c0db inc/Module/Install/Scripts.pm
+SHA1 13f313e303268b76397c6a6206bb65f2d8f1bc7b inc/Module/Install/Share.pm
+SHA1 02af973fae2ac3531fa6b704574b2b8cb2a08148 inc/Module/Install/Win32.pm
+SHA1 3a2eab96e91cca8d99938cda7791759ae9d97b3a inc/Module/Install/WriteAll.pm
 SHA1 c17e8f3cf8ebe1eb4929fd2bd2fd530a9de1abd0 lib/Email/Send/Jifty/Test.pm
-SHA1 0eb6271f949efa613d516c73cb672f7392c336b5 lib/Jifty.pm
-SHA1 337627c441c5639405a2d2cc751c63616d25c221 lib/Jifty/API.pm
-SHA1 7dc39eb45149bd3c9b7e1f19047657dbf84688df lib/Jifty/Action.pm
-SHA1 d73654ad2f7edc2f1661ab866b1db609d83806b3 lib/Jifty/Action/Autocomplete.pm
-SHA1 a96809977dac6f6c644b4b265ce510c13130264c lib/Jifty/Action/Record.pm
-SHA1 9afca5c5a9b57f11eb276afadea614b1be4570f6 lib/Jifty/Action/Record/Create.pm
-SHA1 224f3ed1a4710fb13e4627acd22067e2fa5c35c6 lib/Jifty/Action/Record/Delete.pm
-SHA1 1e400299405a06d3d09bb7548d97c52b850b7f43 lib/Jifty/Action/Record/Search.pm
-SHA1 821d06cdd92876efd01e08800eae46e52e13c2a6 lib/Jifty/Action/Record/Update.pm
-SHA1 ab7a0e0bae4cd1ecbda260b339a4116e65708a7f lib/Jifty/Action/Redirect.pm
-SHA1 0334c7ad4458bca073fa22372b4775937a0852e1 lib/Jifty/Bootstrap.pm
-SHA1 7a3849fb30ecb9bb7c0c382b7cc44b6216516de2 lib/Jifty/ClassLoader.pm
-SHA1 1009fa942a8cf3da853694f321d6f67d70613a79 lib/Jifty/Client.pm
-SHA1 a4e91b327848fe1c5b76e4ffaa926300e4c1ef2f lib/Jifty/Collection.pm
-SHA1 70ed11fa2fe5a196b5d5ee18e162e0f561dc7780 lib/Jifty/Config.pm
-SHA1 c6d8ac5f2dc450636478bc3051724f7eac74fce6 lib/Jifty/Continuation.pm
-SHA1 3fc7f4db180481c109248941a65f224c8e346aa8 lib/Jifty/CurrentUser.pm
-SHA1 c3ee8cd867481561dd7359d8f609687746e3b5dd lib/Jifty/DateTime.pm
-SHA1 24425ca3e82abf17e15182b8e13240d9ab102b47 lib/Jifty/Dispatcher.pm
-SHA1 c9c904906c35def343f14c0c216b62771c07f842 lib/Jifty/Event.pm
-SHA1 fb9f33e2838fbff0cd5b5a784adee8b0fc347ebc lib/Jifty/Event/Model.pm
+SHA1 08ba4fd288d0a91c59a9c1995bf654123f7b7a7e lib/Jifty.pm
+SHA1 2d1948051cad65db5062c8f884ec42c85bd82ff1 lib/Jifty/API.pm
+SHA1 0cc91932ee9cf2a93da8004bf4e170f5de391652 lib/Jifty/Action.pm
+SHA1 14be4def02c11173c504eff60256df952b3c305f lib/Jifty/Action/Autocomplete.pm
+SHA1 6e368525e04d4733923682f9c314a0cde41c4f48 lib/Jifty/Action/Record.pm
+SHA1 47d9ab2a7703960be292d141e69fc65c528deb1e lib/Jifty/Action/Record/Create.pm
+SHA1 b5556afc5639dc3c5bd4ea8979ab6665ca6503d4 lib/Jifty/Action/Record/Delete.pm
+SHA1 4f2fabd16d6e799b51e7161e488e71c9c608e32a lib/Jifty/Action/Record/Search.pm
+SHA1 165b1e15b83e1c34f8ec5a192b50e67b348ab7f5 lib/Jifty/Action/Record/Update.pm
+SHA1 90399bcddb1172f0c61a3fc357538ba08a3a8254 lib/Jifty/Action/Redirect.pm
+SHA1 57f95b0fbfd55d09d079d7c200d3a2451764c40a lib/Jifty/Bootstrap.pm
+SHA1 92ed1f1ada38336b639ec0a7f519151ab3ec1fff lib/Jifty/ClassLoader.pm
+SHA1 9765c0412c127e3b7a35c49d5ad5ce4313ccd3b7 lib/Jifty/Client.pm
+SHA1 7ead6f337c0665069bfa9e58915e6f22ed83a16c lib/Jifty/Collection.pm
+SHA1 4d3c3b93ef230ce507de998fac9996037b4237b0 lib/Jifty/Config.pm
+SHA1 576f5ed38bf71febf19674e021c7ee919e38eff2 lib/Jifty/Continuation.pm
+SHA1 db9b2fcce2eba256349d6bdb5fb4a3c9b395ab0a lib/Jifty/CurrentUser.pm
+SHA1 2afb9e7c7bafe56dd12986ad99653880c5873a70 lib/Jifty/DateTime.pm
+SHA1 cef0407ef9bb8cf4c4e0ee349fdcb32046e7c216 lib/Jifty/Dispatcher.pm
+SHA1 e50bd211339e464cd5e17e05a12157e4f9bb5494 lib/Jifty/Event.pm
+SHA1 a956a886b552b6abf1e8c1485297c1bb86ff438c lib/Jifty/Event/Model.pm
 SHA1 121cc604741f5a674cbbc2a55dfb6d4c8cf11bb8 lib/Jifty/Everything.pm
 SHA1 818bd0aa6afeb39bf96e0068fe3222c74133b4d8 lib/Jifty/Filter/DateTime.pm
 SHA1 53c0eb3380e3f1611866694a6e1294f3537f0d76 lib/Jifty/Handle.pm
-SHA1 947e5aee7b981e19042f3343050a129600b88772 lib/Jifty/Handler.pm
-SHA1 c413c80506fe0a1da3154739249a9351982b1db2 lib/Jifty/I18N.pm
+SHA1 886936781f71637eaf4e2f644032ba16194571e9 lib/Jifty/Handler.pm
+SHA1 24be261cc518d7d36bed0caebe79943b0e549b39 lib/Jifty/I18N.pm
 SHA1 fe370e2c51ca0f20cb0bce133b8c9067c02a524a lib/Jifty/JSON.pm
-SHA1 93d009a7d9a25975786b9ded3dcd5fdac90c9389 lib/Jifty/LetMe.pm
+SHA1 7083562103a0feb46db9bd0bd2323fe62dcb1b0c lib/Jifty/LetMe.pm
 SHA1 1687a979438f24c95a6b857ab5305910108bfb49 lib/Jifty/Logger.pm
 SHA1 9a01a2e586aa5799fdc0f04c6240220d9dd953b9 lib/Jifty/Manual/AccessControl.pod
 SHA1 ef9ff36385a9f780ac0204bffb9425818d78b789 lib/Jifty/Manual/Actions.pod
-SHA1 d320630f6613f4aa1ec3b9537129fd9ca847fb61 lib/Jifty/Manual/Continuations.pod
-SHA1 99848cf166e90d9c0963a65d09a627ba11a3613e lib/Jifty/Manual/Cookbook.pod
+SHA1 44c07eb236063f6978a945d0faabdcd2b4799126 lib/Jifty/Manual/Continuations.pod
+SHA1 f94a63d52dd3cb9abd6b10ce6436e24d47005649 lib/Jifty/Manual/Cookbook.pod
 SHA1 ace7259a8fc39a43174e3292a8003baa43670da8 lib/Jifty/Manual/Deploying.pod
 SHA1 38a90072f4a25eac8d4480b00290b069e6397673 lib/Jifty/Manual/FAQ.pod
-SHA1 910f64961a65608ab8575a08aa4eab6b1862579b lib/Jifty/Manual/Glossary.pod
-SHA1 f272be20cc67acaf01c116f432a8f42d82c57877 lib/Jifty/Manual/Models.pod
+SHA1 37fd5ebcc551ed3c507699eb1bc34700c37f661d lib/Jifty/Manual/Glossary.pod
+SHA1 f72721fce42a5faea2fad201d95bfe108f016039 lib/Jifty/Manual/Models.pod
 SHA1 1204d70c868084ac3114fae277e98a756f83f819 lib/Jifty/Manual/ObjectModel.pod
 SHA1 60ee994e58dfb4e9190badc16c96c4760e5669cb lib/Jifty/Manual/PageRegions.pod
 SHA1 8ba19a0760196ceb1afbeaa06e7314e254bef258 lib/Jifty/Manual/RequestHandling.pod
@@ -185,112 +195,165 @@
 SHA1 45f95f61826365d39a5eab2cc119967273d17077 lib/Jifty/Manual/Tutorial_ja.pod
 SHA1 2b4c79b6656658b7198ba579b58e3a599d404b01 lib/Jifty/Manual/Upgrading.pod
 SHA1 d0b7a4277c8a3d1a393d7c51fff48b059461f87c lib/Jifty/Manual/UsingCSSandJS.pod
-SHA1 59ce74460e9c1fe8aa1114c2e874348583b76548 lib/Jifty/Mason/Halo.pm
+SHA1 e8e0a5e342506f3656f7b642a0915b9339da3e2c lib/Jifty/Mason/Halo.pm
 SHA1 c7a9988b0826f9c55af2415c7d314ff546193cee lib/Jifty/Model/Metadata.pm
 SHA1 4b89786af61d1490286bc02c4c3a8edb95aa0b60 lib/Jifty/Model/Session.pm
-SHA1 0efcdf22d66e521cf250c1398caf3aba93ed795d lib/Jifty/Model/SessionCollection.pm
-SHA1 d15fc44fc8af2c4a7db3c2f08e1d69d6f397e734 lib/Jifty/Module/Pluggable.pm
-SHA1 f7c511c6b0c6ccfc3c5fdc0bf0a4e224d78a9c40 lib/Jifty/Notification.pm
-SHA1 7223070583b1b15f651db7a71b97e039e084aa4f lib/Jifty/Object.pm
+SHA1 869954cc1c1a636bf45aa43fa3e565ba19e39007 lib/Jifty/Model/SessionCollection.pm
+SHA1 4d70ace015a3d020687aab814dae62f86d051428 lib/Jifty/Module/Pluggable.pm
+SHA1 88f2aacbfaeca55afa86f6b21bab250ce37f35ea lib/Jifty/Notification.pm
+SHA1 445f707ba7577b529bf7ca9ddcd2587250d0b272 lib/Jifty/Object.pm
 SHA1 c3fde2a862013cd6284637d79c751c3c2e360720 lib/Jifty/Param.pm
 SHA1 c4c0387640f7eafb35b346798c5e150c6ecb7496 lib/Jifty/Param/Schema.pm
-SHA1 134c5535e4b1f5ef0a5a8f78259b36c4bf247bed lib/Jifty/Plugin.pm
+SHA1 9ec6c409d8b0bc974d4feee07363ea458c30453f lib/Jifty/Plugin.pm
+SHA1 e5af7b18d906a1e69fc96d97f13c3d003fe9f217 lib/Jifty/Plugin/ActorMetadata.pm
+SHA1 ed6aa344eca5c227c0b2e94f40c7f73455c93bea lib/Jifty/Plugin/ActorMetadata/Mixin/Model/ActorMetadata.pm
 SHA1 328b724a1f266999eb1f12e60a7ac6fcc533d177 lib/Jifty/Plugin/AdminUI.pm
-SHA1 00354893bf1283e9cf1b52de5b41bdfb57a78811 lib/Jifty/Plugin/Authentication/Password.pm
-SHA1 9f078a684545d3a9c075d83812cffeca0a3b633e lib/Jifty/Plugin/Authentication/Password/Action/ConfirmEmail.pm
+SHA1 a4cf065e1e54ac09a715d89b107768b0ae19e0b6 lib/Jifty/Plugin/Authentication/Facebook.pm
+SHA1 eb0ac23054f98ef6ae30ae06a03adaf896fd601c lib/Jifty/Plugin/Authentication/Facebook/Action/LinkFacebookUser.pm
+SHA1 ac51405e49435ce2745458f7e1fa9f0534eceb53 lib/Jifty/Plugin/Authentication/Facebook/Action/LoginFacebookUser.pm
+SHA1 ec31d1cac498f4cb7763807eb5cf34aa8a9c01e5 lib/Jifty/Plugin/Authentication/Facebook/Dispatcher.pm
+SHA1 672cb1f77ca40e0a6fb2d8088cfb38ba9e31e0e8 lib/Jifty/Plugin/Authentication/Facebook/Mixin/Model/User.pm
+SHA1 1bfe9c2762606521f55072a011b9878234f3c5f8 lib/Jifty/Plugin/Authentication/Facebook/View.pm
+SHA1 e435ff3b0c7b8a79d5b1d25802f4e2918bc94087 lib/Jifty/Plugin/Authentication/Password.pm
+SHA1 e9c5a3f4263412e003ff55a88b794424608008dc lib/Jifty/Plugin/Authentication/Password/Action/ConfirmEmail.pm
 SHA1 de9208f8911bc09594299b618a7ce05c71cac57e lib/Jifty/Plugin/Authentication/Password/Action/GeneratePasswordToken.pm
-SHA1 2da111cb0154fe09287b9c8db251b5d8720d0379 lib/Jifty/Plugin/Authentication/Password/Action/Login.pm
+SHA1 d77cef14fd4a866d308c171a337a37c95a697179 lib/Jifty/Plugin/Authentication/Password/Action/Login.pm
 SHA1 3ccf33cfd732343cfeeda7f2acc1df7c7da721fe lib/Jifty/Plugin/Authentication/Password/Action/Logout.pm
 SHA1 074fe2fa59464a78b69558f2c20b39fe45a6e56e lib/Jifty/Plugin/Authentication/Password/Action/ResendConfirmation.pm
 SHA1 eb20b698db12db185f08e4d0e0a6c39dc2c1432f lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm
-SHA1 89d74967f85b631644d039393920646cfb772f2a lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm
+SHA1 204602d1b7b07f7c98b1369a25c18099e3ea5100 lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm
 SHA1 28604b89817992c647042420090a59fee0fe06bd lib/Jifty/Plugin/Authentication/Password/Action/SendPasswordReminder.pm
 SHA1 3d0b444280c3b0ae577e0ada5cb3fd2eb8803f9f lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm
-SHA1 b0ccc1d001aeca18ad7466b531081805408b2010 lib/Jifty/Plugin/Authentication/Password/Dispatcher.pm
-SHA1 3191af60483a20faf1d624da37929e3310ced14c lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm
+SHA1 e18879da7a75bd2fe96dcc380a72d005a3a82aad lib/Jifty/Plugin/Authentication/Password/Dispatcher.pm
+SHA1 ea71250fa9cf6185d97a0b05529b20f92297f122 lib/Jifty/Plugin/Authentication/Password/Mixin/Model/User.pm
 SHA1 9711ece6f3637e972708c8bda313aaa57fd1b405 lib/Jifty/Plugin/Authentication/Password/Notification/ConfirmEmail.pm
 SHA1 f8e1724e5d0d3e490439f0ad761a96155ff1b5a4 lib/Jifty/Plugin/Authentication/Password/Notification/ConfirmLostPassword.pm
-SHA1 91272a6c9926cdacbfc10afe8624a35868a8e8be lib/Jifty/Plugin/Authentication/Password/View.pm
+SHA1 ed84b2845c3b6b53e20f420862f8f8a23a569700 lib/Jifty/Plugin/Authentication/Password/View.pm
+SHA1 632df071506dc232b7855f31e216a05055262874 lib/Jifty/Plugin/Chart.pm
+SHA1 8d018ee02a46e1ab758d2096b9a1039550dfe913 lib/Jifty/Plugin/Chart/Dispatcher.pm
+SHA1 4bc7a990867f0482b2c49f8cd28e328fb5947797 lib/Jifty/Plugin/Chart/Renderer.pm
+SHA1 8a69203b659fed3a62dc3e7678b37bc9e3edb0c6 lib/Jifty/Plugin/Chart/Renderer/Chart.pm
+SHA1 ec469e4ef188a1fdeadd208974ffa2c0afa79f2c lib/Jifty/Plugin/Chart/Renderer/GD/Graph.pm
+SHA1 5f5c9a658bef0074b24ec8567305085b28022cf2 lib/Jifty/Plugin/Chart/Renderer/PlotKit.pm
+SHA1 3e11c9832ed05ad5cbb4095081654d53284628e5 lib/Jifty/Plugin/Chart/Renderer/SimpleBars.pm
+SHA1 332109e5a4e6b464814a6331fcbe1ddeec5d8502 lib/Jifty/Plugin/Chart/Renderer/XMLSWF.pm
+SHA1 436d7ef252dfe555b0d0d56cf126d30cad59728f lib/Jifty/Plugin/Chart/View.pm
+SHA1 e842dafa977259712540df4639249689e3bd1c90 lib/Jifty/Plugin/Chart/Web.pm
 SHA1 da70c7fbcd78d7ae9bd53deb74a022d0eeea4a12 lib/Jifty/Plugin/ClassLoader.pm
-SHA1 25d4c8b9459c9c299fb181d41539475a854309f0 lib/Jifty/Plugin/CompressedCSSandJS.pm
-SHA1 3b6cb101e9e3465cefdb843fb9108cb126644284 lib/Jifty/Plugin/CompressedCSSandJS/Dispatcher.pm
+SHA1 471913e19c92eebdcc3a338b8fdfdccbbb647959 lib/Jifty/Plugin/CompressedCSSandJS.pm
+SHA1 3547e9d0a2e53ae2c57cb07ba6ef88fa21ef8c28 lib/Jifty/Plugin/CompressedCSSandJS/Dispatcher.pm
+SHA1 f7c65a1e0fd9a9cc3a69238e5d0c94cfdacbf484 lib/Jifty/Plugin/Debug.pm
+SHA1 bccc0b4e51396e7b3d95d43ce75774d922a4fc14 lib/Jifty/Plugin/Debug/Dispatcher.pm
 SHA1 b6a34618e94885dac38d0a6b501a63f5c0184008 lib/Jifty/Plugin/ErrorTemplates.pm
-SHA1 07037bce896482134852dcfb6c15a8bbb8fa6adc lib/Jifty/Plugin/ErrorTemplates/View.pm
+SHA1 23acc252dd633a0c6873acadced84729dd6be728 lib/Jifty/Plugin/ErrorTemplates/View.pm
+SHA1 9afb7bc33b82dbc0f6de63c75b674c71858275eb lib/Jifty/Plugin/Feedback.pm
+SHA1 453a08b54bfd5cba652d304f4731f9208364a17e lib/Jifty/Plugin/Feedback/Action/SendFeedback.pm
+SHA1 1c214a74f063384a7e59e516f917131a2338ace3 lib/Jifty/Plugin/Feedback/View.pm
+SHA1 d4f28de89e6bc1bde247a7b5e4e78b19961772e0 lib/Jifty/Plugin/GoogleMap.pm
+SHA1 e79fe2283de73ff1d369e386129ff0adfdfad61b lib/Jifty/Plugin/GoogleMap/Widget.pm
 SHA1 f13f769cb4d6d529bcfc46647512544eaaa54774 lib/Jifty/Plugin/Halo.pm
+SHA1 668a78f235a1b025f9d15328f646df5578178f3b lib/Jifty/Plugin/JQuery.pm
 SHA1 432d5c6343b4390dcd135918d7f729d2c01eee5c lib/Jifty/Plugin/LetMe.pm
 SHA1 8692eb8735e17f6f9a25f41c368da4a6839363c8 lib/Jifty/Plugin/LetMe/Dispatcher.pm
 SHA1 af733b25eee3cc4e0e6b087a76bfd965534a2343 lib/Jifty/Plugin/OnlineDocs.pm
 SHA1 fcc3ccbee7c9646745fc79475d53f67e81d7c0db lib/Jifty/Plugin/OnlineDocs/Dispatcher.pm
+SHA1 c39eb405a1d25e84b582868e12279fcbdcede688 lib/Jifty/Plugin/OpenID.pm
+SHA1 006642ea3c45f3c0134488fcd465dcbc684712ef lib/Jifty/Plugin/OpenID/Action/AuthenticateOpenID.pm
+SHA1 fd06af13989202e7f5951ae4a244a051a4a8962b lib/Jifty/Plugin/OpenID/Action/CreateOpenIDUser.pm
+SHA1 f2a361896ac1b484cff868f901faca7b66d40eb6 lib/Jifty/Plugin/OpenID/Action/VerifyOpenID.pm
+SHA1 dc827e93d2ef9828fd5ffc7d0d5cc4c56a7ea3dc lib/Jifty/Plugin/OpenID/Dispatcher.pm
+SHA1 fe37000b633c08c77eaf6adb6cf0847a26450eb8 lib/Jifty/Plugin/OpenID/Mixin/Model/User.pm
+SHA1 1a30f243c1f3efa0fd045f922eb5f062c80d80b9 lib/Jifty/Plugin/OpenID/View.pm
 SHA1 df332565b291fd458fab232414b24283f379ac16 lib/Jifty/Plugin/REST.pm
-SHA1 053b6f7d44ade4ed7567a4a0c444e777108b26c3 lib/Jifty/Plugin/REST/Dispatcher.pm
+SHA1 056a963c9277e8f0cfba399b2c9b66531a2987c5 lib/Jifty/Plugin/REST/Dispatcher.pm
+SHA1 d2dd17c683748f9bbeb831ab6dc9f3a873fa1514 lib/Jifty/Plugin/SinglePage.pm
+SHA1 23720e49b68018925083f408d10de34d0f297042 lib/Jifty/Plugin/SinglePage/Dispatcher.pm
+SHA1 f866590b203c18013cc2f667de7b889e84895670 lib/Jifty/Plugin/SiteNews.pm
+SHA1 b72aeb9e89b787e0feb81e421c5e63de36f48726 lib/Jifty/Plugin/SiteNews/Dispatcher.pm
+SHA1 654eec3ba80aa6199c558ac13484308a214a1219 lib/Jifty/Plugin/SiteNews/Mixin/Model/News.pm
+SHA1 a3bf9e62b68d625ac0da1fd3b571d91258b303d1 lib/Jifty/Plugin/SiteNews/View/News.pm
 SHA1 7fa0c5fa1ef6dbe8f1c4a351133f74ca32a70507 lib/Jifty/Plugin/SkeletonApp.pm
-SHA1 1b07ce39502e28564f41d8dd27a4c0094de9f354 lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm
-SHA1 81362e19c903ba6c98c3cd84bc7b4b8f5615d05e lib/Jifty/Plugin/SkeletonApp/View.pm
-SHA1 a51b4791f28c6f64ba00ac21fc05933b32e19015 lib/Jifty/Plugin/User.pm
-SHA1 a1c827266b0db910b02476eee76f6a5a4663e2ba lib/Jifty/Plugin/User/Mixin/Model/User.pm
+SHA1 274d797b34ef684c58df7db353346973f8e1bbc2 lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm
+SHA1 f9e1002e94b28aaac932ecf09421e984ba02d1e3 lib/Jifty/Plugin/SkeletonApp/View.pm
+SHA1 5fdd02b758f8cbeb06a9012d4e28c76064e3d6b9 lib/Jifty/Plugin/TabView/View.pm
+SHA1 cbfe62b83a5ea089e1536ca54babf24006652406 lib/Jifty/Plugin/UUID.pm
+SHA1 e58f034ec726d72becad8ff361097c4f115549f8 lib/Jifty/Plugin/UUID/Widget.pm
+SHA1 5ce0a4dd684e7a9029f67a3679f268acbd1cbf31 lib/Jifty/Plugin/User.pm
+SHA1 5811d61115c8162417885dec09180ab3f356a962 lib/Jifty/Plugin/User/Mixin/Model/User.pm
+SHA1 9aa1995736d5663c0f081301f917d767c2757de6 lib/Jifty/Plugin/Userpic.pm
+SHA1 263cb41986cec282d15556d7d54216118a325d00 lib/Jifty/Plugin/Userpic/Dispatcher.pm
+SHA1 37016b10d1f2f0cc479b549009d1307237099f22 lib/Jifty/Plugin/Userpic/View.pm
+SHA1 5712e2f84235c7b57e38ac85513bbecbdc15dfdd lib/Jifty/Plugin/Userpic/Widget.pm
 SHA1 c77500585cddf1c520b0438384481a1b68d13c57 lib/Jifty/Plugin/Yullio/View.pm
-SHA1 26b636ef6291098364119287e7363be9f58990f7 lib/Jifty/Record.pm
-SHA1 8ba38d25e9f6ead360e20baa457f119694584edd lib/Jifty/Request.pm
-SHA1 7e4d83147f5f665bb0e8d290ea70340b82a205c2 lib/Jifty/Request/Mapper.pm
+SHA1 ae4a12074e7e1da9bf9628ecd4dbf36cac8369f6 lib/Jifty/Record.pm
+SHA1 a63b8179f42e38ebcd84ed803a15a75b9c4f84f5 lib/Jifty/Request.pm
+SHA1 574126a02a3c625710a849c1f9f7fd0dd226759b lib/Jifty/Request/Mapper.pm
 SHA1 0a92b4cdb402463e303b897195c9ad914767c27f lib/Jifty/Response.pm
 SHA1 669b0956c14105b4178875d6856b129b75941328 lib/Jifty/Result.pm
-SHA1 126fb131c36f6ff7dc6cc4193b0c9a402168a832 lib/Jifty/RightsFrom.pm
-SHA1 83f1a04d22cb553f0af2842b7fe603277441f72b lib/Jifty/Script.pm
+SHA1 3ac318feed2accd50b61d8dc82709bd2a7882946 lib/Jifty/RightsFrom.pm
+SHA1 21247e3f5877c8954835e280b6c4eb4aa67fa5fb lib/Jifty/Schema.pm
+SHA1 522f2845a7cbea076dbc53c9ccfbadaa4de56483 lib/Jifty/Script.pm
 SHA1 f97fb67cd7db7aa2374ef4a0f1b8b9705e3ce153 lib/Jifty/Script/Action.pm
 SHA1 3aa3a449b282e05dfb312cf266572edabf2bae17 lib/Jifty/Script/Adopt.pm
-SHA1 84a9ddd8c2f9d738daed65201ae938cb5e0a45de lib/Jifty/Script/App.pm
-SHA1 1ad9937d9e28f1568954bcffac500be87f3cb355 lib/Jifty/Script/Deps.pm
+SHA1 b459c77c7f08c83b9808486cda074704c2d325c0 lib/Jifty/Script/App.pm
+SHA1 f1c1078236ad2396a7c4b98979108980e3bcd25c lib/Jifty/Script/Console.pm
+SHA1 2ae45f322b3b5904225465b85edb544ba6216eaa lib/Jifty/Script/Deps.pm
 SHA1 3c26ea2d6e25c42ecd7edae41d4ad2fc552f1451 lib/Jifty/Script/Env.pm
-SHA1 79fbed4c7b6e3b85cd78afbc69bd990f45f97a01 lib/Jifty/Script/FastCGI.pm
+SHA1 1c590d75775560691e63bb62de2462d49d1c9815 lib/Jifty/Script/FastCGI.pm
 SHA1 e25a259fc9fd3183a7981236f428f54ac4c4f49e lib/Jifty/Script/Help.pm
 SHA1 29d16baf7dbf778f6082f8852723b6ef82842ef0 lib/Jifty/Script/ModPerl2.pm
 SHA1 ae7d6a97f55a111e10cbc127d3174c48dc896afc lib/Jifty/Script/Model.pm
-SHA1 77c221bb4b7162b2fc95c841ceeea04194afb264 lib/Jifty/Script/Plugin.pm
+SHA1 4fae01f79baf125856a69265fa9f4caeb5f858bf lib/Jifty/Script/Plugin.pm
 SHA1 3365d06f92ffe40175f2c9d7fa4175c48cd42ed9 lib/Jifty/Script/Po.pm
-SHA1 cf7d62a4634d32342e5b4581ceb1dc8c78439943 lib/Jifty/Script/Schema.pm
-SHA1 50e6a73afeb945145576c079d14d3707d13b4344 lib/Jifty/Script/Server.pm
-SHA1 48a8889b44c0450ccb2d27cbb0b7c7f3ae26a426 lib/Jifty/Server.pm
+SHA1 a3f347fd88bd12105ad21edf2a92dc330119adf0 lib/Jifty/Script/Schema.pm
+SHA1 e18ad09e9078c0a9782c588398cd38541f966b5d lib/Jifty/Script/Server.pm
+SHA1 4918c842d52a7ab4de9d60da95a47a31d04d4631 lib/Jifty/Server.pm
 SHA1 b49ae221b107519b3019b3f5e5ab5b7e8c6b4332 lib/Jifty/Server/Fork.pm
 SHA1 9a8c2f2cdc88fc00baaafaa72bc3413e086c0448 lib/Jifty/Server/Prefork.pm
 SHA1 e7453a3cda290e60d5432e60e53bec8b92a91772 lib/Jifty/Server/Prefork/NetServer.pm
-SHA1 4c51d2df15281788b74d080488b0c5959cd95a1a lib/Jifty/Subs.pm
-SHA1 b3d122eed10c4ac3cba561913a42220c2f5ee085 lib/Jifty/Subs/Render.pm
-SHA1 e15bde68ba67b141ae1565be066f1e1f171f63ec lib/Jifty/Test.pm
-SHA1 0d6d53b5084bb89baea771d3e9d602a195255e37 lib/Jifty/Test/WWW/Mechanize.pm
+SHA1 3e117a5866ca55825f4f292e95af01f98fe67edc lib/Jifty/Subs.pm
+SHA1 7b8eed10682b0e357b2049fa479e7d85bd4b1b58 lib/Jifty/Subs/Render.pm
+SHA1 9f4748146731512c6747b9eb15c6bf77d0c968be lib/Jifty/Test.pm
+SHA1 e28d417b36ca1d647a1cd5e4527465822a8ce09a lib/Jifty/Test/WWW/Mechanize.pm
 SHA1 47c5840fafd56473a0e1a9228f169d3813317c13 lib/Jifty/TestServer.pm
-SHA1 a0ad0b8d54a5ed0edbbac99f6c06a9438a4046fa lib/Jifty/Upgrade.pm
-SHA1 f3957ac04ad92737d68b2a63f068679b4bacafed lib/Jifty/Upgrade/Internal.pm
-SHA1 d42ff4531e36438208cd8242d15f7d210928ff6b lib/Jifty/Util.pm
-SHA1 05af258e63bbb8ea166e845b8028546b858fcecb lib/Jifty/View/Declare.pm
-SHA1 dd7596d3d4cc8df03c074a44a0cd0813a5cf0a89 lib/Jifty/View/Declare/BaseClass.pm
-SHA1 912220dc62ae0d21d78ed499626a235a14db09a6 lib/Jifty/View/Declare/CoreTemplates.pm
-SHA1 88c62ed42916e58a344e1d09e9a0019436e34cb6 lib/Jifty/View/Declare/Handler.pm
-SHA1 bba1390f47745aa843a72565fbdf1adce3afd241 lib/Jifty/View/Declare/Helpers.pm
-SHA1 1df8f813bdc979dd182a455e9953254abcd247ed lib/Jifty/View/Mason/Handler.pm
-SHA1 2e97fd90420ade1dcdc6d5b815a352cd83c23671 lib/Jifty/View/Static/Handler.pm
-SHA1 94172b92971ea2a5fcdc3f11ebcc94a8274688c6 lib/Jifty/Web.pm
-SHA1 5dbb5f45d0ff0e0ddfabe91d6152c1aa507dbc9b lib/Jifty/Web/Form.pm
-SHA1 f073670eb2f206f99bd1f1377740965cd5da5ac1 lib/Jifty/Web/Form/Clickable.pm
-SHA1 d77f222ad036fe8b39715c85fab009b7a283e1b9 lib/Jifty/Web/Form/Element.pm
-SHA1 a823ab5fae50fa6222c4d3143779d2288e1cc3da lib/Jifty/Web/Form/Field.pm
-SHA1 bb9dc120af472abe3a35f89c772728c75ed8a3c2 lib/Jifty/Web/Form/Field/Button.pm
-SHA1 c1071263839a663d44d7f922c7c24b5bcc132a82 lib/Jifty/Web/Form/Field/Checkbox.pm
-SHA1 b21ef4e33a628f5d6c54adf5f47f75e69a861644 lib/Jifty/Web/Form/Field/Combobox.pm
-SHA1 cc86a97a80c6c9e22183a099979a712a3900a39a lib/Jifty/Web/Form/Field/Date.pm
-SHA1 e2db0ce71a56f59e8154a8af8187fab198c01fe7 lib/Jifty/Web/Form/Field/Hidden.pm
-SHA1 41b5344b9e5b0dcdc2c944d2cacdc18421aa8a93 lib/Jifty/Web/Form/Field/InlineButton.pm
-SHA1 db78f61b0fe36589d0f3acbf8df470f89cbc6ee9 lib/Jifty/Web/Form/Field/Password.pm
-SHA1 1006c6e4e07fbbf5ef5ccd2020cbe82ebbd8da1c lib/Jifty/Web/Form/Field/Radio.pm
-SHA1 5e6d07f48f59a7b2106a8f22ead83263368b26ad lib/Jifty/Web/Form/Field/ResetButton.pm
-SHA1 f865b1b411cf40aa3a0bf0cd51e364a0f23a4d3c lib/Jifty/Web/Form/Field/Select.pm
-SHA1 5586d4fdda6b5b8e6014750d5b912be898b18465 lib/Jifty/Web/Form/Field/Text.pm
-SHA1 bb397fc6092ddb8196342e80a4148d07fcd037b0 lib/Jifty/Web/Form/Field/Textarea.pm
-SHA1 2548412d5bfbd08050d53ab5c58e0d962d4b2448 lib/Jifty/Web/Form/Field/Unrendered.pm
-SHA1 e37541952c969f2e74f942782d483de75e9265f9 lib/Jifty/Web/Form/Field/Upload.pm
-SHA1 16cff04150ba0ae8bffe04c1c661d80972876248 lib/Jifty/Web/Form/Link.pm
-SHA1 a4787c85a11c091f8560d1960edce1aaeeced2c9 lib/Jifty/Web/Menu.pm
-SHA1 e912f7c224380aaf79c6cece6219670a973fe85e lib/Jifty/Web/PageRegion.pm
-SHA1 0fb24e6615e89b7f3b2b0af7457c4aaa61a48ad9 lib/Jifty/Web/Session.pm
+SHA1 5c0db87837a6a1311ec85b03f06623468afe8098 lib/Jifty/Upgrade.pm
+SHA1 fa642baf010edb939aa7682ae68b07c8a69b06b6 lib/Jifty/Upgrade/Internal.pm
+SHA1 240bfd838f0b696c43499b05218eb10e470b610d lib/Jifty/Util.pm
+SHA1 45b78364045808eeb2c895760646d910ae06c709 lib/Jifty/View.pm
+SHA1 a1040a526ea0acb07c7aa26c7d1ac6f6c19f4212 lib/Jifty/View/Declare.pm
+SHA1 f646c99eb386ca9ecb58e0f2184c2b153a547aaf lib/Jifty/View/Declare/BaseClass.pm
+SHA1 e58c71aeca97a483af2be912be08899de79e7d87 lib/Jifty/View/Declare/CRUD.pm
+SHA1 d2b2fa668602ba5a46b604bc4d340afb408fabd6 lib/Jifty/View/Declare/Compile.pm
+SHA1 a15bc046d04afb7f7985d65f9498d24b3bb6fdbd lib/Jifty/View/Declare/CoreTemplates.pm
+SHA1 3107a21569496a327245ca628271f2cc9bb4565e lib/Jifty/View/Declare/Handler.pm
+SHA1 bc7e7999c7d40c312eeddf1fbfef1b2bb979c37b lib/Jifty/View/Declare/Helpers.pm
+SHA1 ccbafe7217bcd46e55418c48c4dec9d82fdd71e6 lib/Jifty/View/Declare/Page.pm
+SHA1 aa6cd594be5a52a18dc40ebc01a0b8b8d943c297 lib/Jifty/View/Mason/Handler.pm
+SHA1 7c0239dd306fcdd6394771f634fb8403707e98c1 lib/Jifty/View/Static/Handler.pm
+SHA1 5182bc53778b35df9fa2d9b14c8e050016ec556b lib/Jifty/Web.pm
+SHA1 71761036222f20d7cf9f5b25e7a5d0a5ba619851 lib/Jifty/Web/Form.pm
+SHA1 f57b9359281b2a1b4334ee714da47baec4398c89 lib/Jifty/Web/Form/Clickable.pm
+SHA1 3ca9d352e41ff763c24a26d6f2780e03814cc66f lib/Jifty/Web/Form/Element.pm
+SHA1 e6b91ee72900aaa758bd2e3a46b2545b5b21133e lib/Jifty/Web/Form/Field.pm
+SHA1 d6735601c2c293b6ce0432d55bdb16fa2c5c6a68 lib/Jifty/Web/Form/Field/Button.pm
+SHA1 56fbb0c2fb940faaf086d49dcbea04825731540e lib/Jifty/Web/Form/Field/Checkbox.pm
+SHA1 02cb651fff375c73cef980ce675519f8118a6b69 lib/Jifty/Web/Form/Field/Collection.pm
+SHA1 7f64a31d99347ec482f2c95e6d06fffa6ed6d59e lib/Jifty/Web/Form/Field/Combobox.pm
+SHA1 a57b8a2908b9642320f07c91fab31d8eab63c97c lib/Jifty/Web/Form/Field/Date.pm
+SHA1 d8fdc993320b9e81926181e028b5fc688ec874fe lib/Jifty/Web/Form/Field/Hidden.pm
+SHA1 4db6a90ae2668ba11eb9e8633f949ee45e56cfad lib/Jifty/Web/Form/Field/InlineButton.pm
+SHA1 1b98474c61f1065ffe76b5a9f8356e4a10afc202 lib/Jifty/Web/Form/Field/Password.pm
+SHA1 49a79b67248e87be7a3c452dc76bdc1356aaf025 lib/Jifty/Web/Form/Field/Radio.pm
+SHA1 7869f3c4a1bc2215fff467a43dec617053d8961c lib/Jifty/Web/Form/Field/ResetButton.pm
+SHA1 6e7d9e080def5cfd7fac0f6b4adf2a94b25506b1 lib/Jifty/Web/Form/Field/Select.pm
+SHA1 04507f0d805d9e8e4ef4da4d7a919f5e7d7986fe lib/Jifty/Web/Form/Field/Text.pm
+SHA1 4ceb33e9dc6a8ee744e5ef977f4ad7634795bd91 lib/Jifty/Web/Form/Field/Textarea.pm
+SHA1 20eb63da765651816b5c5c7c03bd8f8f8ca107f3 lib/Jifty/Web/Form/Field/Unrendered.pm
+SHA1 3e19292cf95afaf08e811cd9814a33d69ddfddaa lib/Jifty/Web/Form/Field/Upload.pm
+SHA1 9ad5a13ed960af0d65ab69acda01251e5efdaaa1 lib/Jifty/Web/Form/Link.pm
+SHA1 6df07c4539c2d59113989bfd2499d7c4febef426 lib/Jifty/Web/Menu.pm
+SHA1 efbc2eb67a3b148f8edfc6ae26aa767438479cac lib/Jifty/Web/PageRegion.pm
+SHA1 5039d06b6112a7e1498ab46d2c4593a6addc10ef lib/Jifty/Web/Session.pm
 SHA1 f655fb9734715ebf51fb5e9b554c02b9e4e2ac61 lib/Jifty/Web/Session/ClientSide.pm
 SHA1 d7a8f92ddbc614904ad6aa53d818b0bd5df03317 lib/Jifty/Web/Session/None.pm
 SHA1 c4de1ef964243aae5ab90d0a5a6dd9c213eb9f80 lib/Jifty/YAML.pm
@@ -369,6 +432,47 @@
 SHA1 18be32490b494470824534cccd87b034cd790987 plugins/AuthzLDAP/share/po/fr.po
 SHA1 cd21439e1906eb58e9c576a477a8a31e05340c05 plugins/AuthzLDAP/share/web/templates/error/AccessDenied
 SHA1 289f295702910035ed2b122279ecf8b3b6a6389b plugins/AuthzLDAP/t/00-load.t
+SHA1 2ed0376180340aeda1ddd9a726d31cc4280db0d5 plugins/CodePress/Makefile.PL
+SHA1 38d2e59ce6c94c5d1decabf2264917ad036c8d40 plugins/CodePress/doc/index.html
+SHA1 6e0db78e2f82a523d83d82cf2ffad63ed6f7d755 plugins/CodePress/lib/Jifty/Plugin/CodePress.pm
+SHA1 a96dea1ba0989dce13dc9415a612ffc5166714a1 plugins/CodePress/lib/Jifty/Plugin/CodePress/Textarea.pm
+SHA1 c7eb60ddfb4cd7b0fa88527e73e34ca3ed9a2434 plugins/CodePress/share/web/static/codepress/codepress.css
+SHA1 6962d574546a57cb39fde034e87d341d9ee492d1 plugins/CodePress/share/web/static/codepress/codepress.html
+SHA1 19b105de2058da5842e19aaf9d14119c4475138d plugins/CodePress/share/web/static/codepress/engines/gecko.js
+SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709 plugins/CodePress/share/web/static/codepress/engines/khtml.js
+SHA1 f107593f521e20ee5fe2709776c22df619efcaab plugins/CodePress/share/web/static/codepress/engines/msie.js
+SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709 plugins/CodePress/share/web/static/codepress/engines/older.js
+SHA1 824049771826d5625e8765db3fb29f11f8439efc plugins/CodePress/share/web/static/codepress/engines/opera.js
+SHA1 22239de595dc22e1caaa4429c3d4aaa6e15eccb2 plugins/CodePress/share/web/static/codepress/images/line-numbers.png
+SHA1 f492c5f1b248c1a7c8c3bc84d948dde0aae68792 plugins/CodePress/share/web/static/codepress/languages/asp.css
+SHA1 656c5a2c9f050ea4b4f42a1ba0f367d8dc321df4 plugins/CodePress/share/web/static/codepress/languages/asp.js
+SHA1 2b1759f99c2c10353a50f46f63e651987c007419 plugins/CodePress/share/web/static/codepress/languages/csharp.css
+SHA1 dd57b69a0377402507a3fe73d8e50c67f4d94f7b plugins/CodePress/share/web/static/codepress/languages/csharp.js
+SHA1 5e85a186e21ecd82e578d0e7e5cd26755ad77158 plugins/CodePress/share/web/static/codepress/languages/css.css
+SHA1 d8878e88f00ab8d82428ad9d6d56040c006d27f0 plugins/CodePress/share/web/static/codepress/languages/css.js
+SHA1 44397c6e641c882ec925a022581262643b3dc43e plugins/CodePress/share/web/static/codepress/languages/generic.css
+SHA1 9c35fa9bb382d0ebd365b075c220069bd79b22e8 plugins/CodePress/share/web/static/codepress/languages/generic.js
+SHA1 7814ad55305aebc5483b2539dff19381b8b67ae2 plugins/CodePress/share/web/static/codepress/languages/html.css
+SHA1 aac42e2528b262acb3d56857376fb22dec63cf89 plugins/CodePress/share/web/static/codepress/languages/html.js
+SHA1 0a610cd843509b9c40d0d05a0c2fb1f9e99a4aac plugins/CodePress/share/web/static/codepress/languages/java.css
+SHA1 c599822d1d0aa3ae0c7390a827cee42fa91bb3dc plugins/CodePress/share/web/static/codepress/languages/java.js
+SHA1 725ae27fea59ca091aa981ec11c02d7452b18ea0 plugins/CodePress/share/web/static/codepress/languages/javascript.css
+SHA1 20321858b5799df9243db63a9eec6f03abe6a397 plugins/CodePress/share/web/static/codepress/languages/javascript.js
+SHA1 63fe45cca0dcbb3dc632943592e89583e1ba3813 plugins/CodePress/share/web/static/codepress/languages/perl.css
+SHA1 b1497e9b1dc1e7b7ca8796a4f9f1223ed65a5cc8 plugins/CodePress/share/web/static/codepress/languages/perl.js
+SHA1 34c98822164d98af1ae6ef815548b63d7877fdf4 plugins/CodePress/share/web/static/codepress/languages/php.css
+SHA1 c029478dbc0936846b0d69fdf6b6b29bbdf2cb4f plugins/CodePress/share/web/static/codepress/languages/php.js
+SHA1 755c78f665d09c0a2d8fd9d7ebf63100c9f62e60 plugins/CodePress/share/web/static/codepress/languages/ruby.css
+SHA1 53f6aea84f0c94598fd4b8c674b65ce8288f4ade plugins/CodePress/share/web/static/codepress/languages/ruby.js
+SHA1 7a591cd02dbfab9e03321bf0f9e4d459926295a3 plugins/CodePress/share/web/static/codepress/languages/sql.css
+SHA1 9a1f54826b54352a95160700aba2ee8a1934a327 plugins/CodePress/share/web/static/codepress/languages/sql.js
+SHA1 a2421625dc6194a618fe6b572364964c7dbb43b8 plugins/CodePress/share/web/static/codepress/languages/text.css
+SHA1 01e7bc291730313b5d9f484b297431c174117601 plugins/CodePress/share/web/static/codepress/languages/text.js
+SHA1 3eccb9fce27f1818f83f93ca6d85ed03936df283 plugins/CodePress/share/web/static/codepress/languages/vbscript.css
+SHA1 656c5a2c9f050ea4b4f42a1ba0f367d8dc321df4 plugins/CodePress/share/web/static/codepress/languages/vbscript.js
+SHA1 faeb676264a045387456be98af7a9ef2de69567d plugins/CodePress/share/web/static/codepress/languages/xsl.css
+SHA1 e7857c042a70c8a9c030b45c8fe863589bd98e6a plugins/CodePress/share/web/static/codepress/languages/xsl.js
+SHA1 27a0c400c74e2122b95c664756e58a40cedb3166 plugins/CodePress/share/web/static/js/codepress.js
 SHA1 90adb765b74e3b0d115b33a4a6da8ed38a6eb179 plugins/DumpDispatcher/Makefile.PL
 SHA1 94f0d477bc64ce6e88e0023cccc228c4f5ed1cf9 plugins/DumpDispatcher/lib/Jifty/Plugin/DumpDispatcher.pm
 SHA1 e8ce16205eccb1b99224ca81d3a3496163a98864 plugins/EditInPlace/Makefile.PL
@@ -777,6 +881,71 @@
 SHA1 145948e25dc1be742b76d870a20d13383f902f49 plugins/ProfileBehaviour/lib/Jifty/Plugin/ProfileBehaviour/Dispatcher.pm
 SHA1 1059b85f661b36f61b63cc72d0fc15cf732cc00a plugins/ProfileBehaviour/share/web/static/css/behaviour-profile.css
 SHA1 39746321849746fdfbeb51d7d2f1cb2adc1c3cdf plugins/ProfileBehaviour/share/web/static/js/behaviour.js
+SHA1 aeac1e62204c91f58488b74d12d75b3ca28cead0 plugins/WikiToolbar/Makefile.PL
+SHA1 48fbd12e106b3fa2114e90fff8bdbc3de3c261d1 plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar.pm
+SHA1 88104d8fcb9e7fd1ba81bad8d8e6cf93c3827847 plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Dispatcher.pm
+SHA1 f9b74f969588298d457af7bb46a74ba1636b4801 plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Textarea.pm
+SHA1 1fdd77bdbf866caefaf9d8f9f6e5e1cf29d639a1 plugins/WikiToolbar/share/web/static/img/wt/bold.png
+SHA1 54fcf1718afb4ca0c7e24b44f67856c38caff15d plugins/WikiToolbar/share/web/static/img/wt/box.png
+SHA1 1b7a3e5108d829d5a9dc0ee7350066badfa01eab plugins/WikiToolbar/share/web/static/img/wt/center.png
+SHA1 d02e825f393333ec6655c095f82e7484cd5e9f19 plugins/WikiToolbar/share/web/static/img/wt/code.png
+SHA1 038ab8bc024b618fbb87990813fe3a47217b3fdd plugins/WikiToolbar/share/web/static/img/wt/code1.png
+SHA1 fbd780f9176dd6e299e44dcfb49ef5e3a2b393c5 plugins/WikiToolbar/share/web/static/img/wt/empty.png
+SHA1 db3408de528f1ab6f1f2bf38ee77c52f79b60024 plugins/WikiToolbar/share/web/static/img/wt/h1.png
+SHA1 183f5d8c54fb43c7dbf40281de849e3f46b385bc plugins/WikiToolbar/share/web/static/img/wt/h2.png
+SHA1 bbf4470ea8c14136f3033567977881e11f7c9e07 plugins/WikiToolbar/share/web/static/img/wt/h3.png
+SHA1 7a7bf4f6df668952b8df33e132fa573a4ed7cbeb plugins/WikiToolbar/share/web/static/img/wt/italic.png
+SHA1 2dd20159f7517ce39265d8569755c931ab6ddca0 plugins/WikiToolbar/share/web/static/img/wt/link.png
+SHA1 9162eefd6325a864189ac229a8514e2a13dd7262 plugins/WikiToolbar/share/web/static/img/wt/linkextern.png
+SHA1 bc0a304bfa26300d9d3870438f0a21149e39924a plugins/WikiToolbar/share/web/static/img/wt/new.png
+SHA1 86794a87fb0b89b0e95065737140365b94710edf plugins/WikiToolbar/share/web/static/img/wt/ol.png
+SHA1 28f24810f5f6123c909ab7be1f4033dffefd0bbd plugins/WikiToolbar/share/web/static/img/wt/red.png
+SHA1 d87b63236979bfd1d9094c831e6842161097bb88 plugins/WikiToolbar/share/web/static/img/wt/strike.png
+SHA1 7f54e4bd50db116b1a91fc3268f47b2ce4911e29 plugins/WikiToolbar/share/web/static/img/wt/tab.png
+SHA1 5766651228cc6e938d68e82208b35996e241d4d3 plugins/WikiToolbar/share/web/static/img/wt/ul.png
+SHA1 ba133230de9ab17b7365957344465c14ee068e3e plugins/WikiToolbar/share/web/static/img/wt/underline.png
+SHA1 d4fc5b73db20a2b5af07b88e773a4a89e5ccbed7 plugins/WikiToolbar/share/web/static/js/wikitoolbar.js
+SHA1 9045eec8bc1248e7c04d68c837e87b3b6c69675a plugins/WyzzEditor/Makefile.PL
+SHA1 872e602b1ee6a11df81ab1b5edf24e2e9e5b9726 plugins/WyzzEditor/lib/Jifty/Plugin/WyzzEditor.pm
+SHA1 700a8acec334a474187a27fd8c9cd3e429890057 plugins/WyzzEditor/lib/Jifty/Plugin/WyzzEditor/Dispatcher.pm
+SHA1 a97e181eb39dbc1900eef6210a154fc79f0626c0 plugins/WyzzEditor/lib/Jifty/Plugin/WyzzEditor/Textarea.pm
+SHA1 8b6ff3a311cade7b594dd7deebba38a1e4f400b5 plugins/WyzzEditor/share/web/static/img/wyzzicons/backcolor.gif
+SHA1 52e105c0de232a5c2d95afaed21f43bf3f2161bf plugins/WyzzEditor/share/web/static/img/wyzzicons/bold.gif
+SHA1 323dd5d3802c728a624158ca1308004eb91d971c plugins/WyzzEditor/share/web/static/img/wyzzicons/close.gif
+SHA1 c88d95981f5180e7a3badfd6cc5611d20f1094fe plugins/WyzzEditor/share/web/static/img/wyzzicons/copy.gif
+SHA1 a4ac35105313a6e7b246116ca102d2ff603e9512 plugins/WyzzEditor/share/web/static/img/wyzzicons/cut.gif
+SHA1 f041a77044e7b4776aacdc658e38b644885371c2 plugins/WyzzEditor/share/web/static/img/wyzzicons/downsize.gif
+SHA1 67d2f7531a634678753f8a17a6924d163084caa5 plugins/WyzzEditor/share/web/static/img/wyzzicons/font.gif
+SHA1 b63dc2e6baab55e7444ebb278879f9ef91c2b9f2 plugins/WyzzEditor/share/web/static/img/wyzzicons/forecolor.gif
+SHA1 8280ae0c421ef11e6e99453a3943dcd7a073b626 plugins/WyzzEditor/share/web/static/img/wyzzicons/headers.gif
+SHA1 8003b8df35f418545e15326089212165ff85f6c8 plugins/WyzzEditor/share/web/static/img/wyzzicons/help.gif
+SHA1 e6d7775c1aed02120a99df446b555090a19c084d plugins/WyzzEditor/share/web/static/img/wyzzicons/htmlmode.gif
+SHA1 3b66037dd4a67d823cb9ea835e36b8349063ad2d plugins/WyzzEditor/share/web/static/img/wyzzicons/indent.gif
+SHA1 e08c48670f43f22dab83d78f1cb21b5a4325546b plugins/WyzzEditor/share/web/static/img/wyzzicons/inserthorizontalrule.gif
+SHA1 fcacd66649042d124d5a4311ecc491a18e350c8e plugins/WyzzEditor/share/web/static/img/wyzzicons/insertimage.gif
+SHA1 213b8f49e6c0e7109405def6196400eed5b05541 plugins/WyzzEditor/share/web/static/img/wyzzicons/insertorderedlist.gif
+SHA1 dcb14acf325509438e33148be83b622d478d776f plugins/WyzzEditor/share/web/static/img/wyzzicons/insertunorderedlist.gif
+SHA1 acc97c4ae38011e8db2985fa94d32631b173b3b0 plugins/WyzzEditor/share/web/static/img/wyzzicons/italic.gif
+SHA1 ca29431a02f3f7cb7016227bc42c5672cc24e9fb plugins/WyzzEditor/share/web/static/img/wyzzicons/justifycenter.gif
+SHA1 8c938cbb16e20e6baa386eacb9840bc68ce178af plugins/WyzzEditor/share/web/static/img/wyzzicons/justifyfull.gif
+SHA1 61a5f6cdc71a124c4558efe7876ec97280e7f37f plugins/WyzzEditor/share/web/static/img/wyzzicons/justifyleft.gif
+SHA1 c7f88506634da1875c7a6740f7567409ce21e424 plugins/WyzzEditor/share/web/static/img/wyzzicons/justifyright.gif
+SHA1 54ba9c02f347f743ad59d6877f0bdc10d5e4f126 plugins/WyzzEditor/share/web/static/img/wyzzicons/link.gif
+SHA1 7a48fb13191180a1f2401c5ee0dea6be3d2debb6 plugins/WyzzEditor/share/web/static/img/wyzzicons/outdent.gif
+SHA1 a309300447d1c07ae7619b15d854d5da227fe3fd plugins/WyzzEditor/share/web/static/img/wyzzicons/paste.gif
+SHA1 45e82296d618eccbc2a52a7d701f4cb2e15c048c plugins/WyzzEditor/share/web/static/img/wyzzicons/redo.gif
+SHA1 1ec3c72e003ece9a94330226e8cfcb4045abe34c plugins/WyzzEditor/share/web/static/img/wyzzicons/removeformat.gif
+SHA1 9c3b4a60c04c3dcd9ae57842cdf8aaffc3c0e1a0 plugins/WyzzEditor/share/web/static/img/wyzzicons/specialchar.gif
+SHA1 8b14f5d5042a3e76ea2d4890a4c25b40c1a33601 plugins/WyzzEditor/share/web/static/img/wyzzicons/strikethrough.gif
+SHA1 6893a2c29708f16d78c3bb4203cb01f798b7ee30 plugins/WyzzEditor/share/web/static/img/wyzzicons/subscript.gif
+SHA1 ec1a5511417a92a75ca70db9aa88b3bf44bb4dfa plugins/WyzzEditor/share/web/static/img/wyzzicons/superscript.gif
+SHA1 27d7ef1137a8462874bb6eec252ade1d6bec3c90 plugins/WyzzEditor/share/web/static/img/wyzzicons/underline.gif
+SHA1 971e4261232546b0928f1fd1cba31b551e423647 plugins/WyzzEditor/share/web/static/img/wyzzicons/undo.gif
+SHA1 7f8010a1b83ae6e1cac35f75c3abfef2c2a888f9 plugins/WyzzEditor/share/web/static/img/wyzzicons/upsize.gif
+SHA1 8003b8df35f418545e15326089212165ff85f6c8 plugins/WyzzEditor/share/web/static/img/wyzzicons/wyzzicon.gif
+SHA1 d3bc3c8c1a4fabef38cf028833655f21d8368e15 plugins/WyzzEditor/share/web/static/js/wyzz.js
+SHA1 16292c20a0374de33680f727ca1cf9516016e35e plugins/WyzzEditor/share/web/static/wyzzstyles/editarea.css
+SHA1 bf8fbe3c41e7943ec2cf4be2ce6cec05314ee968 plugins/WyzzEditor/share/web/static/wyzzstyles/style.css
 SHA1 2c5d29ea2981cc759cc5f5b27cf7c536d4ea9384 share/dtd/xhtml-lat1.ent
 SHA1 62229286e03ec35c922c8a7f9f3bb68412a78a55 share/dtd/xhtml-special.ent
 SHA1 e7749f99989ec8a9608f6cfbd41a5e5dddc18aec share/dtd/xhtml-symbol.ent
@@ -790,16 +959,48 @@
 SHA1 ed176f653007f8a08e88355bfd68e1b0fc645723 share/plugins/Jifty/Plugin/AdminUI/web/templates/__jifty/admin/fragments/list/search
 SHA1 a118ac016c645629ed720d9626b36266089eee58 share/plugins/Jifty/Plugin/AdminUI/web/templates/__jifty/admin/fragments/list/update
 SHA1 9d339e7acebf3e929b15c1d8b4642ecbddf7f4b6 share/plugins/Jifty/Plugin/AdminUI/web/templates/__jifty/admin/fragments/list/view
-SHA1 559940ee5c2e5b56f3a438f377ea110018e20b18 share/plugins/Jifty/Plugin/AdminUI/web/templates/__jifty/admin/index.html
+SHA1 9c6ec4bcfacc9091533b50eea7b01fe3dd81883c share/plugins/Jifty/Plugin/AdminUI/web/templates/__jifty/admin/index.html
 SHA1 99ce3e69e2201664a1363ca2535dcc51a64a1f92 share/plugins/Jifty/Plugin/AdminUI/web/templates/__jifty/admin/model/dhandler
+SHA1 0fc7fc9888d41402a0c079cb124769bd044a9f2d share/plugins/Jifty/Plugin/Chart/web/static/css/simple_bars.css
+SHA1 5a544d4b79ad280727d6a3a24a549606c69b239c share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts.swf
+SHA1 172c35bdf32dd3e7c31782a1959c7080778eb33e share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/arno.swf
+SHA1 5bc8dfd3f8aec0f79fe40f5e8fec3ddb20bb5220 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/arst.swf
+SHA1 7e586bf286140bf5807496836859c5f53de70fd3 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/brfl.swf
+SHA1 19efe2d338f3d885d59968ba784d24e75013d5c4 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/brno.swf
+SHA1 d000df0ff2c890deb81884384933805749fe3c5c share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/brst.swf
+SHA1 b00586781067517c472deea06334c0d066fa0e07 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/cl3d.swf
+SHA1 d2efde2393d3e79b2ea23482a4adfbf0e0367812 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/clfl.swf
+SHA1 51d5ad57465b8b38dc5bdb951ab413dc73e7d331 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/clno.swf
+SHA1 eb5570a1c10d94d9baf6ea450b5fad52f19bbfa4 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/clp3.swf
+SHA1 f3b0595db54960e9db62c69062cb6d5604046c5f share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/cls3.swf
+SHA1 6a3a5ef6406b3aa83b64e78849f916d83129e82e share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/clst.swf
+SHA1 47a1ebff64d7a63f107aea9251282f9da2c1cdec share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/cnno.swf
+SHA1 6cb99ac1b9b6e53011cd2e0fd10cd09bd4c9ac4b share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/lnno.swf
+SHA1 4a8bf970847bdc6693fde1d7fed317e6d8a7f623 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/mxno.swf
+SHA1 85aba8c388834b2a634407d4f8d95365a6582c87 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/pi3d.swf
+SHA1 21eeaf60cdcf8d8a851a70663a9876a6f2e7e0c4 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/pino.swf
+SHA1 3c3058e7d0e5a8d35f8aea4078c24343f1bbcf1f share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/pono.swf
+SHA1 a1c41ce6aebca3f0807508f38684d5f112eb6900 share/plugins/Jifty/Plugin/Chart/web/static/flash/xmlswf/charts_library/scno.swf
+SHA1 b2e5faf9283ed95c29bc154751b681e1ae82ed10 share/plugins/Jifty/Plugin/Chart/web/static/js/MochiKit/MochiKit.js
+SHA1 6f05da1941ddb410b89f26ea4ea4e72c235ceaed share/plugins/Jifty/Plugin/Chart/web/static/js/MochiKit/__package__.js
+SHA1 3c46aa6eb3074e8b7997b7eb836728cd154bf3b3 share/plugins/Jifty/Plugin/Chart/web/static/js/PlotKit/PlotKit_Packed-20060807-custom.js
+SHA1 3222ee358056a954472dc6f55a0617464ec8875a share/plugins/Jifty/Plugin/Chart/web/static/js/PlotKit/excanvas.js
+SHA1 016570edda3b0aa661ebbddcdaff2acdad4274a9 share/plugins/Jifty/Plugin/Chart/web/static/js/chart_img_behaviour.js
+SHA1 49fde8a24c0345ea74800f1e99bbd62567b51988 share/plugins/Jifty/Plugin/Chart/web/static/js/mochikit.noexport.js
+SHA1 9ffed1b5658c22190f2124fa2e6bd344ee74a1e0 share/plugins/Jifty/Plugin/Chart/web/static/js/simple_bars.js
+SHA1 15bd576afbe4cc9d44623cc8feb9b379fbe2a603 share/plugins/Jifty/Plugin/GoogleMap/web/static/css/google_map.css
+SHA1 1178d664f92ecfdd4635363fed6b53ef843cb593 share/plugins/Jifty/Plugin/GoogleMap/web/static/js/google_map.js
+SHA1 e1c9252b3e60673e4fa1bb1648cb18cd33139535 share/plugins/Jifty/Plugin/JQuery/web/static/js/jquery.js
+SHA1 e9813f935b17859c91b651d992cae6c90776ad14 share/plugins/Jifty/Plugin/JQuery/web/static/js/noConflict.js
 SHA1 7efa4f24d875a19035963c3955f2fc4e613b8cfe share/plugins/Jifty/Plugin/OnlineDocs/web/templates/__jifty/online_docs/autohandler
 SHA1 608c393b35a8884b4d32a4c855bbcc73478dc849 share/plugins/Jifty/Plugin/OnlineDocs/web/templates/__jifty/online_docs/content.html
 SHA1 58a4059cc383f792108986d2386a5e7edc81363f share/plugins/Jifty/Plugin/OnlineDocs/web/templates/__jifty/online_docs/index.html
 SHA1 37555dd5c3acfbaecfc28416e0fa21b0aa6e1d77 share/plugins/Jifty/Plugin/OnlineDocs/web/templates/__jifty/online_docs/toc.html
-SHA1 0da91e5da11aa851363d08a8f9aeade85f72aeb7 share/po/en.po
+SHA1 2996fff4ab04768018cfc0f617c18757e1847a7b share/po/en.po
 SHA1 63a333ff328933df4082e868ba9115b3c0fa24bd share/po/fr.po
 SHA1 88408a7350d0599fd4e7cd7f709fd918b55b6b27 share/po/ja.po
-SHA1 94151e35cbd50a82e09f33718dad3f15fdb0416f share/po/zh_cn.po
+SHA1 12b260c8de9d985a8968254021cde5c7d56156b3 share/po/ru.po
+SHA1 d3f30c5bc2a7ef0fc0ea8acaaa75f03563eb16d9 share/po/zh_cn.po
 SHA1 623dbb738a8db1e79de6127fc3af2c918d2c93e6 share/po/zh_tw.po
 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709 share/web/static/css/app-base.css
 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709 share/web/static/css/app.css
@@ -855,7 +1056,7 @@
 SHA1 716b6f8326bd5cd05c31e521351197b5038e052e share/web/static/js/app_behaviour.js
 SHA1 2b28f63068ff486e7fd7937f725f47e886d01831 share/web/static/js/behaviour.js
 SHA1 47cd1a7e3c41b4032cc1712f12b8564cdac12d37 share/web/static/js/bps_util.js
-SHA1 c5fe967d89bc082af093d1ea4eaa2ef3cbfa4e79 share/web/static/js/calendar.js
+SHA1 7d750c5322985e968873c084fe8a4942a70708ba share/web/static/js/calendar.js
 SHA1 e9f9931abe8ddf86cf5cfddd1f0e963bb5bf0ccb share/web/static/js/combobox.js
 SHA1 cd5a80e098d28f7cf0b74cee38f08bd336ccdc95 share/web/static/js/context_menu.js
 SHA1 b03b1f06f9c972cfb083c3d87b3dc74e4d85bf77 share/web/static/js/css_browser_selector.js
@@ -867,7 +1068,7 @@
 SHA1 4553f3cb184b09228ed4362898e9d30200a2a585 share/web/static/js/formatDate.js
 SHA1 a1d2c6292d656c275383b97aad6ca913b8a1b031 share/web/static/js/halo.js
 SHA1 08b20563e958e72c3e8a221d91614c412bdd068b share/web/static/js/iepngfix.htc
-SHA1 8160deda9af812be79ea1f8a30d8cf8d67055777 share/web/static/js/jifty.js
+SHA1 762552c69eda7c920f366e0fdabd5010399cc1c2 share/web/static/js/jifty.js
 SHA1 29fe34f11192976f1a388562188b1eb9af7f4497 share/web/static/js/jifty_smoothscroll.js
 SHA1 8723bf251531e79ab109ea0d3fb2187a8dac8cb6 share/web/static/js/jifty_subs.js
 SHA1 1a4ccf6b5d376984d91c439e1642bd2b7fb11115 share/web/static/js/jifty_utils.js
@@ -879,7 +1080,7 @@
 SHA1 7a13c9041326f2e70494f6ed5bcd87396bdd4280 share/web/static/js/jsan/Upgrade/Array/push.js
 SHA1 becdf6868ec4aec2dc93c8c33b0713d1c4f4eb34 share/web/static/js/jsan/Upgrade/Function/apply.js
 SHA1 f15b0364f99d2e4c1af795c82883f89b9eaca9b2 share/web/static/js/json.js
-SHA1 df1c8b06e2d10c743cbd65d7feda8db5a23522d6 share/web/static/js/key_bindings.js
+SHA1 7a09ac75f9140b7faf2f3b0e97493c78997798f6 share/web/static/js/key_bindings.js
 SHA1 986a63bc533f6fa99c9b0f0226a14f9871b94ce5 share/web/static/js/prototype.js
 SHA1 a1048deeafbc76659e54eb77c0e51b6b79cade19 share/web/static/js/rico.js
 SHA1 164bc59cf75fe943edc80da65b19246fc9b9643e share/web/static/js/scriptaculous/builder.js
@@ -890,16 +1091,18 @@
 SHA1 cc2e31820eed69ae87b1b2befa50e8c4a8519342 share/web/static/js/scriptaculous/slider.js
 SHA1 6b42a40cac7d45f9fd6665e18c4e494704eff9e3 share/web/static/js/scriptaculous/unittest.js
 SHA1 f254696f59ab11c2373c79ba0e6f303d8ac4f71e share/web/static/js/setup_jsan.js
-SHA1 4f45c2546592411e46e149a73d347e176d0c7ad6 share/web/static/js/yui/calendar.js
+SHA1 9a0f2a5192257ee847450894c9fc21cb1dbfdcc1 share/web/static/js/template_declare.js
+SHA1 c29a9ef089e604a15f8cd269d7d99b2c9bb408e5 share/web/static/js/yui/calendar.js
 SHA1 4d8516305e94d483884ebdfca238d5ea51d0998c share/web/static/js/yui/container.js
 SHA1 dcffe77f6896444b0d71fcb1e8be0ad559256a3e share/web/static/js/yui/dom.js
 SHA1 7b3e21d1cab9fd5da64911838295429d16415797 share/web/static/js/yui/element-beta.js
 SHA1 96f4c1ab0670c62a11e1be261dce68f33064bd67 share/web/static/js/yui/event.js
 SHA1 bfe29fd94ccc2d6b6c008245b3a4ce3f8ed651f2 share/web/static/js/yui/menu.js
+SHA1 1f8b765e6b904e5540e7175f37723570077953e7 share/web/static/js/yui/oom_select.patch
 SHA1 ae99956060eb7a5a7b8b0856cd1013a3ef5b0189 share/web/static/js/yui/tabview.js
 SHA1 d246ffa31cb6ef0218be0cbec5fd0ba8438ef6cc share/web/static/js/yui/yahoo.js
 SHA1 05359f0e32b4bebd965707788228704167689d3c share/web/templates/=/subs
-SHA1 bdaeeff0c2522a8509d4da45be703d1e8cf5c96c share/web/templates/__jifty/autocomplete.xml
+SHA1 fc608ff66778543d016d7082d57549403bbadf47 share/web/templates/__jifty/autocomplete.xml
 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709 share/web/templates/__jifty/empty
 SHA1 f85d8cae8a2df3ee51b868a744a9e9af21925e0c share/web/templates/__jifty/error/_elements/error_text
 SHA1 e2d761b0b92f818eb2bbb91a15cef0a2471d2245 share/web/templates/__jifty/error/_elements/wrapper
@@ -908,26 +1111,26 @@
 SHA1 78e1e0af483fa3bdac2de4e5a9d82486d67b8537 share/web/templates/__jifty/error/error.css
 SHA1 6834dbbfe494846bb3a70f1f8d6735c4f8c1b326 share/web/templates/__jifty/error/mason_internal_error
 SHA1 36736d4597f9a4259b84618f49122a3e2c2790a0 share/web/templates/__jifty/halo
-SHA1 d56aea6b4ec690cc9078873da2f93bcbb88d2921 share/web/templates/__jifty/validator.xml
+SHA1 85a5bd5f190d3c5210c2f532b44d334c507da340 share/web/templates/__jifty/validator.xml
 SHA1 8ec2abf3fb43be8217f7a0af4054cf40f7e1e47e share/web/templates/__jifty/webservices/json
-SHA1 bbe1d4af8ab26a9e7d528d819bb271b591172f3c share/web/templates/__jifty/webservices/xml
+SHA1 1ee9cb1bdf246dc8cf37621ba4676decb5339830 share/web/templates/__jifty/webservices/xml
 SHA1 c7384fcdf1ee7a3e347388c6619f6aa2f297656e share/web/templates/__jifty/webservices/yaml
 SHA1 8145ab6043a7bbd70e1bfa33e068fb741f4ee3a5 share/web/templates/_elements/header
 SHA1 f36e8e0557117d8fdcebad74694fac718101ce27 share/web/templates/_elements/keybindings
 SHA1 0d84d7af43685d7161fc800a2c8b464b8586c57d share/web/templates/_elements/menu
 SHA1 9a63bfc72a36bc01d3d480d24d695ca5a3fe9169 share/web/templates/_elements/nav
 SHA1 b74c8647eb89e1e189d3cefbbfae51da608edcff share/web/templates/_elements/page_nav
-SHA1 c255d8da7c3eb68fc66f9f7c041c92b247489fcc share/web/templates/_elements/sidebar
+SHA1 63218c27ce4ad809c66c391556f2830cfa447d18 share/web/templates/_elements/sidebar
 SHA1 bc8991085ddd0c664bb57a1ad4a79e9bca1807ea share/web/templates/_elements/wrapper
-SHA1 35adfc3fd3cbf1c2c3310dd2c2a7eb7317495ced share/web/templates/autohandler
+SHA1 3fe248a1e0f6c8cf60ba6c593f2729d18fb9650b share/web/templates/autohandler
 SHA1 106fc0286e2aff5a01d9a623c37fc807451f2037 share/web/templates/dhandler
 SHA1 347e3ad8491b742c4cd8e63e77fb4cae2152034c share/web/templates/helpers/calendar.html
 SHA1 1bd17a07884f71740a048c41b67ac9b06915bf76 share/web/templates/index.html
 SHA1 c118e782947f715afec7b5cffa4ebc413e990c12 share/web/transform_templates
 SHA1 7f9dae91a9bfc2743eec1d7aaf78e16fc9f1baba t/00-load.t
-SHA1 1e1a7b63b3ea8d2712214eb28b5fe69aae76da1d t/01-dependencies.t
+SHA1 7922f3d21505c630e6a694c7b3cc07e6bbf246f7 t/01-dependencies.t
 SHA1 777e40e7d3c591c21883d0ed880df8712dd50ff3 t/01-test-mechanize.t
-SHA1 ade22974f54a6e0991e14be587be0c9797e72ed5 t/01-test-web.t
+SHA1 6fdfbd2d5db06e2f8ed23d2c551b8ac3f6e9cecf t/01-test-web.t
 SHA1 95fe956e7bae756a7bc25e65a6761ee0c64981e7 t/01-version_checks.t
 SHA1 4fa0e0143339298278c5e22a58236c6b71555508 t/02-connect.t
 SHA1 46221e3b0272c3ef2f5ce0032239dc3aba1d2e04 t/03-form-protocol.t
@@ -941,8 +1144,10 @@
 SHA1 38ab90a10fc0cbbbfc3205e543312950302f37a2 t/08-client.t
 SHA1 ea9587b57587f6b9b5e02e3d30b96807f7b62200 t/09-url.t
 SHA1 7ca6fdf97c470ec1360425d3121690b9a4e93790 t/10-i18n.t
+SHA1 4d22cf9380a78774b7671eff0f55521abccfd7ab t/10-utf8.t
 SHA1 d571f6fae9d1a33060fda8c89951492a02b1af01 t/11-config-files.t
 SHA1 bd4520e6f2bfdabc6dba2d27e0cb6d33453f82e7 t/12-param-schema.t
+SHA1 d4b169132cc2aaaa2ff9c38b2e7009fc38918567 t/13-sessions.t
 SHA1 59c44900b1cb957d262f96363ceff21b46e0d598 t/99-pod-coverage.t
 SHA1 bb0da54f2b3f2d7955baa41ee458cb3d1887f475 t/99-pod.t
 SHA1 a7dc1f376cac630ea28d2965e561469deb951cc7 t/Continuations/bin/jifty
@@ -962,16 +1167,37 @@
 SHA1 313bd1afbbd9e066db03080e99766961f9fba2a8 t/Continuations/t/02-api.t
 SHA1 f68f215bb0d9eae9054185b1335ae1fdd0f82708 t/Continuations/t/03-gc.t
 SHA1 acb9008e28ca12dfdc63d007f4f9cad74144b09f t/Continuations/t/04-before-blocks.t
-SHA1 5919e0929f27b3abcd3b6ee4148d2306594ee7dd t/DateTime.t
+SHA1 08b841f2fe1ad83f70fb4541a10ecc83d4a65939 t/DateTime.t
 SHA1 29a9d0b63d274805fe33c3123faf1a5f871a0e24 t/Jifty.pm
 SHA1 a7dc1f376cac630ea28d2965e561469deb951cc7 t/Mapper/bin/jifty
-SHA1 b381fb60f53d16f8846f7011b8f8a862eaa834c0 t/Mapper/lib/Mapper/Action/CrossBridge.pm
+SHA1 632a449d9f14deda4a0a4115b5bb4df80826305c t/Mapper/lib/Mapper/Action/CrossBridge.pm
 SHA1 6bee8bba7db76902f300f69bbc7ffbd045380074 t/Mapper/lib/Mapper/Action/GetGrail.pm
 SHA1 904ccf244ddafa2cf756e2de1f251b0962399750 t/Mapper/share/web/templates/autohandler
-SHA1 14a865ad9c903f69dffa595c463f343dd29f62e2 t/Mapper/share/web/templates/index.html
+SHA1 545c0ef898ffb413b2e837ac294a2c46916ed04d t/Mapper/share/web/templates/index.html
 SHA1 3b7b51b4428dcbf0b9b1d55c39fd139a3ee4868a t/Mapper/t/00-prototype.t
 SHA1 548bf96ee16a84e3793d89cc0dd68ab67bd03f66 t/Mapper/t/01-raw-api.t
-SHA1 cdc883e2e3ff2997c1efc01f688638f8d983edd9 t/Mapper/t/02-api.t
+SHA1 6187a88b827fc446b8aa3fc2a352ec71e33f416f t/Mapper/t/02-api.t
+SHA1 0b51950a8666a1a41838b3c16205fe97750f860f t/TestApp-Plugin-AppPluginHasModels/Makefile.PL
+SHA1 c1ff9ff7f2a88bc4306b3866b6b80fb9aa8e8423 t/TestApp-Plugin-AppPluginHasModels/bin/jifty
+SHA1 79e1b3ea60bc54ec9ad0a000d6f2f849d12f847f t/TestApp-Plugin-AppPluginHasModels/etc/config.yml
+SHA1 d5223018628abf42b6f7c3eb8ca1e1c006ab5bf1 t/TestApp-Plugin-AppPluginHasModels/lib/TestApp/Plugin/AppPluginHasModels/Plugin/MyAppPlugin.pm
+SHA1 ccbcf7e598398c80a0b687174f64ade7c1e57909 t/TestApp-Plugin-AppPluginHasModels/lib/TestApp/Plugin/AppPluginHasModels/Plugin/MyAppPlugin/Model/Color.pm
+SHA1 0fdc9d3c5ee9636b20eeae64f46bdcef713c2397 t/TestApp-Plugin-AppPluginHasModels/t/plugin-model.t
+SHA1 c590849c33f8e87e8c34ec7dbe4ba384ba6880b7 t/TestApp-Plugin-Chart/Makefile.PL
+SHA1 c1ff9ff7f2a88bc4306b3866b6b80fb9aa8e8423 t/TestApp-Plugin-Chart/bin/jifty
+SHA1 e4f269ce7e959f03ba40afe933ce34269e081894 t/TestApp-Plugin-Chart/etc/config.yml
+SHA1 94c39dbef547367bb6e6da1b9223cf1608ed748e t/TestApp-Plugin-Chart/lib/TestApp/Plugin/Chart/View.pm
+SHA1 ff856d51a878c5ff67f828c67088af5ca9248591 t/TestApp-Plugin-Chart/t/chart.t
+SHA1 8912276067f1707ad2a05677bd54c2013bc49ff1 t/TestApp-Plugin-Chart/t/gd_graph.t
+SHA1 711894dd5ab6923eb725582e7cd739c2ca5c403e t/TestApp-Plugin-JQuery/Makefile.PL
+SHA1 c1ff9ff7f2a88bc4306b3866b6b80fb9aa8e8423 t/TestApp-Plugin-JQuery/bin/jifty
+SHA1 430cca6c8488b9f2f5b061bfcdadbd5f33db3b82 t/TestApp-Plugin-JQuery/etc/config.yml
+SHA1 93b414ca2f8f633893a5bc460c136754042772ac t/TestApp-Plugin-JQuery/t/jquery.t
+SHA1 543e899febfce9d8b9c644d557ef3af98f6ad89e t/TestApp-Plugin-News/Makefile.PL
+SHA1 f7f44f9a7337def0c97f981073e3ed970851d9ae t/TestApp-Plugin-News/bin/jifty
+SHA1 47529b82ece48a5943eac7c1ab8b2de5c94f8795 t/TestApp-Plugin-News/etc/config.yml
+SHA1 f69a79e81e98c9c6a99c74cedd9b060b6618970a t/TestApp-Plugin-News/lib/TestApp/Plugin/News/Model/News.pm
+SHA1 53c30add7fff4ebeedf1b6b2ee8474c3bc34efd6 t/TestApp-Plugin-News/lib/TestApp/Plugin/News/View.pm
 SHA1 5151dae3d7ac5f80dcfaf39fdeea0157af85f189 t/TestApp-Plugin-PasswordAuth/Makefile.PL
 SHA1 f7f44f9a7337def0c97f981073e3ed970851d9ae t/TestApp-Plugin-PasswordAuth/bin/jifty
 SHA1 2ad861771e8cc20e90a5820cb4d3d0837a4fc047 t/TestApp-Plugin-PasswordAuth/etc/config.yml
@@ -984,6 +1210,7 @@
 SHA1 7513161b6944b864a0d06f74ce230907e2064cf7 t/TestApp-Plugin-PasswordAuth/t/00-model-User.t
 SHA1 cd358dc97050649f35034d8363590798a543799d t/TestApp-Plugin-PasswordAuth/t/01-tokengen.t
 SHA1 fda1f40fc6869572331ab18da6b57679b847d3f0 t/TestApp-Plugin-PasswordAuth/t/11-current_user.t
+SHA1 19873166c5da3e6a652135891e82f523794e91d9 t/TestApp-Plugin-PasswordAuth/t/12-i18n.t
 SHA1 e39787081ffb2783de44db32157c6f3bf1631047 t/TestApp-Plugin-PasswordAuth/t/12-signup.t
 SHA1 a7dc1f376cac630ea28d2965e561469deb951cc7 t/TestApp-Plugin-REST/bin/jifty
 SHA1 4762d5e154fcbeb0b188a1ecb90c4997403c9d24 t/TestApp-Plugin-REST/etc/config.yml
@@ -999,17 +1226,19 @@
 SHA1 f9a9321b803e4f248ecdd86fd71613164c01bd86 t/TestApp/lib/TestApp/Action/DoSomething.pm
 SHA1 f93118ca17be86a7c171ee47864d7149baf7344c t/TestApp/lib/TestApp/Action/DoSomethingElse.pm
 SHA1 6e27f855429d18181d6c5a0de6b83492fa5c6219 t/TestApp/lib/TestApp/CurrentUser.pm
-SHA1 7e5dfbfaf1fc9c867e3bb3471597e9d744218949 t/TestApp/lib/TestApp/Dispatcher.pm
-SHA1 5e1331569dbfafb56c4bbd26e0e2ad58e2f3b3cd t/TestApp/lib/TestApp/Model/User.pm
+SHA1 0ff8efa1a274a4e0db2256a7231886ab27f3eb18 t/TestApp/lib/TestApp/Dispatcher.pm
+SHA1 f1465b5bab96659951965e968b580d1c7c218485 t/TestApp/lib/TestApp/Model/User.pm
 SHA1 b2d3474949dae7c171157e8697dbb208ef3805f8 t/TestApp/lib/TestApp/Upgrade.pm
-SHA1 0807d39d56ad1c603d5fda36c26f92f32709feb0 t/TestApp/lib/TestApp/View.pm
-SHA1 1a738a666e1bd83a6f6791d069738d0a90e724d4 t/TestApp/lib/TestApp/View/base.pm
-SHA1 0838ac6deac43ed66fb6bfb358051b716e12e7a8 t/TestApp/lib/TestApp/View/instance.pm
+SHA1 ac8b1d259e0c4115ff4f0f11910fd55d80a4a6c8 t/TestApp/lib/TestApp/View.pm
+SHA1 f8be83226541599e4543484128fd209dfc664ff6 t/TestApp/lib/TestApp/View/base.pm
+SHA1 e376d22f0db953b5c9ede1e4e07660fe94390bf5 t/TestApp/lib/TestApp/View/instance.pm
 SHA1 67f41db40d62b81d71cb60c542695e0d7e6d393d t/TestApp/share/web/static/images/pony.jpg
+SHA1 7ba52ae3cd4e86402ece8b2ffa6ac314daf132b9 t/TestApp/share/web/templates/_elements/wrapper
 SHA1 5a47fc9c85527214f6eaf2c8f8dd84bfb80fef61 t/TestApp/share/web/templates/concrete.html
 SHA1 1e4b29a138e61f49c1ceffe50c15ed0a087613fc t/TestApp/share/web/templates/currentuser
 SHA1 a2e7bf8d2d52bbaf360af24b4ffc00c68d7e31f2 t/TestApp/share/web/templates/dispatch/basic
 SHA1 d1e244371109ce216bfd6b9ac03374737461577c t/TestApp/share/web/templates/dispatch/basic-show
+SHA1 fb9265ecb04b222ba615e53d0d316ab3e88aab8e t/TestApp/share/web/templates/dispatch/protocol
 SHA1 44795ddb863c9c32c05678bf8288c9816e3366a9 t/TestApp/share/web/templates/dosomethingelse
 SHA1 f5870c2fb3222b86d97f14bdf8155821c887987b t/TestApp/share/web/templates/editform
 SHA1 9cea9df8bd6b4644b100259b9290f5e52f874d0d t/TestApp/share/web/templates/index.html
@@ -1017,7 +1246,6 @@
 SHA1 70e9bbbe8ad7df2db3352073ec840a93c4d6d6fb t/TestApp/share/web/templates/path_test/foo/index.html
 SHA1 4e9416993c5e56de1f9688061648ec6a164b1734 t/TestApp/share/web/templates/path_test/in_both
 SHA1 0aa10de36e1c4b34d3e00ca954d10f2c532a1e25 t/TestApp/share/web/templates/path_test/mason_only
-SHA1 1f95e8e0f677fd2571dfcf6e66688b52f0e22184 t/TestApp/share/web/templates/redirected
 SHA1 55438c7d68b465f08c9774aacacbc2aa62cced8f t/TestApp/share/web/templates/regions/list
 SHA1 cc7e1174609f5ae92b441c4ecf7a4734cf5a9436 t/TestApp/share/web/templates/regions/long
 SHA1 f7b091879df762cccacaf827fbadc1ad4b6294b1 t/TestApp/share/web/templates/regions/short
@@ -1025,35 +1253,41 @@
 SHA1 350ab77f7c18d826ed91eaf251f3f80ebd9605ba t/TestApp/t/00-model-User.t
 SHA1 3b7b51b4428dcbf0b9b1d55c39fd139a3ee4868a t/TestApp/t/00-prototype.t
 SHA1 94a1fe86cc34fbdce9087f30a69a859063ca8714 t/TestApp/t/01-config.t
-SHA1 840b50a023f9bc45b2345e0c664949d55d056b15 t/TestApp/t/02-dispatch-show-rule-in-wrong-ruleset.t
+SHA1 77466bc82d8f48bb7890bcf7900749b73b2a9f97 t/TestApp/t/02-dispatch-http.t
+SHA1 cd484f47abbb3834c91420dcf1fa7e0e39f24dda t/TestApp/t/02-dispatch-https.t
+SHA1 1b767d139947568b87bb8f198ce96716a3a2aece t/TestApp/t/02-dispatch-show-rule-in-wrong-ruleset.t
 SHA1 6c6726cd87697675c80828825ff34109daec7f86 t/TestApp/t/02-dispatch.t
 SHA1 d438a2c8aa2fa15c80da4f2a44ecfe65856b58f8 t/TestApp/t/03-static.t
 SHA1 dc8e0ea29839c6dd50843d7c95a907874f6d5472 t/TestApp/t/04-sessions.t
 SHA1 071288e6e1c64cef819f8e3adb7b20a8c7044804 t/TestApp/t/05-actions-before-redirect.pm
 SHA1 79dc79df5690e3d7b418bf6475c13ea0d4c1f8a4 t/TestApp/t/05-editactions-Cachable.t
-SHA1 47ac4941336e8bc00821e89b0ccfdf9232be53ca t/TestApp/t/05-editactions-Record.t
+SHA1 af0857e7c15356be76792cb17ac5843416563ae4 t/TestApp/t/05-editactions-Record.t
 SHA1 1a425b17fe88ed3c6783e7894bc514641ad0fffa t/TestApp/t/06-validation.t
 SHA1 0a73294c477197748994580ed1615cbe42bfa335 t/TestApp/t/07-sandboxing.t
-SHA1 842377402228a26ff444c565831bc560a66c0302 t/TestApp/t/08-notifications.t
-SHA1 1fce112ee319adb146b787ad23ef3b050759063b t/TestApp/t/09-redirect.t
+SHA1 3c28d88a25d4f7ed0edf2450d7b4ab7577f04dbe t/TestApp/t/08-notifications.t
+SHA1 3e648a4acabeb7a137f28a01698b8c1853a65aa1 t/TestApp/t/09-redirect.t
 SHA1 55ba141d6c73a6dfa7ccccb6cb9f32253ed8decb t/TestApp/t/10-compress.t
-SHA1 18667b3bdcbe7b9dd2715e16c8bbffe51c28548f t/TestApp/t/11-current_user.t
+SHA1 5d013aae657f16eb75b6c929fc4fcd66c186f2b6 t/TestApp/t/11-current_user.t
 SHA1 019605c6e627bf65ee3d2ed1b8d2b34fc8e10853 t/TestApp/t/12-search.t
 SHA1 1c80b396277bf78134c2aa3de9e0f375e7efef75 t/TestApp/t/13-page-regions.t
 SHA1 b57b4cf6832d53a3777fe65e56f9ae076f474b0a t/TestApp/t/14-template-paths.t
-SHA1 601af3bb2265d698a458d2f02ca76b1a4f076fe7 t/TestApp/t/15-template-subclass.t
+SHA1 af490a8e49140d63e12feb96a8544bc1ea4fe925 t/TestApp/t/15-template-subclass.t
+SHA1 10286b19e32167d07ad59c927dcbe46159edb184 t/TestApp/t/16-template-region.t
+SHA1 e4f33eb967231751ce043a1be3cdbf526671127c t/TestApp/t/17-template-region-internal-redirect.t
+SHA1 cbf28439ca71f373a547db875732a0b2e5ce9a7f t/TestApp/t/before_access.t
 SHA1 69401ad0579fa743f087731536229d2806dd1d6a t/TestApp/t/config-Cachable
-SHA1 710c4b0faaea46f90a7b071e5396541a59ed0ff1 t/TestApp/t/config-Record
+SHA1 576e73eedda16d331b018da82b36d01510060422 t/TestApp/t/config-Record
 SHA1 6c16e68284cc30d81eba755c6986675690b78f77 t/TestApp/t/i18n-standalone.t
 SHA1 30274351a6eb9342daef843ffb8a2aafee38afb4 t/TestApp/t/instance_id.t
 SHA1 ee548850452b377e08f36a9269c1b8f7911bdb2d t/TestApp/t/regex_meta_in_path_info.t
 SHA1 f502e4937629f7525cf90cf982cadd29bc60ed5a t/TestApp/t/upgrade.t
-SHA1 aa8319f0acdd5c8e8c60b34d360cff834029e570 t/TestApp/testapp
+SHA1 a415b718785f367c0c7c4e8f72b33613f5dbce44 t/TestApp/t/use_mason_wrapper.t
+SHA1 ca61102870f9c092374d7d74c19174ce601d80e7 t/clientside/td.t
 SHA1 c8fb21f31b593627b38129ee9dd41eaf9c556ced t/lib/Jifty/SubTest.pm
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.3 (Darwin)
 
-iD8DBQFGLAc7Ei9d9xCOQEYRAhCwAJ4lMvEguYMYUKn5vsKqG/5r5NzLeACfdTbM
-ErSkhd0sSOnf65Oqb8gHWzg=
-=cCbP
+iD8DBQFGzlvEEi9d9xCOQEYRAqPEAKCOzwFVQ+R1uimjKfJQgAiOh69VAwCfUI6C
+XxD2rfrthtS5PgsTW0eahl4=
+=f54M
 -----END PGP SIGNATURE-----

Added: jifty/branches/virtual-models/bin/generate-changelog
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/bin/generate-changelog	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,194 @@
+#perl -MFile::Slurp -MXML::Simple -MData::Dumper -e'print scalar Dumper ( XMLin( read_file(shift @ARGV).""))' 
+
+use warnings;
+use strict;
+use Term::ANSIScreen;
+use Text::Autoformat;
+use YAML;
+use File::Slurp;
+use XML::Simple;
+use Term::ReadKey;
+use Data::Dumper;
+         use File::Temp qw/ tempfile tempdir /;
+my @tags = qw(doc install core plugin security view t-discard backward-compatiblity-problem u-pubsub r-crud e-testing);
+
+my %tags = map { substr($_,0,1) => $_ } @tags;
+my $mode = shift @ARGV;
+my ($source,$dest);
+if ($mode eq '--generate') {
+     $source = shift @ARGV;
+     $dest = shift @ARGV;
+
+}
+elsif ($mode eq '--edit') {
+     $source = shift @ARGV;
+     $dest = shift @ARGV;
+
+}
+
+unless ($source && -f $source && $dest) { die "$0 --generate SOURCEFILE DESTFILE\n or \n$0 --edit SOURCEFILE DESTFILE" }
+
+
+my $data = XMLin(read_file($source)."");
+
+
+if ($mode eq '--edit') {
+
+foreach my $entry (@{$data->{'logentry'}}) {
+   my %entries; 
+    foreach my $entry (@{$data->{'logentry'}}) {
+        push @{$entries{$entry->{section}||'uncategorized'}}, $entry;
+    }
+    foreach my $key ( keys %entries) {
+        foreach my $entry (@{$entries{$key}}){ 
+    act_on($entry);
+    }
+    }
+}
+
+    do_quit();
+} elsif ($mode eq '--generate') {
+   my %entries; 
+    foreach my $entry (@{$data->{'logentry'}}) {
+        push @{$entries{$entry->{section}||'uncategorized'}}, $entry;
+    }
+
+    foreach my $key ( keys %entries) {
+    my $title = $key;
+    $title =~ s/^\w\-//;
+        print uc($key)."\n";
+        print "=" x length($key) ;
+        print "\n\n";
+
+        foreach my $entry (@{$entries{$key}}){ 
+
+        format_entry($entry) ;
+        print "\n";
+        }
+    }
+
+}
+
+sub act_on {
+    my $entry = shift;
+
+    my $console = Term::ANSIScreen->new;
+    while (1) {
+    my $command = '';
+    while (!$command) {
+        $console->Cls;
+            $console->Cursor(1,1);
+
+
+        if (!$entry->{'edited_msg'} && ref($entry->{msg})) { $entry->{'edited_msg'} = Dumper($entry->{'msg'}); }
+        format_entry ($entry => 1);
+    
+    
+        my $in = getchar();
+
+
+        if ($in eq 's') {
+            return;
+        } 
+        elsif ($in eq 'c') { $command = 'chomp'; }
+        elsif ($in eq 'e') { $command = 'edit'; }
+        elsif ($in eq 'q') { $command = 'quit'; }
+        elsif ($in eq 't') { $command = 'tag' }
+        elsif ($in eq ' ') {
+            return
+        }
+    }
+    if ($command eq 'tag') {
+        tag($entry);
+    }
+    elsif ( $command eq 'write' ) {
+        warn "Writing";
+    } elsif ( $command eq 'chomp' ) {
+        my $msg = ( $entry->{'edited_msg'} || $entry->{'msg'} );
+        my @lines = split( "\n", $msg );
+        shift @lines;
+        $entry->{'edited_msg'} = join( "\n", @lines );
+    } elsif ( $command eq 'edit' ) {
+        warn "Chomping";
+        my ( $fh, $filename ) = tempfile();
+        print $fh ( $entry->{'edited_msg'} || $entry->{'msg'} ) || die $!;
+        close $fh;
+        system( ( $ENV{EDITOR} || 'vi' ), $filename );
+        $entry->{'edited_msg'} = read_file($filename);
+    } elsif ($command eq 'quit') {
+
+        do_quit();
+    }
+
+    }
+
+}
+
+sub tag {
+    my $entry = shift;
+    my $tag;
+    print "Valid tags are: " . join( ', ', @tags ) . "\n";
+    while ( !$tag ) {
+        my $key = getchar();
+        return if ( $key eq  ' ' );
+        print "You picked " . $key . "\n";
+        if ( $tags{$key} ) {
+            $tag = $tags{$key};
+            print "You tagged it $tag\n";
+        } else {
+            print "NO. THAT IS NOT A VALID TAG\n";
+
+        }
+    }
+    $entry->{section} = $tag;
+
+}
+
+sub do_quit {
+my $out;
+    open( $out, ">$dest" );
+
+    print $out XMLout($data,  NoAttr => 1 );
+    close($out);
+    exit;
+
+}
+
+sub getchar {
+
+    ReadMode 4;
+        my $key = ReadKey(0);
+            ReadMode 0;
+
+    return $key
+            }
+
+
+sub format_entry {
+    my $entry = shift;
+    my $verbose = shift ||0; 
+        if  ($verbose ) {
+      print "r".$entry->{revision}." - ";
+      print $entry->{'section'} || "UNCATEGORIZED - HIT 't'";   
+      print "\n".("="x60)."\n";
+      }
+
+     my $msg = ( $entry->{'edited_msg'} || $entry->{'msg'});
+
+    if ($msg =~ /^[\s\*]*\w/) {
+        $msg =~ s/^[\s\*]*/ * /;
+    }
+
+        $msg =~  s/\n+$//g;
+     $msg .= " - ".$entry->{'author'}."\n";
+
+
+     $msg =   autoformat ($msg,  { left=>0, right=>78 });
+        $msg =~  s/\n+$//g;
+      print $msg."\n";
+        if  ($verbose ) {
+
+        print YAML::Dump( $entry->{'paths'});
+        print "\n";
+    }
+}

Modified: jifty/branches/virtual-models/debian/changelog
==============================================================================
--- jifty/branches/virtual-models/debian/changelog	(original)
+++ jifty/branches/virtual-models/debian/changelog	Tue Sep 11 14:03:32 2007
@@ -1,3 +1,9 @@
+jifty (0.70820-1) unstable; urgency=low
+
+  * svn snaphsot
+
+ -- AGOSTINI Yves <agostini at univ-metz.fr>  Tue, 21 Aug 2007 11:17:06 +0200
+
 jifty (0.70416-1) unstable; urgency=low
 
   * New cpan release

Modified: jifty/branches/virtual-models/debian/control
==============================================================================
--- jifty/branches/virtual-models/debian/control	(original)
+++ jifty/branches/virtual-models/debian/control	Tue Sep 11 14:03:32 2007
@@ -57,10 +57,11 @@
  libdbd-sqlite3-perl, libdata-page-perl, libossp-uuid-perl,
  libdatetime-perl, libdatetime-format-builder-perl, 
  libdate-manip-perl, libemail-folder-perl,
- libemail-localdelivery-perl, libemail-mime-perl,
- libemail-mime-creator-perl, libemail-mime-contenttype-perl,
- libemail-send-perl (>> 1.99_01), libemail-simple-perl,
+ libemail-messageid-perl, libemail-mime-perl, libemail-mime-encodings-perl, libemail-mime-perl, libemail-mime-encodings-perl, libemail-mime-contenttype-perl, libemail-simple-perl, libemail-mime-modifier-perl, libemail-mime-creator-perl, libemail-mime-createhtml-perl,
+ libemail-localdelivery-perl, 
+ libemail-send-perl (>> 1.99_01), 
  libemail-simple-creator-perl, libexporter-lite-perl,
+ libextutils-command-perl, 
  libfile-find-rule-perl, libfile-mmagic-perl,
  libfile-sharedir-perl (>> 0.04), libhtml-parser-perl,
  libhtml-lint-perl, libhtml-mason-perl (>> 1.31), 
@@ -73,8 +74,9 @@
  libmodule-scandeps-perl, libobject-declare-perl (>> 0.22),
  libparams-validate-perl, libscalar-defer-perl (>> 0.10),
  libstring-koremutake-perl, libsql-reservedwords-perl,
- libtemplate-declare-perl (>> 0.21), 
- libtest-base-perl, libuniversal-require-perl, liburi-perl,
+ libtemplate-declare-perl (>> 0.26), 
+ libtest-base-perl, libtest-log4perl-perl, 
+ libuniversal-require-perl, liburi-perl,
  libxml-writer-perl (>> 0.601), libxml-simple-perl,
  libxml-xpath-perl, libversion-perl, libyaml-syck-perl (>> 0.72), 
  libyaml-perl (>> 0.35), libjson-perl (>> 0.01),
@@ -86,7 +88,8 @@
  libmodule-install-perl, libpar-dist-fromcpan-perl, libtest-mockobject-perl,
  libtest-mockmodule-perl,
  libcgi-fast-perl, libapache-mod-fastcgi,
- libjifty-plugin-editinplace-perl, libjifty-plugin-login-perl
+ libjifty-plugin-editinplace-perl, libjifty-plugin-login-perl,
+ libimage-info-perl, libchart-perl, libgd-gd2-perl, libgd-graph-perl
 Description: Jifty perl libraries
  Yet another web framework.
  .

Modified: jifty/branches/virtual-models/examples/HelloKitty/lib/HelloKitty/View.pm
==============================================================================
--- jifty/branches/virtual-models/examples/HelloKitty/lib/HelloKitty/View.pm	(original)
+++ jifty/branches/virtual-models/examples/HelloKitty/lib/HelloKitty/View.pm	Tue Sep 11 14:03:32 2007
@@ -2,9 +2,8 @@
 use strict;
 
 package HelloKitty::View;
-use base qw/Jifty::View::Declare::Templates/;
+use Jifty::View::Declare -base;
 use Template::Declare::Tags;
-use Jifty::View::Declare::Templates;
 
 template foo => sub {
     html {

Modified: jifty/branches/virtual-models/lib/Jifty.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty.pm	Tue Sep 11 14:03:32 2007
@@ -11,7 +11,7 @@
     require Time::Local;
 
     # Declare early to make sure Jifty::Record::schema_version works
-    $Jifty::VERSION = '0.70129';
+    $Jifty::VERSION = '0.70824';
 }
 
 =head1 NAME
@@ -100,7 +100,7 @@
 use base qw/Jifty::Object/;
 use Jifty::Everything;
 
-use vars qw/$HANDLE $CONFIG $LOGGER $HANDLER $API $CLASS_LOADER $PUB_SUB @PLUGINS/;
+use vars qw/$HANDLE $CONFIG $LOGGER $HANDLER $API $CLASS_LOADER $PUB_SUB $WEB @PLUGINS/;
 
 =head1 METHODS
 
@@ -146,6 +146,7 @@
     # Setup the defaults
     my %args = (
         no_handle        => 0,
+        pre_init         => 0,
         logger_component => undef,
         @_
     );
@@ -173,10 +174,10 @@
     my @plugins;
     my @plugins_to_load = @{Jifty->config->framework('Plugins')};
     my $app_plugin = Jifty->app_class('Plugin');
+    # we are pushing prereq to plugin, hence the 3-part for.
     for (my $i = 0; my $plugin = $plugins_to_load[$i]; $i++) {
-
         # Prepare to learn the plugin class name
-        my $plugin_name = (keys %{$plugin})[0];
+        my ($plugin_name) = keys %{$plugin};
         my $class;
 
         # Is the plugin name a fully-qualified class name?
@@ -191,7 +192,8 @@
         }
 
         # Load the plugin options
-        my %options = %{ $plugin->{ $plugin_name } };
+        my %options = (%{ $plugin->{ $plugin_name } },
+                        _pre_init => $args{'pre_init'} );
 
         # Load the plugin code
         Jifty::Util->require($class);
@@ -341,8 +343,7 @@
 =cut
 
 sub web {
-    $HTML::Mason::Commands::JiftyWeb ||= Jifty::Web->new();
-    return $HTML::Mason::Commands::JiftyWeb;
+    return $Jifty::WEB ||= Jifty::Web->new();
 }
 
 =head2 subs
@@ -438,6 +439,13 @@
 
 Defaults to false. If true, Jifty won't try to set up a database handle
 
+=item pre_init
+
+Defaults to false. If true, plugins are notificed that this is a
+pre-init, any trigger registration in C<init()> should not happen
+during this stage.  Note that model mixins's register_triggers is
+unrelated to this.
+
 =back
 
 

Modified: jifty/branches/virtual-models/lib/Jifty/Collection.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Collection.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Collection.pm	Tue Sep 11 14:03:32 2007
@@ -53,6 +53,19 @@
 
 __PACKAGE__->mk_accessors(qw(pager results_are_readable));
 
+=head2 as_search_action PARAMHASH
+
+Returns the L<Jifty::Action::Record::Search> action for the model associated with this collection.
+
+The PARAMHASH allows you to add additional parameters to pass to L<Jifty::Web/new_action>.
+
+=cut
+
+sub as_search_action {
+    my $self = shift;
+    return $self->record_class->as_search_action(@_);
+}
+
 =head2 add_record
 
 If L</results_are_readable> is false, only add records to the collection that

Modified: jifty/branches/virtual-models/lib/Jifty/Continuation.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Continuation.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Continuation.pm	Tue Sep 11 14:03:32 2007
@@ -9,10 +9,27 @@
 
 =head1 DESCRIPTION
 
-C<Jifty::Continuation> wraps up the information about a context that
-might have been expecting some sort of answer.  It allows one to
-re-visit that context later by providing the continuation again.
-Continuations are stored on the user's session.
+In programming, a continuation is a construct that allows you to freeze the current state of a program and then recover that state later by calling the continuation. For example, you could save a continuation when throwing an exception to save the state, an exception handler could resolve the problem that caused the exception, and then call the continuation to resume execution at the point where the exception was thrown now that the problem has been solved.
+
+In Jifty, continuations are used to save the state of a request (and sometimes the response). Continuations can be used in situations such as these:
+
+=over
+
+=item 1.
+
+A user visits a page that requires login to view. The dispatcher saves a continuation and then sends the user off to the login page. Once the user logs in successfully, the login action can call the continuation to return the user back to the original page.
+
+=item 2. 
+
+A blogging application might have a "Edit" link on each post to allow the editor to jump to the change page. If this link includes a saved continuation, then the "Save" button could trigger that continuation to be called to return the user back to the original page where they clicked "Edit". This way, it could return the user to the view page, or a list page, or an administrative view depending on which page the user started the edit process from.
+
+=item 3.
+
+If you have a wizard for editing some information in your application, but entering some data may require jumping to another page you can save a continuation to allow the user to return after editing. If that page also requires a jump to yet another page, you can save another continuation. Since continuations save a stack of previous continuations, you can return twice to get back to the wizard.
+
+=back
+
+C<Jifty::Continuation> handles the details of saving this information for later recovery. When a continuation is saved, the current request and response are saved to the database in the current user's session. When a continuation is called, the current request and response become those that were saved in the continuation. A continuation can be called at any point in the same session.
 
 Continuations store a L<Jifty::Request> object and the
 L<Jifty::Response> object for the request.  They can also store
@@ -158,15 +175,16 @@
 
     Jifty->log->debug("Redirect to @{[$self->request->path]} via continuation");
     if (Jifty->web->request->argument('_webservice_redirect')) {
-	# for continuation - perform internal redirect under webservices.
+        # for continuation - perform internal redirect under webservices.
         Jifty->web->webservices_redirect($self->request->path);
-	return;
+        return;
     }
+
     # If we needed to fix up the path (it contains invalid
     # characters) then warn, because this may cause infinite
     # redirects
     Jifty->log->warn("Redirect to '@{[$self->request->path]}' contains unsafe characters")
-      if $self->request->path =~ m{[^A-Za-z0-9\-_.!~*'()/?&;+]};
+        if $self->request->path =~ m{[^A-Za-z0-9\-_.!~*'()/?&;+]};
 
     # Clone our request
     my $request = $self->request->clone;
@@ -175,6 +193,7 @@
     $request->do_mapping;
 
     my $response = $self->response;
+
     # If the current response has results, we need to pull them
     # in.  For safety, monikers from the saved continuation
     # override those from the request prior to the call
@@ -191,7 +210,7 @@
                                         code => $self->code,
                                        );
     $next->request->continuation(Jifty->web->session->get_continuation($next->parent))
-      if defined $next->parent;
+        if defined $next->parent;
 
     # Redirect to right page if we're not there already
     Jifty->web->_redirect($next->request->path . "?J:RETURN=" . $next->id);
@@ -241,4 +260,15 @@
 
 }
 
+=head1 SEE ALSO
+
+L<Jifty::Manual::Continuations>
+
+=head1 LICENSE
+
+Jifty is Copyright 2005-2007 Best Practical Solutions, LLC.
+Jifty is distributed under the same terms as Perl itself.
+
+=cut
+
 1;

Modified: jifty/branches/virtual-models/lib/Jifty/CurrentUser.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/CurrentUser.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/CurrentUser.pm	Tue Sep 11 14:03:32 2007
@@ -8,7 +8,6 @@
 
 __PACKAGE__->mk_accessors(qw(is_superuser is_bootstrap_user));
 
-
 =head1 NAME
 
 Jifty::CurrentUser - Base class and basic implementation of current user object
@@ -28,8 +27,6 @@
 It's generally expected that your application will override this class
 if you want any sort of access control.
 
-=cut
-
 =head2 new
 
 Creates a new L<Jifty::CurrentUser> object.  Calls L<_init>, an
@@ -44,24 +41,49 @@
     my $self  = {};
     bless $self, (ref $class || $class);
     my %args = (@_);
+
+    # Make this user a bootstrap user if in bootstrap mode
     if ( delete $args{'_bootstrap'} ) { $self->is_bootstrap_user(1); }
+
+    # Call _init for app-specific initialization
     $self->_init(%args);
+
     return $self;
 }
 
+=head2 _init
 
-sub _init {
+Applications should override this method to provide any application-specific user loading code. The built-in
+
+If you do nothing, code similar to this will be called by _init.
+
+	sub _init {
 	    my $self = shift;
 	    my %args = (@_);
 	
-            if (keys %args and UNIVERSAL::can(Jifty->app_class('Model', 'User'), 'new')  ) {
-                
+        if (keys %args and UNIVERSAL::can(Jifty->app_class('Model', 'User'), 'new')) {
 	        $self->user_object(Jifty->app_class('Model', 'User')->new(current_user => $self));
 	        $self->user_object->load_by_cols(%args);
 	    }
         return 1;
-}
+	}
+
+That is, it will attempt to load the columns given in the model named C<App::Model::User> (where I<App> is the name of your application class). If your notion of a user object isn't a typical Jifty model or named something else, you will definitely need to override this method. If you need to perform any additional initialization for user objects, you may want to override this as well.
 	
+=cut
+
+sub _init {
+    my $self = shift;
+    my %args = (@_);
+
+    # Duck-typing to check to for a user class
+    if (keys %args and UNIVERSAL::can(Jifty->app_class('Model', 'User'), 'new')  ) {
+        $self->user_object(Jifty->app_class('Model', 'User')->new(current_user => $self));
+        $self->user_object->load_by_cols(%args);
+    }
+
+    return 1;
+}
 
 =head2 superuser
 
@@ -73,7 +95,11 @@
 sub superuser {
     my $class = shift;
     $class = ref( $class ) if ref $class;
+
+    # Create the current user object
     my $self = $class->new();
+
+    # Make it superuser and send it out
     $self->is_superuser(1);
     return $self;
 }
@@ -81,35 +107,23 @@
 =head2 user_object 
 
 This gets or sets your application's user object for the current
-user. Generally, you're expected to set and load it in the _init method
+user. Generally, you're expected to set and load it in the L</_init> method
 in your L<Jifty::CurrentUser> subclass.
 
-If you do nothing, code similar to this will be called by _init.
-
-	sub _init {
-	    my $self = shift;
-	    my %args = (@_);
-	
-            if (keys %args) {
-	        $self->user_object(Wifty::Model::User->new(current_user => $self));
-	        $self->user_object->load_by_cols(%args);
-	    }
-	}
-	
-
 =cut
 
 sub user_object {
     my $self = shift;
     return $self->{'user_object'} unless @_;
-
     $self->{'user_object'} = shift;
-    # protect ourself from circular refereces
+
+    # protect ourself from circular refereces to prevent memory leaks
     if ( $self->{'user_object'}{'_current_user'} == $self ) {
         Scalar::Util::weaken( $self->{'user_object'}{'_current_user'} )
             unless Scalar::Util::isweak( $self->{'user_object'}{'_current_user'} );
         $self->{'user_object'}{'_resurrect_current_user'} = 1;
     }
+
     return $self->{'user_object'};
 }
 
@@ -122,9 +136,14 @@
 
 sub id {
     my $self = shift;
+
+    # Make sure we have a user object before trying to ID it
     if ($self->user_object) {
         return ($self->user_object->id());
-    } else {
+    } 
+    
+    # No user object, return a null ID
+    else {
         return '0';
     }
 
@@ -137,7 +156,7 @@
 L<Jifty::CurrentUser> object a subclass thereof.  For the somewhat
 obvious reason that you can't actually lift yourself up by tugging on
 your own bootstraps, a L<Jifty::CurrentUser> object return I<itself>
-rather than another C<Jifty::CurrentUser object>
+rather than another C<Jifty::CurrentUser> object.
 
 =cut
 
@@ -225,7 +244,6 @@
 
 =cut
 
-
 =head2 current_user_can ACTION
 
 For a current user object, the current user can always C<read>, but
@@ -233,7 +251,7 @@
 
 =cut
 
-
+# XXX Is this actually used?
 sub current_user_can {
     my $self = shift;
     my $action = shift;
@@ -241,4 +259,15 @@
     return (0);
 }
 
+=head1 SEE ALSO
+
+L<Jifty::Object>, L<Jifty::Plugin::User>
+
+=head1 LICENSE
+
+Jifty is Copyright 2005-2007 Best Practical Solutions, LLC.
+Jifty is distributed under the same terms as Perl itself.
+
+=cut
+
 1;

Modified: jifty/branches/virtual-models/lib/Jifty/DateTime.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/DateTime.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/DateTime.pm	Tue Sep 11 14:03:32 2007
@@ -30,9 +30,10 @@
 
 =head2 new ARGS
 
-See L<DateTime/new>.  After calling that method, set this object's
+See L<DateTime/new>. If we get what appears to be a date, then we
+keep this in the floating datetime. Otherwise, set this object's
 timezone to the current user's time zone, if the current user has a
-method called C<time_zone>.
+method called C<time_zone>.  
 
 =cut
 
@@ -41,13 +42,19 @@
     my %args  = (@_);
     my $self  = $class->SUPER::new(%args);
 
-    # Unless the user has explicitly said they want a floating time,
-    # we want to convert to the end-user's timezone.  This is
-    # complicated by the fact that DateTime auto-appends
-    if (!$args{time_zone} and my $tz = $self->current_user_has_timezone) {
-        $self->set_time_zone("UTC");
-        $self->set_time_zone( $tz );
+    if ($self->hour || $self->minute || $self->second) {
+        # Unless the user has explicitly said they want a floating time,
+        # we want to convert to the end-user's timezone.  This is
+        # complicated by the fact that DateTime auto-appends
+        if (!$args{time_zone} and my $tz = $self->current_user_has_timezone) {
+            $self->set_time_zone("UTC");
+            $self->set_time_zone( $tz );
+        }
     }
+    else {
+        $self->set_time_zone("floating");
+    }
+
     return $self;
 }
 
@@ -105,4 +112,36 @@
     return $self;
 }
 
+=head2 friendly_date
+
+Returns the date given by this C<Jifty::DateTime> object. It will display "today"
+for today, "tomorrow" for tomorrow, or "yesterday" for yesterday. Any other date
+will be displayed in ymd format.
+
+=cut
+
+sub friendly_date {
+    my $self = shift;
+    my $ymd = $self->ymd;
+
+    my $tz = $self->current_user_has_timezone || $self->time_zone;
+    my $rel = DateTime->now( time_zone => $tz );
+
+    if ($ymd eq $rel->ymd) {
+        return "today";
+    }
+    
+    my $yesterday = $rel->clone->subtract(days => 1);
+    if ($ymd eq $yesterday->ymd) {
+        return "yesterday";
+    }
+    
+    my $tomorrow = $rel->clone->add(days => 1);
+    if ($ymd eq $tomorrow->ymd) {
+        return "tomorrow";
+    }
+    
+    return $ymd;
+}
+
 1;

Modified: jifty/branches/virtual-models/lib/Jifty/Handler.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Handler.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Handler.pm	Tue Sep 11 14:03:32 2007
@@ -191,6 +191,10 @@
         @_
     );
 
+    # Build a new stash for the life of this request
+    $self->stash( {} );
+    local $Jifty::WEB = Jifty::Web->new();
+
     if ( Jifty->config->framework('DevelMode') ) {
         Module::Refresh->refresh;
         Jifty::I18N->refresh;
@@ -201,10 +205,6 @@
     $self->cgi( $args{cgi} );
     $self->apache( HTML::Mason::FakeApache->new( cgi => $self->cgi ) );
 
-    # Build a new stash for the life of this request
-    $self->stash( {} );
-    local $HTML::Mason::Commands::JiftyWeb = Jifty::Web->new();
-
     Jifty->web->request( Jifty::Request->new()->fill( $self->cgi ) );
     Jifty->web->response( Jifty::Response->new );
     Jifty->api->reset;

Modified: jifty/branches/virtual-models/lib/Jifty/Manual/Glossary.pod
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Manual/Glossary.pod	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Manual/Glossary.pod	Tue Sep 11 14:03:32 2007
@@ -141,6 +141,10 @@
 success or failure, and further detail about why or how.  It can also contain
 arbitrary "content".  See L<Jifty::Result>.
 
+=item return
+
+After performing a L</tangent> a user may perform a L</return> to invoke the L</continuation> created by the original tangent.
+
 =item schema
 
 The B<schema> for a L</model> represents the structure of the data stored in an individual item in that model's L</collection>. See L<Jifty::DBI::Schema>.
@@ -176,6 +180,10 @@
 user type them again.  Most L</action>s have form fields which are sticky on
 failure, so the user can update the information and try again.
 
+=item tangent
+
+A tangent is a link or redirect that causes Jifty to save the current state into a L</continuation> for a later L</return>. This operation is handy for situations when you want to jump to another page or form, but return to this page when the user is done with the "tangent" page. Because of the use of continuations, this can be especially handy because a user could go on multiple tangents and eventually return to the start.
+
 =item upgrade
 
 Generally, your Jifty application will change over time. Most of these changes will be simple changes to behavior or appearance. When changes are made to the L</schema> structure of your database, you may need to perform an B<upgrade>. An B<upgrade> is the process by which you rename columns, initialize data, or otherwise update information that needs to be updated when a change to the database needs to be made. See L<Jifty::Upgrade>, L<Jifty::Manual::Upgrading>, and L<Jifty::Script::Schema>.

Modified: jifty/branches/virtual-models/lib/Jifty/Notification.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Notification.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Notification.pm	Tue Sep 11 14:03:32 2007
@@ -19,7 +19,7 @@
 =head1 USAGE
 
 It is recommended that you subclass L<Jifty::Notification> and
-override C<body>, C<html-body>, C<subject>, C<recipients>, and C<from>
+override C<body>, C<html_body>, C<subject>, C<recipients>, and C<from>
 for each message.  (You may want a base class to provide C<from>,
 C<preface> and C<footer> for example.)  This lets you keep all of your
 notifications in the same place.

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin.pm	Tue Sep 11 14:03:32 2007
@@ -3,7 +3,8 @@
 
 package Jifty::Plugin;
 use File::ShareDir 'module_dir';
-
+use base 'Class::Accessor::Fast';
+__PACKAGE__->mk_accessors('_pre_init');
 
 =head1 NAME
 
@@ -51,14 +52,13 @@
 
 sub new {
     my $class = shift;
-    
+    my $self = $class->SUPER::new( { @_ });
+
     # Get a classloader set up
     Jifty::ClassLoader->new(base => $class)->require;
     Jifty::Util->require($class->dispatcher);
 
     # XXX TODO: Add .po path
-
-    my $self = bless {} => $class;
     $self->init(@_);
     return $self;
 }
@@ -92,6 +92,7 @@
 sub _calculate_share {
     my $self = shift;
     my $class = ref($self);
+
     unless ( $self->{share} ) {
         local $@
             ; # We're just avoiding File::ShareDir's failure behaviour of dying

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/ActorMetadata/Mixin/Model/ActorMetadata.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/ActorMetadata/Mixin/Model/ActorMetadata.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/ActorMetadata/Mixin/Model/ActorMetadata.pm	Tue Sep 11 14:03:32 2007
@@ -5,7 +5,7 @@
 use Jifty::DBI::Schema;
 use base 'Jifty::DBI::Record::Plugin';
 
-our @EXPORT = qw(current_user_can);
+our @EXPORT = qw(current_user_can current_user_is_owner);
 
 =head1 NAME
 
@@ -119,10 +119,25 @@
     }
 
     if ($action eq 'update' or $action eq 'delete') {
-        return undef unless ($self->current_user and $self->current_user->id eq $self->created_by->id);
+        return undef unless $self->current_user_is_owner;
     }
 
     return 1;
 }
 
+=head2 current_user_is_owner
+
+=cut
+
+sub current_user_is_owner {
+    my $self = shift;
+
+    my $created_by = $self->__value('created_by');
+    return unless $self->current_user && $created_by;
+
+    return unless $self->current_user->id;
+
+    return $self->current_user->id == $created_by;
+}
+
 1;

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/CompressedCSSandJS.pm	Tue Sep 11 14:03:32 2007
@@ -2,7 +2,7 @@
 use warnings;
 
 package Jifty::Plugin::CompressedCSSandJS;
-use base qw/Jifty::Plugin Class::Accessor::Fast/;
+use base 'Jifty::Plugin';
 
 use Digest::MD5 qw(md5_hex);
 use IPC::Run3 'run3';
@@ -49,6 +49,8 @@
 
 sub init {
     my $self = shift;
+    return if $self->_pre_init;
+
     my %opt  = @_;
     $self->css( $opt{css} );
     $self->js( $opt{js} );

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/Feedback/Action/SendFeedback.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/Feedback/Action/SendFeedback.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/Feedback/Action/SendFeedback.pm	Tue Sep 11 14:03:32 2007
@@ -40,7 +40,7 @@
 
 =head2 take_action
 
-Send some mail to the hiveminders describing the issue.
+Send a mail to the feedback recipient describing the issue.
 
 =cut
 

Added: jifty/branches/virtual-models/lib/Jifty/Plugin/JQuery.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/JQuery.pm	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,61 @@
+use strict;
+use warnings;
+
+package Jifty::Plugin::JQuery;
+use base qw/ Jifty::Plugin /;
+
+=head1 NAME
+
+Jifty::Plugin::JQuery - use the jQuery JavaScript library with Jifty
+
+=head1 SYNOPSIS
+
+In your F<etc/config.yml>:
+
+  framework:
+    Plugins:
+      - JQuery: {}
+
+In your JavaScript files, you can then use any jQuery call:
+
+  jQuery("p.surprise").addClass("ohmy").show("slow");
+
+=head1 DESCRIPTION
+
+The jQuery JavaScript library is a small JavaScript library with the intent of providing most of the shortcuts you need it a simple syntax. Since Jifty already uses Prototype, which implements a C<$()> function, this plugin loads jQuery and calls "C<noConflict()>" to prevent it from clobbering Prototype's C<$()> function. Thus, to use jQuery, you have to use the C<jQuery()> method rather than C<$()>.
+
+You may want to use this idiom from the jQuery documentation if you still want to use this idiom (see L<http://docs.jquery.com/Using_jQuery_with_Other_Libraries>): 
+
+  function($){
+     // Use jQuery stuff using $
+     $("div").hide();
+  }(jQuery);
+
+=head1 METHODS
+
+=head2 init
+
+This initializes the plugin, which simply includes the JavaScript necessary to load jQuery and then disable the jQuery implementation of C<$()>.
+  
+=cut
+
+sub init {
+    Jifty->web->add_javascript(qw/
+        jquery.js
+        noConflict.js
+    /);
+}
+
+=head1 SEE ALSO
+
+L<http://jifty.org>, L<http://visualjquery.com>, L<http://simonwillison.net/2007/Aug/15/jquery/>
+
+=head1 COPYRIGHT AND LICENSE
+
+This plugin is Copyright 2007 Boomer Consulting, Inc. It is available for modication and distribution under the same terms as Perl itself.
+
+jQuery is available for use in all personal or commercial projects under both MIT and GPL licenses. This means taht you can choose the license that best suits your project and use it accordingly. See L<http://jifty.com/> for current information on jQuery copyrights and licensing.
+
+=cut
+
+1;

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/SinglePage.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/SinglePage.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/SinglePage.pm	Tue Sep 11 14:03:32 2007
@@ -2,7 +2,7 @@
 use warnings;
 
 package Jifty::Plugin::SinglePage;
-use base qw/Jifty::Plugin Class::Accessor/;
+use base 'Jifty::Plugin';
 
 __PACKAGE__->mk_accessors(qw(region_name));
 
@@ -22,6 +22,8 @@
 
 sub init {
     my $self = shift;
+    return if $self->_pre_init;
+
     Jifty::Web::Form::Clickable->add_trigger( before_new => _sp_link($self));
     my %opt = @_;
     $self->region_name($opt{region_name} || '__page');
@@ -40,14 +42,20 @@
     return sub {
         my ( $clickable, $args ) = @_;
         my $url = $args->{'url'};
-        if ( $url && $url !~ m/^#/ && $url !~ m{^https?://} ) {
+        if ( $url && $url !~ m/^#/ && $url !~ m{^https?://} && $url !~ m{^javascript:} ) {
             $self->_push_onclick($args, {
                 region       => $self->region_name,
                 replace_with => $url,
                 args         => $args->{parameters}});
         }
-        elsif (exists $args->{submit}) {
-            $self->_push_onclick($args, { refresh_self => 1, submit => $args->{submit} });
+        elsif (exists $args->{submit} && !$args->{onclick}) {
+	    if ($args->{_form} && $args->{_form}{submit_to}) {
+		my $to = $args->{_form}{submit_to};
+		$self->_push_onclick($args, { beforeclick => qq{return _sp_submit_form(this, event, "$to");} });
+	    }
+	    else {
+		$self->_push_onclick($args, { refresh_self => 1, submit => $args->{submit} });
+	    }
             $args->{as_button} = 1;
         }
         if (my $form = delete $args->{_form}) {

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/SkeletonApp/Dispatcher.pm	Tue Sep 11 14:03:32 2007
@@ -20,7 +20,12 @@
 
 on '**' => run {
     my $top = Jifty->web->navigation;
-    $top->child( Home => url => "/", sort_order => 1, label => _('Home') );
+
+    # Do not override the 'Home' menu item if the app had set it already
+    unless ( $top->child('Home') ) {
+        $top->child( Home => url => "/", sort_order => 1, label => _('Home') );
+    }
+
     if ( Jifty->config->framework('AdminMode') ) {
         $top->child(
             Administration =>

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/TabView/View.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/TabView/View.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/TabView/View.pm	Tue Sep 11 14:03:32 2007
@@ -19,6 +19,12 @@
   template 'index.html' => page {
      my $self = shift;
      $self->render_tabs('foo', [qw(id)], qw( foo bar_tab ) );
+
+     # more flexible tabs
+     $self->render_tabs('foo', [qw(id)],
+                        { label => 'This is foo 1', path => 'foo', name => 'foo 1', args => { id => 1}},
+                        { label => 'This is foo 2', path => 'foo', name => 'foo 2', defer => 1,  args => { id => 2}});
+
   };
   template 'foo' => sub { ... };
   template 'bar' => sub { ... };
@@ -31,6 +37,15 @@
 
 =cut
 
+sub _tab_path {
+    my ($self, $name) = @_;
+   
+    # If the path is already relative or absolute, don't force-relativeize it
+    my $qualified_path = ($name =~ qr|\.?/|) ? $name : "./$name";
+
+    $self->can('fragment_for') ? $self->fragment_for($name) : $qualified_path;
+}
+
 sub render_tabs {
     my ($self, $divname, $args, @tabs) = @_;
 
@@ -38,35 +53,45 @@
 	var myTabs = new YAHOO.widget.TabView("$divname");
 	</script>'  );
 
+    @tabs = map { ref($_) ? $_
+		      : do {
+			  my $path = $_;
+			  my $defer = $path =~ s/_tab$//;
+			  { path => $path,
+			    defer => $defer };
+			  }
+		  } @tabs;
+
+    $_->{name} ||= $_->{path}, $_->{label} ||= $_->{path} for @tabs;
 
     div { { id is $divname, class is 'yui-navset'}
 	  ul { { class is 'yui-nav'};
 	       my $i = 0;
-	       for (@tabs) {
-		   my $tab = $_;
+	       for my $tab (@tabs) {
 		   li { { class is 'selected' unless $i };
-			hyperlink(url => '#tab'.++$i, label => $tab,
-				  $tab =~ s/_tab$// ? 
+			hyperlink(url => '#tab'.++$i, label => $tab->{label},
+				  $tab->{defer} ?
 				  (onclick =>
-				  { region       => Jifty->web->current_region ? Jifty->web->current_region->qualified_name."-$tab-tab" : "$tab-tab",
-				    replace_with => $self->can('fragment_for') ? $self->fragment_for($tab) : $tab, # XXX: should have higher level function handling mount point
-				    args => { map { $_ => get($_)} @$args },
+				  { region       => Jifty->web->current_region ? Jifty->web->current_region->qualified_name."-$tab->{name}-tab" : "$tab->{path}-tab",
+				    replace_with => _tab_path($self, $tab->{path}), # XXX: should have higher level function handling mount point
+				    args => { (map { $_ => get($_)} @$args ), %{$tab->{args} || {}} },
 				  }) : ()
 				 ) }
 	       }
 	   };
 	  div { {class is 'yui-content' };
-      my $default_shown;
-		for (@tabs) {
-		    div { 
-			if (s/_tab$//) {
-			    render_region(name => $_.'-tab', 
-                          ($default_shown++)? () : ( path => $_, args =>  { map { $_ => get($_)} @$args })
+		my $default_shown;
+		for my $tab (@tabs) {
+		    div {
+			if ($tab->{defer}) {
+			    render_region(name => $tab->{name}.'-tab',
+                          ($default_shown++)? () : ( path => _tab_path($self, $tab->{path}),
+						     force_arguments => { ( map { $_ => get($_)} @$args ), %{$tab->{args} || {}} } )
                           )
 			}
 			else {
-			    die "$self $_" unless $self->has_template($_);
-			    $self->has_template($_)->(); 
+			    show( _tab_path($self, $tab->{path}) );
+			    $default_shown++;
 			}
 		    }
 		}

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/UUID.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/UUID.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/UUID.pm	Tue Sep 11 14:03:32 2007
@@ -27,7 +27,7 @@
 use Scalar::Defer;
 my $UUID_GEN = Data::UUID->new();
 
-my $UUID = lazy { $UUID_GEN->create_str() } ;
+my $UUID = defer { $UUID_GEN->create_str() } ;
 sub _uuid {
     my ($column, $from) = @_;
     $column->readable(1);

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/UUID/Widget.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/UUID/Widget.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/UUID/Widget.pm	Tue Sep 11 14:03:32 2007
@@ -12,14 +12,15 @@
 
 =head1 METHODS
 
+=head2 accessors
 
-=cut
+Overrides L<Jifty::Web::Form::Field/accessors>.
 
-sub accessors { shift->SUPER::accessors() };
+=cut
 
 =head2 render_widget
 
-Renders form fields as a uuid;
+Renders form fields as a UUID.
 
 =cut
 
@@ -29,7 +30,7 @@
     my $action   = $self->action;
     my $readonly = 1;
     
-        my $name = $self->name;
+    my $name = $self->name;
     if ( $action->record->$name() ) {
         Jifty->web->out(  $action->record->$name() );
     } else { 
@@ -39,5 +40,19 @@
     '';
 }
 
+=head1 SEE ALSO
+
+L<Jifty::Plugin::UUID>, L<Jifty::Web::Form::Field>
+
+=head1 AUTHOR
+
+Jesse Vincent
+
+=head1 LICENSE
+
+Jifty is Copyright 2005-2007 Best Practical Solutions, LLC.
+Jifty is distributed under the same terms as Perl itself.
+
+=cut
 
 1;

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/Dispatcher.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/Dispatcher.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/Dispatcher.pm	Tue Sep 11 14:03:32 2007
@@ -1,7 +1,31 @@
+use warnings;
+use strict;
+
 package Jifty::Plugin::Userpic::Dispatcher;
 
+
+=head1 NAME
+
+Jifty::Plugin::Userpic::Dispatcher
+
+=head1 DESCRIPTION
+
+The dispatcher for the Jifty Userpic plugin
+
+=cut
+
 use Jifty::Dispatcher -base;
 
+
+=head1 RULES
+
+=head2 on /=/plugin/userpic/*/#/*
+
+When we're asked for a userpic for /recordclass/id/fieldname,  set it up and call /userpic/image.
+
+=cut
+
+
 on '/=/plugin/userpic/*/#/*' => run {
     my $class = $1;
     my $id = $2;

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/View.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/View.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/View.pm	Tue Sep 11 14:03:32 2007
@@ -2,6 +2,25 @@
 
 use Jifty::View::Declare -base;
 
+
+=head1 NAME
+
+Jifty::Plugin::Userpic::View
+
+=head1 DESCRIPTION
+
+A view package for the Userpic plugin.
+
+
+=head1 TEMPLATES
+
+
+=head2 userpic/image
+
+Outputs the image stored in 'field' of 'item'. (Both of those are set by the dispatcher)
+
+=cut
+
 template 'userpic/image' => sub {
     my ($item,$field) = get(qw(item field));
     Jifty->handler->apache->content_type("image/jpeg");

Modified: jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/Widget.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/Widget.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Plugin/Userpic/Widget.pm	Tue Sep 11 14:03:32 2007
@@ -14,8 +14,6 @@
 
 =cut
 
-sub accessors { shift->SUPER::accessors() };
-
 =head2 render_widget
 
 Renders form fields as googlemap widget.

Modified: jifty/branches/virtual-models/lib/Jifty/Record.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Record.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Record.pm	Tue Sep 11 14:03:32 2007
@@ -189,6 +189,82 @@
     return ($id,$msg);
 }
 
+
+=head2 as_create_action PARAMHASH
+
+Returns the L<Jifty::Action::Record::Create> action for this model class.
+
+The PARAMHASH allows you to add additional parameters to pass to L<Jifty::Web/new_action>.
+
+=cut
+
+sub _action_from_record {
+    my $self = shift;
+    my $verb = shift;
+    my $class = ref $self || $self;
+    $class =~ s/::Model::/::Action::$verb/;
+    return $class;
+}
+
+sub as_create_action {
+    my $self = shift;
+    my $action_class = $self->_action_from_record('Create');
+    return Jifty->web->new_action( class => $action_class, @_ );
+}
+
+=head2 as_update_action PARAMHASH
+
+Returns the L<Jifty::Action::Record::Update> action for this model class. The current record is passed to the constructor.
+
+The PARAMHASH allows you to add additional parameters to pass to L<Jifty::Web/new_action>.
+
+=cut
+
+sub as_update_action {
+    my $self = shift;
+    my $action_class = $self->_action_from_record('Update');
+    return Jifty->web->new_action( 
+        class  => $action_class,
+        record => $self,
+        @_,
+    );
+}
+
+=head2 as_delete_action PARAMHASH
+
+Returns the L<Jifty::Action::Record::Delete> action for this model class. The current record is passed to the constructor.
+
+The PARAMHASH allows you to add additional parameters to pass to L<Jifty::Web/new_action>.
+
+=cut
+
+sub as_delete_action {
+    my $self = shift;
+    my $action_class = $self->_action_from_record('Delete');
+    return Jifty->web->new_action(
+        class  => $action_class,
+        record => $self,
+        @_,
+    );
+}
+
+=head2 as_search_action PARAMHASH
+
+Returns the L<Jifty::Action::Record::Search> action for this model class.
+
+The PARAMHASH allows you to add additional parameters to pass to L<Jifty::Web/new_action>.
+
+=cut
+
+sub as_search_action {
+    my $self = shift;
+    my $action_class = $self->_action_from_record('Search');
+    return Jifty->web->new_action(
+        class  => $action_class,
+        @_,
+    );
+}
+
 =head2 _guess_table_name
 
 Guesses a table name based on the class's last part. In addition to the work performed in L<Jifty::DBI::Record>, this method also prefixes the table name with the plugin table prefix, if the model belongs to a plugin.

Modified: jifty/branches/virtual-models/lib/Jifty/Schema.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Schema.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Schema.pm	Tue Sep 11 14:03:32 2007
@@ -299,7 +299,15 @@
     my %connect_args;
     $connect_args{'database'} = 'template1' if ( $handle->isa("Jifty::DBI::Handle::Pg") );
     $connect_args{'database'} = ''          if ( $handle->isa("Jifty::DBI::Handle::mysql") );
+       for(1..50) {
+		my $counter = $_;
+    eval { 
     $handle->connect(%connect_args);
+    };
+    my $err = $@;
+	    last if( !$err || $err =~ /does not exist/i);
+	sleep 1;
+        }
     return $handle;
 }
 

Modified: jifty/branches/virtual-models/lib/Jifty/Script/FastCGI.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Script/FastCGI.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Script/FastCGI.pm	Tue Sep 11 14:03:32 2007
@@ -90,11 +90,13 @@
     my $conf = Jifty->config->framework('Web')->{'FastCGI'} || {};
     $self->{maxrequests} ||= $conf->{MaxRequests};
 
+    my $PATH = $ENV{'PATH'} || '/bin:/usr/bin';
+
     my $requests = 0;
     while ( my $cgi = CGI::Fast->new ) {
         # the whole point of fastcgi requires the env to get reset here..
         # So we must squash it again
-        $ENV{'PATH'}   = '/bin:/usr/bin';
+        $ENV{'PATH'}   = $PATH;
         $ENV{'SHELL'}  = '/bin/sh' if defined $ENV{'SHELL'};
         $ENV{'PATH_INFO'}   = $ENV{'SCRIPT_NAME'}
             if $ENV{'SERVER_SOFTWARE'} =~ /^lighttpd\b/;

Modified: jifty/branches/virtual-models/lib/Jifty/Test.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Test.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Test.pm	Tue Sep 11 14:03:32 2007
@@ -236,7 +236,7 @@
 	}
     }
 
-    Jifty->new( no_handle => 1 );
+    Jifty->new( no_handle => 1, pre_init => 1 );
 
     my $schema = Jifty::Script::Schema->new;
     $schema->{drop_database}     = 1;
@@ -277,10 +277,11 @@
     return {
         framework => {
             Database => {
-                Database => $config->framework('Database')->{Database} . "test",
+                Database => $config->framework('Database')->{Database} . $class->_testfile_to_dbname(),
             },
             Web => {
                 Port => int(rand(5000) + 10000),
+                DataDir => File::Temp::tempdir('masonXXXXXXXXXX')
             },
             Mailer => 'Jifty::Test',
             MailerArgs => [],
@@ -289,6 +290,15 @@
     };
 }
 
+
+sub _testfile_to_dbname {
+    my $dbname = lc($0);
+    $dbname =~ s/\.t$//;
+    $dbname =~ s/[-_\.\/\\]//g;
+    $dbname = substr($dbname,-32,32);	
+    return $dbname;
+}
+
 =head2 make_server
 
 Creates a new L<Jifty::Server> which C<ISA> L<Jifty::TestServer> and

Added: jifty/branches/virtual-models/lib/Jifty/Test/WWW/Selenium.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/lib/Jifty/Test/WWW/Selenium.pm	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,129 @@
+package Jifty::Test::WWW::Selenium;
+use strict;
+use warnings;
+
+use base 'Test::WWW::Selenium';
+
+=head1 NAME
+
+Jifty::Test::WWW::Selenium - Subclass of L<Test::WWW::Selenium> with
+extra Jifty integration
+
+=head1 SYNOPSIS
+
+  use Jifty::Test::WWW::Selenium;
+  my $server  = Jifty::Test->make_server;
+  my $sel = Jifty::Test::WWW::Selenium->rc_ok( $server, lang => 'en_US.UTF-8' );
+  my $URL = $server->started_ok;
+
+  $sel->open_ok('/');
+
+=head1 DESCRIPTION
+
+L<Jifty::Test::WWW::Selenium> creates a L<Test::WWW::Selenium> object
+associated with your jifty application to test.  In addition, it
+starts selenium remote control for you, unless SELENIUM_RC_SERVER is
+specified when the test is run.
+
+=head2 rc_ok
+
+When the selenium rc server is started by
+L<Jifty::Test::WWW::Selenium>, the browser's language is default to
+en_US, unless you pass C<lang> param to rc_ok.
+
+=cut
+
+sub rc_ok {
+    my $class = shift;
+    my $server = shift;
+    my %args = @_;
+
+    if ( $args{selenium_rc} ||= $ENV{SELENIUM_RC_SERVER} ) {
+	@args{'host','port'} = split /:/, $args{selenium_rc}, 2;
+    }
+    else {
+	@args{'host','port'} = eval { $class->_start_src(%args) };
+	if ($@) { # Schwern: i want skip_rest
+	    my $why = "No selenium: $@";
+	    my $Tester = Test::Builder->new;
+	    $Tester->skip($why);
+
+	    unless ($Tester->{No_Plan}) {
+		for (my $ct = $Tester->{Curr_Test};
+		     $ct < $Tester->{Expected_Tests};
+		     $ct++) {
+		    $Tester->skip($why); # skip rest of the test
+		}
+	    }
+	    exit(0);
+	}
+    }
+
+    $args{browser_url} ||= 'http://localhost:'.$server->port;
+
+    $args{browser} ||= $class->_get_default_browser;
+
+    $SIG{CHLD} = \&_REAPER;
+
+    my $try = 5;
+    my $sel;
+    while ($try--) {
+	$sel = eval { Test::WWW::Selenium->new( %args, auto_stop => 0 ) };
+	last if $sel;
+	Test::More::diag "waiting for selenium rc...";
+	sleep 3;
+    }
+    Test::More::isa_ok($sel, 'Test::WWW::Selenium');
+    return $sel;
+}
+
+sub _REAPER {
+    my $waitedpid = wait;
+    # loathe sysV: it makes us not only reinstate
+    # the handler, but place it after the wait
+    $SIG{CHLD} = \&_REAPER;
+}
+
+sub _get_default_browser {
+    my $class = shift;
+
+    return '*firefox';
+}
+
+my @cleanup;
+
+sub _start_src {
+    my ($self, %args) = @_;
+    eval 'require Alien::SeleniumRC; 1'
+	or die 'requires Alien::SeleniumRC to start selenium-rc.';
+
+    my $pid = fork();
+    die if $pid == -1;
+    if ($pid) {
+	push @cleanup, $pid;
+	return ('localhost', 4444);
+    }
+    else {
+	require POSIX;
+	POSIX::setsid();
+	unless ($ENV{TEST_VERBOSE}) {
+	    close *STDERR;
+	    close *STDOUT;
+	}
+	$ENV{LANG} = $args{lang} || 'en_US.UTF-8';
+	$ENV{PATH} = "$ENV{PATH}:/usr/lib/firefox";
+	Test::More::diag "start selenium rc [$$]";
+	local $SIG{CHLD} = \&_REAPER;
+	local $SIG{TERM} = sub { exit 0 };
+	Alien::SeleniumRC::start();
+	Test::More::diag "selenium rc [$$] finished.";
+	exit;
+    }
+}
+
+END {
+    kill(15, -$_) for @cleanup;
+}
+
+
+1;

Modified: jifty/branches/virtual-models/lib/Jifty/View/Declare.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/View/Declare.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/View/Declare.pm	Tue Sep 11 14:03:32 2007
@@ -3,7 +3,7 @@
 
 use strict;
 use warnings;
-use constant BaseClass => 'Jifty::View::Declare::BaseClass';
+use constant BaseClassName => 'Jifty::View::Declare::BaseClass';
 
 =head1 NAME
 
@@ -39,11 +39,11 @@
     ($import and $import eq '-base') or return;
     no strict 'refs';
     my $pkg = caller;
-    Jifty::Util->require(BaseClass);
-    push @{ $pkg . '::ISA' }, BaseClass;
+    Jifty::Util->require(BaseClassName);
+    push @{ $pkg . '::ISA' }, BaseClassName;
 
-    @_ = BaseClass;
-    goto &{BaseClass()->can('import')};
+    @_ = BaseClassName;
+    goto &{BaseClassName()->can('import')};
 }
 
 =head1 SEE ALSO 

Modified: jifty/branches/virtual-models/lib/Jifty/View/Declare/BaseClass.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/View/Declare/BaseClass.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/View/Declare/BaseClass.pm	Tue Sep 11 14:03:32 2007
@@ -33,7 +33,7 @@
     no warnings 'redefine';
     *{ $class . '::wrapper' } = sub {
         my $code = shift;
-        my $args = shift;
+        my $args = shift || {};
         # so in td handler, we made jifty::web->out appends to td
         # buffer, we need it back for here before we call $code.
         # someday we need to finish fixing the output system that is
@@ -63,13 +63,23 @@
 
 use Attribute::Handlers;
 my (%Static, %Action);
-sub Static :ATTR(CODE,BEGIN) {
-    $Static{$_[2]}++;
-}
 
-sub Action :ATTR(CODE,BEGIN) {
-    $Action{$_[2]}++;
-}
+=head2 Static
+
+This function allows a developer to mark a Template::Declare template as static (unchanging), so that the compiled version can be cached on the client side and inserted with javascript
+
+=cut
+
+sub Static :ATTR(CODE,BEGIN) { $Static{$_[2]}++; }
+
+=head2 Action
+
+This function allows a developer to mark a Template::Declare template as an action. clkao owes documentation as to the meaning of this and when it would be acceptable to use it.
+
+=cut
+
+
+sub Action :ATTR(CODE,BEGIN) { $Action{$_[2]}++; }
 
 =head2 client_cacheable
 
@@ -92,6 +102,20 @@
 
 Render a C<Template::Declare> template.
 
+=head1 ATTRIBUTES
+
+=head2 Static
+
+TODO Document this...
+
+This is part of the client-caching system being developed for Perl to allow you to translate templates into JavaScript running on the client.
+
+=head2 Action
+
+TODO Document this...
+
+This is part of the client-caching system being developed for Perl to allow you to translate templates into JavaScript running on the client.
+
 =head1 SEE ALSO
 
 L<Template::Declare>, L<Jifty::View::Declare::Helpers>, L<Jifty::View::Declare>

Modified: jifty/branches/virtual-models/lib/Jifty/View/Declare/CRUD.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/View/Declare/CRUD.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/View/Declare/CRUD.pm	Tue Sep 11 14:03:32 2007
@@ -78,6 +78,8 @@
     Jifty::Util->require($vclass);
     eval qq{package $caller;
             alias $vclass under '$path'; 1} or die $@;
+
+    # Override object_type
     no strict 'refs';
     *{$vclass."::object_type"} = sub { $model };
 }
@@ -110,6 +112,40 @@
     return $self->package_variable('object_type') || get('object_type');
 }
 
+=head2 record_class
+
+This is the full name of the model class these CRUD views are for. The default implementation returns:
+
+  Jifty->app_class('Model', $self->object_type);
+
+You will want to override this if (in addition to L</object_type>) if you want to provide CRUD views in a plugin, or from an external model class, or for one of the Jifty built-in models.
+
+=cut
+
+# NB: We don't just create the record class here and return it. Why? Because
+# the mount_view() method is generally called very early in the Jifty
+# lifecycle. As such, Jifty->app_class() might not work yet since it requires
+# the Jifty singleton to be built and the configuration to be loaded. So, this
+# implementation caches teh record class after the first calculation, which
+# should happen during the request dispatch process, which always happens after
+# Jifty is completely initialized.
+sub record_class {
+    my $self = shift;
+
+    # If object_type is set via set, don't cache
+    if (!$self->package_variable('object_type') && get('object_type')) {
+        return Jifty->app_class('Model', $self->object_type);
+    }
+
+    # Otherwise, assume object_type is permanent
+    else {
+        return ($self->package_variable('record_class') 
+            or ($self->package_variable( record_class =>
+                    Jifty->app_class('Model', $self->object_type))));
+    }
+
+}
+
 =head2 fragment_for
 
 This is a helper that returns the path to a given fragment. The only argument is the name of the fragment. It returns a absolute base path to the fragment page.
@@ -170,7 +206,7 @@
     my ( $self, $id ) = @_;
 
     # Load the model, create an empty object, load the object by ID
-    my $record_class = Jifty->app_class( "Model", $self->object_type );
+    my $record_class = $self->record_class;
     my $record = $record_class->new();
     $record->load($id);
 
@@ -219,9 +255,8 @@
 template 'search' => sub {
     my $self          = shift;
     my ($object_type) = ( $self->object_type );
-    my $search        = Jifty->web->new_action(
-        class             => "Search" . $object_type,
-        moniker           => "search",
+    my $search        = $self->record_class->as_search_action(
+        moniker           => 'search',
         sticky_on_success => 1,
     );
 
@@ -251,10 +286,8 @@
     my $self   = shift;
     my $record = $self->_get_record( get('id') );
 
-    my $update = new_action(
-        class   => 'Update' . $self->object_type,
+    my $update = $record->as_update_action(
         moniker => "update-" . Jifty->web->serial,
-        record  => $record,
     );
 
     div {
@@ -303,13 +336,11 @@
     my $self = shift;
     my ( $object_type, $id ) = ( $self->object_type, get('id') );
 
-    my $record_class = Jifty->app_class( "Model", $object_type );
+    my $record_class = $self->record_class;
     my $record = $record_class->new();
     $record->load($id);
-    my $update = new_action(
-        class   => "Update" . $object_type,
+    my $update = $record->as_update_action(
         moniker => "update-" . Jifty->web->serial,
-        record  => $record
     );
 
     div {
@@ -336,16 +367,15 @@
     my $object_type = $self->object_type;
     my $id = $record->id;
 
-    my $delete = Jifty->web->form->add_action(
-        class   => 'Delete' . $object_type,
+    my $delete = $record->as_delete_action(
         moniker => 'delete-' . Jifty->web->serial,
-        record  => $record
     );
+    Jifty->web->form->register_action($delete);
 
         div {
             { class is 'crud editlink' };
             hyperlink(
-                label   => "Save",
+                label   => _("Save"),
                 onclick => [
                     { submit => $update },
                     {   replace_with => $self->fragment_for('view'),
@@ -354,7 +384,7 @@
                 ]
             );
             hyperlink(
-                label   => "Cancel",
+                label   => _("Cancel"),
                 onclick => {
                     replace_with => $self->fragment_for('view'),
                     args         => { object_type => $object_type, id => $id }
@@ -364,10 +394,10 @@
             );
             if ( $record->current_user_can('delete') ) {
                 $delete->button(
-                    label   => 'Delete',
+                    label   => _('Delete'),
                     onclick => {
                         submit => $delete,
-                        confirm => 'Really delete?',
+                        confirm => _('Really delete?'),
                         refresh => Jifty->web->current_region->parent,
                     },
                     class => 'delete'
@@ -413,7 +443,7 @@
 sub _current_collection {
     my $self = shift; 
     my ( $page, $search_collection ) = get(qw(page  search_collection));
-    my $collection_class = Jifty->app_class( "Model", $self->object_type . "Collection" );
+    my $collection_class = $self->record_class->collection_class;
     my $search = $search_collection || ( Jifty->web->response->result('search') ? Jifty->web->response->result('search')->content('search') : undef );
     my $collection;
     if ( $search ) {
@@ -452,7 +482,7 @@
                 args         => { object_type => $object_type }
             },
         ],
-        label => 'Toggle search'
+        label => _('Toggle search'),
     );
 
     outs( $search_region->render );
@@ -498,7 +528,7 @@
     my $item_path   = shift;
     my $callback    = shift;
     my $object_type = $self->object_type;
-    if ( $collection->pager->total_entries == 0 ) {
+    if ( $collection->count == 0 ) {
         show('./no_items_found');
     }
 
@@ -596,8 +626,8 @@
     my $self = shift;
     my ( $object_type, $id ) = ( $self->object_type, get('id') );
 
-    my $record_class = Jifty->app_class( "Model", $object_type );
-    my $create = Jifty->web->new_action( class => 'Create' . $object_type );
+    my $record_class = $self->record_class;
+    my $create = $record_class->as_create_action;
 
     div {
         { class is 'crud create item inline' };
@@ -605,7 +635,7 @@
 
         outs(
             Jifty->web->form->submit(
-                label   => 'Create',
+                label   => _('Create'),
                 onclick => [
                     { submit       => $create },
                     { refresh_self => 1 },

Modified: jifty/branches/virtual-models/lib/Jifty/View/Declare/Helpers.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/View/Declare/Helpers.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/View/Declare/Helpers.pm	Tue Sep 11 14:03:32 2007
@@ -11,7 +11,8 @@
     wrapper request get set render_param current_user
     render_action render_region),
     @Template::Declare::Tags::EXPORT,
-    @Template::Declare::Tags::TagSubs,
+    @Template::Declare::Tags::TagSubs,  # Backward compatibility only
+    @Template::Declare::Tags::TAG_SUB_LIST,
 );
 
 =head1 NAME
@@ -327,7 +328,9 @@
     # XXX: fallback, this is ugly
     Jifty::Util->require( $page_class );
 
-    my $page = $page_class->new({ content_code => shift });
+    my $content_code = shift;
+    my $meta = shift;
+    my $page = $page_class->new({ content_code => $content_code, _meta => $meta });
 
     my ($spa) = Jifty->find_plugin('Jifty::Plugin::SinglePage');
 

Modified: jifty/branches/virtual-models/lib/Jifty/View/Declare/Page.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/View/Declare/Page.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/View/Declare/Page.pm	Tue Sep 11 14:03:32 2007
@@ -17,7 +17,7 @@
 
 use Jifty::View::Declare::Helpers;
 
-__PACKAGE__->mk_accessors(qw(content_code done_header _title));
+__PACKAGE__->mk_accessors(qw(content_code done_header _title _meta));
 use constant allow_single_page => 1;
 
 =head2 new
@@ -33,6 +33,9 @@
     my ($title) = get_current_attr(qw(title));
     $self->_title($title);
 
+    $self->_title($self->_meta->{title})
+	if $self->_meta && $self->_meta->{title};
+
     return $self;
 }
 
@@ -194,7 +197,7 @@
     # wrapper, make sure you have this as well.
     if ( Jifty->config->framework('PubSub')->{'Enable'} && Jifty::Subs->list )
     {
-        script { outs('new Jifty.Subs({}).start();') };
+        script { outs_raw('new Jifty.Subs({}).start();') };
     }
 }
 

Modified: jifty/branches/virtual-models/lib/Jifty/View/Mason/Handler.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/View/Mason/Handler.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/View/Mason/Handler.pm	Tue Sep 11 14:03:32 2007
@@ -98,13 +98,14 @@
         %{ Jifty->config->framework('Web')->{'MasonConfig'} },
     );
 
+    my $root_serial = 0;
     for my $plugin (Jifty->plugins) {
         my $comp_root = $plugin->template_root;
         unless  ( $comp_root and -d $comp_root) {
             next;
         }
         Jifty->log->debug( "Plugin @{[ref($plugin)]} mason component root added: (@{[$comp_root ||'']})");
-        push @{ $config{comp_root} }, [ ref($plugin)."-".Jifty->web->serial => $comp_root ];
+        push @{ $config{comp_root} }, [ ref($plugin)."-". $root_serial++ => $comp_root ];
     }
     push @{$config{comp_root}}, [jifty => Jifty->config->framework('Web')->{'DefaultTemplateRoot'}];
 
@@ -189,6 +190,10 @@
     my $r = Jifty->handler->apache;
     $self->interp->set_global('$r', $r);
 
+    # XXX FIXME This is a kludge to get use_mason_wrapper to work
+    $self->interp->set_global('$jifty_internal_request', 0);
+    $self->interp->set_global('$jifty_internal_request', 1) if defined $args;
+
     my %args = $args ? %$args : $self->request_args($r);
 
     my @result;

Modified: jifty/branches/virtual-models/lib/Jifty/Web.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Web.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Web.pm	Tue Sep 11 14:03:32 2007
@@ -9,13 +9,11 @@
 
 =cut
 
-
-
-
 use CGI::Cookie;
 use XML::Writer;
 use CSS::Squish;
 use Digest::MD5 qw(md5_hex);
+use Scalar::Util qw(blessed);
 use Carp qw(carp);
 use base qw/Class::Accessor::Fast Class::Data::Inheritable Jifty::Object/;
 
@@ -76,7 +74,7 @@
     css_browser_selector.js
 )]);
 
-use Jifty::DBI::Class::Trigger;
+use Class::Trigger;
 
 =head1 METHODS
 
@@ -655,6 +653,8 @@
     # XXX: move to singlepage plugin
     my ($spa) = Jifty->find_plugin('Jifty::Plugin::SinglePage') or return;
 
+    return if $self->failed_actions;
+
     Jifty->web->request->remove_state_variable( 'region-'.$spa->region_name );
     Jifty->web->request->add_fragment(
         name      => $spa->region_name,

Modified: jifty/branches/virtual-models/lib/Jifty/Web/Form/Field/Upload.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Web/Form/Field/Upload.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Web/Form/Field/Upload.pm	Tue Sep 11 14:03:32 2007
@@ -35,34 +35,6 @@
 }
 
 
-=head2 handler_allowed HANDLER_NAME
-
-Returns 1 if the handler (e.g. onclick) is allowed.  Undef otherwise.
-
-=cut
-
-sub handler_allowed {
-    my $self = shift;
-    my ($handler) = @_;
-
-    return {onchange => 1, 
-            onclick => 1, 
-            ondblclick => 1, 
-            onmousedown => 1,
-            onmouseup => 1,
-            onmouseover => 1,
-            onmousemove => 1,
-            onmouseout => 1,
-            onfocus => 1,
-            onblur => 1,
-            onkeypress => 1,
-            onkeydown => 1,
-            onkeyup => 1
-           }->{$handler};
-
-}
-
-
 =head2 render_value
 
 The 'value', rendered, is empty so that BLOBs and the like don't get

Modified: jifty/branches/virtual-models/lib/Jifty/Web/Menu.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Web/Menu.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Web/Menu.pm	Tue Sep 11 14:03:32 2007
@@ -112,14 +112,16 @@
 sub child {
     my $self = shift;
     my $key = shift;
+    my $proto = ref $self || $self;
+
     if (@_) {
-        $self->{children}{$key} = Jifty::Web::Menu->new({parent => $self,
-                                                        sort_order => ($self->{children}{$key}{sort_order}
-                                                                       || scalar values %{$self->{children}}),
-                                                        label => $key,
-                                                        escape_label => 1,
-                                                        @_
-                                                       });
+        $self->{children}{$key} = $proto->new({parent => $self,
+                                               sort_order => ($self->{children}{$key}{sort_order}
+                                                          || scalar values %{$self->{children}}),
+                                               label => $key,
+                                               escape_label => 1,
+                                               @_
+                                             });
         Scalar::Util::weaken($self->{children}{$key}{parent});
         # Activate it
         if (my $url = $self->{children}{$key}->url and Jifty->web->request) {

Added: jifty/branches/virtual-models/share/plugins/Jifty/Plugin/JQuery/web/static/js/jquery.js
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/share/plugins/Jifty/Plugin/JQuery/web/static/js/jquery.js	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,2344 @@
+// prevent execution of jQuery if included more than once
+if(typeof window.jQuery == "undefined") {
+/*
+ * jQuery 1.1.3.1 - New Wave Javascript
+ *
+ * Copyright (c) 2007 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2007-07-05 00:43:24 -0400 (Thu, 05 Jul 2007) $
+ * $Rev: 2243 $
+ */
+
+// Global undefined variable
+window.undefined = window.undefined;
+var jQuery = function(a,c) {
+	// If the context is global, return a new object
+	if ( window == this || !this.init )
+		return new jQuery(a,c);
+	
+	return this.init(a,c);
+};
+
+// Map over the $ in case of overwrite
+if ( typeof $ != "undefined" )
+	jQuery._$ = $;
+	
+// Map the jQuery namespace to the '$' one
+var $ = jQuery;
+
+jQuery.fn = jQuery.prototype = {
+	init: function(a,c) {
+		// Make sure that a selection was provided
+		a = a || document;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		if ( jQuery.isFunction(a) )
+			return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
+
+		// Handle HTML strings
+		if ( typeof a  == "string" ) {
+			// HANDLE: $(html) -> $(array)
+			var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a);
+			if ( m )
+				a = jQuery.clean( [ m[1] ] );
+
+			// HANDLE: $(expr)
+			else
+				return new jQuery( c ).find( a );
+		}
+
+		return this.setArray(
+			// HANDLE: $(array)
+			a.constructor == Array && a ||
+
+			// HANDLE: $(arraylike)
+			// Watch for when an array-like object is passed as the selector
+			(a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) ||
+
+			// HANDLE: $(*)
+			[ a ] );
+	},
+	jquery: "1.1.3.1",
+
+	size: function() {
+		return this.length;
+	},
+	
+	length: 0,
+
+	get: function( num ) {
+		return num == undefined ?
+
+			// Return a 'clean' array
+			jQuery.makeArray( this ) :
+
+			// Return just the object
+			this[num];
+	},
+	pushStack: function( a ) {
+		var ret = jQuery(a);
+		ret.prevObject = this;
+		return ret;
+	},
+	setArray: function( a ) {
+		this.length = 0;
+		[].push.apply( this, a );
+		return this;
+	},
+	each: function( fn, args ) {
+		return jQuery.each( this, fn, args );
+	},
+	index: function( obj ) {
+		var pos = -1;
+		this.each(function(i){
+			if ( this == obj ) pos = i;
+		});
+		return pos;
+	},
+
+	attr: function( key, value, type ) {
+		var obj = key;
+		
+		// Look for the case where we're accessing a style value
+		if ( key.constructor == String )
+			if ( value == undefined )
+				return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
+			else {
+				obj = {};
+				obj[ key ] = value;
+			}
+		
+		// Check to see if we're setting style values
+		return this.each(function(index){
+			// Set all the styles
+			for ( var prop in obj )
+				jQuery.attr(
+					type ? this.style : this,
+					prop, jQuery.prop(this, obj[prop], type, index, prop)
+				);
+		});
+	},
+
+	css: function( key, value ) {
+		return this.attr( key, value, "curCSS" );
+	},
+
+	text: function(e) {
+		if ( typeof e == "string" )
+			return this.empty().append( document.createTextNode( e ) );
+
+		var t = "";
+		jQuery.each( e || this, function(){
+			jQuery.each( this.childNodes, function(){
+				if ( this.nodeType != 8 )
+					t += this.nodeType != 1 ?
+						this.nodeValue : jQuery.fn.text([ this ]);
+			});
+		});
+		return t;
+	},
+
+	wrap: function() {
+		// The elements to wrap the target around
+		var a, args = arguments;
+
+		// Wrap each of the matched elements individually
+		return this.each(function(){
+			if ( !a )
+				a = jQuery.clean(args, this.ownerDocument);
+
+			// Clone the structure that we're using to wrap
+			var b = a[0].cloneNode(true);
+
+			// Insert it before the element to be wrapped
+			this.parentNode.insertBefore( b, this );
+
+			// Find the deepest point in the wrap structure
+			while ( b.firstChild )
+				b = b.firstChild;
+
+			// Move the matched element to within the wrap structure
+			b.appendChild( this );
+		});
+	},
+	append: function() {
+		return this.domManip(arguments, true, 1, function(a){
+			this.appendChild( a );
+		});
+	},
+	prepend: function() {
+		return this.domManip(arguments, true, -1, function(a){
+			this.insertBefore( a, this.firstChild );
+		});
+	},
+	before: function() {
+		return this.domManip(arguments, false, 1, function(a){
+			this.parentNode.insertBefore( a, this );
+		});
+	},
+	after: function() {
+		return this.domManip(arguments, false, -1, function(a){
+			this.parentNode.insertBefore( a, this.nextSibling );
+		});
+	},
+	end: function() {
+		return this.prevObject || jQuery([]);
+	},
+	find: function(t) {
+		var data = jQuery.map(this, function(a){ return jQuery.find(t,a); });
+		return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ?
+			jQuery.unique( data ) : data );
+	},
+	clone: function(deep) {
+		// Need to remove events on the element and its descendants
+		var $this = this.add(this.find("*"));
+		$this.each(function() {
+			this._$events = {};
+			for (var type in this.$events)
+				this._$events[type] = jQuery.extend({},this.$events[type]);
+		}).unbind();
+
+		// Do the clone
+		var r = this.pushStack( jQuery.map( this, function(a){
+			return a.cloneNode( deep != undefined ? deep : true );
+		}) );
+
+		// Add the events back to the original and its descendants
+		$this.each(function() {
+			var events = this._$events;
+			for (var type in events)
+				for (var handler in events[type])
+					jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
+			this._$events = null;
+		});
+
+		// Return the cloned set
+		return r;
+	},
+
+	filter: function(t) {
+		return this.pushStack(
+			jQuery.isFunction( t ) &&
+			jQuery.grep(this, function(el, index){
+				return t.apply(el, [index])
+			}) ||
+
+			jQuery.multiFilter(t,this) );
+	},
+
+	not: function(t) {
+		return this.pushStack(
+			t.constructor == String &&
+			jQuery.multiFilter(t, this, true) ||
+
+			jQuery.grep(this, function(a) {
+				return ( t.constructor == Array || t.jquery )
+					? jQuery.inArray( a, t ) < 0
+					: a != t;
+			})
+		);
+	},
+
+	add: function(t) {
+		return this.pushStack( jQuery.merge(
+			this.get(),
+			t.constructor == String ?
+				jQuery(t).get() :
+				t.length != undefined && (!t.nodeName || t.nodeName == "FORM") ?
+					t : [t] )
+		);
+	},
+	is: function(expr) {
+		return expr ? jQuery.multiFilter(expr,this).length > 0 : false;
+	},
+
+	val: function( val ) {
+		return val == undefined ?
+			( this.length ? this[0].value : null ) :
+			this.attr( "value", val );
+	},
+
+	html: function( val ) {
+		return val == undefined ?
+			( this.length ? this[0].innerHTML : null ) :
+			this.empty().append( val );
+	},
+	domManip: function(args, table, dir, fn){
+		var clone = this.length > 1, a; 
+
+		return this.each(function(){
+			if ( !a ) {
+				a = jQuery.clean(args, this.ownerDocument);
+				if ( dir < 0 )
+					a.reverse();
+			}
+
+			var obj = this;
+
+			if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
+				obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
+
+			jQuery.each( a, function(){
+				fn.apply( obj, [ clone ? this.cloneNode(true) : this ] );
+			});
+
+		});
+	}
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	// copy reference to target object
+	var target = arguments[0], a = 1;
+
+	// extend jQuery itself if only one argument is passed
+	if ( arguments.length == 1 ) {
+		target = this;
+		a = 0;
+	}
+	var prop;
+	while ( (prop = arguments[a++]) != null )
+		// Extend the base object
+		for ( var i in prop ) target[i] = prop[i];
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function() {
+		if ( jQuery._$ )
+			$ = jQuery._$;
+		return jQuery;
+	},
+
+	// This may seem like some crazy code, but trust me when I say that this
+	// is the only cross-browser way to do this. --John
+	isFunction: function( fn ) {
+		return !!fn && typeof fn != "string" && !fn.nodeName && 
+			fn.constructor != Array && /function/i.test( fn + "" );
+	},
+	
+	// check if an element is in a XML document
+	isXMLDoc: function(elem) {
+		return elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
+	},
+	// args is for internal usage only
+	each: function( obj, fn, args ) {
+		if ( obj.length == undefined )
+			for ( var i in obj )
+				fn.apply( obj[i], args || [i, obj[i]] );
+		else
+			for ( var i = 0, ol = obj.length; i < ol; i++ )
+				if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break;
+		return obj;
+	},
+	
+	prop: function(elem, value, type, index, prop){
+			// Handle executable functions
+			if ( jQuery.isFunction( value ) )
+				value = value.call( elem, [index] );
+				
+			// exclude the following css properties to add px
+			var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
+
+			// Handle passing in a number to a CSS property
+			return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
+				value + "px" :
+				value;
+	},
+
+	className: {
+		// internal only, use addClass("class")
+		add: function( elem, c ){
+			jQuery.each( c.split(/\s+/), function(i, cur){
+				if ( !jQuery.className.has( elem.className, cur ) )
+					elem.className += ( elem.className ? " " : "" ) + cur;
+			});
+		},
+
+		// internal only, use removeClass("class")
+		remove: function( elem, c ){
+			elem.className = c != undefined ?
+				jQuery.grep( elem.className.split(/\s+/), function(cur){
+					return !jQuery.className.has( c, cur );	
+				}).join(" ") : "";
+		},
+
+		// internal only, use is(".class")
+		has: function( t, c ) {
+			return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1;
+		}
+	},
+	swap: function(e,o,f) {
+		for ( var i in o ) {
+			e.style["old"+i] = e.style[i];
+			e.style[i] = o[i];
+		}
+		f.apply( e, [] );
+		for ( var i in o )
+			e.style[i] = e.style["old"+i];
+	},
+
+	css: function(e,p) {
+		if ( p == "height" || p == "width" ) {
+			var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
+
+			jQuery.each( d, function(){
+				old["padding" + this] = 0;
+				old["border" + this + "Width"] = 0;
+			});
+
+			jQuery.swap( e, old, function() {
+				if ( jQuery(e).is(':visible') ) {
+					oHeight = e.offsetHeight;
+					oWidth = e.offsetWidth;
+				} else {
+					e = jQuery(e.cloneNode(true))
+						.find(":radio").removeAttr("checked").end()
+						.css({
+							visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
+						}).appendTo(e.parentNode)[0];
+
+					var parPos = jQuery.css(e.parentNode,"position") || "static";
+					if ( parPos == "static" )
+						e.parentNode.style.position = "relative";
+
+					oHeight = e.clientHeight;
+					oWidth = e.clientWidth;
+
+					if ( parPos == "static" )
+						e.parentNode.style.position = "static";
+
+					e.parentNode.removeChild(e);
+				}
+			});
+
+			return p == "height" ? oHeight : oWidth;
+		}
+
+		return jQuery.curCSS( e, p );
+	},
+
+	curCSS: function(elem, prop, force) {
+		var ret;
+
+		if (prop == "opacity" && jQuery.browser.msie) {
+			ret = jQuery.attr(elem.style, "opacity");
+			return ret == "" ? "1" : ret;
+		}
+		
+		if (prop.match(/float/i))
+			prop = jQuery.styleFloat;
+
+		if (!force && elem.style[prop])
+			ret = elem.style[prop];
+
+		else if (document.defaultView && document.defaultView.getComputedStyle) {
+
+			if (prop.match(/float/i))
+				prop = "float";
+
+			prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
+			var cur = document.defaultView.getComputedStyle(elem, null);
+
+			if ( cur )
+				ret = cur.getPropertyValue(prop);
+			else if ( prop == "display" )
+				ret = "none";
+			else
+				jQuery.swap(elem, { display: "block" }, function() {
+				    var c = document.defaultView.getComputedStyle(this, "");
+				    ret = c && c.getPropertyValue(prop) || "";
+				});
+
+		} else if (elem.currentStyle) {
+			var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
+			ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
+		}
+
+		return ret;
+	},
+	
+	clean: function(a, doc) {
+		var r = [];
+		doc = doc || document;
+
+		jQuery.each( a, function(i,arg){
+			if ( !arg ) return;
+
+			if ( arg.constructor == Number )
+				arg = arg.toString();
+			
+			// Convert html string into DOM nodes
+			if ( typeof arg == "string" ) {
+				// Trim whitespace, otherwise indexOf won't work as expected
+				var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = [];
+
+				var wrap =
+					// option or optgroup
+					!s.indexOf("<opt") &&
+					[1, "<select>", "</select>"] ||
+					
+					!s.indexOf("<leg") &&
+					[1, "<fieldset>", "</fieldset>"] ||
+					
+					(!s.indexOf("<thead") || !s.indexOf("<tbody") || !s.indexOf("<tfoot") || !s.indexOf("<colg")) &&
+					[1, "<table>", "</table>"] ||
+					
+					!s.indexOf("<tr") &&
+					[2, "<table><tbody>", "</tbody></table>"] ||
+					
+				 	// <thead> matched above
+					(!s.indexOf("<td") || !s.indexOf("<th")) &&
+					[3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
+					
+					!s.indexOf("<col") &&
+					[2, "<table><colgroup>", "</colgroup></table>"] ||
+					
+					[0,"",""];
+
+				// Go to html and back, then peel off extra wrappers
+				div.innerHTML = wrap[1] + arg + wrap[2];
+				
+				// Move to the right depth
+				while ( wrap[0]-- )
+					div = div.firstChild;
+				
+				// Remove IE's autoinserted <tbody> from table fragments
+				if ( jQuery.browser.msie ) {
+					
+					// String was a <table>, *may* have spurious <tbody>
+					if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) 
+						tb = div.firstChild && div.firstChild.childNodes;
+						
+					// String was a bare <thead> or <tfoot>
+					else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 )
+						tb = div.childNodes;
+
+					for ( var n = tb.length-1; n >= 0 ; --n )
+						if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
+							tb[n].parentNode.removeChild(tb[n]);
+					
+				}
+				
+				arg = jQuery.makeArray( div.childNodes );
+			}
+
+			if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) )
+				return;
+
+			if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options )
+				r.push( arg );
+			else
+				r = jQuery.merge( r, arg );
+
+		});
+
+		return r;
+	},
+	
+	attr: function(elem, name, value){
+		var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props;
+		
+		// Certain attributes only work when accessed via the old DOM 0 way
+		if ( fix[name] ) {
+			if ( value != undefined ) elem[fix[name]] = value;
+			return elem[fix[name]];
+
+		} else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
+			return elem.getAttributeNode(name).nodeValue;
+
+		// IE elem.getAttribute passes even for style
+		else if ( elem.tagName ) {
+			
+
+			if ( value != undefined ) elem.setAttribute( name, value );
+			if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
+				return elem.getAttribute( name, 2 );
+			return elem.getAttribute( name );
+
+		// elem is actually elem.style ... set the style
+		} else {
+			// IE actually uses filters for opacity
+			if ( name == "opacity" && jQuery.browser.msie ) {
+				if ( value != undefined ) {
+					// IE has trouble with opacity if it does not have layout
+					// Force it by setting the zoom level
+					elem.zoom = 1; 
+	
+					// Set the alpha filter to set the opacity
+					elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
+						(parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+				}
+	
+				return elem.filter ? 
+					(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
+			}
+			name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
+			if ( value != undefined ) elem[name] = value;
+			return elem[name];
+		}
+	},
+	trim: function(t){
+		return t.replace(/^\s+|\s+$/g, "");
+	},
+
+	makeArray: function( a ) {
+		var r = [];
+
+		// Need to use typeof to fight Safari childNodes crashes
+		if ( typeof a != "array" )
+			for ( var i = 0, al = a.length; i < al; i++ )
+				r.push( a[i] );
+		else
+			r = a.slice( 0 );
+
+		return r;
+	},
+
+	inArray: function( b, a ) {
+		for ( var i = 0, al = a.length; i < al; i++ )
+			if ( a[i] == b )
+				return i;
+		return -1;
+	},
+	merge: function(first, second) {
+		// We have to loop this way because IE & Opera overwrite the length
+		// expando of getElementsByTagName
+		for ( var i = 0; second[i]; i++ )
+			first.push(second[i]);
+		return first;
+	},
+	unique: function(first) {
+		var r = [], num = jQuery.mergeNum++;
+
+		for ( var i = 0, fl = first.length; i < fl; i++ )
+			if ( num != first[i].mergeNum ) {
+				first[i].mergeNum = num;
+				r.push(first[i]);
+			}
+
+		return r;
+	},
+
+	mergeNum: 0,
+	grep: function(elems, fn, inv) {
+		// If a string is passed in for the function, make a function
+		// for it (a handy shortcut)
+		if ( typeof fn == "string" )
+			fn = new Function("a","i","return " + fn);
+
+		var result = [];
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, el = elems.length; i < el; i++ )
+			if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
+				result.push( elems[i] );
+
+		return result;
+	},
+	map: function(elems, fn) {
+		// If a string is passed in for the function, make a function
+		// for it (a handy shortcut)
+		if ( typeof fn == "string" )
+			fn = new Function("a","return " + fn);
+
+		var result = [];
+
+		// Go through the array, translating each of the items to their
+		// new value (or values).
+		for ( var i = 0, el = elems.length; i < el; i++ ) {
+			var val = fn(elems[i],i);
+
+			if ( val !== null && val != undefined ) {
+				if ( val.constructor != Array ) val = [val];
+				result = result.concat( val );
+			}
+		}
+
+		return result;
+	}
+});
+ 
+/*
+ * Whether the W3C compliant box model is being used.
+ *
+ * @property
+ * @name $.boxModel
+ * @type Boolean
+ * @cat JavaScript
+ */
+new function() {
+	var b = navigator.userAgent.toLowerCase();
+
+	// Figure out what browser is being used
+	jQuery.browser = {
+		version: (b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
+		safari: /webkit/.test(b),
+		opera: /opera/.test(b),
+		msie: /msie/.test(b) && !/opera/.test(b),
+		mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
+	};
+
+	// Check to see if the W3C box model is being used
+	jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
+
+	jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat",
+
+	jQuery.props = {
+		"for": "htmlFor",
+		"class": "className",
+		"float": jQuery.styleFloat,
+		cssFloat: jQuery.styleFloat,
+		styleFloat: jQuery.styleFloat,
+		innerHTML: "innerHTML",
+		className: "className",
+		value: "value",
+		disabled: "disabled",
+		checked: "checked",
+		readonly: "readOnly",
+		selected: "selected",
+		maxlength: "maxLength"
+	};
+};
+
+jQuery.each({
+	parent: "a.parentNode",
+	parents: "jQuery.parents(a)",
+	next: "jQuery.nth(a,2,'nextSibling')",
+	prev: "jQuery.nth(a,2,'previousSibling')",
+	siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
+	children: "jQuery.sibling(a.firstChild)"
+}, function(i,n){
+	jQuery.fn[ i ] = function(a) {
+		var ret = jQuery.map(this,n);
+		if ( a && typeof a == "string" )
+			ret = jQuery.multiFilter(a,ret);
+		return this.pushStack( ret );
+	};
+});
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after"
+}, function(i,n){
+	jQuery.fn[ i ] = function(){
+		var a = arguments;
+		return this.each(function(){
+			for ( var j = 0, al = a.length; j < al; j++ )
+				jQuery(a[j])[n]( this );
+		});
+	};
+});
+
+jQuery.each( {
+	removeAttr: function( key ) {
+		jQuery.attr( this, key, "" );
+		this.removeAttribute( key );
+	},
+	addClass: function(c){
+		jQuery.className.add(this,c);
+	},
+	removeClass: function(c){
+		jQuery.className.remove(this,c);
+	},
+	toggleClass: function( c ){
+		jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c);
+	},
+	remove: function(a){
+		if ( !a || jQuery.filter( a, [this] ).r.length )
+			this.parentNode.removeChild( this );
+	},
+	empty: function() {
+		while ( this.firstChild )
+			this.removeChild( this.firstChild );
+	}
+}, function(i,n){
+	jQuery.fn[ i ] = function() {
+		return this.each( n, arguments );
+	};
+});
+
+jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){
+	jQuery.fn[ n ] = function(num,fn) {
+		return this.filter( ":" + n + "(" + num + ")", fn );
+	};
+});
+
+jQuery.each( [ "height", "width" ], function(i,n){
+	jQuery.fn[ n ] = function(h) {
+		return h == undefined ?
+			( this.length ? jQuery.css( this[0], n ) : null ) :
+			this.css( n, h.constructor == String ? h : h + "px" );
+	};
+});
+jQuery.extend({
+	expr: {
+		"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
+		"#": "a.getAttribute('id')==m[2]",
+		":": {
+			// Position Checks
+			lt: "i<m[3]-0",
+			gt: "i>m[3]-0",
+			nth: "m[3]-0==i",
+			eq: "m[3]-0==i",
+			first: "i==0",
+			last: "i==r.length-1",
+			even: "i%2==0",
+			odd: "i%2",
+
+			// Child Checks
+			"first-child": "a.parentNode.getElementsByTagName('*')[0]==a",
+			"last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",
+			"only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",
+
+			// Parent Checks
+			parent: "a.firstChild",
+			empty: "!a.firstChild",
+
+			// Text Check
+			contains: "(a.textContent||a.innerText||'').indexOf(m[3])>=0",
+
+			// Visibility
+			visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',
+			hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',
+
+			// Form attributes
+			enabled: "!a.disabled",
+			disabled: "a.disabled",
+			checked: "a.checked",
+			selected: "a.selected||jQuery.attr(a,'selected')",
+
+			// Form elements
+			text: "'text'==a.type",
+			radio: "'radio'==a.type",
+			checkbox: "'checkbox'==a.type",
+			file: "'file'==a.type",
+			password: "'password'==a.type",
+			submit: "'submit'==a.type",
+			image: "'image'==a.type",
+			reset: "'reset'==a.type",
+			button: '"button"==a.type||jQuery.nodeName(a,"button")',
+			input: "/input|select|textarea|button/i.test(a.nodeName)"
+		},
+		"[": "jQuery.find(m[2],a).length"
+	},
+	
+	// The regular expressions that power the parsing engine
+	parse: [
+		// Match: [@value='test'], [@foo]
+		/^\[ *(@)([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
+
+		// Match: [div], [div p]
+		/^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/,
+
+		// Match: :contains('foo')
+		/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
+
+		// Match: :even, :last-chlid, #id, .class
+		new RegExp("^([:.#]*)(" + 
+			( jQuery.chars = jQuery.browser.safari && jQuery.browser.version < "3.0.0" ? "\\w" : "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)" ) + "+)")
+	],
+
+	multiFilter: function( expr, elems, not ) {
+		var old, cur = [];
+
+		while ( expr && expr != old ) {
+			old = expr;
+			var f = jQuery.filter( expr, elems, not );
+			expr = f.t.replace(/^\s*,\s*/, "" );
+			cur = not ? elems = f.r : jQuery.merge( cur, f.r );
+		}
+
+		return cur;
+	},
+	find: function( t, context ) {
+		// Quickly handle non-string expressions
+		if ( typeof t != "string" )
+			return [ t ];
+
+		// Make sure that the context is a DOM Element
+		if ( context && !context.nodeType )
+			context = null;
+
+		// Set the correct context (if none is provided)
+		context = context || document;
+
+		// Handle the common XPath // expression
+		if ( !t.indexOf("//") ) {
+			context = context.documentElement;
+			t = t.substr(2,t.length);
+
+		// And the / root expression
+		} else if ( !t.indexOf("/") && !context.ownerDocument ) {
+			context = context.documentElement;
+			t = t.substr(1,t.length);
+			if ( t.indexOf("/") >= 1 )
+				t = t.substr(t.indexOf("/"),t.length);
+		}
+
+		// Initialize the search
+		var ret = [context], done = [], last;
+
+		// Continue while a selector expression exists, and while
+		// we're no longer looping upon ourselves
+		while ( t && last != t ) {
+			var r = [];
+			last = t;
+
+			t = jQuery.trim(t).replace( /^\/\//, "" );
+
+			var foundToken = false;
+
+			// An attempt at speeding up child selectors that
+			// point to a specific element tag
+			var re = new RegExp("^[/>]\\s*(" + jQuery.chars + "+)");
+			var m = re.exec(t);
+
+			if ( m ) {
+				var nodeName = m[1].toUpperCase();
+
+				// Perform our own iteration and filter
+				for ( var i = 0; ret[i]; i++ )
+					for ( var c = ret[i].firstChild; c; c = c.nextSibling )
+						if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) )
+							r.push( c );
+
+				ret = r;
+				t = t.replace( re, "" );
+				if ( t.indexOf(" ") == 0 ) continue;
+				foundToken = true;
+			} else {
+				re = /^((\/?\.\.)|([>\/+~]))\s*([a-z]*)/i;
+
+				if ( (m = re.exec(t)) != null ) {
+					r = [];
+
+					var nodeName = m[4], mergeNum = jQuery.mergeNum++;
+					m = m[1];
+
+					for ( var j = 0, rl = ret.length; j < rl; j++ )
+						if ( m.indexOf("..") < 0 ) {
+							var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
+							for ( ; n; n = n.nextSibling )
+								if ( n.nodeType == 1 ) {
+									if ( m == "~" && n.mergeNum == mergeNum ) break;
+									
+									if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) {
+										if ( m == "~" ) n.mergeNum = mergeNum;
+										r.push( n );
+									}
+									
+									if ( m == "+" ) break;
+								}
+						} else
+							r.push( ret[j].parentNode );
+
+					ret = r;
+
+					// And remove the token
+					t = jQuery.trim( t.replace( re, "" ) );
+					foundToken = true;
+				}
+			}
+
+			// See if there's still an expression, and that we haven't already
+			// matched a token
+			if ( t && !foundToken ) {
+				// Handle multiple expressions
+				if ( !t.indexOf(",") ) {
+					// Clean the result set
+					if ( context == ret[0] ) ret.shift();
+
+					// Merge the result sets
+					done = jQuery.merge( done, ret );
+
+					// Reset the context
+					r = ret = [context];
+
+					// Touch up the selector string
+					t = " " + t.substr(1,t.length);
+
+				} else {
+					// Optomize for the case nodeName#idName
+					var re2 = new RegExp("^(" + jQuery.chars + "+)(#)(" + jQuery.chars + "+)");
+					var m = re2.exec(t);
+					
+					// Re-organize the results, so that they're consistent
+					if ( m ) {
+					   m = [ 0, m[2], m[3], m[1] ];
+
+					} else {
+						// Otherwise, do a traditional filter check for
+						// ID, class, and element selectors
+						re2 = new RegExp("^([#.]?)(" + jQuery.chars + "*)");
+						m = re2.exec(t);
+					}
+
+					m[2] = m[2].replace(/\\/g, "");
+
+					var elem = ret[ret.length-1];
+
+					// Try to do a global search by ID, where we can
+					if ( m[1] == "#" && elem && elem.getElementById ) {
+						// Optimization for HTML document case
+						var oid = elem.getElementById(m[2]);
+						
+						// Do a quick check for the existence of the actual ID attribute
+						// to avoid selecting by the name attribute in IE
+						// also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
+						if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
+							oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
+
+						// Do a quick check for node name (where applicable) so
+						// that div#foo searches will be really fast
+						ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
+					} else {
+						// We need to find all descendant elements
+						for ( var i = 0; ret[i]; i++ ) {
+							// Grab the tag name being searched for
+							var tag = m[1] != "" || m[0] == "" ? "*" : m[2];
+
+							// Handle IE7 being really dumb about <object>s
+							if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
+								tag = "param";
+
+							r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
+						}
+
+						// It's faster to filter by class and be done with it
+						if ( m[1] == "." )
+							r = jQuery.classFilter( r, m[2] );
+
+						// Same with ID filtering
+						if ( m[1] == "#" ) {
+							var tmp = [];
+
+							// Try to find the element with the ID
+							for ( var i = 0; r[i]; i++ )
+								if ( r[i].getAttribute("id") == m[2] ) {
+									tmp = [ r[i] ];
+									break;
+								}
+
+							r = tmp;
+						}
+
+						ret = r;
+					}
+
+					t = t.replace( re2, "" );
+				}
+
+			}
+
+			// If a selector string still exists
+			if ( t ) {
+				// Attempt to filter it
+				var val = jQuery.filter(t,r);
+				ret = r = val.r;
+				t = jQuery.trim(val.t);
+			}
+		}
+
+		// An error occurred with the selector;
+		// just return an empty set instead
+		if ( t )
+			ret = [];
+
+		// Remove the root context
+		if ( ret && context == ret[0] )
+			ret.shift();
+
+		// And combine the results
+		done = jQuery.merge( done, ret );
+
+		return done;
+	},
+
+	classFilter: function(r,m,not){
+		m = " " + m + " ";
+		var tmp = [];
+		for ( var i = 0; r[i]; i++ ) {
+			var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
+			if ( !not && pass || not && !pass )
+				tmp.push( r[i] );
+		}
+		return tmp;
+	},
+
+	filter: function(t,r,not) {
+		var last;
+
+		// Look for common filter expressions
+		while ( t  && t != last ) {
+			last = t;
+
+			var p = jQuery.parse, m;
+
+			for ( var i = 0; p[i]; i++ ) {
+				m = p[i].exec( t );
+
+				if ( m ) {
+					// Remove what we just matched
+					t = t.substring( m[0].length );
+
+					m[2] = m[2].replace(/\\/g, "");
+					break;
+				}
+			}
+
+			if ( !m )
+				break;
+
+			// :not() is a special case that can be optimized by
+			// keeping it out of the expression list
+			if ( m[1] == ":" && m[2] == "not" )
+				r = jQuery.filter(m[3], r, true).r;
+
+			// We can get a big speed boost by filtering by class here
+			else if ( m[1] == "." )
+				r = jQuery.classFilter(r, m[2], not);
+
+			else if ( m[1] == "@" ) {
+				var tmp = [], type = m[3];
+				
+				for ( var i = 0, rl = r.length; i < rl; i++ ) {
+					var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
+					
+					if ( z == null || /href|src/.test(m[2]) )
+						z = jQuery.attr(a,m[2]) || '';
+
+					if ( (type == "" && !!z ||
+						 type == "=" && z == m[5] ||
+						 type == "!=" && z != m[5] ||
+						 type == "^=" && z && !z.indexOf(m[5]) ||
+						 type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
+						 (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
+							tmp.push( a );
+				}
+				
+				r = tmp;
+
+			// We can get a speed boost by handling nth-child here
+			} else if ( m[1] == ":" && m[2] == "nth-child" ) {
+				var num = jQuery.mergeNum++, tmp = [],
+					test = /(\d*)n\+?(\d*)/.exec(
+						m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
+						!/\D/.test(m[3]) && "n+" + m[3] || m[3]),
+					first = (test[1] || 1) - 0, last = test[2] - 0;
+
+				for ( var i = 0, rl = r.length; i < rl; i++ ) {
+					var node = r[i], parentNode = node.parentNode;
+
+					if ( num != parentNode.mergeNum ) {
+						var c = 1;
+
+						for ( var n = parentNode.firstChild; n; n = n.nextSibling )
+							if ( n.nodeType == 1 )
+								n.nodeIndex = c++;
+
+						parentNode.mergeNum = num;
+					}
+
+					var add = false;
+
+					if ( first == 1 ) {
+						if ( last == 0 || node.nodeIndex == last )
+							add = true;
+					} else if ( (node.nodeIndex + last) % first == 0 )
+						add = true;
+
+					if ( add ^ not )
+						tmp.push( node );
+				}
+
+				r = tmp;
+
+			// Otherwise, find the expression to execute
+			} else {
+				var f = jQuery.expr[m[1]];
+				if ( typeof f != "string" )
+					f = jQuery.expr[m[1]][m[2]];
+
+				// Build a custom macro to enclose it
+				eval("f = function(a,i){return " + f + "}");
+
+				// Execute it against the current filter
+				r = jQuery.grep( r, f, not );
+			}
+		}
+
+		// Return an array of filtered elements (r)
+		// and the modified expression string (t)
+		return { r: r, t: t };
+	},
+	parents: function( elem ){
+		var matched = [];
+		var cur = elem.parentNode;
+		while ( cur && cur != document ) {
+			matched.push( cur );
+			cur = cur.parentNode;
+		}
+		return matched;
+	},
+	nth: function(cur,result,dir,elem){
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] )
+			if ( cur.nodeType == 1 && ++num == result )
+				break;
+
+		return cur;
+	},
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType == 1 && (!elem || n != elem) )
+				r.push( n );
+		}
+
+		return r;
+	}
+});
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code orignated from 
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+	// Bind an event to an element
+	// Original by Dean Edwards
+	add: function(element, type, handler, data) {
+		// For whatever reason, IE has trouble passing the window object
+		// around, causing it to be cloned in the process
+		if ( jQuery.browser.msie && element.setInterval != undefined )
+			element = window;
+		
+		// Make sure that the function being executed has a unique ID
+		if ( !handler.guid )
+			handler.guid = this.guid++;
+			
+		// if data is passed, bind to handler 
+		if( data != undefined ) { 
+        	// Create temporary function pointer to original handler 
+			var fn = handler; 
+
+			// Create unique handler function, wrapped around original handler 
+			handler = function() { 
+				// Pass arguments and context to original handler 
+				return fn.apply(this, arguments); 
+			};
+
+			// Store data in unique handler 
+			handler.data = data;
+
+			// Set the guid of unique handler to the same of original handler, so it can be removed 
+			handler.guid = fn.guid;
+		}
+
+		// Init the element's event structure
+		if (!element.$events)
+			element.$events = {};
+		
+		if (!element.$handle)
+			element.$handle = function() {
+				// returned undefined or false
+				var val;
+
+				// Handle the second event of a trigger and when
+				// an event is called after a page has unloaded
+				if ( typeof jQuery == "undefined" || jQuery.event.triggered )
+				  return val;
+				
+				val = jQuery.event.handle.apply(element, arguments);
+				
+				return val;
+			};
+
+		// Get the current list of functions bound to this event
+		var handlers = element.$events[type];
+
+		// Init the event handler queue
+		if (!handlers) {
+			handlers = element.$events[type] = {};	
+			
+			// And bind the global event handler to the element
+			if (element.addEventListener)
+				element.addEventListener(type, element.$handle, false);
+			else
+				element.attachEvent("on" + type, element.$handle);
+		}
+
+		// Add the function to the element's handler list
+		handlers[handler.guid] = handler;
+
+		// Remember the function in a global list (for triggering)
+		if (!this.global[type])
+			this.global[type] = [];
+		// Only add the element to the global list once
+		if (jQuery.inArray(element, this.global[type]) == -1)
+			this.global[type].push( element );
+	},
+
+	guid: 1,
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function(element, type, handler) {
+		var events = element.$events, ret, index;
+
+		if ( events ) {
+			// type is actually an event object here
+			if ( type && type.type ) {
+				handler = type.handler;
+				type = type.type;
+			}
+			
+			if ( !type ) {
+				for ( type in events )
+					this.remove( element, type );
+
+			} else if ( events[type] ) {
+				// remove the given handler for the given type
+				if ( handler )
+					delete events[type][handler.guid];
+				
+				// remove all handlers for the given type
+				else
+					for ( handler in element.$events[type] )
+						delete events[type][handler];
+
+				// remove generic event handler if no more handlers exist
+				for ( ret in events[type] ) break;
+				if ( !ret ) {
+					if (element.removeEventListener)
+						element.removeEventListener(type, element.$handle, false);
+					else
+						element.detachEvent("on" + type, element.$handle);
+					ret = null;
+					delete events[type];
+					
+					// Remove element from the global event type cache
+					while ( this.global[type] && ( (index = jQuery.inArray(element, this.global[type])) >= 0 ) )
+						delete this.global[type][index];
+				}
+			}
+
+			// Remove the expando if it's no longer used
+			for ( ret in events ) break;
+			if ( !ret )
+				element.$handle = element.$events = null;
+		}
+	},
+
+	trigger: function(type, data, element) {
+		// Clone the incoming data, if any
+		data = jQuery.makeArray(data || []);
+
+		// Handle a global trigger
+		if ( !element )
+			jQuery.each( this.global[type] || [], function(){
+				jQuery.event.trigger( type, data, this );
+			});
+
+		// Handle triggering a single element
+		else {
+			var val, ret, fn = jQuery.isFunction( element[ type ] || null );
+			
+			// Pass along a fake event
+			data.unshift( this.fix({ type: type, target: element }) );
+
+			// Trigger the event
+			if ( jQuery.isFunction(element.$handle) && (val = element.$handle.apply( element, data )) !== false )
+				this.triggered = true;
+
+			if ( fn && val !== false && !jQuery.nodeName(element, 'a') )
+				element[ type ]();
+
+			this.triggered = false;
+		}
+	},
+
+	handle: function(event) {
+		// returned undefined or false
+		var val;
+
+		// Empty object is for triggered events with no data
+		event = jQuery.event.fix( event || window.event || {} ); 
+
+		var c = this.$events && this.$events[event.type], args = [].slice.call( arguments, 1 );
+		args.unshift( event );
+
+		for ( var j in c ) {
+			// Pass in a reference to the handler function itself
+			// So that we can later remove it
+			args[0].handler = c[j];
+			args[0].data = c[j].data;
+
+			if ( c[j].apply( this, args ) === false ) {
+				event.preventDefault();
+				event.stopPropagation();
+				val = false;
+			}
+		}
+
+		// Clean up added properties in IE to prevent memory leak
+		if (jQuery.browser.msie)
+			event.target = event.preventDefault = event.stopPropagation =
+				event.handler = event.data = null;
+
+		return val;
+	},
+
+	fix: function(event) {
+		// store a copy of the original event object 
+		// and clone to set read-only properties
+		var originalEvent = event;
+		event = jQuery.extend({}, originalEvent);
+		
+		// add preventDefault and stopPropagation since 
+		// they will not work on the clone
+		event.preventDefault = function() {
+			// if preventDefault exists run it on the original event
+			if (originalEvent.preventDefault)
+				return originalEvent.preventDefault();
+			// otherwise set the returnValue property of the original event to false (IE)
+			originalEvent.returnValue = false;
+		};
+		event.stopPropagation = function() {
+			// if stopPropagation exists run it on the original event
+			if (originalEvent.stopPropagation)
+				return originalEvent.stopPropagation();
+			// otherwise set the cancelBubble property of the original event to true (IE)
+			originalEvent.cancelBubble = true;
+		};
+		
+		// Fix target property, if necessary
+		if ( !event.target && event.srcElement )
+			event.target = event.srcElement;
+				
+		// check if target is a textnode (safari)
+		if (jQuery.browser.safari && event.target.nodeType == 3)
+			event.target = originalEvent.target.parentNode;
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement )
+			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
+
+		// Calculate pageX/Y if missing and clientX/Y available
+		if ( event.pageX == null && event.clientX != null ) {
+			var e = document.documentElement, b = document.body;
+			event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft);
+			event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop);
+		}
+			
+		// Add which for key events
+		if ( !event.which && (event.charCode || event.keyCode) )
+			event.which = event.charCode || event.keyCode;
+		
+		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+		if ( !event.metaKey && event.ctrlKey )
+			event.metaKey = event.ctrlKey;
+
+		// Add which for click: 1 == left; 2 == middle; 3 == right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button )
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+			
+		return event;
+	}
+};
+
+jQuery.fn.extend({
+	bind: function( type, data, fn ) {
+		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
+			jQuery.event.add( this, type, fn || data, fn && data );
+		});
+	},
+	one: function( type, data, fn ) {
+		return this.each(function(){
+			jQuery.event.add( this, type, function(event) {
+				jQuery(this).unbind(event);
+				return (fn || data).apply( this, arguments);
+			}, fn && data);
+		});
+	},
+	unbind: function( type, fn ) {
+		return this.each(function(){
+			jQuery.event.remove( this, type, fn );
+		});
+	},
+	trigger: function( type, data ) {
+		return this.each(function(){
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	toggle: function() {
+		// Save reference to arguments for access in closure
+		var a = arguments;
+
+		return this.click(function(e) {
+			// Figure out which function to execute
+			this.lastToggle = 0 == this.lastToggle ? 1 : 0;
+			
+			// Make sure that clicks stop
+			e.preventDefault();
+			
+			// and execute the function
+			return a[this.lastToggle].apply( this, [e] ) || false;
+		});
+	},
+	hover: function(f,g) {
+		
+		// A private function for handling mouse 'hovering'
+		function handleHover(e) {
+			// Check if mouse(over|out) are still within the same parent element
+			var p = e.relatedTarget;
+	
+			// Traverse up the tree
+			while ( p && p != this ) try { p = p.parentNode } catch(e) { p = this; };
+			
+			// If we actually just moused on to a sub-element, ignore it
+			if ( p == this ) return false;
+			
+			// Execute the right function
+			return (e.type == "mouseover" ? f : g).apply(this, [e]);
+		}
+		
+		// Bind the function to the two event listeners
+		return this.mouseover(handleHover).mouseout(handleHover);
+	},
+	ready: function(f) {
+		// If the DOM is already ready
+		if ( jQuery.isReady )
+			// Execute the function immediately
+			f.apply( document, [jQuery] );
+			
+		// Otherwise, remember the function for later
+		else
+			// Add the function to the wait list
+			jQuery.readyList.push( function() { return f.apply(this, [jQuery]) } );
+	
+		return this;
+	}
+});
+
+jQuery.extend({
+	/*
+	 * All the code that makes DOM Ready work nicely.
+	 */
+	isReady: false,
+	readyList: [],
+	
+	// Handle when the DOM is ready
+	ready: function() {
+		// Make sure that the DOM is not already loaded
+		if ( !jQuery.isReady ) {
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+			
+			// If there are functions bound, to execute
+			if ( jQuery.readyList ) {
+				// Execute all of them
+				jQuery.each( jQuery.readyList, function(){
+					this.apply( document );
+				});
+				
+				// Reset the list of functions
+				jQuery.readyList = null;
+			}
+			// Remove event listener to avoid memory leak
+			if ( jQuery.browser.mozilla || jQuery.browser.opera )
+				document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
+			
+			// Remove script element used by IE hack
+			if( !window.frames.length ) // don't remove if frames are present (#1187)
+				jQuery(window).load(function(){ jQuery("#__ie_init").remove(); });
+		}
+	}
+});
+
+new function(){
+
+	jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
+		"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + 
+		"submit,keydown,keypress,keyup,error").split(","), function(i,o){
+		
+		// Handle event binding
+		jQuery.fn[o] = function(f){
+			return f ? this.bind(o, f) : this.trigger(o);
+		};
+			
+	});
+	
+	// If Mozilla is used
+	if ( jQuery.browser.mozilla || jQuery.browser.opera )
+		// Use the handy event callback
+		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
+	
+	// If IE is used, use the excellent hack by Matthias Miller
+	// http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
+	else if ( jQuery.browser.msie ) {
+	
+		// Only works if you document.write() it
+		document.write("<scr" + "ipt id=__ie_init defer=true " + 
+			"src=//:><\/script>");
+	
+		// Use the defer script hack
+		var script = document.getElementById("__ie_init");
+		
+		// script does not exist if jQuery is loaded dynamically
+		if ( script ) 
+			script.onreadystatechange = function() {
+				if ( this.readyState != "complete" ) return;
+				jQuery.ready();
+			};
+	
+		// Clear from memory
+		script = null;
+	
+	// If Safari  is used
+	} else if ( jQuery.browser.safari )
+		// Continually check to see if the document.readyState is valid
+		jQuery.safariTimer = setInterval(function(){
+			// loaded and complete are both valid states
+			if ( document.readyState == "loaded" || 
+				document.readyState == "complete" ) {
+	
+				// If either one are found, remove the timer
+				clearInterval( jQuery.safariTimer );
+				jQuery.safariTimer = null;
+	
+				// and execute any waiting functions
+				jQuery.ready();
+			}
+		}, 10); 
+
+	// A fallback to window.onload, that will always work
+	jQuery.event.add( window, "load", jQuery.ready );
+	
+};
+
+// Clean up after IE to avoid memory leaks
+if (jQuery.browser.msie)
+	jQuery(window).one("unload", function() {
+		var global = jQuery.event.global;
+		for ( var type in global ) {
+			var els = global[type], i = els.length;
+			if ( i && type != 'unload' )
+				do
+					els[i-1] && jQuery.event.remove(els[i-1], type);
+				while (--i);
+		}
+	});
+jQuery.fn.extend({
+	loadIfModified: function( url, params, callback ) {
+		this.load( url, params, callback, 1 );
+	},
+	load: function( url, params, callback, ifModified ) {
+		if ( jQuery.isFunction( url ) )
+			return this.bind("load", url);
+
+		callback = callback || function(){};
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params )
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = null;
+
+			// Otherwise, build a param string
+			} else {
+				params = jQuery.param( params );
+				type = "POST";
+			}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			data: params,
+			ifModified: ifModified,
+			complete: function(res, status){
+				if ( status == "success" || !ifModified && status == "notmodified" )
+					// Inject the HTML into all the matched elements
+					self.attr("innerHTML", res.responseText)
+					  // Execute all the scripts inside of the newly-injected HTML
+					  .evalScripts()
+					  // Execute callback
+					  .each( callback, [res.responseText, status, res] );
+				else
+					callback.apply( self, [res.responseText, status, res] );
+			}
+		});
+		return this;
+	},
+	serialize: function() {
+		return jQuery.param( this );
+	},
+	evalScripts: function() {
+		return this.find("script").each(function(){
+			if ( this.src )
+				jQuery.getScript( this.src );
+			else
+				jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" );
+		}).end();
+	}
+
+});
+
+// Attach a bunch of functions for handling common AJAX events
+
+jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
+	jQuery.fn[o] = function(f){
+		return this.bind(o, f);
+	};
+});
+
+jQuery.extend({
+	get: function( url, data, callback, type, ifModified ) {
+		// shift arguments if data argument was ommited
+		if ( jQuery.isFunction( data ) ) {
+			callback = data;
+			data = null;
+		}
+		
+		return jQuery.ajax({
+			type: "GET",
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type,
+			ifModified: ifModified
+		});
+	},
+	getIfModified: function( url, data, callback, type ) {
+		return jQuery.get(url, data, callback, type, 1);
+	},
+	getScript: function( url, callback ) {
+		return jQuery.get(url, null, callback, "script");
+	},
+	getJSON: function( url, data, callback ) {
+		return jQuery.get(url, data, callback, "json");
+	},
+	post: function( url, data, callback, type ) {
+		if ( jQuery.isFunction( data ) ) {
+			callback = data;
+			data = {};
+		}
+
+		return jQuery.ajax({
+			type: "POST",
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	},
+	ajaxTimeout: function( timeout ) {
+		jQuery.ajaxSettings.timeout = timeout;
+	},
+	ajaxSetup: function( settings ) {
+		jQuery.extend( jQuery.ajaxSettings, settings );
+	},
+
+	ajaxSettings: {
+		global: true,
+		type: "GET",
+		timeout: 0,
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		data: null
+	},
+	
+	// Last-Modified header cache for next request
+	lastModified: {},
+	ajax: function( s ) {
+		// TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
+		s = jQuery.extend({}, jQuery.ajaxSettings, s);
+
+		// if data available
+		if ( s.data ) {
+			// convert data if not already a string
+			if (s.processData && typeof s.data != "string")
+    			s.data = jQuery.param(s.data);
+			// append data to url for get requests
+			if( s.type.toLowerCase() == "get" ) {
+				// "?" + data or "&" + data (in case there are already params)
+				s.url += ((s.url.indexOf("?") > -1) ? "&" : "?") + s.data;
+				// IE likes to send both get and post data, prevent this
+				s.data = null;
+			}
+		}
+
+		// Watch for a new set of requests
+		if ( s.global && ! jQuery.active++ )
+			jQuery.event.trigger( "ajaxStart" );
+
+		var requestDone = false;
+
+		// Create the request object; Microsoft failed to properly
+		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
+		var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
+
+		// Open the socket
+		xml.open(s.type, s.url, s.async);
+
+		// Set the correct header, if data is being sent
+		if ( s.data )
+			xml.setRequestHeader("Content-Type", s.contentType);
+
+		// Set the If-Modified-Since header, if ifModified mode.
+		if ( s.ifModified )
+			xml.setRequestHeader("If-Modified-Since",
+				jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
+
+		// Set header so the called script knows that it's an XMLHttpRequest
+		xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+
+		// Allow custom headers/mimetypes
+		if( s.beforeSend )
+			s.beforeSend(xml);
+			
+		if ( s.global )
+		    jQuery.event.trigger("ajaxSend", [xml, s]);
+
+		// Wait for a response to come back
+		var onreadystatechange = function(isTimeout){
+			// The transfer is complete and the data is available, or the request timed out
+			if ( xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
+				requestDone = true;
+				
+				// clear poll interval
+				if (ival) {
+					clearInterval(ival);
+					ival = null;
+				}
+				
+				var status;
+				try {
+					status = jQuery.httpSuccess( xml ) && isTimeout != "timeout" ?
+						s.ifModified && jQuery.httpNotModified( xml, s.url ) ? "notmodified" : "success" : "error";
+					// Make sure that the request was successful or notmodified
+					if ( status != "error" ) {
+						// Cache Last-Modified header, if ifModified mode.
+						var modRes;
+						try {
+							modRes = xml.getResponseHeader("Last-Modified");
+						} catch(e) {} // swallow exception thrown by FF if header is not available
+	
+						if ( s.ifModified && modRes )
+							jQuery.lastModified[s.url] = modRes;
+	
+						// process the data (runs the xml through httpData regardless of callback)
+						var data = jQuery.httpData( xml, s.dataType );
+	
+						// If a local callback was specified, fire it and pass it the data
+						if ( s.success )
+							s.success( data, status );
+	
+						// Fire the global callback
+						if( s.global )
+							jQuery.event.trigger( "ajaxSuccess", [xml, s] );
+					} else
+						jQuery.handleError(s, xml, status);
+				} catch(e) {
+					status = "error";
+					jQuery.handleError(s, xml, status, e);
+				}
+
+				// The request was completed
+				if( s.global )
+					jQuery.event.trigger( "ajaxComplete", [xml, s] );
+
+				// Handle the global AJAX counter
+				if ( s.global && ! --jQuery.active )
+					jQuery.event.trigger( "ajaxStop" );
+
+				// Process result
+				if ( s.complete )
+					s.complete(xml, status);
+
+				// Stop memory leaks
+				if(s.async)
+					xml = null;
+			}
+		};
+		
+		// don't attach the handler to the request, just poll it instead
+		var ival = setInterval(onreadystatechange, 13); 
+
+		// Timeout checker
+		if ( s.timeout > 0 )
+			setTimeout(function(){
+				// Check to see if the request is still happening
+				if ( xml ) {
+					// Cancel the request
+					xml.abort();
+
+					if( !requestDone )
+						onreadystatechange( "timeout" );
+				}
+			}, s.timeout);
+			
+		// Send the data
+		try {
+			xml.send(s.data);
+		} catch(e) {
+			jQuery.handleError(s, xml, null, e);
+		}
+		
+		// firefox 1.5 doesn't fire statechange for sync requests
+		if ( !s.async )
+			onreadystatechange();
+		
+		// return XMLHttpRequest to allow aborting the request etc.
+		return xml;
+	},
+
+	handleError: function( s, xml, status, e ) {
+		// If a local callback was specified, fire it
+		if ( s.error ) s.error( xml, status, e );
+
+		// Fire the global callback
+		if ( s.global )
+			jQuery.event.trigger( "ajaxError", [xml, s, e] );
+	},
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Determines if an XMLHttpRequest was successful or not
+	httpSuccess: function( r ) {
+		try {
+			return !r.status && location.protocol == "file:" ||
+				( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
+				jQuery.browser.safari && r.status == undefined;
+		} catch(e){}
+		return false;
+	},
+
+	// Determines if an XMLHttpRequest returns NotModified
+	httpNotModified: function( xml, url ) {
+		try {
+			var xmlRes = xml.getResponseHeader("Last-Modified");
+
+			// Firefox always returns 200. check Last-Modified date
+			return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
+				jQuery.browser.safari && xml.status == undefined;
+		} catch(e){}
+		return false;
+	},
+
+	/* Get the data out of an XMLHttpRequest.
+	 * Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
+	 * otherwise return plain text.
+	 * (String) data - The type of data that you're expecting back,
+	 * (e.g. "xml", "html", "script")
+	 */
+	httpData: function( r, type ) {
+		var ct = r.getResponseHeader("content-type");
+		var data = !type && ct && ct.indexOf("xml") >= 0;
+		data = type == "xml" || data ? r.responseXML : r.responseText;
+
+		// If the type is "script", eval it in global context
+		if ( type == "script" )
+			jQuery.globalEval( data );
+
+		// Get the JavaScript object, if JSON is used.
+		if ( type == "json" )
+			data = eval("(" + data + ")");
+
+		// evaluate scripts within html
+		if ( type == "html" )
+			jQuery("<div>").html(data).evalScripts();
+
+		return data;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a ) {
+		var s = [];
+
+		// If an array was passed in, assume that it is an array
+		// of form elements
+		if ( a.constructor == Array || a.jquery )
+			// Serialize the form elements
+			jQuery.each( a, function(){
+				s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
+			});
+
+		// Otherwise, assume that it's an object of key/value pairs
+		else
+			// Serialize the key/values
+			for ( var j in a )
+				// If the value is an array then the key names need to be repeated
+				if ( a[j] && a[j].constructor == Array )
+					jQuery.each( a[j], function(){
+						s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
+					});
+				else
+					s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
+
+		// Return the resulting serialization
+		return s.join("&");
+	},
+	
+	// evalulates a script in global context
+	// not reliable for safari
+	globalEval: function( data ) {
+		if ( window.execScript )
+			window.execScript( data );
+		else if ( jQuery.browser.safari )
+			// safari doesn't provide a synchronous global eval
+			window.setTimeout( data, 0 );
+		else
+			eval.call( window, data );
+	}
+
+});
+jQuery.fn.extend({
+
+	show: function(speed,callback){
+		return speed ?
+			this.animate({
+				height: "show", width: "show", opacity: "show"
+			}, speed, callback) :
+			
+			this.filter(":hidden").each(function(){
+				this.style.display = this.oldblock ? this.oldblock : "";
+				if ( jQuery.css(this,"display") == "none" )
+					this.style.display = "block";
+			}).end();
+	},
+
+	hide: function(speed,callback){
+		return speed ?
+			this.animate({
+				height: "hide", width: "hide", opacity: "hide"
+			}, speed, callback) :
+			
+			this.filter(":visible").each(function(){
+				this.oldblock = this.oldblock || jQuery.css(this,"display");
+				if ( this.oldblock == "none" )
+					this.oldblock = "block";
+				this.style.display = "none";
+			}).end();
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+	toggle: function( fn, fn2 ){
+		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
+			this._toggle( fn, fn2 ) :
+			fn ?
+				this.animate({
+					height: "toggle", width: "toggle", opacity: "toggle"
+				}, fn, fn2) :
+				this.each(function(){
+					jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
+				});
+	},
+	slideDown: function(speed,callback){
+		return this.animate({height: "show"}, speed, callback);
+	},
+	slideUp: function(speed,callback){
+		return this.animate({height: "hide"}, speed, callback);
+	},
+	slideToggle: function(speed, callback){
+		return this.animate({height: "toggle"}, speed, callback);
+	},
+	fadeIn: function(speed, callback){
+		return this.animate({opacity: "show"}, speed, callback);
+	},
+	fadeOut: function(speed, callback){
+		return this.animate({opacity: "hide"}, speed, callback);
+	},
+	fadeTo: function(speed,to,callback){
+		return this.animate({opacity: to}, speed, callback);
+	},
+	animate: function( prop, speed, easing, callback ) {
+		return this.queue(function(){
+			var hidden = jQuery(this).is(":hidden"),
+				opt = jQuery.speed(speed, easing, callback),
+				self = this;
+			
+			for ( var p in prop ) {
+				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
+					return jQuery.isFunction(opt.complete) && opt.complete.apply(this);
+
+				if ( p == "height" || p == "width" ) {
+					// Store display property
+					opt.display = jQuery.css(this, "display");
+
+					// Make sure that nothing sneaks out
+					opt.overflow = this.style.overflow;
+				}
+			}
+
+			if ( opt.overflow != null )
+				this.style.overflow = "hidden";
+
+			this.curAnim = jQuery.extend({}, prop);
+			
+			jQuery.each( prop, function(name, val){
+				var e = new jQuery.fx( self, opt, name );
+				if ( val.constructor == Number )
+					e.custom( e.cur(), val );
+				else
+					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+			});
+		});
+	},
+	queue: function(type,fn){
+		if ( !fn ) {
+			fn = type;
+			type = "fx";
+		}
+	
+		return this.each(function(){
+			if ( !this.queue )
+				this.queue = {};
+	
+			if ( !this.queue[type] )
+				this.queue[type] = [];
+	
+			this.queue[type].push( fn );
+		
+			if ( this.queue[type].length == 1 )
+				fn.apply(this);
+		});
+	}
+
+});
+
+jQuery.extend({
+	
+	speed: function(speed, easing, fn) {
+		var opt = speed && speed.constructor == Object ? speed : {
+			complete: fn || !fn && easing || 
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && easing.constructor != Function && easing || (jQuery.easing.swing ? "swing" : "linear")
+		};
+
+		opt.duration = (opt.duration && opt.duration.constructor == Number ? 
+			opt.duration : 
+			{ slow: 600, fast: 200 }[opt.duration]) || 400;
+	
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function(){
+			jQuery.dequeue(this, "fx");
+			if ( jQuery.isFunction( opt.old ) )
+				opt.old.apply( this );
+		};
+	
+		return opt;
+	},
+	
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+	
+	queue: {},
+	
+	dequeue: function(elem,type){
+		type = type || "fx";
+	
+		if ( elem.queue && elem.queue[type] ) {
+			// Remove self
+			elem.queue[type].shift();
+	
+			// Get next function
+			var f = elem.queue[type][0];
+		
+			if ( f ) f.apply( elem );
+		}
+	},
+
+	timers: [],
+
+	/*
+	 * I originally wrote fx() as a clone of moo.fx and in the process
+	 * of making it small in size the code became illegible to sane
+	 * people. You've been warned.
+	 */
+	
+	fx: function( elem, options, prop ){
+
+		var z = this;
+
+		// The styles
+		var y = elem.style;
+		
+		// Simple function for setting a style value
+		z.a = function(){
+			if ( options.step )
+				options.step.apply( elem, [ z.now ] );
+
+			if ( prop == "opacity" )
+				jQuery.attr(y, "opacity", z.now); // Let attr handle opacity
+			else {
+				y[prop] = parseInt(z.now) + "px";
+				y.display = "block"; // Set display property to block for animation
+			}
+		};
+
+		// Figure out the maximum number to run to
+		z.max = function(){
+			return parseFloat( jQuery.css(elem,prop) );
+		};
+
+		// Get the current size
+		z.cur = function(){
+			var r = parseFloat( jQuery.curCSS(elem, prop) );
+			return r && r > -10000 ? r : z.max();
+		};
+
+		// Start an animation from one number to another
+		z.custom = function(from,to){
+			z.startTime = (new Date()).getTime();
+			z.now = from;
+			z.a();
+
+			jQuery.timers.push(function(){
+				return z.step(from, to);
+			});
+
+			if ( jQuery.timers.length == 1 ) {
+				var timer = setInterval(function(){
+					var timers = jQuery.timers;
+					
+					for ( var i = 0; i < timers.length; i++ )
+						if ( !timers[i]() )
+							timers.splice(i--, 1);
+
+					if ( !timers.length )
+						clearInterval( timer );
+				}, 13);
+			}
+		};
+
+		// Simple 'show' function
+		z.show = function(){
+			if ( !elem.orig ) elem.orig = {};
+
+			// Remember where we started, so that we can go back to it later
+			elem.orig[prop] = jQuery.attr( elem.style, prop );
+
+			options.show = true;
+
+			// Begin the animation
+			z.custom(0, this.cur());
+
+			// Make sure that we start at a small width/height to avoid any
+			// flash of content
+			if ( prop != "opacity" )
+				y[prop] = "1px";
+			
+			// Start by showing the element
+			jQuery(elem).show();
+		};
+
+		// Simple 'hide' function
+		z.hide = function(){
+			if ( !elem.orig ) elem.orig = {};
+
+			// Remember where we started, so that we can go back to it later
+			elem.orig[prop] = jQuery.attr( elem.style, prop );
+
+			options.hide = true;
+
+			// Begin the animation
+			z.custom(this.cur(), 0);
+		};
+
+		// Each step of an animation
+		z.step = function(firstNum, lastNum){
+			var t = (new Date()).getTime();
+
+			if (t > options.duration + z.startTime) {
+				z.now = lastNum;
+				z.a();
+
+				if (elem.curAnim) elem.curAnim[ prop ] = true;
+
+				var done = true;
+				for ( var i in elem.curAnim )
+					if ( elem.curAnim[i] !== true )
+						done = false;
+
+				if ( done ) {
+					if ( options.display != null ) {
+						// Reset the overflow
+						y.overflow = options.overflow;
+					
+						// Reset the display
+						y.display = options.display;
+						if ( jQuery.css(elem, "display") == "none" )
+							y.display = "block";
+					}
+
+					// Hide the element if the "hide" operation was done
+					if ( options.hide )
+						y.display = "none";
+
+					// Reset the properties, if the item has been hidden or shown
+					if ( options.hide || options.show )
+						for ( var p in elem.curAnim )
+							jQuery.attr(y, p, elem.orig[p]);
+				}
+
+				// If a callback was provided, execute it
+				if ( done && jQuery.isFunction( options.complete ) )
+					// Execute the complete function
+					options.complete.apply( elem );
+
+				return false;
+			} else {
+				var n = t - this.startTime;
+				// Figure out where in the animation we are and set the number
+				var p = n / options.duration;
+				
+				// Perform the easing function, defaults to swing
+				z.now = jQuery.easing[options.easing](p, n, firstNum, (lastNum-firstNum), options.duration);
+
+				// Perform the next step of the animation
+				z.a();
+			}
+
+			return true;
+		};
+	
+	}
+});
+}

Added: jifty/branches/virtual-models/share/plugins/Jifty/Plugin/JQuery/web/static/js/noConflict.js
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/share/plugins/Jifty/Plugin/JQuery/web/static/js/noConflict.js	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,4 @@
+/**
+ * noConflict.js - Tell jQuery not to clobber $()
+ */
+jQuery.noConflict();

Modified: jifty/branches/virtual-models/share/po/zh_cn.po
==============================================================================
--- jifty/branches/virtual-models/share/po/zh_cn.po	(original)
+++ jifty/branches/virtual-models/share/po/zh_cn.po	Tue Sep 11 14:03:32 2007
@@ -7,8 +7,8 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: 2007-01-23 16:55+08\n"
-"Last-Translator: Agent Zhang <agentzh at gmail.com>\n"
+"PO-Revision-Date: 2007-08-24 10:33+08\n"
+"Last-Translator: sunnavy <sunnavy at gmail.com>\n"
 "Language-Team: Simplified Chinese\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -338,19 +338,19 @@
 
 #: lib/Jifty/Plugin/User/Mixin/Model/User.pm:89
 msgid "It looks like somebody else is using that address. Is there a chance you have another account?"
-msgstr ""
+msgstr "已经有人使用了这个地址,会不会是因为您还有另外一个账号?"
 
 #: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:75
 msgid "It looks like you already have an account. Perhaps you want to <a href=\"/login\">log in</a> instead?"
-msgstr ""
+msgstr "您已经有了一个账号了,或许您是想<a href=\"/login\">登录</a>?"
 
 #: lib/Jifty/Plugin/Authentication/Password/Action/ResetLostPassword.pm:75
 msgid "It looks like you didn't enter the same password into both boxes. Give it another shot?"
-msgstr ""
+msgstr "两次输入的密码不同. 再试一次?"
 
 #: lib/Jifty/Plugin/Authentication/Password/Action/SendAccountConfirmation.pm:82
 msgid "It looks like you're already confirmed."
-msgstr ""
+msgstr "您已经确认过了."
 
 #:
 msgid "Jifty Administrative Console"
@@ -546,11 +546,11 @@
 #: lib/Jifty/Plugin/Authentication/Password/Action/Signup.pm:108
 #. ($msg)
 msgid "Something bad happened and we couldn't create your account: %1"
-msgstr ""
+msgstr "出了一点问题,我们不能创建您的账号: %1"
 
 #: lib/Jifty/Plugin/ErrorTemplates/View.pm:149
 msgid "Something went awry"
-msgstr ""
+msgstr "出了一点岔子"
 
 #: lib/Jifty/Plugin/ErrorTemplates/View.pm:124 share/web/templates/dhandler:1
 msgid "Something's not quite right"
@@ -684,11 +684,11 @@
 
 #: lib/Jifty/Plugin/Authentication/Password/View.pm:98
 msgid "You lost your password. A link to reset it will be sent to the following email address:"
-msgstr ""
+msgstr "您忘记了密码. 重置密码的链接将被发送到以下的电子信箱中:"
 
 #: lib/Jifty/Plugin/Authentication/Password/View.pm:115
 msgid "You lost your password. A reminder will be send to the following mail:"
-msgstr ""
+msgstr "您忘记了密码. 密码提醒将被发送到以下的电子信箱中:"
 
 #: lib/Jifty/Plugin/Authentication/Password/Action/Login.pm:152
 msgid "You may have mistyped your email address or password. Give it another shot."

Modified: jifty/branches/virtual-models/share/web/static/css/autocomplete.css
==============================================================================
--- jifty/branches/virtual-models/share/web/static/css/autocomplete.css	(original)
+++ jifty/branches/virtual-models/share/web/static/css/autocomplete.css	Tue Sep 11 14:03:32 2007
@@ -22,6 +22,7 @@
     color: white;
 }
 
+div.inline .autocomplete .hidden_value,
 .autocomplete .hidden_value {
     display: none;
 }

Modified: jifty/branches/virtual-models/share/web/static/js/calendar.js
==============================================================================
--- jifty/branches/virtual-models/share/web/static/js/calendar.js	(original)
+++ jifty/branches/virtual-models/share/web/static/js/calendar.js	Tue Sep 11 14:03:32 2007
@@ -67,7 +67,7 @@
         cal.cfg.fireQueue();
         
         cal.selectEvent.subscribe( Jifty.Calendar.handleSelect, { event: ev, calendar: cal }, true );
-        cal.changePageEvent.subscribe( function() { Jifty.Calendar._blurredCalendar = null; }, null, false );
+        cal.changePageEvent.subscribe( function() { setTimeout( function() { Jifty.Calendar._blurredCalendar = null; }, 75 ) }, null, false );
         
         cal.render();
 

Modified: jifty/branches/virtual-models/share/web/static/js/jifty.js
==============================================================================
--- jifty/branches/virtual-models/share/web/static/js/jifty.js	(original)
+++ jifty/branches/virtual-models/share/web/static/js/jifty.js	Tue Sep 11 14:03:32 2007
@@ -311,7 +311,7 @@
         hide_wait_message();
     },
 
-    disable_input_fields: function() {
+    disable_input_fields: function(disabled_elements) {
         var disable = function() {
             var elt = arguments[0];
             // Disabling hidden elements seems to  make IE sad for some reason
@@ -319,6 +319,7 @@
                 // Triggers https://bugzilla.mozilla.org/show_bug.cgi?id=236791
                 elt.blur();
                 elt.disabled = true;
+                disabled_elements.push(elt);
             }
         };
         this.fields().each(disable);
@@ -1009,6 +1010,9 @@
     // The YAML/JSON data structure that will be sent
     var request = $H();
 
+    // Keep track of disabled elements
+    var disabled_elements = $A();
+
     // Set request base path
     request['path'] = '/__jifty/webservices/xml';
 
@@ -1044,7 +1048,7 @@
             if (a.hasUpload())
                 return true;
             if(disable) {
-                a.disable_input_fields();
+                a.disable_input_fields(disabled_elements);
             }
             request['actions'][moniker] = a.data_structure();
             ++has_request;
@@ -1154,6 +1158,11 @@
 				      }
 			      }});
 	    }});
+
+        for ( var i = 0; i < disabled_elements.length; i++ ) {
+            disabled_elements[i].disabled = false;
+        }
+
 	// empty known action. XXX: we should only need to discard actions being submitted
 
         // Loop through the result looking for it
@@ -1195,10 +1204,8 @@
 
         Jifty.failedRequest = transport;
 
-        var keys = request["actions"].keys();
-        for ( var i = 0; i < keys.length; i++ ) {
-            var a = new Action( request["actions"][ keys[i] ].moniker );
-            a.enable_input_fields();
+        for ( var i = 0; i < disabled_elements.length; i++ ) {
+            disabled_elements[i].disabled = false;
         }
     };
 
@@ -1482,3 +1489,15 @@
         return true;
     }
 }
+
+function _sp_submit_form(elt, event, submit_to) {
+    var form = Form.Element.getForm(elt);
+    var elements = Form.getElements(form);
+
+    var args = {};
+    for (var i = 0; i < elements.length; i++)
+	args[elements[i].name] = $F(elements[i]);
+
+    if(event.ctrlKey||event.metaKey||event.altKey||event.shiftKey) return true;
+    return update( {'continuation':{},'actions':null,'fragments':[{'mode':'Replace','args':args,'region':'__page','path': submit_to}]}, elt );
+}

Modified: jifty/branches/virtual-models/share/web/templates/autohandler
==============================================================================
--- jifty/branches/virtual-models/share/web/templates/autohandler	(original)
+++ jifty/branches/virtual-models/share/web/templates/autohandler	Tue Sep 11 14:03:32 2007
@@ -1,9 +1,11 @@
 <%init>
 $r->content_type('text/html; charset=utf-8');
 
-if ($m->base_comp->path =~ m|/_elements/|) {
+# XXX FIXME See Jifty::View::Mason::Handler for the source of this puke.
+use vars qw/ $jifty_internal_request /;
+if (!$jifty_internal_request && $m->base_comp->path =~ m|/_elements/|) {
     # Requesting an internal component by hand -- naughty
-    $m->redirect("/errors/requested_private_component");
+    $m->redirect('/__jifty/error/requested_private_component');
 }
 $m->comp('/_elements/nav');
 $m->call_next();

Modified: jifty/branches/virtual-models/t/01-dependencies.t
==============================================================================
--- jifty/branches/virtual-models/t/01-dependencies.t	(original)
+++ jifty/branches/virtual-models/t/01-dependencies.t	Tue Sep 11 14:03:32 2007
@@ -21,6 +21,7 @@
     return unless -f $_;
     return if $File::Find::dir =~ m!/.svn($|/)!;
     return if $File::Find::name =~ /~$/;
+    return if $File::Find::name =~ /generate-changelog/;
     return if $File::Find::name =~ /\.(pod|html)$/;
     
     # read in the file from disk

Modified: jifty/branches/virtual-models/t/DateTime.t
==============================================================================
--- jifty/branches/virtual-models/t/DateTime.t	(original)
+++ jifty/branches/virtual-models/t/DateTime.t	Tue Sep 11 14:03:32 2007
@@ -1,9 +1,27 @@
 #!/usr/bin/perl -w
 
-use Jifty::Test tests => 2;
+use Jifty::Test tests => 8;
 
 use_ok 'Jifty::DateTime';
 
 my $date = Jifty::DateTime->new_from_string("2006-05-03 01:23:45");
 my $date_clone = $date->clone();
 is $date, $date_clone;
+
+is $date->friendly_date, '2006-05-03';
+
+$date = Jifty::DateTime->now;
+is $date->friendly_date, 'today';
+
+$date = Jifty::DateTime->now->subtract(days => 1);
+is $date->friendly_date, 'yesterday';
+
+$date = Jifty::DateTime->now->subtract(days => 2);
+like $date->friendly_date, qr/^\d\d\d\d-\d\d-\d\d$/;
+
+$date = Jifty::DateTime->now->add(days => 1);
+is $date->friendly_date, 'tomorrow';
+
+$date = Jifty::DateTime->now->add(days => 2);
+like $date->friendly_date, qr/^\d\d\d\d-\d\d-\d\d$/;
+

Modified: jifty/branches/virtual-models/t/TestApp-Plugin-Chart/t/chart.t
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-Plugin-Chart/t/chart.t	(original)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-Chart/t/chart.t	Tue Sep 11 14:03:32 2007
@@ -6,13 +6,8 @@
 
 # XXX FIXME This is here to prevent a segfault on my machine during testing.
 #   -- sterling
-use GD;
-
-use Jifty::SubTest;
-use Jifty::Test;
-use Jifty::Test::WWW::Mechanize;
-
-eval "use Chart::Pie";
+use Test::More;
+eval "use GD; use Chart::pie; 1";
 if ($@) {
     plan skip_all => 'Chart is not installed.';
 }
@@ -20,6 +15,10 @@
     plan tests => 9;
 }
 
+use Jifty::SubTest;
+use Jifty::Test;
+use Jifty::Test::WWW::Mechanize;
+
 use Jifty::Plugin::Chart::Renderer::Chart;
 
 my $chart_plugin = (Jifty->find_plugin('Jifty::Plugin::Chart'))[0];

Modified: jifty/branches/virtual-models/t/TestApp-Plugin-Chart/t/gd_graph.t
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-Plugin-Chart/t/gd_graph.t	(original)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-Chart/t/gd_graph.t	Tue Sep 11 14:03:32 2007
@@ -6,13 +6,8 @@
 
 # XXX FIXME This is here to prevent a segfault on my machine during testing.
 #   -- sterling
-use GD;
-
-use Jifty::SubTest;
-use Jifty::Test;
-use Jifty::Test::WWW::Mechanize;
-
-eval "use GD::Graph::pie";
+use Test::More;
+eval "use GD; use GD::Graph::pie; 1";
 if ($@) {
     plan skip_all => 'GD::Graph is not installed.';
 }
@@ -20,6 +15,10 @@
     plan tests => 9;
 }
 
+use Jifty::SubTest;
+use Jifty::Test;
+use Jifty::Test::WWW::Mechanize;
+
 use Jifty::Plugin::Chart::Renderer::GD::Graph;
 
 my $chart_plugin = (Jifty->find_plugin('Jifty::Plugin::Chart'))[0];

Added: jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/Makefile.PL
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/Makefile.PL	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,7 @@
+use inc::Module::Install;
+
+name        'TestApp::Plugin::JQuery';
+version     '0.01';
+requires    'Jifty' => '0.70129';
+
+WriteAll;

Added: jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/bin/jifty
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/bin/jifty	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,11 @@
+#!/usr/bin/env perl
+use warnings;
+use strict;
+use File::Basename qw(dirname); 
+use UNIVERSAL::require;
+
+use Jifty;
+use Jifty::Script;
+
+local $SIG{INT} = sub { warn "Stopped\n"; exit; };
+Jifty::Script->dispatch();

Added: jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/etc/config.yml
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/etc/config.yml	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,54 @@
+--- 
+framework: 
+  AdminMode: 1
+  ApplicationClass: TestApp::Plugin::JQuery
+  ApplicationName: TestApp::Plugin::JQuery
+  ApplicationUUID: DC3B58E4-4F3C-11DC-9ECB-E5DB6F105772
+  ConfigFileVersion: 2
+  Database: 
+    CheckSchema: 1
+    Database: testapp_plugin_jquery
+    Driver: SQLite
+    Host: localhost
+    Password: ''
+    RecordBaseClass: Jifty::DBI::Record::Cachable
+    RecordUUIDs: active
+    User: ''
+    Version: 0.0.1
+  DevelMode: 1
+  L10N: 
+    PoDir: share/po
+  LogLevel: INFO
+  Mailer: Sendmail
+  MailerArgs: []
+
+  Plugins: 
+    - LetMe: {}
+    - SkeletonApp: {}
+    - REST: {}
+    - Halo: {}
+    - ErrorTemplates: {}
+    - OnlineDocs: {}
+    - CompressedCSSandJS: {}
+    - AdminUI: {}
+    - JQuery: {}
+
+  PubSub: 
+    Backend: Memcached
+    Enable: ~
+  SkipAccessControl: 0
+  TemplateClass: TestApp::Plugin::JQuery::View
+  Web: 
+    BaseURL: http://localhost
+    DataDir: var/mason
+    Globals: []
+
+    MasonConfig: 
+      autoflush: 0
+      default_escape_flags: h
+      error_format: text
+      error_mode: fatal
+    Port: 8888
+    ServeStaticFiles: 1
+    StaticRoot: share/web/static
+    TemplateRoot: share/web/templates

Added: jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/t/jquery.t
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-JQuery/t/jquery.t	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,28 @@
+use strict;
+use warnings;
+
+use lib 't/lib';
+use Jifty::SubTest;
+use Jifty::Test tests => 9;
+use Jifty::Test::WWW::Mechanize;
+
+my $server = Jifty::Test->make_server;
+ok($server, 'got a server');
+
+my $url = $server->started_ok;
+
+my $mech = Jifty::Test::WWW::Mechanize->new;
+
+$mech->get_ok($url);
+my ($script) = $mech->content =~ m{<script type="text/javascript" src="([^"]+)"></script>};
+ok($script, "Found the script tag.");
+
+$mech->get_ok($url . $script, "Fetched $url$script");
+$mech->content_like(qr/^ \* jQuery (?:[\d\.]+) - New Wave Javascript/m,
+    "Found the start of the jQuery script");
+$mech->content_like(qr/^var jQuery = function\(/m, 
+    "Found the main jQuery declaration");
+$mech->content_like(qr/^ \* noConflict.js/m, 
+    "Found the start of the noConflict script");
+$mech->content_like(qr/^jQuery\.noConflict\(\);/m, 
+    "Found the call to noConflict()");

Added: jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/Makefile.PL
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/Makefile.PL	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,7 @@
+use inc::Module::Install;
+
+name        'TestApp::Plugin::JQuery';
+version     '0.01';
+requires    'Jifty' => '0.70129';
+
+WriteAll;

Added: jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/bin/jifty
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/bin/jifty	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,11 @@
+#!/usr/bin/env perl
+use warnings;
+use strict;
+use File::Basename qw(dirname); 
+use UNIVERSAL::require;
+
+use Jifty;
+use Jifty::Script;
+
+local $SIG{INT} = sub { warn "Stopped\n"; exit; };
+Jifty::Script->dispatch();

Added: jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/etc/config.yml
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/etc/config.yml	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,55 @@
+--- 
+framework: 
+  AdminMode: 1
+  ApplicationClass: TestApp::Plugin::SinglePage
+  ApplicationName: TestApp::Plugin::SinglePage
+  ApplicationUUID: DC3B58E4-4F3C-11DC-9ECB-E5DB6F105773
+  ConfigFileVersion: 2
+  Database: 
+    CheckSchema: 1
+    Database: testapp_plugin_singlepage
+    Driver: SQLite
+    Host: localhost
+    Password: ''
+    RecordBaseClass: Jifty::DBI::Record::Cachable
+    RecordUUIDs: active
+    User: ''
+    Version: 0.0.1
+  DevelMode: 1
+  L10N: 
+    PoDir: share/po
+  LogLevel: INFO
+  Mailer: Sendmail
+  MailerArgs: []
+
+  Plugins: 
+    - LetMe: {}
+    - SkeletonApp: {}
+    - REST: {}
+    - Halo: {}
+    - ErrorTemplates: {}
+    - OnlineDocs: {}
+    - CompressedCSSandJS: {}
+    - AdminUI: {}
+    - User: {}
+    - SinglePage: {}
+
+  PubSub: 
+    Backend: Memcached
+    Enable: ~
+  SkipAccessControl: 0
+  TemplateClass: TestApp::Plugin::SinglePage::View
+  Web: 
+    BaseURL: http://localhost
+    DataDir: var/mason
+    Globals: []
+
+    MasonConfig: 
+      autoflush: 0
+      default_escape_flags: h
+      error_format: text
+      error_mode: fatal
+    Port: 8888
+    ServeStaticFiles: 1
+    StaticRoot: share/web/static
+    TemplateRoot: share/web/templates

Added: jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/SinglePage/Model/User.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/SinglePage/Model/User.pm	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,14 @@
+package TestApp::Plugin::SinglePage::Model::User;
+use warnings;
+use strict;
+use base qw/TestApp::Plugin::SinglePage::Record/;
+use Jifty::DBI::Schema;
+
+
+use TestApp::Plugin::SinglePage::Record schema {
+};
+
+use Jifty::Plugin::User::Mixin::Model::User;
+
+1;
+

Added: jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/SinglePage/View.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/lib/TestApp/Plugin/SinglePage/View.pm	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,45 @@
+package TestApp::Plugin::SinglePage::View;
+use strict;
+use Jifty::View::Declare -base;
+use Jifty::View::Declare::Helpers;
+
+
+template '/index.html' =>
+    page { title => 'test' }
+    content {
+	with (submit_to => '/page2'),
+	form {
+	    select { { name is 'foo' };
+		     option { { value is $_ }; $_ } for 1..10;
+		 };
+	    form_submit( label => 'Next' );
+	};
+	render_region('random');
+    };
+
+template '/page2' =>
+    page { title => 'page2' }
+    content {
+	my $foo = get('foo');
+	my $create = Jifty->web->new_action( class => 'CreateUser', moniker => 'create_user',
+					     arguments => { name => $foo });
+	my $redir = new_action(class     => "Jifty::Action::Redirect",
+			       arguments => { url => '/index.html' });
+	form {
+	    Jifty->web->form->register_action($redir);
+	    render_action($create);
+	    form_submit( label   => 'Next' );
+	}
+    };
+
+template 'page3' =>
+    page { title => 'page3' }
+    content {
+	h1 { 'yatta' };
+	form {
+	    hyperlink(label => 'Back', url => '/');
+	}
+    };
+
+1;
+

Added: jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/t/statevar.t
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-Plugin-SinglePage/t/statevar.t	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,38 @@
+use strict;
+use warnings;
+use lib 't/lib';
+use Jifty::SubTest;
+use Jifty::Test tests => 6;
+use Jifty::Test::WWW::Selenium;
+use utf8;
+
+my $server  = Jifty::Test->make_server;
+my $sel = Jifty::Test::WWW::Selenium->rc_ok( $server );
+my $URL = $server->started_ok;
+diag $URL;
+
+$sel->open_ok("/");
+$sel->select_ok("foo", "label=4");
+$sel->click_ok("//input[\@value='Next']");
+
+my $html = $sel->get_html_source;
+
+unlike($html, qr'name="J:V-region-__page."');
+diag $html;
+
+$sel->stop;
+
+#$SIG{INT} = sub { exit };
+
+#sleep 100 while 1;
+
+
+exit;
+__END__
+$sel->value_is("J:A:F-name-create_user", "4");
+$sel->type_ok("J:A:F-email-create_user", "orz\@orz.org");
+$sel->open_ok("/");
+$sel->select_ok("foo", "label=4");
+$sel->click_ok("//input[\@value='Next']");
+$sel->value_is("J:A:F-name-create_user", "4");
+$sel->type_ok("J:A:F-email-create_user", "orz\@orz.org");

Modified: jifty/branches/virtual-models/t/TestApp/lib/TestApp/View.pm
==============================================================================
--- jifty/branches/virtual-models/t/TestApp/lib/TestApp/View.pm	(original)
+++ jifty/branches/virtual-models/t/TestApp/lib/TestApp/View.pm	Tue Sep 11 14:03:32 2007
@@ -4,6 +4,8 @@
 
 use Jifty::View::Declare -base;
 
+__PACKAGE__->use_mason_wrapper;
+
 template 'concrete2.html' => sub {
     html {
         body {
@@ -103,4 +105,9 @@
 
     h1 { 'redirected ok'};
 };
+
+template 'use_mason_wrapper' => page {
+    h1 { 'In a Mason Wrapper?' };
+};
+
 1;

Added: jifty/branches/virtual-models/t/TestApp/share/web/templates/_elements/wrapper
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp/share/web/templates/_elements/wrapper	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,38 @@
+<body>
+  <div id="headers">
+    <%Jifty->web->link( url => "/", label => _(Jifty->config->framework('ApplicationName')))%>
+    <h1 class="title"><% _($title) %></h1>
+  </div>
+  <& sidebar &>
+  <div id="content">
+    <a name="content"></a>
+% if (Jifty->config->framework('AdminMode') ) {
+<div class="warning admin_mode">
+<%_('Alert')%>: <% Jifty->web->tangent( label => _('Administration mode is enabled.') , url => '/__jifty/admin/')%>
+</div>
+% }
+  <% Jifty->web->render_messages %>
+  <% $m->content |n%>
+  <& /_elements/keybindings &>
+<div id="custom-stuff">Custom Wrapper</div>
+  </div>
+  <div id="jifty-wait-message" style="display: none"><%_('Loading...')%></div>
+% Jifty::Mason::Halo->render_component_tree() if (Jifty->config->framework('DevelMode') );
+%# This is required for jifty server push.  If you maintain your own
+%# wrapper, make sure you have this as well.
+% if ( Jifty->config->framework('PubSub')->{'Enable'} && Jifty::Subs->list ) {
+<script>new Jifty.Subs({}).start();</script>
+% }
+</body>
+</html>
+% Jifty->handler->stash->{'in_body'} = 0;
+<%args>
+$title => ""
+</%args>
+<%init>
+# First we set up the header. 
+$m->comp( 'header', title => $title);
+# now that we've printed out the header, we're inside the body, so it's safe to print
+# halo markers.
+Jifty->handler->stash->{'in_body'} = 1;
+</%init>

Modified: jifty/branches/virtual-models/t/TestApp/t/00-model-User.t
==============================================================================
--- jifty/branches/virtual-models/t/TestApp/t/00-model-User.t	(original)
+++ jifty/branches/virtual-models/t/TestApp/t/00-model-User.t	Tue Sep 11 14:03:32 2007
@@ -11,7 +11,8 @@
 use lib 't/lib';
 use Jifty::SubTest;
 
-use Jifty::Test tests => 12;
+use Jifty::Test tests => 24;
+Jifty::Test->web; # initialize for use with the as_*_action tests
 # Make sure we can load the model
 use_ok('TestApp::Model::User');
 
@@ -27,6 +28,22 @@
 is($o->id, $id, "Create returned the right id");
 is($o->name, $$, "Created object has the right name");
 
+# Test the as_foo_action methods
+my $action = $o->as_create_action( moniker => 'test1' );
+isa_ok($action, 'TestApp::Action::CreateUser');
+is($action->moniker, 'test1', 'create action moniker is test1');
+$action = $o->as_update_action( moniker => 'test2' );
+isa_ok($action, 'TestApp::Action::UpdateUser');
+is($action->record->id, $o->id, 'update action ID is correct');
+is($action->moniker, 'test2', 'update action moniker is test2');
+$action = $o->as_delete_action( moniker => 'test3' );
+isa_ok($action, 'TestApp::Action::DeleteUser');
+is($action->record->id, $o->id, 'delete action ID is correct');
+is($action->moniker, 'test3', 'delete action moniker is test3');
+$action = $o->as_search_action( moniker => 'test4' );
+isa_ok($action, 'TestApp::Action::SearchUser');
+is($action->moniker, 'test4', 'search action moniker is test4');
+
 # And another
 $o->create( name => $$, email => $$, password => $$ );
 ok($o->id, "User create returned another value");
@@ -37,6 +54,11 @@
 $collection->unlimit;
 is($collection->count, 2, "Finds two records");
 
+# Check the as_search_action method
+$action = $collection->as_search_action( moniker => 'test5' );
+isa_ok($action, 'TestApp::Action::SearchUser');
+is($action->moniker, 'test5', 'search action moniker is test5');
+
 # Searches in specific
 $collection->limit(column => 'id', value => $o->id);
 is($collection->count, 1, "Finds one record with specific id");

Modified: jifty/branches/virtual-models/t/TestApp/t/11-current_user.t
==============================================================================
--- jifty/branches/virtual-models/t/TestApp/t/11-current_user.t	(original)
+++ jifty/branches/virtual-models/t/TestApp/t/11-current_user.t	Tue Sep 11 14:03:32 2007
@@ -11,7 +11,7 @@
 use lib 't/lib';
 use Jifty::SubTest;
 
-use Jifty::Test tests => 19;
+use Jifty::Test tests => 23;
 use Jifty::Test::WWW::Mechanize;
 
 use_ok('TestApp::Model::User');
@@ -35,6 +35,10 @@
 ok($o->id, "New user has valid id set");
 ok($o->tasty, "User is tasty");
 
+is($o->email, 'bob at example.com', 'email initially set correctly');
+$o->set_email('bob+jifty at example.com');
+is($o->email, 'bob+jifty at example.com', 'email updated correctly');
+
 # Create a CurrentUser
 my $bob = TestApp::CurrentUser->new( name => 'Bob' );
 ok($bob->id, "CurrentUser has a valid id set");
@@ -42,6 +46,10 @@
 ok($bob->user_object->tasty, "The CurrentUser is tasty");
 ok($bob->is_superuser, "CurrentUser is a superuser");
 
+is($bob->user_object->email, 'bob+jifty at example.com', 'email from before');
+$bob->user_object->set_email('bob+test at example.com');
+is($bob->user_object->email, 'bob+test at example.com', 'email updated correctly');
+
 my $server = Jifty::Test->make_server;
 isa_ok($server, 'Jifty::Server');
 

Added: jifty/branches/virtual-models/t/TestApp/t/crud.t
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp/t/crud.t	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,20 @@
+#!/usr/bin/env perl
+use warnings;
+use strict;
+
+use lib 't/lib';
+use Jifty::SubTest;
+
+use Jifty::Test tests => 3;
+use Jifty::Test::WWW::Mechanize;
+
+my $server = Jifty::Test->make_server;
+isa_ok($server, 'Jifty::Server');
+
+my $url = $server->started_ok;
+
+my $mech = Jifty::Test::WWW::Mechanize->new;
+
+$mech->get_ok("$url/crud/User");
+
+# TODO FIXME XXX Surely more tests are needed... and don't call me Shirley.

Added: jifty/branches/virtual-models/t/TestApp/t/use_mason_wrapper.t
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp/t/use_mason_wrapper.t	Tue Sep 11 14:03:32 2007
@@ -0,0 +1,21 @@
+#!/usr/bin/env perl
+use warnings;
+use strict;
+
+use lib 't/lib';
+use Jifty::SubTest;
+
+use Jifty::Test tests => 6;
+use Jifty::Test::WWW::Mechanize;
+
+my $server = Jifty::Test->make_server;
+my $url = $server->started_ok;
+
+my $mech = Jifty::Test::WWW::Mechanize->new;
+$mech->get_ok( $url . '/use_mason_wrapper', 'grab a page' );
+
+$mech->content_contains( 'In a Mason Wrapper?', 'got the right template' );
+$mech->content_contains( 'Custom Wrapper', 'used the custom wrapper' );
+
+$mech->get_ok( $url . '/_elements/wrapper', 'getting the wrapper directly');
+$mech->content_contains( 'Something went awry', 'and we were not able to');

Modified: jifty/branches/virtual-models/t/clientside/td.t
==============================================================================
--- jifty/branches/virtual-models/t/clientside/td.t	(original)
+++ jifty/branches/virtual-models/t/clientside/td.t	Tue Sep 11 14:03:32 2007
@@ -47,6 +47,8 @@
 eval 'use Jifty::View::Declare::Compile; 1'
     or plan skip_all => "Can't load Jifty::View::Declare::Compile";
 
+plan skip_all => "require new B::Deparse" unless B::Deparse->can('e_method');
+
 my $jsbin = can_run('js')
     or plan skip_all => "Can't find spidermonkey js binary";
 
@@ -66,6 +68,7 @@
 sub is_compatible {
     my $template = shift;
     my $js = js_output( js_code( Foo->can($template) ) );
+    diag js_code( Foo->can($template) );
     my $td = Template::Declare->show($template);
     $js =~ s/\s*//g;
     $td =~ s/\s*//g;

Modified: jifty/branches/virtual-models/t/lib/Jifty/SubTest.pm
==============================================================================
--- jifty/branches/virtual-models/t/lib/Jifty/SubTest.pm	(original)
+++ jifty/branches/virtual-models/t/lib/Jifty/SubTest.pm	Tue Sep 11 14:03:32 2007
@@ -4,7 +4,6 @@
 use File::Spec;
 BEGIN {
     @INC = grep { defined } map { ref($_) ? $_ : File::Spec->rel2abs($_) } @INC;
-    $0 = File::Spec->rel2abs($0);
     chdir "$FindBin::Bin/..";
 }
 


More information about the Jifty-commit mailing list