From 9bba6da30ddc810213f5b26f1ca1c8a878053a9f Mon Sep 17 00:00:00 2001 From: "olivaq@gmail.com" <> Date: Tue, 1 Feb 2011 15:51:10 +0100 Subject: [PATCH] created repo --- .buildpath | 5 + .gitignore | 4 + .project | 22 + .settings/org.eclipse.php.core.prefs | 3 + README | 34 + app/app_controller.php | 12 + app/config/acl.ini.php | 70 + app/config/bootstrap.php | 50 + app/config/core.php | 302 + app/config/database.php | 95 + app/config/routes.php | 36 + app/config/schema/db_acl.php | 73 + app/config/schema/i18n.php | 50 + app/config/schema/sessions.php | 47 + app/controllers/components/empty | 0 app/controllers/resources_controller.php | 68 + app/controllers/slides_controller.php | 221 + app/controllers/users_controller.php | 18 + app/index.php | 18 + app/libs/empty | 0 app/locale/eng/LC_MESSAGES/empty | 0 app/models/behaviors/empty | 0 app/models/datasources/empty | 0 app/models/display_time.php | 16 + app/models/resource.php | 31 + app/models/slide.php | 18 + app/models/user.php | 7 + app/plugins/empty | 0 app/tests/cases/behaviors/empty | 0 app/tests/cases/components/empty | 0 app/tests/cases/controllers/empty | 0 app/tests/cases/helpers/empty | 0 app/tests/cases/models/empty | 0 app/tests/fixtures/empty | 0 app/tests/groups/empty | 0 .../models/cake_model_default_display_times | 2 + .../models/cake_model_default_infoskjerm_list | 2 + .../cache/models/cake_model_default_resources | 2 + .../cache/models/cake_model_default_slides | 2 + app/tmp/cache/models/cake_model_default_users | 2 + app/tmp/cache/models/empty | 0 .../cache/persistent/cake_core_default_en_us | 2 + app/tmp/cache/persistent/cake_core_dir_map | 2 + app/tmp/cache/persistent/cake_core_file_map | 2 + app/tmp/cache/persistent/cake_core_object_map | 2 + app/tmp/cache/persistent/empty | 0 app/tmp/cache/views/empty | 0 app/tmp/logs/debug.log | 251 + app/tmp/logs/empty | 0 app/tmp/logs/error.log | 33 + app/tmp/sessions/empty | 0 app/tmp/tests/empty | 0 app/vendors/shells/tasks/empty | 0 app/vendors/shells/templates/empty | 0 app/views/elements/email/html/empty | 0 app/views/elements/email/text/empty | 0 app/views/elements/empty | 0 app/views/errors/empty | 0 app/views/helpers/empty | 0 app/views/layouts/default.ctp | 60 + app/views/layouts/email/html/empty | 0 app/views/layouts/email/text/empty | 0 app/views/layouts/js/empty | 0 app/views/layouts/rss/empty | 0 app/views/layouts/slideshow.ctp | 37 + app/views/layouts/xml/empty | 0 app/views/pages/empty | 0 app/views/scaffolds/empty | 0 app/views/slides/add.ctp | 47 + app/views/slides/edit.ctp | 49 + app/views/slides/index.ctp | 62 + app/views/slides/next.ctp | 2 + app/views/slides/slideshow.ctp | 95 + app/views/slides/timing.ctp | 146 + app/views/users/login.ctp | 5 + app/webroot/css.php | 96 + app/webroot/css/cake.generic.css | 535 + .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../css/smoothness/jquery-ui-1.8.4.custom.css | 572 + app/webroot/favicon.ico | Bin 0 -> 372 bytes app/webroot/files/empty | 0 app/webroot/img/bannerindex-400.png | Bin 0 -> 22934 bytes app/webroot/img/cake.icon.png | Bin 0 -> 943 bytes app/webroot/img/cake.power.gif | Bin 0 -> 201 bytes app/webroot/img/noslides.png | Bin 0 -> 4019 bytes app/webroot/img/nothumb.png | Bin 0 -> 3353 bytes app/webroot/index.php | 84 + app/webroot/js/jquery-1.4.2.min.js | 154 + app/webroot/js/jquery-ui-1.8.4.custom.min.js | 763 ++ app/webroot/js/jquery.cycle.all.min.js | 21 + app/webroot/test.php | 94 + cake/LICENSE.txt | 22 + cake/VERSION.txt | 22 + cake/basics.php | 1015 ++ cake/bootstrap.php | 39 + cake/config/config.php | 20 + cake/config/paths.php | 231 + cake/config/unicode/casefolding/0080_00ff.php | 74 + cake/config/unicode/casefolding/0100_017f.php | 107 + cake/config/unicode/casefolding/0180_024F.php | 149 + cake/config/unicode/casefolding/0250_02af.php | 42 + cake/config/unicode/casefolding/0370_03ff.php | 103 + cake/config/unicode/casefolding/0400_04ff.php | 165 + cake/config/unicode/casefolding/0500_052f.php | 49 + cake/config/unicode/casefolding/0530_058f.php | 79 + cake/config/unicode/casefolding/1e00_1eff.php | 169 + cake/config/unicode/casefolding/1f00_1fff.php | 217 + cake/config/unicode/casefolding/2100_214f.php | 45 + cake/config/unicode/casefolding/2150_218f.php | 58 + cake/config/unicode/casefolding/2460_24ff.php | 67 + cake/config/unicode/casefolding/2c00_2c5f.php | 88 + cake/config/unicode/casefolding/2c60_2c7f.php | 49 + cake/config/unicode/casefolding/2c80_2cff.php | 91 + cake/config/unicode/casefolding/ff00_ffef.php | 67 + cake/console/cake | 26 + cake/console/cake.bat | 31 + cake/console/cake.php | 661 ++ cake/console/error.php | 265 + cake/console/libs/acl.php | 601 ++ cake/console/libs/api.php | 213 + cake/console/libs/bake.php | 230 + cake/console/libs/console.php | 361 + cake/console/libs/i18n.php | 128 + cake/console/libs/schema.php | 506 + cake/console/libs/shell.php | 647 ++ cake/console/libs/tasks/bake.php | 60 + cake/console/libs/tasks/controller.php | 480 + cake/console/libs/tasks/db_config.php | 368 + cake/console/libs/tasks/extract.php | 494 + cake/console/libs/tasks/fixture.php | 422 + cake/console/libs/tasks/model.php | 930 ++ cake/console/libs/tasks/plugin.php | 247 + cake/console/libs/tasks/project.php | 371 + cake/console/libs/tasks/template.php | 212 + cake/console/libs/tasks/test.php | 456 + cake/console/libs/tasks/view.php | 488 + cake/console/libs/testsuite.php | 370 + .../default/actions/controller_actions.ctp | 140 + .../templates/default/classes/controller.ctp | 61 + .../templates/default/classes/fixture.ctp | 42 + .../templates/default/classes/model.ctp | 142 + .../templates/default/classes/test.ctp | 57 + cake/console/templates/default/views/form.ctp | 66 + cake/console/templates/default/views/home.ctp | 84 + .../console/templates/default/views/index.ctp | 96 + cake/console/templates/default/views/view.ctp | 146 + cake/console/templates/skel/.htaccess | 5 + .../console/templates/skel/app_controller.php | 34 + cake/console/templates/skel/app_helper.php | 36 + cake/console/templates/skel/app_model.php | 34 + .../console/templates/skel/config/acl.ini.php | 70 + .../templates/skel/config/bootstrap.php | 50 + cake/console/templates/skel/config/core.php | 302 + .../skel/config/database.php.default | 95 + cake/console/templates/skel/config/routes.php | 35 + .../templates/skel/config/schema/db_acl.php | 75 + .../templates/skel/config/schema/db_acl.sql | 40 + .../templates/skel/config/schema/i18n.php | 52 + .../templates/skel/config/schema/i18n.sql | 26 + .../templates/skel/config/schema/sessions.php | 49 + .../templates/skel/config/schema/sessions.sql | 16 + .../skel/controllers/components/empty | 0 .../skel/controllers/pages_controller.php | 84 + cake/console/templates/skel/index.php | 18 + cake/console/templates/skel/libs/empty | 0 .../skel/locale/eng/LC_MESSAGES/empty | 0 .../templates/skel/models/behaviors/empty | 0 .../templates/skel/models/datasources/empty | 0 cake/console/templates/skel/plugins/empty | 0 .../skel/tests/cases/behaviors/empty | 0 .../skel/tests/cases/components/empty | 0 .../skel/tests/cases/controllers/empty | 0 .../skel/tests/cases/datasources/empty | 0 .../templates/skel/tests/cases/helpers/empty | 0 .../templates/skel/tests/cases/models/empty | 0 .../templates/skel/tests/cases/shells/empty | 0 .../templates/skel/tests/fixtures/empty | 0 .../console/templates/skel/tests/groups/empty | 0 .../templates/skel/tmp/cache/models/empty | 0 .../templates/skel/tmp/cache/persistent/empty | 0 .../templates/skel/tmp/cache/views/empty | 0 cake/console/templates/skel/tmp/logs/empty | 0 .../console/templates/skel/tmp/sessions/empty | 0 cake/console/templates/skel/tmp/tests/empty | 0 .../templates/skel/vendors/shells/tasks/empty | 0 .../views/elements/email/html/default.ctp | 26 + .../views/elements/email/text/default.ctp | 20 + .../templates/skel/views/elements/empty | 0 .../console/templates/skel/views/errors/empty | 0 .../templates/skel/views/helpers/empty | 0 .../templates/skel/views/layouts/ajax.ctp | 20 + .../templates/skel/views/layouts/default.ctp | 59 + .../skel/views/layouts/email/html/default.ctp | 32 + .../skel/views/layouts/email/text/default.ctp | 23 + .../templates/skel/views/layouts/flash.ctp | 38 + .../skel/views/layouts/js/default.ctp | 2 + .../skel/views/layouts/rss/default.ctp | 17 + .../skel/views/layouts/xml/default.ctp | 2 + cake/console/templates/skel/views/pages/empty | 0 .../templates/skel/views/scaffolds/empty | 0 cake/console/templates/skel/webroot/.htaccess | 6 + cake/console/templates/skel/webroot/css.php | 97 + .../skel/webroot/css/cake.generic.css | 535 + .../templates/skel/webroot/favicon.ico | Bin 0 -> 372 bytes .../templates/skel/webroot/img/cake.icon.png | Bin 0 -> 943 bytes .../templates/skel/webroot/img/cake.power.gif | Bin 0 -> 201 bytes cake/console/templates/skel/webroot/index.php | 84 + cake/console/templates/skel/webroot/js/empty | 0 cake/console/templates/skel/webroot/test.php | 94 + cake/dispatcher.php | 656 ++ cake/libs/cache.php | 675 ++ cake/libs/cache/apc.php | 123 + cake/libs/cache/file.php | 271 + cake/libs/cache/memcache.php | 198 + cake/libs/cache/xcache.php | 183 + cake/libs/cake_log.php | 291 + cake/libs/cake_session.php | 788 ++ cake/libs/cake_socket.php | 304 + cake/libs/class_registry.php | 364 + cake/libs/configure.php | 1311 +++ cake/libs/controller/app_controller.php | 36 + cake/libs/controller/component.php | 263 + cake/libs/controller/components/acl.php | 638 ++ cake/libs/controller/components/auth.php | 960 ++ cake/libs/controller/components/cookie.php | 471 + cake/libs/controller/components/email.php | 965 ++ .../controller/components/request_handler.php | 824 ++ cake/libs/controller/components/security.php | 746 ++ cake/libs/controller/components/session.php | 295 + cake/libs/controller/controller.php | 1324 +++ cake/libs/controller/pages_controller.php | 85 + cake/libs/controller/scaffold.php | 613 ++ cake/libs/debugger.php | 708 ++ cake/libs/error.php | 461 + cake/libs/file.php | 544 + cake/libs/folder.php | 786 ++ cake/libs/http_socket.php | 1081 ++ cake/libs/i18n.php | 575 + cake/libs/inflector.php | 626 ++ cake/libs/l10n.php | 488 + cake/libs/log/file_log.php | 77 + cake/libs/magic_db.php | 302 + cake/libs/model/app_model.php | 35 + cake/libs/model/behaviors/acl.php | 122 + cake/libs/model/behaviors/containable.php | 453 + cake/libs/model/behaviors/translate.php | 540 + cake/libs/model/behaviors/tree.php | 974 ++ cake/libs/model/cake_schema.php | 640 ++ cake/libs/model/connection_manager.php | 295 + cake/libs/model/datasources/datasource.php | 596 ++ cake/libs/model/datasources/dbo/dbo_mssql.php | 788 ++ cake/libs/model/datasources/dbo/dbo_mysql.php | 784 ++ .../libs/model/datasources/dbo/dbo_mysqli.php | 338 + .../libs/model/datasources/dbo/dbo_oracle.php | 1159 ++ .../model/datasources/dbo/dbo_postgres.php | 974 ++ .../libs/model/datasources/dbo/dbo_sqlite.php | 623 ++ cake/libs/model/datasources/dbo_source.php | 2926 ++++++ cake/libs/model/db_acl.php | 332 + cake/libs/model/model.php | 3040 ++++++ cake/libs/model/model_behavior.php | 533 + cake/libs/multibyte.php | 1172 +++ cake/libs/object.php | 298 + cake/libs/overloadable.php | 36 + cake/libs/overloadable_php4.php | 165 + cake/libs/overloadable_php5.php | 108 + cake/libs/router.php | 1632 +++ cake/libs/sanitize.php | 348 + cake/libs/security.php | 191 + cake/libs/set.php | 1152 ++ cake/libs/string.php | 328 + cake/libs/validation.php | 1060 ++ .../libs/view/elements/email/html/default.ctp | 26 + .../libs/view/elements/email/text/default.ctp | 20 + cake/libs/view/elements/sql_dump.ctp | 54 + cake/libs/view/errors/error404.ctp | 24 + cake/libs/view/errors/error500.ctp | 24 + cake/libs/view/errors/missing_action.ctp | 46 + .../view/errors/missing_behavior_class.ctp | 39 + .../view/errors/missing_behavior_file.ctp | 39 + .../view/errors/missing_component_class.ctp | 39 + .../view/errors/missing_component_file.ctp | 39 + cake/libs/view/errors/missing_connection.ctp | 32 + cake/libs/view/errors/missing_controller.ctp | 40 + .../libs/view/errors/missing_helper_class.ctp | 39 + cake/libs/view/errors/missing_helper_file.ctp | 39 + cake/libs/view/errors/missing_layout.ctp | 32 + cake/libs/view/errors/missing_model.ctp | 41 + cake/libs/view/errors/missing_scaffolddb.ctp | 32 + cake/libs/view/errors/missing_table.ctp | 28 + cake/libs/view/errors/missing_view.ctp | 32 + cake/libs/view/errors/private_action.ctp | 28 + cake/libs/view/errors/scaffold_error.ctp | 35 + cake/libs/view/helper.php | 908 ++ cake/libs/view/helpers/ajax.php | 1036 ++ cake/libs/view/helpers/app_helper.php | 36 + cake/libs/view/helpers/cache.php | 261 + cake/libs/view/helpers/form.php | 2189 ++++ cake/libs/view/helpers/html.php | 835 ++ cake/libs/view/helpers/javascript.php | 721 ++ cake/libs/view/helpers/jquery_engine.php | 364 + cake/libs/view/helpers/js.php | 1128 ++ cake/libs/view/helpers/mootools_engine.php | 374 + cake/libs/view/helpers/number.php | 257 + cake/libs/view/helpers/paginator.php | 813 ++ cake/libs/view/helpers/prototype_engine.php | 365 + cake/libs/view/helpers/rss.php | 290 + cake/libs/view/helpers/session.php | 201 + cake/libs/view/helpers/text.php | 336 + cake/libs/view/helpers/time.php | 735 ++ cake/libs/view/helpers/xml.php | 174 + cake/libs/view/layouts/ajax.ctp | 20 + cake/libs/view/layouts/default.ctp | 59 + cake/libs/view/layouts/email/html/default.ctp | 30 + cake/libs/view/layouts/email/text/default.ctp | 22 + cake/libs/view/layouts/flash.ctp | 38 + cake/libs/view/layouts/js/default.ctp | 2 + cake/libs/view/layouts/rss/default.ctp | 16 + cake/libs/view/layouts/xml/default.ctp | 2 + cake/libs/view/media.php | 285 + cake/libs/view/pages/home.ctp | 160 + cake/libs/view/scaffolds/edit.ctp | 47 + cake/libs/view/scaffolds/index.ctp | 93 + cake/libs/view/scaffolds/view.ctp | 159 + cake/libs/view/theme.php | 74 + cake/libs/view/view.php | 970 ++ cake/libs/xml.php | 1466 +++ cake/tests/cases/basics.test.php | 810 ++ cake/tests/cases/console/cake.test.php | 939 ++ cake/tests/cases/console/libs/acl.test.php | 346 + cake/tests/cases/console/libs/api.test.php | 116 + cake/tests/cases/console/libs/bake.test.php | 130 + cake/tests/cases/console/libs/schema.test.php | 503 + cake/tests/cases/console/libs/shell.test.php | 501 + .../console/libs/tasks/controller.test.php | 631 ++ .../console/libs/tasks/db_config.test.php | 155 + .../cases/console/libs/tasks/extract.test.php | 187 + .../cases/console/libs/tasks/fixture.test.php | 353 + .../cases/console/libs/tasks/model.test.php | 909 ++ .../cases/console/libs/tasks/plugin.test.php | 263 + .../cases/console/libs/tasks/project.test.php | 301 + .../console/libs/tasks/template.test.php | 183 + .../cases/console/libs/tasks/test.test.php | 625 ++ .../cases/console/libs/tasks/view.test.php | 664 ++ cake/tests/cases/dispatcher.test.php | 2484 +++++ cake/tests/cases/libs/cache.test.php | 371 + cake/tests/cases/libs/cache/apc.test.php | 196 + cake/tests/cases/libs/cache/file.test.php | 404 + cake/tests/cases/libs/cache/memcache.test.php | 309 + cake/tests/cases/libs/cache/xcache.test.php | 222 + cake/tests/cases/libs/cake_log.test.php | 183 + cake/tests/cases/libs/cake_session.test.php | 476 + cake/tests/cases/libs/cake_socket.test.php | 192 + cake/tests/cases/libs/cake_test_case.test.php | 502 + .../cases/libs/cake_test_fixture.test.php | 377 + cake/tests/cases/libs/class_registry.test.php | 325 + .../cases/libs/code_coverage_manager.test.php | 516 + cake/tests/cases/libs/configure.test.php | 820 ++ .../cases/libs/controller/component.test.php | 587 ++ .../libs/controller/components/acl.test.php | 646 ++ .../libs/controller/components/auth.test.php | 1614 +++ .../controller/components/cookie.test.php | 468 + .../libs/controller/components/email.test.php | 1154 ++ .../components/request_handler.test.php | 710 ++ .../controller/components/security.test.php | 1237 +++ .../controller/components/session.test.php | 385 + .../cases/libs/controller/controller.test.php | 1449 +++ .../controller/controller_merge_vars.test.php | 238 + .../libs/controller/pages_controller.test.php | 72 + .../cases/libs/controller/scaffold.test.php | 878 ++ cake/tests/cases/libs/debugger.test.php | 336 + cake/tests/cases/libs/error.test.php | 612 ++ cake/tests/cases/libs/file.test.php | 472 + cake/tests/cases/libs/folder.test.php | 791 ++ cake/tests/cases/libs/http_socket.test.php | 1558 +++ cake/tests/cases/libs/i18n.test.php | 2734 +++++ cake/tests/cases/libs/inflector.test.php | 462 + cake/tests/cases/libs/l10n.test.php | 958 ++ cake/tests/cases/libs/log/file_log.test.php | 79 + cake/tests/cases/libs/magic_db.test.php | 203 + .../cases/libs/model/behaviors/acl.test.php | 411 + .../libs/model/behaviors/containable.test.php | 3718 +++++++ .../libs/model/behaviors/translate.test.php | 898 ++ .../cases/libs/model/behaviors/tree.test.php | 1874 ++++ .../cases/libs/model/cake_schema.test.php | 943 ++ .../libs/model/connection_manager.test.php | 340 + .../model/datasources/dbo/dbo_mssql.test.php | 677 ++ .../model/datasources/dbo/dbo_mysql.test.php | 780 ++ .../model/datasources/dbo/dbo_mysqli.test.php | 339 + .../model/datasources/dbo/dbo_oracle.test.php | 131 + .../datasources/dbo/dbo_postgres.test.php | 810 ++ .../model/datasources/dbo/dbo_sqlite.test.php | 355 + .../model/datasources/dbo_source.test.php | 4482 ++++++++ cake/tests/cases/libs/model/db_acl.test.php | 396 + cake/tests/cases/libs/model/model.test.php | 103 + .../cases/libs/model/model_behavior.test.php | 1138 ++ .../cases/libs/model/model_delete.test.php | 711 ++ .../libs/model/model_integration.test.php | 1930 ++++ .../cases/libs/model/model_read.test.php | 7456 +++++++++++++ .../libs/model/model_validation.test.php | 649 ++ .../cases/libs/model/model_write.test.php | 3881 +++++++ cake/tests/cases/libs/model/models.php | 3565 +++++++ cake/tests/cases/libs/multibyte.test.php | 9343 +++++++++++++++++ cake/tests/cases/libs/object.test.php | 810 ++ cake/tests/cases/libs/overloadable.test.php | 39 + cake/tests/cases/libs/router.test.php | 2566 +++++ cake/tests/cases/libs/sanitize.test.php | 523 + cake/tests/cases/libs/security.test.php | 173 + cake/tests/cases/libs/set.test.php | 2930 ++++++ cake/tests/cases/libs/string.test.php | 290 + cake/tests/cases/libs/test_manager.test.php | 120 + cake/tests/cases/libs/validation.test.php | 2207 ++++ cake/tests/cases/libs/view/helper.test.php | 786 ++ .../cases/libs/view/helpers/ajax.test.php | 908 ++ .../cases/libs/view/helpers/cache.test.php | 463 + .../cases/libs/view/helpers/form.test.php | 6366 +++++++++++ .../cases/libs/view/helpers/html.test.php | 1269 +++ .../libs/view/helpers/javascript.test.php | 911 ++ .../libs/view/helpers/jquery_engine.test.php | 367 + .../tests/cases/libs/view/helpers/js.test.php | 833 ++ .../view/helpers/mootools_engine.test.php | 354 + .../cases/libs/view/helpers/number.test.php | 428 + .../libs/view/helpers/paginator.test.php | 1913 ++++ .../view/helpers/prototype_engine.test.php | 380 + .../cases/libs/view/helpers/rss.test.php | 559 + .../cases/libs/view/helpers/session.test.php | 236 + .../cases/libs/view/helpers/text.test.php | 411 + .../cases/libs/view/helpers/time.test.php | 784 ++ .../cases/libs/view/helpers/xml.test.php | 287 + cake/tests/cases/libs/view/media.test.php | 180 + cake/tests/cases/libs/view/theme.test.php | 343 + cake/tests/cases/libs/view/view.test.php | 930 ++ cake/tests/cases/libs/xml.test.php | 1419 +++ cake/tests/fixtures/account_fixture.php | 61 + cake/tests/fixtures/aco_action_fixture.php | 60 + cake/tests/fixtures/aco_fixture.php | 73 + cake/tests/fixtures/aco_two_fixture.php | 71 + cake/tests/fixtures/ad_fixture.php | 68 + cake/tests/fixtures/advertisement_fixture.php | 60 + cake/tests/fixtures/after_tree_fixture.php | 67 + .../fixtures/another_article_fixture.php | 61 + cake/tests/fixtures/apple_fixture.php | 69 + cake/tests/fixtures/aro_fixture.php | 65 + cake/tests/fixtures/aro_two_fixture.php | 71 + cake/tests/fixtures/aros_aco_fixture.php | 60 + cake/tests/fixtures/aros_aco_two_fixture.php | 81 + .../fixtures/article_featured_fixture.php | 64 + .../article_featureds_tags_fixture.php | 48 + cake/tests/fixtures/article_fixture.php | 64 + cake/tests/fixtures/articles_tag_fixture.php | 61 + cake/tests/fixtures/attachment_fixture.php | 60 + .../auth_user_custom_field_fixture.php | 65 + cake/tests/fixtures/auth_user_fixture.php | 65 + cake/tests/fixtures/author_fixture.php | 63 + cake/tests/fixtures/basket_fixture.php | 61 + cake/tests/fixtures/bid_fixture.php | 62 + cake/tests/fixtures/binary_test_fixture.php | 55 + cake/tests/fixtures/book_fixture.php | 61 + .../fixtures/cache_test_model_fixture.php | 48 + cake/tests/fixtures/callback_fixture.php | 62 + cake/tests/fixtures/campaign_fixture.php | 60 + cake/tests/fixtures/category_fixture.php | 67 + .../fixtures/category_thread_fixture.php | 66 + cake/tests/fixtures/cd_fixture.php | 59 + cake/tests/fixtures/comment_fixture.php | 67 + .../fixtures/content_account_fixture.php | 64 + cake/tests/fixtures/content_fixture.php | 61 + .../fixtures/counter_cache_post_fixture.php | 42 + ...e_post_nonstandard_primary_key_fixture.php | 42 + .../fixtures/counter_cache_user_fixture.php | 41 + ...e_user_nonstandard_primary_key_fixture.php | 41 + cake/tests/fixtures/data_test_fixture.php | 59 + cake/tests/fixtures/datatype_fixture.php | 57 + cake/tests/fixtures/dependency_fixture.php | 58 + cake/tests/fixtures/device_fixture.php | 61 + .../fixtures/device_type_category_fixture.php | 57 + cake/tests/fixtures/device_type_fixture.php | 64 + .../fixtures/document_directory_fixture.php | 57 + cake/tests/fixtures/document_fixture.php | 58 + .../exterior_type_category_fixture.php | 58 + cake/tests/fixtures/feature_set_fixture.php | 57 + cake/tests/fixtures/featured_fixture.php | 63 + cake/tests/fixtures/film_file_fixture.php | 58 + cake/tests/fixtures/flag_tree_fixture.php | 55 + cake/tests/fixtures/fruit_fixture.php | 63 + .../fixtures/fruits_uuid_tag_fixture.php | 60 + .../fixtures/group_update_all_fixture.php | 55 + cake/tests/fixtures/home_fixture.php | 62 + cake/tests/fixtures/image_fixture.php | 61 + cake/tests/fixtures/item_fixture.php | 64 + .../fixtures/items_portfolio_fixture.php | 63 + cake/tests/fixtures/join_a_b_fixture.php | 63 + cake/tests/fixtures/join_a_c_fixture.php | 63 + cake/tests/fixtures/join_a_fixture.php | 62 + cake/tests/fixtures/join_b_fixture.php | 61 + cake/tests/fixtures/join_c_fixture.php | 61 + cake/tests/fixtures/join_thing_fixture.php | 63 + cake/tests/fixtures/message_fixture.php | 60 + .../my_categories_my_products_fixture.php | 60 + .../my_categories_my_users_fixture.php | 60 + cake/tests/fixtures/my_category_fixture.php | 59 + cake/tests/fixtures/my_product_fixture.php | 58 + cake/tests/fixtures/my_user_fixture.php | 58 + cake/tests/fixtures/node_fixture.php | 60 + cake/tests/fixtures/number_tree_fixture.php | 54 + .../fixtures/number_tree_two_fixture.php | 55 + .../fixtures/numeric_article_fixture.php | 60 + .../fixtures/overall_favorite_fixture.php | 60 + cake/tests/fixtures/person_fixture.php | 69 + cake/tests/fixtures/portfolio_fixture.php | 60 + cake/tests/fixtures/post_fixture.php | 64 + cake/tests/fixtures/posts_tag_fixture.php | 61 + cake/tests/fixtures/primary_model_fixture.php | 57 + cake/tests/fixtures/product_fixture.php | 66 + .../fixtures/product_update_all_fixture.php | 61 + cake/tests/fixtures/project_fixture.php | 59 + cake/tests/fixtures/sample_fixture.php | 61 + .../fixtures/secondary_model_fixture.php | 57 + cake/tests/fixtures/session_fixture.php | 63 + .../tests/fixtures/something_else_fixture.php | 63 + cake/tests/fixtures/something_fixture.php | 63 + cake/tests/fixtures/stories_tag_fixture.php | 58 + cake/tests/fixtures/story_fixture.php | 58 + cake/tests/fixtures/syfile_fixture.php | 64 + cake/tests/fixtures/tag_fixture.php | 61 + .../fixtures/test_plugin_article_fixture.php | 64 + .../fixtures/test_plugin_comment_fixture.php | 67 + .../fixtures/the_paper_monkies_fixture.php | 55 + cake/tests/fixtures/thread_fixture.php | 60 + .../fixtures/translate_article_fixture.php | 86 + cake/tests/fixtures/translate_fixture.php | 86 + .../fixtures/translate_table_fixture.php | 69 + .../translate_with_prefix_fixture.php | 87 + .../fixtures/translated_article_fixture.php | 62 + .../fixtures/translated_item_fixture.php | 59 + .../fixtures/unconventional_tree_fixture.php | 53 + .../fixtures/underscore_field_fixture.php | 62 + cake/tests/fixtures/user_fixture.php | 63 + cake/tests/fixtures/uuid_fixture.php | 63 + cake/tests/fixtures/uuid_tag_fixture.php | 58 + cake/tests/fixtures/uuid_tree_fixture.php | 51 + cake/tests/fixtures/uuiditem_fixture.php | 63 + .../uuiditems_uuidportfolio_fixture.php | 61 + ...ditems_uuidportfolio_numericid_fixture.php | 61 + cake/tests/fixtures/uuidportfolio_fixture.php | 58 + cake/tests/groups/acl.group.php | 50 + cake/tests/groups/bake.group.php | 59 + cake/tests/groups/behaviors.group.php | 48 + cake/tests/groups/cache.group.php | 49 + cake/tests/groups/components.group.php | 48 + cake/tests/groups/configure.group.php | 49 + cake/tests/groups/console.group.php | 65 + cake/tests/groups/controller.group.php | 49 + cake/tests/groups/database.group.php | 52 + cake/tests/groups/helpers.group.php | 49 + cake/tests/groups/i18n.group.php | 50 + cake/tests/groups/javascript.group.php | 51 + cake/tests/groups/lib.group.php | 63 + cake/tests/groups/model.group.php | 54 + .../groups/no_cross_contamination.group.php | 67 + cake/tests/groups/routing_system.group.php | 49 + cake/tests/groups/socket.group.php | 55 + cake/tests/groups/test_suite.group.php | 52 + cake/tests/groups/view.group.php | 49 + cake/tests/groups/xml.group.php | 50 + cake/tests/lib/cake_test_case.php | 831 ++ cake/tests/lib/cake_test_fixture.php | 195 + cake/tests/lib/cake_test_model.php | 31 + cake/tests/lib/cake_test_suite_dispatcher.php | 249 + cake/tests/lib/cake_web_test_case.php | 33 + cake/tests/lib/code_coverage_manager.php | 804 ++ .../tests/lib/reporter/cake_base_reporter.php | 225 + cake/tests/lib/reporter/cake_cli_reporter.php | 178 + .../tests/lib/reporter/cake_html_reporter.php | 378 + .../tests/lib/reporter/cake_text_reporter.php | 198 + cake/tests/lib/templates/footer.php | 37 + cake/tests/lib/templates/header.php | 125 + cake/tests/lib/templates/menu.php | 58 + cake/tests/lib/templates/simpletest.php | 32 + cake/tests/lib/templates/xdebug.php | 27 + cake/tests/lib/test_manager.php | 421 + cake/tests/test_app/config/acl.ini.php | 61 + .../test_app/controllers/components/empty | 0 .../controllers/tests_apps_controller.php | 35 + .../tests_apps_posts_controller.php | 66 + .../test_app/libs/cache/test_app_cache.php | 22 + cake/tests/test_app/libs/library.php | 20 + cake/tests/test_app/libs/log/test_app_log.php | 25 + cake/tests/test_app/locale/ja_jp/LC_TIME | 48 + .../test_app/locale/po/LC_MESSAGES/default.po | 76 + .../test_app/locale/po/LC_MONETARY/default.po | 18 + cake/tests/test_app/locale/po/LC_TIME | 60 + .../locale/rule_0_mo/LC_MESSAGES/core.mo | Bin 0 -> 673 bytes .../locale/rule_0_mo/LC_MESSAGES/default.mo | Bin 0 -> 617 bytes .../locale/rule_0_po/LC_MESSAGES/core.po | 21 + .../locale/rule_0_po/LC_MESSAGES/default.po | 24 + .../locale/rule_10_mo/LC_MESSAGES/core.mo | Bin 0 -> 845 bytes .../locale/rule_10_mo/LC_MESSAGES/default.mo | Bin 0 -> 759 bytes .../locale/rule_10_po/LC_MESSAGES/core.po | 24 + .../locale/rule_10_po/LC_MESSAGES/default.po | 27 + .../locale/rule_11_mo/LC_MESSAGES/core.mo | Bin 0 -> 858 bytes .../locale/rule_11_mo/LC_MESSAGES/default.mo | Bin 0 -> 762 bytes .../locale/rule_11_po/LC_MESSAGES/core.po | 25 + .../locale/rule_11_po/LC_MESSAGES/default.po | 25 + .../locale/rule_12_mo/LC_MESSAGES/core.mo | Bin 0 -> 821 bytes .../locale/rule_12_mo/LC_MESSAGES/default.mo | Bin 0 -> 735 bytes .../locale/rule_12_po/LC_MESSAGES/core.po | 24 + .../locale/rule_12_po/LC_MESSAGES/default.po | 24 + .../locale/rule_13_mo/LC_MESSAGES/core.mo | Bin 0 -> 865 bytes .../locale/rule_13_mo/LC_MESSAGES/default.mo | Bin 0 -> 779 bytes .../locale/rule_13_po/LC_MESSAGES/core.po | 24 + .../locale/rule_13_po/LC_MESSAGES/default.po | 24 + .../locale/rule_14_mo/LC_MESSAGES/core.mo | Bin 0 -> 769 bytes .../locale/rule_14_mo/LC_MESSAGES/default.mo | Bin 0 -> 693 bytes .../locale/rule_14_po/LC_MESSAGES/core.po | 23 + .../locale/rule_14_po/LC_MESSAGES/default.po | 23 + .../locale/rule_1_mo/LC_MESSAGES/core.mo | Bin 0 -> 704 bytes .../locale/rule_1_mo/LC_MESSAGES/default.mo | Bin 0 -> 638 bytes .../locale/rule_1_po/LC_MESSAGES/core.po | 22 + .../locale/rule_1_po/LC_MESSAGES/default.po | 25 + .../locale/rule_2_mo/LC_MESSAGES/core.mo | Bin 0 -> 699 bytes .../locale/rule_2_mo/LC_MESSAGES/default.mo | Bin 0 -> 633 bytes .../locale/rule_2_po/LC_MESSAGES/core.po | 22 + .../locale/rule_2_po/LC_MESSAGES/default.po | 25 + .../locale/rule_3_mo/LC_MESSAGES/core.mo | Bin 0 -> 790 bytes .../locale/rule_3_mo/LC_MESSAGES/default.mo | Bin 0 -> 714 bytes .../locale/rule_3_po/LC_MESSAGES/core.po | 23 + .../locale/rule_3_po/LC_MESSAGES/default.po | 26 + .../locale/rule_4_mo/LC_MESSAGES/core.mo | Bin 0 -> 758 bytes .../locale/rule_4_mo/LC_MESSAGES/default.mo | Bin 0 -> 682 bytes .../locale/rule_4_po/LC_MESSAGES/core.po | 23 + .../locale/rule_4_po/LC_MESSAGES/default.po | 26 + .../locale/rule_5_mo/LC_MESSAGES/core.mo | Bin 0 -> 806 bytes .../locale/rule_5_mo/LC_MESSAGES/default.mo | Bin 0 -> 658 bytes .../locale/rule_5_po/LC_MESSAGES/core.po | 23 + .../locale/rule_5_po/LC_MESSAGES/default.po | 24 + .../locale/rule_6_mo/LC_MESSAGES/core.mo | Bin 0 -> 841 bytes .../locale/rule_6_mo/LC_MESSAGES/default.mo | Bin 0 -> 765 bytes .../locale/rule_6_po/LC_MESSAGES/core.po | 23 + .../locale/rule_6_po/LC_MESSAGES/default.po | 26 + .../locale/rule_7_mo/LC_MESSAGES/core.mo | Bin 0 -> 850 bytes .../locale/rule_7_mo/LC_MESSAGES/default.mo | Bin 0 -> 774 bytes .../locale/rule_7_po/LC_MESSAGES/core.po | 23 + .../locale/rule_7_po/LC_MESSAGES/default.po | 26 + .../locale/rule_8_mo/LC_MESSAGES/core.mo | Bin 0 -> 774 bytes .../locale/rule_8_mo/LC_MESSAGES/default.mo | Bin 0 -> 698 bytes .../locale/rule_8_po/LC_MESSAGES/core.po | 23 + .../locale/rule_8_po/LC_MESSAGES/default.po | 26 + .../locale/rule_9_mo/LC_MESSAGES/core.mo | Bin 0 -> 819 bytes .../locale/rule_9_mo/LC_MESSAGES/default.mo | Bin 0 -> 743 bytes .../locale/rule_9_po/LC_MESSAGES/core.po | 23 + .../locale/rule_9_po/LC_MESSAGES/default.po | 26 + cake/tests/test_app/locale/time_test/LC_TIME | 42 + cake/tests/test_app/models/behaviors/empty | 0 .../behaviors/persister_one_behavior.php | 31 + .../behaviors/persister_two_behavior.php | 31 + cake/tests/test_app/models/comment.php | 25 + .../datasources/test/test_local_driver.php | 5 + .../models/datasources/test2_other_source.php | 27 + .../models/datasources/test2_source.php | 27 + cake/tests/test_app/models/persister_one.php | 29 + cake/tests/test_app/models/persister_two.php | 29 + cake/tests/test_app/models/post.php | 25 + .../plugin_js/webroot/js/one/plugin_one.js | 1 + .../plugins/plugin_js/webroot/js/plugin_js.js | 1 + .../plugins/test_plugin/config/load.php | 20 + .../plugins/test_plugin/config/more.load.php | 20 + .../test_plugin/config/schema/schema.php | 36 + .../components/other_component.php | 21 + .../components/plugins_component.php | 22 + .../components/test_plugin_component.php | 22 + .../test_plugin_other_component.php | 21 + .../controllers/test_plugin_controller.php | 30 + .../controllers/tests_controller.php | 32 + .../libs/cache/test_plugin_cache.php | 21 + .../test_plugin/libs/log/test_plugin_log.php | 25 + .../test_plugin/libs/test_plugin_library.php | 20 + .../locale/po/LC_MESSAGES/test_plugin.po | 50 + .../locale/po/LC_MONETARY/test_plugin.po | 22 + .../behaviors/test_plugin_persister_one.php | 34 + .../behaviors/test_plugin_persister_two.php | 34 + .../models/datasources/dbo/dbo_dummy.php | 7 + .../models/datasources/test/test_driver.php | 4 + .../models/datasources/test_other_source.php | 27 + .../models/datasources/test_source.php | 27 + .../models/test_plugin_auth_user.php | 46 + .../models/test_plugin_authors.php | 29 + .../models/test_plugin_comment.php | 29 + .../test_plugin/models/test_plugin_post.php | 37 + .../test_plugin_app_controller.php | 20 + .../test_plugin/test_plugin_app_model.php | 20 + .../vendors/sample/sample_plugin.php | 21 + .../test_plugin/vendors/shells/example.php | 31 + .../test_plugin/vendors/shells/tasks/empty | 0 .../vendors/shells/templates/empty | 0 .../plugins/test_plugin/vendors/welcome.php | 21 + .../views/elements/plugin_element.ctp | 1 + .../views/elements/test_plugin_element.ctp | 1 + .../views/helpers/other_helper.php | 20 + .../views/helpers/plugged_helper.php | 22 + .../test_plugin/views/layouts/default.ctp | 1 + .../plugins/test_plugin/views/tests/index.ctp | 1 + .../test_plugin/views/tests/scaffold.edit.ctp | 1 + .../webroot/css/test_plugin_asset.css | 1 + .../test_plugin/webroot/css/theme_one.htc | 1 + .../test_plugin/webroot/css/unknown.extension | 1 + .../test_plugin/webroot/flash/plugin_test.swf | 1 + .../test_plugin/webroot/img/cake.icon.gif | Bin 0 -> 233 bytes .../webroot/js/test_plugin/test.js | 1 + .../test_plugin/webroot/pdfs/plugin_test.pdf | 1 + .../plugins/test_plugin/webroot/root.js | 1 + .../vendors/shells/example.php | 31 + .../vendors/shells/tasks/empty | 0 .../vendors/shells/templates/empty | 0 .../vendors/shells/welcome.php | 31 + cake/tests/test_app/tmp/dir_map | 2 + cake/tests/test_app/vendors/Test/MyTest.php | 21 + cake/tests/test_app/vendors/Test/hello.php | 21 + .../tests/test_app/vendors/css/test_asset.css | 1 + cake/tests/test_app/vendors/img/test.jpg | Bin 0 -> 5308 bytes .../sample/configure_test_vendor_sample.php | 21 + cake/tests/test_app/vendors/shells/sample.php | 31 + .../tests/test_app/vendors/shells/tasks/empty | 0 .../templates/test/classes/test_object.ctp | 2 + .../test_app/vendors/somename/some.name.php | 21 + cake/tests/test_app/vendors/welcome.php | 21 + .../views/elements/email/html/custom.ctp | 26 + .../views/elements/email/html/default.ctp | 26 + .../views/elements/email/text/custom.ctp | 26 + .../views/elements/email/text/default.ctp | 20 + .../views/elements/email/text/wide.ctp | 21 + cake/tests/test_app/views/elements/empty | 0 .../elements/nocache/contains_nocache.ctp | 5 + .../test_app/views/elements/nocache/plain.ctp | 4 + .../test_app/views/elements/nocache/sub1.ctp | 8 + .../test_app/views/elements/nocache/sub2.ctp | 6 + .../views/elements/session_helper.ctp | 5 + .../test_app/views/elements/test_element.ctp | 1 + cake/tests/test_app/views/errors/empty | 0 cake/tests/test_app/views/helpers/banana.php | 20 + cake/tests/test_app/views/helpers/empty | 0 cake/tests/test_app/views/layouts/ajax.ctp | 20 + cake/tests/test_app/views/layouts/ajax2.ctp | 23 + .../views/layouts/cache_empty_sections.ctp | 13 + .../test_app/views/layouts/cache_layout.ctp | 32 + cake/tests/test_app/views/layouts/default.ctp | 56 + .../views/layouts/email/html/default.ctp | 32 + .../views/layouts/email/html/thin.ctp | 32 + .../views/layouts/email/text/default.ctp | 23 + cake/tests/test_app/views/layouts/flash.ctp | 38 + .../test_app/views/layouts/js/default.ctp | 2 + .../test_app/views/layouts/multi_cache.ctp | 40 + .../test_app/views/layouts/rss/default.ctp | 17 + .../test_app/views/layouts/xml/default.ctp | 2 + cake/tests/test_app/views/pages/empty | 0 cake/tests/test_app/views/pages/extract.ctp | 14 + cake/tests/test_app/views/pages/home.ctp | 82 + .../views/posts/cache_empty_sections.ctp | 2 + .../tests/test_app/views/posts/cache_form.ctp | 14 + .../test_app/views/posts/helper_overwrite.ctp | 4 + cake/tests/test_app/views/posts/index.ctp | 1 + .../test_app/views/posts/multiple_nocache.ctp | 15 + .../views/posts/nocache_multiple_element.ctp | 9 + .../test_app/views/posts/scaffold.edit.ctp | 1 + .../views/posts/sequencial_nocache.ctp | 24 + .../views/posts/test_nocache_tags.ctp | 144 + cake/tests/test_app/views/scaffolds/empty | 0 .../tests/test_app/views/tests_apps/index.ctp | 1 + .../test_theme/elements/test_element.ctp | 1 + .../themed/test_theme/layouts/default.ctp | 1 + .../test_plugin/layouts/plugin_default.ctp | 1 + .../plugins/test_plugin/tests/index.ctp | 1 + .../views/themed/test_theme/posts/index.ctp | 1 + .../test_theme/posts/scaffold.index.ctp | 1 + .../test_theme/webroot/css/test_asset.css | 1 + .../test_theme/webroot/css/theme_webroot.css | 1 + .../test_theme/webroot/flash/theme_test.swf | 1 + .../test_theme/webroot/img/cake.power.gif | Bin 0 -> 201 bytes .../themed/test_theme/webroot/img/test.jpg | Bin 0 -> 5308 bytes .../test_theme/webroot/js/one/theme_one.js | 1 + .../themed/test_theme/webroot/js/theme.js | 1 + .../test_theme/webroot/pdfs/theme_test.pdf | 1 + .../theme/test_theme/css/theme_webroot.css | 1 + .../theme/test_theme/css/webroot_test.css | 1 + .../theme/test_theme/img/cake.power.gif | Bin 0 -> 201 bytes .../webroot/theme/test_theme/img/test.jpg | Bin 0 -> 5308 bytes index.php | 55 + plugins/empty | 0 sql | 172 + vendors/shells/tasks/empty | 0 vendors/shells/templates/empty | 0 802 files changed, 196207 insertions(+) create mode 100644 .buildpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/org.eclipse.php.core.prefs create mode 100644 README create mode 100644 app/app_controller.php create mode 100644 app/config/acl.ini.php create mode 100644 app/config/bootstrap.php create mode 100644 app/config/core.php create mode 100644 app/config/database.php create mode 100644 app/config/routes.php create mode 100644 app/config/schema/db_acl.php create mode 100644 app/config/schema/i18n.php create mode 100644 app/config/schema/sessions.php create mode 100644 app/controllers/components/empty create mode 100644 app/controllers/resources_controller.php create mode 100644 app/controllers/slides_controller.php create mode 100644 app/controllers/users_controller.php create mode 100644 app/index.php create mode 100644 app/libs/empty create mode 100644 app/locale/eng/LC_MESSAGES/empty create mode 100644 app/models/behaviors/empty create mode 100644 app/models/datasources/empty create mode 100644 app/models/display_time.php create mode 100644 app/models/resource.php create mode 100644 app/models/slide.php create mode 100644 app/models/user.php create mode 100644 app/plugins/empty create mode 100644 app/tests/cases/behaviors/empty create mode 100644 app/tests/cases/components/empty create mode 100644 app/tests/cases/controllers/empty create mode 100644 app/tests/cases/helpers/empty create mode 100644 app/tests/cases/models/empty create mode 100644 app/tests/fixtures/empty create mode 100644 app/tests/groups/empty create mode 100644 app/tmp/cache/models/cake_model_default_display_times create mode 100644 app/tmp/cache/models/cake_model_default_infoskjerm_list create mode 100644 app/tmp/cache/models/cake_model_default_resources create mode 100644 app/tmp/cache/models/cake_model_default_slides create mode 100644 app/tmp/cache/models/cake_model_default_users create mode 100755 app/tmp/cache/models/empty create mode 100644 app/tmp/cache/persistent/cake_core_default_en_us create mode 100644 app/tmp/cache/persistent/cake_core_dir_map create mode 100644 app/tmp/cache/persistent/cake_core_file_map create mode 100644 app/tmp/cache/persistent/cake_core_object_map create mode 100644 app/tmp/cache/persistent/empty create mode 100755 app/tmp/cache/views/empty create mode 100644 app/tmp/logs/debug.log create mode 100755 app/tmp/logs/empty create mode 100644 app/tmp/logs/error.log create mode 100755 app/tmp/sessions/empty create mode 100755 app/tmp/tests/empty create mode 100644 app/vendors/shells/tasks/empty create mode 100644 app/vendors/shells/templates/empty create mode 100644 app/views/elements/email/html/empty create mode 100644 app/views/elements/email/text/empty create mode 100644 app/views/elements/empty create mode 100644 app/views/errors/empty create mode 100644 app/views/helpers/empty create mode 100644 app/views/layouts/default.ctp create mode 100644 app/views/layouts/email/html/empty create mode 100644 app/views/layouts/email/text/empty create mode 100644 app/views/layouts/js/empty create mode 100644 app/views/layouts/rss/empty create mode 100644 app/views/layouts/slideshow.ctp create mode 100644 app/views/layouts/xml/empty create mode 100644 app/views/pages/empty create mode 100644 app/views/scaffolds/empty create mode 100644 app/views/slides/add.ctp create mode 100644 app/views/slides/edit.ctp create mode 100644 app/views/slides/index.ctp create mode 100644 app/views/slides/next.ctp create mode 100644 app/views/slides/slideshow.ctp create mode 100644 app/views/slides/timing.ctp create mode 100644 app/views/users/login.ctp create mode 100644 app/webroot/css.php create mode 100644 app/webroot/css/cake.generic.css create mode 100644 app/webroot/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 app/webroot/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 app/webroot/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 app/webroot/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 app/webroot/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 app/webroot/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 app/webroot/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 app/webroot/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 app/webroot/css/smoothness/images/ui-icons_222222_256x240.png create mode 100644 app/webroot/css/smoothness/images/ui-icons_2e83ff_256x240.png create mode 100644 app/webroot/css/smoothness/images/ui-icons_454545_256x240.png create mode 100644 app/webroot/css/smoothness/images/ui-icons_888888_256x240.png create mode 100644 app/webroot/css/smoothness/images/ui-icons_cd0a0a_256x240.png create mode 100644 app/webroot/css/smoothness/jquery-ui-1.8.4.custom.css create mode 100644 app/webroot/favicon.ico create mode 100644 app/webroot/files/empty create mode 100644 app/webroot/img/bannerindex-400.png create mode 100644 app/webroot/img/cake.icon.png create mode 100644 app/webroot/img/cake.power.gif create mode 100644 app/webroot/img/noslides.png create mode 100644 app/webroot/img/nothumb.png create mode 100644 app/webroot/index.php create mode 100644 app/webroot/js/jquery-1.4.2.min.js create mode 100644 app/webroot/js/jquery-ui-1.8.4.custom.min.js create mode 100644 app/webroot/js/jquery.cycle.all.min.js create mode 100644 app/webroot/test.php create mode 100644 cake/LICENSE.txt create mode 100644 cake/VERSION.txt create mode 100644 cake/basics.php create mode 100644 cake/bootstrap.php create mode 100644 cake/config/config.php create mode 100644 cake/config/paths.php create mode 100644 cake/config/unicode/casefolding/0080_00ff.php create mode 100644 cake/config/unicode/casefolding/0100_017f.php create mode 100644 cake/config/unicode/casefolding/0180_024F.php create mode 100644 cake/config/unicode/casefolding/0250_02af.php create mode 100644 cake/config/unicode/casefolding/0370_03ff.php create mode 100644 cake/config/unicode/casefolding/0400_04ff.php create mode 100644 cake/config/unicode/casefolding/0500_052f.php create mode 100644 cake/config/unicode/casefolding/0530_058f.php create mode 100644 cake/config/unicode/casefolding/1e00_1eff.php create mode 100644 cake/config/unicode/casefolding/1f00_1fff.php create mode 100644 cake/config/unicode/casefolding/2100_214f.php create mode 100644 cake/config/unicode/casefolding/2150_218f.php create mode 100644 cake/config/unicode/casefolding/2460_24ff.php create mode 100644 cake/config/unicode/casefolding/2c00_2c5f.php create mode 100644 cake/config/unicode/casefolding/2c60_2c7f.php create mode 100644 cake/config/unicode/casefolding/2c80_2cff.php create mode 100644 cake/config/unicode/casefolding/ff00_ffef.php create mode 100644 cake/console/cake create mode 100644 cake/console/cake.bat create mode 100644 cake/console/cake.php create mode 100644 cake/console/error.php create mode 100644 cake/console/libs/acl.php create mode 100644 cake/console/libs/api.php create mode 100644 cake/console/libs/bake.php create mode 100644 cake/console/libs/console.php create mode 100644 cake/console/libs/i18n.php create mode 100644 cake/console/libs/schema.php create mode 100644 cake/console/libs/shell.php create mode 100644 cake/console/libs/tasks/bake.php create mode 100644 cake/console/libs/tasks/controller.php create mode 100644 cake/console/libs/tasks/db_config.php create mode 100644 cake/console/libs/tasks/extract.php create mode 100644 cake/console/libs/tasks/fixture.php create mode 100644 cake/console/libs/tasks/model.php create mode 100644 cake/console/libs/tasks/plugin.php create mode 100644 cake/console/libs/tasks/project.php create mode 100644 cake/console/libs/tasks/template.php create mode 100644 cake/console/libs/tasks/test.php create mode 100644 cake/console/libs/tasks/view.php create mode 100644 cake/console/libs/testsuite.php create mode 100644 cake/console/templates/default/actions/controller_actions.ctp create mode 100644 cake/console/templates/default/classes/controller.ctp create mode 100644 cake/console/templates/default/classes/fixture.ctp create mode 100644 cake/console/templates/default/classes/model.ctp create mode 100644 cake/console/templates/default/classes/test.ctp create mode 100644 cake/console/templates/default/views/form.ctp create mode 100644 cake/console/templates/default/views/home.ctp create mode 100644 cake/console/templates/default/views/index.ctp create mode 100644 cake/console/templates/default/views/view.ctp create mode 100644 cake/console/templates/skel/.htaccess create mode 100644 cake/console/templates/skel/app_controller.php create mode 100644 cake/console/templates/skel/app_helper.php create mode 100644 cake/console/templates/skel/app_model.php create mode 100644 cake/console/templates/skel/config/acl.ini.php create mode 100644 cake/console/templates/skel/config/bootstrap.php create mode 100644 cake/console/templates/skel/config/core.php create mode 100644 cake/console/templates/skel/config/database.php.default create mode 100644 cake/console/templates/skel/config/routes.php create mode 100644 cake/console/templates/skel/config/schema/db_acl.php create mode 100644 cake/console/templates/skel/config/schema/db_acl.sql create mode 100644 cake/console/templates/skel/config/schema/i18n.php create mode 100644 cake/console/templates/skel/config/schema/i18n.sql create mode 100644 cake/console/templates/skel/config/schema/sessions.php create mode 100644 cake/console/templates/skel/config/schema/sessions.sql create mode 100644 cake/console/templates/skel/controllers/components/empty create mode 100644 cake/console/templates/skel/controllers/pages_controller.php create mode 100644 cake/console/templates/skel/index.php create mode 100644 cake/console/templates/skel/libs/empty create mode 100644 cake/console/templates/skel/locale/eng/LC_MESSAGES/empty create mode 100644 cake/console/templates/skel/models/behaviors/empty create mode 100644 cake/console/templates/skel/models/datasources/empty create mode 100644 cake/console/templates/skel/plugins/empty create mode 100644 cake/console/templates/skel/tests/cases/behaviors/empty create mode 100644 cake/console/templates/skel/tests/cases/components/empty create mode 100644 cake/console/templates/skel/tests/cases/controllers/empty create mode 100644 cake/console/templates/skel/tests/cases/datasources/empty create mode 100644 cake/console/templates/skel/tests/cases/helpers/empty create mode 100644 cake/console/templates/skel/tests/cases/models/empty create mode 100644 cake/console/templates/skel/tests/cases/shells/empty create mode 100644 cake/console/templates/skel/tests/fixtures/empty create mode 100644 cake/console/templates/skel/tests/groups/empty create mode 100644 cake/console/templates/skel/tmp/cache/models/empty create mode 100644 cake/console/templates/skel/tmp/cache/persistent/empty create mode 100644 cake/console/templates/skel/tmp/cache/views/empty create mode 100644 cake/console/templates/skel/tmp/logs/empty create mode 100644 cake/console/templates/skel/tmp/sessions/empty create mode 100644 cake/console/templates/skel/tmp/tests/empty create mode 100644 cake/console/templates/skel/vendors/shells/tasks/empty create mode 100644 cake/console/templates/skel/views/elements/email/html/default.ctp create mode 100644 cake/console/templates/skel/views/elements/email/text/default.ctp create mode 100644 cake/console/templates/skel/views/elements/empty create mode 100644 cake/console/templates/skel/views/errors/empty create mode 100644 cake/console/templates/skel/views/helpers/empty create mode 100644 cake/console/templates/skel/views/layouts/ajax.ctp create mode 100644 cake/console/templates/skel/views/layouts/default.ctp create mode 100644 cake/console/templates/skel/views/layouts/email/html/default.ctp create mode 100644 cake/console/templates/skel/views/layouts/email/text/default.ctp create mode 100644 cake/console/templates/skel/views/layouts/flash.ctp create mode 100644 cake/console/templates/skel/views/layouts/js/default.ctp create mode 100644 cake/console/templates/skel/views/layouts/rss/default.ctp create mode 100644 cake/console/templates/skel/views/layouts/xml/default.ctp create mode 100644 cake/console/templates/skel/views/pages/empty create mode 100644 cake/console/templates/skel/views/scaffolds/empty create mode 100644 cake/console/templates/skel/webroot/.htaccess create mode 100644 cake/console/templates/skel/webroot/css.php create mode 100644 cake/console/templates/skel/webroot/css/cake.generic.css create mode 100644 cake/console/templates/skel/webroot/favicon.ico create mode 100644 cake/console/templates/skel/webroot/img/cake.icon.png create mode 100644 cake/console/templates/skel/webroot/img/cake.power.gif create mode 100644 cake/console/templates/skel/webroot/index.php create mode 100644 cake/console/templates/skel/webroot/js/empty create mode 100644 cake/console/templates/skel/webroot/test.php create mode 100644 cake/dispatcher.php create mode 100644 cake/libs/cache.php create mode 100644 cake/libs/cache/apc.php create mode 100644 cake/libs/cache/file.php create mode 100644 cake/libs/cache/memcache.php create mode 100644 cake/libs/cache/xcache.php create mode 100644 cake/libs/cake_log.php create mode 100644 cake/libs/cake_session.php create mode 100644 cake/libs/cake_socket.php create mode 100644 cake/libs/class_registry.php create mode 100644 cake/libs/configure.php create mode 100644 cake/libs/controller/app_controller.php create mode 100644 cake/libs/controller/component.php create mode 100644 cake/libs/controller/components/acl.php create mode 100644 cake/libs/controller/components/auth.php create mode 100644 cake/libs/controller/components/cookie.php create mode 100755 cake/libs/controller/components/email.php create mode 100644 cake/libs/controller/components/request_handler.php create mode 100644 cake/libs/controller/components/security.php create mode 100644 cake/libs/controller/components/session.php create mode 100644 cake/libs/controller/controller.php create mode 100644 cake/libs/controller/pages_controller.php create mode 100644 cake/libs/controller/scaffold.php create mode 100644 cake/libs/debugger.php create mode 100644 cake/libs/error.php create mode 100644 cake/libs/file.php create mode 100644 cake/libs/folder.php create mode 100644 cake/libs/http_socket.php create mode 100644 cake/libs/i18n.php create mode 100644 cake/libs/inflector.php create mode 100644 cake/libs/l10n.php create mode 100644 cake/libs/log/file_log.php create mode 100644 cake/libs/magic_db.php create mode 100644 cake/libs/model/app_model.php create mode 100644 cake/libs/model/behaviors/acl.php create mode 100644 cake/libs/model/behaviors/containable.php create mode 100644 cake/libs/model/behaviors/translate.php create mode 100644 cake/libs/model/behaviors/tree.php create mode 100644 cake/libs/model/cake_schema.php create mode 100644 cake/libs/model/connection_manager.php create mode 100644 cake/libs/model/datasources/datasource.php create mode 100644 cake/libs/model/datasources/dbo/dbo_mssql.php create mode 100644 cake/libs/model/datasources/dbo/dbo_mysql.php create mode 100644 cake/libs/model/datasources/dbo/dbo_mysqli.php create mode 100644 cake/libs/model/datasources/dbo/dbo_oracle.php create mode 100644 cake/libs/model/datasources/dbo/dbo_postgres.php create mode 100644 cake/libs/model/datasources/dbo/dbo_sqlite.php create mode 100755 cake/libs/model/datasources/dbo_source.php create mode 100644 cake/libs/model/db_acl.php create mode 100644 cake/libs/model/model.php create mode 100644 cake/libs/model/model_behavior.php create mode 100644 cake/libs/multibyte.php create mode 100644 cake/libs/object.php create mode 100644 cake/libs/overloadable.php create mode 100644 cake/libs/overloadable_php4.php create mode 100644 cake/libs/overloadable_php5.php create mode 100644 cake/libs/router.php create mode 100644 cake/libs/sanitize.php create mode 100644 cake/libs/security.php create mode 100644 cake/libs/set.php create mode 100644 cake/libs/string.php create mode 100644 cake/libs/validation.php create mode 100644 cake/libs/view/elements/email/html/default.ctp create mode 100644 cake/libs/view/elements/email/text/default.ctp create mode 100644 cake/libs/view/elements/sql_dump.ctp create mode 100644 cake/libs/view/errors/error404.ctp create mode 100644 cake/libs/view/errors/error500.ctp create mode 100644 cake/libs/view/errors/missing_action.ctp create mode 100644 cake/libs/view/errors/missing_behavior_class.ctp create mode 100644 cake/libs/view/errors/missing_behavior_file.ctp create mode 100644 cake/libs/view/errors/missing_component_class.ctp create mode 100644 cake/libs/view/errors/missing_component_file.ctp create mode 100644 cake/libs/view/errors/missing_connection.ctp create mode 100644 cake/libs/view/errors/missing_controller.ctp create mode 100644 cake/libs/view/errors/missing_helper_class.ctp create mode 100644 cake/libs/view/errors/missing_helper_file.ctp create mode 100644 cake/libs/view/errors/missing_layout.ctp create mode 100644 cake/libs/view/errors/missing_model.ctp create mode 100644 cake/libs/view/errors/missing_scaffolddb.ctp create mode 100644 cake/libs/view/errors/missing_table.ctp create mode 100644 cake/libs/view/errors/missing_view.ctp create mode 100644 cake/libs/view/errors/private_action.ctp create mode 100644 cake/libs/view/errors/scaffold_error.ctp create mode 100644 cake/libs/view/helper.php create mode 100644 cake/libs/view/helpers/ajax.php create mode 100644 cake/libs/view/helpers/app_helper.php create mode 100644 cake/libs/view/helpers/cache.php create mode 100644 cake/libs/view/helpers/form.php create mode 100644 cake/libs/view/helpers/html.php create mode 100644 cake/libs/view/helpers/javascript.php create mode 100644 cake/libs/view/helpers/jquery_engine.php create mode 100644 cake/libs/view/helpers/js.php create mode 100644 cake/libs/view/helpers/mootools_engine.php create mode 100644 cake/libs/view/helpers/number.php create mode 100644 cake/libs/view/helpers/paginator.php create mode 100644 cake/libs/view/helpers/prototype_engine.php create mode 100644 cake/libs/view/helpers/rss.php create mode 100644 cake/libs/view/helpers/session.php create mode 100644 cake/libs/view/helpers/text.php create mode 100644 cake/libs/view/helpers/time.php create mode 100644 cake/libs/view/helpers/xml.php create mode 100644 cake/libs/view/layouts/ajax.ctp create mode 100644 cake/libs/view/layouts/default.ctp create mode 100644 cake/libs/view/layouts/email/html/default.ctp create mode 100644 cake/libs/view/layouts/email/text/default.ctp create mode 100644 cake/libs/view/layouts/flash.ctp create mode 100644 cake/libs/view/layouts/js/default.ctp create mode 100644 cake/libs/view/layouts/rss/default.ctp create mode 100644 cake/libs/view/layouts/xml/default.ctp create mode 100644 cake/libs/view/media.php create mode 100644 cake/libs/view/pages/home.ctp create mode 100644 cake/libs/view/scaffolds/edit.ctp create mode 100644 cake/libs/view/scaffolds/index.ctp create mode 100644 cake/libs/view/scaffolds/view.ctp create mode 100644 cake/libs/view/theme.php create mode 100644 cake/libs/view/view.php create mode 100644 cake/libs/xml.php create mode 100644 cake/tests/cases/basics.test.php create mode 100644 cake/tests/cases/console/cake.test.php create mode 100644 cake/tests/cases/console/libs/acl.test.php create mode 100644 cake/tests/cases/console/libs/api.test.php create mode 100644 cake/tests/cases/console/libs/bake.test.php create mode 100644 cake/tests/cases/console/libs/schema.test.php create mode 100644 cake/tests/cases/console/libs/shell.test.php create mode 100644 cake/tests/cases/console/libs/tasks/controller.test.php create mode 100644 cake/tests/cases/console/libs/tasks/db_config.test.php create mode 100644 cake/tests/cases/console/libs/tasks/extract.test.php create mode 100644 cake/tests/cases/console/libs/tasks/fixture.test.php create mode 100644 cake/tests/cases/console/libs/tasks/model.test.php create mode 100644 cake/tests/cases/console/libs/tasks/plugin.test.php create mode 100644 cake/tests/cases/console/libs/tasks/project.test.php create mode 100644 cake/tests/cases/console/libs/tasks/template.test.php create mode 100644 cake/tests/cases/console/libs/tasks/test.test.php create mode 100644 cake/tests/cases/console/libs/tasks/view.test.php create mode 100644 cake/tests/cases/dispatcher.test.php create mode 100644 cake/tests/cases/libs/cache.test.php create mode 100644 cake/tests/cases/libs/cache/apc.test.php create mode 100644 cake/tests/cases/libs/cache/file.test.php create mode 100644 cake/tests/cases/libs/cache/memcache.test.php create mode 100644 cake/tests/cases/libs/cache/xcache.test.php create mode 100644 cake/tests/cases/libs/cake_log.test.php create mode 100644 cake/tests/cases/libs/cake_session.test.php create mode 100644 cake/tests/cases/libs/cake_socket.test.php create mode 100644 cake/tests/cases/libs/cake_test_case.test.php create mode 100644 cake/tests/cases/libs/cake_test_fixture.test.php create mode 100644 cake/tests/cases/libs/class_registry.test.php create mode 100644 cake/tests/cases/libs/code_coverage_manager.test.php create mode 100644 cake/tests/cases/libs/configure.test.php create mode 100644 cake/tests/cases/libs/controller/component.test.php create mode 100644 cake/tests/cases/libs/controller/components/acl.test.php create mode 100644 cake/tests/cases/libs/controller/components/auth.test.php create mode 100644 cake/tests/cases/libs/controller/components/cookie.test.php create mode 100755 cake/tests/cases/libs/controller/components/email.test.php create mode 100644 cake/tests/cases/libs/controller/components/request_handler.test.php create mode 100644 cake/tests/cases/libs/controller/components/security.test.php create mode 100644 cake/tests/cases/libs/controller/components/session.test.php create mode 100644 cake/tests/cases/libs/controller/controller.test.php create mode 100644 cake/tests/cases/libs/controller/controller_merge_vars.test.php create mode 100644 cake/tests/cases/libs/controller/pages_controller.test.php create mode 100644 cake/tests/cases/libs/controller/scaffold.test.php create mode 100644 cake/tests/cases/libs/debugger.test.php create mode 100644 cake/tests/cases/libs/error.test.php create mode 100644 cake/tests/cases/libs/file.test.php create mode 100644 cake/tests/cases/libs/folder.test.php create mode 100644 cake/tests/cases/libs/http_socket.test.php create mode 100644 cake/tests/cases/libs/i18n.test.php create mode 100644 cake/tests/cases/libs/inflector.test.php create mode 100644 cake/tests/cases/libs/l10n.test.php create mode 100644 cake/tests/cases/libs/log/file_log.test.php create mode 100644 cake/tests/cases/libs/magic_db.test.php create mode 100644 cake/tests/cases/libs/model/behaviors/acl.test.php create mode 100644 cake/tests/cases/libs/model/behaviors/containable.test.php create mode 100644 cake/tests/cases/libs/model/behaviors/translate.test.php create mode 100644 cake/tests/cases/libs/model/behaviors/tree.test.php create mode 100644 cake/tests/cases/libs/model/cake_schema.test.php create mode 100644 cake/tests/cases/libs/model/connection_manager.test.php create mode 100644 cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php create mode 100644 cake/tests/cases/libs/model/datasources/dbo/dbo_mysql.test.php create mode 100644 cake/tests/cases/libs/model/datasources/dbo/dbo_mysqli.test.php create mode 100644 cake/tests/cases/libs/model/datasources/dbo/dbo_oracle.test.php create mode 100644 cake/tests/cases/libs/model/datasources/dbo/dbo_postgres.test.php create mode 100644 cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php create mode 100644 cake/tests/cases/libs/model/datasources/dbo_source.test.php create mode 100644 cake/tests/cases/libs/model/db_acl.test.php create mode 100644 cake/tests/cases/libs/model/model.test.php create mode 100644 cake/tests/cases/libs/model/model_behavior.test.php create mode 100644 cake/tests/cases/libs/model/model_delete.test.php create mode 100644 cake/tests/cases/libs/model/model_integration.test.php create mode 100755 cake/tests/cases/libs/model/model_read.test.php create mode 100644 cake/tests/cases/libs/model/model_validation.test.php create mode 100644 cake/tests/cases/libs/model/model_write.test.php create mode 100644 cake/tests/cases/libs/model/models.php create mode 100644 cake/tests/cases/libs/multibyte.test.php create mode 100644 cake/tests/cases/libs/object.test.php create mode 100644 cake/tests/cases/libs/overloadable.test.php create mode 100644 cake/tests/cases/libs/router.test.php create mode 100644 cake/tests/cases/libs/sanitize.test.php create mode 100644 cake/tests/cases/libs/security.test.php create mode 100644 cake/tests/cases/libs/set.test.php create mode 100644 cake/tests/cases/libs/string.test.php create mode 100644 cake/tests/cases/libs/test_manager.test.php create mode 100644 cake/tests/cases/libs/validation.test.php create mode 100644 cake/tests/cases/libs/view/helper.test.php create mode 100644 cake/tests/cases/libs/view/helpers/ajax.test.php create mode 100644 cake/tests/cases/libs/view/helpers/cache.test.php create mode 100644 cake/tests/cases/libs/view/helpers/form.test.php create mode 100644 cake/tests/cases/libs/view/helpers/html.test.php create mode 100644 cake/tests/cases/libs/view/helpers/javascript.test.php create mode 100644 cake/tests/cases/libs/view/helpers/jquery_engine.test.php create mode 100644 cake/tests/cases/libs/view/helpers/js.test.php create mode 100644 cake/tests/cases/libs/view/helpers/mootools_engine.test.php create mode 100644 cake/tests/cases/libs/view/helpers/number.test.php create mode 100644 cake/tests/cases/libs/view/helpers/paginator.test.php create mode 100644 cake/tests/cases/libs/view/helpers/prototype_engine.test.php create mode 100644 cake/tests/cases/libs/view/helpers/rss.test.php create mode 100644 cake/tests/cases/libs/view/helpers/session.test.php create mode 100644 cake/tests/cases/libs/view/helpers/text.test.php create mode 100644 cake/tests/cases/libs/view/helpers/time.test.php create mode 100644 cake/tests/cases/libs/view/helpers/xml.test.php create mode 100644 cake/tests/cases/libs/view/media.test.php create mode 100644 cake/tests/cases/libs/view/theme.test.php create mode 100644 cake/tests/cases/libs/view/view.test.php create mode 100644 cake/tests/cases/libs/xml.test.php create mode 100644 cake/tests/fixtures/account_fixture.php create mode 100644 cake/tests/fixtures/aco_action_fixture.php create mode 100644 cake/tests/fixtures/aco_fixture.php create mode 100644 cake/tests/fixtures/aco_two_fixture.php create mode 100644 cake/tests/fixtures/ad_fixture.php create mode 100644 cake/tests/fixtures/advertisement_fixture.php create mode 100644 cake/tests/fixtures/after_tree_fixture.php create mode 100644 cake/tests/fixtures/another_article_fixture.php create mode 100644 cake/tests/fixtures/apple_fixture.php create mode 100644 cake/tests/fixtures/aro_fixture.php create mode 100644 cake/tests/fixtures/aro_two_fixture.php create mode 100644 cake/tests/fixtures/aros_aco_fixture.php create mode 100644 cake/tests/fixtures/aros_aco_two_fixture.php create mode 100644 cake/tests/fixtures/article_featured_fixture.php create mode 100644 cake/tests/fixtures/article_featureds_tags_fixture.php create mode 100644 cake/tests/fixtures/article_fixture.php create mode 100644 cake/tests/fixtures/articles_tag_fixture.php create mode 100644 cake/tests/fixtures/attachment_fixture.php create mode 100644 cake/tests/fixtures/auth_user_custom_field_fixture.php create mode 100644 cake/tests/fixtures/auth_user_fixture.php create mode 100644 cake/tests/fixtures/author_fixture.php create mode 100644 cake/tests/fixtures/basket_fixture.php create mode 100644 cake/tests/fixtures/bid_fixture.php create mode 100644 cake/tests/fixtures/binary_test_fixture.php create mode 100644 cake/tests/fixtures/book_fixture.php create mode 100644 cake/tests/fixtures/cache_test_model_fixture.php create mode 100644 cake/tests/fixtures/callback_fixture.php create mode 100644 cake/tests/fixtures/campaign_fixture.php create mode 100644 cake/tests/fixtures/category_fixture.php create mode 100644 cake/tests/fixtures/category_thread_fixture.php create mode 100644 cake/tests/fixtures/cd_fixture.php create mode 100644 cake/tests/fixtures/comment_fixture.php create mode 100644 cake/tests/fixtures/content_account_fixture.php create mode 100644 cake/tests/fixtures/content_fixture.php create mode 100644 cake/tests/fixtures/counter_cache_post_fixture.php create mode 100644 cake/tests/fixtures/counter_cache_post_nonstandard_primary_key_fixture.php create mode 100644 cake/tests/fixtures/counter_cache_user_fixture.php create mode 100644 cake/tests/fixtures/counter_cache_user_nonstandard_primary_key_fixture.php create mode 100644 cake/tests/fixtures/data_test_fixture.php create mode 100644 cake/tests/fixtures/datatype_fixture.php create mode 100644 cake/tests/fixtures/dependency_fixture.php create mode 100644 cake/tests/fixtures/device_fixture.php create mode 100644 cake/tests/fixtures/device_type_category_fixture.php create mode 100644 cake/tests/fixtures/device_type_fixture.php create mode 100644 cake/tests/fixtures/document_directory_fixture.php create mode 100644 cake/tests/fixtures/document_fixture.php create mode 100644 cake/tests/fixtures/exterior_type_category_fixture.php create mode 100644 cake/tests/fixtures/feature_set_fixture.php create mode 100644 cake/tests/fixtures/featured_fixture.php create mode 100644 cake/tests/fixtures/film_file_fixture.php create mode 100644 cake/tests/fixtures/flag_tree_fixture.php create mode 100644 cake/tests/fixtures/fruit_fixture.php create mode 100644 cake/tests/fixtures/fruits_uuid_tag_fixture.php create mode 100644 cake/tests/fixtures/group_update_all_fixture.php create mode 100644 cake/tests/fixtures/home_fixture.php create mode 100644 cake/tests/fixtures/image_fixture.php create mode 100644 cake/tests/fixtures/item_fixture.php create mode 100644 cake/tests/fixtures/items_portfolio_fixture.php create mode 100644 cake/tests/fixtures/join_a_b_fixture.php create mode 100644 cake/tests/fixtures/join_a_c_fixture.php create mode 100644 cake/tests/fixtures/join_a_fixture.php create mode 100644 cake/tests/fixtures/join_b_fixture.php create mode 100644 cake/tests/fixtures/join_c_fixture.php create mode 100644 cake/tests/fixtures/join_thing_fixture.php create mode 100644 cake/tests/fixtures/message_fixture.php create mode 100644 cake/tests/fixtures/my_categories_my_products_fixture.php create mode 100644 cake/tests/fixtures/my_categories_my_users_fixture.php create mode 100644 cake/tests/fixtures/my_category_fixture.php create mode 100644 cake/tests/fixtures/my_product_fixture.php create mode 100644 cake/tests/fixtures/my_user_fixture.php create mode 100644 cake/tests/fixtures/node_fixture.php create mode 100644 cake/tests/fixtures/number_tree_fixture.php create mode 100644 cake/tests/fixtures/number_tree_two_fixture.php create mode 100644 cake/tests/fixtures/numeric_article_fixture.php create mode 100644 cake/tests/fixtures/overall_favorite_fixture.php create mode 100644 cake/tests/fixtures/person_fixture.php create mode 100644 cake/tests/fixtures/portfolio_fixture.php create mode 100644 cake/tests/fixtures/post_fixture.php create mode 100644 cake/tests/fixtures/posts_tag_fixture.php create mode 100644 cake/tests/fixtures/primary_model_fixture.php create mode 100644 cake/tests/fixtures/product_fixture.php create mode 100644 cake/tests/fixtures/product_update_all_fixture.php create mode 100644 cake/tests/fixtures/project_fixture.php create mode 100644 cake/tests/fixtures/sample_fixture.php create mode 100644 cake/tests/fixtures/secondary_model_fixture.php create mode 100644 cake/tests/fixtures/session_fixture.php create mode 100644 cake/tests/fixtures/something_else_fixture.php create mode 100644 cake/tests/fixtures/something_fixture.php create mode 100644 cake/tests/fixtures/stories_tag_fixture.php create mode 100644 cake/tests/fixtures/story_fixture.php create mode 100644 cake/tests/fixtures/syfile_fixture.php create mode 100644 cake/tests/fixtures/tag_fixture.php create mode 100644 cake/tests/fixtures/test_plugin_article_fixture.php create mode 100644 cake/tests/fixtures/test_plugin_comment_fixture.php create mode 100644 cake/tests/fixtures/the_paper_monkies_fixture.php create mode 100644 cake/tests/fixtures/thread_fixture.php create mode 100644 cake/tests/fixtures/translate_article_fixture.php create mode 100644 cake/tests/fixtures/translate_fixture.php create mode 100644 cake/tests/fixtures/translate_table_fixture.php create mode 100644 cake/tests/fixtures/translate_with_prefix_fixture.php create mode 100644 cake/tests/fixtures/translated_article_fixture.php create mode 100644 cake/tests/fixtures/translated_item_fixture.php create mode 100644 cake/tests/fixtures/unconventional_tree_fixture.php create mode 100644 cake/tests/fixtures/underscore_field_fixture.php create mode 100644 cake/tests/fixtures/user_fixture.php create mode 100644 cake/tests/fixtures/uuid_fixture.php create mode 100644 cake/tests/fixtures/uuid_tag_fixture.php create mode 100644 cake/tests/fixtures/uuid_tree_fixture.php create mode 100644 cake/tests/fixtures/uuiditem_fixture.php create mode 100644 cake/tests/fixtures/uuiditems_uuidportfolio_fixture.php create mode 100644 cake/tests/fixtures/uuiditems_uuidportfolio_numericid_fixture.php create mode 100644 cake/tests/fixtures/uuidportfolio_fixture.php create mode 100644 cake/tests/groups/acl.group.php create mode 100644 cake/tests/groups/bake.group.php create mode 100644 cake/tests/groups/behaviors.group.php create mode 100644 cake/tests/groups/cache.group.php create mode 100644 cake/tests/groups/components.group.php create mode 100644 cake/tests/groups/configure.group.php create mode 100644 cake/tests/groups/console.group.php create mode 100644 cake/tests/groups/controller.group.php create mode 100644 cake/tests/groups/database.group.php create mode 100644 cake/tests/groups/helpers.group.php create mode 100644 cake/tests/groups/i18n.group.php create mode 100644 cake/tests/groups/javascript.group.php create mode 100644 cake/tests/groups/lib.group.php create mode 100644 cake/tests/groups/model.group.php create mode 100644 cake/tests/groups/no_cross_contamination.group.php create mode 100644 cake/tests/groups/routing_system.group.php create mode 100644 cake/tests/groups/socket.group.php create mode 100644 cake/tests/groups/test_suite.group.php create mode 100644 cake/tests/groups/view.group.php create mode 100644 cake/tests/groups/xml.group.php create mode 100644 cake/tests/lib/cake_test_case.php create mode 100644 cake/tests/lib/cake_test_fixture.php create mode 100644 cake/tests/lib/cake_test_model.php create mode 100644 cake/tests/lib/cake_test_suite_dispatcher.php create mode 100644 cake/tests/lib/cake_web_test_case.php create mode 100644 cake/tests/lib/code_coverage_manager.php create mode 100644 cake/tests/lib/reporter/cake_base_reporter.php create mode 100644 cake/tests/lib/reporter/cake_cli_reporter.php create mode 100755 cake/tests/lib/reporter/cake_html_reporter.php create mode 100644 cake/tests/lib/reporter/cake_text_reporter.php create mode 100644 cake/tests/lib/templates/footer.php create mode 100644 cake/tests/lib/templates/header.php create mode 100644 cake/tests/lib/templates/menu.php create mode 100644 cake/tests/lib/templates/simpletest.php create mode 100644 cake/tests/lib/templates/xdebug.php create mode 100644 cake/tests/lib/test_manager.php create mode 100644 cake/tests/test_app/config/acl.ini.php create mode 100644 cake/tests/test_app/controllers/components/empty create mode 100644 cake/tests/test_app/controllers/tests_apps_controller.php create mode 100644 cake/tests/test_app/controllers/tests_apps_posts_controller.php create mode 100644 cake/tests/test_app/libs/cache/test_app_cache.php create mode 100644 cake/tests/test_app/libs/library.php create mode 100644 cake/tests/test_app/libs/log/test_app_log.php create mode 100644 cake/tests/test_app/locale/ja_jp/LC_TIME create mode 100644 cake/tests/test_app/locale/po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/po/LC_MONETARY/default.po create mode 100644 cake/tests/test_app/locale/po/LC_TIME create mode 100644 cake/tests/test_app/locale/rule_0_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_0_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_0_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_0_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_10_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_10_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_10_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_10_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_11_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_11_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_11_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_11_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_12_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_12_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_12_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_12_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_13_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_13_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_13_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_13_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_14_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_14_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_14_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_14_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_1_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_1_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_1_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_1_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_2_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_2_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_2_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_2_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_3_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_3_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_3_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_3_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_4_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_4_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_4_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_4_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_5_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_5_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_5_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_5_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_6_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_6_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_6_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_6_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_7_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_7_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_7_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_7_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_8_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_8_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_8_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_8_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/rule_9_mo/LC_MESSAGES/core.mo create mode 100644 cake/tests/test_app/locale/rule_9_mo/LC_MESSAGES/default.mo create mode 100644 cake/tests/test_app/locale/rule_9_po/LC_MESSAGES/core.po create mode 100644 cake/tests/test_app/locale/rule_9_po/LC_MESSAGES/default.po create mode 100644 cake/tests/test_app/locale/time_test/LC_TIME create mode 100644 cake/tests/test_app/models/behaviors/empty create mode 100644 cake/tests/test_app/models/behaviors/persister_one_behavior.php create mode 100644 cake/tests/test_app/models/behaviors/persister_two_behavior.php create mode 100644 cake/tests/test_app/models/comment.php create mode 100644 cake/tests/test_app/models/datasources/test/test_local_driver.php create mode 100644 cake/tests/test_app/models/datasources/test2_other_source.php create mode 100644 cake/tests/test_app/models/datasources/test2_source.php create mode 100644 cake/tests/test_app/models/persister_one.php create mode 100644 cake/tests/test_app/models/persister_two.php create mode 100644 cake/tests/test_app/models/post.php create mode 100644 cake/tests/test_app/plugins/plugin_js/webroot/js/one/plugin_one.js create mode 100644 cake/tests/test_app/plugins/plugin_js/webroot/js/plugin_js.js create mode 100644 cake/tests/test_app/plugins/test_plugin/config/load.php create mode 100644 cake/tests/test_app/plugins/test_plugin/config/more.load.php create mode 100644 cake/tests/test_app/plugins/test_plugin/config/schema/schema.php create mode 100644 cake/tests/test_app/plugins/test_plugin/controllers/components/other_component.php create mode 100644 cake/tests/test_app/plugins/test_plugin/controllers/components/plugins_component.php create mode 100644 cake/tests/test_app/plugins/test_plugin/controllers/components/test_plugin_component.php create mode 100644 cake/tests/test_app/plugins/test_plugin/controllers/components/test_plugin_other_component.php create mode 100644 cake/tests/test_app/plugins/test_plugin/controllers/test_plugin_controller.php create mode 100644 cake/tests/test_app/plugins/test_plugin/controllers/tests_controller.php create mode 100644 cake/tests/test_app/plugins/test_plugin/libs/cache/test_plugin_cache.php create mode 100644 cake/tests/test_app/plugins/test_plugin/libs/log/test_plugin_log.php create mode 100644 cake/tests/test_app/plugins/test_plugin/libs/test_plugin_library.php create mode 100644 cake/tests/test_app/plugins/test_plugin/locale/po/LC_MESSAGES/test_plugin.po create mode 100644 cake/tests/test_app/plugins/test_plugin/locale/po/LC_MONETARY/test_plugin.po create mode 100644 cake/tests/test_app/plugins/test_plugin/models/behaviors/test_plugin_persister_one.php create mode 100644 cake/tests/test_app/plugins/test_plugin/models/behaviors/test_plugin_persister_two.php create mode 100644 cake/tests/test_app/plugins/test_plugin/models/datasources/dbo/dbo_dummy.php create mode 100644 cake/tests/test_app/plugins/test_plugin/models/datasources/test/test_driver.php create mode 100644 cake/tests/test_app/plugins/test_plugin/models/datasources/test_other_source.php create mode 100644 cake/tests/test_app/plugins/test_plugin/models/datasources/test_source.php create mode 100644 cake/tests/test_app/plugins/test_plugin/models/test_plugin_auth_user.php create mode 100644 cake/tests/test_app/plugins/test_plugin/models/test_plugin_authors.php create mode 100644 cake/tests/test_app/plugins/test_plugin/models/test_plugin_comment.php create mode 100644 cake/tests/test_app/plugins/test_plugin/models/test_plugin_post.php create mode 100644 cake/tests/test_app/plugins/test_plugin/test_plugin_app_controller.php create mode 100644 cake/tests/test_app/plugins/test_plugin/test_plugin_app_model.php create mode 100644 cake/tests/test_app/plugins/test_plugin/vendors/sample/sample_plugin.php create mode 100644 cake/tests/test_app/plugins/test_plugin/vendors/shells/example.php create mode 100644 cake/tests/test_app/plugins/test_plugin/vendors/shells/tasks/empty create mode 100644 cake/tests/test_app/plugins/test_plugin/vendors/shells/templates/empty create mode 100644 cake/tests/test_app/plugins/test_plugin/vendors/welcome.php create mode 100644 cake/tests/test_app/plugins/test_plugin/views/elements/plugin_element.ctp create mode 100644 cake/tests/test_app/plugins/test_plugin/views/elements/test_plugin_element.ctp create mode 100644 cake/tests/test_app/plugins/test_plugin/views/helpers/other_helper.php create mode 100644 cake/tests/test_app/plugins/test_plugin/views/helpers/plugged_helper.php create mode 100644 cake/tests/test_app/plugins/test_plugin/views/layouts/default.ctp create mode 100644 cake/tests/test_app/plugins/test_plugin/views/tests/index.ctp create mode 100644 cake/tests/test_app/plugins/test_plugin/views/tests/scaffold.edit.ctp create mode 100644 cake/tests/test_app/plugins/test_plugin/webroot/css/test_plugin_asset.css create mode 100644 cake/tests/test_app/plugins/test_plugin/webroot/css/theme_one.htc create mode 100644 cake/tests/test_app/plugins/test_plugin/webroot/css/unknown.extension create mode 100644 cake/tests/test_app/plugins/test_plugin/webroot/flash/plugin_test.swf create mode 100644 cake/tests/test_app/plugins/test_plugin/webroot/img/cake.icon.gif create mode 100644 cake/tests/test_app/plugins/test_plugin/webroot/js/test_plugin/test.js create mode 100644 cake/tests/test_app/plugins/test_plugin/webroot/pdfs/plugin_test.pdf create mode 100644 cake/tests/test_app/plugins/test_plugin/webroot/root.js create mode 100644 cake/tests/test_app/plugins/test_plugin_two/vendors/shells/example.php create mode 100644 cake/tests/test_app/plugins/test_plugin_two/vendors/shells/tasks/empty create mode 100644 cake/tests/test_app/plugins/test_plugin_two/vendors/shells/templates/empty create mode 100644 cake/tests/test_app/plugins/test_plugin_two/vendors/shells/welcome.php create mode 100644 cake/tests/test_app/tmp/dir_map create mode 100644 cake/tests/test_app/vendors/Test/MyTest.php create mode 100644 cake/tests/test_app/vendors/Test/hello.php create mode 100644 cake/tests/test_app/vendors/css/test_asset.css create mode 100644 cake/tests/test_app/vendors/img/test.jpg create mode 100644 cake/tests/test_app/vendors/sample/configure_test_vendor_sample.php create mode 100644 cake/tests/test_app/vendors/shells/sample.php create mode 100644 cake/tests/test_app/vendors/shells/tasks/empty create mode 100644 cake/tests/test_app/vendors/shells/templates/test/classes/test_object.ctp create mode 100644 cake/tests/test_app/vendors/somename/some.name.php create mode 100644 cake/tests/test_app/vendors/welcome.php create mode 100644 cake/tests/test_app/views/elements/email/html/custom.ctp create mode 100644 cake/tests/test_app/views/elements/email/html/default.ctp create mode 100644 cake/tests/test_app/views/elements/email/text/custom.ctp create mode 100644 cake/tests/test_app/views/elements/email/text/default.ctp create mode 100644 cake/tests/test_app/views/elements/email/text/wide.ctp create mode 100644 cake/tests/test_app/views/elements/empty create mode 100644 cake/tests/test_app/views/elements/nocache/contains_nocache.ctp create mode 100644 cake/tests/test_app/views/elements/nocache/plain.ctp create mode 100644 cake/tests/test_app/views/elements/nocache/sub1.ctp create mode 100644 cake/tests/test_app/views/elements/nocache/sub2.ctp create mode 100644 cake/tests/test_app/views/elements/session_helper.ctp create mode 100644 cake/tests/test_app/views/elements/test_element.ctp create mode 100644 cake/tests/test_app/views/errors/empty create mode 100644 cake/tests/test_app/views/helpers/banana.php create mode 100644 cake/tests/test_app/views/helpers/empty create mode 100644 cake/tests/test_app/views/layouts/ajax.ctp create mode 100644 cake/tests/test_app/views/layouts/ajax2.ctp create mode 100644 cake/tests/test_app/views/layouts/cache_empty_sections.ctp create mode 100644 cake/tests/test_app/views/layouts/cache_layout.ctp create mode 100644 cake/tests/test_app/views/layouts/default.ctp create mode 100644 cake/tests/test_app/views/layouts/email/html/default.ctp create mode 100644 cake/tests/test_app/views/layouts/email/html/thin.ctp create mode 100644 cake/tests/test_app/views/layouts/email/text/default.ctp create mode 100644 cake/tests/test_app/views/layouts/flash.ctp create mode 100644 cake/tests/test_app/views/layouts/js/default.ctp create mode 100644 cake/tests/test_app/views/layouts/multi_cache.ctp create mode 100644 cake/tests/test_app/views/layouts/rss/default.ctp create mode 100644 cake/tests/test_app/views/layouts/xml/default.ctp create mode 100644 cake/tests/test_app/views/pages/empty create mode 100644 cake/tests/test_app/views/pages/extract.ctp create mode 100644 cake/tests/test_app/views/pages/home.ctp create mode 100644 cake/tests/test_app/views/posts/cache_empty_sections.ctp create mode 100644 cake/tests/test_app/views/posts/cache_form.ctp create mode 100644 cake/tests/test_app/views/posts/helper_overwrite.ctp create mode 100644 cake/tests/test_app/views/posts/index.ctp create mode 100644 cake/tests/test_app/views/posts/multiple_nocache.ctp create mode 100644 cake/tests/test_app/views/posts/nocache_multiple_element.ctp create mode 100644 cake/tests/test_app/views/posts/scaffold.edit.ctp create mode 100644 cake/tests/test_app/views/posts/sequencial_nocache.ctp create mode 100644 cake/tests/test_app/views/posts/test_nocache_tags.ctp create mode 100644 cake/tests/test_app/views/scaffolds/empty create mode 100644 cake/tests/test_app/views/tests_apps/index.ctp create mode 100644 cake/tests/test_app/views/themed/test_theme/elements/test_element.ctp create mode 100644 cake/tests/test_app/views/themed/test_theme/layouts/default.ctp create mode 100644 cake/tests/test_app/views/themed/test_theme/plugins/test_plugin/layouts/plugin_default.ctp create mode 100644 cake/tests/test_app/views/themed/test_theme/plugins/test_plugin/tests/index.ctp create mode 100644 cake/tests/test_app/views/themed/test_theme/posts/index.ctp create mode 100644 cake/tests/test_app/views/themed/test_theme/posts/scaffold.index.ctp create mode 100644 cake/tests/test_app/views/themed/test_theme/webroot/css/test_asset.css create mode 100644 cake/tests/test_app/views/themed/test_theme/webroot/css/theme_webroot.css create mode 100644 cake/tests/test_app/views/themed/test_theme/webroot/flash/theme_test.swf create mode 100644 cake/tests/test_app/views/themed/test_theme/webroot/img/cake.power.gif create mode 100644 cake/tests/test_app/views/themed/test_theme/webroot/img/test.jpg create mode 100644 cake/tests/test_app/views/themed/test_theme/webroot/js/one/theme_one.js create mode 100644 cake/tests/test_app/views/themed/test_theme/webroot/js/theme.js create mode 100644 cake/tests/test_app/views/themed/test_theme/webroot/pdfs/theme_test.pdf create mode 100644 cake/tests/test_app/webroot/theme/test_theme/css/theme_webroot.css create mode 100644 cake/tests/test_app/webroot/theme/test_theme/css/webroot_test.css create mode 100644 cake/tests/test_app/webroot/theme/test_theme/img/cake.power.gif create mode 100644 cake/tests/test_app/webroot/theme/test_theme/img/test.jpg create mode 100644 index.php create mode 100644 plugins/empty create mode 100644 sql create mode 100644 vendors/shells/tasks/empty create mode 100644 vendors/shells/templates/empty diff --git a/.buildpath b/.buildpath new file mode 100644 index 0000000..8bcb4b5 --- /dev/null +++ b/.buildpath @@ -0,0 +1,5 @@ + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9edf610 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/app/config +/app/tmp +/plugins +/vendors \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..dde725a --- /dev/null +++ b/.project @@ -0,0 +1,22 @@ + + + Infoskjerm + + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.dltk.core.scriptbuilder + + + + + + org.eclipse.php.core.PHPNature + + diff --git a/.settings/org.eclipse.php.core.prefs b/.settings/org.eclipse.php.core.prefs new file mode 100644 index 0000000..471ca09 --- /dev/null +++ b/.settings/org.eclipse.php.core.prefs @@ -0,0 +1,3 @@ +#Mon Aug 09 22:20:30 CEST 2010 +eclipse.preferences.version=1 +include_path=0;/Infoskjerm diff --git a/README b/README new file mode 100644 index 0000000..b92cb46 --- /dev/null +++ b/README @@ -0,0 +1,34 @@ +CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Active Record, Association Data Mapping, Front Controller and MVC. Our primary goal is to provide a structured framework that enables PHP users at all levels to rapidly develop robust web applications, without any loss to flexibility. + +The Cake Software Foundation - promoting development related to CakePHP +http://cakefoundation.org/ + +CakePHP - the rapid development PHP framework +http://www.cakephp.org + +Cookbook - user documentation for learning about CakePHP +http://book.cakephp.org + +API - quick reference to CakePHP +http://api.cakephp.org + +The Bakery - everything CakePHP +http://bakery.cakephp.org + +The Show - live and archived podcasts about CakePHP and more +http://live.cakephp.org + +CakePHP Google Group - community mailing list and forum +http://groups.google.com/group/cake-php + +#cakephp on irc.freenode.net - chat with CakePHP developers +irc://irc.freenode.net/cakephp + +CakeForge - open development for CakePHP +http://cakeforge.org + +CakePHP gear +http://www.cafepress.com/cakefoundation + +Recommended Reading +http://astore.amazon.com/cakesoftwaref-20/ \ No newline at end of file diff --git a/app/app_controller.php b/app/app_controller.php new file mode 100644 index 0000000..92634f3 --- /dev/null +++ b/app/app_controller.php @@ -0,0 +1,12 @@ +Auth->loginRedirect = '/slides/index'; + $this->Auth->loginUrl = '/users/login'; + } +} \ No newline at end of file diff --git a/app/config/acl.ini.php b/app/config/acl.ini.php new file mode 100644 index 0000000..0907fbd --- /dev/null +++ b/app/config/acl.ini.php @@ -0,0 +1,70 @@ +; +; SVN FILE: $Id$ +;/** +; * ACL configuration +; * +; * +; * PHP versions 4 and 5 +; * +; * CakePHP(tm) : Rapid Development Framework http://cakephp.org +; * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) +; * +; * Licensed under The MIT License +; * Redistributions of files must retain the above copyright notice. +; * +; * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) +; * @link http://cakephp.org CakePHP(tm) Project +; * @package cake +; * @subpackage cake.app.config +; * @since CakePHP(tm) v 0.10.0.1076 +; * @license MIT License (http://www.opensource.org/licenses/mit-license.php) +; */ + +; acl.ini.php - Cake ACL Configuration +; --------------------------------------------------------------------- +; Use this file to specify user permissions. +; aco = access control object (something in your application) +; aro = access request object (something requesting access) +; +; User records are added as follows: +; +; [uid] +; groups = group1, group2, group3 +; allow = aco1, aco2, aco3 +; deny = aco4, aco5, aco6 +; +; Group records are added in a similar manner: +; +; [gid] +; allow = aco1, aco2, aco3 +; deny = aco4, aco5, aco6 +; +; The allow, deny, and groups sections are all optional. +; NOTE: groups names *cannot* ever be the same as usernames! +; +; ACL permissions are checked in the following order: +; 1. Check for user denies (and DENY if specified) +; 2. Check for user allows (and ALLOW if specified) +; 3. Gather user's groups +; 4. Check group denies (and DENY if specified) +; 5. Check group allows (and ALLOW if specified) +; 6. If no aro, aco, or group information is found, DENY +; +; --------------------------------------------------------------------- + +;------------------------------------- +;Users +;------------------------------------- + +[username-goes-here] +groups = group1, group2 +deny = aco1, aco2 +allow = aco3, aco4 + +;------------------------------------- +;Groups +;------------------------------------- + +[groupname-goes-here] +deny = aco5, aco6 +allow = aco7, aco8 \ No newline at end of file diff --git a/app/config/bootstrap.php b/app/config/bootstrap.php new file mode 100644 index 0000000..51c7863 --- /dev/null +++ b/app/config/bootstrap.php @@ -0,0 +1,50 @@ + array('/full/path/to/plugins/', '/next/full/path/to/plugins/'), + * 'models' => array('/full/path/to/models/', '/next/full/path/to/models/'), + * 'views' => array('/full/path/to/views/', '/next/full/path/to/views/'), + * 'controllers' => array('/full/path/to/controllers/', '/next/full/path/to/controllers/'), + * 'datasources' => array('/full/path/to/datasources/', '/next/full/path/to/datasources/'), + * 'behaviors' => array('/full/path/to/behaviors/', '/next/full/path/to/behaviors/'), + * 'components' => array('/full/path/to/components/', '/next/full/path/to/components/'), + * 'helpers' => array('/full/path/to/helpers/', '/next/full/path/to/helpers/'), + * 'vendors' => array('/full/path/to/vendors/', '/next/full/path/to/vendors/'), + * 'shells' => array('/full/path/to/shells/', '/next/full/path/to/shells/'), + * 'locales' => array('/full/path/to/locale/', '/next/full/path/to/locale/') + * )); + * + */ + +/** + * As of 1.3, additional rules for the inflector are added below + * + * Inflector::rules('singular', array('rules' => array(), 'irregular' => array(), 'uninflected' => array())); + * Inflector::rules('plural', array('rules' => array(), 'irregular' => array(), 'uninflected' => array())); + * + */ diff --git a/app/config/core.php b/app/config/core.php new file mode 100644 index 0000000..2fed99a --- /dev/null +++ b/app/config/core.php @@ -0,0 +1,302 @@ +cacheAction = true. + * + */ + //Configure::write('Cache.check', true); + +/** + * Defines the default error type when using the log() function. Used for + * differentiating error logging and debugging. Currently PHP supports LOG_DEBUG. + */ + define('LOG_ERROR', 2); + +/** + * The preferred session handling method. Valid values: + * + * 'php' Uses settings defined in your php.ini. + * 'cake' Saves session files in CakePHP's /tmp directory. + * 'database' Uses CakePHP's database sessions. + * + * To define a custom session handler, save it at /app/config/.php. + * Set the value of 'Session.save' to to utilize it in CakePHP. + * + * To use database sessions, run the app/config/schema/sessions.php schema using + * the cake shell command: cake schema run create Sessions + * + */ + Configure::write('Session.save', 'php'); + +/** + * The model name to be used for the session model. + * + * 'Session.save' must be set to 'database' in order to utilize this constant. + * + * The model name set here should *not* be used elsewhere in your application. + */ + //Configure::write('Session.model', 'Session'); + +/** + * The name of the table used to store CakePHP database sessions. + * + * 'Session.save' must be set to 'database' in order to utilize this constant. + * + * The table name set here should *not* include any table prefix defined elsewhere. + * + * Please note that if you set a value for Session.model (above), any value set for + * Session.table will be ignored. + * + * [Note: Session.table is deprecated as of CakePHP 1.3] + */ + //Configure::write('Session.table', 'cake_sessions'); + +/** + * The DATABASE_CONFIG::$var to use for database session handling. + * + * 'Session.save' must be set to 'database' in order to utilize this constant. + */ + //Configure::write('Session.database', 'default'); + +/** + * The name of CakePHP's session cookie. + * + * Note the guidelines for Session names states: "The session name references + * the session id in cookies and URLs. It should contain only alphanumeric + * characters." + * @link http://php.net/session_name + */ + Configure::write('Session.cookie', 'CAKEPHP'); + +/** + * Session time out time (in minutes). + * Actual value depends on 'Security.level' setting. + */ + Configure::write('Session.timeout', '120'); + +/** + * If set to false, sessions are not automatically started. + */ + Configure::write('Session.start', true); + +/** + * When set to false, HTTP_USER_AGENT will not be checked + * in the session + */ + Configure::write('Session.checkAgent', true); + +/** + * The level of CakePHP security. The session timeout time defined + * in 'Session.timeout' is multiplied according to the settings here. + * Valid values: + * + * 'high' Session timeout in 'Session.timeout' x 10 + * 'medium' Session timeout in 'Session.timeout' x 100 + * 'low' Session timeout in 'Session.timeout' x 300 + * + * CakePHP session IDs are also regenerated between requests if + * 'Security.level' is set to 'high'. + */ + Configure::write('Security.level', 'medium'); + +/** + * A random string used in security hashing methods. + */ + Configure::write('Security.salt', 'DYhG93b0qyJfIxjaroigjasri3vniR2G0FgaC9mi'); + +/** + * A random numeric string (digits only) used to encrypt/decrypt strings. + */ + Configure::write('Security.cipherSeed', '768593013513531439683645'); + +/** + * Apply timestamps with the last modified time to static assets (js, css, images). + * Will append a querystring parameter containing the time the file was modified. This is + * useful for invalidating browser caches. + * + * Set to `true` to apply timestamps, when debug = 0, or set to 'force' to always enable + * timestamping. + */ + //Configure::write('Asset.timestamp', true); +/** + * Compress CSS output by removing comments, whitespace, repeating tags, etc. + * This requires a/var/cache directory to be writable by the web server for caching. + * and /vendors/csspp/csspp.php + * + * To use, prefix the CSS link URL with '/ccss/' instead of '/css/' or use HtmlHelper::css(). + */ + //Configure::write('Asset.filter.css', 'css.php'); + +/** + * Plug in your own custom JavaScript compressor by dropping a script in your webroot to handle the + * output, and setting the config below to the name of the script. + * + * To use, prefix your JavaScript link URLs with '/cjs/' instead of '/js/' or use JavaScriptHelper::link(). + */ + //Configure::write('Asset.filter.js', 'custom_javascript_output_filter.php'); + +/** + * The classname and database used in CakePHP's + * access control lists. + */ + Configure::write('Acl.classname', 'DbAcl'); + Configure::write('Acl.database', 'default'); + +/** + * If you are on PHP 5.3 uncomment this line and correct your server timezone + * to fix the date & time related errors. + */ + //date_default_timezone_set('UTC'); + +/** + * + * Cache Engine Configuration + * Default settings provided below + * + * File storage engine. + * + * Cache::config('default', array( + * 'engine' => 'File', //[required] + * 'duration'=> 3600, //[optional] + * 'probability'=> 100, //[optional] + * 'path' => CACHE, //[optional] use system tmp directory - remember to use absolute path + * 'prefix' => 'cake_', //[optional] prefix every cache file with this string + * 'lock' => false, //[optional] use file locking + * 'serialize' => true, [optional] + * )); + * + * + * APC (http://pecl.php.net/package/APC) + * + * Cache::config('default', array( + * 'engine' => 'Apc', //[required] + * 'duration'=> 3600, //[optional] + * 'probability'=> 100, //[optional] + * 'prefix' => Inflector::slug(APP_DIR) . '_', //[optional] prefix every cache file with this string + * )); + * + * Xcache (http://xcache.lighttpd.net/) + * + * Cache::config('default', array( + * 'engine' => 'Xcache', //[required] + * 'duration'=> 3600, //[optional] + * 'probability'=> 100, //[optional] + * 'prefix' => Inflector::slug(APP_DIR) . '_', //[optional] prefix every cache file with this string + * 'user' => 'user', //user from xcache.admin.user settings + * 'password' => 'password', //plaintext password (xcache.admin.pass) + * )); + * + * + * Memcache (http://www.danga.com/memcached/) + * + * Cache::config('default', array( + * 'engine' => 'Memcache', //[required] + * 'duration'=> 3600, //[optional] + * 'probability'=> 100, //[optional] + * 'prefix' => Inflector::slug(APP_DIR) . '_', //[optional] prefix every cache file with this string + * 'servers' => array( + * '127.0.0.1:11211' // localhost, default port 11211 + * ), //[optional] + * 'compress' => false, // [optional] compress data in Memcache (slower, but uses less memory) + * )); + * + */ + Cache::config('default', array('engine' => 'File')); diff --git a/app/config/database.php b/app/config/database.php new file mode 100644 index 0000000..ca08e0c --- /dev/null +++ b/app/config/database.php @@ -0,0 +1,95 @@ + The name of a supported driver; valid options are as follows: + * mysql - MySQL 4 & 5, + * mysqli - MySQL 4 & 5 Improved Interface (PHP5 only), + * sqlite - SQLite (PHP5 only), + * postgres - PostgreSQL 7 and higher, + * mssql - Microsoft SQL Server 2000 and higher, + * db2 - IBM DB2, Cloudscape, and Apache Derby (http://php.net/ibm-db2) + * oracle - Oracle 8 and higher + * firebird - Firebird/Interbase + * sybase - Sybase ASE + * adodb-[drivername] - ADOdb interface wrapper (see below), + * odbc - ODBC DBO driver + * + * You can add custom database drivers (or override existing drivers) by adding the + * appropriate file to app/models/datasources/dbo. Drivers should be named 'dbo_x.php', + * where 'x' is the name of the database. + * + * persistent => true / false + * Determines whether or not the database should use a persistent connection + * + * connect => + * ADOdb set the connect to one of these + * (http://phplens.com/adodb/supported.databases.html) and + * append it '|p' for persistent connection. (mssql|p for example, or just mssql for not persistent) + * For all other databases, this setting is deprecated. + * + * host => + * the host you connect to the database. To add a socket or port number, use 'port' => # + * + * prefix => + * Uses the given prefix for all the tables in this database. This setting can be overridden + * on a per-table basis with the Model::$tablePrefix property. + * + * schema => + * For Postgres and DB2, specifies which schema you would like to use the tables in. Postgres defaults to + * 'public', DB2 defaults to empty. + * + * encoding => + * For MySQL, MySQLi, Postgres and DB2, specifies the character encoding to use when connecting to the + * database. Uses database default. + * + */ +class DATABASE_CONFIG { + + var $default = array( + 'driver' => 'mysql', + 'persistent' => false, + 'host' => 'localhost', + 'login' => 'infoskjerm', + 'password' => 'tPuWT3d753m7sAC6', + 'database' => 'infoskjerm', + 'prefix' => '', + ); + + var $test = array( + 'driver' => 'mysql', + 'persistent' => false, + 'host' => 'localhost', + 'login' => 'user', + 'password' => 'password', + 'database' => 'test_database_name', + 'prefix' => '', + ); +} diff --git a/app/config/routes.php b/app/config/routes.php new file mode 100644 index 0000000..b03a656 --- /dev/null +++ b/app/config/routes.php @@ -0,0 +1,36 @@ + 'slides', 'action' => 'index')); + Router::connect('/slideshow', array('controller'=>'slides','action'=>'slideshow')); + Router::connect('/login', array('controller'=>'users','action'=>'login')); + Router::connect('/logout', array('controller'=>'users','action'=>'logout')); +/** + * ...and connect the rest of 'Pages' controller's urls. + */ + Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display')); diff --git a/app/config/schema/db_acl.php b/app/config/schema/db_acl.php new file mode 100644 index 0000000..96b96bd --- /dev/null +++ b/app/config/schema/db_acl.php @@ -0,0 +1,73 @@ + array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'parent_id' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'model' => array('type'=>'string', 'null' => true), + 'foreign_key' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'alias' => array('type'=>'string', 'null' => true), + 'lft' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'rght' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)) + ); + + var $aros = array( + 'id' => array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'parent_id' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'model' => array('type'=>'string', 'null' => true), + 'foreign_key' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'alias' => array('type'=>'string', 'null' => true), + 'lft' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'rght' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)) + ); + + var $aros_acos = array( + 'id' => array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'aro_id' => array('type'=>'integer', 'null' => false, 'length' => 10, 'key' => 'index'), + 'aco_id' => array('type'=>'integer', 'null' => false, 'length' => 10), + '_create' => array('type'=>'string', 'null' => false, 'default' => '0', 'length' => 2), + '_read' => array('type'=>'string', 'null' => false, 'default' => '0', 'length' => 2), + '_update' => array('type'=>'string', 'null' => false, 'default' => '0', 'length' => 2), + '_delete' => array('type'=>'string', 'null' => false, 'default' => '0', 'length' => 2), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'ARO_ACO_KEY' => array('column' => array('aro_id', 'aco_id'), 'unique' => 1)) + ); + +} diff --git a/app/config/schema/i18n.php b/app/config/schema/i18n.php new file mode 100644 index 0000000..27e1ec3 --- /dev/null +++ b/app/config/schema/i18n.php @@ -0,0 +1,50 @@ + array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'locale' => array('type'=>'string', 'null' => false, 'length' => 6, 'key' => 'index'), + 'model' => array('type'=>'string', 'null' => false, 'key' => 'index'), + 'foreign_key' => array('type'=>'integer', 'null' => false, 'length' => 10, 'key' => 'index'), + 'field' => array('type'=>'string', 'null' => false, 'key' => 'index'), + 'content' => array('type'=>'text', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'locale' => array('column' => 'locale', 'unique' => 0), 'model' => array('column' => 'model', 'unique' => 0), 'row_id' => array('column' => 'foreign_key', 'unique' => 0), 'field' => array('column' => 'field', 'unique' => 0)) + ); + +} diff --git a/app/config/schema/sessions.php b/app/config/schema/sessions.php new file mode 100644 index 0000000..4581c29 --- /dev/null +++ b/app/config/schema/sessions.php @@ -0,0 +1,47 @@ + array('type'=>'string', 'null' => false, 'key' => 'primary'), + 'data' => array('type'=>'text', 'null' => true, 'default' => NULL), + 'expires' => array('type'=>'integer', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)) + ); + +} diff --git a/app/controllers/components/empty b/app/controllers/components/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/resources_controller.php b/app/controllers/resources_controller.php new file mode 100644 index 0000000..fcd9497 --- /dev/null +++ b/app/controllers/resources_controller.php @@ -0,0 +1,68 @@ +Auth->allow("*"); + } + function get($id) + { + if(!is_numeric($id)) + { + $this->Resource->data = array_shift($this->Resource->findByName($id)); + if(!$this->Resource->data ) + die; + $this->Resource->id = $this->Resource->data['id']; + } + + $type = $this->Resource->field('type'); + $path = $this->Resource->getPath(); + + header('Content-type:' . $type); + $content = @file_get_contents($path); + die($content); + } + + function slideshow($id) + { + if(!is_numeric($id)) + { + $this->Resource->data = array_shift($this->Resource->findByName($id)); + if(!$this->Resource->data ) + die; + $this->Resource->id = $this->Resource->data['id']; + } + + $type = $this->Resource->field('type'); + if(substr($type, 0, 5) == 'image') + { + header('Content-type: text/html'); + ?> + + + + + + get($id); + } + } + + function thumbnail($id) + { + if(!file_exists($this->Resource->getThumbnail())) + { + system('convert -thumbnail 300x200 ' . $this->Resource->getPath() . ' ' . $this->Resource->getThumbnail()); + } + + header('Content-type: image/png'); + $content = @file_get_contents($this->Resource->getThumbnail()); + die($content); + } +} \ No newline at end of file diff --git a/app/controllers/slides_controller.php b/app/controllers/slides_controller.php new file mode 100644 index 0000000..9a2ddf5 --- /dev/null +++ b/app/controllers/slides_controller.php @@ -0,0 +1,221 @@ +Auth->allow("slideshow"); + $this->Auth->allow("next"); + } + + function index() + { + $enabled = $this->Slide->getEnabledSlides(); + $disabled = $this->Slide->getDisabledSlides(); + + $this->set(compact('enabled','disabled')); + } + + function enable($id) + { + $this->Slide->saveField('enabled', true); + $this->Session->setFlash('Slide enabled'); + $this->redirect('index'); + } + + function disable($id) + { + $this->Slide->saveField('enabled', false); + $this->Session->setFlash('Slide disabled'); + $this->redirect('index'); + } + + function timing($id) + { + if(!empty($this->data)) + { + $intervals = array(); + + $times = $this->data['Time']; + ksort($times); + + $intStart = 0; + foreach($times as $time=>$on) + { + if(!$on && $intStart) + { + $intervals[] = array('start'=>$intStart, 'stop'=>$time,'slide_id'=>$id); + $intStart = 0; + } + else if($on && $intStart == 0) + { + $intStart = $time; + } + } + + if($intStart != 0) + { + $intervals[] = array('start'=>$intStart, 'stop'=>$time,'slide_id'=>$id); + } + + $ids = $this->Slide->DisplayTime->find('list', array('conditions'=>array('slide_id'=>$id))); + if($ids) + { + $ids = array_keys($ids); + foreach($intervals as &$interval) + { + $interval['id'] = array_pop($ids); + if(!$ids) + break; + } + } + + if($ids) + { + if(count($ids) == 1) + $ids[] = ''; + $this->Slide->DisplayTime->deleteAll(array('DisplayTime.id'=>$ids)); + } + + $this->Slide->DisplayTime->saveAll($intervals); + + $this->Session->setFlash("Timing updated"); + $this->redirect('index'); + } + else + { + $this->data['Slide']['id'] = $id; + + $display = $this->Slide->DisplayTime->find('all',array('conditions'=>array('slide_id'=>$id))); + + foreach($display as $d) + { + for($i = $d['DisplayTime']['start']; $i < $d['DisplayTime']['stop']; $i += 3 * 60 * 60) + $this->data['Time'][$i] = 1; + } + } + } + + function delete($id) + { + if($this->Slide->delete($id)) + { + $this->Session->setFlash('Slide slettet'); + $this->redirect('index'); + } + } + + function setTime($time, $value) + { + die($this->Slide->saveField($time, $value)); + } + + function add() + { + if(isset($this->data)) + { + + if($this->data['Upload']) + { + $file = $this->data['Upload']['file']; + + $type = $file['type']; + + $first = array_shift(explode('/', $type)); + + if(in_array($first, array('image','text','xml'))) + { + App::import('Model','Resource'); + $Resource = new Resource(); + + if($Resource->save($file)) + { + move_uploaded_file($file['tmp_name'], $Resource->getPath()); + $this->data['Slide']['url'] = $Resource->getSlideshow(); + $this->data['Slide']['thumbnail'] = $Resource->getThumbnailUrl(); + } + } + } + if($this->Slide->save($this->data)) + { + $this->Session->setFlash('Slide opprettet'); + $this->Session->write("NewSlide", $this->Slide->id); + + if($this->data['Slide']['simple']) + { + $this->data['DisplayTime'][0]['slide_id'] = $this->Slide->id; + + if($this->data['DisplayTime'][0]['start']) + $this->data['DisplayTime'][0]['start'] = strtotime($this->data['DisplayTime'][0]['start']); + else + $this->data['DisplayTime'][0]['start'] = 0; + + if($this->data['DisplayTime'][0]['stop']) + $this->data['DisplayTime'][0]['stop'] = strtotime($this->data['DisplayTime'][0]['stop']); + else + $this->data['DisplayTime'][0]['stop'] = 999999999999999999; + + $this->Slide->DisplayTime->save($this->data['DisplayTime'][0]); + + $this->redirect('index'); + } + + $this->redirect('timing/' . $this->Slide->id); + } + } + } + + function slideshow() + { + $ids = $this->Slide->DisplayTime->getActiveSlideIds(); + $slides = $this->Slide->find('all',array('conditions'=>array('id'=>$ids,'enabled'=>1))); +// $slides = $this->Slide->getActiveSlides(); + + if($this->RequestHandler->isAjax()) + { + die(json_encode($slides)); + } + + $this->set(compact('slides')); + + $this->layout = 'slideshow'; + } + + function edit($id) + { + if(isset($this->data)) + { + if($this->Slide->save($this->data)) + { + + if($this->data['Slide']['simple']) + { + $this->data['DisplayTime'][0]['slide_id'] = $id; + $this->data['DisplayTime'][0]['start'] = strtotime($this->data['DisplayTime'][0]['start']); + $this->data['DisplayTime'][0]['stop'] = strtotime($this->data['DisplayTime'][0]['stop']); + + $this->Slide->DisplayTime->deleteAll(array('slide_id'=>$id)); + + $this->Slide->DisplayTime->save($this->data['DisplayTime'][0]); + } + + $this->redirect('index'); + } + } + else + { + $this->data = $this->Slide->read(); + } + + if(isset($this->data['DisplayTime'][0])) + { + $this->data['DisplayTime'][0]['start'] = strftime("%F %T", $this->data['DisplayTime']['0']['start']); + $this->data['DisplayTime'][0]['stop'] = strftime("%F %T", $this->data['DisplayTime']['0']['stop']); + } + } +} +?> \ No newline at end of file diff --git a/app/controllers/users_controller.php b/app/controllers/users_controller.php new file mode 100644 index 0000000..9931954 --- /dev/null +++ b/app/controllers/users_controller.php @@ -0,0 +1,18 @@ +redirect($this->Auth->logout()); + } +} +?> \ No newline at end of file diff --git a/app/index.php b/app/index.php new file mode 100644 index 0000000..732c010 --- /dev/null +++ b/app/index.php @@ -0,0 +1,18 @@ +find('all', array('fields'=>array('slide_id'), 'conditions'=>array('DisplayTime.start <= '=>time(), 'DisplayTime.stop >= '=>time()))); + $ids = Set::extract('/DisplayTime/slide_id', $tmp); + return $ids; + } +} \ No newline at end of file diff --git a/app/models/resource.php b/app/models/resource.php new file mode 100644 index 0000000..93e5662 --- /dev/null +++ b/app/models/resource.php @@ -0,0 +1,31 @@ +id; + } + + function getUrl() + { + return Router::url('/resources/get/' . $this->id); + } + + function getThumbnail() + { + return WWW_ROOT . 'thumbnails/res_' . $this->id . '.png'; + } + + function getThumbnailUrl() + { + return Router::url('/resources/thumbnail/' . $this->id); + } + + function getSlideshow() + { + return Router::url('/resources/slideshow/' . $this->id); + } +} \ No newline at end of file diff --git a/app/models/slide.php b/app/models/slide.php new file mode 100644 index 0000000..4209398 --- /dev/null +++ b/app/models/slide.php @@ -0,0 +1,18 @@ +find('all', array('conditions'=>array('Slide.enabled'=>1))); + } + + function getDisabledSlides() + { + return $this->find('all', array('conditions'=>array('Slide.enabled'=>0),'order'=>array('id'=>'DESC'))); + } +} +?> \ No newline at end of file diff --git a/app/models/user.php b/app/models/user.php new file mode 100644 index 0000000..89451e7 --- /dev/null +++ b/app/models/user.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/app/plugins/empty b/app/plugins/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/tests/cases/behaviors/empty b/app/tests/cases/behaviors/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/tests/cases/components/empty b/app/tests/cases/components/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/tests/cases/controllers/empty b/app/tests/cases/controllers/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/tests/cases/helpers/empty b/app/tests/cases/helpers/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/tests/cases/models/empty b/app/tests/cases/models/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/tests/fixtures/empty b/app/tests/fixtures/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/tests/groups/empty b/app/tests/groups/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/tmp/cache/models/cake_model_default_display_times b/app/tmp/cache/models/cake_model_default_display_times new file mode 100644 index 0000000..f16eecc --- /dev/null +++ b/app/tmp/cache/models/cake_model_default_display_times @@ -0,0 +1,2 @@ +1281708079 +a:4:{s:2:"id";a:5:{s:4:"type";s:7:"integer";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:11;s:3:"key";s:7:"primary";}s:8:"slide_id";a:4:{s:4:"type";s:7:"integer";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:11;}s:5:"start";a:4:{s:4:"type";s:7:"integer";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:11;}s:4:"stop";a:4:{s:4:"type";s:7:"integer";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:11;}} diff --git a/app/tmp/cache/models/cake_model_default_infoskjerm_list b/app/tmp/cache/models/cake_model_default_infoskjerm_list new file mode 100644 index 0000000..be528e2 --- /dev/null +++ b/app/tmp/cache/models/cake_model_default_infoskjerm_list @@ -0,0 +1,2 @@ +1281708079 +a:4:{i:0;s:13:"display_times";i:1;s:9:"resources";i:2;s:6:"slides";i:3;s:5:"users";} diff --git a/app/tmp/cache/models/cake_model_default_resources b/app/tmp/cache/models/cake_model_default_resources new file mode 100644 index 0000000..3b5ce34 --- /dev/null +++ b/app/tmp/cache/models/cake_model_default_resources @@ -0,0 +1,2 @@ +1281445909 +a:5:{s:2:"id";a:5:{s:4:"type";s:7:"integer";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:11;s:3:"key";s:7:"primary";}s:4:"name";a:4:{s:4:"type";s:6:"string";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:255;}s:4:"type";a:4:{s:4:"type";s:6:"string";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:255;}s:5:"added";a:4:{s:4:"type";s:9:"timestamp";s:4:"null";b:0;s:7:"default";s:17:"CURRENT_TIMESTAMP";s:6:"length";N;}s:4:"size";a:4:{s:4:"type";s:7:"integer";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:11;}} diff --git a/app/tmp/cache/models/cake_model_default_slides b/app/tmp/cache/models/cake_model_default_slides new file mode 100644 index 0000000..e1ce5e1 --- /dev/null +++ b/app/tmp/cache/models/cake_model_default_slides @@ -0,0 +1,2 @@ +1281708079 +a:7:{s:2:"id";a:5:{s:4:"type";s:7:"integer";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:11;s:3:"key";s:7:"primary";}s:5:"title";a:4:{s:4:"type";s:6:"string";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:255;}s:3:"url";a:4:{s:4:"type";s:6:"string";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:255;}s:9:"thumbnail";a:4:{s:4:"type";s:6:"string";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:255;}s:7:"enabled";a:4:{s:4:"type";s:7:"boolean";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:1;}s:5:"order";a:4:{s:4:"type";s:7:"integer";s:4:"null";b:1;s:7:"default";N;s:6:"length";i:11;}s:6:"simple";a:4:{s:4:"type";s:7:"boolean";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:1;}} diff --git a/app/tmp/cache/models/cake_model_default_users b/app/tmp/cache/models/cake_model_default_users new file mode 100644 index 0000000..bd05c76 --- /dev/null +++ b/app/tmp/cache/models/cake_model_default_users @@ -0,0 +1,2 @@ +1281707686 +a:3:{s:2:"id";a:5:{s:4:"type";s:7:"integer";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:11;s:3:"key";s:7:"primary";}s:8:"username";a:4:{s:4:"type";s:6:"string";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:255;}s:8:"password";a:4:{s:4:"type";s:6:"string";s:4:"null";b:0;s:7:"default";N;s:6:"length";i:40;}} diff --git a/app/tmp/cache/models/empty b/app/tmp/cache/models/empty new file mode 100755 index 0000000..e69de29 diff --git a/app/tmp/cache/persistent/cake_core_default_en_us b/app/tmp/cache/persistent/cake_core_default_en_us new file mode 100644 index 0000000..549b38c --- /dev/null +++ b/app/tmp/cache/persistent/cake_core_default_en_us @@ -0,0 +1,2 @@ +1281708079 +a:1:{s:11:"LC_MESSAGES";a:2:{s:0:"";a:1:{s:7:"default";a:0:{}}s:5:"en-us";a:1:{s:7:"default";a:0:{}}}} diff --git a/app/tmp/cache/persistent/cake_core_dir_map b/app/tmp/cache/persistent/cake_core_dir_map new file mode 100644 index 0000000..fba9cab --- /dev/null +++ b/app/tmp/cache/persistent/cake_core_dir_map @@ -0,0 +1,2 @@ +1281708079 +a:9:{s:29:"/var/www/infoskjerm/cake/libs";a:25:{i:0;s:29:"/var/www/infoskjerm/cake/libs";i:1;s:35:"/var/www/infoskjerm/cake/libs/cache";i:2;s:40:"/var/www/infoskjerm/cake/libs/controller";i:3;s:51:"/var/www/infoskjerm/cake/libs/controller/components";i:4;s:33:"/var/www/infoskjerm/cake/libs/log";i:5;s:35:"/var/www/infoskjerm/cake/libs/model";i:6;s:45:"/var/www/infoskjerm/cake/libs/model/behaviors";i:7;s:47:"/var/www/infoskjerm/cake/libs/model/datasources";i:8;s:51:"/var/www/infoskjerm/cake/libs/model/datasources/dbo";i:9;s:34:"/var/www/infoskjerm/cake/libs/view";i:10;s:43:"/var/www/infoskjerm/cake/libs/view/elements";i:11;s:49:"/var/www/infoskjerm/cake/libs/view/elements/email";i:12;s:54:"/var/www/infoskjerm/cake/libs/view/elements/email/html";i:13;s:54:"/var/www/infoskjerm/cake/libs/view/elements/email/text";i:14;s:41:"/var/www/infoskjerm/cake/libs/view/errors";i:15;s:42:"/var/www/infoskjerm/cake/libs/view/helpers";i:16;s:42:"/var/www/infoskjerm/cake/libs/view/layouts";i:17;s:48:"/var/www/infoskjerm/cake/libs/view/layouts/email";i:18;s:53:"/var/www/infoskjerm/cake/libs/view/layouts/email/html";i:19;s:53:"/var/www/infoskjerm/cake/libs/view/layouts/email/text";i:20;s:45:"/var/www/infoskjerm/cake/libs/view/layouts/js";i:21;s:46:"/var/www/infoskjerm/cake/libs/view/layouts/rss";i:22;s:46:"/var/www/infoskjerm/cake/libs/view/layouts/xml";i:23;s:40:"/var/www/infoskjerm/cake/libs/view/pages";i:24;s:44:"/var/www/infoskjerm/cake/libs/view/scaffolds";}s:35:"/var/www/infoskjerm/app/controllers";a:2:{i:0;s:35:"/var/www/infoskjerm/app/controllers";i:1;s:46:"/var/www/infoskjerm/app/controllers/components";}s:29:"/var/www/infoskjerm/app/views";a:18:{i:0;s:29:"/var/www/infoskjerm/app/views";i:1;s:38:"/var/www/infoskjerm/app/views/elements";i:2;s:44:"/var/www/infoskjerm/app/views/elements/email";i:3;s:49:"/var/www/infoskjerm/app/views/elements/email/html";i:4;s:49:"/var/www/infoskjerm/app/views/elements/email/text";i:5;s:36:"/var/www/infoskjerm/app/views/errors";i:6;s:37:"/var/www/infoskjerm/app/views/helpers";i:7;s:37:"/var/www/infoskjerm/app/views/layouts";i:8;s:43:"/var/www/infoskjerm/app/views/layouts/email";i:9;s:48:"/var/www/infoskjerm/app/views/layouts/email/html";i:10;s:48:"/var/www/infoskjerm/app/views/layouts/email/text";i:11;s:40:"/var/www/infoskjerm/app/views/layouts/js";i:12;s:41:"/var/www/infoskjerm/app/views/layouts/rss";i:13;s:41:"/var/www/infoskjerm/app/views/layouts/xml";i:14;s:35:"/var/www/infoskjerm/app/views/pages";i:15;s:39:"/var/www/infoskjerm/app/views/scaffolds";i:16;s:36:"/var/www/infoskjerm/app/views/slides";i:17;s:35:"/var/www/infoskjerm/app/views/users";}s:34:"/var/www/infoskjerm/cake/libs/view";a:16:{i:0;s:34:"/var/www/infoskjerm/cake/libs/view";i:1;s:43:"/var/www/infoskjerm/cake/libs/view/elements";i:2;s:49:"/var/www/infoskjerm/cake/libs/view/elements/email";i:3;s:54:"/var/www/infoskjerm/cake/libs/view/elements/email/html";i:4;s:54:"/var/www/infoskjerm/cake/libs/view/elements/email/text";i:5;s:41:"/var/www/infoskjerm/cake/libs/view/errors";i:6;s:42:"/var/www/infoskjerm/cake/libs/view/helpers";i:7;s:42:"/var/www/infoskjerm/cake/libs/view/layouts";i:8;s:48:"/var/www/infoskjerm/cake/libs/view/layouts/email";i:9;s:53:"/var/www/infoskjerm/cake/libs/view/layouts/email/html";i:10;s:53:"/var/www/infoskjerm/cake/libs/view/layouts/email/text";i:11;s:45:"/var/www/infoskjerm/cake/libs/view/layouts/js";i:12;s:46:"/var/www/infoskjerm/cake/libs/view/layouts/rss";i:13;s:46:"/var/www/infoskjerm/cake/libs/view/layouts/xml";i:14;s:40:"/var/www/infoskjerm/cake/libs/view/pages";i:15;s:44:"/var/www/infoskjerm/cake/libs/view/scaffolds";}s:46:"/var/www/infoskjerm/app/controllers/components";a:1:{i:0;s:46:"/var/www/infoskjerm/app/controllers/components";}s:51:"/var/www/infoskjerm/cake/libs/controller/components";a:1:{i:0;s:51:"/var/www/infoskjerm/cake/libs/controller/components";}s:30:"/var/www/infoskjerm/app/models";a:3:{i:0;s:30:"/var/www/infoskjerm/app/models";i:1;s:40:"/var/www/infoskjerm/app/models/behaviors";i:2;s:42:"/var/www/infoskjerm/app/models/datasources";}s:42:"/var/www/infoskjerm/app/models/datasources";a:1:{i:0;s:42:"/var/www/infoskjerm/app/models/datasources";}s:47:"/var/www/infoskjerm/cake/libs/model/datasources";a:2:{i:0;s:47:"/var/www/infoskjerm/cake/libs/model/datasources";i:1;s:51:"/var/www/infoskjerm/cake/libs/model/datasources/dbo";}} diff --git a/app/tmp/cache/persistent/cake_core_file_map b/app/tmp/cache/persistent/cake_core_file_map new file mode 100644 index 0000000..c1099fa --- /dev/null +++ b/app/tmp/cache/persistent/cake_core_file_map @@ -0,0 +1,2 @@ +1281708079 +a:6:{s:4:"Core";a:8:{s:6:"Router";s:40:"/var/www/infoskjerm/cake/libs/router.php";s:13:"ClassRegistry";s:48:"/var/www/infoskjerm/cake/libs/class_registry.php";s:12:"Overloadable";s:46:"/var/www/infoskjerm/cake/libs/overloadable.php";s:8:"Security";s:42:"/var/www/infoskjerm/cake/libs/security.php";s:9:"Multibyte";s:43:"/var/www/infoskjerm/cake/libs/multibyte.php";s:10:"Validation";s:44:"/var/www/infoskjerm/cake/libs/validation.php";s:4:"l10n";s:38:"/var/www/infoskjerm/cake/libs/l10n.php";s:4:"i18n";s:38:"/var/www/infoskjerm/cake/libs/i18n.php";}s:10:"Controller";a:4:{s:9:"Component";s:54:"/var/www/infoskjerm/cake/libs/controller/component.php";s:10:"Controller";s:55:"/var/www/infoskjerm/cake/libs/controller/controller.php";s:13:"AppController";s:42:"/var/www/infoskjerm/app/app_controller.php";s:16:"SlidesController";s:57:"/var/www/infoskjerm/app/controllers/slides_controller.php";}s:4:"View";a:2:{s:6:"Helper";s:45:"/var/www/infoskjerm/cake/libs/view/helper.php";s:4:"View";s:43:"/var/www/infoskjerm/cake/libs/view/view.php";}s:9:"Component";a:3:{s:13:"AuthComponent";s:60:"/var/www/infoskjerm/cake/libs/controller/components/auth.php";s:16:"SessionComponent";s:63:"/var/www/infoskjerm/cake/libs/controller/components/session.php";s:23:"RequestHandlerComponent";s:71:"/var/www/infoskjerm/cake/libs/controller/components/request_handler.php";}s:5:"Model";a:5:{s:13:"ModelBehavior";s:54:"/var/www/infoskjerm/cake/libs/model/model_behavior.php";s:17:"ConnectionManager";s:58:"/var/www/infoskjerm/cake/libs/model/connection_manager.php";s:8:"AppModel";s:49:"/var/www/infoskjerm/cake/libs/model/app_model.php";s:5:"Slide";s:40:"/var/www/infoskjerm/app/models/slide.php";s:11:"DisplayTime";s:47:"/var/www/infoskjerm/app/models/display_time.php";}s:10:"Datasource";a:2:{s:9:"DboSource";s:62:"/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php";s:8:"DboMysql";s:65:"/var/www/infoskjerm/cake/libs/model/datasources/dbo/dbo_mysql.php";}} diff --git a/app/tmp/cache/persistent/cake_core_object_map b/app/tmp/cache/persistent/cake_core_object_map new file mode 100644 index 0000000..5a1cf89 --- /dev/null +++ b/app/tmp/cache/persistent/cake_core_object_map @@ -0,0 +1,2 @@ +1281708079 +a:1:{s:6:"plugin";a:0:{}} diff --git a/app/tmp/cache/persistent/empty b/app/tmp/cache/persistent/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/tmp/cache/views/empty b/app/tmp/cache/views/empty new file mode 100755 index 0000000..e69de29 diff --git a/app/tmp/logs/debug.log b/app/tmp/logs/debug.log new file mode 100644 index 0000000..c39a9e8 --- /dev/null +++ b/app/tmp/logs/debug.log @@ -0,0 +1,251 @@ +2010-08-09 22:33:52 Notice: Notice (8): Undefined variable: slides in [/var/www/infoskjerm/app/views/slides/index.ctp, line 2] +2010-08-09 22:43:57 Notice: Notice (8): Undefined property: View::$Session in [/var/www/infoskjerm/cake/libs/view/layouts/default.ctp, line 43] +2010-08-09 22:44:07 Notice: Notice (8): Undefined property: View::$Session in [/var/www/infoskjerm/cake/libs/view/layouts/default.ctp, line 43] +2010-08-09 22:44:08 Notice: Notice (8): Undefined property: View::$Session in [/var/www/infoskjerm/cake/libs/view/layouts/default.ctp, line 43] +2010-08-09 22:44:12 Notice: Notice (8): Undefined property: View::$Session in [/var/www/infoskjerm/cake/libs/view/layouts/default.ctp, line 43] +2010-08-09 22:44:12 Notice: Notice (8): Undefined property: View::$Session in [/var/www/infoskjerm/cake/libs/view/layouts/default.ctp, line 43] +2010-08-09 22:44:13 Notice: Notice (8): Undefined property: View::$Session in [/var/www/infoskjerm/cake/libs/view/layouts/default.ctp, line 43] +2010-08-09 22:44:25 Notice: Notice (8): Undefined variable: form in [/var/www/infoskjerm/app/views/slides/add.ctp, line 2] +2010-08-09 22:45:51 Notice: Notice (8): Undefined index: thumbnail in [/var/www/infoskjerm/app/views/slides/index.ctp, line 12] +2010-08-09 22:45:51 Notice: Notice (8): Undefined index: title in [/var/www/infoskjerm/app/views/slides/index.ctp, line 14] +2010-08-09 22:46:15 Notice: Notice (8): Undefined index: thumbnail in [/var/www/infoskjerm/app/views/slides/index.ctp, line 13] +2010-08-09 22:46:15 Notice: Notice (8): Undefined index: title in [/var/www/infoskjerm/app/views/slides/index.ctp, line 15] +2010-08-09 23:03:37 Notice: Notice (8): Undefined property: SlidesController::$html in [/var/www/infoskjerm/app/app_controller.php, line 9] +2010-08-09 23:03:58 Notice: Notice (8): Undefined property: SlidesController::$Html in [/var/www/infoskjerm/app/app_controller.php, line 9] +2010-08-09 23:04:05 Notice: Notice (8): Undefined variable: html in [/var/www/infoskjerm/app/app_controller.php, line 9] +2010-08-09 23:22:32 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 43] +2010-08-09 23:22:32 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 45] +2010-08-09 23:22:42 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 43] +2010-08-09 23:22:42 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 45] +2010-08-09 23:23:02 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 67] +2010-08-09 23:23:02 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 69] +2010-08-09 23:44:09 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 79] +2010-08-09 23:44:09 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 81] +2010-08-10 00:08:06 Notice: Notice (8): Undefined offset: 1 in [/var/www/infoskjerm/app/views/slides/slideshow.ctp, line 22] +2010-08-10 00:08:54 Notice: Notice (8): Undefined offset: 1 in [/var/www/infoskjerm/app/views/slides/slideshow.ctp, line 22] +2010-08-10 00:09:05 Notice: Notice (8): Undefined offset: 1 in [/var/www/infoskjerm/app/views/slides/slideshow.ctp, line 6] +2010-08-10 09:07:58 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 46] +2010-08-10 09:07:58 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 48] +2010-08-10 09:23:09 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 55] +2010-08-10 09:23:09 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 57] +2010-08-10 09:23:09 Notice: Notice (8): Undefined property: SlidesController::$Session in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 62] +2010-08-10 09:23:27 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 55] +2010-08-10 09:23:27 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 57] +2010-08-10 09:23:42 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 55] +2010-08-10 09:23:42 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 57] +2010-08-10 09:24:16 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 55] +2010-08-10 09:24:16 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 57] +2010-08-10 10:09:25 Notice: Notice (8): Undefined offset: 23 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 5] +2010-08-10 10:41:53 Notice: Notice (8): Undefined offset: 9 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 11] +2010-08-10 10:43:11 Notice: Notice (8): Undefined offset: 9 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 11] +2010-08-10 11:03:16 Notice: Notice (8): Undefined variable: interval in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 85] +2010-08-10 11:07:21 Notice: Notice (8): Undefined index: Time in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:07:54 Notice: Notice (8): Undefined index: Time in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281391200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281477600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281564000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281650400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281736800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281823200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281402000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281488400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281574800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281661200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281747600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281834000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281412800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281499200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281585600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281672000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281758400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281844800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281423600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281510000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281596400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281682800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281769200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:43 Notice: Notice (8): Undefined offset: 1281855600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281434400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281520800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281607200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281693600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281780000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281866400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281445200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281531600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281618000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281704400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281790800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281877200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281456000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281542400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281628800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281715200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281801600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281888000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281466800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281553200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281639600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281726000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281812400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281898800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281909600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281996000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282082400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282168800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282255200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282341600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282428000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281920400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282006800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282093200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282179600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282266000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282352400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282438800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281931200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282017600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282104000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282190400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282276800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282363200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282449600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281942000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282028400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282114800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282201200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282287600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282374000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282460400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281952800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282039200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282125600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282212000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282298400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282384800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282471200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281963600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282050000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282136400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282222800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282309200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282395600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282482000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281974400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282060800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282147200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282233600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282320000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282406400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282492800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1281985200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282071600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282158000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282244400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282330800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282417200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282503600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282514400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282600800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282687200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282773600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282860000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282946400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283032800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282525200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282611600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282698000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282784400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282870800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282957200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283043600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282536000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282622400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282708800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282795200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282881600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282968000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283054400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282546800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282633200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282719600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282806000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282892400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282978800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283065200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282557600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282644000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282730400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282816800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282903200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282989600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283076000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282568400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282654800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282741200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282827600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282914000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283000400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283086800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282579200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282665600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282752000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282838400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282924800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283011200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283097600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282590000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282676400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282762800 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282849200 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1282935600 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283022000 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:09:44 Notice: Notice (8): Undefined offset: 1283108400 in [/var/www/infoskjerm/app/views/slides/timing.ctp, line 21] +2010-08-10 11:56:56 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 157] +2010-08-10 11:56:56 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 159] +2010-08-10 11:57:22 Notice: Notice (8): session_start() [http://php.net/function.session-start]: ps_files_cleanup_dir: opendir(/var/lib/php5) failed: Permission denied (13) in [/var/www/infoskjerm/cake/libs/cake_session.php, line 584] +2010-08-10 12:22:57 Notice: Notice (8): Undefined index: DiisplayTime in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 163] +2010-08-10 12:22:57 Notice: Notice (8): Undefined index: DiisplayTime in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 164] +2010-08-10 12:22:57 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/views/slides/index.ctp, line 52] +2010-08-10 12:22:57 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/views/slides/index.ctp, line 55] +2010-08-10 12:23:54 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/views/slides/index.ctp, line 52] +2010-08-10 12:23:54 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/views/slides/index.ctp, line 55] +2010-08-10 12:24:21 Notice: Notice (8): Undefined variable: enabled in [/var/www/infoskjerm/app/views/slides/index.ctp, line 21] +2010-08-10 12:24:21 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/views/slides/index.ctp, line 52] +2010-08-10 12:24:21 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/views/slides/index.ctp, line 55] +2010-08-10 12:24:31 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/views/slides/index.ctp, line 30] +2010-08-10 12:24:31 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/views/slides/index.ctp, line 33] +2010-08-10 12:24:31 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/views/slides/index.ctp, line 52] +2010-08-10 12:24:31 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/views/slides/index.ctp, line 55] +2010-08-10 12:30:15 Notice: Notice (8): Undefined index: DiisplayTime in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 161] +2010-08-10 12:30:15 Notice: Notice (8): Undefined index: DiisplayTime in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 162] +2010-08-10 12:37:33 Notice: Notice (8): Undefined index: DiisplayTime in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 163] +2010-08-10 12:38:20 Notice: Notice (8): Undefined index: DiisplayTime in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 163] +2010-08-10 12:38:32 Notice: Notice (8): Undefined index: DiisplayTime in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 163] +2010-08-10 12:38:59 Notice: Notice (8): Undefined index: DiisplayTime in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 163] +2010-08-10 12:38:59 Notice: Notice (8): Undefined index: thumbnail in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 2] +2010-08-10 12:38:59 Notice: Notice (8): Undefined index: id in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 48] +2010-08-10 12:39:08 Notice: Notice (8): Undefined index: thumbnail in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 2] +2010-08-10 12:39:08 Notice: Notice (8): Undefined index: id in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 48] +2010-08-10 12:39:45 Notice: Notice (8): Undefined index: thumbnail in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 2] +2010-08-10 12:39:45 Notice: Notice (8): Undefined index: id in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 48] +2010-08-10 12:40:05 Notice: Notice (8): Undefined index: DIsplayTime in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 165] +2010-08-10 12:40:05 Notice: Notice (8): Undefined index: thumbnail in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 2] +2010-08-10 12:40:05 Notice: Notice (8): Undefined index: id in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 48] +2010-08-10 12:40:16 Notice: Notice (8): Undefined index: DIsplayTime in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 165] +2010-08-10 12:40:16 Notice: Notice (8): Undefined index: thumbnail in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 2] +2010-08-10 12:40:16 Notice: Notice (8): Undefined index: id in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 48] +2010-08-10 12:40:25 Notice: Notice (8): Undefined index: thumbnail in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 2] +2010-08-10 12:40:25 Notice: Notice (8): Undefined index: id in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 48] +2010-08-10 12:40:35 Notice: Notice (8): Undefined index: thumbnail in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 2] +2010-08-10 12:40:35 Notice: Notice (8): Undefined index: id in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 48] +2010-08-10 13:28:58 Notice: Notice (8): Undefined index: start in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 121] +2010-08-10 13:28:58 Notice: Notice (8): Undefined index: stop in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 123] +2010-08-10 13:28:58 Notice: Notice (8): Undefined variable: id in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 133] +2010-08-10 13:30:15 Notice: Notice (8): Undefined variable: id in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 128] +2010-08-10 14:01:22 Notice: Notice (8): Undefined variable: file in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 135] +2010-08-10 14:01:22 Notice: Notice (8): Undefined variable: file in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 137] +2010-08-10 14:05:57 Notice: Notice (8): Undefined index: thumbanil in [/var/www/infoskjerm/app/views/slides/index.ctp, line 42] +2010-08-10 14:08:31 Notice: Notice (8): Undefined index: thumbanil in [/var/www/infoskjerm/app/views/slides/edit.ctp, line 2] +2010-08-10 15:11:31 Notice: Notice (8): Undefined variable: id in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 105] +2010-08-10 15:11:31 Notice: Notice (8): Undefined variable: id in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 105] diff --git a/app/tmp/logs/empty b/app/tmp/logs/empty new file mode 100755 index 0000000..e69de29 diff --git a/app/tmp/logs/error.log b/app/tmp/logs/error.log new file mode 100644 index 0000000..95e254c --- /dev/null +++ b/app/tmp/logs/error.log @@ -0,0 +1,33 @@ +2010-08-09 22:33:52 Warning: Warning (2): Invalid argument supplied for foreach() in [/var/www/infoskjerm/app/views/slides/index.ctp, line 2] +2010-08-09 23:18:10 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'getActive' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-09 23:18:10 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'getActive' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 09:08:33 Warning: Warning (512): SQL Error: 1054: Unknown column 'index' in 'order clause' in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 09:08:33 Warning: Warning (2): Invalid argument supplied for foreach() in [/var/www/infoskjerm/app/views/slides/index.ctp, line 36] +2010-08-10 09:16:34 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rem' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 09:16:34 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rem' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 09:25:46 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rem' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 09:25:50 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rem' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 09:25:56 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rem' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 09:26:03 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rem' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 09:26:07 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rem' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 09:26:32 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rem' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 09:26:32 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rem' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 11:09:34 Warning: Warning (512): SQL Error: 1052: Column 'id' in where clause is ambiguous in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 11:10:35 Warning: Warning (512): SQL Error: 1052: Column 'id' in where clause is ambiguous in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 12:22:57 Warning: Warning (512): SQL Error: 1054: Unknown column 'Slide.stop' in 'where clause' in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 12:22:57 Warning: Warning (512): SQL Error: 1054: Unknown column 'Slide.start' in 'where clause' in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 12:22:57 Warning: Warning (2): Invalid argument supplied for foreach() in [/var/www/infoskjerm/app/views/slides/index.ctp, line 21] +2010-08-10 12:23:54 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'getOldSlides' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 12:23:54 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'getActiveSlides' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 12:23:54 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'getFutureSlides' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 12:23:54 Warning: Warning (2): Invalid argument supplied for foreach() in [/var/www/infoskjerm/app/views/slides/index.ctp, line 21] +2010-08-10 12:24:21 Warning: Warning (2): Invalid argument supplied for foreach() in [/var/www/infoskjerm/app/views/slides/index.ctp, line 21] +2010-08-10 13:28:58 Warning: Warning (512): SQL Error: 1048: Column 'slide_id' cannot be null in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 13:28:58 Warning: Warning (2): Cannot modify header information - headers already sent by (output started at /var/www/infoskjerm/cake/libs/debugger.php:673) in [/var/www/infoskjerm/cake/libs/controller/controller.php, line 746] +2010-08-10 13:30:15 Warning: Warning (512): SQL Error: 1048: Column 'slide_id' cannot be null in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 13:30:15 Warning: Warning (2): Cannot modify header information - headers already sent by (output started at /var/www/infoskjerm/cake/basics.php:356) in [/var/www/infoskjerm/cake/libs/controller/controller.php, line 746] +2010-08-10 13:54:51 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'getByName' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 13:56:37 Warning: Warning (2): file_get_contents(/var/www/infoskjerm/app/webroot/slides/res_1) [http://php.net/function.file-get-contents]: failed to open stream: No such file or directory in [/var/www/infoskjerm/app/controllers/resources_controller.php, line 21] +2010-08-10 14:10:11 Warning: Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'getThumbnailUrl' at line 1 in [/var/www/infoskjerm/cake/libs/model/datasources/dbo_source.php, line 681] +2010-08-10 15:11:31 Warning: Warning (2): Missing argument 1 for SlidesController::delete() in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 103] +2010-08-10 15:11:31 Warning: Warning (2): Missing argument 1 for SlidesController::delete() in [/var/www/infoskjerm/app/controllers/slides_controller.php, line 103] diff --git a/app/tmp/sessions/empty b/app/tmp/sessions/empty new file mode 100755 index 0000000..e69de29 diff --git a/app/tmp/tests/empty b/app/tmp/tests/empty new file mode 100755 index 0000000..e69de29 diff --git a/app/vendors/shells/tasks/empty b/app/vendors/shells/tasks/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/vendors/shells/templates/empty b/app/vendors/shells/templates/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/elements/email/html/empty b/app/views/elements/email/html/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/elements/email/text/empty b/app/views/elements/email/text/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/elements/empty b/app/views/elements/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/errors/empty b/app/views/errors/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/helpers/empty b/app/views/helpers/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/layouts/default.ctp b/app/views/layouts/default.ctp new file mode 100644 index 0000000..5a79231 --- /dev/null +++ b/app/views/layouts/default.ctp @@ -0,0 +1,60 @@ + + + + + Html->charset(); ?> + + <?php echo $title_for_layout; ?> + + Html->meta('icon'); + + echo $this->Html->css('cake.generic'); + + echo $this->Html->css('smoothness/jquery-ui-1.8.4.custom.css'); + echo $this->Javascript->link(array('jquery-1.4.2.min.js','jquery-ui-1.8.4.custom.min.js','jquery.cycle.all.min.js')); + echo $scripts_for_layout; + ?> + + +
+ +
+ + Session->flash(); ?> + + + +
+ +
+ element('sql_dump'); ?> + + \ No newline at end of file diff --git a/app/views/layouts/email/html/empty b/app/views/layouts/email/html/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/layouts/email/text/empty b/app/views/layouts/email/text/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/layouts/js/empty b/app/views/layouts/js/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/layouts/rss/empty b/app/views/layouts/rss/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/layouts/slideshow.ctp b/app/views/layouts/slideshow.ctp new file mode 100644 index 0000000..598ca71 --- /dev/null +++ b/app/views/layouts/slideshow.ctp @@ -0,0 +1,37 @@ + + + + + Html->charset(); ?> + + <?php echo $title_for_layout; ?> + + Javascript->link(array('jquery-1.4.2.min.js','jquery-ui-1.8.4.custom.min.js','jquery.cycle.all.min.js')); + echo $scripts_for_layout; + ?> + + +
+ +
+ + \ No newline at end of file diff --git a/app/views/layouts/xml/empty b/app/views/layouts/xml/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/pages/empty b/app/views/pages/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/scaffolds/empty b/app/views/scaffolds/empty new file mode 100644 index 0000000..e69de29 diff --git a/app/views/slides/add.ctp b/app/views/slides/add.ctp new file mode 100644 index 0000000..a7a8c74 --- /dev/null +++ b/app/views/slides/add.ctp @@ -0,0 +1,47 @@ +create(null, array('type'=>'file')); +echo $form->input('title'); + +?> +
+Content +

Enter url

input('url'); +?>

or upload file

file('Upload.file'); +?> +

Filene kjøres direkte i browseren, og den støtter vanlige bildeformater, html, tekstfiler og SVG :)

+
+
+Start/stop +La feltet stå tomt for å ikke ha noe spesielt start/stopp tidspunkt

'; + + +echo '
'; +echo $form->label('simple','Use simple timing:'); +echo $form->checkbox('simple'); +echo '
'; + +echo $form->hidden('DisplayTime.0.slide_id'); +echo $form->input('DisplayTime.0.start', array('class'=>'date')); +echo $form->input('DisplayTime.0.stop', array('class'=>'date')); + +?> +
+ +end('Create'); + +?> \ No newline at end of file diff --git a/app/views/slides/edit.ctp b/app/views/slides/edit.ctp new file mode 100644 index 0000000..4dcc11b --- /dev/null +++ b/app/views/slides/edit.ctp @@ -0,0 +1,49 @@ +
link('Delete this slide', '/slides/delete/' . $this->data['Slide']['id'], array('style'=>'color:red;','onclick'=>'return confirm("Er du sikker på at du vil slette denne?");')); +?>
+
+Details +image( $this->data['Slide']['thumbnail']?$this->data['Slide']['thumbnail']:'nothumb.png'); + +echo $form->create(); + +echo $form->input('title'); + +echo $form->input('url'); + +?> +
+
+Start/stop +La feltet stå tomt for å ikke ha noe spesielt start/stopp tidspunkt

'; + + +echo '
'; +echo $form->label('simple','Use simple timing:'); +echo $form->checkbox('simple'); +echo '
'; + +echo $form->hidden('DisplayTime.0.id'); +echo $form->hidden('DisplayTime.0.slide_id'); +echo $form->input('DisplayTime.0.start', array('class'=>'date')); +echo $form->input('DisplayTime.0.stop', array('class'=>'date')); + +?> +
+ +end('Save'); diff --git a/app/views/slides/index.ctp b/app/views/slides/index.ctp new file mode 100644 index 0000000..df352c9 --- /dev/null +++ b/app/views/slides/index.ctp @@ -0,0 +1,62 @@ + +
+link('Add new slide', '/slides/add') ?> +link('Logout', '/users/logout', array('style'=>'float:right;')) ?> +
+
+

Active slides

+
    + +
  • +

    +

    + link('Edit', '/slides/edit/' . $slide['Slide']['id']) ?> + + link('Set timing', '/slides/timing/' . $slide['Slide']['id']) ?> + + link('Disable', '/slides/disable/' . $slide['Slide']['id']) ?> +

    + +
  • + +
+
+ + + \ No newline at end of file diff --git a/app/views/slides/next.ctp b/app/views/slides/next.ctp new file mode 100644 index 0000000..b8c7a3d --- /dev/null +++ b/app/views/slides/next.ctp @@ -0,0 +1,2 @@ + +#slideshow iframe, img, #overlay +{ + position:absolute; + left:0px; + top:0px; + border:0px; + width:100%; + height:100%; + bottom:0px; + overflow:hidden; +} + +img +{ + z-index:8; +} + +#overlay +{ + z-index:9; +} + +body{ + padding:0px; + margin:0px; + overflow:hidden; + background:url() black; +} + +image('noslides.png'); +?> +
+ + + +
+ +
+ + +
+ +
+  +
+ \ No newline at end of file diff --git a/app/views/slides/timing.ctp b/app/views/slides/timing.ctp new file mode 100644 index 0000000..a05b6ff --- /dev/null +++ b/app/views/slides/timing.ctp @@ -0,0 +1,146 @@ +create(); +echo $form->hidden('id'); + +echo $form->submit('Save'); +echo '
'; +echo $html->link('Check/uncheck all','#',array('id'=>'toggleall')) . ' '; +echo $html->link('Revert current changes','/slides/timing/' . $this->data['Slide']['id'],array('id'=>'revert')); +echo '
'; +$tittel = array('9'=>'Uke 32','16'=>'Uke 33','23'=>'Uke 34','30'=>'Uke 35'); +for($i = 9; $i < 31; $i+=7): +$weekstart = strtotime("$i August 2010"); +?> +
+

+ + + + + + + + + + data['Time'][$tid]) echo ' class="selected org"' ?>>checkbox('Time.' . $tid) ?> + + + +
Tid',array('Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag','Søndag')) ?>
+
+ + +
+ submit("Save"); + echo $form->end();?> +
+ + + diff --git a/app/views/users/login.ctp b/app/views/users/login.ctp new file mode 100644 index 0000000..9ac5194 --- /dev/null +++ b/app/views/users/login.ctp @@ -0,0 +1,5 @@ +create(); +echo $form->input('username'); +echo $form->input('password'); +echo $form->end('Login'); \ No newline at end of file diff --git a/app/webroot/css.php b/app/webroot/css.php new file mode 100644 index 0000000..aae68cb --- /dev/null +++ b/app/webroot/css.php @@ -0,0 +1,96 @@ +compress($data); + $ratio = 100 - (round(strlen($output) / strlen($data), 3) * 100); + $output = " /* file: $name, ratio: $ratio% */ " . $output; + return $output; + } +/** + * Write CSS cache + * + * @param unknown_type $path + * @param unknown_type $content + * @return unknown + */ + function write_css_cache($path, $content) { + if (!is_dir(dirname($path))) { + mkdir(dirname($path)); + } + $cache = new File($path); + return $cache->write($content); + } + + if (preg_match('|\.\.|', $url) || !preg_match('|^ccss/(.+)$|i', $url, $regs)) { + die('Wrong file name.'); + } + + $filename = 'css/' . $regs[1]; + $filepath = CSS . $regs[1]; + $cachepath = CACHE . 'css' . DS . str_replace(array('/','\\'), '-', $regs[1]); + + if (!file_exists($filepath)) { + die('Wrong file name.'); + } + + if (file_exists($cachepath)) { + $templateModified = filemtime($filepath); + $cacheModified = filemtime($cachepath); + + if ($templateModified > $cacheModified) { + $output = make_clean_css($filepath, $filename); + write_css_cache($cachepath, $output); + } else { + $output = file_get_contents($cachepath); + } + } else { + $output = make_clean_css($filepath, $filename); + write_css_cache($cachepath, $output); + $templateModified = time(); + } + + header("Date: " . date("D, j M Y G:i:s ", $templateModified) . 'GMT'); + header("Content-Type: text/css"); + header("Expires: " . gmdate("D, d M Y H:i:s", time() + DAY) . " GMT"); + header("Cache-Control: max-age=86400, must-revalidate"); // HTTP/1.1 + header("Pragma: cache"); // HTTP/1.0 + print $output; diff --git a/app/webroot/css/cake.generic.css b/app/webroot/css/cake.generic.css new file mode 100644 index 0000000..4f6f5a2 --- /dev/null +++ b/app/webroot/css/cake.generic.css @@ -0,0 +1,535 @@ +/** + * + * Generic CSS for CakePHP + * + * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) + * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * + * Licensed under The MIT License + * Redistributions of files must retain the above copyright notice. + * + * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * @link http://cakephp.org CakePHP(tm) Project + * @package cake + * @subpackage cake.app.webroot.css + * @since CakePHP(tm) + * @license MIT License (http://www.opensource.org/licenses/mit-license.php) + */ + +* { + margin:0; + padding:0; +} + +/** General Style Info **/ +body { + background: #003d4c; + color: #fff; + font-family:'lucida grande',verdana,helvetica,arial,sans-serif; + font-size:90%; + margin: 0; +} +a { + color: #003d4c; + text-decoration: underline; + font-weight: bold; +} +a:hover { + color: #367889; + text-decoration:none; +} +a img { + border:none; +} +h1, h2, h3, h4 { + font-weight: normal; + margin-bottom:0.5em; +} +h1 { + background:#fff; + color: #003d4c; + font-size: 100%; +} +h2 { + background:#fff; + color: #e32; + font-family:'Gill Sans','lucida grande', helvetica, arial, sans-serif; + font-size: 190%; +} +h3 { + color: #993; + font-family:'Gill Sans','lucida grande', helvetica, arial, sans-serif; + font-size: 165%; +} +h4 { + color: #993; + font-weight: normal; +} +ul, li { + margin: 0 12px; +} + +/** Layout **/ +#container { + text-align: left; +} + +#header{ + padding: 10px 20px; +} +#header h1 { + line-height:20px; + background: #003d4c url('../img/cake.icon.png') no-repeat left; + color: #fff; + padding: 0px 30px; +} +#header h1 a { + color: #fff; + background: #003d4c; + font-weight: normal; + text-decoration: none; +} +#header h1 a:hover { + color: #fff; + background: #003d4c; + text-decoration: underline; +} +#content{ + background: #fff; + clear: both; + color: #333; + padding: 10px 20px 40px 20px; + overflow: auto; +} +#footer { + clear: both; + padding: 6px 10px; + text-align: right; +} + +/** containers **/ +div.form, +div.index, +div.view { + float:right; + width:76%; + border-left:1px solid #666; + padding:10px 2%; +} +div.actions { + float:left; + width:16%; + padding:10px 1.5%; +} +div.actions h3 { + padding-top:0; + color:#777; +} + + +/** Tables **/ +table { + background: #fff; + border-right:0; + clear: both; + color: #333; + margin-bottom: 10px; + width: 100%; +} +th { + border:0; + border-bottom:2px solid #555; + text-align: left; + padding:4px; +} +th a { + display: block; + padding: 2px 4px; + text-decoration: none; +} +th a.asc:after { + content: ' ⇣'; +} +th a.desc:after { + content: ' ⇡'; +} +table tr td { + background: #fff; + padding: 6px; + text-align: left; + vertical-align: top; + border-bottom:1px solid #ddd; +} +table tr:nth-child(2n) td { + background: #f5f5f5; +} +table .altrow td { + background: #f5f5f5; +} +td.actions { + text-align: center; + white-space: nowrap; +} +table td.actions a { + margin: 0px 6px; + padding:2px 5px; +} +.cake-sql-log table { + background: #f4f4f4; +} +.cake-sql-log td { + padding: 4px 8px; + text-align: left; + font-family: Monaco, Consolas, "Courier New", monospaced; +} +.cake-sql-log caption { + color:#fff; +} + +/** Paging **/ +div.paging { + background:#fff; + color: #ccc; + margin-top: 1em; + clear:both; +} +div.paging span.disabled { + color: #ddd; + display: inline; +} +div.paging span.current { + color: #c73e14; +} +div.paging span a { +} + +/** Scaffold View **/ +dl { + line-height: 2em; + margin: 0em 0em; + width: 60%; +} +dl .altrow { + background: #f4f4f4; +} +dt { + font-weight: bold; + padding-left: 4px; + vertical-align: top; +} +dd { + margin-left: 10em; + margin-top: -2em; + vertical-align: top; +} + +/** Forms **/ +form { + clear: both; + margin-right: 20px; + padding: 0; + width: 95%; +} +fieldset { + border: 1px solid #ccc; + margin-bottom: 1em; + padding: 16px 20px; +} +fieldset legend { + background:#fff; + color: #e32; + font-size: 160%; + font-weight: bold; +} +fieldset fieldset { + margin-top: 0px; + margin-bottom: 20px; + padding: 16px 10px; +} +fieldset fieldset legend { + font-size: 120%; + font-weight: normal; +} +fieldset fieldset div { + clear: left; + margin: 0 20px; +} +form div { + clear: both; + margin-bottom: 1em; + padding: .5em; + vertical-align: text-top; +} +form .input { + color: #444; +} +form .required { + font-weight: bold; +} +form .required label:after { + color: #e32; + content: '*'; + display:inline; +} +form div.submit { + border: 0; + clear: both; + margin-top: 10px; +} +label { + display: block; + font-size: 110%; + margin-bottom:3px; +} +input, textarea { + clear: both; + font-size: 140%; + font-family: "frutiger linotype", "lucida grande", "verdana", sans-serif; + padding: 1%; + width:98%; +} +select { + clear: both; + font-size: 120%; + vertical-align: text-bottom; +} +select[multiple=multiple] { + width: 100%; +} +option { + font-size: 120%; + padding: 0 3px; +} +input[type=checkbox] { + clear: left; + float: left; + margin: 0px 6px 7px 2px; + width: auto; +} +div.checkbox label { + display: inline; +} +input[type=radio] { + float:left; + width:auto; + margin: 0 3px 7px 0; +} +div.radio label { + margin: 0 0 6px 20px; +} +input[type=submit] { + display: inline; + font-size: 110%; + width: auto; +} +form .submit input[type=submit] { + background:#62af56; + background: -webkit-gradient(linear, left top, left bottom, from(#a8ea9c), to(#62af56)); + background-image: -moz-linear-gradient(top, #a8ea9c, #62af56); + border-color: #2d6324; + color: #000; + text-shadow: #8cee7c 0px 1px 0px; +} +form .submit input[type=submit]:hover { + background:#4ca83d; + background: -webkit-gradient(linear, left top, left bottom, from(#85e573), to(#4ca83d)); + background-image: -moz-linear-gradient(top, #85e573, #4ca83d); +} + +/** Notices and Errors **/ +div.message { + clear: both; + color: #fff; + font-size: 140%; + font-weight: bold; + margin: 0 0 1em 0; + background: #c73e14; + padding: 5px; +} +div.error-message { + clear: both; + color: #fff; + font-weight: bold; + background: #c73e14; +} +p.error { + background-color: #e32; + color: #fff; + font-family: Courier, monospace; + font-size: 120%; + line-height: 140%; + padding: 0.8em; + margin: 1em 0; +} +p.error em { + color: #000; + font-weight: normal; + line-height: 140%; +} +.notice { + background: #ffcc00; + color: #000; + display: block; + font-family: Courier, monospace; + font-size: 120%; + line-height: 140%; + padding: 0.8em; + margin: 1em 0; +} +.success { + background: green; + color: #fff; +} + +/** Actions **/ +div.actions ul { + margin: 0; + padding: 0; +} +div.actions li { + margin:0 0 0.5em 0; + list-style-type: none; + white-space: nowrap; + padding: 0; +} +div.actions ul li a { + font-weight: normal; + display: block; + clear: both; +} +div.actions ul li a:hover { + text-decoration: underline; +} + +input[type=submit], +div.actions ul li a, +td.actions a { + font-weight:normal; + padding: 4px 8px; + background:#e6e49f; + background: -webkit-gradient(linear, left top, left bottom, from(#f1f1d4), to(#e6e49f)); + background-image: -moz-linear-gradient(top, #f1f1d4, #e6e49f); + color:#333; + border:1px solid #aaac62; + -webkit-border-radius:8px; + -moz-border-radius:8px; + border-radius:8px; + text-decoration:none; + text-shadow: #fff 0px 1px 0px; + min-width: 0; +} +input[type=submit]:hover, +div.actions ul li a:hover, +td.actions a:hover { + background: #f0f09a; + background: -webkit-gradient(linear, left top, left bottom, from(#f7f7e1), to(#eeeca9)); +} + +/** Related **/ +div.related { + clear: both; + display: block; +} + +/** Debugging **/ +pre { + color: #000; + background: #f0f0f0; + padding: 1em; +} +pre.cake-debug { + background: #ffcc00; + font-size: 120%; + line-height: 140%; + margin-top: 1em; + overflow: auto; + position: relative; +} +div.cake-stack-trace { + background: #fff; + color: #333; + margin: 0px; + padding: 6px; + font-size: 120%; + line-height: 140%; + overflow: auto; + position: relative; +} +div.cake-code-dump pre { + position: relative; + overflow: auto; +} +div.cake-stack-trace pre, div.cake-code-dump pre { + color: #000; + background-color: #F0F0F0; + margin: 0px; + padding: 1em; + overflow: auto; +} +div.cake-code-dump pre, div.cake-code-dump pre code { + clear: both; + font-size: 12px; + line-height: 15px; + margin: 4px 2px; + padding: 4px; + overflow: auto; +} +div.cake-code-dump span.code-highlight { + background-color: #ff0; + padding: 4px; +} +div.code-coverage-results div.code-line { + padding-left:5px; + display:block; + margin-left:10px; +} +div.code-coverage-results div.uncovered span.content { + background:#ecc; +} +div.code-coverage-results div.covered span.content { + background:#cec; +} +div.code-coverage-results div.ignored span.content { + color:#aaa; +} +div.code-coverage-results span.line-num { + color:#666; + display:block; + float:left; + width:20px; + text-align:right; + margin-right:5px; +} +div.code-coverage-results span.line-num strong { + color:#666; +} +div.code-coverage-results div.start { + border:1px solid #aaa; + border-width:1px 1px 0px 1px; + margin-top:30px; + padding-top:5px; +} +div.code-coverage-results div.end { + border:1px solid #aaa; + border-width:0px 1px 1px 1px; + margin-bottom:30px; + padding-bottom:5px; +} +div.code-coverage-results div.realstart { + margin-top:0px; +} +div.code-coverage-results p.note { + color:#bbb; + padding:5px; + margin:5px 0 10px; + font-size:10px; +} +div.code-coverage-results span.result-bad { + color: #a00; +} +div.code-coverage-results span.result-ok { + color: #fa0; +} +div.code-coverage-results span.result-good { + color: #0a0; +} \ No newline at end of file diff --git a/app/webroot/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/app/webroot/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/app/webroot/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/app/webroot/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/app/webroot/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/app/webroot/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3d6346e00f246102f72f2e026ed0491988b394 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v literal 0 HcmV?d00001 diff --git a/app/webroot/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/app/webroot/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/app/webroot/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/app/webroot/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/app/webroot/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/app/webroot/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l#Zv1V~E7mPmYTG^FX}c% zlGE{DS1Q;~I7-6ze&TN@+F-xsI6sd%SwK#*O5K|pDRZqEy< zJg0Nd8F@!OxqElm`~U#piM22@u@8B<moyKE%ct`B(jysxK+1m?G)UyIFs1t0}L zemGR&?jGaM1YQblj?v&@0iXS#fi-VbR9zLEnHLP?xQ|=%Ihrc7^yPWR!tW$yH!zrw z#I2}_!JnT^(qk)VgJr`NGdPtT^dmQIZc%=6nTAyJDXk+^3}wUOilJuwq>s=T_!9V) zr1)DT6VQ2~rgd@!Jlrte3}}m~j}juCS`J4(d-5+e-3@EzzTJNCE2z)w(kJ90z*QE) zBtnV@4mM>jTrZZ*$01SnGov0&=A-JrX5Ge%Pce1Vj}=5YQqBD^W@n4KmFxxpFK`uH zP;(xKV+6VJ2|g+?_Lct7`uElL<&jzGS8Gfva2+=8A@#V+xsAj9|Dkg)vL5yhX@~B= zN2KZSAUD%QH`x>H+@Ou(D1~Pyv#0nc&$!1kI?IO01yw3jD0@80qvc?T*Nr8?-%rC8 z@5$|WY?Hqp`ixmEkzeJTz_`_wsSRi1%Zivd`#+T{Aib6-rf$}M8sz6v zb6ERbr-SniO2wbOv!M4)nb}6UVzoVZEh5kQWh_5x4rYy3c!871NeaM(_p=4(kbS6U#x<*k8Wg^KHs2ttCz<+pBxQ$Z zQMv;kVm5_fF_vH`Mzrq$Y&6u?j6~ftIV0Yg)Nw7JysIN_ z-_n*K_v1c&D}-1{NbBwS2h#m1y0a5RiEcYil+58$8IDh49bPnzE7R8In6P%V{2IZU z7#clr=V4yyrRe@oXNqbqo^^LvlLE?%8XaI&N(Np90-psU}7kqmbWk zZ;YBwJNnNs$~d!mx9oMGyT( znaBoj0d}gpQ^aRr?6nW)$4god*`@Uh2e+YpS@0(Mw{|z|6ko3NbTvDiCu3YO+)egL z>uW(^ahKFj>iJ-JF!^KhKQyPTznJa;xyHYwxJgr16&Wid_9)-%*mEwo{B_|M9t@S1 zf@T@q?b2Qgl!~_(Roe;fdK)y|XG0;ls;ZbT)w-aOVttk#daQcY7$cpY496H*`m@+L zeP#$&yRbBjFWv}B)|5-1v=(66M_;V1SWv6MHnO}}1=vby&9l+gaP?|pXwp0AFDe#L z&MRJ^*qX6wgxhA_`*o=LGZ>G_NTX%AKHPz4bO^R72ZYK}ale3lffDgM8H!Wrw{B7A z{?c_|dh2J*y8b04c37OmqUw;#;G<* z@nz@dV`;7&^$)e!B}cd5tl0{g(Q>5_7H^@bEJi7;fQ4B$NGZerH#Ae1#8WDTH`iB&) zC6Et3BYY#mcJxh&)b2C^{aLq~psFN)Q1SucCaBaBUr%5PYX{~-q{KGEh)*;n;?75k z=hq%i^I}rd;z-#YyI`8-OfMpWz5kgJE3I!3ean6=UZi!BxG7i(YBk? z02HM7wS0)Wni{dWbQMRtd-A)_Az!t>F;IwWf~!*)-Az4}yryNkz&9)w>ElA80Oc`6 zHo#9H!Y3*Qx9n@Jn)!w6G^hb;e_n8zpIyXCN`JFkPc)^Q?2MsLNFhMgrcZI-<#1ne zjH;KFf?4eAT9mQZ}ZfHLGA#d%s;SZK4p0FwZT2S^{ zQ2BG1xJsbK6?yrHTjJi|5C0u=!|r!?*4FL%y%3q#(d+e>b_2I9!*iI!30}42Ia0bq zUf`Z?LGSEvtz8s``Tg5o_CP(FbR0X$FlE0yCnB7suDPmI2=yOg^*2#cY9o`X z;NY-3VBHZjnVcGS){GZ98{e+lq~O$u6pEcgd0CrnIsWffN1MbCZDH<7c^hv+Z0Ucf0{w zSzi^qKuUHD9Dgp0EAGg@@$zr32dQx>N=ws`MESEsmzgT2&L;?MSTo&ky&!-JR3g~1 zPGTt515X)wr+Bx(G9lWd;@Y3^Vl}50Wb&6-Tiy;HPS0drF`rC}qYq22K4)G#AoD0X zYw$E+Bz@Zr^50MAwu@$?%f9$r4WHH?*2|67&FXFhXBrVFGmg)6?h3^-1?t;UzH0*I zNVf9wQLNLnG2@q>6CGm>&y|lC`iCFfYd}9i%+xkl^5oBJ?<;aneCfcHqJh7Yl5uLS z9Fx-(kMdcNyZejXh22N{mCw_rX1O!cOE&3>e(ZH81PR95wQC37En4O{w;{3q9n1t&;p)D%&Z%Nw$gSPa!nz8Slh7=ko2am)XARwOWw zpsz0~K!s{(dM$NB=(A=kkp>T(*yU6<_dwIx>cH4+LWl282hXa6-EUq>R3t?G2623< z*RwTN%-fgBmD{fu*ejNn)1@KG?Sg*8z3hYtkQJQjB6 zQ|x>wA=o$=O)+nLmgTXW3_6diA;b4EY{*i*R%6dO2EMg z@6g?M3rpbnfB@hOdUeb96=~I?OIA3@BWAGmTwiQ{x5Cqq<8c10L!P zd@Qk^BseTX%$Q7^s}5n%HB|)gKx}H$d8Sb$bBnq9-AglT2dGR2(+I;_fL|R4p$odJ zllfb0NqI)7=^z~qAm1V{(PkpxXsQ#4*NH9yYZ`Vf@)?#ueGgtCmGGY|9U#v|hRdg- zQ%0#cGIfXCd{Y)JB~qykO;KPvHu|5Ck&(Hn%DF~cct@}j+87xhs2ew;fLm5#2+mb| z8{9e*YI(u|gt|{x1G+U=DA3y)9s2w7@cvQ($ZJIA)x$e~5_3LKFV~ASci8W}jF&VeJoPDUy(BB>ExJpck;%;!`0AAo zAcHgcnT8%OX&UW_n|%{2B|<6Wp2MMGvd5`T2KKv;ltt_~H+w00x6+SlAD`{K4!9zx z*1?EpQ%Lwiik){3n{-+YNrT;fH_niD_Ng9|58@m8RsKFVF!6pk@qxa{BH-&8tsim0 zdAQ(GyC^9ane7_KW*#^vMIoeQdpJqmPp%%px3GIftbwESu#+vPyI*YTuJ6+4`z{s? zpkv~0x4c_PFH`-tqafw5)>4AuQ78SkZ!$8}INLK;Egr;2tS18hEO5=t;QDmZ-qu?I zG+=DN`nR72Xto{{bJp||`k}-2G;5#xg8E~xgz22)^_Z;=K|4@(E&5J)SY2of=olcw z5)@L)_Ntcm!*5nEy0M9v0`S33;pO4TN;>4(Z+19p_0>u#e-vE zXCU(6gAvu~I7Cw(xd%0e59MNLw^U37ZDbsBrj%eDCexw8a3G`nTcXVNL6{B7Hj@i& zbVB{;ApEtHk76q08DJ48dSxd$C(;$K6=FpU<~l9pVoT9arW^Vu{%Bcn4`eIpkOVC| z$)AKYG_`ypM{0@BUb3^9lqi_c?ONH|4UJMJWDowMVjacycX7}9g={O7swOB+{;+?; zjBo!9?+nd)ie#x5IbFW-zBOo0c4q@9wGVt5;pNt`=-~Zgcw#*`m($6ibxtZ`H=e=} zF#GZ~5$%AUn};8U#tRem0J(JTR}d4vR(dgK2ML~lZsPhayJ2h1%sD4FVst| zKF)+@`iNzLRjg4=K8@**0=5cE>%?FDc({I^+g9USk<8$&^qD~@%W0i4b|yMG*p4`N zh}I!ltTRI8Ex$+@V{02Br%xq#O?UlhO{r8WsaZnZCZq0MK9%AXU%MDLT;3=0A9(BV z9VxxxJd7jo$hw3q;3o?yBLmA=azBUrd9>-<_ANs0n3?-Ic*6&ytb@H~?0E(*d>T5n z-HiH2jsDf6uWhID%#n>SzOqrFCPDfUcu5QPd?<(=w6pv1BE#nsxS{n!UnC9qAha1< z;3cpZ9A-e$+Y)%b;w@!!YRA9p%Kf9IHGGg^{+p`mh;q8i7}&e@V3EQaMsItEMS&=X plT@$;k0WcB_jb;cn%_Idz4HO$QU*abf4}+wi?e96N>fbq{{i|W0@(ln literal 0 HcmV?d00001 diff --git a/app/webroot/css/smoothness/images/ui-icons_2e83ff_256x240.png b/app/webroot/css/smoothness/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..09d1cdc856c292c4ab6dd818c7543ac0828bd616 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/app/webroot/css/smoothness/images/ui-icons_454545_256x240.png b/app/webroot/css/smoothness/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..59bd45b907c4fd965697774ce8c5fc6b2fd9c105 GIT binary patch literal 4369 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 oBo%DI*Kv;w;*%(i9W@f3_WCF#rGn literal 0 HcmV?d00001 diff --git a/app/webroot/css/smoothness/images/ui-icons_cd0a0a_256x240.png b/app/webroot/css/smoothness/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab019b73ec11a485fa09378f3a0e155194f6a5d GIT binary patch literal 4369 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 K#YzRMcmD&=Mm_rg literal 0 HcmV?d00001 diff --git a/app/webroot/img/cake.icon.png b/app/webroot/img/cake.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..394fa42d5131cdc7b0b1246af93b92179f3c887e GIT binary patch literal 943 zcmV;g15o^lP)9q)cr7> zIGsQFGn3| zCzs2iP$-yfVPOGVTU&6sT(-5fwHb2tVsLP9#{Vr9Ct?R7q(rf?v2A5#W$OI=e1YUJ zQ1YRnA&iWSQ1XYAm__>aYb6XIhMiYVD+-z8_pYi6+CsH{*^m;vOjqvbr=H&DFkeqxHQBh$Scsoy0Glw(T zsaSG*ok62V;~yXYNgP*DUw;o98^+0@vGFb{HC+As}XJ=;xg=B7N_;-mKbHH{|lXs_o+aPcs5~J?s%^P2Odb)Uz z$GvY6^!N9(C2-h?28B$qx7%_yHnt2eU%nQ0qThbl6a_+b)EirjBgQ`g1_07Fr&6R? RzIgxu002ovPDHLkV1mdlwUYn< literal 0 HcmV?d00001 diff --git a/app/webroot/img/cake.power.gif b/app/webroot/img/cake.power.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f8d570a2e24d86f0ad7730ee8f2435fd49f152c GIT binary patch literal 201 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 V3A-Em$sY=5(gPcUu=k%v{1@&JcLx9f literal 0 HcmV?d00001 diff --git a/app/webroot/img/nothumb.png b/app/webroot/img/nothumb.png new file mode 100644 index 0000000000000000000000000000000000000000..a5d2db889aeca7942ba8f55787799b3d6019d79a GIT binary patch literal 3353 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 + } diff --git a/app/webroot/js/jquery-1.4.2.min.js b/app/webroot/js/jquery-1.4.2.min.js new file mode 100644 index 0000000..7c24308 --- /dev/null +++ b/app/webroot/js/jquery-1.4.2.min.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/app/webroot/js/jquery-ui-1.8.4.custom.min.js b/app/webroot/js/jquery-ui-1.8.4.custom.min.js new file mode 100644 index 0000000..b1cac98 --- /dev/null +++ b/app/webroot/js/jquery-ui-1.8.4.custom.min.js @@ -0,0 +1,763 @@ +/*! + * jQuery UI 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.4",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=0)&&c(a).is(":focusable")}})}})(jQuery); +;/*! + * jQuery UI Widget 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,j){var k=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return k.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options); +b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}): +this.each(function(){var g=b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}); +this._create();this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}b.each(d,function(f, +h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a= +b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery); +;/*! + * jQuery UI Mouse 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&& +this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault(); +return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&& +this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX- +a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); +;/* + * jQuery UI Position 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Position + */ +(function(c){c.ui=c.ui||{};var m=/left|center|right/,n=/top|center|bottom/,p=c.fn.position,q=c.fn.offset;c.fn.position=function(a){if(!a||!a.of)return p.apply(this,arguments);a=c.extend({},a);var b=c(a.of),d=(a.collision||"flip").split(" "),e=a.offset?a.offset.split(" "):[0,0],g,h,i;if(a.of.nodeType===9){g=b.width();h=b.height();i={top:0,left:0}}else if(a.of.scrollTo&&a.of.document){g=b.width();h=b.height();i={top:b.scrollTop(),left:b.scrollLeft()}}else if(a.of.preventDefault){a.at="left top";g=h= +0;i={top:a.of.pageY,left:a.of.pageX}}else{g=b.outerWidth();h=b.outerHeight();i=b.offset()}c.each(["my","at"],function(){var f=(a[this]||"").split(" ");if(f.length===1)f=m.test(f[0])?f.concat(["center"]):n.test(f[0])?["center"].concat(f):["center","center"];f[0]=m.test(f[0])?f[0]:"center";f[1]=n.test(f[1])?f[1]:"center";a[this]=f});if(d.length===1)d[1]=d[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(a.at[0]==="right")i.left+=g;else if(a.at[0]==="center")i.left+= +g/2;if(a.at[1]==="bottom")i.top+=h;else if(a.at[1]==="center")i.top+=h/2;i.left+=e[0];i.top+=e[1];return this.each(function(){var f=c(this),k=f.outerWidth(),l=f.outerHeight(),j=c.extend({},i);if(a.my[0]==="right")j.left-=k;else if(a.my[0]==="center")j.left-=k/2;if(a.my[1]==="bottom")j.top-=l;else if(a.my[1]==="center")j.top-=l/2;j.left=parseInt(j.left);j.top=parseInt(j.top);c.each(["left","top"],function(o,r){c.ui.position[d[o]]&&c.ui.position[d[o]][r](j,{targetWidth:g,targetHeight:h,elemWidth:k, +elemHeight:l,offset:e,my:a.my,at:a.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(j,{using:a.using}))})};c.ui.position={fit:{left:function(a,b){var d=c(window);b=a.left+b.elemWidth-d.width()-d.scrollLeft();a.left=b>0?a.left-b:Math.max(0,a.left)},top:function(a,b){var d=c(window);b=a.top+b.elemHeight-d.height()-d.scrollTop();a.top=b>0?a.top-b:Math.max(0,a.top)}},flip:{left:function(a,b){if(b.at[0]!=="center"){var d=c(window);d=a.left+b.elemWidth-d.width()-d.scrollLeft();var e=b.my[0]==="left"? +-b.elemWidth:b.my[0]==="right"?b.elemWidth:0,g=-2*b.offset[0];a.left+=a.left<0?e+b.targetWidth+g:d>0?e-b.targetWidth+g:0}},top:function(a,b){if(b.at[1]!=="center"){var d=c(window);d=a.top+b.elemHeight-d.height()-d.scrollTop();var e=b.my[1]==="top"?-b.elemHeight:b.my[1]==="bottom"?b.elemHeight:0,g=b.at[1]==="top"?b.targetHeight:-b.targetHeight,h=-2*b.offset[1];a.top+=a.top<0?e+b.targetHeight+h:d>0?e+g+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(a,b){if(/static/.test(c.curCSS(a,"position")))a.style.position= +"relative";var d=c(a),e=d.offset(),g=parseInt(c.curCSS(a,"top",true),10)||0,h=parseInt(c.curCSS(a,"left",true),10)||0;e={top:b.top-e.top+g,left:b.left-e.left+h};"using"in b?b.using.call(a,e):d.css(e)};c.fn.offset=function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(){c.offset.setOffset(this,a)});return q.call(this)}}})(jQuery); +;/* + * jQuery UI Draggable 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= +this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top- +this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions(); +d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis|| +this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element, +b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this== +a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| +0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top- +(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment== +"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&& +a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"), +10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft(): +f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.leftthis.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?e:!(e-this.offset.click.left').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options; +if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!= +"HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>= +i&&e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; +if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), +d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset= +this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: +this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", +b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height; +f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop", +b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top= +a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidthb.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height, +k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+ +a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this, +arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable, +{version:"1.8.4"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize, +function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n= +(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition= +false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left- +a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize", +b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top", +"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset, +f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left= +a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+ +a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&& +e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative", +height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width= +d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery); +;/* + * jQuery UI Selectable 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), +selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, +c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", +c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= +this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); +this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this, +arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem= +c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset, +{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment(); +if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start", +a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); +if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a, +c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]== +document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate", +null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem): +d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute|| +"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")}, +_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!= +this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a= +this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable"); +if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h= +0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width= +this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f}, +update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b= +null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this)); +this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])? +g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive", +g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over= +0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); +a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); +if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var f=d.closest(".ui-accordion-header");a.active=f.length?f:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",function(g){return a._keydown(g)}).next().attr("role", +"tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(g){a._clickHandler.call(a,g,this);g.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("").addClass("ui-icon "+a.icons.header).prependTo(this.headers); +this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex"); +this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); +b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,f=this.headers.index(a.target),g=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:g=this.headers[(f+1)%d];break;case b.LEFT:case b.UP:g=this.headers[(f-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); +a.preventDefault()}if(g){c(a.target).attr("tabIndex",-1);c(g).attr("tabIndex",0);g.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ +c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; +if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected); +a.next().addClass("ui-accordion-content-active")}h=a.next();f=this.active.next();g={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):h,oldContent:f};d=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(h,f,g,b,d)}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); +this.active.next().addClass("ui-accordion-content-active");var f=this.active.next(),g={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:f},h=this.active=c([]);this._toggle(h,f,g)}},_toggle:function(a,b,d,f,g){var h=this,e=h.options;h.toShow=a;h.toHide=b;h.data=d;var j=function(){if(h)return h._completed.apply(h,arguments)};h._trigger("changestart",null,h.data);h.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&f?{toShow:c([]),toHide:b,complete:j, +down:g,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:g,autoHeight:e.autoHeight||e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;f=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!f[k]&&!c.easing[k])k="slide";f[k]||(f[k]=function(l){this.slide(l,{easing:k,duration:i||700})}); +f[k](d)}else{if(e.collapsible&&f)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.4",animations:{slide:function(a, +b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),f=0,g={},h={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){h[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);g[i]={value:j[1], +unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(h,{step:function(j,i){if(i.prop=="height")f=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=f*g[i.prop].value+g[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide", +paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); +;/* + * jQuery UI Autocomplete 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function(e){e.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},_create:function(){var a=this,b=this.element[0].ownerDocument;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!a.options.disabled){var d=e.ui.keyCode;switch(c.keyCode){case d.PAGE_UP:a._move("previousPage", +c);break;case d.PAGE_DOWN:a._move("nextPage",c);break;case d.UP:a._move("previous",c);c.preventDefault();break;case d.DOWN:a._move("next",c);c.preventDefault();break;case d.ENTER:case d.NUMPAD_ENTER:a.menu.element.is(":visible")&&c.preventDefault();case d.TAB:if(!a.menu.active)return;a.menu.select(c);break;case d.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay); +break}}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=e("
    ").addClass("ui-autocomplete").appendTo(e(this.options.appendTo||"body",b)[0]).mousedown(function(c){var d=a.menu.element[0]; +c.target===d&&setTimeout(function(){e(document).one("mousedown",function(f){f.target!==a.element[0]&&f.target!==d&&!e.ui.contains(d,f.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,d){d=d.item.data("item.autocomplete");false!==a._trigger("focus",null,{item:d})&&/^key/.test(c.originalEvent.type)&&a.element.val(d.value)},selected:function(c,d){d=d.item.data("item.autocomplete");var f=a.previous;if(a.element[0]!==b.activeElement){a.element.focus(); +a.previous=f}false!==a._trigger("select",c,{item:d})&&a.element.val(d.value);a.close(c);a.selectedItem=d},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");e.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove(); +e.Widget.prototype.destroy.call(this)},_setOption:function(a,b){e.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(e(b||"body",this.element[0].ownerDocument)[0])},_initSource:function(){var a,b;if(e.isArray(this.options.source)){a=this.options.source;this.source=function(c,d){d(e.ui.autocomplete.filter(a,c.term))}}else if(typeof this.options.source==="string"){b=this.options.source;this.source=function(c,d){e.getJSON(b, +c,d)}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();if(a.length").data("item.autocomplete",b).append(e("").text(b.label)).appendTo(a)},_move:function(a, +b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});e.extend(e.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,b){var c=new RegExp(e.ui.autocomplete.escapeRegex(b),"i");return e.grep(a,function(d){return c.test(d.label||d.value|| +d)})}})})(jQuery); +(function(e){e.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(e(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(b){a.activate(b, +e(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.attr("scrollTop"),f=this.element.height();if(c<0)this.element.attr("scrollTop",d+c);else c>f&&this.element.attr("scrollTop",d+c-f+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id"); +this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);a.length?this.activate(c,a):this.activate(c,this.element.children(b))}else this.activate(c, +this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(":first"));else{var b=this.active.offset().top,c=this.element.height(),d=this.element.children("li").filter(function(){var f=e(this).offset().top-b-c+e(this).height();return f<10&&f>-10});d.length||(d=this.element.children(":last"));this.activate(a,d)}else this.activate(a,this.element.children(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active|| +this.first())this.activate(a,this.element.children(":last"));else{var b=this.active.offset().top,c=this.element.height();result=this.element.children("li").filter(function(){var d=e(this).offset().top-b+c-e(this).height();return d<10&&d>-10});result.length||(result=this.element.children(":first"));this.activate(a,result)}else this.activate(a,this.element.children(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("");d.secondary&&b.append("");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary"); +this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset");this._init()},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()}, +destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); +;/* + * jQuery UI Dialog 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + * jquery.ui.draggable.js + * jquery.ui.mouse.js + * jquery.ui.position.js + * jquery.ui.resizable.js + */ +(function(c,j){c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",of:window,collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title"); +if(typeof this.originalTitle!=="string")this.originalTitle="";var a=this,b=a.options,d=b.title||a.originalTitle||" ",f=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("
    ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(i){a.moveToTop(false, +i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var e=(a.uiDialogTitlebar=c("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i); +return false}).appendTo(e);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id",f).html(d).prependTo(e);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;e.find("*").add(e).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&& +g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog"); +b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,f=d.options;if(f.modal&&!a||!f.stack&&!f.modal)return d._trigger("focus",b);if(f.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ= +f.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;d.next().length&&d.appendTo("body");a._size();a._position(b.position);d.show(b.show); +a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(f){if(f.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),e=g.filter(":first");g=g.filter(":last");if(f.target===g[0]&&!f.shiftKey){e.focus(1);return false}else if(f.target===e[0]&&f.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._trigger("open");a._isOpen=true;return a}},_createButtons:function(a){var b=this,d=false, +f=c("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
    ").addClass("ui-dialog-buttonset").appendTo(f);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(e,h){e=c('').text(e).click(function(){h.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&e.button()});f.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(e){return{position:e.position, +offset:e.offset}}var b=this,d=b.options,f=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(e,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",e,a(h))},drag:function(e,h){b._trigger("drag",e,a(h))},stop:function(e,h){d.position=[h.position.left-f.scrollLeft(),h.position.top-f.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g); +b._trigger("dragStop",e,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}a=a===j?this.options.resizable:a;var d=this,f=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:f.maxWidth,maxHeight:f.maxHeight,minWidth:f.minWidth,minHeight:d._minHeight(), +handles:a,start:function(e,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",e,b(h))},resize:function(e,h){d._trigger("resize",e,b(h))},stop:function(e,h){c(this).removeClass("ui-dialog-resizing");f.height=c(this).height();f.width=c(this).width();d._trigger("resizeStop",e,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight, +a.height)},_position:function(a){var b=[],d=[0,0],f;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,e){if(+b[g]===b[g]){d[g]=b[g];b[g]=e}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(f=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(a); +f||this.uiDialog.hide()},_setOption:function(a,b){var d=this,f=d.uiDialog,g=f.is(":data(resizable)"),e=false;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);e=true;break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":f.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case "draggable":b? +d._makeDraggable():f.draggable("destroy");break;case "height":e=true;break;case "maxHeight":g&&f.resizable("option","maxHeight",b);e=true;break;case "maxWidth":g&&f.resizable("option","maxWidth",b);e=true;break;case "minHeight":g&&f.resizable("option","minHeight",b);e=true;break;case "minWidth":g&&f.resizable("option","minWidth",b);e=true;break;case "position":d._position(b);break;case "resizable":g&&!b&&f.resizable("destroy");g&&typeof b==="string"&&f.resizable("option","handles",b);!g&&b!==false&& +d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break;case "width":e=true;break}c.Widget.prototype._setOption.apply(d,arguments);e&&d._size()},_size:function(){var a=this.options,b;this.element.css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();this.element.css(a.height==="auto"?{minHeight:Math.max(a.minHeight-b,0),height:"auto"}:{minHeight:0,height:Math.max(a.height- +b,0)}).show();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.4",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "), +create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){return c(d.target).zIndex()>=c.ui.dialog.overlay.maxZ})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("
    ").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(), +height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); +b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a");if(!b.values)b.values=[this._valueMin(),this._valueMin()];if(b.values.length&&b.values.length!==2)b.values=[b.values[0],b.values[0]]}else this.range=d("
    ");this.range.appendTo(this.element).addClass("ui-slider-range");if(b.range==="min"||b.range==="max")this.range.addClass("ui-slider-range-"+b.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("").appendTo(this.element).addClass("ui-slider-handle"); +if(b.values&&b.values.length)for(;d(".ui-slider-handle",this.element).length").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur(); +else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!a.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e= +false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");h=a._start(c,f);if(h===false)return}break}i=a.options.step;h=a.options.values&&a.options.values.length?(g=a.values(f)):(g=a.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=a._valueMin();break;case d.ui.keyCode.END:g=a._valueMax();break;case d.ui.keyCode.PAGE_UP:g=a._trimAlignValue(h+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=a._trimAlignValue(h-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h=== +a._valueMax())return;g=a._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===a._valueMin())return;g=a._trimAlignValue(h-i);break}a._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(c,e);a._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"); +this._mouseDestroy();return this},_mouseCapture:function(a){var b=this.options,c,e,f,h,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(b.range===true&&this.values(1)===b.min){g+=1;f=d(this.handles[g])}if(this._start(a, +g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();b=f.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-f.width()/2,top:a.pageY-b.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b= +this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b= +this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b); +c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var e;if(this.options.values&&this.options.values.length){e=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>e||b===1&&c1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;fthis._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=a%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a= +this.options.range,b=this.options,c=this,e=!this._animateOff?b.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},b.animate);if(k===1)c.range[e?"animate":"css"]({width:f- +g+"%"},{queue:false,duration:b.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},b.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:b.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"}, +b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.4"})})(jQuery); +;/* + * jQuery UI Tabs 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
    ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(true)},_setOption:function(a,e){if(a=="selected")this.options.collapsible&& +e==this.options.selected||this.select(e);else{this.options[a]=e;this._tabify()}},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var a=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[a].concat(d.makeArray(arguments)))},_ui:function(a,e){return{tab:a,panel:e,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var a= +d(this);a.html(a.data("label.tabs")).removeData("label.tabs")})},_tabify:function(a){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var b=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var j=d(f).attr("href"),l=j.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| +(q=d("base")[0])&&l===q.href)){j=f.hash;f.href=j}if(h.test(j))b.panels=b.panels.add(b._sanitizeSelector(j));else if(j!=="#"){d.data(f,"href.tabs",j);d.data(f,"load.tabs",j.replace(/#.*$/,""));j=b._tabId(f);f.href="#"+j;f=d("#"+j);if(!f.length){f=d(c.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(b.panels[g-1]||b.list);f.data("destroy.tabs",true)}b.panels=b.panels.add(f)}else c.disabled.push(g)});if(a){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(b._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return b.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); +if(c.selected>=0&&this.anchors.length){this.panels.eq(c.selected).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");b.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[c.selected],b.panels[c.selected]))});this.load(c.selected)}d(window).bind("unload",function(){b.lis.add(b.anchors).unbind(".tabs");b.lis=b.anchors=b.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));this.element[c.collapsible?"addClass": +"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);a=0;for(var i;i=this.lis[a];a++)d(i)[d.inArray(a,c.disabled)!=-1&&!d(i).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+g)};this.lis.bind("mouseover.tabs", +function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",function(){e(f,o);b._trigger("show", +null,b._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");b._trigger("show",null,b._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){b.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);b.element.dequeue("tabs")})}:function(g,f){b.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");b.element.dequeue("tabs")};this.anchors.bind(c.event+".tabs", +function(){var g=this,f=d(g).closest("li"),j=b.panels.filter(":not(.ui-tabs-hide)"),l=d(b._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||b._trigger("select",null,b._ui(this,l[0]))===false){this.blur();return false}c.selected=b.anchors.index(this);b.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=-1;c.cookie&&b._cookie(c.selected,c.cookie);b.element.queue("tabs",function(){s(g, +j)}).dequeue("tabs");this.blur();return false}else if(!j.length){c.cookie&&b._cookie(c.selected,c.cookie);b.element.queue("tabs",function(){r(g,l)});b.load(b.anchors.index(this));this.blur();return false}c.cookie&&b._cookie(c.selected,c.cookie);if(l.length){j.length&&b.element.queue("tabs",function(){s(g,j)});b.element.queue("tabs",function(){r(g,l)});b.load(b.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";d.browser.msie&&this.blur()});this.anchors.bind("click.tabs", +function(){return false})},_getIndex:function(a){if(typeof a=="string")a=this.anchors.index(this.anchors.filter("[href$="+a+"]"));return a},destroy:function(){var a=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=d.data(this,"href.tabs");if(e)this.href= +e;var b=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){b.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});a.cookie&&this._cookie(null,a.cookie);return this},add:function(a,e,b){if(b===p)b=this.anchors.length; +var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,a).replace(/#\{label\}/g,e));a=!a.indexOf("#")?a.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var i=d("#"+a);i.length||(i=d(h.panelTemplate).attr("id",a).data("destroy.tabs",true));i.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(b>=this.lis.length){e.appendTo(this.list);i.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[b]); +i.insertBefore(this.panels[b])}h.disabled=d.map(h.disabled,function(k){return k>=b?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");i.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[b],this.panels[b]));return this},remove:function(a){a=this._getIndex(a);var e=this.options,b=this.lis.eq(a).remove(),c=this.panels.eq(a).remove(); +if(b.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(a+(a+1=a?--h:h});this._tabify();this._trigger("remove",null,this._ui(b.find("a")[0],c[0]));return this},enable:function(a){a=this._getIndex(a);var e=this.options;if(d.inArray(a,e.disabled)!=-1){this.lis.eq(a).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(b){return b!=a});this._trigger("enable",null, +this._ui(this.anchors[a],this.panels[a]));return this}},disable:function(a){a=this._getIndex(a);var e=this.options;if(a!=e.selected){this.lis.eq(a).addClass("ui-state-disabled");e.disabled.push(a);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))}return this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;this.anchors.eq(a).trigger(this.options.event+".tabs");return this}, +load:function(a){a=this._getIndex(a);var e=this,b=this.options,c=this.anchors.eq(a)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(a).addClass("ui-state-processing");if(b.spinner){var i=d("span",c);i.data("label.tabs",i.html()).html(b.spinner)}this.xhr=d.ajax(d.extend({},b.ajaxOptions,{url:h,success:function(k,n){d(e._sanitizeSelector(c.hash)).html(k);e._cleanup();b.cache&&d.data(c,"cache.tabs", +true);e._trigger("load",null,e._ui(e.anchors[a],e.panels[a]));try{b.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[a],e.panels[a]));try{b.ajaxOptions.error(k,n,a,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(a, +e){this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.4"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(a,e){var b=this,c=this.options,h=b._rotate||(b._rotate=function(i){clearTimeout(b.rotation);b.rotation=setTimeout(function(){var k=c.selected;b.select(++k')}function E(a,b){d.extend(a, +b);for(var c in b)if(b[c]==null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.4"}});var y=(new Date).getTime();d.extend(L.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]= +f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('
    ')}}, +_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& +b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f== +""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, +c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), +true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor== +Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]); +d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}}, +_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b= +d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; +for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target|| +a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a); +d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&& +d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f, +h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover"); +this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover"); +this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); +a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(), +k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"]; +a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val(): +"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&& +!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth; +b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b= +this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a= +d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a, +"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b== +"object"?b.toString():b+"";if(b=="")return null;for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1-1){k=1;l=u;do{e=this._getDaysInMonth(c, +k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return""; +var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear|| +a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? +new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a)); +n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m, +g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+r+"":f?"":''+r+"";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&& +a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
    '+(c?h:"")+(this._isInRange(a,r)?'":"")+(c?"":h)+"
    ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),I="",C=0;C1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='
    '+(/all|left/.test(t)&&C==0?c? +f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'
    ';var A=k?'":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="=5?' class="ui-datepicker-week-end"':"")+'>'+s[q]+""}x+=A+"";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, +A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O";var P=!k?"":'";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,K=B&&!H||!F[0]||j&&qo;P+='";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=P+""}g++;if(g>11){g=0;m++}x+="
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(q)+""+(B&&!w?" ":K?''+q.getDate()+ +"":''+q.getDate()+"")+"
    "+(l?""+(i[0]>0&&D==i[1]-1?'
    ':""):"");N+=x}I+=N}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': +"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='
    ',o="";if(h||!k)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(j+=o+(h||!(k&&l)?" ":""));if(h||!l)j+=''+c+"";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b, +i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?" ":"")+o;j+="
    ";return j},_adjustInstDate:function(a,b,c){var e= +a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a, +"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); +c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, +"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= +function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b)); +return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new L;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.4";window["DP_jQuery_"+y]=d})(jQuery); +;/* + * jQuery UI Progressbar 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(b,c){b.widget("ui.progressbar",{options:{value:0},min:0,max:100,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.max,"aria-valuenow":this._value()});this.valueDiv=b("
    ").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===c)return this._value();this._setOption("value",a);return this},_setOption:function(a,d){if(a==="value"){this.options.value=d;this._refreshValue();this._trigger("change")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.max,Math.max(this.min,a))},_refreshValue:function(){var a=this.value();this.valueDiv.toggleClass("ui-corner-right", +a===this.max).width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.4"})})(jQuery); +;/* + * jQuery UI Effects 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f,j){function l(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return m.transparent;return m[f.trim(c).toLowerCase()]}function r(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return l(b)}function n(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function o(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in s||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function t(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:f.fx.speeds[b]||f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=r(b.elem,a);b.end=l(b.end);b.colorInit= +true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var m={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189, +183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255, +165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},p=["add","remove","toggle"],s={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,d){if(f.isFunction(b)){d=b;b=null}return this.each(function(){var e=f(this),g=e.attr("style")||" ",h=o(n.call(this)),q,u=e.attr("className");f.each(p,function(v, +i){c[i]&&e[i+"Class"](c[i])});q=o(n.call(this));e.attr("className",u);e.animate(t(h,q),a,b,function(){f.each(p,function(v,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a? +f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.4",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"}); +c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments);a={options:a[1],duration:a[2],callback:a[3]};var b=f.effects[c];return b&&!f.fx.off?b.call(this,a):this},_show:f.fn.show,show:function(c){if(!c|| +typeof c=="number"||f.fx.speeds[c])return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(!c||typeof c=="number"||f.fx.speeds[c])return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(!c||typeof c=="number"||f.fx.speeds[c]||typeof c=="boolean"||f.isFunction(c))return this.__toggle.apply(this, +arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c, +a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+ +b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2, +10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)* +a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ +e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); +;/* + * jQuery UI Effects Fold 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100* +f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); +;/* + * jQuery UI Effects Highlight 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Pulsate 1.8.4 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); +b.dequeue()})})}})(jQuery); +; \ No newline at end of file diff --git a/app/webroot/js/jquery.cycle.all.min.js b/app/webroot/js/jquery.cycle.all.min.js new file mode 100644 index 0000000..7fdb17a --- /dev/null +++ b/app/webroot/js/jquery.cycle.all.min.js @@ -0,0 +1,21 @@ +/* + * jQuery Cycle Plugin (with Transition Definitions) + * Examples and documentation at: http://jquery.malsup.com/cycle/ + * Copyright (c) 2007-2010 M. Alsup + * Version: 2.88 (08-JUN-2010) + * Dual licensed under the MIT and GPL licenses. + * http://jquery.malsup.com/license.html + * Requires: jQuery v1.2.6 or later + */ +(function($){var ver="2.88";if($.support==undefined){$.support={opacity:!($.browser.msie)};}function debug(s){if($.fn.cycle.debug){log(s);}}function log(){if(window.console&&window.console.log){window.console.log("[cycle] "+Array.prototype.join.call(arguments," "));}}$.fn.cycle=function(options,arg2){var o={s:this.selector,c:this.context};if(this.length===0&&options!="stop"){if(!$.isReady&&o.s){log("DOM not ready, queuing slideshow");$(function(){$(o.s,o.c).cycle(options,arg2);});return this;}log("terminating; zero elements found by selector"+($.isReady?"":" (DOM not ready)"));return this;}return this.each(function(){var opts=handleArguments(this,options,arg2);if(opts===false){return;}opts.updateActivePagerLink=opts.updateActivePagerLink||$.fn.cycle.updateActivePagerLink;if(this.cycleTimeout){clearTimeout(this.cycleTimeout);}this.cycleTimeout=this.cyclePause=0;var $cont=$(this);var $slides=opts.slideExpr?$(opts.slideExpr,this):$cont.children();var els=$slides.get();if(els.length<2){log("terminating; too few slides: "+els.length);return;}var opts2=buildOptions($cont,$slides,els,opts,o);if(opts2===false){return;}var startTime=opts2.continuous?10:getTimeout(els[opts2.currSlide],els[opts2.nextSlide],opts2,!opts2.rev);if(startTime){startTime+=(opts2.delay||0);if(startTime<10){startTime=10;}debug("first timeout: "+startTime);this.cycleTimeout=setTimeout(function(){go(els,opts2,0,(!opts2.rev&&!opts.backwards));},startTime);}});};function handleArguments(cont,options,arg2){if(cont.cycleStop==undefined){cont.cycleStop=0;}if(options===undefined||options===null){options={};}if(options.constructor==String){switch(options){case"destroy":case"stop":var opts=$(cont).data("cycle.opts");if(!opts){return false;}cont.cycleStop++;if(cont.cycleTimeout){clearTimeout(cont.cycleTimeout);}cont.cycleTimeout=0;$(cont).removeData("cycle.opts");if(options=="destroy"){destroy(opts);}return false;case"toggle":cont.cyclePause=(cont.cyclePause===1)?0:1;checkInstantResume(cont.cyclePause,arg2,cont);return false;case"pause":cont.cyclePause=1;return false;case"resume":cont.cyclePause=0;checkInstantResume(false,arg2,cont);return false;case"prev":case"next":var opts=$(cont).data("cycle.opts");if(!opts){log('options not found, "prev/next" ignored');return false;}$.fn.cycle[options](opts);return false;default:options={fx:options};}return options;}else{if(options.constructor==Number){var num=options;options=$(cont).data("cycle.opts");if(!options){log("options not found, can not advance slide");return false;}if(num<0||num>=options.elements.length){log("invalid slide index: "+num);return false;}options.nextSlide=num;if(cont.cycleTimeout){clearTimeout(cont.cycleTimeout);cont.cycleTimeout=0;}if(typeof arg2=="string"){options.oneTimeFx=arg2;}go(options.elements,options,1,num>=options.currSlide);return false;}}return options;function checkInstantResume(isPaused,arg2,cont){if(!isPaused&&arg2===true){var options=$(cont).data("cycle.opts");if(!options){log("options not found, can not resume");return false;}if(cont.cycleTimeout){clearTimeout(cont.cycleTimeout);cont.cycleTimeout=0;}go(options.elements,options,1,(!opts.rev&&!opts.backwards));}}}function removeFilter(el,opts){if(!$.support.opacity&&opts.cleartype&&el.style.filter){try{el.style.removeAttribute("filter");}catch(smother){}}}function destroy(opts){if(opts.next){$(opts.next).unbind(opts.prevNextEvent);}if(opts.prev){$(opts.prev).unbind(opts.prevNextEvent);}if(opts.pager||opts.pagerAnchorBuilder){$.each(opts.pagerAnchors||[],function(){this.unbind().remove();});}opts.pagerAnchors=null;if(opts.destroy){opts.destroy(opts);}}function buildOptions($cont,$slides,els,options,o){var opts=$.extend({},$.fn.cycle.defaults,options||{},$.metadata?$cont.metadata():$.meta?$cont.data():{});if(opts.autostop){opts.countdown=opts.autostopCount||els.length;}var cont=$cont[0];$cont.data("cycle.opts",opts);opts.$cont=$cont;opts.stopCount=cont.cycleStop;opts.elements=els;opts.before=opts.before?[opts.before]:[];opts.after=opts.after?[opts.after]:[];opts.after.unshift(function(){opts.busy=0;});if(!$.support.opacity&&opts.cleartype){opts.after.push(function(){removeFilter(this,opts);});}if(opts.continuous){opts.after.push(function(){go(els,opts,0,(!opts.rev&&!opts.backwards));});}saveOriginalOpts(opts);if(!$.support.opacity&&opts.cleartype&&!opts.cleartypeNoBg){clearTypeFix($slides);}if($cont.css("position")=="static"){$cont.css("position","relative");}if(opts.width){$cont.width(opts.width);}if(opts.height&&opts.height!="auto"){$cont.height(opts.height);}if(opts.startingSlide){opts.startingSlide=parseInt(opts.startingSlide);}else{if(opts.backwards){opts.startingSlide=els.length-1;}}if(opts.random){opts.randomMap=[];for(var i=0;i=els.length){opts.startingSlide=0;}}opts.currSlide=opts.startingSlide||0;var first=opts.startingSlide;$slides.css({position:"absolute",top:0,left:0}).hide().each(function(i){var z;if(opts.backwards){z=first?i<=first?els.length+(i-first):first-i:els.length-i;}else{z=first?i>=first?els.length-(i-first):first-i:els.length-i;}$(this).css("z-index",z);});$(els[first]).css("opacity",1).show();removeFilter(els[first],opts);if(opts.fit&&opts.width){$slides.width(opts.width);}if(opts.fit&&opts.height&&opts.height!="auto"){$slides.height(opts.height);}var reshape=opts.containerResize&&!$cont.innerHeight();if(reshape){var maxw=0,maxh=0;for(var j=0;jmaxw?w:maxw;maxh=h>maxh?h:maxh;}if(maxw>0&&maxh>0){$cont.css({width:maxw+"px",height:maxh+"px"});}}if(opts.pause){$cont.hover(function(){this.cyclePause++;},function(){this.cyclePause--;});}if(supportMultiTransitions(opts)===false){return false;}var requeue=false;options.requeueAttempts=options.requeueAttempts||0;$slides.each(function(){var $el=$(this);this.cycleH=(opts.fit&&opts.height)?opts.height:($el.height()||this.offsetHeight||this.height||$el.attr("height")||0);this.cycleW=(opts.fit&&opts.width)?opts.width:($el.width()||this.offsetWidth||this.width||$el.attr("width")||0);if($el.is("img")){var loadingIE=($.browser.msie&&this.cycleW==28&&this.cycleH==30&&!this.complete);var loadingFF=($.browser.mozilla&&this.cycleW==34&&this.cycleH==19&&!this.complete);var loadingOp=($.browser.opera&&((this.cycleW==42&&this.cycleH==19)||(this.cycleW==37&&this.cycleH==17))&&!this.complete);var loadingOther=(this.cycleH==0&&this.cycleW==0&&!this.complete);if(loadingIE||loadingFF||loadingOp||loadingOther){if(o.s&&opts.requeueOnImageNotLoaded&&++options.requeueAttempts<100){log(options.requeueAttempts," - img slide not loaded, requeuing slideshow: ",this.src,this.cycleW,this.cycleH);setTimeout(function(){$(o.s,o.c).cycle(options);},opts.requeueTimeout);requeue=true;return false;}else{log("could not determine size of image: "+this.src,this.cycleW,this.cycleH);}}}return true;});if(requeue){return false;}opts.cssBefore=opts.cssBefore||{};opts.animIn=opts.animIn||{};opts.animOut=opts.animOut||{};$slides.not(":eq("+first+")").css(opts.cssBefore);if(opts.cssFirst){$($slides[first]).css(opts.cssFirst);}if(opts.timeout){opts.timeout=parseInt(opts.timeout);if(opts.speed.constructor==String){opts.speed=$.fx.speeds[opts.speed]||parseInt(opts.speed);}if(!opts.sync){opts.speed=opts.speed/2;}var buffer=opts.fx=="shuffle"?500:250;while((opts.timeout-opts.speed)=(els.length-1)?0:opts.startingSlide+1;}}if(!opts.multiFx){var init=$.fn.cycle.transitions[opts.fx];if($.isFunction(init)){init($cont,$slides,opts);}else{if(opts.fx!="custom"&&!opts.multiFx){log("unknown transition: "+opts.fx,"; slideshow terminating");return false;}}}var e0=$slides[first];if(opts.before.length){opts.before[0].apply(e0,[e0,e0,opts,true]);}if(opts.after.length>1){opts.after[1].apply(e0,[e0,e0,opts,true]);}if(opts.next){$(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?-1:1);});}if(opts.prev){$(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?1:-1);});}if(opts.pager||opts.pagerAnchorBuilder){buildPager(els,opts);}exposeAddSlide(opts,els);return opts;}function saveOriginalOpts(opts){opts.original={before:[],after:[]};opts.original.cssBefore=$.extend({},opts.cssBefore);opts.original.cssAfter=$.extend({},opts.cssAfter);opts.original.animIn=$.extend({},opts.animIn);opts.original.animOut=$.extend({},opts.animOut);$.each(opts.before,function(){opts.original.before.push(this);});$.each(opts.after,function(){opts.original.after.push(this);});}function supportMultiTransitions(opts){var i,tx,txs=$.fn.cycle.transitions;if(opts.fx.indexOf(",")>0){opts.multiFx=true;opts.fxs=opts.fx.replace(/\s*/g,"").split(",");for(i=0;i=opts.fxs.length){opts.lastFx=0;}fx=opts.fxs[opts.lastFx];opts.currFx=fx;}if(opts.oneTimeFx){fx=opts.oneTimeFx;opts.oneTimeFx=null;}$.fn.cycle.resetState(opts,fx);if(opts.before.length){$.each(opts.before,function(i,o){if(p.cycleStop!=opts.stopCount){return;}o.apply(next,[curr,next,opts,fwd]);});}var after=function(){$.each(opts.after,function(i,o){if(p.cycleStop!=opts.stopCount){return;}o.apply(next,[curr,next,opts,fwd]);});};debug("tx firing; currSlide: "+opts.currSlide+"; nextSlide: "+opts.nextSlide);opts.busy=1;if(opts.fxFn){opts.fxFn(curr,next,opts,after,fwd,manual&&opts.fastOnEvent);}else{if($.isFunction($.fn.cycle[opts.fx])){$.fn.cycle[opts.fx](curr,next,opts,after,fwd,manual&&opts.fastOnEvent);}else{$.fn.cycle.custom(curr,next,opts,after,fwd,manual&&opts.fastOnEvent);}}}if(changed||opts.nextSlide==opts.currSlide){opts.lastSlide=opts.currSlide;if(opts.random){opts.currSlide=opts.nextSlide;if(++opts.randomIndex==els.length){opts.randomIndex=0;}opts.nextSlide=opts.randomMap[opts.randomIndex];if(opts.nextSlide==opts.currSlide){opts.nextSlide=(opts.currSlide==opts.slideCount-1)?0:opts.currSlide+1;}}else{if(opts.backwards){var roll=(opts.nextSlide-1)<0;if(roll&&opts.bounce){opts.backwards=!opts.backwards;opts.nextSlide=1;opts.currSlide=0;}else{opts.nextSlide=roll?(els.length-1):opts.nextSlide-1;opts.currSlide=roll?0:opts.nextSlide+1;}}else{var roll=(opts.nextSlide+1)==els.length;if(roll&&opts.bounce){opts.backwards=!opts.backwards;opts.nextSlide=els.length-2;opts.currSlide=els.length-1;}else{opts.nextSlide=roll?0:opts.nextSlide+1;opts.currSlide=roll?els.length-1:opts.nextSlide-1;}}}}if(changed&&opts.pager){opts.updateActivePagerLink(opts.pager,opts.currSlide,opts.activePagerClass);}var ms=0;if(opts.timeout&&!opts.continuous){ms=getTimeout(els[opts.currSlide],els[opts.nextSlide],opts,fwd);}else{if(opts.continuous&&p.cyclePause){ms=10;}}if(ms>0){p.cycleTimeout=setTimeout(function(){go(els,opts,0,(!opts.rev&&!opts.backwards));},ms);}}$.fn.cycle.updateActivePagerLink=function(pager,currSlide,clsName){$(pager).each(function(){$(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);});};function getTimeout(curr,next,opts,fwd){if(opts.timeoutFn){var t=opts.timeoutFn.call(curr,curr,next,opts,fwd);while((t-opts.speed)<250){t+=opts.speed;}debug("calculated timeout: "+t+"; speed: "+opts.speed);if(t!==false){return t;}}return opts.timeout;}$.fn.cycle.next=function(opts){advance(opts,opts.rev?-1:1);};$.fn.cycle.prev=function(opts){advance(opts,opts.rev?1:-1);};function advance(opts,val){var els=opts.elements;var p=opts.$cont[0],timeout=p.cycleTimeout;if(timeout){clearTimeout(timeout);p.cycleTimeout=0;}if(opts.random&&val<0){opts.randomIndex--;if(--opts.randomIndex==-2){opts.randomIndex=els.length-2;}else{if(opts.randomIndex==-1){opts.randomIndex=els.length-1;}}opts.nextSlide=opts.randomMap[opts.randomIndex];}else{if(opts.random){opts.nextSlide=opts.randomMap[opts.randomIndex];}else{opts.nextSlide=opts.currSlide+val;if(opts.nextSlide<0){if(opts.nowrap){return false;}opts.nextSlide=els.length-1;}else{if(opts.nextSlide>=els.length){if(opts.nowrap){return false;}opts.nextSlide=0;}}}}var cb=opts.onPrevNextEvent||opts.prevNextClick;if($.isFunction(cb)){cb(val>0,opts.nextSlide,els[opts.nextSlide]);}go(els,opts,1,val>=0);return false;}function buildPager(els,opts){var $p=$(opts.pager);$.each(els,function(i,o){$.fn.cycle.createPagerAnchor(i,o,$p,els,opts);});opts.updateActivePagerLink(opts.pager,opts.startingSlide,opts.activePagerClass);}$.fn.cycle.createPagerAnchor=function(i,el,$p,els,opts){var a;if($.isFunction(opts.pagerAnchorBuilder)){a=opts.pagerAnchorBuilder(i,el);debug("pagerAnchorBuilder("+i+", el) returned: "+a);}else{a=''+(i+1)+"";}if(!a){return;}var $a=$(a);if($a.parents("body").length===0){var arr=[];if($p.length>1){$p.each(function(){var $clone=$a.clone(true);$(this).append($clone);arr.push($clone[0]);});$a=$(arr);}else{$a.appendTo($p);}}opts.pagerAnchors=opts.pagerAnchors||[];opts.pagerAnchors.push($a);$a.bind(opts.pagerEvent,function(e){e.preventDefault();opts.nextSlide=i;var p=opts.$cont[0],timeout=p.cycleTimeout;if(timeout){clearTimeout(timeout);p.cycleTimeout=0;}var cb=opts.onPagerEvent||opts.pagerClick;if($.isFunction(cb)){cb(opts.nextSlide,els[opts.nextSlide]);}go(els,opts,1,opts.currSlidel?c-l:opts.slideCount-l;}else{hops=c=0){var rgb=v.match(/\d+/g);return"#"+hex(rgb[0])+hex(rgb[1])+hex(rgb[2]);}if(v&&v!="transparent"){return v;}}return"#ffffff";}$slides.each(function(){$(this).css("background-color",getBg(this));});}$.fn.cycle.commonReset=function(curr,next,opts,w,h,rev){$(opts.elements).not(curr).hide();opts.cssBefore.opacity=1;opts.cssBefore.display="block";if(w!==false&&next.cycleW>0){opts.cssBefore.width=next.cycleW;}if(h!==false&&next.cycleH>0){opts.cssBefore.height=next.cycleH;}opts.cssAfter=opts.cssAfter||{};opts.cssAfter.display="none";$(curr).css("zIndex",opts.slideCount+(rev===true?1:0));$(next).css("zIndex",opts.slideCount+(rev===true?0:1));};$.fn.cycle.custom=function(curr,next,opts,cb,fwd,speedOverride){var $l=$(curr),$n=$(next);var speedIn=opts.speedIn,speedOut=opts.speedOut,easeIn=opts.easeIn,easeOut=opts.easeOut;$n.css(opts.cssBefore);if(speedOverride){if(typeof speedOverride=="number"){speedIn=speedOut=speedOverride;}else{speedIn=speedOut=1;}easeIn=easeOut=null;}var fn=function(){$n.animate(opts.animIn,speedIn,easeIn,cb);};$l.animate(opts.animOut,speedOut,easeOut,function(){if(opts.cssAfter){$l.css(opts.cssAfter);}if(!opts.sync){fn();}});if(opts.sync){fn();}};$.fn.cycle.transitions={fade:function($cont,$slides,opts){$slides.not(":eq("+opts.currSlide+")").css("opacity",0);opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts);opts.cssBefore.opacity=0;});opts.animIn={opacity:1};opts.animOut={opacity:0};opts.cssBefore={top:0,left:0};}};$.fn.cycle.ver=function(){return ver;};$.fn.cycle.defaults={fx:"fade",timeout:4000,timeoutFn:null,continuous:0,speed:1000,speedIn:null,speedOut:null,next:null,prev:null,onPrevNextEvent:null,prevNextEvent:"click.cycle",pager:null,onPagerEvent:null,pagerEvent:"click.cycle",allowPagerClickBubble:false,pagerAnchorBuilder:null,before:null,after:null,end:null,easing:null,easeIn:null,easeOut:null,shuffle:null,animIn:null,animOut:null,cssBefore:null,cssAfter:null,fxFn:null,height:"auto",startingSlide:0,sync:1,random:0,fit:0,containerResize:1,pause:0,pauseOnPagerHover:0,autostop:0,autostopCount:0,delay:0,slideExpr:null,cleartype:!$.support.opacity,cleartypeNoBg:false,nowrap:0,fastOnEvent:0,randomizeEffects:1,rev:0,manualTrump:true,requeueOnImageNotLoaded:true,requeueTimeout:250,activePagerClass:"activeSlide",updateActivePagerLink:null,backwards:false};})(jQuery); +/* + * jQuery Cycle Plugin Transition Definitions + * This script is a plugin for the jQuery Cycle Plugin + * Examples and documentation at: http://malsup.com/jquery/cycle/ + * Copyright (c) 2007-2010 M. Alsup + * Version: 2.72 + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ +(function($){$.fn.cycle.transitions.none=function($cont,$slides,opts){opts.fxFn=function(curr,next,opts,after){$(next).show();$(curr).hide();after();};};$.fn.cycle.transitions.scrollUp=function($cont,$slides,opts){$cont.css("overflow","hidden");opts.before.push($.fn.cycle.commonReset);var h=$cont.height();opts.cssBefore={top:h,left:0};opts.cssFirst={top:0};opts.animIn={top:0};opts.animOut={top:-h};};$.fn.cycle.transitions.scrollDown=function($cont,$slides,opts){$cont.css("overflow","hidden");opts.before.push($.fn.cycle.commonReset);var h=$cont.height();opts.cssFirst={top:0};opts.cssBefore={top:-h,left:0};opts.animIn={top:0};opts.animOut={top:h};};$.fn.cycle.transitions.scrollLeft=function($cont,$slides,opts){$cont.css("overflow","hidden");opts.before.push($.fn.cycle.commonReset);var w=$cont.width();opts.cssFirst={left:0};opts.cssBefore={left:w,top:0};opts.animIn={left:0};opts.animOut={left:0-w};};$.fn.cycle.transitions.scrollRight=function($cont,$slides,opts){$cont.css("overflow","hidden");opts.before.push($.fn.cycle.commonReset);var w=$cont.width();opts.cssFirst={left:0};opts.cssBefore={left:-w,top:0};opts.animIn={left:0};opts.animOut={left:w};};$.fn.cycle.transitions.scrollHorz=function($cont,$slides,opts){$cont.css("overflow","hidden").width();opts.before.push(function(curr,next,opts,fwd){$.fn.cycle.commonReset(curr,next,opts);opts.cssBefore.left=fwd?(next.cycleW-1):(1-next.cycleW);opts.animOut.left=fwd?-curr.cycleW:curr.cycleW;});opts.cssFirst={left:0};opts.cssBefore={top:0};opts.animIn={left:0};opts.animOut={top:0};};$.fn.cycle.transitions.scrollVert=function($cont,$slides,opts){$cont.css("overflow","hidden");opts.before.push(function(curr,next,opts,fwd){$.fn.cycle.commonReset(curr,next,opts);opts.cssBefore.top=fwd?(1-next.cycleH):(next.cycleH-1);opts.animOut.top=fwd?curr.cycleH:-curr.cycleH;});opts.cssFirst={top:0};opts.cssBefore={left:0};opts.animIn={top:0};opts.animOut={left:0};};$.fn.cycle.transitions.slideX=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$(opts.elements).not(curr).hide();$.fn.cycle.commonReset(curr,next,opts,false,true);opts.animIn.width=next.cycleW;});opts.cssBefore={left:0,top:0,width:0};opts.animIn={width:"show"};opts.animOut={width:0};};$.fn.cycle.transitions.slideY=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$(opts.elements).not(curr).hide();$.fn.cycle.commonReset(curr,next,opts,true,false);opts.animIn.height=next.cycleH;});opts.cssBefore={left:0,top:0,height:0};opts.animIn={height:"show"};opts.animOut={height:0};};$.fn.cycle.transitions.shuffle=function($cont,$slides,opts){var i,w=$cont.css("overflow","visible").width();$slides.css({left:0,top:0});opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,true,true,true);});if(!opts.speedAdjusted){opts.speed=opts.speed/2;opts.speedAdjusted=true;}opts.random=0;opts.shuffle=opts.shuffle||{left:-w,top:15};opts.els=[];for(i=0;i<$slides.length;i++){opts.els.push($slides[i]);}for(i=0;i + * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * + * Licensed under The Open Group Test Suite License + * Redistributions of files must retain the above copyright notice. + * + * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * @link http://book.cakephp.org/view/1196/Testing + * @package cake + * @subpackage cake.app.webroot + * @since CakePHP(tm) v 1.2.0.4433 + * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License + */ +set_time_limit(0); +ini_set('display_errors', 1); +/** + * Use the DS to separate the directories in other defines + */ + if (!defined('DS')) { + define('DS', DIRECTORY_SEPARATOR); + } +/** + * These defines should only be edited if you have cake installed in + * a directory layout other than the way it is distributed. + * When using custom settings be sure to use the DS and do not add a trailing DS. + */ + +/** + * The full path to the directory which holds "app", WITHOUT a trailing DS. + * + */ + if (!defined('ROOT')) { + define('ROOT', dirname(dirname(dirname(__FILE__)))); + } +/** + * The actual directory name for the "app". + * + */ + if (!defined('APP_DIR')) { + define('APP_DIR', basename(dirname(dirname(__FILE__)))); + } +/** + * The absolute path to the "cake" directory, WITHOUT a trailing DS. + * + */ + if (!defined('CAKE_CORE_INCLUDE_PATH')) { + define('CAKE_CORE_INCLUDE_PATH', ROOT); + } + +/** + * Editing below this line should not be necessary. + * Change at your own risk. + * + */ +if (!defined('WEBROOT_DIR')) { + define('WEBROOT_DIR', basename(dirname(__FILE__))); +} +if (!defined('WWW_ROOT')) { + define('WWW_ROOT', dirname(__FILE__) . DS); +} +if (!defined('CORE_PATH')) { + if (function_exists('ini_set') && ini_set('include_path', CAKE_CORE_INCLUDE_PATH . PATH_SEPARATOR . ROOT . DS . APP_DIR . DS . PATH_SEPARATOR . ini_get('include_path'))) { + define('APP_PATH', null); + define('CORE_PATH', null); + } else { + define('APP_PATH', ROOT . DS . APP_DIR . DS); + define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS); + } +} +if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) { + trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR); +} + +$corePath = App::core('cake'); +if (isset($corePath[0])) { + define('TEST_CAKE_CORE_INCLUDE_PATH', rtrim($corePath[0], DS) . DS); +} else { + define('TEST_CAKE_CORE_INCLUDE_PATH', CAKE_CORE_INCLUDE_PATH); +} + +if (Configure::read('debug') < 1) { + die(__('Debug setting does not allow access to this url.', true)); +} + +require_once CAKE_TESTS_LIB . 'cake_test_suite_dispatcher.php'; + +$Dispatcher = new CakeTestSuiteDispatcher(); +$Dispatcher->dispatch(); diff --git a/cake/LICENSE.txt b/cake/LICENSE.txt new file mode 100644 index 0000000..bf6f82d --- /dev/null +++ b/cake/LICENSE.txt @@ -0,0 +1,22 @@ +The MIT License + +CakePHP(tm) : The Rapid Development PHP Framework (http://cakephp.org) +Copyright 2005-2010, Cake Software Foundation, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/cake/VERSION.txt b/cake/VERSION.txt new file mode 100644 index 0000000..458264c --- /dev/null +++ b/cake/VERSION.txt @@ -0,0 +1,22 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +--------------------------------------------------------------------------------------------+ // +// CakePHP Version +// +// Holds a static string representing the current version of CakePHP +// +// CakePHP(tm) : Rapid Development Framework (http://cakephp.org) +// Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) +// +// Licensed under The MIT License +// Redistributions of files must retain the above copyright notice. +// +// @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) +// @link http://cakephp.org +// @package cake +// @subpackage cake.cake.libs +// @since CakePHP(tm) v 0.2.9 +// @license MIT License (http://www.opensource.org/licenses/mit-license.php) +// +--------------------------------------------------------------------------------------------+ // +//////////////////////////////////////////////////////////////////////////////////////////////////// +1.3.3 + diff --git a/cake/basics.php b/cake/basics.php new file mode 100644 index 0000000..2bfabd7 --- /dev/null +++ b/cake/basics.php @@ -0,0 +1,1015 @@ + 0) { + if ($showFrom) { + $calledFrom = debug_backtrace(); + echo '' . substr(str_replace(ROOT, '', $calledFrom[0]['file']), 1) . ''; + echo ' (line ' . $calledFrom[0]['line'] . ')'; + } + echo "\n
    \n";
    +
    +			$var = print_r($var, true);
    +			if ($showHtml) {
    +				$var = str_replace('<', '<', str_replace('>', '>', $var));
    +			}
    +			echo $var . "\n
    \n"; + } + } +if (!function_exists('getMicrotime')) { + +/** + * Returns microtime for execution time checking + * + * @return float Microtime + */ + function getMicrotime() { + list($usec, $sec) = explode(' ', microtime()); + return ((float)$usec + (float)$sec); + } +} +if (!function_exists('sortByKey')) { + +/** + * Sorts given $array by key $sortby. + * + * @param array $array Array to sort + * @param string $sortby Sort by this key + * @param string $order Sort order asc/desc (ascending or descending). + * @param integer $type Type of sorting to perform + * @return mixed Sorted array + */ + function sortByKey(&$array, $sortby, $order = 'asc', $type = SORT_NUMERIC) { + if (!is_array($array)) { + return null; + } + + foreach ($array as $key => $val) { + $sa[$key] = $val[$sortby]; + } + + if ($order == 'asc') { + asort($sa, $type); + } else { + arsort($sa, $type); + } + + foreach ($sa as $key => $val) { + $out[] = $array[$key]; + } + return $out; + } +} +if (!function_exists('array_combine')) { + +/** + * Combines given identical arrays by using the first array's values as keys, + * and the second one's values as values. (Implemented for backwards compatibility with PHP4) + * + * @param array $a1 Array to use for keys + * @param array $a2 Array to use for values + * @return mixed Outputs either combined array or false. + * @deprecated Will be removed in 2.0 + */ + function array_combine($a1, $a2) { + $a1 = array_values($a1); + $a2 = array_values($a2); + $c1 = count($a1); + $c2 = count($a2); + + if ($c1 != $c2) { + return false; + } + if ($c1 <= 0) { + return false; + } + $output = array(); + + for ($i = 0; $i < $c1; $i++) { + $output[$a1[$i]] = $a2[$i]; + } + return $output; + } +} + +/** + * Convenience method for htmlspecialchars. + * + * @param string $text Text to wrap through htmlspecialchars + * @param string $charset Character set to use when escaping. Defaults to config value in 'App.encoding' or 'UTF-8' + * @return string Wrapped text + * @link http://book.cakephp.org/view/1132/h + */ + function h($text, $charset = null) { + if (is_array($text)) { + return array_map('h', $text); + } + + static $defaultCharset = false; + if ($defaultCharset === false) { + $defaultCharset = Configure::read('App.encoding'); + if ($defaultCharset === null) { + $defaultCharset = 'UTF-8'; + } + } + if ($charset) { + return htmlspecialchars($text, ENT_QUOTES, $charset); + } else { + return htmlspecialchars($text, ENT_QUOTES, $defaultCharset); + } + } + +/** + * Splits a dot syntax plugin name into its plugin and classname. + * If $name does not have a dot, then index 0 will be null. + * + * Commonly used like `list($plugin, $name) = pluginSplit($name);` + * + * @param string $name The name you want to plugin split. + * @param boolean $dotAppend Set to true if you want the plugin to have a '.' appended to it. + * @param string $plugin Optional default plugin to use if no plugin is found. Defaults to null. + * @return array Array with 2 indexes. 0 => plugin name, 1 => classname + */ + function pluginSplit($name, $dotAppend = false, $plugin = null) { + if (strpos($name, '.') !== false) { + $parts = explode('.', $name, 2); + if ($dotAppend) { + $parts[0] .= '.'; + } + return $parts; + } + return array($plugin, $name); + } + +/** + * Returns an array of all the given parameters. + * + * Example: + * + * `a('a', 'b')` + * + * Would return: + * + * `array('a', 'b')` + * + * @return array Array of given parameters + * @link http://book.cakephp.org/view/1122/a + * @deprecated Will be removed in 2.0 + */ + function a() { + $args = func_get_args(); + return $args; + } + +/** + * Constructs associative array from pairs of arguments. + * + * Example: + * + * `aa('a','b')` + * + * Would return: + * + * `array('a'=>'b')` + * + * @return array Associative array + * @link http://book.cakephp.org/view/1123/aa + * @deprecated Will be removed in 2.0 + */ + function aa() { + $args = func_get_args(); + $argc = count($args); + for ($i = 0; $i < $argc; $i++) { + if ($i + 1 < $argc) { + $a[$args[$i]] = $args[$i + 1]; + } else { + $a[$args[$i]] = null; + } + $i++; + } + return $a; + } + +/** + * Convenience method for echo(). + * + * @param string $text String to echo + * @link http://book.cakephp.org/view/1129/e + * @deprecated Will be removed in 2.0 + */ + function e($text) { + echo $text; + } + +/** + * Convenience method for strtolower(). + * + * @param string $str String to lowercase + * @return string Lowercased string + * @link http://book.cakephp.org/view/1134/low + * @deprecated Will be removed in 2.0 + */ + function low($str) { + return strtolower($str); + } + +/** + * Convenience method for strtoupper(). + * + * @param string $str String to uppercase + * @return string Uppercased string + * @link http://book.cakephp.org/view/1139/up + * @deprecated Will be removed in 2.0 + */ + function up($str) { + return strtoupper($str); + } + +/** + * Convenience method for str_replace(). + * + * @param string $search String to be replaced + * @param string $replace String to insert + * @param string $subject String to search + * @return string Replaced string + * @link http://book.cakephp.org/view/1137/r + * @deprecated Will be removed in 2.0 + */ + function r($search, $replace, $subject) { + return str_replace($search, $replace, $subject); + } + +/** + * Print_r convenience function, which prints out
     tags around
    + * the output of given array. Similar to debug().
    + *
    + * @see	debug()
    + * @param array $var Variable to print out
    + * @link http://book.cakephp.org/view/1136/pr
    + */
    +	function pr($var) {
    +		if (Configure::read() > 0) {
    +			echo '
    ';
    +			print_r($var);
    +			echo '
    '; + } + } + +/** + * Display parameters. + * + * @param mixed $p Parameter as string or array + * @return string + * @deprecated Will be removed in 2.0 + */ + function params($p) { + if (!is_array($p) || count($p) == 0) { + return null; + } + if (is_array($p[0]) && count($p) == 1) { + return $p[0]; + } + return $p; + } + +/** + * Merge a group of arrays + * + * @param array First array + * @param array Second array + * @param array Third array + * @param array Etc... + * @return array All array parameters merged into one + * @link http://book.cakephp.org/view/1124/am + */ + function am() { + $r = array(); + $args = func_get_args(); + foreach ($args as $a) { + if (!is_array($a)) { + $a = array($a); + } + $r = array_merge($r, $a); + } + return $r; + } + +/** + * Gets an environment variable from available sources, and provides emulation + * for unsupported or inconsistent environment variables (i.e. DOCUMENT_ROOT on + * IIS, or SCRIPT_NAME in CGI mode). Also exposes some additional custom + * environment information. + * + * @param string $key Environment variable name. + * @return string Environment variable setting. + * @link http://book.cakephp.org/view/1130/env + */ + function env($key) { + if ($key == 'HTTPS') { + if (isset($_SERVER['HTTPS'])) { + return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'); + } + return (strpos(env('SCRIPT_URI'), 'https://') === 0); + } + + if ($key == 'SCRIPT_NAME') { + if (env('CGI_MODE') && isset($_ENV['SCRIPT_URL'])) { + $key = 'SCRIPT_URL'; + } + } + + $val = null; + if (isset($_SERVER[$key])) { + $val = $_SERVER[$key]; + } elseif (isset($_ENV[$key])) { + $val = $_ENV[$key]; + } elseif (getenv($key) !== false) { + $val = getenv($key); + } + + if ($key === 'REMOTE_ADDR' && $val === env('SERVER_ADDR')) { + $addr = env('HTTP_PC_REMOTE_ADDR'); + if ($addr !== null) { + $val = $addr; + } + } + + if ($val !== null) { + return $val; + } + + switch ($key) { + case 'SCRIPT_FILENAME': + if (defined('SERVER_IIS') && SERVER_IIS === true) { + return str_replace('\\\\', '\\', env('PATH_TRANSLATED')); + } + break; + case 'DOCUMENT_ROOT': + $name = env('SCRIPT_NAME'); + $filename = env('SCRIPT_FILENAME'); + $offset = 0; + if (!strpos($name, '.php')) { + $offset = 4; + } + return substr($filename, 0, strlen($filename) - (strlen($name) + $offset)); + break; + case 'PHP_SELF': + return str_replace(env('DOCUMENT_ROOT'), '', env('SCRIPT_FILENAME')); + break; + case 'CGI_MODE': + return (PHP_SAPI === 'cgi'); + break; + case 'HTTP_BASE': + $host = env('HTTP_HOST'); + if (substr_count($host, '.') !== 1) { + return preg_replace('/^([^.])*/i', null, env('HTTP_HOST')); + } + return '.' . $host; + break; + } + return null; + } +if (!function_exists('file_put_contents')) { + +/** + * Writes data into file. + * + * If file exists, it will be overwritten. If data is an array, it will be implode()ed with an empty string. + * + * @param string $fileName File name. + * @param mixed $data String or array. + * @return boolean Success + * @deprecated Will be removed in 2.0 + */ + function file_put_contents($fileName, $data) { + if (is_array($data)) { + $data = implode('', $data); + } + $res = @fopen($fileName, 'w+b'); + + if ($res) { + $write = @fwrite($res, $data); + if ($write === false) { + return false; + } else { + @fclose($res); + return $write; + } + } + return false; + } +} + +/** + * Reads/writes temporary data to cache files or session. + * + * @param string $path File path within /tmp to save the file. + * @param mixed $data The data to save to the temporary file. + * @param mixed $expires A valid strtotime string when the data expires. + * @param string $target The target of the cached data; either 'cache' or 'public'. + * @return mixed The contents of the temporary file. + * @deprecated Please use Cache::write() instead + */ + function cache($path, $data = null, $expires = '+1 day', $target = 'cache') { + if (Configure::read('Cache.disable')) { + return null; + } + $now = time(); + + if (!is_numeric($expires)) { + $expires = strtotime($expires, $now); + } + + switch (strtolower($target)) { + case 'cache': + $filename = CACHE . $path; + break; + case 'public': + $filename = WWW_ROOT . $path; + break; + case 'tmp': + $filename = TMP . $path; + break; + } + $timediff = $expires - $now; + $filetime = false; + + if (file_exists($filename)) { + $filetime = @filemtime($filename); + } + + if ($data === null) { + if (file_exists($filename) && $filetime !== false) { + if ($filetime + $timediff < $now) { + @unlink($filename); + } else { + $data = @file_get_contents($filename); + } + } + } elseif (is_writable(dirname($filename))) { + @file_put_contents($filename, $data); + } + return $data; + } + +/** + * Used to delete files in the cache directories, or clear contents of cache directories + * + * @param mixed $params As String name to be searched for deletion, if name is a directory all files in + * directory will be deleted. If array, names to be searched for deletion. If clearCache() without params, + * all files in app/tmp/cache/views will be deleted + * @param string $type Directory in tmp/cache defaults to view directory + * @param string $ext The file extension you are deleting + * @return true if files found and deleted false otherwise + */ + function clearCache($params = null, $type = 'views', $ext = '.php') { + if (is_string($params) || $params === null) { + $params = preg_replace('/\/\//', '/', $params); + $cache = CACHE . $type . DS . $params; + + if (is_file($cache . $ext)) { + @unlink($cache . $ext); + return true; + } elseif (is_dir($cache)) { + $files = glob($cache . '*'); + + if ($files === false) { + return false; + } + + foreach ($files as $file) { + if (is_file($file) && strrpos($file, DS . 'empty') !== strlen($file) - 6) { + @unlink($file); + } + } + return true; + } else { + $cache = array( + CACHE . $type . DS . '*' . $params . $ext, + CACHE . $type . DS . '*' . $params . '_*' . $ext + ); + $files = array(); + while ($search = array_shift($cache)) { + $results = glob($search); + if ($results !== false) { + $files = array_merge($files, $results); + } + } + if (empty($files)) { + return false; + } + foreach ($files as $file) { + if (is_file($file) && strrpos($file, DS . 'empty') !== strlen($file) - 6) { + @unlink($file); + } + } + return true; + } + } elseif (is_array($params)) { + foreach ($params as $file) { + clearCache($file, $type, $ext); + } + return true; + } + return false; + } + +/** + * Recursively strips slashes from all values in an array + * + * @param array $values Array of values to strip slashes + * @return mixed What is returned from calling stripslashes + * @link http://book.cakephp.org/view/1138/stripslashes_deep + */ + function stripslashes_deep($values) { + if (is_array($values)) { + foreach ($values as $key => $value) { + $values[$key] = stripslashes_deep($value); + } + } else { + $values = stripslashes($values); + } + return $values; + } + +/** + * Returns a translated string if one is found; Otherwise, the submitted message. + * + * @param string $singular Text to translate + * @param boolean $return Set to true to return translated string, or false to echo + * @return mixed translated string if $return is false string will be echoed + * @link http://book.cakephp.org/view/1121/__ + */ + function __($singular, $return = false) { + if (!$singular) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($singular); + } else { + return I18n::translate($singular); + } + } + +/** + * Returns correct plural form of message identified by $singular and $plural for count $count. + * Some languages have more than one form for plural messages dependent on the count. + * + * @param string $singular Singular text to translate + * @param string $plural Plural text + * @param integer $count Count + * @param boolean $return true to return, false to echo + * @return mixed plural form of translated string if $return is false string will be echoed + */ + function __n($singular, $plural, $count, $return = false) { + if (!$singular) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($singular, $plural, null, 6, $count); + } else { + return I18n::translate($singular, $plural, null, 6, $count); + } + } + +/** + * Allows you to override the current domain for a single message lookup. + * + * @param string $domain Domain + * @param string $msg String to translate + * @param string $return true to return, false to echo + * @return translated string if $return is false string will be echoed + */ + function __d($domain, $msg, $return = false) { + if (!$msg) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($msg, null, $domain); + } else { + return I18n::translate($msg, null, $domain); + } + } + +/** + * Allows you to override the current domain for a single plural message lookup. + * Returns correct plural form of message identified by $singular and $plural for count $count + * from domain $domain. + * + * @param string $domain Domain + * @param string $singular Singular string to translate + * @param string $plural Plural + * @param integer $count Count + * @param boolean $return true to return, false to echo + * @return plural form of translated string if $return is false string will be echoed + */ + function __dn($domain, $singular, $plural, $count, $return = false) { + if (!$singular) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($singular, $plural, $domain, 6, $count); + } else { + return I18n::translate($singular, $plural, $domain, 6, $count); + } + } + +/** + * Allows you to override the current domain for a single message lookup. + * It also allows you to specify a category. + * + * The category argument allows a specific category of the locale settings to be used for fetching a message. + * Valid categories are: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES and LC_ALL. + * + * Note that the category must be specified with a numeric value, instead of the constant name. The values are: + * + * - LC_ALL 0 + * - LC_COLLATE 1 + * - LC_CTYPE 2 + * - LC_MONETARY 3 + * - LC_NUMERIC 4 + * - LC_TIME 5 + * - LC_MESSAGES 6 + * + * @param string $domain Domain + * @param string $msg Message to translate + * @param integer $category Category + * @param boolean $return true to return, false to echo + * @return translated string if $return is false string will be echoed + */ + function __dc($domain, $msg, $category, $return = false) { + if (!$msg) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($msg, null, $domain, $category); + } else { + return I18n::translate($msg, null, $domain, $category); + } + } + +/** + * Allows you to override the current domain for a single plural message lookup. + * It also allows you to specify a category. + * Returns correct plural form of message identified by $singular and $plural for count $count + * from domain $domain. + * + * The category argument allows a specific category of the locale settings to be used for fetching a message. + * Valid categories are: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES and LC_ALL. + * + * Note that the category must be specified with a numeric value, instead of the constant name. The values are: + * + * - LC_ALL 0 + * - LC_COLLATE 1 + * - LC_CTYPE 2 + * - LC_MONETARY 3 + * - LC_NUMERIC 4 + * - LC_TIME 5 + * - LC_MESSAGES 6 + * + * @param string $domain Domain + * @param string $singular Singular string to translate + * @param string $plural Plural + * @param integer $count Count + * @param integer $category Category + * @param boolean $return true to return, false to echo + * @return plural form of translated string if $return is false string will be echoed + */ + function __dcn($domain, $singular, $plural, $count, $category, $return = false) { + if (!$singular) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($singular, $plural, $domain, $category, $count); + } else { + return I18n::translate($singular, $plural, $domain, $category, $count); + } + } + +/** + * The category argument allows a specific category of the locale settings to be used for fetching a message. + * Valid categories are: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES and LC_ALL. + * + * Note that the category must be specified with a numeric value, instead of the constant name. The values are: + * + * - LC_ALL 0 + * - LC_COLLATE 1 + * - LC_CTYPE 2 + * - LC_MONETARY 3 + * - LC_NUMERIC 4 + * - LC_TIME 5 + * - LC_MESSAGES 6 + * + * @param string $msg String to translate + * @param integer $category Category + * @param string $return true to return, false to echo + * @return translated string if $return is false string will be echoed + */ + function __c($msg, $category, $return = false) { + if (!$msg) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($msg, null, null, $category); + } else { + return I18n::translate($msg, null, null, $category); + } + } + +/** + * Computes the difference of arrays using keys for comparison. + * + * @param array First array + * @param array Second array + * @return array Array with different keys + * @deprecated Will be removed in 2.0 + */ + if (!function_exists('array_diff_key')) { + function array_diff_key() { + $valuesDiff = array(); + + $argc = func_num_args(); + if ($argc < 2) { + return false; + } + + $args = func_get_args(); + foreach ($args as $param) { + if (!is_array($param)) { + return false; + } + } + + foreach ($args[0] as $valueKey => $valueData) { + for ($i = 1; $i < $argc; $i++) { + if (array_key_exists($valueKey, $args[$i])) { + continue 2; + } + } + $valuesDiff[$valueKey] = $valueData; + } + return $valuesDiff; + } + } + +/** + * Computes the intersection of arrays using keys for comparison + * + * @param array First array + * @param array Second array + * @return array Array with interesected keys + * @deprecated Will be removed in 2.0 + */ + if (!function_exists('array_intersect_key')) { + function array_intersect_key($arr1, $arr2) { + $res = array(); + foreach ($arr1 as $key => $value) { + if (array_key_exists($key, $arr2)) { + $res[$key] = $arr1[$key]; + } + } + return $res; + } + } + +/** + * Shortcut to Log::write. + * + * @param string $message Message to write to log + */ + function LogError($message) { + if (!class_exists('CakeLog')) { + App::import('Core', 'CakeLog'); + } + $bad = array("\n", "\r", "\t"); + $good = ' '; + CakeLog::write('error', str_replace($bad, $good, $message)); + } + +/** + * Searches include path for files. + * + * @param string $file File to look for + * @return Full path to file if exists, otherwise false + * @link http://book.cakephp.org/view/1131/fileExistsInPath + */ + function fileExistsInPath($file) { + $paths = explode(PATH_SEPARATOR, ini_get('include_path')); + foreach ($paths as $path) { + $fullPath = $path . DS . $file; + + if (file_exists($fullPath)) { + return $fullPath; + } elseif (file_exists($file)) { + return $file; + } + } + return false; + } + +/** + * Convert forward slashes to underscores and removes first and last underscores in a string + * + * @param string String to convert + * @return string with underscore remove from start and end of string + * @link http://book.cakephp.org/view/1126/convertSlash + */ + function convertSlash($string) { + $string = trim($string, '/'); + $string = preg_replace('/\/\//', '/', $string); + $string = str_replace('/', '_', $string); + return $string; + } + +/** + * Implements http_build_query for PHP4. + * + * @param string $data Data to set in query string + * @param string $prefix If numeric indices, prepend this to index for elements in base array. + * @param string $argSep String used to separate arguments + * @param string $baseKey Base key + * @return string URL encoded query string + * @see http://php.net/http_build_query + * @deprecated Will be removed in 2.0 + */ + if (!function_exists('http_build_query')) { + function http_build_query($data, $prefix = null, $argSep = null, $baseKey = null) { + if (empty($argSep)) { + $argSep = ini_get('arg_separator.output'); + } + if (is_object($data)) { + $data = get_object_vars($data); + } + $out = array(); + + foreach ((array)$data as $key => $v) { + if (is_numeric($key) && !empty($prefix)) { + $key = $prefix . $key; + } + $key = urlencode($key); + + if (!empty($baseKey)) { + $key = $baseKey . '[' . $key . ']'; + } + + if (is_array($v) || is_object($v)) { + $out[] = http_build_query($v, $prefix, $argSep, $key); + } else { + $out[] = $key . '=' . urlencode($v); + } + } + return implode($argSep, $out); + } + } + +/** + * Wraps ternary operations. If $condition is a non-empty value, $val1 is returned, otherwise $val2. + * Don't use for isset() conditions, or wrap your variable with @ operator: + * Example: + * + * `ife(isset($variable), @$variable, 'default');` + * + * @param mixed $condition Conditional expression + * @param mixed $val1 Value to return in case condition matches + * @param mixed $val2 Value to return if condition doesn't match + * @return mixed $val1 or $val2, depending on whether $condition evaluates to a non-empty expression. + * @link http://book.cakephp.org/view/1133/ife + * @deprecated Will be removed in 2.0 + */ + function ife($condition, $val1 = null, $val2 = null) { + if (!empty($condition)) { + return $val1; + } + return $val2; + } diff --git a/cake/bootstrap.php b/cake/bootstrap.php new file mode 100644 index 0000000..b69cb7b --- /dev/null +++ b/cake/bootstrap.php @@ -0,0 +1,39 @@ += 5)); +} +if (!defined('E_DEPRECATED')) { + define('E_DEPRECATED', 8192); +} +error_reporting(E_ALL & ~E_DEPRECATED); + +require CORE_PATH . 'cake' . DS . 'basics.php'; +$TIME_START = getMicrotime(); +require CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php'; +require LIBS . 'object.php'; +require LIBS . 'inflector.php'; +require LIBS . 'configure.php'; +require LIBS . 'set.php'; +require LIBS . 'cache.php'; +Configure::getInstance(); +require CAKE . 'dispatcher.php'; diff --git a/cake/config/config.php b/cake/config/config.php new file mode 100644 index 0000000..52a7130 --- /dev/null +++ b/cake/config/config.php @@ -0,0 +1,20 @@ + 181, 'status' => 'C', 'lower' => array(956)); +$config['0080_00ff'][] = array('upper' => 924, 'status' => 'C', 'lower' => array(181)); +$config['0080_00ff'][] = array('upper' => 192, 'status' => 'C', 'lower' => array(224)); /* LATIN CAPITAL LETTER A WITH GRAVE */ +$config['0080_00ff'][] = array('upper' => 193, 'status' => 'C', 'lower' => array(225)); /* LATIN CAPITAL LETTER A WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 194, 'status' => 'C', 'lower' => array(226)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ +$config['0080_00ff'][] = array('upper' => 195, 'status' => 'C', 'lower' => array(227)); /* LATIN CAPITAL LETTER A WITH TILDE */ +$config['0080_00ff'][] = array('upper' => 196, 'status' => 'C', 'lower' => array(228)); /* LATIN CAPITAL LETTER A WITH DIAERESIS */ +$config['0080_00ff'][] = array('upper' => 197, 'status' => 'C', 'lower' => array(229)); /* LATIN CAPITAL LETTER A WITH RING ABOVE */ +$config['0080_00ff'][] = array('upper' => 198, 'status' => 'C', 'lower' => array(230)); /* LATIN CAPITAL LETTER AE */ +$config['0080_00ff'][] = array('upper' => 199, 'status' => 'C', 'lower' => array(231)); /* LATIN CAPITAL LETTER C WITH CEDILLA */ +$config['0080_00ff'][] = array('upper' => 200, 'status' => 'C', 'lower' => array(232)); /* LATIN CAPITAL LETTER E WITH GRAVE */ +$config['0080_00ff'][] = array('upper' => 201, 'status' => 'C', 'lower' => array(233)); /* LATIN CAPITAL LETTER E WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 202, 'status' => 'C', 'lower' => array(234)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ +$config['0080_00ff'][] = array('upper' => 203, 'status' => 'C', 'lower' => array(235)); /* LATIN CAPITAL LETTER E WITH DIAERESIS */ +$config['0080_00ff'][] = array('upper' => 204, 'status' => 'C', 'lower' => array(236)); /* LATIN CAPITAL LETTER I WITH GRAVE */ +$config['0080_00ff'][] = array('upper' => 205, 'status' => 'C', 'lower' => array(237)); /* LATIN CAPITAL LETTER I WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 206, 'status' => 'C', 'lower' => array(238)); /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ +$config['0080_00ff'][] = array('upper' => 207, 'status' => 'C', 'lower' => array(239)); /* LATIN CAPITAL LETTER I WITH DIAERESIS */ +$config['0080_00ff'][] = array('upper' => 208, 'status' => 'C', 'lower' => array(240)); /* LATIN CAPITAL LETTER ETH */ +$config['0080_00ff'][] = array('upper' => 209, 'status' => 'C', 'lower' => array(241)); /* LATIN CAPITAL LETTER N WITH TILDE */ +$config['0080_00ff'][] = array('upper' => 210, 'status' => 'C', 'lower' => array(242)); /* LATIN CAPITAL LETTER O WITH GRAVE */ +$config['0080_00ff'][] = array('upper' => 211, 'status' => 'C', 'lower' => array(243)); /* LATIN CAPITAL LETTER O WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 212, 'status' => 'C', 'lower' => array(244)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ +$config['0080_00ff'][] = array('upper' => 213, 'status' => 'C', 'lower' => array(245)); /* LATIN CAPITAL LETTER O WITH TILDE */ +$config['0080_00ff'][] = array('upper' => 214, 'status' => 'C', 'lower' => array(246)); /* LATIN CAPITAL LETTER O WITH DIAERESIS */ +$config['0080_00ff'][] = array('upper' => 216, 'status' => 'C', 'lower' => array(248)); /* LATIN CAPITAL LETTER O WITH STROKE */ +$config['0080_00ff'][] = array('upper' => 217, 'status' => 'C', 'lower' => array(249)); /* LATIN CAPITAL LETTER U WITH GRAVE */ +$config['0080_00ff'][] = array('upper' => 218, 'status' => 'C', 'lower' => array(250)); /* LATIN CAPITAL LETTER U WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 219, 'status' => 'C', 'lower' => array(251)); /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ +$config['0080_00ff'][] = array('upper' => 220, 'status' => 'C', 'lower' => array(252)); /* LATIN CAPITAL LETTER U WITH DIAERESIS */ +$config['0080_00ff'][] = array('upper' => 221, 'status' => 'C', 'lower' => array(253)); /* LATIN CAPITAL LETTER Y WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 222, 'status' => 'C', 'lower' => array(254)); /* LATIN CAPITAL LETTER THORN */ +$config['0080_00ff'][] = array('upper' => 223, 'status' => 'F', 'lower' => array(115, 115)); /* LATIN SMALL LETTER SHARP S */ diff --git a/cake/config/unicode/casefolding/0100_017f.php b/cake/config/unicode/casefolding/0100_017f.php new file mode 100644 index 0000000..35a9f03 --- /dev/null +++ b/cake/config/unicode/casefolding/0100_017f.php @@ -0,0 +1,107 @@ + 256, 'status' => 'C', 'lower' => array(257)); /* LATIN CAPITAL LETTER A WITH MACRON */ +$config['0100_017f'][] = array('upper' => 258, 'status' => 'C', 'lower' => array(259)); /* LATIN CAPITAL LETTER A WITH BREVE */ +$config['0100_017f'][] = array('upper' => 260, 'status' => 'C', 'lower' => array(261)); /* LATIN CAPITAL LETTER A WITH OGONEK */ +$config['0100_017f'][] = array('upper' => 262, 'status' => 'C', 'lower' => array(263)); /* LATIN CAPITAL LETTER C WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 264, 'status' => 'C', 'lower' => array(265)); /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 266, 'status' => 'C', 'lower' => array(267)); /* LATIN CAPITAL LETTER C WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 268, 'status' => 'C', 'lower' => array(269)); /* LATIN CAPITAL LETTER C WITH CARON */ +$config['0100_017f'][] = array('upper' => 270, 'status' => 'C', 'lower' => array(271)); /* LATIN CAPITAL LETTER D WITH CARON */ +$config['0100_017f'][] = array('upper' => 272, 'status' => 'C', 'lower' => array(273)); /* LATIN CAPITAL LETTER D WITH STROKE */ +$config['0100_017f'][] = array('upper' => 274, 'status' => 'C', 'lower' => array(275)); /* LATIN CAPITAL LETTER E WITH MACRON */ +$config['0100_017f'][] = array('upper' => 276, 'status' => 'C', 'lower' => array(277)); /* LATIN CAPITAL LETTER E WITH BREVE */ +$config['0100_017f'][] = array('upper' => 278, 'status' => 'C', 'lower' => array(279)); /* LATIN CAPITAL LETTER E WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 280, 'status' => 'C', 'lower' => array(281)); /* LATIN CAPITAL LETTER E WITH OGONEK */ +$config['0100_017f'][] = array('upper' => 282, 'status' => 'C', 'lower' => array(283)); /* LATIN CAPITAL LETTER E WITH CARON */ +$config['0100_017f'][] = array('upper' => 284, 'status' => 'C', 'lower' => array(285)); /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 286, 'status' => 'C', 'lower' => array(287)); /* LATIN CAPITAL LETTER G WITH BREVE */ +$config['0100_017f'][] = array('upper' => 288, 'status' => 'C', 'lower' => array(289)); /* LATIN CAPITAL LETTER G WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 290, 'status' => 'C', 'lower' => array(291)); /* LATIN CAPITAL LETTER G WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 292, 'status' => 'C', 'lower' => array(293)); /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 294, 'status' => 'C', 'lower' => array(295)); /* LATIN CAPITAL LETTER H WITH STROKE */ +$config['0100_017f'][] = array('upper' => 296, 'status' => 'C', 'lower' => array(297)); /* LATIN CAPITAL LETTER I WITH TILDE */ +$config['0100_017f'][] = array('upper' => 298, 'status' => 'C', 'lower' => array(299)); /* LATIN CAPITAL LETTER I WITH MACRON */ +$config['0100_017f'][] = array('upper' => 300, 'status' => 'C', 'lower' => array(301)); /* LATIN CAPITAL LETTER I WITH BREVE */ +$config['0100_017f'][] = array('upper' => 302, 'status' => 'C', 'lower' => array(303)); /* LATIN CAPITAL LETTER I WITH OGONEK */ +$config['0100_017f'][] = array('upper' => 304, 'status' => 'F', 'lower' => array(105, 775)); /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 304, 'status' => 'T', 'lower' => array(105)); /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 306, 'status' => 'C', 'lower' => array(307)); /* LATIN CAPITAL LIGATURE IJ */ +$config['0100_017f'][] = array('upper' => 308, 'status' => 'C', 'lower' => array(309)); /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 310, 'status' => 'C', 'lower' => array(311)); /* LATIN CAPITAL LETTER K WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 313, 'status' => 'C', 'lower' => array(314)); /* LATIN CAPITAL LETTER L WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 315, 'status' => 'C', 'lower' => array(316)); /* LATIN CAPITAL LETTER L WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 317, 'status' => 'C', 'lower' => array(318)); /* LATIN CAPITAL LETTER L WITH CARON */ +$config['0100_017f'][] = array('upper' => 319, 'status' => 'C', 'lower' => array(320)); /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */ +$config['0100_017f'][] = array('upper' => 321, 'status' => 'C', 'lower' => array(322)); /* LATIN CAPITAL LETTER L WITH STROKE */ +$config['0100_017f'][] = array('upper' => 323, 'status' => 'C', 'lower' => array(324)); /* LATIN CAPITAL LETTER N WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 325, 'status' => 'C', 'lower' => array(326)); /* LATIN CAPITAL LETTER N WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 327, 'status' => 'C', 'lower' => array(328)); /* LATIN CAPITAL LETTER N WITH CARON */ +$config['0100_017f'][] = array('upper' => 329, 'status' => 'F', 'lower' => array(700, 110)); /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */ +$config['0100_017f'][] = array('upper' => 330, 'status' => 'C', 'lower' => array(331)); /* LATIN CAPITAL LETTER ENG */ +$config['0100_017f'][] = array('upper' => 332, 'status' => 'C', 'lower' => array(333)); /* LATIN CAPITAL LETTER O WITH MACRON */ +$config['0100_017f'][] = array('upper' => 334, 'status' => 'C', 'lower' => array(335)); /* LATIN CAPITAL LETTER O WITH BREVE */ +$config['0100_017f'][] = array('upper' => 336, 'status' => 'C', 'lower' => array(337)); /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ +$config['0100_017f'][] = array('upper' => 338, 'status' => 'C', 'lower' => array(339)); /* LATIN CAPITAL LIGATURE OE */ +$config['0100_017f'][] = array('upper' => 340, 'status' => 'C', 'lower' => array(341)); /* LATIN CAPITAL LETTER R WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 342, 'status' => 'C', 'lower' => array(343)); /* LATIN CAPITAL LETTER R WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 344, 'status' => 'C', 'lower' => array(345)); /* LATIN CAPITAL LETTER R WITH CARON */ +$config['0100_017f'][] = array('upper' => 346, 'status' => 'C', 'lower' => array(347)); /* LATIN CAPITAL LETTER S WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 348, 'status' => 'C', 'lower' => array(349)); /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 350, 'status' => 'C', 'lower' => array(351)); /* LATIN CAPITAL LETTER S WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 352, 'status' => 'C', 'lower' => array(353)); /* LATIN CAPITAL LETTER S WITH CARON */ +$config['0100_017f'][] = array('upper' => 354, 'status' => 'C', 'lower' => array(355)); /* LATIN CAPITAL LETTER T WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 356, 'status' => 'C', 'lower' => array(357)); /* LATIN CAPITAL LETTER T WITH CARON */ +$config['0100_017f'][] = array('upper' => 358, 'status' => 'C', 'lower' => array(359)); /* LATIN CAPITAL LETTER T WITH STROKE */ +$config['0100_017f'][] = array('upper' => 360, 'status' => 'C', 'lower' => array(361)); /* LATIN CAPITAL LETTER U WITH TILDE */ +$config['0100_017f'][] = array('upper' => 362, 'status' => 'C', 'lower' => array(363)); /* LATIN CAPITAL LETTER U WITH MACRON */ +$config['0100_017f'][] = array('upper' => 364, 'status' => 'C', 'lower' => array(365)); /* LATIN CAPITAL LETTER U WITH BREVE */ +$config['0100_017f'][] = array('upper' => 366, 'status' => 'C', 'lower' => array(367)); /* LATIN CAPITAL LETTER U WITH RING ABOVE */ +$config['0100_017f'][] = array('upper' => 368, 'status' => 'C', 'lower' => array(369)); /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ +$config['0100_017f'][] = array('upper' => 370, 'status' => 'C', 'lower' => array(371)); /* LATIN CAPITAL LETTER U WITH OGONEK */ +$config['0100_017f'][] = array('upper' => 372, 'status' => 'C', 'lower' => array(373)); /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 374, 'status' => 'C', 'lower' => array(375)); /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 376, 'status' => 'C', 'lower' => array(255)); /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ +$config['0100_017f'][] = array('upper' => 377, 'status' => 'C', 'lower' => array(378)); /* LATIN CAPITAL LETTER Z WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 379, 'status' => 'C', 'lower' => array(380)); /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 381, 'status' => 'C', 'lower' => array(382)); /* LATIN CAPITAL LETTER Z WITH CARON */ +$config['0100_017f'][] = array('upper' => 383, 'status' => 'C', 'lower' => array(115)); /* LATIN SMALL LETTER LONG S */ diff --git a/cake/config/unicode/casefolding/0180_024F.php b/cake/config/unicode/casefolding/0180_024F.php new file mode 100644 index 0000000..1148ccc --- /dev/null +++ b/cake/config/unicode/casefolding/0180_024F.php @@ -0,0 +1,149 @@ + 385, 'status' => 'C', 'lower' => array(595)); /* LATIN CAPITAL LETTER B WITH HOOK */ +$config['0180_024F'][] = array('upper' => 386, 'status' => 'C', 'lower' => array(387)); /* LATIN CAPITAL LETTER B WITH TOPBAR */ +$config['0180_024F'][] = array('upper' => 388, 'status' => 'C', 'lower' => array(389)); /* LATIN CAPITAL LETTER TONE SIX */ +$config['0180_024F'][] = array('upper' => 390, 'status' => 'C', 'lower' => array(596)); /* LATIN CAPITAL LETTER OPEN O */ +$config['0180_024F'][] = array('upper' => 391, 'status' => 'C', 'lower' => array(392)); /* LATIN CAPITAL LETTER C WITH HOOK */ +$config['0180_024F'][] = array('upper' => 393, 'status' => 'C', 'lower' => array(598)); /* LATIN CAPITAL LETTER AFRICAN D */ +$config['0180_024F'][] = array('upper' => 394, 'status' => 'C', 'lower' => array(599)); /* LATIN CAPITAL LETTER D WITH HOOK */ +$config['0180_024F'][] = array('upper' => 395, 'status' => 'C', 'lower' => array(396)); /* LATIN CAPITAL LETTER D WITH TOPBAR */ +$config['0180_024F'][] = array('upper' => 398, 'status' => 'C', 'lower' => array(477)); /* LATIN CAPITAL LETTER REVERSED E */ +$config['0180_024F'][] = array('upper' => 399, 'status' => 'C', 'lower' => array(601)); /* LATIN CAPITAL LETTER SCHWA */ +$config['0180_024F'][] = array('upper' => 400, 'status' => 'C', 'lower' => array(603)); /* LATIN CAPITAL LETTER OPEN E */ +$config['0180_024F'][] = array('upper' => 401, 'status' => 'C', 'lower' => array(402)); /* LATIN CAPITAL LETTER F WITH HOOK */ +$config['0180_024F'][] = array('upper' => 403, 'status' => 'C', 'lower' => array(608)); /* LATIN CAPITAL LETTER G WITH HOOK */ +$config['0180_024F'][] = array('upper' => 404, 'status' => 'C', 'lower' => array(611)); /* LATIN CAPITAL LETTER GAMMA */ +$config['0180_024F'][] = array('upper' => 406, 'status' => 'C', 'lower' => array(617)); /* LATIN CAPITAL LETTER IOTA */ +$config['0180_024F'][] = array('upper' => 407, 'status' => 'C', 'lower' => array(616)); /* LATIN CAPITAL LETTER I WITH STROKE */ +$config['0180_024F'][] = array('upper' => 408, 'status' => 'C', 'lower' => array(409)); /* LATIN CAPITAL LETTER K WITH HOOK */ +$config['0180_024F'][] = array('upper' => 412, 'status' => 'C', 'lower' => array(623)); /* LATIN CAPITAL LETTER TURNED M */ +$config['0180_024F'][] = array('upper' => 413, 'status' => 'C', 'lower' => array(626)); /* LATIN CAPITAL LETTER N WITH LEFT HOOK */ +$config['0180_024F'][] = array('upper' => 415, 'status' => 'C', 'lower' => array(629)); /* LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ +$config['0180_024F'][] = array('upper' => 416, 'status' => 'C', 'lower' => array(417)); /* LATIN CAPITAL LETTER O WITH HORN */ +$config['0180_024F'][] = array('upper' => 418, 'status' => 'C', 'lower' => array(419)); /* LATIN CAPITAL LETTER OI */ +$config['0180_024F'][] = array('upper' => 420, 'status' => 'C', 'lower' => array(421)); /* LATIN CAPITAL LETTER P WITH HOOK */ +$config['0180_024F'][] = array('upper' => 422, 'status' => 'C', 'lower' => array(640)); /* LATIN LETTER YR */ +$config['0180_024F'][] = array('upper' => 423, 'status' => 'C', 'lower' => array(424)); /* LATIN CAPITAL LETTER TONE TWO */ +$config['0180_024F'][] = array('upper' => 425, 'status' => 'C', 'lower' => array(643)); /* LATIN CAPITAL LETTER ESH */ +$config['0180_024F'][] = array('upper' => 428, 'status' => 'C', 'lower' => array(429)); /* LATIN CAPITAL LETTER T WITH HOOK */ +$config['0180_024F'][] = array('upper' => 430, 'status' => 'C', 'lower' => array(648)); /* LATIN CAPITAL LETTER T WITH RETROFLEX HOOK */ +$config['0180_024F'][] = array('upper' => 431, 'status' => 'C', 'lower' => array(432)); /* LATIN CAPITAL LETTER U WITH HORN */ +$config['0180_024F'][] = array('upper' => 433, 'status' => 'C', 'lower' => array(650)); /* LATIN CAPITAL LETTER UPSILON */ +$config['0180_024F'][] = array('upper' => 434, 'status' => 'C', 'lower' => array(651)); /* LATIN CAPITAL LETTER V WITH HOOK */ +$config['0180_024F'][] = array('upper' => 435, 'status' => 'C', 'lower' => array(436)); /* LATIN CAPITAL LETTER Y WITH HOOK */ +$config['0180_024F'][] = array('upper' => 437, 'status' => 'C', 'lower' => array(438)); /* LATIN CAPITAL LETTER Z WITH STROKE */ +$config['0180_024F'][] = array('upper' => 439, 'status' => 'C', 'lower' => array(658)); /* LATIN CAPITAL LETTER EZH */ +$config['0180_024F'][] = array('upper' => 440, 'status' => 'C', 'lower' => array(441)); /* LATIN CAPITAL LETTER EZH REVERSED */ +$config['0180_024F'][] = array('upper' => 444, 'status' => 'C', 'lower' => array(445)); /* LATIN CAPITAL LETTER TONE FIVE */ +$config['0180_024F'][] = array('upper' => 452, 'status' => 'C', 'lower' => array(454)); /* LATIN CAPITAL LETTER DZ WITH CARON */ +$config['0180_024F'][] = array('upper' => 453, 'status' => 'C', 'lower' => array(454)); /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON */ +$config['0180_024F'][] = array('upper' => 455, 'status' => 'C', 'lower' => array(457)); /* LATIN CAPITAL LETTER LJ */ +$config['0180_024F'][] = array('upper' => 456, 'status' => 'C', 'lower' => array(457)); /* LATIN CAPITAL LETTER L WITH SMALL LETTER J */ +$config['0180_024F'][] = array('upper' => 458, 'status' => 'C', 'lower' => array(460)); /* LATIN CAPITAL LETTER NJ */ +$config['0180_024F'][] = array('upper' => 459, 'status' => 'C', 'lower' => array(460)); /* LATIN CAPITAL LETTER N WITH SMALL LETTER J */ +$config['0180_024F'][] = array('upper' => 461, 'status' => 'C', 'lower' => array(462)); /* LATIN CAPITAL LETTER A WITH CARON */ +$config['0180_024F'][] = array('upper' => 463, 'status' => 'C', 'lower' => array(464)); /* LATIN CAPITAL LETTER I WITH CARON */ +$config['0180_024F'][] = array('upper' => 465, 'status' => 'C', 'lower' => array(466)); /* LATIN CAPITAL LETTER O WITH CARON */ +$config['0180_024F'][] = array('upper' => 467, 'status' => 'C', 'lower' => array(468)); /* LATIN CAPITAL LETTER U WITH CARON */ +$config['0180_024F'][] = array('upper' => 469, 'status' => 'C', 'lower' => array(470)); /* LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON */ +$config['0180_024F'][] = array('upper' => 471, 'status' => 'C', 'lower' => array(472)); /* LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE */ +$config['0180_024F'][] = array('upper' => 473, 'status' => 'C', 'lower' => array(474)); /* LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON */ +$config['0180_024F'][] = array('upper' => 475, 'status' => 'C', 'lower' => array(476)); /* LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE */ +$config['0180_024F'][] = array('upper' => 478, 'status' => 'C', 'lower' => array(479)); /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */ +$config['0180_024F'][] = array('upper' => 480, 'status' => 'C', 'lower' => array(481)); /* LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON */ +$config['0180_024F'][] = array('upper' => 482, 'status' => 'C', 'lower' => array(483)); /* LATIN CAPITAL LETTER AE WITH MACRON */ +$config['0180_024F'][] = array('upper' => 484, 'status' => 'C', 'lower' => array(485)); /* LATIN CAPITAL LETTER G WITH STROKE */ +$config['0180_024F'][] = array('upper' => 486, 'status' => 'C', 'lower' => array(487)); /* LATIN CAPITAL LETTER G WITH CARON */ +$config['0180_024F'][] = array('upper' => 488, 'status' => 'C', 'lower' => array(489)); /* LATIN CAPITAL LETTER K WITH CARON */ +$config['0180_024F'][] = array('upper' => 490, 'status' => 'C', 'lower' => array(491)); /* LATIN CAPITAL LETTER O WITH OGONEK */ +$config['0180_024F'][] = array('upper' => 492, 'status' => 'C', 'lower' => array(493)); /* LATIN CAPITAL LETTER O WITH OGONEK AND MACRON */ +$config['0180_024F'][] = array('upper' => 494, 'status' => 'C', 'lower' => array(495)); /* LATIN CAPITAL LETTER EZH WITH CARON */ +$config['0180_024F'][] = array('upper' => 496, 'status' => 'F', 'lower' => array(106, 780)); /* LATIN SMALL LETTER J WITH CARON */ +$config['0180_024F'][] = array('upper' => 497, 'status' => 'C', 'lower' => array(499)); /* LATIN CAPITAL LETTER DZ */ +$config['0180_024F'][] = array('upper' => 498, 'status' => 'C', 'lower' => array(499)); /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z */ +$config['0180_024F'][] = array('upper' => 500, 'status' => 'C', 'lower' => array(501)); /* LATIN CAPITAL LETTER G WITH ACUTE */ +$config['0180_024F'][] = array('upper' => 502, 'status' => 'C', 'lower' => array(405)); /* LATIN CAPITAL LETTER HWAIR */ +$config['0180_024F'][] = array('upper' => 503, 'status' => 'C', 'lower' => array(447)); /* LATIN CAPITAL LETTER WYNN */ +$config['0180_024F'][] = array('upper' => 504, 'status' => 'C', 'lower' => array(505)); /* LATIN CAPITAL LETTER N WITH GRAVE */ +$config['0180_024F'][] = array('upper' => 506, 'status' => 'C', 'lower' => array(507)); /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */ +$config['0180_024F'][] = array('upper' => 508, 'status' => 'C', 'lower' => array(509)); /* LATIN CAPITAL LETTER AE WITH ACUTE */ +$config['0180_024F'][] = array('upper' => 510, 'status' => 'C', 'lower' => array(511)); /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */ +$config['0180_024F'][] = array('upper' => 512, 'status' => 'C', 'lower' => array(513)); /* LATIN CAPITAL LETTER A WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 514, 'status' => 'C', 'lower' => array(515)); /* LATIN CAPITAL LETTER A WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 516, 'status' => 'C', 'lower' => array(517)); /* LATIN CAPITAL LETTER E WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 518, 'status' => 'C', 'lower' => array(519)); /* LATIN CAPITAL LETTER E WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 520, 'status' => 'C', 'lower' => array(521)); /* LATIN CAPITAL LETTER I WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 522, 'status' => 'C', 'lower' => array(523)); /* LATIN CAPITAL LETTER I WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 524, 'status' => 'C', 'lower' => array(525)); /* LATIN CAPITAL LETTER O WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 526, 'status' => 'C', 'lower' => array(527)); /* LATIN CAPITAL LETTER O WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 528, 'status' => 'C', 'lower' => array(529)); /* LATIN CAPITAL LETTER R WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 530, 'status' => 'C', 'lower' => array(531)); /* LATIN CAPITAL LETTER R WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 532, 'status' => 'C', 'lower' => array(533)); /* LATIN CAPITAL LETTER U WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 534, 'status' => 'C', 'lower' => array(535)); /* LATIN CAPITAL LETTER U WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 536, 'status' => 'C', 'lower' => array(537)); /* LATIN CAPITAL LETTER S WITH COMMA BELOW */ +$config['0180_024F'][] = array('upper' => 538, 'status' => 'C', 'lower' => array(539)); /* LATIN CAPITAL LETTER T WITH COMMA BELOW */ +$config['0180_024F'][] = array('upper' => 540, 'status' => 'C', 'lower' => array(541)); /* LATIN CAPITAL LETTER YOGH */ +$config['0180_024F'][] = array('upper' => 542, 'status' => 'C', 'lower' => array(543)); /* LATIN CAPITAL LETTER H WITH CARON */ +$config['0180_024F'][] = array('upper' => 544, 'status' => 'C', 'lower' => array(414)); /* LATIN CAPITAL LETTER N WITH LONG RIGHT LEG */ +$config['0180_024F'][] = array('upper' => 546, 'status' => 'C', 'lower' => array(547)); /* LATIN CAPITAL LETTER OU */ +$config['0180_024F'][] = array('upper' => 548, 'status' => 'C', 'lower' => array(549)); /* LATIN CAPITAL LETTER Z WITH HOOK */ +$config['0180_024F'][] = array('upper' => 550, 'status' => 'C', 'lower' => array(551)); /* LATIN CAPITAL LETTER A WITH DOT ABOVE */ +$config['0180_024F'][] = array('upper' => 552, 'status' => 'C', 'lower' => array(553)); /* LATIN CAPITAL LETTER E WITH CEDILLA */ +$config['0180_024F'][] = array('upper' => 554, 'status' => 'C', 'lower' => array(555)); /* LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON */ +$config['0180_024F'][] = array('upper' => 556, 'status' => 'C', 'lower' => array(557)); /* LATIN CAPITAL LETTER O WITH TILDE AND MACRON */ +$config['0180_024F'][] = array('upper' => 558, 'status' => 'C', 'lower' => array(559)); /* LATIN CAPITAL LETTER O WITH DOT ABOVE */ +$config['0180_024F'][] = array('upper' => 560, 'status' => 'C', 'lower' => array(561)); /* LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON */ +$config['0180_024F'][] = array('upper' => 562, 'status' => 'C', 'lower' => array(563)); /* LATIN CAPITAL LETTER Y WITH MACRON */ +$config['0180_024F'][] = array('upper' => 570, 'status' => 'C', 'lower' => array(11365)); /* LATIN CAPITAL LETTER A WITH STROKE */ +$config['0180_024F'][] = array('upper' => 571, 'status' => 'C', 'lower' => array(572)); /* LATIN CAPITAL LETTER C WITH STROKE */ +$config['0180_024F'][] = array('upper' => 573, 'status' => 'C', 'lower' => array(410)); /* LATIN CAPITAL LETTER L WITH BAR */ +$config['0180_024F'][] = array('upper' => 574, 'status' => 'C', 'lower' => array(11366)); /* LATIN CAPITAL LETTER T WITH DIAGONAL STROKE */ +$config['0180_024F'][] = array('upper' => 577, 'status' => 'C', 'lower' => array(578)); /* LATIN CAPITAL LETTER GLOTTAL STOP */ +$config['0180_024F'][] = array('upper' => 579, 'status' => 'C', 'lower' => array(384)); /* LATIN CAPITAL LETTER B WITH STROKE */ +$config['0180_024F'][] = array('upper' => 580, 'status' => 'C', 'lower' => array(649)); /* LATIN CAPITAL LETTER U BAR */ +$config['0180_024F'][] = array('upper' => 581, 'status' => 'C', 'lower' => array(652)); /* LATIN CAPITAL LETTER TURNED V */ +$config['0180_024F'][] = array('upper' => 582, 'status' => 'C', 'lower' => array(583)); /* LATIN CAPITAL LETTER E WITH STROKE */ +$config['0180_024F'][] = array('upper' => 584, 'status' => 'C', 'lower' => array(585)); /* LATIN CAPITAL LETTER J WITH STROKE */ +$config['0180_024F'][] = array('upper' => 586, 'status' => 'C', 'lower' => array(587)); /* LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL */ +$config['0180_024F'][] = array('upper' => 588, 'status' => 'C', 'lower' => array(589)); /* LATIN CAPITAL LETTER R WITH STROKE */ +$config['0180_024F'][] = array('upper' => 590, 'status' => 'C', 'lower' => array(591)); /* LATIN CAPITAL LETTER Y WITH STROKE */ diff --git a/cake/config/unicode/casefolding/0250_02af.php b/cake/config/unicode/casefolding/0250_02af.php new file mode 100644 index 0000000..0472e29 --- /dev/null +++ b/cake/config/unicode/casefolding/0250_02af.php @@ -0,0 +1,42 @@ + 422, 'status' => 'C', 'lower' => array(640)); diff --git a/cake/config/unicode/casefolding/0370_03ff.php b/cake/config/unicode/casefolding/0370_03ff.php new file mode 100644 index 0000000..90defe8 --- /dev/null +++ b/cake/config/unicode/casefolding/0370_03ff.php @@ -0,0 +1,103 @@ + 902, 'status' => 'C', 'lower' => array(940)); /* GREEK CAPITAL LETTER ALPHA WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 904, 'status' => 'C', 'lower' => array(941)); /* GREEK CAPITAL LETTER EPSILON WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 905, 'status' => 'C', 'lower' => array(942)); /* GREEK CAPITAL LETTER ETA WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 906, 'status' => 'C', 'lower' => array(943)); /* GREEK CAPITAL LETTER IOTA WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 908, 'status' => 'C', 'lower' => array(972)); /* GREEK CAPITAL LETTER OMICRON WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 910, 'status' => 'C', 'lower' => array(973)); /* GREEK CAPITAL LETTER UPSILON WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 911, 'status' => 'C', 'lower' => array(974)); /* GREEK CAPITAL LETTER OMEGA WITH TONOS */ +//$config['0370_03ff'][] = array('upper' => 912, 'status' => 'F', 'lower' => array(953, 776, 769)); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ +$config['0370_03ff'][] = array('upper' => 913, 'status' => 'C', 'lower' => array(945)); /* GREEK CAPITAL LETTER ALPHA */ +$config['0370_03ff'][] = array('upper' => 914, 'status' => 'C', 'lower' => array(946)); /* GREEK CAPITAL LETTER BETA */ +$config['0370_03ff'][] = array('upper' => 915, 'status' => 'C', 'lower' => array(947)); /* GREEK CAPITAL LETTER GAMMA */ +$config['0370_03ff'][] = array('upper' => 916, 'status' => 'C', 'lower' => array(948)); /* GREEK CAPITAL LETTER DELTA */ +$config['0370_03ff'][] = array('upper' => 917, 'status' => 'C', 'lower' => array(949)); /* GREEK CAPITAL LETTER EPSILON */ +$config['0370_03ff'][] = array('upper' => 918, 'status' => 'C', 'lower' => array(950)); /* GREEK CAPITAL LETTER ZETA */ +$config['0370_03ff'][] = array('upper' => 919, 'status' => 'C', 'lower' => array(951)); /* GREEK CAPITAL LETTER ETA */ +$config['0370_03ff'][] = array('upper' => 920, 'status' => 'C', 'lower' => array(952)); /* GREEK CAPITAL LETTER THETA */ +$config['0370_03ff'][] = array('upper' => 921, 'status' => 'C', 'lower' => array(953)); /* GREEK CAPITAL LETTER IOTA */ +$config['0370_03ff'][] = array('upper' => 922, 'status' => 'C', 'lower' => array(954)); /* GREEK CAPITAL LETTER KAPPA */ +$config['0370_03ff'][] = array('upper' => 923, 'status' => 'C', 'lower' => array(955)); /* GREEK CAPITAL LETTER LAMDA */ +$config['0370_03ff'][] = array('upper' => 924, 'status' => 'C', 'lower' => array(956)); /* GREEK CAPITAL LETTER MU */ +$config['0370_03ff'][] = array('upper' => 925, 'status' => 'C', 'lower' => array(957)); /* GREEK CAPITAL LETTER NU */ +$config['0370_03ff'][] = array('upper' => 926, 'status' => 'C', 'lower' => array(958)); /* GREEK CAPITAL LETTER XI */ +$config['0370_03ff'][] = array('upper' => 927, 'status' => 'C', 'lower' => array(959)); /* GREEK CAPITAL LETTER OMICRON */ +$config['0370_03ff'][] = array('upper' => 928, 'status' => 'C', 'lower' => array(960)); /* GREEK CAPITAL LETTER PI */ +$config['0370_03ff'][] = array('upper' => 929, 'status' => 'C', 'lower' => array(961)); /* GREEK CAPITAL LETTER RHO */ +$config['0370_03ff'][] = array('upper' => 931, 'status' => 'C', 'lower' => array(963)); /* GREEK CAPITAL LETTER SIGMA */ +$config['0370_03ff'][] = array('upper' => 932, 'status' => 'C', 'lower' => array(964)); /* GREEK CAPITAL LETTER TAU */ +$config['0370_03ff'][] = array('upper' => 933, 'status' => 'C', 'lower' => array(965)); /* GREEK CAPITAL LETTER UPSILON */ +$config['0370_03ff'][] = array('upper' => 934, 'status' => 'C', 'lower' => array(966)); /* GREEK CAPITAL LETTER PHI */ +$config['0370_03ff'][] = array('upper' => 935, 'status' => 'C', 'lower' => array(967)); /* GREEK CAPITAL LETTER CHI */ +$config['0370_03ff'][] = array('upper' => 936, 'status' => 'C', 'lower' => array(968)); /* GREEK CAPITAL LETTER PSI */ +$config['0370_03ff'][] = array('upper' => 937, 'status' => 'C', 'lower' => array(969)); /* GREEK CAPITAL LETTER OMEGA */ +$config['0370_03ff'][] = array('upper' => 938, 'status' => 'C', 'lower' => array(970)); /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ +$config['0370_03ff'][] = array('upper' => 939, 'status' => 'C', 'lower' => array(971)); /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ +$config['0370_03ff'][] = array('upper' => 944, 'status' => 'F', 'lower' => array(965, 776, 769)); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ +$config['0370_03ff'][] = array('upper' => 962, 'status' => 'C', 'lower' => array(963)); /* GREEK SMALL LETTER FINAL SIGMA */ +$config['0370_03ff'][] = array('upper' => 976, 'status' => 'C', 'lower' => array(946)); /* GREEK BETA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 977, 'status' => 'C', 'lower' => array(952)); /* GREEK THETA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 981, 'status' => 'C', 'lower' => array(966)); /* GREEK PHI SYMBOL */ +$config['0370_03ff'][] = array('upper' => 982, 'status' => 'C', 'lower' => array(960)); /* GREEK PI SYMBOL */ +$config['0370_03ff'][] = array('upper' => 984, 'status' => 'C', 'lower' => array(985)); /* GREEK LETTER ARCHAIC KOPPA */ +$config['0370_03ff'][] = array('upper' => 986, 'status' => 'C', 'lower' => array(987)); /* GREEK LETTER STIGMA */ +$config['0370_03ff'][] = array('upper' => 988, 'status' => 'C', 'lower' => array(989)); /* GREEK LETTER DIGAMMA */ +$config['0370_03ff'][] = array('upper' => 990, 'status' => 'C', 'lower' => array(991)); /* GREEK LETTER KOPPA */ +$config['0370_03ff'][] = array('upper' => 992, 'status' => 'C', 'lower' => array(993)); /* GREEK LETTER SAMPI */ +$config['0370_03ff'][] = array('upper' => 994, 'status' => 'C', 'lower' => array(995)); /* COPTIC CAPITAL LETTER SHEI */ +$config['0370_03ff'][] = array('upper' => 996, 'status' => 'C', 'lower' => array(997)); /* COPTIC CAPITAL LETTER FEI */ +$config['0370_03ff'][] = array('upper' => 998, 'status' => 'C', 'lower' => array(999)); /* COPTIC CAPITAL LETTER KHEI */ +$config['0370_03ff'][] = array('upper' => 1000, 'status' => 'C', 'lower' => array(1001)); /* COPTIC CAPITAL LETTER HORI */ +$config['0370_03ff'][] = array('upper' => 1002, 'status' => 'C', 'lower' => array(1003)); /* COPTIC CAPITAL LETTER GANGIA */ +$config['0370_03ff'][] = array('upper' => 1004, 'status' => 'C', 'lower' => array(1005)); /* COPTIC CAPITAL LETTER SHIMA */ +$config['0370_03ff'][] = array('upper' => 1006, 'status' => 'C', 'lower' => array(1007)); /* COPTIC CAPITAL LETTER DEI */ +$config['0370_03ff'][] = array('upper' => 1008, 'status' => 'C', 'lower' => array(954)); /* GREEK KAPPA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1009, 'status' => 'C', 'lower' => array(961)); /* GREEK RHO SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1012, 'status' => 'C', 'lower' => array(952)); /* GREEK CAPITAL THETA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1013, 'status' => 'C', 'lower' => array(949)); /* GREEK LUNATE EPSILON SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1015, 'status' => 'C', 'lower' => array(1016)); /* GREEK CAPITAL LETTER SHO */ +$config['0370_03ff'][] = array('upper' => 1017, 'status' => 'C', 'lower' => array(1010)); /* GREEK CAPITAL LUNATE SIGMA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1018, 'status' => 'C', 'lower' => array(1019)); /* GREEK CAPITAL LETTER SAN */ +$config['0370_03ff'][] = array('upper' => 1021, 'status' => 'C', 'lower' => array(891)); /* GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1022, 'status' => 'C', 'lower' => array(892)); /* GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1023, 'status' => 'C', 'lower' => array(893)); /* GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL */ diff --git a/cake/config/unicode/casefolding/0400_04ff.php b/cake/config/unicode/casefolding/0400_04ff.php new file mode 100644 index 0000000..9900171 --- /dev/null +++ b/cake/config/unicode/casefolding/0400_04ff.php @@ -0,0 +1,165 @@ + 1024, 'status' => 'C', 'lower' => array(1104)); /* CYRILLIC CAPITAL LETTER IE WITH GRAVE */ +$config['0400_04ff'][] = array('upper' => 1025, 'status' => 'C', 'lower' => array(1105)); /* CYRILLIC CAPITAL LETTER IO */ +$config['0400_04ff'][] = array('upper' => 1026, 'status' => 'C', 'lower' => array(1106)); /* CYRILLIC CAPITAL LETTER DJE */ +$config['0400_04ff'][] = array('upper' => 1027, 'status' => 'C', 'lower' => array(1107)); /* CYRILLIC CAPITAL LETTER GJE */ +$config['0400_04ff'][] = array('upper' => 1028, 'status' => 'C', 'lower' => array(1108)); /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */ +$config['0400_04ff'][] = array('upper' => 1029, 'status' => 'C', 'lower' => array(1109)); /* CYRILLIC CAPITAL LETTER DZE */ +$config['0400_04ff'][] = array('upper' => 1030, 'status' => 'C', 'lower' => array(1110)); /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ +$config['0400_04ff'][] = array('upper' => 1031, 'status' => 'C', 'lower' => array(1111)); /* CYRILLIC CAPITAL LETTER YI */ +$config['0400_04ff'][] = array('upper' => 1032, 'status' => 'C', 'lower' => array(1112)); /* CYRILLIC CAPITAL LETTER JE */ +$config['0400_04ff'][] = array('upper' => 1033, 'status' => 'C', 'lower' => array(1113)); /* CYRILLIC CAPITAL LETTER LJE */ +$config['0400_04ff'][] = array('upper' => 1034, 'status' => 'C', 'lower' => array(1114)); /* CYRILLIC CAPITAL LETTER NJE */ +$config['0400_04ff'][] = array('upper' => 1035, 'status' => 'C', 'lower' => array(1115)); /* CYRILLIC CAPITAL LETTER TSHE */ +$config['0400_04ff'][] = array('upper' => 1036, 'status' => 'C', 'lower' => array(1116)); /* CYRILLIC CAPITAL LETTER KJE */ +$config['0400_04ff'][] = array('upper' => 1037, 'status' => 'C', 'lower' => array(1117)); /* CYRILLIC CAPITAL LETTER I WITH GRAVE */ +$config['0400_04ff'][] = array('upper' => 1038, 'status' => 'C', 'lower' => array(1118)); /* CYRILLIC CAPITAL LETTER SHORT U */ +$config['0400_04ff'][] = array('upper' => 1039, 'status' => 'C', 'lower' => array(1119)); /* CYRILLIC CAPITAL LETTER DZHE */ +$config['0400_04ff'][] = array('upper' => 1040, 'status' => 'C', 'lower' => array(1072)); /* CYRILLIC CAPITAL LETTER A */ +$config['0400_04ff'][] = array('upper' => 1041, 'status' => 'C', 'lower' => array(1073)); /* CYRILLIC CAPITAL LETTER BE */ +$config['0400_04ff'][] = array('upper' => 1042, 'status' => 'C', 'lower' => array(1074)); /* CYRILLIC CAPITAL LETTER VE */ +$config['0400_04ff'][] = array('upper' => 1043, 'status' => 'C', 'lower' => array(1075)); /* CYRILLIC CAPITAL LETTER GHE */ +$config['0400_04ff'][] = array('upper' => 1044, 'status' => 'C', 'lower' => array(1076)); /* CYRILLIC CAPITAL LETTER DE */ +$config['0400_04ff'][] = array('upper' => 1045, 'status' => 'C', 'lower' => array(1077)); /* CYRILLIC CAPITAL LETTER IE */ +$config['0400_04ff'][] = array('upper' => 1046, 'status' => 'C', 'lower' => array(1078)); /* CYRILLIC CAPITAL LETTER ZHE */ +$config['0400_04ff'][] = array('upper' => 1047, 'status' => 'C', 'lower' => array(1079)); /* CYRILLIC CAPITAL LETTER ZE */ +$config['0400_04ff'][] = array('upper' => 1048, 'status' => 'C', 'lower' => array(1080)); /* CYRILLIC CAPITAL LETTER I */ +$config['0400_04ff'][] = array('upper' => 1049, 'status' => 'C', 'lower' => array(1081)); /* CYRILLIC CAPITAL LETTER SHORT I */ +$config['0400_04ff'][] = array('upper' => 1050, 'status' => 'C', 'lower' => array(1082)); /* CYRILLIC CAPITAL LETTER KA */ +$config['0400_04ff'][] = array('upper' => 1051, 'status' => 'C', 'lower' => array(1083)); /* CYRILLIC CAPITAL LETTER EL */ +$config['0400_04ff'][] = array('upper' => 1052, 'status' => 'C', 'lower' => array(1084)); /* CYRILLIC CAPITAL LETTER EM */ +$config['0400_04ff'][] = array('upper' => 1053, 'status' => 'C', 'lower' => array(1085)); /* CYRILLIC CAPITAL LETTER EN */ +$config['0400_04ff'][] = array('upper' => 1054, 'status' => 'C', 'lower' => array(1086)); /* CYRILLIC CAPITAL LETTER O */ +$config['0400_04ff'][] = array('upper' => 1055, 'status' => 'C', 'lower' => array(1087)); /* CYRILLIC CAPITAL LETTER PE */ +$config['0400_04ff'][] = array('upper' => 1056, 'status' => 'C', 'lower' => array(1088)); /* CYRILLIC CAPITAL LETTER ER */ +$config['0400_04ff'][] = array('upper' => 1057, 'status' => 'C', 'lower' => array(1089)); /* CYRILLIC CAPITAL LETTER ES */ +$config['0400_04ff'][] = array('upper' => 1058, 'status' => 'C', 'lower' => array(1090)); /* CYRILLIC CAPITAL LETTER TE */ +$config['0400_04ff'][] = array('upper' => 1059, 'status' => 'C', 'lower' => array(1091)); /* CYRILLIC CAPITAL LETTER U */ +$config['0400_04ff'][] = array('upper' => 1060, 'status' => 'C', 'lower' => array(1092)); /* CYRILLIC CAPITAL LETTER EF */ +$config['0400_04ff'][] = array('upper' => 1061, 'status' => 'C', 'lower' => array(1093)); /* CYRILLIC CAPITAL LETTER HA */ +$config['0400_04ff'][] = array('upper' => 1062, 'status' => 'C', 'lower' => array(1094)); /* CYRILLIC CAPITAL LETTER TSE */ +$config['0400_04ff'][] = array('upper' => 1063, 'status' => 'C', 'lower' => array(1095)); /* CYRILLIC CAPITAL LETTER CHE */ +$config['0400_04ff'][] = array('upper' => 1064, 'status' => 'C', 'lower' => array(1096)); /* CYRILLIC CAPITAL LETTER SHA */ +$config['0400_04ff'][] = array('upper' => 1065, 'status' => 'C', 'lower' => array(1097)); /* CYRILLIC CAPITAL LETTER SHCHA */ +$config['0400_04ff'][] = array('upper' => 1066, 'status' => 'C', 'lower' => array(1098)); /* CYRILLIC CAPITAL LETTER HARD SIGN */ +$config['0400_04ff'][] = array('upper' => 1067, 'status' => 'C', 'lower' => array(1099)); /* CYRILLIC CAPITAL LETTER YERU */ +$config['0400_04ff'][] = array('upper' => 1068, 'status' => 'C', 'lower' => array(1100)); /* CYRILLIC CAPITAL LETTER SOFT SIGN */ +$config['0400_04ff'][] = array('upper' => 1069, 'status' => 'C', 'lower' => array(1101)); /* CYRILLIC CAPITAL LETTER E */ +$config['0400_04ff'][] = array('upper' => 1070, 'status' => 'C', 'lower' => array(1102)); /* CYRILLIC CAPITAL LETTER YU */ +$config['0400_04ff'][] = array('upper' => 1071, 'status' => 'C', 'lower' => array(1103)); /* CYRILLIC CAPITAL LETTER YA */ +$config['0400_04ff'][] = array('upper' => 1120, 'status' => 'C', 'lower' => array(1121)); /* CYRILLIC CAPITAL LETTER OMEGA */ +$config['0400_04ff'][] = array('upper' => 1122, 'status' => 'C', 'lower' => array(1123)); /* CYRILLIC CAPITAL LETTER YAT */ +$config['0400_04ff'][] = array('upper' => 1124, 'status' => 'C', 'lower' => array(1125)); /* CYRILLIC CAPITAL LETTER IOTIFIED E */ +$config['0400_04ff'][] = array('upper' => 1126, 'status' => 'C', 'lower' => array(1127)); /* CYRILLIC CAPITAL LETTER LITTLE YUS */ +$config['0400_04ff'][] = array('upper' => 1128, 'status' => 'C', 'lower' => array(1129)); /* CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS */ +$config['0400_04ff'][] = array('upper' => 1130, 'status' => 'C', 'lower' => array(1131)); /* CYRILLIC CAPITAL LETTER BIG YUS */ +$config['0400_04ff'][] = array('upper' => 1132, 'status' => 'C', 'lower' => array(1133)); /* CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS */ +$config['0400_04ff'][] = array('upper' => 1134, 'status' => 'C', 'lower' => array(1135)); /* CYRILLIC CAPITAL LETTER KSI */ +$config['0400_04ff'][] = array('upper' => 1136, 'status' => 'C', 'lower' => array(1137)); /* CYRILLIC CAPITAL LETTER PSI */ +$config['0400_04ff'][] = array('upper' => 1138, 'status' => 'C', 'lower' => array(1139)); /* CYRILLIC CAPITAL LETTER FITA */ +$config['0400_04ff'][] = array('upper' => 1140, 'status' => 'C', 'lower' => array(1141)); /* CYRILLIC CAPITAL LETTER IZHITSA */ +$config['0400_04ff'][] = array('upper' => 1142, 'status' => 'C', 'lower' => array(1143)); /* CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT */ +$config['0400_04ff'][] = array('upper' => 1144, 'status' => 'C', 'lower' => array(1145)); /* CYRILLIC CAPITAL LETTER UK */ +$config['0400_04ff'][] = array('upper' => 1146, 'status' => 'C', 'lower' => array(1147)); /* CYRILLIC CAPITAL LETTER ROUND OMEGA */ +$config['0400_04ff'][] = array('upper' => 1148, 'status' => 'C', 'lower' => array(1149)); /* CYRILLIC CAPITAL LETTER OMEGA WITH TITLO */ +$config['0400_04ff'][] = array('upper' => 1150, 'status' => 'C', 'lower' => array(1151)); /* CYRILLIC CAPITAL LETTER OT */ +$config['0400_04ff'][] = array('upper' => 1152, 'status' => 'C', 'lower' => array(1153)); /* CYRILLIC CAPITAL LETTER KOPPA */ +$config['0400_04ff'][] = array('upper' => 1162, 'status' => 'C', 'lower' => array(1163)); /* CYRILLIC CAPITAL LETTER SHORT I WITH TAIL */ +$config['0400_04ff'][] = array('upper' => 1164, 'status' => 'C', 'lower' => array(1165)); /* CYRILLIC CAPITAL LETTER SEMISOFT SIGN */ +$config['0400_04ff'][] = array('upper' => 1166, 'status' => 'C', 'lower' => array(1167)); /* CYRILLIC CAPITAL LETTER ER WITH TICK */ +$config['0400_04ff'][] = array('upper' => 1168, 'status' => 'C', 'lower' => array(1169)); /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ +$config['0400_04ff'][] = array('upper' => 1170, 'status' => 'C', 'lower' => array(1171)); /* CYRILLIC CAPITAL LETTER GHE WITH STROKE */ +$config['0400_04ff'][] = array('upper' => 1172, 'status' => 'C', 'lower' => array(1173)); /* CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK */ +$config['0400_04ff'][] = array('upper' => 1174, 'status' => 'C', 'lower' => array(1175)); /* CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1176, 'status' => 'C', 'lower' => array(1177)); /* CYRILLIC CAPITAL LETTER ZE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1178, 'status' => 'C', 'lower' => array(1179)); /* CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1180, 'status' => 'C', 'lower' => array(1181)); /* CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ +$config['0400_04ff'][] = array('upper' => 1182, 'status' => 'C', 'lower' => array(1183)); /* CYRILLIC CAPITAL LETTER KA WITH STROKE */ +$config['0400_04ff'][] = array('upper' => 1184, 'status' => 'C', 'lower' => array(1185)); /* CYRILLIC CAPITAL LETTER BASHKIR KA */ +$config['0400_04ff'][] = array('upper' => 1186, 'status' => 'C', 'lower' => array(1187)); /* CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1188, 'status' => 'C', 'lower' => array(1189)); /* CYRILLIC CAPITAL LIGATURE EN GHE */ +$config['0400_04ff'][] = array('upper' => 1190, 'status' => 'C', 'lower' => array(1191)); /* CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK */ +$config['0400_04ff'][] = array('upper' => 1192, 'status' => 'C', 'lower' => array(1193)); /* CYRILLIC CAPITAL LETTER ABKHASIAN HA */ +$config['0400_04ff'][] = array('upper' => 1194, 'status' => 'C', 'lower' => array(1195)); /* CYRILLIC CAPITAL LETTER ES WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1196, 'status' => 'C', 'lower' => array(1197)); /* CYRILLIC CAPITAL LETTER TE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1198, 'status' => 'C', 'lower' => array(1199)); /* CYRILLIC CAPITAL LETTER STRAIGHT U */ +$config['0400_04ff'][] = array('upper' => 1200, 'status' => 'C', 'lower' => array(1201)); /* CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ +$config['0400_04ff'][] = array('upper' => 1202, 'status' => 'C', 'lower' => array(1203)); /* CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1204, 'status' => 'C', 'lower' => array(1205)); /* CYRILLIC CAPITAL LIGATURE TE TSE */ +$config['0400_04ff'][] = array('upper' => 1206, 'status' => 'C', 'lower' => array(1207)); /* CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1208, 'status' => 'C', 'lower' => array(1209)); /* CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ +$config['0400_04ff'][] = array('upper' => 1210, 'status' => 'C', 'lower' => array(1211)); /* CYRILLIC CAPITAL LETTER SHHA */ +$config['0400_04ff'][] = array('upper' => 1212, 'status' => 'C', 'lower' => array(1213)); /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE */ +$config['0400_04ff'][] = array('upper' => 1214, 'status' => 'C', 'lower' => array(1215)); /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1216, 'status' => 'C', 'lower' => array(1231)); /* CYRILLIC LETTER PALOCHKA */ +$config['0400_04ff'][] = array('upper' => 1217, 'status' => 'C', 'lower' => array(1218)); /* CYRILLIC CAPITAL LETTER ZHE WITH BREVE */ +$config['0400_04ff'][] = array('upper' => 1219, 'status' => 'C', 'lower' => array(1220)); /* CYRILLIC CAPITAL LETTER KA WITH HOOK */ +$config['0400_04ff'][] = array('upper' => 1221, 'status' => 'C', 'lower' => array(1222)); /* CYRILLIC CAPITAL LETTER EL WITH TAIL */ +$config['0400_04ff'][] = array('upper' => 1223, 'status' => 'C', 'lower' => array(1224)); /* CYRILLIC CAPITAL LETTER EN WITH HOOK */ +$config['0400_04ff'][] = array('upper' => 1225, 'status' => 'C', 'lower' => array(1226)); /* CYRILLIC CAPITAL LETTER EN WITH TAIL */ +$config['0400_04ff'][] = array('upper' => 1227, 'status' => 'C', 'lower' => array(1228)); /* CYRILLIC CAPITAL LETTER KHAKASSIAN CHE */ +$config['0400_04ff'][] = array('upper' => 1229, 'status' => 'C', 'lower' => array(1230)); /* CYRILLIC CAPITAL LETTER EM WITH TAIL */ +$config['0400_04ff'][] = array('upper' => 1232, 'status' => 'C', 'lower' => array(1233)); /* CYRILLIC CAPITAL LETTER A WITH BREVE */ +$config['0400_04ff'][] = array('upper' => 1234, 'status' => 'C', 'lower' => array(1235)); /* CYRILLIC CAPITAL LETTER A WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1236, 'status' => 'C', 'lower' => array(1237)); /* CYRILLIC CAPITAL LIGATURE A IE */ +$config['0400_04ff'][] = array('upper' => 1238, 'status' => 'C', 'lower' => array(1239)); /* CYRILLIC CAPITAL LETTER IE WITH BREVE */ +$config['0400_04ff'][] = array('upper' => 1240, 'status' => 'C', 'lower' => array(1241)); /* CYRILLIC CAPITAL LETTER SCHWA */ +$config['0400_04ff'][] = array('upper' => 1242, 'status' => 'C', 'lower' => array(1243)); /* CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1244, 'status' => 'C', 'lower' => array(1245)); /* CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1246, 'status' => 'C', 'lower' => array(1247)); /* CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1248, 'status' => 'C', 'lower' => array(1249)); /* CYRILLIC CAPITAL LETTER ABKHASIAN DZE */ +$config['0400_04ff'][] = array('upper' => 1250, 'status' => 'C', 'lower' => array(1251)); /* CYRILLIC CAPITAL LETTER I WITH MACRON */ +$config['0400_04ff'][] = array('upper' => 1252, 'status' => 'C', 'lower' => array(1253)); /* CYRILLIC CAPITAL LETTER I WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1254, 'status' => 'C', 'lower' => array(1255)); /* CYRILLIC CAPITAL LETTER O WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1256, 'status' => 'C', 'lower' => array(1257)); /* CYRILLIC CAPITAL LETTER BARRED O */ +$config['0400_04ff'][] = array('upper' => 1258, 'status' => 'C', 'lower' => array(1259)); /* CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1260, 'status' => 'C', 'lower' => array(1261)); /* CYRILLIC CAPITAL LETTER E WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1262, 'status' => 'C', 'lower' => array(1263)); /* CYRILLIC CAPITAL LETTER U WITH MACRON */ +$config['0400_04ff'][] = array('upper' => 1264, 'status' => 'C', 'lower' => array(1265)); /* CYRILLIC CAPITAL LETTER U WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1266, 'status' => 'C', 'lower' => array(1267)); /* CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE */ +$config['0400_04ff'][] = array('upper' => 1268, 'status' => 'C', 'lower' => array(1269)); /* CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1270, 'status' => 'C', 'lower' => array(1271)); /* CYRILLIC CAPITAL LETTER GHE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1272, 'status' => 'C', 'lower' => array(1273)); /* CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1274, 'status' => 'C', 'lower' => array(1275)); /* CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK */ +$config['0400_04ff'][] = array('upper' => 1276, 'status' => 'C', 'lower' => array(1277)); /* CYRILLIC CAPITAL LETTER HA WITH HOOK */ +$config['0400_04ff'][] = array('upper' => 1278, 'status' => 'C', 'lower' => array(1279)); /* CYRILLIC CAPITAL LETTER HA WITH STROKE */ diff --git a/cake/config/unicode/casefolding/0500_052f.php b/cake/config/unicode/casefolding/0500_052f.php new file mode 100644 index 0000000..7e3c956 --- /dev/null +++ b/cake/config/unicode/casefolding/0500_052f.php @@ -0,0 +1,49 @@ + 1280, 'status' => 'C', 'lower' => array(1281)); /* CYRILLIC CAPITAL LETTER KOMI DE */ +$config['0500_052f'][] = array('upper' => 1282, 'status' => 'C', 'lower' => array(1283)); /* CYRILLIC CAPITAL LETTER KOMI DJE */ +$config['0500_052f'][] = array('upper' => 1284, 'status' => 'C', 'lower' => array(1285)); /* CYRILLIC CAPITAL LETTER KOMI ZJE */ +$config['0500_052f'][] = array('upper' => 1286, 'status' => 'C', 'lower' => array(1287)); /* CYRILLIC CAPITAL LETTER KOMI DZJE */ +$config['0500_052f'][] = array('upper' => 1288, 'status' => 'C', 'lower' => array(1289)); /* CYRILLIC CAPITAL LETTER KOMI LJE */ +$config['0500_052f'][] = array('upper' => 1290, 'status' => 'C', 'lower' => array(1291)); /* CYRILLIC CAPITAL LETTER KOMI NJE */ +$config['0500_052f'][] = array('upper' => 1292, 'status' => 'C', 'lower' => array(1293)); /* CYRILLIC CAPITAL LETTER KOMI SJE */ +$config['0500_052f'][] = array('upper' => 1294, 'status' => 'C', 'lower' => array(1295)); /* CYRILLIC CAPITAL LETTER KOMI TJE */ diff --git a/cake/config/unicode/casefolding/0530_058f.php b/cake/config/unicode/casefolding/0530_058f.php new file mode 100644 index 0000000..9bfd6dc --- /dev/null +++ b/cake/config/unicode/casefolding/0530_058f.php @@ -0,0 +1,79 @@ + 1329, 'status' => 'C', 'lower' => array(1377)); /* ARMENIAN CAPITAL LETTER AYB */ +$config['0530_058f'][] = array('upper' => 1330, 'status' => 'C', 'lower' => array(1378)); /* ARMENIAN CAPITAL LETTER BEN */ +$config['0530_058f'][] = array('upper' => 1331, 'status' => 'C', 'lower' => array(1379)); /* ARMENIAN CAPITAL LETTER GIM */ +$config['0530_058f'][] = array('upper' => 1332, 'status' => 'C', 'lower' => array(1380)); /* ARMENIAN CAPITAL LETTER DA */ +$config['0530_058f'][] = array('upper' => 1333, 'status' => 'C', 'lower' => array(1381)); /* ARMENIAN CAPITAL LETTER ECH */ +$config['0530_058f'][] = array('upper' => 1334, 'status' => 'C', 'lower' => array(1382)); /* ARMENIAN CAPITAL LETTER ZA */ +$config['0530_058f'][] = array('upper' => 1335, 'status' => 'C', 'lower' => array(1383)); /* ARMENIAN CAPITAL LETTER EH */ +$config['0530_058f'][] = array('upper' => 1336, 'status' => 'C', 'lower' => array(1384)); /* ARMENIAN CAPITAL LETTER ET */ +$config['0530_058f'][] = array('upper' => 1337, 'status' => 'C', 'lower' => array(1385)); /* ARMENIAN CAPITAL LETTER TO */ +$config['0530_058f'][] = array('upper' => 1338, 'status' => 'C', 'lower' => array(1386)); /* ARMENIAN CAPITAL LETTER ZHE */ +$config['0530_058f'][] = array('upper' => 1339, 'status' => 'C', 'lower' => array(1387)); /* ARMENIAN CAPITAL LETTER INI */ +$config['0530_058f'][] = array('upper' => 1340, 'status' => 'C', 'lower' => array(1388)); /* ARMENIAN CAPITAL LETTER LIWN */ +$config['0530_058f'][] = array('upper' => 1341, 'status' => 'C', 'lower' => array(1389)); /* ARMENIAN CAPITAL LETTER XEH */ +$config['0530_058f'][] = array('upper' => 1342, 'status' => 'C', 'lower' => array(1390)); /* ARMENIAN CAPITAL LETTER CA */ +$config['0530_058f'][] = array('upper' => 1343, 'status' => 'C', 'lower' => array(1391)); /* ARMENIAN CAPITAL LETTER KEN */ +$config['0530_058f'][] = array('upper' => 1344, 'status' => 'C', 'lower' => array(1392)); /* ARMENIAN CAPITAL LETTER HO */ +$config['0530_058f'][] = array('upper' => 1345, 'status' => 'C', 'lower' => array(1393)); /* ARMENIAN CAPITAL LETTER JA */ +$config['0530_058f'][] = array('upper' => 1346, 'status' => 'C', 'lower' => array(1394)); /* ARMENIAN CAPITAL LETTER GHAD */ +$config['0530_058f'][] = array('upper' => 1347, 'status' => 'C', 'lower' => array(1395)); /* ARMENIAN CAPITAL LETTER CHEH */ +$config['0530_058f'][] = array('upper' => 1348, 'status' => 'C', 'lower' => array(1396)); /* ARMENIAN CAPITAL LETTER MEN */ +$config['0530_058f'][] = array('upper' => 1349, 'status' => 'C', 'lower' => array(1397)); /* ARMENIAN CAPITAL LETTER YI */ +$config['0530_058f'][] = array('upper' => 1350, 'status' => 'C', 'lower' => array(1398)); /* ARMENIAN CAPITAL LETTER NOW */ +$config['0530_058f'][] = array('upper' => 1351, 'status' => 'C', 'lower' => array(1399)); /* ARMENIAN CAPITAL LETTER SHA */ +$config['0530_058f'][] = array('upper' => 1352, 'status' => 'C', 'lower' => array(1400)); /* ARMENIAN CAPITAL LETTER VO */ +$config['0530_058f'][] = array('upper' => 1353, 'status' => 'C', 'lower' => array(1401)); /* ARMENIAN CAPITAL LETTER CHA */ +$config['0530_058f'][] = array('upper' => 1354, 'status' => 'C', 'lower' => array(1402)); /* ARMENIAN CAPITAL LETTER PEH */ +$config['0530_058f'][] = array('upper' => 1355, 'status' => 'C', 'lower' => array(1403)); /* ARMENIAN CAPITAL LETTER JHEH */ +$config['0530_058f'][] = array('upper' => 1356, 'status' => 'C', 'lower' => array(1404)); /* ARMENIAN CAPITAL LETTER RA */ +$config['0530_058f'][] = array('upper' => 1357, 'status' => 'C', 'lower' => array(1405)); /* ARMENIAN CAPITAL LETTER SEH */ +$config['0530_058f'][] = array('upper' => 1358, 'status' => 'C', 'lower' => array(1406)); /* ARMENIAN CAPITAL LETTER VEW */ +$config['0530_058f'][] = array('upper' => 1359, 'status' => 'C', 'lower' => array(1407)); /* ARMENIAN CAPITAL LETTER TIWN */ +$config['0530_058f'][] = array('upper' => 1360, 'status' => 'C', 'lower' => array(1408)); /* ARMENIAN CAPITAL LETTER REH */ +$config['0530_058f'][] = array('upper' => 1361, 'status' => 'C', 'lower' => array(1409)); /* ARMENIAN CAPITAL LETTER CO */ +$config['0530_058f'][] = array('upper' => 1362, 'status' => 'C', 'lower' => array(1410)); /* ARMENIAN CAPITAL LETTER YIWN */ +$config['0530_058f'][] = array('upper' => 1363, 'status' => 'C', 'lower' => array(1411)); /* ARMENIAN CAPITAL LETTER PIWR */ +$config['0530_058f'][] = array('upper' => 1364, 'status' => 'C', 'lower' => array(1412)); /* ARMENIAN CAPITAL LETTER KEH */ +$config['0530_058f'][] = array('upper' => 1365, 'status' => 'C', 'lower' => array(1413)); /* ARMENIAN CAPITAL LETTER OH */ +$config['0530_058f'][] = array('upper' => 1366, 'status' => 'C', 'lower' => array(1414)); /* ARMENIAN CAPITAL LETTER FEH */ diff --git a/cake/config/unicode/casefolding/1e00_1eff.php b/cake/config/unicode/casefolding/1e00_1eff.php new file mode 100644 index 0000000..d4214dd --- /dev/null +++ b/cake/config/unicode/casefolding/1e00_1eff.php @@ -0,0 +1,169 @@ + 7680, 'status' => 'C', 'lower' => array(7681)); /* LATIN CAPITAL LETTER A WITH RING BELOW */ +$config['1e00_1eff'][] = array('upper' => 7682, 'status' => 'C', 'lower' => array(7683)); /* LATIN CAPITAL LETTER B WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7684, 'status' => 'C', 'lower' => array(7685)); /* LATIN CAPITAL LETTER B WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7686, 'status' => 'C', 'lower' => array(7687)); /* LATIN CAPITAL LETTER B WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7688, 'status' => 'C', 'lower' => array(7689)); /* LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7690, 'status' => 'C', 'lower' => array(7691)); /* LATIN CAPITAL LETTER D WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7692, 'status' => 'C', 'lower' => array(7693)); /* LATIN CAPITAL LETTER D WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7694, 'status' => 'C', 'lower' => array(7695)); /* LATIN CAPITAL LETTER D WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7696, 'status' => 'C', 'lower' => array(7697)); /* LATIN CAPITAL LETTER D WITH CEDILLA */ +$config['1e00_1eff'][] = array('upper' => 7698, 'status' => 'C', 'lower' => array(7699)); /* LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7700, 'status' => 'C', 'lower' => array(7701)); /* LATIN CAPITAL LETTER E WITH MACRON AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7702, 'status' => 'C', 'lower' => array(7703)); /* LATIN CAPITAL LETTER E WITH MACRON AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7704, 'status' => 'C', 'lower' => array(7705)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7706, 'status' => 'C', 'lower' => array(7707)); /* LATIN CAPITAL LETTER E WITH TILDE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7708, 'status' => 'C', 'lower' => array(7709)); /* LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE */ +$config['1e00_1eff'][] = array('upper' => 7710, 'status' => 'C', 'lower' => array(7711)); /* LATIN CAPITAL LETTER F WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7712, 'status' => 'C', 'lower' => array(7713)); /* LATIN CAPITAL LETTER G WITH MACRON */ +$config['1e00_1eff'][] = array('upper' => 7714, 'status' => 'C', 'lower' => array(7715)); /* LATIN CAPITAL LETTER H WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7716, 'status' => 'C', 'lower' => array(7717)); /* LATIN CAPITAL LETTER H WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7718, 'status' => 'C', 'lower' => array(7719)); /* LATIN CAPITAL LETTER H WITH DIAERESIS */ +$config['1e00_1eff'][] = array('upper' => 7720, 'status' => 'C', 'lower' => array(7721)); /* LATIN CAPITAL LETTER H WITH CEDILLA */ +$config['1e00_1eff'][] = array('upper' => 7722, 'status' => 'C', 'lower' => array(7723)); /* LATIN CAPITAL LETTER H WITH BREVE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7724, 'status' => 'C', 'lower' => array(7725)); /* LATIN CAPITAL LETTER I WITH TILDE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7726, 'status' => 'C', 'lower' => array(7727)); /* LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7728, 'status' => 'C', 'lower' => array(7729)); /* LATIN CAPITAL LETTER K WITH ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7730, 'status' => 'C', 'lower' => array(7731)); /* LATIN CAPITAL LETTER K WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7732, 'status' => 'C', 'lower' => array(7733)); /* LATIN CAPITAL LETTER K WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7734, 'status' => 'C', 'lower' => array(7735)); /* LATIN CAPITAL LETTER L WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7736, 'status' => 'C', 'lower' => array(7737)); /* LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON */ +$config['1e00_1eff'][] = array('upper' => 7738, 'status' => 'C', 'lower' => array(7739)); /* LATIN CAPITAL LETTER L WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7740, 'status' => 'C', 'lower' => array(7741)); /* LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7742, 'status' => 'C', 'lower' => array(7743)); /* LATIN CAPITAL LETTER M WITH ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7744, 'status' => 'C', 'lower' => array(7745)); /* LATIN CAPITAL LETTER M WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7746, 'status' => 'C', 'lower' => array(7747)); /* LATIN CAPITAL LETTER M WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7748, 'status' => 'C', 'lower' => array(7749)); /* LATIN CAPITAL LETTER N WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7750, 'status' => 'C', 'lower' => array(7751)); /* LATIN CAPITAL LETTER N WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7752, 'status' => 'C', 'lower' => array(7753)); /* LATIN CAPITAL LETTER N WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7754, 'status' => 'C', 'lower' => array(7755)); /* LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7756, 'status' => 'C', 'lower' => array(7757)); /* LATIN CAPITAL LETTER O WITH TILDE AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7758, 'status' => 'C', 'lower' => array(7759)); /* LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS */ +$config['1e00_1eff'][] = array('upper' => 7760, 'status' => 'C', 'lower' => array(7761)); /* LATIN CAPITAL LETTER O WITH MACRON AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7762, 'status' => 'C', 'lower' => array(7763)); /* LATIN CAPITAL LETTER O WITH MACRON AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7764, 'status' => 'C', 'lower' => array(7765)); /* LATIN CAPITAL LETTER P WITH ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7766, 'status' => 'C', 'lower' => array(7767)); /* LATIN CAPITAL LETTER P WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7768, 'status' => 'C', 'lower' => array(7769)); /* LATIN CAPITAL LETTER R WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7770, 'status' => 'C', 'lower' => array(7771)); /* LATIN CAPITAL LETTER R WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7772, 'status' => 'C', 'lower' => array(7773)); /* LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON */ +$config['1e00_1eff'][] = array('upper' => 7774, 'status' => 'C', 'lower' => array(7775)); /* LATIN CAPITAL LETTER R WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7776, 'status' => 'C', 'lower' => array(7777)); /* LATIN CAPITAL LETTER S WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7778, 'status' => 'C', 'lower' => array(7779)); /* LATIN CAPITAL LETTER S WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7780, 'status' => 'C', 'lower' => array(7781)); /* LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7782, 'status' => 'C', 'lower' => array(7783)); /* LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7784, 'status' => 'C', 'lower' => array(7785)); /* LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7786, 'status' => 'C', 'lower' => array(7787)); /* LATIN CAPITAL LETTER T WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7788, 'status' => 'C', 'lower' => array(7789)); /* LATIN CAPITAL LETTER T WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7790, 'status' => 'C', 'lower' => array(7791)); /* LATIN CAPITAL LETTER T WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7792, 'status' => 'C', 'lower' => array(7793)); /* LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7794, 'status' => 'C', 'lower' => array(7795)); /* LATIN CAPITAL LETTER U WITH DIAERESIS BELOW */ +$config['1e00_1eff'][] = array('upper' => 7796, 'status' => 'C', 'lower' => array(7797)); /* LATIN CAPITAL LETTER U WITH TILDE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7798, 'status' => 'C', 'lower' => array(7799)); /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7800, 'status' => 'C', 'lower' => array(7801)); /* LATIN CAPITAL LETTER U WITH TILDE AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7802, 'status' => 'C', 'lower' => array(7803)); /* LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS */ +$config['1e00_1eff'][] = array('upper' => 7804, 'status' => 'C', 'lower' => array(7805)); /* LATIN CAPITAL LETTER V WITH TILDE */ +$config['1e00_1eff'][] = array('upper' => 7806, 'status' => 'C', 'lower' => array(7807)); /* LATIN CAPITAL LETTER V WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7808, 'status' => 'C', 'lower' => array(7809)); /* LATIN CAPITAL LETTER W WITH GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7810, 'status' => 'C', 'lower' => array(7811)); /* LATIN CAPITAL LETTER W WITH ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7812, 'status' => 'C', 'lower' => array(7813)); /* LATIN CAPITAL LETTER W WITH DIAERESIS */ +$config['1e00_1eff'][] = array('upper' => 7814, 'status' => 'C', 'lower' => array(7815)); /* LATIN CAPITAL LETTER W WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7816, 'status' => 'C', 'lower' => array(7817)); /* LATIN CAPITAL LETTER W WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7818, 'status' => 'C', 'lower' => array(7819)); /* LATIN CAPITAL LETTER X WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7820, 'status' => 'C', 'lower' => array(7821)); /* LATIN CAPITAL LETTER X WITH DIAERESIS */ +$config['1e00_1eff'][] = array('upper' => 7822, 'status' => 'C', 'lower' => array(7823)); /* LATIN CAPITAL LETTER Y WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7824, 'status' => 'C', 'lower' => array(7825)); /* LATIN CAPITAL LETTER Z WITH CIRCUMFLEX */ +$config['1e00_1eff'][] = array('upper' => 7826, 'status' => 'C', 'lower' => array(7827)); /* LATIN CAPITAL LETTER Z WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7828, 'status' => 'C', 'lower' => array(7829)); /* LATIN CAPITAL LETTER Z WITH LINE BELOW */ + +//$config['1e00_1eff'][] = array('upper' => 7830, 'status' => 'F', 'lower' => array(104, 817)); /* LATIN SMALL LETTER H WITH LINE BELOW */ +//$config['1e00_1eff'][] = array('upper' => 7831, 'status' => 'F', 'lower' => array(116, 776)); /* LATIN SMALL LETTER T WITH DIAERESIS */ +//$config['1e00_1eff'][] = array('upper' => 7832, 'status' => 'F', 'lower' => array(119, 778)); /* LATIN SMALL LETTER W WITH RING ABOVE */ +//$config['1e00_1eff'][] = array('upper' => 7833, 'status' => 'F', 'lower' => array(121, 778)); /* LATIN SMALL LETTER Y WITH RING ABOVE */ +//$config['1e00_1eff'][] = array('upper' => 7834, 'status' => 'F', 'lower' => array(97, 702)); /* LATIN SMALL LETTER A WITH RIGHT HALF RING */ +//$config['1e00_1eff'][] = array('upper' => 7835, 'status' => 'C', 'lower' => array(7777)); /* LATIN SMALL LETTER LONG S WITH DOT ABOVE */ + +$config['1e00_1eff'][] = array('upper' => 7840, 'status' => 'C', 'lower' => array(7841)); /* LATIN CAPITAL LETTER A WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7842, 'status' => 'C', 'lower' => array(7843)); /* LATIN CAPITAL LETTER A WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7844, 'status' => 'C', 'lower' => array(7845)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7846, 'status' => 'C', 'lower' => array(7847)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7848, 'status' => 'C', 'lower' => array(7849)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7850, 'status' => 'C', 'lower' => array(7851)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7852, 'status' => 'C', 'lower' => array(7853)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7854, 'status' => 'C', 'lower' => array(7855)); /* LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7856, 'status' => 'C', 'lower' => array(7857)); /* LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7858, 'status' => 'C', 'lower' => array(7859)); /* LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7860, 'status' => 'C', 'lower' => array(7861)); /* LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7862, 'status' => 'C', 'lower' => array(7863)); /* LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7864, 'status' => 'C', 'lower' => array(7865)); /* LATIN CAPITAL LETTER E WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7866, 'status' => 'C', 'lower' => array(7867)); /* LATIN CAPITAL LETTER E WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7868, 'status' => 'C', 'lower' => array(7869)); /* LATIN CAPITAL LETTER E WITH TILDE */ +$config['1e00_1eff'][] = array('upper' => 7870, 'status' => 'C', 'lower' => array(7871)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7872, 'status' => 'C', 'lower' => array(7873)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7874, 'status' => 'C', 'lower' => array(7875)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7876, 'status' => 'C', 'lower' => array(7877)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7878, 'status' => 'C', 'lower' => array(7879)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7880, 'status' => 'C', 'lower' => array(7881)); /* LATIN CAPITAL LETTER I WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7882, 'status' => 'C', 'lower' => array(7883)); /* LATIN CAPITAL LETTER I WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7884, 'status' => 'C', 'lower' => array(7885)); /* LATIN CAPITAL LETTER O WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7886, 'status' => 'C', 'lower' => array(7887)); /* LATIN CAPITAL LETTER O WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7888, 'status' => 'C', 'lower' => array(7889)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7890, 'status' => 'C', 'lower' => array(7891)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7892, 'status' => 'C', 'lower' => array(7893)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7894, 'status' => 'C', 'lower' => array(7895)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7896, 'status' => 'C', 'lower' => array(7897)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7898, 'status' => 'C', 'lower' => array(7899)); /* LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7900, 'status' => 'C', 'lower' => array(7901)); /* LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7902, 'status' => 'C', 'lower' => array(7903)); /* LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7904, 'status' => 'C', 'lower' => array(7905)); /* LATIN CAPITAL LETTER O WITH HORN AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7906, 'status' => 'C', 'lower' => array(7907)); /* LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7908, 'status' => 'C', 'lower' => array(7909)); /* LATIN CAPITAL LETTER U WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7910, 'status' => 'C', 'lower' => array(7911)); /* LATIN CAPITAL LETTER U WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7912, 'status' => 'C', 'lower' => array(7913)); /* LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7914, 'status' => 'C', 'lower' => array(7915)); /* LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7916, 'status' => 'C', 'lower' => array(7917)); /* LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7918, 'status' => 'C', 'lower' => array(7919)); /* LATIN CAPITAL LETTER U WITH HORN AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7920, 'status' => 'C', 'lower' => array(7921)); /* LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7922, 'status' => 'C', 'lower' => array(7923)); /* LATIN CAPITAL LETTER Y WITH GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7924, 'status' => 'C', 'lower' => array(7925)); /* LATIN CAPITAL LETTER Y WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7926, 'status' => 'C', 'lower' => array(7927)); /* LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7928, 'status' => 'C', 'lower' => array(7929)); /* LATIN CAPITAL LETTER Y WITH TILDE */ diff --git a/cake/config/unicode/casefolding/1f00_1fff.php b/cake/config/unicode/casefolding/1f00_1fff.php new file mode 100644 index 0000000..b8b25cf --- /dev/null +++ b/cake/config/unicode/casefolding/1f00_1fff.php @@ -0,0 +1,217 @@ + 7944, 'status' => 'C', 'lower' => array(7936, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 7945, 'status' => 'C', 'lower' => array(7937)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 7946, 'status' => 'C', 'lower' => array(7938)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7947, 'status' => 'C', 'lower' => array(7939)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7948, 'status' => 'C', 'lower' => array(7940)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7949, 'status' => 'C', 'lower' => array(7941)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7950, 'status' => 'C', 'lower' => array(7942)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 7951, 'status' => 'C', 'lower' => array(7943)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 7960, 'status' => 'C', 'lower' => array(7952)); /* GREEK CAPITAL LETTER EPSILON WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 7961, 'status' => 'C', 'lower' => array(7953)); /* GREEK CAPITAL LETTER EPSILON WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 7962, 'status' => 'C', 'lower' => array(7954)); /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7963, 'status' => 'C', 'lower' => array(7955)); /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7964, 'status' => 'C', 'lower' => array(7956)); /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7965, 'status' => 'C', 'lower' => array(7957)); /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7976, 'status' => 'C', 'lower' => array(7968)); /* GREEK CAPITAL LETTER ETA WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 7977, 'status' => 'C', 'lower' => array(7969)); /* GREEK CAPITAL LETTER ETA WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 7978, 'status' => 'C', 'lower' => array(7970)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7979, 'status' => 'C', 'lower' => array(7971)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7980, 'status' => 'C', 'lower' => array(7972)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7981, 'status' => 'C', 'lower' => array(7973)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7982, 'status' => 'C', 'lower' => array(7974)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 7983, 'status' => 'C', 'lower' => array(7975)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 7992, 'status' => 'C', 'lower' => array(7984)); /* GREEK CAPITAL LETTER IOTA WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 7993, 'status' => 'C', 'lower' => array(7985)); /* GREEK CAPITAL LETTER IOTA WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 7994, 'status' => 'C', 'lower' => array(7986)); /* GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7995, 'status' => 'C', 'lower' => array(7987)); /* GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7996, 'status' => 'C', 'lower' => array(7988)); /* GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7997, 'status' => 'C', 'lower' => array(7989)); /* GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7998, 'status' => 'C', 'lower' => array(7990)); /* GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 7999, 'status' => 'C', 'lower' => array(7991)); /* GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8008, 'status' => 'C', 'lower' => array(8000)); /* GREEK CAPITAL LETTER OMICRON WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 8009, 'status' => 'C', 'lower' => array(8001)); /* GREEK CAPITAL LETTER OMICRON WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 8010, 'status' => 'C', 'lower' => array(8002)); /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8011, 'status' => 'C', 'lower' => array(8003)); /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8012, 'status' => 'C', 'lower' => array(8004)); /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8013, 'status' => 'C', 'lower' => array(8005)); /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8016, 'status' => 'F', 'lower' => array(965, 787)); /* GREEK SMALL LETTER UPSILON WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 8018, 'status' => 'F', 'lower' => array(965, 787, 768)); /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8020, 'status' => 'F', 'lower' => array(965, 787, 769)); /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8022, 'status' => 'F', 'lower' => array(965, 787, 834)); /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8025, 'status' => 'C', 'lower' => array(8017)); /* GREEK CAPITAL LETTER UPSILON WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 8027, 'status' => 'C', 'lower' => array(8019)); /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8029, 'status' => 'C', 'lower' => array(8021)); /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8031, 'status' => 'C', 'lower' => array(8023)); /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8040, 'status' => 'C', 'lower' => array(8032)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 8041, 'status' => 'C', 'lower' => array(8033)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 8042, 'status' => 'C', 'lower' => array(8034)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8043, 'status' => 'C', 'lower' => array(8035)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8044, 'status' => 'C', 'lower' => array(8036)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8045, 'status' => 'C', 'lower' => array(8037)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8046, 'status' => 'C', 'lower' => array(8038)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8047, 'status' => 'C', 'lower' => array(8039)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8064, 'status' => 'F', 'lower' => array(7936, 953)); /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8065, 'status' => 'F', 'lower' => array(7937, 953)); /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8066, 'status' => 'F', 'lower' => array(7938, 953)); /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8067, 'status' => 'F', 'lower' => array(7939, 953)); /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8068, 'status' => 'F', 'lower' => array(7940, 953)); /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8069, 'status' => 'F', 'lower' => array(7941, 953)); /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8070, 'status' => 'F', 'lower' => array(7942, 953)); /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8071, 'status' => 'F', 'lower' => array(7943, 953)); /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8072, 'status' => 'F', 'lower' => array(7936, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8072, 'status' => 'S', 'lower' => array(8064)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8073, 'status' => 'F', 'lower' => array(7937, 953)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8073, 'status' => 'S', 'lower' => array(8065)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8074, 'status' => 'F', 'lower' => array(7938, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8074, 'status' => 'S', 'lower' => array(8066)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8075, 'status' => 'F', 'lower' => array(7939, 953)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8075, 'status' => 'S', 'lower' => array(8067)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8076, 'status' => 'F', 'lower' => array(7940, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8076, 'status' => 'S', 'lower' => array(8068)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8077, 'status' => 'F', 'lower' => array(7941, 953)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8077, 'status' => 'S', 'lower' => array(8069)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8078, 'status' => 'F', 'lower' => array(7942, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8078, 'status' => 'S', 'lower' => array(8070)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8079, 'status' => 'F', 'lower' => array(7943, 953)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8079, 'status' => 'S', 'lower' => array(8071)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8080, 'status' => 'F', 'lower' => array(7968, 953)); /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8081, 'status' => 'F', 'lower' => array(7969, 953)); /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8082, 'status' => 'F', 'lower' => array(7970, 953)); /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8083, 'status' => 'F', 'lower' => array(7971, 953)); /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8084, 'status' => 'F', 'lower' => array(7972, 953)); /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8085, 'status' => 'F', 'lower' => array(7973, 953)); /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8086, 'status' => 'F', 'lower' => array(7974, 953)); /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8087, 'status' => 'F', 'lower' => array(7975, 953)); /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8088, 'status' => 'F', 'lower' => array(7968, 953)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8088, 'status' => 'S', 'lower' => array(8080)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8089, 'status' => 'F', 'lower' => array(7969, 953)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8089, 'status' => 'S', 'lower' => array(8081)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8090, 'status' => 'F', 'lower' => array(7970, 953)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8090, 'status' => 'S', 'lower' => array(8082)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8091, 'status' => 'F', 'lower' => array(7971, 953)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8091, 'status' => 'S', 'lower' => array(8083)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8092, 'status' => 'F', 'lower' => array(7972, 953)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8092, 'status' => 'S', 'lower' => array(8084)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8093, 'status' => 'F', 'lower' => array(7973, 953)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8093, 'status' => 'S', 'lower' => array(8085)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8094, 'status' => 'F', 'lower' => array(7974, 953)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8094, 'status' => 'S', 'lower' => array(8086)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8095, 'status' => 'F', 'lower' => array(7975, 953)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8095, 'status' => 'S', 'lower' => array(8087)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8096, 'status' => 'F', 'lower' => array(8032, 953)); /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8097, 'status' => 'F', 'lower' => array(8033, 953)); /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8098, 'status' => 'F', 'lower' => array(8034, 953)); /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8099, 'status' => 'F', 'lower' => array(8035, 953)); /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8100, 'status' => 'F', 'lower' => array(8036, 953)); /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8101, 'status' => 'F', 'lower' => array(8037, 953)); /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8102, 'status' => 'F', 'lower' => array(8038, 953)); /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8103, 'status' => 'F', 'lower' => array(8039, 953)); /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8104, 'status' => 'F', 'lower' => array(8032, 953)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8104, 'status' => 'S', 'lower' => array(8096)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8105, 'status' => 'F', 'lower' => array(8033, 953)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8105, 'status' => 'S', 'lower' => array(8097)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8106, 'status' => 'F', 'lower' => array(8034, 953)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8106, 'status' => 'S', 'lower' => array(8098)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8107, 'status' => 'F', 'lower' => array(8035, 953)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8107, 'status' => 'S', 'lower' => array(8099)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8108, 'status' => 'F', 'lower' => array(8036, 953)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8108, 'status' => 'S', 'lower' => array(8100)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8109, 'status' => 'F', 'lower' => array(8037, 953)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8109, 'status' => 'S', 'lower' => array(8101)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8110, 'status' => 'F', 'lower' => array(8038, 953)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8110, 'status' => 'S', 'lower' => array(8102)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8111, 'status' => 'F', 'lower' => array(8039, 953)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8111, 'status' => 'S', 'lower' => array(8103)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8114, 'status' => 'F', 'lower' => array(8048, 953)); /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8115, 'status' => 'F', 'lower' => array(945, 953)); /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8116, 'status' => 'F', 'lower' => array(940, 953)); /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8118, 'status' => 'F', 'lower' => array(945, 834)); /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8119, 'status' => 'F', 'lower' => array(945, 834, 953)); /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8120, 'status' => 'C', 'lower' => array(8112)); /* GREEK CAPITAL LETTER ALPHA WITH VRACHY */ +$config['1f00_1fff'][] = array('upper' => 8121, 'status' => 'C', 'lower' => array(8113)); /* GREEK CAPITAL LETTER ALPHA WITH MACRON */ +$config['1f00_1fff'][] = array('upper' => 8122, 'status' => 'C', 'lower' => array(8048)); /* GREEK CAPITAL LETTER ALPHA WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8123, 'status' => 'C', 'lower' => array(8049)); /* GREEK CAPITAL LETTER ALPHA WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8124, 'status' => 'F', 'lower' => array(945, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8124, 'status' => 'S', 'lower' => array(8115)); /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8126, 'status' => 'C', 'lower' => array(953)); /* GREEK PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8130, 'status' => 'F', 'lower' => array(8052, 953)); /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8131, 'status' => 'F', 'lower' => array(951, 953)); /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8132, 'status' => 'F', 'lower' => array(942, 953)); /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8134, 'status' => 'F', 'lower' => array(951, 834)); /* GREEK SMALL LETTER ETA WITH PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8135, 'status' => 'F', 'lower' => array(951, 834, 953)); /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8136, 'status' => 'C', 'lower' => array(8050)); /* GREEK CAPITAL LETTER EPSILON WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8137, 'status' => 'C', 'lower' => array(8051)); /* GREEK CAPITAL LETTER EPSILON WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8138, 'status' => 'C', 'lower' => array(8052)); /* GREEK CAPITAL LETTER ETA WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8139, 'status' => 'C', 'lower' => array(8053)); /* GREEK CAPITAL LETTER ETA WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8140, 'status' => 'F', 'lower' => array(951, 953)); /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8140, 'status' => 'S', 'lower' => array(8131)); /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8146, 'status' => 'F', 'lower' => array(953, 776, 768)); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8147, 'status' => 'F', 'lower' => array(953, 776, 769)); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8150, 'status' => 'F', 'lower' => array(953, 834)); /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8151, 'status' => 'F', 'lower' => array(953, 776, 834)); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8152, 'status' => 'C', 'lower' => array(8144)); /* GREEK CAPITAL LETTER IOTA WITH VRACHY */ +$config['1f00_1fff'][] = array('upper' => 8153, 'status' => 'C', 'lower' => array(8145)); /* GREEK CAPITAL LETTER IOTA WITH MACRON */ +$config['1f00_1fff'][] = array('upper' => 8154, 'status' => 'C', 'lower' => array(8054)); /* GREEK CAPITAL LETTER IOTA WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8155, 'status' => 'C', 'lower' => array(8055)); /* GREEK CAPITAL LETTER IOTA WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8162, 'status' => 'F', 'lower' => array(965, 776, 768)); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8163, 'status' => 'F', 'lower' => array(965, 776, 769)); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8164, 'status' => 'F', 'lower' => array(961, 787)); /* GREEK SMALL LETTER RHO WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 8166, 'status' => 'F', 'lower' => array(965, 834)); /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8167, 'status' => 'F', 'lower' => array(965, 776, 834)); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8168, 'status' => 'C', 'lower' => array(8160)); /* GREEK CAPITAL LETTER UPSILON WITH VRACHY */ +$config['1f00_1fff'][] = array('upper' => 8169, 'status' => 'C', 'lower' => array(8161)); /* GREEK CAPITAL LETTER UPSILON WITH MACRON */ +$config['1f00_1fff'][] = array('upper' => 8170, 'status' => 'C', 'lower' => array(8058)); /* GREEK CAPITAL LETTER UPSILON WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8171, 'status' => 'C', 'lower' => array(8059)); /* GREEK CAPITAL LETTER UPSILON WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8172, 'status' => 'C', 'lower' => array(8165)); /* GREEK CAPITAL LETTER RHO WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 8178, 'status' => 'F', 'lower' => array(8060, 953)); /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8179, 'status' => 'F', 'lower' => array(969, 953)); /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8180, 'status' => 'F', 'lower' => array(974, 953)); /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8182, 'status' => 'F', 'lower' => array(969, 834)); /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8183, 'status' => 'F', 'lower' => array(969, 834, 953)); /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8184, 'status' => 'C', 'lower' => array(8056)); /* GREEK CAPITAL LETTER OMICRON WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8185, 'status' => 'C', 'lower' => array(8057)); /* GREEK CAPITAL LETTER OMICRON WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8186, 'status' => 'C', 'lower' => array(8060)); /* GREEK CAPITAL LETTER OMEGA WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8187, 'status' => 'C', 'lower' => array(8061)); /* GREEK CAPITAL LETTER OMEGA WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8188, 'status' => 'F', 'lower' => array(969, 953)); /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8188, 'status' => 'S', 'lower' => array(8179)); /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */ diff --git a/cake/config/unicode/casefolding/2100_214f.php b/cake/config/unicode/casefolding/2100_214f.php new file mode 100644 index 0000000..e002350 --- /dev/null +++ b/cake/config/unicode/casefolding/2100_214f.php @@ -0,0 +1,45 @@ + 8486, 'status' => 'C', 'lower' => array(969)); /* OHM SIGN */ +$config['2100_214f'][] = array('upper' => 8490, 'status' => 'C', 'lower' => array(107)); /* KELVIN SIGN */ +$config['2100_214f'][] = array('upper' => 8491, 'status' => 'C', 'lower' => array(229)); /* ANGSTROM SIGN */ +$config['2100_214f'][] = array('upper' => 8498, 'status' => 'C', 'lower' => array(8526)); /* TURNED CAPITAL F */ diff --git a/cake/config/unicode/casefolding/2150_218f.php b/cake/config/unicode/casefolding/2150_218f.php new file mode 100644 index 0000000..6a1e685 --- /dev/null +++ b/cake/config/unicode/casefolding/2150_218f.php @@ -0,0 +1,58 @@ + 8544, 'status' => 'C', 'lower' => array(8560)); /* ROMAN NUMERAL ONE */ +$config['2150_218f'][] = array('upper' => 8545, 'status' => 'C', 'lower' => array(8561)); /* ROMAN NUMERAL TWO */ +$config['2150_218f'][] = array('upper' => 8546, 'status' => 'C', 'lower' => array(8562)); /* ROMAN NUMERAL THREE */ +$config['2150_218f'][] = array('upper' => 8547, 'status' => 'C', 'lower' => array(8563)); /* ROMAN NUMERAL FOUR */ +$config['2150_218f'][] = array('upper' => 8548, 'status' => 'C', 'lower' => array(8564)); /* ROMAN NUMERAL FIVE */ +$config['2150_218f'][] = array('upper' => 8549, 'status' => 'C', 'lower' => array(8565)); /* ROMAN NUMERAL SIX */ +$config['2150_218f'][] = array('upper' => 8550, 'status' => 'C', 'lower' => array(8566)); /* ROMAN NUMERAL SEVEN */ +$config['2150_218f'][] = array('upper' => 8551, 'status' => 'C', 'lower' => array(8567)); /* ROMAN NUMERAL EIGHT */ +$config['2150_218f'][] = array('upper' => 8552, 'status' => 'C', 'lower' => array(8568)); /* ROMAN NUMERAL NINE */ +$config['2150_218f'][] = array('upper' => 8553, 'status' => 'C', 'lower' => array(8569)); /* ROMAN NUMERAL TEN */ +$config['2150_218f'][] = array('upper' => 8554, 'status' => 'C', 'lower' => array(8570)); /* ROMAN NUMERAL ELEVEN */ +$config['2150_218f'][] = array('upper' => 8555, 'status' => 'C', 'lower' => array(8571)); /* ROMAN NUMERAL TWELVE */ +$config['2150_218f'][] = array('upper' => 8556, 'status' => 'C', 'lower' => array(8572)); /* ROMAN NUMERAL FIFTY */ +$config['2150_218f'][] = array('upper' => 8557, 'status' => 'C', 'lower' => array(8573)); /* ROMAN NUMERAL ONE HUNDRED */ +$config['2150_218f'][] = array('upper' => 8558, 'status' => 'C', 'lower' => array(8574)); /* ROMAN NUMERAL FIVE HUNDRED */ +$config['2150_218f'][] = array('upper' => 8559, 'status' => 'C', 'lower' => array(8575)); /* ROMAN NUMERAL ONE THOUSAND */ +$config['2150_218f'][] = array('upper' => 8579, 'status' => 'C', 'lower' => array(8580)); /* ROMAN NUMERAL REVERSED ONE HUNDRED */ diff --git a/cake/config/unicode/casefolding/2460_24ff.php b/cake/config/unicode/casefolding/2460_24ff.php new file mode 100644 index 0000000..3b8dee7 --- /dev/null +++ b/cake/config/unicode/casefolding/2460_24ff.php @@ -0,0 +1,67 @@ + 9398, 'status' => 'C', 'lower' => array(9424)); /* CIRCLED LATIN CAPITAL LETTER A */ +$config['2460_24ff'][] = array('upper' => 9399, 'status' => 'C', 'lower' => array(9425)); /* CIRCLED LATIN CAPITAL LETTER B */ +$config['2460_24ff'][] = array('upper' => 9400, 'status' => 'C', 'lower' => array(9426)); /* CIRCLED LATIN CAPITAL LETTER C */ +$config['2460_24ff'][] = array('upper' => 9401, 'status' => 'C', 'lower' => array(9427)); /* CIRCLED LATIN CAPITAL LETTER D */ +$config['2460_24ff'][] = array('upper' => 9402, 'status' => 'C', 'lower' => array(9428)); /* CIRCLED LATIN CAPITAL LETTER E */ +$config['2460_24ff'][] = array('upper' => 9403, 'status' => 'C', 'lower' => array(9429)); /* CIRCLED LATIN CAPITAL LETTER F */ +$config['2460_24ff'][] = array('upper' => 9404, 'status' => 'C', 'lower' => array(9430)); /* CIRCLED LATIN CAPITAL LETTER G */ +$config['2460_24ff'][] = array('upper' => 9405, 'status' => 'C', 'lower' => array(9431)); /* CIRCLED LATIN CAPITAL LETTER H */ +$config['2460_24ff'][] = array('upper' => 9406, 'status' => 'C', 'lower' => array(9432)); /* CIRCLED LATIN CAPITAL LETTER I */ +$config['2460_24ff'][] = array('upper' => 9407, 'status' => 'C', 'lower' => array(9433)); /* CIRCLED LATIN CAPITAL LETTER J */ +$config['2460_24ff'][] = array('upper' => 9408, 'status' => 'C', 'lower' => array(9434)); /* CIRCLED LATIN CAPITAL LETTER K */ +$config['2460_24ff'][] = array('upper' => 9409, 'status' => 'C', 'lower' => array(9435)); /* CIRCLED LATIN CAPITAL LETTER L */ +$config['2460_24ff'][] = array('upper' => 9410, 'status' => 'C', 'lower' => array(9436)); /* CIRCLED LATIN CAPITAL LETTER M */ +$config['2460_24ff'][] = array('upper' => 9411, 'status' => 'C', 'lower' => array(9437)); /* CIRCLED LATIN CAPITAL LETTER N */ +$config['2460_24ff'][] = array('upper' => 9412, 'status' => 'C', 'lower' => array(9438)); /* CIRCLED LATIN CAPITAL LETTER O */ +$config['2460_24ff'][] = array('upper' => 9413, 'status' => 'C', 'lower' => array(9439)); /* CIRCLED LATIN CAPITAL LETTER P */ +$config['2460_24ff'][] = array('upper' => 9414, 'status' => 'C', 'lower' => array(9440)); /* CIRCLED LATIN CAPITAL LETTER Q */ +$config['2460_24ff'][] = array('upper' => 9415, 'status' => 'C', 'lower' => array(9441)); /* CIRCLED LATIN CAPITAL LETTER R */ +$config['2460_24ff'][] = array('upper' => 9416, 'status' => 'C', 'lower' => array(9442)); /* CIRCLED LATIN CAPITAL LETTER S */ +$config['2460_24ff'][] = array('upper' => 9417, 'status' => 'C', 'lower' => array(9443)); /* CIRCLED LATIN CAPITAL LETTER T */ +$config['2460_24ff'][] = array('upper' => 9418, 'status' => 'C', 'lower' => array(9444)); /* CIRCLED LATIN CAPITAL LETTER U */ +$config['2460_24ff'][] = array('upper' => 9419, 'status' => 'C', 'lower' => array(9445)); /* CIRCLED LATIN CAPITAL LETTER V */ +$config['2460_24ff'][] = array('upper' => 9420, 'status' => 'C', 'lower' => array(9446)); /* CIRCLED LATIN CAPITAL LETTER W */ +$config['2460_24ff'][] = array('upper' => 9421, 'status' => 'C', 'lower' => array(9447)); /* CIRCLED LATIN CAPITAL LETTER X */ +$config['2460_24ff'][] = array('upper' => 9422, 'status' => 'C', 'lower' => array(9448)); /* CIRCLED LATIN CAPITAL LETTER Y */ +$config['2460_24ff'][] = array('upper' => 9423, 'status' => 'C', 'lower' => array(9449)); /* CIRCLED LATIN CAPITAL LETTER Z */ diff --git a/cake/config/unicode/casefolding/2c00_2c5f.php b/cake/config/unicode/casefolding/2c00_2c5f.php new file mode 100644 index 0000000..7f80a41 --- /dev/null +++ b/cake/config/unicode/casefolding/2c00_2c5f.php @@ -0,0 +1,88 @@ + 11264, 'status' => 'C', 'lower' => array(11312)); /* GLAGOLITIC CAPITAL LETTER AZU */ +$config['2c00_2c5f'][] = array('upper' => 11265, 'status' => 'C', 'lower' => array(11313)); /* GLAGOLITIC CAPITAL LETTER BUKY */ +$config['2c00_2c5f'][] = array('upper' => 11266, 'status' => 'C', 'lower' => array(11314)); /* GLAGOLITIC CAPITAL LETTER VEDE */ +$config['2c00_2c5f'][] = array('upper' => 11267, 'status' => 'C', 'lower' => array(11315)); /* GLAGOLITIC CAPITAL LETTER GLAGOLI */ +$config['2c00_2c5f'][] = array('upper' => 11268, 'status' => 'C', 'lower' => array(11316)); /* GLAGOLITIC CAPITAL LETTER DOBRO */ +$config['2c00_2c5f'][] = array('upper' => 11269, 'status' => 'C', 'lower' => array(11317)); /* GLAGOLITIC CAPITAL LETTER YESTU */ +$config['2c00_2c5f'][] = array('upper' => 11270, 'status' => 'C', 'lower' => array(11318)); /* GLAGOLITIC CAPITAL LETTER ZHIVETE */ +$config['2c00_2c5f'][] = array('upper' => 11271, 'status' => 'C', 'lower' => array(11319)); /* GLAGOLITIC CAPITAL LETTER DZELO */ +$config['2c00_2c5f'][] = array('upper' => 11272, 'status' => 'C', 'lower' => array(11320)); /* GLAGOLITIC CAPITAL LETTER ZEMLJA */ +$config['2c00_2c5f'][] = array('upper' => 11273, 'status' => 'C', 'lower' => array(11321)); /* GLAGOLITIC CAPITAL LETTER IZHE */ +$config['2c00_2c5f'][] = array('upper' => 11274, 'status' => 'C', 'lower' => array(11322)); /* GLAGOLITIC CAPITAL LETTER INITIAL IZHE */ +$config['2c00_2c5f'][] = array('upper' => 11275, 'status' => 'C', 'lower' => array(11323)); /* GLAGOLITIC CAPITAL LETTER I */ +$config['2c00_2c5f'][] = array('upper' => 11276, 'status' => 'C', 'lower' => array(11324)); /* GLAGOLITIC CAPITAL LETTER DJERVI */ +$config['2c00_2c5f'][] = array('upper' => 11277, 'status' => 'C', 'lower' => array(11325)); /* GLAGOLITIC CAPITAL LETTER KAKO */ +$config['2c00_2c5f'][] = array('upper' => 11278, 'status' => 'C', 'lower' => array(11326)); /* GLAGOLITIC CAPITAL LETTER LJUDIJE */ +$config['2c00_2c5f'][] = array('upper' => 11279, 'status' => 'C', 'lower' => array(11327)); /* GLAGOLITIC CAPITAL LETTER MYSLITE */ +$config['2c00_2c5f'][] = array('upper' => 11280, 'status' => 'C', 'lower' => array(11328)); /* GLAGOLITIC CAPITAL LETTER NASHI */ +$config['2c00_2c5f'][] = array('upper' => 11281, 'status' => 'C', 'lower' => array(11329)); /* GLAGOLITIC CAPITAL LETTER ONU */ +$config['2c00_2c5f'][] = array('upper' => 11282, 'status' => 'C', 'lower' => array(11330)); /* GLAGOLITIC CAPITAL LETTER POKOJI */ +$config['2c00_2c5f'][] = array('upper' => 11283, 'status' => 'C', 'lower' => array(11331)); /* GLAGOLITIC CAPITAL LETTER RITSI */ +$config['2c00_2c5f'][] = array('upper' => 11284, 'status' => 'C', 'lower' => array(11332)); /* GLAGOLITIC CAPITAL LETTER SLOVO */ +$config['2c00_2c5f'][] = array('upper' => 11285, 'status' => 'C', 'lower' => array(11333)); /* GLAGOLITIC CAPITAL LETTER TVRIDO */ +$config['2c00_2c5f'][] = array('upper' => 11286, 'status' => 'C', 'lower' => array(11334)); /* GLAGOLITIC CAPITAL LETTER UKU */ +$config['2c00_2c5f'][] = array('upper' => 11287, 'status' => 'C', 'lower' => array(11335)); /* GLAGOLITIC CAPITAL LETTER FRITU */ +$config['2c00_2c5f'][] = array('upper' => 11288, 'status' => 'C', 'lower' => array(11336)); /* GLAGOLITIC CAPITAL LETTER HERU */ +$config['2c00_2c5f'][] = array('upper' => 11289, 'status' => 'C', 'lower' => array(11337)); /* GLAGOLITIC CAPITAL LETTER OTU */ +$config['2c00_2c5f'][] = array('upper' => 11290, 'status' => 'C', 'lower' => array(11338)); /* GLAGOLITIC CAPITAL LETTER PE */ +$config['2c00_2c5f'][] = array('upper' => 11291, 'status' => 'C', 'lower' => array(11339)); /* GLAGOLITIC CAPITAL LETTER SHTA */ +$config['2c00_2c5f'][] = array('upper' => 11292, 'status' => 'C', 'lower' => array(11340)); /* GLAGOLITIC CAPITAL LETTER TSI */ +$config['2c00_2c5f'][] = array('upper' => 11293, 'status' => 'C', 'lower' => array(11341)); /* GLAGOLITIC CAPITAL LETTER CHRIVI */ +$config['2c00_2c5f'][] = array('upper' => 11294, 'status' => 'C', 'lower' => array(11342)); /* GLAGOLITIC CAPITAL LETTER SHA */ +$config['2c00_2c5f'][] = array('upper' => 11295, 'status' => 'C', 'lower' => array(11343)); /* GLAGOLITIC CAPITAL LETTER YERU */ +$config['2c00_2c5f'][] = array('upper' => 11296, 'status' => 'C', 'lower' => array(11344)); /* GLAGOLITIC CAPITAL LETTER YERI */ +$config['2c00_2c5f'][] = array('upper' => 11297, 'status' => 'C', 'lower' => array(11345)); /* GLAGOLITIC CAPITAL LETTER YATI */ +$config['2c00_2c5f'][] = array('upper' => 11298, 'status' => 'C', 'lower' => array(11346)); /* GLAGOLITIC CAPITAL LETTER SPIDERY HA */ +$config['2c00_2c5f'][] = array('upper' => 11299, 'status' => 'C', 'lower' => array(11347)); /* GLAGOLITIC CAPITAL LETTER YU */ +$config['2c00_2c5f'][] = array('upper' => 11300, 'status' => 'C', 'lower' => array(11348)); /* GLAGOLITIC CAPITAL LETTER SMALL YUS */ +$config['2c00_2c5f'][] = array('upper' => 11301, 'status' => 'C', 'lower' => array(11349)); /* GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL */ +$config['2c00_2c5f'][] = array('upper' => 11302, 'status' => 'C', 'lower' => array(11350)); /* GLAGOLITIC CAPITAL LETTER YO */ +$config['2c00_2c5f'][] = array('upper' => 11303, 'status' => 'C', 'lower' => array(11351)); /* GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS */ +$config['2c00_2c5f'][] = array('upper' => 11304, 'status' => 'C', 'lower' => array(11352)); /* GLAGOLITIC CAPITAL LETTER BIG YUS */ +$config['2c00_2c5f'][] = array('upper' => 11305, 'status' => 'C', 'lower' => array(11353)); /* GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS */ +$config['2c00_2c5f'][] = array('upper' => 11306, 'status' => 'C', 'lower' => array(11354)); /* GLAGOLITIC CAPITAL LETTER FITA */ +$config['2c00_2c5f'][] = array('upper' => 11307, 'status' => 'C', 'lower' => array(11355)); /* GLAGOLITIC CAPITAL LETTER IZHITSA */ +$config['2c00_2c5f'][] = array('upper' => 11308, 'status' => 'C', 'lower' => array(11356)); /* GLAGOLITIC CAPITAL LETTER SHTAPIC */ +$config['2c00_2c5f'][] = array('upper' => 11309, 'status' => 'C', 'lower' => array(11357)); /* GLAGOLITIC CAPITAL LETTER TROKUTASTI A */ +$config['2c00_2c5f'][] = array('upper' => 11310, 'status' => 'C', 'lower' => array(11358)); /* GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE */ diff --git a/cake/config/unicode/casefolding/2c60_2c7f.php b/cake/config/unicode/casefolding/2c60_2c7f.php new file mode 100644 index 0000000..299cbdc --- /dev/null +++ b/cake/config/unicode/casefolding/2c60_2c7f.php @@ -0,0 +1,49 @@ + 11360, 'status' => 'C', 'lower' => array(11361)); /* LATIN CAPITAL LETTER L WITH DOUBLE BAR */ +$config['2c60_2c7f'][] = array('upper' => 11362, 'status' => 'C', 'lower' => array(619)); /* LATIN CAPITAL LETTER L WITH MIDDLE TILDE */ +$config['2c60_2c7f'][] = array('upper' => 11363, 'status' => 'C', 'lower' => array(7549)); /* LATIN CAPITAL LETTER P WITH STROKE */ +$config['2c60_2c7f'][] = array('upper' => 11364, 'status' => 'C', 'lower' => array(637)); /* LATIN CAPITAL LETTER R WITH TAIL */ +$config['2c60_2c7f'][] = array('upper' => 11367, 'status' => 'C', 'lower' => array(11368)); /* LATIN CAPITAL LETTER H WITH DESCENDER */ +$config['2c60_2c7f'][] = array('upper' => 11369, 'status' => 'C', 'lower' => array(11370)); /* LATIN CAPITAL LETTER K WITH DESCENDER */ +$config['2c60_2c7f'][] = array('upper' => 11371, 'status' => 'C', 'lower' => array(11372)); /* LATIN CAPITAL LETTER Z WITH DESCENDER */ +$config['2c60_2c7f'][] = array('upper' => 11381, 'status' => 'C', 'lower' => array(11382)); /* LATIN CAPITAL LETTER HALF H */ diff --git a/cake/config/unicode/casefolding/2c80_2cff.php b/cake/config/unicode/casefolding/2c80_2cff.php new file mode 100644 index 0000000..3836c64 --- /dev/null +++ b/cake/config/unicode/casefolding/2c80_2cff.php @@ -0,0 +1,91 @@ + 11392, 'status' => 'C', 'lower' => array(11393)); /* COPTIC CAPITAL LETTER ALFA */ +$config['2c80_2cff'][] = array('upper' => 11394, 'status' => 'C', 'lower' => array(11395)); /* COPTIC CAPITAL LETTER VIDA */ +$config['2c80_2cff'][] = array('upper' => 11396, 'status' => 'C', 'lower' => array(11397)); /* COPTIC CAPITAL LETTER GAMMA */ +$config['2c80_2cff'][] = array('upper' => 11398, 'status' => 'C', 'lower' => array(11399)); /* COPTIC CAPITAL LETTER DALDA */ +$config['2c80_2cff'][] = array('upper' => 11400, 'status' => 'C', 'lower' => array(11401)); /* COPTIC CAPITAL LETTER EIE */ +$config['2c80_2cff'][] = array('upper' => 11402, 'status' => 'C', 'lower' => array(11403)); /* COPTIC CAPITAL LETTER SOU */ +$config['2c80_2cff'][] = array('upper' => 11404, 'status' => 'C', 'lower' => array(11405)); /* COPTIC CAPITAL LETTER ZATA */ +$config['2c80_2cff'][] = array('upper' => 11406, 'status' => 'C', 'lower' => array(11407)); /* COPTIC CAPITAL LETTER HATE */ +$config['2c80_2cff'][] = array('upper' => 11408, 'status' => 'C', 'lower' => array(11409)); /* COPTIC CAPITAL LETTER THETHE */ +$config['2c80_2cff'][] = array('upper' => 11410, 'status' => 'C', 'lower' => array(11411)); /* COPTIC CAPITAL LETTER IAUDA */ +$config['2c80_2cff'][] = array('upper' => 11412, 'status' => 'C', 'lower' => array(11413)); /* COPTIC CAPITAL LETTER KAPA */ +$config['2c80_2cff'][] = array('upper' => 11414, 'status' => 'C', 'lower' => array(11415)); /* COPTIC CAPITAL LETTER LAULA */ +$config['2c80_2cff'][] = array('upper' => 11416, 'status' => 'C', 'lower' => array(11417)); /* COPTIC CAPITAL LETTER MI */ +$config['2c80_2cff'][] = array('upper' => 11418, 'status' => 'C', 'lower' => array(11419)); /* COPTIC CAPITAL LETTER NI */ +$config['2c80_2cff'][] = array('upper' => 11420, 'status' => 'C', 'lower' => array(11421)); /* COPTIC CAPITAL LETTER KSI */ +$config['2c80_2cff'][] = array('upper' => 11422, 'status' => 'C', 'lower' => array(11423)); /* COPTIC CAPITAL LETTER O */ +$config['2c80_2cff'][] = array('upper' => 11424, 'status' => 'C', 'lower' => array(11425)); /* COPTIC CAPITAL LETTER PI */ +$config['2c80_2cff'][] = array('upper' => 11426, 'status' => 'C', 'lower' => array(11427)); /* COPTIC CAPITAL LETTER RO */ +$config['2c80_2cff'][] = array('upper' => 11428, 'status' => 'C', 'lower' => array(11429)); /* COPTIC CAPITAL LETTER SIMA */ +$config['2c80_2cff'][] = array('upper' => 11430, 'status' => 'C', 'lower' => array(11431)); /* COPTIC CAPITAL LETTER TAU */ +$config['2c80_2cff'][] = array('upper' => 11432, 'status' => 'C', 'lower' => array(11433)); /* COPTIC CAPITAL LETTER UA */ +$config['2c80_2cff'][] = array('upper' => 11434, 'status' => 'C', 'lower' => array(11435)); /* COPTIC CAPITAL LETTER FI */ +$config['2c80_2cff'][] = array('upper' => 11436, 'status' => 'C', 'lower' => array(11437)); /* COPTIC CAPITAL LETTER KHI */ +$config['2c80_2cff'][] = array('upper' => 11438, 'status' => 'C', 'lower' => array(11439)); /* COPTIC CAPITAL LETTER PSI */ +$config['2c80_2cff'][] = array('upper' => 11440, 'status' => 'C', 'lower' => array(11441)); /* COPTIC CAPITAL LETTER OOU */ +$config['2c80_2cff'][] = array('upper' => 11442, 'status' => 'C', 'lower' => array(11443)); /* COPTIC CAPITAL LETTER DIALECT-P ALEF */ +$config['2c80_2cff'][] = array('upper' => 11444, 'status' => 'C', 'lower' => array(11445)); /* COPTIC CAPITAL LETTER OLD COPTIC AIN */ +$config['2c80_2cff'][] = array('upper' => 11446, 'status' => 'C', 'lower' => array(11447)); /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE */ +$config['2c80_2cff'][] = array('upper' => 11448, 'status' => 'C', 'lower' => array(11449)); /* COPTIC CAPITAL LETTER DIALECT-P KAPA */ +$config['2c80_2cff'][] = array('upper' => 11450, 'status' => 'C', 'lower' => array(11451)); /* COPTIC CAPITAL LETTER DIALECT-P NI */ +$config['2c80_2cff'][] = array('upper' => 11452, 'status' => 'C', 'lower' => array(11453)); /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI */ +$config['2c80_2cff'][] = array('upper' => 11454, 'status' => 'C', 'lower' => array(11455)); /* COPTIC CAPITAL LETTER OLD COPTIC OOU */ +$config['2c80_2cff'][] = array('upper' => 11456, 'status' => 'C', 'lower' => array(11457)); /* COPTIC CAPITAL LETTER SAMPI */ +$config['2c80_2cff'][] = array('upper' => 11458, 'status' => 'C', 'lower' => array(11459)); /* COPTIC CAPITAL LETTER CROSSED SHEI */ +$config['2c80_2cff'][] = array('upper' => 11460, 'status' => 'C', 'lower' => array(11461)); /* COPTIC CAPITAL LETTER OLD COPTIC SHEI */ +$config['2c80_2cff'][] = array('upper' => 11462, 'status' => 'C', 'lower' => array(11463)); /* COPTIC CAPITAL LETTER OLD COPTIC ESH */ +$config['2c80_2cff'][] = array('upper' => 11464, 'status' => 'C', 'lower' => array(11465)); /* COPTIC CAPITAL LETTER AKHMIMIC KHEI */ +$config['2c80_2cff'][] = array('upper' => 11466, 'status' => 'C', 'lower' => array(11467)); /* COPTIC CAPITAL LETTER DIALECT-P HORI */ +$config['2c80_2cff'][] = array('upper' => 11468, 'status' => 'C', 'lower' => array(11469)); /* COPTIC CAPITAL LETTER OLD COPTIC HORI */ +$config['2c80_2cff'][] = array('upper' => 11470, 'status' => 'C', 'lower' => array(11471)); /* COPTIC CAPITAL LETTER OLD COPTIC HA */ +$config['2c80_2cff'][] = array('upper' => 11472, 'status' => 'C', 'lower' => array(11473)); /* COPTIC CAPITAL LETTER L-SHAPED HA */ +$config['2c80_2cff'][] = array('upper' => 11474, 'status' => 'C', 'lower' => array(11475)); /* COPTIC CAPITAL LETTER OLD COPTIC HEI */ +$config['2c80_2cff'][] = array('upper' => 11476, 'status' => 'C', 'lower' => array(11477)); /* COPTIC CAPITAL LETTER OLD COPTIC HAT */ +$config['2c80_2cff'][] = array('upper' => 11478, 'status' => 'C', 'lower' => array(11479)); /* COPTIC CAPITAL LETTER OLD COPTIC GANGIA */ +$config['2c80_2cff'][] = array('upper' => 11480, 'status' => 'C', 'lower' => array(11481)); /* COPTIC CAPITAL LETTER OLD COPTIC DJA */ +$config['2c80_2cff'][] = array('upper' => 11482, 'status' => 'C', 'lower' => array(11483)); /* COPTIC CAPITAL LETTER OLD COPTIC SHIMA */ +$config['2c80_2cff'][] = array('upper' => 11484, 'status' => 'C', 'lower' => array(11485)); /* COPTIC CAPITAL LETTER OLD NUBIAN SHIMA */ +$config['2c80_2cff'][] = array('upper' => 11486, 'status' => 'C', 'lower' => array(11487)); /* COPTIC CAPITAL LETTER OLD NUBIAN NGI */ +$config['2c80_2cff'][] = array('upper' => 11488, 'status' => 'C', 'lower' => array(11489)); /* COPTIC CAPITAL LETTER OLD NUBIAN NYI */ +$config['2c80_2cff'][] = array('upper' => 11490, 'status' => 'C', 'lower' => array(11491)); /* COPTIC CAPITAL LETTER OLD NUBIAN WAU */ diff --git a/cake/config/unicode/casefolding/ff00_ffef.php b/cake/config/unicode/casefolding/ff00_ffef.php new file mode 100644 index 0000000..1fbb85d --- /dev/null +++ b/cake/config/unicode/casefolding/ff00_ffef.php @@ -0,0 +1,67 @@ + 65313, 'status' => 'C', 'lower' => array(65345)); /* FULLWIDTH LATIN CAPITAL LETTER A */ +$config['ff00_ffef'][] = array('upper' => 65314, 'status' => 'C', 'lower' => array(65346)); /* FULLWIDTH LATIN CAPITAL LETTER B */ +$config['ff00_ffef'][] = array('upper' => 65315, 'status' => 'C', 'lower' => array(65347)); /* FULLWIDTH LATIN CAPITAL LETTER C */ +$config['ff00_ffef'][] = array('upper' => 65316, 'status' => 'C', 'lower' => array(65348)); /* FULLWIDTH LATIN CAPITAL LETTER D */ +$config['ff00_ffef'][] = array('upper' => 65317, 'status' => 'C', 'lower' => array(65349)); /* FULLWIDTH LATIN CAPITAL LETTER E */ +$config['ff00_ffef'][] = array('upper' => 65318, 'status' => 'C', 'lower' => array(65350)); /* FULLWIDTH LATIN CAPITAL LETTER F */ +$config['ff00_ffef'][] = array('upper' => 65319, 'status' => 'C', 'lower' => array(65351)); /* FULLWIDTH LATIN CAPITAL LETTER G */ +$config['ff00_ffef'][] = array('upper' => 65320, 'status' => 'C', 'lower' => array(65352)); /* FULLWIDTH LATIN CAPITAL LETTER H */ +$config['ff00_ffef'][] = array('upper' => 65321, 'status' => 'C', 'lower' => array(65353)); /* FULLWIDTH LATIN CAPITAL LETTER I */ +$config['ff00_ffef'][] = array('upper' => 65322, 'status' => 'C', 'lower' => array(65354)); /* FULLWIDTH LATIN CAPITAL LETTER J */ +$config['ff00_ffef'][] = array('upper' => 65323, 'status' => 'C', 'lower' => array(65355)); /* FULLWIDTH LATIN CAPITAL LETTER K */ +$config['ff00_ffef'][] = array('upper' => 65324, 'status' => 'C', 'lower' => array(65356)); /* FULLWIDTH LATIN CAPITAL LETTER L */ +$config['ff00_ffef'][] = array('upper' => 65325, 'status' => 'C', 'lower' => array(65357)); /* FULLWIDTH LATIN CAPITAL LETTER M */ +$config['ff00_ffef'][] = array('upper' => 65326, 'status' => 'C', 'lower' => array(65358)); /* FULLWIDTH LATIN CAPITAL LETTER N */ +$config['ff00_ffef'][] = array('upper' => 65327, 'status' => 'C', 'lower' => array(65359)); /* FULLWIDTH LATIN CAPITAL LETTER O */ +$config['ff00_ffef'][] = array('upper' => 65328, 'status' => 'C', 'lower' => array(65360)); /* FULLWIDTH LATIN CAPITAL LETTER P */ +$config['ff00_ffef'][] = array('upper' => 65329, 'status' => 'C', 'lower' => array(65361)); /* FULLWIDTH LATIN CAPITAL LETTER Q */ +$config['ff00_ffef'][] = array('upper' => 65330, 'status' => 'C', 'lower' => array(65362)); /* FULLWIDTH LATIN CAPITAL LETTER R */ +$config['ff00_ffef'][] = array('upper' => 65331, 'status' => 'C', 'lower' => array(65363)); /* FULLWIDTH LATIN CAPITAL LETTER S */ +$config['ff00_ffef'][] = array('upper' => 65332, 'status' => 'C', 'lower' => array(65364)); /* FULLWIDTH LATIN CAPITAL LETTER T */ +$config['ff00_ffef'][] = array('upper' => 65333, 'status' => 'C', 'lower' => array(65365)); /* FULLWIDTH LATIN CAPITAL LETTER U */ +$config['ff00_ffef'][] = array('upper' => 65334, 'status' => 'C', 'lower' => array(65366)); /* FULLWIDTH LATIN CAPITAL LETTER V */ +$config['ff00_ffef'][] = array('upper' => 65335, 'status' => 'C', 'lower' => array(65367)); /* FULLWIDTH LATIN CAPITAL LETTER W */ +$config['ff00_ffef'][] = array('upper' => 65336, 'status' => 'C', 'lower' => array(65368)); /* FULLWIDTH LATIN CAPITAL LETTER X */ +$config['ff00_ffef'][] = array('upper' => 65337, 'status' => 'C', 'lower' => array(65369)); /* FULLWIDTH LATIN CAPITAL LETTER Y */ +$config['ff00_ffef'][] = array('upper' => 65338, 'status' => 'C', 'lower' => array(65370)); /* FULLWIDTH LATIN CAPITAL LETTER Z */ diff --git a/cake/console/cake b/cake/console/cake new file mode 100644 index 0000000..0c5f60f --- /dev/null +++ b/cake/console/cake @@ -0,0 +1,26 @@ +#!/bin/bash +################################################################################ +# +# Bake is a shell script for running CakePHP bake script +# PHP versions 4 and 5 +# +# CakePHP(tm) : Rapid Development Framework (http://cakephp.org) +# Copyright 2005-2010, Cake Software Foundation, Inc. +# +# Licensed under The MIT License +# Redistributions of files must retain the above copyright notice. +# +# @copyright Copyright 2005-2010, Cake Software Foundation, Inc. +# @link http://cakephp.org CakePHP(tm) Project +# @package cake +# @subpackage cake.cake.console +# @since CakePHP(tm) v 1.2.0.5012 +# @license MIT License (http://www.opensource.org/licenses/mit-license.php) +# +################################################################################ +LIB=${0/%cake/} +APP=`pwd` + +exec php -q ${LIB}cake.php -working "${APP}" "$@" + +exit; \ No newline at end of file diff --git a/cake/console/cake.bat b/cake/console/cake.bat new file mode 100644 index 0000000..50ef631 --- /dev/null +++ b/cake/console/cake.bat @@ -0,0 +1,31 @@ +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: Bake is a shell script for running CakePHP bake script +:: PHP versions 4 and 5 +:: +:: CakePHP(tm) : Rapid Development Framework (http://cakephp.org) +:: Copyright 2005-2010, Cake Software Foundation, Inc. +:: +:: Licensed under The MIT License +:: Redistributions of files must retain the above copyright notice. +:: +:: @copyright Copyright 2005-2010, Cake Software Foundation, Inc. +:: @link http://cakephp.org CakePHP(tm) Project +:: @package cake +:: @subpackage cake.cake.console +:: @since CakePHP(tm) v 1.2.0.5012 +:: @license MIT License (http://www.opensource.org/licenses/mit-license.php) +:: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:: In order for this script to work as intended, the cake\console\ folder must be in your PATH + +@echo. +@echo off + +SET app=%0 +SET lib=%~dp0 + +php -q "%lib%cake.php" -working "%CD%" %* + +echo. \ No newline at end of file diff --git a/cake/console/cake.php b/cake/console/cake.php new file mode 100644 index 0000000..a4c89b5 --- /dev/null +++ b/cake/console/cake.php @@ -0,0 +1,661 @@ +#!/usr/bin/php -q +__initConstants(); + $this->parseParams($args); + $this->_initEnvironment(); + $this->__buildPaths(); + $this->_stop($this->dispatch() === false ? 1 : 0); + } + +/** + * Defines core configuration. + * + * @access private + */ + function __initConstants() { + if (function_exists('ini_set')) { + ini_set('display_errors', '1'); + ini_set('error_reporting', E_ALL & ~E_DEPRECATED); + ini_set('html_errors', false); + ini_set('implicit_flush', true); + ini_set('max_execution_time', 0); + } + + if (!defined('CAKE_CORE_INCLUDE_PATH')) { + define('PHP5', (PHP_VERSION >= 5)); + define('DS', DIRECTORY_SEPARATOR); + define('CAKE_CORE_INCLUDE_PATH', dirname(dirname(dirname(__FILE__)))); + define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS); + define('DISABLE_DEFAULT_ERROR_HANDLING', false); + define('CAKEPHP_SHELL', true); + } + require_once(CORE_PATH . 'cake' . DS . 'basics.php'); + } + +/** + * Defines current working environment. + * + * @access protected + */ + function _initEnvironment() { + $this->stdin = fopen('php://stdin', 'r'); + $this->stdout = fopen('php://stdout', 'w'); + $this->stderr = fopen('php://stderr', 'w'); + + if (!$this->__bootstrap()) { + $this->stderr("\nCakePHP Console: "); + $this->stderr("\nUnable to load Cake core:"); + $this->stderr("\tMake sure " . DS . 'cake' . DS . 'libs exists in ' . CAKE_CORE_INCLUDE_PATH); + $this->_stop(); + } + + if (!isset($this->args[0]) || !isset($this->params['working'])) { + $this->stderr("\nCakePHP Console: "); + $this->stderr('This file has been loaded incorrectly and cannot continue.'); + $this->stderr('Please make sure that ' . DIRECTORY_SEPARATOR . 'cake' . DIRECTORY_SEPARATOR . 'console is in your system path,'); + $this->stderr('and check the manual for the correct usage of this command.'); + $this->stderr('(http://manual.cakephp.org/)'); + $this->_stop(); + } + + if (basename(__FILE__) != basename($this->args[0])) { + $this->stderr("\nCakePHP Console: "); + $this->stderr('Warning: the dispatcher may have been loaded incorrectly, which could lead to unexpected results...'); + if ($this->getInput('Continue anyway?', array('y', 'n'), 'y') == 'n') { + $this->_stop(); + } + } + + $this->shiftArgs(); + } + +/** + * Builds the shell paths. + * + * @access private + * @return void + */ + function __buildPaths() { + $paths = array(); + if (!class_exists('Folder')) { + require LIBS . 'folder.php'; + } + $plugins = App::objects('plugin', null, false); + foreach ((array)$plugins as $plugin) { + $pluginPath = App::pluginPath($plugin); + $path = $pluginPath . 'vendors' . DS . 'shells' . DS; + if (file_exists($path)) { + $paths[] = $path; + } + } + + $vendorPaths = array_values(App::path('vendors')); + foreach ($vendorPaths as $vendorPath) { + $path = rtrim($vendorPath, DS) . DS . 'shells' . DS; + if (file_exists($path)) { + $paths[] = $path; + } + } + + $this->shellPaths = array_values(array_unique(array_merge($paths, App::path('shells')))); + } + +/** + * Initializes the environment and loads the Cake core. + * + * @return boolean Success. + * @access private + */ + function __bootstrap() { + + define('ROOT', $this->params['root']); + define('APP_DIR', $this->params['app']); + define('APP_PATH', $this->params['working'] . DS); + define('WWW_ROOT', APP_PATH . $this->params['webroot'] . DS); + if (!is_dir(ROOT . DS . APP_DIR . DS . 'tmp')) { + define('TMP', CORE_PATH . 'cake' . DS . 'console' . DS . 'templates' . DS . 'skel' . DS . 'tmp' . DS); + } + + $includes = array( + CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'object.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'inflector.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'configure.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'file.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'cache.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'string.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'class_registry.php', + CORE_PATH . 'cake' . DS . 'console' . DS . 'error.php' + ); + + foreach ($includes as $inc) { + if (!require($inc)) { + $this->stderr("Failed to load Cake core file {$inc}"); + return false; + } + } + + Configure::getInstance(file_exists(CONFIGS . 'bootstrap.php')); + + if (!file_exists(APP_PATH . 'config' . DS . 'core.php')) { + include_once CORE_PATH . 'cake' . DS . 'console' . DS . 'templates' . DS . 'skel' . DS . 'config' . DS . 'core.php'; + App::build(); + } + + return true; + } + +/** + * Clear the console + * + * @return void + * @access public + */ + function clear() { + if (empty($this->params['noclear'])) { + if ( DS === '/') { + passthru('clear'); + } else { + passthru('cls'); + } + } + } + +/** + * Dispatches a CLI request + * + * @return boolean + * @access public + */ + function dispatch() { + $arg = $this->shiftArgs(); + + if (!$arg) { + $this->help(); + return false; + } + if ($arg == 'help') { + $this->help(); + return true; + } + + list($plugin, $shell) = pluginSplit($arg); + $this->shell = $shell; + $this->shellName = Inflector::camelize($shell); + $this->shellClass = $this->shellName . 'Shell'; + + $arg = null; + + if (isset($this->args[0])) { + $arg = $this->args[0]; + $this->shellCommand = Inflector::variable($arg); + } + + $Shell = $this->_getShell($plugin); + + if (!$Shell) { + $title = sprintf(__('Error: Class %s could not be loaded.', true), $this->shellClass); + $this->stderr($title . "\n"); + return false; + } + + $methods = array(); + + if (is_a($Shell, 'Shell')) { + $Shell->initialize(); + $Shell->loadTasks(); + + foreach ($Shell->taskNames as $task) { + if (is_a($Shell->{$task}, 'Shell')) { + $Shell->{$task}->initialize(); + $Shell->{$task}->loadTasks(); + } + } + + $task = Inflector::camelize($arg); + + if (in_array($task, $Shell->taskNames)) { + $this->shiftArgs(); + $Shell->{$task}->startup(); + + if (isset($this->args[0]) && $this->args[0] == 'help') { + if (method_exists($Shell->{$task}, 'help')) { + $Shell->{$task}->help(); + } else { + $this->help(); + } + return true; + } + return $Shell->{$task}->execute(); + } + $methods = array_diff(get_class_methods('Shell'), array('help')); + } + $methods = array_diff(get_class_methods($Shell), $methods); + $added = in_array(strtolower($arg), array_map('strtolower', $methods)); + $private = $arg[0] == '_' && method_exists($Shell, $arg); + + if (!$private) { + if ($added) { + $this->shiftArgs(); + $Shell->startup(); + return $Shell->{$arg}(); + } + if (method_exists($Shell, 'main')) { + $Shell->startup(); + return $Shell->main(); + } + } + + $title = sprintf(__('Error: Unknown %1$s command %2$s.', true), $this->shellName, $arg); + $message = sprintf(__('For usage try `cake %s help`', true), $this->shell); + $this->stderr($title . "\n" . $message . "\n"); + return false; + } + +/** + * Get shell to use, either plugin shell or application shell + * + * All paths in the shellPaths property are searched. + * shell, shellPath and shellClass properties are taken into account. + * + * @param string $plugin Optionally the name of a plugin + * @return mixed False if no shell could be found or an object on success + * @access protected + */ + function _getShell($plugin = null) { + foreach ($this->shellPaths as $path) { + $this->shellPath = $path . $this->shell . '.php'; + $pluginShellPath = DS . $plugin . DS . 'vendors' . DS . 'shells' . DS; + + if ((strpos($path, $pluginShellPath) !== false || !$plugin) && file_exists($this->shellPath)) { + $loaded = true; + break; + } + } + if (!isset($loaded)) { + return false; + } + + if (!class_exists('Shell')) { + require CONSOLE_LIBS . 'shell.php'; + } + + if (!class_exists($this->shellClass)) { + require $this->shellPath; + } + if (!class_exists($this->shellClass)) { + return false; + } + $Shell = new $this->shellClass($this); + return $Shell; + } + +/** + * Prompts the user for input, and returns it. + * + * @param string $prompt Prompt text. + * @param mixed $options Array or string of options. + * @param string $default Default input value. + * @return Either the default value, or the user-provided input. + * @access public + */ + function getInput($prompt, $options = null, $default = null) { + if (!is_array($options)) { + $printOptions = ''; + } else { + $printOptions = '(' . implode('/', $options) . ')'; + } + + if ($default === null) { + $this->stdout($prompt . " $printOptions \n" . '> ', false); + } else { + $this->stdout($prompt . " $printOptions \n" . "[$default] > ", false); + } + $result = fgets($this->stdin); + + if ($result === false) { + exit; + } + $result = trim($result); + + if ($default != null && empty($result)) { + return $default; + } + return $result; + } + +/** + * Outputs to the stdout filehandle. + * + * @param string $string String to output. + * @param boolean $newline If true, the outputs gets an added newline. + * @return integer Returns the number of bytes output to stdout. + * @access public + */ + function stdout($string, $newline = true) { + if ($newline) { + return fwrite($this->stdout, $string . "\n"); + } else { + return fwrite($this->stdout, $string); + } + } + +/** + * Outputs to the stderr filehandle. + * + * @param string $string Error text to output. + * @access public + */ + function stderr($string) { + fwrite($this->stderr, $string); + } + +/** + * Parses command line options + * + * @param array $params Parameters to parse + * @access public + */ + function parseParams($params) { + $this->__parseParams($params); + $defaults = array('app' => 'app', 'root' => dirname(dirname(dirname(__FILE__))), 'working' => null, 'webroot' => 'webroot'); + $params = array_merge($defaults, array_intersect_key($this->params, $defaults)); + $isWin = false; + foreach ($defaults as $default => $value) { + if (strpos($params[$default], '\\') !== false) { + $isWin = true; + break; + } + } + $params = str_replace('\\', '/', $params); + + if (!empty($params['working']) && (!isset($this->args[0]) || isset($this->args[0]) && $this->args[0]{0} !== '.')) { + if (empty($this->params['app']) && $params['working'] != $params['root']) { + $params['root'] = dirname($params['working']); + $params['app'] = basename($params['working']); + } else { + $params['root'] = $params['working']; + } + } + + if ($params['app'][0] == '/' || preg_match('/([a-z])(:)/i', $params['app'], $matches)) { + $params['root'] = dirname($params['app']); + } elseif (strpos($params['app'], '/')) { + $params['root'] .= '/' . dirname($params['app']); + } + + $params['app'] = basename($params['app']); + $params['working'] = rtrim($params['root'], '/') . '/' . $params['app']; + + if (!empty($matches[0]) || !empty($isWin)) { + $params = str_replace('/', '\\', $params); + } + + $this->params = array_merge($this->params, $params); + } + +/** + * Helper for recursively parsing params + * + * @return array params + * @access private + */ + function __parseParams($params) { + $count = count($params); + for ($i = 0; $i < $count; $i++) { + if (isset($params[$i])) { + if ($params[$i]{0} === '-') { + $key = substr($params[$i], 1); + $this->params[$key] = true; + unset($params[$i]); + if (isset($params[++$i])) { + if ($params[$i]{0} !== '-') { + $this->params[$key] = str_replace('"', '', $params[$i]); + unset($params[$i]); + } else { + $i--; + $this->__parseParams($params); + } + } + } else { + $this->args[] = $params[$i]; + unset($params[$i]); + } + + } + } + } + +/** + * Removes first argument and shifts other arguments up + * + * @return mixed Null if there are no arguments otherwise the shifted argument + * @access public + */ + function shiftArgs() { + return array_shift($this->args); + } + +/** + * Shows console help + * + * @access public + */ + function help() { + $this->clear(); + $this->stdout("\nWelcome to CakePHP v" . Configure::version() . " Console"); + $this->stdout("---------------------------------------------------------------"); + $this->stdout("Current Paths:"); + $this->stdout(" -app: ". $this->params['app']); + $this->stdout(" -working: " . rtrim($this->params['working'], DS)); + $this->stdout(" -root: " . rtrim($this->params['root'], DS)); + $this->stdout(" -core: " . rtrim(CORE_PATH, DS)); + $this->stdout(""); + $this->stdout("Changing Paths:"); + $this->stdout("your working path should be the same as your application path"); + $this->stdout("to change your path use the '-app' param."); + $this->stdout("Example: -app relative/path/to/myapp or -app /absolute/path/to/myapp"); + + $this->stdout("\nAvailable Shells:"); + $shellList = array(); + foreach ($this->shellPaths as $path) { + if (!is_dir($path)) { + continue; + } + $shells = App::objects('file', $path); + if (empty($shells)) { + continue; + } + if (preg_match('@plugins[\\\/]([^\\\/]*)@', $path, $matches)) { + $type = Inflector::camelize($matches[1]); + } elseif (preg_match('@([^\\\/]*)[\\\/]vendors[\\\/]@', $path, $matches)) { + $type = $matches[1]; + } elseif (strpos($path, CAKE_CORE_INCLUDE_PATH . DS . 'cake') === 0) { + $type = 'CORE'; + } else { + $type = 'app'; + } + foreach ($shells as $shell) { + if ($shell !== 'shell.php') { + $shell = str_replace('.php', '', $shell); + $shellList[$shell][$type] = $type; + } + } + } + if ($shellList) { + ksort($shellList); + if (DS === '/') { + $width = exec('tput cols') - 2; + } + if (empty($width)) { + $width = 80; + } + $columns = max(1, floor($width / 30)); + $rows = ceil(count($shellList) / $columns); + + foreach ($shellList as $shell => $types) { + sort($types); + $shellList[$shell] = str_pad($shell . ' [' . implode ($types, ', ') . ']', $width / $columns); + } + $out = array_chunk($shellList, $rows); + for ($i = 0; $i < $rows; $i++) { + $row = ''; + for ($j = 0; $j < $columns; $j++) { + if (!isset($out[$j][$i])) { + continue; + } + $row .= $out[$j][$i]; + } + $this->stdout(" " . $row); + } + } + $this->stdout("\nTo run a command, type 'cake shell_name [args]'"); + $this->stdout("To get help on a specific command, type 'cake shell_name help'"); + } + +/** + * Stop execution of the current script + * + * @param $status see http://php.net/exit for values + * @return void + * @access protected + */ + function _stop($status = 0) { + exit($status); + } +} +if (!defined('DISABLE_AUTO_DISPATCH')) { + $dispatcher = new ShellDispatcher($argv); +} diff --git a/cake/console/error.php b/cake/console/error.php new file mode 100644 index 0000000..5494efc --- /dev/null +++ b/cake/console/error.php @@ -0,0 +1,265 @@ +stdout = fopen('php://stdout', 'w'); + $this->stderr = fopen('php://stderr', 'w'); + call_user_func_array(array(&$this, $method), $messages); + } + +/** + * Displays an error page (e.g. 404 Not found). + * + * @param array $params Parameters (code, name, and message) + * @access public + */ + function error($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr($code . $name . $message."\n"); + $this->_stop(); + } + +/** + * Convenience method to display a 404 page. + * + * @param array $params Parameters (url, message) + * @access public + */ + function error404($params) { + extract($params, EXTR_OVERWRITE); + $this->error(array( + 'code' => '404', + 'name' => 'Not found', + 'message' => sprintf(__("The requested address %s was not found on this server.", true), $url, $message) + )); + $this->_stop(); + } + +/** + * Renders the Missing Controller web page. + * + * @param array $params Parameters (className) + * @access public + */ + function missingController($params) { + extract($params, EXTR_OVERWRITE); + $controllerName = str_replace('Controller', '', $className); + $this->stderr(sprintf(__("Missing Controller '%s'", true), $controllerName)); + $this->_stop(); + } + +/** + * Renders the Missing Action web page. + * + * @param array $params Parameters (action, className) + * @access public + */ + function missingAction($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Method '%s' in '%s'", true), $action, $className)); + $this->_stop(); + } + +/** + * Renders the Private Action web page. + * + * @param array $params Parameters (action, className) + * @access public + */ + function privateAction($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Trying to access private method '%s' in '%s'", true), $action, $className)); + $this->_stop(); + } + +/** + * Renders the Missing Table web page. + * + * @param array $params Parameters (table, className) + * @access public + */ + function missingTable($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing database table '%s' for model '%s'", true), $table, $className)); + $this->_stop(); + } + +/** + * Renders the Missing Database web page. + * + * @param array $params Parameters + * @access public + */ + function missingDatabase($params = array()) { + $this->stderr(__("Missing Database", true)); + $this->_stop(); + } + +/** + * Renders the Missing View web page. + * + * @param array $params Parameters (file, action, className) + * @access public + */ + function missingView($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing View '%s' for '%s' in '%s'", true), $file, $action, $className)); + $this->_stop(); + } + +/** + * Renders the Missing Layout web page. + * + * @param array $params Parameters (file) + * @access public + */ + function missingLayout($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Layout '%s'", true), $file)); + $this->_stop(); + } + +/** + * Renders the Database Connection web page. + * + * @param array $params Parameters + * @access public + */ + function missingConnection($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(__("Missing Database Connection. Try 'cake bake'", true)); + $this->_stop(); + } + +/** + * Renders the Missing Helper file web page. + * + * @param array $params Parameters (file, helper) + * @access public + */ + function missingHelperFile($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Helper file '%s' for '%s'", true), $file, Inflector::camelize($helper))); + $this->_stop(); + } + +/** + * Renders the Missing Helper class web page. + * + * @param array $params Parameters (file, helper) + * @access public + */ + function missingHelperClass($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Helper class '%s' in '%s'", true), Inflector::camelize($helper), $file)); + $this->_stop(); + } + +/** + * Renders the Missing Component file web page. + * + * @param array $params Parameters (file, component) + * @access public + */ + function missingComponentFile($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Component file '%s' for '%s'", true), $file, Inflector::camelize($component))); + $this->_stop(); + } + +/** + * Renders the Missing Component class web page. + * + * @param array $params Parameters (file, component) + * @access public + */ + function missingComponentClass($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Component class '%s' in '%s'", true), Inflector::camelize($component), $file)); + $this->_stop(); + } + +/** + * Renders the Missing Model class web page. + * + * @param array $params Parameters (className) + * @access public + */ + function missingModel($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing model '%s'", true), $className)); + $this->_stop(); + } + +/** + * Outputs to the stdout filehandle. + * + * @param string $string String to output. + * @param boolean $newline If true, the outputs gets an added newline. + * @access public + */ + function stdout($string, $newline = true) { + if ($newline) { + fwrite($this->stdout, $string . "\n"); + } else { + fwrite($this->stdout, $string); + } + } + +/** + * Outputs to the stderr filehandle. + * + * @param string $string Error text to output. + * @access public + */ + function stderr($string) { + fwrite($this->stderr, "Error: ". $string . "\n"); + } +} diff --git a/cake/console/libs/acl.php b/cake/console/libs/acl.php new file mode 100644 index 0000000..5ef2c73 --- /dev/null +++ b/cake/console/libs/acl.php @@ -0,0 +1,601 @@ +params['connection'])) { + $this->connection = $this->params['connection']; + } + + if (!in_array(Configure::read('Acl.classname'), array('DbAcl', 'DB_ACL'))) { + $out = "--------------------------------------------------\n"; + $out .= __("Error: Your current Cake configuration is set to", true) . "\n"; + $out .= __("an ACL implementation other than DB. Please change", true) . "\n"; + $out .= __("your core config to reflect your decision to use", true) . "\n"; + $out .= __("DbAcl before attempting to use this script", true) . ".\n"; + $out .= "--------------------------------------------------\n"; + $out .= sprintf(__("Current ACL Classname: %s", true), Configure::read('Acl.classname')) . "\n"; + $out .= "--------------------------------------------------\n"; + $this->err($out); + $this->_stop(); + } + + if ($this->command && !in_array($this->command, array('help'))) { + if (!config('database')) { + $this->out(__("Your database configuration was not found. Take a moment to create one.", true), true); + $this->args = null; + return $this->DbConfig->execute(); + } + require_once (CONFIGS.'database.php'); + + if (!in_array($this->command, array('initdb'))) { + $this->Acl =& new AclComponent(); + $controller = null; + $this->Acl->startup($controller); + } + } + } + +/** + * Override main() for help message hook + * + * @access public + */ + function main() { + $out = __("Available ACL commands:", true) . "\n"; + $out .= "\t - create\n"; + $out .= "\t - delete\n"; + $out .= "\t - setParent\n"; + $out .= "\t - getPath\n"; + $out .= "\t - check\n"; + $out .= "\t - grant\n"; + $out .= "\t - deny\n"; + $out .= "\t - inherit\n"; + $out .= "\t - view\n"; + $out .= "\t - initdb\n"; + $out .= "\t - help\n\n"; + $out .= __("For help, run the 'help' command. For help on a specific command, run 'help '", true); + $this->out($out); + } + +/** + * Creates an ARO/ACO node + * + * @access public + */ + function create() { + $this->_checkArgs(3, 'create'); + $this->checkNodeType(); + extract($this->__dataVars()); + + $class = ucfirst($this->args[0]); + $parent = $this->parseIdentifier($this->args[1]); + + if (!empty($parent) && $parent != '/' && $parent != 'root') { + $parent = $this->_getNodeId($class, $parent); + } else { + $parent = null; + } + + $data = $this->parseIdentifier($this->args[2]); + if (is_string($data) && $data != '/') { + $data = array('alias' => $data); + } elseif (is_string($data)) { + $this->error(__('/ can not be used as an alias!', true), __("\t/ is the root, please supply a sub alias", true)); + } + + $data['parent_id'] = $parent; + $this->Acl->{$class}->create(); + if ($this->Acl->{$class}->save($data)) { + $this->out(sprintf(__("New %s '%s' created.\n", true), $class, $this->args[2]), true); + } else { + $this->err(sprintf(__("There was a problem creating a new %s '%s'.", true), $class, $this->args[2])); + } + } + +/** + * Delete an ARO/ACO node. + * + * @access public + */ + function delete() { + $this->_checkArgs(2, 'delete'); + $this->checkNodeType(); + extract($this->__dataVars()); + + $identifier = $this->parseIdentifier($this->args[1]); + $nodeId = $this->_getNodeId($class, $identifier); + + if (!$this->Acl->{$class}->delete($nodeId)) { + $this->error(__("Node Not Deleted", true), sprintf(__("There was an error deleting the %s. Check that the node exists", true), $class) . ".\n"); + } + $this->out(sprintf(__("%s deleted", true), $class) . ".\n", true); + } + +/** + * Set parent for an ARO/ACO node. + * + * @access public + */ + function setParent() { + $this->_checkArgs(3, 'setParent'); + $this->checkNodeType(); + extract($this->__dataVars()); + $target = $this->parseIdentifier($this->args[1]); + $parent = $this->parseIdentifier($this->args[2]); + + $data = array( + $class => array( + 'id' => $this->_getNodeId($class, $target), + 'parent_id' => $this->_getNodeId($class, $parent) + ) + ); + $this->Acl->{$class}->create(); + if (!$this->Acl->{$class}->save($data)) { + $this->out(__("Error in setting new parent. Please make sure the parent node exists, and is not a descendant of the node specified.", true), true); + } else { + $this->out(sprintf(__("Node parent set to %s", true), $this->args[2]) . "\n", true); + } + } + +/** + * Get path to specified ARO/ACO node. + * + * @access public + */ + function getPath() { + $this->_checkArgs(2, 'getPath'); + $this->checkNodeType(); + extract($this->__dataVars()); + $identifier = $this->parseIdentifier($this->args[1]); + + $id = $this->_getNodeId($class, $identifier); + $nodes = $this->Acl->{$class}->getPath($id); + + if (empty($nodes)) { + $this->error( + sprintf(__("Supplied Node '%s' not found", true), $this->args[1]), + __("No tree returned.", true) + ); + } + $this->out(__('Path:', true)); + $this->hr(); + for ($i = 0; $i < count($nodes); $i++) { + $this->_outputNode($class, $nodes[$i], $i); + } + } + +/** + * Outputs a single node, Either using the alias or Model.key + * + * @param string $class Class name that is being used. + * @param array $node Array of node information. + * @param integer $indent indent level. + * @return void + * @access protected + */ + function _outputNode($class, $node, $indent) { + $indent = str_repeat(' ', $indent); + $data = $node[$class]; + if ($data['alias']) { + $this->out($indent . "[" . $data['id'] . "] " . $data['alias']); + } else { + $this->out($indent . "[" . $data['id'] . "] " . $data['model'] . '.' . $data['foreign_key']); + } + } + +/** + * Check permission for a given ARO to a given ACO. + * + * @access public + */ + function check() { + $this->_checkArgs(3, 'check'); + extract($this->__getParams()); + + if ($this->Acl->check($aro, $aco, $action)) { + $this->out(sprintf(__("%s is allowed.", true), $aroName), true); + } else { + $this->out(sprintf(__("%s is not allowed.", true), $aroName), true); + } + } + +/** + * Grant permission for a given ARO to a given ACO. + * + * @access public + */ + function grant() { + $this->_checkArgs(3, 'grant'); + extract($this->__getParams()); + + if ($this->Acl->allow($aro, $aco, $action)) { + $this->out(__("Permission granted.", true), true); + } else { + $this->out(__("Permission was not granted.", true), true); + } + } + +/** + * Deny access for an ARO to an ACO. + * + * @access public + */ + function deny() { + $this->_checkArgs(3, 'deny'); + extract($this->__getParams()); + + if ($this->Acl->deny($aro, $aco, $action)) { + $this->out(__("Permission denied.", true), true); + } else { + $this->out(__("Permission was not denied.", true), true); + } + } + +/** + * Set an ARO to inhermit permission to an ACO. + * + * @access public + */ + function inherit() { + $this->_checkArgs(3, 'inherit'); + extract($this->__getParams()); + + if ($this->Acl->inherit($aro, $aco, $action)) { + $this->out(__("Permission inherited.", true), true); + } else { + $this->out(__("Permission was not inherited.", true), true); + } + } + +/** + * Show a specific ARO/ACO node. + * + * @access public + */ + function view() { + $this->_checkArgs(1, 'view'); + $this->checkNodeType(); + extract($this->__dataVars()); + + if (isset($this->args[1])) { + $identity = $this->parseIdentifier($this->args[1]); + + $topNode = $this->Acl->{$class}->find('first', array( + 'conditions' => array($class . '.id' => $this->_getNodeId($class, $identity)) + )); + + $nodes = $this->Acl->{$class}->find('all', array( + 'conditions' => array( + $class . '.lft >=' => $topNode[$class]['lft'], + $class . '.lft <=' => $topNode[$class]['rght'] + ), + 'order' => $class . '.lft ASC' + )); + } else { + $nodes = $this->Acl->{$class}->find('all', array('order' => $class . '.lft ASC')); + } + + if (empty($nodes)) { + if (isset($this->args[1])) { + $this->error(sprintf(__("%s not found", true), $this->args[1]), __("No tree returned.", true)); + } elseif (isset($this->args[0])) { + $this->error(sprintf(__("%s not found", true), $this->args[0]), __("No tree returned.", true)); + } + } + $this->out($class . " tree:"); + $this->hr(); + + $stack = array(); + $last = null; + + foreach ($nodes as $n) { + $stack[] = $n; + if (!empty($last)) { + $end = end($stack); + if ($end[$class]['rght'] > $last) { + foreach ($stack as $k => $v) { + $end = end($stack); + if ($v[$class]['rght'] < $end[$class]['rght']) { + unset($stack[$k]); + } + } + } + } + $last = $n[$class]['rght']; + $count = count($stack); + + $this->_outputNode($class, $n, $count); + } + $this->hr(); + } + +/** + * Initialize ACL database. + * + * @access public + */ + function initdb() { + $this->Dispatch->args = array('schema', 'create', 'DbAcl'); + $this->Dispatch->dispatch(); + } + +/** + * Show help screen. + * + * @access public + */ + function help() { + $head = "-----------------------------------------------\n"; + $head .= __("Usage: cake acl ...", true) . "\n"; + $head .= "-----------------------------------------------\n"; + $head .= __("Commands:", true) . "\n"; + + $commands = array( + 'create' => "create aro|aco \n" . + "\t" . __("Creates a new ACL object under the parent", true) . "\n" . + "\t" . __("specified by , an id/alias.", true) . "\n" . + "\t" . __("The and references can be", true) . "\n" . + "\t" . __("in one of the following formats:", true) . "\n\n" . + "\t\t- " . __(". - The node will be bound to a", true) . "\n" . + "\t\t" . __("specific record of the given model.", true) . "\n\n" . + "\t\t- " . __(" - The node will be given a string alias,", true) . "\n" . + "\t\t" . __(" (or path, in the case of )", true) . "\n" . + "\t\t " . __("i.e. 'John'. When used with ,", true) . "\n" . + "\t\t" . __("this takes the form of an alias path,", true) . "\n" . + "\t\t " . __("i.e. //.", true) . "\n\n" . + "\t" . __("To add a node at the root level,", true) . "\n" . + "\t" . __("enter 'root' or '/' as the parameter.", true) . "\n", + + 'delete' => "delete aro|aco \n" . + "\t" . __("Deletes the ACL object with the given reference", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'setparent' => "setParent aro|aco \n" . + "\t" . __("Moves the ACL object specified by beneath", true) . "\n" . + "\t" . __("the parent ACL object specified by .", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'getpath' => "getPath aro|aco \n" . + "\t" . __("Returns the path to the ACL object specified by . This command", true) . "\n" . + "\t" . __("is useful in determining the inhertiance of permissions for a certain", true) . "\n" . + "\t" . __("object in the tree.", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'check' => "check [] " . __("or", true) . " all\n" . + "\t" . __("Use this command to check ACL permissions.", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'grant' => "grant [] " . __("or", true) . " all\n" . + "\t" . __("Use this command to grant ACL permissions. Once executed, the ARO", true) . "\n" . + "\t" . __("specified (and its children, if any) will have ALLOW access to the", true) . "\n" . + "\t" . __("specified ACO action (and the ACO's children, if any).", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'deny' => "deny []" . __("or", true) . " all\n" . + "\t" . __("Use this command to deny ACL permissions. Once executed, the ARO", true) . "\n" . + "\t" . __("specified (and its children, if any) will have DENY access to the", true) . "\n" . + "\t" . __("specified ACO action (and the ACO's children, if any).", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'inherit' => "inherit []" . __("or", true) . " all\n" . + "\t" . __("Use this command to force a child ARO object to inherit its", true) . "\n" . + "\t" . __("permissions settings from its parent.", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'view' => "view aro|aco []\n" . + "\t" . __("The view command will return the ARO or ACO tree.", true) . "\n" . + "\t" . __("The optional node parameter allows you to return", true) . "\n" . + "\t" . __("only a portion of the requested tree.", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'initdb' => "initdb\n". + "\t" . __("Uses this command : cake schema run create DbAcl", true), + + 'help' => "help []\n" . + "\t" . __("Displays this help message, or a message on a specific command.", true) + ); + + $this->out($head); + if (!isset($this->args[0])) { + foreach ($commands as $cmd) { + $this->out("{$cmd}\n\n"); + } + } elseif (isset($commands[strtolower($this->args[0])])) { + $this->out($commands[strtolower($this->args[0])] . "\n\n"); + } else { + $this->out(sprintf(__("Command '%s' not found", true), $this->args[0])); + } + } + +/** + * Check that first argument specifies a valid Node type (ARO/ACO) + * + * @access public + */ + function checkNodeType() { + if (!isset($this->args[0])) { + return false; + } + if ($this->args[0] != 'aco' && $this->args[0] != 'aro') { + $this->error(sprintf(__("Missing/Unknown node type: '%s'", true), $this->args[0]), __('Please specify which ACL object type you wish to create. Either "aro" or "aco"', true)); + } + } + +/** + * Checks that given node exists + * + * @param string $type Node type (ARO/ACO) + * @param integer $id Node id + * @return boolean Success + * @access public + */ + function nodeExists() { + if (!$this->checkNodeType() && !isset($this->args[1])) { + return false; + } + extract($this->__dataVars($this->args[0])); + $key = is_numeric($this->args[1]) ? $secondary_id : 'alias'; + $conditions = array($class . '.' . $key => $this->args[1]); + $possibility = $this->Acl->{$class}->find('all', compact('conditions')); + if (empty($possibility)) { + $this->error(sprintf(__("%s not found", true), $this->args[1]), __("No tree returned.", true)); + } + return $possibility; + } + +/** + * Parse an identifier into Model.foriegnKey or an alias. + * Takes an identifier determines its type and returns the result as used by other methods. + * + * @param string $identifier Identifier to parse + * @return mixed a string for aliases, and an array for model.foreignKey + */ + function parseIdentifier($identifier) { + if (preg_match('/^([\w]+)\.(.*)$/', $identifier, $matches)) { + return array( + 'model' => $matches[1], + 'foreign_key' => $matches[2], + ); + } + return $identifier; + } + +/** + * Get the node for a given identifier. $identifier can either be a string alias + * or an array of properties to use in AcoNode::node() + * + * @param string $class Class type you want (Aro/Aco) + * @param mixed $identifier A mixed identifier for finding the node. + * @return int Integer of NodeId. Will trigger an error if nothing is found. + */ + function _getNodeId($class, $identifier) { + $node = $this->Acl->{$class}->node($identifier); + if (empty($node)) { + if (is_array($identifier)) { + $identifier = var_export($identifier, true); + } + $this->error(sprintf(__('Could not find node using reference "%s"', true), $identifier)); + } + return Set::extract($node, "0.{$class}.id"); + } + +/** + * get params for standard Acl methods + * + * @return array aro, aco, action + * @access private + */ + function __getParams() { + $aro = is_numeric($this->args[0]) ? intval($this->args[0]) : $this->args[0]; + $aco = is_numeric($this->args[1]) ? intval($this->args[1]) : $this->args[1]; + $aroName = $aro; + $acoName = $aco; + + if (is_string($aro)) { + $aro = $this->parseIdentifier($aro); + } + if (is_string($aco)) { + $aco = $this->parseIdentifier($aco); + } + $action = null; + if (isset($this->args[2])) { + $action = $this->args[2]; + if ($action == '' || $action == 'all') { + $action = '*'; + } + } + return compact('aro', 'aco', 'action', 'aroName', 'acoName'); + } + +/** + * Build data parameters based on node type + * + * @param string $type Node type (ARO/ACO) + * @return array Variables + * @access private + */ + function __dataVars($type = null) { + if ($type == null) { + $type = $this->args[0]; + } + $vars = array(); + $class = ucwords($type); + $vars['secondary_id'] = (strtolower($class) == 'aro') ? 'foreign_key' : 'object_id'; + $vars['data_name'] = $type; + $vars['table_name'] = $type . 's'; + $vars['class'] = $class; + return $vars; + } +} diff --git a/cake/console/libs/api.php b/cake/console/libs/api.php new file mode 100644 index 0000000..0b2c005 --- /dev/null +++ b/cake/console/libs/api.php @@ -0,0 +1,213 @@ +paths = array_merge($this->paths, array( + 'behavior' => LIBS . 'model' . DS . 'behaviors' . DS, + 'cache' => LIBS . 'cache' . DS, + 'controller' => LIBS . 'controller' . DS, + 'component' => LIBS . 'controller' . DS . 'components' . DS, + 'helper' => LIBS . 'view' . DS . 'helpers' . DS, + 'model' => LIBS . 'model' . DS, + 'view' => LIBS . 'view' . DS, + 'core' => LIBS + )); + } + +/** + * Override main() to handle action + * + * @access public + */ + function main() { + if (empty($this->args)) { + return $this->help(); + } + + $type = strtolower($this->args[0]); + + if (isset($this->paths[$type])) { + $path = $this->paths[$type]; + } else { + $path = $this->paths['core']; + } + + if (count($this->args) == 1) { + $file = $type; + $class = Inflector::camelize($type); + } elseif (count($this->args) > 1) { + $file = Inflector::underscore($this->args[1]); + $class = Inflector::camelize($file); + } + + $objects = App::objects('class', $path); + if (in_array($class, $objects)) { + if (in_array($type, array('behavior', 'component', 'helper')) && $type !== $file) { + if (!preg_match('/' . Inflector::camelize($type) . '$/', $class)) { + $class .= Inflector::camelize($type); + } + } + + } else { + $this->err(sprintf(__("%s not found", true), $class)); + $this->_stop(); + } + + $parsed = $this->__parseClass($path . $file .'.php'); + + if (!empty($parsed)) { + if (isset($this->params['m'])) { + if (!isset($parsed[$this->params['m']])) { + $this->err(sprintf(__("%s::%s() could not be found", true), $class, $this->params['m'])); + $this->_stop(); + } + $method = $parsed[$this->params['m']]; + $this->out($class .'::'.$method['method'] . $method['parameters']); + $this->hr(); + $this->out($method['comment'], true); + } else { + $this->out(ucwords($class)); + $this->hr(); + $i = 0; + foreach ($parsed as $method) { + $list[] = ++$i . ". " . $method['method'] . $method['parameters']; + } + $this->out($list); + + $methods = array_keys($parsed); + while ($number = strtolower($this->in(__('Select a number to see the more information about a specific method. q to quit. l to list.', true), null, 'q'))) { + if ($number === 'q') { + $this->out(__('Done', true)); + $this->_stop(); + } + + if ($number === 'l') { + $this->out($list); + } + + if (isset($methods[--$number])) { + $method = $parsed[$methods[$number]]; + $this->hr(); + $this->out($class .'::'.$method['method'] . $method['parameters']); + $this->hr(); + $this->out($method['comment'], true); + } + } + } + } + } + +/** + * Show help for this shell. + * + * @access public + */ + function help() { + $head = "Usage: cake api [] [-m ]\n"; + $head .= "-----------------------------------------------\n"; + $head .= "Parameters:\n\n"; + + $commands = array( + 'path' => "\t\n" . + "\t\tEither a full path or type of class (model, behavior, controller, component, view, helper).\n". + "\t\tAvailable values:\n\n". + "\t\tbehavior\tLook for class in CakePHP behavior path\n". + "\t\tcache\tLook for class in CakePHP cache path\n". + "\t\tcontroller\tLook for class in CakePHP controller path\n". + "\t\tcomponent\tLook for class in CakePHP component path\n". + "\t\thelper\tLook for class in CakePHP helper path\n". + "\t\tmodel\tLook for class in CakePHP model path\n". + "\t\tview\tLook for class in CakePHP view path\n", + 'className' => "\t\n" . + "\t\tA CakePHP core class name (e.g: Component, HtmlHelper).\n" + ); + + $this->out($head); + if (!isset($this->args[1])) { + foreach ($commands as $cmd) { + $this->out("{$cmd}\n\n"); + } + } elseif (isset($commands[strtolower($this->args[1])])) { + $this->out($commands[strtolower($this->args[1])] . "\n\n"); + } else { + $this->out("Command '" . $this->args[1] . "' not found"); + } + } + +/** + * Parse a given class (located on given file) and get public methods and their + * signatures. + * + * @param object $File File object + * @param string $class Class name + * @return array Methods and signatures indexed by method name + * @access private + */ + function __parseClass($path) { + $parsed = array(); + + $File = new File($path); + if (!$File->exists()) { + $this->err(sprintf(__("%s could not be found", true), $File->name)); + $this->_stop(); + } + + $contents = $File->read(); + + if (preg_match_all('%(/\\*\\*[\\s\\S]*?\\*/)(\\s+function\\s+\\w+)(\\(.*\\))%', $contents, $result, PREG_PATTERN_ORDER)) { + foreach ($result[2] as $key => $method) { + $method = str_replace('function ', '', trim($method)); + + if (strpos($method, '__') === false && $method[0] != '_') { + $parsed[$method] = array( + 'comment' => str_replace(array('/*', '*/', '*'), '', trim($result[1][$key])), + 'method' => $method, + 'parameters' => trim($result[3][$key]) + ); + } + } + } + ksort($parsed); + return $parsed; + } +} diff --git a/cake/console/libs/bake.php b/cake/console/libs/bake.php new file mode 100644 index 0000000..8749572 --- /dev/null +++ b/cake/console/libs/bake.php @@ -0,0 +1,230 @@ +command); + if (isset($this->{$task}) && !in_array($task, array('Project', 'DbConfig'))) { + if (isset($this->params['connection'])) { + $this->{$task}->connection = $this->params['connection']; + } + foreach($this->args as $i => $arg) { + if (strpos($arg, '.')) { + list($this->params['plugin'], $this->args[$i]) = pluginSplit($arg); + break; + } + } + if (isset($this->params['plugin'])) { + $this->{$task}->plugin = $this->params['plugin']; + } + } + } + +/** + * Override main() to handle action + * + * @access public + */ + function main() { + if (!is_dir($this->DbConfig->path)) { + if ($this->Project->execute()) { + $this->DbConfig->path = $this->params['working'] . DS . 'config' . DS; + } else { + return false; + } + } + + if (!config('database')) { + $this->out(__("Your database configuration was not found. Take a moment to create one.", true)); + $this->args = null; + return $this->DbConfig->execute(); + } + $this->out('Interactive Bake Shell'); + $this->hr(); + $this->out('[D]atabase Configuration'); + $this->out('[M]odel'); + $this->out('[V]iew'); + $this->out('[C]ontroller'); + $this->out('[P]roject'); + $this->out('[F]ixture'); + $this->out('[T]est case'); + $this->out('[Q]uit'); + + $classToBake = strtoupper($this->in(__('What would you like to Bake?', true), array('D', 'M', 'V', 'C', 'P', 'F', 'T', 'Q'))); + switch ($classToBake) { + case 'D': + $this->DbConfig->execute(); + break; + case 'M': + $this->Model->execute(); + break; + case 'V': + $this->View->execute(); + break; + case 'C': + $this->Controller->execute(); + break; + case 'P': + $this->Project->execute(); + break; + case 'F': + $this->Fixture->execute(); + break; + case 'T': + $this->Test->execute(); + break; + case 'Q': + exit(0); + break; + default: + $this->out(__('You have made an invalid selection. Please choose a type of class to Bake by entering D, M, V, F, T, or C.', true)); + } + $this->hr(); + $this->main(); + } + +/** + * Quickly bake the MVC + * + * @access public + */ + function all() { + $this->hr(); + $this->out('Bake All'); + $this->hr(); + + if (!isset($this->params['connection']) && empty($this->connection)) { + $this->connection = $this->DbConfig->getConfig(); + } + + if (empty($this->args)) { + $this->Model->interactive = true; + $name = $this->Model->getName($this->connection); + } + + foreach (array('Model', 'Controller', 'View') as $task) { + $this->{$task}->connection = $this->connection; + $this->{$task}->interactive = false; + } + + if (!empty($this->args[0])) { + $name = $this->args[0]; + } + + $modelExists = false; + $model = $this->_modelName($name); + if (App::import('Model', $model)) { + $object = new $model(); + $modelExists = true; + } else { + App::import('Model', 'Model', false); + $object = new Model(array('name' => $name, 'ds' => $this->connection)); + } + + $modelBaked = $this->Model->bake($object, false); + + if ($modelBaked && $modelExists === false) { + $this->out(sprintf(__('%s Model was baked.', true), $model)); + if ($this->_checkUnitTest()) { + $this->Model->bakeFixture($model); + $this->Model->bakeTest($model); + } + $modelExists = true; + } + + if ($modelExists === true) { + $controller = $this->_controllerName($name); + if ($this->Controller->bake($controller, $this->Controller->bakeActions($controller))) { + $this->out(sprintf(__('%s Controller was baked.', true), $name)); + if ($this->_checkUnitTest()) { + $this->Controller->bakeTest($controller); + } + } + if (App::import('Controller', $controller)) { + $this->View->args = array($controller); + $this->View->execute(); + $this->out(sprintf(__('%s Views were baked.', true), $name)); + } + $this->out(__('Bake All complete', true)); + array_shift($this->args); + } else { + $this->err(__('Bake All could not continue without a valid model', true)); + } + $this->_stop(); + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $this->out('CakePHP Bake:'); + $this->hr(); + $this->out('The Bake script generates controllers, views and models for your application.'); + $this->out('If run with no command line arguments, Bake guides the user through the class'); + $this->out('creation process. You can customize the generation process by telling Bake'); + $this->out('where different parts of your application are using command line arguments.'); + $this->hr(); + $this->out("Usage: cake bake ..."); + $this->hr(); + $this->out('Params:'); + $this->out("\t-app Absolute/Relative path to your app folder.\n"); + $this->out('Commands:'); + $this->out("\n\tbake help\n\t\tshows this help message."); + $this->out("\n\tbake all \n\t\tbakes complete MVC. optional of a Model"); + $this->out("\n\tbake project \n\t\tbakes a new app folder in the path supplied\n\t\tor in current directory if no path is specified"); + $this->out("\n\tbake plugin \n\t\tbakes a new plugin folder in the path supplied\n\t\tor in current directory if no path is specified."); + $this->out("\n\tbake db_config\n\t\tbakes a database.php file in config directory."); + $this->out("\n\tbake model\n\t\tbakes a model. run 'bake model help' for more info"); + $this->out("\n\tbake view\n\t\tbakes views. run 'bake view help' for more info"); + $this->out("\n\tbake controller\n\t\tbakes a controller. run 'bake controller help' for more info"); + $this->out("\n\tbake fixture\n\t\tbakes fixtures. run 'bake fixture help' for more info."); + $this->out("\n\tbake test\n\t\tbakes unit tests. run 'bake test help' for more info."); + $this->out(); + + } +} diff --git a/cake/console/libs/console.php b/cake/console/libs/console.php new file mode 100644 index 0000000..ac7b595 --- /dev/null +++ b/cake/console/libs/console.php @@ -0,0 +1,361 @@ +Dispatcher = new Dispatcher(); + $this->models = App::objects('model'); + App::import('Model', $this->models); + + foreach ($this->models as $model) { + $class = Inflector::camelize(str_replace('.php', '', $model)); + $this->models[$model] = $class; + $this->{$class} =& new $class(); + } + $this->out('Model classes:'); + $this->out('--------------'); + + foreach ($this->models as $model) { + $this->out(" - {$model}"); + } + $this->_loadRoutes(); + } + +/** + * Prints the help message + * + * @access public + */ + function help() { + $out = 'Console help:'; + $out .= '-------------'; + $out .= 'The interactive console is a tool for testing parts of your app before you'; + $out .= 'write code.'; + $out .= "\n"; + $out .= 'Model testing:'; + $out .= 'To test model results, use the name of your model without a leading $'; + $out .= 'e.g. Foo->find("all")'; + $out .= "\n"; + $out .= 'To dynamically set associations, you can do the following:'; + $out .= "\tModelA bind ModelB"; + $out .= "where the supported assocations are hasOne, hasMany, belongsTo, hasAndBelongsToMany"; + $out .= "\n"; + $out .= 'To dynamically remove associations, you can do the following:'; + $out .= "\t ModelA unbind ModelB"; + $out .= "where the supported associations are the same as above"; + $out .= "\n"; + $out .= "To save a new field in a model, you can do the following:"; + $out .= "\tModelA->save(array('foo' => 'bar', 'baz' => 0))"; + $out .= "where you are passing a hash of data to be saved in the format"; + $out .= "of field => value pairs"; + $out .= "\n"; + $out .= "To get column information for a model, use the following:"; + $out .= "\tModelA columns"; + $out .= "which returns a list of columns and their type"; + $out .= "\n"; + $out .= "\n"; + $out .= 'Route testing:'; + $out .= "\n"; + $out .= 'To test URLs against your app\'s route configuration, type:'; + $out .= "\n"; + $out .= "\tRoute "; + $out .= "\n"; + $out .= "where url is the path to your your action plus any query parameters,"; + $out .= "minus the application's base path. For example:"; + $out .= "\n"; + $out .= "\tRoute /posts/view/1"; + $out .= "\n"; + $out .= "will return something like the following:"; + $out .= "\n"; + $out .= "\tarray ("; + $out .= "\t [...]"; + $out .= "\t 'controller' => 'posts',"; + $out .= "\t 'action' => 'view',"; + $out .= "\t [...]"; + $out .= "\t)"; + $out .= "\n"; + $out .= 'Alternatively, you can use simple array syntax to test reverse'; + $out .= 'To reload your routes config (config/routes.php), do the following:'; + $out .= "\n"; + $out .= "\tRoutes reload"; + $out .= "\n"; + $out .= 'To show all connected routes, do the following:'; + $out .= "\tRoutes show"; + $this->out($out); + } + +/** + * Override main() to handle action + * + * @access public + */ + function main($command = null) { + while (true) { + if (empty($command)) { + $command = trim($this->in('')); + } + + switch ($command) { + case 'help': + $this->help(); + break; + case 'quit': + case 'exit': + return true; + break; + case 'models': + $this->out('Model classes:'); + $this->hr(); + foreach ($this->models as $model) { + $this->out(" - {$model}"); + } + break; + case (preg_match("/^(\w+) bind (\w+) (\w+)/", $command, $tmp) == true): + foreach ($tmp as $data) { + $data = strip_tags($data); + $data = str_replace($this->badCommandChars, "", $data); + } + + $modelA = $tmp[1]; + $association = $tmp[2]; + $modelB = $tmp[3]; + + if ($this->_isValidModel($modelA) && $this->_isValidModel($modelB) && in_array($association, $this->associations)) { + $this->{$modelA}->bindModel(array($association => array($modelB => array('className' => $modelB))), false); + $this->out("Created $association association between $modelA and $modelB"); + } else { + $this->out("Please verify you are using valid models and association types"); + } + break; + case (preg_match("/^(\w+) unbind (\w+) (\w+)/", $command, $tmp) == true): + foreach ($tmp as $data) { + $data = strip_tags($data); + $data = str_replace($this->badCommandChars, "", $data); + } + + $modelA = $tmp[1]; + $association = $tmp[2]; + $modelB = $tmp[3]; + + // Verify that there is actually an association to unbind + $currentAssociations = $this->{$modelA}->getAssociated(); + $validCurrentAssociation = false; + + foreach ($currentAssociations as $model => $currentAssociation) { + if ($model == $modelB && $association == $currentAssociation) { + $validCurrentAssociation = true; + } + } + + if ($this->_isValidModel($modelA) && $this->_isValidModel($modelB) && in_array($association, $this->associations) && $validCurrentAssociation) { + $this->{$modelA}->unbindModel(array($association => array($modelB))); + $this->out("Removed $association association between $modelA and $modelB"); + } else { + $this->out("Please verify you are using valid models, valid current association, and valid association types"); + } + break; + case (strpos($command, "->find") > 0): + // Remove any bad info + $command = strip_tags($command); + $command = str_replace($this->badCommandChars, "", $command); + + // Do we have a valid model? + list($modelToCheck, $tmp) = explode('->', $command); + + if ($this->_isValidModel($modelToCheck)) { + $findCommand = "\$data = \$this->$command;"; + @eval($findCommand); + + if (is_array($data)) { + foreach ($data as $idx => $results) { + if (is_numeric($idx)) { // findAll() output + foreach ($results as $modelName => $result) { + $this->out("$modelName"); + + foreach ($result as $field => $value) { + if (is_array($value)) { + foreach ($value as $field2 => $value2) { + $this->out("\t$field2: $value2"); + } + + $this->out(); + } else { + $this->out("\t$field: $value"); + } + } + } + } else { // find() output + $this->out($idx); + + foreach ($results as $field => $value) { + if (is_array($value)) { + foreach ($value as $field2 => $value2) { + $this->out("\t$field2: $value2"); + } + + $this->out(); + } else { + $this->out("\t$field: $value"); + } + } + } + } + } else { + $this->out("\nNo result set found"); + } + } else { + $this->out("$modelToCheck is not a valid model"); + } + + break; + case (strpos($command, '->save') > 0): + // Validate the model we're trying to save here + $command = strip_tags($command); + $command = str_replace($this->badCommandChars, "", $command); + list($modelToSave, $tmp) = explode("->", $command); + + if ($this->_isValidModel($modelToSave)) { + // Extract the array of data we are trying to build + list($foo, $data) = explode("->save", $command); + $data = preg_replace('/^\(*(array)?\(*(.+?)\)*$/i', '\\2', $data); + $saveCommand = "\$this->{$modelToSave}->save(array('{$modelToSave}' => array({$data})));"; + @eval($saveCommand); + $this->out('Saved record for ' . $modelToSave); + } + break; + case (preg_match("/^(\w+) columns/", $command, $tmp) == true): + $modelToCheck = strip_tags(str_replace($this->badCommandChars, "", $tmp[1])); + + if ($this->_isValidModel($modelToCheck)) { + // Get the column info for this model + $fieldsCommand = "\$data = \$this->{$modelToCheck}->getColumnTypes();"; + @eval($fieldsCommand); + + if (is_array($data)) { + foreach ($data as $field => $type) { + $this->out("\t{$field}: {$type}"); + } + } + } else { + $this->out("Please verify that you selected a valid model"); + } + break; + case (preg_match("/^routes\s+reload/i", $command, $tmp) == true): + $router =& Router::getInstance(); + if (!$this->_loadRoutes()) { + $this->out("There was an error loading the routes config. Please check that the file"); + $this->out("exists and is free of parse errors."); + break; + } + $this->out("Routes configuration reloaded, " . count($router->routes) . " routes connected"); + break; + case (preg_match("/^routes\s+show/i", $command, $tmp) == true): + $router =& Router::getInstance(); + $this->out(implode("\n", Set::extract($router->routes, '{n}.0'))); + break; + case (preg_match("/^route\s+(\(.*\))$/i", $command, $tmp) == true): + if ($url = eval('return array' . $tmp[1] . ';')) { + $this->out(Router::url($url)); + } + break; + case (preg_match("/^route\s+(.*)/i", $command, $tmp) == true): + $this->out(var_export(Router::parse($tmp[1]), true)); + break; + default: + $this->out("Invalid command\n"); + break; + } + $command = ''; + } + } + +/** + * Tells if the specified model is included in the list of available models + * + * @param string $modelToCheck + * @return boolean true if is an available model, false otherwise + * @access protected + */ + function _isValidModel($modelToCheck) { + return in_array($modelToCheck, $this->models); + } + +/** + * Reloads the routes configuration from config/routes.php, and compiles + * all routes found + * + * @return boolean True if config reload was a success, otherwise false + * @access protected + */ + function _loadRoutes() { + $router =& Router::getInstance(); + + $router->reload(); + extract($router->getNamedExpressions()); + + if (!@include(CONFIGS . 'routes.php')) { + return false; + } + $router->parse('/'); + + foreach (array_keys($router->getNamedExpressions()) as $var) { + unset(${$var}); + } + for ($i = 0, $len = count($router->routes); $i < $len; $i++) { + $router->routes[$i]->compile(); + } + return true; + } +} diff --git a/cake/console/libs/i18n.php b/cake/console/libs/i18n.php new file mode 100644 index 0000000..bdfa378 --- /dev/null +++ b/cake/console/libs/i18n.php @@ -0,0 +1,128 @@ +_welcome(); + if (isset($this->params['datasource'])) { + $this->dataSource = $this->params['datasource']; + } + + if ($this->command && !in_array($this->command, array('help'))) { + if (!config('database')) { + $this->out(__('Your database configuration was not found. Take a moment to create one.', true), true); + return $this->DbConfig->execute(); + } + } + } + +/** + * Override main() for help message hook + * + * @access public + */ + function main() { + $this->out(__('I18n Shell', true)); + $this->hr(); + $this->out(__('[E]xtract POT file from sources', true)); + $this->out(__('[I]nitialize i18n database table', true)); + $this->out(__('[H]elp', true)); + $this->out(__('[Q]uit', true)); + + $choice = strtolower($this->in(__('What would you like to do?', true), array('E', 'I', 'H', 'Q'))); + switch ($choice) { + case 'e': + $this->Extract->execute(); + break; + case 'i': + $this->initdb(); + break; + case 'h': + $this->help(); + break; + case 'q': + exit(0); + break; + default: + $this->out(__('You have made an invalid selection. Please choose a command to execute by entering E, I, H, or Q.', true)); + } + $this->hr(); + $this->main(); + } + +/** + * Initialize I18N database. + * + * @access public + */ + function initdb() { + $this->Dispatch->args = array('schema', 'create', 'i18n'); + $this->Dispatch->dispatch(); + } + +/** + * Show help screen. + * + * @access public + */ + function help() { + $this->hr(); + $this->out(__('I18n Shell:', true)); + $this->hr(); + $this->out(__('I18n Shell initializes i18n database table for your application', true)); + $this->out(__('and generates .pot file(s) with translations.', true)); + $this->hr(); + $this->out(__('usage:', true)); + $this->out(' cake i18n help'); + $this->out(' cake i18n initdb [-datasource custom]'); + $this->out(); + $this->hr(); + + $this->Extract->help(); + } +} diff --git a/cake/console/libs/schema.php b/cake/console/libs/schema.php new file mode 100644 index 0000000..889f854 --- /dev/null +++ b/cake/console/libs/schema.php @@ -0,0 +1,506 @@ +_welcome(); + $this->out('Cake Schema Shell'); + $this->hr(); + } + +/** + * Override startup + * + * @access public + */ + function startup() { + $name = $file = $path = $connection = $plugin = null; + if (!empty($this->params['name'])) { + $name = $this->params['name']; + } elseif (!empty($this->args[0])) { + $name = $this->params['name'] = $this->args[0]; + } + + if (strpos($name, '.')) { + list($this->params['plugin'], $splitName) = pluginSplit($name); + $name = $this->params['name'] = $splitName; + } + + if ($name) { + $this->params['file'] = Inflector::underscore($name); + } + + if (empty($this->params['file'])) { + $this->params['file'] = 'schema.php'; + } + if (strpos($this->params['file'], '.php') === false) { + $this->params['file'] .= '.php'; + } + $file = $this->params['file']; + + if (!empty($this->params['path'])) { + $path = $this->params['path']; + } + + if (!empty($this->params['connection'])) { + $connection = $this->params['connection']; + } + if (!empty($this->params['plugin'])) { + $plugin = $this->params['plugin']; + if (empty($name)) { + $name = $plugin; + } + } + $this->Schema =& new CakeSchema(compact('name', 'path', 'file', 'connection', 'plugin')); + } + +/** + * Override main + * + * @access public + */ + function main() { + $this->help(); + } + +/** + * Read and output contents of schema object + * path to read as second arg + * + * @access public + */ + function view() { + $File = new File($this->Schema->path . DS . $this->params['file']); + if ($File->exists()) { + $this->out($File->read()); + $this->_stop(); + } else { + $file = $this->Schema->path . DS . $this->params['file']; + $this->err(sprintf(__('Schema file (%s) could not be found.', true), $file)); + $this->_stop(); + } + } + +/** + * Read database and Write schema object + * accepts a connection as first arg or path to save as second arg + * + * @access public + */ + function generate() { + $this->out(__('Generating Schema...', true)); + $options = array(); + if (isset($this->params['f'])) { + $options = array('models' => false); + } + + $snapshot = false; + if (isset($this->args[0]) && $this->args[0] === 'snapshot') { + $snapshot = true; + } + + if (!$snapshot && file_exists($this->Schema->path . DS . $this->params['file'])) { + $snapshot = true; + $result = strtolower($this->in("Schema file exists.\n [O]verwrite\n [S]napshot\n [Q]uit\nWould you like to do?", array('o', 's', 'q'), 's')); + if ($result === 'q') { + return $this->_stop(); + } + if ($result === 'o') { + $snapshot = false; + } + } + + $content = $this->Schema->read($options); + $content['file'] = $this->params['file']; + + if ($snapshot === true) { + $Folder =& new Folder($this->Schema->path); + $result = $Folder->read(); + + $numToUse = false; + if (isset($this->params['s'])) { + $numToUse = $this->params['s']; + } + + $count = 1; + if (!empty($result[1])) { + foreach ($result[1] as $file) { + if (preg_match('/schema(?:[_\d]*)?\.php$/', $file)) { + $count++; + } + } + } + + if ($numToUse !== false) { + if ($numToUse > $count) { + $count = $numToUse; + } + } + + $fileName = rtrim($this->params['file'], '.php'); + $content['file'] = $fileName . '_' . $count . '.php'; + } + + if ($this->Schema->write($content)) { + $this->out(sprintf(__('Schema file: %s generated', true), $content['file'])); + $this->_stop(); + } else { + $this->err(__('Schema file: %s generated', true)); + $this->_stop(); + } + } + +/** + * Dump Schema object to sql file + * Use the `write` param to enable and control SQL file output location. + * Simply using -write will write the sql file to the same dir as the schema file. + * If -write contains a full path name the file will be saved there. If -write only + * contains no DS, that will be used as the file name, in the same dir as the schema file. + * + * @access public + */ + function dump() { + $write = false; + $Schema = $this->Schema->load(); + if (!$Schema) { + $this->err(__('Schema could not be loaded', true)); + $this->_stop(); + } + if (isset($this->params['write'])) { + if ($this->params['write'] == 1) { + $write = Inflector::underscore($this->Schema->name); + } else { + $write = $this->params['write']; + } + } + $db =& ConnectionManager::getDataSource($this->Schema->connection); + $contents = "#" . $Schema->name . " sql generated on: " . date('Y-m-d H:i:s') . " : " . time() . "\n\n"; + $contents .= $db->dropSchema($Schema) . "\n\n". $db->createSchema($Schema); + + if ($write) { + if (strpos($write, '.sql') === false) { + $write .= '.sql'; + } + if (strpos($write, DS) !== false) { + $File =& new File($write, true); + } else { + $File =& new File($this->Schema->path . DS . $write, true); + } + + if ($File->write($contents)) { + $this->out(sprintf(__('SQL dump file created in %s', true), $File->pwd())); + $this->_stop(); + } else { + $this->err(__('SQL dump could not be created', true)); + $this->_stop(); + } + } + $this->out($contents); + return $contents; + } + +/** + * Run database create commands. Alias for run create. + * + * @return void + */ + function create() { + list($Schema, $table) = $this->_loadSchema(); + $this->__create($Schema, $table); + } + +/** + * Run database create commands. Alias for run create. + * + * @return void + */ + function update() { + list($Schema, $table) = $this->_loadSchema(); + $this->__update($Schema, $table); + } + +/** + * Prepares the Schema objects for database operations. + * + * @return void + */ + function _loadSchema() { + $name = $plugin = null; + if (isset($this->params['name'])) { + $name = $this->params['name']; + } + if (isset($this->params['plugin'])) { + $plugin = $this->params['plugin']; + } + + if (isset($this->params['dry'])) { + $this->__dry = true; + $this->out(__('Performing a dry run.', true)); + } + + $options = array('name' => $name, 'plugin' => $plugin); + if (isset($this->params['s'])) { + $fileName = rtrim($this->Schema->file, '.php'); + $options['file'] = $fileName . '_' . $this->params['s'] . '.php'; + } + + $Schema =& $this->Schema->load($options); + + if (!$Schema) { + $this->err(sprintf(__('%s could not be loaded', true), $this->Schema->path . DS . $this->Schema->file)); + $this->_stop(); + } + $table = null; + if (isset($this->args[1])) { + $table = $this->args[1]; + } + return array(&$Schema, $table); + } + +/** + * Create database from Schema object + * Should be called via the run method + * + * @access private + */ + function __create(&$Schema, $table = null) { + $db =& ConnectionManager::getDataSource($this->Schema->connection); + + $drop = $create = array(); + + if (!$table) { + foreach ($Schema->tables as $table => $fields) { + $drop[$table] = $db->dropSchema($Schema, $table); + $create[$table] = $db->createSchema($Schema, $table); + } + } elseif (isset($Schema->tables[$table])) { + $drop[$table] = $db->dropSchema($Schema, $table); + $create[$table] = $db->createSchema($Schema, $table); + } + if (empty($drop) || empty($create)) { + $this->out(__('Schema is up to date.', true)); + $this->_stop(); + } + + $this->out("\n" . __('The following table(s) will be dropped.', true)); + $this->out(array_keys($drop)); + + if ('y' == $this->in(__('Are you sure you want to drop the table(s)?', true), array('y', 'n'), 'n')) { + $this->out(__('Dropping table(s).', true)); + $this->__run($drop, 'drop', $Schema); + } + + $this->out("\n" . __('The following table(s) will be created.', true)); + $this->out(array_keys($create)); + + if ('y' == $this->in(__('Are you sure you want to create the table(s)?', true), array('y', 'n'), 'y')) { + $this->out(__('Creating table(s).', true)); + $this->__run($create, 'create', $Schema); + } + $this->out(__('End create.', true)); + } + +/** + * Update database with Schema object + * Should be called via the run method + * + * @access private + */ + function __update(&$Schema, $table = null) { + $db =& ConnectionManager::getDataSource($this->Schema->connection); + + $this->out(__('Comparing Database to Schema...', true)); + $options = array(); + if (isset($this->params['f'])) { + $options['models'] = false; + } + $Old = $this->Schema->read($options); + $compare = $this->Schema->compare($Old, $Schema); + + $contents = array(); + + if (empty($table)) { + foreach ($compare as $table => $changes) { + $contents[$table] = $db->alterSchema(array($table => $changes), $table); + } + } elseif (isset($compare[$table])) { + $contents[$table] = $db->alterSchema(array($table => $compare[$table]), $table); + } + + if (empty($contents)) { + $this->out(__('Schema is up to date.', true)); + $this->_stop(); + } + + $this->out("\n" . __('The following statements will run.', true)); + $this->out(array_map('trim', $contents)); + if ('y' == $this->in(__('Are you sure you want to alter the tables?', true), array('y', 'n'), 'n')) { + $this->out(); + $this->out(__('Updating Database...', true)); + $this->__run($contents, 'update', $Schema); + } + + $this->out(__('End update.', true)); + } + +/** + * Runs sql from __create() or __update() + * + * @access private + */ + function __run($contents, $event, &$Schema) { + if (empty($contents)) { + $this->err(__('Sql could not be run', true)); + return; + } + Configure::write('debug', 2); + $db =& ConnectionManager::getDataSource($this->Schema->connection); + + foreach ($contents as $table => $sql) { + if (empty($sql)) { + $this->out(sprintf(__('%s is up to date.', true), $table)); + } else { + if ($this->__dry === true) { + $this->out(sprintf(__('Dry run for %s :', true), $table)); + $this->out($sql); + } else { + if (!$Schema->before(array($event => $table))) { + return false; + } + $error = null; + if (!$db->execute($sql)) { + $error = $table . ': ' . $db->lastError(); + } + + $Schema->after(array($event => $table, 'errors' => $error)); + + if (!empty($error)) { + $this->out($error); + } else { + $this->out(sprintf(__('%s updated.', true), $table)); + } + } + } + } + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $help = << ... +--------------------------------------------------------------- +Params: + -connection + set db config . uses 'default' if none is specified + + -path + path to read and write schema.php. + default path: {$this->Schema->path} + + -name + Classname to use. If is Plugin.className, it will + set the plugin and name params. + + -file + file to read and write. + default file: {$this->Schema->file} + + -s + snapshot to use for run. + + -dry + Perform a dry run on create + update commands. + Queries will be output to window instead of executed. + + -f + force 'generate' to create a new schema. + + -plugin + Indicate the plugin to use. + +Commands: + + schema help + shows this help message. + + schema view + read and output contents of schema file. + + schema generate + reads from 'connection' writes to 'path' + To force generation of all tables into the schema, use the -f param. + Use 'schema generate snapshot ' to generate snapshots + which you can use with the -s parameter in the other operations. + + schema dump + Dump database sql based on schema file to stdout. + If you use the `-write` param is used a .sql will be generated. + If `-write` is a filename, then that file name will be generate. + If `-write` is a full path, the schema will be written there. + + schema create + Drop and create tables based on schema file + optional
    argument can be used to create only a single + table in the schema. Pass the -s param with a number to use a snapshot. + Use the `-dry` param to preview the changes. + + schema update
    + Alter the tables based on schema file. Optional
    + parameter will only update one table. + To use a snapshot pass the `-s` param with the snapshot number. + To preview the changes that will be done use `-dry`. +TEXT; + $this->out($help); + $this->_stop(); + } +} diff --git a/cake/console/libs/shell.php b/cake/console/libs/shell.php new file mode 100644 index 0000000..529f1c5 --- /dev/null +++ b/cake/console/libs/shell.php @@ -0,0 +1,647 @@ + 'command'); + + foreach ($vars as $key => $var) { + if (is_string($key)) { + $this->{$var} =& $dispatch->{$key}; + } else { + $this->{$var} =& $dispatch->{$var}; + } + } + + if ($this->name == null) { + $this->name = get_class($this); + } + + if ($this->alias == null) { + $this->alias = $this->name; + } + + ClassRegistry::addObject($this->name, $this); + ClassRegistry::map($this->name, $this->alias); + + if (!PHP5 && isset($this->args[0])) { + if (strpos($this->name, strtolower(Inflector::camelize($this->args[0]))) !== false) { + $dispatch->shiftArgs(); + } + if (strtolower($this->command) == strtolower(Inflector::variable($this->args[0])) && method_exists($this, $this->command)) { + $dispatch->shiftArgs(); + } + } + + $this->Dispatch =& $dispatch; + } + +/** + * Initializes the Shell + * acts as constructor for subclasses + * allows configuration of tasks prior to shell execution + * + * @access public + */ + function initialize() { + $this->_loadModels(); + } + +/** + * Starts up the Shell + * allows for checking and configuring prior to command or main execution + * can be overriden in subclasses + * + * @access public + */ + function startup() { + $this->_welcome(); + } + +/** + * Displays a header for the shell + * + * @access protected + */ + function _welcome() { + $this->Dispatch->clear(); + $this->out(); + $this->out('Welcome to CakePHP v' . Configure::version() . ' Console'); + $this->hr(); + $this->out('App : '. $this->params['app']); + $this->out('Path: '. $this->params['working']); + $this->hr(); + } + +/** + * Loads database file and constructs DATABASE_CONFIG class + * makes $this->DbConfig available to subclasses + * + * @return bool + * @access protected + */ + function _loadDbConfig() { + if (config('database') && class_exists('DATABASE_CONFIG')) { + $this->DbConfig =& new DATABASE_CONFIG(); + return true; + } + $this->err('Database config could not be loaded.'); + $this->out('Run `bake` to create the database configuration.'); + return false; + } + +/** + * if var $uses = true + * Loads AppModel file and constructs AppModel class + * makes $this->AppModel available to subclasses + * if var $uses is an array of models will load those models + * + * @return bool + * @access protected + */ + function _loadModels() { + if ($this->uses === null || $this->uses === false) { + return; + } + + if ($this->uses === true && App::import('Model', 'AppModel')) { + $this->AppModel =& new AppModel(false, false, false); + return true; + } + + if ($this->uses !== true && !empty($this->uses)) { + $uses = is_array($this->uses) ? $this->uses : array($this->uses); + + $modelClassName = $uses[0]; + if (strpos($uses[0], '.') !== false) { + list($plugin, $modelClassName) = explode('.', $uses[0]); + } + $this->modelClass = $modelClassName; + + foreach ($uses as $modelClass) { + list($plugin, $modelClass) = pluginSplit($modelClass, true); + if (PHP5) { + $this->{$modelClass} = ClassRegistry::init($plugin . $modelClass); + } else { + $this->{$modelClass} =& ClassRegistry::init($plugin . $modelClass); + } + } + return true; + } + return false; + } + +/** + * Loads tasks defined in var $tasks + * + * @return bool + * @access public + */ + function loadTasks() { + if ($this->tasks === null || $this->tasks === false || $this->tasks === true || empty($this->tasks)) { + return true; + } + + $tasks = $this->tasks; + if (!is_array($tasks)) { + $tasks = array($tasks); + } + + foreach ($tasks as $taskName) { + $task = Inflector::underscore($taskName); + $taskClass = Inflector::camelize($taskName . 'Task'); + + if (!class_exists($taskClass)) { + foreach ($this->Dispatch->shellPaths as $path) { + $taskPath = $path . 'tasks' . DS . $task . '.php'; + if (file_exists($taskPath)) { + require_once $taskPath; + break; + } + } + } + $taskClassCheck = $taskClass; + if (!PHP5) { + $taskClassCheck = strtolower($taskClass); + } + if (ClassRegistry::isKeySet($taskClassCheck)) { + $this->taskNames[] = $taskName; + if (!PHP5) { + $this->{$taskName} =& ClassRegistry::getObject($taskClassCheck); + } else { + $this->{$taskName} = ClassRegistry::getObject($taskClassCheck); + } + } else { + $this->taskNames[] = $taskName; + if (!PHP5) { + $this->{$taskName} =& new $taskClass($this->Dispatch); + } else { + $this->{$taskName} = new $taskClass($this->Dispatch); + } + } + + if (!isset($this->{$taskName})) { + $this->err("Task `{$taskName}` could not be loaded"); + $this->_stop(); + } + } + + return true; + } + +/** + * Prompts the user for input, and returns it. + * + * @param string $prompt Prompt text. + * @param mixed $options Array or string of options. + * @param string $default Default input value. + * @return Either the default value, or the user-provided input. + * @access public + */ + function in($prompt, $options = null, $default = null) { + if (!$this->interactive) { + return $default; + } + $in = $this->Dispatch->getInput($prompt, $options, $default); + + if ($options && is_string($options)) { + if (strpos($options, ',')) { + $options = explode(',', $options); + } elseif (strpos($options, '/')) { + $options = explode('/', $options); + } else { + $options = array($options); + } + } + if (is_array($options)) { + while ($in == '' || ($in && (!in_array(strtolower($in), $options) && !in_array(strtoupper($in), $options)) && !in_array($in, $options))) { + $in = $this->Dispatch->getInput($prompt, $options, $default); + } + } + if ($in) { + return $in; + } + } + +/** + * Outputs a single or multiple messages to stdout. If no parameters + * are passed outputs just a newline. + * + * @param mixed $message A string or a an array of strings to output + * @param integer $newlines Number of newlines to append + * @return integer Returns the number of bytes returned from writing to stdout. + * @access public + */ + function out($message = null, $newlines = 1) { + if (is_array($message)) { + $message = implode($this->nl(), $message); + } + return $this->Dispatch->stdout($message . $this->nl($newlines), false); + } + +/** + * Outputs a single or multiple error messages to stderr. If no parameters + * are passed outputs just a newline. + * + * @param mixed $message A string or a an array of strings to output + * @param integer $newlines Number of newlines to append + * @access public + */ + function err($message = null, $newlines = 1) { + if (is_array($message)) { + $message = implode($this->nl(), $message); + } + $this->Dispatch->stderr($message . $this->nl($newlines)); + } + +/** + * Returns a single or multiple linefeeds sequences. + * + * @param integer $multiplier Number of times the linefeed sequence should be repeated + * @access public + * @return string + */ + function nl($multiplier = 1) { + return str_repeat("\n", $multiplier); + } + +/** + * Outputs a series of minus characters to the standard output, acts as a visual separator. + * + * @param integer $newlines Number of newlines to pre- and append + * @access public + */ + function hr($newlines = 0) { + $this->out(null, $newlines); + $this->out('---------------------------------------------------------------'); + $this->out(null, $newlines); + } + +/** + * Displays a formatted error message + * and exits the application with status code 1 + * + * @param string $title Title of the error + * @param string $message An optional error message + * @access public + */ + function error($title, $message = null) { + $this->err(sprintf(__('Error: %s', true), $title)); + + if (!empty($message)) { + $this->err($message); + } + $this->_stop(1); + } + +/** + * Will check the number args matches otherwise throw an error + * + * @param integer $expectedNum Expected number of paramters + * @param string $command Command + * @access protected + */ + function _checkArgs($expectedNum, $command = null) { + if (!$command) { + $command = $this->command; + } + if (count($this->args) < $expectedNum) { + $message[] = "Got: " . count($this->args); + $message[] = "Expected: {$expectedNum}"; + $message[] = "Please type `cake {$this->shell} help` for help"; + $message[] = "on usage of the {$this->name} {$command}."; + $this->error('Wrong number of parameters', $message); + } + } + +/** + * Creates a file at given path + * + * @param string $path Where to put the file. + * @param string $contents Content to put in the file. + * @return boolean Success + * @access public + */ + function createFile($path, $contents) { + $path = str_replace(DS . DS, DS, $path); + + $this->out(); + $this->out(sprintf(__("Creating file %s", true), $path)); + + if (is_file($path) && $this->interactive === true) { + $prompt = sprintf(__('File `%s` exists, overwrite?', true), $path); + $key = $this->in($prompt, array('y', 'n', 'q'), 'n'); + + if (strtolower($key) == 'q') { + $this->out(__('Quitting.', true), 2); + $this->_stop(); + } elseif (strtolower($key) != 'y') { + $this->out(sprintf(__('Skip `%s`', true), $path), 2); + return false; + } + } + if (!class_exists('File')) { + require LIBS . 'file.php'; + } + + if ($File = new File($path, true)) { + $data = $File->prepare($contents); + $File->write($data); + $this->out(sprintf(__('Wrote `%s`', true), $path)); + return true; + } else { + $this->err(sprintf(__('Could not write to `%s`.', true), $path), 2); + return false; + } + } + +/** + * Outputs usage text on the standard output. Implement it in subclasses. + * + * @access public + */ + function help() { + if ($this->command != null) { + $this->err("Unknown {$this->name} command `{$this->command}`."); + $this->err("For usage, try `cake {$this->shell} help`.", 2); + } else { + $this->Dispatch->help(); + } + } + +/** + * Action to create a Unit Test + * + * @return boolean Success + * @access protected + */ + function _checkUnitTest() { + if (App::import('vendor', 'simpletest' . DS . 'simpletest')) { + return true; + } + $prompt = 'SimpleTest is not installed. Do you want to bake unit test files anyway?'; + $unitTest = $this->in($prompt, array('y','n'), 'y'); + $result = strtolower($unitTest) == 'y' || strtolower($unitTest) == 'yes'; + + if ($result) { + $this->out(); + $this->out('You can download SimpleTest from http://simpletest.org'); + } + return $result; + } + +/** + * Makes absolute file path easier to read + * + * @param string $file Absolute file path + * @return sting short path + * @access public + */ + function shortPath($file) { + $shortPath = str_replace(ROOT, null, $file); + $shortPath = str_replace('..' . DS, '', $shortPath); + return str_replace(DS . DS, DS, $shortPath); + } + +/** + * Creates the proper controller path for the specified controller class name + * + * @param string $name Controller class name + * @return string Path to controller + * @access protected + */ + function _controllerPath($name) { + return strtolower(Inflector::underscore($name)); + } + +/** + * Creates the proper controller plural name for the specified controller class name + * + * @param string $name Controller class name + * @return string Controller plural name + * @access protected + */ + function _controllerName($name) { + return Inflector::pluralize(Inflector::camelize($name)); + } + +/** + * Creates the proper controller camelized name (singularized) for the specified name + * + * @param string $name Name + * @return string Camelized and singularized controller name + * @access protected + */ + function _modelName($name) { + return Inflector::camelize(Inflector::singularize($name)); + } + +/** + * Creates the proper underscored model key for associations + * + * @param string $name Model class name + * @return string Singular model key + * @access protected + */ + function _modelKey($name) { + return Inflector::underscore($name) . '_id'; + } + +/** + * Creates the proper model name from a foreign key + * + * @param string $key Foreign key + * @return string Model name + * @access protected + */ + function _modelNameFromKey($key) { + return Inflector::camelize(str_replace('_id', '', $key)); + } + +/** + * creates the singular name for use in views. + * + * @param string $name + * @return string $name + * @access protected + */ + function _singularName($name) { + return Inflector::variable(Inflector::singularize($name)); + } + +/** + * Creates the plural name for views + * + * @param string $name Name to use + * @return string Plural name for views + * @access protected + */ + function _pluralName($name) { + return Inflector::variable(Inflector::pluralize($name)); + } + +/** + * Creates the singular human name used in views + * + * @param string $name Controller name + * @return string Singular human name + * @access protected + */ + function _singularHumanName($name) { + return Inflector::humanize(Inflector::underscore(Inflector::singularize($name))); + } + +/** + * Creates the plural human name used in views + * + * @param string $name Controller name + * @return string Plural human name + * @access protected + */ + function _pluralHumanName($name) { + return Inflector::humanize(Inflector::underscore($name)); + } + +/** + * Find the correct path for a plugin. Scans $pluginPaths for the plugin you want. + * + * @param string $pluginName Name of the plugin you want ie. DebugKit + * @return string $path path to the correct plugin. + */ + function _pluginPath($pluginName) { + return App::pluginPath($pluginName); + } +} diff --git a/cake/console/libs/tasks/bake.php b/cake/console/libs/tasks/bake.php new file mode 100644 index 0000000..8394bb5 --- /dev/null +++ b/cake/console/libs/tasks/bake.php @@ -0,0 +1,60 @@ +path; + if (isset($this->plugin)) { + $name = substr($this->name, 0, strlen($this->name) - 4); + $path = $this->_pluginPath($this->plugin) . Inflector::pluralize(Inflector::underscore($name)) . DS; + } + return $path; + } +} diff --git a/cake/console/libs/tasks/controller.php b/cake/console/libs/tasks/controller.php new file mode 100644 index 0000000..36fd916 --- /dev/null +++ b/cake/console/libs/tasks/controller.php @@ -0,0 +1,480 @@ +args)) { + return $this->__interactive(); + } + + if (isset($this->args[0])) { + if (!isset($this->connection)) { + $this->connection = 'default'; + } + if (strtolower($this->args[0]) == 'all') { + return $this->all(); + } + + $controller = $this->_controllerName($this->args[0]); + $actions = 'scaffold'; + + if (!empty($this->args[1]) && ($this->args[1] == 'public' || $this->args[1] == 'scaffold')) { + $this->out(__('Baking basic crud methods for ', true) . $controller); + $actions = $this->bakeActions($controller); + } elseif (!empty($this->args[1]) && $this->args[1] == 'admin') { + $admin = $this->Project->getPrefix(); + if ($admin) { + $this->out(sprintf(__('Adding %s methods', true), $admin)); + $actions = $this->bakeActions($controller, $admin); + } + } + + if (!empty($this->args[2]) && $this->args[2] == 'admin') { + $admin = $this->Project->getPrefix(); + if ($admin) { + $this->out(sprintf(__('Adding %s methods', true), $admin)); + $actions .= "\n" . $this->bakeActions($controller, $admin); + } + } + + if ($this->bake($controller, $actions)) { + if ($this->_checkUnitTest()) { + $this->bakeTest($controller); + } + } + } + } + +/** + * Bake All the controllers at once. Will only bake controllers for models that exist. + * + * @access public + * @return void + */ + function all() { + $this->interactive = false; + $this->listAll($this->connection, false); + ClassRegistry::config('Model', array('ds' => $this->connection)); + $unitTestExists = $this->_checkUnitTest(); + foreach ($this->__tables as $table) { + $model = $this->_modelName($table); + $controller = $this->_controllerName($model); + if (App::import('Model', $model)) { + $actions = $this->bakeActions($controller); + if ($this->bake($controller, $actions) && $unitTestExists) { + $this->bakeTest($controller); + } + } + } + } + +/** + * Interactive + * + * @access private + */ + function __interactive() { + $this->interactive = true; + $this->hr(); + $this->out(sprintf(__("Bake Controller\nPath: %s", true), $this->path)); + $this->hr(); + + if (empty($this->connection)) { + $this->connection = $this->DbConfig->getConfig(); + } + + $controllerName = $this->getName(); + $this->hr(); + $this->out(sprintf(__('Baking %sController', true), $controllerName)); + $this->hr(); + + $helpers = $components = array(); + $actions = ''; + $wannaUseSession = 'y'; + $wannaBakeAdminCrud = 'n'; + $useDynamicScaffold = 'n'; + $wannaBakeCrud = 'y'; + + $controllerFile = strtolower(Inflector::underscore($controllerName)); + + $question[] = __("Would you like to build your controller interactively?", true); + if (file_exists($this->path . $controllerFile .'_controller.php')) { + $question[] = sprintf(__("Warning: Choosing no will overwrite the %sController.", true), $controllerName); + } + $doItInteractive = $this->in(implode("\n", $question), array('y','n'), 'y'); + + if (strtolower($doItInteractive) == 'y') { + $this->interactive = true; + $useDynamicScaffold = $this->in( + __("Would you like to use dynamic scaffolding?", true), array('y','n'), 'n' + ); + + if (strtolower($useDynamicScaffold) == 'y') { + $wannaBakeCrud = 'n'; + $actions = 'scaffold'; + } else { + list($wannaBakeCrud, $wannaBakeAdminCrud) = $this->_askAboutMethods(); + + $helpers = $this->doHelpers(); + $components = $this->doComponents(); + + $wannaUseSession = $this->in( + __("Would you like to use Session flash messages?", true), array('y','n'), 'y' + ); + } + } else { + list($wannaBakeCrud, $wannaBakeAdminCrud) = $this->_askAboutMethods(); + } + + if (strtolower($wannaBakeCrud) == 'y') { + $actions = $this->bakeActions($controllerName, null, strtolower($wannaUseSession) == 'y'); + } + if (strtolower($wannaBakeAdminCrud) == 'y') { + $admin = $this->Project->getPrefix(); + $actions .= $this->bakeActions($controllerName, $admin, strtolower($wannaUseSession) == 'y'); + } + + $baked = false; + if ($this->interactive === true) { + $this->confirmController($controllerName, $useDynamicScaffold, $helpers, $components); + $looksGood = $this->in(__('Look okay?', true), array('y','n'), 'y'); + + if (strtolower($looksGood) == 'y') { + $baked = $this->bake($controllerName, $actions, $helpers, $components); + if ($baked && $this->_checkUnitTest()) { + $this->bakeTest($controllerName); + } + } + } else { + $baked = $this->bake($controllerName, $actions, $helpers, $components); + if ($baked && $this->_checkUnitTest()) { + $this->bakeTest($controllerName); + } + } + return $baked; + } + +/** + * Confirm a to be baked controller with the user + * + * @return void + */ + function confirmController($controllerName, $useDynamicScaffold, $helpers, $components) { + $this->out(); + $this->hr(); + $this->out(__('The following controller will be created:', true)); + $this->hr(); + $this->out(sprintf(__("Controller Name:\n\t%s", true), $controllerName)); + + if (strtolower($useDynamicScaffold) == 'y') { + $this->out("var \$scaffold;"); + } + + $properties = array( + 'helpers' => __("Helpers:", true), + 'components' => __('Components:', true), + ); + + foreach ($properties as $var => $title) { + if (count($$var)) { + $output = ''; + $length = count($$var); + foreach ($$var as $i => $propElement) { + if ($i != $length -1) { + $output .= ucfirst($propElement) . ', '; + } else { + $output .= ucfirst($propElement); + } + } + $this->out($title . "\n\t" . $output); + } + } + $this->hr(); + } + +/** + * Interact with the user and ask about which methods (admin or regular they want to bake) + * + * @return array Array containing (bakeRegular, bakeAdmin) answers + */ + function _askAboutMethods() { + $wannaBakeCrud = $this->in( + __("Would you like to create some basic class methods \n(index(), add(), view(), edit())?", true), + array('y','n'), 'n' + ); + $wannaBakeAdminCrud = $this->in( + __("Would you like to create the basic class methods for admin routing?", true), + array('y','n'), 'n' + ); + return array($wannaBakeCrud, $wannaBakeAdminCrud); + } + +/** + * Bake scaffold actions + * + * @param string $controllerName Controller name + * @param string $admin Admin route to use + * @param boolean $wannaUseSession Set to true to use sessions, false otherwise + * @return string Baked actions + * @access private + */ + function bakeActions($controllerName, $admin = null, $wannaUseSession = true) { + $currentModelName = $modelImport = $this->_modelName($controllerName); + if ($this->plugin) { + $modelImport = $this->plugin . '.' . $modelImport; + } + if (!App::import('Model', $modelImport)) { + $this->err(__('You must have a model for this class to build basic methods. Please try again.', true)); + $this->_stop(); + } + + $modelObj =& ClassRegistry::init($currentModelName); + $controllerPath = $this->_controllerPath($controllerName); + $pluralName = $this->_pluralName($currentModelName); + $singularName = Inflector::variable($currentModelName); + $singularHumanName = $this->_singularHumanName($controllerName); + $pluralHumanName = $this->_pluralName($controllerName); + + $this->Template->set(compact('admin', 'controllerPath', 'pluralName', 'singularName', 'singularHumanName', + 'pluralHumanName', 'modelObj', 'wannaUseSession', 'currentModelName')); + $actions = $this->Template->generate('actions', 'controller_actions'); + return $actions; + } + +/** + * Assembles and writes a Controller file + * + * @param string $controllerName Controller name + * @param string $actions Actions to add, or set the whole controller to use $scaffold (set $actions to 'scaffold') + * @param array $helpers Helpers to use in controller + * @param array $components Components to use in controller + * @param array $uses Models to use in controller + * @return string Baked controller + * @access private + */ + function bake($controllerName, $actions = '', $helpers = null, $components = null) { + $isScaffold = ($actions === 'scaffold') ? true : false; + + $this->Template->set('plugin', Inflector::camelize($this->plugin)); + $this->Template->set(compact('controllerName', 'actions', 'helpers', 'components', 'isScaffold')); + $contents = $this->Template->generate('classes', 'controller'); + + $path = $this->getPath(); + $filename = $path . $this->_controllerPath($controllerName) . '_controller.php'; + if ($this->createFile($filename, $contents)) { + return $contents; + } + return false; + } + +/** + * Assembles and writes a unit test file + * + * @param string $className Controller class name + * @return string Baked test + * @access private + */ + function bakeTest($className) { + $this->Test->plugin = $this->plugin; + $this->Test->connection = $this->connection; + $this->Test->interactive = $this->interactive; + return $this->Test->bake('Controller', $className); + } + +/** + * Interact with the user and get a list of additional helpers + * + * @return array Helpers that the user wants to use. + */ + function doHelpers() { + return $this->_doPropertyChoices( + __("Would you like this controller to use other helpers\nbesides HtmlHelper and FormHelper?", true), + __("Please provide a comma separated list of the other\nhelper names you'd like to use.\nExample: 'Ajax, Javascript, Time'", true) + ); + } + +/** + * Interact with the user and get a list of additional components + * + * @return array Components the user wants to use. + */ + function doComponents() { + return $this->_doPropertyChoices( + __("Would you like this controller to use any components?", true), + __("Please provide a comma separated list of the component names you'd like to use.\nExample: 'Acl, Security, RequestHandler'", true) + ); + } + +/** + * Common code for property choice handling. + * + * @param string $prompt A yes/no question to precede the list + * @param sting $example A question for a comma separated list, with examples. + * @return array Array of values for property. + */ + function _doPropertyChoices($prompt, $example) { + $proceed = $this->in($prompt, array('y','n'), 'n'); + $property = array(); + if (strtolower($proceed) == 'y') { + $propertyList = $this->in($example); + $propertyListTrimmed = str_replace(' ', '', $propertyList); + $property = explode(',', $propertyListTrimmed); + } + return array_filter($property); + } + +/** + * Outputs and gets the list of possible controllers from database + * + * @param string $useDbConfig Database configuration name + * @param boolean $interactive Whether you are using listAll interactively and want options output. + * @return array Set of controllers + * @access public + */ + function listAll($useDbConfig = null) { + if (is_null($useDbConfig)) { + $useDbConfig = $this->connection; + } + $this->__tables = $this->Model->getAllTables($useDbConfig); + + if ($this->interactive == true) { + $this->out(__('Possible Controllers based on your current database:', true)); + $this->_controllerNames = array(); + $count = count($this->__tables); + for ($i = 0; $i < $count; $i++) { + $this->_controllerNames[] = $this->_controllerName($this->_modelName($this->__tables[$i])); + $this->out($i + 1 . ". " . $this->_controllerNames[$i]); + } + return $this->_controllerNames; + } + return $this->__tables; + } + +/** + * Forces the user to specify the controller he wants to bake, and returns the selected controller name. + * + * @param string $useDbConfig Connection name to get a controller name for. + * @return string Controller name + * @access public + */ + function getName($useDbConfig = null) { + $controllers = $this->listAll($useDbConfig); + $enteredController = ''; + + while ($enteredController == '') { + $enteredController = $this->in(__("Enter a number from the list above,\ntype in the name of another controller, or 'q' to exit", true), null, 'q'); + + if ($enteredController === 'q') { + $this->out(__("Exit", true)); + $this->_stop(); + } + + if ($enteredController == '' || intval($enteredController) > count($controllers)) { + $this->err(__("The Controller name you supplied was empty,\nor the number you selected was not an option. Please try again.", true)); + $enteredController = ''; + } + } + + if (intval($enteredController) > 0 && intval($enteredController) <= count($controllers) ) { + $controllerName = $controllers[intval($enteredController) - 1]; + } else { + $controllerName = Inflector::camelize($enteredController); + } + return $controllerName; + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake controller ..."); + $this->hr(); + $this->out('Arguments:'); + $this->out(); + $this->out(""); + $this->out("\tName of the controller to bake. Can use Plugin.name"); + $this->out("\tas a shortcut for plugin baking."); + $this->out(); + $this->out('Commands:'); + $this->out(); + $this->out("controller "); + $this->out("\tbakes controller with var \$scaffold"); + $this->out(); + $this->out("controller public"); + $this->out("\tbakes controller with basic crud actions"); + $this->out("\t(index, view, add, edit, delete)"); + $this->out(); + $this->out("controller admin"); + $this->out("\tbakes a controller with basic crud actions for one of the"); + $this->out("\tConfigure::read('Routing.prefixes') methods."); + $this->out(); + $this->out("controller public admin"); + $this->out("\tbakes a controller with basic crud actions for one"); + $this->out("\tConfigure::read('Routing.prefixes') and non admin methods."); + $this->out("\t(index, view, add, edit, delete,"); + $this->out("\tadmin_index, admin_view, admin_edit, admin_add, admin_delete)"); + $this->out(); + $this->out("controller all"); + $this->out("\tbakes all controllers with CRUD methods."); + $this->out(); + $this->_stop(); + } +} diff --git a/cake/console/libs/tasks/db_config.php b/cake/console/libs/tasks/db_config.php new file mode 100644 index 0000000..df86d19 --- /dev/null +++ b/cake/console/libs/tasks/db_config.php @@ -0,0 +1,368 @@ + 'default', 'driver'=> 'mysql', 'persistent'=> 'false', 'host'=> 'localhost', + 'login'=> 'root', 'password'=> 'password', 'database'=> 'project_name', + 'schema'=> null, 'prefix'=> null, 'encoding' => null, 'port' => null + ); + +/** + * String name of the database config class name. + * Used for testing. + * + * @var string + */ + var $databaseClassName = 'DATABASE_CONFIG'; + +/** + * initialization callback + * + * @var string + * @access public + */ + function initialize() { + $this->path = $this->params['working'] . DS . 'config' . DS; + } + +/** + * Execution method always used for tasks + * + * @access public + */ + function execute() { + if (empty($this->args)) { + $this->__interactive(); + $this->_stop(); + } + } + +/** + * Interactive interface + * + * @access private + */ + function __interactive() { + $this->hr(); + $this->out('Database Configuration:'); + $this->hr(); + $done = false; + $dbConfigs = array(); + + while ($done == false) { + $name = ''; + + while ($name == '') { + $name = $this->in("Name:", null, 'default'); + if (preg_match('/[^a-z0-9_]/i', $name)) { + $name = ''; + $this->out('The name may only contain unaccented latin characters, numbers or underscores'); + } else if (preg_match('/^[^a-z_]/i', $name)) { + $name = ''; + $this->out('The name must start with an unaccented latin character or an underscore'); + } + } + + $driver = $this->in('Driver:', array('db2', 'firebird', 'mssql', 'mysql', 'mysqli', 'odbc', 'oracle', 'postgres', 'sqlite', 'sybase'), 'mysql'); + + $persistent = $this->in('Persistent Connection?', array('y', 'n'), 'n'); + if (strtolower($persistent) == 'n') { + $persistent = 'false'; + } else { + $persistent = 'true'; + } + + $host = ''; + while ($host == '') { + $host = $this->in('Database Host:', null, 'localhost'); + } + + $port = ''; + while ($port == '') { + $port = $this->in('Port?', null, 'n'); + } + + if (strtolower($port) == 'n') { + $port = null; + } + + $login = ''; + while ($login == '') { + $login = $this->in('User:', null, 'root'); + } + $password = ''; + $blankPassword = false; + + while ($password == '' && $blankPassword == false) { + $password = $this->in('Password:'); + + if ($password == '') { + $blank = $this->in('The password you supplied was empty. Use an empty password?', array('y', 'n'), 'n'); + if ($blank == 'y') { + $blankPassword = true; + } + } + } + + $database = ''; + while ($database == '') { + $database = $this->in('Database Name:', null, 'cake'); + } + + $prefix = ''; + while ($prefix == '') { + $prefix = $this->in('Table Prefix?', null, 'n'); + } + if (strtolower($prefix) == 'n') { + $prefix = null; + } + + $encoding = ''; + while ($encoding == '') { + $encoding = $this->in('Table encoding?', null, 'n'); + } + if (strtolower($encoding) == 'n') { + $encoding = null; + } + + $schema = ''; + if ($driver == 'postgres') { + while ($schema == '') { + $schema = $this->in('Table schema?', null, 'n'); + } + } + if (strtolower($schema) == 'n') { + $schema = null; + } + + $config = compact('name', 'driver', 'persistent', 'host', 'login', 'password', 'database', 'prefix', 'encoding', 'port', 'schema'); + + while ($this->__verify($config) == false) { + $this->__interactive(); + } + $dbConfigs[] = $config; + $doneYet = $this->in('Do you wish to add another database configuration?', null, 'n'); + + if (strtolower($doneYet == 'n')) { + $done = true; + } + } + + $this->bake($dbConfigs); + config('database'); + return true; + } + +/** + * Output verification message and bake if it looks good + * + * @return boolean True if user says it looks good, false otherwise + * @access private + */ + function __verify($config) { + $config = array_merge($this->__defaultConfig, $config); + extract($config); + $this->out(); + $this->hr(); + $this->out('The following database configuration will be created:'); + $this->hr(); + $this->out("Name: $name"); + $this->out("Driver: $driver"); + $this->out("Persistent: $persistent"); + $this->out("Host: $host"); + + if ($port) { + $this->out("Port: $port"); + } + + $this->out("User: $login"); + $this->out("Pass: " . str_repeat('*', strlen($password))); + $this->out("Database: $database"); + + if ($prefix) { + $this->out("Table prefix: $prefix"); + } + + if ($schema) { + $this->out("Schema: $schema"); + } + + if ($encoding) { + $this->out("Encoding: $encoding"); + } + + $this->hr(); + $looksGood = $this->in('Look okay?', array('y', 'n'), 'y'); + + if (strtolower($looksGood) == 'y') { + return $config; + } + return false; + } + +/** + * Assembles and writes database.php + * + * @param array $configs Configuration settings to use + * @return boolean Success + * @access public + */ + function bake($configs) { + if (!is_dir($this->path)) { + $this->err($this->path . ' not found'); + return false; + } + + $filename = $this->path . 'database.php'; + $oldConfigs = array(); + + if (file_exists($filename)) { + config('database'); + $db = new $this->databaseClassName; + $temp = get_class_vars(get_class($db)); + + foreach ($temp as $configName => $info) { + $info = array_merge($this->__defaultConfig, $info); + + if (!isset($info['schema'])) { + $info['schema'] = null; + } + if (!isset($info['encoding'])) { + $info['encoding'] = null; + } + if (!isset($info['port'])) { + $info['port'] = null; + } + + if ($info['persistent'] === false) { + $info['persistent'] = 'false'; + } else { + $info['persistent'] = ($info['persistent'] == true) ? 'true' : 'false'; + } + + $oldConfigs[] = array( + 'name' => $configName, + 'driver' => $info['driver'], + 'persistent' => $info['persistent'], + 'host' => $info['host'], + 'port' => $info['port'], + 'login' => $info['login'], + 'password' => $info['password'], + 'database' => $info['database'], + 'prefix' => $info['prefix'], + 'schema' => $info['schema'], + 'encoding' => $info['encoding'] + ); + } + } + + foreach ($oldConfigs as $key => $oldConfig) { + foreach ($configs as $key1 => $config) { + if ($oldConfig['name'] == $config['name']) { + unset($oldConfigs[$key]); + } + } + } + + $configs = array_merge($oldConfigs, $configs); + $out = "__defaultConfig, $config); + extract($config); + + $out .= "\tvar \${$name} = array(\n"; + $out .= "\t\t'driver' => '{$driver}',\n"; + $out .= "\t\t'persistent' => {$persistent},\n"; + $out .= "\t\t'host' => '{$host}',\n"; + + if ($port) { + $out .= "\t\t'port' => {$port},\n"; + } + + $out .= "\t\t'login' => '{$login}',\n"; + $out .= "\t\t'password' => '{$password}',\n"; + $out .= "\t\t'database' => '{$database}',\n"; + + if ($schema) { + $out .= "\t\t'schema' => '{$schema}',\n"; + } + + if ($prefix) { + $out .= "\t\t'prefix' => '{$prefix}',\n"; + } + + if ($encoding) { + $out .= "\t\t'encoding' => '{$encoding}'\n"; + } + + $out .= "\t);\n"; + } + + $out .= "}\n"; + $out .= "?>"; + $filename = $this->path . 'database.php'; + return $this->createFile($filename, $out); + } + +/** + * Get a user specified Connection name + * + * @return void + */ + function getConfig() { + App::import('Model', 'ConnectionManager', false); + + $useDbConfig = 'default'; + $configs = get_class_vars($this->databaseClassName); + if (!is_array($configs)) { + return $this->execute(); + } + + $connections = array_keys($configs); + if (count($connections) > 1) { + $useDbConfig = $this->in(__('Use Database Config', true) .':', $connections, 'default'); + } + return $useDbConfig; + } +} diff --git a/cake/console/libs/tasks/extract.php b/cake/console/libs/tasks/extract.php new file mode 100644 index 0000000..5dc928b --- /dev/null +++ b/cake/console/libs/tasks/extract.php @@ -0,0 +1,494 @@ +params['files']) && !is_array($this->params['files'])) { + $this->__files = explode(',', $this->params['files']); + } + if (isset($this->params['paths'])) { + $this->__paths = explode(',', $this->params['paths']); + } else { + $defaultPath = $this->params['working']; + $message = sprintf(__("What is the full path you would like to extract?\nExample: %s\n[Q]uit [D]one", true), $this->params['root'] . DS . 'myapp'); + while (true) { + $response = $this->in($message, null, $defaultPath); + if (strtoupper($response) === 'Q') { + $this->out(__('Extract Aborted', true)); + $this->_stop(); + } elseif (strtoupper($response) === 'D') { + $this->out(); + break; + } elseif (is_dir($response)) { + $this->__paths[] = $response; + $defaultPath = 'D'; + } else { + $this->err(__('The directory path you supplied was not found. Please try again.', true)); + } + $this->out(); + } + } + + if (isset($this->params['output'])) { + $this->__output = $this->params['output']; + } else { + $message = sprintf(__("What is the full path you would like to output?\nExample: %s\n[Q]uit", true), $this->__paths[0] . DS . 'locale'); + while (true) { + $response = $this->in($message, null, $this->__paths[0] . DS . 'locale'); + if (strtoupper($response) === 'Q') { + $this->out(__('Extract Aborted', true)); + $this->_stop(); + } elseif (is_dir($response)) { + $this->__output = $response . DS; + break; + } else { + $this->err(__('The directory path you supplied was not found. Please try again.', true)); + } + $this->out(); + } + } + + if (isset($this->params['merge'])) { + $this->__merge = !(strtolower($this->params['merge']) === 'no'); + } else { + $this->out(); + $response = $this->in(sprintf(__('Would you like to merge all domains strings into the default.pot file?', true)), array('y', 'n'), 'n'); + $this->__merge = strtolower($response) === 'y'; + } + + if (empty($this->__files)) { + $this->__searchFiles(); + } + $this->__extract(); + } + +/** + * Extract text + * + * @return void + * @access private + */ + function __extract() { + $this->out(); + $this->out(); + $this->out(__('Extracting...', true)); + $this->hr(); + $this->out(__('Paths:', true)); + foreach ($this->__paths as $path) { + $this->out(' ' . $path); + } + $this->out(__('Output Directory: ', true) . $this->__output); + $this->hr(); + $this->__extractTokens(); + $this->__buildFiles(); + $this->__writeFiles(); + $this->__paths = $this->__files = $this->__storage = array(); + $this->__strings = $this->__tokens = array(); + $this->out(); + $this->out(__('Done.', true)); + } + +/** + * Show help options + * + * @return void + * @access public + */ + function help() { + $this->out(__('CakePHP Language String Extraction:', true)); + $this->hr(); + $this->out(__('The Extract script generates .pot file(s) with translations', true)); + $this->out(__('By default the .pot file(s) will be place in the locale directory of -app', true)); + $this->out(__('By default -app is ROOT/app', true)); + $this->hr(); + $this->out(__('Usage: cake i18n extract ...', true)); + $this->out(); + $this->out(__('Params:', true)); + $this->out(__(' -app [path...]: directory where your application is located', true)); + $this->out(__(' -root [path...]: path to install', true)); + $this->out(__(' -core [path...]: path to cake directory', true)); + $this->out(__(' -paths [comma separated list of paths, full path is needed]', true)); + $this->out(__(' -merge [yes|no]: Merge all domains strings into the default.pot file', true)); + $this->out(__(' -output [path...]: Full path to output directory', true)); + $this->out(__(' -files: [comma separated list of files, full path to file is needed]', true)); + $this->out(); + $this->out(__('Commands:', true)); + $this->out(__(' cake i18n extract help: Shows this help message.', true)); + $this->out(); + } + +/** + * Extract tokens out of all files to be processed + * + * @return void + * @access private + */ + function __extractTokens() { + foreach ($this->__files as $file) { + $this->__file = $file; + $this->out(sprintf(__('Processing %s...', true), $file)); + + $code = file_get_contents($file); + $allTokens = token_get_all($code); + $this->__tokens = array(); + $lineNumber = 1; + + foreach ($allTokens as $token) { + if ((!is_array($token)) || (($token[0] != T_WHITESPACE) && ($token[0] != T_INLINE_HTML))) { + if (is_array($token)) { + $token[] = $lineNumber; + } + $this->__tokens[] = $token; + } + + if (is_array($token)) { + $lineNumber += count(explode("\n", $token[1])) - 1; + } else { + $lineNumber += count(explode("\n", $token)) - 1; + } + } + unset($allTokens); + $this->__parse('__', array('singular')); + $this->__parse('__n', array('singular', 'plural')); + $this->__parse('__d', array('domain', 'singular')); + $this->__parse('__c', array('singular')); + $this->__parse('__dc', array('domain', 'singular')); + $this->__parse('__dn', array('domain', 'singular', 'plural')); + $this->__parse('__dcn', array('domain', 'singular', 'plural')); + } + } + +/** + * Parse tokens + * + * @param string $functionName Function name that indicates translatable string (e.g: '__') + * @param array $map Array containing what variables it will find (e.g: domain, singular, plural) + * @return void + * @access private + */ + function __parse($functionName, $map) { + $count = 0; + $tokenCount = count($this->__tokens); + + while (($tokenCount - $count) > 1) { + list($countToken, $firstParenthesis) = array($this->__tokens[$count], $this->__tokens[$count + 1]); + if (!is_array($countToken)) { + $count++; + continue; + } + + list($type, $string, $line) = $countToken; + if (($type == T_STRING) && ($string == $functionName) && ($firstParenthesis == '(')) { + $position = $count; + $depth = 0; + + while ($depth == 0) { + if ($this->__tokens[$position] == '(') { + $depth++; + } elseif ($this->__tokens[$position] == ')') { + $depth--; + } + $position++; + } + + $mapCount = count($map); + $strings = array(); + while (count($strings) < $mapCount && ($this->__tokens[$position] == ',' || $this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING)) { + if ($this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING) { + $strings[] = $this->__tokens[$position][1]; + } + $position++; + } + + if ($mapCount == count($strings)) { + extract(array_combine($map, $strings)); + if (!isset($domain)) { + $domain = '\'default\''; + } + $string = $this->__formatString($singular); + if (isset($plural)) { + $string .= "\0" . $this->__formatString($plural); + } + $this->__strings[$this->__formatString($domain)][$string][$this->__file][] = $line; + } else { + $this->__markerError($this->__file, $line, $functionName, $count); + } + } + $count++; + } + } + +/** + * Build the translate template file contents out of obtained strings + * + * @return void + * @access private + */ + function __buildFiles() { + foreach ($this->__strings as $domain => $strings) { + foreach ($strings as $string => $files) { + $occurrences = array(); + foreach ($files as $file => $lines) { + $occurrences[] = $file . ':' . implode(';', $lines); + } + $occurrences = implode("\n#: ", $occurrences); + $header = '#: ' . str_replace($this->__paths, '', $occurrences) . "\n"; + + if (strpos($string, "\0") === false) { + $sentence = "msgid \"{$string}\"\n"; + $sentence .= "msgstr \"\"\n\n"; + } else { + list($singular, $plural) = explode("\0", $string); + $sentence = "msgid \"{$singular}\"\n"; + $sentence .= "msgid_plural \"{$plural}\"\n"; + $sentence .= "msgstr[0] \"\"\n"; + $sentence .= "msgstr[1] \"\"\n\n"; + } + + $this->__store($domain, $header, $sentence); + if ($domain != 'default' && $this->__merge) { + $this->__store('default', $header, $sentence); + } + } + } + } + +/** + * Prepare a file to be stored + * + * @return void + * @access private + */ + function __store($domain, $header, $sentence) { + if (!isset($this->__storage[$domain])) { + $this->__storage[$domain] = array(); + } + if (!isset($this->__storage[$domain][$sentence])) { + $this->__storage[$domain][$sentence] = $header; + } else { + $this->__storage[$domain][$sentence] .= $header; + } + } + +/** + * Write the files that need to be stored + * + * @return void + * @access private + */ + function __writeFiles() { + $overwriteAll = false; + foreach ($this->__storage as $domain => $sentences) { + $output = $this->__writeHeader(); + foreach ($sentences as $sentence => $header) { + $output .= $header . $sentence; + } + + $filename = $domain . '.pot'; + $File = new File($this->__output . $filename); + $response = ''; + while ($overwriteAll === false && $File->exists() && strtoupper($response) !== 'Y') { + $this->out(); + $response = $this->in(sprintf(__('Error: %s already exists in this location. Overwrite? [Y]es, [N]o, [A]ll', true), $filename), array('y', 'n', 'a'), 'y'); + if (strtoupper($response) === 'N') { + $response = ''; + while ($response == '') { + $response = $this->in(sprintf(__("What would you like to name this file?\nExample: %s", true), 'new_' . $filename), null, 'new_' . $filename); + $File = new File($this->__output . $response); + $filename = $response; + } + } elseif (strtoupper($response) === 'A') { + $overwriteAll = true; + } + } + $File->write($output); + $File->close(); + } + } + +/** + * Build the translation template header + * + * @return string Translation template header + * @access private + */ + function __writeHeader() { + $output = "# LANGUAGE translation of CakePHP Application\n"; + $output .= "# Copyright YEAR NAME \n"; + $output .= "#\n"; + $output .= "#, fuzzy\n"; + $output .= "msgid \"\"\n"; + $output .= "msgstr \"\"\n"; + $output .= "\"Project-Id-Version: PROJECT VERSION\\n\"\n"; + $output .= "\"POT-Creation-Date: " . date("Y-m-d H:iO") . "\\n\"\n"; + $output .= "\"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\\n\"\n"; + $output .= "\"Last-Translator: NAME \\n\"\n"; + $output .= "\"Language-Team: LANGUAGE \\n\"\n"; + $output .= "\"MIME-Version: 1.0\\n\"\n"; + $output .= "\"Content-Type: text/plain; charset=utf-8\\n\"\n"; + $output .= "\"Content-Transfer-Encoding: 8bit\\n\"\n"; + $output .= "\"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n\"\n\n"; + return $output; + } + +/** + * Format a string to be added as a translateable string + * + * @param string $string String to format + * @return string Formatted string + * @access private + */ + function __formatString($string) { + $quote = substr($string, 0, 1); + $string = substr($string, 1, -1); + if ($quote == '"') { + $string = stripcslashes($string); + } else { + $string = strtr($string, array("\\'" => "'", "\\\\" => "\\")); + } + $string = str_replace("\r\n", "\n", $string); + return addcslashes($string, "\0..\37\\\""); + } + +/** + * Indicate an invalid marker on a processed file + * + * @param string $file File where invalid marker resides + * @param integer $line Line number + * @param string $marker Marker found + * @param integer $count Count + * @return void + * @access private + */ + function __markerError($file, $line, $marker, $count) { + $this->out(sprintf(__("Invalid marker content in %s:%s\n* %s(", true), $file, $line, $marker), true); + $count += 2; + $tokenCount = count($this->__tokens); + $parenthesis = 1; + + while ((($tokenCount - $count) > 0) && $parenthesis) { + if (is_array($this->__tokens[$count])) { + $this->out($this->__tokens[$count][1], false); + } else { + $this->out($this->__tokens[$count], false); + if ($this->__tokens[$count] == '(') { + $parenthesis++; + } + + if ($this->__tokens[$count] == ')') { + $parenthesis--; + } + } + $count++; + } + $this->out("\n", true); + } + +/** + * Search files that may contain translateable strings + * + * @return void + * @access private + */ + function __searchFiles() { + foreach ($this->__paths as $path) { + $Folder = new Folder($path); + $files = $Folder->findRecursive('.*\.(php|ctp|thtml|inc|tpl)', true); + $this->__files = array_merge($this->__files, $files); + } + } +} diff --git a/cake/console/libs/tasks/fixture.php b/cake/console/libs/tasks/fixture.php new file mode 100644 index 0000000..48e2be8 --- /dev/null +++ b/cake/console/libs/tasks/fixture.php @@ -0,0 +1,422 @@ +path = $this->params['working'] . DS . 'tests' . DS . 'fixtures' . DS; + } + +/** + * Execution method always used for tasks + * Handles dispatching to interactive, named, or all processess. + * + * @access public + */ + function execute() { + if (empty($this->args)) { + $this->__interactive(); + } + + if (isset($this->args[0])) { + $this->interactive = false; + if (!isset($this->connection)) { + $this->connection = 'default'; + } + if (strtolower($this->args[0]) == 'all') { + return $this->all(); + } + $model = $this->_modelName($this->args[0]); + $this->bake($model); + } + } + +/** + * Bake All the Fixtures at once. Will only bake fixtures for models that exist. + * + * @access public + * @return void + */ + function all() { + $this->interactive = false; + $this->Model->interactive = false; + $tables = $this->Model->listAll($this->connection, false); + foreach ($tables as $table) { + $model = $this->_modelName($table); + $this->bake($model); + } + } + +/** + * Interactive baking function + * + * @access private + */ + function __interactive() { + $this->DbConfig->interactive = $this->Model->interactive = $this->interactive = true; + $this->hr(); + $this->out(sprintf("Bake Fixture\nPath: %s", $this->path)); + $this->hr(); + + $useDbConfig = $this->connection; + if (!isset($this->connection)) { + $this->connection = $this->DbConfig->getConfig(); + } + $modelName = $this->Model->getName($this->connection); + $useTable = $this->Model->getTable($modelName, $this->connection); + $importOptions = $this->importOptions($modelName); + $this->bake($modelName, $useTable, $importOptions); + } + +/** + * Interacts with the User to setup an array of import options. For a fixture. + * + * @param string $modelName Name of model you are dealing with. + * @return array Array of import options. + * @access public + */ + function importOptions($modelName) { + $options = array(); + $doSchema = $this->in(__('Would you like to import schema for this fixture?', true), array('y', 'n'), 'n'); + if ($doSchema == 'y') { + $options['schema'] = $modelName; + } + $doRecords = $this->in(__('Would you like to use record importing for this fixture?', true), array('y', 'n'), 'n'); + if ($doRecords == 'y') { + $options['records'] = true; + } + if ($doRecords == 'n') { + $prompt = sprintf(__("Would you like to build this fixture with data from %s's table?", true), $modelName); + $fromTable = $this->in($prompt, array('y', 'n'), 'n'); + if (strtolower($fromTable) == 'y') { + $options['fromTable'] = true; + } + } + return $options; + } + +/** + * Assembles and writes a Fixture file + * + * @param string $model Name of model to bake. + * @param string $useTable Name of table to use. + * @param array $importOptions Options for var $import + * @return string Baked fixture content + * @access public + */ + function bake($model, $useTable = false, $importOptions = array()) { + if (!class_exists('CakeSchema')) { + App::import('Model', 'CakeSchema', false); + } + $table = $schema = $records = $import = $modelImport = $recordImport = null; + if (!$useTable) { + $useTable = Inflector::tableize($model); + } elseif ($useTable != Inflector::tableize($model)) { + $table = $useTable; + } + + if (!empty($importOptions)) { + if (isset($importOptions['schema'])) { + $modelImport = "'model' => '{$importOptions['schema']}'"; + } + if (isset($importOptions['records'])) { + $recordImport = "'records' => true"; + } + if ($modelImport && $recordImport) { + $modelImport .= ', '; + } + if (!empty($modelImport) || !empty($recordImport)) { + $import = sprintf("array(%s%s)", $modelImport, $recordImport); + } + } + + $this->_Schema = new CakeSchema(); + $data = $this->_Schema->read(array('models' => false, 'connection' => $this->connection)); + + if (!isset($data['tables'][$useTable])) { + $this->err('Could not find your selected table ' . $useTable); + return false; + } + + $tableInfo = $data['tables'][$useTable]; + if (is_null($modelImport)) { + $schema = $this->_generateSchema($tableInfo); + } + + if (!isset($importOptions['records']) && !isset($importOptions['fromTable'])) { + $recordCount = 1; + if (isset($this->params['count'])) { + $recordCount = $this->params['count']; + } + $records = $this->_makeRecordString($this->_generateRecords($tableInfo, $recordCount)); + } + if (isset($this->params['records']) || isset($importOptions['fromTable'])) { + $records = $this->_makeRecordString($this->_getRecordsFromTable($model, $useTable)); + } + $out = $this->generateFixtureFile($model, compact('records', 'table', 'schema', 'import', 'fields')); + return $out; + } + +/** + * Generate the fixture file, and write to disk + * + * @param string $model name of the model being generated + * @param string $fixture Contents of the fixture file. + * @return string Content saved into fixture file. + * @access public + */ + function generateFixtureFile($model, $otherVars) { + $defaults = array('table' => null, 'schema' => null, 'records' => null, 'import' => null, 'fields' => null); + $vars = array_merge($defaults, $otherVars); + + $path = $this->getPath(); + $filename = Inflector::underscore($model) . '_fixture.php'; + + $this->Template->set('model', $model); + $this->Template->set($vars); + $content = $this->Template->generate('classes', 'fixture'); + + $this->out("\nBaking test fixture for $model..."); + $this->createFile($path . $filename, $content); + return $content; + } + +/** + * Get the path to the fixtures. + * + * @return void + */ + function getPath() { + $path = $this->path; + if (isset($this->plugin)) { + $path = $this->_pluginPath($this->plugin) . 'tests' . DS . 'fixtures' . DS; + } + return $path; + } + +/** + * Generates a string representation of a schema. + * + * @param array $table Table schema array + * @return string fields definitions + * @access protected + */ + function _generateSchema($tableInfo) { + $schema = $this->_Schema->generateTable('f', $tableInfo); + return substr($schema, 10, -2); + } + +/** + * Generate String representation of Records + * + * @param array $table Table schema array + * @return array Array of records to use in the fixture. + * @access protected + */ + function _generateRecords($tableInfo, $recordCount = 1) { + $records = array(); + for ($i = 0; $i < $recordCount; $i++) { + $record = array(); + foreach ($tableInfo as $field => $fieldInfo) { + if (empty($fieldInfo['type'])) { + continue; + } + switch ($fieldInfo['type']) { + case 'integer': + case 'float': + $insert = $i + 1; + break; + case 'string': + case 'binary': + $isPrimaryUuid = ( + isset($fieldInfo['key']) && strtolower($fieldInfo['key']) == 'primary' && + isset($fieldInfo['length']) && $fieldInfo['length'] == 36 + ); + if ($isPrimaryUuid) { + $insert = String::uuid(); + } else { + $insert = "Lorem ipsum dolor sit amet"; + if (!empty($fieldInfo['length'])) { + $insert = substr($insert, 0, (int)$fieldInfo['length'] - 2); + } + } + $insert = "'$insert'"; + break; + case 'timestamp': + $ts = time(); + $insert = "'$ts'"; + break; + case 'datetime': + $ts = date('Y-m-d H:i:s'); + $insert = "'$ts'"; + break; + case 'date': + $ts = date('Y-m-d'); + $insert = "'$ts'"; + break; + case 'time': + $ts = date('H:i:s'); + $insert = "'$ts'"; + break; + case 'boolean': + $insert = 1; + break; + case 'text': + $insert = "'Lorem ipsum dolor sit amet, aliquet feugiat."; + $insert .= " Convallis morbi fringilla gravida,"; + $insert .= " phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin"; + $insert .= " venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla"; + $insert .= " vestibulum massa neque ut et, id hendrerit sit,"; + $insert .= " feugiat in taciti enim proin nibh, tempor dignissim, rhoncus"; + $insert .= " duis vestibulum nunc mattis convallis.'"; + break; + } + $record[$field] = $insert; + } + $records[] = $record; + } + return $records; + } + +/** + * Convert a $records array into a a string. + * + * @param array $records Array of records to be converted to string + * @return string A string value of the $records array. + * @access protected + */ + function _makeRecordString($records) { + $out = "array(\n"; + foreach ($records as $record) { + $values = array(); + foreach ($record as $field => $value) { + $values[] = "\t\t\t'$field' => $value"; + } + $out .= "\t\tarray(\n"; + $out .= implode(",\n", $values); + $out .= "\n\t\t),\n"; + } + $out .= "\t)"; + return $out; + } + +/** + * Interact with the user to get a custom SQL condition and use that to extract data + * to build a fixture. + * + * @param string $modelName name of the model to take records from. + * @param string $useTable Name of table to use. + * @return array Array of records. + * @access protected + */ + function _getRecordsFromTable($modelName, $useTable = null) { + if ($this->interactive) { + $condition = null; + $prompt = __("Please provide a SQL fragment to use as conditions\nExample: WHERE 1=1 LIMIT 10", true); + while (!$condition) { + $condition = $this->in($prompt, null, 'WHERE 1=1 LIMIT 10'); + } + } else { + $condition = 'WHERE 1=1 LIMIT ' . (isset($this->params['count']) ? $this->params['count'] : 10); + } + App::import('Model', 'Model', false); + $modelObject =& new Model(array('name' => $modelName, 'table' => $useTable, 'ds' => $this->connection)); + $records = $modelObject->find('all', array( + 'conditions' => $condition, + 'recursive' => -1 + )); + $db =& ConnectionManager::getDataSource($modelObject->useDbConfig); + $schema = $modelObject->schema(true); + $out = array(); + foreach ($records as $record) { + $row = array(); + foreach ($record[$modelObject->alias] as $field => $value) { + $row[$field] = $db->value($value, $schema[$field]['type']); + } + $out[] = $row; + } + return $out; + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake fixture "); + $this->hr(); + $this->out('Arguments:'); + $this->out(); + $this->out(""); + $this->out("\tName of the fixture to bake. Can use Plugin.name"); + $this->out("\tas a shortcut for plugin baking."); + $this->out(); + $this->out('Commands:'); + $this->out("\nfixture \n\tbakes fixture with specified name."); + $this->out("\nfixture all\n\tbakes all fixtures."); + $this->out(); + $this->out('Parameters:'); + $this->out("\t-count When using generated data, the number of records to include in the fixture(s)."); + $this->out("\t-connection Which database configuration to use for baking."); + $this->out("\t-plugin CamelCased name of plugin to bake fixtures for."); + $this->out("\t-records Used with -count and /all commands to pull [n] records from the live tables"); + $this->out("\t Where [n] is either -count or the default of 10."); + $this->out(); + $this->_stop(); + } +} diff --git a/cake/console/libs/tasks/model.php b/cake/console/libs/tasks/model.php new file mode 100644 index 0000000..6e54f08 --- /dev/null +++ b/cake/console/libs/tasks/model.php @@ -0,0 +1,930 @@ +args)) { + $this->__interactive(); + } + + if (!empty($this->args[0])) { + $this->interactive = false; + if (!isset($this->connection)) { + $this->connection = 'default'; + } + if (strtolower($this->args[0]) == 'all') { + return $this->all(); + } + $model = $this->_modelName($this->args[0]); + $object = $this->_getModelObject($model); + if ($this->bake($object, false)) { + if ($this->_checkUnitTest()) { + $this->bakeFixture($model); + $this->bakeTest($model); + } + } + } + } + +/** + * Bake all models at once. + * + * @return void + */ + function all() { + $this->listAll($this->connection, false); + $unitTestExists = $this->_checkUnitTest(); + foreach ($this->_tables as $table) { + if (in_array($table, $this->skipTables)) { + continue; + } + $modelClass = Inflector::classify($table); + $this->out(sprintf(__('Baking %s', true), $modelClass)); + $object = $this->_getModelObject($modelClass); + if ($this->bake($object, false) && $unitTestExists) { + $this->bakeFixture($modelClass); + $this->bakeTest($modelClass); + } + } + } + +/** + * Get a model object for a class name. + * + * @param string $className Name of class you want model to be. + * @return object Model instance + */ + function &_getModelObject($className, $table = null) { + if (!$table) { + $table = Inflector::tableize($className); + } + $object =& new Model(array('name' => $className, 'table' => $table, 'ds' => $this->connection)); + return $object; + } + +/** + * Generate a key value list of options and a prompt. + * + * @param array $options Array of options to use for the selections. indexes must start at 0 + * @param string $prompt Prompt to use for options list. + * @param integer $default The default option for the given prompt. + * @return result of user choice. + */ + function inOptions($options, $prompt = null, $default = null) { + $valid = false; + $max = count($options); + while (!$valid) { + foreach ($options as $i => $option) { + $this->out($i + 1 .'. ' . $option); + } + if (empty($prompt)) { + $prompt = __('Make a selection from the choices above', true); + } + $choice = $this->in($prompt, null, $default); + if (intval($choice) > 0 && intval($choice) <= $max) { + $valid = true; + } + } + return $choice - 1; + } + +/** + * Handles interactive baking + * + * @access private + */ + function __interactive() { + $this->hr(); + $this->out(sprintf("Bake Model\nPath: %s", $this->path)); + $this->hr(); + $this->interactive = true; + + $primaryKey = 'id'; + $validate = $associations = array(); + + if (empty($this->connection)) { + $this->connection = $this->DbConfig->getConfig(); + } + $currentModelName = $this->getName(); + $useTable = $this->getTable($currentModelName); + $db =& ConnectionManager::getDataSource($this->connection); + $fullTableName = $db->fullTableName($useTable); + + if (in_array($useTable, $this->_tables)) { + $tempModel = new Model(array('name' => $currentModelName, 'table' => $useTable, 'ds' => $this->connection)); + $fields = $tempModel->schema(true); + if (!array_key_exists('id', $fields)) { + $primaryKey = $this->findPrimaryKey($fields); + } + } else { + $this->err(sprintf(__('Table %s does not exist, cannot bake a model without a table.', true), $useTable)); + $this->_stop(); + return false; + } + $displayField = $tempModel->hasField(array('name', 'title')); + if (!$displayField) { + $displayField = $this->findDisplayField($tempModel->schema()); + } + + $prompt = __("Would you like to supply validation criteria \nfor the fields in your model?", true); + $wannaDoValidation = $this->in($prompt, array('y','n'), 'y'); + if (array_search($useTable, $this->_tables) !== false && strtolower($wannaDoValidation) == 'y') { + $validate = $this->doValidation($tempModel); + } + + $prompt = __("Would you like to define model associations\n(hasMany, hasOne, belongsTo, etc.)?", true); + $wannaDoAssoc = $this->in($prompt, array('y','n'), 'y'); + if (strtolower($wannaDoAssoc) == 'y') { + $associations = $this->doAssociations($tempModel); + } + + $this->out(); + $this->hr(); + $this->out(__('The following Model will be created:', true)); + $this->hr(); + $this->out("Name: " . $currentModelName); + + if ($this->connection !== 'default') { + $this->out(sprintf(__("DB Config: %s", true), $this->connection)); + } + if ($fullTableName !== Inflector::tableize($currentModelName)) { + $this->out(sprintf(__("DB Table: %s", true), $fullTableName)); + } + if ($primaryKey != 'id') { + $this->out(sprintf(__("Primary Key: %s", true), $primaryKey)); + } + if (!empty($validate)) { + $this->out(sprintf(__("Validation: %s", true), print_r($validate, true))); + } + if (!empty($associations)) { + $this->out(__("Associations:", true)); + $assocKeys = array('belongsTo', 'hasOne', 'hasMany', 'hasAndBelongsToMany'); + foreach ($assocKeys as $assocKey) { + $this->_printAssociation($currentModelName, $assocKey, $associations); + } + } + + $this->hr(); + $looksGood = $this->in(__('Look okay?', true), array('y','n'), 'y'); + + if (strtolower($looksGood) == 'y') { + $vars = compact('associations', 'validate', 'primaryKey', 'useTable', 'displayField'); + $vars['useDbConfig'] = $this->connection; + if ($this->bake($currentModelName, $vars)) { + if ($this->_checkUnitTest()) { + $this->bakeFixture($currentModelName, $useTable); + $this->bakeTest($currentModelName, $useTable, $associations); + } + } + } else { + return false; + } + } + +/** + * Print out all the associations of a particular type + * + * @param string $modelName Name of the model relations belong to. + * @param string $type Name of association you want to see. i.e. 'belongsTo' + * @param string $associations Collection of associations. + * @access protected + * @return void + */ + function _printAssociation($modelName, $type, $associations) { + if (!empty($associations[$type])) { + for ($i = 0; $i < count($associations[$type]); $i++) { + $out = "\t" . $modelName . ' ' . $type . ' ' . $associations[$type][$i]['alias']; + $this->out($out); + } + } + } + +/** + * Finds a primary Key in a list of fields. + * + * @param array $fields Array of fields that might have a primary key. + * @return string Name of field that is a primary key. + * @access public + */ + function findPrimaryKey($fields) { + foreach ($fields as $name => $field) { + if (isset($field['key']) && $field['key'] == 'primary') { + break; + } + } + return $this->in(__('What is the primaryKey?', true), null, $name); + } + +/** + * interact with the user to find the displayField value for a model. + * + * @param array $fields Array of fields to look for and choose as a displayField + * @return mixed Name of field to use for displayField or false if the user declines to choose + */ + function findDisplayField($fields) { + $fieldNames = array_keys($fields); + $prompt = __("A displayField could not be automatically detected\nwould you like to choose one?", true); + $continue = $this->in($prompt, array('y', 'n')); + if (strtolower($continue) == 'n') { + return false; + } + $prompt = __('Choose a field from the options above:', true); + $choice = $this->inOptions($fieldNames, $prompt); + return $fieldNames[$choice]; + } + +/** + * Handles Generation and user interaction for creating validation. + * + * @param object $model Model to have validations generated for. + * @return array $validate Array of user selected validations. + * @access public + */ + function doValidation(&$model) { + if (!is_object($model)) { + return false; + } + $fields = $model->schema(); + + if (empty($fields)) { + return false; + } + $validate = array(); + $this->initValidations(); + foreach ($fields as $fieldName => $field) { + $validation = $this->fieldValidation($fieldName, $field, $model->primaryKey); + if (!empty($validation)) { + $validate[$fieldName] = $validation; + } + } + return $validate; + } + +/** + * Populate the _validations array + * + * @return void + */ + function initValidations() { + $options = $choices = array(); + if (class_exists('Validation')) { + $parent = get_class_methods(get_parent_class('Validation')); + $options = get_class_methods('Validation'); + $options = array_diff($options, $parent); + } + sort($options); + $default = 1; + foreach ($options as $key => $option) { + if ($option{0} != '_' && strtolower($option) != 'getinstance') { + $choices[$default] = strtolower($option); + $default++; + } + } + $this->_validations = $choices; + return $choices; + } + +/** + * Does individual field validation handling. + * + * @param string $fieldName Name of field to be validated. + * @param array $metaData metadata for field + * @return array Array of validation for the field. + */ + function fieldValidation($fieldName, $metaData, $primaryKey = 'id') { + $defaultChoice = count($this->_validations); + $validate = $alreadyChosen = array(); + + $anotherValidator = 'y'; + while ($anotherValidator == 'y') { + if ($this->interactive) { + $this->out(); + $this->out(sprintf(__('Field: %s', true), $fieldName)); + $this->out(sprintf(__('Type: %s', true), $metaData['type'])); + $this->hr(); + $this->out(__('Please select one of the following validation options:', true)); + $this->hr(); + } + + $prompt = ''; + for ($i = 1; $i < $defaultChoice; $i++) { + $prompt .= $i . ' - ' . $this->_validations[$i] . "\n"; + } + $prompt .= sprintf(__("%s - Do not do any validation on this field.\n", true), $defaultChoice); + $prompt .= __("... or enter in a valid regex validation string.\n", true); + + $methods = array_flip($this->_validations); + $guess = $defaultChoice; + if ($metaData['null'] != 1 && !in_array($fieldName, array($primaryKey, 'created', 'modified', 'updated'))) { + if ($fieldName == 'email') { + $guess = $methods['email']; + } elseif ($metaData['type'] == 'string') { + $guess = $methods['notempty']; + } elseif ($metaData['type'] == 'integer') { + $guess = $methods['numeric']; + } elseif ($metaData['type'] == 'boolean') { + $guess = $methods['boolean']; + } elseif ($metaData['type'] == 'date') { + $guess = $methods['date']; + } elseif ($metaData['type'] == 'time') { + $guess = $methods['time']; + } + } + + if ($this->interactive === true) { + $choice = $this->in($prompt, null, $guess); + if (in_array($choice, $alreadyChosen)) { + $this->out(__("You have already chosen that validation rule,\nplease choose again", true)); + continue; + } + if (!isset($this->_validations[$choice]) && is_numeric($choice)) { + $this->out(__('Please make a valid selection.', true)); + continue; + } + $alreadyChosen[] = $choice; + } else { + $choice = $guess; + } + + if (isset($this->_validations[$choice])) { + $validatorName = $this->_validations[$choice]; + } else { + $validatorName = Inflector::slug($choice); + } + + if ($choice != $defaultChoice) { + if (is_numeric($choice) && isset($this->_validations[$choice])) { + $validate[$validatorName] = $this->_validations[$choice]; + } else { + $validate[$validatorName] = $choice; + } + } + if ($this->interactive == true && $choice != $defaultChoice) { + $anotherValidator = $this->in(__('Would you like to add another validation rule?', true), array('y', 'n'), 'n'); + } else { + $anotherValidator = 'n'; + } + } + return $validate; + } + +/** + * Handles associations + * + * @param object $model + * @return array $assocaitons + * @access public + */ + function doAssociations(&$model) { + if (!is_object($model)) { + return false; + } + if ($this->interactive === true) { + $this->out(__('One moment while the associations are detected.', true)); + } + + $fields = $model->schema(true); + if (empty($fields)) { + return false; + } + + if (empty($this->_tables)) { + $this->_tables = $this->getAllTables(); + } + + $associations = array( + 'belongsTo' => array(), 'hasMany' => array(), 'hasOne'=> array(), 'hasAndBelongsToMany' => array() + ); + $possibleKeys = array(); + + $associations = $this->findBelongsTo($model, $associations); + $associations = $this->findHasOneAndMany($model, $associations); + $associations = $this->findHasAndBelongsToMany($model, $associations); + + if ($this->interactive !== true) { + unset($associations['hasOne']); + } + + if ($this->interactive === true) { + $this->hr(); + if (empty($associations)) { + $this->out(__('None found.', true)); + } else { + $this->out(__('Please confirm the following associations:', true)); + $this->hr(); + $associations = $this->confirmAssociations($model, $associations); + } + $associations = $this->doMoreAssociations($model, $associations); + } + return $associations; + } + +/** + * Find belongsTo relations and add them to the associations list. + * + * @param object $model Model instance of model being generated. + * @param array $associations Array of inprogress associations + * @return array $associations with belongsTo added in. + */ + function findBelongsTo(&$model, $associations) { + $fields = $model->schema(true); + foreach ($fields as $fieldName => $field) { + $offset = strpos($fieldName, '_id'); + if ($fieldName != $model->primaryKey && $fieldName != 'parent_id' && $offset !== false) { + $tmpModelName = $this->_modelNameFromKey($fieldName); + $associations['belongsTo'][] = array( + 'alias' => $tmpModelName, + 'className' => $tmpModelName, + 'foreignKey' => $fieldName, + ); + } elseif ($fieldName == 'parent_id') { + $associations['belongsTo'][] = array( + 'alias' => 'Parent' . $model->name, + 'className' => $model->name, + 'foreignKey' => $fieldName, + ); + } + } + return $associations; + } + +/** + * Find the hasOne and HasMany relations and add them to associations list + * + * @param object $model Model instance being generated + * @param array $associations Array of inprogress associations + * @return array $associations with hasOne and hasMany added in. + */ + function findHasOneAndMany(&$model, $associations) { + $foreignKey = $this->_modelKey($model->name); + foreach ($this->_tables as $otherTable) { + $tempOtherModel = $this->_getModelObject($this->_modelName($otherTable), $otherTable); + $modelFieldsTemp = $tempOtherModel->schema(true); + + $pattern = '/_' . preg_quote($model->table, '/') . '|' . preg_quote($model->table, '/') . '_/'; + $possibleJoinTable = preg_match($pattern , $otherTable); + if ($possibleJoinTable == true) { + continue; + } + foreach ($modelFieldsTemp as $fieldName => $field) { + $assoc = false; + if ($fieldName != $model->primaryKey && $fieldName == $foreignKey) { + $assoc = array( + 'alias' => $tempOtherModel->name, + 'className' => $tempOtherModel->name, + 'foreignKey' => $fieldName + ); + } elseif ($otherTable == $model->table && $fieldName == 'parent_id') { + $assoc = array( + 'alias' => 'Child' . $model->name, + 'className' => $model->name, + 'foreignKey' => $fieldName + ); + } + if ($assoc) { + $associations['hasOne'][] = $assoc; + $associations['hasMany'][] = $assoc; + } + + } + } + return $associations; + } + +/** + * Find the hasAndBelongsToMany relations and add them to associations list + * + * @param object $model Model instance being generated + * @param array $associations Array of inprogress associations + * @return array $associations with hasAndBelongsToMany added in. + */ + function findHasAndBelongsToMany(&$model, $associations) { + $foreignKey = $this->_modelKey($model->name); + foreach ($this->_tables as $otherTable) { + $tempOtherModel = $this->_getModelObject($this->_modelName($otherTable), $otherTable); + $modelFieldsTemp = $tempOtherModel->schema(true); + + $offset = strpos($otherTable, $model->table . '_'); + $otherOffset = strpos($otherTable, '_' . $model->table); + + if ($offset !== false) { + $offset = strlen($model->table . '_'); + $habtmName = $this->_modelName(substr($otherTable, $offset)); + $associations['hasAndBelongsToMany'][] = array( + 'alias' => $habtmName, + 'className' => $habtmName, + 'foreignKey' => $foreignKey, + 'associationForeignKey' => $this->_modelKey($habtmName), + 'joinTable' => $otherTable + ); + } elseif ($otherOffset !== false) { + $habtmName = $this->_modelName(substr($otherTable, 0, $otherOffset)); + $associations['hasAndBelongsToMany'][] = array( + 'alias' => $habtmName, + 'className' => $habtmName, + 'foreignKey' => $foreignKey, + 'associationForeignKey' => $this->_modelKey($habtmName), + 'joinTable' => $otherTable + ); + } + } + return $associations; + } + +/** + * Interact with the user and confirm associations. + * + * @param array $model Temporary Model instance. + * @param array $associations Array of associations to be confirmed. + * @return array Array of confirmed associations + */ + function confirmAssociations(&$model, $associations) { + foreach ($associations as $type => $settings) { + if (!empty($associations[$type])) { + $count = count($associations[$type]); + $response = 'y'; + foreach ($associations[$type] as $i => $assoc) { + $prompt = "{$model->name} {$type} {$assoc['alias']}?"; + $response = $this->in($prompt, array('y','n'), 'y'); + + if ('n' == strtolower($response)) { + unset($associations[$type][$i]); + } elseif ($type == 'hasMany') { + unset($associations['hasOne'][$i]); + } + } + $associations[$type] = array_merge($associations[$type]); + } + } + return $associations; + } + +/** + * Interact with the user and generate additional non-conventional associations + * + * @param object $model Temporary model instance + * @param array $associations Array of associations. + * @return array Array of associations. + */ + function doMoreAssociations($model, $associations) { + $prompt = __('Would you like to define some additional model associations?', true); + $wannaDoMoreAssoc = $this->in($prompt, array('y','n'), 'n'); + $possibleKeys = $this->_generatePossibleKeys(); + while (strtolower($wannaDoMoreAssoc) == 'y') { + $assocs = array('belongsTo', 'hasOne', 'hasMany', 'hasAndBelongsToMany'); + $this->out(__('What is the association type?', true)); + $assocType = intval($this->inOptions($assocs, __('Enter a number',true))); + + $this->out(__("For the following options be very careful to match your setup exactly.\nAny spelling mistakes will cause errors.", true)); + $this->hr(); + + $alias = $this->in(__('What is the alias for this association?', true)); + $className = $this->in(sprintf(__('What className will %s use?', true), $alias), null, $alias ); + $suggestedForeignKey = null; + + if ($assocType == 0) { + $showKeys = $possibleKeys[$model->table]; + $suggestedForeignKey = $this->_modelKey($alias); + } else { + $otherTable = Inflector::tableize($className); + if (in_array($otherTable, $this->_tables)) { + if ($assocType < 3) { + $showKeys = $possibleKeys[$otherTable]; + } else { + $showKeys = null; + } + } else { + $otherTable = $this->in(__('What is the table for this model?', true)); + $showKeys = $possibleKeys[$otherTable]; + } + $suggestedForeignKey = $this->_modelKey($model->name); + } + if (!empty($showKeys)) { + $this->out(__('A helpful List of possible keys', true)); + $foreignKey = $this->inOptions($showKeys, __('What is the foreignKey?', true)); + $foreignKey = $showKeys[intval($foreignKey)]; + } + if (!isset($foreignKey)) { + $foreignKey = $this->in(__('What is the foreignKey? Specify your own.', true), null, $suggestedForeignKey); + } + if ($assocType == 3) { + $associationForeignKey = $this->in(__('What is the associationForeignKey?', true), null, $this->_modelKey($model->name)); + $joinTable = $this->in(__('What is the joinTable?', true)); + } + $associations[$assocs[$assocType]] = array_values((array)$associations[$assocs[$assocType]]); + $count = count($associations[$assocs[$assocType]]); + $i = ($count > 0) ? $count : 0; + $associations[$assocs[$assocType]][$i]['alias'] = $alias; + $associations[$assocs[$assocType]][$i]['className'] = $className; + $associations[$assocs[$assocType]][$i]['foreignKey'] = $foreignKey; + if ($assocType == 3) { + $associations[$assocs[$assocType]][$i]['associationForeignKey'] = $associationForeignKey; + $associations[$assocs[$assocType]][$i]['joinTable'] = $joinTable; + } + $wannaDoMoreAssoc = $this->in(__('Define another association?', true), array('y','n'), 'y'); + } + return $associations; + } + +/** + * Finds all possible keys to use on custom associations. + * + * @return array array of tables and possible keys + */ + function _generatePossibleKeys() { + $possible = array(); + foreach ($this->_tables as $otherTable) { + $tempOtherModel = & new Model(array('table' => $otherTable, 'ds' => $this->connection)); + $modelFieldsTemp = $tempOtherModel->schema(true); + foreach ($modelFieldsTemp as $fieldName => $field) { + if ($field['type'] == 'integer' || $field['type'] == 'string') { + $possible[$otherTable][] = $fieldName; + } + } + } + return $possible; + } + +/** + * Assembles and writes a Model file. + * + * @param mixed $name Model name or object + * @param mixed $data if array and $name is not an object assume bake data, otherwise boolean. + * @access private + */ + function bake($name, $data = array()) { + if (is_object($name)) { + if ($data == false) { + $data = $associations = array(); + $data['associations'] = $this->doAssociations($name, $associations); + $data['validate'] = $this->doValidation($name); + } + $data['primaryKey'] = $name->primaryKey; + $data['useTable'] = $name->table; + $data['useDbConfig'] = $name->useDbConfig; + $data['name'] = $name = $name->name; + } else { + $data['name'] = $name; + } + $defaults = array('associations' => array(), 'validate' => array(), 'primaryKey' => 'id', + 'useTable' => null, 'useDbConfig' => 'default', 'displayField' => null); + $data = array_merge($defaults, $data); + + $this->Template->set($data); + $this->Template->set('plugin', Inflector::camelize($this->plugin)); + $out = $this->Template->generate('classes', 'model'); + + $path = $this->getPath(); + $filename = $path . Inflector::underscore($name) . '.php'; + $this->out("\nBaking model class for $name..."); + $this->createFile($filename, $out); + ClassRegistry::flush(); + return $out; + } + +/** + * Assembles and writes a unit test file + * + * @param string $className Model class name + * @access private + */ + function bakeTest($className) { + $this->Test->interactive = $this->interactive; + $this->Test->plugin = $this->plugin; + $this->Test->connection = $this->connection; + return $this->Test->bake('Model', $className); + } + +/** + * outputs the a list of possible models or controllers from database + * + * @param string $useDbConfig Database configuration name + * @access public + */ + function listAll($useDbConfig = null) { + $this->_tables = $this->getAllTables($useDbConfig); + + if ($this->interactive === true) { + $this->out(__('Possible Models based on your current database:', true)); + $this->_modelNames = array(); + $count = count($this->_tables); + for ($i = 0; $i < $count; $i++) { + $this->_modelNames[] = $this->_modelName($this->_tables[$i]); + $this->out($i + 1 . ". " . $this->_modelNames[$i]); + } + } + return $this->_tables; + } + +/** + * Interact with the user to determine the table name of a particular model + * + * @param string $modelName Name of the model you want a table for. + * @param string $useDbConfig Name of the database config you want to get tables from. + * @return void + */ + function getTable($modelName, $useDbConfig = null) { + if (!isset($useDbConfig)) { + $useDbConfig = $this->connection; + } + App::import('Model', 'ConnectionManager', false); + + $db =& ConnectionManager::getDataSource($useDbConfig); + $useTable = Inflector::tableize($modelName); + $fullTableName = $db->fullTableName($useTable, false); + $tableIsGood = false; + + if (array_search($useTable, $this->_tables) === false) { + $this->out(); + $this->out(sprintf(__("Given your model named '%s',\nCake would expect a database table named '%s'", true), $modelName, $fullTableName)); + $tableIsGood = $this->in(__('Do you want to use this table?', true), array('y','n'), 'y'); + } + if (strtolower($tableIsGood) == 'n') { + $useTable = $this->in(__('What is the name of the table?', true)); + } + return $useTable; + } + +/** + * Get an Array of all the tables in the supplied connection + * will halt the script if no tables are found. + * + * @param string $useDbConfig Connection name to scan. + * @return array Array of tables in the database. + */ + function getAllTables($useDbConfig = null) { + if (!isset($useDbConfig)) { + $useDbConfig = $this->connection; + } + App::import('Model', 'ConnectionManager', false); + + $tables = array(); + $db =& ConnectionManager::getDataSource($useDbConfig); + $db->cacheSources = false; + $usePrefix = empty($db->config['prefix']) ? '' : $db->config['prefix']; + if ($usePrefix) { + foreach ($db->listSources() as $table) { + if (!strncmp($table, $usePrefix, strlen($usePrefix))) { + $tables[] = substr($table, strlen($usePrefix)); + } + } + } else { + $tables = $db->listSources(); + } + if (empty($tables)) { + $this->err(__('Your database does not have any tables.', true)); + $this->_stop(); + } + return $tables; + } + +/** + * Forces the user to specify the model he wants to bake, and returns the selected model name. + * + * @return string the model name + * @access public + */ + function getName($useDbConfig = null) { + $this->listAll($useDbConfig); + + $enteredModel = ''; + + while ($enteredModel == '') { + $enteredModel = $this->in(__("Enter a number from the list above,\ntype in the name of another model, or 'q' to exit", true), null, 'q'); + + if ($enteredModel === 'q') { + $this->out(__("Exit", true)); + $this->_stop(); + } + + if ($enteredModel == '' || intval($enteredModel) > count($this->_modelNames)) { + $this->err(__("The model name you supplied was empty,\nor the number you selected was not an option. Please try again.", true)); + $enteredModel = ''; + } + } + if (intval($enteredModel) > 0 && intval($enteredModel) <= count($this->_modelNames)) { + $currentModelName = $this->_modelNames[intval($enteredModel) - 1]; + } else { + $currentModelName = $enteredModel; + } + return $currentModelName; + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake model "); + $this->hr(); + $this->out('Arguments:'); + $this->out(); + $this->out(""); + $this->out("\tName of the model to bake. Can use Plugin.name"); + $this->out("\tas a shortcut for plugin baking."); + $this->out(); + $this->out('Commands:'); + $this->out(); + $this->out("model"); + $this->out("\tbakes model in interactive mode."); + $this->out(); + $this->out("model "); + $this->out("\tbakes model file with no associations or validation"); + $this->out(); + $this->out("model all"); + $this->out("\tbakes all model files with associations and validation"); + $this->out(); + $this->_stop(); + } + +/** + * Interact with FixtureTask to automatically bake fixtures when baking models. + * + * @param string $className Name of class to bake fixture for + * @param string $useTable Optional table name for fixture to use. + * @access public + * @return void + * @see FixtureTask::bake + */ + function bakeFixture($className, $useTable = null) { + $this->Fixture->interactive = $this->interactive; + $this->Fixture->connection = $this->connection; + $this->Fixture->plugin = $this->plugin; + $this->Fixture->bake($className, $useTable); + } +} diff --git a/cake/console/libs/tasks/plugin.php b/cake/console/libs/tasks/plugin.php new file mode 100644 index 0000000..94d9e26 --- /dev/null +++ b/cake/console/libs/tasks/plugin.php @@ -0,0 +1,247 @@ +path = APP . 'plugins' . DS; + } + +/** + * Execution method always used for tasks + * + * @return void + */ + function execute() { + if (empty($this->params['skel'])) { + $this->params['skel'] = ''; + if (is_dir(CAKE_CORE_INCLUDE_PATH . DS . CAKE . 'console' . DS . 'templates' . DS . 'skel') === true) { + $this->params['skel'] = CAKE_CORE_INCLUDE_PATH . DS . CAKE . 'console' . DS . 'templates' . DS . 'skel'; + } + } + $plugin = null; + + if (isset($this->args[0])) { + $plugin = Inflector::camelize($this->args[0]); + $pluginPath = $this->_pluginPath($plugin); + $this->Dispatch->shiftArgs(); + if (is_dir($pluginPath)) { + $this->out(sprintf(__('Plugin: %s', true), $plugin)); + $this->out(sprintf(__('Path: %s', true), $pluginPath)); + } elseif (isset($this->args[0])) { + $this->err(sprintf(__('%s in path %s not found.', true), $plugin, $pluginPath)); + $this->_stop(); + } else { + $this->__interactive($plugin); + } + } else { + return $this->__interactive(); + } + + if (isset($this->args[0])) { + $task = Inflector::classify($this->args[0]); + $this->Dispatch->shiftArgs(); + if (in_array($task, $this->tasks)) { + $this->{$task}->plugin = $plugin; + $this->{$task}->path = $pluginPath . Inflector::underscore(Inflector::pluralize($task)) . DS; + + if (!is_dir($this->{$task}->path)) { + $this->err(sprintf(__("%s directory could not be found.\nBe sure you have created %s", true), $task, $this->{$task}->path)); + } + $this->{$task}->loadTasks(); + return $this->{$task}->execute(); + } + } + } + +/** + * Interactive interface + * + * @access private + * @return void + */ + function __interactive($plugin = null) { + while ($plugin === null) { + $plugin = $this->in(__('Enter the name of the plugin in CamelCase format', true)); + } + + if (!$this->bake($plugin)) { + $this->err(sprintf(__("An error occured trying to bake: %s in %s", true), $plugin, $this->path . Inflector::underscore($pluginPath))); + } + } + +/** + * Bake the plugin, create directories and files + * + * @params $plugin name of the plugin in CamelCased format + * @access public + * @return bool + */ + function bake($plugin) { + $pluginPath = Inflector::underscore($plugin); + + $pathOptions = App::path('plugins'); + if (count($pathOptions) > 1) { + $this->findPath($pathOptions); + } + $this->hr(); + $this->out(sprintf(__("Plugin Name: %s", true), $plugin)); + $this->out(sprintf(__("Plugin Directory: %s", true), $this->path . $pluginPath)); + $this->hr(); + + $looksGood = $this->in(__('Look okay?', true), array('y', 'n', 'q'), 'y'); + + if (strtolower($looksGood) == 'y') { + $verbose = $this->in(__('Do you want verbose output?', true), array('y', 'n'), 'n'); + + $Folder =& new Folder($this->path . $pluginPath); + $directories = array( + 'config' . DS . 'schema', + 'models' . DS . 'behaviors', + 'models' . DS . 'datasources', + 'controllers' . DS . 'components', + 'libs', + 'views' . DS . 'helpers', + 'tests' . DS . 'cases' . DS . 'components', + 'tests' . DS . 'cases' . DS . 'helpers', + 'tests' . DS . 'cases' . DS . 'behaviors', + 'tests' . DS . 'cases' . DS . 'controllers', + 'tests' . DS . 'cases' . DS . 'models', + 'tests' . DS . 'groups', + 'tests' . DS . 'fixtures', + 'vendors', + 'vendors' . DS . 'shells' . DS . 'tasks', + 'webroot' + ); + + foreach ($directories as $directory) { + $dirPath = $this->path . $pluginPath . DS . $directory; + $Folder->create($dirPath); + $File =& new File($dirPath . DS . 'empty', true); + } + + if (strtolower($verbose) == 'y') { + foreach ($Folder->messages() as $message) { + $this->out($message); + } + } + + $errors = $Folder->errors(); + if (!empty($errors)) { + return false; + } + + $controllerFileName = $pluginPath . '_app_controller.php'; + + $out = ""; + $this->createFile($this->path . $pluginPath. DS . $controllerFileName, $out); + + $modelFileName = $pluginPath . '_app_model.php'; + + $out = ""; + $this->createFile($this->path . $pluginPath . DS . $modelFileName, $out); + + $this->hr(); + $this->out(sprintf(__("Created: %s in %s", true), $plugin, $this->path . $pluginPath)); + $this->hr(); + } + + return true; + } + +/** + * find and change $this->path to the user selection + * + * @return void + */ + function findPath($pathOptions) { + $valid = false; + $max = count($pathOptions); + while (!$valid) { + foreach ($pathOptions as $i => $option) { + $this->out($i + 1 .'. ' . $option); + } + $prompt = __('Choose a plugin path from the paths above.', true); + $choice = $this->in($prompt); + if (intval($choice) > 0 && intval($choice) <= $max) { + $valid = true; + } + } + $this->path = $pathOptions[$choice - 1]; + } + +/** + * Help + * + * @return void + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake plugin ..."); + $this->hr(); + $this->out('Commands:'); + $this->out(); + $this->out("plugin "); + $this->out("\tbakes plugin directory structure"); + $this->out(); + $this->out("plugin model"); + $this->out("\tbakes model. Run 'cake bake model help' for more info."); + $this->out(); + $this->out("plugin controller"); + $this->out("\tbakes controller. Run 'cake bake controller help' for more info."); + $this->out(); + $this->out("plugin view"); + $this->out("\tbakes view. Run 'cake bake view help' for more info."); + $this->out(); + $this->_stop(); + } +} diff --git a/cake/console/libs/tasks/project.php b/cake/console/libs/tasks/project.php new file mode 100644 index 0000000..7266dc0 --- /dev/null +++ b/cake/console/libs/tasks/project.php @@ -0,0 +1,371 @@ +args[0])) { + $project = $this->args[0]; + } + } + + if ($project) { + $this->Dispatch->parseParams(array('-app', $project)); + $project = $this->params['working']; + } + + if (empty($this->params['skel'])) { + $this->params['skel'] = ''; + if (is_dir(CAKE . 'console' . DS . 'templates' . DS . 'skel') === true) { + $this->params['skel'] = CAKE . 'console' . DS . 'templates' . DS . 'skel'; + } + } + + while (!$project) { + $prompt = __("What is the full path for this app including the app directory name?\n Example:", true); + $default = $this->params['working'] . DS . 'myapp'; + $project = $this->in($prompt . $default, null, $default); + } + + if ($project) { + $response = false; + while ($response == false && is_dir($project) === true && file_exists($project . 'config' . 'core.php')) { + $prompt = sprintf(__('A project already exists in this location: %s Overwrite?', true), $project); + $response = $this->in($prompt, array('y','n'), 'n'); + if (strtolower($response) === 'n') { + $response = $project = false; + } + } + } + + if ($this->bake($project)) { + $path = Folder::slashTerm($project); + if ($this->createHome($path)) { + $this->out(__('Welcome page created', true)); + } else { + $this->out(__('The Welcome page was NOT created', true)); + } + + if ($this->securitySalt($path) === true ) { + $this->out(__('Random hash key created for \'Security.salt\'', true)); + } else { + $this->err(sprintf(__('Unable to generate random hash for \'Security.salt\', you should change it in %s', true), CONFIGS . 'core.php')); + } + + if ($this->securityCipherSeed($path) === true ) { + $this->out(__('Random seed created for \'Security.cipherSeed\'', true)); + } else { + $this->err(sprintf(__('Unable to generate random seed for \'Security.cipherSeed\', you should change it in %s', true), CONFIGS . 'core.php')); + } + + $corePath = $this->corePath($path); + if ($corePath === true ) { + $this->out(sprintf(__('CAKE_CORE_INCLUDE_PATH set to %s in webroot/index.php', true), CAKE_CORE_INCLUDE_PATH)); + $this->out(sprintf(__('CAKE_CORE_INCLUDE_PATH set to %s in webroot/test.php', true), CAKE_CORE_INCLUDE_PATH)); + $this->out(__('Remember to check these value after moving to production server', true)); + } elseif ($corePath === false) { + $this->err(sprintf(__('Unable to set CAKE_CORE_INCLUDE_PATH, you should change it in %s', true), $path . 'webroot' .DS .'index.php')); + } + $Folder = new Folder($path); + if (!$Folder->chmod($path . 'tmp', 0777)) { + $this->err(sprintf(__('Could not set permissions on %s', true), $path . DS .'tmp')); + $this->out(sprintf(__('chmod -R 0777 %s', true), $path . DS .'tmp')); + } + + $this->params['working'] = $path; + $this->params['app'] = basename($path); + return true; + } + } + +/** + * Looks for a skeleton template of a Cake application, + * and if not found asks the user for a path. When there is a path + * this method will make a deep copy of the skeleton to the project directory. + * A default home page will be added, and the tmp file storage will be chmod'ed to 0777. + * + * @param string $path Project path + * @param string $skel Path to copy from + * @param string $skip array of directories to skip when copying + * @access private + */ + function bake($path, $skel = null, $skip = array('empty')) { + if (!$skel) { + $skel = $this->params['skel']; + } + while (!$skel) { + $skel = $this->in(sprintf(__("What is the path to the directory layout you wish to copy?\nExample: %s"), APP, null, ROOT . DS . 'myapp' . DS)); + if ($skel == '') { + $this->out(__('The directory path you supplied was empty. Please try again.', true)); + } else { + while (is_dir($skel) === false) { + $skel = $this->in(__('Directory path does not exist please choose another:', true)); + } + } + } + + $app = basename($path); + + $this->out(__('Bake Project', true)); + $this->out(__("Skel Directory: ", true) . $skel); + $this->out(__("Will be copied to: ", true) . $path); + $this->hr(); + + $looksGood = $this->in(__('Look okay?', true), array('y', 'n', 'q'), 'y'); + + if (strtolower($looksGood) == 'y') { + $verbose = $this->in(__('Do you want verbose output?', true), array('y', 'n'), 'n'); + + $Folder = new Folder($skel); + if (!empty($this->params['empty'])) { + $skip = array(); + } + if ($Folder->copy(array('to' => $path, 'skip' => $skip))) { + $this->hr(); + $this->out(sprintf(__("Created: %s in %s", true), $app, $path)); + $this->hr(); + } else { + $this->err(sprintf(__(" '%s' could not be created properly", true), $app)); + return false; + } + + if (strtolower($verbose) == 'y') { + foreach ($Folder->messages() as $message) { + $this->out($message); + } + } + + return true; + } elseif (strtolower($looksGood) == 'q') { + $this->out(__('Bake Aborted.', true)); + } else { + $this->execute(false); + return false; + } + } + +/** + * Writes a file with a default home page to the project. + * + * @param string $dir Path to project + * @return boolean Success + * @access public + */ + function createHome($dir) { + $app = basename($dir); + $path = $dir . 'views' . DS . 'pages' . DS; + $source = CAKE . 'console' . DS . 'templates' . DS .'default' . DS . 'views' . DS . 'home.ctp'; + include($source); + return $this->createFile($path.'home.ctp', $output); + } + +/** + * Generates and writes 'Security.salt' + * + * @param string $path Project path + * @return boolean Success + * @access public + */ + function securitySalt($path) { + $File =& new File($path . 'config' . DS . 'core.php'); + $contents = $File->read(); + if (preg_match('/([\\t\\x20]*Configure::write\\(\\\'Security.salt\\\',[\\t\\x20\'A-z0-9]*\\);)/', $contents, $match)) { + if (!class_exists('Security')) { + require LIBS . 'security.php'; + } + $string = Security::generateAuthKey(); + $result = str_replace($match[0], "\t" . 'Configure::write(\'Security.salt\', \''.$string.'\');', $contents); + if ($File->write($result)) { + return true; + } + return false; + } + return false; + } + + /** + * Generates and writes 'Security.cipherSeed' + * + * @param string $path Project path + * @return boolean Success + * @access public + */ + function securityCipherSeed($path) { + $File =& new File($path . 'config' . DS . 'core.php'); + $contents = $File->read(); + if (preg_match('/([\\t\\x20]*Configure::write\\(\\\'Security.cipherSeed\\\',[\\t\\x20\'A-z0-9]*\\);)/', $contents, $match)) { + if (!class_exists('Security')) { + require LIBS . 'security.php'; + } + $string = substr(bin2hex(Security::generateAuthKey()), 0, 30); + $result = str_replace($match[0], "\t" . 'Configure::write(\'Security.cipherSeed\', \''.$string.'\');', $contents); + if ($File->write($result)) { + return true; + } + return false; + } + return false; + } + +/** + * Generates and writes CAKE_CORE_INCLUDE_PATH + * + * @param string $path Project path + * @return boolean Success + * @access public + */ + function corePath($path) { + if (dirname($path) !== CAKE_CORE_INCLUDE_PATH) { + $File =& new File($path . 'webroot' . DS . 'index.php'); + $contents = $File->read(); + if (preg_match('/([\\t\\x20]*define\\(\\\'CAKE_CORE_INCLUDE_PATH\\\',[\\t\\x20\'A-z0-9]*\\);)/', $contents, $match)) { + $root = strpos(CAKE_CORE_INCLUDE_PATH, '/') === 0 ? " DS . '" : "'"; + $result = str_replace($match[0], "\t\tdefine('CAKE_CORE_INCLUDE_PATH', " . $root . str_replace(DS, "' . DS . '", trim(CAKE_CORE_INCLUDE_PATH, DS)) . "');", $contents); + if (!$File->write($result)) { + return false; + } + } else { + return false; + } + + $File =& new File($path . 'webroot' . DS . 'test.php'); + $contents = $File->read(); + if (preg_match('/([\\t\\x20]*define\\(\\\'CAKE_CORE_INCLUDE_PATH\\\',[\\t\\x20\'A-z0-9]*\\);)/', $contents, $match)) { + $result = str_replace($match[0], "\t\tdefine('CAKE_CORE_INCLUDE_PATH', " . $root . str_replace(DS, "' . DS . '", trim(CAKE_CORE_INCLUDE_PATH, DS)) . "');", $contents); + if (!$File->write($result)) { + return false; + } + } else { + return false; + } + return true; + } + } + +/** + * Enables Configure::read('Routing.prefixes') in /app/config/core.php + * + * @param string $name Name to use as admin routing + * @return boolean Success + * @access public + */ + function cakeAdmin($name) { + $path = (empty($this->configPath)) ? CONFIGS : $this->configPath; + $File =& new File($path . 'core.php'); + $contents = $File->read(); + if (preg_match('%([/\\t\\x20]*Configure::write\(\'Routing.prefixes\',[\\t\\x20\'a-z,\)\(]*\\);)%', $contents, $match)) { + $result = str_replace($match[0], "\t" . 'Configure::write(\'Routing.prefixes\', array(\''.$name.'\'));', $contents); + if ($File->write($result)) { + Configure::write('Routing.prefixes', array($name)); + return true; + } else { + return false; + } + } else { + return false; + } + } + +/** + * Checks for Configure::read('Routing.prefixes') and forces user to input it if not enabled + * + * @return string Admin route to use + * @access public + */ + function getPrefix() { + $admin = ''; + $prefixes = Configure::read('Routing.prefixes'); + if (!empty($prefixes)) { + if (count($prefixes) == 1) { + return $prefixes[0] . '_'; + } + if ($this->interactive) { + $this->out(); + $this->out(__('You have more than one routing prefix configured', true)); + } + $options = array(); + foreach ($prefixes as $i => $prefix) { + $options[] = $i + 1; + if ($this->interactive) { + $this->out($i + 1 . '. ' . $prefix); + } + } + $selection = $this->in(__('Please choose a prefix to bake with.', true), $options, 1); + return $prefixes[$selection - 1] . '_'; + } + if ($this->interactive) { + $this->hr(); + $this->out('You need to enable Configure::write(\'Routing.prefixes\',array(\'admin\')) in /app/config/core.php to use prefix routing.'); + $this->out(__('What would you like the prefix route to be?', true)); + $this->out(__('Example: www.example.com/admin/controller', true)); + while ($admin == '') { + $admin = $this->in(__("Enter a routing prefix:", true), null, 'admin'); + } + if ($this->cakeAdmin($admin) !== true) { + $this->out(__('Unable to write to /app/config/core.php.', true)); + $this->out('You need to enable Configure::write(\'Routing.prefixes\',array(\'admin\')) in /app/config/core.php to use prefix routing.'); + $this->_stop(); + } + return $admin . '_'; + } + return ''; + } + +/** + * Help + * + * @return void + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake project "); + $this->hr(); + $this->out('Commands:'); + $this->out(); + $this->out("project "); + $this->out("\tbakes app directory structure."); + $this->out("\tif begins with '/' path is absolute."); + $this->out(); + $this->_stop(); + } + +} diff --git a/cake/console/libs/tasks/template.php b/cake/console/libs/tasks/template.php new file mode 100644 index 0000000..84c921d --- /dev/null +++ b/cake/console/libs/tasks/template.php @@ -0,0 +1,212 @@ + $path + * + * @var array + */ + var $templatePaths = array(); + +/** + * Initialize callback. Setup paths for the template task. + * + * @access public + * @return void + */ + function initialize() { + $this->templatePaths = $this->_findThemes(); + } + +/** + * Find the paths to all the installed shell themes in the app. + * + * Bake themes are directories not named `skel` inside a `vendors/shells/templates` path. + * + * @return array Array of bake themes that are installed. + */ + function _findThemes() { + $paths = App::path('shells'); + $core = array_pop($paths); + $separator = DS === '/' ? '/' : '\\\\'; + $core = preg_replace('#libs' . $separator . '$#', '', $core); + $paths[] = $core; + $Folder =& new Folder($core . 'templates' . DS . 'default'); + $contents = $Folder->read(); + $themeFolders = $contents[0]; + + $plugins = App::objects('plugin'); + foreach ($plugins as $plugin) { + $paths[] = $this->_pluginPath($plugin) . 'vendors' . DS . 'shells' . DS; + } + + // TEMPORARY TODO remove when all paths are DS terminated + foreach ($paths as $i => $path) { + $paths[$i] = rtrim($path, DS) . DS; + } + + $themes = array(); + foreach ($paths as $path) { + $Folder =& new Folder($path . 'templates', false); + $contents = $Folder->read(); + $subDirs = $contents[0]; + foreach ($subDirs as $dir) { + if (empty($dir) || preg_match('@^skel$|_skel$@', $dir)) { + continue; + } + $Folder =& new Folder($path . 'templates' . DS . $dir); + $contents = $Folder->read(); + $subDirs = $contents[0]; + if (array_intersect($contents[0], $themeFolders)) { + $templateDir = $path . 'templates' . DS . $dir . DS; + $themes[$dir] = $templateDir; + } + } + } + return $themes; + } + +/** + * Set variable values to the template scope + * + * @param mixed $one A string or an array of data. + * @param mixed $two Value in case $one is a string (which then works as the key). + * Unused if $one is an associative array, otherwise serves as the values to $one's keys. + * @return void + */ + function set($one, $two = null) { + $data = null; + if (is_array($one)) { + if (is_array($two)) { + $data = array_combine($one, $two); + } else { + $data = $one; + } + } else { + $data = array($one => $two); + } + + if ($data == null) { + return false; + } + + foreach ($data as $name => $value) { + $this->templateVars[$name] = $value; + } + } + +/** + * Runs the template + * + * @param string $directory directory / type of thing you want + * @param string $filename template name + * @param string $vars Additional vars to set to template scope. + * @access public + * @return contents of generated code template + */ + function generate($directory, $filename, $vars = null) { + if ($vars !== null) { + $this->set($vars); + } + if (empty($this->templatePaths)) { + $this->initialize(); + } + $themePath = $this->getThemePath(); + $templateFile = $this->_findTemplate($themePath, $directory, $filename); + if ($templateFile) { + extract($this->templateVars); + ob_start(); + ob_implicit_flush(0); + include($templateFile); + $content = ob_get_clean(); + return $content; + } + return ''; + } + +/** + * Find the theme name for the current operation. + * If there is only one theme in $templatePaths it will be used. + * If there is a -theme param in the cli args, it will be used. + * If there is more than one installed theme user interaction will happen + * + * @return string returns the path to the selected theme. + */ + function getThemePath() { + if (count($this->templatePaths) == 1) { + $paths = array_values($this->templatePaths); + return $paths[0]; + } + if (!empty($this->params['theme']) && isset($this->templatePaths[$this->params['theme']])) { + return $this->templatePaths[$this->params['theme']]; + } + + $this->hr(); + $this->out(__('You have more than one set of templates installed.', true)); + $this->out(__('Please choose the template set you wish to use:', true)); + $this->hr(); + + $i = 1; + $indexedPaths = array(); + foreach ($this->templatePaths as $key => $path) { + $this->out($i . '. ' . $key); + $indexedPaths[$i] = $path; + $i++; + } + $index = $this->in(__('Which bake theme would you like to use?', true), range(1, $i - 1), 1); + $themeNames = array_keys($this->templatePaths); + $this->Dispatch->params['theme'] = $themeNames[$index - 1]; + return $indexedPaths[$index]; + } + +/** + * Find a template inside a directory inside a path. + * Will scan all other theme dirs if the template is not found in the first directory. + * + * @param string $path The initial path to look for the file on. If it is not found fallbacks will be used. + * @param string $directory Subdirectory to look for ie. 'views', 'objects' + * @param string $filename lower_case_underscored filename you want. + * @access public + * @return string filename will exit program if template is not found. + */ + function _findTemplate($path, $directory, $filename) { + $themeFile = $path . $directory . DS . $filename . '.ctp'; + if (file_exists($themeFile)) { + return $themeFile; + } + foreach ($this->templatePaths as $path) { + $templatePath = $path . $directory . DS . $filename . '.ctp'; + if (file_exists($templatePath)) { + return $templatePath; + } + } + $this->err(sprintf(__('Could not find template for %s', true), $filename)); + return false; + } +} diff --git a/cake/console/libs/tasks/test.php b/cake/console/libs/tasks/test.php new file mode 100644 index 0000000..d90a1eb --- /dev/null +++ b/cake/console/libs/tasks/test.php @@ -0,0 +1,456 @@ +args)) { + $this->__interactive(); + } + + if (count($this->args) == 1) { + $this->__interactive($this->args[0]); + } + + if (count($this->args) > 1) { + $type = Inflector::underscore($this->args[0]); + if ($this->bake($type, $this->args[1])) { + $this->out('done'); + } + } + } + +/** + * Handles interactive baking + * + * @access private + */ + function __interactive($type = null) { + $this->interactive = true; + $this->hr(); + $this->out(__('Bake Tests', true)); + $this->out(sprintf(__("Path: %s", true), $this->path)); + $this->hr(); + + if ($type) { + $type = Inflector::camelize($type); + if (!in_array($type, $this->classTypes)) { + $this->error(sprintf('Incorrect type provided. Please choose one of %s', implode(', ', $this->classTypes))); + } + } else { + $type = $this->getObjectType(); + } + $className = $this->getClassName($type); + return $this->bake($type, $className); + } + +/** + * Completes final steps for generating data to create test case. + * + * @param string $type Type of object to bake test case for ie. Model, Controller + * @param string $className the 'cake name' for the class ie. Posts for the PostsController + * @access public + */ + function bake($type, $className) { + if ($this->typeCanDetectFixtures($type) && $this->isLoadableClass($type, $className)) { + $this->out(__('Bake is detecting possible fixtures..', true)); + $testSubject =& $this->buildTestSubject($type, $className); + $this->generateFixtureList($testSubject); + } elseif ($this->interactive) { + $this->getUserFixtures(); + } + $fullClassName = $this->getRealClassName($type, $className); + + $methods = array(); + if (class_exists($fullClassName)) { + $methods = $this->getTestableMethods($fullClassName); + } + $mock = $this->hasMockClass($type, $fullClassName); + $construction = $this->generateConstructor($type, $fullClassName); + + $plugin = null; + if ($this->plugin) { + $plugin = $this->plugin . '.'; + } + + $this->Template->set('fixtures', $this->_fixtures); + $this->Template->set('plugin', $plugin); + $this->Template->set(compact('className', 'methods', 'type', 'fullClassName', 'mock', 'construction')); + $out = $this->Template->generate('classes', 'test'); + + $filename = $this->testCaseFileName($type, $className); + $made = $this->createFile($filename, $out); + if ($made) { + return $out; + } + return false; + } + +/** + * Interact with the user and get their chosen type. Can exit the script. + * + * @return string Users chosen type. + * @access public + */ + function getObjectType() { + $this->hr(); + $this->out(__("Select an object type:", true)); + $this->hr(); + + $keys = array(); + foreach ($this->classTypes as $key => $option) { + $this->out(++$key . '. ' . $option); + $keys[] = $key; + } + $keys[] = 'q'; + $selection = $this->in(__("Enter the type of object to bake a test for or (q)uit", true), $keys, 'q'); + if ($selection == 'q') { + return $this->_stop(); + } + return $this->classTypes[$selection - 1]; + } + +/** + * Get the user chosen Class name for the chosen type + * + * @param string $objectType Type of object to list classes for i.e. Model, Controller. + * @return string Class name the user chose. + * @access public + */ + function getClassName($objectType) { + $options = App::objects(strtolower($objectType)); + $this->out(sprintf(__('Choose a %s class', true), $objectType)); + $keys = array(); + foreach ($options as $key => $option) { + $this->out(++$key . '. ' . $option); + $keys[] = $key; + } + $selection = $this->in(__('Choose an existing class, or enter the name of a class that does not exist', true)); + if (isset($options[$selection - 1])) { + return $options[$selection - 1]; + } + return $selection; + } + +/** + * Checks whether the chosen type can find its own fixtures. + * Currently only model, and controller are supported + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $className the Classname of the class the test is being generated for. + * @return boolean + * @access public + */ + function typeCanDetectFixtures($type) { + $type = strtolower($type); + return ($type == 'controller' || $type == 'model'); + } + +/** + * Check if a class with the given type is loaded or can be loaded. + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $className the Classname of the class the test is being generated for. + * @return boolean + * @access public + */ + function isLoadableClass($type, $class) { + return App::import($type, $class); + } + +/** + * Construct an instance of the class to be tested. + * So that fixtures can be detected + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $class the Classname of the class the test is being generated for. + * @return object And instance of the class that is going to be tested. + * @access public + */ + function &buildTestSubject($type, $class) { + ClassRegistry::flush(); + App::import($type, $class); + $class = $this->getRealClassName($type, $class); + if (strtolower($type) == 'model') { + $instance =& ClassRegistry::init($class); + } else { + $instance =& new $class(); + } + return $instance; + } + +/** + * Gets the real class name from the cake short form. + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $class the Classname of the class the test is being generated for. + * @return string Real classname + * @access public + */ + function getRealClassName($type, $class) { + if (strtolower($type) == 'model') { + return $class; + } + return $class . $type; + } + +/** + * Get methods declared in the class given. + * No parent methods will be returned + * + * @param string $className Name of class to look at. + * @return array Array of method names. + * @access public + */ + function getTestableMethods($className) { + $classMethods = get_class_methods($className); + $parentMethods = get_class_methods(get_parent_class($className)); + $thisMethods = array_diff($classMethods, $parentMethods); + $out = array(); + foreach ($thisMethods as $method) { + if (substr($method, 0, 1) != '_' && $method != strtolower($className)) { + $out[] = $method; + } + } + return $out; + } + +/** + * Generate the list of fixtures that will be required to run this test based on + * loaded models. + * + * @param object $subject The object you want to generate fixtures for. + * @return array Array of fixtures to be included in the test. + * @access public + */ + function generateFixtureList(&$subject) { + $this->_fixtures = array(); + if (is_a($subject, 'Model')) { + $this->_processModel($subject); + } elseif (is_a($subject, 'Controller')) { + $this->_processController($subject); + } + return array_values($this->_fixtures); + } + +/** + * Process a model recursively and pull out all the + * model names converting them to fixture names. + * + * @param Model $subject A Model class to scan for associations and pull fixtures off of. + * @return void + * @access protected + */ + function _processModel(&$subject) { + $this->_addFixture($subject->name); + $associated = $subject->getAssociated(); + foreach ($associated as $alias => $type) { + $className = $subject->{$alias}->name; + if (!isset($this->_fixtures[$className])) { + $this->_processModel($subject->{$alias}); + } + if ($type == 'hasAndBelongsToMany') { + $joinModel = Inflector::classify($subject->hasAndBelongsToMany[$alias]['joinTable']); + if (!isset($this->_fixtures[$joinModel])) { + $this->_processModel($subject->{$joinModel}); + } + } + } + } + +/** + * Process all the models attached to a controller + * and generate a fixture list. + * + * @param Controller $subject A controller to pull model names off of. + * @return void + * @access protected + */ + function _processController(&$subject) { + $subject->constructClasses(); + $models = array(Inflector::classify($subject->name)); + if (!empty($subject->uses)) { + $models = $subject->uses; + } + foreach ($models as $model) { + $this->_processModel($subject->{$model}); + } + } + +/** + * Add classname to the fixture list. + * Sets the app. or plugin.plugin_name. prefix. + * + * @param string $name Name of the Model class that a fixture might be required for. + * @return void + * @access protected + */ + function _addFixture($name) { + $parent = get_parent_class($name); + $prefix = 'app.'; + if (strtolower($parent) != 'appmodel' && strtolower(substr($parent, -8)) == 'appmodel') { + $pluginName = substr($parent, 0, strlen($parent) -8); + $prefix = 'plugin.' . Inflector::underscore($pluginName) . '.'; + } + $fixture = $prefix . Inflector::underscore($name); + $this->_fixtures[$name] = $fixture; + } + +/** + * Interact with the user to get additional fixtures they want to use. + * + * @return array Array of fixtures the user wants to add. + * @access public + */ + function getUserFixtures() { + $proceed = $this->in(__('Bake could not detect fixtures, would you like to add some?', true), array('y','n'), 'n'); + $fixtures = array(); + if (strtolower($proceed) == 'y') { + $fixtureList = $this->in(__("Please provide a comma separated list of the fixtures names you'd like to use.\nExample: 'app.comment, app.post, plugin.forums.post'", true)); + $fixtureListTrimmed = str_replace(' ', '', $fixtureList); + $fixtures = explode(',', $fixtureListTrimmed); + } + $this->_fixtures = array_merge($this->_fixtures, $fixtures); + return $fixtures; + } + +/** + * Is a mock class required for this type of test? + * Controllers require a mock class. + * + * @param string $type The type of object tests are being generated for eg. controller. + * @return boolean + * @access public + */ + function hasMockClass($type) { + $type = strtolower($type); + return $type == 'controller'; + } + +/** + * Generate a constructor code snippet for the type and classname + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $className the Classname of the class the test is being generated for. + * @return string Constructor snippet for the thing you are building. + * @access public + */ + function generateConstructor($type, $fullClassName) { + $type = strtolower($type); + if ($type == 'model') { + return "ClassRegistry::init('$fullClassName');\n"; + } + if ($type == 'controller') { + $className = substr($fullClassName, 0, strlen($fullClassName) - 10); + return "new Test$fullClassName();\n\t\t\$this->{$className}->constructClasses();\n"; + } + return "new $fullClassName();\n"; + } + +/** + * Make the filename for the test case. resolve the suffixes for controllers + * and get the plugin path if needed. + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $className the Classname of the class the test is being generated for. + * @return string filename the test should be created on. + * @access public + */ + function testCaseFileName($type, $className) { + $path = $this->getPath();; + $path .= 'cases' . DS . strtolower($type) . 's' . DS; + if (strtolower($type) == 'controller') { + $className = $this->getRealClassName($type, $className); + } + return $path . Inflector::underscore($className) . '.test.php'; + } + +/** + * Show help file. + * + * @return void + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake test "); + $this->hr(); + $this->out('Commands:'); + $this->out(""); + $this->out("test model post\n\tbakes a test case for the post model."); + $this->out(""); + $this->out("test controller comments\n\tbakes a test case for the comments controller."); + $this->out(""); + $this->out('Arguments:'); + $this->out("\t Can be any of the following 'controller', 'model', 'helper',\n\t'component', 'behavior'."); + $this->out("\t Any existing class for the chosen type."); + $this->out(""); + $this->out("Parameters:"); + $this->out("\t-plugin CamelCased name of plugin to bake tests for."); + $this->out(""); + $this->_stop(); + } +} diff --git a/cake/console/libs/tasks/view.php b/cake/console/libs/tasks/view.php new file mode 100644 index 0000000..2ebffc7 --- /dev/null +++ b/cake/console/libs/tasks/view.php @@ -0,0 +1,488 @@ +args)) { + $this->__interactive(); + } + if (empty($this->args[0])) { + return; + } + if (!isset($this->connection)) { + $this->connection = 'default'; + } + $controller = $action = $alias = null; + $this->controllerName = $this->_controllerName($this->args[0]); + $this->controllerPath = $this->_controllerPath($this->controllerName); + + $this->Project->interactive = false; + if (strtolower($this->args[0]) == 'all') { + return $this->all(); + } + + if (isset($this->args[1])) { + $this->template = $this->args[1]; + } + if (isset($this->args[2])) { + $action = $this->args[2]; + } + if (!$action) { + $action = $this->template; + } + if ($action) { + return $this->bake($action, true); + } + + $vars = $this->__loadController(); + $methods = $this->_methodsToBake(); + + foreach ($methods as $method) { + $content = $this->getContent($method, $vars); + if ($content) { + $this->bake($method, $content); + } + } + } + +/** + * Get a list of actions that can / should have views baked for them. + * + * @return array Array of action names that should be baked + */ + function _methodsToBake() { + $methods = array_diff( + array_map('strtolower', get_class_methods($this->controllerName . 'Controller')), + array_map('strtolower', get_class_methods('appcontroller')) + ); + $scaffoldActions = false; + if (empty($methods)) { + $scaffoldActions = true; + $methods = $this->scaffoldActions; + } + $adminRoute = $this->Project->getPrefix(); + foreach ($methods as $i => $method) { + if ($adminRoute && isset($this->params['admin'])) { + if ($scaffoldActions) { + $methods[$i] = $adminRoute . $method; + continue; + } elseif (strpos($method, $adminRoute) === false) { + unset($methods[$i]); + } + } + if ($method[0] === '_' || $method == strtolower($this->controllerName . 'Controller')) { + unset($methods[$i]); + } + } + return $methods; + } + +/** + * Bake All views for All controllers. + * + * @return void + */ + function all() { + $this->Controller->interactive = false; + $tables = $this->Controller->listAll($this->connection, false); + + $actions = null; + if (isset($this->args[1])) { + $actions = array($this->args[1]); + } + $this->interactive = false; + foreach ($tables as $table) { + $model = $this->_modelName($table); + $this->controllerName = $this->_controllerName($model); + $this->controllerPath = Inflector::underscore($this->controllerName); + if (App::import('Model', $model)) { + $vars = $this->__loadController(); + if (!$actions) { + $actions = $this->_methodsToBake(); + } + $this->bakeActions($actions, $vars); + $actions = null; + } + } + } + +/** + * Handles interactive baking + * + * @access private + */ + function __interactive() { + $this->hr(); + $this->out(sprintf("Bake View\nPath: %s", $this->path)); + $this->hr(); + + $this->DbConfig->interactive = $this->Controller->interactive = $this->interactive = true; + + if (empty($this->connection)) { + $this->connection = $this->DbConfig->getConfig(); + } + + $this->Controller->connection = $this->connection; + $this->controllerName = $this->Controller->getName(); + + $this->controllerPath = strtolower(Inflector::underscore($this->controllerName)); + + $prompt = sprintf(__("Would you like bake to build your views interactively?\nWarning: Choosing no will overwrite %s views if it exist.", true), $this->controllerName); + $interactive = $this->in($prompt, array('y', 'n'), 'n'); + + if (strtolower($interactive) == 'n') { + $this->interactive = false; + } + + $prompt = __("Would you like to create some CRUD views\n(index, add, view, edit) for this controller?\nNOTE: Before doing so, you'll need to create your controller\nand model classes (including associated models).", true); + $wannaDoScaffold = $this->in($prompt, array('y','n'), 'y'); + + $wannaDoAdmin = $this->in(__("Would you like to create the views for admin routing?", true), array('y','n'), 'n'); + + if (strtolower($wannaDoScaffold) == 'y' || strtolower($wannaDoAdmin) == 'y') { + $vars = $this->__loadController(); + if (strtolower($wannaDoScaffold) == 'y') { + $actions = $this->scaffoldActions; + $this->bakeActions($actions, $vars); + } + if (strtolower($wannaDoAdmin) == 'y') { + $admin = $this->Project->getPrefix(); + $regularActions = $this->scaffoldActions; + $adminActions = array(); + foreach ($regularActions as $action) { + $adminActions[] = $admin . $action; + } + $this->bakeActions($adminActions, $vars); + } + $this->hr(); + $this->out(); + $this->out(__("View Scaffolding Complete.\n", true)); + } else { + $this->customAction(); + } + } + +/** + * Loads Controller and sets variables for the template + * Available template variables + * 'modelClass', 'primaryKey', 'displayField', 'singularVar', 'pluralVar', + * 'singularHumanName', 'pluralHumanName', 'fields', 'foreignKeys', + * 'belongsTo', 'hasOne', 'hasMany', 'hasAndBelongsToMany' + * + * @return array Returns an variables to be made available to a view template + * @access private + */ + function __loadController() { + if (!$this->controllerName) { + $this->err(__('Controller not found', true)); + } + + $import = $this->controllerName; + if ($this->plugin) { + $import = $this->plugin . '.' . $this->controllerName; + } + + if (!App::import('Controller', $import)) { + $file = $this->controllerPath . '_controller.php'; + $this->err(sprintf(__("The file '%s' could not be found.\nIn order to bake a view, you'll need to first create the controller.", true), $file)); + $this->_stop(); + } + $controllerClassName = $this->controllerName . 'Controller'; + $controllerObj =& new $controllerClassName(); + $controllerObj->plugin = $this->plugin; + $controllerObj->constructClasses(); + $modelClass = $controllerObj->modelClass; + $modelObj =& $controllerObj->{$controllerObj->modelClass}; + + if ($modelObj) { + $primaryKey = $modelObj->primaryKey; + $displayField = $modelObj->displayField; + $singularVar = Inflector::variable($modelClass); + $singularHumanName = $this->_singularHumanName($this->controllerName); + $schema = $modelObj->schema(true); + $fields = array_keys($schema); + $associations = $this->__associations($modelObj); + } else { + $primaryKey = $displayField = null; + $singularVar = Inflector::variable(Inflector::singularize($this->controllerName)); + $singularHumanName = $this->_singularHumanName($this->controllerName); + $fields = $schema = $associations = array(); + } + $pluralVar = Inflector::variable($this->controllerName); + $pluralHumanName = $this->_pluralHumanName($this->controllerName); + + return compact('modelClass', 'schema', 'primaryKey', 'displayField', 'singularVar', 'pluralVar', + 'singularHumanName', 'pluralHumanName', 'fields','associations'); + } + +/** + * Bake a view file for each of the supplied actions + * + * @param array $actions Array of actions to make files for. + * @return void + */ + function bakeActions($actions, $vars) { + foreach ($actions as $action) { + $content = $this->getContent($action, $vars); + $this->bake($action, $content); + } + } + +/** + * handle creation of baking a custom action view file + * + * @return void + */ + function customAction() { + $action = ''; + while ($action == '') { + $action = $this->in(__('Action Name? (use lowercase_underscored function name)', true)); + if ($action == '') { + $this->out(__('The action name you supplied was empty. Please try again.', true)); + } + } + $this->out(); + $this->hr(); + $this->out(__('The following view will be created:', true)); + $this->hr(); + $this->out(sprintf(__('Controller Name: %s', true), $this->controllerName)); + $this->out(sprintf(__('Action Name: %s', true), $action)); + $this->out(sprintf(__('Path: %s', true), $this->params['app'] . DS . $this->controllerPath . DS . Inflector::underscore($action) . ".ctp")); + $this->hr(); + $looksGood = $this->in(__('Look okay?', true), array('y','n'), 'y'); + if (strtolower($looksGood) == 'y') { + $this->bake($action); + $this->_stop(); + } else { + $this->out(__('Bake Aborted.', true)); + } + } + +/** + * Assembles and writes bakes the view file. + * + * @param string $action Action to bake + * @param string $content Content to write + * @return boolean Success + * @access public + */ + function bake($action, $content = '') { + if ($content === true) { + $content = $this->getContent($action); + } + $path = $this->getPath(); + $filename = $path . $this->controllerPath . DS . Inflector::underscore($action) . '.ctp'; + return $this->createFile($filename, $content); + } + +/** + * Builds content from template and variables + * + * @param string $action name to generate content to + * @param array $vars passed for use in templates + * @return string content from template + * @access public + */ + function getContent($action, $vars = null) { + if (!$vars) { + $vars = $this->__loadController(); + } + + $this->Template->set('action', $action); + $this->Template->set('plugin', $this->plugin); + $this->Template->set($vars); + $template = $this->getTemplate($action); + if ($template) { + return $this->Template->generate('views', $template); + } + return false; + } + +/** + * Gets the template name based on the action name + * + * @param string $action name + * @return string template name + * @access public + */ + function getTemplate($action) { + if ($action != $this->template && in_array($action, $this->noTemplateActions)) { + return false; + } + if (!empty($this->template) && $action != $this->template) { + return $this->template; + } + $template = $action; + $prefixes = Configure::read('Routing.prefixes'); + foreach ((array)$prefixes as $prefix) { + if (strpos($template, $prefix) !== false) { + $template = str_replace($prefix . '_', '', $template); + } + } + if (in_array($template, array('add', 'edit'))) { + $template = 'form'; + } elseif (preg_match('@(_add|_edit)$@', $template)) { + $template = str_replace(array('_add', '_edit'), '_form', $template); + } + return $template; + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake view ..."); + $this->hr(); + $this->out('Arguments:'); + $this->out(); + $this->out(""); + $this->out("\tName of the controller views to bake. Can use Plugin.name"); + $this->out("\tas a shortcut for plugin baking."); + $this->out(); + $this->out(""); + $this->out("\tName of the action view to bake"); + $this->out(); + $this->out('Commands:'); + $this->out(); + $this->out("view "); + $this->out("\tWill read the given controller for methods"); + $this->out("\tand bake corresponding views."); + $this->out("\tUsing the -admin flag will only bake views for actions"); + $this->out("\tthat begin with Routing.admin."); + $this->out("\tIf var scaffold is found it will bake the CRUD actions"); + $this->out("\t(index,view,add,edit)"); + $this->out(); + $this->out("view "); + $this->out("\tWill bake a template. core templates: (index, add, edit, view)"); + $this->out(); + $this->out("view